From 12911b9a7f71ecef656f6bdc0c0b5c48e3d3fa19 Mon Sep 17 00:00:00 2001 From: Jia Wei Date: Fri, 17 Jul 2026 00:43:27 +0800 Subject: [PATCH 1/3] feat: add interactive retrieval learning course --- .env.example | 4 +- .github/workflows/ci.yml | 84 + Dockerfile | 17 +- README.md | 42 +- README.zh-CN.md | 30 +- .../corpora/cloudflare-state-v1/corpus.json | 6 + .../evaluation-manifest.json | 16 + .../files/durable-objects/api/alarms.md | 252 + .../files/durable-objects/api/state.md | 369 + ...-durable-object-stubs-and-send-requests.md | 217 + .../rules-of-durable-objects.md | 1581 ++++ .../concepts/durable-object-lifecycle.md | 108 + .../concepts/what-are-durable-objects.md | 115 + .../examples/build-a-counter.md | 252 + .../platform/storage-options.md | 10 + .../files/kv/concepts/how-kv-works.md | 81 + .../files/kv/concepts/kv-bindings.md | 109 + .../files/kv/concepts/kv-namespaces.md | 68 + .../kv/examples/cache-data-with-workers-kv.md | 145 + ...stributed-configuration-with-workers-kv.md | 237 + .../cloudflare-state-v1/files/kv/index.md | 225 + .../queues/configuration/batching-retries.md | 393 + .../configuration/consumer-concurrency.md | 140 + .../use-queues-with-durable-objects.md | 117 + .../files/queues/get-started.md | 265 + .../cloudflare-state-v1/files/queues/index.md | 112 + .../queues/reference/delivery-guarantees.md | 19 + .../queues/reference/how-queues-works.md | 240 + .../r2/api/workers/workers-api-reference.md | 562 ++ .../files/r2/buckets/create-buckets.md | 51 + .../files/r2/how-r2-works.md | 99 + .../cloudflare-state-v1/files/r2/index.md | 122 + .../files/r2/reference/consistency.md | 64 + .../files/r2/reference/durability.md | 28 + .../files/workers/get-started/guide.md | 210 + .../files/workers/index.md | 160 + .../files/workers/runtime-apis/bindings/R2.md | 12 + .../runtime-apis/bindings/durable-objects.md | 10 + .../files/workers/runtime-apis/bindings/kv.md | 10 + .../workers/runtime-apis/bindings/queues.md | 10 + .../files/workflows/get-started/guide.md | 328 + .../files/workflows/index.md | 168 + .../retrieval-questions.jsonl | 16 + .../cloudflare-state-v1/source-manifest.json | 248 + .../v2/corpora/watsonxdocsqa-v1/corpus.json | 6 + .../watsonxdocsqa-v1/dataset-manifest.json | 8017 +++++++++++++++++ ...0205c92c52fa28db619ee1f9c8d76fe8564db88.md | 9 + ...093065541aa4c3e90e47e3ace89596155ea1735.md | 26 + ...108f00736882ac35e3c56cd3ce0d91bcb5798a8.md | 300 + ...15755c65c274f262396747d3f32a59ae74c08d7.md | 17 + ...1800e00bdfb7cfe0e751fa6c616160c48e6ed21.md | 36 + ...1c8222216b795904018497993cc5e44d51a3b35.md | 26 + ...2244f39be9a15fa55c94c9f2775606247969a61.md | 55 + ...2326495f914d005bde7360f0826e8c140816613.md | 89 + ...294ab8c0fbc393f5c227a0f8bebccdc67b78b1d.md | 11 + ...2c5718919d676e7ea14d16ac226407cc675c95e.md | 31 + ...2d819d225558542a49ab6e43f94fe062a509ea5.md | 19 + ...301d6611a36e44c345083f6e2c3bde58de59982.md | 15 + ...310b7fb9072e7f7e5d73f5af90ede62faa81286.md | 63 + ...33e2b1cd9e006383c2d2c045b8834bfbbab0f09.md | 19 + ...33f114bff6d5479c2b4be7c1542a4c778aba53e.md | 13 + ...35430afac1e73483636073c5bf48bcf8b4f5e1d.md | 6 + ...35ef4a1d7c465e8a72acc1c5c98198b4e95068b.md | 94 + ...3a70c271775c3b15541b86e53e467844ef87296.md | 12 + ...3c28b0a536906ca3597b4d382759bd791d0cfec.md | 21 + ...3da4d2d23a65c146ba5afd8f7175908f868f3eb.md | 76 + ...3ff997603b065d2df1fbb49934ca8c348765acf.md | 61 + ...49829eea8eecd997e6ca05584cde2d9bae92218.md | 7 + ...49dc7fc73042985f3258ef2cf3bb05114f7f175.md | 79 + ...4b717fd06c5d906268e8530f4b521686065c6d5.md | 161 + ...5275f4ec521878b13ad7dce825e167b2fc7ef93.md | 37 + ...55727fba02274a87d30da162e6f5eca3ace233d.md | 41 + ...563fc6874b43fa0bca09ae54805fe98bfa33042.md | 37 + ...56e37762231e9e32f0f443987c32acf7bf1aed4.md | 24 + ...5d687fc92fd17804374e20e7f330edae142f725.md | 86 + ...5f38627c9ec286ca7c379a31aa27392a65411ab.md | 15 + ...63d5e4c6e2094f964752d376b5ff49ffd47433b.md | 34 + ...721692d3f363b864a241fc4644d7d57b2dff881.md | 18 + ...74c9baeb0177e3cf57bac36e5fcbd13063498a1.md | 32 + ...77afc6b667f6747ff066182e2f04af486c13368.md | 13 + ...7a75b90684d731c6b33fc552585d391e86a2a35.md | 135 + ...82349f7c1e486d18bca3bb7569d4de25a8e81a7.md | 22 + ...93bffcb43c46f1068a59a6b6338c955bf20aabf.md | 34 + ...9897dcf1128d66144d2b165564c228c16cd5ec5.md | 22 + ...999f59bb8e2e2ab7722d57cdbc051a0984abe45.md | 194 + ...9bb38fb6df4c562a478d6d3dc54d22823f922fb.md | 9 + ...a507ff5262bad7a3fb3f3c478388cff78949941.md | 636 ++ ...a5c26b7b5b7c1e3afd8901d8b91f2e3c527da3e.md | 34 + ...a6d8500dac43a18ec5dd8fcc3d31c2a31546554.md | 73 + ...b14841af65a8855e9d497ef05270b54b245daf8.md | 22 + ...b35e778b109957ee1cc48fa8e46ed7a1633e380.md | 181 + ...b4e34a88c9328ec6e0cc8a690b466f441e5efc6.md | 66 + ...b54763a8146178f9f4809da458e4ddbd9e28b39.md | 30 + ...b5c4d75ea0a1cd2ade09184ee2b159e23033cae.md | 87 + ...bd226c12cb659bf7711fe30c594e548525dbbd2.md | 121 + ...c836867dd758509b908532f35cfc5e160d81a19.md | 6 + ...cb42f245df436af2bccb54b612786ca493b917b.md | 23 + ...e5c87704e816097ff9e649620a1818798b5db3f.md | 9 + ...e6365d1dd3ec522c4da68b662f05a0120617593.md | 119 + ...e7ff3238a69fa701a2067672493ccb1b9698cc1.md | 21 + ...ea3470872bf545059b23b040ab1eb393630a29d.md | 29 + ...eceac44da213d067b5b5ea66694e6283457a441.md | 668 ++ ...efc1aa12637c84918cef9fa5de5da424822330c.md | 17 + ...f13adfc739d217925ddcebb152284565bd43de8.md | 176 + ...f58073f0d5b237c3241126e98851a9e0c912792.md | 35 + ...f686bf5943844896a5385e01d440548081d2688.md | 18 + ...faf8791603eb1a93adc49ea8f9e5859d1e3360f.md | 19 + ...02d3d188e3edc4a4aa55f731966ebb22c827822.md | 82 + ...093c3d02f71f4fba221375302d20bc761e70aef.md | 38 + ...14ebf33612531c5020fd739010049e5126e0e5b.md | 22 + ...16575c57d15c410ac921aebfaf607e2f86e6c05.md | 20 + ...1a093cb8f1d24ea066663b3991084a84fc32bf2.md | 104 + ...20cae8361ae4e0b6fe4d6f0d32eee9517f11190.md | 40 + ...23987d173c0db88d8e1f59af46a8d9313a8e601.md | 25 + ...243d4c8499cc9be45cd9c1f6eb34254f1b9b4d7.md | 49 + ...34eb5d79038b55a3a6ac019016a21ec2b6a1917.md | 23 + ...35ad82faaa11fd4fec7ce7a31516e98ee3d0ea5.md | 37 + ...399cd9c09634e30c0f099c0fae66a756153dab1.md | 15 + ...3a1ff3338f4ac1eb2cf3ff6781283b49ac8b5a6.md | 15 + ...3d83af5ccd616f312472fbab4ac7d7a56d0f41d.md | 14 + ...3f7c9c7b52ec7152f2b3d81b6eb42db0319a6f4.md | 8 + ...4005f26f286b03f8ac692d42e9f3dfce1f66962.md | 32 + ...4416203d840c788359110b18cfd9ce922de0d67.md | 7 + ...453d1cad565842eea24c8d92963bd73338ef0f1.md | 20 + ...483016be71021f31b8193239d319f34d8e01c9c.md | 71 + ...4a06de43e6b08188a7672b5be8068a572de5b7c.md | 19 + ...4f850b810e969ce2646d5641300fb407a6c49c5.md | 11 + ...56f8a58809d3a4d8f80d02481e5adde513edeaa.md | 108 + ...5a014c514b00ff78c689585f393e21bae922db2.md | 46 + ...5d57c8193b99b8525bc2999ef82ef1cd7eae8ad.md | 58 + ...6048584b029b9be5da50d7f9d9ae85ffe740718.md | 53 + ...63eeb3dbaff3b01d831f717eeb7487642c93080.md | 62 + ...67d5677958594ba275e34b8748f7e8091782560.md | 48 + ...7470065afc59337b207721ab539b4622bbb3055.md | 9 + ...74d6fdf73627d7b2258d7f351c3d0156c06d1dc.md | 714 ++ ...79bdefa68b788a2c197f0094c43979d9265ba77.md | 7 + ...7ac1becae0867381bc236d4c0cc8fc4b8921a0a.md | 39 + ...7e39c164e92d0646c4dddadfdf178bf3b5e2ad0.md | 26 + ...85c42ab06de9ff515dcd03213f5c4608c6faebf.md | 18 + ...89f970cf3b162e67b98b2a928b36193169e3caf.md | 15 + ...8a7a354c4b46e26df8304755c8be954bb922b04.md | 15 + ...8c44d2a29b576f708bc515cede91227b6b4fc4e.md | 17 + ...924ae74643c2d9d416204693c9bb84d5212e3b0.md | 53 + ...98246e6e7f694d36936989d23b2255b15c2a92b.md | 32 + ...9ae3adcf2da2ffe5186553229fef07cb2b55043.md | 50 + ...9ba0bfc40b6212b42f38487f1533bb65647850e.md | 284 + ...a548d934dfe57dd0f12195461f2ddb348eae68c.md | 7 + ...a5f15e64aabdca9e2785588e76f3ebe22a1c426.md | 9 + ...acf5ed461253f09db844c2d84c1ae21277bc1e6.md | 22 + ...b0ab9084c7dd9546bdc2f376b58e32c0ecfee85.md | 9 + ...b83fe669cb3776d00a1a78e4764f115dfd5a40a.md | 9 + ...bb1684259f93d91580690d898140d98f12611ed.md | 9 + ...bc1fe73146c70fa2a76241470314a4732efd918.md | 11 + ...bd28f052373c2e70130c7539d399d76f9d2aafe.md | 25 + ...bed610a414085e625bd32aae5ffac81b41f97e0.md | 92 + ...c19733ed0d3400baf6ff05317475a6518b5ba1a.md | 31 + ...c20bd9f24d670dd18b6bc28e020fbb23c742682.md | 44 + ...c42359bdf665ebca2bae4b9b3d5108f8097bf34.md | 65 + ...c863b2624ab2712318442337c917143c19e7ddd.md | 40 + ...d1659b46a454170a597b0450fd99c16eec5b1ad.md | 33 + ...d1783967cbf46a0b75539badbaa1d601bc9f412.md | 53 + ...d21c3dd339c26916f6df1ef3124c9d2d39c9acc.md | 109 + ...d393a73ebc623578dd6da2c09c20e97fae074d4.md | 75 + ...d46d1240377aea562f14a560cb9f24df33edf88.md | 9 + ...d5d80dff65ee4195713eeeb43f1291b79779a6b.md | 43 + ...dd1ed59e93da4f6576e7eb1e420213ab34dd1dd.md | 13 + ...e28b88cde98715bcd89dcf48a459002fcda1e0e.md | 17 + ...ec0aabfa78901776901cb2c57aff822855b6b5e.md | 81 + ...f14865c04b28b02ee0760d7099554a916e26926.md | 70 + ...f781da5779dafefbb53038f71a18bbe2649117b.md | 52 + ...fefe3c6f1a20841fa1ae6afaa85cc7ff36778ac.md | 107 + ...04f36069ee071b185a1bce8370946a50bddcdd5.md | 102 + ...0cfe34d5494ab0ae2ef8b6f65396edbf667f688.md | 27 + ...0d6b2732be17c12226f186559fbea647799f3b8.md | 45 + ...1db0146b79b8256259507c62876e01ada143bd6.md | 29 + ...200315ea9da921edff8a3322417bb211f15b4eb.md | 101 + ...20e465dbc0c22ff06f80df18b25044dd1ebc787.md | 138 + ...21f46d0a3c2c3d3a623be815b45e8b90af61340.md | 27 + ...245768521f36e6f2df594e1bf3111dd63cc824a.md | 66 + ...25192bb81696d14887cc55070a6dfa14b3315f7.md | 65 + ...2a8f7539d1374784e9bf247b1370c430910f43d.md | 19 + ...2b8136f68ac74838b9c2b9eaf3996ccfaa14921.md | 9 + ...2d15f386dc333bc069eea8671e895c97956e754.md | 245 + ...3060b35041c9abd00099b1e0b1d83daff453c6d.md | 93 + ...3080e48c7b666c07e92a6e4f4bb256d77be49b4.md | 58 + ...3296aad76933152d5d3e9dd875ebbd3fb7575ea.md | 5 + ...339deef952ecf06246f2a5daed6925e00f52d64.md | 59 + ...353ffc21b5b117f70eeec0e71c9d6fb2f6dc022.md | 106 + ...372aeeeb4da6a3e94273cb46224ed09cd84cd9e.md | 142 + ...413c64687e434b4b2095163a5106c0c62aa3f59.md | 22 + ...4d2987869b1c8c34efa1204903a7a8f3e35d459.md | 13 + ...56ed6ca079a147359a51199dc333b23c2708b42.md | 220 + ...581dd8f04f917ba91f1201137ae0efea1f82e26.md | 15 + ...59e5a974f6170cbfdf7b0014cc1a0a0111423de.md | 22 + ...62c45d286c9b8a7edba8635e636824f2b043d73.md | 18 + ...65714702b012f1010ce06d97ec16623360f4e2b.md | 15 + ...6fb8b86499454efd078384d70b02917d1c7dae1.md | 16 + ...70242015183da2517df613fd951623042268bee.md | 78 + ...7091a60ba512e180c699261ecffdc3a621418a5.md | 28 + ...746f2e53d41f5810d92d843af8c0ab2b36a0d47.md | 11 + ...756dead36ac092838f80acffe6ecee13a22a376.md | 23 + ...757f7f9b9e4975b9e53da5b4508ff9d7a41a0a4.md | 125 + ...779271745a02f4de48bd92ab93a7a4be4a73d38.md | 28 + ...77c8cb678caf766466ede03c506eb0a822fd400.md | 14 + ...7963df2327fbe202b836ac5905258d063a8770d.md | 22 + ...7a861059a73e83bc02c633ee194dac6f8ace374.md | 44 + ...7db2218237b89f557d3702f4270288e4460e9cb.md | 58 + ...7e7ad16129a9dc8ac8ce2ee79c9b584d441f0de.md | 51 + ...7fcab0041feb8b819e329a319b12d2f4167318a.md | 48 + ...8243d1c0b8bcf04fe3556990d40d1a31f4cb58d.md | 102 + ...828fd5943abba08aa260f1080b850c90fc4efbe.md | 11 + ...8c4d682b46e9723f538988bb2bdb1eb65618e5e.md | 108 + ...8f15ac17715506bb29327874de7f76cb9fb2908.md | 29 + ...904e26946523bb3e78975f68a822f5f2a32b9f5.md | 32 + ...910b7c4cd65f8e4add1607791dd22bed468b61d.md | 6 + ...92c0e87b8e56b15991c954508ab125a8fb80972.md | 24 + ...92d19849e8fbe48869f5e3a50439964563a90d1.md | 168 + ...939716bfa6089c8b6373ed7c6397af71389a5c8.md | 19 + ...99cee894dff422aac8bf49b53cac700de1b172d.md | 33 + ...9a9834843b2d6e7417c09a5385b83bcb13d814c.md | 185 + ...9af55b95d387be39d4e9d328936b95cad5beb67.md | 7 + ...9dcfc3fb6ee0ccba63e0ff3a797936da9e0c874.md | 18 + ...9deec30687f805460a83dd924d2f119274d25f8.md | 22 + ...a3f647a7f4eb8fb4270d4e78245f18bfde29ad8.md | 70 + ...a95f85cd3f7250fcba52d8fdd82d1502fc617d6.md | 122 + ...aec614e6cbe5d4963d53dec7e22877d5a1bede8.md | 9 + ...b2899a3878e20a4b73b0f11cfc4fd815a81e13f.md | 23 + ...b4d4ca6a91c05d12f5c7942e73abae74bf08472.md | 34 + ...b5427922d2d03f0fddfe73bbde7e8b8dcda6a60.md | 102 + ...b67d1eb41065cf9da0eb68d429b69803d49eaa1.md | 7 + ...b6dc49f4afde44dd385ae09caab02a3f1db4259.md | 36 + ...baf01b064f3005647a010df369cc49c6534ffb3.md | 27 + ...bb452b4c9e3458bc02a9d392961e9c643e402de.md | 227 + ...bcbd3d61cc24296ea38b26b10306b7f50ce4988.md | 36 + ...bcc4276ea71978ffa874621715be92a9667390f.md | 72 + ...bd7112457a8b916f3b4701580570c85ae1b520e.md | 86 + ...c0ebf0ccb497f41c14a5895ef97c01864bfc3d2.md | 36 + ...c17e0a9e72fe65317838e81acf1fa77620e0c6c.md | 37 + ...c1e91540bd58780f781f8a06e2b5c62035ca84b.md | 21 + ...c669e0145dac26a7517d9402874bac048e46e82.md | 21 + ...c6b0f77c4ca0cafb52e1fe3e10800d56015cadf.md | 54 + ...c991135b30b24a268fc9d847e3f43522543a96b.md | 11 + ...c9d0d0309e01ff2ee0d298a16011857de068038.md | 7 + ...d08edd168fbee078290f386f7ec3eb1998adf02.md | 209 + ...d3a398b8394671d9383f214ff5e69a00391bb22.md | 27 + ...d3f7f5efb161e0d88ae69c4710d70aa99db0bde.md | 11 + ...d5b33f1352d8ba7cef029d1979ccf0d44aad63e.md | 30 + ...d81fcd3e78a5cc7b435198a59522ae6bf8640ed.md | 102 + ...d9ace87f4859bf7ef8cdf4ebbf8307c51034471.md | 12 + ...e1f6d5703ce75af284903c20e5dbdfa1ae706b4.md | 35 + ...e2a2be1cb20ef0c663e591532d71cfb5637e57f.md | 9 + ...ec85cf6ab5e5a276da78f1129ad3f1f5c92f5bb.md | 122 + ...ed4d7860687b2ef6f85ff81b6af4cfd2c6ea839.md | 27 + ...ee7bf839ffa16ec1a7f9ed82662efe539fd29c2.md | 202 + ...ef8007555bc60cd700ba44ecc0fafaa024f4bc0.md | 29 + ...f88cc7897776ead3f1a7052a740701b8e1a6969.md | 21 + ...094e343d06da6ae0d0d5d4865c7b0d806dc61a1.md | 6 + ...0a8256a4972314da32827a081b7541138b454a9.md | 44 + ...12e91752782553d39c335d0daaf189025739bb4.md | 28 + ...15971ae6c6a4eede13e9e1449b2a36f548b928f.md | 49 + ...16974f0a70ee2199bf6cd912e62bfb53d200f0a.md | 190 + ...1a670d6b3f0d7ab4ead7dae3795589f161249de.md | 12 + ...2217f5f0dee4a95c64b2bd92c25366706cc7e0c.md | 5 + ...22e404e76067637f1d0afdf44cbe309c2a53221.md | 33 + ...23360f59c9e5c3d6be4b7cd36927c23c0dfa268.md | 66 + ...23d19f0757433758d1743b0a62dacc98d286ec5.md | 143 + ...259e737315294c6380ed46645ab8d073a5ed861.md | 23 + ...2a79d23c94fb1920db500d2dd9464c1316c62a5.md | 50 + ...2afafa1c90d43ba1d3330a64491039f63d9feb5.md | 25 + ...334dccdb9872c1e7f698751b138aa5af6cc8335.md | 34 + ...37cc5401082dfd6c8c79d49cd97f7bc197c7303.md | 23 + ...38f12b976b522389f5fabe438280565490fb280.md | 13 + ...3923fe20855d3ea3850294c0fb447ec3f1b7bdf.md | 27 + ...39c9129c24aab66eeaf55a9f003f6501f72b81b.md | 27 + ...39f2ebdad7cd0a3445bdf69c69ab7b28b4353c4.md | 201 + ...3fe18d89140517ab2a75d6fc64a4a3db962b88b.md | 125 + ...426fb738655136d42fa32bd6cfbfd979a3d5574.md | 37 + ...42ad3abfeeca87987ed595047cc869e15f148bf.md | 9 + ...491f666270894ee4be071fd4a8551df94cb9889.md | 25 + ...4974dee293ba190cfa1b3383eb2417d0fd4b601.md | 38 + ...4bc2f43f99778ffa7e2c3e414c3cfb32509276d.md | 170 + ...4ffe04319ce15e4451729b183c35f288a58a1b7.md | 27 + ...508f0dda4ccbdbb07bd583218f4e4260dc01c0d.md | 61 + ...55ea8bd00a0246eacfef090af6a6b6f2bd92d4f.md | 106 + ...56dd425ad5be4ee255f2f95f7860b6fdfe3bcc0.md | 19 + ...5a87caedb1f1b6739159b9c7a31cce7c8978431.md | 21 + ...5f4c4a97cf58fa0642d88e501314f3d75ff9e01.md | 13 + ...602c22051ea1148b07446605dd3c57bf7830c3a.md | 15 + ...6c8af3bbafff1c227cf611d7327afa8e378d6ec.md | 10 + ...6d7217bc75c917100ae7df27dc14fdb919d1609.md | 92 + ...721517369cf4ea8476bcbb39040542ba2a212d8.md | 89 + ...78f6a8306234029de1642cbff8e44ed6848bf74.md | 9 + ...7d9428bd2e4a45ca968dad59d1005fb5fc4de9c.md | 7 + ...7dc9376a7fb6eb772d242b85909a023c43c2417.md | 246 + ...81d767decd07ef388611fd22c3f08fb89ba73ec.md | 44 + ...84eb2033ad74ea7044afc8bf1ddb06ff392cb08.md | 36 + ...85dec32600a9ded58fede3e98568fed789a400a.md | 9 + ...873a285dcb38ef4b4ed663bfa0df4047ab7692d.md | 6 + ...874aaf67ef04bb4d623fff07e1cdb4c25b3b33e.md | 12 + ...8d24508b131beb6138652c2fd1e0380a001bb54.md | 37 + ...8dbe0e16434502696281563802b76f3e38b25d2.md | 91 + ...8fb0908b90954d96ceff54ba975de832286a0a7.md | 68 + ...91dbd504569f02ccc48b181e3b953198c8f3c8a.md | 91 + ...98a23291331968098b47496d504743991855a61.md | 32 + ...9ad64c9004e83507a968c5c0b1c8ef952b3eace.md | 188 + ...a81b302ee01fdc0ac111cff3abfdb96e3a0cdd6.md | 54 + ...a9dc582441c2474e183da0e7dac20fb182842c2.md | 13 + ...acf4aabd6be9c3bc0e0a363c3bfffdd4a37b442.md | 46 + ...af15cb9e302a9e0d7de22de648ef7b3dca1d865.md | 214 + ...b2719c3b56d1bd40fa0d8c6853ddd078fd13d94.md | 98 + ...b763ffd1393292f4c3ca9d236440065b6660e8e.md | 64 + ...ba46a09cf64ce6120be65c44614995b50b67da1.md | 5 + ...bb91ebacc556700f955c3e6e01d90e5256207cf.md | 19 + ...beb81a5a5953cd570fa673b2496f8af98725438.md | 26 + ...c1d83e94ddc08d7a6229aedc49c895e86e660bf.md | 21 + ...c307031346d4fd7dd1a66e2a2f919713582b075.md | 22 + ...ca99c6ef4745121c9865ab4119f3ab1b1a3bdb1.md | 134 + ...cf77633a489e42b01086588d6613d65bfd51f7f.md | 15 + ...d1b3c707202f30f8995025f356f82abbe685b93.md | 41 + ...d999c84c01328a45ebf0ecad358d858c634df5b.md | 22 + ...d9fb046d583a2d0177ecb4da25eeaeb4febcca9.md | 29 + ...dc76ac891e282badf1d7845b2b8a9b3a26de3d2.md | 7 + ...df4040f4f2e5704ef44e6742585ee853a2f2a37.md | 93 + ...e0860fd12fa0bb5be75c68fbd34d69a631f2324.md | 17 + ...e24051d290e000441a4fdb326d73bb81505bd05.md | 22 + ...e791f66ad3d5fd3da45d85f27d6a1a7621a4cd3.md | 126 + ...eaafddade769d3b0300be1401bb3d7e68b312dd.md | 19 + ...f0b3a581945a1c7fe243340843cc4671a4e32c6.md | 201 + ...f3162bcd9976ed764717aa7004d9a755648b465.md | 104 + ...f5d0fd7e429fedbfc62dfc9bab41b3cc5fb4e4f.md | 38 + ...00e9e780d8a149530df21e38b256b71bda12d83.md | 40 + ...058d0b5222f1c34abf1737a10da705e27480606.md | 30 + ...08fdab4f452ab2c207ee3416332d315598e3456.md | 5 + ...0d279ada16512e67b7fb78fdac4ada9cfe5c645.md | 17 + ...0defbe604b3629caf8855a6d00ec14a0a6c92f3.md | 15 + ...1167e3ad363b416d508b03a300e5acfaf83f042.md | 20 + ...1ad83283a66cc3c467f70ea638b9c1c6681a160.md | 106 + ...20946ca7e893cc5a2b3d1a8f47a7a2c7059d7f6.md | 22 + ...22554c1dcebabc93cb859b4a896908da48a540d.md | 87 + ...292721e4524ac59fa259576d39665946db8849d.md | 34 + ...2ae491240ef740e6a8c5cf32b817e606f554e49.md | 116 + ...2e228e8218a4fdef9f2ca0db53b5b594a475b88.md | 9 + ...2f34465dd884e8110bb08a708a138532999714f.md | 51 + ...3071778b4e33375953afb1ab743b342d3cc906a.md | 36 + ...33775834ea8ae82cbfa6077fc361c3c52a99e42.md | 74 + ...3785386700cf73e37a8f76adc4ef9fb01ee0aeb.md | 115 + ...38b5abac4d30492c2f192ea551e9514df877831.md | 55 + ...451c208e0350c4c480f50929bd6735588b6f2bc.md | 81 + ...45b99372919de6b2c3e6a7e2c3f4caab0bf174c.md | 195 + ...48502b5d06cd5bcaa58f569aa43aa2e0394a794.md | 771 ++ ...4ba508199b214448cb22b7658127e16dd4e7abf.md | 257 + ...50caaacd51abdedab940cafb4bc47ebfbcbba67.md | 7 + ...51244d4e0cd8a3e96cd15ffaf0f3bda526cced2.md | 75 + ...517071b8cdd91311a13decdd9d0a7fd761aa616.md | 88 + ...562c632e1cfaaedde1374b29bdd1a1cce5ece86.md | 80 + ...56a228a64c2ad85e66f1fe0de558b4a426b197c.md | 82 + ...5a1c384d8d6a730d73357e2bb3216edbd2f7ff2.md | 204 + ...61d1a8f855174f44550531ef8be6e67c29d3e3b.md | 19 + ...62a5ba596aadf9c38762611ca2578398f234bd4.md | 197 + ...6915afe957ca00c5b825c5f2bdc618bfea43de8.md | 19 + ...6b746b11cf60709bcea7f7c2c0aa1ec0ada5bc9.md | 76 + ...7b819e4861856fab3c5627661edd8e59fbed8a2.md | 76 + ...7cc4851c049d805f02bd2058cd5c2ffa157981c.md | 29 + ...800c7e7c443ec310d775747125585f4671534fc.md | 183 + ...84af9baf43ac6bcfdfaf7b0d353ccdf119033df.md | 82 + ...8cca78ceb92570bce08f4e1a5677e8cd7936095.md | 40 + ...96c8703eba5c4c6bcd6d65ee60d3e768f1bf071.md | 96 + ...97007d0d0abac3202bbf912a15bfc389066ebda.md | 91 + ...9724d4b7690d4b215fe6f1c0a49c8b347f0c9a1.md | 6 + ...99553788712e55abe1345c61ccdb15d1ce04e83.md | 33 + ...a7f60f563f15cc32060c5f17cb44699a221ad5e.md | 13 + ...b16740c786c0846194987998dad887250be95bf.md | 32 + ...b48ef3d089f3142b1ed604a32873217f89e052f.md | 72 + ...b74e9409284f77897db58b77271337a4493a410.md | 67 + ...b8ebfdf4ea9e571d53720fe09a2ce610aecbcb9.md | 93 + ...bfeb479bcb6bbd28dd18ec423fdc5fb9c39b4b6.md | 56 + ...c6242d9f2b3e125780fdf188f994270a6e2340d.md | 27 + ...c83f9c21ca1e70077c8004bd26fe5fb0fc947eb.md | 10 + ...ca6000dc674cb2486d905f8531fc19bc88f887a.md | 89 + ...cd539b8153216f80b26729a35ad4cd04a9c27db.md | 151 + ...d299efff5b982097a5b9d48ea16041e4820a8bb.md | 20 + ...d8b25691c26b2ba05f7e8a96b99fd3f15a124c6.md | 30 + ...dd17198b8e7413469c1837ffdbaf109b307078c.md | 99 + ...deafac111cf37f37a2f20cff35606827d940390.md | 48 + ...e571695fb4e12489157704d87f89df5dad1a580.md | 9 + ...e83416b551f557d5bda600450e6ccb7742eb51d.md | 151 + ...ef4409d11dd4d5360d711eea8e1e71dac4c0bd7.md | 29 + ...f0098ce544ba8ac594f98af8df26b7911399750.md | 7 + ...f733928b0f749ffddf2e6daef646a0524c54d67.md | 22 + ...f89e6b2b76e64b9618f799611dd1b053d045222.md | 55 + ...042fbfb0c15aeded02ff805c4869ac838910c7a.md | 127 + ...062008d59b761c5cf7f32f131021ea81a03b048.md | 33 + ...0636405c61e0af7d2ee0ee31256c4cd0f6c5ded.md | 20 + ...10bb82156702471c527d6ef7e51fe69ef746004.md | 230 + ...1389b2d808c1f7d81df9ec75f053528ae1bc128.md | 10 + ...1426dcf985b97af6172727afcf353a481591560.md | 133 + ...1747f17f413f1f34cfd73d170de392d874d03dd.md | 110 + ...2507fe59c92ef1667e463b2c5d709c139673f4d.md | 19 + ...287ef2a9e06aaec6a8fe651feba2d46d2f07502.md | 46 + ...3019dd52edb5790460dff9a02363856b83cafb7.md | 81 + ...36ef493ab96990de8e237edb8a97db989ef15c8.md | 106 + ...38ecae0b5aa21e499f39c2637764a05bff7b6b6.md | 57 + ...3ee442d78abe20aaa100dda3ff139e566842c2e.md | 126 + ...4029dd42bae3a23d68d928ac3b6c04d0c735dec.md | 74 + ...42f90ca456dccc3d79dbf6dc9e8a6755b3ba69e.md | 16 + ...466d9a71e87bb01000dc957683e9cd3c10ad8bc.md | 6 + ...4ee0bb6fbd2e35c46c41d0065c299408f5ab0a5.md | 14 + ...6dc9cabda3980a4d5d41aa5b3e5612e727b289a.md | 23 + ...6ea4620b049a9e291bf198e71d0c58c2018686d.md | 24 + ...70af2aaf268a3df1d959d54a5be1790dc43ead5.md | 8 + ...77964b0c132f5ea793054c3ff67417dda6511d3.md | 88 + ...788d38721aeae446cfad7d9288b6bab33fa1ef9.md | 18 + ...7ab3726fa10435d26878c626f61988f7305b9e8.md | 23 + ...7d441ef305442bcdbbe48b980b87d47b825fff9.md | 7 + ...7ed2f2e8eaa8dab5b26c3759fd1bd102d03b975.md | 28 + ...81f43aa02d6c6861d2fdf220617cf3fbb903ae5.md | 131 + ...890d52d3dde4c249ad06c5a4dfe25542723f1c1.md | 20 + ...89d9b0a7150af5485e6f7452eb39d15addb35f9.md | 47 + ...8b70fac914f72c4ae9116de6e26880e1cedcff4.md | 112 + ...8c6d0a1c6dad01e3f0f1748dc472c3ddcc07e43.md | 50 + ...95bb1738027c777c1eb5a69631587923690abc4.md | 31 + ...9cdbabc75e7ec8987a3c464f3277923f444a724.md | 17 + ...9df73d502b5f62e3837464e81ac6bc9fdf07014.md | 39 + ...a328cf6319859f041c48974e44046bcfcea3b87.md | 31 + ...a6081124d93acd0a12843f64984257a02bb3871.md | 19 + ...a812008b8370853f0c151fde4dfeda4a39193cb.md | 6 + ...a8aa187972ba8a711ac91447f668b233e580c8c.md | 17 + ...ae2f0d8bd974c7393bc5ffa773b90fd0a2229b0.md | 9 + ...b0b25c87c4c2d91e8376d2aff3726e4ca355f36.md | 345 + ...b37710fe7bbd6efb842feb7b49b036302e18f81.md | 415 + ...b3fb712903b0d1044610c93e6fcde6a41be1cf6.md | 10 + ...b66f4f408827fe62b0584882d7f25fb9c6ca839.md | 50 + ...b85770138782723e09d9ed65f8655484d03be44.md | 31 + ...bc1631d896899d03e7d8dd2296c21656dd169ff.md | 583 ++ ...bc48ab9a35e2e8baea5204c4406835154e2b836.md | 9 + ...c2296329a2d24b1a22a3848731708d78949e74c.md | 33 + ...c2f280e5c4326883f7b3623ef1b64fe4dde7c05.md | 32 + ...c597f82ec8484220a6fb3193dc78b878e8698f6.md | 46 + ...c95f2d19465dda8969d0498d1b96d870bd02a1f.md | 38 + ...cc48263b0c282ca1d65accb46d73d7ea3c8a665.md | 9 + ...cf2fe478862fcaa1745d5b0770ce6486b3b71f8.md | 6 + ...d043091b2f2398611a819743fc83688d7658b22.md | 20 + ...d193c88d3e3235ea441bb82cceeaae20bb3efcc.md | 18 + ...d1bca52e974c3f4de54366a242df751e73acbd2.md | 111 + ...d9039607c167566ced9a4d7cc9f30f2b0c58554.md | 30 + ...dcc543a106ec708ff97817aa0cfdef8cb89894d.md | 25 + ...e1ce04d915b9a758f234f859dffefab46484c97.md | 31 + ...e2a4b92c4f5f84b3dde2ead6827c7fa89eb0565.md | 18 + ...e4d2166bb8c2b95e515591e014e7ca00b87bca2.md | 7 + ...ed78e19c7780c6856e1fa05d4b8a3f671fc878b.md | 7 + ...edda143971ce5735307fede23fb0cd7e963264c.md | 33 + ...ee63fcc911ba90930d413b58e1310efe0e24243.md | 25 + ...f0fc43f57ab9af130dea6a795e1e81a6aa95acc.md | 7 + ...f398f2a5f6a2e75b9376b755c3ecf4b7f18b149.md | 52 + ...f584aeed890d6efb4c9faf133a26bd9f9e4f219.md | 33 + ...fe3de32efb5dea4094dca22cbc77e24d23ef67a.md | 26 + ...008cee94719e6b3caabfba9bff1973b9125e02f.md | 29 + ...049d5aa5de41309e6281534a464abd6898a758c.md | 207 + ...068b2555e5014d386397335d0ed56b430082ff7.md | 12 + ...06ef22cf35af0edc961776fb893b07a880f11d4.md | 27 + ...0cc59b176b08462143ea591dac074060ad988c7.md | 31 + ...153f9f311cd2bb2df31c6a4a1cb76d64e36bfe6.md | 25 + ...199bbb097894542ea31c726d8ef4a3357eed1e2.md | 79 + ...1e8df28e1a79b4bba03cda39f350be5e55dac7b.md | 7 + ...1f714f5629ad260b0d9776fc53cda2eaa10df24.md | 6 + ...21083eb36cf3896b77d22edbcc23fd2716f6b4a.md | 21 + ...22526f6c171ced140394f3dd707b612778b661e.md | 29 + ...28354b3f2fa792b938756225315e3b4024dcc0e.md | 35 + ...2bf74e391cfe1696e5218b3df0926b735a4788f.md | 198 + ...31559e8401c52c3aac6d64e1f9da0f765fc4846.md | 75 + ...349e43ea9b4ac5775db122e0f6c365d5db810bf.md | 23 + ...3c0dfb695860e1da7981d86959d998bebc2dd03.md | 18 + ...402316febfad11a582d9c567811003f4bee596a.md | 7 + ...4057aa641f9259654e5f08d996209ef8027a3af.md | 50 + ...406a3bcb4e9210a9fb00af248f11f392af5c205.md | 20 + ...40f57e8262f846da7884e43f6f2f6c04cd15667.md | 42 + ...41b0015a5a634bfc40f10ae59873ca784232f14.md | 37 + ...48122bed05213950c23287cb4845fa56660232b.md | 19 + ...49119a6ef3f5aa2b1b0c63e0973532d4c950f48.md | 5 + ...524dfdeabf32bae384acb9bb21637ade3b4ac4f.md | 7 + ...53f494ee7f3d688fcaeb05aff303354d718eab5.md | 211 + ...53ffedfac00f360750f776a3a60f6aad38ed954.md | 107 + ...576530ec5d705b8bf323f6c459c32a87ae3f9a4.md | 13 + ...58967520625fac8039485004a1e80c32992077e.md | 27 + ...5998cb8747b70477477179e023332fd410e72d6.md | 5 + ...59e43ba12550aa1e885baec945b7b1b25fd18e2.md | 7 + ...5ffb2e27eacd57bcadc6c1646eb280212d3b2c2.md | 26 + ...601b619d597c89f715bc2fafd703452d64f21cd.md | 29 + ...638b9f61f15821f7a92d9c30fc6c24c029b78dc.md | 82 + ...644eaa4a383f7ed21c0ca1adae80a634867870a.md | 23 + ...647035446fc3a28586ebabc619d10db5fe3f4fd.md | 18 + ...65b81fcf30212ba535dedffc35e22901ed3e3b6.md | 7 + ...6e7b1f986535fce165f0cb5c553a6305339204e.md | 6 + ...7241853fc2471c6c0719f1b98e40625358b2e19.md | 18 + ...79f2f7a79672580b5fb797d9c5280b1a83806ef.md | 16 + ...7b99e436854f015a9db19c775639ba4bb4d5f9b.md | 19 + ...7c56aac7da2232e4da2b8aedec41b9d8755e22a.md | 19 + ...7fbc6967ed56285cc4eb1ff12d0e2e23b2f7bd5.md | 77 + ...8061cdeda9e9e83180ca7513620b5988266cebf.md | 10 + ...903d3dd91aaa7af3f53d389677d92632e24aef1.md | 17 + ...922b4d2cb89eb1ef4aa112af8b7922327062b95.md | 28 + ...93bc91eaadeae664982aa88a372590a6758f294.md | 43 + ...9eaabe17802ed870302f2d2789b3b476dfdd11f.md | 63 + ...9ed00abb6b920d1fe4f5b5675afda422f04e8d8.md | 9 + ...a186d2c83108a0288bdfe3d4cea201ac0837503.md | 40 + ...a32659df809f04f9a670634129fc75cc9140729.md | 11 + ...ac4a29febf419002bdba62d99d997cf55e9fcf2.md | 5 + ...ace7c519d2c4fca9fc0498bce82f75ffa05cffd.md | 162 + ...b4213fc5352021865e77592ebc27242e746b5aa.md | 6 + ...b6d315ffd086296183de20086ee752a6a2b88c8.md | 16 + ...b6f04aa6bbd6be14b11ea62aa0d844979bdfcdf.md | 27 + ...b81f2288b810e3ffdd2de5ace4e13e3a90e1e10.md | 135 + ...bc478053fefd091742c6775dfac9eb5b8c4923f.md | 17 + ...bff9c4db2bb43376a2a2cd681714ed3273e991e.md | 17 + ...cb2797ab2ef876f05a39f4cee08eee4249716d8.md | 37 + ...cd7b46e0c35165bfe21be4967b68481e9be840f.md | 85 + ...d7b948346f167b5390a0e56e1b6de83ae31a19a.md | 10 + ...dbd14399b24f78cafec6225b77dafae357ddee5.md | 40 + ...e25d98279484e1d63cdeefdd1d6a9f1917f1ba8.md | 406 + ...e50438308b85e969b79ded22cc5e15f6872ee85.md | 7 + ...f2cb7c072a05f7be0c6ce2eca39fc9a1ba5e107.md | 9 + ...f35b89192b6c9a233b859cf66fcc435f3f9e650.md | 29 + ...f51a9033343574aee2d292cb23f09d542456389.md | 22 + ...f544922de2638796837398f7ec15a4afe6b0781.md | 22 + ...f55360d336a77a06f2c4235b286a869cff0986c.md | 31 + ...f900078fd88e14400807e571e1f3a24c633c2dc.md | 9 + ...fc8a7d53d6951306e0fd23667a802538a81d6ff.md | 23 + ...fd8a950f1ebe6b021ea9d4c775a5ca8660a1101.md | 7 + ...1479786e864b942786028481e30dfb35e422ba8.md | 49 + ...15abfb108ed8f6361d07762656dbd0443c57904.md | 133 + ...17b697e0045b5d7dff6acc93ad5dec98e27ebdc.md | 14 + ...18cd1a731e0f4e5abfd77519ed254b5ccc670fb.md | 20 + ...1a4244c07321f32f283e49cfd6d6afa19639744.md | 94 + ...1c98b1ae9bb65177c030cf1de6760d41b7d7df5.md | 30 + ...20712d40bfdef5974c7c025a6ac0d0649124b79.md | 31 + ...22d44681192f1766a0b1bacc328e719526e8de2.md | 71 + ...23fd865c01f3ac097e03b74f7d81d574a1a13d4.md | 25 + ...26175290d457b10a02c27f08eca1f6546e64680.md | 25 + ...292de7c0036b9064a85d1da77a860bd989ea638.md | 27 + ...2b9ec702c95ac86de08e0fb8f8c3404b1228b5f.md | 32 + ...31b218e6e141e88f850b673227ab3c4df19392e.md | 17 + ...394b97da7b0846274940f439675051521a7dd7c.md | 70 + ...3defa42948bbe878834ca4b7c9b0395f44b9b90.md | 101 + ...3f96a06142ee17a6c55e5700580f33250552a00.md | 71 + ...434988303bf295c1586c5ee42100e8af244859c.md | 44 + ...436f8933ca1dd44e05cd59f8e2cb13052763643.md | 13 + ...4706148818bd2ace30029492dd8ad7d47283edc.md | 7 + ...51abcab00f67c93c253ec74d686e2cfcc0062ad.md | 29 + ...52d982c2f694ffee2a312cea6adf22c2384d4b2.md | 129 + ...551cb2bcd77b26ae0e05154a3e8cc51c070d707.md | 77 + ...566f3896a5ac6f89f4e7e18dc21b4a6a63864b4.md | 29 + ...5891659ab1df929d219741c3f2d69384a01835c.md | 18 + ...59b6927189fea6be3124bf79fa527873cb84ea6.md | 15 + ...623f4fa0f93db33077a8b64f7a7b27fbc84e9e4.md | 48 + ...6910487c819d14f9fefcbc6252f25652af1e65b.md | 30 + ...6b3f98c842554781d96b8dde05a74d4d78b4e7a.md | 102 + ...6ec742bc2d093c10c6a5b85456bfbb6571c416d.md | 34 + ...7393f760a3a3f834809aca1078bdf229331c2fd.md | 59 + ...73f81dd69d3adbbe1998ff5974ca83347effc76.md | 39 + ...73fa6558f9fd3115f36af9e4b11f67c1f501432.md | 117 + ...74fd49c617dac62f48eb31e08757e0aec3d1282.md | 7 + ...77f72f32fd20e96c4a5f0cca461fe9a79334e96.md | 58 + ...84686da695f28f867bc35c4416cb8d767d58b7a.md | 61 + ...8488a77cb39bdd413dbb7682f1dbe2675b3e3a0.md | 25 + ...8a4d6515faa2766feb3a03ca6a378846cf33d83.md | 59 + ...8a8c07b83df1b01276353d098e84f12304636e2.md | 147 + ...935b285f3e7dbbdcda940a70cf92dc0e2ed6512.md | 144 + ...946dcf2f69a7420490a7b5ca677c2273de5764b.md | 94 + ...985570f01d50d057ebd4fafcf8c8a1bcacb3006.md | 31 + ...99ce322c90ecad9cc4bacad45f9749ec21e912e.md | 16 + ...a9f4cdf362d1f06c3644edbd634b2a77ddc6005.md | 25 + ...b3616d29e7ac720b73ef3e24c9c807da05c4da3.md | 6 + ...b586e10794f26ea2654a7f7c34ec9ea48c8bfd4.md | 16 + ...b8b04b66e56fa847f1aca3218eb99f3e568eec7.md | 222 + ...b9348596e2f005f89842d1b997fa09bdcbe8f06.md | 44 + ...bab40e15d18920009e4168c32265a950a8afe38.md | 84 + ...bf4b8f1f49406eec43be3b7350092f9165b0757.md | 197 + ...c4f082004dba0b946d64aa6c0127041f4622c7b.md | 25 + ...c8bcafbd032e30dcc7c39e28a2b5de1e340da6b.md | 21 + ...cef749c4ed4703d00346fcdef795d0431bc7c26.md | 60 + ...d1e61ef82bc5dc1029d55c8f5c2ebb56082cdac.md | 38 + ...d385692a31e1e88e675af0b91f98f55797bc02d.md | 48 + ...e30541b3a12f403adcb02f90bc96134ce6b6386.md | 9 + ...e8d1f67fd96a81ff6d9459c1310919908000cbf.md | 21 + ...e9a5f54713ce7cb98ea4bcb223a40c4952f0083.md | 13 + ...ec3f9527921fb3f713dd6ae1d8035e6c81753c4.md | 64 + ...f2731c1ebb3f492687a336e1369cd6232512118.md | 99 + ...f4648fd3e7f8564c98cf142e0e09e23e8097a9e.md | 35 + ...f4719a688d4c15d72918ebbe43b908300138d2c.md | 53 + ...f755b81ab25cbd0950d528a240b12262fe6ca08.md | 62 + ...fe671db2b6972a1cfb04e0902f8d82dc979d42a.md | 24 + ...feb0313c4aa5133f215a847f2abaa025e83bb38.md | 180 + ...023ac0a48264db31f3c9da92fd84f947bfd4047.md | 44 + ...07d82c6eeebd0513a794637ebd90caa19f318e7.md | 17 + ...0ae02dc6e3e4ff10c8fd97e1c3f5a5e87270d57.md | 107 + ...0ccb2cf7a994d218d5c47bbf7f8bbb0d479e399.md | 28 + ...1045ed1b34827b3bd74d2546185c3bd3163b37e.md | 40 + ...109b6380043ce464115025dd32a7a821fd56db7.md | 180 + ...12c39cf410f9fe3f0d0e7c62ed1bc015370c849.md | 415 + ...1d740cef3967c20721612b7866072ef240484e9.md | 21 + ...1f297b28d1978eb0d0b1985d6f44b45dfe53542.md | 6 + ...2199291da8dbb7656b03232f5be43ba4d343654.md | 87 + ...23d9660b5b41b7c85904d0eb88a8d40ac57383f.md | 14 + ...23eb607207dfd62d80671af48451cce1c44153f.md | 6 + ...2512a3915bf43df08d9106027a67d5e059b2719.md | 151 + ...2546b72edbfb76f571cfd06a7009e01615fa054.md | 12 + ...279c6c73a8db1a593945e5ea339f9efde96a61e.md | 52 + ...2b2c3e8a59998daa1bc70938a0155ec8c9ed3a1.md | 33 + ...3198577cac405ad1a9bf68be7a5caeb020d57d4.md | 39 + ...322c981206a5c7eeec48c32c9ddcec9fce98aee.md | 9 + ...3579304f7f59126fe983b1ed44bbbb1ac8bfcb2.md | 22 + ...35b998310e6e268f648d4aa28528190ebbb48ca.md | 7 + ...39b16ac73c000ece7bac7d50baf6f7e37f2cad9.md | 33 + ...3a5fc83aa65717942a3437217f2114454552144.md | 27 + ...3cd92cdb99db6263492fad998e932f50f0f8e99.md | 426 + ...41465ad74b0afdbec9eaff7b038afc4c000e96c.md | 9 + ...435d88b7dc8317b982e1eaa57fa55b8391d00cf.md | 51 + ...4573d3fda739326819c7303ea21db6ddf2acc21.md | 47 + ...4d42e162fefc977ae807af123cedfdf400e403a.md | 36 + ...4e8928d464d412b225638bcc41f2837f98aef43.md | 104 + ...5381b4df6f42b35ca5097709523038abdcdc555.md | 51 + ...57c8c3489ac9b2891ed1ae9c81ea881cf1ced80.md | 17 + ...5a8f36d819b12b355508090e787f4a182686394.md | 68 + ...5c99b52bbbc96007bd819861e675c61d7b742ca.md | 107 + ...5dfc4b40da36a5d66892b5b231c9743c67d7e71.md | 75 + ...5e9cac1f581e61092cff1f6be38570ee734c115.md | 38 + ...5f8b4292483c5747ab2436a2d5d5377f1f6cab9.md | 11 + ...63fd4eee7625cf4012bc9e37b5b66cd25554b8a.md | 19 + ...654d0cbb99ee82483f99972ef5247401eb8e8d9.md | 8 + ...66bbcabef2c6e3eddf66300dc2639c938d815f4.md | 36 + ...672a0aef022cd97d9e834ab2fd3a607fbdaed4d.md | 7 + ...68801ec73691d31b90c8611e934aa5dd3b17ea7.md | 5 + ...70bf64e17feb1bbdae7b35e9941db781f26ad6b.md | 179 + ...745fb7bf19f0e2b0a78c3cd43aa4bf79a25dbce.md | 89 + ...7d2ff4289edcbf7fcfa7fc7fd460deb02ecc71b.md | 76 + ...83359c27f09c3368292819b64149182441721e1.md | 82 + ...8467827811ed045a648a3c215f5b91d43eb49cd.md | 45 + ...892a757ecb2c4a02806a7b262712ff2e30ce044.md | 29 + ...8a9f08917918d1d74c1c2ca702e999747eeb422.md | 27 + ...8bac0da2ccb09c93c0013a209147cc5a5dcee68.md | 78 + ...8e4e066b89d0a6993f31ea337930d962b76d6d1.md | 22 + ...937db13972e4dedbcc542303ef3a783287fd10b.md | 13 + ...95cd261c9f06f272286bcca3555846fb1ed8aa3.md | 34 + ...9f9e0463d14ded51b14392a4fd7a69bb53fa1bf.md | 322 + ...a411252b81f0e159c1f63ee64f63a987d1bef9f.md | 32 + ...a69dd7bead4adb82c87a200309cd63ecbd625d8.md | 95 + ...b32eb4742d88b5cec2e1c9616958bd7f8986785.md | 21 + ...b34ded3493e5181b1d19f6d14a9598cfeaa5997.md | 99 + ...b5211bc5ac76b26c8c102e576f0af560dfbcbc2.md | 19 + ...b9532adfc4fe3d9213bbe56da3323c759426287.md | 84 + ...bad741cd92f2db6ab2ce3a3c2d35d000235bfe9.md | 19 + ...bc347015fd7ce2af13b17de4d287471cb994f38.md | 11 + ...be1a39cdbaaa858051954548474dd3e307b20cb.md | 139 + ...c53bd47030c9bf4e7dbf1ea482cded9cc8abad4.md | 11 + ...c953b2300b547ad82edd9697cab8a5985f5ead3.md | 83 + ...ccc5cd4a9c103249435fc0a7fb18874b447de3d.md | 7 + ...cd81c0f5f84dfe58834aeb8b71e6d7780b8dead.md | 29 + ...ce325d8afc27359968a8799d58ef4bf0c57d68e.md | 35 + ...ce361c94fab69503049ea703fd6d5a53cd81057.md | 7 + ...cf8260d0474ad73d9878ccd361c83102b724733.md | 296 + ...d2b29253c00ae6a20730d0c9ad3284dc0fcabf5.md | 85 + ...d328fc36822024d739f83a36fef66e5abe61128.md | 23 + ...daa2c34d27a7e09c0ab837c191e87f320790f75.md | 38 + ...e56f0efd08ff4a97e439ea3b8de2b7af1a302c9.md | 76 + ...ea57ca1ae730686e86fc3b2aabd71c9f8ea9823.md | 21 + ...ed36d5e1ccdfb0139d9d3db3aea2b90ae1b405e.md | 18 + ...f42bd98be9767332ce949506a9e193393da73fa.md | 35 + ...f5ea4dc23caee3b6887b07ae9d319bfe5e39ca8.md | 27 + ...f64225936d78b691574900d641c0cb7c3ce78ef.md | 23 + ...fddca5b0d9d19db5b349ab7f72625b8c6d5744c.md | 7 + ...ffe1fb9caf854ded9ca52190d4874d8280d26b0.md | 28 + ...08121c9993cbedb4916c19d84605a9728fd27e5.md | 80 + ...087b2b5302fd4b7c8343c568c7c8a925544bb40.md | 27 + ...09b04011f4c2211d6d945ec82217e3f89a79bd7.md | 11 + ...0fafe76840267470228854a202752832d54a787.md | 35 + ...16c197a1a18fbe44382a30782b1ff7c13dbfeec.md | 16 + ...16f0a90d0b8383f2353b3320628e23e38b380b5.md | 82 + ...1838636de3442e218fd7beccde866113d10ddf3.md | 32 + ...1b834e69c2153740973c59cf6b4d66260640342.md | 6 + ...1eeb0303c78ec7eaa6dab7921e7173c68ff7769.md | 86 + ...2442d67350644bfcaec2b2a47b98f4ede943dc3.md | 7 + ...24550083a3a6acd177024df788c02d236874893.md | 142 + ...25108d09cfc6f2b5193d0d7414bfc83748111a9.md | 9 + ...288d1e76019a9d1f08873e515b9798906cc1c4b.md | 80 + ...2b00bee2e48f01962bbbbac49cf87587710f35f.md | 167 + ...2bd6d892feb4829f9c49afcf79cdc323be66cc4.md | 29 + ...2c74e7245dfe20bf93f1d73039ed4df95375c6f.md | 81 + ...2fe6b199a3b4773c5b57ededba80500e6c66faf.md | 20 + ...346a72cfcd74dfda05213a2a321bf9cfb823358.md | 17 + ...370eeef3d5414148efc5cc390b4efbe3020f23d.md | 42 + ...39233f807850ae8d28246ade7fdccda66e9df03.md | 68 + ...3a3a5e1a633eb2ab616759dfb76dc433abd4d38.md | 50 + ...455a31e5d6c749f3028f9f5e5f758f713c09973.md | 45 + ...49025c4deea46fd131c7b8d89978d75fcc440c4.md | 68 + ...4fe9993a8201bdbd9d383cc4cc4ca4f2dddb47d.md | 15 + ...555087b12b80060fb337f8974fea9261174115e.md | 63 + ...5689297b729a4186914e81a59ffb3a09289f8d8.md | 29 + ...5c10fdc6d0c3b142da650044e1a0581d04ef8e4.md | 26 + ...6597f608c26e68bfc4bdca45061400d63793523.md | 113 + ...6b0df7161ff334810f77fe93235bd4d548164a7.md | 93 + ...6c0566da4eb3450616c3f358c32837bfd4de6c8.md | 51 + ...7050c74e0c144e4f16aa808d275a9a472489efb.md | 20 + ...71ae69d7d2a527c25f31a6c8d8d64ee68b48519.md | 23 + ...7492a97f355a95d56bcf768a62ca7fd75718086.md | 6 + ...77988398efbdcd10db4aced047d8d864883614a.md | 32 + ...77c81385f7825613f1edbd3c0dbf44c259ba8d7.md | 166 + ...789f3a8936ad06c653c1c7aeb421c70ffd7c3e1.md | 21 + ...7b722619afc616f13beb20cd7a8fbc29cff50d1.md | 29 + ...7c26f347fd5a13fbc5b24fc567fcf7adf8ce0c3.md | 96 + ...7fa49d526786021cf325ff9aff15646a8270b48.md | 11 + ...81bcfc7f5817524cb8e0c9fe04e3f267a268926.md | 97 + ...84b203b8a0054a07f5be3eb99438c7fbcb6ce85.md | 28 + ...8aa3e34d14723232d266a85cbb9e2b1816b1aa5.md | 182 + ...8ac4398e3ea902007d99e5bdb0686aef04a4daa.md | 19 + ...8b447b5af1cd17524e2ba82fed83b8966ddfefb.md | 53 + ...8fc8e9a3380e4593d9bf08b78ce6a7797c0204b.md | 15 + ...933646421686556c9ae8459ee2e51ed9dab1c33.md | 7 + ...9675d0ddd35d743f2f0becf008d9cbed68c0534.md | 10 + ...9843122c08d0d70ed3694a57482595e35fb0d8b.md | 199 + ...9b0c1c962e0642e5b877747ed37e9bb27238664.md | 6 + ...a1025416cda5ea57e6b2d9525bdfc7f1ae58692.md | 7 + ...a5011652c8fad610ef217b82b7f28c8256dce8b.md | 20 + ...a83a33abb4c6a12a7457d3711c2511eb3982b2c.md | 66 + ...aa00a347bd6f7725014c840f3d39bc0ddf26599.md | 21 + ...b120ff1f8482eb617e16738d5160c966c6edf3d.md | 21 + ...b6386c6c291665aca0892481681a94a70185e9d.md | 6 + ...b89a3b2d7e1868f15a28eacf6d5c6214f7f12b7.md | 88 + ...bea57d80c215d963cb0c54046136fb3e88c7d5c.md | 19 + ...c03418999e6b01345837d9dd0f8e0410ed5cb7d.md | 704 ++ ...cad0018634ff820d32f3fe714194d4bd42c5386.md | 29 + ...cfb0a5fa276072e73c152485022c9a3eafcc233.md | 106 + ...d9188e6383db5f7038b98a688cb2dc9cf5a336c.md | 5 + ...d9c67189be5d6db22575cf01a75bd5826b92074.md | 22 + ...da0d100a88228ab463cb9b1b6cf1c051253911a.md | 37 + ...da9a2809d484a6caa70a66a3548cf4a537950fc.md | 22 + ...dae797269714235c8d9287b5d358bcf72e2c9f5.md | 51 + ...deac0e5b403baedeabe9c76a295651289e6416c.md | 47 + ...df72c2325ce5baca0cc7d2a884695d115557c40.md | 6 + ...dff39b0fb5fe6195aa75e50040b6d669fce2bb6.md | 54 + ...e15d946edfb82ef911d36032c073cf1736b39da.md | 15 + ...e1cdb994e758d43d9d8cdc5d88e2b5c7e0088d7.md | 23 + ...e2277ec0ed75ec2871c8bccb4b9af3f78350c9b.md | 526 ++ ...e71f112f9af39e61a59914d87689b4b8db13f50.md | 38 + ...e77548af396e9e9474371705bcfff55684c5760.md | 25 + ...ee303cb0d99042537564dcdfc134b592bf0a3fe.md | 11 + ...f06df311976f336cb3164b08d5da7d6f93419e2.md | 13 + ...f27a4650b0b0bf36223937d0cf60e460b66a723.md | 19 + ...f5d44b3a96f8418be317ad258e4932e468551be.md | 6 + ...f78eec8e37db19f2c3220f8e43029b2c5370b5d.md | 7 + ...f878a46b28c19b951157a5f31bb7a1a9920a89e.md | 17 + ...fa71067981e4fc0d6f68a14c91c694dc4c2af25.md | 11 + ...fd50170823ef108e2cf4ebf083b0085845fc3be.md | 119 + ...10de0e026ba0cf397108621d5927e16436acf58.md | 128 + ...11374b50b49477362fa00bbb32a277776f7e8e2.md | 88 + ...1365cd1e2acbee6e9bf025dd493feb17a0d428f.md | 11 + ...148122da72ad9ff05b3483d6f50975c50b4ab33.md | 34 + ...152f3047c3b41f06773051ea4b5b6b14dde709e.md | 370 + ...187344eb767bac8e4d674651bedafa33f70bfa1.md | 20 + ...1fe4b06db60f8a9c916fbeaf5c7482155bd62e3.md | 15 + ...20fcf106ba3053c247daf57a4a396f073d1e4e2.md | 35 + ...255bb890ca287c5a91765b71832daa45ba4132b.md | 97 + ...2b0db014389285d9abca9fe0d4035f85de6d102.md | 6 + ...3022ff9db2732f0ab3091884b428763d3879fd2.md | 72 + ...304b9e82543c150236ecad30f1594e1b832b8b1.md | 17 + ...392bddead4f42155dc83fba8512775db313fc53.md | 30 + ...3ae0828d8e261dbc23b466d22ab46c1dd65b710.md | 17 + ...447ec7366d2eb328bce8e44a73b3a825a9b757b.md | 9 + ...4799f6bdea1b1508528fc647dad5d1b2ef777aa.md | 14 + ...4cea84825e512a73c509437103b89b6ef363d5b.md | 45 + ...4e9fae09be2f3c0191cbc14a56085b0773a2585.md | 49 + ...56686454e771e5fdda0315dd38313f9fcb31aac.md | 5 + ...56c821c7ee483d01e4338397f62ddd6cb6d5e9f.md | 7 + ...5c7cf086b303923d48f8ad63cf85a6bccbbe3f5.md | 132 + ...5d736b45ec8ec0b906e183de5daa8bfa4c1f2d6.md | 21 + ...62a258bb486fbe7e7fc91c611dc2bc400e32308.md | 51 + ...6587cbe69b6227ce1d087cc141ccf13669f2060.md | 99 + ...67ea42903bf8be22aeb379891b7e1ca3eb2e4d1.md | 23 + ...69da07f8ee0529080646a4b1eab45c1074ab683.md | 42 + ...6d3281cf9382fa606cf60727452a304a5ccdfa5.md | 88 + ...6ff5c1e6cf7c4ba30f191df892dc3296f9b8ce3.md | 27 + ...724f6e91162b52c519f6887f06df40626c0f698.md | 24 + ...73ca4f67523dbb58fd3521ae9bff83aee634607.md | 22 + ...7845d8c3e419cedd06e8c447adf41e6e3d860c8.md | 87 + ...7f2612ad7178c8afa4c8b7c2f210a10dd7ee5cc.md | 108 + ...82cb1ababcf08e9fd361f13050d47850af8768a.md | 19 + ...85e898f28ac27daa8961337a9b468004c1b8b21.md | 155 + ...8a2d53661eb9ef173f7cc4794096a134123daca.md | 592 ++ ...957adc1e11b5dc6aa15dc17ef6293c40f89fc20.md | 67 + ...967430da16338281405cf73a802c233911b6a13.md | 27 + ...99d0a49cdc1c3c38eff43a6b1b51b0a177e5573.md | 87 + ...9e9d62e92156cebc0d4619cde322af48cace913.md | 20 + ...9fa1d31f4cc6018daf5b927908210846b082675.md | 7 + ...a1c79d72d6a7d37ce1e72735b6dcfca2b546dce.md | 34 + ...a213d259727545c26401ad5cfb4916b6efbd18d.md | 87 + ...ac63365f37f6b307ba343f45706e388d24245d4.md | 184 + ...ac6535cab0b4600a9683433fcab805b2c4eaa53.md | 14 + ...ae40f1cc335a650c1eb806e404394da596fb433.md | 259 + ...b42ff6b754a2e29fcb56b0137eeddf17f8ee271.md | 48 + ...bca967cd96ab805be518e8a52ef984499c62f6c.md | 105 + ...bd445ce46b0329348e6ad464735bdb1d525edaa.md | 20 + ...bfaaf84948b090c8ea099ff44cc8cd878371073.md | 90 + ...c040f5709ab00ab3ed8275862fa2328d20842b2.md | 35 + ...c97ce4d4df6402240f1a6a67dfb9462bc1fafac.md | 154 + ...d5b9969c7557bfc4cfbb32cca67f40c52ff824b.md | 92 + ...d61bc1b395a071d8850bc2405a8c311cfdc931f.md | 7 + ...d76780ea50a0fb37454a3a03ff08ca0ad39ef19.md | 242 + ...db2d2b53c7f2a464a38f7de5d7a74a39e697528.md | 32 + ...dbd308eeb761b4a1516d49f68c880eaf3f08d78.md | 20 + ...dbef9d5635eb271a8bd78b23064dcba1a1915a6.md | 12 + ...deb3c4ba4949f2c87919d5493b71b67028b76ee.md | 29 + ...df96f4dc435ccf7e702eeac6fcaa9f7decd1dcb.md | 80 + ...e3f5b72354288cc106bb10263673ebc80b2d544.md | 7 + ...e57c56703b39c9097516d1466b70a3de57aa1c4.md | 101 + ...ee1a739f2ea11f815ec571163ba99c9b2a97245.md | 24 + ...f0f7c335a10c372c36a0ccec76057c41b93731b.md | 43 + ...f19b6a59e167d486d94f4bbb3724ce1deae5feb.md | 17 + ...f2ac67b66d3a2db0d4f2af2d6743f903f1385d7.md | 50 + ...f3da662099bd616b642f69925aec7c8afc84611.md | 18 + ...00beb80e522d712dc9062f835ad10e787b8c5fc.md | 17 + ...019692a5844a9a72292a35b8953aa67836f8201.md | 640 ++ ...08a6b7a0f11fd3ab62a14f44fd4e1a771174c61.md | 89 + ...0b1665f022c9e781ce1ae94fa885266391fbcfe.md | 53 + ...0b80eb59e769546eedf8ca32a493bf38c6a9707.md | 7 + ...0da6cd45bfd0d3a91f0b3c4e7615de23fe4f350.md | 65 + ...193a2795bdef17a5d204cdd18188a767e2fe7b7.md | 56 + ...1af301f18e6444da2842cc71f9ac38505ee5e1f.md | 170 + ...2117b2cd0fea469149b23facb6a9f7f32905afd.md | 87 + ...2250c2a2e20f6f123c6d1091bfd635dc74ee4fe.md | 22 + ...23f48a4757500fea641245cffa69cb3b72ae0e8.md | 259 + ...2593108fa446c4b4b0ef5adc2cd5d9585b0b63c.md | 64 + ...2ca734ae719ba79ab4b5f877cf044f47090faec.md | 9 + ...32394103127310af0f4bf240cfd0b26399b685d.md | 92 + ...3f8fb433fc6730284e636b068a5de98c002dabd.md | 146 + ...3ffe77064106ee619c664233b7b7a9aba75c30a.md | 41 + ...416f3605adf246170e1b462ee0f2cfcdf5e591b.md | 37 + ...481bde61eeba2cc6b2a0c1d9c43d8dd56ab2a08.md | 142 + ...49f37bd511123a94fcad3c6e826e60fc61db446.md | 6 + ...4b2e864e1abd4ea20845750e9567225bb3f417e.md | 133 + ...508da024ee4722c3919c4d1118cf0410713a9c5.md | 114 + ...518a7a2d4aa3b05564c965889116f6a6151a34b.md | 142 + ...51ff1fba515035a93290f353d20ad9d54bc043c.md | 23 + ...523ebe64275bee04d480b55ccaeac3017a36980.md | 34 + ...561f461842bb0d185f097e0adb8d3ac13266172.md | 60 + ...57a4b94bfafdd0cd6edbdfa4aba1f708286e918.md | 15 + ...5873013457aaddcc20db880b3fc9d9bfb7bd348.md | 56 + ...61649df5425dea0c1f16942bde0eec79b3e4f80.md | 118 + ...648a5dee55d7dbf258b7b088830f18c040c61d5.md | 19 + ...69246113e589f088e8e1302b32b57720bd27720.md | 10 + ...6dc074f83f9e8984b9cd3a3bf5b392bc4a61844.md | 18 + ...6dc15d9f3f199c8bab5f85eda67d50627bb3e08.md | 45 + ...6ec6454711b4946dbc663324dc478953723b1dd.md | 14 + ...741fe5cdd06d606f869b15deb2173c1f134d22d.md | 60 + ...7bafad14d0bf628c14fe0821af01aee98a0ae62.md | 71 + ...7cac3027eb08d3e2cfbfab0f0af2acf4dd0f990.md | 29 + ...7e56bebf29f9aa59a9abc9e299f19613e5859da.md | 17 + ...8044b03933e3fcea5bcf6362199ed083ec2f20f.md | 9 + ...851271c134a1b282412bd7a667c1c9813b4e8b2.md | 7 + ...8522e9801281dd4118a5012acf885a7ec2354e4.md | 19 + ...8581c38346f1fe8900d18db8fcef8145f5965bc.md | 88 + ...8aa7399868c0ae8dd698c9048ebd50c3f17ef12.md | 110 + ...8c3b95fc688c347d679f81711781b29578cfc19.md | 19 + ...924d359f00db1671f86aca7a3ee226206dfbed1.md | 24 + ...92f42609b54b82bfe38a69b781052e876258c2c.md | 515 ++ ...93f8a3a1ced22cf84c45b552d5040a4a17fdb60.md | 18 + ...98506eb96c587bdfd06cbf67617e25d9dae8e60.md | 7 + ...9d44bbcf205103bf01619d31cfebe31a725ba5a.md | 5 + ...a4ad6d42d951b1247e54e312c04749fd8ea2fd1.md | 27 + ...a78048bad0ee0f455762254f562704769ea4149.md | 87 + ...a8a6820b3dbfaa703679b19be070f7bd0cca3d1.md | 6 + ...ab82891ca84875b6eec64974558fc838197c99a.md | 19 + ...acaf30043e33912e3d7f174b3f8cf858cb3093a.md | 39 + ...ad5210d0f8114cd4e9b1db05eb92f0eabc6e233.md | 38 + ...ae3302fc87e1bbfa604baa2d003069e4233a517.md | 6 + ...b659d7b00db3096c4082bb93c7fdb933738b013.md | 24 + ...b832bb5ce4b3e6e6272967d547d652b1daf2c4d.md | 199 + ...b961ab67f88b50475329fcd1ee2f64137480426.md | 143 + ...bb6fc842a370135b8488d9a2e09fcf17341954b.md | 34 + ...bd1f022a8393101199abb731534c10be99cf1e4.md | 27 + ...bdeda771a051a9b1871f9bec9589d91421e7c0c.md | 12 + ...c1ad7048032258f29e1d4081a2eec98b36d13cf.md | 78 + ...c314650433831859c400bffefe5f919ed8735ea.md | 17 + ...c3d88e89001bb639e418ae5971b209535603a18.md | 21 + ...c75f4741f871360b8e3ce356754c329323306f7.md | 112 + ...c8e9394d23a5320bfce0ebe7f208ca18cb6b65c.md | 29 + ...ca763bf5f62bdc635ac2e0e7c9c6a47b04745a4.md | 68 + ...cae38614c57f1abb775c4c9372dc02531830659.md | 22 + ...d995b62f35ec624da9e86f9a3383b73b54d9ed7.md | 137 + ...db3689801d81676ae642f1ebff81d27c07f1f3c.md | 27 + ...dc1b4283563848e2c775804fc0857dbde8843af.md | 32 + ...e1c1c3648cb7f6f6c394334554b1ecedc3504dd.md | 88 + ...e6a4c0bb6bcc7166ff88d60fd433c220962730d.md | 11 + ...e7f45c3e17998a50b8414d623007ed668b37c04.md | 129 + ...ecca4c839a0bcf01adcb6a5ce31a3b1168d3548.md | 6 + ...eda84e76e7f8fa5594f63e640dc17b4f6cb3e5e.md | 110 + ...f6a65f061558b6aed8a438a887b6474a0fdffc3.md | 7 + ...f75f233fdffdca8a25d191e1df4df7f51e30823.md | 85 + ...038ba342a00562bcb7a569e4e2acb7349c9cef9.md | 181 + ...07cd6df8c92edd0f2638573bfdce7bf18aa2eb0.md | 92 + ...0cc7ae4029730b9846b6a05f4160643d3a8c393.md | 9 + ...0e0c248b3934e34883814b5f9ceb792d734042a.md | 92 + ...119b8d62c156451a8b8665e8969422803527df3.md | 73 + ...11e8deedbabe64f4789061d10e55aea415fd51e.md | 33 + ...122739764b1ec75b64e1b740f493bad8616a9db.md | 99 + ...1324a359a58b4d399c10bc59ae94e7e0723836d.md | 11 + ...143a9f5185d9303301630d3fc53b604d3dced2e.md | 15 + ...1ca39ff2c12cc12697e62a37c7c52a256248af7.md | 52 + ...2185a8c9156c6b38d76bd3fd29a833d96a5762b.md | 48 + ...24646ed4724e2a2d856392dda9c1b9b05145e11.md | 28 + ...2da4bde14d0a2da1e0e2d795e7dc7469f422db9.md | 27 + ...2f1ff7794524db18ee5fadfaa7232d0a94f8b4c.md | 17 + ...324305e8f756140b7b96492d73d35bb32794119.md | 22 + ...32fe380cf3083b6d85554063b5acb153fc1c8be.md | 262 + ...3552c5e0f334c8bc3557960821dc5ef931851a1.md | 126 + ...41c78f27bb2f48542141ea85eda7ad333e3fd0b.md | 18 + ...471b8b14614c985391115ec1ed53e0b56d2e27e.md | 17 + ...4773ef8b0935e8de084c1a6285efe11e2a5f80a.md | 56 + ...48e63f001dfae875e1c82b5d163b7a2c9961ce2.md | 141 + ...4bb814768f5d91d2c6aa90b34fddd944aa1eb91.md | 5 + ...4e83640891ea5d02eae76027d05fdefe2c4effe.md | 86 + ...528d240892080aece146d29fb3496ddd0f1fd48.md | 90 + ...52d7d525c33eb8fa5b5acc8b16243223d78ac68.md | 21 + ...535650c17cde010eacbf5b6bf85fd8e593b77d6.md | 181 + ...53bd428f2955b76bf24620a21a6461a1cc19f11.md | 23 + ...562415979d3b38aa74c27fd68f13d54ffe47fe5.md | 34 + ...5673e6023d99f8354e9b61da2d2f1b58fbc970f.md | 20 + ...5f5acc006cd6f06be3266ee98f89fabf4f6fbaf.md | 7 + ...61d407536d31a069aa857469a0eebfef1c0e1b8.md | 115 + ...6223eeb52369b6b2baa2b489c9da41c882154b9.md | 62 + ...6379e4acdd7b1c335e9944b8d9dbb08db220420.md | 30 + ...64a69ebc1360788037b11e8b0dc5bb74d913819.md | 31 + ...6b0055426c9e91760f4923ed42be91d64fca6c8.md | 71 + ...6b9bd6294c9a3ef6cd7e45e1b3765c061d92cc3.md | 29 + ...6ee4cacfc1e29bafbb8ed5d98521ea68388d0cb.md | 17 + ...7049b7393149edc2256a9d4edb1d6e5a6e24b72.md | 27 + ...709b8079f21daa0ee315823a6713b556ac2789b.md | 27 + ...70bb33e4e6792511dc4e7d88536017e64bcd0f1.md | 12 + ...81beea067ccc7fed12806f3ff0f20519092f2e4.md | 7 + ...832eb23963c0f4bcddb2dd45c8e67001aee8f4f.md | 90 + ...8816bf425ef039884dbf6a7282f8d7adb7c5d04.md | 29 + ...89753519b91f85dc9e0ed54a3248cd82d5f2a9e.md | 18 + ...8b4a993cb8642bc87432fcb305eee744c16a154.md | 60 + ...926dfb3758881e6698f630e496f3817101e4176.md | 326 + ...9769e4047faf3c5f55b2a7bd5fcce3e321870e6.md | 17 + ...9857afef4c7e7c2ad0b764277b90a2bce51adc8.md | 44 + ...9fb652c433a0a0bc419cbfe4ecc3680252d2fe3.md | 17 + ...a6f118dbe9a1782053fe1f5f4697dda07a7a365.md | 78 + ...aaa2e09b5b6f7ac550e936268b45d3cb7a412a1.md | 226 + ...ad5f0781542a67a581819b52bb1b6b4bb9ece74.md | 72 + ...b130d4e1ae505ce39cbd49bf9d22359b9ec80ab.md | 53 + ...b81643be8ee3b3dc2f6bccdb77bd2cec32c8926.md | 37 + ...bc6bda4ec8356f2ce95dd4548406abee1ec5b76.md | 13 + ...bdd718bcee7b1ffde95191be1749d57b9a1a60d.md | 19 + ...c0adf041f1628221cac49a1baec1d497d762dc4.md | 6 + ...c60febf8e5d1907ce0ccf3868cd9e4b494aa1bf.md | 47 + ...ccf5ec3e34e81e3e25ffe29317cdac2ed1c936d.md | 86 + ...cdf1d5375060fcde288a920a6f3c1b48454c6db.md | 38 + ...d0745062372b6a66356728dea39ee6d8237d0de.md | 38 + ...d1c58ad8e180ab922890fa8182ff7f51c589962.md | 115 + ...d27e36e95ae5324468c33cf3a112dc1611ca74c.md | 276 + ...da0897d49b56ee521bf16e52014da5e2e1d2710.md | 61 + ...df460b2bb910f74723297bcb8e940bf370c6ffd.md | 39 + ...e13ae6812f1e2ca6ad429d4b01af25f9f398148.md | 49 + ...e14b5eff03a17683c6aa16d02f62e1ebad0d7f2.md | 19 + ...e1b598a354c454f2d201039a2bb6d69babbf840.md | 53 + ...e40b0cef1449476821a1ebd8d0cf339c866d16a.md | 25 + ...e7976afe82e2d17ee1fa308570afa42e0e91667.md | 41 + ...ebdc984a6e14e7dc6b7526324bf06a0ce6ffe34.md | 26 + ...ee9ef1f47611f6a9c00bb76c91b94b7da2a62ff.md | 86 + ...f4254ce9e6d890ccaa2564da3e9b57071ade342.md | 373 + ...f6fe4e4058c24f0beb94d379fb9e820c09456d2.md | 20 + ...f88bcc09a32b2d6d65f2c2a831e2960aca1e347.md | 5 + ...fc54bb4cea29104bd4f9793b51abe558aa0250d.md | 7 + ...0142ffcd3063427101ccc165c5e5f2b0fa286db.md | 26 + ...04178dde54f21a248daff3f1582eb4bf1e9ac43.md | 28 + ...05d9570cd32acccf91588c5886a1c4f5da56d01.md | 40 + ...05f366afc5726dc1a258edc3689067381efdecc.md | 27 + ...0907278ca0ea55b0e0ed9e834810d502a817af0.md | 85 + ...0dece55336bc8393593243d829b9d4b1e6159fd.md | 119 + ...11a81e7333f63092fcf2c047744f2f3c18c1903.md | 13 + ...171fcf10d8a1699fd8ac67e44053bbf6405631c.md | 14 + ...174298e1dd7898c08771488715d83fc7a7740ae.md | 95 + ...1908d2f2c1701d4a9ac3354e42dff295c06b40d.md | 40 + ...1afa9bb4e0475a56190dc8254e004308bea484d.md | 117 + ...1b1e93ad61d2b095bf8a00e9739fcf7d1dc974c.md | 29 + ...1c3f3db7837f7c5803f52829a542f6ba8b4837d.md | 33 + ...1cde4ff34352a6e5cdc9914fd26cf72574e2d59.md | 7 + ...1db4f3b084cb401795c925f280207cbcb3d94aa.md | 15 + ...1fafa3a73f77b401f49cc641be44d61bc9c0689.md | 68 + ...1fef8c7f5be28316caa952ccc76281e6f3fe12f.md | 9 + ...21cd926ca1fe170c8c1645ca0ec65aedddb4aef.md | 73 + ...2d9f4e05cabc566b2021116ed28ef413fa96779.md | 7 + ...2ea86e13b810569e718e9dca4c00da28a2e1c9a.md | 45 + ...2f4f71189d7f5c92ddc2ccb38f2bce1efd4bc65.md | 52 + ...3084bfb07d425ebace9f538d800e08daea97594.md | 44 + ...377da7cf67645f321593fa8b1536be2f0753333.md | 106 + ...43de202e6d3eee211893585616bda7eb09211c4.md | 91 + ...476f3e93d23f52ef1d5079343d92db793e3ad5e.md | 40 + ...487db53087c5fd4cd2a25112f1f8a8e496efc72.md | 27 + ...51ad51e5407bf4efae5c97fe7e031db56cf8733.md | 18 + ...5521b8ec8ced84a2e383b3b6d5bc20795ef87b7.md | 41 + ...579aba442c4652bac088173107ecfebbf4d8290.md | 43 + ...5863a9857f07023885a810210dfb819ad692ed7.md | 34 + ...59300b05666e072ea812effa009e2dd4b60a508.md | 11 + ...5d31fda0eebfcdd87005ed54ebedfd164fa073b.md | 22 + ...5d7bd00bd17efe339c848f46345f2192fda5c11.md | 72 + ...5fafc625d1a1d0793d9521351e9b59a04af00e9.md | 25 + ...64140c0b8d4187b49046528ff61a54d77a99223.md | 15 + ...669435b8d1c91d913bd24768e52644b95c675ae.md | 17 + ...69f33671e13df29fe56579ac4654ebc54a11f12.md | 137 + ...6a347cb86df46925701892180f4d8a5b8e14508.md | 7 + ...6db1fbf1b0a11fd3423b6f057182019496ff3f5.md | 9 + ...71261b71a4cf5a1ad5e148ede7751b630060bdf.md | 127 + ...733288343a1790788e8069eb55908f9d12566a9.md | 13 + ...73c52b16ec33caa6d1f51effa5a6e37052d6110.md | 9 + ...778df3dc8ef2d3ab4ec511b8d20d35778794b93.md | 17 + ...7fd91bac6be16abd9b158c6b118e5e09e047c6d.md | 19 + ...83baae9c79e5df9ca904ab1886ac4826447b495.md | 136 + ...872c74770b5729e037e841679f741cf3d8c20ad.md | 6 + ...8bd7c30f776f7218860187f535c6b72d1a8dc74.md | 143 + ...91044a492d05f87613bba485cd2fae1f54764db.md | 41 + ...92a34a349cee727b017af7d40b880b232220959.md | 50 + ...9304450e79dc05b5ecc4fe98d48fecef76a852e.md | 39 + ...96c3a08a5607bdcb1bc85e0bedd8743ea0b3dc5.md | 20 + ...9b02a6929162af5f13e95c700ce0e548f6a9ee3.md | 171 + ...a0357b0ade596e1a23f676f76ff4304b97aef2b.md | 9 + ...a3d295da633cd271fb3970ad2ed4b31bdcb6247.md | 42 + ...a7407d415b3eff25ca3dd588bba677cc8cd3494.md | 27 + ...ac8a5e350d74e41c1738f4e2a02258fecf9d20d.md | 25 + ...ad2ede59535330241f2febdf9bf99e21deb4393.md | 9 + ...afb63017668c5dd34a07a1850ce9e9a37d0f525.md | 40 + ...b504727c8688251caab0c18e12bde9dc625ecd1.md | 24 + ...cb8fb91999d79190f3e5d54de32b1b7f1401779.md | 25 + ...ce29488a4d041b77f6e9b1b514f41335fae0696.md | 157 + ...ce39ca6c888ca6d5cf3f9b9d18d06fd3bd2dfbe.md | 13 + ...d88591c39c90f2cf211c3ee3330b7e7939c3472.md | 29 + ...e0c1913d6d770641762ed518fefe8fffc5a1f13.md | 21 + ...e359e77f61c11b6f759e8dfe8ea69aac3d0514a.md | 6 + ...e60e212953766b4698982b3b631d1a25a019f2e.md | 24 + ...e6c4cb72844fc59fd80fc0b26acc8c94a3ba994.md | 19 + ...e79f406db76b8d50a2b8ab35d4a385983aa5f54.md | 52 + ...e9ce5d0599d0d181890911721738ba3dee01e34.md | 35 + ...eb599f49c3e459a08e8bf25304b063b50caa294.md | 70 + ...ecca51bacc7be33f484d36177b24c4bd0fe4cfd.md | 19 + ...edc196b72e081228279b523ba3585aed93c2370.md | 83 + ...008266c010adfef841c513ae7bcb91436f9ae9c.md | 27 + ...01184bcba866d676b5a236d6638e78d3f55c794.md | 37 + ...01c7d12e53747c7ed71d615d7e9dcd8f17638ed.md | 43 + ...03dd29f683c4f22a7084c9ab8f1488c380170f0.md | 86 + ...0b0b51cd757048207eefe4ec8f1e98e967d9e69.md | 205 + ...0d36a6f5028fc5ed005e87faf9f65f976e62a37.md | 94 + ...0e5646ea00a170bb595e9e0bbccb69f702ffc7c.md | 49 + ...0f6fbca52d2ee44ac2e0795fa11fb53e3054c47.md | 18 + ...1074d5c232cb13e3cd1fb6e832753626d2fe30e.md | 40 + ...10cebbd89f23e057645097b776a51dea0c1555f.md | 20 + ...1232c341b3f590c23e9e81ddd157bc99ff77191.md | 14 + ...14741f9a90592b67437aaed4b7042cd3dc268a8.md | 9 + ...14c56a78f56157e862de99906254b291f5b3321.md | 184 + ...176531ba95036356a7e5dca50a8df728c78ce79.md | 27 + ...2089a0f2315f9897f6e3dde50e4fc3ebd2e65aa.md | 111 + ...334a64775ae571c661cdcc847669f0e20c207ff.md | 86 + ...3526b694c68c40edc206e216b454e63b83f3eba.md | 210 + ...399a5b6fa720c6f21337792f822f20f20f98910.md | 50 + ...3b9f33c36e5636808b137cfa4745e39f3b48d62.md | 230 + ...3e5fa98908eee308d960761e9f29cf7a8aad690.md | 43 + ...3efb6106ae81db5a8b3379c3edcf86e31f95ab0.md | 16 + ...45c894cb0df39ad55a35183d62a6cbd570076ca.md | 29 + ...45eeb80195e54d02a6f6cb7505f1fb73b4d4dab.md | 76 + ...45f37bddb38d6656992642fbea2707fe34e942a.md | 16 + ...4eca1e5e22f94051d1c8e115d9d874658b5697a.md | 57 + ...54340e1ef02d2436758a56105b3182481ff1783.md | 80 + ...5895bc081edbf0cd7340015decd0d0180aac44a.md | 28 + ...59b59312d1eb3b2ba78d7e78993883bb3784c2b.md | 122 + ...5d702e67e93752155510b56a3b2f464e190eba2.md | 1012 +++ ...5e1d00dc75181ede4fc66bdc17bf3c07eb314ec.md | 17 + ...5ea38444d60150c0fd2eb498bf33793dde5fed2.md | 70 + ...61658d2ba7d0d13e5a6008e28670d1b1f6cb7bb.md | 21 + ...64b1811e55868cf510b06bfd1a24ba4ac3008f1.md | 26 + ...6a2ef28a33aa6a8c8b2321133a8816257cd1612.md | 34 + ...6a30655cbd3745acbcbf18e79b4c3979ca6b35b.md | 36 + ...6b5ead096e68a255c5526add4c828534891c090.md | 17 + ...700c898ec2efe96c76c2cac042e063529b23d3b.md | 93 + ...70109f320a53829d66f6e07ee0a9b79b59aee13.md | 45 + ...73062f1e8466ab5604358a0ad0d66f31c81507c.md | 47 + ...732dfb3c4f38abecba99da31750fb6291560db5.md | 19 + ...76a86b7ee87a78fa06482285bad02694abcc3ca.md | 197 + ...777a9c7d0450d572431f168374224179c1ae7c4.md | 6 + ...778331bf398f2db0f6477ef689d0dd6a2aaa81e.md | 132 + ...7b64045af2c3ff02183fb1ccc036327cee5e971.md | 36 + ...7fac7868f0d237efbfcc625d8c265aeebca3e7d.md | 34 + ...81f1fd08e472af1516e6c6b0c936a2dca55cc20.md | 5 + ...85352e9588726771a8cd594a268eca7d04379bd.md | 26 + ...88edbb9a31f8b7c70fb3ba48136d9c3cd6767ac.md | 160 + ...8b776685a4c1ffcdc8f90c57c3ad7243a43b2b3.md | 20 + ...933c12c1df97e13cba40bcd54e4f4b8133da10c.md | 739 ++ ...990e009903e315fa6752e7e82c2634af4a425b9.md | 7 + ...9e9556ca0c7b258d910bb31222a78beabb46a48.md | 99 + ...a3e8b5797ee8a3fd8aa34ea9a1eeb6d81b6a779.md | 142 + ...a4cb9cd97ffb8c956b4f5d28d2759c0ed832bb5.md | 35 + ...aef856f725cd9a9605000f3ae98cbe61a9f50f0.md | 17 + ...ba93b500af79fe9bc96ff2ffc71078766532a86.md | 91 + ...bb83f528ac02840efe18510ed95979d2cda5641.md | 314 + ...c03e18490e47db0efbd6a00bda7ddb85b0a14d7.md | 85 + ...c10ac085ba8a12ba0d8af2dc66adfbe759b3183.md | 7 + ...c154ae6f7fe894644424bfa90c6ca31e13a4b71.md | 24 + ...c284ab3dc23241975f76e0519b531407042aef1.md | 88 + ...c433541f7f0c2dc7620ff10cf44884f96ef7aa5.md | 80 + ...c7fcf477e212945eab7bb85c2279f37d62d4b49.md | 42 + ...d7afe85422b1db8eaed166840d275dddb63cafa.md | 117 + ...db1038f1d71a450556d13ae34a416e46d7213fe.md | 42 + ...e838ea978f9a0b0265a8d2b35ff2f64d00a1738.md | 9 + ...ec0eb0502def7b7adb112f8d7d4c38e1f6d9170.md | 39 + ...ed64f79ebfdd957deebec6261b3a70a248f3d35.md | 16 + ...ed66538a3e4854d56210ab1d6ac49016f1e40a2.md | 97 + ...ee6714a8cf20e18ea398651b41e0278071ee42b.md | 49 + ...ef0f3c3dc121f5c389e547bd20f2aa807074028.md | 73 + ...fae4449ceb6f88aa4545f33bd886ec3080171b4.md | 13 + ...fd36f1bf92225311b684d6aa0d05a597f00d707.md | 19 + ...ffb546fc8c21e2c0e9bb87b259bd34b91d4f0dd.md | 27 + ...003581774d3028ef53e61a002c20a6d36ba8e00.md | 998 ++ ...05134c8c952a7585b82a042b14bcf1234af9329.md | 25 + ...0b03ce62e6dc8ac7598a8b8316c4bf8cea132d5.md | 62 + ...0db4483c93a5d14dbf8076c4dd42d22a4f8542d.md | 64 + ...0ef147dbc0554f53b331e7b6d5715d0269ffba8.md | 14 + ...127eff442d2c1d1a1ea01b23e8135b502ef2e79.md | 27 + ...140f179614d126e483732933a5ca8dcf0a32876.md | 16 + ...161a94239c1dc6696dbb583ec46bc64f3aa8906.md | 36 + ...1b21b1232720492424bb07cd73c93df2b9cd229.md | 42 + ...1cdb96ad5a56206f662bb3025b93f6d5820242b.md | 55 + ...24c445f7ab9052a92e411b826c60dee2df78448.md | 41 + ...290d0c61b4a664e303de559bbc559015fd375f9.md | 25 + ...2d3c76d5eabbbf72a0314f29374527c8339591a.md | 24 + ...30cf59adffcbe4164483b5a63260724a1dfc7ca.md | 33 + ...31a520a8c2c1b9c7f80b14ebcd096bb1121d53d.md | 73 + ...37bd72c28f0dac8d9478eceaba4f077abcde0c9.md | 23 + ...3ba8ccb1e55bb6535944cb5acdb19efaeb1c3f9.md | 5 + ...3c0ad81bbf56463510440f7f81eb146a6c0015c.md | 86 + ...3dd7962cb3aa07c8c469ede0c7852993ac3f290.md | 25 + ...43870b5b6ce4d191950fdaae6aafc36f05360c9.md | 84 + ...495f5206c908fb1a31f18a8ab3ce9465164564c.md | 57 + ...4a482326d45dc729eb8d1a6735cefacd7ae5578.md | 156 + ...4f623d5a7c8913e227e962bd1f347b36aab7b51.md | 51 + ...5086d0b6258fef503cb3219f427ffbff73135e1.md | 38 + ...585df82f7a94309af9fb51196f188b4fa212118.md | 7 + ...5a6d2ae83a7989e17704e69f0a640368c676594.md | 22 + ...5af4bcc2d0168d2698beb2a858c24f81a476610.md | 6 + ...64414c7f435b4b5e5a681a5f561c07780037836.md | 113 + ...650943069620aa0bd7652df1abdce2c076de464.md | 7 + ...6670b3b49f00e4ee1f44e8b1c09e24afedd2529.md | 46 + ...67e458a29cf154c33221a8889789241725fe5c7.md | 15 + ...6cc81e55c6aad12849a56837f14538576f5a42c.md | 17 + ...7b2dd759b6fc618d53ad49053c24ef8d35105c5.md | 29 + ...7d94e6cd13f36eb9b1fe7653c436dc5745250b1.md | 9 + ...7d95a9fcca49861b0d4b7dce677d4e6eff1f7c1.md | 12 + ...7e8527824e15b4194a3fd12ceee049f910016db.md | 108 + ...8026e82645eb65bd5e2741bc4df0e63da748b47.md | 17 + ...837935a2fefed20e2cac93656e376f9868cc515.md | 13 + ...837e34ed0ad4739783010d9ffd3684c37fd465c.md | 67 + ...839cd35991df790f17239c9c63bfcae701f3d65.md | 148 + ...870af12bc30438b0dab4ff5365b5279f2f9a93a.md | 189 + ...8e12f246225210b8c984d447b3e15867d2e8869.md | 13 + ...8ebee6125bee635dd8af7bf2f6340d58ce99958.md | 145 + ...908a5f1d788e2597335215a464817436a3d3ed1.md | 112 + ...964efda57733a3b39890b30ff22bd5c47eed893.md | 74 + ...965be0f67b8b3c26be38939a33fa8ab74aea4cc.md | 27 + ...975b9964d088181cf34a1341083bc82053812d8.md | 40 + ...976e639bde8a2b880e46d94f4c832b6ed9a9303.md | 20 + ...a15a8a5795baec1d8933a768407294110203e03.md | 101 + ...a4acdc5db590992630c704d00defb142f2f0489.md | 93 + ...ae139f839dab4c6eb794d689dacceff869c718f.md | 93 + ...b7f7b9a220c66f7e3407ca9553d974cd4a14402.md | 46 + ...b9d913b400e9f00e6aa6eff7a7c8a84f5762dc9.md | 104 + ...bc3c5f81d060cd996489b772abac886f12130a3.md | 49 + ...bd84cb5a6901ddaf7412396f4c6cc190e1b7328.md | 28 + ...c8006009802ae14770be53062787d8a392b0070.md | 12 + ...c8dbf139a485e98914cbb73b8ba684b283ae983.md | 124 + ...cbdbfd3e4bebefe552fad012509948faba34b44.md | 22 + ...d0ba49bf07fcc9caf384a50b3012f98e4f1d81e.md | 113 + ...d32e17ff88251cdfc3fa01a1ad8eebda98eda06.md | 38 + ...d3b0e405075464c05c52e5bb0c414a870b06334.md | 36 + ...d45693344e2b3cc3bdb7d1aa209ad9fbacb5309.md | 19 + ...d48879c34d316981b4f67c2b82c8179e0042f74.md | 30 + ...d903f9a58632df14be5c98eeda32e1fc2f46f4b.md | 9 + ...d94481e337829121072f5e46cc39b6290e43b44.md | 26 + ...e207218ce0d1148aa57d10ed8848cd7e6ffd87e.md | 487 + ...e2254205e6dd1ee2a4ec62036ab86bc5e084f5d.md | 35 + ...e88457ca86ffe3be30873156a7a0a4fd12975af.md | 9 + ...e9ff9f5cc449798c00d008182f55bdaa91e546c.md | 16 + ...ecb1c7b603627e1cf1386ad0ebdfe57fa485f93.md | 95 + ...f69e780bd8feceaf7a0add24c159679f7359f81.md | 65 + ...f6c435adbd62de03c06ce4f90343d3cd04f9e8f.md | 11 + .../corpora/watsonxdocsqa-v1/questions.jsonl | 75 + .../cloudflare-state-fixed-v1/chunks.jsonl | 522 ++ .../cloudflare-state-fixed-v1/embeddings.npz | Bin 0 -> 835724 bytes .../cloudflare-state-fixed-v1/manifest.json | 221 + .../chunks.jsonl | 537 ++ .../embeddings.npz | Bin 0 -> 859724 bytes .../manifest.json | 221 + .../cloudflare-do-coordinator-v1.json | 813 ++ .../cloudflare-kv-r2-choice-v1.json | 813 ++ .../cloudflare-queues-retries-v1.json | 799 ++ .../cloudflare-workflows-resume-v1.json | 813 ++ .../manifest.json | 34 + assets/seed/v2/seed-manifest.json | 4849 ++++++++++ docker-entrypoint.sh | 6 +- docs/phases/README.md | 1 + docs/phases/phase-3.4-content-manifest.md | 75 + .../phases/phase-3.4-interactive-retrieval.md | 339 + .../phase-3.4-manual-preview-checklist.md | 233 + docs/phases/phase-3.4-taskboard.md | 31 + docs/roadmap.md | 21 + learning_materials/.vitepress/config.ts | 3 + .../.vitepress/theme/custom.css | 6 +- learning_materials/en/evaluating-retrieval.md | 36 + learning_materials/en/learning-roadmap.md | 16 +- learning_materials/en/reranking.md | 103 + learning_materials/en/retrieval-mechanics.md | 85 +- learning_materials/package-lock.json | 4 +- learning_materials/package.json | 2 +- learning_materials/public/favicon.svg | 5 + learning_materials/zh/evaluating-retrieval.md | 30 + learning_materials/zh/learning-roadmap.md | 16 +- learning_materials/zh/reranking.md | 88 + learning_materials/zh/retrieval-mechanics.md | 68 +- pyproject.toml | 2 +- scripts/build_cloudflare_seed_indexes.py | 5 +- tests/test_browser_eval.py | 325 + tests/test_embeddings.py | 22 +- tests/test_image_contract.py | 45 + tests/test_jobs.py | 100 + tests/test_lab_trace.py | 28 + tests/test_qdrant_backend.py | 218 +- tests/test_reranker.py | 83 + tests/test_retrieval_explanations.py | 138 + tests/test_seed_assets.py | 46 +- tests/test_web_api.py | 577 ++ tiny_rag_lab/bm25.py | 104 +- tiny_rag_lab/browser_eval.py | 271 + tiny_rag_lab/embeddings.py | 21 +- tiny_rag_lab/hybrid.py | 61 +- tiny_rag_lab/index_writer.py | 5 + tiny_rag_lab/jobs.py | 237 + tiny_rag_lab/lab_trace.py | 12 +- tiny_rag_lab/qdrant_backend.py | 379 +- tiny_rag_lab/reranker.py | 115 +- tiny_rag_lab/retrieval.py | 63 + tiny_rag_lab/seed_assets.py | 33 +- tiny_rag_lab/web_api.py | 764 +- uv.lock | 2 +- web/index.html | 1 + web/package-lock.json | 4 +- web/package.json | 2 +- web/public/favicon.svg | 5 + web/src/components/BuildInspectView.tsx | 2 + web/src/components/ExploreView.tsx | 23 +- web/src/components/RetrievalView.tsx | 375 + web/src/components/SettingsView.tsx | 12 +- web/src/copy.ts | 54 +- web/src/main.test.tsx | 321 +- web/src/main.tsx | 80 +- web/src/styles.css | 101 +- web/src/types.ts | 13 +- website/index.html | 34 +- website/js/i18n.js | 44 +- 1263 files changed, 101773 insertions(+), 270 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/corpus.json create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/evaluation-manifest.json create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/api/state.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/platform/storage-options.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/kv/concepts/kv-namespaces.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/kv/index.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/queues/get-started.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/queues/index.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/queues/reference/delivery-guarantees.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/r2/buckets/create-buckets.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/r2/how-r2-works.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/r2/index.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/r2/reference/consistency.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/r2/reference/durability.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/workers/get-started/guide.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/workers/index.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/R2.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/durable-objects.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/kv.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/queues.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/files/workflows/index.md create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/retrieval-questions.jsonl create mode 100644 assets/seed/v2/corpora/cloudflare-state-v1/source-manifest.json create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/corpus.json create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/dataset-manifest.json create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/00205c92c52fa28db619ee1f9c8d76fe8564db88.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0093065541aa4c3e90e47e3ace89596155ea1735.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0108f00736882ac35e3c56cd3ce0d91bcb5798a8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/015755c65c274f262396747d3f32a59ae74c08d7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/01800e00bdfb7cfe0e751fa6c616160c48e6ed21.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/01c8222216b795904018497993cc5e44d51a3b35.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/02244f39be9a15fa55c94c9f2775606247969a61.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/02326495f914d005bde7360f0826e8c140816613.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0294ab8c0fbc393f5c227a0f8bebccdc67b78b1d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/02c5718919d676e7ea14d16ac226407cc675c95e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/02d819d225558542a49ab6e43f94fe062a509ea5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0301d6611a36e44c345083f6e2c3bde58de59982.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0310b7fb9072e7f7e5d73f5af90ede62faa81286.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/033e2b1cd9e006383c2d2c045b8834bfbbab0f09.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/033f114bff6d5479c2b4be7c1542a4c778aba53e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/035430afac1e73483636073c5bf48bcf8b4f5e1d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/035ef4a1d7c465e8a72acc1c5c98198b4e95068b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/03a70c271775c3b15541b86e53e467844ef87296.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/03c28b0a536906ca3597b4d382759bd791d0cfec.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/03da4d2d23a65c146ba5afd8f7175908f868f3eb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/03ff997603b065d2df1fbb49934ca8c348765acf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/049829eea8eecd997e6ca05584cde2d9bae92218.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/049dc7fc73042985f3258ef2cf3bb05114f7f175.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/04b717fd06c5d906268e8530f4b521686065c6d5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/05275f4ec521878b13ad7dce825e167b2fc7ef93.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/055727fba02274a87d30da162e6f5eca3ace233d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0563fc6874b43fa0bca09ae54805fe98bfa33042.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/056e37762231e9e32f0f443987c32acf7bf1aed4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/05d687fc92fd17804374e20e7f330edae142f725.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/05f38627c9ec286ca7c379a31aa27392a65411ab.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/063d5e4c6e2094f964752d376b5ff49ffd47433b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0721692d3f363b864a241fc4644d7d57b2dff881.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/074c9baeb0177e3cf57bac36e5fcbd13063498a1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/077afc6b667f6747ff066182e2f04af486c13368.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/07a75b90684d731c6b33fc552585d391e86a2a35.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/082349f7c1e486d18bca3bb7569d4de25a8e81a7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/093bffcb43c46f1068a59a6b6338c955bf20aabf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/09897dcf1128d66144d2b165564c228c16cd5ec5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0999f59bb8e2e2ab7722d57cdbc051a0984abe45.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/09bb38fb6df4c562a478d6d3dc54d22823f922fb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0a507ff5262bad7a3fb3f3c478388cff78949941.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0a5c26b7b5b7c1e3afd8901d8b91f2e3c527da3e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0a6d8500dac43a18ec5dd8fcc3d31c2a31546554.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b14841af65a8855e9d497ef05270b54b245daf8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b35e778b109957ee1cc48fa8e46ed7a1633e380.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b4e34a88c9328ec6e0cc8a690b466f441e5efc6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b54763a8146178f9f4809da458e4ddbd9e28b39.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b5c4d75ea0a1cd2ade09184ee2b159e23033cae.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0bd226c12cb659bf7711fe30c594e548525dbbd2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0c836867dd758509b908532f35cfc5e160d81a19.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0cb42f245df436af2bccb54b612786ca493b917b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0e5c87704e816097ff9e649620a1818798b5db3f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0e6365d1dd3ec522c4da68b662f05a0120617593.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0e7ff3238a69fa701a2067672493ccb1b9698cc1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0ea3470872bf545059b23b040ab1eb393630a29d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0eceac44da213d067b5b5ea66694e6283457a441.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0efc1aa12637c84918cef9fa5de5da424822330c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0f13adfc739d217925ddcebb152284565bd43de8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0f58073f0d5b237c3241126e98851a9e0c912792.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0f686bf5943844896a5385e01d440548081d2688.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0faf8791603eb1a93adc49ea8f9e5859d1e3360f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/102d3d188e3edc4a4aa55f731966ebb22c827822.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1093c3d02f71f4fba221375302d20bc761e70aef.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/114ebf33612531c5020fd739010049e5126e0e5b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/116575c57d15c410ac921aebfaf607e2f86e6c05.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/11a093cb8f1d24ea066663b3991084a84fc32bf2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/120cae8361ae4e0b6fe4d6f0d32eee9517f11190.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/123987d173c0db88d8e1f59af46a8d9313a8e601.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1243d4c8499cc9be45cd9c1f6eb34254f1b9b4d7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/134eb5d79038b55a3a6ac019016a21ec2b6a1917.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/135ad82faaa11fd4fec7ce7a31516e98ee3d0ea5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1399cd9c09634e30c0f099c0fae66a756153dab1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/13a1ff3338f4ac1eb2cf3ff6781283b49ac8b5a6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/13d83af5ccd616f312472fbab4ac7d7a56d0f41d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/13f7c9c7b52ec7152f2b3d81b6eb42db0319a6f4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/14005f26f286b03f8ac692d42e9f3dfce1f66962.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/14416203d840c788359110b18cfd9ce922de0d67.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1453d1cad565842eea24c8d92963bd73338ef0f1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1483016be71021f31b8193239d319f34d8e01c9c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/14a06de43e6b08188a7672b5be8068a572de5b7c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/14f850b810e969ce2646d5641300fb407a6c49c5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/156f8a58809d3a4d8f80d02481e5adde513edeaa.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/15a014c514b00ff78c689585f393e21bae922db2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/15d57c8193b99b8525bc2999ef82ef1cd7eae8ad.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/16048584b029b9be5da50d7f9d9ae85ffe740718.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/163eeb3dbaff3b01d831f717eeb7487642c93080.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/167d5677958594ba275e34b8748f7e8091782560.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/17470065afc59337b207721ab539b4622bbb3055.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/174d6fdf73627d7b2258d7f351c3d0156c06d1dc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/179bdefa68b788a2c197f0094c43979d9265ba77.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/17ac1becae0867381bc236d4c0cc8fc4b8921a0a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/17e39c164e92d0646c4dddadfdf178bf3b5e2ad0.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/185c42ab06de9ff515dcd03213f5c4608c6faebf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/189f970cf3b162e67b98b2a928b36193169e3caf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/18a7a354c4b46e26df8304755c8be954bb922b04.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/18c44d2a29b576f708bc515cede91227b6b4fc4e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1924ae74643c2d9d416204693c9bb84d5212e3b0.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/198246e6e7f694d36936989d23b2255b15c2a92b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/19ae3adcf2da2ffe5186553229fef07cb2b55043.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/19ba0bfc40b6212b42f38487f1533bb65647850e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1a548d934dfe57dd0f12195461f2ddb348eae68c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1a5f15e64aabdca9e2785588e76f3ebe22a1c426.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1acf5ed461253f09db844c2d84c1ae21277bc1e6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1b0ab9084c7dd9546bdc2f376b58e32c0ecfee85.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1b83fe669cb3776d00a1a78e4764f115dfd5a40a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1bb1684259f93d91580690d898140d98f12611ed.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1bc1fe73146c70fa2a76241470314a4732efd918.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1bd28f052373c2e70130c7539d399d76f9d2aafe.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1bed610a414085e625bd32aae5ffac81b41f97e0.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1c19733ed0d3400baf6ff05317475a6518b5ba1a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1c20bd9f24d670dd18b6bc28e020fbb23c742682.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1c42359bdf665ebca2bae4b9b3d5108f8097bf34.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1c863b2624ab2712318442337c917143c19e7ddd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d1659b46a454170a597b0450fd99c16eec5b1ad.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d1783967cbf46a0b75539badbaa1d601bc9f412.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d21c3dd339c26916f6df1ef3124c9d2d39c9acc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d393a73ebc623578dd6da2c09c20e97fae074d4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d46d1240377aea562f14a560cb9f24df33edf88.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d5d80dff65ee4195713eeeb43f1291b79779a6b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1dd1ed59e93da4f6576e7eb1e420213ab34dd1dd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1e28b88cde98715bcd89dcf48a459002fcda1e0e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1ec0aabfa78901776901cb2c57aff822855b6b5e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1f14865c04b28b02ee0760d7099554a916e26926.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1f781da5779dafefbb53038f71a18bbe2649117b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1fefe3c6f1a20841fa1ae6afaa85cc7ff36778ac.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/204f36069ee071b185a1bce8370946a50bddcdd5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/20cfe34d5494ab0ae2ef8b6f65396edbf667f688.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/20d6b2732be17c12226f186559fbea647799f3b8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/21db0146b79b8256259507c62876e01ada143bd6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2200315ea9da921edff8a3322417bb211f15b4eb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/220e465dbc0c22ff06f80df18b25044dd1ebc787.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/221f46d0a3c2c3d3a623be815b45e8b90af61340.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2245768521f36e6f2df594e1bf3111dd63cc824a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/225192bb81696d14887cc55070a6dfa14b3315f7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/22a8f7539d1374784e9bf247b1370c430910f43d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/22b8136f68ac74838b9c2b9eaf3996ccfaa14921.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/22d15f386dc333bc069eea8671e895c97956e754.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/23060b35041c9abd00099b1e0b1d83daff453c6d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/23080e48c7b666c07e92a6e4f4bb256d77be49b4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/23296aad76933152d5d3e9dd875ebbd3fb7575ea.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2339deef952ecf06246f2a5daed6925e00f52d64.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2353ffc21b5b117f70eeec0e71c9d6fb2f6dc022.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2372aeeeb4da6a3e94273cb46224ed09cd84cd9e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2413c64687e434b4b2095163a5106c0c62aa3f59.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/24d2987869b1c8c34efa1204903a7a8f3e35d459.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/256ed6ca079a147359a51199dc333b23c2708b42.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2581dd8f04f917ba91f1201137ae0efea1f82e26.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/259e5a974f6170cbfdf7b0014cc1a0a0111423de.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/262c45d286c9b8a7edba8635e636824f2b043d73.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/265714702b012f1010ce06d97ec16623360f4e2b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/26fb8b86499454efd078384d70b02917d1c7dae1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/270242015183da2517df613fd951623042268bee.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27091a60ba512e180c699261ecffdc3a621418a5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2746f2e53d41f5810d92d843af8c0ab2b36a0d47.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2756dead36ac092838f80acffe6ecee13a22a376.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2757f7f9b9e4975b9e53da5b4508ff9d7a41a0a4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2779271745a02f4de48bd92ab93a7a4be4a73d38.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/277c8cb678caf766466ede03c506eb0a822fd400.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27963df2327fbe202b836ac5905258d063a8770d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27a861059a73e83bc02c633ee194dac6f8ace374.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27db2218237b89f557d3702f4270288e4460e9cb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27e7ad16129a9dc8ac8ce2ee79c9b584d441f0de.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27fcab0041feb8b819e329a319b12d2f4167318a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/28243d1c0b8bcf04fe3556990d40d1a31f4cb58d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2828fd5943abba08aa260f1080b850c90fc4efbe.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/28c4d682b46e9723f538988bb2bdb1eb65618e5e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/28f15ac17715506bb29327874de7f76cb9fb2908.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2904e26946523bb3e78975f68a822f5f2a32b9f5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2910b7c4cd65f8e4add1607791dd22bed468b61d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/292c0e87b8e56b15991c954508ab125a8fb80972.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/292d19849e8fbe48869f5e3a50439964563a90d1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2939716bfa6089c8b6373ed7c6397af71389a5c8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/299cee894dff422aac8bf49b53cac700de1b172d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/29a9834843b2d6e7417c09a5385b83bcb13d814c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/29af55b95d387be39d4e9d328936b95cad5beb67.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/29dcfc3fb6ee0ccba63e0ff3a797936da9e0c874.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/29deec30687f805460a83dd924d2f119274d25f8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2a3f647a7f4eb8fb4270d4e78245f18bfde29ad8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2a95f85cd3f7250fcba52d8fdd82d1502fc617d6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2aec614e6cbe5d4963d53dec7e22877d5a1bede8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b2899a3878e20a4b73b0f11cfc4fd815a81e13f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b4d4ca6a91c05d12f5c7942e73abae74bf08472.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b5427922d2d03f0fddfe73bbde7e8b8dcda6a60.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b67d1eb41065cf9da0eb68d429b69803d49eaa1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b6dc49f4afde44dd385ae09caab02a3f1db4259.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2baf01b064f3005647a010df369cc49c6534ffb3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2bb452b4c9e3458bc02a9d392961e9c643e402de.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2bcbd3d61cc24296ea38b26b10306b7f50ce4988.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2bcc4276ea71978ffa874621715be92a9667390f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2bd7112457a8b916f3b4701580570c85ae1b520e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c0ebf0ccb497f41c14a5895ef97c01864bfc3d2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c17e0a9e72fe65317838e81acf1fa77620e0c6c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c1e91540bd58780f781f8a06e2b5c62035ca84b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c669e0145dac26a7517d9402874bac048e46e82.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c6b0f77c4ca0cafb52e1fe3e10800d56015cadf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c991135b30b24a268fc9d847e3f43522543a96b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c9d0d0309e01ff2ee0d298a16011857de068038.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d08edd168fbee078290f386f7ec3eb1998adf02.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d3a398b8394671d9383f214ff5e69a00391bb22.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d3f7f5efb161e0d88ae69c4710d70aa99db0bde.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d5b33f1352d8ba7cef029d1979ccf0d44aad63e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d81fcd3e78a5cc7b435198a59522ae6bf8640ed.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d9ace87f4859bf7ef8cdf4ebbf8307c51034471.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2e1f6d5703ce75af284903c20e5dbdfa1ae706b4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2e2a2be1cb20ef0c663e591532d71cfb5637e57f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2ec85cf6ab5e5a276da78f1129ad3f1f5c92f5bb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2ed4d7860687b2ef6f85ff81b6af4cfd2c6ea839.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2ee7bf839ffa16ec1a7f9ed82662efe539fd29c2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2ef8007555bc60cd700ba44ecc0fafaa024f4bc0.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2f88cc7897776ead3f1a7052a740701b8e1a6969.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3094e343d06da6ae0d0d5d4865c7b0d806dc61a1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/30a8256a4972314da32827a081b7541138b454a9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/312e91752782553d39c335d0daaf189025739bb4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/315971ae6c6a4eede13e9e1449b2a36f548b928f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/316974f0a70ee2199bf6cd912e62bfb53d200f0a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/31a670d6b3f0d7ab4ead7dae3795589f161249de.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/32217f5f0dee4a95c64b2bd92c25366706cc7e0c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/322e404e76067637f1d0afdf44cbe309c2a53221.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/323360f59c9e5c3d6be4b7cd36927c23c0dfa268.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/323d19f0757433758d1743b0a62dacc98d286ec5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3259e737315294c6380ed46645ab8d073a5ed861.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/32a79d23c94fb1920db500d2dd9464c1316c62a5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/32afafa1c90d43ba1d3330a64491039f63d9feb5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3334dccdb9872c1e7f698751b138aa5af6cc8335.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/337cc5401082dfd6c8c79d49cd97f7bc197c7303.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/338f12b976b522389f5fabe438280565490fb280.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/33923fe20855d3ea3850294c0fb447ec3f1b7bdf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/339c9129c24aab66eeaf55a9f003f6501f72b81b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/339f2ebdad7cd0a3445bdf69c69ab7b28b4353c4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/33fe18d89140517ab2a75d6fc64a4a3db962b88b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3426fb738655136d42fa32bd6cfbfd979a3d5574.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/342ad3abfeeca87987ed595047cc869e15f148bf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3491f666270894ee4be071fd4a8551df94cb9889.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/34974dee293ba190cfa1b3383eb2417d0fd4b601.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/34bc2f43f99778ffa7e2c3e414c3cfb32509276d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/34ffe04319ce15e4451729b183c35f288a58a1b7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3508f0dda4ccbdbb07bd583218f4e4260dc01c0d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/355ea8bd00a0246eacfef090af6a6b6f2bd92d4f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/356dd425ad5be4ee255f2f95f7860b6fdfe3bcc0.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/35a87caedb1f1b6739159b9c7a31cce7c8978431.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/35f4c4a97cf58fa0642d88e501314f3d75ff9e01.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3602c22051ea1148b07446605dd3c57bf7830c3a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/36c8af3bbafff1c227cf611d7327afa8e378d6ec.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/36d7217bc75c917100ae7df27dc14fdb919d1609.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3721517369cf4ea8476bcbb39040542ba2a212d8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/378f6a8306234029de1642cbff8e44ed6848bf74.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/37d9428bd2e4a45ca968dad59d1005fb5fc4de9c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/37dc9376a7fb6eb772d242b85909a023c43c2417.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/381d767decd07ef388611fd22c3f08fb89ba73ec.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/384eb2033ad74ea7044afc8bf1ddb06ff392cb08.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/385dec32600a9ded58fede3e98568fed789a400a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3873a285dcb38ef4b4ed663bfa0df4047ab7692d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3874aaf67ef04bb4d623fff07e1cdb4c25b3b33e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/38d24508b131beb6138652c2fd1e0380a001bb54.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/38dbe0e16434502696281563802b76f3e38b25d2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/38fb0908b90954d96ceff54ba975de832286a0a7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/391dbd504569f02ccc48b181e3b953198c8f3c8a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/398a23291331968098b47496d504743991855a61.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/39ad64c9004e83507a968c5c0b1c8ef952b3eace.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3a81b302ee01fdc0ac111cff3abfdb96e3a0cdd6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3a9dc582441c2474e183da0e7dac20fb182842c2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3acf4aabd6be9c3bc0e0a363c3bfffdd4a37b442.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3af15cb9e302a9e0d7de22de648ef7b3dca1d865.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3b2719c3b56d1bd40fa0d8c6853ddd078fd13d94.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3b763ffd1393292f4c3ca9d236440065b6660e8e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3ba46a09cf64ce6120be65c44614995b50b67da1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3bb91ebacc556700f955c3e6e01d90e5256207cf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3beb81a5a5953cd570fa673b2496f8af98725438.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3c1d83e94ddc08d7a6229aedc49c895e86e660bf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3c307031346d4fd7dd1a66e2a2f919713582b075.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3ca99c6ef4745121c9865ab4119f3ab1b1a3bdb1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3cf77633a489e42b01086588d6613d65bfd51f7f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3d1b3c707202f30f8995025f356f82abbe685b93.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3d999c84c01328a45ebf0ecad358d858c634df5b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3d9fb046d583a2d0177ecb4da25eeaeb4febcca9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3dc76ac891e282badf1d7845b2b8a9b3a26de3d2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3df4040f4f2e5704ef44e6742585ee853a2f2a37.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3e0860fd12fa0bb5be75c68fbd34d69a631f2324.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3e24051d290e000441a4fdb326d73bb81505bd05.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3e791f66ad3d5fd3da45d85f27d6a1a7621a4cd3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3eaafddade769d3b0300be1401bb3d7e68b312dd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3f0b3a581945a1c7fe243340843cc4671a4e32c6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3f3162bcd9976ed764717aa7004d9a755648b465.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3f5d0fd7e429fedbfc62dfc9bab41b3cc5fb4e4f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/400e9e780d8a149530df21e38b256b71bda12d83.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4058d0b5222f1c34abf1737a10da705e27480606.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/408fdab4f452ab2c207ee3416332d315598e3456.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/40d279ada16512e67b7fb78fdac4ada9cfe5c645.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/40defbe604b3629caf8855a6d00ec14a0a6c92f3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/41167e3ad363b416d508b03a300e5acfaf83f042.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/41ad83283a66cc3c467f70ea638b9c1c6681a160.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/420946ca7e893cc5a2b3d1a8f47a7a2c7059d7f6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/422554c1dcebabc93cb859b4a896908da48a540d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4292721e4524ac59fa259576d39665946db8849d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/42ae491240ef740e6a8c5cf32b817e606f554e49.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/42e228e8218a4fdef9f2ca0db53b5b594a475b88.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/42f34465dd884e8110bb08a708a138532999714f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/43071778b4e33375953afb1ab743b342d3cc906a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/433775834ea8ae82cbfa6077fc361c3c52a99e42.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/43785386700cf73e37a8f76adc4ef9fb01ee0aeb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/438b5abac4d30492c2f192ea551e9514df877831.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4451c208e0350c4c480f50929bd6735588b6f2bc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/445b99372919de6b2c3e6a7e2c3f4caab0bf174c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/448502b5d06cd5bcaa58f569aa43aa2e0394a794.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/44ba508199b214448cb22b7658127e16dd4e7abf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/450caaacd51abdedab940cafb4bc47ebfbcbba67.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/451244d4e0cd8a3e96cd15ffaf0f3bda526cced2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4517071b8cdd91311a13decdd9d0a7fd761aa616.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4562c632e1cfaaedde1374b29bdd1a1cce5ece86.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/456a228a64c2ad85e66f1fe0de558b4a426b197c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/45a1c384d8d6a730d73357e2bb3216edbd2f7ff2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/461d1a8f855174f44550531ef8be6e67c29d3e3b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/462a5ba596aadf9c38762611ca2578398f234bd4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/46915afe957ca00c5b825c5f2bdc618bfea43de8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/46b746b11cf60709bcea7f7c2c0aa1ec0ada5bc9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/47b819e4861856fab3c5627661edd8e59fbed8a2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/47cc4851c049d805f02bd2058cd5c2ffa157981c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4800c7e7c443ec310d775747125585f4671534fc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/484af9baf43ac6bcfdfaf7b0d353ccdf119033df.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/48cca78ceb92570bce08f4e1a5677e8cd7936095.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/496c8703eba5c4c6bcd6d65ee60d3e768f1bf071.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/497007d0d0abac3202bbf912a15bfc389066ebda.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/49724d4b7690d4b215fe6f1c0a49c8b347f0c9a1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/499553788712e55abe1345c61ccdb15d1ce04e83.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4a7f60f563f15cc32060c5f17cb44699a221ad5e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4b16740c786c0846194987998dad887250be95bf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4b48ef3d089f3142b1ed604a32873217f89e052f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4b74e9409284f77897db58b77271337a4493a410.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4b8ebfdf4ea9e571d53720fe09a2ce610aecbcb9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4bfeb479bcb6bbd28dd18ec423fdc5fb9c39b4b6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4c6242d9f2b3e125780fdf188f994270a6e2340d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4c83f9c21ca1e70077c8004bd26fe5fb0fc947eb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4ca6000dc674cb2486d905f8531fc19bc88f887a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4cd539b8153216f80b26729a35ad4cd04a9c27db.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4d299efff5b982097a5b9d48ea16041e4820a8bb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4d8b25691c26b2ba05f7e8a96b99fd3f15a124c6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4dd17198b8e7413469c1837ffdbaf109b307078c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4deafac111cf37f37a2f20cff35606827d940390.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4e571695fb4e12489157704d87f89df5dad1a580.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4e83416b551f557d5bda600450e6ccb7742eb51d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4ef4409d11dd4d5360d711eea8e1e71dac4c0bd7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4f0098ce544ba8ac594f98af8df26b7911399750.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4f733928b0f749ffddf2e6daef646a0524c54d67.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4f89e6b2b76e64b9618f799611dd1b053d045222.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5042fbfb0c15aeded02ff805c4869ac838910c7a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5062008d59b761c5cf7f32f131021ea81a03b048.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/50636405c61e0af7d2ee0ee31256c4cd0f6c5ded.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/510bb82156702471c527d6ef7e51fe69ef746004.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/51389b2d808c1f7d81df9ec75f053528ae1bc128.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/51426dcf985b97af6172727afcf353a481591560.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/51747f17f413f1f34cfd73d170de392d874d03dd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/52507fe59c92ef1667e463b2c5d709c139673f4d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5287ef2a9e06aaec6a8fe651feba2d46d2f07502.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/53019dd52edb5790460dff9a02363856b83cafb7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/536ef493ab96990de8e237edb8a97db989ef15c8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/538ecae0b5aa21e499f39c2637764a05bff7b6b6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/53ee442d78abe20aaa100dda3ff139e566842c2e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/54029dd42bae3a23d68d928ac3b6c04d0c735dec.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/542f90ca456dccc3d79dbf6dc9e8a6755b3ba69e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5466d9a71e87bb01000dc957683e9cd3c10ad8bc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/54ee0bb6fbd2e35c46c41d0065c299408f5ab0a5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/56dc9cabda3980a4d5d41aa5b3e5612e727b289a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/56ea4620b049a9e291bf198e71d0c58c2018686d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/570af2aaf268a3df1d959d54a5be1790dc43ead5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/577964b0c132f5ea793054c3ff67417dda6511d3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5788d38721aeae446cfad7d9288b6bab33fa1ef9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/57ab3726fa10435d26878c626f61988f7305b9e8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/57d441ef305442bcdbbe48b980b87d47b825fff9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/57ed2f2e8eaa8dab5b26c3759fd1bd102d03b975.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/581f43aa02d6c6861d2fdf220617cf3fbb903ae5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5890d52d3dde4c249ad06c5a4dfe25542723f1c1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/589d9b0a7150af5485e6f7452eb39d15addb35f9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/58b70fac914f72c4ae9116de6e26880e1cedcff4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/58c6d0a1c6dad01e3f0f1748dc472c3ddcc07e43.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/595bb1738027c777c1eb5a69631587923690abc4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/59cdbabc75e7ec8987a3c464f3277923f444a724.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/59df73d502b5f62e3837464e81ac6bc9fdf07014.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5a328cf6319859f041c48974e44046bcfcea3b87.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5a6081124d93acd0a12843f64984257a02bb3871.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5a812008b8370853f0c151fde4dfeda4a39193cb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5a8aa187972ba8a711ac91447f668b233e580c8c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5ae2f0d8bd974c7393bc5ffa773b90fd0a2229b0.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b0b25c87c4c2d91e8376d2aff3726e4ca355f36.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b37710fe7bbd6efb842feb7b49b036302e18f81.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b3fb712903b0d1044610c93e6fcde6a41be1cf6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b66f4f408827fe62b0584882d7f25fb9c6ca839.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b85770138782723e09d9ed65f8655484d03be44.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5bc1631d896899d03e7d8dd2296c21656dd169ff.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5bc48ab9a35e2e8baea5204c4406835154e2b836.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5c2296329a2d24b1a22a3848731708d78949e74c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5c2f280e5c4326883f7b3623ef1b64fe4dde7c05.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5c597f82ec8484220a6fb3193dc78b878e8698f6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5c95f2d19465dda8969d0498d1b96d870bd02a1f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5cc48263b0c282ca1d65accb46d73d7ea3c8a665.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5cf2fe478862fcaa1745d5b0770ce6486b3b71f8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5d043091b2f2398611a819743fc83688d7658b22.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5d193c88d3e3235ea441bb82cceeaae20bb3efcc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5d1bca52e974c3f4de54366a242df751e73acbd2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5d9039607c167566ced9a4d7cc9f30f2b0c58554.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5dcc543a106ec708ff97817aa0cfdef8cb89894d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5e1ce04d915b9a758f234f859dffefab46484c97.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5e2a4b92c4f5f84b3dde2ead6827c7fa89eb0565.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5e4d2166bb8c2b95e515591e014e7ca00b87bca2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5ed78e19c7780c6856e1fa05d4b8a3f671fc878b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5edda143971ce5735307fede23fb0cd7e963264c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5ee63fcc911ba90930d413b58e1310efe0e24243.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5f0fc43f57ab9af130dea6a795e1e81a6aa95acc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5f398f2a5f6a2e75b9376b755c3ecf4b7f18b149.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5f584aeed890d6efb4c9faf133a26bd9f9e4f219.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5fe3de32efb5dea4094dca22cbc77e24d23ef67a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6008cee94719e6b3caabfba9bff1973b9125e02f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6049d5aa5de41309e6281534a464abd6898a758c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6068b2555e5014d386397335d0ed56b430082ff7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/606ef22cf35af0edc961776fb893b07a880f11d4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/60cc59b176b08462143ea591dac074060ad988c7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6153f9f311cd2bb2df31c6a4a1cb76d64e36bfe6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6199bbb097894542ea31c726d8ef4a3357eed1e2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/61e8df28e1a79b4bba03cda39f350be5e55dac7b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/61f714f5629ad260b0d9776fc53cda2eaa10df24.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/621083eb36cf3896b77d22edbcc23fd2716f6b4a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/622526f6c171ced140394f3dd707b612778b661e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/628354b3f2fa792b938756225315e3b4024dcc0e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/62bf74e391cfe1696e5218b3df0926b735a4788f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/631559e8401c52c3aac6d64e1f9da0f765fc4846.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6349e43ea9b4ac5775db122e0f6c365d5db810bf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/63c0dfb695860e1da7981d86959d998bebc2dd03.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6402316febfad11a582d9c567811003f4bee596a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/64057aa641f9259654e5f08d996209ef8027a3af.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6406a3bcb4e9210a9fb00af248f11f392af5c205.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/640f57e8262f846da7884e43f6f2f6c04cd15667.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/641b0015a5a634bfc40f10ae59873ca784232f14.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/648122bed05213950c23287cb4845fa56660232b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/649119a6ef3f5aa2b1b0c63e0973532d4c950f48.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6524dfdeabf32bae384acb9bb21637ade3b4ac4f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/653f494ee7f3d688fcaeb05aff303354d718eab5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/653ffedfac00f360750f776a3a60f6aad38ed954.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6576530ec5d705b8bf323f6c459c32a87ae3f9a4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/658967520625fac8039485004a1e80c32992077e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/65998cb8747b70477477179e023332fd410e72d6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/659e43ba12550aa1e885baec945b7b1b25fd18e2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/65ffb2e27eacd57bcadc6c1646eb280212d3b2c2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6601b619d597c89f715bc2fafd703452d64f21cd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6638b9f61f15821f7a92d9c30fc6c24c029b78dc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6644eaa4a383f7ed21c0ca1adae80a634867870a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6647035446fc3a28586ebabc619d10db5fe3f4fd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/665b81fcf30212ba535dedffc35e22901ed3e3b6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/66e7b1f986535fce165f0cb5c553a6305339204e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/67241853fc2471c6c0719f1b98e40625358b2e19.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/679f2f7a79672580b5fb797d9c5280b1a83806ef.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/67b99e436854f015a9db19c775639ba4bb4d5f9b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/67c56aac7da2232e4da2b8aedec41b9d8755e22a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/67fbc6967ed56285cc4eb1ff12d0e2e23b2f7bd5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/68061cdeda9e9e83180ca7513620b5988266cebf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6903d3dd91aaa7af3f53d389677d92632e24aef1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6922b4d2cb89eb1ef4aa112af8b7922327062b95.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/693bc91eaadeae664982aa88a372590a6758f294.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/69eaabe17802ed870302f2d2789b3b476dfdd11f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/69ed00abb6b920d1fe4f5b5675afda422f04e8d8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6a186d2c83108a0288bdfe3d4cea201ac0837503.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6a32659df809f04f9a670634129fc75cc9140729.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6ac4a29febf419002bdba62d99d997cf55e9fcf2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6ace7c519d2c4fca9fc0498bce82f75ffa05cffd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6b4213fc5352021865e77592ebc27242e746b5aa.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6b6d315ffd086296183de20086ee752a6a2b88c8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6b6f04aa6bbd6be14b11ea62aa0d844979bdfcdf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6b81f2288b810e3ffdd2de5ace4e13e3a90e1e10.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6bc478053fefd091742c6775dfac9eb5b8c4923f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6bff9c4db2bb43376a2a2cd681714ed3273e991e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6cb2797ab2ef876f05a39f4cee08eee4249716d8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6cd7b46e0c35165bfe21be4967b68481e9be840f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6d7b948346f167b5390a0e56e1b6de83ae31a19a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6dbd14399b24f78cafec6225b77dafae357ddee5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6e25d98279484e1d63cdeefdd1d6a9f1917f1ba8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6e50438308b85e969b79ded22cc5e15f6872ee85.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f2cb7c072a05f7be0c6ce2eca39fc9a1ba5e107.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f35b89192b6c9a233b859cf66fcc435f3f9e650.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f51a9033343574aee2d292cb23f09d542456389.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f544922de2638796837398f7ec15a4afe6b0781.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f55360d336a77a06f2c4235b286a869cff0986c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f900078fd88e14400807e571e1f3a24c633c2dc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6fc8a7d53d6951306e0fd23667a802538a81d6ff.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6fd8a950f1ebe6b021ea9d4c775a5ca8660a1101.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/71479786e864b942786028481e30dfb35e422ba8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/715abfb108ed8f6361d07762656dbd0443c57904.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/717b697e0045b5d7dff6acc93ad5dec98e27ebdc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/718cd1a731e0f4e5abfd77519ed254b5ccc670fb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/71a4244c07321f32f283e49cfd6d6afa19639744.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/71c98b1ae9bb65177c030cf1de6760d41b7d7df5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/720712d40bfdef5974c7c025a6ac0d0649124b79.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/722d44681192f1766a0b1bacc328e719526e8de2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/723fd865c01f3ac097e03b74f7d81d574a1a13d4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/726175290d457b10a02c27f08eca1f6546e64680.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7292de7c0036b9064a85d1da77a860bd989ea638.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/72b9ec702c95ac86de08e0fb8f8c3404b1228b5f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/731b218e6e141e88f850b673227ab3c4df19392e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7394b97da7b0846274940f439675051521a7dd7c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/73defa42948bbe878834ca4b7c9b0395f44b9b90.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/73f96a06142ee17a6c55e5700580f33250552a00.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7434988303bf295c1586c5ee42100e8af244859c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7436f8933ca1dd44e05cd59f8e2cb13052763643.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/74706148818bd2ace30029492dd8ad7d47283edc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/751abcab00f67c93c253ec74d686e2cfcc0062ad.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/752d982c2f694ffee2a312cea6adf22c2384d4b2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7551cb2bcd77b26ae0e05154a3e8cc51c070d707.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7566f3896a5ac6f89f4e7e18dc21b4a6a63864b4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/75891659ab1df929d219741c3f2d69384a01835c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/759b6927189fea6be3124bf79fa527873cb84ea6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7623f4fa0f93db33077a8b64f7a7b27fbc84e9e4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/76910487c819d14f9fefcbc6252f25652af1e65b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/76b3f98c842554781d96b8dde05a74d4d78b4e7a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/76ec742bc2d093c10c6a5b85456bfbb6571c416d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/77393f760a3a3f834809aca1078bdf229331c2fd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/773f81dd69d3adbbe1998ff5974ca83347effc76.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/773fa6558f9fd3115f36af9e4b11f67c1f501432.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/774fd49c617dac62f48eb31e08757e0aec3d1282.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/777f72f32fd20e96c4a5f0cca461fe9a79334e96.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/784686da695f28f867bc35c4416cb8d767d58b7a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/78488a77cb39bdd413dbb7682f1dbe2675b3e3a0.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/78a4d6515faa2766feb3a03ca6a378846cf33d83.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/78a8c07b83df1b01276353d098e84f12304636e2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7935b285f3e7dbbdcda940a70cf92dc0e2ed6512.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7946dcf2f69a7420490a7b5ca677c2273de5764b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7985570f01d50d057ebd4fafcf8c8a1bcacb3006.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/799ce322c90ecad9cc4bacad45f9749ec21e912e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7a9f4cdf362d1f06c3644edbd634b2a77ddc6005.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7b3616d29e7ac720b73ef3e24c9c807da05c4da3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7b586e10794f26ea2654a7f7c34ec9ea48c8bfd4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7b8b04b66e56fa847f1aca3218eb99f3e568eec7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7b9348596e2f005f89842d1b997fa09bdcbe8f06.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7bab40e15d18920009e4168c32265a950a8afe38.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7bf4b8f1f49406eec43be3b7350092f9165b0757.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7c4f082004dba0b946d64aa6c0127041f4622c7b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7c8bcafbd032e30dcc7c39e28a2b5de1e340da6b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7cef749c4ed4703d00346fcdef795d0431bc7c26.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7d1e61ef82bc5dc1029d55c8f5c2ebb56082cdac.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7d385692a31e1e88e675af0b91f98f55797bc02d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7e30541b3a12f403adcb02f90bc96134ce6b6386.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7e8d1f67fd96a81ff6d9459c1310919908000cbf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7e9a5f54713ce7cb98ea4bcb223a40c4952f0083.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7ec3f9527921fb3f713dd6ae1d8035e6c81753c4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7f2731c1ebb3f492687a336e1369cd6232512118.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7f4648fd3e7f8564c98cf142e0e09e23e8097a9e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7f4719a688d4c15d72918ebbe43b908300138d2c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7f755b81ab25cbd0950d528a240b12262fe6ca08.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7fe671db2b6972a1cfb04e0902f8d82dc979d42a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7feb0313c4aa5133f215a847f2abaa025e83bb38.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8023ac0a48264db31f3c9da92fd84f947bfd4047.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/807d82c6eeebd0513a794637ebd90caa19f318e7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/80ae02dc6e3e4ff10c8fd97e1c3f5a5e87270d57.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/80ccb2cf7a994d218d5c47bbf7f8bbb0d479e399.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/81045ed1b34827b3bd74d2546185c3bd3163b37e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8109b6380043ce464115025dd32a7a821fd56db7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/812c39cf410f9fe3f0d0e7c62ed1bc015370c849.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/81d740cef3967c20721612b7866072ef240484e9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/81f297b28d1978eb0d0b1985d6f44b45dfe53542.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/82199291da8dbb7656b03232f5be43ba4d343654.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/823d9660b5b41b7c85904d0eb88a8d40ac57383f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/823eb607207dfd62d80671af48451cce1c44153f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/82512a3915bf43df08d9106027a67d5e059b2719.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/82546b72edbfb76f571cfd06a7009e01615fa054.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8279c6c73a8db1a593945e5ea339f9efde96a61e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/82b2c3e8a59998daa1bc70938a0155ec8c9ed3a1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/83198577cac405ad1a9bf68be7a5caeb020d57d4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8322c981206a5c7eeec48c32c9ddcec9fce98aee.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/83579304f7f59126fe983b1ed44bbbb1ac8bfcb2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/835b998310e6e268f648d4aa28528190ebbb48ca.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/839b16ac73c000ece7bac7d50baf6f7e37f2cad9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/83a5fc83aa65717942a3437217f2114454552144.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/83cd92cdb99db6263492fad998e932f50f0f8e99.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/841465ad74b0afdbec9eaff7b038afc4c000e96c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8435d88b7dc8317b982e1eaa57fa55b8391d00cf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/84573d3fda739326819c7303ea21db6ddf2acc21.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/84d42e162fefc977ae807af123cedfdf400e403a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/84e8928d464d412b225638bcc41f2837f98aef43.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85381b4df6f42b35ca5097709523038abdcdc555.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/857c8c3489ac9b2891ed1ae9c81ea881cf1ced80.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85a8f36d819b12b355508090e787f4a182686394.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85c99b52bbbc96007bd819861e675c61d7b742ca.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85dfc4b40da36a5d66892b5b231c9743c67d7e71.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85e9cac1f581e61092cff1f6be38570ee734c115.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85f8b4292483c5747ab2436a2d5d5377f1f6cab9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/863fd4eee7625cf4012bc9e37b5b66cd25554b8a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8654d0cbb99ee82483f99972ef5247401eb8e8d9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/866bbcabef2c6e3eddf66300dc2639c938d815f4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8672a0aef022cd97d9e834ab2fd3a607fbdaed4d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/868801ec73691d31b90c8611e934aa5dd3b17ea7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/870bf64e17feb1bbdae7b35e9941db781f26ad6b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8745fb7bf19f0e2b0a78c3cd43aa4bf79a25dbce.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/87d2ff4289edcbf7fcfa7fc7fd460deb02ecc71b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/883359c27f09c3368292819b64149182441721e1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/88467827811ed045a648a3c215f5b91d43eb49cd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8892a757ecb2c4a02806a7b262712ff2e30ce044.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/88a9f08917918d1d74c1c2ca702e999747eeb422.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/88bac0da2ccb09c93c0013a209147cc5a5dcee68.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/88e4e066b89d0a6993f31ea337930d962b76d6d1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8937db13972e4dedbcc542303ef3a783287fd10b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/895cd261c9f06f272286bcca3555846fb1ed8aa3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/89f9e0463d14ded51b14392a4fd7a69bb53fa1bf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8a411252b81f0e159c1f63ee64f63a987d1bef9f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8a69dd7bead4adb82c87a200309cd63ecbd625d8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8b32eb4742d88b5cec2e1c9616958bd7f8986785.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8b34ded3493e5181b1d19f6d14a9598cfeaa5997.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8b5211bc5ac76b26c8c102e576f0af560dfbcbc2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8b9532adfc4fe3d9213bbe56da3323c759426287.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8bad741cd92f2db6ab2ce3a3c2d35d000235bfe9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8bc347015fd7ce2af13b17de4d287471cb994f38.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8be1a39cdbaaa858051954548474dd3e307b20cb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8c53bd47030c9bf4e7dbf1ea482cded9cc8abad4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8c953b2300b547ad82edd9697cab8a5985f5ead3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ccc5cd4a9c103249435fc0a7fb18874b447de3d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8cd81c0f5f84dfe58834aeb8b71e6d7780b8dead.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ce325d8afc27359968a8799d58ef4bf0c57d68e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ce361c94fab69503049ea703fd6d5a53cd81057.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8cf8260d0474ad73d9878ccd361c83102b724733.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8d2b29253c00ae6a20730d0c9ad3284dc0fcabf5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8d328fc36822024d739f83a36fef66e5abe61128.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8daa2c34d27a7e09c0ab837c191e87f320790f75.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8e56f0efd08ff4a97e439ea3b8de2b7af1a302c9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ea57ca1ae730686e86fc3b2aabd71c9f8ea9823.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ed36d5e1ccdfb0139d9d3db3aea2b90ae1b405e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8f42bd98be9767332ce949506a9e193393da73fa.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8f5ea4dc23caee3b6887b07ae9d319bfe5e39ca8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8f64225936d78b691574900d641c0cb7c3ce78ef.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8fddca5b0d9d19db5b349ab7f72625b8c6d5744c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ffe1fb9caf854ded9ca52190d4874d8280d26b0.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/908121c9993cbedb4916c19d84605a9728fd27e5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9087b2b5302fd4b7c8343c568c7c8a925544bb40.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/909b04011f4c2211d6d945ec82217e3f89a79bd7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/90fafe76840267470228854a202752832d54a787.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/916c197a1a18fbe44382a30782b1ff7c13dbfeec.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/916f0a90d0b8383f2353b3320628e23e38b380b5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/91838636de3442e218fd7beccde866113d10ddf3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/91b834e69c2153740973c59cf6b4d66260640342.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/91eeb0303c78ec7eaa6dab7921e7173c68ff7769.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92442d67350644bfcaec2b2a47b98f4ede943dc3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/924550083a3a6acd177024df788c02d236874893.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/925108d09cfc6f2b5193d0d7414bfc83748111a9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9288d1e76019a9d1f08873e515b9798906cc1c4b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92b00bee2e48f01962bbbbac49cf87587710f35f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92bd6d892feb4829f9c49afcf79cdc323be66cc4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92c74e7245dfe20bf93f1d73039ed4df95375c6f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92fe6b199a3b4773c5b57ededba80500e6c66faf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9346a72cfcd74dfda05213a2a321bf9cfb823358.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9370eeef3d5414148efc5cc390b4efbe3020f23d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/939233f807850ae8d28246ade7fdccda66e9df03.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/93a3a5e1a633eb2ab616759dfb76dc433abd4d38.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9455a31e5d6c749f3028f9f5e5f758f713c09973.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/949025c4deea46fd131c7b8d89978d75fcc440c4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/94fe9993a8201bdbd9d383cc4cc4ca4f2dddb47d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9555087b12b80060fb337f8974fea9261174115e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/95689297b729a4186914e81a59ffb3a09289f8d8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/95c10fdc6d0c3b142da650044e1a0581d04ef8e4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/96597f608c26e68bfc4bdca45061400d63793523.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/96b0df7161ff334810f77fe93235bd4d548164a7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/96c0566da4eb3450616c3f358c32837bfd4de6c8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97050c74e0c144e4f16aa808d275a9a472489efb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/971ae69d7d2a527c25f31a6c8d8d64ee68b48519.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97492a97f355a95d56bcf768a62ca7fd75718086.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/977988398efbdcd10db4aced047d8d864883614a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/977c81385f7825613f1edbd3c0dbf44c259ba8d7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9789f3a8936ad06c653c1c7aeb421c70ffd7c3e1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97b722619afc616f13beb20cd7a8fbc29cff50d1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97c26f347fd5a13fbc5b24fc567fcf7adf8ce0c3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97fa49d526786021cf325ff9aff15646a8270b48.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/981bcfc7f5817524cb8e0c9fe04e3f267a268926.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/984b203b8a0054a07f5be3eb99438c7fbcb6ce85.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/98aa3e34d14723232d266a85cbb9e2b1816b1aa5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/98ac4398e3ea902007d99e5bdb0686aef04a4daa.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/98b447b5af1cd17524e2ba82fed83b8966ddfefb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/98fc8e9a3380e4593d9bf08b78ce6a7797c0204b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9933646421686556c9ae8459ee2e51ed9dab1c33.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/99675d0ddd35d743f2f0becf008d9cbed68c0534.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/99843122c08d0d70ed3694a57482595e35fb0d8b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/99b0c1c962e0642e5b877747ed37e9bb27238664.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9a1025416cda5ea57e6b2d9525bdfc7f1ae58692.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9a5011652c8fad610ef217b82b7f28c8256dce8b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9a83a33abb4c6a12a7457d3711c2511eb3982b2c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9aa00a347bd6f7725014c840f3d39bc0ddf26599.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9b120ff1f8482eb617e16738d5160c966c6edf3d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9b6386c6c291665aca0892481681a94a70185e9d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9b89a3b2d7e1868f15a28eacf6d5c6214f7f12b7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9bea57d80c215d963cb0c54046136fb3e88c7d5c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9c03418999e6b01345837d9dd0f8e0410ed5cb7d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9cad0018634ff820d32f3fe714194d4bd42c5386.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9cfb0a5fa276072e73c152485022c9a3eafcc233.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9d9188e6383db5f7038b98a688cb2dc9cf5a336c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9d9c67189be5d6db22575cf01a75bd5826b92074.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9da0d100a88228ab463cb9b1b6cf1c051253911a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9da9a2809d484a6caa70a66a3548cf4a537950fc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9dae797269714235c8d9287b5d358bcf72e2c9f5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9deac0e5b403baedeabe9c76a295651289e6416c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9df72c2325ce5baca0cc7d2a884695d115557c40.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9dff39b0fb5fe6195aa75e50040b6d669fce2bb6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e15d946edfb82ef911d36032c073cf1736b39da.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e1cdb994e758d43d9d8cdc5d88e2b5c7e0088d7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e2277ec0ed75ec2871c8bccb4b9af3f78350c9b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e71f112f9af39e61a59914d87689b4b8db13f50.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e77548af396e9e9474371705bcfff55684c5760.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9ee303cb0d99042537564dcdfc134b592bf0a3fe.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f06df311976f336cb3164b08d5da7d6f93419e2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f27a4650b0b0bf36223937d0cf60e460b66a723.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f5d44b3a96f8418be317ad258e4932e468551be.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f78eec8e37db19f2c3220f8e43029b2c5370b5d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f878a46b28c19b951157a5f31bb7a1a9920a89e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9fa71067981e4fc0d6f68a14c91c694dc4c2af25.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9fd50170823ef108e2cf4ebf083b0085845fc3be.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a10de0e026ba0cf397108621d5927e16436acf58.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a11374b50b49477362fa00bbb32a277776f7e8e2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a1365cd1e2acbee6e9bf025dd493feb17a0d428f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a148122da72ad9ff05b3483d6f50975c50b4ab33.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a152f3047c3b41f06773051ea4b5b6b14dde709e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a187344eb767bac8e4d674651bedafa33f70bfa1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a1fe4b06db60f8a9c916fbeaf5c7482155bd62e3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a20fcf106ba3053c247daf57a4a396f073d1e4e2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a255bb890ca287c5a91765b71832daa45ba4132b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a2b0db014389285d9abca9fe0d4035f85de6d102.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a3022ff9db2732f0ab3091884b428763d3879fd2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a304b9e82543c150236ecad30f1594e1b832b8b1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a392bddead4f42155dc83fba8512775db313fc53.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a3ae0828d8e261dbc23b466d22ab46c1dd65b710.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a447ec7366d2eb328bce8e44a73b3a825a9b757b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a4799f6bdea1b1508528fc647dad5d1b2ef777aa.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a4cea84825e512a73c509437103b89b6ef363d5b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a4e9fae09be2f3c0191cbc14a56085b0773a2585.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a56686454e771e5fdda0315dd38313f9fcb31aac.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a56c821c7ee483d01e4338397f62ddd6cb6d5e9f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a5c7cf086b303923d48f8ad63cf85a6bccbbe3f5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a5d736b45ec8ec0b906e183de5daa8bfa4c1f2d6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a62a258bb486fbe7e7fc91c611dc2bc400e32308.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a6587cbe69b6227ce1d087cc141ccf13669f2060.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a67ea42903bf8be22aeb379891b7e1ca3eb2e4d1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a69da07f8ee0529080646a4b1eab45c1074ab683.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a6d3281cf9382fa606cf60727452a304a5ccdfa5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a6ff5c1e6cf7c4ba30f191df892dc3296f9b8ce3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a724f6e91162b52c519f6887f06df40626c0f698.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a73ca4f67523dbb58fd3521ae9bff83aee634607.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a7845d8c3e419cedd06e8c447adf41e6e3d860c8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a7f2612ad7178c8afa4c8b7c2f210a10dd7ee5cc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a82cb1ababcf08e9fd361f13050d47850af8768a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a85e898f28ac27daa8961337a9b468004c1b8b21.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a8a2d53661eb9ef173f7cc4794096a134123daca.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a957adc1e11b5dc6aa15dc17ef6293c40f89fc20.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a967430da16338281405cf73a802c233911b6a13.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a99d0a49cdc1c3c38eff43a6b1b51b0a177e5573.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a9e9d62e92156cebc0d4619cde322af48cace913.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a9fa1d31f4cc6018daf5b927908210846b082675.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aa1c79d72d6a7d37ce1e72735b6dcfca2b546dce.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aa213d259727545c26401ad5cfb4916b6efbd18d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aac63365f37f6b307ba343f45706e388d24245d4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aac6535cab0b4600a9683433fcab805b2c4eaa53.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aae40f1cc335a650c1eb806e404394da596fb433.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ab42ff6b754a2e29fcb56b0137eeddf17f8ee271.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/abca967cd96ab805be518e8a52ef984499c62f6c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/abd445ce46b0329348e6ad464735bdb1d525edaa.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/abfaaf84948b090c8ea099ff44cc8cd878371073.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ac040f5709ab00ab3ed8275862fa2328d20842b2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ac97ce4d4df6402240f1a6a67dfb9462bc1fafac.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ad5b9969c7557bfc4cfbb32cca67f40c52ff824b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ad61bc1b395a071d8850bc2405a8c311cfdc931f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ad76780ea50a0fb37454a3a03ff08ca0ad39ef19.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adb2d2b53c7f2a464a38f7de5d7a74a39e697528.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adbd308eeb761b4a1516d49f68c880eaf3f08d78.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adbef9d5635eb271a8bd78b23064dcba1a1915a6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adeb3c4ba4949f2c87919d5493b71b67028b76ee.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adf96f4dc435ccf7e702eeac6fcaa9f7decd1dcb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ae3f5b72354288cc106bb10263673ebc80b2d544.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ae57c56703b39c9097516d1466b70a3de57aa1c4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aee1a739f2ea11f815ec571163ba99c9b2a97245.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/af0f7c335a10c372c36a0ccec76057c41b93731b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/af19b6a59e167d486d94f4bbb3724ce1deae5feb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/af2ac67b66d3a2db0d4f2af2d6743f903f1385d7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/af3da662099bd616b642f69925aec7c8afc84611.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b00beb80e522d712dc9062f835ad10e787b8c5fc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b019692a5844a9a72292a35b8953aa67836f8201.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b08a6b7a0f11fd3ab62a14f44fd4e1a771174c61.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b0b1665f022c9e781ce1ae94fa885266391fbcfe.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b0b80eb59e769546eedf8ca32a493bf38c6a9707.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b0da6cd45bfd0d3a91f0b3c4e7615de23fe4f350.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b193a2795bdef17a5d204cdd18188a767e2fe7b7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b1af301f18e6444da2842cc71f9ac38505ee5e1f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b2117b2cd0fea469149b23facb6a9f7f32905afd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b2250c2a2e20f6f123c6d1091bfd635dc74ee4fe.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b23f48a4757500fea641245cffa69cb3b72ae0e8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b2593108fa446c4b4b0ef5adc2cd5d9585b0b63c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b2ca734ae719ba79ab4b5f877cf044f47090faec.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b32394103127310af0f4bf240cfd0b26399b685d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b3f8fb433fc6730284e636b068a5de98c002dabd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b3ffe77064106ee619c664233b7b7a9aba75c30a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b416f3605adf246170e1b462ee0f2cfcdf5e591b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b481bde61eeba2cc6b2a0c1d9c43d8dd56ab2a08.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b49f37bd511123a94fcad3c6e826e60fc61db446.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b4b2e864e1abd4ea20845750e9567225bb3f417e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b508da024ee4722c3919c4d1118cf0410713a9c5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b518a7a2d4aa3b05564c965889116f6a6151a34b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b51ff1fba515035a93290f353d20ad9d54bc043c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b523ebe64275bee04d480b55ccaeac3017a36980.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b561f461842bb0d185f097e0adb8d3ac13266172.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b57a4b94bfafdd0cd6edbdfa4aba1f708286e918.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b5873013457aaddcc20db880b3fc9d9bfb7bd348.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b61649df5425dea0c1f16942bde0eec79b3e4f80.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b648a5dee55d7dbf258b7b088830f18c040c61d5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b69246113e589f088e8e1302b32b57720bd27720.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b6dc074f83f9e8984b9cd3a3bf5b392bc4a61844.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b6dc15d9f3f199c8bab5f85eda67d50627bb3e08.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b6ec6454711b4946dbc663324dc478953723b1dd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b741fe5cdd06d606f869b15deb2173c1f134d22d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b7bafad14d0bf628c14fe0821af01aee98a0ae62.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b7cac3027eb08d3e2cfbfab0f0af2acf4dd0f990.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b7e56bebf29f9aa59a9abc9e299f19613e5859da.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8044b03933e3fcea5bcf6362199ed083ec2f20f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b851271c134a1b282412bd7a667c1c9813b4e8b2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8522e9801281dd4118a5012acf885a7ec2354e4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8581c38346f1fe8900d18db8fcef8145f5965bc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8aa7399868c0ae8dd698c9048ebd50c3f17ef12.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8c3b95fc688c347d679f81711781b29578cfc19.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b924d359f00db1671f86aca7a3ee226206dfbed1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b92f42609b54b82bfe38a69b781052e876258c2c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b93f8a3a1ced22cf84c45b552d5040a4a17fdb60.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b98506eb96c587bdfd06cbf67617e25d9dae8e60.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b9d44bbcf205103bf01619d31cfebe31a725ba5a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ba4ad6d42d951b1247e54e312c04749fd8ea2fd1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ba78048bad0ee0f455762254f562704769ea4149.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ba8a6820b3dbfaa703679b19be070f7bd0cca3d1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bab82891ca84875b6eec64974558fc838197c99a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bacaf30043e33912e3d7f174b3f8cf858cb3093a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bad5210d0f8114cd4e9b1db05eb92f0eabc6e233.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bae3302fc87e1bbfa604baa2d003069e4233a517.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bb659d7b00db3096c4082bb93c7fdb933738b013.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bb832bb5ce4b3e6e6272967d547d652b1daf2c4d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bb961ab67f88b50475329fcd1ee2f64137480426.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bbb6fc842a370135b8488d9a2e09fcf17341954b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bbd1f022a8393101199abb731534c10be99cf1e4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bbdeda771a051a9b1871f9bec9589d91421e7c0c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc1ad7048032258f29e1d4081a2eec98b36d13cf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc314650433831859c400bffefe5f919ed8735ea.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc3d88e89001bb639e418ae5971b209535603a18.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc75f4741f871360b8e3ce356754c329323306f7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc8e9394d23a5320bfce0ebe7f208ca18cb6b65c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bca763bf5f62bdc635ac2e0e7c9c6a47b04745a4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bcae38614c57f1abb775c4c9372dc02531830659.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bd995b62f35ec624da9e86f9a3383b73b54d9ed7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bdb3689801d81676ae642f1ebff81d27c07f1f3c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bdc1b4283563848e2c775804fc0857dbde8843af.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/be1c1c3648cb7f6f6c394334554b1ecedc3504dd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/be6a4c0bb6bcc7166ff88d60fd433c220962730d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/be7f45c3e17998a50b8414d623007ed668b37c04.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/becca4c839a0bcf01adcb6a5ce31a3b1168d3548.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/beda84e76e7f8fa5594f63e640dc17b4f6cb3e5e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bf6a65f061558b6aed8a438a887b6474a0fdffc3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bf75f233fdffdca8a25d191e1df4df7f51e30823.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c038ba342a00562bcb7a569e4e2acb7349c9cef9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c07cd6df8c92edd0f2638573bfdce7bf18aa2eb0.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c0cc7ae4029730b9846b6a05f4160643d3a8c393.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c0e0c248b3934e34883814b5f9ceb792d734042a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c119b8d62c156451a8b8665e8969422803527df3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c11e8deedbabe64f4789061d10e55aea415fd51e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c122739764b1ec75b64e1b740f493bad8616a9db.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c1324a359a58b4d399c10bc59ae94e7e0723836d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c143a9f5185d9303301630d3fc53b604d3dced2e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c1ca39ff2c12cc12697e62a37c7c52a256248af7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c2185a8c9156c6b38d76bd3fd29a833d96a5762b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c24646ed4724e2a2d856392dda9c1b9b05145e11.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c2da4bde14d0a2da1e0e2d795e7dc7469f422db9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c2f1ff7794524db18ee5fadfaa7232d0a94f8b4c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c324305e8f756140b7b96492d73d35bb32794119.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c32fe380cf3083b6d85554063b5acb153fc1c8be.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c3552c5e0f334c8bc3557960821dc5ef931851a1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c41c78f27bb2f48542141ea85eda7ad333e3fd0b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c471b8b14614c985391115ec1ed53e0b56d2e27e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c4773ef8b0935e8de084c1a6285efe11e2a5f80a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c48e63f001dfae875e1c82b5d163b7a2c9961ce2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c4bb814768f5d91d2c6aa90b34fddd944aa1eb91.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c4e83640891ea5d02eae76027d05fdefe2c4effe.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c528d240892080aece146d29fb3496ddd0f1fd48.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c52d7d525c33eb8fa5b5acc8b16243223d78ac68.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c535650c17cde010eacbf5b6bf85fd8e593b77d6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c53bd428f2955b76bf24620a21a6461a1cc19f11.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c562415979d3b38aa74c27fd68f13d54ffe47fe5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c5673e6023d99f8354e9b61da2d2f1b58fbc970f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c5f5acc006cd6f06be3266ee98f89fabf4f6fbaf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c61d407536d31a069aa857469a0eebfef1c0e1b8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6223eeb52369b6b2baa2b489c9da41c882154b9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6379e4acdd7b1c335e9944b8d9dbb08db220420.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c64a69ebc1360788037b11e8b0dc5bb74d913819.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6b0055426c9e91760f4923ed42be91d64fca6c8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6b9bd6294c9a3ef6cd7e45e1b3765c061d92cc3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6ee4cacfc1e29bafbb8ed5d98521ea68388d0cb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c7049b7393149edc2256a9d4edb1d6e5a6e24b72.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c709b8079f21daa0ee315823a6713b556ac2789b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c70bb33e4e6792511dc4e7d88536017e64bcd0f1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c81beea067ccc7fed12806f3ff0f20519092f2e4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c832eb23963c0f4bcddb2dd45c8e67001aee8f4f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c8816bf425ef039884dbf6a7282f8d7adb7c5d04.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c89753519b91f85dc9e0ed54a3248cd82d5f2a9e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c8b4a993cb8642bc87432fcb305eee744c16a154.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c926dfb3758881e6698f630e496f3817101e4176.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c9769e4047faf3c5f55b2a7bd5fcce3e321870e6.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c9857afef4c7e7c2ad0b764277b90a2bce51adc8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c9fb652c433a0a0bc419cbfe4ecc3680252d2fe3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ca6f118dbe9a1782053fe1f5f4697dda07a7a365.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/caaa2e09b5b6f7ac550e936268b45d3cb7a412a1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cad5f0781542a67a581819b52bb1b6b4bb9ece74.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cb130d4e1ae505ce39cbd49bf9d22359b9ec80ab.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cb81643be8ee3b3dc2f6bccdb77bd2cec32c8926.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cbc6bda4ec8356f2ce95dd4548406abee1ec5b76.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cbdd718bcee7b1ffde95191be1749d57b9a1a60d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cc0adf041f1628221cac49a1baec1d497d762dc4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cc60febf8e5d1907ce0ccf3868cd9e4b494aa1bf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cccf5ec3e34e81e3e25ffe29317cdac2ed1c936d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ccdf1d5375060fcde288a920a6f3c1b48454c6db.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cd0745062372b6a66356728dea39ee6d8237d0de.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cd1c58ad8e180ab922890fa8182ff7f51c589962.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cd27e36e95ae5324468c33cf3a112dc1611ca74c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cda0897d49b56ee521bf16e52014da5e2e1d2710.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cdf460b2bb910f74723297bcb8e940bf370c6ffd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce13ae6812f1e2ca6ad429d4b01af25f9f398148.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce14b5eff03a17683c6aa16d02f62e1ebad0d7f2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce1b598a354c454f2d201039a2bb6d69babbf840.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce40b0cef1449476821a1ebd8d0cf339c866d16a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce7976afe82e2d17ee1fa308570afa42e0e91667.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cebdc984a6e14e7dc6b7526324bf06a0ce6ffe34.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cee9ef1f47611f6a9c00bb76c91b94b7da2a62ff.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cf4254ce9e6d890ccaa2564da3e9b57071ade342.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cf6fe4e4058c24f0beb94d379fb9e820c09456d2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cf88bcc09a32b2d6d65f2c2a831e2960aca1e347.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cfc54bb4cea29104bd4f9793b51abe558aa0250d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d0142ffcd3063427101ccc165c5e5f2b0fa286db.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d04178dde54f21a248daff3f1582eb4bf1e9ac43.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d05d9570cd32acccf91588c5886a1c4f5da56d01.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d05f366afc5726dc1a258edc3689067381efdecc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d0907278ca0ea55b0e0ed9e834810d502a817af0.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d0dece55336bc8393593243d829b9d4b1e6159fd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d11a81e7333f63092fcf2c047744f2f3c18c1903.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d171fcf10d8a1699fd8ac67e44053bbf6405631c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d174298e1dd7898c08771488715d83fc7a7740ae.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1908d2f2c1701d4a9ac3354e42dff295c06b40d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1afa9bb4e0475a56190dc8254e004308bea484d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1b1e93ad61d2b095bf8a00e9739fcf7d1dc974c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1c3f3db7837f7c5803f52829a542f6ba8b4837d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1cde4ff34352a6e5cdc9914fd26cf72574e2d59.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1db4f3b084cb401795c925f280207cbcb3d94aa.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1fafa3a73f77b401f49cc641be44d61bc9c0689.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1fef8c7f5be28316caa952ccc76281e6f3fe12f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d21cd926ca1fe170c8c1645ca0ec65aedddb4aef.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d2d9f4e05cabc566b2021116ed28ef413fa96779.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d2ea86e13b810569e718e9dca4c00da28a2e1c9a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d2f4f71189d7f5c92ddc2ccb38f2bce1efd4bc65.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d3084bfb07d425ebace9f538d800e08daea97594.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d377da7cf67645f321593fa8b1536be2f0753333.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d43de202e6d3eee211893585616bda7eb09211c4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d476f3e93d23f52ef1d5079343d92db793e3ad5e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d487db53087c5fd4cd2a25112f1f8a8e496efc72.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d51ad51e5407bf4efae5c97fe7e031db56cf8733.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5521b8ec8ced84a2e383b3b6d5bc20795ef87b7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d579aba442c4652bac088173107ecfebbf4d8290.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5863a9857f07023885a810210dfb819ad692ed7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d59300b05666e072ea812effa009e2dd4b60a508.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5d31fda0eebfcdd87005ed54ebedfd164fa073b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5d7bd00bd17efe339c848f46345f2192fda5c11.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5fafc625d1a1d0793d9521351e9b59a04af00e9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d64140c0b8d4187b49046528ff61a54d77a99223.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d669435b8d1c91d913bd24768e52644b95c675ae.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d69f33671e13df29fe56579ac4654ebc54a11f12.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d6a347cb86df46925701892180f4d8a5b8e14508.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d6db1fbf1b0a11fd3423b6f057182019496ff3f5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d71261b71a4cf5a1ad5e148ede7751b630060bdf.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d733288343a1790788e8069eb55908f9d12566a9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d73c52b16ec33caa6d1f51effa5a6e37052d6110.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d778df3dc8ef2d3ab4ec511b8d20d35778794b93.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d7fd91bac6be16abd9b158c6b118e5e09e047c6d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d83baae9c79e5df9ca904ab1886ac4826447b495.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d872c74770b5729e037e841679f741cf3d8c20ad.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d8bd7c30f776f7218860187f535c6b72d1a8dc74.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d91044a492d05f87613bba485cd2fae1f54764db.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d92a34a349cee727b017af7d40b880b232220959.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d9304450e79dc05b5ecc4fe98d48fecef76a852e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d96c3a08a5607bdcb1bc85e0bedd8743ea0b3dc5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d9b02a6929162af5f13e95c700ce0e548f6a9ee3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/da0357b0ade596e1a23f676f76ff4304b97aef2b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/da3d295da633cd271fb3970ad2ed4b31bdcb6247.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/da7407d415b3eff25ca3dd588bba677cc8cd3494.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dac8a5e350d74e41c1738f4e2a02258fecf9d20d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dad2ede59535330241f2febdf9bf99e21deb4393.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dafb63017668c5dd34a07a1850ce9e9a37d0f525.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/db504727c8688251caab0c18e12bde9dc625ecd1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dcb8fb91999d79190f3e5d54de32b1b7f1401779.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dce29488a4d041b77f6e9b1b514f41335fae0696.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dce39ca6c888ca6d5cf3f9b9d18d06fd3bd2dfbe.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dd88591c39c90f2cf211c3ee3330b7e7939c3472.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de0c1913d6d770641762ed518fefe8fffc5a1f13.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de359e77f61c11b6f759e8dfe8ea69aac3d0514a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de60e212953766b4698982b3b631d1a25a019f2e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de6c4cb72844fc59fd80fc0b26acc8c94a3ba994.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de79f406db76b8d50a2b8ab35d4a385983aa5f54.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de9ce5d0599d0d181890911721738ba3dee01e34.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/deb599f49c3e459a08e8bf25304b063b50caa294.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/decca51bacc7be33f484d36177b24c4bd0fe4cfd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dedc196b72e081228279b523ba3585aed93c2370.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e008266c010adfef841c513ae7bcb91436f9ae9c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e01184bcba866d676b5a236d6638e78d3f55c794.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e01c7d12e53747c7ed71d615d7e9dcd8f17638ed.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e03dd29f683c4f22a7084c9ab8f1488c380170f0.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e0b0b51cd757048207eefe4ec8f1e98e967d9e69.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e0d36a6f5028fc5ed005e87faf9f65f976e62a37.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e0e5646ea00a170bb595e9e0bbccb69f702ffc7c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e0f6fbca52d2ee44ac2e0795fa11fb53e3054c47.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e1074d5c232cb13e3cd1fb6e832753626d2fe30e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e10cebbd89f23e057645097b776a51dea0c1555f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e1232c341b3f590c23e9e81ddd157bc99ff77191.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e14741f9a90592b67437aaed4b7042cd3dc268a8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e14c56a78f56157e862de99906254b291f5b3321.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e176531ba95036356a7e5dca50a8df728c78ce79.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e2089a0f2315f9897f6e3dde50e4fc3ebd2e65aa.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e334a64775ae571c661cdcc847669f0e20c207ff.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e3526b694c68c40edc206e216b454e63b83f3eba.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e399a5b6fa720c6f21337792f822f20f20f98910.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e3b9f33c36e5636808b137cfa4745e39f3b48d62.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e3e5fa98908eee308d960761e9f29cf7a8aad690.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e3efb6106ae81db5a8b3379c3edcf86e31f95ab0.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e45c894cb0df39ad55a35183d62a6cbd570076ca.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e45eeb80195e54d02a6f6cb7505f1fb73b4d4dab.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e45f37bddb38d6656992642fbea2707fe34e942a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e4eca1e5e22f94051d1c8e115d9d874658b5697a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e54340e1ef02d2436758a56105b3182481ff1783.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e5895bc081edbf0cd7340015decd0d0180aac44a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e59b59312d1eb3b2ba78d7e78993883bb3784c2b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e5d702e67e93752155510b56a3b2f464e190eba2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e5e1d00dc75181ede4fc66bdc17bf3c07eb314ec.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e5ea38444d60150c0fd2eb498bf33793dde5fed2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e61658d2ba7d0d13e5a6008e28670d1b1f6cb7bb.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e64b1811e55868cf510b06bfd1a24ba4ac3008f1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e6a2ef28a33aa6a8c8b2321133a8816257cd1612.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e6a30655cbd3745acbcbf18e79b4c3979ca6b35b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e6b5ead096e68a255c5526add4c828534891c090.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e700c898ec2efe96c76c2cac042e063529b23d3b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e70109f320a53829d66f6e07ee0a9b79b59aee13.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e73062f1e8466ab5604358a0ad0d66f31c81507c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e732dfb3c4f38abecba99da31750fb6291560db5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e76a86b7ee87a78fa06482285bad02694abcc3ca.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e777a9c7d0450d572431f168374224179c1ae7c4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e778331bf398f2db0f6477ef689d0dd6a2aaa81e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e7b64045af2c3ff02183fb1ccc036327cee5e971.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e7fac7868f0d237efbfcc625d8c265aeebca3e7d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e81f1fd08e472af1516e6c6b0c936a2dca55cc20.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e85352e9588726771a8cd594a268eca7d04379bd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e88edbb9a31f8b7c70fb3ba48136d9c3cd6767ac.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e8b776685a4c1ffcdc8f90c57c3ad7243a43b2b3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e933c12c1df97e13cba40bcd54e4f4b8133da10c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e990e009903e315fa6752e7e82c2634af4a425b9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e9e9556ca0c7b258d910bb31222a78beabb46a48.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ea3e8b5797ee8a3fd8aa34ea9a1eeb6d81b6a779.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ea4cb9cd97ffb8c956b4f5d28d2759c0ed832bb5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eaef856f725cd9a9605000f3ae98cbe61a9f50f0.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eba93b500af79fe9bc96ff2ffc71078766532a86.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ebb83f528ac02840efe18510ed95979d2cda5641.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec03e18490e47db0efbd6a00bda7ddb85b0a14d7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec10ac085ba8a12ba0d8af2dc66adfbe759b3183.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec154ae6f7fe894644424bfa90c6ca31e13a4b71.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec284ab3dc23241975f76e0519b531407042aef1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec433541f7f0c2dc7620ff10cf44884f96ef7aa5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec7fcf477e212945eab7bb85c2279f37d62d4b49.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ed7afe85422b1db8eaed166840d275dddb63cafa.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/edb1038f1d71a450556d13ae34a416e46d7213fe.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ee838ea978f9a0b0265a8d2b35ff2f64d00a1738.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eec0eb0502def7b7adb112f8d7d4c38e1f6d9170.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eed64f79ebfdd957deebec6261b3a70a248f3d35.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eed66538a3e4854d56210ab1d6ac49016f1e40a2.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eee6714a8cf20e18ea398651b41e0278071ee42b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eef0f3c3dc121f5c389e547bd20f2aa807074028.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/efae4449ceb6f88aa4545f33bd886ec3080171b4.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/efd36f1bf92225311b684d6aa0d05a597f00d707.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/effb546fc8c21e2c0e9bb87b259bd34b91d4f0dd.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f05134c8c952a7585b82a042b14bcf1234af9329.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f0b03ce62e6dc8ac7598a8b8316c4bf8cea132d5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f0db4483c93a5d14dbf8076c4dd42d22a4f8542d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f0ef147dbc0554f53b331e7b6d5715d0269ffba8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f127eff442d2c1d1a1ea01b23e8135b502ef2e79.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f140f179614d126e483732933a5ca8dcf0a32876.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f161a94239c1dc6696dbb583ec46bc64f3aa8906.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f1b21b1232720492424bb07cd73c93df2b9cd229.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f1cdb96ad5a56206f662bb3025b93f6d5820242b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f24c445f7ab9052a92e411b826c60dee2df78448.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f290d0c61b4a664e303de559bbc559015fd375f9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f2d3c76d5eabbbf72a0314f29374527c8339591a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f30cf59adffcbe4164483b5a63260724a1dfc7ca.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f31a520a8c2c1b9c7f80b14ebcd096bb1121d53d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f37bd72c28f0dac8d9478eceaba4f077abcde0c9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f3ba8ccb1e55bb6535944cb5acdb19efaeb1c3f9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f3c0ad81bbf56463510440f7f81eb146a6c0015c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f3dd7962cb3aa07c8c469ede0c7852993ac3f290.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f43870b5b6ce4d191950fdaae6aafc36f05360c9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f495f5206c908fb1a31f18a8ab3ce9465164564c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f4a482326d45dc729eb8d1a6735cefacd7ae5578.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f4f623d5a7c8913e227e962bd1f347b36aab7b51.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f5086d0b6258fef503cb3219f427ffbff73135e1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f585df82f7a94309af9fb51196f188b4fa212118.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f5a6d2ae83a7989e17704e69f0a640368c676594.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f5af4bcc2d0168d2698beb2a858c24f81a476610.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f64414c7f435b4b5e5a681a5f561c07780037836.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f650943069620aa0bd7652df1abdce2c076de464.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f6670b3b49f00e4ee1f44e8b1c09e24afedd2529.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f67e458a29cf154c33221a8889789241725fe5c7.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f6cc81e55c6aad12849a56837f14538576f5a42c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f7b2dd759b6fc618d53ad49053c24ef8d35105c5.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f7d94e6cd13f36eb9b1fe7653c436dc5745250b1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f7d95a9fcca49861b0d4b7dce677d4e6eff1f7c1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f7e8527824e15b4194a3fd12ceee049f910016db.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f8026e82645eb65bd5e2741bc4df0e63da748b47.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f837935a2fefed20e2cac93656e376f9868cc515.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f837e34ed0ad4739783010d9ffd3684c37fd465c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f839cd35991df790f17239c9c63bfcae701f3d65.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f870af12bc30438b0dab4ff5365b5279f2f9a93a.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f8e12f246225210b8c984d447b3e15867d2e8869.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f8ebee6125bee635dd8af7bf2f6340d58ce99958.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f908a5f1d788e2597335215a464817436a3d3ed1.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f964efda57733a3b39890b30ff22bd5c47eed893.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f965be0f67b8b3c26be38939a33fa8ab74aea4cc.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f975b9964d088181cf34a1341083bc82053812d8.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f976e639bde8a2b880e46d94f4c832b6ed9a9303.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fa15a8a5795baec1d8933a768407294110203e03.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fa4acdc5db590992630c704d00defb142f2f0489.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fae139f839dab4c6eb794d689dacceff869c718f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fb7f7b9a220c66f7e3407ca9553d974cd4a14402.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fb9d913b400e9f00e6aa6eff7a7c8a84f5762dc9.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fbc3c5f81d060cd996489b772abac886f12130a3.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fbd84cb5a6901ddaf7412396f4c6cc190e1b7328.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fc8006009802ae14770be53062787d8a392b0070.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fc8dbf139a485e98914cbb73b8ba684b283ae983.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fcbdbfd3e4bebefe552fad012509948faba34b44.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd0ba49bf07fcc9caf384a50b3012f98e4f1d81e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd32e17ff88251cdfc3fa01a1ad8eebda98eda06.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd3b0e405075464c05c52e5bb0c414a870b06334.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd45693344e2b3cc3bdb7d1aa209ad9fbacb5309.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd48879c34d316981b4f67c2b82c8179e0042f74.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd903f9a58632df14be5c98eeda32e1fc2f46f4b.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd94481e337829121072f5e46cc39b6290e43b44.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fe207218ce0d1148aa57d10ed8848cd7e6ffd87e.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fe2254205e6dd1ee2a4ec62036ab86bc5e084f5d.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fe88457ca86ffe3be30873156a7a0a4fd12975af.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fe9ff9f5cc449798c00d008182f55bdaa91e546c.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fecb1c7b603627e1cf1386ad0ebdfe57fa485f93.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ff69e780bd8feceaf7a0add24c159679f7359f81.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ff6c435adbd62de03c06ce4f90343d3cd04f9e8f.md create mode 100644 assets/seed/v2/corpora/watsonxdocsqa-v1/questions.jsonl create mode 100644 assets/seed/v2/indexes/cloudflare-state-fixed-v1/chunks.jsonl create mode 100644 assets/seed/v2/indexes/cloudflare-state-fixed-v1/embeddings.npz create mode 100644 assets/seed/v2/indexes/cloudflare-state-fixed-v1/manifest.json create mode 100644 assets/seed/v2/indexes/cloudflare-state-structural-v1/chunks.jsonl create mode 100644 assets/seed/v2/indexes/cloudflare-state-structural-v1/embeddings.npz create mode 100644 assets/seed/v2/indexes/cloudflare-state-structural-v1/manifest.json create mode 100644 assets/seed/v2/lessons/cloudflare-state-coordination-v1/cloudflare-do-coordinator-v1.json create mode 100644 assets/seed/v2/lessons/cloudflare-state-coordination-v1/cloudflare-kv-r2-choice-v1.json create mode 100644 assets/seed/v2/lessons/cloudflare-state-coordination-v1/cloudflare-queues-retries-v1.json create mode 100644 assets/seed/v2/lessons/cloudflare-state-coordination-v1/cloudflare-workflows-resume-v1.json create mode 100644 assets/seed/v2/lessons/cloudflare-state-coordination-v1/manifest.json create mode 100644 assets/seed/v2/seed-manifest.json create mode 100644 docs/phases/phase-3.4-content-manifest.md create mode 100644 docs/phases/phase-3.4-interactive-retrieval.md create mode 100644 docs/phases/phase-3.4-manual-preview-checklist.md create mode 100644 docs/phases/phase-3.4-taskboard.md create mode 100644 learning_materials/en/reranking.md create mode 100644 learning_materials/public/favicon.svg create mode 100644 learning_materials/zh/reranking.md create mode 100644 tests/test_browser_eval.py create mode 100644 tests/test_image_contract.py create mode 100644 tests/test_jobs.py create mode 100644 tests/test_retrieval_explanations.py create mode 100644 tiny_rag_lab/browser_eval.py create mode 100644 tiny_rag_lab/jobs.py create mode 100644 web/public/favicon.svg create mode 100644 web/src/components/RetrievalView.tsx diff --git a/.env.example b/.env.example index 95a93dd..bd1523e 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,5 @@ -# `full` contains the default embedding model; `slim` downloads it only when -# a user first indexes a custom corpus. +# `full` contains the default embedding and reranker models. `slim` keeps BM25 +# available and offers separate explicit model downloads in Settings. LAB_IMAGE_VARIANT=full TINY_RAG_LAB_PORT=8000 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..f676cbc --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,84 @@ +name: CI + +on: + push: + branches: + - main + pull_request: + +permissions: + contents: read + +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + +jobs: + python: + name: Python tests + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install uv + uses: astral-sh/setup-uv@v6 + with: + enable-cache: true + - name: Set up Python + run: uv python install 3.12 + - name: Check lockfile + run: uv lock --check + - name: Create test environment + run: uv venv --python 3.12 + - name: Install CPU-only test dependencies + run: >- + uv pip install + --index https://download.pytorch.org/whl/cpu + --default-index https://pypi.org/simple + 'torch==2.7.1+cpu' + '.[qdrant]' + 'pytest>=8.0' + - name: Run Python tests + run: uv run --no-sync pytest --tb=short -q + + web: + name: Web tests and build + runs-on: ubuntu-latest + defaults: + run: + working-directory: web + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + cache-dependency-path: web/package-lock.json + - name: Install dependencies + run: npm ci + - name: Run tests + run: npm test + - name: Build production app + run: npm run build + + guides: + name: Learning Guides build and links + runs-on: ubuntu-latest + defaults: + run: + working-directory: learning_materials + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + cache-dependency-path: learning_materials/package-lock.json + - name: Install dependencies + run: npm ci + - name: Build guides and validate links + run: npm run build diff --git a/Dockerfile b/Dockerfile index 9c75cae..a9dc755 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,6 +17,7 @@ ARG LAB_IMAGE_VARIANT=full ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ TINY_RAG_LAB_DATA_DIR=/data \ + HF_HOME=/opt/tiny-rag-models \ LAB_IMAGE_VARIANT=${LAB_IMAGE_VARIANT} WORKDIR /app COPY pyproject.toml README.md ./ @@ -24,17 +25,19 @@ COPY pyproject.toml README.md ./ # wheel first so sentence-transformers cannot resolve a CUDA/NVIDIA runtime # transitively on Linux. Keeping it before application source preserves this # expensive, CPU-only layer while the lab code is refined. -RUN pip install --no-cache-dir --index-url https://download.pytorch.org/whl/cpu 'torch==2.7.1+cpu' +RUN --mount=type=cache,target=/root/.cache/pip \ + pip install --index-url https://download.pytorch.org/whl/cpu 'torch==2.7.1+cpu' COPY tiny_rag_lab ./tiny_rag_lab +RUN --mount=type=cache,target=/root/.cache/pip pip install '.[qdrant]' +# Full prepares both exact CPU-only model snapshots; slim defers each one to +# its own explicit Settings action. +RUN if [ "$LAB_IMAGE_VARIANT" = "full" ]; then python -c "from tiny_rag_lab.embeddings import SentenceTransformerEmbedder; from tiny_rag_lab.reranker import CrossEncoderReranker; SentenceTransformerEmbedder(); CrossEncoderReranker.ensure_default_model(local_files_only=False)"; fi COPY scripts ./scripts -COPY assets/seed/v1 /opt/tiny-rag-lab/seeds/v1 -COPY docker-entrypoint.sh /usr/local/bin/tiny-rag-lab-entrypoint -RUN chmod +x /usr/local/bin/tiny-rag-lab-entrypoint \ - && pip install --no-cache-dir '.[qdrant]' +COPY assets/seed/v2 /opt/tiny-rag-lab/seeds/v2 COPY --from=web-build /web/dist /app/web-dist COPY --from=guides-build /guides/.vitepress/dist /app/web-dist/docs -# Full prepares the existing default embedder at build time; slim defers it. -RUN if [ "$LAB_IMAGE_VARIANT" = "full" ]; then SENTENCE_TRANSFORMERS_HOME=/opt/tiny-rag-models python -c "from tiny_rag_lab.embeddings import SentenceTransformerEmbedder; SentenceTransformerEmbedder()"; fi +COPY docker-entrypoint.sh /usr/local/bin/tiny-rag-lab-entrypoint +RUN chmod +x /usr/local/bin/tiny-rag-lab-entrypoint EXPOSE 8000 ENTRYPOINT ["tiny-rag-lab-entrypoint"] CMD ["uvicorn", "tiny_rag_lab.web_api:create_packaged_app", "--factory", "--host", "0.0.0.0", "--port", "8000"] diff --git a/README.md b/README.md index 65700bf..f361cc5 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ [简体中文](README.zh-CN.md) · [Project site](https://jameswei.github.io/tiny-rag-lab/) > A learning-first, inspectable classic RAG lab with readable Python, a rich -> browser Studio, direct CLI experiments, real-corpus traces, and bilingual -> Learning Guides. +> browser Studio, an interactive retrieval course, direct CLI experiments, +> real-corpus traces, and bilingual Learning Guides. `tiny-rag-lab` makes the path between a question, a document corpus, retrieved evidence, packed context, and a cited answer visible and inspectable. Readable @@ -13,6 +13,12 @@ artifacts into guided replays and hands-on experiments; a direct CLI supports repeatable inspection. Searchable English and Simplified Chinese Learning Guides open beside the lab when a concept deserves quieter, deeper reading. +The Studio also teaches the retrieval stack as a live course: inspect BM25 +term contributions, dense cosine math, the same vectors in NumPy and optional +Qdrant, hybrid RRF fusion, cross-encoder rank movement, and +two-configuration evaluation over 16 reviewed real-corpus questions. None of +this requires an LLM provider. + It is a learning tool, not a production RAG platform. The project favors visible mechanics over framework magic, evaluation before optimization, and failure analysis before advanced features. @@ -103,17 +109,21 @@ A useful first visit follows this path: pinned 40-document Cloudflare State & Coordination corpus. 2. **Learn:** step through corpus, chunks, embedding vector, retrieved candidates, selected context, grounded answer, and citations. -3. **Explore:** ask a catalog or free-form question, compare Dense, BM25, and - Hybrid retrieval, then inspect the returned trace. Add a tested +3. **Retrieval:** follow six live modules from lexical and dense mechanics + through NumPy/Qdrant comparison, hybrid fusion, reranking, and browser A/B + evaluation over 16 reviewed questions. +4. **Explore:** ask a catalog or free-form question, compare Dense, BM25, and + Hybrid retrieval, optionally rerank a larger candidate pool, then inspect + the returned trace. Add a tested OpenAI-compatible provider only when you want Live Ask generation. -4. **Build & Inspect:** build an index from a bundled corpus or a small +5. **Build & Inspect:** build an index from a bundled corpus or a small Markdown/plain-text upload, then inspect documents, chunks, vectors, and provenance. -5. **Failure Lab:** compare curated failure scenarios with their interventions. +6. **Failure Lab:** compare curated failure scenarios with their interventions. -Open **Read the learning guide** from Learn, Explore, or Failure Lab whenever -you want the corresponding concept in a quieter reading format. It opens in a -new tab, preserving the current experiment. +Open **Read the learning guide** from Learn, Retrieval, Explore, or Failure Lab +whenever you want the corresponding concept in a quieter reading format. It +opens in a new tab, preserving the current experiment. The interface is available in English and Simplified Chinese. Bundled corpus content, questions, recorded answers, and citations keep their original @@ -122,6 +132,9 @@ language. ### What the lab includes - Four provider-free Guided Learn replays with complete, saved artifacts. +- Six live Retrieval modules covering lexical and dense scoring, local vectors + versus optional Qdrant, hybrid fusion, cross-encoder reranking, and A/B + evaluation over 16 reviewed Cloudflare questions. - A pinned Cloudflare learning corpus with ready structural and fixed-character NumPy indexes. - Bundled watsonxDocsQA source data and all 75 catalog questions after its @@ -136,16 +149,18 @@ language. - Curated failure lessons, raw-artifact inspection, source provenance, candidate-versus-context selection, and reduced-motion-safe playback. -The default `full` image includes the local embedding model. It runs on CPU; -no GPU or CUDA runtime is required. To try the smaller image: +The default `full` image includes pinned local embedding and cross-encoder +reranker snapshots. It runs on CPU; no GPU or CUDA runtime is required. To try +the smaller image: ```bash LAB_IMAGE_VARIANT=slim docker compose up --build ``` Guided Learn replay and BM25 retrieval remain available in the slim image. The -Settings page makes the embedding-model download explicit before it enables -Dense/Hybrid retrieval or index building. +Settings page provides separate explicit downloads for the embedding model and +reranker. Dense/Hybrid retrieval and index building require the embedding +model; cross-encoder experiments require the reranker. To use the optional Qdrant comparison backend: @@ -186,6 +201,7 @@ rag index --corpus PATH --index-dir .tiny-rag/index --chunking-strategy semantic rag retrieve "question text" --index-dir .tiny-rag/index --top-k 5 --retriever dense rag retrieve "question text" --index-dir .tiny-rag/index --top-k 5 --retriever bm25 rag retrieve "question text" --index-dir .tiny-rag/index --top-k 5 --retriever hybrid +rag retrieve "question text" --index-dir .tiny-rag/index --top-k 5 --retriever hybrid --reranker cross-encoder --rerank-top-n 20 rag ask "question text" --index-dir .tiny-rag/index --top-k 5 rag ask "question text" --index-dir .tiny-rag/index --context-budget 8192 --output-format json diff --git a/README.zh-CN.md b/README.zh-CN.md index 6e31579..fc4caf1 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -3,13 +3,17 @@ [English](README.md) · [项目主页](https://jameswei.github.io/tiny-rag-lab/) > 一个以学习为先、可检查的经典 RAG 实验室:通过易读 Python、丰富的浏览器 Studio、 -> 直接的 CLI 实验、真实语料 trace 与中英双语学习指南理解 RAG。 +> 交互式检索课程、直接的 CLI 实验、真实语料 trace 与中英双语学习指南理解 RAG。 `tiny-rag-lab` 让用户问题、文档语料、检索证据、打包后的上下文与带引用答案之间的 完整路径清晰可见、可以检查。易读的 Python 直接呈现 RAG 机制;丰富的浏览器 Studio 将中间产物转化为引导回放和动手实验;直接的 CLI 支持可重复检查。当某个概念需要更 安静、深入的阅读时,可搜索的中英双语学习指南会在实验旁打开。 +Studio 还把检索栈变成一套实时课程:检查 BM25 逐词贡献、稠密余弦计算、NumPy 与 +可选 Qdrant 中的同一组向量、混合 RRF 融合、交叉编码器排名移动,以及在 16 道已 +审核真实语料问题上的双配置评估。整个过程不需要 LLM 服务商。 + 它是学习工具,而不是生产级 RAG 平台。项目优先选择可见的机制,而非框架魔法;先评估再优化;先分析失败再引入高级特性。 ![Guided Learn 回放展示真实检索证据](website/assets/screenshots/guided-retrieval.jpg) @@ -61,18 +65,24 @@ http://127.0.0.1:8000/docs/,也可以从实验室中的相关阶段直接打 1. **Home → Start guided lesson:** 从固定的 40 篇 Cloudflare State & Coordination 文档中,选择四个已保存课程之一进行回放。 2. **Learn:** 逐步查看语料、文本块、查询嵌入向量、检索候选、选入上下文的证据、基于证据的答案和引用。 -3. **Explore:** 提出题库问题或自由问题,比较稠密检索、BM25 和混合检索,并检查返回的 trace。只有希望进行 Live Ask 生成时,才需要配置并测试 OpenAI 兼容的 LLM 服务商。 -4. **Build & Inspect:** 使用内置语料或小型 Markdown/纯文本上传构建索引,然后检查文档、文本块、向量和来源信息。 -5. **Failure Lab:** 对比精心设计的失败场景及其改进方案。 +3. **Retrieval:** 通过六个实时模块,从词法与稠密检索机制一路学习 NumPy/Qdrant + 对比、混合融合、重排序,以及在 16 道已审核问题上的浏览器 A/B 评估。 +4. **Explore:** 提出题库问题或自由问题,比较稠密检索、BM25 和混合检索,可选地 + 重排更大的候选池,并检查返回的 trace。只有希望进行 Live Ask 生成时,才需要 + 配置并测试 OpenAI 兼容的 LLM 服务商。 +5. **Build & Inspect:** 使用内置语料或小型 Markdown/纯文本上传构建索引,然后检查文档、文本块、向量和来源信息。 +6. **Failure Lab:** 对比精心设计的失败场景及其改进方案。 -当你希望在更安静的阅读环境中理解相应概念时,可以从 Learn、Explore 或 Failure Lab -打开**阅读学习指南**。它会在新标签页打开,并保留当前实验状态。 +当你希望在更安静的阅读环境中理解相应概念时,可以从 Learn、Retrieval、Explore 或 +Failure Lab 打开**阅读学习指南**。它会在新标签页打开,并保留当前实验状态。 界面提供英文和简体中文。内置语料内容、问题、已记录答案和引用会保留其原始语言。 ### 实验室包含什么 - 四个不依赖 LLM 服务商、带完整已保存产物的 Guided Learn 回放课程。 +- 六个实时 Retrieval 模块,覆盖词法与稠密评分、本地向量与可选 Qdrant、混合融合、 + 交叉编码器重排序,以及对 16 道已审核 Cloudflare 问题的 A/B 评估。 - 固定的 Cloudflare 学习语料,以及可直接使用的结构化分块和固定字符分块 NumPy 索引。 - 内置 watsonxDocsQA 源数据;完成显式的后台索引构建后,可以使用全部 75 个题库问题。 - 不配置 LLM 服务商也可以进行纯检索探索;通过连接测试后,可使用任何 OpenAI 兼容 Chat Completions 服务进行 Live Ask。 @@ -80,13 +90,16 @@ http://127.0.0.1:8000/docs/,也可以从实验室中的相关阶段直接打 - 默认使用 NumPy/文件索引;可选的本地 Qdrant 后端只改变存储和向量搜索的执行方式,不改变本项目要讲解的文本块、嵌入、检索、上下文、引用和 trace 概念。 - 精心设计的失败课程、原始产物检查、来源溯源、候选证据与上下文选择的对比,以及支持减少动画偏好的回放体验。 -默认的 `full` 镜像包含本地嵌入模型,只使用 CPU,不需要 GPU 或 CUDA 运行时。若想体验更小的镜像: +默认的 `full` 镜像包含固定版本的本地嵌入模型和交叉编码器重排序模型,只使用 CPU, +不需要 GPU 或 CUDA 运行时。若想体验更小的镜像: ```bash LAB_IMAGE_VARIANT=slim docker compose up --build ``` -在 slim 镜像中,Guided Learn 回放和 BM25 检索仍然可用。设置页会明确提示下载嵌入模型;下载完成后才会解锁稠密/混合检索和索引构建。 +在 slim 镜像中,Guided Learn 回放和 BM25 检索仍然可用。设置页分别提供嵌入模型与 +重排序模型的显式下载。稠密/混合检索和索引构建需要嵌入模型;交叉编码器实验需要 +重排序模型。 如需使用可选的 Qdrant 对比后端: @@ -121,6 +134,7 @@ rag index --corpus PATH --index-dir .tiny-rag/index --chunking-strategy semantic rag retrieve "question text" --index-dir .tiny-rag/index --top-k 5 --retriever dense rag retrieve "question text" --index-dir .tiny-rag/index --top-k 5 --retriever bm25 rag retrieve "question text" --index-dir .tiny-rag/index --top-k 5 --retriever hybrid +rag retrieve "question text" --index-dir .tiny-rag/index --top-k 5 --retriever hybrid --reranker cross-encoder --rerank-top-n 20 rag ask "question text" --index-dir .tiny-rag/index --top-k 5 rag ask "question text" --index-dir .tiny-rag/index --context-budget 8192 --output-format json diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/corpus.json b/assets/seed/v2/corpora/cloudflare-state-v1/corpus.json new file mode 100644 index 0000000..310d92b --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/corpus.json @@ -0,0 +1,6 @@ +{ + "id": "cloudflare-state-v1", + "name": "Cloudflare State & Coordination", + "kind": "catalog", + "file_count": 40 +} \ No newline at end of file diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/evaluation-manifest.json b/assets/seed/v2/corpora/cloudflare-state-v1/evaluation-manifest.json new file mode 100644 index 0000000..eefa8e4 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/evaluation-manifest.json @@ -0,0 +1,16 @@ +{ + "schema_version": 1, + "questions_sha256": "53dcbd1bd6eb14cc87510ad482032e357b53b6e61e9141d11af1722531981a36", + "chunks_sha256": "11960c4f72360fdb4dd7fea1f43fbec4dd36a9214e3256bdcffc36ad3aee1f41", + "embeddings_sha256": "c944c09db6e42fbdac3ec3e25dc74c6e6ea8b23802d612705ec6be512fa29604", + "source_vector_fingerprint": "b4e7cd9f2a4dff45661dfea67ab4dfe265cce119fe731b39ab01ff8065965ff5", + "document_count": 40, + "chunk_count": 537, + "distance_metric": "cosine", + "embedding_dimension": 384, + "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + "embedding_revision": "1110a243fdf4706b3f48f1d95db1a4f5529b4d41", + "reranker_model": "cross-encoder/ms-marco-MiniLM-L-6-v2", + "reranker_revision": "c5ee24cb16019beea0893ab7796b1df96625c6b8", + "question_count": 16 +} diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md new file mode 100644 index 0000000..4d576fb --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md @@ -0,0 +1,252 @@ +--- +title: Alarms +description: Schedule future wake-ups for Durable Objects using the Alarms API with guaranteed at-least-once execution. +pcx_content_type: concept +sidebar: + order: 8 +products: + - durable-objects +--- + +import { Type, GlossaryTooltip, Tabs, TabItem } from "~/components"; + +## Background + +Durable Objects alarms allow you to schedule the Durable Object to be woken up at a time in the future. When the alarm's scheduled time comes, the `alarm()` handler method will be called. Alarms are modified using the Storage API, and alarm operations follow the same rules as other storage operations. + +Notably: + +- Each Durable Object is able to schedule a single alarm at a time by calling `setAlarm()`. +- Alarms have guaranteed at-least-once execution and are retried automatically when the `alarm()` handler throws. +- Retries are performed using exponential backoff starting at a 2 second delay from the first failure with up to 6 retries allowed. + +:::note[How are alarms different from Cron Triggers?] + +Alarms are more fine grained than [Cron Triggers](/workers/configuration/cron-triggers/). A Worker can have up to three Cron Triggers configured at once, but it can have an unlimited amount of Durable Objects, each of which can have an alarm set. + +Alarms are directly scheduled from within your Durable Object. Cron Triggers, on the other hand, are not programmatic. [Cron Triggers](/workers/configuration/cron-triggers/) execute based on their schedules, which have to be configured through the Cloudflare dashboard or API. + +::: + +Alarms can be used to build distributed primitives, like queues or batching of work atop Durable Objects. Alarms also provide a mechanism to guarantee that operations within a Durable Object will complete without relying on incoming requests to keep the Durable Object alive. For a complete example, refer to [Use the Alarms API](/durable-objects/examples/alarms-api/). + +## Scheduling multiple events with a single alarm + +Although each Durable Object can only have one alarm set at a time, you can manage many scheduled and recurring events by storing your event schedule in storage and having the `alarm()` handler process due events, then reschedule itself for the next one. + +```js +import { DurableObject } from "cloudflare:workers"; + +export class AgentServer extends DurableObject { + // Schedule a one-time or recurring event + async scheduleEvent(id, runAt, repeatMs = null) { + await this.ctx.storage.put(`event:${id}`, { id, runAt, repeatMs }); + const currentAlarm = await this.ctx.storage.getAlarm(); + if (!currentAlarm || runAt < currentAlarm) { + await this.ctx.storage.setAlarm(runAt); + } + } + + async alarm() { + const now = Date.now(); + const events = await this.ctx.storage.list({ prefix: "event:" }); + let nextAlarm = null; + + for (const [key, event] of events) { + if (event.runAt <= now) { + await this.processEvent(event); + if (event.repeatMs) { + event.runAt = now + event.repeatMs; + await this.ctx.storage.put(key, event); + } else { + await this.ctx.storage.delete(key); + } + } + // Track the next event time + if (event.runAt > now && (!nextAlarm || event.runAt < nextAlarm)) { + nextAlarm = event.runAt; + } + } + + if (nextAlarm) await this.ctx.storage.setAlarm(nextAlarm); + } + + async processEvent(event) { + // Your event handling logic here + } +} +``` + +## Storage methods + +### `getAlarm` + +- getAlarm(): + + - If there is an alarm set, then return the currently set alarm time as the number of milliseconds elapsed since the UNIX epoch. Otherwise, return `null`. + + - If `getAlarm` is called while an [`alarm`](/durable-objects/api/alarms/#alarm) is already running, it returns `null` unless `setAlarm` has also been called since the alarm handler started running. + +### `setAlarm` + +- setAlarm(scheduledTimeMs ) : + + - Set the time for the alarm to run. Specify the time as the number of milliseconds elapsed since the UNIX epoch. + - If you call `setAlarm` when there is already one scheduled, it will override the existing alarm. + +:::caution[Calling `setAlarm` inside the constructor] +If you wish to call `setAlarm` inside the constructor of a Durable Object, ensure that you are first checking whether an alarm has already been set. + +This is due to the fact that, if the Durable Object wakes up after being inactive, the constructor is invoked before the [`alarm` handler](/durable-objects/api/alarms/#alarm). Therefore, if the constructor calls `setAlarm`, it could interfere with the next alarm which has already been set. +::: + +### `deleteAlarm` + +- `deleteAlarm()`: + + - Unset the alarm if there is a currently set alarm. + + - Calling `deleteAlarm()` inside the `alarm()` handler may prevent retries on a best-effort basis, but is not guaranteed. + +## Handler methods + +### `alarm` + +- alarm(alarmInfo ): + + - Called by the system when a scheduled alarm time is reached. + + - The optional parameter `alarmInfo` object has two properties: + + - `retryCount` : The number of times this alarm event has been retried. + - `isRetry` : A boolean value to indicate if the alarm has been retried. This value is `true` if this alarm event is a retry. + + - Only one instance of `alarm()` will ever run at a given time per Durable Object instance. + - The `alarm()` handler has guaranteed at-least-once execution and will be retried upon failure using exponential backoff, starting at 2 second delays for up to 6 retries. This only applies to the most recent `setAlarm()` call. Retries will be performed if the method fails with an uncaught exception. + + - This method can be `async`. + +:::note[Catching exceptions in alarm handlers] + +Because alarms are only retried up to 6 times on error, it's recommended to catch any exceptions inside your `alarm()` handler and schedule a new alarm before returning if you want to make sure your alarm handler will be retried indefinitely. Otherwise, a sufficiently long outage in a downstream service that you depend on or a bug in your code that goes unfixed for hours can exhaust the limited number of retries, causing the alarm to not be re-run in the future until the next time you call `setAlarm`. + +::: + +## Example + +This example shows how to both set alarms with the `setAlarm(timestamp)` method and handle alarms with the `alarm()` handler within your Durable Object. + +- The `alarm()` handler will be called once every time an alarm fires. +- If an unexpected error terminates the Durable Object, the `alarm()` handler may be re-instantiated on another machine. +- Following a short delay, the `alarm()` handler will run from the beginning on the other machine. + + + + + +```js +import { DurableObject } from "cloudflare:workers"; + +export default { + async fetch(request, env) { + return await env.ALARM_EXAMPLE.getByName("foo").fetch(request); + }, +}; + +const SECONDS = 1000; + +export class AlarmExample extends DurableObject { + constructor(ctx, env) { + super(ctx, env); + this.storage = ctx.storage; + } + async fetch(request) { + // If there is no alarm currently set, set one for 10 seconds from now + let currentAlarm = await this.storage.getAlarm(); + if (currentAlarm == null) { + this.storage.setAlarm(Date.now() + 10 * SECONDS); + } + } + async alarm() { + // The alarm handler will be invoked whenever an alarm fires. + // You can use this to do work, read from the Storage API, make HTTP calls + // and set future alarms to run using this.storage.setAlarm() from within this handler. + } +} +``` + + + + + +```python +import time + +from workers import DurableObject, WorkerEntrypoint + +class Default(WorkerEntrypoint): + async def fetch(self, request): + return await self.env.ALARM_EXAMPLE.getByName("foo").fetch(request) + +SECONDS = 1000 + +class AlarmExample(DurableObject): + def __init__(self, ctx, env): + super().__init__(ctx, env) + self.storage = ctx.storage + + async def fetch(self, request): + # If there is no alarm currently set, set one for 10 seconds from now + current_alarm = await self.storage.getAlarm() + if current_alarm is None: + self.storage.setAlarm(int(time.time() * 1000) + 10 * SECONDS) + + async def alarm(self): + # The alarm handler will be invoked whenever an alarm fires. + # You can use this to do work, read from the Storage API, make HTTP calls + # and set future alarms to run using self.storage.setAlarm() from within this handler. + pass +``` + + + + + +The following example shows how to use the `alarmInfo` property to identify if the alarm event has been attempted before. + + + + + +```js +class MyDurableObject extends DurableObject { + async alarm(alarmInfo) { + if (alarmInfo?.retryCount != 0) { + console.log( + "This alarm event has been attempted ${alarmInfo?.retryCount} times before.", + ); + } + } +} +``` + + + + + +```python +class MyDurableObject(DurableObject): + async def alarm(self, alarm_info): + if alarm_info and alarm_info.get('retryCount', 0) != 0: + print(f"This alarm event has been attempted {alarm_info.get('retryCount')} times before.") +``` + + + + + +## Related resources + +- Understand how to [use the Alarms API](/durable-objects/examples/alarms-api/) in an end-to-end example. +- Read the [Durable Objects alarms announcement blog post](https://blog.cloudflare.com/durable-objects-alarms/). +- Review the [Storage API](/durable-objects/api/sqlite-storage-api/) documentation for Durable Objects. diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/api/state.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/api/state.md new file mode 100644 index 0000000..2c9675b --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/api/state.md @@ -0,0 +1,369 @@ +--- +title: Durable Object State +description: API reference for DurableObjectState, which controls concurrency, WebSocket attachment, and storage access. +pcx_content_type: concept +sidebar: + order: 5 +products: + - durable-objects +--- + +import { Tabs, TabItem, GlossaryTooltip, Type, MetaInfo } from "~/components"; + +## Description + +The `DurableObjectState` interface is accessible as an instance property on the Durable Object class. This interface encapsulates methods that modify the state of a Durable Object, for example which WebSockets are attached to a Durable Object or how the runtime should handle concurrent Durable Object requests. + +The `DurableObjectState` interface is different from the Storage API in that it does not have top-level methods which manipulate persistent application data. These methods are instead encapsulated in the [`DurableObjectStorage`](/durable-objects/api/sqlite-storage-api/) interface and accessed by [`DurableObjectState::storage`](/durable-objects/api/state/#storage). + + + +```js +import { DurableObject } from "cloudflare:workers"; + +// Durable Object +export class MyDurableObject extends DurableObject { + // DurableObjectState is accessible via the ctx instance property + constructor(ctx, env) { + super(ctx, env); + } + ... +} +``` + + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + MY_DURABLE_OBJECT: DurableObjectNamespace; +} + +// Durable Object +export class MyDurableObject extends DurableObject { + // DurableObjectState is accessible via the ctx instance property + constructor(ctx: DurableObjectState, env: Env) { + super(ctx, env); + } + ... +} +``` + + + + + +```python +from workers import DurableObject + +# Durable Object +class MyDurableObject(DurableObject): + # DurableObjectState is accessible via the ctx instance property + def __init__(self, ctx, env): + super().__init__(ctx, env) + # ... +``` + + + + + +## Methods and Properties + +### `exports` + +Contains loopback bindings to the Worker's own top-level exports. This has exactly the same meaning as [`ExecutionContext`'s `ctx.exports`](/workers/runtime-apis/context/#exports). + +### `waitUntil` + +`waitUntil` is available on `DurableObjectState` for API compatibility with [Workers Runtime APIs](/workers/runtime-apis/context/#waituntil). + +:::note[`waitUntil` has no effect in Durable Objects] + +Unlike in Workers, `waitUntil` has no effect in Durable Objects. It does not extend the lifetime of a Durable Object or affect when a request or RPC completes. + +Durable Objects automatically remain active as long as there is ongoing work or pending I/O, so `waitUntil` is not needed. Refer to [Lifecycle of a Durable Object](/durable-objects/concepts/durable-object-lifecycle/) for more information. +::: + +#### Parameters + +- A required promise of any type. + +#### Return values + +- None. + +### `blockConcurrencyWhile` + +`blockConcurrencyWhile` executes an async callback while blocking any other events from being delivered to the Durable Object until the callback completes. This method guarantees ordering and prevents concurrent requests. All events that were not explicitly initiated as part of the callback itself will be blocked. Once the callback completes, all other events will be delivered. + +- `blockConcurrencyWhile` is commonly used within the constructor of the Durable Object class to enforce initialization to occur before any requests are delivered. +- Another use case is executing `async` operations based on the current state of the Durable Object and using `blockConcurrencyWhile` to prevent that state from changing while yielding the event loop. +- If the callback throws an exception, the object will be terminated and reset. This ensures that the object cannot be left stuck in an uninitialized state if something fails unexpectedly. +- To avoid this behavior, enclose the body of your callback in a `try...catch` block to ensure it cannot throw an exception. + +To help mitigate deadlocks there is a 30 second timeout applied when executing the callback. If this timeout is exceeded, the Durable Object will be reset. It is best practice to have the callback do as little work as possible to improve overall request throughput to the Durable Object. + +:::note[When to use `blockConcurrencyWhile`] + +Use `blockConcurrencyWhile` in the constructor to run schema migrations or initialize state before any requests are processed. This ensures your Durable Object is fully ready before handling traffic. + +For regular request handling, you rarely need `blockConcurrencyWhile`. SQLite storage operations are synchronous and do not yield the event loop, so they execute atomically without it. For asynchronous KV storage operations, input gates already prevent other requests from interleaving during storage calls. + +Reserve `blockConcurrencyWhile` outside the constructor for cases where you make external async calls (such as `fetch()`) and cannot tolerate state changes while the event loop yields. + +::: + + + + + +```js +// Durable Object +export class MyDurableObject extends DurableObject { + initialized = false; + + constructor(ctx, env) { + super(ctx, env); + + // blockConcurrencyWhile will ensure that initialized will always be true + this.ctx.blockConcurrencyWhile(async () => { + this.initialized = true; + }); + } + ... +} +``` + + + + + +```python +# Durable Object +class MyDurableObject(DurableObject): + def __init__(self, ctx, env): + super().__init__(ctx, env) + self.initialized = False + + # blockConcurrencyWhile will ensure that initialized will always be true + async def set_initialized(): + self.initialized = True + self.ctx.blockConcurrencyWhile(set_initialized) + # ... +``` + + + + + +#### Parameters + +- A required callback which returns a `Promise`. + +#### Return values + +- A `Promise` returned by the callback. + +### `acceptWebSocket` + +`acceptWebSocket` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected. + +`acceptWebSocket` adds a WebSocket to the set of WebSockets attached to the Durable Object. Once called, any incoming messages will be delivered by calling the Durable Object's `webSocketMessage` handler, and `webSocketClose` will be invoked upon disconnect. After calling `acceptWebSocket`, the WebSocket is accepted and its `send` and `close` methods can be used. + +The [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api) takes the place of the standard [WebSockets API](/workers/runtime-apis/websockets/). Therefore, `ws.accept` must not have been called separately and `ws.addEventListener` method will not receive events as they will instead be delivered to the Durable Object. + +The WebSocket Hibernation API permits a maximum of 32,768 WebSocket connections per Durable Object, but the CPU and memory usage of a given workload may further limit the practical number of simultaneous connections. + +#### Parameters + +- A required `WebSocket` with name `ws`. +- An optional `Array` of associated tags. Tags can be used to retrieve WebSockets via [`DurableObjectState::getWebSockets`](/durable-objects/api/state/#getwebsockets). Each tag is a maximum of 256 characters and there can be at most 10 tags associated with a WebSocket. + +#### Return values + +- None. + +### `getWebSockets` + +`getWebSockets` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected. + +`getWebSockets` returns an `Array` which is the set of WebSockets attached to the Durable Object. An optional tag argument can be used to filter the list according to tags supplied when calling [`DurableObjectState::acceptWebSocket`](/durable-objects/api/state/#acceptwebsocket). + +:::note[`waitUntil` is not necessary] + +Disconnected WebSockets are not returned by this method, but `getWebSockets` may still return WebSockets even after `ws.close` has been called. For example, if the server-side WebSocket sends a close, but does not receive one back (and has not detected a disconnect from the client), then the connection is in the `CLOSING` readyState. The client might send more messages, so the WebSocket is technically not disconnected. + +With the [`web_socket_auto_reply_to_close`](/workers/configuration/compatibility-flags/#websocket-auto-reply-to-close) compatibility flag (enabled by default on compatibility dates on or after `2026-04-07`), the runtime automatically completes the close handshake, so WebSockets transition from `CLOSING` to `CLOSED` much faster and are less likely to be observed in the `CLOSING` state. + +::: + +#### Parameters + +- An optional tag of type `string`. + +#### Return values + +- An `Array`. + +### `setWebSocketAutoResponse` + +`setWebSocketAutoResponse` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected. + +`setWebSocketAutoResponse` sets an automatic response, auto-response, for the request provided for all WebSockets attached to the Durable Object. If a request is received matching the provided request then the auto-response will be returned without waking WebSockets in hibernation and incurring billable duration charges. + +`setWebSocketAutoResponse` is a common alternative to setting up a server for static ping/pong messages because this can be handled without waking hibernating WebSockets. + +#### Parameters + +- An optional `WebSocketRequestResponsePair(request string, response string)` enabling any WebSocket accepted via [`DurableObjectState::acceptWebSocket`](/durable-objects/api/state/#acceptwebsocket) to automatically reply to the provided response when it receives the provided request. Both request and response are limited to 2,048 characters each. If the parameter is omitted, any previously set auto-response configuration will be removed. [`DurableObjectState::getWebSocketAutoResponseTimestamp`](/durable-objects/api/state/#getwebsocketautoresponsetimestamp) will still reflect the last timestamp that an auto-response was sent. + +#### Return values + +- None. + +### `getWebSocketAutoResponse` + +`getWebSocketAutoResponse` returns the `WebSocketRequestResponsePair` object last set by [`DurableObjectState::setWebSocketAutoResponse`](/durable-objects/api/state/#setwebsocketautoresponse), or null if not auto-response has been set. + +:::note[inspect `WebSocketRequestResponsePair`] + +`WebSocketRequestResponsePair` can be inspected further by calling `getRequest` and `getResponse` methods. + +::: + +#### Parameters + +- None. + +#### Return values + +- A `WebSocketRequestResponsePair` or null. + +### `getWebSocketAutoResponseTimestamp` + +`getWebSocketAutoResponseTimestamp` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected. + +`getWebSocketAutoResponseTimestamp` gets the most recent `Date` on which the given WebSocket sent an auto-response, or null if the given WebSocket never sent an auto-response. + +#### Parameters + +- A required `WebSocket`. + +#### Return values + +- A `Date` or null. + +### `setHibernatableWebSocketEventTimeout` + +`setHibernatableWebSocketEventTimeout` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected. + +`setHibernatableWebSocketEventTimeout` sets the maximum amount of time in milliseconds that a WebSocket event can run for. + +If no parameter or a parameter of `0` is provided and a timeout has been previously set, then the timeout will be unset. The maximum value of timeout is 604,800,000 ms (7 days). + +#### Parameters + +- An optional `number`. + +#### Return values + +- None. + +### `getHibernatableWebSocketEventTimeout` + +`getHibernatableWebSocketEventTimeout` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected. + +`getHibernatableWebSocketEventTimeout` gets the currently set hibernatable WebSocket event timeout if one has been set via [`DurableObjectState::setHibernatableWebSocketEventTimeout`](/durable-objects/api/state/#sethibernatablewebsocketeventtimeout). + +#### Parameters + +- None. + +#### Return values + +- A number, or null if the timeout has not been set. + +### `getTags` + +`getTags` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected. + +`getTags` returns tags associated with a given WebSocket. This method throws an exception if the WebSocket has not been associated with the Durable Object via [`DurableObjectState::acceptWebSocket`](/durable-objects/api/state/#acceptwebsocket). + +#### Parameters + +- A required `WebSocket`. + +#### Return values + +- An `Array` of tags. + +### `abort` + +`abort` is used to forcibly reset a Durable Object. A JavaScript `Error` with the message passed as a parameter will be logged. This error is not able to be caught within the application code. + + + + + +```js +// Durable Object +export class MyDurableObject extends DurableObject { + constructor(ctx: DurableObjectState, env: Env) { + super(ctx, env); + } + + async sayHello() { + // Error: Hello, World! will be logged + this.ctx.abort("Hello, World!"); + } +} +``` + + + + + +```python +# Durable Object +class MyDurableObject(DurableObject): + def __init__(self, ctx, env): + super().__init__(ctx, env) + + async def say_hello(self): + # Error: Hello, World! will be logged + self.ctx.abort("Hello, World!") +``` + + + + + +:::caution[Not available in local development] + +`abort` is not available in local development with the `wrangler dev` CLI command. + +::: + +#### Parameters + +- An optional `string` . + +#### Return values + +- None. + +## Properties + +### `id` + +`id` is a readonly property of type `DurableObjectId` corresponding to the [`DurableObjectId`](/durable-objects/api/id) of the Durable Object. + +### `storage` + +`storage` is a readonly property of type `DurableObjectStorage` encapsulating the [Storage API](/durable-objects/api/sqlite-storage-api/). + +## Related resources + +- [Durable Objects: Easy, Fast, Correct - Choose Three](https://blog.cloudflare.com/durable-objects-easy-fast-correct-choose-three/). diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md new file mode 100644 index 0000000..cc4c0f5 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md @@ -0,0 +1,217 @@ +--- +title: Invoke methods +description: Call RPC methods or send fetch requests to Durable Objects using stubs from a Worker. +pcx_content_type: concept +tags: + - RPC +sidebar: + order: 2 +products: + - durable-objects +--- + +import { Render, Tabs, TabItem, GlossaryTooltip } from "~/components"; + +## Invoking methods on a Durable Object + +All new projects and existing projects with a compatibility date greater than or equal to [`2024-04-03`](/workers/configuration/compatibility-flags/#durable-object-stubs-and-service-bindings-support-rpc) should prefer to invoke [Remote Procedure Call (RPC)](/workers/runtime-apis/rpc/) methods defined on a Durable Object class. + +Projects requiring HTTP request/response flows or legacy projects can continue to invoke the `fetch()` handler on the Durable Object class. + +### Invoke RPC methods + +By writing a Durable Object class which inherits from the built-in type `DurableObject`, public methods on the Durable Objects class are exposed as [RPC methods](/workers/runtime-apis/rpc/), which you can call using a [DurableObjectStub](/durable-objects/api/stub) from a Worker. + +All RPC calls are [asynchronous](/workers/runtime-apis/rpc/lifecycle/), accept and return [serializable types](/workers/runtime-apis/rpc/), and [propagate exceptions](/workers/runtime-apis/rpc/error-handling/) to the caller without a stack trace. Refer to [Workers RPC](/workers/runtime-apis/rpc/) for complete details. + + + +:::note + +With RPC, the `DurableObject` superclass defines `ctx` and `env` as class properties. What was previously called `state` is now called `ctx` when you extend the `DurableObject` class. The name `ctx` is adopted rather than `state` for the `DurableObjectState` interface to be consistent between `DurableObject` and `WorkerEntrypoint` objects. + +::: + +Refer to [Build a Counter](/durable-objects/examples/build-a-counter/) for a complete example. + +### Invoking the `fetch` handler + +If your project is stuck on a compatibility date before [`2024-04-03`](/workers/configuration/compatibility-flags/#durable-object-stubs-and-service-bindings-support-rpc), or has the need to send a [`Request`](/workers/runtime-apis/request/) object and return a `Response` object, then you should send requests to a Durable Object via the fetch handler. + + + +```js +import { DurableObject } from "cloudflare:workers"; + +// Durable Object +export class MyDurableObject extends DurableObject { + constructor(ctx, env) { + super(ctx, env); + } + + async fetch(request) { + return new Response("Hello, World!"); + } +} + +// Worker +export default { + async fetch(request, env) { + // A stub is a client used to invoke methods on the Durable Object + const stub = env.MY_DURABLE_OBJECT.getByName("foo"); + + // Methods on the Durable Object are invoked via the stub + const response = await stub.fetch(request); + + return response; + }, +}; +``` + + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + MY_DURABLE_OBJECT: DurableObjectNamespace; +} + +// Durable Object +export class MyDurableObject extends DurableObject { + constructor(ctx: DurableObjectState, env: Env) { + super(ctx, env); + } + + async fetch(request: Request): Promise { + return new Response("Hello, World!"); + } +} + +// Worker +export default { + async fetch(request, env) { + // A stub is a client used to invoke methods on the Durable Object + const stub = env.MY_DURABLE_OBJECT.getByName("foo"); + + // Methods on the Durable Object are invoked via the stub + const response = await stub.fetch(request); + + return response; + }, +} satisfies ExportedHandler; +``` + + + +The `URL` associated with the [`Request`](/workers/runtime-apis/request/) object passed to the `fetch()` handler of your Durable Object must be a well-formed URL, but does not have to be a publicly-resolvable hostname. + +Without RPC, customers frequently construct requests which corresponded to private methods on the Durable Object and dispatch requests from the `fetch` handler. RPC is obviously more ergonomic in this example. + + + +```js +import { DurableObject } from "cloudflare:workers"; + +// Durable Object +export class MyDurableObject extends DurableObject { + constructor(ctx: DurableObjectState, env: Env) { + super(ctx, env); + } + + private hello(name) { + return new Response(`Hello, ${name}!`); + } + + private goodbye(name) { + return new Response(`Goodbye, ${name}!`); + } + + async fetch(request) { + const url = new URL(request.url); + let name = url.searchParams.get("name"); + if (!name) { + name = "World"; + } + + switch (url.pathname) { + case "/hello": + return this.hello(name); + case "/goodbye": + return this.goodbye(name); + default: + return new Response("Bad Request", { status: 400 }); + } + } +} + +// Worker +export default { + async fetch(_request, env, _ctx) { + // A stub is a client used to invoke methods on the Durable Object + const stub = env.MY_DURABLE_OBJECT.getByName("foo"); + + // Invoke the fetch handler on the Durable Object stub + let response = await stub.fetch("http://do/hello?name=World"); + + return response; + }, +}; +``` + + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + MY_DURABLE_OBJECT: DurableObjectNamespace; +} + +// Durable Object +export class MyDurableObject extends DurableObject { + constructor(ctx: DurableObjectState, env: Env) { + super(ctx, env); + } + + private hello(name: string) { + return new Response(`Hello, ${name}!`); + } + + private goodbye(name: string) { + return new Response(`Goodbye, ${name}!`); + } + + async fetch(request: Request): Promise { + const url = new URL(request.url); + let name = url.searchParams.get("name"); + if (!name) { + name = "World"; + } + + switch (url.pathname) { + case "/hello": + return this.hello(name); + case "/goodbye": + return this.goodbye(name); + default: + return new Response("Bad Request", { status: 400 }); + } + } +} + +// Worker +export default { + async fetch(_request, env, _ctx) { + // A stub is a client used to invoke methods on the Durable Object + const stub = env.MY_DURABLE_OBJECT.getByName("foo"); + + // Invoke the fetch handler on the Durable Object stub + let response = await stub.fetch("http://do/hello?name=World"); + + return response; + }, +} satisfies ExportedHandler; +``` + + diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md new file mode 100644 index 0000000..6a0f731 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md @@ -0,0 +1,1581 @@ +--- +title: Rules of Durable Objects +description: Design guidelines for building correct and effective Durable Objects applications, covering when and how to use them. +pcx_content_type: concept +sidebar: + order: 1 +products: + - durable-objects +--- + +import { WranglerConfig, TypeScriptExample, Render } from "~/components"; + +Durable Objects provide a powerful primitive for building stateful, coordinated applications. Each Durable Object is a single-threaded, globally-unique instance with its own persistent storage. Understanding how to design around these properties is essential for building effective applications. + +This is a guidebook on how to build more effective and correct Durable Object applications. + +## When to use Durable Objects + +### Use Durable Objects for stateful coordination, not stateless request handling + +Workers are stateless functions: each request may run on a different instance, in a different location, with no shared memory between requests. Durable Objects are stateful compute: each instance has a unique identity, runs in a single location, and maintains state across requests. + +Use Durable Objects when you need: + +- **Coordination** — Multiple clients need to interact with shared state (chat rooms, multiplayer games, collaborative documents) +- **Strong consistency** — Operations must be serialized to avoid race conditions (inventory management, booking systems, turn-based games) +- **Per-entity storage** — Each user, tenant, or resource needs its own isolated database (multi-tenant SaaS, per-user data) +- **Persistent connections** — Long-lived WebSocket connections that survive across requests (real-time notifications, live updates) +- **Scheduled work per entity** — Each entity needs its own timer or scheduled task (subscription renewals, game timeouts) + +Use plain Workers when you need: + +- **Stateless request handling** — API endpoints, proxies, or transformations with no shared state +- **Maximum global distribution** — Requests should be handled at the nearest edge location +- **High fan-out** — Each request is independent and can be processed in parallel + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + BOOKING: DurableObjectNamespace; +} + +// ✅ Good use of Durable Objects: Seat booking requires coordination +// All booking requests for a venue must be serialized to prevent double-booking +export class SeatBooking extends DurableObject { +async bookSeat( +seatId: string, +userId: string +): Promise<{ success: boolean; message: string }> { +// Check if seat is already booked +const existing = this.ctx.storage.sql +.exec<{ user_id: string }>( +"SELECT user_id FROM bookings WHERE seat_id = ?", +seatId +) +.toArray(); + + if (existing.length > 0) { + return { success: false, message: "Seat already booked" }; + } + + // Book the seat - this is safe because Durable Objects are single-threaded + this.ctx.storage.sql.exec( + "INSERT INTO bookings (seat_id, user_id, booked_at) VALUES (?, ?, ?)", + seatId, + userId, + Date.now() + ); + + return { success: true, message: "Seat booked successfully" }; + } +} + +export default { + async fetch(request: Request, env: Env): Promise { + const url = new URL(request.url); + const eventId = url.searchParams.get("event") ?? "default"; + + // Route to a Durable Object by event ID + // All bookings for the same event go to the same instance + const id = env.BOOKING.idFromName(eventId); + const booking = env.BOOKING.get(id); + + const { seatId, userId } = await request.json<{ + seatId: string; + userId: string; + }>(); + const result = await booking.bookSeat(seatId, userId); + + return Response.json(result, { + status: result.success ? 200 : 409, + }); + }, +}; +``` + + +A common pattern is to use Workers as the stateless entry point that routes requests to Durable Objects when coordination is needed. The Worker handles authentication, validation, and response formatting, while the Durable Object handles the stateful logic. + +## Design and sharding + +### Model your Durable Objects around your "atom" of coordination + +The most important design decision is choosing what each Durable Object represents. Create one Durable Object per logical unit that needs coordination: a chat room, a game session, a document, a user's data, or a tenant's workspace. + +This is the key insight that makes Durable Objects powerful. Instead of a shared database with locks, each "atom" of your application gets its own single-threaded execution environment with private storage. + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + CHAT_ROOM: DurableObjectNamespace; +} + +// Each chat room is its own Durable Object instance +export class ChatRoom extends DurableObject { + async sendMessage(userId: string, message: string) { + // All messages to this room are processed sequentially by this single instance. + // No race conditions, no distributed locks needed. + this.ctx.storage.sql.exec( + "INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?)", + userId, + message, + Date.now() + ); + } +} + +export default { + async fetch(request: Request, env: Env): Promise { + const url = new URL(request.url); + const roomId = url.searchParams.get("room") ?? "lobby"; + + // Each room ID maps to exactly one Durable Object instance globally + const id = env.CHAT_ROOM.idFromName(roomId); + const stub = env.CHAT_ROOM.get(id); + + await stub.sendMessage("user-123", "Hello, room!"); + return new Response("Message sent"); + }, +}; +``` + + + +:::note + +If you have global application or user configuration that you need to access frequently (on every request), consider using [Workers KV](/kv/) instead. + +::: + +Do not create a single "global" Durable Object that handles all requests: + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + CHAT_ROOM: DurableObjectNamespace; +} + +// 🔴 Bad: A single Durable Object handling ALL chat rooms +export class ChatRoom extends DurableObject { +async sendMessage(roomId: string, userId: string, message: string) { +// All messages for ALL rooms go through this single instance. +// This becomes a bottleneck as traffic grows. +this.ctx.storage.sql.exec( +"INSERT INTO messages (room_id, user_id, content) VALUES (?, ?, ?)", +roomId, +userId, +message +); +} +} + +export default { + async fetch(request: Request, env: Env): Promise { + // 🔴 Bad: Always using the same ID means one global instance + const id = env.CHAT_ROOM.idFromName("global"); + const stub = env.CHAT_ROOM.get(id); + + await stub.sendMessage("room-123", "user-456", "Hello!"); + return new Response("Sent"); + }, +}; + +``` + + +### Message throughput limits + +A single Durable Object can handle approximately **500-1,000 requests per second** for simple operations. This limit varies based on the work performed per request: + +| Operation type | Throughput | +|----------------|------------| +| Simple pass-through (minimal parsing) | ~1,000 req/sec | +| Moderate processing (JSON parsing, validation) | ~500-750 req/sec | +| Complex operations (transformation, storage writes) | ~200-500 req/sec | + +When modeling your "atom," factor in the expected request rate. If your use case exceeds these limits, shard your workload across multiple Durable Objects. + +For example, consider a real-time game with 50,000 concurrent players sending 10 updates per second. This generates 500,000 requests per second total. You would need 500-1,000 game session Durable Objects—not one global coordinator. + +Calculate your sharding requirements: + +``` + +Required DOs = (Total requests/second) / (Requests per DO capacity) + +``` + +### Use deterministic IDs for predictable routing + +Use `getByName()` with meaningful, deterministic strings for consistent routing. The same input always produces the same Durable Object ID, ensuring requests for the same logical entity always reach the same instance. + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + GAME_SESSION: DurableObjectNamespace; +} + +export class GameSession extends DurableObject { + async join(playerId: string) { + // Game logic here + } +} + +export default { + async fetch(request: Request, env: Env): Promise { + const url = new URL(request.url); + const gameId = url.searchParams.get("game"); + + if (!gameId) { + return new Response("Missing game ID", { status: 400 }); + } + + // ✅ Good: Deterministic ID from a meaningful string + // All requests for "game-abc123" go to the same Durable Object + const stub = env.GAME_SESSION.getByName(gameId); + + await stub.join("player-xyz"); + return new Response("Joined game"); + }, +}; +``` + + + +Creating a stub does not instantiate or wake up the Durable Object. The Durable Object is only activated when you call a method on the stub. + +Use `newUniqueId()` only when you need a new, random instance and will store the mapping externally: + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + GAME_SESSION: DurableObjectNamespace; +} + +export class GameSession extends DurableObject { + async join(playerId: string) { + // Game logic here + } +} + +export default { + async fetch(request: Request, env: Env): Promise { + // newUniqueId() creates a random ID - useful when creating new instances + // You must store this ID somewhere (e.g., D1) to find it again later + const id = env.GAME_SESSION.newUniqueId(); + const stub = env.GAME_SESSION.get(id); + + // Store the mapping: gameCode -> id.toString() + // await env.DB.prepare("INSERT INTO games (code, do_id) VALUES (?, ?)").bind(gameCode, id.toString()).run(); + + return Response.json({ gameId: id.toString() }); + }, +}; + +``` + + +### Use parent-child relationships for related entities + +Do not put all your data in a single Durable Object. When you have hierarchical data (workspaces containing projects, game servers managing matches), create separate child Durable Objects for each entity. The parent coordinates and tracks children, while children handle their own state independently. + +This enables parallelism: operations on different children can happen concurrently, while each child maintains its own single-threaded consistency ([read more about this pattern](/reference-architecture/diagrams/storage/durable-object-control-data-plane-pattern/)). + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + GAME_SERVER: DurableObjectNamespace; + GAME_MATCH: DurableObjectNamespace; +} + +// Parent: Coordinates matches, but doesn't store match data +export class GameServer extends DurableObject { + async createMatch(matchName: string): Promise { + const matchId = crypto.randomUUID(); + + // Store reference to the child in parent's database + this.ctx.storage.sql.exec( + "INSERT INTO matches (id, name, created_at) VALUES (?, ?, ?)", + matchId, + matchName, + Date.now() + ); + + // Initialize the child Durable Object + const childId = this.env.GAME_MATCH.idFromName(matchId); + const childStub = this.env.GAME_MATCH.get(childId); + await childStub.init(matchId, matchName); + + return matchId; + } + + async listMatches(): Promise<{ id: string; name: string }[]> { + // Parent knows about all matches without waking up each child + const cursor = this.ctx.storage.sql.exec<{ id: string; name: string }>( + "SELECT id, name FROM matches ORDER BY created_at DESC" + ); + return cursor.toArray(); + } +} + +// Child: Handles its own game state independently +export class GameMatch extends DurableObject { + async init(matchId: string, matchName: string) { + await this.ctx.storage.put("matchId", matchId); + await this.ctx.storage.put("matchName", matchName); + this.ctx.storage.sql.exec(` + CREATE TABLE IF NOT EXISTS players ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + score INTEGER DEFAULT 0 + ) + `); + } + + async addPlayer(playerId: string, playerName: string) { + this.ctx.storage.sql.exec( + "INSERT INTO players (id, name, score) VALUES (?, ?, 0)", + playerId, + playerName + ); + } + + async updateScore(playerId: string, score: number) { + this.ctx.storage.sql.exec( + "UPDATE players SET score = ? WHERE id = ?", + score, + playerId + ); + } +} +``` + + + +With this pattern: + +- Listing matches only queries the parent (children stay hibernated) +- Different matches process player actions in parallel +- Each match has its own SQLite database for player data + +### Consider location hints for latency-sensitive applications + +By default, a Durable Object is created near the location of the first request it receives. For most applications, this works well. However, you can provide a location hint to influence where the Durable Object is created. + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + GAME_SESSION: DurableObjectNamespace; +} + +export class GameSession extends DurableObject { + // Game session logic +} + +export default { + async fetch(request: Request, env: Env): Promise { + const url = new URL(request.url); + const gameId = url.searchParams.get("game") ?? "default"; + const region = url.searchParams.get("region") ?? "wnam"; // Western North America + + // Provide a location hint for where this Durable Object should be created + const id = env.GAME_SESSION.idFromName(gameId); + const stub = env.GAME_SESSION.get(id, { locationHint: region }); + + return new Response("Connected to game session"); + }, +}; + +``` + + +Location hints are suggestions, not guarantees. Refer to [Data location](/durable-objects/reference/data-location/) for available regions and details. + +## Storage and state + +### Use SQLite-backed Durable Objects + +[SQLite storage](/durable-objects/api/sqlite-storage-api/) is the recommended storage backend for new Durable Objects. It provides a familiar SQL API for relational queries, indexes, transactions, and better performance than the legacy key-value storage backed Durable Objects. SQLite Durable Objects also support the KV API in synchronous and asynchronous versions. + +Configure your Durable Object class to use SQLite storage in your Wrangler configuration: + + +```jsonc +{ + "migrations": [ + { "tag": "v1", "new_sqlite_classes": ["ChatRoom"] } + ] +} +``` + + + +Then use the SQL API in your Durable Object: + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + CHAT_ROOM: DurableObjectNamespace; +} + +type Message = { +id: number; +user_id: string; +content: string; +created_at: number; +}; + +export class ChatRoom extends DurableObject { + constructor(ctx: DurableObjectState, env: Env) { + super(ctx, env); + + // Create tables on first instantiation + this.ctx.storage.sql.exec(` + CREATE TABLE IF NOT EXISTS messages ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id TEXT NOT NULL, + content TEXT NOT NULL, + created_at INTEGER NOT NULL + ) + `); + } + + async addMessage(userId: string, content: string) { + this.ctx.storage.sql.exec( + "INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?)", + userId, + content, + Date.now() + ); + } + + async getRecentMessages(limit: number = 50): Promise { + // Use type parameter for typed results + const cursor = this.ctx.storage.sql.exec( + "SELECT * FROM messages ORDER BY created_at DESC LIMIT ?", + limit + ); + return cursor.toArray(); + } +} + +``` + + +Refer to [Access Durable Objects storage](/durable-objects/best-practices/access-durable-objects-storage/) for more details on the SQL API. + +### Initialize storage and run migrations in the constructor + +Use `blockConcurrencyWhile()` in the constructor to run migrations and initialize state before any requests are processed. This ensures your schema is ready and prevents race conditions during initialization. + +:::note +`PRAGMA user_version` is not supported by Durable Objects SQLite storage. You must use an alternative approach to track your schema version. +::: + +For production applications, use a migration library that handles version tracking and execution automatically: + +- [`durable-utils`](https://github.com/lambrospetrou/durable-utils#sqlite-schema-migrations) — provides a `SQLSchemaMigrations` class that tracks executed migrations both in memory and in storage. +- [`@cloudflare/actors` storage utilities](https://github.com/cloudflare/actors/blob/main/packages/storage/src/sql-schema-migrations.ts) — a reference implementation of the same pattern used by the Cloudflare Actors framework. + +If you prefer not to use a library, you can track schema versions manually using a `_sql_schema_migrations` table. The following example demonstrates this approach: + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + CHAT_ROOM: DurableObjectNamespace; +} + +export class ChatRoom extends DurableObject { + constructor(ctx: DurableObjectState, env: Env) { + super(ctx, env); + + // blockConcurrencyWhile() ensures no requests are processed until this completes + ctx.blockConcurrencyWhile(async () => { + await this.migrate(); + }); + } + + private async migrate() { + // Create the migrations tracking table if it does not exist + this.ctx.storage.sql.exec(` + CREATE TABLE IF NOT EXISTS _sql_schema_migrations ( + id INTEGER PRIMARY KEY, + applied_at TEXT NOT NULL DEFAULT (datetime('now')) + ); + `); + + // Determine the current schema version + const version = + this.ctx.storage.sql + .exec<{ version: number }>( + "SELECT COALESCE(MAX(id), 0) as version FROM _sql_schema_migrations", + ) + .one().version; + + if (version < 1) { + this.ctx.storage.sql.exec(` + CREATE TABLE IF NOT EXISTS messages ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id TEXT NOT NULL, + content TEXT NOT NULL, + created_at INTEGER NOT NULL + ); + CREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at); + INSERT INTO _sql_schema_migrations (id) VALUES (1); + `); + } + + if (version < 2) { + // Future migration: add a new column + this.ctx.storage.sql.exec(` + ALTER TABLE messages ADD COLUMN edited_at INTEGER; + INSERT INTO _sql_schema_migrations (id) VALUES (2); + `); + } + } +} +``` + + + +### Understand the difference between in-memory state and persistent storage + +Durable Objects provide multiple state management layers, each with different characteristics: + +| Type | Speed | Persistence | Use Case | +| ---------------------------- | -------- | ---------------------------- | --------------------------- | +| In-memory (class properties) | Fastest | Lost on eviction or crash | Caching, active connections | +| SQLite storage | Fast | Durable across restarts | Primary data storage | +| External (R2, D1) | Variable | Durable, cross-DO accessible | Large files, shared data | + +In-memory state is **not preserved** if the Durable Object is evicted from memory due to inactivity, or if it crashes from an uncaught exception. Always persist important state to SQLite storage. + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + CHAT_ROOM: DurableObjectNamespace; +} + +type Message = { +id: number; +user_id: string; +content: string; +created_at: number; +}; + +export class ChatRoom extends DurableObject { + // In-memory cache - fast but NOT preserved across evictions or crashes + private messageCache: Message[] | null = null; + + async getRecentMessages(): Promise { + // Return from cache if available (only valid while DO is in memory) + if (this.messageCache !== null) { + return this.messageCache; + } + + // Otherwise, load from durable storage + const cursor = this.ctx.storage.sql.exec( + "SELECT * FROM messages ORDER BY created_at DESC LIMIT 100" + ); + this.messageCache = cursor.toArray(); + return this.messageCache; + } + + async addMessage(userId: string, content: string) { + // ✅ Always persist to durable storage first + this.ctx.storage.sql.exec( + "INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?)", + userId, + content, + Date.now() + ); + + // Then update the cache (if it exists) + // If the DO crashes here, the message is still saved in SQLite + this.messageCache = null; // Invalidate cache + } +} + +``` + + +:::caution + +If an uncaught exception occurs in your Durable Object, the runtime may terminate the instance. Any in-memory state will be lost, but SQLite storage remains intact. Always persist critical state to storage before performing operations that might fail. + +::: + +### Create indexes for frequently-queried columns + +Just like any database, indexes dramatically improve read performance for frequently-filtered columns. The cost is slightly more storage and marginally slower writes. + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + CHAT_ROOM: DurableObjectNamespace; +} + +export class ChatRoom extends DurableObject { + constructor(ctx: DurableObjectState, env: Env) { + super(ctx, env); + + ctx.blockConcurrencyWhile(async () => { + this.ctx.storage.sql.exec(` + CREATE TABLE IF NOT EXISTS messages ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id TEXT NOT NULL, + content TEXT NOT NULL, + created_at INTEGER NOT NULL + ); + + -- Index for queries filtering by user + CREATE INDEX IF NOT EXISTS idx_messages_user_id ON messages(user_id); + + -- Index for time-based queries (recent messages) + CREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at); + + -- Composite index for user + time queries + CREATE INDEX IF NOT EXISTS idx_messages_user_time ON messages(user_id, created_at); + `); + }); + } + + // This query benefits from idx_messages_user_time + async getUserMessages(userId: string, since: number) { + return this.ctx.storage.sql + .exec( + "SELECT * FROM messages WHERE user_id = ? AND created_at > ? ORDER BY created_at", + userId, + since + ) + .toArray(); + } +} +``` + + + +### Understand how input and output gates work + +While Durable Objects are single-threaded, JavaScript's `async`/`await` can allow multiple requests to interleave execution while a request waits for the result of an asynchronous operation. Cloudflare's runtime uses **input gates** and **output gates** to prevent data races and ensure correctness by default. + +**Input gates** block new events (incoming requests, fetch responses) while synchronous JavaScript execution is in progress. Awaiting async operations like `fetch()` or KV storage methods opens the input gate, allowing other requests to interleave. However, storage operations provide special protection: + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + COUNTER: DurableObjectNamespace; +} + +export class Counter extends DurableObject { + // This code is safe due to input gates + async increment(): Promise { + // While these storage operations execute, no other requests + // can interleave - input gate blocks new events + const value = (await this.ctx.storage.get("count")) ?? 0; + await this.ctx.storage.put("count", value + 1); + return value + 1; + } +} +``` + + +**Output gates** hold outgoing network messages (responses, fetch requests) until pending storage writes complete. This ensures clients never see confirmation of data that has not been persisted: + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + CHAT_ROOM: DurableObjectNamespace; +} + +export class ChatRoom extends DurableObject { + async sendMessage(userId: string, content: string): Promise { + // Write to storage - don't need to await for correctness + this.ctx.storage.sql.exec( + "INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?)", + userId, + content, + Date.now() + ); + + // This response is held by the output gate until the write completes. + // The client only receives "Message sent" after data is safely persisted. + return "Message sent"; + } +} + +``` + + +**Write coalescing:** Multiple storage writes without intervening `await` calls are automatically batched into a single atomic implicit transaction: + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + ACCOUNT: DurableObjectNamespace; +} + +export class Account extends DurableObject { + async transfer(fromId: string, toId: string, amount: number) { + // ✅ Good: These writes are coalesced into one atomic transaction + this.ctx.storage.sql.exec( + "UPDATE accounts SET balance = balance - ? WHERE id = ?", + amount, + fromId + ); + this.ctx.storage.sql.exec( + "UPDATE accounts SET balance = balance + ? WHERE id = ?", + amount, + toId + ); + this.ctx.storage.sql.exec( + "INSERT INTO transfers (from_id, to_id, amount, created_at) VALUES (?, ?, ?, ?)", + fromId, + toId, + amount, + Date.now() + ); + // All three writes commit together atomically + } + + // 🔴 Bad: await on KV operations breaks coalescing + async transferBrokenKV(fromId: string, toId: string, amount: number) { + const fromBalance = (await this.ctx.storage.get(`balance:${fromId}`)) ?? 0; + await this.ctx.storage.put(`balance:${fromId}`, fromBalance - amount); + // If the next write fails, the debit already committed! + const toBalance = (await this.ctx.storage.get(`balance:${toId}`)) ?? 0; + await this.ctx.storage.put(`balance:${toId}`, toBalance + amount); + } +} +``` + + + +For more details, see [Durable Objects: Easy, Fast, Correct — Choose three](https://blog.cloudflare.com/durable-objects-easy-fast-correct-choose-three/) and the [glossary](/durable-objects/reference/glossary/). + +### Avoid race conditions with non-storage I/O + +Input gates only protect during storage operations. Non-storage I/O like `fetch()` or writing to R2 allows other requests to interleave, which can cause race conditions: + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + PROCESSOR: DurableObjectNamespace; +} + +export class Processor extends DurableObject { + // ⚠️ Potential race condition: fetch() allows interleaving + async processItem(id: string) { + const item = await this.ctx.storage.get<{ status: string }>(`item:${id}`); + + if (item?.status === "pending") { + // During this fetch, other requests CAN execute and modify storage + const result = await fetch("https://api.example.com/process"); + + // Another request may have already processed this item! + await this.ctx.storage.put(`item:${id}`, { status: "completed" }); + } + } +} + +``` + + +To handle this, use optimistic locking (check-and-set) patterns: read a version number before the external call, then verify it has not changed before writing. + +:::note + +With the legacy KV storage backend, use the [`transaction()`](/durable-objects/api/sqlite-storage-api/#transaction) method for atomic read-modify-write operations across async boundaries. + +::: + +### Use `blockConcurrencyWhile()` sparingly + +The [`blockConcurrencyWhile()`](/durable-objects/api/state/#blockconcurrencywhile) method guarantees that no other events are processed until the provided callback completes, even if the callback performs asynchronous I/O. This is useful for operations that must be atomic, such as state initialization from storage in the constructor: + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + CHAT_ROOM: DurableObjectNamespace; +} + +export class ChatRoom extends DurableObject { + constructor(ctx: DurableObjectState, env: Env) { + super(ctx, env); + + // ✅ Good: Use blockConcurrencyWhile for one-time initialization + ctx.blockConcurrencyWhile(async () => { + this.ctx.storage.sql.exec(` + CREATE TABLE IF NOT EXISTS messages ( + id INTEGER PRIMARY KEY, + content TEXT + ) + `); + }); + } + + // 🔴 Bad: Don't use blockConcurrencyWhile on every request + async sendMessageSlow(content: string) { + await this.ctx.blockConcurrencyWhile(async () => { + this.ctx.storage.sql.exec( + "INSERT INTO messages (content) VALUES (?)", + content + ); + }); + // If this takes ~5ms, you're limited to ~200 requests/second + } + + // ✅ Good: Let output gates handle consistency + async sendMessageFast(content: string) { + this.ctx.storage.sql.exec( + "INSERT INTO messages (content) VALUES (?)", + content + ); + // Output gate ensures write completes before response is sent + // Other requests can be processed concurrently + } +} +``` + + + +Because `blockConcurrencyWhile()` blocks _all_ concurrency unconditionally, it significantly reduces throughput. If each call takes ~5ms, that individual Durable Object is limited to approximately 200 requests/second. Reserve it for initialization and migrations, not regular request handling. For normal operations, rely on input/output gates and write coalescing instead. + +For atomic read-modify-write operations during request handling, prefer [`transaction()`](/durable-objects/api/sqlite-storage-api/#transaction) over `blockConcurrencyWhile()`. Transactions provide atomicity for storage operations without blocking unrelated concurrent requests. + +:::caution + +Using `blockConcurrencyWhile()` across I/O operations (such as `fetch()`, KV, R2, or other external API calls) is an anti-pattern. This is equivalent to holding a lock across I/O in other languages or concurrency frameworks — it blocks all other requests while waiting for slow external operations, severely degrading throughput. Keep `blockConcurrencyWhile()` callbacks fast and limited to local storage operations. + +::: + +## Communication and API design + +### Use RPC methods instead of the `fetch()` handler + +Projects with a [compatibility date](/workers/configuration/compatibility-flags/) of `2024-04-03` or later should use RPC methods. RPC is more ergonomic, provides better type safety, and eliminates manual request/response parsing. + +Define public methods on your Durable Object class, and call them directly from stubs with full TypeScript support: + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + // Type parameter provides typed method calls on the stub + CHAT_ROOM: DurableObjectNamespace; +} + +type Message = { +id: number; +userId: string; +content: string; +createdAt: number; +}; + +export class ChatRoom extends DurableObject { + // Public methods are automatically exposed as RPC endpoints + async sendMessage(userId: string, content: string): Promise { + const createdAt = Date.now(); + const result = this.ctx.storage.sql.exec<{ id: number }>( + "INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?) RETURNING id", + userId, + content, + createdAt + ); + const { id } = result.one(); + return { id, userId, content, createdAt }; + } + + async getMessages(limit: number = 50): Promise { + const cursor = this.ctx.storage.sql.exec<{ + id: number; + user_id: string; + content: string; + created_at: number; + }>("SELECT * FROM messages ORDER BY created_at DESC LIMIT ?", limit); + + return cursor.toArray().map((row) => ({ + id: row.id, + userId: row.user_id, + content: row.content, + createdAt: row.created_at, + })); + } +} + +export default { + async fetch(request: Request, env: Env): Promise { + const url = new URL(request.url); + const roomId = url.searchParams.get("room") ?? "lobby"; + + const id = env.CHAT_ROOM.idFromName(roomId); + // stub is typed as DurableObjectStub + const stub = env.CHAT_ROOM.get(id); + + if (request.method === "POST") { + const { userId, content } = await request.json<{ + userId: string; + content: string; + }>(); + // Direct method call with full type checking + const message = await stub.sendMessage(userId, content); + return Response.json(message); + } + + // TypeScript knows getMessages() returns Promise + const messages = await stub.getMessages(100); + return Response.json(messages); + }, +}; + +``` + + +Refer to [Invoke methods](/durable-objects/best-practices/create-durable-object-stubs-and-send-requests/) for more details on RPC and the legacy `fetch()` handler. + +### Initialize Durable Objects explicitly with an `init()` method + +Durable Objects do not know their own name or ID from within. If your Durable Object needs to know its identity (for example, to store a reference to itself or to communicate with related objects), you must explicitly initialize it. + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + CHAT_ROOM: DurableObjectNamespace; +} + +export class ChatRoom extends DurableObject { + private roomId: string | null = null; + + // Call this after creating the Durable Object for the first time + async init(roomId: string, createdBy: string) { + // Check if already initialized + const existing = await this.ctx.storage.get("roomId"); + if (existing) { + return; // Already initialized + } + + // Store the identity + await this.ctx.storage.put("roomId", roomId); + await this.ctx.storage.put("createdBy", createdBy); + await this.ctx.storage.put("createdAt", Date.now()); + + // Cache in memory for this session + this.roomId = roomId; + } + + async getRoomId(): Promise { + if (this.roomId) { + return this.roomId; + } + + const stored = await this.ctx.storage.get("roomId"); + if (!stored) { + throw new Error("ChatRoom not initialized. Call init() first."); + } + + this.roomId = stored; + return stored; + } +} + +export default { + async fetch(request: Request, env: Env): Promise { + const url = new URL(request.url); + const roomId = url.searchParams.get("room") ?? "lobby"; + + const id = env.CHAT_ROOM.idFromName(roomId); + const stub = env.CHAT_ROOM.get(id); + + // Initialize on first access + await stub.init(roomId, "system"); + + return new Response(`Room ${await stub.getRoomId()} ready`); + }, +}; +``` + + + +### Always `await` RPC calls + +When calling methods on a Durable Object stub, always use `await`. Unawaited calls create dangling promises, causing errors to be swallowed and return values to be lost. + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + CHAT_ROOM: DurableObjectNamespace; +} + +export class ChatRoom extends DurableObject { + async sendMessage(userId: string, content: string): Promise { + const result = this.ctx.storage.sql.exec<{ id: number }>( + "INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?) RETURNING id", + userId, + content, + Date.now() + ); + return result.one().id; + } +} + +export default { + async fetch(request: Request, env: Env): Promise { + const id = env.CHAT_ROOM.idFromName("lobby"); + const stub = env.CHAT_ROOM.get(id); + + // 🔴 Bad: Not awaiting the call + // The message ID is lost, and any errors are swallowed + stub.sendMessage("user-123", "Hello"); + + // ✅ Good: Properly awaited + const messageId = await stub.sendMessage("user-123", "Hello"); + + return Response.json({ messageId }); + }, +}; + +``` + + +## Error handling + +### Handle errors and use exception boundaries + +Uncaught exceptions in a Durable Object can leave it in an unknown state and may cause the runtime to terminate the instance. Wrap risky operations in `try...catch` blocks, and handle errors appropriately. + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + CHAT_ROOM: DurableObjectNamespace; +} + +export class ChatRoom extends DurableObject { + async processMessage(userId: string, content: string) { + // ✅ Good: Wrap risky operations in try...catch + try { + // Validate input before processing + if (!content || content.length > 10000) { + throw new Error("Invalid message content"); + } + + this.ctx.storage.sql.exec( + "INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?)", + userId, + content, + Date.now() + ); + + // External call that might fail + await this.notifySubscribers(content); + } catch (error) { + // Log the error for debugging + console.error("Failed to process message:", error); + + // Re-throw if it's a validation error (don't retry) + if (error instanceof Error && error.message.includes("Invalid")) { + throw error; + } + + // For transient errors, you might want to handle differently + throw error; + } + } + + private async notifySubscribers(content: string) { + // External notification logic + } +} +``` + + + +When calling Durable Objects from a Worker, errors may include `.retryable` and `.overloaded` properties indicating whether the operation can be retried. For transient failures, implement exponential backoff to avoid overwhelming the system. + +Refer to [Error handling](/durable-objects/best-practices/error-handling/) for details on error properties, retry strategies, and exponential backoff patterns. + +## WebSockets and real-time + +### Use the Hibernatable WebSockets API for cost efficiency + +The Hibernatable WebSockets API allows Durable Objects to sleep while maintaining WebSocket connections. This significantly reduces costs for applications with many idle connections. + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + CHAT_ROOM: DurableObjectNamespace; +} + +export class ChatRoom extends DurableObject { + async fetch(request: Request): Promise { + const url = new URL(request.url); + + if (url.pathname === "/websocket") { + // Check for WebSocket upgrade + if (request.headers.get("Upgrade") !== "websocket") { + return new Response("Expected WebSocket", { status: 400 }); + } + + const pair = new WebSocketPair(); + const [client, server] = Object.values(pair); + + // Accept the WebSocket with Hibernation API + this.ctx.acceptWebSocket(server); + + return new Response(null, { status: 101, webSocket: client }); + } + + return new Response("Not found", { status: 404 }); + } + + // Called when a message is received (even after hibernation) + async webSocketMessage(ws: WebSocket, message: string | ArrayBuffer) { + const data = typeof message === "string" ? message : "binary data"; + + // Broadcast to all connected clients + for (const client of this.ctx.getWebSockets()) { + if (client !== ws && client.readyState === WebSocket.OPEN) { + client.send(data); + } + } + } + + // Called when a WebSocket is closed + async webSocketClose( + ws: WebSocket, + code: number, + reason: string, + wasClean: boolean + ) { + // With web_socket_auto_reply_to_close (compat date >= 2026-04-07), the runtime + // auto-replies to Close frames. Calling close() is safe but no longer required. + ws.close(code, reason); + console.log(`WebSocket closed: ${code} ${reason}`); + } + + // Called when a WebSocket error occurs + async webSocketError(ws: WebSocket, error: unknown) { + console.error("WebSocket error:", error); + } +} + +``` + + +With the Hibernation API, your Durable Object can go to sleep when there is no active JavaScript execution, but WebSocket connections remain open. When a message arrives, the Durable Object wakes up automatically. + +Best practices: + +- The [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api) exposes `webSocketError`, `webSocketMessage`, and `webSocketClose` handlers for their respective WebSocket events. +- With the [`web_socket_auto_reply_to_close`](/workers/configuration/compatibility-flags/#websocket-auto-reply-to-close) compatibility flag (enabled by default on compatibility dates on or after `2026-04-07`), the runtime automatically completes the close handshake. Calling `ws.close()` in `webSocketClose` is still safe but no longer required. On older compatibility dates, you **must** call `ws.close()` to avoid `1006` abnormal closure errors. + +Refer to [WebSockets](/durable-objects/best-practices/websockets/) for more details. + +### Use `serializeAttachment()` to persist per-connection state + +WebSocket attachments let you store metadata for each connection that survives hibernation. Use this for user IDs, session tokens, or other per-connection data. + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + CHAT_ROOM: DurableObjectNamespace; +} + +type ConnectionState = { + userId: string; + username: string; + joinedAt: number; +}; + +export class ChatRoom extends DurableObject { + async fetch(request: Request): Promise { + const url = new URL(request.url); + + if (url.pathname === "/websocket") { + if (request.headers.get("Upgrade") !== "websocket") { + return new Response("Expected WebSocket", { status: 400 }); + } + + const userId = url.searchParams.get("userId") ?? "anonymous"; + const username = url.searchParams.get("username") ?? "Anonymous"; + + const pair = new WebSocketPair(); + const [client, server] = Object.values(pair); + + this.ctx.acceptWebSocket(server); + + // Store per-connection state that survives hibernation + const state: ConnectionState = { + userId, + username, + joinedAt: Date.now(), + }; + server.serializeAttachment(state); + + // Broadcast join message + this.broadcast(`${username} joined the chat`); + + return new Response(null, { status: 101, webSocket: client }); + } + + return new Response("Not found", { status: 404 }); + } + + async webSocketMessage(ws: WebSocket, message: string | ArrayBuffer) { + // Retrieve the connection state (works even after hibernation) + const state = ws.deserializeAttachment() as ConnectionState; + + const chatMessage = JSON.stringify({ + userId: state.userId, + username: state.username, + content: message, + timestamp: Date.now(), + }); + + this.broadcast(chatMessage); + } + + async webSocketClose(ws: WebSocket, code: number, reason: string) { + // With web_socket_auto_reply_to_close (compat date >= 2026-04-07), the runtime + // auto-replies to Close frames. Calling close() is safe but no longer required. + ws.close(code, reason); + const state = ws.deserializeAttachment() as ConnectionState; + this.broadcast(`${state.username} left the chat`); + } + + private broadcast(message: string) { + for (const client of this.ctx.getWebSockets()) { + if (client.readyState === WebSocket.OPEN) { + client.send(message); + } + } + } +} +``` + + + +## Scheduling and lifecycle + +### Use alarms for per-entity scheduled tasks + +Each Durable Object can schedule its own future work using the [Alarms API](/durable-objects/api/alarms/), allowing a Durable Object to execute background tasks on any interval without an incoming request, RPC call, or WebSocket message. + +Key points about alarms: + +- **`setAlarm(timestamp)`** schedules the `alarm()` handler to run at any time in the future (millisecond precision) +- **Alarms do not repeat automatically** — you must call `setAlarm()` again to schedule the next execution +- **Only schedule alarms when there is work to do** — avoid waking up every Durable Object on short intervals (seconds), as each alarm invocation incurs costs + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + GAME_MATCH: DurableObjectNamespace; +} + +export class GameMatch extends DurableObject { + async startGame(durationMs: number = 60000) { + await this.ctx.storage.put("gameStarted", Date.now()); + await this.ctx.storage.put("gameActive", true); + + // Schedule the game to end after the duration + await this.ctx.storage.setAlarm(Date.now() + durationMs); + } + + // Called when the alarm fires + async alarm(alarmInfo?: AlarmInvocationInfo) { + const isActive = await this.ctx.storage.get("gameActive"); + + if (!isActive) { + return; // Game was already ended + } + + // End the game + await this.ctx.storage.put("gameActive", false); + await this.ctx.storage.put("gameEnded", Date.now()); + + // Calculate final scores, notify players, etc. + try { + await this.calculateFinalScores(); + } catch (err) { + // If we're almost out of retries but still have work to do, schedule a new alarm + // rather than letting our retries run out to ensure we keep getting invoked. + if (alarmInfo && alarmInfo.retryCount >= 5) { + await this.ctx.storage.setAlarm(Date.now() + 30 * 1000); + return; + } + throw err; + } + + // Schedule the next alarm only if there's more work to do + // In this case, schedule cleanup in 24 hours + await this.ctx.storage.setAlarm(Date.now() + 24 * 60 * 60 * 1000); + } + + private async calculateFinalScores() { + // Game ending logic + } +} + +``` + + +### Make alarm handlers idempotent + +In rare cases, alarms may fire more than once. Your `alarm()` handler should be safe to run multiple times without causing issues. + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + SUBSCRIPTION: DurableObjectNamespace; +} + +export class Subscription extends DurableObject { + async alarm() { + // ✅ Good: Check state before performing the action + const lastRenewal = await this.ctx.storage.get("lastRenewal"); + const renewalPeriod = 30 * 24 * 60 * 60 * 1000; // 30 days + + // If we already renewed recently, don't do it again + if (lastRenewal && Date.now() - lastRenewal < renewalPeriod - 60000) { + console.log("Already renewed recently, skipping"); + return; + } + + // Perform the renewal + const success = await this.processRenewal(); + + if (success) { + // Record the renewal time + await this.ctx.storage.put("lastRenewal", Date.now()); + + // Schedule the next renewal + await this.ctx.storage.setAlarm(Date.now() + renewalPeriod); + } else { + // Retry in 1 hour + await this.ctx.storage.setAlarm(Date.now() + 60 * 60 * 1000); + } + } + + private async processRenewal(): Promise { + // Payment processing logic + return true; + } +} +``` + + + +### Clean up storage with `deleteAll()` + +To fully clear a Durable Object's storage, call `deleteAll()`. Simply deleting individual keys or dropping tables is not sufficient, as some internal metadata may remain. Workers with a compatibility date before [2026-02-24](/workers/configuration/compatibility-flags/#durable-object-deleteall-deletes-alarms) and an alarm set should delete the alarm first with `deleteAlarm()`. + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + CHAT_ROOM: DurableObjectNamespace; +} + +export class ChatRoom extends DurableObject { + async clearStorage() { + + // Delete all storage, including any set alarm + await this.ctx.storage.deleteAll(); + + // The Durable Object instance still exists, but with empty storage + // A subsequent request will find no data + } +} + +``` + + +### Design for unexpected shutdowns + + + +## Anti-patterns to avoid + +### Do not use a single Durable Object as a global singleton + +A single Durable Object handling all traffic becomes a bottleneck. While async operations allow request interleaving, all synchronous JavaScript execution is single-threaded, and storage operations provide serialization guarantees that limit throughput. + +A common mistake is using a Durable Object for global rate limiting or global counters. This funnels all traffic through a single instance: + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + RATE_LIMITER: DurableObjectNamespace; +} + +// 🔴 Bad: Global rate limiter - ALL requests go through one instance +export class RateLimiter extends DurableObject { + async checkLimit(ip: string): Promise { + const key = `rate:${ip}`; + const count = (await this.ctx.storage.get(key)) ?? 0; + await this.ctx.storage.put(key, count + 1); + return count < 100; + } +} + +// 🔴 Bad: Always using the same ID creates a global bottleneck +export default { + async fetch(request: Request, env: Env): Promise { + // Every single request to your application goes through this one DO + const limiter = env.RATE_LIMITER.get( + env.RATE_LIMITER.idFromName("global") + ); + + const ip = request.headers.get("CF-Connecting-IP") ?? "unknown"; + const allowed = await limiter.checkLimit(ip); + + if (!allowed) { + return new Response("Rate limited", { status: 429 }); + } + + return new Response("OK"); + }, +}; +``` + + + +This pattern does not scale. As traffic increases, the single Durable Object becomes a chokepoint. Instead, identify natural coordination boundaries in your application (per user, per room, per document) and create separate Durable Objects for each. + +## Testing and migrations + +### Test with Vitest and plan for class migrations + +Use `@cloudflare/vitest-pool-workers` for testing Durable Objects. The integration provides utilities for direct instance access. + + +```ts +import { env } from "cloudflare:workers"; +import { + runInDurableObject, + runDurableObjectAlarm, +} from "cloudflare:test"; +import { describe, it, expect } from "vitest"; + +describe("ChatRoom", () => { + +it("should send and retrieve messages", async () => { +const id = env.CHAT_ROOM.idFromName("test-room"); +const stub = env.CHAT_ROOM.get(id); + + // Call RPC methods directly on the stub + await stub.sendMessage("user-1", "Hello!"); + await stub.sendMessage("user-2", "Hi there!"); + + const messages = await stub.getMessages(10); + expect(messages).toHaveLength(2); + }); + + it("can access instance internals and trigger alarms", async () => { + const id = env.CHAT_ROOM.idFromName("test-room"); + const stub = env.CHAT_ROOM.get(id); + + // Access storage directly for verification + await runInDurableObject(stub, async (instance, state) => { + const count = state.storage.sql + .exec<{ count: number }>("SELECT COUNT(*) as count FROM messages") + .one(); + expect(count.count).toBe(2); + }); + + // Trigger alarms immediately without waiting + const alarmRan = await runDurableObjectAlarm(stub); + expect(alarmRan).toBe(false); // No alarm was scheduled + }); +}); + +``` + + +Configure Vitest in your `vitest.config.ts`: + +```ts +import { cloudflareTest } from "@cloudflare/vitest-pool-workers"; +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + plugins: [ + cloudflareTest({ + wrangler: { configPath: "./wrangler.jsonc" }, + }), + ], +}); +``` + +For schema changes, run migrations in the constructor using `blockConcurrencyWhile()`. For class renames or deletions, use Wrangler migrations: + + +```jsonc +{ + "migrations": [ + // Rename a class + { "tag": "v2", "renamed_classes": [{ "from": "OldChatRoom", "to": "ChatRoom" }] }, + // Delete a class (removes all data!) + { "tag": "v3", "deleted_classes": ["DeprecatedRoom"] } + ] +} +``` + + +Refer to [Durable Objects migrations](/durable-objects/reference/durable-objects-migrations/) for more details on class migrations, and [Testing with Durable Objects](/durable-objects/examples/testing-with-durable-objects/) for comprehensive testing patterns including SQLite queries and alarm testing. + +## Related resources + +- [Workers Best Practices](/workers/best-practices/workers-best-practices/): code patterns for request handling, observability, and security that apply to the Workers calling your Durable Objects. +- [Rules of Workflows](/workflows/build/rules-of-workflows/): best practices for durable, multi-step Workflows — useful when combining Workflows with Durable Objects for long-running orchestration. diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md new file mode 100644 index 0000000..3f26619 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md @@ -0,0 +1,108 @@ +--- +title: Lifecycle of a Durable Object +description: Understand how a Durable Object is created, activated, handles requests, and is eventually evicted. +pcx_content_type: concept +sidebar: + order: 3 +products: + - durable-objects +--- + +import { Render } from "~/components"; + +This section describes the lifecycle of a [Durable Object](/durable-objects/concepts/what-are-durable-objects/). + +To use a Durable Object you need to create a [Durable Object Stub](/durable-objects/api/stub/). +Simply creating the Durable Object Stub does not send a request to the Durable Object, and therefore the Durable Object is not yet instantiated. +A request is sent to the Durable Object and its lifecycle begins only once a method is invoked on the Durable Object Stub. + +```js +const stub = env.MY_DURABLE_OBJECT.getByName("foo"); +// Now the request is sent to the remote Durable Object. +const rpcResponse = await stub.sayHello(); +``` + +## Durable Object Lifecycle state transitions + +A Durable Object can be in one of the following states at any moment: + +| State | Description | +| ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Active, in-memory** | The Durable Object runs, in memory, and handles incoming requests. | +| **Idle, in-memory non-hibernateable** | The Durable Object waits for the next incoming request/event, but does not satisfy the criteria for hibernation. | +| **Idle, in-memory hibernateable** | The Durable Object waits for the next incoming request/event and satisfies the criteria for hibernation. It is up to the runtime to decide when to hibernate the Durable Object. Currently, it is after 10 seconds of inactivity while in this state. | +| **Hibernated** | The Durable Object is removed from memory. Hibernated WebSocket connections stay connected. | +| **Inactive** | The Durable Object is completely removed from the host process and might need to cold start. This is the initial state of all Durable Objects. | + +This is how a Durable Object transitions among these states (each state is in a rounded rectangle). + +![Lifecycle of a Durable Object](~/assets/images/durable-objects/durable-object-lifecycle.png) + +Assuming a Durable Object does not run, the first incoming request or event (like an alarm) will execute the `constructor()` of the Durable Object class, then run the corresponding function invoked. + +At this point the Durable Object is in the **active in-memory state**. + +Once all incoming requests or events have been processed, the Durable Object remains idle in-memory for a few seconds either in a hibernateable state or in a non-hibernateable state. + +Hibernation can only occur if **all** of the conditions below are true: + +- No `setTimeout`/`setInterval` scheduled callbacks are set, since there would be no way to recreate the callback after hibernating. +- No in-progress awaited `fetch()` exists, since it is considered to be waiting for I/O. +- No WebSocket standard API is used. +- No request/event is still being processed, because hibernating would mean losing track of the async function which is eventually supposed to return a response to that request. +- No active outbound TCP socket (`connect()`) or outbound WebSocket connection exists. + +After 10 seconds of no incoming request or event, and all the above conditions satisfied, the Durable Object will transition into the **hibernated** state. + +:::caution +When hibernated, the in-memory state is discarded, so ensure you persist all important information in the Durable Object's storage. +::: + +If any of the above conditions is false, the Durable Object remains in-memory, in the **idle, in-memory, non-hibernateable** state. + +In case of an incoming request or event while in the **hibernated** state, the `constructor()` will run again, and the Durable Object will transition to the **active, in-memory** state and execute the invoked function. + +While in the **idle, in-memory, non-hibernateable** state, after 70-140 seconds of inactivity (no incoming requests or events), the Durable Object will be evicted entirely from memory and potentially from the Cloudflare host and transition to the **inactive** state. + +:::note[Outbound connections keep Durable Objects alive] +Active outbound connections created via [`connect()`](/workers/runtime-apis/tcp-sockets/) (TCP) or an outbound WebSocket prevent the Durable Object from being evicted. Eviction is deferred until both conditions are met: all outbound connections have closed, **and** the standard 70-140 second inactivity window has elapsed with no incoming requests or events. + +While kept alive by an outbound connection, the Durable Object remains in memory in the **idle, in-memory, non-hibernateable** state and continues to [incur duration charges](/durable-objects/platform/pricing/#when-does-a-durable-object-incur-duration-charges). + +Each outbound connection keeps the Durable Object alive for a maximum of 15 minutes. After 15 minutes, the connection stops preventing eviction (the connection itself continues operating), and the [standard eviction rules](/durable-objects/concepts/durable-object-lifecycle/#durable-object-lifecycle-state-transitions) resume. + +This applies to outbound TCP sockets and outbound WebSockets (including a `fetch()` request upgraded to a WebSocket via `Upgrade: websocket`). It does not apply to plain `fetch()` subrequests. Those never keep the Durable Object alive, even while the response body is still streaming. +::: + +Objects in the **hibernated** state keep their Websocket clients connected, and the runtime decides if and when to transition the object to the **inactive** state (for example deciding to move the object to a different host) thus restarting the lifecycle. + +The next incoming request or event starts the cycle again. + +:::note[Lifecycle states incurring duration charges] +A Durable Object incurs charges only when it is **actively running in-memory**, or when it is **idle in-memory and non-hibernateable** (indicated as green rectangles in the diagram). +::: + +## Shutdown behavior + +Durable Objects will occasionally shut down and objects are restarted, which will run your Durable Object class constructor. This can happen for various reasons, including: + +- New Worker [deployments](/workers/versions-and-deployments/) with code updates +- Lack of requests to an object following the state transitions documented above +- Cloudflare updates to the Workers runtime system +- Workers runtime decisions on where to host objects + +When a Durable Object is shut down, the object instance is automatically restarted and new requests are routed to the new instance. In-flight requests are handled as follows: + +- **HTTP & RPC requests**: In-flight requests are allowed to finish if they do not access a Durable Object's storage. If a request attempts to access a Durable Object's storage, it will be stopped immediately and return an error to maintain Durable Objects global uniqueness property. When the Worker runtime system is being updated, in-flight requests have up to 30 seconds to complete. +- **WebSocket connections**: WebSocket requests are terminated automatically during shutdown. This is so that the new instance can take over the connection as soon as possible. +- **Other invocations (email, cron)**: Other invocations are treated similarly to HTTP requests. + +It is important to ensure that any services using Durable Objects are designed to handle the possibility of a Durable Object being shut down. + +### Code updates + +When your Durable Object code is updated, your Worker and Durable Objects are released globally in an eventually consistent manner. This will cause a Durable Object to shut down, with the behavior described above. Updates can also create a situation where a request reaches a new version of your Worker in one location, and calls to a Durable Object still running a previous version elsewhere. Refer to [Code updates](/durable-objects/platform/known-issues/#code-updates) for more information about handling this scenario. + +### Working without shutdown hooks + + diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md new file mode 100644 index 0000000..200c20c --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md @@ -0,0 +1,115 @@ +--- +title: What are Durable Objects? +description: Durable Objects provide globally unique, single-threaded compute instances with persistent storage on Cloudflare. +pcx_content_type: concept +sidebar: + order: 2 +products: + - durable-objects +--- + +import { Render } from "~/components"; + + + +## Durable Objects highlights + +Durable Objects have properties that make them a great fit for distributed stateful scalable applications. + +**Serverless compute, zero infrastructure management** + +- Durable Objects are built on-top of the Workers runtime, so they support exactly the same code (JavaScript and WASM), and similar memory and CPU limits. +- Each Durable Object is [implicitly created on first access](/durable-objects/api/namespace/#get). User applications are not concerned with their lifecycle, creating them or destroying them. Durable Objects migrate among healthy servers, and therefore applications never have to worry about managing them. +- Each Durable Object stays alive as long as requests are being processed, and remains alive for several seconds after being idle before hibernating, allowing applications to [exploit in-memory caching](/durable-objects/reference/in-memory-state/) while handling many consecutive requests and boosting their performance. + +**Storage colocated with compute** + +- Each Durable Object has its own [durable, transactional, and strongly consistent storage](/durable-objects/api/sqlite-storage-api/) (up to 10 GB[^1]), persisted across requests, and accessible only within that object. + +**Single-threaded concurrency** + +- Each [Durable Object instance has an identifier](/durable-objects/api/id/), either randomly-generated or user-generated, which allows you to globally address which Durable Object should handle a specific action or request. +- Durable Objects are single-threaded and cooperatively multi-tasked, just like code running in a web browser. For more details on how safety and correctness are achieved, refer to the blog post ["Durable Objects: Easy, Fast, Correct — Choose three"](https://blog.cloudflare.com/durable-objects-easy-fast-correct-choose-three/). + +**Elastic horizontal scaling across Cloudflare's global network** + +- Durable Objects can be spread around the world, and you can [optionally influence where each instance should be located](/durable-objects/reference/data-location/#provide-a-location-hint). Durable Objects are not yet available in every Cloudflare data center; refer to the [where.durableobjects.live](https://where.durableobjects.live/) project for live locations. +- Each Durable Object type (or ["Namespace binding"](/durable-objects/api/namespace/) in Cloudflare terms) corresponds to a JavaScript class implementing the actual logic. There is no hard limit on how many Durable Objects can be created for each namespace. +- Durable Objects scale elastically as your application creates millions of objects. There is no need for applications to manage infrastructure or plan ahead for capacity. + +## Durable Objects features + +### In-memory state + +Each Durable Object has its own [in-memory state](/durable-objects/reference/in-memory-state/). Applications can use this in-memory state to optimize the performance of their applications by keeping important information in-memory, thereby avoiding the need to access the durable storage at all. + +Useful cases for in-memory state include batching and aggregating information before persisting it to storage, or for immediately rejecting/handling incoming requests meeting certain criteria, and more. + +In-memory state is reset when the Durable Object hibernates after being idle for some time. Therefore, it is important to persist any in-memory data to the durable storage if that data will be needed at a later time when the Durable Object receives another request. + +### Storage API + +The [Durable Object Storage API](/durable-objects/api/sqlite-storage-api/) allows Durable Objects to access fast, transactional, and strongly consistent storage. A Durable Object's attached storage is private to its unique instance and cannot be accessed by other objects. + +There are two flavors of the storage API, a [key-value (KV) API](/durable-objects/api/legacy-kv-storage-api/) and an [SQL API](/durable-objects/api/sqlite-storage-api/). + +When using the [new SQLite in Durable Objects storage backend](/durable-objects/reference/durable-objects-migrations/#create-migration), you have access to both the APIs. However, if you use the previous storage backend you only have access to the key-value API. + +### Alarms API + +Durable Objects provide an [Alarms API](/durable-objects/api/alarms/) which allows you to schedule the Durable Object to be woken up at a time in the future. This is useful when you want to do certain work periodically, or at some specific point in time, without having to manually manage infrastructure such as job scheduling runners on your own. + +You can combine Alarms with in-memory state and the durable storage API to build batch and aggregation applications such as queues, workflows, or advanced data pipelines. + +### WebSockets + +WebSockets are long-lived TCP connections that enable bi-directional, real-time communication between client and server. Because WebSocket sessions are long-lived, applications commonly use Durable Objects to accept either the client or server connection. + +Because Durable Objects provide a single-point-of-coordination between Cloudflare Workers, a single Durable Object instance can be used in parallel with WebSockets to coordinate between multiple clients, such as participants in a chat room or a multiplayer game. + +Durable Objects support the [WebSocket Standard API](/durable-objects/best-practices/websockets/#websocket-standard-api), as well as the [WebSockets Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api) which extends the Web Standard WebSocket API to reduce costs by not incurring billing charges during periods of inactivity. + +### RPC + +Durable Objects support Workers [Remote-Procedure-Call (RPC)](/workers/runtime-apis/rpc/) which allows applications to use JavaScript-native methods and objects to communicate between Workers and Durable Objects. + +Using RPC for communication makes application development easier and simpler to reason about, and more efficient. + +## Actor programming model + +Another way to describe and think about Durable Objects is through the lens of the [Actor programming model](https://en.wikipedia.org/wiki/Actor_model). There are several popular examples of the Actor model supported at the programming language level through runtimes or library frameworks, like [Erlang](https://www.erlang.org/), [Elixir](https://elixir-lang.org/), [Akka](https://akka.io/), or [Microsoft Orleans for .NET](https://learn.microsoft.com/en-us/dotnet/orleans/overview). + +The Actor model simplifies a lot of problems in distributed systems by abstracting away the communication between actors using RPC calls (or message sending) that could be implemented on-top of any transport protocol, and it avoids most of the concurrency pitfalls you get when doing concurrency through shared memory such as race conditions when multiple processes/threads access the same data in-memory. + +Each Durable Object instance can be seen as an Actor instance, receiving messages (incoming HTTP/RPC requests), executing some logic in its own single-threaded context using its attached durable storage or in-memory state, and finally sending messages to the outside world (outgoing HTTP/RPC requests or responses), even to another Durable Object instance. + +Each Durable Object has certain capabilities in terms of [how much work it can do](/durable-objects/platform/limits/#how-much-work-can-a-single-durable-object-do), which should influence the application's [architecture to fully take advantage of the platform](/reference-architecture/diagrams/storage/durable-object-control-data-plane-pattern/). + +Durable Objects are natively integrated into Cloudflare's infrastructure, giving you the ultimate serverless platform to build distributed stateful applications exploiting the entirety of Cloudflare's network. + +## Durable Objects in Cloudflare + +Many of Cloudflare's products use Durable Objects. Some of our technical blog posts showcase real-world applications and use-cases where Durable Objects make building applications easier and simpler. + +These blog posts may also serve as inspiration on how to architect scalable applications using Durable Objects, and how to integrate them with the rest of Cloudflare Developer Platform. + +- [Durable Objects aren't just durable, they're fast: a 10x speedup for Cloudflare Queues](https://blog.cloudflare.com/how-we-built-cloudflare-queues/) +- [Behind the scenes with Stream Live, Cloudflare's live streaming service](https://blog.cloudflare.com/behind-the-scenes-with-stream-live-cloudflares-live-streaming-service/) +- [DO it again: how we used Durable Objects to add WebSockets support and authentication to AI Gateway](https://blog.cloudflare.com/do-it-again/) +- [Workers Builds: integrated CI/CD built on the Workers platform](https://blog.cloudflare.com/workers-builds-integrated-ci-cd-built-on-the-workers-platform/) +- [Build durable applications on Cloudflare Workers: you write the Workflows, we take care of the rest](https://blog.cloudflare.com/building-workflows-durable-execution-on-workers/) +- [Building D1: a Global Database](https://blog.cloudflare.com/building-d1-a-global-database/) +- [Billions and billions (of logs): scaling AI Gateway with the Cloudflare Developer Platform](https://blog.cloudflare.com/billions-and-billions-of-logs-scaling-ai-gateway-with-the-cloudflare/) +- [Indexing millions of HTTP requests using Durable Objects](https://blog.cloudflare.com/r2-rayid-retrieval/) + +Finally, the following blog posts may help you learn some of the technical implementation aspects of Durable Objects, and how they work. + +- [Durable Objects: Easy, Fast, Correct — Choose three](https://blog.cloudflare.com/durable-objects-easy-fast-correct-choose-three/) +- [Zero-latency SQLite storage in every Durable Object](https://blog.cloudflare.com/sqlite-in-durable-objects/) +- [Workers Durable Objects Beta: A New Approach to Stateful Serverless](https://blog.cloudflare.com/introducing-workers-durable-objects/) + +## Get started + +Get started now by following the ["Get started" guide](/durable-objects/get-started/) to create your first application using Durable Objects. + +[^1]: Storage per Durable Object with SQLite is currently 1 GB. This will be raised to 10 GB for general availability. diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md new file mode 100644 index 0000000..86eb133 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md @@ -0,0 +1,252 @@ +--- +summary: Build a counter using Durable Objects and Workers with RPC methods. +pcx_content_type: example +title: Build a counter +sidebar: + order: 3 +description: Build a counter using Durable Objects and Workers with RPC methods. +reviewed: 2023-08-04 +products: + - durable-objects + - workers +--- + +import { TabItem, Tabs, WranglerConfig } from "~/components"; + +This example shows how to build a counter using Durable Objects and Workers with [RPC methods](/workers/runtime-apis/rpc) that can print, increment, and decrement a `name` provided by the URL query string parameter, for example, `?name=A`. + + + +```js +import { DurableObject } from "cloudflare:workers"; + +// Worker +export default { + async fetch(request, env) { + let url = new URL(request.url); + let name = url.searchParams.get("name"); + if (!name) { + return new Response( + "Select a Durable Object to contact by using" + + " the `name` URL query string parameter, for example, ?name=A", + ); + } + + // A stub is a client Object used to send messages to the Durable Object. + let stub = env.COUNTERS.getByName(name); + + // Send a request to the Durable Object using RPC methods, then await its response. + let count = null; + switch (url.pathname) { + case "/increment": + count = await stub.increment(); + break; + case "/decrement": + count = await stub.decrement(); + break; + case "/": + // Serves the current value. + count = await stub.getCounterValue(); + break; + default: + return new Response("Not found", { status: 404 }); + } + + return new Response(`Durable Object '${name}' count: ${count}`); + }, +}; + +// Durable Object +export class Counter extends DurableObject { + async getCounterValue() { + let value = (await this.ctx.storage.get("value")) || 0; + return value; + } + + async increment(amount = 1) { + let value = (await this.ctx.storage.get("value")) || 0; + value += amount; + // You do not have to worry about a concurrent request having modified the value in storage. + // "input gates" will automatically protect against unwanted concurrency. + // Read-modify-write is safe. + await this.ctx.storage.put("value", value); + return value; + } + + async decrement(amount = 1) { + let value = (await this.ctx.storage.get("value")) || 0; + value -= amount; + await this.ctx.storage.put("value", value); + return value; + } +} +``` + + + +```ts +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + COUNTERS: DurableObjectNamespace; +} + +// Worker +export default { + async fetch(request, env) { + let url = new URL(request.url); + let name = url.searchParams.get("name"); + if (!name) { + return new Response( + "Select a Durable Object to contact by using" + + " the `name` URL query string parameter, for example, ?name=A", + ); + } + + // A stub is a client Object used to send messages to the Durable Object. + let stub = env.COUNTERS.get(name); + + let count = null; + switch (url.pathname) { + case "/increment": + count = await stub.increment(); + break; + case "/decrement": + count = await stub.decrement(); + break; + case "/": + // Serves the current value. + count = await stub.getCounterValue(); + break; + default: + return new Response("Not found", { status: 404 }); + } + + return new Response(`Durable Object '${name}' count: ${count}`); + }, +} satisfies ExportedHandler; + +// Durable Object +export class Counter extends DurableObject { + async getCounterValue() { + let value = (await this.ctx.storage.get("value")) || 0; + return value; + } + + async increment(amount = 1) { + let value: number = (await this.ctx.storage.get("value")) || 0; + value += amount; + // You do not have to worry about a concurrent request having modified the value in storage. + // "input gates" will automatically protect against unwanted concurrency. + // Read-modify-write is safe. + await this.ctx.storage.put("value", value); + return value; + } + + async decrement(amount = 1) { + let value: number = (await this.ctx.storage.get("value")) || 0; + value -= amount; + await this.ctx.storage.put("value", value); + return value; + } +} +``` + + + +```py +from workers import DurableObject, Response, WorkerEntrypoint +from urllib.parse import urlparse, parse_qs + +# Worker +class Default(WorkerEntrypoint): + async def fetch(self, request): + parsed_url = urlparse(request.url) + query_params = parse_qs(parsed_url.query) + name = query_params.get('name', [None])[0] + + if not name: + return Response( + "Select a Durable Object to contact by using" + + " the `name` URL query string parameter, for example, ?name=A" + ) + + # A stub is a client Object used to send messages to the Durable Object. + stub = self.env.COUNTERS.getByName(name) + + # Send a request to the Durable Object using RPC methods, then await its response. + count = None + + if parsed_url.path == "/increment": + count = await stub.increment() + elif parsed_url.path == "/decrement": + count = await stub.decrement() + elif parsed_url.path == "" or parsed_url.path == "/": + # Serves the current value. + count = await stub.getCounterValue() + else: + return Response("Not found", status=404) + + return Response(f"Durable Object '{name}' count: {count}") + +# Durable Object +class Counter(DurableObject): + def __init__(self, ctx, env): + super().__init__(ctx, env) + + async def getCounterValue(self): + value = await self.ctx.storage.get("value") + return value if value is not None else 0 + + async def increment(self, amount=1): + value = await self.ctx.storage.get("value") + value = (value if value is not None else 0) + amount + # You do not have to worry about a concurrent request having modified the value in storage. + # "input gates" will automatically protect against unwanted concurrency. + # Read-modify-write is safe. + await self.ctx.storage.put("value", value) + return value + + async def decrement(self, amount=1): + value = await self.ctx.storage.get("value") + value = (value if value is not None else 0) - amount + await self.ctx.storage.put("value", value) + return value +``` + + + +Finally, configure your Wrangler file to include a Durable Object [binding](/durable-objects/get-started/#4-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. + + + +```jsonc +{ + "$schema": "./node_modules/wrangler/config-schema.json", + "name": "my-counter", + "main": "src/index.ts", + "durable_objects": { + "bindings": [ + { + "name": "COUNTERS", + "class_name": "Counter" + } + ] + }, + "migrations": [ + { + "tag": "v1", + "new_sqlite_classes": [ + "Counter" + ] + } + ] +} +``` + + + +### Related resources + +- [Workers RPC](/workers/runtime-apis/rpc/) +- [Durable Objects: Easy, Fast, Correct — Choose three](https://blog.cloudflare.com/durable-objects-easy-fast-correct-choose-three/). diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/platform/storage-options.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/platform/storage-options.md new file mode 100644 index 0000000..3fb19f9 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/durable-objects/platform/storage-options.md @@ -0,0 +1,10 @@ +--- +pcx_content_type: navigation +title: Choose a data or storage product +description: Compare Cloudflare storage and data products to find the best option for your Durable Objects use case. +external_link: /workers/platform/storage-options/ +sidebar: + order: 3 +products: + - durable-objects +--- diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md new file mode 100644 index 0000000..15370b3 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md @@ -0,0 +1,81 @@ +--- +pcx_content_type: concept +title: How KV works +description: Workers KV stores data centrally and caches it globally, optimizing for high-read, low-latency workloads. +sidebar: + order: 6 +products: + - kv +--- + +KV is a global, low-latency, key-value data store. It stores data in a small number of centralized data centers, then caches that data in Cloudflare's data centers after access. + +KV supports exceptionally high read volumes with low latency, making it possible to build dynamic APIs that scale thanks to KV's built-in caching and global distribution. +Requests which are not in cache and need to access the central stores can experience higher latencies. + +## Write data to KV and read data from KV + +When you write to KV, your data is written to central data stores. Your data is not sent automatically to every location's cache. + +![Your data is written to central data stores when you write to KV.](~/assets/images/kv/kv-write.svg) + +Initial reads from a location do not have a cached value. Data must be read from the nearest regional tier, followed by a central tier, degrading finally to the central stores for a truly cold global read. While the first access is slow globally, subsequent requests are faster, especially if requests are concentrated in a single region. + +:::note[Hot and cold read] + +A hot read means that the data is cached on Cloudflare's edge network using the [CDN](https://developers.cloudflare.com/cache/), whether it is in a local cache or a regional cache. A cold read means that the data is not cached, so the data must be fetched from the central stores. +::: + +![Initial reads will miss the cache and go to the nearest central data store first.](~/assets/images/kv/kv-slow-read.svg) + +Frequent reads from the same location return the cached value without reading from anywhere else, resulting in the fastest response times. KV operates diligently to update the cached values by refreshing from upper tier caches and central data stores before cache expires in the background. + +Refreshing from upper tiers and the central data stores in the background is done carefully so that assets that are being accessed continue to be kept served from the cache without any stalls. + +![As mentioned above, frequent reads will return a cached value.](~/assets/images/kv/kv-fast-read.svg) + +KV is optimized for high-read applications. It stores data centrally and uses a hybrid push/pull-based replication to store data in cache. KV is suitable for use cases where you need to write relatively infrequently, but read quickly and frequently. Infrequently read values are pulled from other data centers or the central stores, while more popular values are cached in the data centers they are requested from. + +## Performance + +To improve KV performance, increase the [`cacheTtl` parameter](/kv/api/read-key-value-pairs/#cachettl-parameter) up from its default 60 seconds. + +KV achieves high performance by [caching](https://www.cloudflare.com/en-gb/learning/cdn/what-is-caching/) which makes reads eventually-consistent with writes. + +Changes are usually immediately visible in the Cloudflare global network location at which they are made. Changes may take up to 60 seconds or more to be visible in other global network locations as their cached versions of the data time out. + +Negative lookups indicating that the key does not exist are also cached, so the same delay exists noticing a value is created as when a value is changed. + +## Consistency + +KV achieves high performance by being eventually-consistent. At the Cloudflare global network location at which changes are made, these changes are usually immediately visible. However, this is not guaranteed and therefore it is not advised to rely on this behaviour. In other global network locations changes may take up to 60 seconds or more to be visible as their cached versions of the data time-out. + +Visibility of changes takes longer in locations which have recently read a previous version of a given key (including reads that indicated the key did not exist, which are also cached locally). + +:::note + +KV is not ideal for applications where you need support for atomic operations or where values must be read and written in a single transaction. +If you need stronger consistency guarantees, consider using [Durable Objects](/durable-objects/). +::: + +An approach to achieve write-after-write consistency is to send all of your writes for a given KV key through a corresponding instance of a Durable Object, and then read that value from KV in other Workers. This is useful if you need more control over writes, but are satisfied with KV's read characteristics described above. + +## Guidance + +Workers KV is an eventually-consistent edge key-value store. That makes it ideal for **read-heavy**, highly cacheable workloads such as: + +- Serving static assets +- Storing application configuration +- Storing user preferences +- Implementing allow-lists/deny-lists +- Caching + +In these scenarios, Workers are invoked in a data center closest to the user and Workers KV data will be cached in that region for subsequent requests to minimize latency. + +If you have a **write-heavy** [Redis](https://redis.io)-type workload where you are updating the same key tens or hundreds of times per second, KV will not be an ideal fit. +If you can revisit how your application writes to single key-value pairs and spread your writes across several discrete keys, Workers KV can suit your needs. +Alternatively, [Durable Objects](/durable-objects/) provides a key-value API with higher writes per key rate limits. + +## Security + +Refer to [Data security documentation](/kv/reference/data-security/) to understand how Workers KV secures data. diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md new file mode 100644 index 0000000..4af37dd --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md @@ -0,0 +1,109 @@ +--- +pcx_content_type: concept +title: KV bindings +description: KV bindings connect a Cloudflare Worker to a KV namespace for reading and writing data. +tags: + - Bindings +sidebar: + order: 7 +products: + - kv +--- + +import { WranglerConfig } from "~/components"; + +KV [bindings](/workers/runtime-apis/bindings/) allow for communication between a Worker and a KV namespace. + +Configure KV bindings in the [Wrangler configuration file](/workers/wrangler/configuration/). + +## Access KV from Workers + +A [KV namespace](/kv/concepts/kv-namespaces/) is a key-value database replicated to Cloudflare's global network. + +To connect to a KV namespace from within a Worker, you must define a binding that points to the namespace's ID. + +The name of your binding does not need to match the KV namespace's name. Instead, the binding should be a valid JavaScript identifier, because the identifier will exist as a global variable within your Worker. + +A KV namespace will have a name you choose (for example, `My tasks`), and an assigned ID (for example, `06779da6940b431db6e566b4846d64db`). + +To execute your Worker, define the binding. + +In the following example, the binding is called `TODO`. In the `kv_namespaces` portion of your Wrangler configuration file, add: + + + +```jsonc +{ + "$schema": "./node_modules/wrangler/config-schema.json", + "name": "worker", + // ... + "kv_namespaces": [ + { + "binding": "TODO", + "id": "06779da6940b431db6e566b4846d64db" + } + ] +} +``` + + + +With this, the deployed Worker will have a `TODO` field in their environment object (the second parameter of the `fetch()` request handler). Any methods on the `TODO` binding will map to the KV namespace with an ID of `06779da6940b431db6e566b4846d64db` – which you called `My Tasks` earlier. + +```js +export default { + async fetch(request, env, ctx) { + // Get the value for the "to-do:123" key + // NOTE: Relies on the `TODO` KV binding that maps to the "My Tasks" namespace. + let value = await env.TODO.get("to-do:123"); + + // Return the value, as is, for the Response + return new Response(value); + }, +}; +``` + +## Use KV bindings when developing locally + +When you use Wrangler to develop locally with the `wrangler dev` command, Wrangler will default to using a local version of KV to avoid interfering with any of your live production data in KV. This means that reading keys that you have not written locally will return `null`. + +To have `wrangler dev` connect to your Workers KV namespace running on Cloudflare's global network, set `"remote" : true` in the KV binding configuration. Refer to the [remote bindings documentation](/workers/local-development/#remote-bindings) for more information. + + + +```jsonc +{ + "$schema": "./node_modules/wrangler/config-schema.json", + "name": "worker", + // ... + "kv_namespaces": [ + { + "binding": "TODO", + "id": "06779da6940b431db6e566b4846d64db" + } + ] +} +``` + + + +## Access KV from Durable Objects and Workers using ES modules format + +[Durable Objects](/durable-objects/) use ES modules format. Instead of a global variable, bindings are available as properties of the `env` parameter [passed to the constructor](/durable-objects/get-started/#2-write-a-durable-object-class). + +An example might look like: + +```js +import { DurableObject } from "cloudflare:workers"; + +export class MyDurableObject extends DurableObject { + constructor(ctx, env) { + super(ctx, env); + } + + async fetch(request) { + const valueFromKV = await this.env.NAMESPACE.get("someKey"); + return new Response(valueFromKV); + } +} +``` diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/concepts/kv-namespaces.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/concepts/kv-namespaces.md new file mode 100644 index 0000000..7867efd --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/concepts/kv-namespaces.md @@ -0,0 +1,68 @@ +--- +pcx_content_type: concept +title: KV namespaces +description: A KV namespace is a key-value database replicated across Cloudflare's global network. +sidebar: + order: 7 +products: + - kv +--- +import { Type, MetaInfo, WranglerConfig, DashButton } from "~/components"; + +A KV namespace is a key-value database replicated to Cloudflare’s global network. + +Bind your KV namespaces through Wrangler or via the Cloudflare dashboard. + +:::note + +KV namespace IDs are public and bound to your account. + +::: + +## Bind your KV namespace through Wrangler + +To bind KV namespaces to your Worker, assign an array of the below object to the `kv_namespaces` key. + +* `binding` + + * The binding name used to refer to the KV namespace. + +* `id` + + * The ID of the KV namespace. + +* `preview_id` + + * The ID of the KV namespace used during `wrangler dev`. + +Example: + + + +```jsonc +{ + "kv_namespaces": [ + { + "binding": "", + "id": "" + } + ] +} +``` + + + +## Bind your KV namespace via the dashboard + +To bind the namespace to your Worker in the Cloudflare dashboard: + +1. In the Cloudflare dashboard, go to the **Workers & Pages** page. + + +2. Select your **Worker**. +3. Select **Settings** > **Bindings**. +4. Select **Add**. +5. Select **KV Namespace**. +6. Enter your desired variable name (the name of the binding). +7. Select the KV namespace you wish to bind the Worker to. +8. Select **Deploy**. diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md new file mode 100644 index 0000000..0265f4e --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md @@ -0,0 +1,145 @@ +--- +summary: Cache data or API responses in Workers KV to improve application performance +pcx_content_type: example +title: Cache data with Workers KV +sidebar: + order: 5 +description: Example of how to use Workers KV to build a distributed application configuration store. +reviewed: 2025-03-27 +products: + - kv +--- + +import { Render, PackageManagers, Tabs, TabItem } from "~/components"; + +Workers KV can be used as a persistent, single, global cache accessible from Cloudflare Workers to speed up your application. +Data cached in Workers KV is accessible from all other Cloudflare locations as well, and persists until expiry or deletion. + +After fetching data from external resources in your Workers application, you can write the data to Workers KV. +On subsequent Worker requests (in the same region or in other regions), you can read the cached data from Workers KV instead of calling the external API. +This improves your Worker application's performance and resilience while reducing load on external resources. + +This example shows how you can cache data in Workers KV and read cached data from Workers KV in a Worker application. + +:::note[Note] + +You can also cache data in Workers with the [Cache API](/workers/runtime-apis/cache/). With the Cache API, +the contents of the cache do not replicate outside of the originating data center and the cache is ephemeral (can be evicted). + +With Workers KV, the data is persisted by default to [central stores](/kv/concepts/how-kv-works/) (or can be set to [expire](/kv/api/write-key-value-pairs/#expiring-keys), and can be accessed from other Cloudflare locations. +::: + +## Cache data in Workers KV from your Worker application + +In the following `index.ts` file, the Worker fetches data from an external server and caches the response in Workers KV. If the data is already cached in Workers KV, the Worker reads the cached data from Workers KV instead of calling the external API. + + + +```js title="index.ts" collapse={42-1000} +interface Env { + CACHE_KV: KVNamespace; +} + +export default { + async fetch(request, env, ctx): Promise { + + const EXPIRATION_TTL = 30; // Cache expiration in seconds + const url = 'https://example.com'; + const cacheKey = "cache-json-example"; + + // Try to get data from KV cache first + let data = await env.CACHE_KV.get(cacheKey, { type: 'json' }); + let fromCache = true; + + // If data is not in cache, fetch it from example.com + if (!data) { + console.log('Cache miss. Fetching fresh data from example.com'); + fromCache = false; + + // In this example, we are fetching HTML content but it can also be API responses or any other data + const response = await fetch(url); + const htmlData = await response.text(); + + // In this example, we are converting HTML to JSON to demonstrate caching JSON data with Workers KV + // You could cache any type of data, or even cache the HTML data directly + data = helperConvertToJSON(htmlData); + // The expirationTtl option is used to set the expiration time for the cache entry (in seconds), otherwise it will be stored indefinitely + await env.CACHE_KV.put(cacheKey, JSON.stringify(data), { expirationTtl: EXPIRATION_TTL }); + } + + // Return the appropriate response format + return new Response(JSON.stringify({ + data, + fromCache + }), { + headers: { 'Content-Type': 'application/json' } + }); + +} +} satisfies ExportedHandler; + +// Helper function to convert HTML to JSON +function helperConvertToJSON(html: string) { +// Parse HTML and extract relevant data +const title = helperExtractTitle(html); +const content = helperExtractContent(html); +const lastUpdated = new Date().toISOString(); + + return { title, content, lastUpdated }; + +} + +// Helper function to extract title from HTML +function helperExtractTitle(html: string) { +const titleMatch = html.match(/(.\*?)<\/title>/i); +return titleMatch ? titleMatch[1] : 'No title found'; +} + +// Helper function to extract content from HTML +function helperExtractContent(html: string) { +const bodyMatch = html.match(/<body>(.\*?)<\/body>/is); +if (!bodyMatch) return 'No content found'; + + // Strip HTML tags for a simple text representation + const textContent = bodyMatch[1].replace(/<[^>]*>/g, ' ') + .replace(/\s+/g, ' ') + .trim(); + + return textContent; + +} + +``` +</TabItem> +<TabItem label="wrangler.jsonc"> +```json +{ + "$schema": "node_modules/wrangler/config-schema.json", + "name": "<ENTER_WORKER_NAME>", + "main": "src/index.ts", + "compatibility_date": "2025-03-03", + "observability": { + "enabled": true + }, + "kv_namespaces": [ + { + "binding": "CACHE_KV", + "id": "<YOUR_BINDING_ID>" + } + ] +} +``` + +</TabItem> +</Tabs> + +This code snippet demonstrates how to read and update cached data in Workers KV from your Worker. +If the data is not in the Workers KV cache, the Worker fetches the data from an external server and caches it in Workers KV. + +In this example, we convert HTML to JSON to demonstrate how to cache JSON data with Workers KV, but any type of data +can be cached in Workers KV. For instance, you could cache API responses, HTML content, or any other data that you want to persist across requests. + +## Related resources + +- [Rust support in Workers](/workers/languages/rust/). +- [Using KV in Workers](/kv/get-started/). diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md new file mode 100644 index 0000000..2ef7b10 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md @@ -0,0 +1,237 @@ +--- +summary: Use Workers KV to as a geo-distributed, low-latency configuration store for your Workers application +pcx_content_type: example +title: Build a distributed configuration store +sidebar: + order: 5 +description: Example of how to use Workers KV to build a distributed application configuration store. +reviewed: 2025-03-27 +products: + - kv +--- + +import { Render, PackageManagers, Tabs, TabItem } from "~/components"; + +Storing application configuration data is an ideal use case for Workers KV. Configuration data can include data to personalize an application for each user or tenant, enable features for user groups, restrict access with allow-lists/deny-lists, etc. These use-cases can have high read volumes that are highly cacheable by Workers KV, which can ensure low-latency reads from your Workers application. + +In this example, application configuration data is used to personalize the Workers application for each user. The configuration data is stored in an external application and database, and written to Workers KV using the REST API. + +## Write your configuration from your external application to Workers KV + +In some cases, your source-of-truth for your configuration data may be stored elsewhere than Workers KV. +If this is the case, use the Workers KV REST API to write the configuration data to your Workers KV namespace. + +The following external Node.js application demonstrates a simple scripts that reads user data from a database and writes it to Workers KV using the REST API library. + +<Tabs> +<TabItem label="index.js"> +```js title="index.js" +const postgres = require('postgres'); +const { Cloudflare } = require('cloudflare'); +const { backOff } = require('exponential-backoff'); + +if(!process.env.DATABASE_CONNECTION_STRING || !process.env.CLOUDFLARE_EMAIL || !process.env.CLOUDFLARE_API_KEY || !process.env.CLOUDFLARE_WORKERS_KV_NAMESPACE_ID || !process.env.CLOUDFLARE_ACCOUNT_ID) { +console.error('Missing required environment variables.'); +process.exit(1); +} + +// Setup Postgres connection +const sql = postgres(process.env.DATABASE_CONNECTION_STRING); + +// Setup Cloudflare REST API client +const client = new Cloudflare({ +apiEmail: process.env.CLOUDFLARE_EMAIL, +apiKey: process.env.CLOUDFLARE_API_KEY, +}); + +// Function to sync Postgres data to Workers KV +async function syncPreviewStatus() { +console.log('Starting sync of user preview status...'); + + try { + // Get all users and their preview status + const users = await sql`SELECT id, preview_features_enabled FROM users`; + + console.log(users); + + // Create the bulk update body + const bulkUpdateBody = users.map(user => ({ + key: user.id, + value: JSON.stringify({ + preview_features_enabled: user.preview_features_enabled + }) + })); + + const response = await backOff(async () => { + console.log("trying to update") + try{ + const response = await client.kv.namespaces.bulkUpdate(process.env.CLOUDFLARE_WORKERS_KV_NAMESPACE_ID, { + account_id: process.env.CLOUDFLARE_ACCOUNT_ID, + body: bulkUpdateBody + }); + } + catch(e){ + // Implement your error handling and logging here + console.log(e); + throw e; // Rethrow the error to retry + } + }); + + console.log(`Sync complete. Updated ${users.length} users.`); + } catch (error) { + console.error('Error syncing preview status:', error); + } + +} + +// Run the sync function +syncPreviewStatus() +.catch(console.error) +.finally(() => process.exit(0)); + +``` +</TabItem> +<TabItem label=".env"> +```md title=".env" +DATABASE_CONNECTION_STRING = <DB_CONNECTION_STRING_HERE> +CLOUDFLARE_EMAIL = <CLOUDFLARE_EMAIL_HERE> +CLOUDFLARE_API_KEY = <CLOUDFLARE_API_KEY_HERE> +CLOUDFLARE_ACCOUNT_ID = <CLOUDFLARE_ACCOUNT_ID_HERE> +CLOUDFLARE_WORKERS_KV_NAMESPACE_ID = <CLOUDFLARE_WORKERS_KV_NAMESPACE_ID_HERE> +``` + +</TabItem> +<TabItem label="db.sql"> +```sql title="db.sql" +-- Create users table with preview_features_enabled flag +CREATE TABLE users ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + username VARCHAR(100) NOT NULL, + email VARCHAR(255) NOT NULL, + preview_features_enabled BOOLEAN DEFAULT false +); + +-- Insert sample users +INSERT INTO users (username, email, preview_features_enabled) VALUES +('alice', 'alice@example.com', true), +('bob', 'bob@example.com', false), +('charlie', 'charlie@example.com', true); + +``` +</TabItem> +</Tabs> + +In this code snippet, the Node.js application reads user data from a Postgres database and writes the user data to be used for configuration in our Workers application to Workers KV using the Cloudflare REST API Node.js library. +The application also uses exponential backoff to handle retries in case of errors. + +## Use configuration data from Workers KV in your Worker application + +With the configuration data now in the Workers KV namespace, we can use it in our Workers application to personalize the application for each user. + +<Tabs> +<TabItem label="index.ts"> +```js title="index.ts" +// Example configuration data stored in Workers KV: +// Key: "user-id-abc" | Value: {"preview_features_enabled": false} +// Key: "user-id-def" | Value: {"preview_features_enabled": true} + +interface Env { + USER_CONFIGURATION: KVNamespace; +} + +export default { + async fetch(request, env) { + // Get user ID from query parameter + const url = new URL(request.url); + const userId = url.searchParams.get('userId'); + + if (!userId) { + return new Response('Please provide a userId query parameter', { + status: 400, + headers: { 'Content-Type': 'text/plain' } + }); + } + + + const userConfiguration = await env.USER_CONFIGURATION.get<{ + preview_features_enabled: boolean; + }>(userId, {type: "json"}); + + console.log(userConfiguration); + + // Build HTML response + const html = ` + <!DOCTYPE html> + <html> + <head> + <title>My App + + + + ${userConfiguration?.preview_features_enabled ? ` +
+ 🎉 You have early access to preview features! 🎉 +
+ ` : ''} +

Welcome to My App

+

This is the regular content everyone sees.

+ + + `; + + return new Response(html, { + headers: { "Content-Type": "text/html; charset=utf-8" } + }); + } +} satisfies ExportedHandler; + +``` +
+ +```json +{ + "$schema": "node_modules/wrangler/config-schema.json", + "name": "", + "main": "src/index.ts", + "compatibility_date": "2025-03-03", + "observability": { + "enabled": true + }, + "kv_namespaces": [ + { + "binding": "USER_CONFIGURATION", + "id": "" + } + ] +} +``` + + +
+ +This code will use the path within the URL and find the file associated to the path within the KV store. It also sets the proper MIME type in the response to inform the browser how to handle the response. To retrieve the value from the KV store, this code uses `arrayBuffer` to properly handle binary data such as images, documents, and video/audio files. + +## Optimize performance for configuration + +To optimize performance, you may opt to consolidate values in fewer key-value pairs. By doing so, you may benefit from higher caching efficiency and lower latency. + +For example, instead of storing each user's configuration in a separate key-value pair, you may store all users' configurations in a single key-value pair. This approach may be suitable for use-cases where the configuration data is small and can be easily managed in a single key-value pair (the [size limit for a Workers KV value is 25 MiB](/kv/platform/limits/)). + +## Related resources + +- [Rust support in Workers](/workers/languages/rust/) +- [Using KV in Workers](/kv/get-started/) diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/index.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/index.md new file mode 100644 index 0000000..c0a8458 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/kv/index.md @@ -0,0 +1,225 @@ +--- +title: Cloudflare Workers KV +description: Workers KV is a global, low-latency, key-value data store for building dynamic and performant APIs and websites. +pcx_content_type: overview +sidebar: + order: 1 +products: + - kv +--- + +import { + CardGrid, + Description, + Feature, + LinkTitleCard, + Plan, + RelatedProduct, + Tabs, + TabItem, + LinkButton, +} from "~/components"; + + + +Create a global, low-latency, key-value data storage. + + + + + +Workers KV is a data storage that allows you to store and retrieve data globally. With Workers KV, you can build dynamic and performant APIs and websites that support high read volumes with low latency. + +For example, you can use Workers KV for: + +- Caching API responses. +- Storing user configurations / preferences. +- Storing user authentication details. + +Access your Workers KV namespace from Cloudflare Workers using [Workers Bindings](/workers/runtime-apis/bindings/) or from your external application using the REST API: + + + + + +```ts +export default { + async fetch(request, env, ctx): Promise { + // write a key-value pair + await env.KV.put('KEY', 'VALUE'); + + // read a key-value pair + const value = await env.KV.get('KEY'); + + // list all key-value pairs + const allKeys = await env.KV.list(); + + // delete a key-value pair + await env.KV.delete('KEY'); + + // return a Workers response + return new Response( + JSON.stringify({ + value: value, + allKeys: allKeys, + }), + ); + }, + +} satisfies ExportedHandler<{ KV: KVNamespace }>; + + ``` + + + +```json +{ + "$schema": "node_modules/wrangler/config-schema.json", + "name": "", + "main": "src/index.ts", + "compatibility_date": "2025-02-04", + "observability": { + "enabled": true + }, + + "kv_namespaces": [ + { + "binding": "KV", + "id": "" + } + ] +} +``` + + + + +See the full [Workers KV binding API reference](/kv/api/read-key-value-pairs/). + + + + + + + ``` + curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/storage/kv/namespaces/$NAMESPACE_ID/values/$KEY_NAME \ + -X PUT \ + -H 'Content-Type: multipart/form-data' \ + -H "X-Auth-Email: $CLOUDFLARE_EMAIL" \ + -H "X-Auth-Key: $CLOUDFLARE_API_KEY" \ + -d '{ + "value": "Some Value" + }' + + curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/storage/kv/namespaces/$NAMESPACE_ID/values/$KEY_NAME \ + -H "X-Auth-Email: $CLOUDFLARE_EMAIL" \ + -H "X-Auth-Key: $CLOUDFLARE_API_KEY" + ``` + + + ```ts + const client = new Cloudflare({ + apiEmail: process.env['CLOUDFLARE_EMAIL'], // This is the default and can be omitted + apiKey: process.env['CLOUDFLARE_API_KEY'], // This is the default and can be omitted + }); + + const value = await client.kv.namespaces.values.update('', 'KEY', { + account_id: '', + value: 'VALUE', + }); + + const value = await client.kv.namespaces.values.get('', 'KEY', { + account_id: '', + }); + + const value = await client.kv.namespaces.values.delete('', 'KEY', { + account_id: '', + }); + + // Automatically fetches more pages as needed. + for await (const namespace of client.kv.namespaces.list({ account_id: '' })) { + console.log(namespace.id); + } + + ``` + + + +See the full Workers KV [REST API and SDK reference](/api/resources/kv/) for details on using REST API from external applications, with pre-generated SDK's for external TypeScript, Python, or Go applications. + + + + +Get started + +--- + +## Features + + + Learn how Workers KV stores and retrieves data. + + + + +The Workers command-line interface, Wrangler, allows you to [create](/workers/wrangler/commands/general/#init), [test](/workers/wrangler/commands/general/#dev), and [deploy](/workers/wrangler/commands/pages/#pages-deploy) your Workers projects. + + + + + +Bindings allow your Workers to interact with resources on the Cloudflare developer platform, including [R2](/r2/), [Durable Objects](/durable-objects/), and [D1](/d1/). + + + +--- + +## Related products + + + +Cloudflare R2 Storage allows developers to store large amounts of unstructured data without the costly egress bandwidth fees associated with typical cloud storage services. + + + + + +Cloudflare Durable Objects allows developers to access scalable compute and permanent, consistent storage. + + + + + +Built on SQLite, D1 is Cloudflare’s first queryable relational database. Create an entire database by importing data or defining your tables and writing your queries within a Worker or through the API. + + + +--- + +### More resources + + + + + Learn about KV limits. + + + + Learn about KV pricing. + + + + Ask questions, show off what you are building, and discuss the platform + with other developers. + + + + Learn about product announcements, new tutorials, and what is new in + Cloudflare Developer Platform. + + + diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md new file mode 100644 index 0000000..dc80213 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md @@ -0,0 +1,393 @@ +--- +title: Batching, Retries and Delays +description: Configure message batching, retry behavior, and delivery delays for Cloudflare Queues. +pcx_content_type: concept +sidebar: + order: 2 +products: + - queues +--- + +import { WranglerConfig, TypeScriptExample, Tabs, TabItem } from "~/components"; + +## Batching + +When configuring a [consumer Worker](/queues/reference/how-queues-works#consumers) for a queue, you can also define how messages are batched as they are delivered. + +Batching can: + +1. Reduce the total number of times your consumer Worker needs to be invoked (which can reduce costs). +2. Allow you to batch messages when writing to an external API or service (reducing writes). +3. Disperse load over time, especially if your producer Workers are associated with user-facing activity. + +There are two ways to configure how messages are batched. You configure batching when connecting your consumer Worker to a queue. + +- `max_batch_size` - The maximum size of a batch delivered to a consumer (defaults to 10 messages). +- `max_batch_timeout` - the _maximum_ amount of time the queue will wait before delivering a batch to a consumer (defaults to 5 seconds) + +:::note[Batch size configuration] + +Both `max_batch_size` and `max_batch_timeout` work together. Whichever limit is reached first will trigger the delivery of a batch. + +::: + +For example, a `max_batch_size = 30` and a `max_batch_timeout = 10` means that if 30 messages are written to the queue, the consumer will receive a batch of 30 messages. However, if it takes longer than 10 seconds for those 30 messages to be written to the queue, then the consumer will get a batch of messages that contains however many messages were on the queue at the time (somewhere between 1 and 29, in this case). + +:::note[Empty queues] + +When a queue is empty, a push-based (Worker) consumer's `queue` handler will not be invoked until there are messages to deliver. A queue does not attempt to push empty batches to a consumer and thus does not invoke unnecessary reads. + +[Pull-based consumers](/queues/configuration/pull-consumers/) that attempt to pull from a queue, even when empty, will incur a read operation. + +::: + +When determining what size and timeout settings to configure, you will want to consider latency (how long can you wait to receive messages?), overall batch size (when writing to external systems), and cost (fewer-but-larger batches). + +### Batch settings + +The following batch-level settings can be configured to adjust how Queues delivers batches to your configured consumer. + + + +| Setting | Default | Minimum | Maximum | +| ----------------------------------------- | ----------- | --------- | ------------ | +| Maximum Batch Size `max_batch_size` | 10 messages | 1 message | 100 messages | +| Maximum Batch Timeout `max_batch_timeout` | 5 seconds | 0 seconds | 60 seconds | + + + +## Explicit acknowledgement and retries + +You can acknowledge individual messages within a batch by explicitly acknowledging each message as it is processed. Messages that are explicitly acknowledged will not be re-delivered, even if your queue consumer fails on a subsequent message and/or fails to return successfully when processing a batch. + +- Each message can be acknowledged as you process it within a batch, and avoids the entire batch from being re-delivered if your consumer throws an error during batch processing. +- Acknowledging individual messages is useful when you are calling external APIs, writing messages to a database, or otherwise performing non-idempotent (state changing) actions on individual messages. + +To explicitly acknowledge a message as delivered, call the `ack()` method on the message. + + + +```ts +export default { + async queue(batch, env, ctx): Promise { + for (const msg of batch.messages) { + // TODO: do something with the message + // Explicitly acknowledge the message as delivered + msg.ack(); + } + }, +} satisfies ExportedHandler; +``` + + +```python +from workers import WorkerEntrypoint + +class Default(WorkerEntrypoint): + async def queue(self, batch): + for msg in batch.messages: + # TODO: do something with the message + # Explicitly acknowledge the message as delivered + msg.ack() +``` + + + +You can also call `retry()` to explicitly force a message to be redelivered in a subsequent batch. This is referred to as "negative acknowledgement". This can be particularly useful when you want to process the rest of the messages in that batch without throwing an error that would force the entire batch to be redelivered. + + + +```ts +export default { + async queue(batch, env, ctx): Promise { + for (const msg of batch.messages) { + // TODO: do something with the message that fails + msg.retry(); + } + }, +} satisfies ExportedHandler; +``` + + +```python +from workers import WorkerEntrypoint + +class Default(WorkerEntrypoint): + async def queue(self, batch): + for msg in batch.messages: + # TODO: do something with the message that fails + msg.retry() +``` + + + +You can also acknowledge or negatively acknowledge messages at a batch level with `ackAll()` and `retryAll()`. Calling `ackAll()` on the batch of messages (`MessageBatch`) delivered to your consumer Worker has the same behaviour as a consumer Worker that successfully returns (does not throw an error). + +Note that calls to `ack()`, `retry()` and their `ackAll()` / `retryAll()` equivalents follow the below precedence rules: + +- If you call `ack()` on a message, subsequent calls to `ack()` or `retry()` are silently ignored. +- If you call `retry()` on a message and then call `ack()`: the `ack()` is ignored. The first method call wins in all cases. +- If you call either `ack()` or `retry()` on a single message, and then either/any of `ackAll()` or `retryAll()` on the batch, the call on the single message takes precedence. That is, the batch-level call does not apply to that message (or messages, if multiple calls were made). + +## Delivery failure + +When a message is failed to be delivered, the default behaviour is to retry delivery three times before marking the delivery as failed. You can set `max_retries` (defaults to 3) when configuring your consumer, but in most cases we recommend leaving this as the default. + +Messages that reach the configured maximum retries will be deleted from the queue, or if a [dead-letter queue](/queues/configuration/dead-letter-queues/) (DLQ) is configured, written to the DLQ instead. + +:::note + +Each retry counts as an additional read operation per [Queues pricing](/queues/platform/pricing/). + +::: + +When a single message within a batch fails to be delivered, the entire batch is retried, unless you have [explicitly acknowledged](#explicit-acknowledgement-and-retries) a message (or messages) within that batch. For example, if a batch of 10 messages is delivered, but the 8th message fails to be delivered, all 10 messages will be retried and thus redelivered to your consumer in full. + +:::caution[Retried messages and consumer concurrency] + +Retrying messages with `retry()` or calling `retryAll()` on a batch will **not** cause the consumer to autoscale down if consumer concurrency is enabled. Refer to [Consumer concurrency](/queues/configuration/consumer-concurrency/) to learn more. + +::: + +## Delay messages + +When publishing messages to a queue, or when [marking a message or batch for retry](#explicit-acknowledgement-and-retries), you can choose to delay messages from being processed for a period of time. + +Delaying messages allows you to defer tasks until later, and/or respond to backpressure when consuming from a queue. For example, if an upstream API you are calling to returns a `HTTP 429: Too Many Requests`, you can delay messages to slow down how quickly you are consuming them before they are re-processed. + +Messages can be delayed by up to 24 hours. + +:::note + +Configuring delivery and retry delays via the `wrangler` CLI or when [developing locally](/queues/configuration/local-development/) requires `wrangler` version `3.38.0` or greater. Use `npx wrangler@latest` to always use the latest version of `wrangler`. + +::: + +### Delay on send + +To delay a message or batch of messages when sending to a queue, you can provide a `delaySeconds` parameter when sending a message. + + + +```ts +// Delay a singular message by 600 seconds (10 minutes) +await env.YOUR_QUEUE.send(message, { delaySeconds: 600 }); + +// Delay a batch of messages by 300 seconds (5 minutes) +await env.YOUR_QUEUE.sendBatch(messages, { delaySeconds: 300 }); + +// Do not delay this message. +// If there is a global delay configured on the queue, ignore it. +await env.YOUR_QUEUE.sendBatch(messages, { delaySeconds: 0 }); +``` + + +```python +# Delay a singular message by 600 seconds (10 minutes) +await env.YOUR_QUEUE.send(message, delaySeconds=600) + +# Delay a batch of messages by 300 seconds (5 minutes) +await env.YOUR_QUEUE.sendBatch(messages, delaySeconds=300) + +# Do not delay this message. +# If there is a global delay configured on the queue, ignore it. +await env.YOUR_QUEUE.sendBatch(messages, delaySeconds=0) +``` + + + +You can also configure a default, global delay on a per-queue basis by passing `--delivery-delay-secs` when creating a queue via the `wrangler` CLI: + +```sh +# Delay all messages by 5 minutes as a default +npx wrangler queues create $QUEUE-NAME --delivery-delay-secs=300 +``` + +### Delay on retry + +When [consuming messages from a queue](/queues/reference/how-queues-works/#consumers), you can choose to [explicitly mark messages to be retried](#explicit-acknowledgement-and-retries). Messages can be retried and delayed individually, or as an entire batch. + +To delay an individual message within a batch: + + + +```ts +export default { + async queue(batch, env, ctx): Promise { + for (const msg of batch.messages) { + // Mark for retry and delay a singular message + // by 3600 seconds (1 hour) + msg.retry({ delaySeconds: 3600 }); + } + }, +} satisfies ExportedHandler; +``` + + +```python +from workers import WorkerEntrypoint + +class Default(WorkerEntrypoint): + async def queue(self, batch): + for msg in batch.messages: + # Mark for retry and delay a singular message + # by 3600 seconds (1 hour) + msg.retry(delaySeconds=3600) +``` + + + +To delay a batch of messages: + + + +```ts +export default { + async queue(batch, env, ctx): Promise { + // Mark for retry and delay a batch of messages + // by 600 seconds (10 minutes) + batch.retryAll({ delaySeconds: 600 }); + }, +} satisfies ExportedHandler; +``` + + +```python +from workers import WorkerEntrypoint + +class Default(WorkerEntrypoint): + async def queue(self, batch): + # Mark for retry and delay a batch of messages + # by 600 seconds (10 minutes) + batch.retryAll(delaySeconds=600) +``` + + + +You can also choose to set a default retry delay to any messages that are retried due to either implicit failure or when calling `retry()` explicitly. This is set at the consumer level, and is supported in both push-based (Worker) and pull-based (HTTP) consumers. + +Delays can be configured via the `wrangler` CLI: + +```sh +# Push-based consumers +# Delay any messages that are retried by 60 seconds (1 minute) by default. +npx wrangler@latest queues consumer worker add $QUEUE-NAME $WORKER_SCRIPT_NAME --retry-delay-secs=60 + +# Pull-based consumers +# Delay any messages that are retried by 60 seconds (1 minute) by default. +npx wrangler@latest queues consumer http add $QUEUE-NAME --retry-delay-secs=60 +``` + +Delays can also be configured in the [Wrangler configuration file](/workers/wrangler/configuration/#queues) with the `delivery_delay` setting for producers (when sending) and/or the `retry_delay` (when retrying) per-consumer: + + + +```jsonc +{ + "queues": { + "producers": [ + { + "binding": "", + "queue": "", + "delivery_delay": 60 // delay every message delivery by 1 minute + } + ], + "consumers": [ + { + "queue": "my-queue", + "retry_delay": 300 // delay any retried message by 5 minutes before re-attempting delivery + } + ] + } +} +``` + + + +If you use both the `wrangler` CLI and the [Wrangler configuration file](/workers/wrangler/configuration/) to change the settings associated with a queue or a queue consumer, the most recent configuration change will take effect. + +Refer to the [Queues REST API documentation](/api/resources/queues/subresources/consumers/methods/get/) to learn how to configure message delays and retry delays programmatically. + +### Message delay precedence + +Messages can be delayed by default at the queue level, or per-message (or batch). + +- Per-message/batch delay settings take precedence over queue-level settings. +- Setting `delaySeconds: 0` on a message when sending or retrying will ignore any queue-level delays and cause the message to be delivered in the next batch. +- A message sent or retried with `delaySeconds: ` to a queue with a shorter default delay will still respect the message-level setting. + +### Apply a backoff algorithm + +You can apply a backoff algorithm to increasingly delay messages based on the current number of attempts to deliver the message. + +Each message delivered to a consumer includes an `attempts` property that tracks the number of delivery attempts made. + +For example, to generate an [exponential backoff](https://en.wikipedia.org/wiki/Exponential_backoff) for a message, you can create a helper function that calculates this for you: + + + +```ts +function calculateExponentialBackoff( + attempts: number, + baseDelaySeconds: number, +): number { + return baseDelaySeconds ** attempts; +} +``` + + +```python +def calculate_exponential_backoff(attempts, base_delay_seconds): + return base_delay_seconds ** attempts +``` + + + +In your consumer, you then pass the value of `msg.attempts` and your desired delay factor as the argument to `delaySeconds` when calling `retry()` on an individual message: + + + +```ts +const BASE_DELAY_SECONDS = 30; + +export default { + async queue(batch, env, ctx): Promise { + for (const msg of batch.messages) { + // Mark for retry with exponential backoff + msg.retry({ + delaySeconds: calculateExponentialBackoff( + msg.attempts, + BASE_DELAY_SECONDS, + ), + }); + } + }, +} satisfies ExportedHandler; +``` + + +```python +from workers import WorkerEntrypoint + +BASE_DELAY_SECONDS = 30 + +class Default(WorkerEntrypoint): + async def queue(self, batch): + for msg in batch.messages: + # Mark for retry and delay a singular message + # by 3600 seconds (1 hour) + msg.retry( + delaySeconds=calculate_exponential_backoff( + msg.attempts, + BASE_DELAY_SECONDS, + ) + ) +``` + + + +## Related + +- Review the [JavaScript API](/queues/configuration/javascript-apis/) documentation for Queues. +- Learn more about [How Queues Works](/queues/reference/how-queues-works/). +- Understand the [metrics available](/queues/observability/metrics/) for your queues, including backlog and delayed message counts. \ No newline at end of file diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md new file mode 100644 index 0000000..072aa33 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md @@ -0,0 +1,140 @@ +--- +title: Consumer concurrency +description: Automatically scale out Queues consumer Workers horizontally to process messages faster. +pcx_content_type: concept +sidebar: + order: 5 +products: + - queues +--- + +import { WranglerConfig, DashButton } from "~/components"; + +Consumer concurrency allows a [consumer Worker](/queues/reference/how-queues-works/#consumers) processing messages from a queue to automatically scale out horizontally to keep up with the rate that messages are being written to a queue. + +In many systems, the rate at which you write messages to a queue can easily exceed the rate at which a single consumer can read and process those same messages. This is often because your consumer might be parsing message contents, writing to storage or a database, or making third-party (upstream) API calls. + +Note that queue producers are always scalable, up to the [maximum supported messages-per-second](/queues/platform/limits/) (per queue) limit. + +## Enable concurrency + +By default, all queues have concurrency enabled. Queue consumers will automatically scale up [to the maximum concurrent invocations](/queues/platform/limits/) as needed to manage a queue's backlog and/or error rates. + +## How concurrency works + +After processing a batch of messages, Queues will check to see if the number of concurrent consumers should be adjusted. The number of concurrent consumers invoked for a queue will autoscale based on several factors, including: + +- The number of messages in the queue (backlog) and its rate of growth. +- The ratio of failed (versus successful) invocations. A failed invocation is when your `queue()` handler returns an uncaught exception instead of `void` (nothing). +- The value of `max_concurrency` set for that consumer. + +Where possible, Queues will optimize for keeping your backlog from growing exponentially, in order to minimize scenarios where the backlog of messages in a queue grows to the point that they would reach the [message retention limit](/queues/platform/limits/) before being processed. + +:::note[Consumer concurrency and retried messages] + +[Retrying messages with `retry()`](/queues/configuration/batching-retries/#explicit-acknowledgement-and-retries) or calling `retryAll()` on a batch will **not** count as a failed invocation. + +::: + +### Example + +If you are writing 100 messages/second to a queue with a single concurrent consumer that takes 5 seconds to process a batch of 100 messages, the number of messages in-flight will continue to grow at a rate faster than your consumer can keep up. + +In this scenario, Queues will notice the growing backlog and will scale the number of concurrent consumer Workers invocations up to a steady-state of (approximately) five (5) until the rate of incoming messages decreases, the consumer processes messages faster, or the consumer begins to generate errors. + +### Why are my consumers not autoscaling? + +If your consumers are not autoscaling, there are a few likely causes: + +- `max_concurrency` has been set to 1. +- Your consumer Worker is returning errors rather than processing messages. Inspect your consumer to make sure it is healthy. +- A batch of messages is being processed. Queues checks if it should autoscale consumers only after processing an entire batch of messages, so it will not autoscale while a batch is being processed. Consider reducing batch sizes or refactoring your consumer to process messages faster. + +## Limit concurrency + +:::caution[Recommended concurrency setting] + +Cloudflare recommends leaving the maximum concurrency unset, which will allow your queue consumer to scale up as much as possible. Setting a fixed number means that your consumer will only ever scale up to that maximum, even as Queues increases the maximum supported invocations over time. + +::: + +If you have a workflow that is limited by an upstream API and/or system, you may prefer for your backlog to grow, trading off increased overall latency in order to avoid overwhelming an upstream system. + +You can configure the concurrency of your consumer Worker in two ways: + +1. Set concurrency settings in the Cloudflare dashboard +2. Set concurrency settings via the [Wrangler configuration file](/workers/wrangler/configuration/) + +### Set concurrency settings in the Cloudflare dashboard + +To configure the concurrency settings for your consumer Worker from the dashboard: + +1. In the Cloudflare dashboard, go to the **Queues** page. + + + +2. Select your queue > **Settings**. +3. Select **Edit Consumer** under Consumer details. +4. Set **Maximum consumer invocations** to a value between `1` and `250`. This value represents the maximum number of concurrent consumer invocations available to your queue. + +To remove a fixed maximum value, select **auto (recommended)**. + +Note that if you are writing messages to a queue faster than you can process them, messages may eventually reach the [maximum retention period](/queues/platform/limits/) set for that queue. Individual messages that reach that limit will expire from the queue and be deleted. + +### Set concurrency settings in the [Wrangler configuration file](/workers/wrangler/configuration/) + +:::note + +Ensure you are using the latest version of [wrangler](/workers/wrangler/install-and-update/). Support for configuring the maximum concurrency of a queue consumer is only supported in wrangler [`2.13.0`](https://github.com/cloudflare/workers-sdk/releases/tag/wrangler%402.13.0) or greater. + +::: + +To set a fixed maximum number of concurrent consumer invocations for a given queue, configure a `max_concurrency` in your Wrangler file: + + + +```jsonc +{ + "queues": { + "consumers": [ + { + "queue": "my-queue", + "max_concurrency": 1 + } + ] + } +} +``` + + + +To remove the limit, remove the `max_concurrency` setting from the `[[queues.consumers]]` configuration for a given queue and call `npx wrangler deploy` to push your configuration update. + + {/* Not yet available but will be very soon + + ### wrangler CLI + + ```sh + # where `N` is a positive integer between 1 and 250 + wrangler queues consumer update --max-concurrency=N + ``` + + To remove the limit and allow Queues to scale your consumer to the maximum number of invocations, call `consumer update` without any flags: + + ```sh + # Call update without passing a flag to allow concurrency to scale to the maximum + wrangler queues consumer update + ``` */} + +## Billing + +When multiple consumer Workers are invoked, each Worker invocation incurs [CPU time costs](/workers/platform/pricing/#workers). + +- If you intend to process all messages written to a queue, _the effective overall cost is the same_, even with concurrency enabled. +- Enabling concurrency simply brings those costs forward, and can help prevent messages from reaching the [message retention limit](/queues/platform/limits/). + +Billing for consumers follows the [Workers standard usage model](/workers/platform/pricing/#example-pricing) meaning a developer is billed for the request and for CPU time used in the request. + +### Example + +A consumer Worker that takes 2 seconds to process a batch of messages will incur the same overall costs to process 50 million (50,000,000) messages, whether it does so concurrently (faster) or individually (slower). diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md new file mode 100644 index 0000000..481b9a1 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md @@ -0,0 +1,117 @@ +--- +title: Use Queues from Durable Objects +summary: Publish to a queue from within a Durable Object. +pcx_content_type: example +sidebar: + order: 20 +head: + - tag: title + content: Queues - Use Queues and Durable Objects +description: Publish to a queue from within a Durable Object. +reviewed: 2023-09-13 +products: + - queues + - durable-objects +--- + +import { WranglerConfig } from "~/components"; + +The following example shows you how to write a Worker script to publish to [Cloudflare Queues](/queues/) from within a [Durable Object](/durable-objects/). + +Prerequisites: + +- A [queue created](/queues/get-started/#3-create-a-queue) via the Cloudflare dashboard or the [wrangler CLI](/workers/wrangler/install-and-update/). +- A [configured **producer** binding](/queues/configuration/configure-queues/#producer-worker-configuration) in the Cloudflare dashboard or Wrangler file. +- A [Durable Object namespace binding](/workers/wrangler/configuration/#durable-objects). + +Configure your Wrangler file as follows: + + + +```jsonc +{ + "$schema": "./node_modules/wrangler/config-schema.json", + "name": "my-worker", + "queues": { + "producers": [ + { + "queue": "my-queue", + "binding": "YOUR_QUEUE" + } + ] + }, + "durable_objects": { + "bindings": [ + { + "name": "YOUR_DO_CLASS", + "class_name": "YourDurableObject" + } + ] + }, + "migrations": [ + { + "tag": "v1", + "new_sqlite_classes": [ + "YourDurableObject" + ] + } + ] +} +``` + + + +The following Worker script: + +1. Creates a Durable Object stub, or retrieves an existing one based on a userId. +2. Passes request data to the Durable Object. +3. Publishes to a queue from within the Durable Object. + +Extending the `DurableObject` base class makes your `Env` available on `this.env` and the Durable Object state available on `this.ctx` within the [`fetch()` handler](/durable-objects/best-practices/create-durable-object-stubs-and-send-requests/) in the Durable Object. + +```ts +import { DurableObject } from "cloudflare:workers"; + +interface Env { + YOUR_QUEUE: Queue; + YOUR_DO_CLASS: DurableObjectNamespace; +} + +export default { + async fetch(req, env, ctx): Promise { + // Assume each Durable Object is mapped to a userId in a query parameter + // In a production application, this will be a userId defined by your application + // that you validate (and/or authenticate) first. + const url = new URL(req.url); + const userIdParam = url.searchParams.get("userId"); + + if (userIdParam) { + // Get a stub that allows you to call that Durable Object + const durableObjectStub = env.YOUR_DO_CLASS.getByName(userIdParam); + + // Pass the request to that Durable Object and await the response + // This invokes the constructor once on your Durable Object class (defined further down) + // on the first initialization, and the fetch method on each request. + // We pass the original Request to the Durable Object's fetch method + const response = await durableObjectStub.fetch(req); + + // This would return "wrote to queue", but you could return any response. + return response; + } + return new Response("userId must be provided", { status: 400 }); + }, +} satisfies ExportedHandler; + +export class YourDurableObject extends DurableObject { + async fetch(req: Request): Promise { + // Error handling elided for brevity. + // Publish to your queue + await this.env.YOUR_QUEUE.send({ + id: this.ctx.id.toString(), // Write the ID of the Durable Object to your queue + // Write any other properties to your queue + }); + + return new Response("wrote to queue"); + } +} +``` diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/get-started.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/get-started.md new file mode 100644 index 0000000..22f0b7d --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/get-started.md @@ -0,0 +1,265 @@ +--- +title: Getting started +description: Create your first Cloudflare Queue, a producer Worker, and a consumer Worker. +pcx_content_type: get-started +sidebar: + order: 2 +head: + - tag: title + content: Getting started +products: + - queues + - workers +--- + +import { Render, PackageManagers, WranglerConfig } from "~/components"; + +Cloudflare Queues is a flexible messaging queue that allows you to queue messages for asynchronous processing. By following this guide, you will create your first queue, a Worker to publish messages to that queue, and a consumer Worker to consume messages from that queue. + +## Prerequisites + +To use Queues, you will need: + + + +## 1. Create a Worker project + +You will access your queue from a Worker, the producer Worker. You must create at least one producer Worker to publish messages onto your queue. If you are using [R2 Bucket Event Notifications](/r2/buckets/event-notifications/), then you do not need a producer Worker. + +To create a producer Worker, run: + + + + + +This will create a new directory, which will include both a `src/index.ts` Worker script, and a [`wrangler.jsonc`](/workers/wrangler/configuration/) configuration file. After you create your Worker, you will create a Queue to access. + +Move into the newly created directory: + +```sh +cd producer-worker +``` + +## 2. Create a queue + +To use queues, you need to create at least one queue to publish messages to and consume messages from. + +To create a queue, run: + +```sh +npx wrangler queues create +``` + +Choose a name that is descriptive and relates to the types of messages you intend to use this queue for. Descriptive queue names look like: `debug-logs`, `user-clickstream-data`, or `password-reset-prod`. + +Queue names must be 1 to 63 characters long. Queue names cannot contain special characters outside dashes (`-`), and must start and end with a letter or number. + +You cannot change your queue name after you have set it. After you create your queue, you will set up your producer Worker to access it. + +## 3. Set up your producer Worker + +To expose your queue to the code inside your Worker, you need to connect your queue to your Worker by creating a binding. [Bindings](/workers/runtime-apis/bindings/) allow your Worker to access resources, such as Queues, on the Cloudflare developer platform. + +To create a binding, open your newly generated `wrangler.jsonc` file and add the following: + + + +```jsonc +{ + "queues": { + "producers": [ + { + "queue": "MY-QUEUE-NAME", + "binding": "MY_QUEUE" + } + ] + } +} +``` + + + +Replace `MY-QUEUE-NAME` with the name of the queue you created in [step 2](/queues/get-started/#2-create-a-queue). Next, replace `MY_QUEUE` with the name you want for your `binding`. The binding must be a valid JavaScript variable name. This is the variable you will use to reference this queue in your Worker. + +### Write your producer Worker + +You will now configure your producer Worker to create messages to publish to your queue. Your producer Worker will: + +1. Take a request it receives from the browser. +2. Transform the request to JSON format. +3. Write the request directly to your queue. + +In your Worker project directory, open the `src` folder and add the following to your `index.ts` file: + +```ts null {8} +export default { + async fetch(request, env, ctx): Promise { + const log = { + url: request.url, + method: request.method, + headers: Object.fromEntries(request.headers), + }; + await env..send(log); + return new Response("Success!"); + }, +} satisfies ExportedHandler; +``` + +Replace `MY_QUEUE` with the name you have set for your binding from your `wrangler.jsonc` file. + +Also add the queue to `Env` interface in `index.ts`. + +```ts null {2} +export interface Env { + : Queue; +} +``` + +If this write fails, your Worker will return an error (raise an exception). If this write works, it will return `Success` back with a HTTP `200` status code to the browser. + +In a production application, you would likely use a [`try...catch`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch) statement to catch the exception and handle it directly (for example, return a custom error or even retry). + +### Publish your producer Worker + +With your Wrangler file and `index.ts` file configured, you are ready to publish your producer Worker. To publish your producer Worker, run: + +```sh +npx wrangler deploy +``` + +You should see output that resembles the below, with a `*.workers.dev` URL by default. + +``` +Uploaded (0.76 sec) +Published (0.29 sec) + https://..workers.dev +``` + +Copy your `*.workers.dev` subdomain and paste it into a new browser tab. Refresh the page a few times to start publishing requests to your queue. Your browser should return the `Success` response after writing the request to the queue each time. + +You have built a queue and a producer Worker to publish messages to the queue. You will now create a consumer Worker to consume the messages published to your queue. Without a consumer Worker, the messages will stay on the queue until they expire, which defaults to four (4) days. + +## 4. Create your consumer Worker + +A consumer Worker receives messages from your queue. When the consumer Worker receives your queue's messages, it can write them to another source, such as a logging console or storage objects. + +In this guide, you will create a consumer Worker and use it to log and inspect the messages with [`wrangler tail`](/workers/wrangler/commands/general/#tail). You will create your consumer Worker in the same Worker project that you created your producer Worker. + +:::note + +Queues also supports [pull-based consumers](/queues/configuration/pull-consumers/), which allows any HTTP-based client to consume messages from a queue. This guide creates a push-based consumer using Cloudflare Workers. + +::: + +To create a consumer Worker, open your `index.ts` file and add the following `queue` handler to your existing `fetch` handler: + +```ts null {11} +export default { + async fetch(request, env, ctx): Promise { + const log = { + url: request.url, + method: request.method, + headers: Object.fromEntries(request.headers), + }; + await env..send(log); + return new Response("Success!"); + }, + async queue(batch, env, ctx): Promise { + for (const message of batch.messages) { + console.log("consumed from our queue:", JSON.stringify(message.body)); + } + }, +} satisfies ExportedHandler; +``` + +Replace `MY_QUEUE` with the name you have set for your binding from your `wrangler.jsonc` file. + +Every time messages are published to the queue, your consumer Worker's `queue` handler (`async queue`) is called and it is passed one or more messages. + +In this example, your consumer Worker transforms the queue's JSON formatted message into a string and logs that output. In a real world application, your consumer Worker can be configured to write messages to object storage (such as [R2](/r2/)), write to a database (like [D1](/d1/)), further process messages before calling an external API (such as an [email API](/workers/tutorials/)) or a data warehouse with your legacy cloud provider. + +When performing asynchronous tasks from within your consumer handler, use `waitUntil()` to ensure the response of the function is handled. Other asynchronous methods are not supported within the scope of this method. + +### Connect the consumer Worker to your queue + +After you have configured your consumer Worker, you are ready to connect it to your queue. + +Each queue can only have one consumer Worker connected to it. If you try to connect multiple consumers to the same queue, you will encounter an error when attempting to publish that Worker. + +To connect your queue to your consumer Worker, open your Wrangler file and add this to the bottom: + + + +```jsonc +{ + "queues": { + "consumers": [ + { + "queue": "", + // Required: this should match the name of the queue you created in step 3. + // If you misspell the name, you will receive an error when attempting to publish your Worker. + "max_batch_size": 10, // optional: defaults to 10 + "max_batch_timeout": 5 // optional: defaults to 5 seconds + } + ] + } +} +``` + + + +Replace `MY-QUEUE-NAME` with the queue you created in [step 2](/queues/get-started/#2-create-a-queue). + +In your consumer Worker, you are using queues to auto batch messages using the `max_batch_size` option and the `max_batch_timeout` option. The consumer Worker will receive messages in batches of `10` or every `5` seconds, whichever happens first. + +`max_batch_size` (defaults to 10) helps to reduce the amount of times your consumer Worker needs to be called. Instead of being called for every message, it will only be called after 10 messages have entered the queue. + +`max_batch_timeout` (defaults to 5 seconds) helps to reduce wait time. If the producer Worker is not sending up to 10 messages to the queue for the consumer Worker to be called, the consumer Worker will be called every 5 seconds to receive messages that are waiting in the queue. + +### Publish your consumer Worker + +With your Wrangler file and `index.ts` file configured, publish your consumer Worker by running: + +```sh +npx wrangler deploy +``` + +## 5. Read messages from your queue + +After you set up consumer Worker, you can read messages from the queue. + +Run `wrangler tail` to start waiting for our consumer to log the messages it receives: + +```sh +npx wrangler tail +``` + +With `wrangler tail` running, open the Worker URL you opened in [step 3](/queues/get-started/#3-set-up-your-producer-worker). + +You should receive a `Success` message in your browser window. + +If you receive a `Success` message, refresh the URL a few times to generate messages and push them onto the queue. + +With `wrangler tail` running, your consumer Worker will start logging the requests generated by refreshing. + +If you refresh less than 10 times, it may take a few seconds for the messages to appear because batch timeout is configured for 10 seconds. After 10 seconds, messages should arrive in your terminal. + +If you get errors when you refresh, check that the queue name you created in [step 2](/queues/get-started/#2-create-a-queue) and the queue you referenced in your Wrangler file is the same. You should ensure that your producer Worker is returning `Success` and is not returning an error. + +By completing this guide, you have now created a queue, a producer Worker that publishes messages to that queue, and a consumer Worker that consumes those messages from it. + +## Related resources + +- Learn more about [Cloudflare Workers](/workers/) and the applications you can build on Cloudflare. diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/index.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/index.md new file mode 100644 index 0000000..1d14829 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/index.md @@ -0,0 +1,112 @@ +--- +title: Cloudflare Queues +description: Send and receive messages with guaranteed delivery using Cloudflare Queues integrated with Workers. +pcx_content_type: overview +sidebar: + order: 1 +head: + - tag: title + content: Overview +products: + - queues + - workers +--- + +import { CardGrid, Description, Feature, LinkTitleCard, Plan, RelatedProduct, LinkButton } from "~/components" + + + + +Send and receive messages with guaranteed delivery and no charges for egress bandwidth. + + + + + + +Cloudflare Queues integrate with [Cloudflare Workers](/workers/) and enable you to build applications that can [guarantee delivery](/queues/reference/delivery-guarantees/), [offload work from a request](/queues/reference/how-queues-works/), [send data from Worker to Worker](/queues/configuration/configure-queues/), and [buffer or batch data](/queues/configuration/batching-retries/). + +Get started + +*** + +## Features + + + +Cloudflare Queues allows you to batch, retry and delay messages. + + + + + + +Redirect your messages when a delivery failure occurs. + + + + + + +Configure pull-based consumers to pull from a queue over HTTP from infrastructure outside of Cloudflare Workers. + + + + +*** + +## Related products + + + +Cloudflare R2 Storage allows developers to store large amounts of unstructured data without the costly egress bandwidth fees associated with typical cloud storage services. + + + + + + +Cloudflare Workers allows developers to build serverless applications and deploy instantly across the globe for exceptional performance, reliability, and scale. + + + + +*** + +## More resources + + + + +Learn about pricing. + + + +Learn about Queues limits. + + + +Try Cloudflare Queues which can run on your local machine. + + + +Follow @CloudflareDev on Twitter to learn about product announcements, and what is new in Cloudflare Workers. + + + +Connect with the Workers community on Discord to ask questions, show what you are building, and discuss the platform with other developers. + + + +Learn how to configure Cloudflare Queues using Wrangler. + + + +Learn how to use JavaScript APIs to send and receive messages to a Cloudflare Queue. + + + +Learn how to configure and manage event subscriptions for your queues. + + + diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/reference/delivery-guarantees.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/reference/delivery-guarantees.md new file mode 100644 index 0000000..1f78e32 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/reference/delivery-guarantees.md @@ -0,0 +1,19 @@ +--- +title: Delivery guarantees +description: Cloudflare Queues provides at-least-once message delivery by default. +pcx_content_type: concept +sidebar: + order: 2 +products: + - queues +--- + +Delivery guarantees define how strongly a messaging system enforces the delivery of messages it processes. + +As you make stronger guarantees about message delivery, the system needs to perform more checks and acknowledgments to ensure that messages are delivered, or maintain state to ensure a message is only delivered the specified number of times. This increases the latency of the system and reduces the overall throughput of the system. Each message may require an additional internal acknowledgements, and an equivalent number of additional roundtrips, before it can be considered delivered. + +* **Queues provides *at least once* delivery by default** in order to optimize for reliability. +* This means that messages are guaranteed to be delivered at least once, and in rare occasions, may be delivered more than once. +* For the majority of applications, this is the right balance between not losing any messages and minimizing end-to-end latency, as exactly once delivery incurs additional overheads in any messaging system. + +In cases where processing the same message more than once would introduce unintended behaviour, generating a unique ID when writing the message to the queue and using that as the primary key on database inserts and/or as an idempotency key to de-duplicate the message after processing. For example, using this idempotency key as the ID in an upstream email API or payment API will allow those services to reject the duplicate on your behalf, without you having to carry additional state in your application. diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md new file mode 100644 index 0000000..efc6499 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md @@ -0,0 +1,240 @@ +--- +title: How Queues Works +description: Learn about Queues architecture including producers, consumers, and message lifecycle. +pcx_content_type: concept +sidebar: + order: 1 +products: + - queues +--- + +import { WranglerConfig } from "~/components"; + +Cloudflare Queues is a flexible messaging queue that allows you to queue messages for asynchronous processing. Message queues are great at decoupling components of applications, like the checkout and order fulfillment services for an e-commerce site. Decoupled services are easier to reason about, deploy, and implement, allowing you to ship features that delight your customers without worrying about synchronizing complex deployments. Queues also allow you to batch and buffer calls to downstream services and APIs. + +There are four major concepts to understand with Queues: + +1. [Queues](#what-is-a-queue) +2. [Producers](#producers) +3. [Consumers](#consumers) +4. [Messages](#messages) + +## What is a queue + +A queue is a buffer or list that automatically scales as messages are written to it, and allows a consumer Worker to pull messages from that same queue. + +Queues are designed to be reliable, and messages written to a queue should never be lost once the write succeeds. Similarly, messages are not deleted from a queue until the [consumer](#consumers) has successfully consumed the message. + +Queues does not guarantee that messages will be delivered to a consumer in the same order in which they are published. + +Developers can create multiple queues. Creating multiple queues can be useful to: + +* Separate different use-cases and processing requirements: for example, a logging queue vs. a password reset queue. +* Horizontally scale your overall throughput (messages per second) by using multiple queues to scale out. +* Configure different batching strategies for each consumer connected to a queue. + +For most applications, a single producer Worker per queue, with a single consumer Worker consuming messages from that queue allows you to logically separate the processing for each of your queues. + +## Producers + +A producer is the term for a client that is publishing or producing messages on to a queue. A producer is configured by [binding](/workers/runtime-apis/bindings/) a queue to a Worker and writing messages to the queue by calling that binding. + +For example, if we bound a queue named `my-first-queue` to a binding of `MY_FIRST_QUEUE`, messages can be written to the queue by calling `send()` on the binding: + +```ts +interface Env { + readonly MY_FIRST_QUEUE: Queue; +} + +export default { + async fetch(req, env, ctx): Promise { + const message = { + url: req.url, + method: req.method, + headers: Object.fromEntries(req.headers), + }; + + await env.MY_FIRST_QUEUE.send(message); // This will throw an exception if the send fails for any reason + return new Response("Sent!"); + }, +} satisfies ExportedHandler; +``` + +:::note + + +You can also use [`context.waitUntil()`](/workers/runtime-apis/context/#waituntil) to send the message without blocking the response. + +Note that because `waitUntil()` is non-blocking, any errors raised from the `send()` or `sendBatch()` methods on a queue will be implicitly ignored. + + +::: + +A queue can have multiple producer Workers. For example, you may have multiple producer Workers writing events or logs to a shared queue based on incoming HTTP requests from users. There is no limit to the total number of producer Workers that can write to a single queue. + +Additionally, multiple queues can be bound to a single Worker. That single Worker can decide which queue to write to (or write to multiple) based on any logic you define in your code. + +### Content types + +Messages published to a queue can be published in different formats, depending on what interoperability is needed with your consumer. The default content type is `json`, which means that any object that can be passed to `JSON.stringify()` will be accepted. + +To explicitly set the content type or specify an alternative content type, pass the `contentType` option to the `send()` method of your queue: + +```ts +interface Env { + readonly MY_FIRST_QUEUE: Queue; +} + +export default { + async fetch(req, env, ctx): Promise { + const message = { + url: req.url, + method: req.method, + headers: Object.fromEntries(req.headers), + }; + try { + await env.MY_FIRST_QUEUE.send(message, { contentType: "json" }); // "json" is the default + return new Response("Sent!"); + } catch (e) { + // Catch cases where send fails, including due to a mismatched content type + const msg = e instanceof Error ? e.message : "Unknown error"; + return Response.json({ error: msg }, { status: 500 }); + } + }, +} satisfies ExportedHandler; +``` + +To only accept simple strings when writing to a queue, set `{ contentType: "text" }` instead: + +```ts +interface Env { + readonly MY_FIRST_QUEUE: Queue; +} + +export default { + async fetch(req, env, ctx): Promise { + try { + // This will throw an exception (error) if you pass a non-string to the queue, + // such as a native JavaScript object or ArrayBuffer. + await env.MY_FIRST_QUEUE.send("hello there", { contentType: "text" }); // explicitly set 'text' + return new Response("Sent!"); + } catch (e) { + const msg = e instanceof Error ? e.message : "Unknown error"; + return Response.json({ error: msg }, { status: 500 }); + } + }, +} satisfies ExportedHandler; +``` + +The [`QueuesContentType`](/queues/configuration/javascript-apis/#queuescontenttype) API documentation describes how each format is serialized to a queue. + +## Consumers + +Queues supports two types of consumer: + +1. A [consumer Worker](/queues/configuration/configure-queues/), which is push-based: the Worker is invoked when the queue has messages to deliver. +2. A [HTTP pull consumer](/queues/configuration/pull-consumers/), which is pull-based: the consumer calls the queue endpoint over HTTP to receive and then acknowledge messages. + +A queue can only have one type of consumer configured. + +### Create a consumer Worker + +A consumer is the term for a client that is subscribing to or *consuming* messages from a queue. In its most basic form, a consumer is defined by creating a `queue` handler in a Worker: + +```ts +interface Env { + // Add your bindings here, e.g. KV namespaces, R2 buckets, D1 databases +} + +export default { + async queue(batch, env, ctx): Promise { + // Do something with messages in the batch + // i.e. write to R2 storage, D1 database, or POST to an external API + for (const msg of batch.messages) { + // Process each message + console.log(msg.body); + } + }, +} satisfies ExportedHandler; +``` + +You then connect that consumer to a queue with `wrangler queues consumer ` or by defining a `[[queues.consumers]]` configuration in your [Wrangler configuration file](/workers/wrangler/configuration/) manually: + + + +```jsonc +{ + "queues": { + "consumers": [ + { + "queue": "", + "max_batch_size": 100, // optional + "max_batch_timeout": 30 // optional + } + ] + } +} +``` + + + +Importantly, each queue can only have one active consumer. This allows Cloudflare Queues to achieve at least once delivery and minimize the risk of duplicate messages beyond that. + +:::note[Best practice] + + +Configure a single consumer per queue. This both logically separates your queues, and ensures that errors (failures) in processing messages from one queue do not impact your other queues. + + +::: + +Notably, you can use the same consumer with multiple queues. The queue handler that defines your consumer Worker will be invoked by the queues it is connected to. + +* The `MessageBatch` that is passed to your `queue` handler includes a `queue` property with the name of the queue the batch was read from. +* This can reduce the amount of code you need to write, and allow you to process messages based on the name of your queues. + +For example, a consumer configured to consume messages from multiple queues would resemble the following: + +```ts +interface Env { + // Add your bindings here +} + +export default { + async queue(batch, env, ctx): Promise { + // MessageBatch has a `queue` property we can switch on + switch (batch.queue) { + case "log-queue": + // Write the batch to R2 + break; + case "debug-queue": + // Write the message to the console or to another queue + break; + case "email-reset": + // Trigger a password reset email via an external API + break; + default: + // Handle messages we haven't mentioned explicitly (write a log, push to a DLQ) + break; + } + }, +} satisfies ExportedHandler; +``` + +### Remove a consumer + +To remove a queue from your project, run `wrangler queues consumer remove ` and then remove the desired queue below the `[[queues.consumers]]` in Wrangler file. + +### Pull consumers + +A queue can have a HTTP-based consumer that pulls from the queue, instead of messages being pushed to a Worker. + +This consumer can be any HTTP-speaking service that can communicate over the Internet. Review the [pull consumer guide](/queues/configuration/pull-consumers/) to learn how to configure a pull-based consumer for a queue. + +## Messages + +A message is the object you are producing to and consuming from a queue. + +Any JSON serializable object can be published to a queue. For most developers, this means either simple strings or JSON objects. You can explicitly [set the content type](#content-types) when sending a message. + +Messages themselves can be [batched when delivered to a consumer](/queues/configuration/batching-retries/). By default, messages within a batch are treated as all or nothing when determining retries. If the last message in a batch fails to be processed, the entire batch will be retried. You can also choose to [explicitly acknowledge](/queues/configuration/batching-retries/) messages as they are successfully processed, and/or mark individual messages to be retried. diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md new file mode 100644 index 0000000..9c3fbed --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md @@ -0,0 +1,562 @@ +--- +pcx_content_type: reference +title: Workers API reference +description: Complete reference for the R2 in-Worker API, including bucket and object operations. +products: + - r2 +--- + +import { Type, MetaInfo, WranglerConfig, TabItem, Tabs } from "~/components"; + +The in-Worker R2 API is accessed by binding an R2 bucket to a [Worker](/workers). The Worker you write can expose external access to buckets via a route or manipulate R2 objects internally. + +The R2 API includes some extensions and semantic differences from the S3 API. If you need S3 compatibility, consider using the [S3-compatible API](/r2/api/s3/). + +## Concepts + +R2 organizes the data you store, called objects, into containers, called buckets. Buckets are the fundamental unit of performance, scaling, and access within R2. + +## Create a binding + +:::note[Bindings] + +A binding is how your Worker interacts with external resources such as [KV Namespaces](/kv/concepts/kv-namespaces/), [Durable Objects](/durable-objects/), or [R2 Buckets](/r2/buckets/). A binding is a runtime variable that the Workers runtime provides to your code. You can declare a variable name in your Wrangler file that will be bound to these resources at runtime, and interact with them through this variable. Every binding's variable name and behavior is determined by you when deploying the Worker. Refer to [Environment Variables](/workers/configuration/environment-variables/) for more information. + +A binding is defined in the Wrangler file of your Worker project's directory. + +::: + +To bind your R2 bucket to your Worker, add the following to your Wrangler file. Update the `binding` property to a valid JavaScript variable identifier and `bucket_name` to the name of your R2 bucket: + + + +```jsonc +{ + "r2_buckets": [ + { + "binding": "MY_BUCKET", // <~ valid JavaScript variable name + "bucket_name": "" + } + ] +} +``` + + + +Within your Worker, your bucket binding is now available under the `MY_BUCKET` variable and you can begin interacting with it using the [bucket methods](#bucket-method-definitions) described below. + +## Bucket method definitions + +The following methods are available on the bucket binding object injected into your code. + +For example, to issue a `PUT` object request using the binding above: + + + +```js +export default { + async fetch(request, env) { + const url = new URL(request.url); + const key = url.pathname.slice(1); + + switch (request.method) { + case "PUT": + await env.MY_BUCKET.put(key, request.body); + return new Response(`Put ${key} successfully!`); + + default: + return new Response(`${request.method} is not allowed.`, { + status: 405, + headers: { + Allow: "PUT", + }, + }); + } + }, +}; +``` + + + + +```py +from workers import WorkerEntrypoint, Response +from urllib.parse import urlparse + +class Default(WorkerEntrypoint): + async def fetch(self, request): + url = urlparse(request.url) + key = url.path[1:] + + if request.method == "PUT": + await self.env.MY_BUCKET.put(key, request.body) + return Response(f"Put {key} successfully!") + else: + return Response( + f"{request.method} is not allowed.", + status=405, + headers={"Allow": "PUT"} + ) +``` + + + + +- `head` + + - Retrieves the `R2Object` for the given key containing only object metadata, if the key exists, and `null` if the key does not exist. + +- `get` + + - Retrieves the `R2ObjectBody` for the given key containing object metadata and the object body as a ReadableStream, if the key exists, and `null` if the key does not exist. + - In the event that a precondition specified in options fails, get() returns an R2Object with body undefined. + +- `put` + + - Stores the given value and metadata under the associated key. Once the write succeeds, returns an `R2Object` containing metadata about the stored Object. + - In the event that a precondition specified in options fails, put() returns `null`, and the object will not be stored. + - R2 writes are strongly consistent. Once the Promise resolves, all subsequent read operations will see this key value pair globally. + +- `delete` + + - Deletes the given values and metadata under the associated keys. Once the delete succeeds, returns void. + - R2 deletes are strongly consistent. Once the Promise resolves, all subsequent read operations will no longer see the provided key value pairs globally. + - Up to 1000 keys may be deleted per call. + +- `list` + + * Returns an R2Objects containing a list of R2Object contained within the bucket. + * The returned list of objects is ordered lexicographically. + * Returns up to 1000 entries, but may return less in order to minimize memory pressure within the Worker. + * To explicitly set the number of objects to list, provide an [R2ListOptions](/r2/api/workers/workers-api-reference/#r2listoptions) object with the `limit` property set. + +* `createMultipartUpload` + + - Creates a multipart upload. + - Returns Promise which resolves to an `R2MultipartUpload` object representing the newly created multipart upload. Once the multipart upload has been created, the multipart upload can be immediately interacted with globally, either through the Workers API, or through the S3 API. + +- `resumeMultipartUpload` + + - Returns an object representing a multipart upload with the given key and uploadId. + - The resumeMultipartUpload operation does not perform any checks to ensure the validity of the uploadId, nor does it verify the existence of a corresponding active multipart upload. This is done to minimize latency before being able to call subsequent operations on the `R2MultipartUpload` object. + +## `R2Object` definition + +`R2Object` is created when you `PUT` an object into an R2 bucket. `R2Object` represents the metadata of an object based on the information provided by the uploader. Every object that you `PUT` into an R2 bucket will have an `R2Object` created. + +- `key` + + - The object's key. + +- `version` + + - Random unique string associated with a specific upload of a key. + +- `size` + + - Size of the object in bytes. + +- `etag` + +:::note + +Cloudflare recommends using the `httpEtag` field when returning an etag in a response header. This ensures the etag is quoted and conforms to [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110#section-8.8.3). +::: + +- The etag associated with the object upload. + +- `httpEtag` + + - The object's etag, in quotes so as to be returned as a header. + +- `uploaded` + + - A Date object representing the time the object was uploaded. + +- `httpMetadata` + + - Various HTTP headers associated with the object. Refer to [HTTP Metadata](#http-metadata). + +- `customMetadata` + + - A map of custom, user-defined metadata associated with the object. + +- `range` + + - A `R2Range` object containing the returned range of the object. + +- `checksums` + + - A `R2Checksums` object containing the stored checksums of the object. Refer to [checksums](#checksums). + +- `writeHttpMetadata` + + - Retrieves the `httpMetadata` from the `R2Object` and applies their corresponding HTTP headers to the `Headers` input object. Refer to [HTTP Metadata](#http-metadata). + +- `storageClass` + + - The storage class associated with the object. Refer to [Storage Classes](#storage-class). + +- `ssecKeyMd5` + + - Hex-encoded MD5 hash of the [SSE-C](/r2/examples/ssec) key used for encryption (if one was provided). Hash can be used to identify which key is needed to decrypt object. + +## `R2ObjectBody` definition + +`R2ObjectBody` represents an object's metadata combined with its body. It is returned when you `GET` an object from an R2 bucket. The full list of keys for `R2ObjectBody` includes the list below and all keys inherited from [`R2Object`](#r2object-definition). + +- `body` + + - The object's value. + +- `bodyUsed` + + - Whether the object's value has been consumed or not. + +- `arrayBuffer` + + - Returns a Promise that resolves to an `ArrayBuffer` containing the object's value. + +- `text` + + - Returns a Promise that resolves to a string containing the object's value. + +- `json` + + - Returns a Promise that resolves to the given object containing the object's value. + +- `blob` + + - Returns a Promise that resolves to a binary Blob containing the object's value. + +## `R2MultipartUpload` definition + +An `R2MultipartUpload` object is created when you call `createMultipartUpload` or `resumeMultipartUpload`. `R2MultipartUpload` is a representation of an ongoing multipart upload. + +Uncompleted multipart uploads will be automatically aborted after 7 days. + +:::note + +An `R2MultipartUpload` object does not guarantee that there is an active underlying multipart upload corresponding to that object. + +A multipart upload can be completed or aborted at any time, either through the S3 API, or by a parallel invocation of your Worker. Therefore it is important to add the necessary error handling code around each operation on a `R2MultipartUpload` object in case the underlying multipart upload no longer exists. + +::: + +- `key` + + - The `key` for the multipart upload. + +- `uploadId` + + - The `uploadId` for the multipart upload. + +- `uploadPart` + + - Uploads a single part with the specified part number to this multipart upload. Each part must be uniform in size with an exception for the final part which can be smaller. + - Returns an `R2UploadedPart` object containing the `etag` and `partNumber`. These `R2UploadedPart` objects are required when completing the multipart upload. + +- `abort` + + - Aborts the multipart upload. Returns a Promise that resolves when the upload has been successfully aborted. + +- `complete` + + - Completes the multipart upload with the given parts. + - Returns a Promise that resolves when the complete operation has finished. Once this happens, the object is immediately accessible globally by any subsequent read operation. + +## Method-specific types + +### R2GetOptions + +- `onlyIf` + + - Specifies that the object should only be returned given satisfaction of certain conditions in the `R2Conditional` or in the conditional Headers. Refer to [Conditional operations](#conditional-operations). + +- `range` + + - Specifies that only a specific length (from an optional offset) or suffix of bytes from the object should be returned. Refer to [Ranged reads](#ranged-reads). + +- `ssecKey` + + - Specifies a key to be used for [SSE-C](/r2/examples/ssec). Key must be 32 bytes in length, in the form of a hex-encoded string or an ArrayBuffer. + +#### Ranged reads + +`R2GetOptions` accepts a `range` parameter, which can be used to restrict the data returned in `body`. + +There are 3 variations of arguments that can be used in a range: + +- An offset with an optional length. +- An optional offset with a length. +- A suffix. + +- `offset` + + - The byte to begin returning data from, inclusive. + +- `length` + + - The number of bytes to return. If more bytes are requested than exist in the object, fewer bytes than this number may be returned. + +- `suffix` + + - The number of bytes to return from the end of the file, starting from the last byte. If more bytes are requested than exist in the object, fewer bytes than this number may be returned. + +### R2PutOptions + +- `onlyIf` + + - Specifies that the object should only be stored given satisfaction of certain conditions in the `R2Conditional`. Refer to [Conditional operations](#conditional-operations). + +- `httpMetadata` + + - Various HTTP headers associated with the object. Refer to [HTTP Metadata](#http-metadata). + +- `customMetadata` + + - A map of custom, user-defined metadata that will be stored with the object. + +:::note + +Only a single hashing algorithm can be specified at once. + +::: + +- `md5` + + - A md5 hash to use to check the received object's integrity. + +- `sha1` + + - A SHA-1 hash to use to check the received object's integrity. + +- `sha256` + + - A SHA-256 hash to use to check the received object's integrity. + +- `sha384` + + - A SHA-384 hash to use to check the received object's integrity. + +- `sha512` + + - A SHA-512 hash to use to check the received object's integrity. + +- `storageClass` + + - Sets the storage class of the object if provided. Otherwise, the object will be stored in the default storage class associated with the bucket. Refer to [Storage Classes](#storage-class). + +- `ssecKey` + + - Specifies a key to be used for [SSE-C](/r2/examples/ssec). Key must be 32 bytes in length, in the form of a hex-encoded string or an ArrayBuffer. + +### R2MultipartOptions + +- `httpMetadata` + + - Various HTTP headers associated with the object. Refer to [HTTP Metadata](#http-metadata). + +- `customMetadata` + + - A map of custom, user-defined metadata that will be stored with the object. + +- `storageClass` + + - Sets the storage class of the object if provided. Otherwise, the object will be stored in the default storage class associated with the bucket. Refer to [Storage Classes](#storage-class). + +- `ssecKey` + + - Specifies a key to be used for [SSE-C](/r2/examples/ssec). Key must be 32 bytes in length, in the form of a hex-encoded string or an ArrayBuffer. + +### R2ListOptions + +- `limit` + + - The number of results to return. Defaults to `1000`, with a maximum of `1000`. + + - If `include` is set, you may receive fewer than `limit` results in your response to accommodate metadata. + +- `prefix` + + - The prefix to match keys against. Keys will only be returned if they start with given prefix. + +- `cursor` + + - An opaque token that indicates where to continue listing objects from. A cursor can be retrieved from a previous list operation. + +- `delimiter` + + - The character to use when grouping keys. + +- `include` + + - Can include `httpMetadata` and/or `customMetadata`. If included, items returned by the list will include the specified metadata. + + - Note that there is a limit on the total amount of data that a single `list` operation can return. If you request data, you may receive fewer than `limit` results in your response to accommodate metadata. + + - The [compatibility date](/workers/configuration/compatibility-dates/) must be set to `2022-08-04` or later in your Wrangler file. If not, then the `r2_list_honor_include` compatibility flag must be set. Otherwise it is treated as `include: ['httpMetadata', 'customMetadata']` regardless of what the `include` option provided actually is. + + This means applications must be careful to avoid comparing the amount of returned objects against your `limit`. Instead, use the `truncated` property to determine if the `list` request has more data to be returned. + + +```js +const options = { + limit: 500, + include: ["customMetadata"], +}; + +const listed = await env.MY_BUCKET.list(options); + +let truncated = listed.truncated; +let cursor = truncated ? listed.cursor : undefined; + +// ❌ - if your limit can't fit into a single response or your +// bucket has less objects than the limit, it will get stuck here. +while (listed.objects.length < options.limit) { + // ... +} + +// ✅ - use the truncated property to check if there are more +// objects to be returned +while (truncated) { + const next = await env.MY_BUCKET.list({ + ...options, + cursor: cursor, + }); + listed.objects.push(...next.objects); + + truncated = next.truncated; + cursor = next.cursor; +} +``` + +```py +limit = 500 +include = ["customMetadata"] + +listed = await self.env.MY_BUCKET.list(limit=limit, include=include) + +truncated = listed.truncated +cursor = listed.cursor if truncated else None + +# ❌ - if your limit can't fit into a single response or your +# bucket has less objects than the limit, it will get stuck here. +while len(listed.objects) < limit: + ... + +# ✅ - use the truncated property to check if there are more +# objects to be returned +while truncated: + next_page = await self.env.MY_BUCKET.list(limit=limit, include=include, cursor=cursor) + listed.objects.extend(next_page.objects) + + truncated = next_page.truncated + cursor = next_page.cursor +``` + + +### R2Objects + +An object containing an `R2Object` array, returned by `BUCKET_BINDING.list()`. + +- `objects` + + - An array of objects matching the `list` request. + +- `truncated` boolean + + - If true, indicates there are more results to be retrieved for the current `list` request. + +- `cursor` + + - A token that can be passed to future `list` calls to resume listing from that point. Only present if truncated is true. + +- `delimitedPrefixes` + + - If a delimiter has been specified, contains all prefixes between the specified prefix and the next occurrence of the delimiter. + + - For example, if no prefix is provided and the delimiter is '/', `foo/bar/baz` would return `foo` as a delimited prefix. If `foo/` was passed as a prefix with the same structure and delimiter, `foo/bar` would be returned as a delimited prefix. + +### Conditional operations + +You can pass an `R2Conditional` object to `R2GetOptions` and `R2PutOptions`. If the condition check for `get()` fails, the body will not be returned. This will make `get()` have lower latency. + +If the condition check for `put()` fails, `null` will be returned instead of the `R2Object`. + +- `etagMatches` + + - Performs the operation if the object's etag matches the given string. + +- `etagDoesNotMatch` + + - Performs the operation if the object's etag does not match the given string. + +- `uploadedBefore` + + - Performs the operation if the object was uploaded before the given date. + +- `uploadedAfter` + + - Performs the operation if the object was uploaded after the given date. + +Alternatively, you can pass a `Headers` object containing conditional headers to `R2GetOptions` and `R2PutOptions`. For information on these conditional headers, refer to [the MDN docs on conditional requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Conditional_requests#conditional_headers). All conditional headers aside from `If-Range` are supported. + +For more specific information about conditional requests, refer to [RFC 7232](https://datatracker.ietf.org/doc/html/rfc7232). + +### HTTP Metadata + +Generally, these fields match the HTTP metadata passed when the object was created. They can be overridden when issuing `GET` requests, in which case, the given values will be echoed back in the response. + +- `contentType` + +- `contentLanguage` + +- `contentDisposition` + +- `contentEncoding` + +- `cacheControl` + +- `cacheExpiry` + +### Checksums + +If a checksum was provided when using the `put()` binding, it will be available on the returned object under the `checksums` property. The MD5 checksum will be included by default for non-multipart objects. + +- `md5` + + - The MD5 checksum of the object. + +- `sha1` + + - The SHA-1 checksum of the object. + +- `sha256` + + - The SHA-256 checksum of the object. + +- `sha384` + + - The SHA-384 checksum of the object. + +- `sha512` + + - The SHA-512 checksum of the object. + +### `R2UploadedPart` + +An `R2UploadedPart` object represents a part that has been uploaded. `R2UploadedPart` objects are returned from `uploadPart` operations and must be passed to `completeMultipartUpload` operations. + +- `partNumber` + + - The number of the part. + +- `etag` + + - The `etag` of the part. + +### Storage Class + +The storage class where an `R2Object` is stored. The available storage classes are `Standard` and `InfrequentAccess`. Refer to [Storage classes](/r2/buckets/storage-classes/) +for more information. diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/buckets/create-buckets.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/buckets/create-buckets.md new file mode 100644 index 0000000..a5f87a5 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/buckets/create-buckets.md @@ -0,0 +1,51 @@ +--- +pcx_content_type: how-to +title: Create new buckets +description: Create R2 buckets using the Cloudflare dashboard or Wrangler CLI. +sidebar: + order: 1 +products: + - r2 +--- + +You can create a bucket from the Cloudflare dashboard or using Wrangler. + +:::note + +Wrangler is [a command-line tool](/workers/wrangler/install-and-update/) for building with Cloudflare's developer products, including R2. + +The R2 support in Wrangler allows you to manage buckets and perform basic operations against objects in your buckets. For more advanced use-cases, including bulk uploads or mirroring files from legacy object storage providers, we recommend [rclone](/r2/examples/rclone/) or an [S3-compatible](/r2/api/s3/) tool of your choice. + +::: + +## Bucket-Level Operations + +Create a bucket with the [`r2 bucket create`](/workers/wrangler/commands/r2/#r2-bucket-create) command: + +```sh +wrangler r2 bucket create your-bucket-name +``` + +:::note + +- Bucket names can only contain lowercase letters (a-z), numbers (0-9), and hyphens (-). +- Bucket names cannot begin or end with a hyphen. +- Bucket names can only be between 3-63 characters in length. + +The placeholder text is only for the example. + +::: + +List buckets in the current account with the [`r2 bucket list`](/workers/wrangler/commands/r2/#r2-bucket-list) command: + +```sh +wrangler r2 bucket list +``` + +To delete a bucket, you must first empty it and then delete it. For detailed instructions, refer to [Delete buckets](/r2/buckets/delete-buckets/). + +## Notes + +- Bucket names and buckets are not public by default. To allow public access to a bucket, refer to [Public buckets](/r2/buckets/public-buckets/). +- For information on controlling access to your R2 bucket with Cloudflare Access, refer to [Protect an R2 Bucket with Cloudflare Access](/r2/tutorials/cloudflare-access/). +- Invalid (unauthorized) access attempts to private buckets do not incur R2 operations charges against that bucket. Refer to the [R2 pricing FAQ](/r2/pricing/#frequently-asked-questions) to understand what operations are billed vs. not billed. diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/how-r2-works.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/how-r2-works.md new file mode 100644 index 0000000..fe276a8 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/how-r2-works.md @@ -0,0 +1,99 @@ +--- +title: How R2 works + +pcx_content_type: concept +sidebar: + order: 2 +description: Find out how R2 works. +products: + - r2 +head: + - tag: title + content: How R2 works +--- + +import { Render, LinkCard } from "~/components"; + +Cloudflare R2 is an S3-compatible object storage service with no egress fees, built on Cloudflare's global network. It is [strongly consistent](/r2/reference/consistency/) and designed for high [data durability](/r2/reference/durability/). + +R2 is ideal for storing and serving unstructured data that needs to be accessed frequently over the internet, without incurring egress fees. It's a good fit for workloads like serving web assets, training AI models, and managing user-generated content. + +## Architecture + +R2's architecture is composed of multiple components: + +- **R2 Gateway:** The entry point for all API requests that handles authentication and routing logic. This service is deployed across Cloudflare's global network via [Cloudflare Workers](/workers/). + +- **Metadata Service:** A distributed layer built on [Durable Objects](/durable-objects/) used to store and manage object metadata (e.g. object key, checksum) to ensure strong consistency of the object across the storage system. It includes a built-in cache layer to speed up access to metadata. + +- **Tiered Read Cache:** A caching layer that sits in front of the Distributed Storage Infrastructure that speeds up object reads by using [Cloudflare Tiered Cache](/cache/how-to/tiered-cache/) to serve data closer to the client. + +- **Distributed Storage Infrastructure:** The underlying infrastructure that persistently stores encrypted object data. + +![R2 Architecture](public/images/r2/r2-architecture.png) + +R2 supports multiple client interfaces including [Cloudflare Workers Binding](/r2/api/workers/workers-api-usage/), [S3-compatible API](/r2/api/s3/api/), and a [REST API](/api/resources/r2/) that powers the Cloudflare Dashboard and Wrangler CLI. All requests are routed through the R2 Gateway, which coordinates with the Metadata Service and Distributed Storage Infrastructure to retrieve the object data. + +## Write data to R2 + +When a write request (e.g. uploading an object) is made to R2, the following sequence occurs: + +1. **Request handling:** The request is received by the R2 Gateway at the edge, close to the user, where it is authenticated. + +2. **Encryption and routing:** The Gateway reaches out to the Metadata Service to retrieve the [encryption key](/r2/reference/data-security/) and determines which storage cluster to write the encrypted data to within the [location](/r2/reference/data-location/) set for the bucket. + +3. **Writing to storage:** The encrypted data is written and stored in the distributed storage infrastructure, and replicated within the region (e.g. ENAM) for [durability](/r2/reference/durability/). + +4. **Metadata commit:** Finally, the Metadata Service commits the object's metadata, making it visible in subsequent reads. Only after this commit is an `HTTP 200` success response sent to the client, preventing unacknowledged writes. + +![Write data to R2](public/images/r2/write-data-to-r2.png) + +## Read data from R2 + +When a read request (e.g. fetching an object) is made to R2, the following sequence occurs: + +1. **Request handling:** The request is received by the R2 Gateway at the edge, close to the user, where it is authenticated. + +2. **Metadata lookup:** The Gateway asks the Metadata Service for the object metadata. + +3. **Reading the object:** The Gateway attempts to retrieve the [encrypted](/r2/reference/data-security/) object from the tiered read cache. If it's not available, it retrieves the object from one of the distributed storage data centers within the region that holds the object data. + +4. **Serving to client:** The object is decrypted and served to the user. + +![Read data to R2](public/images/r2/read-data-to-r2.png) + +## Performance + +The performance of your operations can be influenced by factors such as the bucket's geographical location, request origin, and access patterns. + +To optimize upload performance for cross-region requests, enable [Local Uploads](/r2/buckets/local-uploads/) on your bucket. + +To optimize read performance, enable [Cloudflare Cache](/cache/) when using a [custom domain](/r2/buckets/public-buckets/#custom-domains). When caching is enabled, read requests can bypass the R2 Gateway and be served directly from Cloudflare's edge cache, reducing latency. Note that cached data may not reflect the latest version immediately. + +![Read data to R2 with Cloudflare Cache](public/images/r2/read-data-to-r2-with-cloudflare-cache.png) + +## Learn more + + + + + + + + diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/index.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/index.md new file mode 100644 index 0000000..fe6d80e --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/index.md @@ -0,0 +1,122 @@ +--- +title: Cloudflare R2 + +pcx_content_type: overview +sidebar: + order: 1 +description: Cloudflare R2 is a cost-effective, scalable object storage solution for cloud-native apps, web content, and data lakes without egress fees. +products: + - r2 +head: + - tag: title + content: Overview +--- + +import { + CardGrid, + Description, + Feature, + LinkButton, + LinkTitleCard, + Plan, + RelatedProduct, +} from "~/components"; + + + +Object storage for all your data. + + + +Cloudflare R2 Storage allows developers to store large amounts of unstructured data without the costly egress bandwidth fees associated with typical cloud storage services. + +You can use R2 for multiple scenarios, including but not limited to: + +- Storage for cloud-native applications +- Cloud storage for web content +- Storage for podcast episodes +- Data lakes (analytics and big data) +- Cloud storage output for large batch processes, such as machine learning model artifacts or datasets + + + Get started + + + Browse the examples + + +--- + +## Features + + + +Location Hints are optional parameters you can provide during bucket creation to indicate the primary geographical location you expect data will be accessed from. + + + + + +Configure CORS to interact with objects in your bucket and configure policies on your bucket. + + + + + +Public buckets expose the contents of your R2 bucket directly to the Internet. + + + + + +Create bucket scoped tokens for granular control over who can access your data. + + + +--- + +## Related products + + + +A [serverless](https://www.cloudflare.com/learning/serverless/what-is-serverless/) execution environment that allows you to create entirely new applications or augment existing ones without configuring or maintaining infrastructure. + + + + + +Upload, store, encode, and deliver live and on-demand video with one API, without configuring or maintaining infrastructure. + + + + + +A suite of products tailored to your image-processing needs. + + + +--- + +## More resources + + + + + Understand pricing for free and paid tier rates. + + + + Ask questions, show off what you are building, and discuss the platform + with other developers. + + + + Learn about product announcements, new tutorials, and what is new in + Cloudflare Workers. + + + diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/reference/consistency.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/reference/consistency.md new file mode 100644 index 0000000..366ad73 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/reference/consistency.md @@ -0,0 +1,64 @@ +--- +title: Consistency model +description: R2 provides strong global consistency for reads, writes, deletes, and list operations. +pcx_content_type: concept +sidebar: + order: 7 +products: + - r2 +--- + +This page details R2's consistency model, including where R2 is strongly, globally consistent and which operations this applies to. + +R2 can be described as "strongly consistent", especially in comparison to other distributed object storage systems. This strong consistency ensures that operations against R2 see the latest (accurate) state: clients should be able to observe the effects of any write, update and/or delete operation immediately, globally. + +## Terminology + +In the context of R2, *strong* consistency and *eventual* consistency have the following meanings: + +* **Strongly consistent** - The effect of an operation will be observed globally, immediately, by all clients. Clients will not observe 'stale' (inconsistent) state. +* **Eventually consistent** - Clients may not see the effect of an operation immediately. The state may take a some time (typically seconds to a minute) to propagate globally. + +## Operations and Consistency + +Operations against R2 buckets and objects adhere to the following consistency guarantees: + + + +| Action | Consistency | +| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Read-after-write: Write (upload) an object, then read it | Strongly consistent: readers will immediately see the latest object globally | +| Metadata: Update an object's metadata | Strongly consistent: readers will immediately see the updated metadata globally | +| Deletion: Delete an object | Strongly consistent: reads to that object will immediately return a "does not exist" error | +| Object listing: List the objects in a bucket | Strongly consistent: the list operation will list all objects at that point in time | +| IAM: Adding/removing R2 Storage permissions | Eventually consistent: A [new or updated API key](/fundamentals/api/get-started/create-token/) may take up to a minute to have permissions reflected globally | + + + +Additional notes: + +* In the event two clients are writing (`PUT` or `DELETE`) to the same key, the last writer to complete "wins". +* When performing a multipart upload, read-after-write consistency continues to apply once all parts have been successfully uploaded. In the case the same part is uploaded (in error) from multiple writers, the last write will win. +* Copying an object within the same bucket also follows the same read-after-write consistency that writing a new object would. The "copied" object is immediately readable by all clients once the copy operation completes. +* To delete an R2 bucket, it must be completely empty before deletion is allowed. If you attempt to delete a bucket that still contains objects, you will receive an error such as: `The bucket you tried to delete (X) is not empty (account Y)` or `Bucket X cannot be deleted because it isn’t empty.` For instructions on emptying and deleting a bucket, refer to [Delete buckets](/r2/buckets/delete-buckets/). + + +## Caching + +:::note + + +By default, Cloudflare's cache will cache common, cacheable status codes automatically [per our cache documentation](/cache/how-to/configure-cache-status-code/#edge-ttl). + + +::: + +When connecting a [custom domain](/r2/buckets/public-buckets/#custom-domains) to an R2 bucket and enabling caching for objects served from that bucket, the consistency model is necessarily relaxed when accessing content via a domain with caching enabled. + +Specifically, you should expect: + +* An object you delete from R2, but that is still cached, will still be available. You should [purge the cache](/cache/how-to/purge-cache/) after deleting objects if you need that delete to be reflected. +* By default, Cloudflare’s cache will [cache HTTP 404 (Not Found) responses](/cache/how-to/configure-cache-status-code/#edge-ttl) automatically. If you upload an object to that same path, the cache may continue to return HTTP 404s until the cache TTL (Time to Live) expires and the new object is fetched from R2 or the [cache is purged](/cache/how-to/purge-cache/). +* An object for a given key is overwritten with a new object: the old (previous) object will continue to be served to clients until the cache TTL expires (or the object is evicted) or the cache is purged. + +The cache does not affect access via [Worker API bindings](/r2/api/workers/) or the [S3 API](/r2/api/s3/), as these operations are made directly against the bucket and do not transit through the cache. diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/reference/durability.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/reference/durability.md new file mode 100644 index 0000000..177e6ed --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/r2/reference/durability.md @@ -0,0 +1,28 @@ +--- +title: Durability +description: R2 is designed for 99.999999999% annual durability using replication and erasure coding. +pcx_content_type: concept +sidebar: + order: 7 +products: + - r2 +--- + +R2 is designed to provide 99.999999999% (eleven 9s) of annual durability. This means that if you store 10,000,000 objects on R2, you can expect to lose an object once every 10,000 years on average. + +## How R2 achieves eleven-nines durability + +R2's durability is built on multiple layers of redundancy and data protection: + +- **Replication**: When you upload an object, R2 stores multiple "copies" of that object through either full replication and/or erasure coding. This ensures that the full or partial failure of any individual disk does not result in data loss. Erasure coding distributes parts of the object across multiple disks, ensuring that even if some disks fail, the object can still be reconstructed from a subset of the available parts, preventing hardware failure or physical impacts to data centers (such as fire or floods) from causing data loss. + +- **Hardware redundancy**: Storage clusters are comprised of hardware distributed across several data centers within a geographic region. This physical distribution ensures that localized failures—such as power outages, network disruptions, or hardware malfunctions at a single facility—do not result in data loss. + +- **Synchronous writes**: R2 returns an `HTTP 200 (OK)` for a write via API or otherwise indicates success only when data has been persisted to disk. We do not rely on asynchronous replication to support underlying durability guarantees. This is critical to R2’s consistency guarantees and mitigates the chance of a client receiving a successful API response without the underlying metadata and storage infrastructure having persisted the change. + +### Considerations + +* Durability is not a guarantee of data availability. It is a measure of the likelihood of data loss. +* R2 provides an availability [SLA of 99.9%](https://www.cloudflare.com/r2-service-level-agreement/) +* Durability does not prevent intentional or accidental deletion of data. Use [bucket locks](/r2/buckets/bucket-locks/) and/or bucket-scoped [API tokens](/r2/api/tokens/) to limit access to data. +* Durability is also distinct from [consistency](/r2/reference/consistency/), which describes how reads and writes are reflected in the system's state (e.g. eventual consistency vs. strong consistency). diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/get-started/guide.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/get-started/guide.md new file mode 100644 index 0000000..66339d6 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/get-started/guide.md @@ -0,0 +1,210 @@ +--- +title: CLI +description: Set up and deploy your first Cloudflare Worker using Wrangler, the command-line interface. +pcx_content_type: get-started +sidebar: + order: 1 +head: + - tag: title + content: Get started - CLI +products: + - workers +--- + +import { Details, Render, PackageManagers } from "~/components"; + +Set up and deploy your first Worker with Wrangler, the Cloudflare Developer Platform CLI. + +This guide will instruct you through setting up and deploying your first Worker. + +## Prerequisites + + + +## 1. Create a new Worker project + +Open a terminal window and run C3 to create your Worker project. [C3 (`create-cloudflare-cli`)](https://github.com/cloudflare/workers-sdk/tree/main/packages/create-cloudflare) is a command-line tool designed to help you set up and deploy new applications to Cloudflare. + + + + + +Now, you have a new project set up. Move into that project folder. + +```sh +cd my-first-worker +``` + +
+ +In your project directory, C3 will have generated the following: + +* `wrangler.jsonc`: Your [Wrangler](/workers/wrangler/configuration/#sample-wrangler-configuration) configuration file. +* `index.js` (in `/src`): A minimal `'Hello World!'` Worker written in [ES module](/workers/reference/migrate-to-module-workers/) syntax. +* `package.json`: A minimal Node dependencies configuration file. +* `package-lock.json`: Refer to [`npm` documentation on `package-lock.json`](https://docs.npmjs.com/cli/v9/configuring-npm/package-lock-json). +* `node_modules`: Refer to [`npm` documentation `node_modules`](https://docs.npmjs.com/cli/v7/configuring-npm/folders#node-modules). + +
+ +
+ +In addition to creating new projects from C3 templates, C3 also supports creating new projects from existing Git repositories. To create a new project from an existing Git repository, open your terminal and run: + +```sh +npm create cloudflare@latest -- --template +``` + +`` may be any of the following: + +- `user/repo` (GitHub) +- `git@github.com:user/repo` +- `https://github.com/user/repo` +- `user/repo/some-template` (subdirectories) +- `user/repo#canary` (branches) +- `user/repo#1234abcd` (commit hash) +- `bitbucket:user/repo` (Bitbucket) +- `gitlab:user/repo` (GitLab) + +Your existing template folder must contain the following files, at a minimum, to meet the requirements for Cloudflare Workers: + +- `package.json` +- `wrangler.jsonc` [See sample Wrangler configuration](/workers/wrangler/configuration/#sample-wrangler-configuration) +- `src/` containing a worker script referenced from `wrangler.jsonc` + +
+ +## 2. Develop with Wrangler CLI + +C3 installs [Wrangler](/workers/wrangler/install-and-update/), the Workers command-line interface, in Workers projects by default. Wrangler lets you to [create](/workers/wrangler/commands/general/#init), [test](/workers/wrangler/commands/general/#dev), and [deploy](/workers/wrangler/commands/general/#deploy) your Workers projects. + +After you have created your first Worker, run the [`wrangler dev`](/workers/wrangler/commands/general/#dev) command in the project directory to start a local server for developing your Worker. This will allow you to preview your Worker locally during development. + +```sh +npx wrangler dev +``` + +If you have never used Wrangler before, it will open your web browser so you can login to your Cloudflare account. + +Go to [http://localhost:8787](http://localhost:8787) to view your Worker. + +
+ +If you have issues with this step or you do not have access to a browser interface, refer to the [`wrangler login`](/workers/wrangler/commands/general/#login) documentation. + +
+ +## 3. Write code + +With your new project generated and running, you can begin to write and edit your code. + +Find the `src/index.js` file. `index.js` will be populated with the code below: + +```js title="Original index.js" +export default { + async fetch(request, env, ctx) { + return new Response("Hello World!"); + }, +}; +``` + +
+ +This code block consists of a few different parts. + +```js title="Updated index.js" {1} +export default { + async fetch(request, env, ctx) { + return new Response("Hello World!"); + }, +}; +``` + +`export default` is JavaScript syntax required for defining [JavaScript modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules#default_exports_versus_named_exports). Your Worker has to have a default export of an object, with properties corresponding to the events your Worker should handle. + +```js title="index.js" {2} +export default { + async fetch(request, env, ctx) { + return new Response("Hello World!"); + }, +}; +``` + +This [`fetch()` handler](/workers/runtime-apis/handlers/fetch/) will be called when your Worker receives an HTTP request. You can define additional event handlers in the exported object to respond to different types of events. For example, add a [`scheduled()` handler](/workers/runtime-apis/handlers/scheduled/) to respond to Worker invocations via a [Cron Trigger](/workers/configuration/cron-triggers/). + +Additionally, the `fetch` handler will always be passed three parameters: [`request`, `env` and `context`](/workers/runtime-apis/handlers/fetch/). + +```js title="index.js" {3} +export default { + async fetch(request, env, ctx) { + return new Response("Hello World!"); + }, +}; +``` + +The Workers runtime expects `fetch` handlers to return a `Response` object or a Promise which resolves with a `Response` object. In this example, you will return a new `Response` with the string `"Hello World!"`. + +
+ +Replace the content in your current `index.js` file with the content below, which changes the text output. + +```js title="index.js" {3} +export default { + async fetch(request, env, ctx) { + return new Response("Hello Worker!"); + }, +}; +``` + +Then, save the file and reload the page. Your Worker's output will have changed to the new text. + +
+ +If the output for your Worker does not change, make sure that: + +1. You saved the changes to `index.js`. +2. You have `wrangler dev` running. +3. You reloaded your browser. + +
+ +## 4. Deploy your project + +Deploy your Worker via Wrangler to a `*.workers.dev` subdomain or a [Custom Domain](/workers/configuration/routing/custom-domains/). + +```sh +npx wrangler deploy +``` + +If you have not configured any subdomain or domain, Wrangler will prompt you during the publish process to set one up. + +Preview your Worker at `..workers.dev`. + +
+ +If you see [`523` errors](/support/troubleshooting/http-status-codes/cloudflare-5xx-errors/error-523/) when pushing your `*.workers.dev` subdomain for the first time, wait a minute or so and the errors will resolve themselves. + +
+ +## Next steps + +To do more: + +- Push your project to a GitHub or GitLab repository then [connect to builds](/workers/ci-cd/builds/#get-started) to enable automatic builds and deployments. +- Visit the [Cloudflare dashboard](https://dash.cloudflare.com/) for simpler editing. +- Review our [Examples](/workers/examples/) and [Tutorials](/workers/tutorials/) for inspiration. +- Set up [bindings](/workers/runtime-apis/bindings/) to allow your Worker to interact with other resources and unlock new functionality. +- Learn how to [test and debug](/workers/testing/) your Workers. +- Read about [Workers limits and pricing](/workers/platform/). diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/index.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/index.md new file mode 100644 index 0000000..e8ada57 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/index.md @@ -0,0 +1,160 @@ +--- +title: Cloudflare Workers +description: Build and deploy serverless applications across Cloudflare's global network with Workers. +pcx_content_type: overview +sidebar: + order: 1 +head: + - tag: title + content: Overview +products: + - workers +--- + +import { Description, RelatedProduct, LinkButton } from "~/components"; + + + A serverless platform for building, deploying, and scaling apps across + [Cloudflare's global network](https://www.cloudflare.com/network/) with a + single command — no infrastructure to manage, no complex configuration + + +With Cloudflare Workers, you can expect to: + +- Deliver fast performance with high reliability anywhere in the world +- Build full-stack apps with your framework of choice, including [React](/workers/framework-guides/web-apps/react/), [Vue](/workers/framework-guides/web-apps/vue/), [Svelte](/workers/framework-guides/web-apps/sveltekit/), [Next](/workers/framework-guides/web-apps/nextjs/), [Astro](/workers/framework-guides/web-apps/astro/), [React Router](/workers/framework-guides/web-apps/react-router/), [and more](/workers/framework-guides/) +- Use your preferred language, including [JavaScript](/workers/languages/javascript/), [TypeScript](/workers/languages/typescript/), [Python](/workers/languages/python/), [Rust](/workers/languages/rust/), [and more](/workers/runtime-apis/webassembly/) +- Gain deep visibility and insight with built-in [observability](/workers/observability/logs/) +- Get started for free and grow with flexible [pricing](/workers/platform/pricing/), affordable at any scale + +Get started with your first project: + + + Deploy a template + + + + Deploy with Wrangler CLI + + +--- + +## Build with Workers + +
+#### Front-end applications + +Deploy [static assets](/workers/static-assets/) to Cloudflare's [CDN & cache](/cache/) for fast rendering +
+ +
+#### Back-end applications + +Build APIs and connect to data stores with [Smart Placement](/workers/configuration/placement/) to optimize latency +
+ +
+#### Serverless AI inference + +Run LLMs, generate images, and more with [Workers AI](/workers-ai/) +
+ +
+#### Background jobs + +Schedule [cron jobs](/workers/configuration/cron-triggers/), run durable [Workflows](/workflows/), and integrate with [Queues](/queues/) +
+ +
+#### Observability & monitoring + +Monitor performance, debug issues, and analyze traffic with [real-time logs](/workers/observability/logs/) and [analytics](/workers/observability/metrics-and-analytics/) +
+ +--- + +## Integrate with Workers + +Connect to external services like databases, APIs, and storage via [Bindings](/workers/runtime-apis/bindings/), enabling functionality with just a few lines of code: + +**Storage** + + + +Scalable stateful storage for real-time coordination. + + + + + +Serverless SQL database built for fast, global queries. + + + + + +Low-latency key-value storage for fast, edge-cached reads. + + + + + +Guaranteed delivery with no charges for egress bandwidth. + + + + + +Connect to your external database with accelerated queries, cached at the edge. + + + +**Compute** + + + +Machine learning models powered by serverless GPUs. + + + + + +Durable, long-running operations with automatic retries. + + + + + +Vector database for AI-powered semantic search. + + + + + +Zero-egress object storage for cost-efficient data access. + + + + + +Programmatic serverless browser instances. + + + +**Media** + + + +Global caching for high-performance, low-latency delivery. + + + + + +Streamlined image infrastructure from a single API. + + + +--- + +Want to connect with the Workers community? [Join our Discord](https://discord.cloudflare.com) diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/R2.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/R2.md new file mode 100644 index 0000000..1d4eb80 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/R2.md @@ -0,0 +1,12 @@ +--- +pcx_content_type: navigation +title: R2 +external_link: /r2/api/workers/workers-api-reference/ +head: [] +description: APIs available in Cloudflare Workers to read from and write to R2 + buckets. R2 is S3-compatible, zero egress-fee, globally distributed object + storage. + +products: + - workers +--- diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/durable-objects.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/durable-objects.md new file mode 100644 index 0000000..c6f459b --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/durable-objects.md @@ -0,0 +1,10 @@ +--- +pcx_content_type: navigation +title: Durable Objects +external_link: /durable-objects/api/ +head: [] +description: A globally distributed coordination API with strongly consistent storage. + +products: + - workers +--- diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/kv.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/kv.md new file mode 100644 index 0000000..3c269b9 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/kv.md @@ -0,0 +1,10 @@ +--- +pcx_content_type: navigation +title: KV +external_link: /kv/api/ +head: [] +description: Global, low-latency, key-value data storage. + +products: + - workers +--- diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/queues.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/queues.md new file mode 100644 index 0000000..d8afce3 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/queues.md @@ -0,0 +1,10 @@ +--- +pcx_content_type: navigation +title: Queues +external_link: /queues/configuration/javascript-apis/ +head: [] +description: Send and receive messages with guaranteed delivery. + +products: + - workers +--- diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md new file mode 100644 index 0000000..38405bd --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md @@ -0,0 +1,328 @@ +--- +title: Build your first Workflow +description: Create and deploy your first Cloudflare Workflow with durable, multi-step execution on the Workers platform. +pcx_content_type: get-started +sidebar: + order: 1 +products: + - workflows +--- + +import { + Details, + LinkCard, + Render, + PackageManagers, + WranglerConfig, + Steps, +} from "~/components"; + +Workflows allow you to build durable, multi-step applications using the Workers platform. A Workflow can automatically retry, persist state, run for hours or days, and coordinate between third-party APIs. + +You can build Workflows to post-process file uploads to [R2 object storage](/r2/), automate generation of [Workers AI](/workers-ai/) embeddings into a [Vectorize](/vectorize/) vector database, or to trigger user lifecycle emails using [Email Service](/email-service/). + +:::note +The term "Durable Execution" is widely used to describe this programming model. + +"Durable" describes the ability of the program to implicitly persist state without you having to manually write to an external store or serialize program state. +::: + +In this guide, you will create and deploy a Workflow that fetches data, pauses, and processes results. + +## Quick start + +If you want to skip the steps and pull down the complete Workflow we are building in this guide, run: + +```sh +npm create cloudflare@latest workflows-starter -- --template "cloudflare/workflows-starter" +``` + +Use this option if you are familiar with Cloudflare Workers or want to explore the code first and learn the details later. + +Follow the steps below to learn how to build a Workflow from scratch. + +## Prerequisites + + + +## 1. Create a new Worker project + + + +1. Open a terminal and run the `create cloudflare` (C3) CLI tool to create your Worker project: + + + + + +2. Move into your new project directory: + + ```sh + cd my-workflow + ``` + +
+ + In your project directory, C3 will have generated the following: + - `wrangler.jsonc`: Your [Wrangler configuration file](/workers/wrangler/configuration/#sample-wrangler-configuration). + - `src/index.ts`: A minimal Worker written in TypeScript. + - `package.json`: A minimal Node dependencies configuration file. + - `tsconfig.json`: TypeScript configuration. + +
+ +
+ +## 2. Write your Workflow + + + +1. Create a new file `src/workflow.ts`: + + ```ts title="src/workflow.ts" + import { WorkflowEntrypoint, WorkflowStep } from "cloudflare:workers"; + import type { WorkflowEvent } from "cloudflare:workers"; + + type Params = { name?: string }; + type IPResponse = { result: { ipv4_cidrs: string[] } }; + + export class MyWorkflow extends WorkflowEntrypoint { + async run(event: WorkflowEvent, step: WorkflowStep) { + const data = await step.do("fetch data", async () => { + const response = await fetch( + "https://api.cloudflare.com/client/v4/ips", + ); + return await response.json(); + }); + + await step.sleep("pause", "20 seconds"); + + const result = await step.do( + "process data", + { retries: { limit: 3, delay: "5 seconds", backoff: "linear" } }, + async () => { + return { + name: event.payload.name ?? "World", + ipCount: data.result.ipv4_cidrs.length, + }; + }, + ); + + return result; + } + } + ``` + + A Workflow extends `WorkflowEntrypoint` and implements a `run` method. This code also passes in our `Params` type as a [type parameter](/workflows/build/events-and-parameters/) so that events that trigger our Workflow are typed. + + The [`step`](/workflows/build/workers-api/#step) object is the core of the Workflows API. It provides methods to define durable steps in your Workflow: + - `step.do(name, callback)` - Executes code and persists the result. If the Workflow is interrupted or retried, it resumes from the last successful step rather than re-running completed work. The callback returns serializable data, including `ReadableStream` for large binary output in JavaScript Workflows. + - `step.sleep(name, duration)` - Pauses the Workflow for a duration (for example, `"10 seconds"`, `"1 hour"`). + + If you return a stream, return a fresh, unlocked `ReadableStream`. BYOB streams and BYOB readers are not supported. + + You can pass a [retry configuration](/workflows/build/sleeping-and-retrying/) to `step.do()` to customize how failures are handled. See the [full step API](/workflows/build/workers-api/#step) for stream requirements, limits, and additional methods like `sleepUntil` and `waitForEvent`. + + When deciding whether to break code into separate steps, ask yourself: "Do I want all of this code to run again if just one part fails?" Separate steps are ideal for operations like calling external APIs, querying databases, or reading files from storage - if a later step fails, your Workflow can retry from that point using data already fetched, avoiding redundant API calls or database queries. + + For more guidance on how to define your Workflow logic, refer to [Rules of Workflows](/workflows/build/rules-of-workflows/). + + + +## 3. Configure your Workflow + + + +1. Open `wrangler.jsonc`, which is your [Wrangler configuration file](/workers/wrangler/configuration/) for your Workers project and your Workflow, and add the `workflows` configuration: + + + + ```json title="wrangler.jsonc" + { + "$schema": "node_modules/wrangler/config-schema.json", + "name": "my-workflow", + "main": "src/index.ts", + "compatibility_date": "$today", + "observability": { + "enabled": true + }, + "workflows": [ + { + "name": "my-workflow", + "binding": "MY_WORKFLOW", + "class_name": "MyWorkflow" + } + ] + } + ``` + + + + The `class_name` must match your exported class, and `binding` is the variable name you use to access the Workflow in your code (like `env.MY_WORKFLOW`). + + If you want the same Workflow to run automatically on a recurring interval, add `schedules` to the Workflow definition: + + + + ```jsonc + { + "$schema": "node_modules/wrangler/config-schema.json", + "name": "my-workflow", + "main": "src/index.ts", + "compatibility_date": "$today", + "workflows": [ + { + "name": "my-workflow", + "binding": "MY_WORKFLOW", + "class_name": "MyWorkflow", + "schedules": ["0 * * * *"] + } + ] + } + ``` + + + + Each matching cron expression creates a new Workflow instance automatically, so you do not need top-level `triggers.crons` and a separate `scheduled` handler for Workflow-specific recurring runs. + + Scheduled instances include the matching cron expression and scheduled trigger time on `event.schedule`. + + Use the latest Wrangler release when configuring Workflow schedules. If your local Wrangler schema does not recognize `schedules` yet, update Wrangler before deploying. + + You can also access [bindings](/workers/runtime-apis/bindings/) (such as [KV](/kv/), [R2](/r2/), or [D1](/d1/)) via `this.env` within your Workflow. For more information on bindings within Workers, refer to [Bindings (env)](/workers/runtime-apis/bindings/). + +2. Now, generate types for your bindings: + + ```sh + npx wrangler types + ``` + + This creates a `worker-configuration.d.ts` file with the `Env` type that includes your `MY_WORKFLOW` binding. + + + +## 4. Write your API + +Now, you'll need a place to call your Workflow. + + + +1. Replace `src/index.ts` with a [fetch handler](/workers/runtime-apis/handlers/fetch/) to start and check Workflow instances: + + ```ts title="src/index.ts" + export { MyWorkflow } from "./workflow"; + + export default { + async fetch(request: Request, env: Env): Promise { + const url = new URL(request.url); + const instanceId = url.searchParams.get("instanceId"); + + if (instanceId) { + const instance = await env.MY_WORKFLOW.get(instanceId); + return Response.json(await instance.status()); + } + + const instance = await env.MY_WORKFLOW.create(); + return Response.json({ instanceId: instance.id }); + }, + } satisfies ExportedHandler; + ``` + + + +## 5. Develop locally + + + +1. Start a local development server: + + ```sh + npx wrangler dev + ``` + +2. To start a Workflow instance, open a new terminal window and run: + + ```sh + curl http://localhost:8787 + ``` + + An `instanceId` will be automatically generated: + + ```json output + { "instanceId": "abc-123-def" } + ``` + +3. Check the status using the returned `instanceId`: + + ```sh + curl "http://localhost:8787?instanceId=abc-123-def" + ``` + + The Workflow will progress through its steps. After about 20 seconds (the sleep duration), it will complete. + + + +## 6. Deploy your Workflow + + + +1. Deploy your Workflow: + + ```sh + npx wrangler deploy + ``` + + Test in production using the same curl commands against your deployed URL. You can also [trigger a workflow instance](/workflows/build/trigger-workflows/) in production via Workers, Wrangler, or the Cloudflare dashboard. + + Once deployed, you can also inspect Workflow instances with the CLI: + + ```sh + npx wrangler workflows instances describe my-workflow latest + ``` + + The output of `instances describe` shows: + - The status (success, failure, running) of each step + - Any state emitted by the step. For streamed output, the CLI shows a preview or summary instead of the full contents. + - Any `sleep` state, including when the Workflow will wake up + - Retries associated with each step + - Errors, including exception messages + + + +## Learn more + + + + + + + + diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/files/workflows/index.md b/assets/seed/v2/corpora/cloudflare-state-v1/files/workflows/index.md new file mode 100644 index 0000000..be52e49 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/files/workflows/index.md @@ -0,0 +1,168 @@ +--- +title: Cloudflare Workflows +description: Build durable, multi-step applications on Cloudflare Workers that automatically retry and persist state. +order: 0 +pcx_content_type: overview +sidebar: + order: 1 +head: + - tag: title + content: Overview +products: + - workflows +--- + +import { AnimatedWorkflowDiagram, CardGrid, Description, Feature, Flex, LinkTitleCard, Plan, RelatedProduct, Tabs, TabItem, LinkButton } from "~/components" + + + +Build durable multi-step applications on Cloudflare Workers with Workflows. + + + + + +With Workflows, you can build applications that chain together multiple steps, automatically retry failed tasks, +and persist state for minutes, hours, or even weeks - with no infrastructure to manage. + +Use Workflows to build reliable AI applications, process data pipelines, manage user lifecycle with automated emails and trial expirations, and implement human-in-the-loop approval systems. + + +
+ + + +
+
+ +**Workflows give you:** + +- Durable multi-step execution without timeouts +- The ability to pause for external events or approvals +- Automatic retries and error handling +- Built-in observability and debugging + +
+
+ +## Example + +An image processing workflow that fetches from R2, generates an AI description, waits for approval, then publishes: + +```ts +export class ImageProcessingWorkflow extends WorkflowEntrypoint { + async run(event: WorkflowEvent, step: WorkflowStep) { + const imageData = await step.do('fetch image', async () => { + const object = await this.env.BUCKET.get(event.payload.imageKey); + return await object.arrayBuffer(); + }); + + const description = await step.do('generate description', async () => { + const imageArray = Array.from(new Uint8Array(imageData)); + return await this.env.AI.run('@cf/llava-hf/llava-1.5-7b-hf', { + image: imageArray, + prompt: 'Describe this image in one sentence', + max_tokens: 50, + }); + }); + + await step.waitForEvent('await approval', { + event: 'approved', + timeout: '24 hours', + }); + + await step.do('publish', async () => { + await this.env.BUCKET.put(`public/${event.payload.imageKey}`, imageData); + }); + } +} +``` + + + Get started + + + Browse the examples + + +*** + +## Features + + + +Break complex operations into durable steps with automatic retries and error handling. + + + + + +Pause workflows for seconds, hours, or days with `step.sleep()` and `step.sleepUntil()`. + + + + + +Wait for webhooks, user input, or external system responses before continuing execution. + + + + + +Trigger, pause, resume, and terminate workflow instances programmatically or via API. + + + +*** + +## Related products + + + +Build serverless applications and deploy instantly across the globe for exceptional performance, reliability, and scale. + + + + + + +Deploy dynamic front-end applications in record time. + + + + +*** + +## More resources + + + + +Learn more about how Workflows is priced. + + + +Learn more about Workflow limits, and how to work within them. + + + +Learn more about the storage and database options you can build on with Workers. + + + +Connect with the Workers community on Discord to ask questions, show what you are building, and discuss the platform with other developers. + + + +Follow @CloudflareDev on Twitter to learn about product announcements, and what is new in Cloudflare Developer Platform. + + + diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/retrieval-questions.jsonl b/assets/seed/v2/corpora/cloudflare-state-v1/retrieval-questions.jsonl new file mode 100644 index 0000000..0ad2780 --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/retrieval-questions.jsonl @@ -0,0 +1,16 @@ +{"question_id":"cf-lex-block-concurrency","category":"lexical","question":"What does `blockConcurrencyWhile` prevent during Durable Object initialization?","gold_doc_ids":["durable-objects/api/state.md"],"teaching_note":{"en":"Inspect how an exact API identifier becomes tokens and contributes to BM25.","zh":"检查一个精确的 API 标识符如何变成词元并对 BM25 分数作出贡献。"},"expected_observation":{"en":"Exact terms strongly identify the state API document; punctuation and token boundaries remain visible.","zh":"精确词项会强烈指向状态 API 文档;标点和词元边界仍然清晰可见。"}} +{"question_id":"cf-lex-batch-limits","category":"lexical","question":"How do `max_batch_size` and `max_batch_timeout` trigger queue batch delivery?","gold_doc_ids":["queues/configuration/batching-retries.md"],"teaching_note":{"en":"Compare two rare configuration terms and their individual BM25 contributions.","zh":"比较两个少见配置词项各自对 BM25 分数的贡献。"},"expected_observation":{"en":"Both identifiers concentrate lexical evidence in the batching-and-retries document.","zh":"两个标识符都会把词法证据集中到批处理与重试文档。"}} +{"question_id":"cf-lex-retry-limit","category":"lexical","question":"What does `max_retries` control for a queue consumer, and what happens after the limit?","gold_doc_ids":["queues/configuration/batching-retries.md"],"teaching_note":{"en":"Connect an exact option to surrounding retry and dead-letter behavior.","zh":"把一个精确选项与周围的重试和死信行为联系起来。"},"expected_observation":{"en":"The identifier contributes strongly while common explanatory words contribute less.","zh":"该标识符贡献较强,而常见解释性词语贡献较弱。"}} +{"question_id":"cf-lex-alarm-method","category":"lexical","question":"What does `setAlarm` schedule for a Durable Object?","gold_doc_ids":["durable-objects/api/alarms.md"],"teaching_note":{"en":"Expose the strengths and limitations of the lab's intentionally simple tokenizer.","zh":"观察实验室刻意保持简单的分词器有哪些优势和限制。"},"expected_observation":{"en":"The explanation makes casing, backticks, and token-boundary effects visible instead of hiding a miss.","zh":"解释会直接展示大小写、反引号和词元边界的影响,而不是隐藏一次未命中。"}} +{"question_id":"cf-dense-kv-cache","category":"dense","question":"How does Workers KV trade immediate global updates for fast repeated reads?","gold_doc_ids":["kv/concepts/how-kv-works.md"],"teaching_note":{"en":"Retrieve a paraphrase of the consistency and cache tradeoff without relying on exact wording.","zh":"不依赖完全相同的措辞,检索对一致性与缓存权衡的转述。"},"expected_observation":{"en":"Semantic similarity ranks the KV concepts document near the top.","zh":"语义相似度会把 KV 概念文档排在前列。"}} +{"question_id":"cf-dense-delivery-safety","category":"dense","question":"Why should a queue consumer make repeated message processing safe?","gold_doc_ids":["queues/reference/delivery-guarantees.md"],"teaching_note":{"en":"Connect safe repeated processing with idempotency and at-least-once delivery.","zh":"把安全的重复处理与幂等性和至少一次投递联系起来。"},"expected_observation":{"en":"Dense retrieval bridges the learner's paraphrase to the delivery-guarantee terminology.","zh":"语义检索会把学习者的转述与投递保证术语连接起来。"}} +{"question_id":"cf-dense-stale-edge","category":"dense","question":"Why can a key-value update be visible nearby but delayed elsewhere?","gold_doc_ids":["kv/concepts/how-kv-works.md"],"teaching_note":{"en":"Inspect a natural-language description of eventual global propagation.","zh":"检查对最终全局传播这一概念的自然语言描述。"},"expected_observation":{"en":"The relevant KV document ranks highly despite few product-specific tokens.","zh":"即使问题中几乎没有产品专有词,相关 KV 文档仍会获得较高排名。"}} +{"question_id":"cf-dense-workflow-recovery","category":"dense","question":"How can a long-running multi-step process pause and recover after failures?","gold_doc_ids":["workflows/build/sleeping-and-retrying.md","workflows/build/rules-of-workflows.md"],"teaching_note":{"en":"Show semantic retrieval across two complementary workflow documents.","zh":"展示跨两篇互补工作流文档的语义检索。"},"expected_observation":{"en":"Both sleep-and-retry and durable-execution evidence should appear in the candidate set.","zh":"睡眠与重试、持久执行两类证据都应出现在候选集中。"}} +{"question_id":"cf-hybrid-r2-properties","category":"hybrid","question":"How do R2 consistency and durability differ?","gold_doc_ids":["r2/reference/consistency.md","r2/reference/durability.md"],"teaching_note":{"en":"Combine exact R2 vocabulary with semantically related durability language.","zh":"把精确的 R2 词汇与语义相关的持久性表述结合起来。"},"expected_observation":{"en":"Dense and BM25 favor different relevant documents; RRF retains evidence from both.","zh":"语义检索与 BM25 会偏向不同的相关文档;RRF 会保留两边的证据。"}} +{"question_id":"cf-hybrid-queue-policy","category":"hybrid","question":"How should retry limits, dead-letter handling, and at-least-once delivery shape a queue consumer?","gold_doc_ids":["queues/configuration/batching-retries.md","queues/reference/delivery-guarantees.md"],"teaching_note":{"en":"Join configuration terms with a broader reliability concept.","zh":"把配置词项与更广泛的可靠性概念连接起来。"},"expected_observation":{"en":"Each retriever contributes complementary queue evidence to the fused list.","zh":"每种检索器都会向融合列表贡献互补的队列证据。"}} +{"question_id":"cf-hybrid-workflow-state","category":"hybrid","question":"How can durable steps sleep, retry, and preserve progress without relying on memory?","gold_doc_ids":["workflows/build/sleeping-and-retrying.md","workflows/build/rules-of-workflows.md"],"teaching_note":{"en":"Mix exact workflow actions with a semantic durability requirement.","zh":"把精确的工作流动作与语义化的持久性需求混合在一个问题中。"},"expected_observation":{"en":"BM25 and dense retrieval surface complementary gold paths and expose their RRF contributions.","zh":"BM25 与语义检索会找出互补的标准路径,并展示各自的 RRF 贡献。"}} +{"question_id":"cf-hybrid-storage-choice","category":"hybrid","question":"When do KV caching semantics suit configuration while R2 consistency suits updates that must become globally visible immediately?","gold_doc_ids":["kv/concepts/how-kv-works.md","r2/reference/consistency.md"],"teaching_note":{"en":"Compare concepts across two storage products in one query.","zh":"在一个问题中比较两种存储产品的概念。"},"expected_observation":{"en":"The fused list preserves relevant KV and R2 evidence split across the source rankings.","zh":"融合列表会保留分散在两个来源排名中的相关 KV 与 R2 证据。"}} +{"question_id":"cf-rerank-named-stub","category":"reranking","question":"What does `getByName` return for a Durable Object namespace?","gold_doc_ids":["durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md"],"teaching_note":{"en":"Observe a precise API answer move within a broader hybrid candidate pool.","zh":"观察一个精确 API 答案如何在更宽的混合候选集中移动。"},"expected_observation":{"en":"The cross-encoder promotes the create-stubs document toward the final top results.","zh":"交叉编码器会把创建存根的文档提升到最终结果前列。"}} +{"question_id":"cf-rerank-alarm-without-request","category":"reranking","question":"How can a stateful coordinator schedule work even if no new request arrives?","gold_doc_ids":["durable-objects/api/alarms.md"],"teaching_note":{"en":"Rerank a semantic alarm description that first-stage retrieval scatters.","zh":"重排一个在第一阶段检索中分散的语义化闹钟描述。"},"expected_observation":{"en":"The alarm document moves substantially upward from the hybrid candidate pool.","zh":"闹钟文档会从混合候选集中明显上升。"}} +{"question_id":"cf-rerank-exhausted-delivery","category":"reranking","question":"What happens to queue messages after they exhaust delivery attempts?","gold_doc_ids":["queues/configuration/batching-retries.md"],"teaching_note":{"en":"Separate the final retry and dead-letter answer from generally related queue documents.","zh":"把最终重试与死信答案从一般相关的队列文档中区分出来。"},"expected_observation":{"en":"Reranking promotes the batching-and-retries evidence to or near first place.","zh":"重排会把批处理与重试证据提升到第一名或接近第一名。"}} +{"question_id":"cf-rerank-workflow-sleep","category":"reranking","question":"What do `step.sleep` and `step.sleepUntil` do in a Workflow?","gold_doc_ids":["workflows/build/sleeping-and-retrying.md"],"teaching_note":{"en":"Compare first-stage lexical and semantic relevance with cross-encoder query-passage relevance.","zh":"比较第一阶段词法与语义相关性,以及交叉编码器的查询-段落相关性。"},"expected_observation":{"en":"The sleeping-and-retrying document moves to first place or remains the strongest final evidence.","zh":"睡眠与重试文档会升到第一名,或继续保持为最强的最终证据。"}} diff --git a/assets/seed/v2/corpora/cloudflare-state-v1/source-manifest.json b/assets/seed/v2/corpora/cloudflare-state-v1/source-manifest.json new file mode 100644 index 0000000..d1514dc --- /dev/null +++ b/assets/seed/v2/corpora/cloudflare-state-v1/source-manifest.json @@ -0,0 +1,248 @@ +{ + "schema_version": 1, + "repository": "cloudflare/cloudflare-docs", + "revision": "3dcb728cb29f4239e08ba894f0a40650d51ba4f6", + "license": "CC BY 4.0", + "documents": [ + { + "source_path": "workers/index.mdx", + "path": "files/workers/index.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/workers/index.mdx", + "sha256": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4" + }, + { + "source_path": "workers/get-started/guide.mdx", + "path": "files/workers/get-started/guide.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/workers/get-started/guide.mdx", + "sha256": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8" + }, + { + "source_path": "workers/runtime-apis/bindings/durable-objects.mdx", + "path": "files/workers/runtime-apis/bindings/durable-objects.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/workers/runtime-apis/bindings/durable-objects.mdx", + "sha256": "8529ae13ce8b7acbdca264566f3b019803c7b75debadeb5a51c51f380264520d" + }, + { + "source_path": "workers/runtime-apis/bindings/queues.mdx", + "path": "files/workers/runtime-apis/bindings/queues.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/workers/runtime-apis/bindings/queues.mdx", + "sha256": "baded9ebba0468d738474f49995b6cf8ee867ddb56af29ccb83656258a46703c" + }, + { + "source_path": "workers/runtime-apis/bindings/kv.mdx", + "path": "files/workers/runtime-apis/bindings/kv.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/workers/runtime-apis/bindings/kv.mdx", + "sha256": "1a31963e5b0a455f49a7f1c36fc207bab7c71eac3d352d8ca5a14183d3f29f7e" + }, + { + "source_path": "workers/runtime-apis/bindings/R2.mdx", + "path": "files/workers/runtime-apis/bindings/R2.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/workers/runtime-apis/bindings/R2.mdx", + "sha256": "2841b8b9a51fa5f4c64c88594a815553940dee47a4188c159ceb45ee97117261" + }, + { + "source_path": "durable-objects/concepts/what-are-durable-objects.mdx", + "path": "files/durable-objects/concepts/what-are-durable-objects.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/durable-objects/concepts/what-are-durable-objects.mdx", + "sha256": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25" + }, + { + "source_path": "durable-objects/concepts/durable-object-lifecycle.mdx", + "path": "files/durable-objects/concepts/durable-object-lifecycle.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/durable-objects/concepts/durable-object-lifecycle.mdx", + "sha256": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126" + }, + { + "source_path": "durable-objects/platform/storage-options.mdx", + "path": "files/durable-objects/platform/storage-options.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/durable-objects/platform/storage-options.mdx", + "sha256": "33e8840fac344dafaf1d71dcbb6037a09674c1b004fbe840317e11db755fd98c" + }, + { + "source_path": "durable-objects/best-practices/rules-of-durable-objects.mdx", + "path": "files/durable-objects/best-practices/rules-of-durable-objects.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/durable-objects/best-practices/rules-of-durable-objects.mdx", + "sha256": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9" + }, + { + "source_path": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.mdx", + "path": "files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.mdx", + "sha256": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518" + }, + { + "source_path": "durable-objects/api/state.mdx", + "path": "files/durable-objects/api/state.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/durable-objects/api/state.mdx", + "sha256": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5" + }, + { + "source_path": "durable-objects/api/alarms.mdx", + "path": "files/durable-objects/api/alarms.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/durable-objects/api/alarms.mdx", + "sha256": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f" + }, + { + "source_path": "durable-objects/examples/build-a-counter.mdx", + "path": "files/durable-objects/examples/build-a-counter.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/durable-objects/examples/build-a-counter.mdx", + "sha256": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4" + }, + { + "source_path": "queues/index.mdx", + "path": "files/queues/index.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/queues/index.mdx", + "sha256": "7ca76e34b7712d7ea2fb558cd572d8994848a8e4cecfdf412ae59aa6082aa778" + }, + { + "source_path": "queues/get-started.mdx", + "path": "files/queues/get-started.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/queues/get-started.mdx", + "sha256": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a" + }, + { + "source_path": "queues/reference/how-queues-works.mdx", + "path": "files/queues/reference/how-queues-works.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/queues/reference/how-queues-works.mdx", + "sha256": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c" + }, + { + "source_path": "queues/reference/delivery-guarantees.mdx", + "path": "files/queues/reference/delivery-guarantees.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/queues/reference/delivery-guarantees.mdx", + "sha256": "ed989b394791a8bf6c450e1f8f7fcfa3d13a0e1a4d43586a84edbe7087a2f222" + }, + { + "source_path": "queues/configuration/batching-retries.mdx", + "path": "files/queues/configuration/batching-retries.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/queues/configuration/batching-retries.mdx", + "sha256": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce" + }, + { + "source_path": "queues/configuration/consumer-concurrency.mdx", + "path": "files/queues/configuration/consumer-concurrency.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/queues/configuration/consumer-concurrency.mdx", + "sha256": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08" + }, + { + "source_path": "queues/examples/use-queues-with-durable-objects.mdx", + "path": "files/queues/examples/use-queues-with-durable-objects.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/queues/examples/use-queues-with-durable-objects.mdx", + "sha256": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288" + }, + { + "source_path": "kv/index.mdx", + "path": "files/kv/index.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/kv/index.mdx", + "sha256": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761" + }, + { + "source_path": "kv/concepts/how-kv-works.mdx", + "path": "files/kv/concepts/how-kv-works.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/kv/concepts/how-kv-works.mdx", + "sha256": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321" + }, + { + "source_path": "kv/concepts/kv-bindings.mdx", + "path": "files/kv/concepts/kv-bindings.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/kv/concepts/kv-bindings.mdx", + "sha256": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78" + }, + { + "source_path": "kv/concepts/kv-namespaces.mdx", + "path": "files/kv/concepts/kv-namespaces.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/kv/concepts/kv-namespaces.mdx", + "sha256": "2f64b8fb39ce55bc43d5a6f7e36d5af10e672f9e9ec64d1f1e918258ad7ddbfc" + }, + { + "source_path": "kv/examples/distributed-configuration-with-workers-kv.mdx", + "path": "files/kv/examples/distributed-configuration-with-workers-kv.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/kv/examples/distributed-configuration-with-workers-kv.mdx", + "sha256": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc" + }, + { + "source_path": "kv/examples/cache-data-with-workers-kv.mdx", + "path": "files/kv/examples/cache-data-with-workers-kv.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/kv/examples/cache-data-with-workers-kv.mdx", + "sha256": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87" + }, + { + "source_path": "r2/index.mdx", + "path": "files/r2/index.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/r2/index.mdx", + "sha256": "7e6bac2d545167b29be0e3b51617553f991edc15c97276ee890bfeca1ee90560" + }, + { + "source_path": "r2/how-r2-works.mdx", + "path": "files/r2/how-r2-works.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/r2/how-r2-works.mdx", + "sha256": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18" + }, + { + "source_path": "r2/reference/consistency.mdx", + "path": "files/r2/reference/consistency.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/r2/reference/consistency.mdx", + "sha256": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf" + }, + { + "source_path": "r2/reference/durability.mdx", + "path": "files/r2/reference/durability.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/r2/reference/durability.mdx", + "sha256": "4837c8a21782dd5eb6ba73f9faf2d44de5460c634aa525f363453cf2858835ba" + }, + { + "source_path": "r2/api/workers/workers-api-reference.mdx", + "path": "files/r2/api/workers/workers-api-reference.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/r2/api/workers/workers-api-reference.mdx", + "sha256": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4" + }, + { + "source_path": "r2/buckets/create-buckets.mdx", + "path": "files/r2/buckets/create-buckets.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/r2/buckets/create-buckets.mdx", + "sha256": "fcb5cebd61d6e44db103ad8cbee20718ee6e48389ec3193ab5297216cce117ac" + }, + { + "source_path": "workflows/index.mdx", + "path": "files/workflows/index.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/workflows/index.mdx", + "sha256": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297" + }, + { + "source_path": "workflows/get-started/guide.mdx", + "path": "files/workflows/get-started/guide.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/workflows/get-started/guide.mdx", + "sha256": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3" + }, + { + "source_path": "workflows/build/rules-of-workflows.mdx", + "path": "files/workflows/build/rules-of-workflows.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/workflows/build/rules-of-workflows.mdx", + "sha256": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821" + }, + { + "source_path": "workflows/build/sleeping-and-retrying.mdx", + "path": "files/workflows/build/sleeping-and-retrying.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/workflows/build/sleeping-and-retrying.mdx", + "sha256": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88" + }, + { + "source_path": "workflows/build/step-context.mdx", + "path": "files/workflows/build/step-context.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/workflows/build/step-context.mdx", + "sha256": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3" + }, + { + "source_path": "workflows/build/trigger-workflows.mdx", + "path": "files/workflows/build/trigger-workflows.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/workflows/build/trigger-workflows.mdx", + "sha256": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb" + }, + { + "source_path": "workflows/build/workers-api.mdx", + "path": "files/workflows/build/workers-api.md", + "source_url": "https://github.com/cloudflare/cloudflare-docs/blob/3dcb728cb29f4239e08ba894f0a40650d51ba4f6/src/content/docs/workflows/build/workers-api.mdx", + "sha256": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535" + } + ] +} \ No newline at end of file diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/corpus.json b/assets/seed/v2/corpora/watsonxdocsqa-v1/corpus.json new file mode 100644 index 0000000..cd01a82 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/corpus.json @@ -0,0 +1,6 @@ +{ + "id": "watsonxdocsqa-v1", + "name": "watsonxDocsQA", + "kind": "catalog", + "file_count": 1144 +} \ No newline at end of file diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/dataset-manifest.json b/assets/seed/v2/corpora/watsonxdocsqa-v1/dataset-manifest.json new file mode 100644 index 0000000..1cc742f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/dataset-manifest.json @@ -0,0 +1,8017 @@ +{ + "dataset_name": "ibm-research/watsonxDocsQA", + "source_url": "", + "license": "see dataset source", + "prepared_at": "2026-06-10T08:21:03.740848+00:00", + "document_count": 1144, + "documents": [ + { + "doc_id": "docs/81d740cef3967c20721612b7866072ef240484e9.md", + "original_doc_id": "81D740CEF3967C20721612B7866072EF240484E9", + "path": "corpus/watsonx-docsqa/docs/81d740cef3967c20721612b7866072ef240484e9.md", + "title": "Decision Optimization Java models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/DOJava.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6dbd14399b24f78cafec6225b77dafae357ddee5.md", + "original_doc_id": "6DBD14399B24F78CAFEC6225B77DAFAE357DDEE5", + "path": "corpus/watsonx-docsqa/docs/6dbd14399b24f78cafec6225b77dafae357ddee5.md", + "title": "Decision Optimization notebooks", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/DONotebooks.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/277c8cb678caf766466ede03c506eb0a822fd400.md", + "original_doc_id": "277C8CB678CAF766466EDE03C506EB0A822FD400", + "path": "corpus/watsonx-docsqa/docs/277c8cb678caf766466ede03c506eb0a822fd400.md", + "title": "Supported data sources in Decision Optimization", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/DOconnections.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e990e009903e315fa6752e7e82c2634af4a425b9.md", + "original_doc_id": "E990E009903E315FA6752E7E82C2634AF4A425B9", + "path": "corpus/watsonx-docsqa/docs/e990e009903e315fa6752e7e82c2634af4a425b9.md", + "title": "Ways to use Decision Optimization", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/DOintro.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8892a757ecb2c4a02806a7b262712ff2e30ce044.md", + "original_doc_id": "8892A757ECB2C4A02806A7B262712FF2E30CE044", + "path": "corpus/watsonx-docsqa/docs/8892a757ecb2c4a02806a7b262712ff2e30ce044.md", + "title": "OPL models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/OPLmodels.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8e56f0efd08ff4a97e439ea3b8de2b7af1a302c9.md", + "original_doc_id": "8E56F0EFD08FF4A97E439EA3B8DE2B7AF1A302C9", + "path": "corpus/watsonx-docsqa/docs/8e56f0efd08ff4a97e439ea3b8de2b7af1a302c9.md", + "title": "Decision Optimization Visualization view", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/Visualization.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/33923fe20855d3ea3850294c0fb447ec3f1b7bdf.md", + "original_doc_id": "33923FE20855D3EA3850294C0FB447EC3F1B7BDF", + "path": "corpus/watsonx-docsqa/docs/33923fe20855d3ea3850294c0fb447ec3f1b7bdf.md", + "title": "Decision Optimization experiments", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/buildingmodels.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/497007d0d0abac3202bbf912a15bfc389066ebda.md", + "original_doc_id": "497007D0D0ABAC3202BBF912A15BFC389066EBDA", + "path": "corpus/watsonx-docsqa/docs/497007d0d0abac3202bbf912a15bfc389066ebda.md", + "title": "Decision Optimization experiment Python and CPLEX runtime versions and Python extensions", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/configureEnvironments.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5788d38721aeae446cfad7d9288b6bab33fa1ef9.md", + "original_doc_id": "5788D38721AEAE446CFAD7D9288B6BAB33FA1EF9", + "path": "corpus/watsonx-docsqa/docs/5788d38721aeae446cfad7d9288b6bab33fa1ef9.md", + "title": "Decision Optimization sample models and notebooks", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/docExamples.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/167d5677958594ba275e34b8748f7e8091782560.md", + "original_doc_id": "167D5677958594BA275E34B8748F7E8091782560", + "path": "corpus/watsonx-docsqa/docs/167d5677958594ba275e34b8748f7e8091782560.md", + "title": "Decision Optimization experiment UI views and scenarios", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1c20bd9f24d670dd18b6bc28e020fbb23c742682.md", + "original_doc_id": "1C20BD9F24D670DD18B6BC28E020FBB23C742682", + "path": "corpus/watsonx-docsqa/docs/1c20bd9f24d670dd18b6bc28e020fbb23c742682.md", + "title": "Creating advanced custom constraints with Python in the Decision Optimization Modeling Assistant", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/CustomRules.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c07cd6df8c92edd0f2638573bfdce7bf18aa2eb0.md", + "original_doc_id": "C07CD6DF8C92EDD0F2638573BFDCE7BF18AA2EB0", + "path": "corpus/watsonx-docsqa/docs/c07cd6df8c92edd0f2638573bfdce7bf18aa2eb0.md", + "title": "Creating constraints and custom decisions with the Decision Optimization Modeling Assistant", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/advancedMA.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0efc1aa12637c84918cef9fa5de5da424822330c.md", + "original_doc_id": "0EFC1AA12637C84918CEF9FA5DE5DA424822330C", + "path": "corpus/watsonx-docsqa/docs/0efc1aa12637c84918cef9fa5de5da424822330c.md", + "title": "Decision Optimization Modeling Assistant scheduling tutorial", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/exhousebuild.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/312e91752782553d39c335d0daaf189025739bb4.md", + "original_doc_id": "312E91752782553D39C335D0DAAF189025739BB4", + "path": "corpus/watsonx-docsqa/docs/312e91752782553d39c335d0daaf189025739bb4.md", + "title": "Decision Optimization Modeling Assistant models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/exhousebuildintro.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2746f2e53d41f5810d92d843af8c0ab2b36a0d47.md", + "original_doc_id": "2746F2E53D41F5810D92D843AF8C0AB2B36A0D47", + "path": "corpus/watsonx-docsqa/docs/2746f2e53d41f5810d92d843af8c0ab2b36a0d47.md", + "title": "Selecting a Decision domain in the Modeling Assistant", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/mdl_asst_domains.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f37bd72c28f0dac8d9478eceaba4f077abcde0c9.md", + "original_doc_id": "F37BD72C28F0DAC8D9478ECEABA4F077ABCDE0C9", + "path": "corpus/watsonx-docsqa/docs/f37bd72c28f0dac8d9478eceaba4f077abcde0c9.md", + "title": "Decision Optimization notebook tutorial create new scenario", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Notebooks/createScenario.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/056e37762231e9e32f0f443987c32acf7bf1aed4.md", + "original_doc_id": "056E37762231E9E32F0F443987C32ACF7BF1AED4", + "path": "corpus/watsonx-docsqa/docs/056e37762231e9e32f0f443987c32acf7bf1aed4.md", + "title": "Decision Optimization notebook multiple scenarios", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Notebooks/multiIntro.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3beb81a5a5953cd570fa673b2496f8af98725438.md", + "original_doc_id": "3BEB81A5A5953CD570FA673B2496F8AF98725438", + "path": "corpus/watsonx-docsqa/docs/3beb81a5a5953cd570fa673b2496f8af98725438.md", + "title": "Decision Optimization notebook generating multiple scenarios", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Notebooks/multiScenario.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/decca51bacc7be33f484d36177b24c4bd0fe4cfd.md", + "original_doc_id": "DECCA51BACC7BE33F484D36177B24C4BD0FE4CFD", + "path": "corpus/watsonx-docsqa/docs/decca51bacc7be33f484d36177b24c4bd0fe4cfd.md", + "title": "Decision Optimization input and output data", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Notebooks/preparedataIO.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/726175290d457b10a02c27f08eca1f6546e64680.md", + "original_doc_id": "726175290D457B10A02C27F08ECA1F6546E64680", + "path": "corpus/watsonx-docsqa/docs/726175290d457b10a02c27f08eca1f6546e64680.md", + "title": "Python DOcplex models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Notebooks/solveIntro.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2e1f6d5703ce75af284903c20e5dbdfa1ae706b4.md", + "original_doc_id": "2E1F6D5703CE75AF284903C20E5DBDFA1AE706B4", + "path": "corpus/watsonx-docsqa/docs/2e1f6d5703ce75af284903c20e5dbdfa1ae706b4.md", + "title": "Decision Optimization notebook tutorial", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Notebooks/solveModel.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d51ad51e5407bf4efae5c97fe7e031db56cf8733.md", + "original_doc_id": "D51AD51E5407BF4EFAE5C97FE7E031DB56CF8733", + "path": "corpus/watsonx-docsqa/docs/d51ad51e5407bf4efae5c97fe7e031db56cf8733.md", + "title": "Decision Optimization run parameters", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_RunParameters/runparams.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c6ee4cacfc1e29bafbb8ed5d98521ea68388d0cb.md", + "original_doc_id": "C6EE4CACFC1E29BAFBB8ED5D98521EA68388D0CB", + "path": "corpus/watsonx-docsqa/docs/c6ee4cacfc1e29bafbb8ed5d98521ea68388d0cb.md", + "title": "Decision Optimization", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/DOWS-Cloud_home.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e45f37bddb38d6656992642fbea2707fe34e942a.md", + "original_doc_id": "E45F37BDDB38D6656992642FBEA2707FE34E942A", + "path": "corpus/watsonx-docsqa/docs/e45f37bddb38d6656992642fbea2707fe34e942a.md", + "title": "Delegating CPLEX solve to Watson Machine Learning", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/CPLEXSolveWML.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5bc48ab9a35e2e8baea5204c4406835154e2b836.md", + "original_doc_id": "5BC48AB9A35E2E8BAEA5204C4406835154E2B836", + "path": "corpus/watsonx-docsqa/docs/5bc48ab9a35e2e8baea5204c4406835154e2b836.md", + "title": "Decision Optimization deployment steps", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployIntro.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/134eb5d79038b55a3a6ac019016a21ec2b6a1917.md", + "original_doc_id": "134EB5D79038B55A3A6AC019016A21EC2B6A1917", + "path": "corpus/watsonx-docsqa/docs/134eb5d79038b55a3a6ac019016a21ec2b6a1917.md", + "title": "Deploying Java models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployJava.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b92f42609b54b82bfe38a69b781052e876258c2c.md", + "original_doc_id": "B92F42609B54B82BFE38A69B781052E876258C2C", + "path": "corpus/watsonx-docsqa/docs/b92f42609b54b82bfe38a69b781052e876258c2c.md", + "title": "Decision Optimization REST API deployment", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployModelRest.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/deb599f49c3e459a08e8bf25304b063b50caa294.md", + "original_doc_id": "DEB599F49C3E459A08E8BF25304B063B50CAA294", + "path": "corpus/watsonx-docsqa/docs/deb599f49c3e459a08e8bf25304b063b50caa294.md", + "title": "Deploying a Decision Optimization model by using the user interface", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployModelUI-WML.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/95689297b729a4186914e81a59ffb3a09289f8d8.md", + "original_doc_id": "95689297B729A4186914E81A59FFB3A09289F8D8", + "path": "corpus/watsonx-docsqa/docs/95689297b729a4186914e81a59ffb3a09289f8d8.md", + "title": "Decision Optimization Python client examples", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployPythonClient.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/135ad82faaa11fd4fec7ce7a31516e98ee3d0ea5.md", + "original_doc_id": "135AD82FAAA11FD4FEC7CE7A31516E98EE3D0EA5", + "path": "corpus/watsonx-docsqa/docs/135ad82faaa11fd4fec7ce7a31516e98ee3d0ea5.md", + "title": "Decision Optimization solve parameters", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeploySolveParams.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/939233f807850ae8d28246ade7fdccda66e9df03.md", + "original_doc_id": "939233F807850AE8D28246ADE7FDCCDA66E9DF03", + "path": "corpus/watsonx-docsqa/docs/939233f807850ae8d28246ade7fdccda66e9df03.md", + "title": "Decision Optimization model deployment", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/ModelDeploymentTaskCloud.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/02c5718919d676e7ea14d16ac226407cc675c95e.md", + "original_doc_id": "02C5718919D676E7EA14D16AC226407CC675C95E", + "path": "corpus/watsonx-docsqa/docs/02c5718919d676e7ea14d16ac226407cc675c95e.md", + "title": "Decision Optimization model execution", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/ModelExecution.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e9e9556ca0c7b258d910bb31222a78beabb46a48.md", + "original_doc_id": "E9E9556CA0C7B258D910BB31222A78BEABB46A48", + "path": "corpus/watsonx-docsqa/docs/e9e9556ca0c7b258d910bb31222a78beabb46a48.md", + "title": "Decision Optimization model input and output data", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/ModelIODataDefn.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/977988398efbdcd10db4aced047d8d864883614a.md", + "original_doc_id": "977988398EFBDCD10DB4ACED047D8D864883614A", + "path": "corpus/watsonx-docsqa/docs/977988398efbdcd10db4aced047d8d864883614a.md", + "title": "Decision Optimization model input and output data file formats", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/ModelIOFileFormats.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d476f3e93d23f52ef1d5079343d92db793e3ad5e.md", + "original_doc_id": "D476F3E93D23F52EF1D5079343D92DB793E3AD5E", + "path": "corpus/watsonx-docsqa/docs/d476f3e93d23f52ef1d5079343d92db793e3ad5e.md", + "title": "Decision Optimization output data definition", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/OutputDataDefn.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/693bc91eaadeae664982aa88a372590a6758f294.md", + "original_doc_id": "693BC91EAADEAE664982AA88A372590A6758F294", + "path": "corpus/watsonx-docsqa/docs/693bc91eaadeae664982aa88a372590a6758f294.md", + "title": "Decision Optimization running jobs", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/Paralleljobs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/73defa42948bbe878834ca4b7c9b0395f44b9b90.md", + "original_doc_id": "73DEFA42948BBE878834CA4B7C9B0395F44B9B90", + "path": "corpus/watsonx-docsqa/docs/73defa42948bbe878834ca4b7c9b0395f44b9b90.md", + "title": "Decision Optimization REST API changing Python version in deployed model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/UpdateDeployModelRest.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1bb1684259f93d91580690d898140d98f12611ed.md", + "original_doc_id": "1BB1684259F93D91580690D898140D98F12611ED", + "path": "corpus/watsonx-docsqa/docs/1bb1684259f93d91580690d898140d98f12611ed.md", + "title": "Deploying Decision Optimization models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/DO/wml_cpd_home.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a255bb890ca287c5a91765b71832daa45ba4132b.md", + "original_doc_id": "A255BB890CA287C5A91765B71832DAA45BA4132B", + "path": "corpus/watsonx-docsqa/docs/a255bb890ca287c5a91765b71832daa45ba4132b.md", + "title": "Global visualization preferences", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_appearance_tab.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5d043091b2f2398611a819743fc83688d7658b22.md", + "original_doc_id": "5D043091B2F2398611A819743FC83688D7658B22", + "path": "corpus/watsonx-docsqa/docs/5d043091b2f2398611a819743fc83688d7658b22.md", + "title": "Visualizations layout and terms", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_create_layout.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9f5d44b3a96f8418be317ad258e4932e468551be.md", + "original_doc_id": "9F5D44B3A96F8418BE317AD258E4932E468551BE", + "path": "corpus/watsonx-docsqa/docs/9f5d44b3a96f8418be317ad258e4932e468551be.md", + "title": "3D charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_3d.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/823eb607207dfd62d80671af48451cce1c44153f.md", + "original_doc_id": "823EB607207DFD62D80671AF48451CCE1C44153F", + "path": "corpus/watsonx-docsqa/docs/823eb607207dfd62d80671af48451cce1c44153f.md", + "title": "Bar charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_barcharts.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/becca4c839a0bcf01adcb6a5ce31a3b1168d3548.md", + "original_doc_id": "BECCA4C839A0BCF01ADCB6A5CE31A3B1168D3548", + "path": "corpus/watsonx-docsqa/docs/becca4c839a0bcf01adcb6a5ce31a3b1168d3548.md", + "title": "Box plots", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_boxplots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5466d9a71e87bb01000dc957683e9cd3c10ad8bc.md", + "original_doc_id": "5466D9A71E87BB01000DC957683E9CD3C10AD8BC", + "path": "corpus/watsonx-docsqa/docs/5466d9a71e87bb01000dc957683e9cd3c10ad8bc.md", + "title": "Bubble charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_bubble.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f7d94e6cd13f36eb9b1fe7653c436dc5745250b1.md", + "original_doc_id": "F7D94E6CD13F36EB9B1FE7653C436DC5745250B1", + "path": "corpus/watsonx-docsqa/docs/f7d94e6cd13f36eb9b1fe7653c436dc5745250b1.md", + "title": "Candlestick charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_candlestick.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2c9d0d0309e01ff2ee0d298a16011857de068038.md", + "original_doc_id": "2C9D0D0309E01FF2EE0D298A16011857DE068038", + "path": "corpus/watsonx-docsqa/docs/2c9d0d0309e01ff2ee0d298a16011857de068038.md", + "title": "Chart types", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_charttypes.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/035430afac1e73483636073c5bf48bcf8b4f5e1d.md", + "original_doc_id": "035430AFAC1E73483636073C5BF48BCF8B4F5E1D", + "path": "corpus/watsonx-docsqa/docs/035430afac1e73483636073c5bf48bcf8b4f5e1d.md", + "title": "Circle packing charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_circlepacking.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/49724d4b7690d4b215fe6f1c0a49c8b347f0c9a1.md", + "original_doc_id": "49724D4B7690D4B215FE6F1C0A49C8B347F0C9A1", + "path": "corpus/watsonx-docsqa/docs/49724d4b7690d4b215fe6f1c0a49c8b347f0c9a1.md", + "title": "Custom charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_customize.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/91b834e69c2153740973c59cf6b4d66260640342.md", + "original_doc_id": "91B834E69C2153740973C59CF6B4D66260640342", + "path": "corpus/watsonx-docsqa/docs/91b834e69c2153740973c59cf6b4d66260640342.md", + "title": "Dendrogram charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_dendrogram.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2910b7c4cd65f8e4add1607791dd22bed468b61d.md", + "original_doc_id": "2910B7C4CD65F8E4ADD1607791DD22BED468B61D", + "path": "corpus/watsonx-docsqa/docs/2910b7c4cd65f8e4add1607791dd22bed468b61d.md", + "title": "Dual Y-axes charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_dualy.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/97492a97f355a95d56bcf768a62ca7fd75718086.md", + "original_doc_id": "97492A97F355A95D56BCF768A62CA7FD75718086", + "path": "corpus/watsonx-docsqa/docs/97492a97f355a95d56bcf768a62ca7fd75718086.md", + "title": "Error bar charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_errorbar.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/41167e3ad363b416d508b03a300e5acfaf83f042.md", + "original_doc_id": "41167E3AD363B416D508B03A300E5ACFAF83F042", + "path": "corpus/watsonx-docsqa/docs/41167e3ad363b416d508b03a300e5acfaf83f042.md", + "title": "Evaluation charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_evaluation.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/57ab3726fa10435d26878c626f61988f7305b9e8.md", + "original_doc_id": "57AB3726FA10435D26878C626F61988F7305B9E8", + "path": "corpus/watsonx-docsqa/docs/57ab3726fa10435d26878c626f61988f7305b9e8.md", + "title": "Building a chart from the chart type gallery", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_fromgallery.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cc0adf041f1628221cac49a1baec1d497d762dc4.md", + "original_doc_id": "CC0ADF041F1628221CAC49A1BAEC1D497D762DC4", + "path": "corpus/watsonx-docsqa/docs/cc0adf041f1628221cac49a1baec1d497d762dc4.md", + "title": "Heat map charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_heatmap.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1453d1cad565842eea24c8d92963bd73338ef0f1.md", + "original_doc_id": "1453D1CAD565842EEA24C8D92963BD73338EF0F1", + "path": "corpus/watsonx-docsqa/docs/1453d1cad565842eea24c8d92963bd73338ef0f1.md", + "title": "Histogram charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_histograms.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9df72c2325ce5baca0cc7d2a884695d115557c40.md", + "original_doc_id": "9DF72C2325CE5BACA0CC7D2A884695D115557C40", + "path": "corpus/watsonx-docsqa/docs/9df72c2325ce5baca0cc7d2a884695d115557c40.md", + "title": "Line charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_linecharts.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f5af4bcc2d0168d2698beb2a858c24f81a476610.md", + "original_doc_id": "F5AF4BCC2D0168D2698BEB2A858C24F81A476610", + "path": "corpus/watsonx-docsqa/docs/f5af4bcc2d0168d2698beb2a858c24f81a476610.md", + "title": "Map charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_map.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0c836867dd758509b908532f35cfc5e160d81a19.md", + "original_doc_id": "0C836867DD758509B908532F35CFC5E160D81A19", + "path": "corpus/watsonx-docsqa/docs/0c836867dd758509b908532f35cfc5e160d81a19.md", + "title": "Math curve charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_mathcurve.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/66e7b1f986535fce165f0cb5c553a6305339204e.md", + "original_doc_id": "66E7B1F986535FCE165F0CB5C553A6305339204E", + "path": "corpus/watsonx-docsqa/docs/66e7b1f986535fce165f0cb5c553a6305339204e.md", + "title": "Scatter matrix charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_matrixscatter.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3094e343d06da6ae0d0d5d4865c7b0d806dc61a1.md", + "original_doc_id": "3094E343D06DA6AE0D0D5D4865C7B0D806DC61A1", + "path": "corpus/watsonx-docsqa/docs/3094e343d06da6ae0d0d5d4865c7b0d806dc61a1.md", + "title": "Multi-chart charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_multichart.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e777a9c7d0450d572431f168374224179c1ae7c4.md", + "original_doc_id": "E777A9C7D0450D572431F168374224179C1AE7C4", + "path": "corpus/watsonx-docsqa/docs/e777a9c7d0450d572431f168374224179c1ae7c4.md", + "title": "Multiple series charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_multiseries.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/de359e77f61c11b6f759e8dfe8ea69aac3d0514a.md", + "original_doc_id": "DE359E77F61C11B6F759E8DFE8EA69AAC3D0514A", + "path": "corpus/watsonx-docsqa/docs/de359e77f61c11b6f759e8dfe8ea69aac3d0514a.md", + "title": "Parallel charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_parallel.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6b4213fc5352021865e77592ebc27242e746b5aa.md", + "original_doc_id": "6B4213FC5352021865E77592EBC27242E746B5AA", + "path": "corpus/watsonx-docsqa/docs/6b4213fc5352021865e77592ebc27242e746b5aa.md", + "title": "Pareto charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_pareto.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a2b0db014389285d9abca9fe0d4035f85de6d102.md", + "original_doc_id": "A2B0DB014389285D9ABCA9FE0D4035F85DE6D102", + "path": "corpus/watsonx-docsqa/docs/a2b0db014389285d9abca9fe0d4035f85de6d102.md", + "title": "Pie charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_piecharts.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/81f297b28d1978eb0d0b1985d6f44b45dfe53542.md", + "original_doc_id": "81F297B28D1978EB0D0B1985D6F44B45DFE53542", + "path": "corpus/watsonx-docsqa/docs/81f297b28d1978eb0d0b1985d6f44b45dfe53542.md", + "title": "Population pyramid charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_pyramid.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ba8a6820b3dbfaa703679b19be070f7bd0cca3d1.md", + "original_doc_id": "BA8A6820B3DBFAA703679B19BE070F7BD0CCA3D1", + "path": "corpus/watsonx-docsqa/docs/ba8a6820b3dbfaa703679b19be070f7bd0cca3d1.md", + "title": "Q-Q plots", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_qqplot.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/61f714f5629ad260b0d9776fc53cda2eaa10df24.md", + "original_doc_id": "61F714F5629AD260B0D9776FC53CDA2EAA10DF24", + "path": "corpus/watsonx-docsqa/docs/61f714f5629ad260b0d9776fc53cda2eaa10df24.md", + "title": "Radar charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_radar.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5a812008b8370853f0c151fde4dfeda4a39193cb.md", + "original_doc_id": "5A812008B8370853F0C151FDE4DFEDA4A39193CB", + "path": "corpus/watsonx-docsqa/docs/5a812008b8370853f0c151fde4dfeda4a39193cb.md", + "title": "Relationship charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_relation.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/67c56aac7da2232e4da2b8aedec41b9d8755e22a.md", + "original_doc_id": "67C56AAC7DA2232E4DA2B8AEDEC41B9D8755E22A", + "path": "corpus/watsonx-docsqa/docs/67c56aac7da2232e4da2b8aedec41b9d8755e22a.md", + "title": "Scatter plots and dot plots", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_scatterdot.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7b3616d29e7ac720b73ef3e24c9c807da05c4da3.md", + "original_doc_id": "7B3616D29E7AC720B73EF3E24C9C807DA05C4DA3", + "path": "corpus/watsonx-docsqa/docs/7b3616d29e7ac720b73ef3e24c9c807da05c4da3.md", + "title": "Series array charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_seriesarray.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5cf2fe478862fcaa1745d5b0770ce6486b3b71f8.md", + "original_doc_id": "5CF2FE478862FCAA1745D5B0770CE6486B3B71F8", + "path": "corpus/watsonx-docsqa/docs/5cf2fe478862fcaa1745d5b0770ce6486b3b71f8.md", + "title": "Sunburst charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_sunburst.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bae3302fc87e1bbfa604baa2d003069e4233a517.md", + "original_doc_id": "BAE3302FC87E1BBFA604BAA2D003069E4233A517", + "path": "corpus/watsonx-docsqa/docs/bae3302fc87e1bbfa604baa2d003069e4233a517.md", + "title": "Theme River charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_themeriver.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b49f37bd511123a94fcad3c6e826e60fc61db446.md", + "original_doc_id": "B49F37BD511123A94FCAD3C6E826E60FC61DB446", + "path": "corpus/watsonx-docsqa/docs/b49f37bd511123a94fcad3c6e826e60fc61db446.md", + "title": "Time plots", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_timeplot.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d872c74770b5729e037e841679f741cf3d8c20ad.md", + "original_doc_id": "D872C74770B5729E037E841679F741CF3D8C20AD", + "path": "corpus/watsonx-docsqa/docs/d872c74770b5729e037e841679f741cf3d8c20ad.md", + "title": "Tree charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_tree.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9b6386c6c291665aca0892481681a94a70185e9d.md", + "original_doc_id": "9B6386C6C291665ACA0892481681A94A70185E9D", + "path": "corpus/watsonx-docsqa/docs/9b6386c6c291665aca0892481681a94a70185e9d.md", + "title": "Treemap charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_treemap.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/99b0c1c962e0642e5b877747ed37e9bb27238664.md", + "original_doc_id": "99B0C1C962E0642E5B877747ED37E9BB27238664", + "path": "corpus/watsonx-docsqa/docs/99b0c1c962e0642e5b877747ed37e9bb27238664.md", + "title": "t-SNE charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_tsne.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3873a285dcb38ef4b4ed663bfa0df4047ab7692d.md", + "original_doc_id": "3873A285DCB38EF4B4ED663BFA0DF4047AB7692D", + "path": "corpus/watsonx-docsqa/docs/3873a285dcb38ef4b4ed663bfa0df4047ab7692d.md", + "title": "Word cloud charts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_wordcloud.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3bb91ebacc556700f955c3e6e01d90e5256207cf.md", + "original_doc_id": "3BB91EBACC556700F955C3E6E01D90E5256207CF", + "path": "corpus/watsonx-docsqa/docs/3bb91ebacc556700f955c3e6e01d90e5256207cf.md", + "title": "Visualizing your data", + "url": "https://dataplatform.cloud.ibm.com/docs/content/dataview/idh_idc_cg_help_main.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9d9188e6383db5f7038b98a688cb2dc9cf5a336c.md", + "original_doc_id": "9D9188E6383DB5F7038B98A688CB2DC9CF5A336C", + "path": "corpus/watsonx-docsqa/docs/9d9188e6383db5f7038b98a688cb2dc9cf5a336c.md", + "title": "watsonx.governance on IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/aiopenscale.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cf88bcc09a32b2d6d65f2c2a831e2960aca1e347.md", + "original_doc_id": "CF88BCC09A32B2D6D65F2C2A831E2960ACA1E347", + "path": "corpus/watsonx-docsqa/docs/cf88bcc09a32b2d6d65f2c2a831e2960aca1e347.md", + "title": "Cloud Object Storage on IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/cloud-object-storage.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/59df73d502b5f62e3837464e81ac6bc9fdf07014.md", + "original_doc_id": "59DF73D502B5F62E3837464E81AC6BC9FDF07014", + "path": "corpus/watsonx-docsqa/docs/59df73d502b5f62e3837464e81ac6bc9fdf07014.md", + "title": "IBM Cloud services in the IBM watsonx services catalog", + "url": "https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/cloud-services.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a56686454e771e5fdda0315dd38313f9fcb31aac.md", + "original_doc_id": "A56686454E771E5FDDA0315DD38313F9FCB31AAC", + "path": "corpus/watsonx-docsqa/docs/a56686454e771e5fdda0315dd38313f9fcb31aac.md", + "title": "Cloudant on IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/cloudant.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f3ba8ccb1e55bb6535944cb5acdb19efaeb1c3f9.md", + "original_doc_id": "F3BA8CCB1E55BB6535944CB5ACDB19EFAEB1C3F9", + "path": "corpus/watsonx-docsqa/docs/f3ba8ccb1e55bb6535944cb5acdb19efaeb1c3f9.md", + "title": "Db2 on IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/db2oltp.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e81f1fd08e472af1516e6c6b0c936a2dca55cc20.md", + "original_doc_id": "E81F1FD08E472AF1516E6C6B0C936A2DCA55CC20", + "path": "corpus/watsonx-docsqa/docs/e81f1fd08e472af1516e6c6b0c936a2dca55cc20.md", + "title": "Db2 Warehouse on IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/db2wh.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/32217f5f0dee4a95c64b2bd92c25366706cc7e0c.md", + "original_doc_id": "32217F5F0DEE4A95C64B2BD92C25366706CC7E0C", + "path": "corpus/watsonx-docsqa/docs/32217f5f0dee4a95c64b2bd92c25366706cc7e0c.md", + "title": "Databases for EDB on IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/edb.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/868801ec73691d31b90c8611e934aa5dd3b17ea7.md", + "original_doc_id": "868801EC73691D31B90C8611E934AA5DD3B17EA7", + "path": "corpus/watsonx-docsqa/docs/868801ec73691d31b90c8611e934aa5dd3b17ea7.md", + "title": "Databases for Elasticsearch on IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/elasticsearch.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/408fdab4f452ab2c207ee3416332d315598e3456.md", + "original_doc_id": "408FDAB4F452AB2C207EE3416332D315598E3456", + "path": "corpus/watsonx-docsqa/docs/408fdab4f452ab2c207ee3416332d315598e3456.md", + "title": "Databases for MongoDB on IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/mongodb.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/649119a6ef3f5aa2b1b0c63e0973532d4c950f48.md", + "original_doc_id": "649119A6EF3F5AA2B1B0C63E0973532D4C950F48", + "path": "corpus/watsonx-docsqa/docs/649119a6ef3f5aa2b1b0c63e0973532d4c950f48.md", + "title": "Databases for PostgreSQL on IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/postgresql.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b9d44bbcf205103bf01619d31cfebe31a725ba5a.md", + "original_doc_id": "B9D44BBCF205103BF01619D31CFEBE31A725BA5A", + "path": "corpus/watsonx-docsqa/docs/b9d44bbcf205103bf01619d31cfebe31a725ba5a.md", + "title": "Secure Gateway on IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/secure-gateway.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6ac4a29febf419002bdba62d99d997cf55e9fcf2.md", + "original_doc_id": "6AC4A29FEBF419002BDBA62D99D997CF55E9FCF2", + "path": "corpus/watsonx-docsqa/docs/6ac4a29febf419002bdba62d99d997cf55e9fcf2.md", + "title": "IBM Analytics Engine on IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/spark.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/40defbe604b3629caf8855a6d00ec14a0a6c92f3.md", + "original_doc_id": "40DEFBE604B3629CAF8855A6D00EC14A0A6C92F3", + "path": "corpus/watsonx-docsqa/docs/40defbe604b3629caf8855a6d00ec14a0a6c92f3.md", + "title": "Watson Machine Learning on IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/wml.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c4bb814768f5d91d2c6aa90b34fddd944aa1eb91.md", + "original_doc_id": "C4BB814768F5D91D2C6AA90B34FDDD944AA1EB91", + "path": "corpus/watsonx-docsqa/docs/c4bb814768f5d91d2c6aa90b34fddd944aa1eb91.md", + "title": "Watson Studio on IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/wsl.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/189f970cf3b162e67b98b2a928b36193169e3caf.md", + "original_doc_id": "189F970CF3B162E67B98B2A928B36193169E3CAF", + "path": "corpus/watsonx-docsqa/docs/189f970cf3b162e67b98b2a928b36193169e3caf.md", + "title": "Working with your data (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/dataview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6a32659df809f04f9a670634129fc75cc9140729.md", + "original_doc_id": "6A32659DF809F04F9A670634129FC75CC9140729", + "path": "corpus/watsonx-docsqa/docs/6a32659df809f04f9a670634129fc75cc9140729.md", + "title": "Setting properties for SPSS Modeler flows", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/flow_properties.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/81045ed1b34827b3bd74d2546185c3bd3163b37e.md", + "original_doc_id": "81045ED1B34827B3BD74D2546185C3BD3163B37E", + "path": "corpus/watsonx-docsqa/docs/81045ed1b34827b3bd74d2546185c3bd3163b37e.md", + "title": "Flow scripting (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/flow_scripting.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d3084bfb07d425ebace9f538d800e08daea97594.md", + "original_doc_id": "D3084BFB07D425EBACE9F538D800E08DAEA97594", + "path": "corpus/watsonx-docsqa/docs/d3084bfb07d425ebace9f538d800e08daea97594.md", + "title": "SPSS Modeler flow scripting example", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/flow_scripting_example.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c8b4a993cb8642bc87432fcb305eee744c16a154.md", + "original_doc_id": "C8B4A993CB8642BC87432FCB305EEE744C16A154", + "path": "corpus/watsonx-docsqa/docs/c8b4a993cb8642bc87432fcb305eee744c16a154.md", + "title": "Importing a stream (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/migration.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b851271c134a1b282412bd7a667c1c9813b4e8b2.md", + "original_doc_id": "B851271C134A1B282412BD7A667C1C9813B4E8B2", + "path": "corpus/watsonx-docsqa/docs/b851271c134a1b282412bd7a667c1c9813b4e8b2.md", + "title": "Text Mining model nuggets (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/TMWBModelApplier.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bbd1f022a8393101199abb731534c10be99cf1e4.md", + "original_doc_id": "BBD1F022A8393101199ABB731534C10BE99CF1E4", + "path": "corpus/watsonx-docsqa/docs/bbd1f022a8393101199abb731534c10be99cf1e4.md", + "title": "Mining for concepts and categories (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/TextMiningWorkbench.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d73c52b16ec33caa6d1f51effa5a6e37052d6110.md", + "original_doc_id": "D73C52B16EC33CAA6D1F51EFFA5A6E37052D6110", + "path": "corpus/watsonx-docsqa/docs/d73c52b16ec33caa6d1f51effa5a6e37052d6110.md", + "title": "Nodes palette (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/_nodes.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d04178dde54f21a248daff3f1582eb4bf1e9ac43.md", + "original_doc_id": "D04178DDE54F21A248DAFF3F1582EB4BF1E9AC43", + "path": "corpus/watsonx-docsqa/docs/d04178dde54f21a248daff3f1582eb4bf1e9ac43.md", + "title": "Text Analytics (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/_nodes_TA.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/42e228e8218a4fdef9f2ca0db53b5b594a475b88.md", + "original_doc_id": "42E228E8218A4FDEF9F2CA0DB53B5B594A475B88", + "path": "corpus/watsonx-docsqa/docs/42e228e8218a4fdef9f2ca0db53b5b594a475b88.md", + "title": "About text mining (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/_nodes_TA_intro.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3602c22051ea1148b07446605dd3c57bf7830c3a.md", + "original_doc_id": "3602C22051EA1148B07446605DD3C57BF7830C3A", + "path": "corpus/watsonx-docsqa/docs/3602c22051ea1148b07446605dd3c57bf7830c3a.md", + "title": "How categorization works (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/_nodes_TA_intro_categorize.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f976e639bde8a2b880e46d94f4c832b6ed9a9303.md", + "original_doc_id": "F976E639BDE8A2B880E46D94F4C832B6ED9A9303", + "path": "corpus/watsonx-docsqa/docs/f976e639bde8a2b880e46d94f4c832b6ed9a9303.md", + "title": "How extraction works (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/_nodes_TA_intro_extract.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b0b80eb59e769546eedf8ca32a493bf38c6a9707.md", + "original_doc_id": "B0B80EB59E769546EEDF8CA32A493BF38C6A9707", + "path": "corpus/watsonx-docsqa/docs/b0b80eb59e769546eedf8ca32a493bf38c6a9707.md", + "title": "Export nodes (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/_nodes_export.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b6dc074f83f9e8984b9cd3a3bf5b392bc4a61844.md", + "original_doc_id": "B6DC074F83F9E8984B9CD3A3BF5B392BC4A61844", + "path": "corpus/watsonx-docsqa/docs/b6dc074f83f9e8984b9cd3a3bf5b392bc4a61844.md", + "title": "Extension nodes (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/_nodes_extension.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4e571695fb4e12489157704d87f89df5dad1a580.md", + "original_doc_id": "4E571695FB4E12489157704D87F89DF5DAD1A580", + "path": "corpus/watsonx-docsqa/docs/4e571695fb4e12489157704d87f89df5dad1a580.md", + "title": "Field Operations nodes (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/_nodes_field_operations.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2aec614e6cbe5d4963d53dec7e22877d5a1bede8.md", + "original_doc_id": "2AEC614E6CBE5D4963D53DEC7E22877D5A1BEDE8", + "path": "corpus/watsonx-docsqa/docs/2aec614e6cbe5d4963d53dec7e22877d5a1bede8.md", + "title": "Graph nodes (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/_nodes_graphs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a9fa1d31f4cc6018daf5b927908210846b082675.md", + "original_doc_id": "A9FA1D31F4CC6018DAF5B927908210846B082675", + "path": "corpus/watsonx-docsqa/docs/a9fa1d31f4cc6018daf5b927908210846b082675.md", + "title": "Import nodes (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/_nodes_import.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7e30541b3a12f403adcb02f90bc96134ce6b6386.md", + "original_doc_id": "7E30541B3A12F403ADCB02F90BC96134CE6B6386", + "path": "corpus/watsonx-docsqa/docs/7e30541b3a12f403adcb02f90bc96134ce6b6386.md", + "title": "Modeling nodes (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/_nodes_modeling.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a56c821c7ee483d01e4338397f62ddd6cb6d5e9f.md", + "original_doc_id": "A56C821C7EE483D01E4338397F62DDD6CB6D5E9F", + "path": "corpus/watsonx-docsqa/docs/a56c821c7ee483d01e4338397f62ddd6cb6d5e9f.md", + "title": "Output nodes (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/_nodes_outputs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/09bb38fb6df4c562a478d6d3dc54d22823f922fb.md", + "original_doc_id": "09BB38FB6DF4C562A478D6D3DC54D22823F922FB", + "path": "corpus/watsonx-docsqa/docs/09bb38fb6df4c562a478d6d3dc54d22823f922fb.md", + "title": "Record Operations nodes (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/_nodes_record_operations.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8435d88b7dc8317b982e1eaa57fa55b8391d00cf.md", + "original_doc_id": "8435D88B7DC8317B982E1EAA57FA55B8391D00CF", + "path": "corpus/watsonx-docsqa/docs/8435d88b7dc8317b982e1eaa57fa55b8391d00cf.md", + "title": "Aggregate node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/aggregate.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6d7b948346f167b5390a0e56e1b6de83ae31a19a.md", + "original_doc_id": "6D7B948346F167B5390A0E56E1B6DE83AE31A19A", + "path": "corpus/watsonx-docsqa/docs/6d7b948346f167b5390a0e56e1b6de83ae31a19a.md", + "title": "Analysis node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/analysis.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/35a87caedb1f1b6739159b9c7a31cce7c8978431.md", + "original_doc_id": "35A87CAEDB1F1B6739159B9C7A31CCE7C8978431", + "path": "corpus/watsonx-docsqa/docs/35a87caedb1f1b6739159b9c7a31cce7c8978431.md", + "title": "Anomaly node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/anomalydetection.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f05134c8c952a7585b82a042b14bcf1234af9329.md", + "original_doc_id": "F05134C8C952A7585B82A042B14BCF1234AF9329", + "path": "corpus/watsonx-docsqa/docs/f05134c8c952a7585b82a042b14bcf1234af9329.md", + "title": "Anonymize node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/anonymize.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4c83f9c21ca1e70077c8004bd26fe5fb0fc947eb.md", + "original_doc_id": "4C83F9C21CA1E70077C8004BD26FE5FB0FC947EB", + "path": "corpus/watsonx-docsqa/docs/4c83f9c21ca1e70077c8004bd26fe5fb0fc947eb.md", + "title": "Append node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/append.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e14741f9a90592b67437aaed4b7042cd3dc268a8.md", + "original_doc_id": "E14741F9A90592B67437AAED4B7042CD3DC268A8", + "path": "corpus/watsonx-docsqa/docs/e14741f9a90592b67437aaed4b7042cd3dc268a8.md", + "title": "Extension model nugget (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/applyextension.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9346a72cfcd74dfda05213a2a321bf9cfb823358.md", + "original_doc_id": "9346A72CFCD74DFDA05213A2A321BF9CFB823358", + "path": "corpus/watsonx-docsqa/docs/9346a72cfcd74dfda05213a2a321bf9cfb823358.md", + "title": "Apriori node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/apriori.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/27091a60ba512e180c699261ecffdc3a621418a5.md", + "original_doc_id": "27091A60BA512E180C699261ECFFDC3A621418A5", + "path": "corpus/watsonx-docsqa/docs/27091a60ba512e180c699261ecffdc3a621418a5.md", + "title": "Association Rules node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/associationrules.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1acf5ed461253f09db844c2d84c1ae21277bc1e6.md", + "original_doc_id": "1ACF5ED461253F09DB844C2D84C1AE21277BC1E6", + "path": "corpus/watsonx-docsqa/docs/1acf5ed461253f09db844c2d84c1ae21277bc1e6.md", + "title": "Auto Classifier node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/autoclassifier.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3a9dc582441c2474e183da0e7dac20fb182842c2.md", + "original_doc_id": "3A9DC582441C2474E183DA0E7DAC20FB182842C2", + "path": "corpus/watsonx-docsqa/docs/3a9dc582441c2474e183da0e7dac20fb182842c2.md", + "title": "Auto Cluster node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/autocluster.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fd94481e337829121072f5e46cc39b6290e43b44.md", + "original_doc_id": "FD94481E337829121072F5E46CC39B6290E43B44", + "path": "corpus/watsonx-docsqa/docs/fd94481e337829121072f5e46cc39b6290e43b44.md", + "title": "Auto Data Prep node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/autodataprep.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9d9c67189be5d6db22575cf01a75bd5826b92074.md", + "original_doc_id": "9D9C67189BE5D6DB22575CF01A75BD5826B92074", + "path": "corpus/watsonx-docsqa/docs/9d9c67189be5d6db22575cf01a75bd5826b92074.md", + "title": "Auto Numeric node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/autonumeric.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0294ab8c0fbc393f5c227a0f8bebccdc67b78b1d.md", + "original_doc_id": "0294AB8C0FBC393F5C227A0F8BEBCCDC67B78B1D", + "path": "corpus/watsonx-docsqa/docs/0294ab8c0fbc393f5c227a0f8bebccdc67b78b1d.md", + "title": "Balance node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/balance.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1d5d80dff65ee4195713eeeb43f1291b79779a6b.md", + "original_doc_id": "1D5D80DFF65EE4195713EEEB43F1291B79779A6B", + "path": "corpus/watsonx-docsqa/docs/1d5d80dff65ee4195713eeeb43f1291b79779a6b.md", + "title": "Bayes Net node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/bayesnet.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8b5211bc5ac76b26c8c102e576f0af560dfbcbc2.md", + "original_doc_id": "8B5211BC5AC76B26C8C102E576F0AF560DFBCBC2", + "path": "corpus/watsonx-docsqa/docs/8b5211bc5ac76b26c8c102e576f0af560dfbcbc2.md", + "title": "Binning node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/binning.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c5673e6023d99f8354e9b61da2d2f1b58fbc970f.md", + "original_doc_id": "C5673E6023D99F8354E9B61DA2D2F1B58FBC970F", + "path": "corpus/watsonx-docsqa/docs/c5673e6023d99f8354e9b61da2d2f1b58fbc970f.md", + "title": "C5.0 node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/c50.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/de6c4cb72844fc59fd80fc0b26acc8c94a3ba994.md", + "original_doc_id": "DE6C4CB72844FC59FD80FC0B26ACC8C94A3BA994", + "path": "corpus/watsonx-docsqa/docs/de6c4cb72844fc59fd80fc0b26acc8c94a3ba994.md", + "title": "Caching options for nodes (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/cache_nodes.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d43de202e6d3eee211893585616bda7eb09211c4.md", + "original_doc_id": "D43DE202E6D3EEE211893585616BDA7EB09211C4", + "path": "corpus/watsonx-docsqa/docs/d43de202e6d3eee211893585616bda7eb09211c4.md", + "title": "Continuous machine learning (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/caml.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/461d1a8f855174f44550531ef8be6e67c29d3e3b.md", + "original_doc_id": "461D1A8F855174F44550531EF8BE6E67C29D3E3B", + "path": "corpus/watsonx-docsqa/docs/461d1a8f855174f44550531ef8be6e67c29d3e3b.md", + "title": "CARMA node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/carma.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/37d9428bd2e4a45ca968dad59d1005fb5fc4de9c.md", + "original_doc_id": "37D9428BD2E4A45CA968DAD59D1005FB5FC4DE9C", + "path": "corpus/watsonx-docsqa/docs/37d9428bd2e4a45ca968dad59d1005fb5fc4de9c.md", + "title": "C&R Tree node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/cart.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d64140c0b8d4187b49046528ff61a54d77a99223.md", + "original_doc_id": "D64140C0B8D4187B49046528FF61A54D77A99223", + "path": "corpus/watsonx-docsqa/docs/d64140c0b8d4187b49046528ff61a54d77a99223.md", + "title": "CHAID node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/chaid.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/54ee0bb6fbd2e35c46c41d0065c299408f5ab0a5.md", + "original_doc_id": "54EE0BB6FBD2E35C46C41D0065C299408F5AB0A5", + "path": "corpus/watsonx-docsqa/docs/54ee0bb6fbd2e35c46c41d0065c299408f5ab0a5.md", + "title": "Characters (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/characters.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3c1d83e94ddc08d7a6229aedc49c895e86e660bf.md", + "original_doc_id": "3C1D83E94DDC08D7A6229AEDC49C895E86E660BF", + "path": "corpus/watsonx-docsqa/docs/3c1d83e94ddc08d7a6229aedc49c895e86e660bf.md", + "title": "CLEM datatypes (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_datatypes.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6f900078fd88e14400807e571e1f3a24c633c2dc.md", + "original_doc_id": "6F900078FD88E14400807E571E1F3A24C633C2DC", + "path": "corpus/watsonx-docsqa/docs/6f900078fd88e14400807e571e1f3a24c633c2dc.md", + "title": "CLEM examples (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_expression_examples.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/628354b3f2fa792b938756225315e3b4024dcc0e.md", + "original_doc_id": "628354B3F2FA792B938756225315E3B4024DCC0E", + "path": "corpus/watsonx-docsqa/docs/628354b3f2fa792b938756225315e3b4024dcc0e.md", + "title": "Functions reference (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1d1659b46a454170a597b0450fd99c16eec5b1ad.md", + "original_doc_id": "1D1659B46A454170A597B0450FD99C16EEC5B1AD", + "path": "corpus/watsonx-docsqa/docs/1d1659b46a454170a597b0450fd99c16eec5b1ad.md", + "title": "Bitwise integer operations (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_bitwise.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5fe3de32efb5dea4094dca22cbc77e24d23ef67a.md", + "original_doc_id": "5FE3DE32EFB5DEA4094DCA22CBC77E24D23EF67A", + "path": "corpus/watsonx-docsqa/docs/5fe3de32efb5dea4094dca22cbc77e24d23ef67a.md", + "title": "Functions handling blanks and null values (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_blanksnulls.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/32a79d23c94fb1920db500d2dd9464c1316c62a5.md", + "original_doc_id": "32A79D23C94FB1920DB500D2DD9464C1316C62A5", + "path": "corpus/watsonx-docsqa/docs/32a79d23c94fb1920db500d2dd9464c1316c62a5.md", + "title": "Comparison functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_comparison.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8ce325d8afc27359968a8799d58ef4bf0c57d68e.md", + "original_doc_id": "8CE325D8AFC27359968A8799D58EF4BF0C57D68E", + "path": "corpus/watsonx-docsqa/docs/8ce325d8afc27359968a8799d58ef4bf0c57d68e.md", + "title": "Conversion functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_conversion.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d1fafa3a73f77b401f49cc641be44d61bc9c0689.md", + "original_doc_id": "D1FAFA3A73F77B401F49CC641BE44D61BC9C0689", + "path": "corpus/watsonx-docsqa/docs/d1fafa3a73f77b401f49cc641be44d61bc9c0689.md", + "title": "Date and time functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_datetime.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/299cee894dff422aac8bf49b53cac700de1b172d.md", + "original_doc_id": "299CEE894DFF422AAC8BF49B53CAC700DE1B172D", + "path": "corpus/watsonx-docsqa/docs/299cee894dff422aac8bf49b53cac700de1b172d.md", + "title": "Global functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_global.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c6379e4acdd7b1c335e9944b8d9dbb08db220420.md", + "original_doc_id": "C6379E4ACDD7B1C335E9944B8D9DBB08DB220420", + "path": "corpus/watsonx-docsqa/docs/c6379e4acdd7b1c335e9944b8d9dbb08db220420.md", + "title": "Information functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_information.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a67ea42903bf8be22aeb379891b7e1ca3eb2e4d1.md", + "original_doc_id": "A67EA42903BF8BE22AEB379891B7E1CA3EB2E4D1", + "path": "corpus/watsonx-docsqa/docs/a67ea42903bf8be22aeb379891b7e1ca3eb2e4d1.md", + "title": "Logical functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_logical.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/eec0eb0502def7b7adb112f8d7d4c38e1f6d9170.md", + "original_doc_id": "EEC0EB0502DEF7B7ADB112F8D7D4C38E1F6D9170", + "path": "corpus/watsonx-docsqa/docs/eec0eb0502def7b7adb112f8d7d4c38e1f6d9170.md", + "title": "Numeric functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_numeric.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/29deec30687f805460a83dd924d2f119274d25f8.md", + "original_doc_id": "29DEEC30687F805460A83DD924D2F119274D25F8", + "path": "corpus/watsonx-docsqa/docs/29deec30687f805460a83dd924d2f119274d25f8.md", + "title": "Probability functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_probability.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9789f3a8936ad06c653c1c7aeb421c70ffd7c3e1.md", + "original_doc_id": "9789F3A8936AD06C653C1C7AEB421C70FFD7C3E1", + "path": "corpus/watsonx-docsqa/docs/9789f3a8936ad06c653c1c7aeb421c70ffd7c3e1.md", + "title": "Random functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_random.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bacaf30043e33912e3d7f174b3f8cf858cb3093a.md", + "original_doc_id": "BACAF30043E33912E3D7F174B3F8CF858CB3093A", + "path": "corpus/watsonx-docsqa/docs/bacaf30043e33912e3d7f174b3f8cf858cb3093a.md", + "title": "Sequence functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_sequence.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/88e4e066b89d0a6993f31ea337930d962b76d6d1.md", + "original_doc_id": "88E4E066B89D0A6993F31EA337930D962B76D6D1", + "path": "corpus/watsonx-docsqa/docs/88e4e066b89d0a6993f31ea337930d962b76d6d1.md", + "title": "SoundEx functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_soundex.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2c0ebf0ccb497f41c14a5895ef97c01864bfc3d2.md", + "original_doc_id": "2C0EBF0CCB497F41C14A5895EF97C01864BFC3D2", + "path": "corpus/watsonx-docsqa/docs/2c0ebf0ccb497f41c14a5895ef97c01864bfc3d2.md", + "title": "Spatial functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_spatial.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4058d0b5222f1c34abf1737a10da705e27480606.md", + "original_doc_id": "4058D0B5222F1C34ABF1737A10DA705E27480606", + "path": "corpus/watsonx-docsqa/docs/4058d0b5222f1c34abf1737a10da705e27480606.md", + "title": "Special fields (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_specialfields.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9a83a33abb4c6a12a7457d3711c2511eb3982b2c.md", + "original_doc_id": "9A83A33ABB4C6A12A7457D3711C2511EB3982B2C", + "path": "corpus/watsonx-docsqa/docs/9a83a33abb4c6a12a7457d3711c2511eb3982b2c.md", + "title": "String functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_string.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2904e26946523bb3e78975f68a822f5f2a32b9f5.md", + "original_doc_id": "2904E26946523BB3E78975F68A822F5F2A32B9F5", + "path": "corpus/watsonx-docsqa/docs/2904e26946523bb3e78975f68a822f5f2a32b9f5.md", + "title": "Trigonometric functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_trigonometric.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/621083eb36cf3896b77d22edbcc23fd2716f6b4a.md", + "original_doc_id": "621083EB36CF3896B77D22EDBCC23FD2716F6B4A", + "path": "corpus/watsonx-docsqa/docs/621083eb36cf3896b77d22edbcc23fd2716f6b4a.md", + "title": "Converting date and time values (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_functions_convertingdates.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/adbef9d5635eb271a8bd78b23064dcba1a1915a6.md", + "original_doc_id": "ADBEF9D5635EB271A8BD78B23064DCBA1A1915A6", + "path": "corpus/watsonx-docsqa/docs/adbef9d5635eb271a8bd78b23064dcba1a1915a6.md", + "title": "CLEM language reference (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_language_reference.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/88467827811ed045a648a3c215f5b91d43eb49cd.md", + "original_doc_id": "88467827811ED045A648A3C215F5B91D43EB49CD", + "path": "corpus/watsonx-docsqa/docs/88467827811ed045a648a3c215f5b91d43eb49cd.md", + "title": "Working with multiple-response data (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_overview_multiple_response_data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bc314650433831859c400bffefe5f919ed8735ea.md", + "original_doc_id": "BC314650433831859C400BFFEFE5F919ED8735EA", + "path": "corpus/watsonx-docsqa/docs/bc314650433831859c400bffefe5f919ed8735ea.md", + "title": "Working with numbers (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_overview_numbers.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/595bb1738027c777c1eb5a69631587923690abc4.md", + "original_doc_id": "595BB1738027C777C1EB5A69631587923690ABC4", + "path": "corpus/watsonx-docsqa/docs/595bb1738027c777c1eb5a69631587923690abc4.md", + "title": "Working with strings (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_overview_times_and_dates.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d1fef8c7f5be28316caa952ccc76281e6f3fe12f.md", + "original_doc_id": "D1FEF8C7F5BE28316CAA952CCC76281E6F3FE12F", + "path": "corpus/watsonx-docsqa/docs/d1fef8c7f5be28316caa952ccc76281e6f3fe12f.md", + "title": "Summarizing multiple fields (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_summarizemultiplefields.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/dad2ede59535330241f2febdf9bf99e21deb4393.md", + "original_doc_id": "DAD2EDE59535330241F2FEBDF9BF99E21DEB4393", + "path": "corpus/watsonx-docsqa/docs/dad2ede59535330241f2febdf9bf99e21deb4393.md", + "title": "Working with times and dates (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_times_and_dates_uses.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0f686bf5943844896a5385e01d440548081d2688.md", + "original_doc_id": "0F686BF5943844896A5385E01D440548081D2688", + "path": "corpus/watsonx-docsqa/docs/0f686bf5943844896a5385e01d440548081d2688.md", + "title": "Handling blanks and missing values (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clemoverview_blanksnulls.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/23296aad76933152d5d3e9dd875ebbd3fb7575ea.md", + "original_doc_id": "23296AAD76933152D5D3E9DD875EBBD3FB7575EA", + "path": "corpus/watsonx-docsqa/docs/23296aad76933152d5d3e9dd875ebbd3fb7575ea.md", + "title": "Building CLEM expressions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clemoverview_container.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7b9348596e2f005f89842d1b997fa09bdcbe8f06.md", + "original_doc_id": "7B9348596E2F005F89842D1B997FA09BDCBE8F06", + "path": "corpus/watsonx-docsqa/docs/7b9348596e2f005f89842d1b997fa09bdcbe8f06.md", + "title": "Conventions and function descriptions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/conventions_in_function_descriptions.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c2185a8c9156c6b38d76bd3fd29a833d96a5762b.md", + "original_doc_id": "C2185A8C9156C6B38D76BD3FD29A833D96A5762B", + "path": "corpus/watsonx-docsqa/docs/c2185a8c9156c6b38d76bd3fd29a833d96a5762b.md", + "title": "Dates (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/date_formats.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fe88457ca86ffe3be30873156a7a0a4fd12975af.md", + "original_doc_id": "FE88457CA86FFE3BE30873156A7A0A4FD12975AF", + "path": "corpus/watsonx-docsqa/docs/fe88457ca86ffe3be30873156a7a0a4fd12975af.md", + "title": "Accessing the Expression Builder (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/ebuilder_accessing.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/56ea4620b049a9e291bf198e71d0c58c2018686d.md", + "original_doc_id": "56EA4620B049A9E291BF198E71D0C58C2018686D", + "path": "corpus/watsonx-docsqa/docs/56ea4620b049a9e291bf198e71d0c58c2018686d.md", + "title": "Checking CLEM expressions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/ebuilder_checking.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6fd8a950f1ebe6b021ea9d4c775a5ca8660a1101.md", + "original_doc_id": "6FD8A950F1EBE6B021EA9D4C775A5CA8660A1101", + "path": "corpus/watsonx-docsqa/docs/6fd8a950f1ebe6b021ea9d4c775a5ca8660a1101.md", + "title": "Creating expressions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/ebuilder_using.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b8044b03933e3fcea5bcf6362199ed083ec2f20f.md", + "original_doc_id": "B8044B03933E3FCEA5BCF6362199ED083EC2F20F", + "path": "corpus/watsonx-docsqa/docs/b8044b03933e3fcea5bcf6362199ed083ec2f20f.md", + "title": "Database functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/expressionbuild_database_functions.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/841465ad74b0afdbec9eaff7b038afc4c000e96c.md", + "original_doc_id": "841465AD74B0AFDBEC9EAFF7B038AFC4C000E96C", + "path": "corpus/watsonx-docsqa/docs/841465ad74b0afdbec9eaff7b038afc4c000e96c.md", + "title": "Selecting fields (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/expressionbuild_fields.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0093065541aa4c3e90e47e3ace89596155ea1735.md", + "original_doc_id": "0093065541AA4C3E90E47E3ACE89596155EA1735", + "path": "corpus/watsonx-docsqa/docs/0093065541aa4c3e90e47e3ace89596155ea1735.md", + "title": "Selecting functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/expressionbuild_functions.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c89753519b91f85dc9e0ed54a3248cd82d5f2a9e.md", + "original_doc_id": "C89753519B91F85DC9E0ED54A3248CD82D5F2A9E", + "path": "corpus/watsonx-docsqa/docs/c89753519b91f85dc9e0ed54a3248cd82d5f2a9e.md", + "title": "The Expression Builder (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/expressionbuilderdialog.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f4f623d5a7c8913e227e962bd1f347b36aab7b51.md", + "original_doc_id": "F4F623D5A7C8913E227E962BD1F347B36AAB7B51", + "path": "corpus/watsonx-docsqa/docs/f4f623d5a7c8913e227e962bd1f347b36aab7b51.md", + "title": "Expressions and conditions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/expressions_and_conditions.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/85f8b4292483c5747ab2436a2d5d5377f1f6cab9.md", + "original_doc_id": "85F8B4292483C5747AB2436A2D5D5377F1F6CAB9", + "path": "corpus/watsonx-docsqa/docs/85f8b4292483c5747ab2436a2d5d5377f1f6cab9.md", + "title": "Viewing or selecting values (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/field_information.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b69246113e589f088e8e1302b32b57720bd27720.md", + "original_doc_id": "B69246113E589F088E8E1302B32B57720BD27720", + "path": "corpus/watsonx-docsqa/docs/b69246113e589f088e8e1302b32b57720bd27720.md", + "title": "Fields (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/fields.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c528d240892080aece146d29fb3496ddd0f1fd48.md", + "original_doc_id": "C528D240892080AECE146D29FB3496DDD0F1FD48", + "path": "corpus/watsonx-docsqa/docs/c528d240892080aece146d29fb3496ddd0f1fd48.md", + "title": "Find (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/findreplacedialog.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c1324a359a58b4d399c10bc59ae94e7e0723836d.md", + "original_doc_id": "C1324A359A58B4D399C10BC59AE94E7E0723836D", + "path": "corpus/watsonx-docsqa/docs/c1324a359a58b4d399c10bc59ae94e7e0723836d.md", + "title": "Integers (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/integers.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d05f366afc5726dc1a258edc3689067381efdecc.md", + "original_doc_id": "D05F366AFC5726DC1A258EDC3689067381EFDECC", + "path": "corpus/watsonx-docsqa/docs/d05f366afc5726dc1a258edc3689067381efdecc.md", + "title": "About CLEM (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/introduction_to_clem.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b93f8a3a1ced22cf84c45b552d5040a4a17fdb60.md", + "original_doc_id": "B93F8A3A1CED22CF84C45B552D5040A4A17FDB60", + "path": "corpus/watsonx-docsqa/docs/b93f8a3a1ced22cf84c45b552d5040a4a17fdb60.md", + "title": "Lists (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/lists.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9455a31e5d6c749f3028f9f5e5f758f713c09973.md", + "original_doc_id": "9455A31E5D6C749F3028F9F5E5F758F713C09973", + "path": "corpus/watsonx-docsqa/docs/9455a31e5d6c749f3028f9f5e5f758f713c09973.md", + "title": "CLEM operators (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/operator_precedence.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/185c42ab06de9ff515dcd03213f5c4608c6faebf.md", + "original_doc_id": "185C42AB06DE9FF515DCD03213F5C4608C6FAEBF", + "path": "corpus/watsonx-docsqa/docs/185c42ab06de9ff515dcd03213f5c4608c6faebf.md", + "title": "Reals (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/reals.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/385dec32600a9ded58fede3e98568fed789a400a.md", + "original_doc_id": "385DEC32600A9DED58FEDE3E98568FED789A400A", + "path": "corpus/watsonx-docsqa/docs/385dec32600a9ded58fede3e98568fed789a400a.md", + "title": "Strings (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/strings.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/839b16ac73c000ece7bac7d50baf6f7e37f2cad9.md", + "original_doc_id": "839B16AC73C000ECE7BAC7D50BAF6F7E37F2CAD9", + "path": "corpus/watsonx-docsqa/docs/839b16ac73c000ece7bac7d50baf6f7e37f2cad9.md", + "title": "Time (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/time_formats_clem_language.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f975b9964d088181cf34a1341083bc82053812d8.md", + "original_doc_id": "F975B9964D088181CF34A1341083BC82053812D8", + "path": "corpus/watsonx-docsqa/docs/f975b9964d088181cf34a1341083bc82053812d8.md", + "title": "Values and data types (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/values_and_data_types.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ee838ea978f9a0b0265a8d2b35ff2f64d00a1738.md", + "original_doc_id": "EE838EA978F9A0B0265A8D2B35FF2F64D00A1738", + "path": "corpus/watsonx-docsqa/docs/ee838ea978f9a0b0265a8d2b35ff2f64d00a1738.md", + "title": "Collection node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/collection.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5a8aa187972ba8a711ac91447f668b233e580c8c.md", + "original_doc_id": "5A8AA187972BA8A711AC91447F668B233E580C8C", + "path": "corpus/watsonx-docsqa/docs/5a8aa187972ba8a711ac91447f668b233e580c8c.md", + "title": "Cox node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/coxreg.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/67b99e436854f015a9db19c775639ba4bb4d5f9b.md", + "original_doc_id": "67B99E436854F015A9DB19C775639BA4BB4D5F9B", + "path": "corpus/watsonx-docsqa/docs/67b99e436854f015a9db19c775639ba4bb4d5f9b.md", + "title": "CPLEX Optimization node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/cplex.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9fa71067981e4fc0d6f68a14c91c694dc4c2af25.md", + "original_doc_id": "9FA71067981E4FC0D6F68A14C91C694DC4C2AF25", + "path": "corpus/watsonx-docsqa/docs/9fa71067981e4fc0d6f68a14c91c694dc4c2af25.md", + "title": "Data Asset Export node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/dataassetexport.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c70bb33e4e6792511dc4e7d88536017e64bcd0f1.md", + "original_doc_id": "C70BB33E4E6792511DC4E7D88536017E64BCD0F1", + "path": "corpus/watsonx-docsqa/docs/c70bb33e4e6792511dc4e7d88536017e64bcd0f1.md", + "title": "Data Asset node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/dataassetimport.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7f4648fd3e7f8564c98cf142e0e09e23e8097a9e.md", + "original_doc_id": "7F4648FD3E7F8564C98CF142E0E09E23E8097A9E", + "path": "corpus/watsonx-docsqa/docs/7f4648fd3e7f8564c98cf142e0e09e23e8097a9e.md", + "title": "Data Audit node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/dataaudit.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1a5f15e64aabdca9e2785588e76f3ebe22a1c426.md", + "original_doc_id": "1A5F15E64AABDCA9E2785588E76F3EBE22A1C426", + "path": "corpus/watsonx-docsqa/docs/1a5f15e64aabdca9e2785588e76f3ebe22a1c426.md", + "title": "Decision List node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/decisionlist.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4d299efff5b982097a5b9d48ea16041e4820a8bb.md", + "original_doc_id": "4D299EFFF5B982097A5B9D48EA16041E4820A8BB", + "path": "corpus/watsonx-docsqa/docs/4d299efff5b982097a5b9d48ea16041e4820a8bb.md", + "title": "Derive node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/derive.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/20cfe34d5494ab0ae2ef8b6f65396edbf667f688.md", + "original_doc_id": "20CFE34D5494AB0AE2EF8B6F65396EDBF667F688", + "path": "corpus/watsonx-docsqa/docs/20cfe34d5494ab0ae2ef8b6f65396edbf667f688.md", + "title": "Space-Time-Boxes node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/derive_stb.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/909b04011f4c2211d6d945ec82217e3f89a79bd7.md", + "original_doc_id": "909B04011F4C2211D6D945EC82217E3F89A79BD7", + "path": "corpus/watsonx-docsqa/docs/909b04011f4c2211d6d945ec82217e3f89a79bd7.md", + "title": "Disabling nodes in a flow (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/disable_nodes.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/338f12b976b522389f5fabe438280565490fb280.md", + "original_doc_id": "338F12B976B522389F5FABE438280565490FB280", + "path": "corpus/watsonx-docsqa/docs/338f12b976b522389f5fabe438280565490fb280.md", + "title": "Discriminant node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/discriminant.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5c597f82ec8484220a6fb3193dc78b878e8698f6.md", + "original_doc_id": "5C597F82EC8484220A6FB3193DC78B878E8698F6", + "path": "corpus/watsonx-docsqa/docs/5c597f82ec8484220a6fb3193dc78b878e8698f6.md", + "title": "Distinct node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/distinct.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/570af2aaf268a3df1d959d54a5be1790dc43ead5.md", + "original_doc_id": "570AF2AAF268A3DF1D959D54A5BE1790DC43EAD5", + "path": "corpus/watsonx-docsqa/docs/570af2aaf268a3df1d959d54a5be1790dc43ead5.md", + "title": "Distribution node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/distribution.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d5d31fda0eebfcdd87005ed54ebedfd164fa073b.md", + "original_doc_id": "D5D31FDA0EEBFCDD87005ED54EBEDFD164FA073B", + "path": "corpus/watsonx-docsqa/docs/d5d31fda0eebfcdd87005ed54ebedfd164fa073b.md", + "title": "Charts node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/dvcharts.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8c53bd47030c9bf4e7dbf1ea482cded9cc8abad4.md", + "original_doc_id": "8C53BD47030C9BF4E7DBF1EA482CDED9CC8ABAD4", + "path": "corpus/watsonx-docsqa/docs/8c53bd47030c9bf4e7dbf1ea482cded9cc8abad4.md", + "title": "Ensemble node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/ensemble.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4f733928b0f749ffddf2e6daef646a0524c54d67.md", + "original_doc_id": "4F733928B0F749FFDDF2E6DAEF646A0524C54D67", + "path": "corpus/watsonx-docsqa/docs/4f733928b0f749ffddf2e6daef646a0524c54d67.md", + "title": "Evaluation node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/evaluation.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f5a6d2ae83a7989e17704e69f0a640368c676594.md", + "original_doc_id": "F5A6D2AE83A7989E17704E69F0A640368C676594", + "path": "corpus/watsonx-docsqa/docs/f5a6d2ae83a7989e17704e69f0a640368c676594.md", + "title": "Expression Builder (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/expressionbuilder.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9da0d100a88228ab463cb9b1b6cf1c051253911a.md", + "original_doc_id": "9DA0D100A88228AB463CB9B1B6CF1C051253911A", + "path": "corpus/watsonx-docsqa/docs/9da0d100a88228ab463cb9b1b6cf1c051253911a.md", + "title": "Selecting functions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/expressionbuilder_functions.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1b0ab9084c7dd9546bdc2f376b58e32c0ecfee85.md", + "original_doc_id": "1B0AB9084C7DD9546BDC2F376B58E32C0ECFEE85", + "path": "corpus/watsonx-docsqa/docs/1b0ab9084c7dd9546bdc2f376b58e32c0ecfee85.md", + "title": "Extension Model node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_build.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6402316febfad11a582d9c567811003f4bee596a.md", + "original_doc_id": "6402316FEBFAD11A582D9C567811003F4BEE596A", + "path": "corpus/watsonx-docsqa/docs/6402316febfad11a582d9c567811003f4bee596a.md", + "title": "Extension Export node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_export.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/378f6a8306234029de1642cbff8e44ed6848bf74.md", + "original_doc_id": "378F6A8306234029DE1642CBFF8E44ED6848BF74", + "path": "corpus/watsonx-docsqa/docs/378f6a8306234029de1642cbff8e44ed6848bf74.md", + "title": "Extension Import node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_importer.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/97fa49d526786021cf325ff9aff15646a8270b48.md", + "original_doc_id": "97FA49D526786021CF325FF9AFF15646A8270B48", + "path": "corpus/watsonx-docsqa/docs/97fa49d526786021cf325ff9aff15646a8270b48.md", + "title": "Native Python APIs (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_nativepython_api.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1d46d1240377aea562f14a560cb9f24df33edf88.md", + "original_doc_id": "1D46D1240377AEA562F14A560CB9F24DF33EDF88", + "path": "corpus/watsonx-docsqa/docs/1d46d1240377aea562f14a560cb9f24df33edf88.md", + "title": "Extension Output node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_output.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ff6c435adbd62de03c06ce4f90343d3cd04f9e8f.md", + "original_doc_id": "FF6C435ADBD62DE03C06CE4F90343D3CD04F9E8F", + "path": "corpus/watsonx-docsqa/docs/ff6c435adbd62de03c06ce4f90343d3cd04f9e8f.md", + "title": "Extension Transform node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_process.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/63c0dfb695860e1da7981d86959d998bebc2dd03.md", + "original_doc_id": "63C0DFB695860E1DA7981D86959D998BEBC2DD03", + "path": "corpus/watsonx-docsqa/docs/63c0dfb695860e1da7981d86959d998bebc2dd03.md", + "title": "Python for Spark scripts (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_pyspark.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/17470065afc59337b207721ab539b4622bbb3055.md", + "original_doc_id": "17470065AFC59337B207721AB539B4622BBB3055", + "path": "corpus/watsonx-docsqa/docs/17470065afc59337b207721ab539b4622bbb3055.md", + "title": "Scripting with Python for Spark (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_pyspark_api.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7436f8933ca1dd44e05cd59f8e2cb13052763643.md", + "original_doc_id": "7436F8933CA1DD44E05CD59F8E2CB13052763643", + "path": "corpus/watsonx-docsqa/docs/7436f8933ca1dd44e05cd59f8e2cb13052763643.md", + "title": "Date, time, timestamp (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_pyspark_date.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/835b998310e6e268f648d4aa28528190ebbb48ca.md", + "original_doc_id": "835B998310E6E268F648D4AA28528190EBBB48CA", + "path": "corpus/watsonx-docsqa/docs/835b998310e6e268f648d4aa28528190ebbb48ca.md", + "title": "Examples (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_pyspark_examples.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ad61bc1b395a071d8850bc2405a8c311cfdc931f.md", + "original_doc_id": "AD61BC1B395A071D8850BC2405A8C311CFDC931F", + "path": "corpus/watsonx-docsqa/docs/ad61bc1b395a071d8850bc2405a8c311cfdc931f.md", + "title": "Exceptions (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_pyspark_exceptions.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/450caaacd51abdedab940cafb4bc47ebfbcbba67.md", + "original_doc_id": "450CAAACD51ABDEDAB940CAFB4BC47EBFBCBBA67", + "path": "corpus/watsonx-docsqa/docs/450caaacd51abdedab940cafb4bc47ebfbcbba67.md", + "title": "Data metadata (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_pyspark_metadata.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b98506eb96c587bdfd06cbf67617e25d9dae8e60.md", + "original_doc_id": "B98506EB96C587BDFD06CBF67617E25D9DAE8E60", + "path": "corpus/watsonx-docsqa/docs/b98506eb96c587bdfd06cbf67617e25d9dae8e60.md", + "title": "R scripts (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_r.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/50636405c61e0af7d2ee0ee31256c4cd0f6c5ded.md", + "original_doc_id": "50636405C61E0AF7D2EE0EE31256C4CD0F6C5DED", + "path": "corpus/watsonx-docsqa/docs/50636405c61e0af7d2ee0ee31256c4cd0f6c5ded.md", + "title": "PCA/Factor node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/factor.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9e1cdb994e758d43d9d8cdc5d88e2b5c7e0088d7.md", + "original_doc_id": "9E1CDB994E758D43D9D8CDC5D88E2B5C7E0088D7", + "path": "corpus/watsonx-docsqa/docs/9e1cdb994e758d43d9d8cdc5d88e2b5c7e0088d7.md", + "title": "Feature Selection node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/featureselection.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/38d24508b131beb6138652c2fd1e0380a001bb54.md", + "original_doc_id": "38D24508B131BEB6138652C2FD1E0380A001BB54", + "path": "corpus/watsonx-docsqa/docs/38d24508b131beb6138652c2fd1e0380a001bb54.md", + "title": "Filler node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/filler.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/eed64f79ebfdd957deebec6261b3a70a248f3d35.md", + "original_doc_id": "EED64F79EBFDD957DEEBEC6261B3A70A248F3D35", + "path": "corpus/watsonx-docsqa/docs/eed64f79ebfdd957deebec6261b3a70a248f3d35.md", + "title": "Filter node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/filter.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b8522e9801281dd4118a5012acf885a7ec2354e4.md", + "original_doc_id": "B8522E9801281DD4118A5012ACF885A7EC2354E4", + "path": "corpus/watsonx-docsqa/docs/b8522e9801281dd4118a5012acf885a7ec2354e4.md", + "title": "GenLin node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/genlin.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cf6fe4e4058c24f0beb94d379fb9e820c09456d2.md", + "original_doc_id": "CF6FE4E4058C24F0BEB94D379FB9E820C09456D2", + "path": "corpus/watsonx-docsqa/docs/cf6fe4e4058c24f0beb94d379fb9e820c09456d2.md", + "title": "GLE node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/gle.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b561f461842bb0d185f097e0adb8d3ac13266172.md", + "original_doc_id": "B561F461842BB0D185F097E0ADB8D3AC13266172", + "path": "corpus/watsonx-docsqa/docs/b561f461842bb0d185f097e0adb8d3ac13266172.md", + "title": "GLMM node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/glmm.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e6b5ead096e68a255c5526add4c828534891c090.md", + "original_doc_id": "E6B5EAD096E68A255C5526ADD4C828534891C090", + "path": "corpus/watsonx-docsqa/docs/e6b5ead096e68a255c5526add4c828534891c090.md", + "title": "Gaussian Mixture node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/gmm.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a1fe4b06db60f8a9c916fbeaf5c7482155bd62e3.md", + "original_doc_id": "A1FE4B06DB60F8A9C916FBEAF5C7482155BD62E3", + "path": "corpus/watsonx-docsqa/docs/a1fe4b06db60f8a9c916fbeaf5c7482155bd62e3.md", + "title": "HDBSCAN node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/hdbscan.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/13f7c9c7b52ec7152f2b3d81b6eb42db0319a6f4.md", + "original_doc_id": "13F7C9C7B52EC7152F2B3D81B6EB42DB0319A6F4", + "path": "corpus/watsonx-docsqa/docs/13f7c9c7b52ec7152f2b3d81b6eb42db0319a6f4.md", + "title": "Histogram node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/histogram.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/00205c92c52fa28db619ee1f9c8d76fe8564db88.md", + "original_doc_id": "00205C92C52FA28DB619EE1F9C8D76FE8564DB88", + "path": "corpus/watsonx-docsqa/docs/00205c92c52fa28db619ee1f9c8d76fe8564db88.md", + "title": "History node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/history.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1bc1fe73146c70fa2a76241470314a4732efd918.md", + "original_doc_id": "1BC1FE73146C70FA2A76241470314A4732EFD918", + "path": "corpus/watsonx-docsqa/docs/1bc1fe73146c70fa2a76241470314a4732efd918.md", + "title": "Isotonic-AS node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/isotonicas.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/22a8f7539d1374784e9bf247b1370c430910f43d.md", + "original_doc_id": "22A8F7539D1374784E9BF247B1370C430910F43D", + "path": "corpus/watsonx-docsqa/docs/22a8f7539d1374784e9bf247b1370c430910f43d.md", + "title": "KDE node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/kdemodel.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/033e2b1cd9e006383c2d2c045b8834bfbbab0f09.md", + "original_doc_id": "033E2B1CD9E006383C2D2C045B8834BFBBAB0F09", + "path": "corpus/watsonx-docsqa/docs/033e2b1cd9e006383c2d2c045b8834bfbbab0f09.md", + "title": "KDE Simulation node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/kdesimulation.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/13a1ff3338f4ac1eb2cf3ff6781283b49ac8b5a6.md", + "original_doc_id": "13A1FF3338F4AC1EB2CF3FF6781283B49AC8B5A6", + "path": "corpus/watsonx-docsqa/docs/13a1ff3338f4ac1eb2cf3ff6781283b49ac8b5a6.md", + "title": "K-Means node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/kmeans.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/dce39ca6c888ca6d5cf3f9b9d18d06fd3bd2dfbe.md", + "original_doc_id": "DCE39CA6C888CA6D5CF3F9B9D18D06FD3BD2DFBE", + "path": "corpus/watsonx-docsqa/docs/dce39ca6c888ca6d5cf3f9b9d18d06fd3bd2dfbe.md", + "title": "K-Means-AS node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/kmeansas.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1dd1ed59e93da4f6576e7eb1e420213ab34dd1dd.md", + "original_doc_id": "1DD1ED59E93DA4F6576E7EB1E420213AB34DD1DD", + "path": "corpus/watsonx-docsqa/docs/1dd1ed59e93da4f6576e7eb1e420213ab34dd1dd.md", + "title": "KNN node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/knn.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f965be0f67b8b3c26be38939a33fa8ab74aea4cc.md", + "original_doc_id": "F965BE0F67B8B3C26BE38939A33FA8AB74AEA4CC", + "path": "corpus/watsonx-docsqa/docs/f965be0f67b8b3c26be38939a33fa8ab74aea4cc.md", + "title": "Kohonen node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/kohonen.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/67241853fc2471c6c0719f1b98e40625358b2e19.md", + "original_doc_id": "67241853FC2471C6C0719F1B98E40625358B2E19", + "path": "corpus/watsonx-docsqa/docs/67241853fc2471c6c0719f1b98e40625358b2e19.md", + "title": "Reading in source text (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/languageidentifier.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fc8006009802ae14770be53062787d8a392b0070.md", + "original_doc_id": "FC8006009802AE14770BE53062787D8A392B0070", + "path": "corpus/watsonx-docsqa/docs/fc8006009802ae14770be53062787d8a392b0070.md", + "title": "Linear node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/linear.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2d9ace87f4859bf7ef8cdf4ebbf8307c51034471.md", + "original_doc_id": "2D9ACE87F4859BF7EF8CDF4EBBF8307C51034471", + "path": "corpus/watsonx-docsqa/docs/2d9ace87f4859bf7ef8cdf4ebbf8307c51034471.md", + "title": "Linear-AS node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/linearas.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/de0c1913d6d770641762ed518fefe8fffc5a1f13.md", + "original_doc_id": "DE0C1913D6D770641762ED518FEFE8FFFC5A1F13", + "path": "corpus/watsonx-docsqa/docs/de0c1913d6d770641762ed518fefe8fffc5a1f13.md", + "title": "Logistic node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/logreg.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a9e9d62e92156cebc0d4619cde322af48cace913.md", + "original_doc_id": "A9E9D62E92156CEBC0D4619CDE322AF48CACE913", + "path": "corpus/watsonx-docsqa/docs/a9e9d62e92156cebc0d4619cde322af48cace913.md", + "title": "LSVM node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/lsvm.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/774fd49c617dac62f48eb31e08757e0aec3d1282.md", + "original_doc_id": "774FD49C617DAC62F48EB31E08757E0AEC3D1282", + "path": "corpus/watsonx-docsqa/docs/774fd49c617dac62f48eb31e08757e0aec3d1282.md", + "title": "Matrix node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/matrix.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7b586e10794f26ea2654a7f7c34ec9ea48c8bfd4.md", + "original_doc_id": "7B586E10794F26EA2654A7F7C34EC9EA48C8BFD4", + "path": "corpus/watsonx-docsqa/docs/7b586e10794f26ea2654a7f7c34ec9ea48c8bfd4.md", + "title": "Means node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/means.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6647035446fc3a28586ebabc619d10db5fe3f4fd.md", + "original_doc_id": "6647035446FC3A28586EBABC619D10DB5FE3F4FD", + "path": "corpus/watsonx-docsqa/docs/6647035446fc3a28586ebabc619d10db5fe3f4fd.md", + "title": "Merge node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/merge.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/61e8df28e1a79b4bba03cda39f350be5e55dac7b.md", + "original_doc_id": "61E8DF28E1A79B4BBA03CDA39F350BE5E55DAC7B", + "path": "corpus/watsonx-docsqa/docs/61e8df28e1a79b4bba03cda39f350be5e55dac7b.md", + "title": "Functions available for missing values (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/missingvalues_changes.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0e5c87704e816097ff9e649620a1818798b5db3f.md", + "original_doc_id": "0E5C87704E816097FF9E649620A1818798B5DB3F", + "path": "corpus/watsonx-docsqa/docs/0e5c87704e816097ff9e649620a1818798b5db3f.md", + "title": "Handling fields with missing values (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/missingvalues_fields.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d5fafc625d1a1d0793d9521351e9b59a04af00e9.md", + "original_doc_id": "D5FAFC625D1A1D0793D9521351E9B59A04AF00E9", + "path": "corpus/watsonx-docsqa/docs/d5fafc625d1a1d0793d9521351e9b59a04af00e9.md", + "title": "Missing data values (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/missingvalues_overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fe9ff9f5cc449798c00d008182f55bdaa91e546c.md", + "original_doc_id": "FE9FF9F5CC449798C00D008182F55BDAA91E546C", + "path": "corpus/watsonx-docsqa/docs/fe9ff9f5cc449798c00d008182f55bdaa91e546c.md", + "title": "Handling records with missing values (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/missingvalues_records.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3ba46a09cf64ce6120be65c44614995b50b67da1.md", + "original_doc_id": "3BA46A09CF64CE6120BE65C44614995B50B67DA1", + "path": "corpus/watsonx-docsqa/docs/3ba46a09cf64ce6120be65c44614995b50b67da1.md", + "title": "Handling records with system missing values (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/missingvalues_system.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/01c8222216b795904018497993cc5e44d51a3b35.md", + "original_doc_id": "01C8222216B795904018497993CC5E44D51A3B35", + "path": "corpus/watsonx-docsqa/docs/01c8222216b795904018497993cc5e44d51a3b35.md", + "title": "Handling missing values (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/missingvalues_treating.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6576530ec5d705b8bf323f6c459c32a87ae3f9a4.md", + "original_doc_id": "6576530EC5D705B8BF323F6C459C32A87AE3F9A4", + "path": "corpus/watsonx-docsqa/docs/6576530ec5d705b8bf323f6c459c32a87ae3f9a4.md", + "title": "MultiLayerPerceptron-AS node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/mlpas.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5f0fc43f57ab9af130dea6a795e1e81a6aa95acc.md", + "original_doc_id": "5F0FC43F57AB9AF130DEA6A795E1E81A6AA95ACC", + "path": "corpus/watsonx-docsqa/docs/5f0fc43f57ab9af130dea6a795e1e81a6aa95acc.md", + "title": "Multiplot node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/multiplot.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9f06df311976f336cb3164b08d5da7d6f93419e2.md", + "original_doc_id": "9F06DF311976F336CB3164B08D5DA7D6F93419E2", + "path": "corpus/watsonx-docsqa/docs/9f06df311976f336cb3164b08d5da7d6f93419e2.md", + "title": "Neural Net node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/neuralnetwork.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9933646421686556c9ae8459ee2e51ed9dab1c33.md", + "original_doc_id": "9933646421686556C9AE8459EE2E51ED9DAB1C33", + "path": "corpus/watsonx-docsqa/docs/9933646421686556c9ae8459ee2e51ed9dab1c33.md", + "title": "Disabling or caching nodes in a flow (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/nodes_cache_disable.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/759b6927189fea6be3124bf79fa527873cb84ea6.md", + "original_doc_id": "759B6927189FEA6BE3124BF79FA527873CB84EA6", + "path": "corpus/watsonx-docsqa/docs/759b6927189fea6be3124bf79fa527873cb84ea6.md", + "title": "One-Class SVM node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/ocsvm.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/98fc8e9a3380e4593d9bf08b78ce6a7797c0204b.md", + "original_doc_id": "98FC8E9A3380E4593D9BF08B78CE6A7797C0204B", + "path": "corpus/watsonx-docsqa/docs/98fc8e9a3380e4593d9bf08b78ce6a7797c0204b.md", + "title": "Partition node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/partition.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cfc54bb4cea29104bd4f9793b51abe558aa0250d.md", + "original_doc_id": "CFC54BB4CEA29104BD4F9793B51ABE558AA0250D", + "path": "corpus/watsonx-docsqa/docs/cfc54bb4cea29104bd4f9793b51abe558aa0250d.md", + "title": "Plot node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/plot.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5e2a4b92c4f5f84b3dde2ead6827c7fa89eb0565.md", + "original_doc_id": "5E2A4B92C4F5F84B3DDE2EAD6827C7FA89EB0565", + "path": "corpus/watsonx-docsqa/docs/5e2a4b92c4f5f84b3dde2ead6827c7fa89eb0565.md", + "title": "QUEST node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/quest.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2581dd8f04f917ba91f1201137ae0efea1f82e26.md", + "original_doc_id": "2581DD8F04F917BA91F1201137AE0EFEA1F82E26", + "path": "corpus/watsonx-docsqa/docs/2581dd8f04f917ba91f1201137ae0efea1f82e26.md", + "title": "Random Forest node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/randomforest.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/01800e00bdfb7cfe0e751fa6c616160c48e6ed21.md", + "original_doc_id": "01800E00BDFB7CFE0E751FA6C616160C48E6ED21", + "path": "corpus/watsonx-docsqa/docs/01800e00bdfb7cfe0e751fa6c616160c48e6ed21.md", + "title": "Random Trees node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/randomtrees.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2d3f7f5efb161e0d88ae69c4710d70aa99db0bde.md", + "original_doc_id": "2D3F7F5EFB161E0D88AE69C4710D70AA99DB0BDE", + "path": "corpus/watsonx-docsqa/docs/2d3f7f5efb161e0d88ae69c4710d70aa99db0bde.md", + "title": "Reclassify node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/reclassify.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bbdeda771a051a9b1871f9bec9589d91421e7c0c.md", + "original_doc_id": "BBDEDA771A051A9B1871F9BEC9589D91421E7C0C", + "path": "corpus/watsonx-docsqa/docs/bbdeda771a051a9b1871f9bec9589d91421e7c0c.md", + "title": "Refression (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/regression.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8322c981206a5c7eeec48c32c9ddcec9fce98aee.md", + "original_doc_id": "8322C981206A5C7EEEC48C32C9DDCEC9FCE98AEE", + "path": "corpus/watsonx-docsqa/docs/8322c981206a5c7eeec48c32c9ddcec9fce98aee.md", + "title": "Field Reorder node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/reorder.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bf6a65f061558b6aed8a438a887b6474a0fdffc3.md", + "original_doc_id": "BF6A65F061558B6AED8A438A887B6474A0FDFFC3", + "path": "corpus/watsonx-docsqa/docs/bf6a65f061558b6aed8a438a887b6474a0fdffc3.md", + "title": "Report node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/report.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/36c8af3bbafff1c227cf611d7327afa8e378d6ec.md", + "original_doc_id": "36C8AF3BBAFFF1C227CF611D7327AFA8E378D6EC", + "path": "corpus/watsonx-docsqa/docs/36c8af3bbafff1c227cf611d7327afa8e378d6ec.md", + "title": "Restructure node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/restructure.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/265714702b012f1010ce06d97ec16623360f4e2b.md", + "original_doc_id": "265714702B012F1010CE06D97EC16623360F4E2B", + "path": "corpus/watsonx-docsqa/docs/265714702b012f1010ce06d97ec16623360f4e2b.md", + "title": "RFM Aggregate node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/rfm_aggregate.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9e15d946edfb82ef911d36032c073cf1736b39da.md", + "original_doc_id": "9E15D946EDFB82EF911D36032C073CF1736B39DA", + "path": "corpus/watsonx-docsqa/docs/9e15d946edfb82ef911d36032c073cf1736b39da.md", + "title": "RFM Analysis node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/rfm_analysis.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/af3da662099bd616b642f69925aec7c8afc84611.md", + "original_doc_id": "AF3DA662099BD616B642F69925AEC7C8AFC84611", + "path": "corpus/watsonx-docsqa/docs/af3da662099bd616b642f69925aec7c8afc84611.md", + "title": "Sample node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/sample.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/84e8928d464d412b225638bcc41f2837f98aef43.md", + "original_doc_id": "84E8928D464D412B225638BCC41F2837F98AEF43", + "path": "corpus/watsonx-docsqa/docs/84e8928d464d412b225638bcc41f2837f98aef43.md", + "title": "autodataprepnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/adpnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8cd81c0f5f84dfe58834aeb8b71e6d7780b8dead.md", + "original_doc_id": "8CD81C0F5F84DFE58834AEB8B71E6D7780B8DEAD", + "path": "corpus/watsonx-docsqa/docs/8cd81c0f5f84dfe58834aeb8b71e6d7780b8dead.md", + "title": "aggregatenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/aggregatenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2c17e0a9e72fe65317838e81acf1fa77620e0c6c.md", + "original_doc_id": "2C17E0A9E72FE65317838E81ACF1FA77620E0C6C", + "path": "corpus/watsonx-docsqa/docs/2c17e0a9e72fe65317838e81acf1fa77620e0c6c.md", + "title": "analysisnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/analysisnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5c2296329a2d24b1a22a3848731708d78949e74c.md", + "original_doc_id": "5C2296329A2D24B1A22A3848731708D78949E74C", + "path": "corpus/watsonx-docsqa/docs/5c2296329a2d24b1a22a3848731708d78949e74c.md", + "title": "anomalydetectionnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/anomalydetectionnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b51ff1fba515035a93290f353d20ad9d54bc043c.md", + "original_doc_id": "B51FF1FBA515035A93290F353D20AD9D54BC043C", + "path": "corpus/watsonx-docsqa/docs/b51ff1fba515035a93290f353d20ad9d54bc043c.md", + "title": "applyanomalydetectionnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/anomalydetectionnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/65ffb2e27eacd57bcadc6c1646eb280212d3b2c2.md", + "original_doc_id": "65FFB2E27EACD57BCADC6C1646EB280212D3B2C2", + "path": "corpus/watsonx-docsqa/docs/65ffb2e27eacd57bcadc6c1646eb280212d3b2c2.md", + "title": "anonymizenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/anonymizenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8d328fc36822024d739f83a36fef66e5abe61128.md", + "original_doc_id": "8D328FC36822024D739F83A36FEF66E5ABE61128", + "path": "corpus/watsonx-docsqa/docs/8d328fc36822024d739f83a36fef66e5abe61128.md", + "title": "appendnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/appendnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/76ec742bc2d093c10c6a5b85456bfbb6571c416d.md", + "original_doc_id": "76EC742BC2D093C10C6A5B85456BFBB6571C416D", + "path": "corpus/watsonx-docsqa/docs/76ec742bc2d093c10c6a5b85456bfbb6571c416d.md", + "title": "apriorinode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/apriorinodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/292c0e87b8e56b15991c954508ab125a8fb80972.md", + "original_doc_id": "292C0E87B8E56B15991C954508AB125A8FB80972", + "path": "corpus/watsonx-docsqa/docs/292c0e87b8e56b15991c954508ab125a8fb80972.md", + "title": "applyapriorinode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/apriorinuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2bcbd3d61cc24296ea38b26b10306b7f50ce4988.md", + "original_doc_id": "2BCBD3D61CC24296EA38B26B10306B7F50CE4988", + "path": "corpus/watsonx-docsqa/docs/2bcbd3d61cc24296ea38b26b10306b7f50ce4988.md", + "title": "astimeintervalsnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/astimeintervalnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/27963df2327fbe202b836ac5905258d063a8770d.md", + "original_doc_id": "27963DF2327FBE202B836AC5905258D063A8770D", + "path": "corpus/watsonx-docsqa/docs/27963df2327fbe202b836ac5905258d063a8770d.md", + "title": "applyautoclassifiernode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/autoclassifiernuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e399a5b6fa720c6f21337792f822f20f20f98910.md", + "original_doc_id": "E399A5B6FA720C6F21337792F822F20F20F98910", + "path": "corpus/watsonx-docsqa/docs/e399a5b6fa720c6f21337792f822f20f20f98910.md", + "title": "autoclusternode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/autoclusternodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/14416203d840c788359110b18cfd9ce922de0d67.md", + "original_doc_id": "14416203D840C788359110B18CFD9CE922DE0D67", + "path": "corpus/watsonx-docsqa/docs/14416203d840c788359110b18cfd9ce922de0d67.md", + "title": "applyautoclusternode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/autoclusternuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3eaafddade769d3b0300be1401bb3d7e68b312dd.md", + "original_doc_id": "3EAAFDDADE769D3B0300BE1401BB3D7E68B312DD", + "path": "corpus/watsonx-docsqa/docs/3eaafddade769d3b0300be1401bb3d7e68b312dd.md", + "title": "applyautonumericnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/autonumericnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d2d9f4e05cabc566b2021116ed28ef413fa96779.md", + "original_doc_id": "D2D9F4E05CABC566B2021116ED28EF413FA96779", + "path": "corpus/watsonx-docsqa/docs/d2d9f4e05cabc566b2021116ed28ef413fa96779.md", + "title": "Node properties overview", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/available_slot_parameters.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7a9f4cdf362d1f06c3644edbd634b2a77ddc6005.md", + "original_doc_id": "7A9F4CDF362D1F06C3644EDBD634B2A77DDC6005", + "path": "corpus/watsonx-docsqa/docs/7a9f4cdf362d1f06c3644edbd634b2a77ddc6005.md", + "title": "balancenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/balancenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fe2254205e6dd1ee2a4ec62036ab86bc5e084f5d.md", + "original_doc_id": "FE2254205E6DD1EE2A4EC62036AB86BC5E084F5D", + "path": "corpus/watsonx-docsqa/docs/fe2254205e6dd1ee2a4ec62036ab86bc5e084f5d.md", + "title": "bayesnetnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/bayesnetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ec154ae6f7fe894644424bfa90c6ca31e13a4b71.md", + "original_doc_id": "EC154AE6F7FE894644424BFA90C6CA31E13A4B71", + "path": "corpus/watsonx-docsqa/docs/ec154ae6f7fe894644424bfa90c6ca31e13a4b71.md", + "title": "applybayesnetnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/bayesnetnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cda0897d49b56ee521bf16e52014da5e2e1d2710.md", + "original_doc_id": "CDA0897D49B56EE521BF16E52014DA5E2E1D2710", + "path": "corpus/watsonx-docsqa/docs/cda0897d49b56ee521bf16e52014da5e2e1d2710.md", + "title": "autoclassifiernode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/binaryclassifiernodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b741fe5cdd06d606f869b15deb2173c1f134d22d.md", + "original_doc_id": "B741FE5CDD06D606F869B15DEB2173C1F134D22D", + "path": "corpus/watsonx-docsqa/docs/b741fe5cdd06d606f869b15deb2173c1f134d22d.md", + "title": "binningnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/binningnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5c95f2d19465dda8969d0498d1b96d870bd02a1f.md", + "original_doc_id": "5C95F2D19465DDA8969D0498D1B96D870BD02A1F", + "path": "corpus/watsonx-docsqa/docs/5c95f2d19465dda8969d0498d1b96d870bd02a1f.md", + "title": "c50node properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/c50nodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fcbdbfd3e4bebefe552fad012509948faba34b44.md", + "original_doc_id": "FCBDBFD3E4BEBEFE552FAD012509948FABA34B44", + "path": "corpus/watsonx-docsqa/docs/fcbdbfd3e4bebefe552fad012509948faba34b44.md", + "title": "applyc50node properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/c50nuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/499553788712e55abe1345c61ccdb15d1ce04e83.md", + "original_doc_id": "499553788712E55ABE1345C61CCDB15D1CE04E83", + "path": "corpus/watsonx-docsqa/docs/499553788712e55abe1345c61ccdb15d1ce04e83.md", + "title": "carmanode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/carmanodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ce14b5eff03a17683c6aa16d02f62e1ebad0d7f2.md", + "original_doc_id": "CE14B5EFF03A17683C6AA16D02F62E1EBAD0D7F2", + "path": "corpus/watsonx-docsqa/docs/ce14b5eff03a17683c6aa16d02f62e1ebad0d7f2.md", + "title": "applycarmanode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/carmanuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cb130d4e1ae505ce39cbd49bf9d22359b9ec80ab.md", + "original_doc_id": "CB130D4E1AE505CE39CBD49BF9D22359B9EC80AB", + "path": "corpus/watsonx-docsqa/docs/cb130d4e1ae505ce39cbd49bf9d22359b9ec80ab.md", + "title": "cartnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/cartnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c53bd428f2955b76bf24620a21a6461a1cc19f11.md", + "original_doc_id": "C53BD428F2955B76BF24620A21A6461A1CC19F11", + "path": "corpus/watsonx-docsqa/docs/c53bd428f2955b76bf24620a21a6461a1cc19f11.md", + "title": "applycartnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/cartnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b0b1665f022c9e781ce1ae94fa885266391fbcfe.md", + "original_doc_id": "B0B1665F022C9E781CE1AE94FA885266391FBCFE", + "path": "corpus/watsonx-docsqa/docs/b0b1665f022c9e781ce1ae94fa885266391fbcfe.md", + "title": "chaidnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/chaidnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6644eaa4a383f7ed21c0ca1adae80a634867870a.md", + "original_doc_id": "6644EAA4A383F7ED21C0CA1ADAE80A634867870A", + "path": "corpus/watsonx-docsqa/docs/6644eaa4a383f7ed21c0ca1adae80a634867870a.md", + "title": "applychaidnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/chaidnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fd45693344e2b3cc3bdb7d1aa209ad9fbacb5309.md", + "original_doc_id": "FD45693344E2B3CC3BDB7D1AA209AD9FBACB5309", + "path": "corpus/watsonx-docsqa/docs/fd45693344e2b3cc3bdb7d1aa209ad9fbacb5309.md", + "title": "dvcharts properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/chartnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f24c445f7ab9052a92e411b826c60dee2df78448.md", + "original_doc_id": "F24C445F7AB9052A92E411B826C60DEE2DF78448", + "path": "corpus/watsonx-docsqa/docs/f24c445f7ab9052a92e411b826c60dee2df78448.md", + "title": "collectionnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/collectionnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f1b21b1232720492424bb07cd73c93df2b9cd229.md", + "original_doc_id": "F1B21B1232720492424BB07CD73C93DF2B9CD229", + "path": "corpus/watsonx-docsqa/docs/f1b21b1232720492424bb07cd73c93df2b9cd229.md", + "title": "coxregnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/coxregnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cebdc984a6e14e7dc6b7526324bf06a0ce6ffe34.md", + "original_doc_id": "CEBDC984A6E14E7DC6B7526324BF06A0CE6FFE34", + "path": "corpus/watsonx-docsqa/docs/cebdc984a6e14e7dc6b7526324bf06a0ce6ffe34.md", + "title": "applycoxregnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/coxregnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7566f3896a5ac6f89f4e7e18dc21b4a6a63864b4.md", + "original_doc_id": "7566F3896A5AC6F89F4E7E18DC21B4A6A63864B4", + "path": "corpus/watsonx-docsqa/docs/7566f3896a5ac6f89f4e7e18dc21b4a6a63864b4.md", + "title": "cplexoptnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/cplexnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/02d819d225558542a49ab6e43f94fe062a509ea5.md", + "original_doc_id": "02D819D225558542A49AB6E43F94FE062A509EA5", + "path": "corpus/watsonx-docsqa/docs/02d819d225558542a49ab6e43f94fe062a509ea5.md", + "title": "dataassetexport properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/dataassetexportnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/46915afe957ca00c5b825c5f2bdc618bfea43de8.md", + "original_doc_id": "46915AFE957CA00C5B825C5F2BDC618BFEA43DE8", + "path": "corpus/watsonx-docsqa/docs/46915afe957ca00c5b825c5f2bdc618bfea43de8.md", + "title": "dataassetimport properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/dataassetimportnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ccdf1d5375060fcde288a920a6f3c1b48454c6db.md", + "original_doc_id": "CCDF1D5375060FCDE288A920A6F3C1B48454C6DB", + "path": "corpus/watsonx-docsqa/docs/ccdf1d5375060fcde288a920a6f3c1b48454c6db.md", + "title": "dataauditnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/dataauditnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/dafb63017668c5dd34a07a1850ce9e9a37d0f525.md", + "original_doc_id": "DAFB63017668C5DD34A07A1850CE9E9A37D0F525", + "path": "corpus/watsonx-docsqa/docs/dafb63017668c5dd34a07a1850ce9e9a37d0f525.md", + "title": "decisionlistnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/decisionlistnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/082349f7c1e486d18bca3bb7569d4de25a8e81a7.md", + "original_doc_id": "082349F7C1E486D18BCA3BB7569D4DE25A8E81A7", + "path": "corpus/watsonx-docsqa/docs/082349f7c1e486d18bca3bb7569d4de25a8e81a7.md", + "title": "applydecisionlistnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/decisionlistnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ca6f118dbe9a1782053fe1f5f4697dda07a7a365.md", + "original_doc_id": "CA6F118DBE9A1782053FE1F5F4697DDA07A7A365", + "path": "corpus/watsonx-docsqa/docs/ca6f118dbe9a1782053fe1f5f4697dda07a7a365.md", + "title": "Flow properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/defining_slot_parameters_in_streams.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/abd445ce46b0329348e6ad464735bdb1d525edaa.md", + "original_doc_id": "ABD445CE46B0329348E6AD464735BDB1D525EDAA", + "path": "corpus/watsonx-docsqa/docs/abd445ce46b0329348e6ad464735bdb1d525edaa.md", + "title": "SuperNode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/defining_slot_parameters_in_supernodes.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/84573d3fda739326819c7303ea21db6ddf2acc21.md", + "original_doc_id": "84573D3FDA739326819C7303EA21DB6DDF2ACC21", + "path": "corpus/watsonx-docsqa/docs/84573d3fda739326819c7303ea21db6ddf2acc21.md", + "title": "derivenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/derivenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/16048584b029b9be5da50d7f9d9ae85ffe740718.md", + "original_doc_id": "16048584B029B9BE5DA50D7F9D9AE85FFE740718", + "path": "corpus/watsonx-docsqa/docs/16048584b029b9be5da50d7f9d9ae85ffe740718.md", + "title": "discriminantnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/discriminantnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2c1e91540bd58780f781f8a06e2b5c62035ca84b.md", + "original_doc_id": "2C1E91540BD58780F781F8A06E2B5C62035CA84B", + "path": "corpus/watsonx-docsqa/docs/2c1e91540bd58780f781f8a06e2b5c62035ca84b.md", + "title": "applydiscriminantnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/discriminantnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bad5210d0f8114cd4e9b1db05eb92f0eabc6e233.md", + "original_doc_id": "BAD5210D0F8114CD4E9B1DB05EB92F0EABC6E233", + "path": "corpus/watsonx-docsqa/docs/bad5210d0f8114cd4e9b1db05eb92f0eabc6e233.md", + "title": "distinctnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/distinctnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/dcb8fb91999d79190f3e5d54de32b1b7f1401779.md", + "original_doc_id": "DCB8FB91999D79190F3E5D54DE32B1B7F1401779", + "path": "corpus/watsonx-docsqa/docs/dcb8fb91999d79190f3e5d54de32b1b7f1401779.md", + "title": "distributionnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/distributionnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5dcc543a106ec708ff97817aa0cfdef8cb89894d.md", + "original_doc_id": "5DCC543A106EC708FF97817AA0CFDEF8CB89894D", + "path": "corpus/watsonx-docsqa/docs/5dcc543a106ec708ff97817aa0cfdef8cb89894d.md", + "title": "ensemblenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/ensemblenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/98b447b5af1cd17524e2ba82fed83b8966ddfefb.md", + "original_doc_id": "98B447B5AF1CD17524E2BA82FED83B8966DDFEFB", + "path": "corpus/watsonx-docsqa/docs/98b447b5af1cd17524e2ba82fed83b8966ddfefb.md", + "title": "evaluationnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/evalchartnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6cb2797ab2ef876f05a39f4cee08eee4249716d8.md", + "original_doc_id": "6CB2797AB2EF876F05A39F4CEE08EEE4249716D8", + "path": "corpus/watsonx-docsqa/docs/6cb2797ab2ef876f05a39f4cee08eee4249716d8.md", + "title": "Flow script example: Training a neural net", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/example_clementine_script.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/123987d173c0db88d8e1f59af46a8d9313a8e601.md", + "original_doc_id": "123987D173C0DB88D8E1F59AF46A8D9313A8E601", + "path": "corpus/watsonx-docsqa/docs/123987d173c0db88d8e1f59af46a8d9313a8e601.md", + "title": "extensionexportnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/extensionexportnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9aa00a347bd6f7725014c840f3d39bc0ddf26599.md", + "original_doc_id": "9AA00A347BD6F7725014C840F3D39BC0DDF26599", + "path": "corpus/watsonx-docsqa/docs/9aa00a347bd6f7725014c840f3d39bc0ddf26599.md", + "title": "extensionimportnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/extensionimportnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7985570f01d50d057ebd4fafcf8c8a1bcacb3006.md", + "original_doc_id": "7985570F01D50D057EBD4FAFCF8C8A1BCACB3006", + "path": "corpus/watsonx-docsqa/docs/7985570f01d50d057ebd4fafcf8c8a1bcacb3006.md", + "title": "extensionmodelnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/extensionmodelnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e85352e9588726771a8cd594a268eca7d04379bd.md", + "original_doc_id": "E85352E9588726771A8CD594A268ECA7D04379BD", + "path": "corpus/watsonx-docsqa/docs/e85352e9588726771a8cd594a268eca7d04379bd.md", + "title": "applyextension properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/extensionnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/14005f26f286b03f8ac692d42e9f3dfce1f66962.md", + "original_doc_id": "14005F26F286B03F8AC692D42E9F3DFCE1F66962", + "path": "corpus/watsonx-docsqa/docs/14005f26f286b03f8ac692d42e9f3dfce1f66962.md", + "title": "extensionoutputnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/extensionoutputnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d487db53087c5fd4cd2a25112f1f8a8e496efc72.md", + "original_doc_id": "D487DB53087C5FD4CD2A25112F1F8A8E496EFC72", + "path": "corpus/watsonx-docsqa/docs/d487db53087c5fd4cd2a25112f1f8a8e496efc72.md", + "title": "extensionprocessnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/extensionprocessnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5edda143971ce5735307fede23fb0cd7e963264c.md", + "original_doc_id": "5EDDA143971CE5735307FEDE23FB0CD7E963264C", + "path": "corpus/watsonx-docsqa/docs/5edda143971ce5735307fede23fb0cd7e963264c.md", + "title": "factornode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/factornodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/92442d67350644bfcaec2b2a47b98f4ede943dc3.md", + "original_doc_id": "92442D67350644BFCAEC2B2A47B98F4EDE943DC3", + "path": "corpus/watsonx-docsqa/docs/92442d67350644bfcaec2b2a47b98f4ede943dc3.md", + "title": "applyfactornode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/factornuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d5863a9857f07023885a810210dfb819ad692ed7.md", + "original_doc_id": "D5863A9857F07023885A810210DFB819AD692ED7", + "path": "corpus/watsonx-docsqa/docs/d5863a9857f07023885a810210dfb819ad692ed7.md", + "title": "Setting algorithm properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/factorymodeling_algorithmproperties.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/055727fba02274a87d30da162e6f5eca3ace233d.md", + "original_doc_id": "055727FBA02274A87D30DA162E6F5ECA3ACE233D", + "path": "corpus/watsonx-docsqa/docs/055727fba02274a87d30da162e6f5eca3ace233d.md", + "title": "featureselectionnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/featureselectionnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9a5011652c8fad610ef217b82b7f28c8256dce8b.md", + "original_doc_id": "9A5011652C8FAD610EF217B82B7F28C8256DCE8B", + "path": "corpus/watsonx-docsqa/docs/9a5011652c8fad610ef217b82b7f28c8256dce8b.md", + "title": "applyfeatureselectionnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/featureselectionnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/76910487c819d14f9fefcbc6252f25652af1e65b.md", + "original_doc_id": "76910487C819D14F9FEFCBC6252F25652AF1E65B", + "path": "corpus/watsonx-docsqa/docs/76910487c819d14f9fefcbc6252f25652af1e65b.md", + "title": "fillernode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/fillernodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d91044a492d05f87613bba485cd2fae1f54764db.md", + "original_doc_id": "D91044A492D05F87613BBA485CD2FAE1F54764DB", + "path": "corpus/watsonx-docsqa/docs/d91044a492d05f87613bba485cd2fae1f54764db.md", + "title": "filternode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/filternodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/916f0a90d0b8383f2353b3320628e23e38b380b5.md", + "original_doc_id": "916F0A90D0B8383F2353B3320628E23E38B380B5", + "path": "corpus/watsonx-docsqa/docs/916f0a90d0b8383f2353b3320628e23e38b380b5.md", + "title": "genlinnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/genlinnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bc3d88e89001bb639e418ae5971b209535603a18.md", + "original_doc_id": "BC3D88E89001BB639E418AE5971B209535603A18", + "path": "corpus/watsonx-docsqa/docs/bc3d88e89001bb639e418ae5971b209535603a18.md", + "title": "applygeneralizedlinearnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/genlinnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/adf96f4dc435ccf7e702eeac6fcaa9f7decd1dcb.md", + "original_doc_id": "ADF96F4DC435CCF7E702EEAC6FCAA9F7DECD1DCB", + "path": "corpus/watsonx-docsqa/docs/adf96f4dc435ccf7e702eeac6fcaa9f7decd1dcb.md", + "title": "gle properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/glenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/863fd4eee7625cf4012bc9e37b5b66cd25554b8a.md", + "original_doc_id": "863FD4EEE7625CF4012BC9E37B5B66CD25554B8A", + "path": "corpus/watsonx-docsqa/docs/863fd4eee7625cf4012bc9e37b5b66cd25554b8a.md", + "title": "applygle properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/glenuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0a6d8500dac43a18ec5dd8fcc3d31c2a31546554.md", + "original_doc_id": "0A6D8500DAC43A18EC5DD8FCC3D31C2A31546554", + "path": "corpus/watsonx-docsqa/docs/0a6d8500dac43a18ec5dd8fcc3d31c2a31546554.md", + "title": "glmmnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/glmmnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/337cc5401082dfd6c8c79d49cd97f7bc197c7303.md", + "original_doc_id": "337CC5401082DFD6C8C79D49CD97F7BC197C7303", + "path": "corpus/watsonx-docsqa/docs/337cc5401082dfd6c8c79d49cd97f7bc197c7303.md", + "title": "applyglmmnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/glmmnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d1c3f3db7837f7c5803f52829a542f6ba8b4837d.md", + "original_doc_id": "D1C3F3DB7837F7C5803F52829A542F6BA8B4837D", + "path": "corpus/watsonx-docsqa/docs/d1c3f3db7837f7c5803f52829a542f6ba8b4837d.md", + "title": "gmm properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/gmmnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f2d3c76d5eabbbf72a0314f29374527c8339591a.md", + "original_doc_id": "F2D3C76D5EABBBF72A0314F29374527C8339591A", + "path": "corpus/watsonx-docsqa/docs/f2d3c76d5eabbbf72a0314f29374527c8339591a.md", + "title": "applygmm properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/gmmnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1f781da5779dafefbb53038f71a18bbe2649117b.md", + "original_doc_id": "1F781DA5779DAFEFBB53038F71A18BBE2649117B", + "path": "corpus/watsonx-docsqa/docs/1f781da5779dafefbb53038f71a18bbe2649117b.md", + "title": "associationrulesnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/gsarnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9da9a2809d484a6caa70a66a3548cf4a537950fc.md", + "original_doc_id": "9DA9A2809D484A6CAA70A66A3548CF4A537950FC", + "path": "corpus/watsonx-docsqa/docs/9da9a2809d484a6caa70a66a3548cf4a537950fc.md", + "title": "applyassociationrulesnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/gsarnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e01184bcba866d676b5a236d6638e78d3f55c794.md", + "original_doc_id": "E01184BCBA866D676B5A236D6638E78D3F55C794", + "path": "corpus/watsonx-docsqa/docs/e01184bcba866d676b5a236d6638e78d3f55c794.md", + "title": "hdbscannode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/hdbscannodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4f0098ce544ba8ac594f98af8df26b7911399750.md", + "original_doc_id": "4F0098CE544BA8AC594F98AF8DF26B7911399750", + "path": "corpus/watsonx-docsqa/docs/4f0098ce544ba8ac594f98af8df26b7911399750.md", + "title": "hdbscannugget properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/hdbscannuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8daa2c34d27a7e09c0ab837c191e87f320790f75.md", + "original_doc_id": "8DAA2C34D27A7E09C0AB837C191E87F320790F75", + "path": "corpus/watsonx-docsqa/docs/8daa2c34d27a7e09c0ab837c191e87f320790f75.md", + "title": "histogramnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/histogramnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bdc1b4283563848e2c775804fc0857dbde8843af.md", + "original_doc_id": "BDC1B4283563848E2C775804FC0857DBDE8843AF", + "path": "corpus/watsonx-docsqa/docs/bdc1b4283563848e2c775804fc0857dbde8843af.md", + "title": "historynode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/historynodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2756dead36ac092838f80acffe6ecee13a22a376.md", + "original_doc_id": "2756DEAD36AC092838F80ACFFE6ECEE13A22A376", + "path": "corpus/watsonx-docsqa/docs/2756dead36ac092838f80acffe6ecee13a22a376.md", + "title": "isotonicasnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/isotonicasnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f67e458a29cf154c33221a8889789241725fe5c7.md", + "original_doc_id": "F67E458A29CF154C33221A8889789241725FE5C7", + "path": "corpus/watsonx-docsqa/docs/f67e458a29cf154c33221a8889789241725fe5c7.md", + "title": "Python and Jython", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/jython_basics.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/033f114bff6d5479c2b4be7c1542a4c778aba53e.md", + "original_doc_id": "033F114BFF6D5479C2B4BE7C1542A4C778ABA53E", + "path": "corpus/watsonx-docsqa/docs/033f114bff6d5479c2b4be7c1542a4c778aba53e.md", + "title": "Adding attributes to a class instance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_add_attributes.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8bc347015fd7ce2af13b17de4d287471cb994f38.md", + "original_doc_id": "8BC347015FD7CE2AF13B17DE4D287471CB994F38", + "path": "corpus/watsonx-docsqa/docs/8bc347015fd7ce2af13b17de4d287471cb994f38.md", + "title": "The scripting API", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_api_intro.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f290d0c61b4a664e303de559bbc559015fd375f9.md", + "original_doc_id": "F290D0C61B4A664E303DE559BBC559015FD375F9", + "path": "corpus/watsonx-docsqa/docs/f290d0c61b4a664e303de559bbc559015fd375f9.md", + "title": "Example: Searching for nodes using a custom filter", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_api_search.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/78488a77cb39bdd413dbb7682f1dbe2675b3e3a0.md", + "original_doc_id": "78488A77CB39BDD413DBB7682F1DBE2675B3E3A0", + "path": "corpus/watsonx-docsqa/docs/78488a77cb39bdd413dbb7682f1dbe2675b3e3a0.md", + "title": "Defining a class", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_create_class.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e3efb6106ae81db5a8b3379c3edcf86e31f95ab0.md", + "original_doc_id": "E3EFB6106AE81DB5A8B3379C3EDCF86E31F95AB0", + "path": "corpus/watsonx-docsqa/docs/e3efb6106ae81db5a8b3379c3edcf86e31f95ab0.md", + "title": "Creating a class instance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_create_instance.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3491f666270894ee4be071fd4a8551df94cb9889.md", + "original_doc_id": "3491F666270894EE4BE071FD4A8551DF94CB9889", + "path": "corpus/watsonx-docsqa/docs/3491f666270894ee4be071fd4a8551df94cb9889.md", + "title": "Defining class attributes and methods", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_define_method.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5ed78e19c7780c6856e1fa05d4b8a3f671fc878b.md", + "original_doc_id": "5ED78E19C7780C6856E1FA05D4B8A3F671FC878B", + "path": "corpus/watsonx-docsqa/docs/5ed78e19c7780c6856e1fa05d4b8a3f671fc878b.md", + "title": "Diagrams", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_diagrams.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/640f57e8262f846da7884e43f6f2f6c04cd15667.md", + "original_doc_id": "640F57E8262F846DA7884E43F6F2F6C04CD15667", + "path": "corpus/watsonx-docsqa/docs/640f57e8262f846da7884e43f6f2f6c04cd15667.md", + "title": "Global values", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_global_values.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cad5f0781542a67a581819b52bb1b6b4bb9ece74.md", + "original_doc_id": "CAD5F0781542A67A581819B52BB1B6B4BB9ECE74", + "path": "corpus/watsonx-docsqa/docs/cad5f0781542a67a581819b52bb1b6b4bb9ece74.md", + "title": "Parameters", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_globalparameters.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e61658d2ba7d0d13e5a6008e28670d1b1f6cb7bb.md", + "original_doc_id": "E61658D2BA7D0D13E5A6008E28670D1B1F6CB7BB", + "path": "corpus/watsonx-docsqa/docs/e61658d2ba7d0d13e5a6008e28670d1b1f6cb7bb.md", + "title": "Hidden variables", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_hidden_variables.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9ee303cb0d99042537564dcdfc134b592bf0a3fe.md", + "original_doc_id": "9EE303CB0D99042537564DCDFC134B592BF0A3FE", + "path": "corpus/watsonx-docsqa/docs/9ee303cb0d99042537564dcdfc134b592bf0a3fe.md", + "title": "Inheritance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_inheritance.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/97050c74e0c144e4f16aa808d275a9a472489efb.md", + "original_doc_id": "97050C74E0C144E4F16AA808D275A9A472489EFB", + "path": "corpus/watsonx-docsqa/docs/97050c74e0c144e4f16aa808d275a9a472489efb.md", + "title": "The scripting language", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_language_overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1fefe3c6f1a20841fa1ae6afaa85cc7ff36778ac.md", + "original_doc_id": "1FEFE3C6F1A20841FA1AE6AFAA85CC7FF36778AC", + "path": "corpus/watsonx-docsqa/docs/1fefe3c6f1a20841fa1ae6afaa85cc7ff36778ac.md", + "title": "Metadata: Information about data", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_metadata.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/83a5fc83aa65717942a3437217f2114454552144.md", + "original_doc_id": "83A5FC83AA65717942A3437217F2114454552144", + "path": "corpus/watsonx-docsqa/docs/83a5fc83aa65717942a3437217f2114454552144.md", + "title": "Creating nodes", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_node_create.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d9304450e79dc05b5ecc4fe98d48fecef76a852e.md", + "original_doc_id": "D9304450E79DC05B5ECC4FE98D48FECEF76A852E", + "path": "corpus/watsonx-docsqa/docs/d9304450e79dc05b5ecc4fe98d48fecef76a852e.md", + "title": "Finding nodes", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_node_find.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0cb42f245df436af2bccb54b612786ca493b917b.md", + "original_doc_id": "0CB42F245DF436AF2BCCB54B612786CA493B917B", + "path": "corpus/watsonx-docsqa/docs/0cb42f245df436af2bccb54b612786ca493b917b.md", + "title": "Importing, replacing, and deleting nodes", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_node_import.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1243d4c8499cc9be45cd9c1f6eb34254f1b9b4d7.md", + "original_doc_id": "1243D4C8499CC9BE45CD9C1F6EB34254F1B9B4D7", + "path": "corpus/watsonx-docsqa/docs/1243d4c8499cc9be45cd9c1f6eb34254f1b9b4d7.md", + "title": "Getting information about nodes", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_node_information.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ab42ff6b754a2e29fcb56b0137eeddf17f8ee271.md", + "original_doc_id": "AB42FF6B754A2E29FCB56B0137EEDDF17F8EE271", + "path": "corpus/watsonx-docsqa/docs/ab42ff6b754a2e29fcb56b0137eeddf17f8ee271.md", + "title": "Linking and unlinking nodes", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_node_link.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f0ef147dbc0554f53b331e7b6d5715d0269ffba8.md", + "original_doc_id": "F0EF147DBC0554F53B331E7B6D5715D0269FFBA8", + "path": "corpus/watsonx-docsqa/docs/f0ef147dbc0554f53b331e7b6d5715d0269ffba8.md", + "title": "Referencing existing nodes", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_node_reference.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5ee63fcc911ba90930d413b58e1310efe0e24243.md", + "original_doc_id": "5EE63FCC911BA90930D413B58E1310EFE0E24243", + "path": "corpus/watsonx-docsqa/docs/5ee63fcc911ba90930d413b58e1310efe0e24243.md", + "title": "Traversing through nodes in a flow", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_node_traverse.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b6ec6454711b4946dbc663324dc478953723b1dd.md", + "original_doc_id": "B6EC6454711B4946DBC663324DC478953723B1DD", + "path": "corpus/watsonx-docsqa/docs/b6ec6454711b4946dbc663324dc478953723b1dd.md", + "title": "Creating nodes and modifying flows", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_nodes_and_streams.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9e77548af396e9e9474371705bcfff55684c5760.md", + "original_doc_id": "9E77548AF396E9E9474371705BCFFF55684C5760", + "path": "corpus/watsonx-docsqa/docs/9e77548af396e9e9474371705bcfff55684c5760.md", + "title": "Object-oriented programming", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_object_oriented.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/381d767decd07ef388611fd22c3f08fb89ba73ec.md", + "original_doc_id": "381D767DECD07EF388611FD22C3F08FB89BA73EC", + "path": "corpus/watsonx-docsqa/docs/381d767decd07ef388611fd22c3f08fb89ba73ec.md", + "title": "The scripting context", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_scripting_context.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/65998cb8747b70477477179e023332fd410e72d6.md", + "original_doc_id": "65998CB8747B70477477179E023332FD410E72D6", + "path": "corpus/watsonx-docsqa/docs/65998cb8747b70477477179e023332fd410e72d6.md", + "title": "Scripting in SPSS Modeler", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_scripting_types.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b416f3605adf246170e1b462ee0f2cfcdf5e591b.md", + "original_doc_id": "B416F3605ADF246170E1B462EE0F2CFCDF5E591B", + "path": "corpus/watsonx-docsqa/docs/b416f3605adf246170e1b462ee0f2cfcdf5e591b.md", + "title": "Setting properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_setting_properties.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/542f90ca456dccc3d79dbf6dc9e8a6755b3ba69e.md", + "original_doc_id": "542F90CA456DCCC3D79DBF6DC9E8A6755B3BA69E", + "path": "corpus/watsonx-docsqa/docs/542f90ca456dccc3d79dbf6dc9e8a6755b3ba69e.md", + "title": "Running a flow", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_stream_execution.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d1cde4ff34352a6e5cdc9914fd26cf72574e2d59.md", + "original_doc_id": "D1CDE4FF34352A6E5CDC9914FD26CF72574E2D59", + "path": "corpus/watsonx-docsqa/docs/d1cde4ff34352a6e5cdc9914fd26cf72574e2d59.md", + "title": "Flows", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_streams.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6524dfdeabf32bae384acb9bb21637ade3b4ac4f.md", + "original_doc_id": "6524DFDEABF32BAE384ACB9BB21637ADE3B4AC4F", + "path": "corpus/watsonx-docsqa/docs/6524dfdeabf32bae384acb9bb21637ade3b4ac4f.md", + "title": "Flows, SuperNode streams, and diagrams", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_streams_diagrams.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a4799f6bdea1b1508528fc647dad5d1b2ef777aa.md", + "original_doc_id": "A4799F6BDEA1B1508528FC647DAD5D1B2EF777AA", + "path": "corpus/watsonx-docsqa/docs/a4799f6bdea1b1508528fc647dad5d1b2ef777aa.md", + "title": "SuperNode flows", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_supernode_streams.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d6db1fbf1b0a11fd3423b6f057182019496ff3f5.md", + "original_doc_id": "D6DB1FBF1B0A11FD3423B6F057182019496FF3F5", + "path": "corpus/watsonx-docsqa/docs/d6db1fbf1b0a11fd3423b6f057182019496ff3f5.md", + "title": "Python scripting", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_syntax.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c6b9bd6294c9a3ef6cd7e45e1b3765c061d92cc3.md", + "original_doc_id": "C6B9BD6294C9A3EF6CD7E45E1B3765C061D92CC3", + "path": "corpus/watsonx-docsqa/docs/c6b9bd6294c9a3ef6cd7e45e1b3765c061d92cc3.md", + "title": "Using non-ASCII characters", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_syntax_ascii.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2413c64687e434b4b2095163a5106c0c62aa3f59.md", + "original_doc_id": "2413C64687E434B4B2095163A5106C0C62AA3F59", + "path": "corpus/watsonx-docsqa/docs/2413c64687e434b4b2095163a5106c0c62aa3f59.md", + "title": "Blocks of code", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_syntax_codeblocks.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/20d6b2732be17c12226f186559fbea647799f3b8.md", + "original_doc_id": "20D6B2732BE17C12226F186559FBEA647799F3B8", + "path": "corpus/watsonx-docsqa/docs/20d6b2732be17c12226f186559fbea647799f3b8.md", + "title": "Examples", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_syntax_examples.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/03c28b0a536906ca3597b4d382759bd791d0cfec.md", + "original_doc_id": "03C28B0A536906CA3597B4D382759BD791D0CFEC", + "path": "corpus/watsonx-docsqa/docs/03c28b0a536906ca3597b4d382759bd791d0cfec.md", + "title": "Identifiers", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_syntax_identifiers.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/659e43ba12550aa1e885baec945b7b1b25fd18e2.md", + "original_doc_id": "659E43BA12550AA1E885BAEC945B7B1B25FD18E2", + "path": "corpus/watsonx-docsqa/docs/659e43ba12550aa1e885baec945b7b1b25fd18e2.md", + "title": "Lists", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_syntax_lists.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f837e34ed0ad4739783010d9ffd3684c37fd465c.md", + "original_doc_id": "F837E34ED0AD4739783010D9FFD3684C37FD465C", + "path": "corpus/watsonx-docsqa/docs/f837e34ed0ad4739783010d9ffd3684c37fd465c.md", + "title": "Mathematical methods", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_syntax_mathfunctions.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/48cca78ceb92570bce08f4e1a5677e8cd7936095.md", + "original_doc_id": "48CCA78CEB92570BCE08F4E1A5677E8CD7936095", + "path": "corpus/watsonx-docsqa/docs/48cca78ceb92570bce08f4e1a5677e8cd7936095.md", + "title": "Operations", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_syntax_operations.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/622526f6c171ced140394f3dd707b612778b661e.md", + "original_doc_id": "622526F6C171CED140394F3DD707B612778B661E", + "path": "corpus/watsonx-docsqa/docs/622526f6c171ced140394f3dd707b612778b661e.md", + "title": "Passing arguments to a script", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_syntax_passingargs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/03a70c271775c3b15541b86e53e467844ef87296.md", + "original_doc_id": "03A70C271775C3B15541B86E53E467844EF87296", + "path": "corpus/watsonx-docsqa/docs/03a70c271775c3b15541b86e53e467844ef87296.md", + "title": "Remarks", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_syntax_remarks.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9f27a4650b0b0bf36223937d0cf60e460b66a723.md", + "original_doc_id": "9F27A4650B0B0BF36223937D0CF60E460B66A723", + "path": "corpus/watsonx-docsqa/docs/9f27a4650b0b0bf36223937d0cf60e460b66a723.md", + "title": "Statement syntax", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_syntax_statements.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/14f850b810e969ce2646d5641300fb407a6c49c5.md", + "original_doc_id": "14F850B810E969CE2646D5641300FB407A6C49C5", + "path": "corpus/watsonx-docsqa/docs/14f850b810e969ce2646d5641300fb407a6c49c5.md", + "title": "Strings", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_syntax_strings.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/398a23291331968098b47496d504743991855a61.md", + "original_doc_id": "398A23291331968098B47496D504743991855A61", + "path": "corpus/watsonx-docsqa/docs/398a23291331968098b47496d504743991855a61.md", + "title": "kdemodel properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/kdemodelnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0ea3470872bf545059b23b040ab1eb393630a29d.md", + "original_doc_id": "0EA3470872BF545059B23B040AB1EB393630A29D", + "path": "corpus/watsonx-docsqa/docs/0ea3470872bf545059b23b040ab1eb393630a29d.md", + "title": "kdeexport properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/kdenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9bea57d80c215d963cb0c54046136fb3e88c7d5c.md", + "original_doc_id": "9BEA57D80C215D963CB0C54046136FB3E88C7D5C", + "path": "corpus/watsonx-docsqa/docs/9bea57d80c215d963cb0c54046136fb3e88c7d5c.md", + "title": "kdeapply properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/kdenuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/720712d40bfdef5974c7c025a6ac0d0649124b79.md", + "original_doc_id": "720712D40BFDEF5974C7C025A6AC0D0649124B79", + "path": "corpus/watsonx-docsqa/docs/720712d40bfdef5974c7c025a6ac0d0649124b79.md", + "title": "kmeansasnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/kmeansasnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6f35b89192b6c9a233b859cf66fcc435f3f9e650.md", + "original_doc_id": "6F35B89192B6C9A233B859CF66FCC435F3F9E650", + "path": "corpus/watsonx-docsqa/docs/6f35b89192b6c9a233b859cf66fcc435f3f9e650.md", + "title": "kmeansnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/kmeansnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/57d441ef305442bcdbbe48b980b87d47b825fff9.md", + "original_doc_id": "57D441EF305442BCDBBE48B980B87D47B825FFF9", + "path": "corpus/watsonx-docsqa/docs/57d441ef305442bcdbbe48b980b87d47b825fff9.md", + "title": "applykmeansnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/kmeansnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cc60febf8e5d1907ce0ccf3868cd9e4b494aa1bf.md", + "original_doc_id": "CC60FEBF8E5D1907CE0CCF3868CD9E4B494AA1BF", + "path": "corpus/watsonx-docsqa/docs/cc60febf8e5d1907ce0ccf3868cd9e4b494aa1bf.md", + "title": "knnnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/knnnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8b32eb4742d88b5cec2e1c9616958bd7f8986785.md", + "original_doc_id": "8B32EB4742D88B5CEC2E1C9616958BD7F8986785", + "path": "corpus/watsonx-docsqa/docs/8b32eb4742d88b5cec2e1c9616958bd7f8986785.md", + "title": "applyknnnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/knnnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0563fc6874b43fa0bca09ae54805fe98bfa33042.md", + "original_doc_id": "0563FC6874B43FA0BCA09AE54805FE98BFA33042", + "path": "corpus/watsonx-docsqa/docs/0563fc6874b43fa0bca09ae54805fe98bfa33042.md", + "title": "kohonennode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/kohonennodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2939716bfa6089c8b6373ed7c6397af71389a5c8.md", + "original_doc_id": "2939716BFA6089C8B6373ED7C6397AF71389A5C8", + "path": "corpus/watsonx-docsqa/docs/2939716bfa6089c8b6373ed7c6397af71389a5c8.md", + "title": "applykohonennode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/kohonennuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/87d2ff4289edcbf7fcfa7fc7fd460deb02ecc71b.md", + "original_doc_id": "87D2FF4289EDCBF7FCFA7FC7FD460DEB02ECC71B", + "path": "corpus/watsonx-docsqa/docs/87d2ff4289edcbf7fcfa7fc7fd460deb02ecc71b.md", + "title": "logregnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/logregnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7c8bcafbd032e30dcc7c39e28a2b5de1e340da6b.md", + "original_doc_id": "7C8BCAFBD032E30DCC7C39E28A2B5DE1E340DA6B", + "path": "corpus/watsonx-docsqa/docs/7c8bcafbd032e30dcc7c39e28a2b5de1e340da6b.md", + "title": "applylogregnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/logregnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7c4f082004dba0b946d64aa6c0127041f4622c7b.md", + "original_doc_id": "7C4F082004DBA0B946D64AA6C0127041F4622C7B", + "path": "corpus/watsonx-docsqa/docs/7c4f082004dba0b946d64aa6c0127041f4622c7b.md", + "title": "lsvmnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/lsvmnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5890d52d3dde4c249ad06c5a4dfe25542723f1c1.md", + "original_doc_id": "5890D52D3DDE4C249AD06C5A4DFE25542723F1C1", + "path": "corpus/watsonx-docsqa/docs/5890d52d3dde4c249ad06c5a4dfe25542723f1c1.md", + "title": "applylsvmnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/lsvmnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3426fb738655136d42fa32bd6cfbfd979a3d5574.md", + "original_doc_id": "3426FB738655136D42FA32BD6CFBFD979A3D5574", + "path": "corpus/watsonx-docsqa/docs/3426fb738655136d42fa32bd6cfbfd979a3d5574.md", + "title": "matrixnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/matrixnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/da3d295da633cd271fb3970ad2ed4b31bdcb6247.md", + "original_doc_id": "DA3D295DA633CD271FB3970AD2ED4B31BDCB6247", + "path": "corpus/watsonx-docsqa/docs/da3d295da633cd271fb3970ad2ed4b31bdcb6247.md", + "title": "meansnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/meansnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a148122da72ad9ff05b3483d6f50975c50b4ab33.md", + "original_doc_id": "A148122DA72AD9FF05B3483D6F50975C50B4AB33", + "path": "corpus/watsonx-docsqa/docs/a148122da72ad9ff05b3483d6f50975c50b4ab33.md", + "title": "mergenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/mergenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/adb2d2b53c7f2a464a38f7de5d7a74a39e697528.md", + "original_doc_id": "ADB2D2B53C7F2A464A38F7DE5D7A74A39E697528", + "path": "corpus/watsonx-docsqa/docs/adb2d2b53c7f2a464a38f7de5d7a74a39e697528.md", + "title": "Common modeling node properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5e1ce04d915b9a758f234f859dffefab46484c97.md", + "original_doc_id": "5E1CE04D915B9A758F234F859DFFEFAB46484C97", + "path": "corpus/watsonx-docsqa/docs/5e1ce04d915b9a758f234f859dffefab46484c97.md", + "title": "multilayerperceptronnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/multilayerperceptronnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/093bffcb43c46f1068a59a6b6338c955bf20aabf.md", + "original_doc_id": "093BFFCB43C46F1068A59A6B6338C955BF20AABF", + "path": "corpus/watsonx-docsqa/docs/093bffcb43c46f1068a59a6b6338c955bf20aabf.md", + "title": "multiplotnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/multiplotnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/665b81fcf30212ba535dedffc35e22901ed3e3b6.md", + "original_doc_id": "665B81FCF30212BA535DEDFFC35E22901ED3E3B6", + "path": "corpus/watsonx-docsqa/docs/665b81fcf30212ba535dedffc35e22901ed3e3b6.md", + "title": "applyocsvmnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/ocsvmnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b6dc15d9f3f199c8bab5f85eda67d50627bb3e08.md", + "original_doc_id": "B6DC15D9F3F199C8BAB5F85EDA67D50627BB3E08", + "path": "corpus/watsonx-docsqa/docs/b6dc15d9f3f199c8bab5f85eda67d50627bb3e08.md", + "title": "ocsvmnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/oneclasssvmnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1b83fe669cb3776d00a1a78e4764f115dfd5a40a.md", + "original_doc_id": "1B83FE669CB3776D00A1A78E4764F115DFD5A40A", + "path": "corpus/watsonx-docsqa/docs/1b83fe669cb3776d00a1a78e4764f115dfd5a40a.md", + "title": "Output node properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/output_nodes_slot_parameters.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1c19733ed0d3400baf6ff05317475a6518b5ba1a.md", + "original_doc_id": "1C19733ED0D3400BAF6FF05317475A6518B5BA1A", + "path": "corpus/watsonx-docsqa/docs/1c19733ed0d3400baf6ff05317475a6518b5ba1a.md", + "title": "partitionnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/partitionnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f1cdb96ad5a56206f662bb3025b93f6d5820242b.md", + "original_doc_id": "F1CDB96AD5A56206F662BB3025B93F6D5820242B", + "path": "corpus/watsonx-docsqa/docs/f1cdb96ad5a56206f662bb3025b93f6d5820242b.md", + "title": "plotnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/plotnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8bad741cd92f2db6ab2ce3a3c2d35d000235bfe9.md", + "original_doc_id": "8BAD741CD92F2DB6AB2CE3A3C2D35D000235BFE9", + "path": "corpus/watsonx-docsqa/docs/8bad741cd92f2db6ab2ce3a3c2d35d000235bfe9.md", + "title": "applylinearasnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties/applylinearASslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0e7ff3238a69fa701a2067672493ccb1b9698cc1.md", + "original_doc_id": "0E7FF3238A69FA701A2067672493CCB1B9698CC1", + "path": "corpus/watsonx-docsqa/docs/0e7ff3238a69fa701a2067672493ccb1b9698cc1.md", + "title": "applylinearnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties/applylinearslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ce40b0cef1449476821a1ebd8d0cf339c866d16a.md", + "original_doc_id": "CE40B0CEF1449476821A1EBD8D0CF339C866D16A", + "path": "corpus/watsonx-docsqa/docs/ce40b0cef1449476821a1ebd8d0cf339c866d16a.md", + "title": "applyneuralnetworknode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties/applyneuralnetworkslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/90fafe76840267470228854a202752832d54a787.md", + "original_doc_id": "90FAFE76840267470228854A202752832D54A787", + "path": "corpus/watsonx-docsqa/docs/90fafe76840267470228854a202752832d54a787.md", + "title": "linearasnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties/linearASslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4deafac111cf37f37a2f20cff35606827d940390.md", + "original_doc_id": "4DEAFAC111CF37F37A2F20CFF35606827D940390", + "path": "corpus/watsonx-docsqa/docs/4deafac111cf37f37a2f20cff35606827d940390.md", + "title": "linearnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties/linearslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7f4719a688d4c15d72918ebbe43b908300138d2c.md", + "original_doc_id": "7F4719A688D4C15D72918EBBE43B908300138D2C", + "path": "corpus/watsonx-docsqa/docs/7f4719a688d4c15d72918ebbe43b908300138d2c.md", + "title": "neuralnetworknode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties/neuralnetworkslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3dc76ac891e282badf1d7845b2b8a9b3a26de3d2.md", + "original_doc_id": "3DC76AC891E282BADF1D7845B2B8A9B3A26DE3D2", + "path": "corpus/watsonx-docsqa/docs/3dc76ac891e282badf1d7845b2b8a9b3a26de3d2.md", + "title": "Export node properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties_exportnodes_container.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/049829eea8eecd997e6ca05584cde2d9bae92218.md", + "original_doc_id": "049829EEA8EECD997E6CA05584CDE2D9BAE92218", + "path": "corpus/watsonx-docsqa/docs/049829eea8eecd997e6ca05584cde2d9bae92218.md", + "title": "Field Operations node properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties_fieldopnodes_container.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9a1025416cda5ea57e6b2d9525bdfc7f1ae58692.md", + "original_doc_id": "9A1025416CDA5EA57E6B2D9525BDFC7F1AE58692", + "path": "corpus/watsonx-docsqa/docs/9a1025416cda5ea57e6b2d9525bdfc7f1ae58692.md", + "title": "Graph node properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties_graphnodes_container.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9f78eec8e37db19f2c3220f8e43029b2c5370b5d.md", + "original_doc_id": "9F78EEC8E37DB19F2C3220F8E43029B2C5370B5D", + "path": "corpus/watsonx-docsqa/docs/9f78eec8e37db19f2c3220f8e43029b2c5370b5d.md", + "title": "Modeling node properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties_modelingnodes_container.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f650943069620aa0bd7652df1abdce2c076de464.md", + "original_doc_id": "F650943069620AA0BD7652DF1ABDCE2C076DE464", + "path": "corpus/watsonx-docsqa/docs/f650943069620aa0bd7652df1abdce2c076de464.md", + "title": "Python node properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties_pythonnodes_container.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8ce361c94fab69503049ea703fd6d5a53cd81057.md", + "original_doc_id": "8CE361C94FAB69503049EA703FD6D5A53CD81057", + "path": "corpus/watsonx-docsqa/docs/8ce361c94fab69503049ea703fd6d5a53cd81057.md", + "title": "Record Operations node properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties_recordopnodes_container.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/179bdefa68b788a2c197f0094c43979d9265ba77.md", + "original_doc_id": "179BDEFA68B788A2C197F0094C43979D9265BA77", + "path": "corpus/watsonx-docsqa/docs/179bdefa68b788a2c197f0094c43979d9265ba77.md", + "title": "Data Asset Import node properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties_sourcenodes_container.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f585df82f7a94309af9fb51196f188b4fa212118.md", + "original_doc_id": "F585DF82F7A94309AF9FB51196F188B4FA212118", + "path": "corpus/watsonx-docsqa/docs/f585df82f7a94309af9fb51196f188b4fa212118.md", + "title": "Spark node properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties_sparknodes_container.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c1ca39ff2c12cc12697e62a37c7c52a256248af7.md", + "original_doc_id": "C1CA39FF2C12CC12697E62A37C7C52A256248AF7", + "path": "corpus/watsonx-docsqa/docs/c1ca39ff2c12cc12697e62a37c7c52a256248af7.md", + "title": "questnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/questnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2b2899a3878e20a4b73b0f11cfc4fd815a81e13f.md", + "original_doc_id": "2B2899A3878E20A4B73B0F11CFC4FD815A81E13F", + "path": "corpus/watsonx-docsqa/docs/2b2899a3878e20a4b73b0f11cfc4fd815a81e13f.md", + "title": "applyquestnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/questnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/19ae3adcf2da2ffe5186553229fef07cb2b55043.md", + "original_doc_id": "19AE3ADCF2DA2FFE5186553229FEF07CB2B55043", + "path": "corpus/watsonx-docsqa/docs/19ae3adcf2da2ffe5186553229fef07cb2b55043.md", + "title": "autonumericnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/rangepredictornodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b7cac3027eb08d3e2cfbfab0f0af2acf4dd0f990.md", + "original_doc_id": "B7CAC3027EB08D3E2CFBFAB0F0AF2ACF4DD0F990", + "path": "corpus/watsonx-docsqa/docs/b7cac3027eb08d3e2cfbfab0f0af2acf4dd0f990.md", + "title": "reclassifynode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/reclassifynodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8023ac0a48264db31f3c9da92fd84f947bfd4047.md", + "original_doc_id": "8023AC0A48264DB31F3C9DA92FD84F947BFD4047", + "path": "corpus/watsonx-docsqa/docs/8023ac0a48264db31f3c9da92fd84f947bfd4047.md", + "title": "regressionnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/regressionnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d6a347cb86df46925701892180f4d8a5b8e14508.md", + "original_doc_id": "D6A347CB86DF46925701892180F4D8A5B8E14508", + "path": "corpus/watsonx-docsqa/docs/d6a347cb86df46925701892180f4d8a5b8e14508.md", + "title": "applyregressionnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/regressionnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/56dc9cabda3980a4d5d41aa5b3e5612e727b289a.md", + "original_doc_id": "56DC9CABDA3980A4D5D41AA5B3E5612E727B289A", + "path": "corpus/watsonx-docsqa/docs/56dc9cabda3980a4d5d41aa5b3e5612e727b289a.md", + "title": "reordernode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/reordernodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/57ed2f2e8eaa8dab5b26c3759fd1bd102d03b975.md", + "original_doc_id": "57ED2F2E8EAA8DAB5B26C3759FD1BD102D03B975", + "path": "corpus/watsonx-docsqa/docs/57ed2f2e8eaa8dab5b26c3759fd1bd102d03b975.md", + "title": "reportnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/reportnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5d9039607c167566ced9a4d7cc9f30f2b0c58554.md", + "original_doc_id": "5D9039607C167566CED9A4D7CC9F30F2B0C58554", + "path": "corpus/watsonx-docsqa/docs/5d9039607c167566ced9a4d7cc9f30f2b0c58554.md", + "title": "restructurenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/restructurenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cd0745062372b6a66356728dea39ee6d8237d0de.md", + "original_doc_id": "CD0745062372B6A66356728DEA39EE6D8237D0DE", + "path": "corpus/watsonx-docsqa/docs/cd0745062372b6a66356728dea39ee6d8237d0de.md", + "title": "randomtrees properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/rf_nodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e10cebbd89f23e057645097b776a51dea0c1555f.md", + "original_doc_id": "E10CEBBD89F23E057645097B776A51DEA0C1555F", + "path": "corpus/watsonx-docsqa/docs/e10cebbd89f23e057645097b776a51dea0c1555f.md", + "title": "applyrandomtrees properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/rf_nuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f6670b3b49f00e4ee1f44e8b1c09e24afedd2529.md", + "original_doc_id": "F6670B3B49F00E4EE1F44E8B1C09E24AFEDD2529", + "path": "corpus/watsonx-docsqa/docs/f6670b3b49f00e4ee1f44e8b1c09e24afedd2529.md", + "title": "rfmaggregatenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/rfmaggregatenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4292721e4524ac59fa259576d39665946db8849d.md", + "original_doc_id": "4292721E4524AC59FA259576D39665946DB8849D", + "path": "corpus/watsonx-docsqa/docs/4292721e4524ac59fa259576d39665946db8849d.md", + "title": "rfmanalysisnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/rfmanalysisnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d1908d2f2c1701d4a9ac3354e42dff295c06b40d.md", + "original_doc_id": "D1908D2F2C1701D4A9AC3354E42DFF295C06B40D", + "path": "corpus/watsonx-docsqa/docs/d1908d2f2c1701d4a9ac3354e42dff295c06b40d.md", + "title": "rfnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/rfnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/949025c4deea46fd131c7b8d89978d75fcc440c4.md", + "original_doc_id": "949025C4DEEA46FD131C7B8D89978D75FCC440C4", + "path": "corpus/watsonx-docsqa/docs/949025c4deea46fd131c7b8d89978d75fcc440c4.md", + "title": "samplenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/samplenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3e0860fd12fa0bb5be75c68fbd34d69a631f2324.md", + "original_doc_id": "3E0860FD12FA0BB5BE75C68FBD34D69A631F2324", + "path": "corpus/watsonx-docsqa/docs/3e0860fd12fa0bb5be75c68fbd34d69a631f2324.md", + "title": "Running and interrupting scripts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/script_execution_and_interruption.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/27e7ad16129a9dc8ac8ce2ee79c9b584d441f0de.md", + "original_doc_id": "27E7AD16129A9DC8AC8CE2EE79C9B584D441F0DE", + "path": "corpus/watsonx-docsqa/docs/27e7ad16129a9dc8ac8ce2ee79c9b584d441f0de.md", + "title": "Accessing flow run results", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/scripting_accessresults.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6638b9f61f15821f7a92d9c30fc6c24c029b78dc.md", + "original_doc_id": "6638B9F61F15821F7A92D9C30FC6C24C029B78DC", + "path": "corpus/watsonx-docsqa/docs/6638b9f61f15821f7a92d9c30fc6c24c029b78dc.md", + "title": "Column Statistics content model and Pairwise Statistics content model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/scripting_accessresults_columnstats.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6fc8a7d53d6951306e0fd23667a802538a81d6ff.md", + "original_doc_id": "6FC8A7D53D6951306E0FD23667A802538A81D6FF", + "path": "corpus/watsonx-docsqa/docs/6fc8a7d53d6951306e0fd23667a802538a81d6ff.md", + "title": "JSON content model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/scripting_accessresults_json.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8fddca5b0d9d19db5b349ab7f72625b8c6d5744c.md", + "original_doc_id": "8FDDCA5B0D9D19DB5B349AB7F72625B8C6D5744C", + "path": "corpus/watsonx-docsqa/docs/8fddca5b0d9d19db5b349ab7f72625b8c6d5744c.md", + "title": "Table content model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/scripting_accessresults_table.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/198246e6e7f694d36936989d23b2255b15c2a92b.md", + "original_doc_id": "198246E6E7F694D36936989D23B2255B15C2A92B", + "path": "corpus/watsonx-docsqa/docs/198246e6e7f694d36936989d23b2255b15c2a92b.md", + "title": "XML content model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/scripting_accessresults_xml.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4d8b25691c26b2ba05f7e8a96b99fd3f15a124c6.md", + "original_doc_id": "4D8B25691C26B2BA05F7E8A96B99FD3F15A124C6", + "path": "corpus/watsonx-docsqa/docs/4d8b25691c26b2ba05f7e8a96b99fd3f15a124c6.md", + "title": "Looping through nodes", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/scripting_loopthroughnodes.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/14a06de43e6b08188a7672b5be8068a572de5b7c.md", + "original_doc_id": "14A06DE43E6B08188A7672B5BE8068A572DE5B7C", + "path": "corpus/watsonx-docsqa/docs/14a06de43e6b08188a7672b5be8068a572de5b7c.md", + "title": "Scripting and automation", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/scripting_overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ae3f5b72354288cc106bb10263673ebc80b2d544.md", + "original_doc_id": "AE3F5B72354288CC106BB10263673EBC80B2D544", + "path": "corpus/watsonx-docsqa/docs/ae3f5b72354288cc106bb10263673ebc80b2d544.md", + "title": "Scripting tips", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/scriptingtips_overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0301d6611a36e44c345083f6e2c3bde58de59982.md", + "original_doc_id": "0301D6611A36E44C345083F6E2C3BDE58DE59982", + "path": "corpus/watsonx-docsqa/docs/0301d6611a36e44c345083f6e2c3bde58de59982.md", + "title": "Types of scripts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/scripts_and_streams.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/92fe6b199a3b4773c5b57ededba80500e6c66faf.md", + "original_doc_id": "92FE6B199A3B4773C5B57EDEDBA80500E6C66FAF", + "path": "corpus/watsonx-docsqa/docs/92fe6b199a3b4773c5b57ededba80500e6c66faf.md", + "title": "selectnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/selectnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2b4d4ca6a91c05d12f5c7942e73abae74bf08472.md", + "original_doc_id": "2B4D4CA6A91C05D12F5C7942E73ABAE74BF08472", + "path": "corpus/watsonx-docsqa/docs/2b4d4ca6a91c05d12f5c7942e73abae74bf08472.md", + "title": "slrmnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/selflearnnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/aee1a739f2ea11f815ec571163ba99c9b2a97245.md", + "original_doc_id": "AEE1A739F2EA11F815EC571163BA99C9B2A97245", + "path": "corpus/watsonx-docsqa/docs/aee1a739f2ea11f815ec571163ba99c9b2a97245.md", + "title": "applyselflearningnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/selflearnnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/641b0015a5a634bfc40f10ae59873ca784232f14.md", + "original_doc_id": "641B0015A5A634BFC40F10AE59873CA784232F14", + "path": "corpus/watsonx-docsqa/docs/641b0015a5a634bfc40f10ae59873ca784232f14.md", + "title": "sequencenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/sequencenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/29af55b95d387be39d4e9d328936b95cad5beb67.md", + "original_doc_id": "29AF55B95D387BE39D4E9D328936B95CAD5BEB67", + "path": "corpus/watsonx-docsqa/docs/29af55b95d387be39d4e9d328936b95cad5beb67.md", + "title": "applysequencenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/sequencenuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2f88cc7897776ead3f1a7052a740701b8e1a6969.md", + "original_doc_id": "2F88CC7897776EAD3F1A7052A740701B8E1A6969", + "path": "corpus/watsonx-docsqa/docs/2f88cc7897776ead3f1a7052a740701b8e1a6969.md", + "title": "setglobalsnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/setglobalsnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/17e39c164e92d0646c4dddadfdf178bf3b5e2ad0.md", + "original_doc_id": "17E39C164E92D0646C4DDDADFDF178BF3B5E2AD0", + "path": "corpus/watsonx-docsqa/docs/17e39c164e92d0646c4dddadfdf178bf3b5e2ad0.md", + "title": "settoflagnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/settoflagnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/723fd865c01f3ac097e03b74f7d81d574a1a13d4.md", + "original_doc_id": "723FD865C01F3AC097E03B74F7D81D574A1A13D4", + "path": "corpus/watsonx-docsqa/docs/723fd865c01f3ac097e03b74f7d81d574a1a13d4.md", + "title": "simfitnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/simfitnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c24646ed4724e2a2d856392dda9c1b9b05145e11.md", + "original_doc_id": "C24646ED4724E2A2D856392DDA9C1B9B05145E11", + "path": "corpus/watsonx-docsqa/docs/c24646ed4724e2a2d856392dda9c1b9b05145e11.md", + "title": "simgennode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/simgennodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/984b203b8a0054a07f5be3eb99438c7fbcb6ce85.md", + "original_doc_id": "984B203B8A0054A07F5BE3EB99438C7FBCB6CE85", + "path": "corpus/watsonx-docsqa/docs/984b203b8a0054a07f5be3eb99438c7fbcb6ce85.md", + "title": "Node and flow property examples", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/slot_parameter_examples.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6601b619d597c89f715bc2fafd703452d64f21cd.md", + "original_doc_id": "6601B619D597C89F715BC2FAFD703452D64F21CD", + "path": "corpus/watsonx-docsqa/docs/6601b619d597c89f715bc2fafd703452d64f21cd.md", + "title": "Syntax for properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/slot_parameter_syntax.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6008cee94719e6b3caabfba9bff1973b9125e02f.md", + "original_doc_id": "6008CEE94719E6B3CAABFBA9BFF1973B9125E02F", + "path": "corpus/watsonx-docsqa/docs/6008cee94719e6b3caabfba9bff1973b9125e02f.md", + "title": "Abbreviations", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/slot_parameters_abbreviations.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fbd84cb5a6901ddaf7412396f4c6cc190e1b7328.md", + "original_doc_id": "FBD84CB5A6901DDAF7412396F4C6CC190E1B7328", + "path": "corpus/watsonx-docsqa/docs/fbd84cb5a6901ddaf7412396f4c6cc190e1b7328.md", + "title": "Common node properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/slot_parameters_common.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6f2cb7c072a05f7be0c6ce2eca39fc9a1ba5e107.md", + "original_doc_id": "6F2CB7C072A05F7BE0C6CE2ECA39FC9A1BA5E107", + "path": "corpus/watsonx-docsqa/docs/6f2cb7c072a05f7be0c6ce2eca39fc9a1ba5e107.md", + "title": "Model nugget node properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/slot_parameters_generatedmodels.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/29dcfc3fb6ee0ccba63e0ff3a797936da9e0c874.md", + "original_doc_id": "29DCFC3FB6EE0CCBA63E0FF3A797936DA9E0C874", + "path": "corpus/watsonx-docsqa/docs/29dcfc3fb6ee0ccba63e0ff3a797936da9e0c874.md", + "title": "Properties reference overview", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/slot_parameters_reference.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f127eff442d2c1d1a1ea01b23e8135b502ef2e79.md", + "original_doc_id": "F127EFF442D2C1D1A1EA01B23E8135B502EF2E79", + "path": "corpus/watsonx-docsqa/docs/f127eff442d2c1d1a1ea01b23e8135b502ef2e79.md", + "title": "smotenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/smotenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3259e737315294c6380ed46645ab8d073a5ed861.md", + "original_doc_id": "3259E737315294C6380ED46645AB8D073A5ED861", + "path": "corpus/watsonx-docsqa/docs/3259e737315294c6380ed46645ab8d073a5ed861.md", + "title": "sortnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/sortnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f3dd7962cb3aa07c8c469ede0c7852993ac3f290.md", + "original_doc_id": "F3DD7962CB3AA07C8C469EDE0C7852993AC3F290", + "path": "corpus/watsonx-docsqa/docs/f3dd7962cb3aa07c8c469ede0c7852993ac3f290.md", + "title": "Import node common properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/source_nodes_slot_parameters.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8f42bd98be9767332ce949506a9e193393da73fa.md", + "original_doc_id": "8F42BD98BE9767332CE949506A9E193393DA73FA", + "path": "corpus/watsonx-docsqa/docs/8f42bd98be9767332ce949506a9e193393da73fa.md", + "title": "statisticsnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/statisticsnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5b85770138782723e09d9ed65f8655484d03be44.md", + "original_doc_id": "5B85770138782723E09D9ED65F8655484D03BE44", + "path": "corpus/watsonx-docsqa/docs/5b85770138782723e09d9ed65f8655484d03be44.md", + "title": "derive_stbnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/stbnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5d193c88d3e3235ea441bb82cceeaae20bb3efcc.md", + "original_doc_id": "5D193C88D3E3235EA441BB82CCEEAAE20BB3EFCC", + "path": "corpus/watsonx-docsqa/docs/5d193c88d3e3235ea441bb82cceeaae20bb3efcc.md", + "title": "Flow scripts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/stream_scripttab.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/da0357b0ade596e1a23f676f76ff4304b97aef2b.md", + "original_doc_id": "DA0357B0ADE596E1A23F676F76FF4304B97AEF2B", + "path": "corpus/watsonx-docsqa/docs/da0357b0ade596e1a23f676f76ff4304b97aef2b.md", + "title": "Jython code size limits", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/stream_scripttab_javalimits.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/aac6535cab0b4600a9683433fcab805b2c4eaa53.md", + "original_doc_id": "AAC6535CAB0B4600A9683433FCAB805B2C4EAA53", + "path": "corpus/watsonx-docsqa/docs/aac6535cab0b4600a9683433fcab805b2c4eaa53.md", + "title": "Structured properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/structured_slot_parameters.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c64a69ebc1360788037b11e8b0dc5bb74d913819.md", + "original_doc_id": "C64A69EBC1360788037B11E8B0DC5BB74D913819", + "path": "corpus/watsonx-docsqa/docs/c64a69ebc1360788037b11e8b0dc5bb74d913819.md", + "title": "svmnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/svmnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bcae38614c57f1abb775c4c9372dc02531830659.md", + "original_doc_id": "BCAE38614C57F1ABB775C4C9372DC02531830659", + "path": "corpus/watsonx-docsqa/docs/bcae38614c57f1abb775c4c9372dc02531830659.md", + "title": "applysvmnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/svmnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3f5d0fd7e429fedbfc62dfc9bab41b3cc5fb4e4f.md", + "original_doc_id": "3F5D0FD7E429FEDBFC62DFC9BAB41B3CC5FB4E4F", + "path": "corpus/watsonx-docsqa/docs/3f5d0fd7e429fedbfc62dfc9bab41b3cc5fb4e4f.md", + "title": "tablenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/tablenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/85c99b52bbbc96007bd819861e675c61d7b742ca.md", + "original_doc_id": "85C99B52BBBC96007BD819861E675C61D7B742CA", + "path": "corpus/watsonx-docsqa/docs/85c99b52bbbc96007bd819861e675c61d7b742ca.md", + "title": "tcmnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/tcmnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/db504727c8688251caab0c18e12bde9dc625ecd1.md", + "original_doc_id": "DB504727C8688251CAAB0C18E12BDE9DC625ECD1", + "path": "corpus/watsonx-docsqa/docs/db504727c8688251caab0c18e12bde9dc625ecd1.md", + "title": "applytcmnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/tcmnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5062008d59b761c5cf7f32f131021ea81a03b048.md", + "original_doc_id": "5062008D59B761C5CF7F32F131021EA81A03B048", + "path": "corpus/watsonx-docsqa/docs/5062008d59b761c5cf7f32f131021ea81a03b048.md", + "title": "timeplotnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/timeplotnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/76b3f98c842554781d96b8dde05a74d4d78b4e7a.md", + "original_doc_id": "76B3F98C842554781D96B8DDE05A74D4D78B4E7A", + "path": "corpus/watsonx-docsqa/docs/76b3f98c842554781d96b8dde05a74d4d78b4e7a.md", + "title": "ts properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/timeser_as_nodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/eed66538a3e4854d56210ab1d6ac49016f1e40a2.md", + "original_doc_id": "EED66538A3E4854D56210AB1D6AC49016F1E40A2", + "path": "corpus/watsonx-docsqa/docs/eed66538a3e4854d56210ab1d6ac49016f1e40a2.md", + "title": "streamingtimeseries properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/timeser_as_nodeslots_streaming.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9087b2b5302fd4b7c8343c568c7c8a925544bb40.md", + "original_doc_id": "9087B2B5302FD4B7C8343C568C7C8A925544BB40", + "path": "corpus/watsonx-docsqa/docs/9087b2b5302fd4b7c8343c568c7c8a925544bb40.md", + "title": "applyts properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/timeser_as_nuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ea4cb9cd97ffb8c956b4f5d28d2759c0ed832bb5.md", + "original_doc_id": "EA4CB9CD97FFB8C956B4F5D28D2759C0ED832BB5", + "path": "corpus/watsonx-docsqa/docs/ea4cb9cd97ffb8c956b4f5d28d2759c0ed832bb5.md", + "title": "transformnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/transformnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a20fcf106ba3053c247daf57a4a396f073d1e4e2.md", + "original_doc_id": "A20FCF106BA3053C247DAF57A4A396F073D1E4E2", + "path": "corpus/watsonx-docsqa/docs/a20fcf106ba3053c247daf57a4a396f073d1e4e2.md", + "title": "transposenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/transposenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e01c7d12e53747c7ed71d615d7e9dcd8f17638ed.md", + "original_doc_id": "E01C7D12E53747C7ED71D615D7E9DCD8F17638ED", + "path": "corpus/watsonx-docsqa/docs/e01c7d12e53747c7ed71d615d7e9dcd8f17638ed.md", + "title": "treeas properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/treeASnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8ea57ca1ae730686e86fc3b2aabd71c9f8ea9823.md", + "original_doc_id": "8EA57CA1AE730686E86FC3B2AABD71C9F8EA9823", + "path": "corpus/watsonx-docsqa/docs/8ea57ca1ae730686e86fc3b2aabd71c9f8ea9823.md", + "title": "applytreeas properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/treeASnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3b763ffd1393292f4c3ca9d236440065b6660e8e.md", + "original_doc_id": "3B763FFD1393292F4C3CA9D236440065B6660E8E", + "path": "corpus/watsonx-docsqa/docs/3b763ffd1393292f4c3ca9d236440065b6660e8e.md", + "title": "twostepAS properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/twostep_as_nodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/356dd425ad5be4ee255f2f95f7860b6fdfe3bcc0.md", + "original_doc_id": "356DD425AD5BE4EE255F2F95F7860B6FDFE3BCC0", + "path": "corpus/watsonx-docsqa/docs/356dd425ad5be4ee255f2f95f7860b6fdfe3bcc0.md", + "title": "applytwostepAS properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/twostep_as_nuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0b54763a8146178f9f4809da458e4ddbd9e28b39.md", + "original_doc_id": "0B54763A8146178F9F4809DA458E4DDBD9E28B39", + "path": "corpus/watsonx-docsqa/docs/0b54763a8146178f9f4809da458e4ddbd9e28b39.md", + "title": "twostepnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/twostepnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bab82891ca84875b6eec64974558fc838197c99a.md", + "original_doc_id": "BAB82891CA84875B6EEC64974558FC838197C99A", + "path": "corpus/watsonx-docsqa/docs/bab82891ca84875b6eec64974558fc838197c99a.md", + "title": "applytwostepnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/twostepnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7ec3f9527921fb3f713dd6ae1d8035e6c81753c4.md", + "original_doc_id": "7EC3F9527921FB3F713DD6AE1D8035E6C81753C4", + "path": "corpus/watsonx-docsqa/docs/7ec3f9527921fb3f713dd6ae1d8035e6c81753c4.md", + "title": "typenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/typenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0b14841af65a8855e9d497ef05270b54b245daf8.md", + "original_doc_id": "0B14841AF65A8855E9D497EF05270B54B245DAF8", + "path": "corpus/watsonx-docsqa/docs/0b14841af65a8855e9d497ef05270b54b245daf8.md", + "title": "userinputnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/userinputnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/679f2f7a79672580b5fb797d9c5280b1a83806ef.md", + "original_doc_id": "679F2F7A79672580B5FB797D9C5280B1A83806EF", + "path": "corpus/watsonx-docsqa/docs/679f2f7a79672580b5fb797d9c5280b1a83806ef.md", + "title": "Scripting overview", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/using_scripting.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b3ffe77064106ee619c664233b7b7a9aba75c30a.md", + "original_doc_id": "B3FFE77064106EE619C664233B7B7A9ABA75C30A", + "path": "corpus/watsonx-docsqa/docs/b3ffe77064106ee619c664233b7b7a9aba75c30a.md", + "title": "webnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/webnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d2ea86e13b810569e718e9dca4c00da28a2e1c9a.md", + "original_doc_id": "D2EA86E13B810569E718E9DCA4C00DA28A2E1C9A", + "path": "corpus/watsonx-docsqa/docs/d2ea86e13b810569e718e9dca4c00da28a2e1c9a.md", + "title": "xgboostasnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/xgboostasnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/80ccb2cf7a994d218d5c47bbf7f8bbb0d479e399.md", + "original_doc_id": "80CCB2CF7A994D218D5C47BBF7F8BBB0D479E399", + "path": "corpus/watsonx-docsqa/docs/80ccb2cf7a994d218d5c47bbf7f8bbb0d479e399.md", + "title": "xgboostlinearnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/xgboostlinearnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8672a0aef022cd97d9e834ab2fd3a607fbdaed4d.md", + "original_doc_id": "8672A0AEF022CD97D9E834AB2FD3A607FBDAED4D", + "path": "corpus/watsonx-docsqa/docs/8672a0aef022cd97d9e834ab2fd3a607fbdaed4d.md", + "title": "applyxgboostlinearnode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/xgboostlinearnuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d05d9570cd32acccf91588c5886a1c4f5da56d01.md", + "original_doc_id": "D05D9570CD32ACCCF91588C5886A1C4F5DA56D01", + "path": "corpus/watsonx-docsqa/docs/d05d9570cd32acccf91588c5886a1c4f5da56d01.md", + "title": "xgboosttreenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/xgboosttreenodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/116575c57d15c410ac921aebfaf607e2f86e6c05.md", + "original_doc_id": "116575C57D15C410AC921AEBFAF607E2F86E6C05", + "path": "corpus/watsonx-docsqa/docs/116575c57d15c410ac921aebfaf607e2f86e6c05.md", + "title": "applyxgboosttreenode properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/xgboosttreenuggetnodeslots.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5c2f280e5c4326883f7b3623ef1b64fe4dde7c05.md", + "original_doc_id": "5C2F280E5C4326883F7B3623EF1B64FE4DDE7C05", + "path": "corpus/watsonx-docsqa/docs/5c2f280e5c4326883f7b3623ef1b64fe4dde7c05.md", + "title": "Select node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/select.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cbc6bda4ec8356f2ce95dd4548406abee1ec5b76.md", + "original_doc_id": "CBC6BDA4EC8356F2CE95DD4548406ABEE1EC5B76", + "path": "corpus/watsonx-docsqa/docs/cbc6bda4ec8356f2ce95dd4548406abee1ec5b76.md", + "title": "Sequence node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/sequence.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a447ec7366d2eb328bce8e44a73b3a825a9b757b.md", + "original_doc_id": "A447EC7366D2EB328BCE8E44A73B3A825A9B757B", + "path": "corpus/watsonx-docsqa/docs/a447ec7366d2eb328bce8e44a73b3a825a9b757b.md", + "title": "Set Globals node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/setglobals.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5cc48263b0c282ca1d65accb46d73d7ea3c8a665.md", + "original_doc_id": "5CC48263B0C282CA1D65ACCB46D73D7EA3C8A665", + "path": "corpus/watsonx-docsqa/docs/5cc48263b0c282ca1d65accb46d73d7ea3c8a665.md", + "title": "Set to Flag node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/settoflag.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/82546b72edbfb76f571cfd06a7009e01615fa054.md", + "original_doc_id": "82546B72EDBFB76F571CFD06A7009E01615FA054", + "path": "corpus/watsonx-docsqa/docs/82546b72edbfb76f571cfd06a7009e01615fa054.md", + "title": "Sim Eval node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/simeval.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/51389b2d808c1f7d81df9ec75f053528ae1bc128.md", + "original_doc_id": "51389B2D808C1F7D81DF9EC75F053528AE1BC128", + "path": "corpus/watsonx-docsqa/docs/51389b2d808c1f7d81df9ec75f053528ae1bc128.md", + "title": "Sim Fit node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/simfit.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ec10ac085ba8a12ba0d8af2dc66adfbe759b3183.md", + "original_doc_id": "EC10AC085BA8A12BA0D8AF2DC66ADFBE759B3183", + "path": "corpus/watsonx-docsqa/docs/ec10ac085ba8a12ba0d8af2dc66adfbe759b3183.md", + "title": "Sim Gen node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/simgen.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/efae4449ceb6f88aa4545f33bd886ec3080171b4.md", + "original_doc_id": "EFAE4449CEB6F88AA4545F33BD886EC3080171B4", + "path": "corpus/watsonx-docsqa/docs/efae4449ceb6f88aa4545f33bd886ec3080171b4.md", + "title": "SLRM node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/slrm.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f837935a2fefed20e2cac93656e376f9868cc515.md", + "original_doc_id": "F837935A2FEFED20E2CAC93656E376F9868CC515", + "path": "corpus/watsonx-docsqa/docs/f837935a2fefed20e2cac93656e376f9868cc515.md", + "title": "SMOTE node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/smote.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8f64225936d78b691574900d641c0cb7c3ce78ef.md", + "original_doc_id": "8F64225936D78B691574900D641C0CB7C3CE78EF", + "path": "corpus/watsonx-docsqa/docs/8f64225936d78b691574900d641c0cb7c3ce78ef.md", + "title": "Sort node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/sort.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c81beea067ccc7fed12806f3ff0f20519092f2e4.md", + "original_doc_id": "C81BEEA067CCC7FED12806F3FF0F20519092F2E4", + "path": "corpus/watsonx-docsqa/docs/c81beea067ccc7fed12806f3ff0f20519092f2e4.md", + "title": "Statistics (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/statistics.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2e2a2be1cb20ef0c663e591532d71cfb5637e57f.md", + "original_doc_id": "2E2A2BE1CB20EF0C663E591532D71CFB5637E57F", + "path": "corpus/watsonx-docsqa/docs/2e2a2be1cb20ef0c663e591532d71cfb5637e57f.md", + "title": "Streaming TCM node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/streamingtcm.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/84d42e162fefc977ae807af123cedfdf400e403a.md", + "original_doc_id": "84D42E162FEFC977AE807AF123CEDFDF400E403A", + "path": "corpus/watsonx-docsqa/docs/84d42e162fefc977ae807af123cedfdf400e403a.md", + "title": "SuperNodes (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/supernodes.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8ed36d5e1ccdfb0139d9d3db3aea2b90ae1b405e.md", + "original_doc_id": "8ED36D5E1CCDFB0139D9D3DB3AEA2B90AE1B405E", + "path": "corpus/watsonx-docsqa/docs/8ed36d5e1ccdfb0139d9d3db3aea2b90ae1b405e.md", + "title": "SVM node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/svm.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7434988303bf295c1586c5ee42100e8af244859c.md", + "original_doc_id": "7434988303BF295C1586C5EE42100E8AF244859C", + "path": "corpus/watsonx-docsqa/docs/7434988303bf295c1586c5ee42100e8af244859c.md", + "title": "Reusing category sets in Text Analytics Workbench (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/ta_reuse_category.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e6a2ef28a33aa6a8c8b2321133a8816257cd1612.md", + "original_doc_id": "E6A2EF28A33AA6A8C8B2321133A8816257CD1612", + "path": "corpus/watsonx-docsqa/docs/e6a2ef28a33aa6a8c8b2321133a8816257cd1612.md", + "title": "Reusing a project asset in Resource editor", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/ta_save_resource_editor.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0f58073f0d5b237c3241126e98851a9e0c912792.md", + "original_doc_id": "0F58073F0D5B237C3241126E98851A9E0C912792", + "path": "corpus/watsonx-docsqa/docs/0f58073f0d5b237c3241126e98851a9e0c912792.md", + "title": "Uploading a text analysis package (TAP) in a Text Mining node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/ta_upload_tap-template_TMnode.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8654d0cbb99ee82483f99972ef5247401eb8e8d9.md", + "original_doc_id": "8654D0CBB99EE82483F99972EF5247401EB8E8D9", + "path": "corpus/watsonx-docsqa/docs/8654d0cbb99ee82483f99972ef5247401eb8e8d9.md", + "title": "Table (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/table.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6b6d315ffd086296183de20086ee752a6a2b88c8.md", + "original_doc_id": "6B6D315FFD086296183DE20086EE752A6A2B88C8", + "path": "corpus/watsonx-docsqa/docs/6b6d315ffd086296183de20086ee752a6a2b88c8.md", + "title": "TCM node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/tcm.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6153f9f311cd2bb2df31c6a4a1cb76d64e36bfe6.md", + "original_doc_id": "6153F9F311CD2BB2DF31C6A4A1CB76D64E36BFE6", + "path": "corpus/watsonx-docsqa/docs/6153f9f311cd2bb2df31c6a4a1cb76d64e36bfe6.md", + "title": "Mining for text links (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/textlinkanalysis.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0faf8791603eb1a93adc49ea8f9e5859d1e3360f.md", + "original_doc_id": "0FAF8791603EB1A93ADC49EA8F9E5859D1E3360F", + "path": "corpus/watsonx-docsqa/docs/0faf8791603eb1a93adc49ea8f9e5859d1e3360f.md", + "title": "Time Intervals node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/timeintervals.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/99675d0ddd35d743f2f0becf008d9cbed68c0534.md", + "original_doc_id": "99675D0DDD35D743F2F0BECF008D9CBED68C0534", + "path": "corpus/watsonx-docsqa/docs/99675d0ddd35d743f2f0becf008d9cbed68c0534.md", + "title": "Time Plot node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/timeplot.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ac040f5709ab00ab3ed8275862fa2328d20842b2.md", + "original_doc_id": "AC040F5709AB00AB3ED8275862FA2328D20842B2", + "path": "corpus/watsonx-docsqa/docs/ac040f5709ab00ab3ed8275862fa2328d20842b2.md", + "title": "Expert options (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/tla_expert.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/efd36f1bf92225311b684d6aa0d05a597f00d707.md", + "original_doc_id": "EFD36F1BF92225311B684D6AA0D05A597F00D707", + "path": "corpus/watsonx-docsqa/docs/efd36f1bf92225311b684d6aa0d05a597f00d707.md", + "title": "TLA node output (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/tla_output.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b2250c2a2e20f6f123c6d1091bfd635dc74ee4fe.md", + "original_doc_id": "B2250C2A2E20F6F123C6D1091BFD635DC74EE4FE", + "path": "corpus/watsonx-docsqa/docs/b2250c2a2e20f6f123c6d1091bfd635dc74ee4fe.md", + "title": "Linguistic resources used in Text Analytics (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/tmwb-linguistic-resource.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/05275f4ec521878b13ad7dce825e167b2fc7ef93.md", + "original_doc_id": "05275F4EC521878B13AD7DCE825E167B2FC7EF93", + "path": "corpus/watsonx-docsqa/docs/05275f4ec521878b13ad7dce825e167b2fc7ef93.md", + "title": "Advanced frequency settings (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/tmwb_advanced_frequencies.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a1365cd1e2acbee6e9bf025dd493feb17a0d428f.md", + "original_doc_id": "A1365CD1E2ACBEE6E9BF025DD493FEB17A0D428F", + "path": "corpus/watsonx-docsqa/docs/a1365cd1e2acbee6e9bf025dd493feb17a0d428f.md", + "title": "Advanced linguistic settings (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/tmwb_advanced_linguistic.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d171fcf10d8a1699fd8ac67e44053bbf6405631c.md", + "original_doc_id": "D171FCF10D8A1699FD8AC67E44053BBF6405631C", + "path": "corpus/watsonx-docsqa/docs/d171fcf10d8a1699fd8ac67e44053bbf6405631c.md", + "title": "The Concepts tab (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/tmwb_conceptstab.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6068b2555e5014d386397335d0ed56b430082ff7.md", + "original_doc_id": "6068B2555E5014D386397335D0ED56B430082FF7", + "path": "corpus/watsonx-docsqa/docs/6068b2555e5014d386397335d0ed56b430082ff7.md", + "title": "The Resource editor tab (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/tmwb_dewindow.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/342ad3abfeeca87987ed595047cc869e15f148bf.md", + "original_doc_id": "342AD3ABFEECA87987ED595047CC869E15F148BF", + "path": "corpus/watsonx-docsqa/docs/342ad3abfeeca87987ed595047cc869e15f148bf.md", + "title": "Generating a model nugget (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/tmwb_generate_model.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7fe671db2b6972a1cfb04e0902f8d82dc979d42a.md", + "original_doc_id": "7FE671DB2B6972A1CFB04E0902F8D82DC979D42A", + "path": "corpus/watsonx-docsqa/docs/7fe671db2b6972a1cfb04e0902f8d82dc979d42a.md", + "title": "Text Analytics Workbench (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/tmwb_intro.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/925108d09cfc6f2b5193d0d7414bfc83748111a9.md", + "original_doc_id": "925108D09CFC6F2B5193D0D7414BFC83748111A9", + "path": "corpus/watsonx-docsqa/docs/925108d09cfc6f2b5193d0d7414bfc83748111a9.md", + "title": "Setting options (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/tmwb_intro_options.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/31a670d6b3f0d7ab4ead7dae3795589f161249de.md", + "original_doc_id": "31A670D6B3F0D7AB4EAD7DAE3795589F161249DE", + "path": "corpus/watsonx-docsqa/docs/31a670d6b3f0d7ab4ead7dae3795589f161249de.md", + "title": "The Categories tab (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/tmwb_tawindow.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/799ce322c90ecad9cc4bacad45f9749ec21e912e.md", + "original_doc_id": "799CE322C90ECAD9CC4BACAD45F9749EC21E912E", + "path": "corpus/watsonx-docsqa/docs/799ce322c90ecad9cc4bacad45f9749ec21e912e.md", + "title": "The Text links tab (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/tmwb_view_tla.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/be6a4c0bb6bcc7166ff88d60fd433c220962730d.md", + "original_doc_id": "BE6A4C0BB6BCC7166FF88D60FD433C220962730D", + "path": "corpus/watsonx-docsqa/docs/be6a4c0bb6bcc7166ff88d60fd433c220962730d.md", + "title": "Transform node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/transform.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/22b8136f68ac74838b9c2b9eaf3996ccfaa14921.md", + "original_doc_id": "22B8136F68AC74838B9C2B9EAF3996CCFAA14921", + "path": "corpus/watsonx-docsqa/docs/22b8136f68ac74838b9c2b9eaf3996ccfaa14921.md", + "title": "Transpose node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/transpose.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/015755c65c274f262396747d3f32a59ae74c08d7.md", + "original_doc_id": "015755C65C274F262396747D3F32A59AE74C08D7", + "path": "corpus/watsonx-docsqa/docs/015755c65c274f262396747d3f32a59ae74c08d7.md", + "title": "Tree-AS node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/treeas.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/18c44d2a29b576f708bc515cede91227b6b4fc4e.md", + "original_doc_id": "18C44D2A29B576F708BC515CEDE91227B6B4FC4E", + "path": "corpus/watsonx-docsqa/docs/18c44d2a29b576f708bc515cede91227b6b4fc4e.md", + "title": "Time Series node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/ts.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a5d736b45ec8ec0b906e183de5daa8bfa4c1f2d6.md", + "original_doc_id": "A5D736B45EC8EC0B906E183DE5DAA8BFA4C1F2D6", + "path": "corpus/watsonx-docsqa/docs/a5d736b45ec8ec0b906e183de5daa8bfa4c1f2d6.md", + "title": "Streaming Time Series node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/ts_streaming.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/94fe9993a8201bdbd9d383cc4cc4ca4f2dddb47d.md", + "original_doc_id": "94FE9993A8201BDBD9D383CC4CC4CA4F2DDDB47D", + "path": "corpus/watsonx-docsqa/docs/94fe9993a8201bdbd9d383cc4cc4ca4f2dddb47d.md", + "title": "TwoStep cluster node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/twostep.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b7e56bebf29f9aa59a9abc9e299f19613e5859da.md", + "original_doc_id": "B7E56BEBF29F9AA59A9ABC9E299F19613E5859DA", + "path": "corpus/watsonx-docsqa/docs/b7e56bebf29f9aa59a9abc9e299f19613e5859da.md", + "title": "TwoStep-AS cluster node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/twostepAS.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a967430da16338281405cf73a802c233911b6a13.md", + "original_doc_id": "A967430DA16338281405CF73A802C233911B6A13", + "path": "corpus/watsonx-docsqa/docs/a967430da16338281405cf73a802c233911b6a13.md", + "title": "Type node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5f584aeed890d6efb4c9faf133a26bd9f9e4f219.md", + "original_doc_id": "5F584AEED890D6EFB4C9FAF133A26BD9F9E4F219", + "path": "corpus/watsonx-docsqa/docs/5f584aeed890d6efb4c9faf133a26bd9f9e4f219.md", + "title": "Checking type values (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_checktype.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/916c197a1a18fbe44382a30782b1ff7c13dbfeec.md", + "original_doc_id": "916C197A1A18FBE44382A30782B1FF7C13DBFEEC", + "path": "corpus/watsonx-docsqa/docs/916c197a1a18fbe44382a30782b1ff7c13dbfeec.md", + "title": "Converting continuous data (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_convert.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8f5ea4dc23caee3b6887b07ae9d319bfe5e39ca8.md", + "original_doc_id": "8F5EA4DC23CAEE3B6887B07AE9D319BFE5E39CA8", + "path": "corpus/watsonx-docsqa/docs/8f5ea4dc23caee3b6887b07ae9d319bfe5e39ca8.md", + "title": "Setting field format options (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_field_format.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7292de7c0036b9064a85d1da77a860bd989ea638.md", + "original_doc_id": "7292DE7C0036B9064A85D1DA77A860BD989EA638", + "path": "corpus/watsonx-docsqa/docs/7292de7c0036b9064a85d1da77a860bd989ea638.md", + "title": "Setting the field role (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_fieldrole.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b8c3b95fc688c347d679f81711781b29578cfc19.md", + "original_doc_id": "B8C3B95FC688C347D679F81711781B29578CFC19", + "path": "corpus/watsonx-docsqa/docs/b8c3b95fc688c347d679f81711781b29578cfc19.md", + "title": "Viewing and setting information about types (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_info.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9f878a46b28c19b951157a5f31bb7a1a9920a89e.md", + "original_doc_id": "9F878A46B28C19B951157A5F31BB7A1A9920A89E", + "path": "corpus/watsonx-docsqa/docs/9f878a46b28c19b951157a5f31bb7a1a9920a89e.md", + "title": "What is instantiation? (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_instantiation.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/21db0146b79b8256259507c62876e01ada143bd6.md", + "original_doc_id": "21DB0146B79B8256259507C62876E01ADA143BD6", + "path": "corpus/watsonx-docsqa/docs/21db0146b79b8256259507c62876e01ada143bd6.md", + "title": "Measurement levels (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_levels.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e0f6fbca52d2ee44ac2e0795fa11fb53e3054c47.md", + "original_doc_id": "E0F6FBCA52D2EE44AC2E0795FA11FB53E3054C47", + "path": "corpus/watsonx-docsqa/docs/e0f6fbca52d2ee44ac2e0795fa11fb53e3054c47.md", + "title": "Geospatial measurement sublevels (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_levels_geo.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fd903f9a58632df14be5c98eeda32e1fc2f46f4b.md", + "original_doc_id": "FD903F9A58632DF14BE5C98EEDA32E1FC2F46F4B", + "path": "corpus/watsonx-docsqa/docs/fd903f9a58632df14be5c98eeda32e1fc2f46f4b.md", + "title": "Defining missing values (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_missing.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/063d5e4c6e2094f964752d376b5ff49ffd47433b.md", + "original_doc_id": "063D5E4C6E2094F964752D376B5FF49FFD47433B", + "path": "corpus/watsonx-docsqa/docs/063d5e4c6e2094f964752d376b5ff49ffd47433b.md", + "title": "Data values (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_values.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/98ac4398e3ea902007d99e5bdb0686aef04a4daa.md", + "original_doc_id": "98AC4398E3EA902007D99E5BDB0686AEF04A4DAA", + "path": "corpus/watsonx-docsqa/docs/98ac4398e3ea902007d99e5bdb0686aef04a4daa.md", + "title": "Specifying values for collection data (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_values_collection.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a82cb1ababcf08e9fd361f13050d47850af8768a.md", + "original_doc_id": "A82CB1ABABCF08E9FD361F13050D47850AF8768A", + "path": "corpus/watsonx-docsqa/docs/a82cb1ababcf08e9fd361f13050d47850af8768a.md", + "title": "Specifying values and labels for continuous data (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_values_continuous.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/077afc6b667f6747ff066182e2f04af486c13368.md", + "original_doc_id": "077AFC6B667F6747FF066182E2F04AF486C13368", + "path": "corpus/watsonx-docsqa/docs/077afc6b667f6747ff066182e2f04af486c13368.md", + "title": "Specifying values for a flag (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_values_flag.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/24d2987869b1c8c34efa1204903a7a8f3e35d459.md", + "original_doc_id": "24D2987869B1C8C34EFA1204903A7A8F3E35D459", + "path": "corpus/watsonx-docsqa/docs/24d2987869b1c8c34efa1204903a7a8f3e35d459.md", + "title": "Specifying values for geospatial data (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_values_geo.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2c991135b30b24a268fc9d847e3f43522543a96b.md", + "original_doc_id": "2C991135B30B24A268FC9D847E3F43522543A96B", + "path": "corpus/watsonx-docsqa/docs/2c991135b30b24a268fc9d847e3f43522543a96b.md", + "title": "Specifying values and labels for nominal and ordinal data (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_values_nominal.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c9857afef4c7e7c2ad0b764277b90a2bce51adc8.md", + "original_doc_id": "C9857AFEF4C7E7C2AD0B764277B90A2BCE51ADC8", + "path": "corpus/watsonx-docsqa/docs/c9857afef4c7e7c2ad0b764277b90a2bce51adc8.md", + "title": "Setting options for values (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_values_using.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/74706148818bd2ace30029492dd8ad7d47283edc.md", + "original_doc_id": "74706148818BD2ACE30029492DD8AD7D47283EDC", + "path": "corpus/watsonx-docsqa/docs/74706148818bd2ace30029492dd8ad7d47283edc.md", + "title": "User Input node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/userinput.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5b3fb712903b0d1044610c93e6fcde6a41be1cf6.md", + "original_doc_id": "5B3FB712903B0D1044610C93E6FCDE6A41BE1CF6", + "path": "corpus/watsonx-docsqa/docs/5b3fb712903b0d1044610c93e6fcde6a41be1cf6.md", + "title": "Web node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/web.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/114ebf33612531c5020fd739010049e5126e0e5b.md", + "original_doc_id": "114EBF33612531C5020FD739010049E5126E0E5B", + "path": "corpus/watsonx-docsqa/docs/114ebf33612531c5020fd739010049e5126e0e5b.md", + "title": "XGBoost-AS node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/xgboostas.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8937db13972e4dedbcc542303ef3a783287fd10b.md", + "original_doc_id": "8937DB13972E4DEDBCC542303EF3A783287FD10B", + "path": "corpus/watsonx-docsqa/docs/8937db13972e4dedbcc542303ef3a783287fd10b.md", + "title": "XGBoost Linear (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/xgboostlinear.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/35f4c4a97cf58fa0642d88e501314f3d75ff9e01.md", + "original_doc_id": "35F4C4A97CF58FA0642D88E501314F3D75FF9E01", + "path": "corpus/watsonx-docsqa/docs/35f4c4a97cf58fa0642d88e501314f3d75ff9e01.md", + "title": "Supported data sources (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/xgboosttree.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/717b697e0045b5d7dff6acc93ad5dec98e27ebdc.md", + "original_doc_id": "717B697E0045B5D7DFF6ACC93AD5DEC98E27EBDC", + "path": "corpus/watsonx-docsqa/docs/717b697e0045b5d7dff6acc93ad5dec98e27ebdc.md", + "title": "Flow and SuperNode parameters", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/parameters.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2b67d1eb41065cf9da0eb68d429b69803d49eaa1.md", + "original_doc_id": "2B67D1EB41065CF9DA0EB68D429B69803D49EAA1", + "path": "corpus/watsonx-docsqa/docs/2b67d1eb41065cf9da0eb68d429b69803d49eaa1.md", + "title": "Reference information", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/reference_guides.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c0cc7ae4029730b9846b6a05f4160643d3a8c393.md", + "original_doc_id": "C0CC7AE4029730B9846B6A05F4160643D3A8C393", + "path": "corpus/watsonx-docsqa/docs/c0cc7ae4029730b9846b6a05f4160643d3a8c393.md", + "title": "Adding comments and annotations to SPSS Modeler flows", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/spss-comments.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e1232c341b3f590c23e9e81ddd157bc99ff77191.md", + "original_doc_id": "E1232C341B3F590C23E9E81DDD157BC99FF77191", + "path": "corpus/watsonx-docsqa/docs/e1232c341b3f590c23e9e81ddd157bc99ff77191.md", + "title": "Supported data sources (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/spss-connections.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7d1e61ef82bc5dc1029d55c8f5c2ebb56082cdac.md", + "original_doc_id": "7D1E61EF82BC5DC1029D55C8F5C2EBB56082CDAC", + "path": "corpus/watsonx-docsqa/docs/7d1e61ef82bc5dc1029d55c8f5c2ebb56082cdac.md", + "title": "Creating SPSS Modeler flows", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/spss-modeler.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/68061cdeda9e9e83180ca7513620b5988266cebf.md", + "original_doc_id": "68061CDEDA9E9E83180CA7513620B5988266CEBF", + "path": "corpus/watsonx-docsqa/docs/68061cdeda9e9e83180ca7513620b5988266cebf.md", + "title": "SPSS Modeler algorithms guide", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/spss_algorithms.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/23080e48c7b666c07e92a6e4f4bb256d77be49b4.md", + "original_doc_id": "23080E48C7B666C07E92A6E4F4BB256D77BE49B4", + "path": "corpus/watsonx-docsqa/docs/23080e48c7b666c07e92a6e4f4bb256d77be49b4.md", + "title": "Tips and shortcuts for SPSS Modeler", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/spss_tips.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c5f5acc006cd6f06be3266ee98f89fabf4f6fbaf.md", + "original_doc_id": "C5F5ACC006CD6F06BE3266EE98F89FABF4F6FBAF", + "path": "corpus/watsonx-docsqa/docs/c5f5acc006cd6f06be3266ee98f89fabf4f6fbaf.md", + "title": "Troubleshooting information for SPSS Modeler", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/spss_troubleshooting.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/33fe18d89140517ab2a75d6fc64a4a3db962b88b.md", + "original_doc_id": "33FE18D89140517AB2A75D6FC64A4A3DB962B88B", + "path": "corpus/watsonx-docsqa/docs/33fe18d89140517ab2a75d6fc64a4a3db962b88b.md", + "title": "SQL optimization (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/sql_clem.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/262c45d286c9b8a7edba8635e636824f2b043d73.md", + "original_doc_id": "262C45D286C9B8A7EDBA8635E636824F2B043D73", + "path": "corpus/watsonx-docsqa/docs/262c45d286c9b8a7edba8635e636824f2b043d73.md", + "title": "SQL optimization (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/sql_howitworks.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bdb3689801d81676ae642f1ebff81d27c07f1f3c.md", + "original_doc_id": "BDB3689801D81676AE642F1EBFF81D27C07F1F3C", + "path": "corpus/watsonx-docsqa/docs/bdb3689801d81676ae642f1ebff81d27c07f1f3c.md", + "title": "SQL optimization (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/sql_native.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d69f33671e13df29fe56579ac4654ebc54a11f12.md", + "original_doc_id": "D69F33671E13DF29FE56579AC4654EBC54A11F12", + "path": "corpus/watsonx-docsqa/docs/d69f33671e13df29fe56579ac4654ebc54a11f12.md", + "title": "SQL optimization (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/sql_nodes.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/af0f7c335a10c372c36a0ccec76057c41b93731b.md", + "original_doc_id": "AF0F7C335A10C372C36A0CCEC76057C41B93731B", + "path": "corpus/watsonx-docsqa/docs/af0f7c335a10c372c36a0ccec76057c41b93731b.md", + "title": "SQL optimization (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/sql_overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2c669e0145dac26a7517d9402874bac048e46e82.md", + "original_doc_id": "2C669E0145DAC26A7517D9402874BAC048E46E82", + "path": "corpus/watsonx-docsqa/docs/2c669e0145dac26a7517d9402874bac048e46e82.md", + "title": "SQL optimization (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/sql_tips.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3874aaf67ef04bb4d623fff07e1cdb4c25b3b33e.md", + "original_doc_id": "3874AAF67EF04BB4D623FFF07E1CDB4C25B3B33E", + "path": "corpus/watsonx-docsqa/docs/3874aaf67ef04bb4d623fff07e1cdb4c25b3b33e.md", + "title": "Tutorials (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6e50438308b85e969b79ded22cc5e15f6872ee85.md", + "original_doc_id": "6E50438308B85E969B79DED22CC5E15F6872EE85", + "path": "corpus/watsonx-docsqa/docs/6e50438308b85e969b79ded22cc5e15f6872ee85.md", + "title": "Automated modeling for a continuous target (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_autocont.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2d5b33f1352d8ba7cef029d1979ccf0d44aad63e.md", + "original_doc_id": "2D5B33F1352D8BA7CEF029D1979CCF0D44AAD63E", + "path": "corpus/watsonx-docsqa/docs/2d5b33f1352d8ba7cef029d1979ccf0d44aad63e.md", + "title": "Building the flow (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_autocont_build.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ec7fcf477e212945eab7bb85c2279f37d62d4b49.md", + "original_doc_id": "EC7FCF477E212945EAB7BB85C2279F37D62D4B49", + "path": "corpus/watsonx-docsqa/docs/ec7fcf477e212945eab7bb85c2279f37d62d4b49.md", + "title": "Comparing the models (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_autocont_compare.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/69ed00abb6b920d1fe4f5b5675afda422f04e8d8.md", + "original_doc_id": "69ED00ABB6B920D1FE4F5B5675AFDA422F04E8D8", + "path": "corpus/watsonx-docsqa/docs/69ed00abb6b920d1fe4f5b5675afda422f04e8d8.md", + "title": "Summary (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_autocont_summary.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3d999c84c01328a45ebf0ecad358d858c634df5b.md", + "original_doc_id": "3D999C84C01328A45EBF0ECAD358D858C634DF5B", + "path": "corpus/watsonx-docsqa/docs/3d999c84c01328a45ebf0ecad358d858c634df5b.md", + "title": "Training data (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_autocont_train.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d96c3a08a5607bdcb1bc85e0bedd8743ea0b3dc5.md", + "original_doc_id": "D96C3A08A5607BDCB1BC85E0BEDD8743EA0B3DC5", + "path": "corpus/watsonx-docsqa/docs/d96c3a08a5607bdcb1bc85e0bedd8743ea0b3dc5.md", + "title": "Automated data preparation (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_autodata.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/895cd261c9f06f272286bcca3555846fb1ed8aa3.md", + "original_doc_id": "895CD261C9F06F272286BCCA3555846FB1ED8AA3", + "path": "corpus/watsonx-docsqa/docs/895cd261c9f06f272286bcca3555846fb1ed8aa3.md", + "title": "Building the flow (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_autodata_build.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b523ebe64275bee04d480b55ccaeac3017a36980.md", + "original_doc_id": "B523EBE64275BEE04D480B55CCAEAC3017A36980", + "path": "corpus/watsonx-docsqa/docs/b523ebe64275bee04d480b55ccaeac3017a36980.md", + "title": "Comparing the models (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_autodata_compare.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1a548d934dfe57dd0f12195461f2ddb348eae68c.md", + "original_doc_id": "1A548D934DFE57DD0F12195461F2DDB348EAE68C", + "path": "corpus/watsonx-docsqa/docs/1a548d934dfe57dd0f12195461f2ddb348eae68c.md", + "title": "Automated modeling for a flag target (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_autoflag.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ce7976afe82e2d17ee1fa308570afa42e0e91667.md", + "original_doc_id": "CE7976AFE82E2D17EE1FA308570AFA42E0E91667", + "path": "corpus/watsonx-docsqa/docs/ce7976afe82e2d17ee1fa308570afa42e0e91667.md", + "title": "Building the flow (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_autoflag_build.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b57a4b94bfafdd0cd6edbdfa4aba1f708286e918.md", + "original_doc_id": "B57A4B94BFAFDD0CD6EDBDFA4ABA1F708286E918", + "path": "corpus/watsonx-docsqa/docs/b57a4b94bfafdd0cd6edbdfa4aba1f708286e918.md", + "title": "Historical data (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_autoflag_historical.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c4773ef8b0935e8de084c1a6285efe11e2a5f80a.md", + "original_doc_id": "C4773EF8B0935E8DE084C1A6285EFE11E2A5F80A", + "path": "corpus/watsonx-docsqa/docs/c4773ef8b0935e8de084c1a6285efe11e2a5f80a.md", + "title": "Generating and comparing models (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_autoflag_models.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/823d9660b5b41b7c85904d0eb88a8d40ac57383f.md", + "original_doc_id": "823D9660B5B41B7C85904D0EB88A8D40AC57383F", + "path": "corpus/watsonx-docsqa/docs/823d9660b5b41b7c85904d0eb88a8d40ac57383f.md", + "title": "Summary (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_autoflag_summary.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b2ca734ae719ba79ab4b5f877cf044f47090faec.md", + "original_doc_id": "B2CA734AE719BA79AB4B5F877CF044F47090FAEC", + "path": "corpus/watsonx-docsqa/docs/b2ca734ae719ba79ab4b5f877cf044f47090faec.md", + "title": "Forecasting bandwidth utilization (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_bandwidth.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/718cd1a731e0f4e5abfd77519ed254b5ccc670fb.md", + "original_doc_id": "718CD1A731E0F4E5ABFD77519ED254B5CCC670FB", + "path": "corpus/watsonx-docsqa/docs/718cd1a731e0f4e5abfd77519ed254b5ccc670fb.md", + "title": "Forecasting with the Time Series node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_bandwidth_forecast.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c143a9f5185d9303301630d3fc53b604d3dced2e.md", + "original_doc_id": "C143A9F5185D9303301630D3FC53B604D3DCED2E", + "path": "corpus/watsonx-docsqa/docs/c143a9f5185d9303301630d3fc53b604d3dced2e.md", + "title": "Creating the flow (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_bandwidth_forecast_build.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/edb1038f1d71a450556d13ae34a416e46d7213fe.md", + "original_doc_id": "EDB1038F1D71A450556D13AE34A416E46D7213FE", + "path": "corpus/watsonx-docsqa/docs/edb1038f1d71a450556d13ae34a416e46d7213fe.md", + "title": "Examining the data (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_bandwidth_forecast_data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0721692d3f363b864a241fc4644d7d57b2dff881.md", + "original_doc_id": "0721692D3F363B864A241FC4644D7D57B2DFF881", + "path": "corpus/watsonx-docsqa/docs/0721692d3f363b864a241fc4644d7d57b2dff881.md", + "title": "Defining the dates (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_bandwidth_forecast_dates.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/03da4d2d23a65c146ba5afd8f7175908f868f3eb.md", + "original_doc_id": "03DA4D2D23A65C146BA5AFD8F7175908F868F3EB", + "path": "corpus/watsonx-docsqa/docs/03da4d2d23a65c146ba5afd8f7175908f868f3eb.md", + "title": "Examining the model (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_bandwidth_forecast_examine.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a69da07f8ee0529080646a4b1eab45c1074ab683.md", + "original_doc_id": "A69DA07F8EE0529080646A4B1EAB45C1074AB683", + "path": "corpus/watsonx-docsqa/docs/a69da07f8ee0529080646a4b1eab45c1074ab683.md", + "title": "Creating the model (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_bandwidth_forecast_model.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8ccc5cd4a9c103249435fc0a7fb18874b447de3d.md", + "original_doc_id": "8CCC5CD4A9C103249435FC0A7FB18874B447DE3D", + "path": "corpus/watsonx-docsqa/docs/8ccc5cd4a9c103249435fc0a7fb18874b447de3d.md", + "title": "Summary (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_bandwidth_forecast_summary.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/59cdbabc75e7ec8987a3c464f3277923f444a724.md", + "original_doc_id": "59CDBABC75E7EC8987A3C464F3277923F444A724", + "path": "corpus/watsonx-docsqa/docs/59cdbabc75e7ec8987a3c464f3277923f444a724.md", + "title": "Defining the targets (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_bandwidth_forecast_targets.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/83579304f7f59126fe983b1ed44bbbb1ac8bfcb2.md", + "original_doc_id": "83579304F7F59126FE983B1ED44BBBB1AC8BFCB2", + "path": "corpus/watsonx-docsqa/docs/83579304f7f59126fe983b1ed44bbbb1ac8bfcb2.md", + "title": "Setting the time intervals (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_bandwidth_forecast_time.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7e9a5f54713ce7cb98ea4bcb223a40c4952f0083.md", + "original_doc_id": "7E9A5F54713CE7CB98EA4BCB223A40C4952F0083", + "path": "corpus/watsonx-docsqa/docs/7e9a5f54713ce7cb98ea4bcb223a40c4952f0083.md", + "title": "Telecommunications churn (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_churn.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/433775834ea8ae82cbfa6077fc361c3c52a99e42.md", + "original_doc_id": "433775834EA8AE82CBFA6077FC361C3C52A99E42", + "path": "corpus/watsonx-docsqa/docs/433775834ea8ae82cbfa6077fc361c3c52a99e42.md", + "title": "Building the flow (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_churn_build.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b648a5dee55d7dbf258b7b088830f18c040c61d5.md", + "original_doc_id": "B648A5DEE55D7DBF258B7B088830F18C040C61D5", + "path": "corpus/watsonx-docsqa/docs/b648a5dee55d7dbf258b7b088830f18c040c61d5.md", + "title": "Browsing the model (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_churn_model.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2779271745a02f4de48bd92ab93a7a4be4a73d38.md", + "original_doc_id": "2779271745A02F4DE48BD92AB93A7A4BE4A73D38", + "path": "corpus/watsonx-docsqa/docs/2779271745a02f4de48bd92ab93a7a4be4a73d38.md", + "title": "Classifying telecommunications customers (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_classify.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/400e9e780d8a149530df21e38b256b71bda12d83.md", + "original_doc_id": "400E9E780D8A149530DF21E38B256B71BDA12D83", + "path": "corpus/watsonx-docsqa/docs/400e9e780d8a149530df21e38b256b71bda12d83.md", + "title": "Building the flow (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_classify_build.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d7fd91bac6be16abd9b158c6b118e5e09e047c6d.md", + "original_doc_id": "D7FD91BAC6BE16ABD9B158C6B118E5E09E047C6D", + "path": "corpus/watsonx-docsqa/docs/d7fd91bac6be16abd9b158c6b118e5e09e047c6d.md", + "title": "Browsing the model (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_classify_model.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9555087b12b80060fb337f8974fea9261174115e.md", + "original_doc_id": "9555087B12B80060FB337F8974FEA9261174115E", + "path": "corpus/watsonx-docsqa/docs/9555087b12b80060fb337f8974fea9261174115e.md", + "title": "Condition monitoring (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_condition.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d59300b05666e072ea812effa009e2dd4b60a508.md", + "original_doc_id": "D59300B05666E072EA812EFFA009E2DD4B60A508", + "path": "corpus/watsonx-docsqa/docs/d59300b05666e072ea812effa009e2dd4b60a508.md", + "title": "Examining the data (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_condition_data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d11a81e7333f63092fcf2c047744f2f3c18c1903.md", + "original_doc_id": "D11A81E7333F63092FCF2C047744F2F3C18C1903", + "path": "corpus/watsonx-docsqa/docs/d11a81e7333f63092fcf2c047744f2f3c18c1903.md", + "title": "Learning (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_condition_learn.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/43071778b4e33375953afb1ab743b342d3cc906a.md", + "original_doc_id": "43071778B4E33375953AFB1AB743B342D3CC906A", + "path": "corpus/watsonx-docsqa/docs/43071778b4e33375953afb1ab743b342d3cc906a.md", + "title": "Data preparation (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_condition_prep.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a187344eb767bac8e4d674651bedafa33f70bfa1.md", + "original_doc_id": "A187344EB767BAC8E4D674651BEDAFA33F70BFA1", + "path": "corpus/watsonx-docsqa/docs/a187344eb767bac8e4d674651bedafa33f70bfa1.md", + "title": "Testing (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_condition_test.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3d9fb046d583a2d0177ecb4da25eeaeb4febcca9.md", + "original_doc_id": "3D9FB046D583A2D0177ECB4DA25EEAEB4FEBCCA9", + "path": "corpus/watsonx-docsqa/docs/3d9fb046d583a2d0177ecb4da25eeaeb4febcca9.md", + "title": "Drug treatment - exploratory graphs (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_drug.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/13d83af5ccd616f312472fbab4ac7d7a56d0f41d.md", + "original_doc_id": "13D83AF5CCD616F312472FBAB4AC7D7A56D0F41D", + "path": "corpus/watsonx-docsqa/docs/13d83af5ccd616f312472fbab4ac7d7a56d0f41d.md", + "title": "Using an Analysis node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_drug_analysis.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/18a7a354c4b46e26df8304755c8be954bb922b04.md", + "original_doc_id": "18A7A354C4B46E26DF8304755C8BE954BB922B04", + "path": "corpus/watsonx-docsqa/docs/18a7a354c4b46e26df8304755c8be954bb922b04.md", + "title": "Browsing a model (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_drug_browse.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d1b1e93ad61d2b095bf8a00e9739fcf7d1dc974c.md", + "original_doc_id": "D1B1E93AD61D2B095BF8A00E9739FCF7D1DC974C", + "path": "corpus/watsonx-docsqa/docs/d1b1e93ad61d2b095bf8a00e9739fcf7d1dc974c.md", + "title": "Building a model (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_drug_build.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d733288343a1790788e8069eb55908f9d12566a9.md", + "original_doc_id": "D733288343A1790788E8069EB55908F9D12566A9", + "path": "corpus/watsonx-docsqa/docs/d733288343a1790788e8069eb55908f9d12566a9.md", + "title": "Reading in text data (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_drug_data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a73ca4f67523dbb58fd3521ae9bff83aee634607.md", + "original_doc_id": "A73CA4F67523DBB58FD3521AE9BFF83AEE634607", + "path": "corpus/watsonx-docsqa/docs/a73ca4f67523dbb58fd3521ae9bff83aee634607.md", + "title": "Creating a distribution chart (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_drug_distribution.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0a5c26b7b5b7c1e3afd8901d8b91f2e3c527da3e.md", + "original_doc_id": "0A5C26B7B5B7C1E3AFD8901D8B91F2E3C527DA3E", + "path": "corpus/watsonx-docsqa/docs/0a5c26b7b5b7c1e3afd8901d8b91f2e3c527da3e.md", + "title": "Deriving a new field (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_drug_newfield.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bb659d7b00db3096c4082bb93c7fdb933738b013.md", + "original_doc_id": "BB659D7B00DB3096C4082BB93C7FDB933738B013", + "path": "corpus/watsonx-docsqa/docs/bb659d7b00db3096c4082bb93c7fdb933738b013.md", + "title": "Creating a scatterplot (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_drug_scatterplot.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f7d95a9fcca49861b0d4b7dce677d4e6eff1f7c1.md", + "original_doc_id": "F7D95A9FCCA49861B0D4B7DCE677D4E6EFF1F7C1", + "path": "corpus/watsonx-docsqa/docs/f7d95a9fcca49861b0d4b7dce677d4e6eff1f7c1.md", + "title": "Creating advanced visualizations (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_drug_viz.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/95c10fdc6d0c3b142da650044e1a0581d04ef8e4.md", + "original_doc_id": "95C10FDC6D0C3B142DA650044E1A0581D04EF8E4", + "path": "corpus/watsonx-docsqa/docs/95c10fdc6d0c3b142da650044e1a0581d04ef8e4.md", + "title": "Creating a web chart (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_drug_web.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e8b776685a4c1ffcdc8f90c57c3ad7243a43b2b3.md", + "original_doc_id": "E8B776685A4C1FFCDC8F90C57C3AD7243A43B2B3", + "path": "corpus/watsonx-docsqa/docs/e8b776685a4c1ffcdc8f90c57c3ad7243a43b2b3.md", + "title": "Forecasting catalog sales (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_forecast.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b5873013457aaddcc20db880b3fc9d9bfb7bd348.md", + "original_doc_id": "B5873013457AADDCC20DB880B3FC9D9BFB7BD348", + "path": "corpus/watsonx-docsqa/docs/b5873013457aaddcc20db880b3fc9d9bfb7bd348.md", + "title": "ARIMA (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_forecast_arima.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/05f38627c9ec286ca7c379a31aa27392a65411ab.md", + "original_doc_id": "05F38627C9EC286CA7C379A31AA27392A65411AB", + "path": "corpus/watsonx-docsqa/docs/05f38627c9ec286ca7c379a31aa27392a65411ab.md", + "title": "Examing the data (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_forecast_data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2ed4d7860687b2ef6f85ff81b6af4cfd2c6ea839.md", + "original_doc_id": "2ED4D7860687B2EF6F85FF81B6AF4CFD2C6EA839", + "path": "corpus/watsonx-docsqa/docs/2ed4d7860687b2ef6f85ff81b6af4cfd2c6ea839.md", + "title": "Creating the flow (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_forecast_flow.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7394b97da7b0846274940f439675051521a7dd7c.md", + "original_doc_id": "7394B97DA7B0846274940F439675051521A7DD7C", + "path": "corpus/watsonx-docsqa/docs/7394b97da7b0846274940f439675051521a7dd7c.md", + "title": "Exponential smoothing (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_forecast_smoothing.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5ae2f0d8bd974c7393bc5ffa773b90fd0a2229b0.md", + "original_doc_id": "5AE2F0D8BD974C7393BC5FFA773B90FD0A2229B0", + "path": "corpus/watsonx-docsqa/docs/5ae2f0d8bd974c7393bc5ffa773b90fd0a2229b0.md", + "title": "Summary (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_forecast_summary.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/02244f39be9a15fa55c94c9f2775606247969a61.md", + "original_doc_id": "02244F39BE9A15FA55C94C9F2775606247969A61", + "path": "corpus/watsonx-docsqa/docs/02244f39be9a15fa55c94c9f2775606247969a61.md", + "title": "Introduction to modeling (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_intro.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a3022ff9db2732f0ab3091884b428763d3879fd2.md", + "original_doc_id": "A3022FF9DB2732F0AB3091884B428763D3879FD2", + "path": "corpus/watsonx-docsqa/docs/a3022ff9db2732f0ab3091884b428763d3879fd2.md", + "title": "Building the flow (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_intro_build.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9deac0e5b403baedeabe9c76a295651289e6416c.md", + "original_doc_id": "9DEAC0E5B403BAEDEABE9C76A295651289E6416C", + "path": "corpus/watsonx-docsqa/docs/9deac0e5b403baedeabe9c76a295651289e6416c.md", + "title": "Evaluating the model (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_intro_evaluate.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a62a258bb486fbe7e7fc91c611dc2bc400e32308.md", + "original_doc_id": "A62A258BB486FBE7E7FC91C611DC2BC400E32308", + "path": "corpus/watsonx-docsqa/docs/a62a258bb486fbe7e7fc91c611dc2bc400e32308.md", + "title": "Browsing the model (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_intro_nugget.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3cf77633a489e42b01086588d6613d65bfd51f7f.md", + "original_doc_id": "3CF77633A489E42B01086588D6613D65BFD51F7F", + "path": "corpus/watsonx-docsqa/docs/3cf77633a489e42b01086588d6613d65bfd51f7f.md", + "title": "Scoring records (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_intro_score.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f140f179614d126e483732933a5ca8dcf0a32876.md", + "original_doc_id": "F140F179614D126E483732933A5CA8DCF0A32876", + "path": "corpus/watsonx-docsqa/docs/f140f179614d126e483732933a5ca8dcf0a32876.md", + "title": "Summary (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_intro_summary.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2828fd5943abba08aa260f1080b850c90fc4efbe.md", + "original_doc_id": "2828FD5943ABBA08AA260F1080B850C90FC4EFBE", + "path": "corpus/watsonx-docsqa/docs/2828fd5943abba08aa260f1080b850c90fc4efbe.md", + "title": "Reducing input data string length (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_reducing.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/85381b4df6f42b35ca5097709523038abdcdc555.md", + "original_doc_id": "85381B4DF6F42B35CA5097709523038ABDCDC555", + "path": "corpus/watsonx-docsqa/docs/85381b4df6f42b35ca5097709523038abdcdc555.md", + "title": "Reclassifying the data (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_reducing_reclassify.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/75891659ab1df929d219741c3f2d69384a01835c.md", + "original_doc_id": "75891659AB1DF929D219741C3F2D69384A01835C", + "path": "corpus/watsonx-docsqa/docs/75891659ab1df929d219741c3f2d69384a01835c.md", + "title": "Retail sales promotion (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_retail.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6f55360d336a77a06f2c4235b286a869cff0986c.md", + "original_doc_id": "6F55360D336A77A06F2C4235B286A869CFF0986C", + "path": "corpus/watsonx-docsqa/docs/6f55360d336a77a06f2c4235b286a869cff0986c.md", + "title": "Examining the data (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_retail_data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1399cd9c09634e30c0f099c0fae66a756153dab1.md", + "original_doc_id": "1399CD9C09634E30C0F099C0FAE66A756153DAB1", + "path": "corpus/watsonx-docsqa/docs/1399cd9c09634e30c0f099c0fae66a756153dab1.md", + "title": "Learning and testing (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_retail_learn.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/420946ca7e893cc5a2b3d1a8f47a7a2c7059d7f6.md", + "original_doc_id": "420946CA7E893CC5A2B3D1A8F47A7A2C7059D7F6", + "path": "corpus/watsonx-docsqa/docs/420946ca7e893cc5a2b3d1a8f47a7a2c7059d7f6.md", + "title": "Screening predictors (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_screening.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5a328cf6319859f041c48974e44046bcfcea3b87.md", + "original_doc_id": "5A328CF6319859F041C48974E44046BCFCEA3B87", + "path": "corpus/watsonx-docsqa/docs/5a328cf6319859f041c48974e44046bcfcea3b87.md", + "title": "Building the flow (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_screening_flow.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9b120ff1f8482eb617e16738d5160c966c6edf3d.md", + "original_doc_id": "9B120FF1F8482EB617E16738D5160C966C6EDF3D", + "path": "corpus/watsonx-docsqa/docs/9b120ff1f8482eb617e16738d5160c966c6edf3d.md", + "title": "Building the models (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_screening_model.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c41c78f27bb2f48542141ea85eda7ad333e3fd0b.md", + "original_doc_id": "C41C78F27BB2F48542141EA85EDA7AD333E3FD0B", + "path": "corpus/watsonx-docsqa/docs/c41c78f27bb2f48542141ea85eda7ad333e3fd0b.md", + "title": "Making the offers to customers (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_selflearn.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7cef749c4ed4703d00346fcdef795d0431bc7c26.md", + "original_doc_id": "7CEF749C4ED4703D00346FCDEF795D0431BC7C26", + "path": "corpus/watsonx-docsqa/docs/7cef749c4ed4703d00346fcdef795d0431bc7c26.md", + "title": "Browsing the flow (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_selflearn_build.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/aa1c79d72d6a7d37ce1e72735b6dcfca2b546dce.md", + "original_doc_id": "AA1C79D72D6A7D37CE1E72735B6DCFCA2B546DCE", + "path": "corpus/watsonx-docsqa/docs/aa1c79d72d6a7d37ce1e72735b6dcfca2b546dce.md", + "title": "Browsing the model (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_selflearn_model.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bbb6fc842a370135b8488d9a2e09fcf17341954b.md", + "original_doc_id": "BBB6FC842A370135B8488D9A2E09FCF17341954B", + "path": "corpus/watsonx-docsqa/docs/bbb6fc842a370135b8488d9a2e09fcf17341954b.md", + "title": "Hotel satisfaction example for Text Analytics (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_ta_hotel.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1924ae74643c2d9d416204693c9bb84d5212e3b0.md", + "original_doc_id": "1924AE74643C2D9D416204693C9BB84D5212E3B0", + "path": "corpus/watsonx-docsqa/docs/1924ae74643c2d9d416204693c9bb84d5212e3b0.md", + "title": "Building an deploying the model (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_ta_hotel_build.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5e4d2166bb8c2b95e515591e014e7ca00b87bca2.md", + "original_doc_id": "5E4D2166BB8C2B95E515591E014E7CA00B87BCA2", + "path": "corpus/watsonx-docsqa/docs/5e4d2166bb8c2b95e515591e014e7ca00b87bca2.md", + "title": "Using the Text Analytics Workbench (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_ta_hotel_iwb.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f161a94239c1dc6696dbb583ec46bc64f3aa8906.md", + "original_doc_id": "F161A94239C1DC6696DBB583EC46BC64F3AA8906", + "path": "corpus/watsonx-docsqa/docs/f161a94239c1dc6696dbb583ec46bc64f3aa8906.md", + "title": "Text Link Analyisis node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_ta_hotel_tla.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e7fac7868f0d237efbfcc625d8c265aeebca3e7d.md", + "original_doc_id": "E7FAC7868F0D237EFBFCC625D8C265AEEBCA3E7D", + "path": "corpus/watsonx-docsqa/docs/e7fac7868f0d237efbfcc625d8c265aeebca3e7d.md", + "title": "Text Mining node (SPSS Modeler)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_ta_hotel_tm.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ed7afe85422b1db8eaed166840d275dddb63cafa.md", + "original_doc_id": "ED7AFE85422B1DB8EAED166840D275DDDB63CAFA", + "path": "corpus/watsonx-docsqa/docs/ed7afe85422b1db8eaed166840d275dddb63cafa.md", + "title": "Managing your account settings", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/account-settings.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/88bac0da2ccb09c93c0013a209147cc5a5dcee68.md", + "original_doc_id": "88BAC0DA2CCB09C93C0013A209147CC5A5DCEE68", + "path": "corpus/watsonx-docsqa/docs/88bac0da2ccb09c93c0013a209147cc5a5dcee68.md", + "title": "Managing the user API key", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-apikeys.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a10de0e026ba0cf397108621d5927e16436acf58.md", + "original_doc_id": "A10DE0E026BA0CF397108621D5927E16436ACF58", + "path": "corpus/watsonx-docsqa/docs/a10de0e026ba0cf397108621d5927e16436acf58.md", + "title": "Configuring App ID with your identity provider", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-appid-tips.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/77393f760a3a3f834809aca1078bdf229331c2fd.md", + "original_doc_id": "77393F760A3A3F834809ACA1078BDF229331C2FD", + "path": "corpus/watsonx-docsqa/docs/77393f760a3a3f834809aca1078bdf229331c2fd.md", + "title": "Overview for setting up IBM Cloud App ID (beta)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-appid.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/78a4d6515faa2766feb3a03ca6a378846cf33d83.md", + "original_doc_id": "78A4D6515FAA2766FEB3A03CA6A378846CF33D83", + "path": "corpus/watsonx-docsqa/docs/78a4d6515faa2766feb3a03ca6a378846cf33d83.md", + "title": "Managing all projects in the account", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-manage-projects.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/96c0566da4eb3450616c3f358c32837bfd4de6c8.md", + "original_doc_id": "96C0566DA4EB3450616C3F358C32837BFD4DE6C8", + "path": "corpus/watsonx-docsqa/docs/96c0566da4eb3450616c3f358c32837bfd4de6c8.md", + "title": "Removing users from the account or from the workspace", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-removeusers.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/28f15ac17715506bb29327874de7f76cb9fb2908.md", + "original_doc_id": "28F15AC17715506BB29327874DE7F76CB9FB2908", + "path": "corpus/watsonx-docsqa/docs/28f15ac17715506bb29327874de7f76cb9fb2908.md", + "title": "Administering your accounts and services", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/administer-accounts.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6e25d98279484e1d63cdeefdd1d6a9f1917f1ba8.md", + "original_doc_id": "6E25D98279484E1D63CDEEFDD1D6A9F1917F1BA8", + "path": "corpus/watsonx-docsqa/docs/6e25d98279484e1d63cdeefdd1d6a9f1917f1ba8.md", + "title": "Activity Tracker events", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/at-events.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2c6b0f77c4ca0cafb52e1fe3e10800d56015cadf.md", + "original_doc_id": "2C6B0F77C4CA0CAFB52E1FE3E10800D56015CADF", + "path": "corpus/watsonx-docsqa/docs/2c6b0f77c4ca0cafb52e1fe3e10800d56015cadf.md", + "title": "Creating and managing IBM Cloud services", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/create-services.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a392bddead4f42155dc83fba8512775db313fc53.md", + "original_doc_id": "A392BDDEAD4F42155DC83FBA8512775DB313FC53", + "path": "corpus/watsonx-docsqa/docs/a392bddead4f42155dc83fba8512775db313fc53.md", + "title": "Securing connections to services with private service endpoints", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/endpoints-vrf.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/71c98b1ae9bb65177c030cf1de6760d41b7d7df5.md", + "original_doc_id": "71C98B1AE9BB65177C030CF1DE6760D41B7D7DF5", + "path": "corpus/watsonx-docsqa/docs/71c98b1ae9bb65177c030cf1de6760d41b7d7df5.md", + "title": "Firewall access for Cloud Object Storage", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall-cfg-private-cos.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3d1b3c707202f30f8995025f356f82abbe685b93.md", + "original_doc_id": "3D1B3C707202F30F8995025F356F82ABBE685B93", + "path": "corpus/watsonx-docsqa/docs/3d1b3c707202f30f8995025f356f82abbe685b93.md", + "title": "Firewall access for Watson Studio", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall-dsx.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/34974dee293ba190cfa1b3383eb2417d0fd4b601.md", + "original_doc_id": "34974DEE293BA190CFA1B3383EB2417D0FD4B601", + "path": "corpus/watsonx-docsqa/docs/34974dee293ba190cfa1b3383eb2417d0fd4b601.md", + "title": "Firewall access for AWS Redshift", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall-redshift.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/648122bed05213950c23287cb4845fa56660232b.md", + "original_doc_id": "648122BED05213950C23287CB4845FA56660232B", + "path": "corpus/watsonx-docsqa/docs/648122bed05213950c23287cb4845fa56660232b.md", + "title": "Firewall access for Spark", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall-spark.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e732dfb3c4f38abecba99da31750fb6291560db5.md", + "original_doc_id": "E732DFB3C4F38ABECBA99DA31750FB6291560DB5", + "path": "corpus/watsonx-docsqa/docs/e732dfb3c4f38abecba99da31750fb6291560db5.md", + "title": "Firewall access for Watson Machine Learning", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall-wml.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e176531ba95036356a7e5dca50a8df728c78ce79.md", + "original_doc_id": "E176531BA95036356A7E5DCA50A8DF728C78CE79", + "path": "corpus/watsonx-docsqa/docs/e176531ba95036356a7e5dca50a8df728c78ce79.md", + "title": "Firewall access for the platform", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall_cfg.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e7b64045af2c3ff02183fb1ccc036327cee5e971.md", + "original_doc_id": "E7B64045AF2C3FF02183FB1CCC036327CEE5E971", + "path": "corpus/watsonx-docsqa/docs/e7b64045af2c3ff02183fb1ccc036327cee5e971.md", + "title": "Configuring firewall access", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall_ovrvw.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9e71f112f9af39e61a59914d87689b4b8db13f50.md", + "original_doc_id": "9E71F112F9AF39E61A59914D87689B4B8DB13F50", + "path": "corpus/watsonx-docsqa/docs/9e71f112f9af39e61a59914d87689b4b8db13f50.md", + "title": "Integrating with AWS", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/int-aws.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/496c8703eba5c4c6bcd6d65ee60d3e768f1bf071.md", + "original_doc_id": "496C8703EBA5C4C6BCD6D65EE60D3E768F1BF071", + "path": "corpus/watsonx-docsqa/docs/496c8703eba5c4c6bcd6d65ee60d3e768f1bf071.md", + "title": "Integrating with Microsoft Azure", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/int-azure.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/72b9ec702c95ac86de08e0fb8f8c3404b1228b5f.md", + "original_doc_id": "72B9EC702C95AC86DE08E0FB8F8C3404B1228B5F", + "path": "corpus/watsonx-docsqa/docs/72b9ec702c95ac86de08e0fb8f8c3404b1228b5f.md", + "title": "Integrations with other cloud platforms", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/int-cloud.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cb81643be8ee3b3dc2f6bccdb77bd2cec32c8926.md", + "original_doc_id": "CB81643BE8EE3B3DC2F6BCCDB77BD2CEC32C8926", + "path": "corpus/watsonx-docsqa/docs/cb81643be8ee3b3dc2f6bccdb77bd2cec32c8926.md", + "title": "Integrating with Google Cloud Platform", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/int-google.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e6a30655cbd3745acbcbf18e79b4c3979ca6b35b.md", + "original_doc_id": "E6A30655CBD3745ACBCBF18E79B4C3979CA6B35B", + "path": "corpus/watsonx-docsqa/docs/e6a30655cbd3745acbcbf18e79b4c3979ca6b35b.md", + "title": "Managing your IBM Cloud account", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/manage-account.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/beda84e76e7f8fa5594f63e640dc17b4f6cb3e5e.md", + "original_doc_id": "BEDA84E76E7F8FA5594F63E640DC17B4F6CB3E5E", + "path": "corpus/watsonx-docsqa/docs/beda84e76e7f8fa5594f63e640dc17b4f6cb3e5e.md", + "title": "Monitoring account resource usage", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c4e83640891ea5d02eae76027d05fdefe2c4effe.md", + "original_doc_id": "C4E83640891EA5D02EAE76027D05FDEFE2C4EFFE", + "path": "corpus/watsonx-docsqa/docs/c4e83640891ea5d02eae76027d05fdefe2c4effe.md", + "title": "Managing your settings", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/personal-settings.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fa4acdc5db590992630c704d00defb142f2f0489.md", + "original_doc_id": "FA4ACDC5DB590992630C704D00DEFB142F2F0489", + "path": "corpus/watsonx-docsqa/docs/fa4acdc5db590992630c704d00defb142f2f0489.md", + "title": "Object storage for workspaces", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/storage-options.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/26fb8b86499454efd078384d70b02917d1c7dae1.md", + "original_doc_id": "26FB8B86499454EFD078384D70B02917D1C7DAE1", + "path": "corpus/watsonx-docsqa/docs/26fb8b86499454efd078384d70b02917d1c7dae1.md", + "title": "Services and integrations", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/svc-int.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0b4e34a88c9328ec6e0cc8a690b466f441e5efc6.md", + "original_doc_id": "0B4E34A88C9328EC6E0CC8A690B466F441E5EFC6", + "path": "corpus/watsonx-docsqa/docs/0b4e34a88c9328ec6e0cc8a690b466f441e5efc6.md", + "title": "Upgrading services on IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/upgrade.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4bfeb479bcb6bbd28dd18ec423fdc5fb9c39b4b6.md", + "original_doc_id": "4BFEB479BCB6BBD28DD18EC423FDC5FB9C39B4B6", + "path": "corpus/watsonx-docsqa/docs/4bfeb479bcb6bbd28dd18ec423fdc5fb9c39b4b6.md", + "title": "Determining your roles and permissions", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/your-roles.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8b34ded3493e5181b1d19f6d14a9598cfeaa5997.md", + "original_doc_id": "8B34DED3493E5181B1D19F6D14A9598CFEAA5997", + "path": "corpus/watsonx-docsqa/docs/8b34ded3493e5181b1d19f6d14a9598cfeaa5997.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a304b9e82543c150236ecad30f1594e1b832b8b1.md", + "original_doc_id": "A304B9E82543C150236ECAD30F1594E1B832B8B1", + "path": "corpus/watsonx-docsqa/docs/a304b9e82543c150236ecad30f1594e1b832b8b1.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/attribute-inference-attack.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/857c8c3489ac9b2891ed1ae9c81ea881cf1ced80.md", + "original_doc_id": "857C8C3489AC9B2891ED1AE9C81EA881CF1CED80", + "path": "corpus/watsonx-docsqa/docs/857c8c3489ac9b2891ed1ae9c81ea881cf1ced80.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/benign-advice.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bc8e9394d23a5320bfce0ebe7f208ca18cb6b65c.md", + "original_doc_id": "BC8E9394D23A5320BFCE0EBE7F208CA18CB6B65C", + "path": "corpus/watsonx-docsqa/docs/bc8e9394d23a5320bfce0ebe7f208ca18cb6b65c.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/bias.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f6cc81e55c6aad12849a56837f14538576f5a42c.md", + "original_doc_id": "F6CC81E55C6AAD12849A56837F14538576F5A42C", + "path": "corpus/watsonx-docsqa/docs/f6cc81e55c6aad12849a56837f14538576f5a42c.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/confidential-data-disclosure.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2d3a398b8394671d9383f214ff5e69a00391bb22.md", + "original_doc_id": "2D3A398B8394671D9383F214FF5E69A00391BB22", + "path": "corpus/watsonx-docsqa/docs/2d3a398b8394671d9383f214ff5e69a00391bb22.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/confidential-data-in-prompt.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c9fb652c433a0a0bc419cbfe4ecc3680252d2fe3.md", + "original_doc_id": "C9FB652C433A0A0BC419CBFE4ECC3680252D2FE3", + "path": "corpus/watsonx-docsqa/docs/c9fb652c433a0a0bc419cbfe4ecc3680252d2fe3.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/copyright-infringement.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6bff9c4db2bb43376a2a2cd681714ed3273e991e.md", + "original_doc_id": "6BFF9C4DB2BB43376A2A2CD681714ED3273E991E", + "path": "corpus/watsonx-docsqa/docs/6bff9c4db2bb43376a2a2cd681714ed3273e991e.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/dangerous-use.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c2f1ff7794524db18ee5fadfaa7232d0a94f8b4c.md", + "original_doc_id": "C2F1FF7794524DB18EE5FADFAA7232D0A94F8B4C", + "path": "corpus/watsonx-docsqa/docs/c2f1ff7794524db18ee5fadfaa7232d0a94f8b4c.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-aquisition.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6bc478053fefd091742c6775dfac9eb5b8c4923f.md", + "original_doc_id": "6BC478053FEFD091742C6775DFAC9EB5B8C4923F", + "path": "corpus/watsonx-docsqa/docs/6bc478053fefd091742c6775dfac9eb5b8c4923f.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-curation.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c471b8b14614c985391115ec1ed53e0b56d2e27e.md", + "original_doc_id": "C471B8B14614C985391115EC1ED53E0B56D2E27E", + "path": "corpus/watsonx-docsqa/docs/c471b8b14614c985391115ec1ed53e0b56d2e27e.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-poisoning.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/773f81dd69d3adbbe1998ff5974ca83347effc76.md", + "original_doc_id": "773F81DD69D3ADBBE1998FF5974CA83347EFFC76", + "path": "corpus/watsonx-docsqa/docs/773f81dd69d3adbbe1998ff5974ca83347effc76.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-privacy-rights.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/40d279ada16512e67b7fb78fdac4ada9cfe5c645.md", + "original_doc_id": "40D279ADA16512E67B7FB78FDAC4ADA9CFE5C645", + "path": "corpus/watsonx-docsqa/docs/40d279ada16512e67b7fb78fdac4ada9cfe5c645.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-provenance.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c8816bf425ef039884dbf6a7282f8d7adb7c5d04.md", + "original_doc_id": "C8816BF425EF039884DBF6A7282F8D7ADB7C5D04", + "path": "corpus/watsonx-docsqa/docs/c8816bf425ef039884dbf6a7282f8d7adb7c5d04.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-transfer.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/221f46d0a3c2c3d3a623be815b45e8b90af61340.md", + "original_doc_id": "221F46D0A3C2C3D3A623BE815B45E8B90AF61340", + "path": "corpus/watsonx-docsqa/docs/221f46d0a3c2c3d3a623be815b45e8b90af61340.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-transparency.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/34ffe04319ce15e4451729b183c35f288a58a1b7.md", + "original_doc_id": "34FFE04319CE15E4451729B183C35F288A58A1B7", + "path": "corpus/watsonx-docsqa/docs/34ffe04319ce15e4451729b183c35f288a58a1b7.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-usage-rights.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b00beb80e522d712dc9062f835ad10e787b8c5fc.md", + "original_doc_id": "B00BEB80E522D712DC9062F835AD10E787B8C5FC", + "path": "corpus/watsonx-docsqa/docs/b00beb80e522d712dc9062f835ad10e787b8c5fc.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-usage.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/dd88591c39c90f2cf211c3ee3330b7e7939c3472.md", + "original_doc_id": "DD88591C39C90F2CF211C3EE3330B7E7939C3472", + "path": "corpus/watsonx-docsqa/docs/dd88591c39c90f2cf211c3ee3330b7e7939c3472.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/decision-bias.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c7049b7393149edc2256a9d4edb1d6e5a6e24b72.md", + "original_doc_id": "C7049B7393149EDC2256A9D4EDB1D6E5A6E24B72", + "path": "corpus/watsonx-docsqa/docs/c7049b7393149edc2256a9d4edb1d6e5a6e24b72.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/downstream-retraining.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e3e5fa98908eee308d960761e9f29cf7a8aad690.md", + "original_doc_id": "E3E5FA98908EEE308D960761E9F29CF7A8AAD690", + "path": "corpus/watsonx-docsqa/docs/e3e5fa98908eee308d960761e9f29cf7a8aad690.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/evasion-attack.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6b6f04aa6bbd6be14b11ea62aa0d844979bdfcdf.md", + "original_doc_id": "6B6F04AA6BBD6BE14B11EA62AA0D844979BDFCDF", + "path": "corpus/watsonx-docsqa/docs/6b6f04aa6bbd6be14b11ea62aa0d844979bdfcdf.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/explaining-output.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/eaef856f725cd9a9605000f3ae98cbe61a9f50f0.md", + "original_doc_id": "EAEF856F725CD9A9605000F3AE98CBE61A9F50F0", + "path": "corpus/watsonx-docsqa/docs/eaef856f725cd9a9605000f3ae98cbe61a9f50f0.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/extraction-attack.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/339c9129c24aab66eeaf55a9f003f6501f72b81b.md", + "original_doc_id": "339C9129C24AAB66EEAF55A9F003F6501F72B81B", + "path": "corpus/watsonx-docsqa/docs/339c9129c24aab66eeaf55a9f003f6501f72b81b.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/hallucination.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/658967520625fac8039485004a1e80c32992077e.md", + "original_doc_id": "658967520625FAC8039485004A1E80C32992077E", + "path": "corpus/watsonx-docsqa/docs/658967520625fac8039485004a1e80c32992077e.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/harmful-code-generation.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e5e1d00dc75181ede4fc66bdc17bf3c07eb314ec.md", + "original_doc_id": "E5E1D00DC75181EDE4FC66BDC17BF3C07EB314EC", + "path": "corpus/watsonx-docsqa/docs/e5e1d00dc75181ede4fc66bdc17bf3c07eb314ec.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/improper-usage.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d778df3dc8ef2d3ab4ec511b8d20d35778794b93.md", + "original_doc_id": "D778DF3DC8EF2D3AB4EC511B8D20D35778794B93", + "path": "corpus/watsonx-docsqa/docs/d778df3dc8ef2d3ab4ec511b8d20d35778794b93.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/inaccessible-training-data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2ef8007555bc60cd700ba44ecc0fafaa024f4bc0.md", + "original_doc_id": "2EF8007555BC60CD700BA44ECC0FAFAA024F4BC0", + "path": "corpus/watsonx-docsqa/docs/2ef8007555bc60cd700ba44ecc0fafaa024f4bc0.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/jailbreaking.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/807d82c6eeebd0513a794637ebd90caa19f318e7.md", + "original_doc_id": "807D82C6EEEBD0513A794637EBD90CAA19F318E7", + "path": "corpus/watsonx-docsqa/docs/807d82c6eeebd0513a794637ebd90caa19f318e7.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/membership-inference-attack.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a6ff5c1e6cf7c4ba30f191df892dc3296f9b8ce3.md", + "original_doc_id": "A6FF5C1E6CF7C4BA30F191DF892DC3296F9B8CE3", + "path": "corpus/watsonx-docsqa/docs/a6ff5c1e6cf7c4ba30f191df892dc3296f9b8ce3.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/non-disclosure.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/589d9b0a7150af5485e6f7452eb39d15addb35f9.md", + "original_doc_id": "589D9B0A7150AF5485E6F7452EB39D15ADDB35F9", + "path": "corpus/watsonx-docsqa/docs/589d9b0a7150af5485e6f7452eb39d15addb35f9.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/nonconsensual-use.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c2da4bde14d0a2da1e0e2d795e7dc7469f422db9.md", + "original_doc_id": "C2DA4BDE14D0A2DA1E0E2D795E7DC7469F422DB9", + "path": "corpus/watsonx-docsqa/docs/c2da4bde14d0a2da1e0e2d795e7dc7469f422db9.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/output-bias.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9cad0018634ff820d32f3fe714194d4bd42c5386.md", + "original_doc_id": "9CAD0018634FF820D32F3FE714194D4BD42C5386", + "path": "corpus/watsonx-docsqa/docs/9cad0018634ff820d32f3fe714194d4bd42c5386.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/personal-information-in-data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2baf01b064f3005647a010df369cc49c6534ffb3.md", + "original_doc_id": "2BAF01B064F3005647A010DF369CC49C6534FFB3", + "path": "corpus/watsonx-docsqa/docs/2baf01b064f3005647a010df369cc49c6534ffb3.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/personal-information-in-output.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c709b8079f21daa0ee315823a6713b556ac2789b.md", + "original_doc_id": "C709B8079F21DAA0EE315823A6713B556AC2789B", + "path": "corpus/watsonx-docsqa/docs/c709b8079f21daa0ee315823a6713b556ac2789b.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/personal-information-in-prompt.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ba4ad6d42d951b1247e54e312c04749fd8ea2fd1.md", + "original_doc_id": "BA4AD6D42D951B1247E54E312C04749FD8EA2FD1", + "path": "corpus/watsonx-docsqa/docs/ba4ad6d42d951b1247e54e312c04749fd8ea2fd1.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/physical-harm.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/731b218e6e141e88f850b673227ab3c4df19392e.md", + "original_doc_id": "731B218E6E141E88F850B673227AB3C4DF19392E", + "path": "corpus/watsonx-docsqa/docs/731b218e6e141e88f850b673227ab3c4df19392e.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/prompt-injection.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f8026e82645eb65bd5e2741bc4df0e63da748b47.md", + "original_doc_id": "F8026E82645EB65BD5E2741BC4DF0E63DA748B47", + "path": "corpus/watsonx-docsqa/docs/f8026e82645eb65bd5e2741bc4df0e63da748b47.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/prompt-leaking.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/af19b6a59e167d486d94f4bbb3724ce1deae5feb.md", + "original_doc_id": "AF19B6A59E167D486D94F4BBB3724CE1DEAE5FEB", + "path": "corpus/watsonx-docsqa/docs/af19b6a59e167d486d94f4bbb3724ce1deae5feb.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/prompt-priming.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a3ae0828d8e261dbc23b466d22ab46c1dd65b710.md", + "original_doc_id": "A3AE0828D8E261DBC23B466D22AB46C1DD65B710", + "path": "corpus/watsonx-docsqa/docs/a3ae0828d8e261dbc23b466d22ab46c1dd65b710.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/reidentification.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/92bd6d892feb4829f9c49afcf79cdc323be66cc4.md", + "original_doc_id": "92BD6D892FEB4829F9C49AFCF79CDC323BE66CC4", + "path": "corpus/watsonx-docsqa/docs/92bd6d892feb4829f9c49afcf79cdc323be66cc4.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/spreading-disinformation.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/effb546fc8c21e2c0e9bb87b259bd34b91d4f0dd.md", + "original_doc_id": "EFFB546FC8C21E2C0E9BB87B259BD34B91D4F0DD", + "path": "corpus/watsonx-docsqa/docs/effb546fc8c21e2c0e9bb87b259bd34b91d4f0dd.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/toxic-output.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1e28b88cde98715bcd89dcf48a459002fcda1e0e.md", + "original_doc_id": "1E28B88CDE98715BCD89DCF48A459002FCDA1E0E", + "path": "corpus/watsonx-docsqa/docs/1e28b88cde98715bcd89dcf48a459002fcda1e0e.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/toxicity.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c9769e4047faf3c5f55b2a7bd5fcce3e321870e6.md", + "original_doc_id": "C9769E4047FAF3C5F55B2A7BD5FCCE3E321870E6", + "path": "corpus/watsonx-docsqa/docs/c9769e4047faf3c5f55b2a7bd5fcce3e321870e6.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/trust-calibration.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d669435b8d1c91d913bd24768e52644b95c675ae.md", + "original_doc_id": "D669435B8D1C91D913BD24768E52644B95C675AE", + "path": "corpus/watsonx-docsqa/docs/d669435b8d1c91d913bd24768e52644b95c675ae.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/unreliable-source-attribution.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6903d3dd91aaa7af3f53d389677d92632e24aef1.md", + "original_doc_id": "6903D3DD91AAA7AF3F53D389677D92632E24AEF1", + "path": "corpus/watsonx-docsqa/docs/6903d3dd91aaa7af3f53d389677d92632e24aef1.md", + "title": "{{ document.title.text }}", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/untraceable-attribution.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ec433541f7f0c2dc7620ff10cf44884f96ef7aa5.md", + "original_doc_id": "EC433541F7F0C2DC7620FF10CF44884F96EF7AA5", + "path": "corpus/watsonx-docsqa/docs/ec433541f7f0c2dc7620ff10cf44884f96ef7aa5.md", + "title": "Importing scripts into a notebook", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/add-script-to-notebook.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3f3162bcd9976ed764717aa7004d9a755648b465.md", + "original_doc_id": "3F3162BCD9976ED764717AA7004D9A755648B465", + "path": "corpus/watsonx-docsqa/docs/3f3162bcd9976ed764717aa7004d9a755648b465.md", + "title": "Building an AutoAI model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-build.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/69eaabe17802ed870302f2d2789b3b476dfdd11f.md", + "original_doc_id": "69EAABE17802ED870302F2D2789B3B476DFDD11F", + "path": "corpus/watsonx-docsqa/docs/69eaabe17802ed870302f2d2789b3b476dfdd11f.md", + "title": "Configuring a classification or regression experiment", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-config-class.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9cfb0a5fa276072e73c152485022c9a3eafcc233.md", + "original_doc_id": "9CFB0A5FA276072E73C152485022C9A3EAFCC233", + "path": "corpus/watsonx-docsqa/docs/9cfb0a5fa276072e73c152485022c9a3eafcc233.md", + "title": "Data imputation implementation details for time series experiments", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-data-imp-details.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ebb83f528ac02840efe18510ed95979d2cda5641.md", + "original_doc_id": "EBB83F528AC02840EFE18510ED95979D2CDA5641", + "path": "corpus/watsonx-docsqa/docs/ebb83f528ac02840efe18510ed95979d2cda5641.md", + "title": "AutoAI implementation details", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3f0b3a581945a1c7fe243340843cc4671a4e32c6.md", + "original_doc_id": "3F0B3A581945A1C7FE243340843CC4671A4E32C6", + "path": "corpus/watsonx-docsqa/docs/3f0b3a581945a1c7fe243340843cc4671a4e32c6.md", + "title": "Applying fairness testing to AutoAI experiments", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-fairness.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5042fbfb0c15aeded02ff805c4869ac838910c7a.md", + "original_doc_id": "5042FBFB0C15AEDED02FF805C4869AC838910C7A", + "path": "corpus/watsonx-docsqa/docs/5042fbfb0c15aeded02ff805c4869ac838910c7a.md", + "title": "AutoAI glossary", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-glossary.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/73f96a06142ee17a6c55e5700580f33250552a00.md", + "original_doc_id": "73F96A06142EE17A6C55E5700580F33250552A00", + "path": "corpus/watsonx-docsqa/docs/73f96a06142ee17a6c55e5700580f33250552a00.md", + "title": "Data imputation in AutoAI experiments", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-imputation.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/83cd92cdb99db6263492fad998e932f50f0f8e99.md", + "original_doc_id": "83CD92CDB99DB6263492FAD998E932F50F0F8E99", + "path": "corpus/watsonx-docsqa/docs/83cd92cdb99db6263492fad998e932f50f0f8e99.md", + "title": "AutoAI libraries for Python", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-lib-python.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/07a75b90684d731c6b33fc552585d391e86a2a35.md", + "original_doc_id": "07A75B90684D731C6B33FC552585D391E86A2A35", + "path": "corpus/watsonx-docsqa/docs/07a75b90684d731c6b33fc552585d391e86a2a35.md", + "title": "Saving an AutoAI generated notebook", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-notebook.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/91eeb0303c78ec7eaa6dab7921e7173c68ff7769.md", + "original_doc_id": "91EEB0303C78EC7EAA6DAB7921E7173C68FF7769", + "path": "corpus/watsonx-docsqa/docs/91eeb0303c78ec7eaa6dab7921e7173c68ff7769.md", + "title": "AutoAI Overview", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2757f7f9b9e4975b9e53da5b4508ff9d7a41a0a4.md", + "original_doc_id": "2757F7F9B9E4975B9E53DA5B4508FF9D7A41A0A4", + "path": "corpus/watsonx-docsqa/docs/2757f7f9b9e4975b9e53da5b4508ff9d7a41a0a4.md", + "title": "Creating a text analysis experiment", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-text-analysis.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/510bb82156702471c527d6ef7e51fe69ef746004.md", + "original_doc_id": "510BB82156702471C527D6EF7E51FE69EF746004", + "path": "corpus/watsonx-docsqa/docs/510bb82156702471c527d6ef7e51fe69ef746004.md", + "title": "Time series implementation details", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries-details.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7b8b04b66e56fa847f1aca3218eb99f3e568eec7.md", + "original_doc_id": "7B8B04B66E56FA847F1ACA3218EB99F3E568EEC7", + "path": "corpus/watsonx-docsqa/docs/7b8b04b66e56fa847f1aca3218eb99f3e568eec7.md", + "title": "Building a time series experiment", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/163eeb3dbaff3b01d831f717eeb7487642c93080.md", + "original_doc_id": "163EEB3DBAFF3B01D831F717EEB7487642C93080", + "path": "corpus/watsonx-docsqa/docs/163eeb3dbaff3b01d831f717eeb7487642c93080.md", + "title": "Troubleshooting AutoAI experiments", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-troubleshoot.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6b81f2288b810e3ffdd2de5ace4e13e3a90e1e10.md", + "original_doc_id": "6B81F2288B810E3FFDD2DE5ACE4E13E3A90E1E10", + "path": "corpus/watsonx-docsqa/docs/6b81f2288b810e3ffdd2de5ace4e13e3a90e1e10.md", + "title": "Tutorial: Create a time series anomaly prediction experiment", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-ap-tutorial.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b23f48a4757500fea641245cffa69cb3b72ae0e8.md", + "original_doc_id": "B23F48A4757500FEA641245CFFA69CB3B72AE0E8", + "path": "corpus/watsonx-docsqa/docs/b23f48a4757500fea641245cffa69cb3b72ae0e8.md", + "title": "Creating a time series anomaly prediction (Beta)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-ap.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ad76780ea50a0fb37454a3a03ff08ca0ad39ef19.md", + "original_doc_id": "AD76780EA50A0FB37454A3A03FF08CA0AD39EF19", + "path": "corpus/watsonx-docsqa/docs/ad76780ea50a0fb37454a3a03ff08ca0ad39ef19.md", + "title": "Scoring a time series model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-score.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/99843122c08d0d70ed3694a57482595e35fb0d8b.md", + "original_doc_id": "99843122C08D0D70ED3694A57482595E35FB0D8B", + "path": "corpus/watsonx-docsqa/docs/99843122c08d0d70ed3694a57482595e35fb0d8b.md", + "title": "Tutorial: AutoAI multivariate time series experiment with Supporting features", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-tut-sup.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3af15cb9e302a9e0d7de22de648ef7b3dca1d865.md", + "original_doc_id": "3AF15CB9E302A9E0D7DE22DE648EF7B3DCA1D865", + "path": "corpus/watsonx-docsqa/docs/3af15cb9e302a9e0d7de22de648ef7b3dca1d865.md", + "title": "Tutorial: AutoAI univariate time series experiment", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-uni-tutorial.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/46b746b11cf60709bcea7f7c2c0aa1ec0ada5bc9.md", + "original_doc_id": "46B746B11CF60709BCEA7F7C2C0AA1EC0ADA5BC9", + "path": "corpus/watsonx-docsqa/docs/46b746b11cf60709bcea7f7c2c0aa1ec0ada5bc9.md", + "title": "Selecting an AutoAI model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-view-results.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c926dfb3758881e6698f630e496f3817101e4176.md", + "original_doc_id": "C926DFB3758881E6698F630E496F3817101E4176", + "path": "corpus/watsonx-docsqa/docs/c926dfb3758881e6698f630e496f3817101e4176.md", + "title": "AutoAI tutorial: Build a Binary Classification Model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai_example_binary_classifier.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7bf4b8f1f49406eec43be3b7350092f9165b0757.md", + "original_doc_id": "7BF4B8F1F49406EEC43BE3B7350092F9165B0757", + "path": "corpus/watsonx-docsqa/docs/7bf4b8f1f49406eec43be3b7350092f9165b0757.md", + "title": "SPSS predictive analytics classification and regression algorithms in notebooks", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/classificationandregression-guides.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ce1b598a354c454f2d201039a2bb6d69babbf840.md", + "original_doc_id": "CE1B598A354C454F2D201039A2BB6D69BABBF840", + "path": "corpus/watsonx-docsqa/docs/ce1b598a354c454f2d201039a2bb6d69babbf840.md", + "title": "SPSS predictive analytics clustering algorithms in notebooks", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/clustering-guides.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ad5b9969c7557bfc4cfbb32cca67f40c52ff824b.md", + "original_doc_id": "AD5B9969C7557BFC4CFBB32CCA67F40C52FF824B", + "path": "corpus/watsonx-docsqa/docs/ad5b9969c7557bfc4cfbb32cca67f40c52ff824b.md", + "title": "Coding and running a notebook", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/code-run-notebooks.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4562c632e1cfaaedde1374b29bdd1a1cce5ece86.md", + "original_doc_id": "4562C632E1CFAAEDDE1374B29BDD1A1CCE5ECE86", + "path": "corpus/watsonx-docsqa/docs/4562c632e1cfaaedde1374b29bdd1a1cce5ece86.md", + "title": "Deployment space collaborator roles and permissions", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/collaborator-permissions-wml.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bf75f233fdffdca8a25d191e1df4df7f51e30823.md", + "original_doc_id": "BF75F233FDFFDCA8A25D191E1DF4DF7F51E30823", + "path": "corpus/watsonx-docsqa/docs/bf75f233fdffdca8a25d191e1df4df7f51e30823.md", + "title": "Creating environment templates", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-customize-env-definition.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d21cd926ca1fe170c8c1645ca0ec65aedddb4aef.md", + "original_doc_id": "D21CD926CA1FE170C8C1645CA0EC65AEDDDB4AEF", + "path": "corpus/watsonx-docsqa/docs/d21cd926ca1fe170c8c1645ca0ec65aedddb4aef.md", + "title": "Publishing a notebook as a gist", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-gist.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/11a093cb8f1d24ea066663b3991084a84fc32bf2.md", + "original_doc_id": "11A093CB8F1D24EA066663B3991084A84FC32BF2", + "path": "corpus/watsonx-docsqa/docs/11a093cb8f1d24ea066663b3991084a84fc32bf2.md", + "title": "Creating jobs in deployment spaces", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-jobs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d1afa9bb4e0475a56190dc8254e004308bea484d.md", + "original_doc_id": "D1AFA9BB4E0475A56190DC8254E004308BEA484D", + "path": "corpus/watsonx-docsqa/docs/d1afa9bb4e0475a56190dc8254e004308bea484d.md", + "title": "Creating notebooks", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/creating-notebooks.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3b2719c3b56d1bd40fa0d8c6853ddd078fd13d94.md", + "original_doc_id": "3B2719C3B56D1BD40FA0D8C6853DDD078FD13D94", + "path": "corpus/watsonx-docsqa/docs/3b2719c3b56d1bd40fa0d8c6853ddd078fd13d94.md", + "title": "Customizing environment templates", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/customize-envs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/04b717fd06c5d906268e8530f4b521686065c6d5.md", + "original_doc_id": "04B717FD06C5D906268E8530F4B521686065C6D5", + "path": "corpus/watsonx-docsqa/docs/04b717fd06c5d906268e8530f4b521686065c6d5.md", + "title": "Data load support", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-load-support.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e0e5646ea00a170bb595e9e0bbccb69f702ffc7c.md", + "original_doc_id": "E0E5646EA00A170BB595E9E0BBCCB69F702FFC7C", + "path": "corpus/watsonx-docsqa/docs/e0e5646ea00a170bb595e9e0bbccb69f702ffc7c.md", + "title": "Analyzing data and working with models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-science.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/89f9e0463d14ded51b14392a4fd7a69bb53fa1bf.md", + "original_doc_id": "89F9E0463D14DED51B14392A4FD7A69BB53FA1BF", + "path": "corpus/watsonx-docsqa/docs/89f9e0463d14ded51b14392a4fd7a69bb53fa1bf.md", + "title": "Data skipping for Spark SQL", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-skipping-spark-sql.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e0b0b51cd757048207eefe4ec8f1e98e967d9e69.md", + "original_doc_id": "E0B0B51CD757048207EEFE4EC8F1E98E967D9E69", + "path": "corpus/watsonx-docsqa/docs/e0b0b51cd757048207eefe4ec8f1e98e967d9e69.md", + "title": "SPSS predictive analytics data preparation algorithms in notebooks", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/datapreparation-guides.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3ca99c6ef4745121c9865ab4119f3ab1b1a3bdb1.md", + "original_doc_id": "3CA99C6EF4745121C9865AB4119F3AB1B1A3BDB1", + "path": "corpus/watsonx-docsqa/docs/3ca99c6ef4745121c9865ab4119f3ab1b1a3bdb1.md", + "title": "Data sources for scoring batch deployments", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-data-sources.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/653ffedfac00f360750f776a3a60f6aad38ed954.md", + "original_doc_id": "653FFEDFAC00F360750F776A3A60F6AAD38ED954", + "path": "corpus/watsonx-docsqa/docs/653ffedfac00f360750f776a3a60f6aad38ed954.md", + "title": "Creating batch deployments in Watson Machine Learning", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-details.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7f755b81ab25cbd0950d528a240b12262fe6ca08.md", + "original_doc_id": "7F755B81AB25CBD0950D528A240B12262FE6CA08", + "path": "corpus/watsonx-docsqa/docs/7f755b81ab25cbd0950d528a240b12262fe6ca08.md", + "title": "Batch deployment input details for AutoAI models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-autoai.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4c6242d9f2b3e125780fdf188f994270a6e2340d.md", + "original_doc_id": "4C6242D9F2B3E125780FDF188F994270A6E2340D", + "path": "corpus/watsonx-docsqa/docs/4c6242d9f2b3e125780fdf188f994270a6e2340d.md", + "title": "Batch deployment input details by framework", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-by-framework.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/722d44681192f1766a0b1bacc328e719526e8de2.md", + "original_doc_id": "722D44681192F1766A0B1BACC328E719526E8DE2", + "path": "corpus/watsonx-docsqa/docs/722d44681192f1766a0b1bacc328e719526e8de2.md", + "title": "Batch deployment input details for Decision Optimization models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-do.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4f89e6b2b76e64b9618f799611dd1b053d045222.md", + "original_doc_id": "4F89E6B2B76E64B9618F799611DD1B053D045222", + "path": "corpus/watsonx-docsqa/docs/4f89e6b2b76e64b9618f799611dd1b053d045222.md", + "title": "Batch deployment input details for Python functions", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-py-function.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/85a8f36d819b12b355508090e787f4a182686394.md", + "original_doc_id": "85A8F36D819B12B355508090E787F4A182686394", + "path": "corpus/watsonx-docsqa/docs/85a8f36d819b12b355508090e787f4a182686394.md", + "title": "Batch deployment input details for Python scripts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-py-script.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/27a861059a73e83bc02c633ee194dac6f8ace374.md", + "original_doc_id": "27A861059A73E83BC02C633EE194DAC6F8ACE374", + "path": "corpus/watsonx-docsqa/docs/27a861059a73e83bc02c633ee194dac6f8ace374.md", + "title": "Batch deployment input details for Pytorch models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-pytorch.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cdf460b2bb910f74723297bcb8e940bf370c6ffd.md", + "original_doc_id": "CDF460B2BB910F74723297BCB8E940BF370C6FFD", + "path": "corpus/watsonx-docsqa/docs/cdf460b2bb910f74723297bcb8e940bf370c6ffd.md", + "title": "Batch deployment input details for Scikit-learn and XGBoost models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-scikit.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/adbd308eeb761b4a1516d49f68c880eaf3f08d78.md", + "original_doc_id": "ADBD308EEB761B4A1516D49F68C880EAF3F08D78", + "path": "corpus/watsonx-docsqa/docs/adbd308eeb761b4a1516d49f68c880eaf3f08d78.md", + "title": "Batch deployment input details for Spark models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-spark.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/62bf74e391cfe1696e5218b3df0926b735a4788f.md", + "original_doc_id": "62BF74E391CFE1696E5218B3DF0926B735A4788F", + "path": "corpus/watsonx-docsqa/docs/62bf74e391cfe1696e5218b3df0926b735a4788f.md", + "title": "Batch deployment input details for SPSS models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-spss.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7d385692a31e1e88e675af0b91f98f55797bc02d.md", + "original_doc_id": "7D385692A31E1E88E675AF0B91F98F55797BC02D", + "path": "corpus/watsonx-docsqa/docs/7d385692a31e1e88e675af0b91f98f55797bc02d.md", + "title": "Batch deployment input details for Tensorflow models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-tensorflow.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/09897dcf1128d66144d2b165564c228c16cd5ec5.md", + "original_doc_id": "09897DCF1128D66144D2B165564C228C16CD5EC5", + "path": "corpus/watsonx-docsqa/docs/09897dcf1128d66144d2b165564c228c16cd5ec5.md", + "title": "Deploying foundation model assets", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-found-assets.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f31a520a8c2c1b9c7f80b14ebcd096bb1121d53d.md", + "original_doc_id": "F31A520A8C2C1B9C7F80B14EBCD096BB1121D53D", + "path": "corpus/watsonx-docsqa/docs/f31a520a8c2c1b9c7f80b14ebcd096bb1121d53d.md", + "title": "Managing deployment jobs", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-jobs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f4a482326d45dc729eb8d1a6735cefacd7ae5578.md", + "original_doc_id": "F4A482326D45DC729EB8D1A6735CEFACD7AE5578", + "path": "corpus/watsonx-docsqa/docs/f4a482326d45dc729eb8d1a6735cefacd7ae5578.md", + "title": "Creating online deployments in Watson Machine Learning", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-online.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/32afafa1c90d43ba1d3330a64491039f63d9feb5.md", + "original_doc_id": "32AFAFA1C90D43BA1D3330A64491039F63D9FEB5", + "path": "corpus/watsonx-docsqa/docs/32afafa1c90d43ba1d3330a64491039f63d9feb5.md", + "title": "Deploying scripts in Watson Machine Learning", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-script.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2b6dc49f4afde44dd385ae09caab02a3f1db4259.md", + "original_doc_id": "2B6DC49F4AFDE44DD385AE09CAAB02A3F1DB4259", + "path": "corpus/watsonx-docsqa/docs/2b6dc49f4afde44dd385ae09caab02a3f1db4259.md", + "title": "Choosing compute resources for running tools in projects", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d83baae9c79e5df9ca904ab1886ac4826447b495.md", + "original_doc_id": "D83BAAE9C79E5DF9CA904AB1886AC4826447B495", + "path": "corpus/watsonx-docsqa/docs/d83baae9c79e5df9ca904ab1886ac4826447b495.md", + "title": "Examples of environment template customizations", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/example-customizations.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a7845d8c3e419cedd06e8c447adf41e6e3d860c8.md", + "original_doc_id": "A7845D8C3E419CEDD06E8C447ADF41E6E3D860C8", + "path": "corpus/watsonx-docsqa/docs/a7845d8c3e419cedd06e8c447adf41e6e3d860c8.md", + "title": "IBM Federated Learning", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fed-lea.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cee9ef1f47611f6a9c00bb76c91b94b7da2a62ff.md", + "original_doc_id": "CEE9EF1F47611F6A9C00BB76C91B94B7DA2A62FF", + "path": "corpus/watsonx-docsqa/docs/cee9ef1f47611f6a9c00bb76c91b94b7da2a62ff.md", + "title": "Starting the aggregator (Admin)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-agg.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4b48ef3d089f3142b1ed604a32873217f89e052f.md", + "original_doc_id": "4B48EF3D089F3142B1ED604A32873217F89E052F", + "path": "corpus/watsonx-docsqa/docs/4b48ef3d089f3142b1ed604a32873217f89e052f.md", + "title": "Federated Learning architecture", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-arch.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/924550083a3a6acd177024df788c02d236874893.md", + "original_doc_id": "924550083A3A6ACD177024DF788C02D236874893", + "path": "corpus/watsonx-docsqa/docs/924550083a3a6acd177024df788c02d236874893.md", + "title": "Connecting to the aggregator (Party)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-conn.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d579aba442c4652bac088173107ecfebbf4d8290.md", + "original_doc_id": "D579ABA442C4652BAC088173107ECFEBBF4D8290", + "path": "corpus/watsonx-docsqa/docs/d579aba442c4652bac088173107ecfebbf4d8290.md", + "title": "Federated Learning tutorials and samples", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-demo.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cbdd718bcee7b1ffde95191be1749d57b9a1a60d.md", + "original_doc_id": "CBDD718BCEE7B1FFDE95191BE1749D57B9A1A60D", + "path": "corpus/watsonx-docsqa/docs/cbdd718bcee7b1ffde95191be1749d57b9a1a60d.md", + "title": "Federated Learning homomorphic encryption sample for API", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-fhe-sample.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1d1783967cbf46a0b75539badbaa1d601bc9f412.md", + "original_doc_id": "1D1783967CBF46A0B75539BADBAA1D601BC9F412", + "path": "corpus/watsonx-docsqa/docs/1d1783967cbf46a0b75539badbaa1d601bc9f412.md", + "title": "Frameworks, fusion methods, and Python versions", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-frames.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/adeb3c4ba4949f2c87919d5493b71b67028b76ee.md", + "original_doc_id": "ADEB3C4BA4949F2C87919D5493B71B67028B76EE", + "path": "corpus/watsonx-docsqa/docs/adeb3c4ba4949f2c87919d5493b71b67028b76ee.md", + "title": "Get started", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-get-started.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/51426dcf985b97af6172727afcf353a481591560.md", + "original_doc_id": "51426DCF985B97AF6172727AFCF353A481591560", + "path": "corpus/watsonx-docsqa/docs/51426dcf985b97af6172727afcf353a481591560.md", + "title": "Create the data handler", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-handler.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c48e63f001dfae875e1c82b5d163b7a2c9961ce2.md", + "original_doc_id": "C48E63F001DFAE875E1C82B5D163B7A2C9961CE2", + "path": "corpus/watsonx-docsqa/docs/c48e63f001dfae875e1c82b5d163b7a2c9961ce2.md", + "title": "Applying homomorphic encryption for security and privacy", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-homo.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4cd539b8153216f80b26729a35ad4cd04a9c27db.md", + "original_doc_id": "4CD539B8153216F80B26729A35AD4CD04A9C27DB", + "path": "corpus/watsonx-docsqa/docs/4cd539b8153216f80b26729a35ad4cd04a9c27db.md", + "title": "Creating the initial model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-models.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3acf4aabd6be9c3bc0e0a363c3bfffdd4a37b442.md", + "original_doc_id": "3ACF4AABD6BE9C3BC0E0A363C3BFFFDD4A37B442", + "path": "corpus/watsonx-docsqa/docs/3acf4aabd6be9c3bc0e0a363c3bfffdd4a37b442.md", + "title": "Monitoring the experiment and saving the model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-mon.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4b16740c786c0846194987998dad887250be95bf.md", + "original_doc_id": "4B16740C786C0846194987998DAD887250BE95BF", + "path": "corpus/watsonx-docsqa/docs/4b16740c786c0846194987998dad887250be95bf.md", + "title": "Hyperparameter definitions", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-param.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e0d36a6f5028fc5ed005e87faf9f65f976e62a37.md", + "original_doc_id": "E0D36A6F5028FC5ED005E87FAF9F65F976E62A37", + "path": "corpus/watsonx-docsqa/docs/e0d36a6f5028fc5ed005e87faf9f65f976e62a37.md", + "title": "Set up your system", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-setup.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e5895bc081edbf0cd7340015decd0d0180aac44a.md", + "original_doc_id": "E5895BC081EDBF0CD7340015DECD0D0180AAC44A", + "path": "corpus/watsonx-docsqa/docs/e5895bc081edbf0cd7340015decd0d0180aac44a.md", + "title": "Creating a Federated Learning experiment", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-start.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8ffe1fb9caf854ded9ca52190d4874d8280d26b0.md", + "original_doc_id": "8FFE1FB9CAF854DED9CA52190D4874D8280D26B0", + "path": "corpus/watsonx-docsqa/docs/8ffe1fb9caf854ded9ca52190d4874d8280d26b0.md", + "title": "Terminology", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-term.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e64b1811e55868cf510b06bfd1a24ba4ac3008f1.md", + "original_doc_id": "E64B1811E55868CF510B06BFD1A24BA4AC3008F1", + "path": "corpus/watsonx-docsqa/docs/e64b1811e55868cf510b06bfd1a24ba4ac3008f1.md", + "title": "Federated Learning Tensorflow samples", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-tf2-samples.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/37dc9376a7fb6eb772d242b85909a023c43c2417.md", + "original_doc_id": "37DC9376A7FB6EB772D242B85909A023C43C2417", + "path": "corpus/watsonx-docsqa/docs/37dc9376a7fb6eb772d242b85909a023c43c2417.md", + "title": "Federated Learning Tensorflow tutorial", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-tf2-tutorial.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/866bbcabef2c6e3eddf66300dc2639c938d815f4.md", + "original_doc_id": "866BBCABEF2C6E3EDDF66300DC2639C938D815F4", + "path": "corpus/watsonx-docsqa/docs/866bbcabef2c6e3eddf66300dc2639c938d815f4.md", + "title": "Troubleshooting Federated Learning experiments", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-troubleshoot.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d0142ffcd3063427101ccc165c5e5f2b0fa286db.md", + "original_doc_id": "D0142FFCD3063427101CCC165C5E5F2B0FA286DB", + "path": "corpus/watsonx-docsqa/docs/d0142ffcd3063427101ccc165c5e5f2b0fa286db.md", + "title": "Federated Learning XGBoost samples", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-xg-samples.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fe207218ce0d1148aa57d10ed8848cd7e6ffd87e.md", + "original_doc_id": "FE207218CE0D1148AA57D10ED8848CD7E6FFD87E", + "path": "corpus/watsonx-docsqa/docs/fe207218ce0d1148aa57d10ed8848cd7e6ffd87e.md", + "title": "Federated Learning XGBoost tutorial for UI", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-xg-tutorial.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fd48879c34d316981b4f67c2b82c8179e0042f74.md", + "original_doc_id": "FD48879C34D316981B4F67C2B82C8179E0042F74", + "path": "corpus/watsonx-docsqa/docs/fd48879c34d316981b4f67c2b82c8179e0042f74.md", + "title": "Credentials for prompting foundation models (IBM Cloud API key and IAM token)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-credentials.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/52507fe59c92ef1667e463b2c5d709c139673f4d.md", + "original_doc_id": "52507FE59C92EF1667E463B2C5D709C139673F4D", + "path": "corpus/watsonx-docsqa/docs/52507fe59c92ef1667e463b2c5d709c139673f4d.md", + "title": "Foundation model terms of use in watsonx.ai", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-disclaimer.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/43785386700cf73e37a8f76adc4ef9fb01ee0aeb.md", + "original_doc_id": "43785386700CF73E37A8F76ADC4EF9FB01EE0AEB", + "path": "corpus/watsonx-docsqa/docs/43785386700cf73e37a8f76adc4ef9fb01ee0aeb.md", + "title": "Generating accurate output", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-factual-accuracy.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e59b59312d1eb3b2ba78d7e78993883bb3784c2b.md", + "original_doc_id": "E59B59312D1EB3B2BA78D7E78993883BB3784C2B", + "path": "corpus/watsonx-docsqa/docs/e59b59312d1eb3b2ba78d7e78993883bb3784c2b.md", + "title": "Techniques for avoiding undesirable output", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-hallucinations.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/120cae8361ae4e0b6fe4d6f0d32eee9517f11190.md", + "original_doc_id": "120CAE8361AE4E0B6FE4D6F0D32EEE9517F11190", + "path": "corpus/watsonx-docsqa/docs/120cae8361ae4e0b6fe4d6f0d32eee9517f11190.md", + "title": "Choosing a foundation model in watsonx.ai", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-model-choose.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/42ae491240ef740e6a8c5cf32b817e606f554e49.md", + "original_doc_id": "42AE491240EF740E6A8C5CF32B817E606F554E49", + "path": "corpus/watsonx-docsqa/docs/42ae491240ef740e6a8c5cf32b817e606f554e49.md", + "title": "Foundation model parameters: decoding and stopping criteria", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-model-parameters.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b2593108fa446c4b4b0ef5adc2cd5d9585b0b63c.md", + "original_doc_id": "B2593108FA446C4B4B0EF5ADC2CD5D9585B0B63C", + "path": "corpus/watsonx-docsqa/docs/b2593108fa446c4b4b0ef5adc2cd5d9585b0b63c.md", + "title": "Foundation models built by IBM", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models-ibm.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5b37710fe7bbd6efb842feb7b49b036302e18f81.md", + "original_doc_id": "5B37710FE7BBD6EFB842FEB7B49B036302E18F81", + "path": "corpus/watsonx-docsqa/docs/5b37710fe7bbd6efb842feb7b49b036302e18f81.md", + "title": "Supported foundation models available with watsonx.ai", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/58c6d0a1c6dad01e3f0f1748dc472c3ddcc07e43.md", + "original_doc_id": "58C6D0A1C6DAD01E3F0F1748DC472C3DDCC07E43", + "path": "corpus/watsonx-docsqa/docs/58c6d0a1c6dad01e3f0f1748dc472c3ddcc07e43.md", + "title": "Foundation models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/78a8c07b83df1b01276353d098e84f12304636e2.md", + "original_doc_id": "78A8C07B83DF1B01276353D098E84F12304636E2", + "path": "corpus/watsonx-docsqa/docs/78a8c07b83df1b01276353d098e84f12304636e2.md", + "title": "Prompt Lab", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e5d702e67e93752155510b56a3b2f464e190eba2.md", + "original_doc_id": "E5D702E67E93752155510B56A3B2F464E190EBA2", + "path": "corpus/watsonx-docsqa/docs/e5d702e67e93752155510b56a3b2f464e190eba2.md", + "title": "Sample foundation model prompts for common tasks", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/38dbe0e16434502696281563802b76f3e38b25d2.md", + "original_doc_id": "38DBE0E16434502696281563802B76F3E38B25D2", + "path": "corpus/watsonx-docsqa/docs/38dbe0e16434502696281563802b76f3e38b25d2.md", + "title": "Saving your work", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-save.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f839cd35991df790f17239c9c63bfcae701f3d65.md", + "original_doc_id": "F839CD35991DF790F17239C9C63BFCAE701F3D65", + "path": "corpus/watsonx-docsqa/docs/f839cd35991df790f17239c9c63bfcae701f3d65.md", + "title": "Tips for writing foundation model prompts: prompt engineering", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-tips.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6049d5aa5de41309e6281534a464abd6898a758c.md", + "original_doc_id": "6049D5AA5DE41309E6281534A464ABD6898A758C", + "path": "corpus/watsonx-docsqa/docs/6049d5aa5de41309e6281534a464abd6898a758c.md", + "title": "Building reusable prompts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-variables.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b1af301f18e6444da2842cc71f9ac38505ee5e1f.md", + "original_doc_id": "B1AF301F18E6444DA2842CC71F9AC38505EE5E1F", + "path": "corpus/watsonx-docsqa/docs/b1af301f18e6444da2842cc71f9ac38505ee5e1f.md", + "title": "Foundation models Python library", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-python-lib.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/752d982c2f694ffee2a312cea6adf22c2384d4b2.md", + "original_doc_id": "752D982C2F694FFEE2A312CEA6ADF22C2384D4B2", + "path": "corpus/watsonx-docsqa/docs/752d982c2f694ffee2a312cea6adf22c2384d4b2.md", + "title": "Retrieval-augmented generation", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-rag.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/38fb0908b90954d96ceff54ba975de832286a0a7.md", + "original_doc_id": "38FB0908B90954D96CEFF54BA975DE832286A0A7", + "path": "corpus/watsonx-docsqa/docs/38fb0908b90954d96ceff54ba975de832286a0a7.md", + "title": "Security and privacy for foundation models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-security.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b193a2795bdef17a5d204cdd18188a767e2fe7b7.md", + "original_doc_id": "B193A2795BDEF17A5D204CDD18188A767E2FE7B7", + "path": "corpus/watsonx-docsqa/docs/b193a2795bdef17a5d204cdd18188a767e2fe7b7.md", + "title": "Tokens and tokenization", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tokens.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/96597f608c26e68bfc4bdca45061400d63793523.md", + "original_doc_id": "96597F608C26E68BFC4BDCA45061400D63793523", + "path": "corpus/watsonx-docsqa/docs/96597f608c26e68bfc4bdca45061400d63793523.md", + "title": "Data formats for tuning foundation models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fc8dbf139a485e98914cbb73b8ba684b283ae983.md", + "original_doc_id": "FC8DBF139A485E98914CBB73B8BA684B283AE983", + "path": "corpus/watsonx-docsqa/docs/fc8dbf139a485e98914cbb73b8ba684b283ae983.md", + "title": "Deploying a tuned foundation model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-deploy.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/15a014c514b00ff78c689585f393e21bae922db2.md", + "original_doc_id": "15A014C514B00FF78C689585F393E21BAE922DB2", + "path": "corpus/watsonx-docsqa/docs/15a014c514b00ff78c689585f393e21bae922db2.md", + "title": "Methods for tuning foundation models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-methods.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/51747f17f413f1f34cfd73d170de392d874d03dd.md", + "original_doc_id": "51747F17F413F1F34CFD73D170DE392D874D03DD", + "path": "corpus/watsonx-docsqa/docs/51747f17f413f1f34cfd73d170de392d874d03dd.md", + "title": "Parameters for tuning foundation models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-parameters.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8745fb7bf19f0e2b0a78c3cd43aa4bf79a25dbce.md", + "original_doc_id": "8745FB7BF19F0E2B0A78C3CD43AA4BF79A25DBCE", + "path": "corpus/watsonx-docsqa/docs/8745fb7bf19f0e2b0a78c3cd43aa4bf79a25dbce.md", + "title": "Tuning Studio", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-studio.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2372aeeeb4da6a3e94273cb46224ed09cd84cd9e.md", + "original_doc_id": "2372AEEEB4DA6A3E94273CB46224ED09CD84CD9E", + "path": "corpus/watsonx-docsqa/docs/2372aeeeb4da6a3e94273cb46224ed09cd84cd9e.md", + "title": "Tuning a foundation model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-tune.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fbc3c5f81d060cd996489b772abac886f12130a3.md", + "original_doc_id": "FBC3C5F81D060CD996489B772ABAC886F12130A3", + "path": "corpus/watsonx-docsqa/docs/fbc3c5f81d060cd996489b772abac886f12130a3.md", + "title": "When to tune a foundation model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-when.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e3b9f33c36e5636808b137cfa4745e39f3b48d62.md", + "original_doc_id": "E3B9F33C36E5636808B137CFA4745E39F3B48D62", + "path": "corpus/watsonx-docsqa/docs/e3b9f33c36e5636808b137cfa4745e39f3b48d62.md", + "title": "SPSS predictive analytics forecasting using data preparation for time series data in notebooks", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/forecasting-guides.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3508f0dda4ccbdbb07bd583218f4e4260dc01c0d.md", + "original_doc_id": "3508F0DDA4CCBDBB07BD583218F4E4260DC01C0D", + "path": "corpus/watsonx-docsqa/docs/3508f0dda4ccbdbb07bd583218f4e4260dc01c0d.md", + "title": "Geospatial data analysis", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/geo-spatial-lib.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b61649df5425dea0c1f16942bde0eec79b3e4f80.md", + "original_doc_id": "B61649DF5425DEA0C1F16942BDE0EEC79B3E4F80", + "path": "corpus/watsonx-docsqa/docs/b61649df5425dea0c1f16942bde0eec79b3e4f80.md", + "title": "Publishing notebooks on GitHub", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/github-integration.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3c307031346d4fd7dd1a66e2a2f919713582b075.md", + "original_doc_id": "3C307031346D4FD7DD1A66E2A2F919713582B075", + "path": "corpus/watsonx-docsqa/docs/3c307031346d4fd7dd1a66e2a2f919713582b075.md", + "title": "Hiding sensitive code cells in a notebook", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/hide_code.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/af2ac67b66d3a2db0d4f2af2d6743f903f1385d7.md", + "original_doc_id": "AF2AC67B66D3A2DB0D4F2AF2D6743F903F1385D7", + "path": "corpus/watsonx-docsqa/docs/af2ac67b66d3a2db0d4f2af2d6743f903f1385d7.md", + "title": "Installing custom libraries through notebooks", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/install-cust-lib.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7623f4fa0f93db33077a8b64f7a7b27fbc84e9e4.md", + "original_doc_id": "7623F4FA0F93DB33077A8B64F7A7B27FBC84E9E4", + "path": "corpus/watsonx-docsqa/docs/7623f4fa0f93db33077a8b64f7a7b27fbc84e9e4.md", + "title": "Jupyter kernels and notebook environments", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/jupyter-spark.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a99d0a49cdc1c3c38eff43a6b1b51b0a177e5573.md", + "original_doc_id": "A99D0A49CDC1C3C38EFF43A6B1B51B0A177E5573", + "path": "corpus/watsonx-docsqa/docs/a99d0a49cdc1c3c38eff43a6b1b51b0a177e5573.md", + "title": "Libraries and scripts for notebooks", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/libraries.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/773fa6558f9fd3115f36af9e4b11f67c1f501432.md", + "original_doc_id": "773FA6558F9FD3115F36AF9E4B11F67C1F501432", + "path": "corpus/watsonx-docsqa/docs/773fa6558f9fd3115f36af9e4b11f67c1f501432.md", + "title": "Loading and accessing data in a notebook", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7bab40e15d18920009e4168c32265a950a8afe38.md", + "original_doc_id": "7BAB40E15D18920009E4168C32265A950A8AFE38", + "path": "corpus/watsonx-docsqa/docs/7bab40e15d18920009e4168c32265a950a8afe38.md", + "title": "Managing compute resources", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6349e43ea9b4ac5775db122e0f6c365d5db810bf.md", + "original_doc_id": "6349E43EA9B4AC5775DB122E0F6C365D5DB810BF", + "path": "corpus/watsonx-docsqa/docs/6349e43ea9b4ac5775db122e0f6c365d5db810bf.md", + "title": "Managing the lifecycle of notebooks and scripts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-nb-lifecycle.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ff69e780bd8feceaf7a0add24c159679f7359f81.md", + "original_doc_id": "FF69E780BD8FECEAF7A0ADD24C159679F7359F81", + "path": "corpus/watsonx-docsqa/docs/ff69e780bd8feceaf7a0add24c159679f7359f81.md", + "title": "Markdown cheatsheet", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/markd-jupyter.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fd32e17ff88251cdfc3fa01a1ad8eebda98eda06.md", + "original_doc_id": "FD32E17FF88251CDFC3FA01A1AD8EEBDA98EDA06", + "path": "corpus/watsonx-docsqa/docs/fd32e17ff88251cdfc3fa01a1ad8eebda98eda06.md", + "title": "Accessing asset details", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-access-detailed-info.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b518a7a2d4aa3b05564c965889116f6a6151a34b.md", + "original_doc_id": "B518A7A2D4AA3B05564C965889116F6A6151A34B", + "path": "corpus/watsonx-docsqa/docs/b518a7a2d4aa3b05564c965889116f6a6151a34b.md", + "title": "Authenticating for programmatic access", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-authentication.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cd27e36e95ae5324468c33cf3a112dc1611ca74c.md", + "original_doc_id": "CD27E36E95AE5324468C33CF3A112DC1611CA74C", + "path": "corpus/watsonx-docsqa/docs/cd27e36e95ae5324468c33cf3a112dc1611ca74c.md", + "title": "Customizing with third-party and private Python libraries", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-create-custom-software-spec.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9dff39b0fb5fe6195aa75e50040b6d669fce2bb6.md", + "original_doc_id": "9DFF39B0FB5FE6195AA75E50040B6D669FCE2BB6", + "path": "corpus/watsonx-docsqa/docs/9dff39b0fb5fe6195aa75e50040b6d669fce2bb6.md", + "title": "Requirements for using custom components in ML models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-custom_libs_overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f8e12f246225210b8c984d447b3e15867d2e8869.md", + "original_doc_id": "F8E12F246225210B8C984D447B3E15867D2E8869", + "path": "corpus/watsonx-docsqa/docs/f8e12f246225210b8c984d447b3e15867d2e8869.md", + "title": "Customizing Watson Machine Learning deployment runtimes", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-customize.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/82512a3915bf43df08d9106027a67d5e059b2719.md", + "original_doc_id": "82512A3915BF43DF08D9106027A67D5E059B2719", + "path": "corpus/watsonx-docsqa/docs/82512a3915bf43df08d9106027a67d5e059b2719.md", + "title": "Creating an SPSS Modeler batch job with multiple data sources", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-SPSS-multiple-input.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/315971ae6c6a4eede13e9e1449b2a36f548b928f.md", + "original_doc_id": "315971AE6C6A4EEDE13E9E1449B2A36F548B928F", + "path": "corpus/watsonx-docsqa/docs/315971ae6c6a4eede13e9e1449b2a36f548b928f.md", + "title": "Deleting a deployment", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-delete.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/53019dd52edb5790460dff9a02363856b83cafb7.md", + "original_doc_id": "53019DD52EDB5790460DFF9A02363856B83CAFB7", + "path": "corpus/watsonx-docsqa/docs/53019dd52edb5790460dff9a02363856b83cafb7.md", + "title": "Managing predictive deployments", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/45a1c384d8d6a730d73357e2bb3216edbd2f7ff2.md", + "original_doc_id": "45A1C384D8D6A730D73357E2BB3216EDBD2F7FF2", + "path": "corpus/watsonx-docsqa/docs/45a1c384d8d6a730d73357e2bb3216edbd2f7ff2.md", + "title": "Writing deployable Python functions", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function-write.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/03ff997603b065d2df1fbb49934ca8c348765acf.md", + "original_doc_id": "03FF997603B065D2DF1FBB49934CA8C348765ACF", + "path": "corpus/watsonx-docsqa/docs/03ff997603b065d2df1fbb49934ca8c348765acf.md", + "title": "Deploying Python functions in Watson Machine Learning", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8279c6c73a8db1a593945e5ea339f9efde96a61e.md", + "original_doc_id": "8279C6C73A8DB1A593945E5EA339F9EFDE96A61E", + "path": "corpus/watsonx-docsqa/docs/8279c6c73a8db1a593945e5ea339f9efde96a61e.md", + "title": "Scaling a deployment", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-scaling.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/462a5ba596aadf9c38762611ca2578398f234bd4.md", + "original_doc_id": "462A5BA596AADF9C38762611CA2578398F234BD4", + "path": "corpus/watsonx-docsqa/docs/462a5ba596aadf9c38762611ca2578398f234bd4.md", + "title": "Updating a deployment", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-update.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0310b7fb9072e7f7e5d73f5af90ede62faa81286.md", + "original_doc_id": "0310B7FB9072E7F7E5D73F5AF90EDE62FAA81286", + "path": "corpus/watsonx-docsqa/docs/0310b7fb9072e7f7e5d73f5af90ede62faa81286.md", + "title": "Managing hardware configurations", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-hardware-configs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/19ba0bfc40b6212b42f38487f1533bb65647850e.md", + "original_doc_id": "19BA0BFC40B6212B42F38487F1533BB65647850E", + "path": "corpus/watsonx-docsqa/docs/19ba0bfc40b6212b42f38487f1533bb65647850e.md", + "title": "Importing models to a deployment space", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e008266c010adfef841c513ae7bcb91436f9ae9c.md", + "original_doc_id": "E008266C010ADFEF841C513AE7BCB91436F9AE9C", + "path": "corpus/watsonx-docsqa/docs/e008266c010adfef841c513ae7bcb91436f9ae9c.md", + "title": "Frameworks and software specifications in Watson Machine Learning", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-frame-and-specs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/29a9834843b2d6e7417c09a5385b83bcb13d814c.md", + "original_doc_id": "29A9834843B2D6E7417C09A5385B83BCB13D814C", + "path": "corpus/watsonx-docsqa/docs/29a9834843b2d6e7417c09a5385b83bcb13d814c.md", + "title": "Managing outdated software specifications or frameworks", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6f51a9033343574aee2d292cb23f09d542456389.md", + "original_doc_id": "6F51A9033343574AEE2D292CB23F09D542456389", + "path": "corpus/watsonx-docsqa/docs/6f51a9033343574aee2d292cb23f09d542456389.md", + "title": "Enabling model tracking with AI factsheets", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-model-tracking.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/035ef4a1d7c465e8a72acc1c5c98198b4e95068b.md", + "original_doc_id": "035EF4A1D7C465E8A72ACC1C5C98198B4E95068B", + "path": "corpus/watsonx-docsqa/docs/035ef4a1d7c465e8a72acc1c5c98198b4e95068b.md", + "title": "Adding conditions to the pipeline", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-conditions.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8cf8260d0474ad73d9878ccd361c83102b724733.md", + "original_doc_id": "8CF8260D0474AD73D9878CCD361C83102B724733", + "path": "corpus/watsonx-docsqa/docs/8cf8260d0474ad73d9878ccd361c83102b724733.md", + "title": "Configuring pipeline nodes", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-config.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/536ef493ab96990de8e237edb8a97db989ef15c8.md", + "original_doc_id": "536EF493AB96990DE8E237EDB8A97DB989EF15C8", + "path": "corpus/watsonx-docsqa/docs/536ef493ab96990de8e237edb8a97db989ef15c8.md", + "title": "Creating a pipeline", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-create.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7f2731c1ebb3f492687a336e1369cd6232512118.md", + "original_doc_id": "7F2731C1EBB3F492687A336E1369CD6232512118", + "path": "corpus/watsonx-docsqa/docs/7f2731c1ebb3f492687a336e1369cd6232512118.md", + "title": "Creating a custom component for use in the pipeline", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-custom-comp.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/05d687fc92fd17804374e20e7f330edae142f725.md", + "original_doc_id": "05D687FC92FD17804374E20E7F330EDAE142F725", + "path": "corpus/watsonx-docsqa/docs/05d687fc92fd17804374e20e7f330edae142f725.md", + "title": "Handling Pipeline errors", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-errors.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e933c12c1df97e13cba40bcd54e4f4b8133da10c.md", + "original_doc_id": "E933C12C1DF97E13CBA40BCD54E4F4B8133DA10C", + "path": "corpus/watsonx-docsqa/docs/e933c12c1df97e13cba40bcd54e4f4b8133da10c.md", + "title": "Functions used in Watson Pipelines's Expression Builder", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-expr-builder.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/445b99372919de6b2c3e6a7e2c3f4caab0bf174c.md", + "original_doc_id": "445B99372919DE6B2C3E6A7E2C3F4CAAB0BF174C", + "path": "corpus/watsonx-docsqa/docs/445b99372919de6b2c3e6a7e2c3f4caab0bf174c.md", + "title": "Configuring global objects for Watson Pipelines", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-flow-param.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/484af9baf43ac6bcfdfaf7b0d353ccdf119033df.md", + "original_doc_id": "484AF9BAF43AC6BCFDFAF7B0D353CCDF119033DF", + "path": "corpus/watsonx-docsqa/docs/484af9baf43ac6bcfdfaf7b0d353ccdf119033df.md", + "title": "Getting started with the Watson Pipelines editor", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-get-started.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/28243d1c0b8bcf04fe3556990d40d1a31f4cb58d.md", + "original_doc_id": "28243D1C0B8BCF04FE3556990D40D1A31F4CB58D", + "path": "corpus/watsonx-docsqa/docs/28243d1c0b8bcf04fe3556990d40d1a31f4cb58d.md", + "title": "Manage default settings", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-global-settings.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/606ef22cf35af0edc961776fb893b07a880f11d4.md", + "original_doc_id": "606EF22CF35AF0EDC961776FB893B07A880F11D4", + "path": "corpus/watsonx-docsqa/docs/606ef22cf35af0edc961776fb893b07a880f11d4.md", + "title": "IBM Watson Pipelines", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1bd28f052373c2e70130c7539d399d76f9d2aafe.md", + "original_doc_id": "1BD28F052373C2E70130C7539D399D76F9D2AAFE", + "path": "corpus/watsonx-docsqa/docs/1bd28f052373c2e70130c7539d399d76f9d2aafe.md", + "title": "Accessing the components in your pipeline", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-planning.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f5086d0b6258fef503cb3219f427ffbff73135e1.md", + "original_doc_id": "F5086D0B6258FEF503CB3219F427FFBFF73135E1", + "path": "corpus/watsonx-docsqa/docs/f5086d0b6258fef503cb3219f427ffbff73135e1.md", + "title": "Programming IBM Watson Pipelines", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-program.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ae57c56703b39c9097516d1466b70a3de57aa1c4.md", + "original_doc_id": "AE57C56703B39C9097516D1466B70A3DE57AA1C4", + "path": "corpus/watsonx-docsqa/docs/ae57c56703b39c9097516d1466b70a3de57aa1c4.md", + "title": "Running a pipeline", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-run-save.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2ee7bf839ffa16ec1a7f9ed82662efe539fd29c2.md", + "original_doc_id": "2EE7BF839FFA16EC1A7F9ED82662EFE539FD29C2", + "path": "corpus/watsonx-docsqa/docs/2ee7bf839ffa16ec1a7f9ed82662efe539fd29c2.md", + "title": "Run the built-in sample pipeline", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-sample.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bb961ab67f88b50475329fcd1ee2f64137480426.md", + "original_doc_id": "BB961AB67F88B50475329FCD1EE2F64137480426", + "path": "corpus/watsonx-docsqa/docs/bb961ab67f88b50475329fcd1ee2f64137480426.md", + "title": "Run a sample pipeline to compare models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-sample2.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d1db4f3b084cb401795c925f280207cbcb3d94aa.md", + "original_doc_id": "D1DB4F3B084CB401795C925F280207CBCB3D94AA", + "path": "corpus/watsonx-docsqa/docs/d1db4f3b084cb401795c925f280207cbcb3d94aa.md", + "title": "Storage and data access for IBM Watson Pipelines", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-storage-data-access.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ce13ae6812f1e2ca6ad429d4b01af25f9f398148.md", + "original_doc_id": "CE13AE6812F1E2CA6AD429D4B01AF25F9F398148", + "path": "corpus/watsonx-docsqa/docs/ce13ae6812f1e2ca6ad429d4b01af25f9f398148.md", + "title": "Deploying models with Watson Machine Learning", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/577964b0c132f5ea793054c3ff67417dda6511d3.md", + "original_doc_id": "577964B0C132F5EA793054C3FF67417DDA6511D3", + "path": "corpus/watsonx-docsqa/docs/577964b0c132f5ea793054c3ff67417dda6511d3.md", + "title": "Watson Machine Learning Python client samples and examples", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-samples-overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/67fbc6967ed56285cc4eb1ff12d0e2e23b2f7bd5.md", + "original_doc_id": "67FBC6967ED56285CC4EB1FF12D0E2E23B2F7BD5", + "path": "corpus/watsonx-docsqa/docs/67fbc6967ed56285cc4eb1ff12d0e2e23b2f7bd5.md", + "title": "Managing the Watson Machine Learning service endpoint", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-service-endpoint.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/80ae02dc6e3e4ff10c8fd97e1c3f5a5e87270d57.md", + "original_doc_id": "80AE02DC6E3E4FF10C8FD97E1C3F5A5E87270D57", + "path": "corpus/watsonx-docsqa/docs/80ae02dc6e3e4ff10c8fd97e1c3f5a5e87270d57.md", + "title": "Assets in deployment spaces", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets-all.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d8bd7c30f776f7218860187f535c6b72d1a8dc74.md", + "original_doc_id": "D8BD7C30F776F7218860187F535C6B72D1A8DC74", + "path": "corpus/watsonx-docsqa/docs/d8bd7c30f776f7218860187f535c6b72d1a8dc74.md", + "title": "Adding data assets to a deployment space", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/451244d4e0cd8a3e96cd15ffaf0f3bda526cced2.md", + "original_doc_id": "451244D4E0CD8A3E96CD15FFAF0F3BDA526CCED2", + "path": "corpus/watsonx-docsqa/docs/451244d4e0cd8a3e96cd15ffaf0f3bda526cced2.md", + "title": "Creating deployment spaces", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-create.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c11e8deedbabe64f4789061d10e55aea415fd51e.md", + "original_doc_id": "C11E8DEEDBABE64F4789061D10E55AEA415FD51E", + "path": "corpus/watsonx-docsqa/docs/c11e8deedbabe64f4789061d10e55aea415fd51e.md", + "title": "Deleting deployment spaces", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-delete.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/85e9cac1f581e61092cff1f6be38570ee734c115.md", + "original_doc_id": "85E9CAC1F581E61092CFF1F6BE38570EE734C115", + "path": "corpus/watsonx-docsqa/docs/85e9cac1f581e61092cff1f6be38570ee734c115.md", + "title": "Exporting space assets from deployment spaces", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-export.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a11374b50b49477362fa00bbb32a277776f7e8e2.md", + "original_doc_id": "A11374B50B49477362FA00BBB32A277776F7E8E2", + "path": "corpus/watsonx-docsqa/docs/a11374b50b49477362fa00bbb32a277776f7e8e2.md", + "title": "Importing space and project assets into deployment spaces", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-import-to-space.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4dd17198b8e7413469c1837ffdbaf109b307078c.md", + "original_doc_id": "4DD17198B8E7413469C1837FFDBAF109B307078C", + "path": "corpus/watsonx-docsqa/docs/4dd17198b8e7413469c1837ffdbaf109b307078c.md", + "title": "Promoting assets to a deployment space", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-promote-assets.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/47cc4851c049d805f02bd2058cd5c2ffa157981c.md", + "original_doc_id": "47CC4851C049D805F02BD2058CD5C2FFA157981C", + "path": "corpus/watsonx-docsqa/docs/47cc4851c049d805f02bd2058cd5c2ffa157981c.md", + "title": "Deployment spaces", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/88a9f08917918d1d74c1c2ca702e999747eeb422.md", + "original_doc_id": "88A9F08917918D1D74C1C2CA702E999747EEB422", + "path": "corpus/watsonx-docsqa/docs/88a9f08917918d1d74c1c2ca702e999747eeb422.md", + "title": "Jupyter Notebook editor", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-editor.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cf4254ce9e6d890ccaa2564da3e9b57071ade342.md", + "original_doc_id": "CF4254CE9E6D890CCAA2564DA3E9B57071ADE342", + "path": "corpus/watsonx-docsqa/docs/cf4254ce9e6d890ccaa2564da3e9b57071ade342.md", + "title": "Compute resource options for the notebook editor in projects", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c6b0055426c9e91760f4923ed42be91d64fca6c8.md", + "original_doc_id": "C6B0055426C9E91760F4923ED42BE91D64FCA6C8", + "path": "corpus/watsonx-docsqa/docs/c6b0055426c9e91760f4923ed42be91d64fca6c8.md", + "title": "Notebooks and scripts", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebooks-and-scripts.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a957adc1e11b5dc6aa15dc17ef6293c40f89fc20.md", + "original_doc_id": "A957ADC1E11B5DC6AA15DC17EF6293C40F89FC20", + "path": "corpus/watsonx-docsqa/docs/a957adc1e11b5dc6aa15dc17ef6293c40f89fc20.md", + "title": "Deployments dashboard", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/operator-view.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bd995b62f35ec624da9e86f9a3383b73b54d9ed7.md", + "original_doc_id": "BD995B62F35EC624DA9E86F9A3383B73B54D9ED7", + "path": "corpus/watsonx-docsqa/docs/bd995b62f35ec624da9e86f9a3383b73b54d9ed7.md", + "title": "The parts of a notebook", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/parts-of-a-notebook.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b3f8fb433fc6730284e636b068a5de98c002dabd.md", + "original_doc_id": "B3F8FB433FC6730284E636B068A5DE98C002DABD", + "path": "corpus/watsonx-docsqa/docs/b3f8fb433fc6730284e636b068a5de98c002dabd.md", + "title": "Planning your notebooks and scripts experience", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/planning-for-notebooks.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1483016be71021f31b8193239d319f34d8e01c9c.md", + "original_doc_id": "1483016BE71021F31B8193239D319F34D8E01C9C", + "path": "corpus/watsonx-docsqa/docs/1483016be71021f31b8193239d319f34d8e01c9c.md", + "title": "Supported machine learning tools, libraries, frameworks, and software specifications", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/pm_service_supported_frameworks.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6406a3bcb4e9210a9fb00af248f11f392af5c205.md", + "original_doc_id": "6406A3BCB4E9210A9FB00AF248F11F392AF5C205", + "path": "corpus/watsonx-docsqa/docs/6406a3bcb4e9210a9fb00af248f11f392af5c205.md", + "title": "Promoting an environment template to a space", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/promote-envs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b2117b2cd0fea469149b23facb6a9f7f32905afd.md", + "original_doc_id": "B2117B2CD0FEA469149B23FACB6A9F7F32905AFD", + "path": "corpus/watsonx-docsqa/docs/b2117b2cd0fea469149b23facb6a9f7f32905afd.md", + "title": "Deploying a prompt template", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/prompt-template-deploy.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0a507ff5262bad7a3fb3f3c478388cff78949941.md", + "original_doc_id": "0A507FF5262BAD7A3FB3F3C478388CFF78949941", + "path": "corpus/watsonx-docsqa/docs/0a507ff5262bad7a3fb3f3c478388cff78949941.md", + "title": "Managing feature groups with assetframe-lib for Python (beta)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/py_assetframe.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a724f6e91162b52c519f6887f06df40626c0f698.md", + "original_doc_id": "A724F6E91162B52C519F6887F06DF40626C0F698", + "path": "corpus/watsonx-docsqa/docs/a724f6e91162b52c519f6887f06df40626c0f698.md", + "title": "Using Python functions to work with Cloud Object Storage", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/python_os.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f43870b5b6ce4d191950fdaae6aafc36f05360c9.md", + "original_doc_id": "F43870B5B6CE4D191950FDAAE6AAFC36F05360C9", + "path": "corpus/watsonx-docsqa/docs/f43870b5b6ce4d191950fdaae6aafc36f05360c9.md", + "title": "Compute resource options for RStudio in projects", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-envs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bb832bb5ce4b3e6e6272967d547d652b1daf2c4d.md", + "original_doc_id": "BB832BB5CE4B3E6E6272967D547D652B1DAF2C4D", + "path": "corpus/watsonx-docsqa/docs/bb832bb5ce4b3e6e6272967d547d652b1daf2c4d.md", + "title": "RStudio", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2bcc4276ea71978ffa874621715be92a9667390f.md", + "original_doc_id": "2BCC4276EA71978FFA874621715BE92A9667390F", + "path": "corpus/watsonx-docsqa/docs/2bcc4276ea71978ffa874621715be92a9667390f.md", + "title": "Using Spark in RStudio", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-spark.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/42f34465dd884e8110bb08a708a138532999714f.md", + "original_doc_id": "42F34465DD884E8110BB08A708A138532999714F", + "path": "corpus/watsonx-docsqa/docs/42f34465dd884e8110bb08a708a138532999714f.md", + "title": "Compute resource options for AutoAI experiments in projects", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-autoai.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b08a6b7a0f11fd3ab62a14f44fd4e1a771174c61.md", + "original_doc_id": "B08A6B7A0F11FD3AB62A14F44FD4E1A771174C61", + "path": "corpus/watsonx-docsqa/docs/b08a6b7a0f11fd3ab62a14f44fd4e1a771174c61.md", + "title": "Compute options for model training and scoring", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-cuh-deploy-spaces.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5b66f4f408827fe62b0584882d7f25fb9c6ca839.md", + "original_doc_id": "5B66F4F408827FE62B0584882D7F25FB9C6CA839", + "path": "corpus/watsonx-docsqa/docs/5b66f4f408827fe62b0584882d7f25fb9c6ca839.md", + "title": "Compute resource options for Decision Optimization", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-decisionopt.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/17ac1becae0867381bc236d4c0cc8fc4b8921a0a.md", + "original_doc_id": "17AC1BECAE0867381BC236D4C0CC8FC4B8921A0A", + "path": "corpus/watsonx-docsqa/docs/17ac1becae0867381bc236d4c0cc8fc4b8921a0a.md", + "title": "Compute resource options for Tuning Studio experiments in projects", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-fm-tuning.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9dae797269714235c8d9287b5d358bcf72e2c9f5.md", + "original_doc_id": "9DAE797269714235C8D9287B5D358BCF72E2C9F5", + "path": "corpus/watsonx-docsqa/docs/9dae797269714235c8d9287b5d358bcf72e2c9f5.md", + "title": "SPSS predictive analytics algorithms for scoring", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/score-guides.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2a3f647a7f4eb8fb4270d4e78245f18bfde29ad8.md", + "original_doc_id": "2A3F647A7F4EB8FB4270D4E78245F18BFDE29AD8", + "path": "corpus/watsonx-docsqa/docs/2a3f647a7f4eb8fb4270d4e78245f18bfde29ad8.md", + "title": "Sharing notebooks with a URL", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/share-notebooks.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c0e0c248b3934e34883814b5f9ceb792d734042a.md", + "original_doc_id": "C0E0C248B3934E34883814B5F9CEB792D734042A", + "path": "corpus/watsonx-docsqa/docs/c0e0c248b3934e34883814b5f9ceb792d734042a.md", + "title": "Compute resource options for Data Refinery in projects", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spark-dr-envs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6f544922de2638796837398f7ec15a4afe6b0781.md", + "original_doc_id": "6F544922DE2638796837398F7EC15A4AFE6B0781", + "path": "corpus/watsonx-docsqa/docs/6f544922de2638796837398f7ec15a4afe6b0781.md", + "title": "SPSS predictive analytics algorithms", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spss-algorithms.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/54029dd42bae3a23d68d928ac3b6c04d0c735dec.md", + "original_doc_id": "54029DD42BAE3A23D68D928AC3B6C04D0C735DEC", + "path": "corpus/watsonx-docsqa/docs/54029dd42bae3a23d68d928ac3b6c04d0c735dec.md", + "title": "Compute resource options for SPSS Modeler in projects", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spss-envs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2d81fcd3e78a5cc7b435198a59522ae6bf8640ed.md", + "original_doc_id": "2D81FCD3E78A5CC7B435198A59522AE6BF8640ED", + "path": "corpus/watsonx-docsqa/docs/2d81fcd3e78a5cc7b435198a59522ae6bf8640ed.md", + "title": "SPSS predictive analytics survival analysis algorithms in notebooks", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/survivalanalysis-guides.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fae139f839dab4c6eb794d689dacceff869c718f.md", + "original_doc_id": "FAE139F839DAB4C6EB794D689DACCEFF869C718F", + "path": "corpus/watsonx-docsqa/docs/fae139f839dab4c6eb794d689dacceff869c718f.md", + "title": "Switching the platform for a space", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/switch-platform-space.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/384eb2033ad74ea7044afc8bf1ddb06ff392cb08.md", + "original_doc_id": "384EB2033AD74EA7044AFC8BF1DDB06FF392CB08", + "path": "corpus/watsonx-docsqa/docs/384eb2033ad74ea7044afc8bf1ddb06ff392cb08.md", + "title": "Compute resource options for Synthetic Data Generator in projects", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/synthetic-envs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8a411252b81f0e159c1f63ee64f63a987d1bef9f.md", + "original_doc_id": "8A411252B81F0E159C1F63EE64F63A987D1BEF9F", + "path": "corpus/watsonx-docsqa/docs/8a411252b81f0e159c1f63ee64f63a987d1bef9f.md", + "title": "Manually adding the project access token", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/token.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e76a86b7ee87a78fa06482285bad02694abcc3ca.md", + "original_doc_id": "E76A86B7EE87A78FA06482285BAD02694ABCC3CA", + "path": "corpus/watsonx-docsqa/docs/e76a86b7ee87a78fa06482285bad02694abcc3ca.md", + "title": "Watson Studio environments compute usage", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/track-runtime-usage.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/de60e212953766b4698982b3b631d1a25a019f2e.md", + "original_doc_id": "DE60E212953766B4698982B3B631D1A25A019F2E", + "path": "corpus/watsonx-docsqa/docs/de60e212953766b4698982b3b631d1a25a019f2e.md", + "title": "Accessing project assets with ibm-watson-studio-lib", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/using-ibm-ws-lib.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/15d57c8193b99b8525bc2999ef82ef1cd7eae8ad.md", + "original_doc_id": "15D57C8193B99B8525BC2999EF82EF1CD7EAE8AD", + "path": "corpus/watsonx-docsqa/docs/15d57c8193b99b8525bc2999ef82ef1cd7eae8ad.md", + "title": "Watson Natural Language Processing task catalog", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/156f8a58809d3a4d8f80d02481e5adde513edeaa.md", + "original_doc_id": "156F8A58809D3A4D8F80D02481E5ADDE513EDEAA", + "path": "corpus/watsonx-docsqa/docs/156f8a58809d3a4d8f80d02481e5adde513edeaa.md", + "title": "Concepts extraction block", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-concept-ext_cloud.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b32394103127310af0f4bf240cfd0b26399b685d.md", + "original_doc_id": "B32394103127310AF0F4BF240CFD0B26399B685D", + "path": "corpus/watsonx-docsqa/docs/b32394103127310af0f4bf240cfd0b26399b685d.md", + "title": "Emotion classification", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-emotion.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a8a2d53661eb9ef173f7cc4794096a134123daca.md", + "original_doc_id": "A8A2D53661EB9EF173F7CC4794096A134123DACA", + "path": "corpus/watsonx-docsqa/docs/a8a2d53661eb9ef173f7cc4794096a134123daca.md", + "title": "Entity extraction", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-entity-enhanced.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1ec0aabfa78901776901cb2c57aff822855b6b5e.md", + "original_doc_id": "1EC0AABFA78901776901CB2C57AFF822855B6B5E", + "path": "corpus/watsonx-docsqa/docs/1ec0aabfa78901776901cb2c57aff822855b6b5e.md", + "title": "Hierarchical text categorization", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-hierarchical-cat.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bca763bf5f62bdc635ac2e0e7c9c6a47b04745a4.md", + "original_doc_id": "BCA763BF5F62BDC635AC2E0E7C9C6A47B04745A4", + "path": "corpus/watsonx-docsqa/docs/bca763bf5f62bdc635ac2e0e7c9c6a47b04745a4.md", + "title": "Keyword extraction and ranking", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-keyword.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e1074d5c232cb13e3cd1fb6e832753626d2fe30e.md", + "original_doc_id": "E1074D5C232CB13E3CD1FB6E832753626D2FE30E", + "path": "corpus/watsonx-docsqa/docs/e1074d5c232cb13e3cd1fb6e832753626d2fe30e.md", + "title": "Language detection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-language-detection.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/883359c27f09c3368292819b64149182441721e1.md", + "original_doc_id": "883359C27F09C3368292819B64149182441721E1", + "path": "corpus/watsonx-docsqa/docs/883359c27f09c3368292819b64149182441721e1.md", + "title": "Noun phrase extraction", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-noun-phrase.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b4b2e864e1abd4ea20845750e9567225bb3f417e.md", + "original_doc_id": "B4B2E864E1ABD4EA20845750E9567225BB3F417E", + "path": "corpus/watsonx-docsqa/docs/b4b2e864e1abd4ea20845750e9567225bb3f417e.md", + "title": "Relations extraction", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-relation-extraction.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a152f3047c3b41f06773051ea4b5b6b14dde709e.md", + "original_doc_id": "A152F3047C3B41F06773051EA4B5B6B14DDE709E", + "path": "corpus/watsonx-docsqa/docs/a152f3047c3b41f06773051ea4b5b6b14dde709e.md", + "title": "Sentiment classification", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-sentiment.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/dce29488a4d041b77f6e9b1b514f41335fae0696.md", + "original_doc_id": "DCE29488A4D041B77F6E9B1B514F41335FAE0696", + "path": "corpus/watsonx-docsqa/docs/dce29488a4d041b77f6e9b1b514f41335fae0696.md", + "title": "Syntax analysis", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-syntax.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/abca967cd96ab805be518e8a52ef984499c62f6c.md", + "original_doc_id": "ABCA967CD96AB805BE518E8A52EF984499C62F6C", + "path": "corpus/watsonx-docsqa/docs/abca967cd96ab805be518e8a52ef984499c62f6c.md", + "title": "Tone classification", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-tone.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9e2277ec0ed75ec2871c8bccb4b9af3f78350c9b.md", + "original_doc_id": "9E2277EC0ED75EC2871C8BCCB4B9AF3F78350C9B", + "path": "corpus/watsonx-docsqa/docs/9e2277ec0ed75ec2871c8bccb4b9af3f78350c9b.md", + "title": "Classifying text with a custom classification model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-classify-text.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/97c26f347fd5a13fbc5b24fc567fcf7adf8ce0c3.md", + "original_doc_id": "97C26F347FD5A13FBC5B24FC567FCF7ADF8CE0C3", + "path": "corpus/watsonx-docsqa/docs/97c26f347fd5a13fbc5b24fc567fcf7adf8ce0c3.md", + "title": "Creating your own models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-create-model.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/34bc2f43f99778ffa7e2c3e414c3cfb32509276d.md", + "original_doc_id": "34BC2F43F99778FFA7E2C3E414C3CFB32509276D", + "path": "corpus/watsonx-docsqa/docs/34bc2f43f99778ffa7e2c3e414c3cfb32509276d.md", + "title": "Detecting entities with a custom dictionary", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-entities-dict.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6ace7c519d2c4fca9fc0498bce82f75ffa05cffd.md", + "original_doc_id": "6ACE7C519D2C4FCA9FC0498BCE82F75FFA05CFFD", + "path": "corpus/watsonx-docsqa/docs/6ace7c519d2c4fca9fc0498bce82f75ffa05cffd.md", + "title": "Detecting entities with regular expressions", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-entities-regex.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d71261b71a4cf5a1ad5e148ede7751b630060bdf.md", + "original_doc_id": "D71261B71A4CF5A1AD5E148EDE7751B630060BDF", + "path": "corpus/watsonx-docsqa/docs/d71261b71a4cf5a1ad5e148ede7751b630060bdf.md", + "title": "Detecting entities with a custom transformer model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-entities-transformer.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/355ea8bd00a0246eacfef090af6a6b6f2bd92d4f.md", + "original_doc_id": "355EA8BD00A0246EACFEF090AF6A6B6F2BD92D4F", + "path": "corpus/watsonx-docsqa/docs/355ea8bd00a0246eacfef090af6a6b6f2bd92d4f.md", + "title": "Extracting sentiment with a custom transformer model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-extract-sentiment.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d174298e1dd7898c08771488715d83fc7a7740ae.md", + "original_doc_id": "D174298E1DD7898C08771488715D83FC7A7740AE", + "path": "corpus/watsonx-docsqa/docs/d174298e1dd7898c08771488715d83fc7a7740ae.md", + "title": "Working with pre-trained models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-pretrained.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/174d6fdf73627d7b2258d7f351c3d0156c06d1dc.md", + "original_doc_id": "174D6FDF73627D7B2258D7F351C3D0156C06D1DC", + "path": "corpus/watsonx-docsqa/docs/174d6fdf73627d7b2258d7f351c3d0156c06d1dc.md", + "title": "Category types", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-returned-categories.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d92a34a349cee727b017af7d40b880b232220959.md", + "original_doc_id": "D92A34A349CEE727B017AF7D40B880B232220959", + "path": "corpus/watsonx-docsqa/docs/d92a34a349cee727b017af7d40b880b232220959.md", + "title": "Watson Natural Language Processing library usage samples", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-samples.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/715abfb108ed8f6361d07762656dbd0443c57904.md", + "original_doc_id": "715ABFB108ED8F6361D07762656DBD0443C57904", + "path": "corpus/watsonx-docsqa/docs/715abfb108ed8f6361d07762656dbd0443c57904.md", + "title": "Extracting targets sentiment with a custom transformer model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-target-sentiment.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f7e8527824e15b4194a3fd12ceee049f910016db.md", + "original_doc_id": "F7E8527824E15B4194A3FD12CEEE049F910016DB", + "path": "corpus/watsonx-docsqa/docs/f7e8527824e15b4194a3fd12ceee049f910016db.md", + "title": "Watson Natural Language Processing library", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0eceac44da213d067b5b5ea66694e6283457a441.md", + "original_doc_id": "0ECEAC44DA213D067B5B5EA66694E6283457A441", + "path": "corpus/watsonx-docsqa/docs/0eceac44da213d067b5b5ea66694e6283457a441.md", + "title": "ibm-watson-studio-lib for Python", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b019692a5844a9a72292a35b8953aa67836f8201.md", + "original_doc_id": "B019692A5844A9A72292A35B8953AA67836F8201", + "path": "corpus/watsonx-docsqa/docs/b019692a5844a9a72292a35b8953aa67836f8201.md", + "title": "ibm-watson-studio-lib for R", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-r.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/23060b35041c9abd00099b1e0b1d83daff453c6d.md", + "original_doc_id": "23060B35041C9ABD00099B1E0B1D83DAFF453C6D", + "path": "corpus/watsonx-docsqa/docs/23060b35041c9abd00099b1e0b1d83daff453c6d.md", + "title": "Collaboration roles for governance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-collab-roles.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/074c9baeb0177e3cf57bac36e5fcbd13063498a1.md", + "original_doc_id": "074C9BAEB0177E3CF57BAC36E5FCBD13063498A1", + "path": "corpus/watsonx-docsqa/docs/074c9baeb0177e3cf57bac36e5fcbd13063498a1.md", + "title": "Governing assets in AI use cases", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-create-use-case.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0f13adfc739d217925ddcebb152284565bd43de8.md", + "original_doc_id": "0F13ADFC739D217925DDCEBB152284565BD43DE8", + "path": "corpus/watsonx-docsqa/docs/0f13adfc739d217925ddcebb152284565bd43de8.md", + "title": "Customizing details for a use case or factsheet", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-customize-user-facts.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0bd226c12cb659bf7711fe30c594e548525dbbd2.md", + "original_doc_id": "0BD226C12CB659BF7711FE30C594E548525DBBD2", + "path": "corpus/watsonx-docsqa/docs/0bd226c12cb659bf7711fe30c594e548525dbbd2.md", + "title": "Governing external models", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-external-models.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3334dccdb9872c1e7f698751b138aa5af6cc8335.md", + "original_doc_id": "3334DCCDB9872C1E7F698751B138AA5AF6CC8335", + "path": "corpus/watsonx-docsqa/docs/3334dccdb9872c1e7f698751b138aa5af6cc8335.md", + "title": "Viewing a factsheet for a tracked asset", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-factsheet-viewing.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/391dbd504569f02ccc48b181e3b953198c8f3c8a.md", + "original_doc_id": "391DBD504569F02CCC48B181E3B953198C8F3C8A", + "path": "corpus/watsonx-docsqa/docs/391dbd504569f02ccc48b181e3b953198c8f3c8a.md", + "title": "Managing an inventory for AI use cases", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-inventory-manage.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6a186d2c83108a0288bdfe3d4cea201ac0837503.md", + "original_doc_id": "6A186D2C83108A0288BDFE3D4CEA201AC0837503", + "path": "corpus/watsonx-docsqa/docs/6a186d2c83108a0288bdfe3d4cea201ac0837503.md", + "title": "Managing attachments for AI use cases", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-manage-attachments.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/538ecae0b5aa21e499f39c2637764a05bff7b6b6.md", + "original_doc_id": "538ECAE0B5AA21E499F39C2637764A05BFF7B6B6", + "path": "corpus/watsonx-docsqa/docs/538ecae0b5aa21e499f39c2637764a05bff7b6b6.md", + "title": "Managing and customizing report templates", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-manage-reports.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c6223eeb52369b6b2baa2b489c9da41c882154b9.md", + "original_doc_id": "C6223EEB52369B6B2BAA2B489C9DA41C882154B9", + "path": "corpus/watsonx-docsqa/docs/c6223eeb52369b6b2baa2b489c9da41c882154b9.md", + "title": "Watsonx.governance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a85e898f28ac27daa8961337a9b468004c1b8b21.md", + "original_doc_id": "A85E898F28AC27DAA8961337A9B468004C1B8B21", + "path": "corpus/watsonx-docsqa/docs/a85e898f28ac27daa8961337a9b468004c1b8b21.md", + "title": "Planning for AI governance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-plan.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/71479786e864b942786028481e30dfb35e422ba8.md", + "original_doc_id": "71479786E864B942786028481E30DFB35E422BA8", + "path": "corpus/watsonx-docsqa/docs/71479786e864b942786028481e30dfb35e422ba8.md", + "title": "Tracking a machine learning model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-track-ml-model.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0e6365d1dd3ec522c4da68b662f05a0120617593.md", + "original_doc_id": "0E6365D1DD3EC522C4DA68B662F05A0120617593", + "path": "corpus/watsonx-docsqa/docs/0e6365d1dd3ec522c4da68b662f05a0120617593.md", + "title": "Tracking prompt templates", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-track-prompt-temp.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f30cf59adffcbe4164483b5a63260724a1dfc7ca.md", + "original_doc_id": "F30CF59ADFFCBE4164483B5A63260724A1DFC7CA", + "path": "corpus/watsonx-docsqa/docs/f30cf59adffcbe4164483b5a63260724a1dfc7ca.md", + "title": "Tracking assets in an AI use case", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-tracking-overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8be1a39cdbaaa858051954548474dd3e307b20cb.md", + "original_doc_id": "8BE1A39CDBAAA858051954548474DD3E307B20CB", + "path": "corpus/watsonx-docsqa/docs/8be1a39cdbaaa858051954548474dd3e307b20cb.md", + "title": "Setting up an AI use case", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-use-cases.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1f14865c04b28b02ee0760d7099554a916e26926.md", + "original_doc_id": "1F14865C04B28B02EE0760D7099554A916E26926", + "path": "corpus/watsonx-docsqa/docs/1f14865c04b28b02ee0760d7099554a916e26926.md", + "title": "Creating the catalog for platform connections", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/catalog/platform-assets.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/58b70fac914f72c4ae9116de6e26880e1cedcff4.md", + "original_doc_id": "58B70FAC914F72C4AE9116DE6E26880E1CEDCFF4", + "path": "corpus/watsonx-docsqa/docs/58b70fac914f72c4ae9116de6e26880e1cedcff4.md", + "title": "Stop using services or IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/console/stopapps.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f964efda57733a3b39890b30ff22bd5c47eed893.md", + "original_doc_id": "F964EFDA57733A3B39890B30FF22BD5C47EED893", + "path": "corpus/watsonx-docsqa/docs/f964efda57733a3b39890b30ff22bd5c47eed893.md", + "title": "Managing IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_console.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/39ad64c9004e83507a968c5c0b1c8ef952b3eace.md", + "original_doc_id": "39AD64C9004E83507A968C5C0B1C8EF952B3EACE", + "path": "corpus/watsonx-docsqa/docs/39ad64c9004e83507a968c5c0b1c8ef952b3eace.md", + "title": "Setting up IBM Cloud Object Storage for use with IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/322e404e76067637f1d0afdf44cbe309c2a53221.md", + "original_doc_id": "322E404E76067637F1D0AFDF44CBE309C2A53221", + "path": "corpus/watsonx-docsqa/docs/322e404e76067637f1d0afdf44cbe309c2a53221.md", + "title": "Accessibility features in IBM watsonx content and documentation", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/accessibility.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c3552c5e0f334c8bc3557960821dc5ef931851a1.md", + "original_doc_id": "C3552C5E0F334C8BC3557960821DC5EF931851A1", + "path": "corpus/watsonx-docsqa/docs/c3552c5e0f334c8bc3557960821dc5ef931851a1.md", + "title": "Activities for assets", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/asset-activities.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/256ed6ca079a147359a51199dc333b23c2708b42.md", + "original_doc_id": "256ED6CA079A147359A51199DC333B23C2708B42", + "path": "corpus/watsonx-docsqa/docs/256ed6ca079a147359a51199dc333b23c2708b42.md", + "title": "Asset types and properties", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c562415979d3b38aa74c27fd68f13d54ffe47fe5.md", + "original_doc_id": "C562415979D3B38AA74C27FD68F13D54FFE47FE5", + "path": "corpus/watsonx-docsqa/docs/c562415979d3b38aa74c27fd68f13d54ffe47fe5.md", + "title": "Adding associated services to a project", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assoc-services.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e45c894cb0df39ad55a35183d62a6cbd570076ca.md", + "original_doc_id": "E45C894CB0DF39AD55A35183D62A6CBD570076CA", + "path": "corpus/watsonx-docsqa/docs/e45c894cb0df39ad55a35183d62a6cbd570076ca.md", + "title": "Browser support", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/browser-support.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e2089a0f2315f9897f6e3dde50e4fc3ebd2e65aa.md", + "original_doc_id": "E2089A0F2315F9897F6E3DDE50E4FC3EBD2E65AA", + "path": "corpus/watsonx-docsqa/docs/e2089a0f2315f9897f6e3dde50e4fc3ebd2e65aa.md", + "title": "Project collaborators", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/de79f406db76b8d50a2b8ab35d4a385983aa5f54.md", + "original_doc_id": "DE79F406DB76B8D50A2B8AB35D4A385983AA5F54", + "path": "corpus/watsonx-docsqa/docs/de79f406db76b8d50a2b8ab35d4a385983aa5f54.md", + "title": "Project collaborator roles and permissions", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborator-permissions.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/41ad83283a66cc3c467f70ea638b9c1c6681a160.md", + "original_doc_id": "41AD83283A66CC3C467F70EA638B9C1C6681A160", + "path": "corpus/watsonx-docsqa/docs/41ad83283a66cc3c467f70ea638b9c1c6681a160.md", + "title": "Comparison of IBM watsonx as a Service and Cloud Pak for Data as a Service", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/compare-platforms.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/812c39cf410f9fe3f0d0e7c62ed1bc015370c849.md", + "original_doc_id": "812C39CF410F9FE3F0D0E7C62ED1BC015370C849", + "path": "corpus/watsonx-docsqa/docs/812c39cf410f9fe3f0d0e7c62ed1bc015370c849.md", + "title": "Frequently asked questions", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2bb452b4c9e3458bc02a9d392961e9c643e402de.md", + "original_doc_id": "2BB452B4C9E3458BC02A9D392961E9C643E402DE", + "path": "corpus/watsonx-docsqa/docs/2bb452b4c9e3458bc02a9d392961e9c643e402de.md", + "title": "Feature differences between watsonx deployments", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/feature-matrix.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ec03e18490e47db0efbd6a00bda7ddb85b0a14d7.md", + "original_doc_id": "EC03E18490E47DB0EFBD6A00BDA7DDB85B0A14D7", + "path": "corpus/watsonx-docsqa/docs/ec03e18490e47db0efbd6a00bda7ddb85b0a14d7.md", + "title": "Get help", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-help.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/292d19849e8fbe48869f5e3a50439964563a90d1.md", + "original_doc_id": "292D19849E8FBE48869F5E3A50439964563A90D1", + "path": "corpus/watsonx-docsqa/docs/292d19849e8fbe48869f5e3a50439964563a90d1.md", + "title": "Quick start: Analyze data in a Jupyter notebook", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/316974f0a70ee2199bf6cd912e62bfb53d200f0a.md", + "original_doc_id": "316974F0A70EE2199BF6CD912E62BFB53D200F0A", + "path": "corpus/watsonx-docsqa/docs/316974f0a70ee2199bf6cd912e62bfb53d200f0a.md", + "title": "Quick start: Build and deploy a machine learning model in a Jupyter notebook", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f870af12bc30438b0dab4ff5365b5279f2f9a93a.md", + "original_doc_id": "F870AF12BC30438B0DAB4FF5365B5279F2F9A93A", + "path": "corpus/watsonx-docsqa/docs/f870af12bc30438b0dab4ff5365b5279f2f9a93a.md", + "title": "Quick start: Build a model using SPSS Modeler", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e14c56a78f56157e862de99906254b291f5b3321.md", + "original_doc_id": "E14C56A78F56157E862DE99906254B291F5B3321", + "path": "corpus/watsonx-docsqa/docs/e14c56a78f56157e862de99906254b291f5b3321.md", + "title": "Quick start: Build and deploy a machine learning model with AutoAI", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c535650c17cde010eacbf5b6bf85fd8e593b77d6.md", + "original_doc_id": "C535650C17CDE010EACBF5B6BF85FD8E593B77D6", + "path": "corpus/watsonx-docsqa/docs/c535650c17cde010eacbf5b6bf85fd8e593b77d6.md", + "title": "Quick start: Build, run, and deploy a Decision Optimization model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7feb0313c4aa5133f215a847f2abaa025e83bb38.md", + "original_doc_id": "7FEB0313C4AA5133F215A847F2ABAA025E83BB38", + "path": "corpus/watsonx-docsqa/docs/7feb0313c4aa5133f215a847f2abaa025e83bb38.md", + "title": "Quick start: Evaluate and track a prompt template", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4e83416b551f557d5bda600450e6ccb7742eb51d.md", + "original_doc_id": "4E83416B551F557D5BDA600450E6CCB7742EB51D", + "path": "corpus/watsonx-docsqa/docs/4e83416b551f557d5bda600450e6ccb7742eb51d.md", + "title": "Quick start: Prompt a foundation model with the retrieval-augmented generation pattern", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/220e465dbc0c22ff06f80df18b25044dd1ebc787.md", + "original_doc_id": "220E465DBC0C22FF06F80DF18B25044DD1EBC787", + "path": "corpus/watsonx-docsqa/docs/220e465dbc0c22ff06f80df18b25044dd1ebc787.md", + "title": "Quick start: Generate synthetic tabular data", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-generate-data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/870bf64e17feb1bbdae7b35e9941db781f26ad6b.md", + "original_doc_id": "870BF64E17FEB1BBDAE7B35E9941DB781F26AD6B", + "path": "corpus/watsonx-docsqa/docs/870bf64e17feb1bbdae7b35e9941db781f26ad6b.md", + "title": "Quick start: Automate the lifecycle for a model with pipelines", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c038ba342a00562bcb7a569e4e2acb7349c9cef9.md", + "original_doc_id": "C038BA342A00562BCB7A569E4E2ACB7349C9CEF9", + "path": "corpus/watsonx-docsqa/docs/c038ba342a00562bcb7a569e4e2acb7349c9cef9.md", + "title": "Quick start: Prompt a foundation model using Prompt Lab", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/98aa3e34d14723232d266a85cbb9e2b1816b1aa5.md", + "original_doc_id": "98AA3E34D14723232D266A85CBB9E2B1816B1AA5", + "path": "corpus/watsonx-docsqa/docs/98aa3e34d14723232d266a85cbb9e2b1816b1aa5.md", + "title": "Quick start: Refine data", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8109b6380043ce464115025dd32a7a821fd56db7.md", + "original_doc_id": "8109B6380043CE464115025DD32A7A821FD56DB7", + "path": "corpus/watsonx-docsqa/docs/8109b6380043ce464115025dd32a7a821fd56db7.md", + "title": "Quick start: Tune a foundation model", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f495f5206c908fb1a31f18a8ab3ce9465164564c.md", + "original_doc_id": "F495F5206C908FB1A31F18A8AB3CE9465164564C", + "path": "corpus/watsonx-docsqa/docs/f495f5206c908fb1a31f18a8ab3ce9465164564c.md", + "title": "Getting started with IBM watsonx as a Service", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-wdp.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/aae40f1cc335a650c1eb806e404394da596fb433.md", + "original_doc_id": "AAE40F1CC335A650C1EB806E404394DA596FB433", + "path": "corpus/watsonx-docsqa/docs/aae40f1cc335a650c1eb806e404394da596fb433.md", + "title": "Known issues and limitations", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/known-issues.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e5ea38444d60150c0fd2eb498bf33793dde5fed2.md", + "original_doc_id": "E5EA38444D60150C0FD2EB498BF33793DDE5FED2", + "path": "corpus/watsonx-docsqa/docs/e5ea38444d60150c0fd2eb498bf33793dde5fed2.md", + "title": "Language support for the product and the documentation", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/localization.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f0db4483c93a5d14dbf8076c4dd42d22a4f8542d.md", + "original_doc_id": "F0DB4483C93A5D14DBF8076C4DD42D22A4F8542D", + "path": "corpus/watsonx-docsqa/docs/f0db4483c93a5d14dbf8076c4dd42d22a4f8542d.md", + "title": "Notices", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/notices.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e88edbb9a31f8b7c70fb3ba48136d9c3cd6767ac.md", + "original_doc_id": "E88EDBB9A31F8B7C70FB3BA48136D9C3CD6767AC", + "path": "corpus/watsonx-docsqa/docs/e88edbb9a31f8b7c70fb3ba48136d9c3cd6767ac.md", + "title": "Overview of IBM watsonx as a Service", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/overview-wx.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/64057aa641f9259654e5f08d996209ef8027a3af.md", + "original_doc_id": "64057AA641F9259654E5F08D996209EF8027A3AF", + "path": "corpus/watsonx-docsqa/docs/64057aa641f9259654e5f08d996209ef8027a3af.md", + "title": "Switching between the IBM watsonx as a Service and Cloud Pak for Data as a Service platforms", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/platform-switcher.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e3526b694c68c40edc206e216b454e63b83f3eba.md", + "original_doc_id": "E3526B694C68C40EDC206E216B454E63B83F3EBA", + "path": "corpus/watsonx-docsqa/docs/e3526b694c68c40edc206e216b454e63b83f3eba.md", + "title": "Asset contents or previews", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/previews.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/aa213d259727545c26401ad5cfb4916b6efbd18d.md", + "original_doc_id": "AA213D259727545C26401AD5CFB4916B6EFBD18D", + "path": "corpus/watsonx-docsqa/docs/aa213d259727545c26401ad5cfb4916b6efbd18d.md", + "title": "Profiles of data assets", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/profile.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b7bafad14d0bf628c14fe0821af01aee98a0ae62.md", + "original_doc_id": "B7BAFAD14D0BF628C14FE0821AF01AEE98A0AE62", + "path": "corpus/watsonx-docsqa/docs/b7bafad14d0bf628c14fe0821af01aee98a0ae62.md", + "title": "Creating a project", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c32fe380cf3083b6d85554063b5acb153fc1c8be.md", + "original_doc_id": "C32FE380CF3083B6D85554063B5ACB153FC1C8BE", + "path": "corpus/watsonx-docsqa/docs/c32fe380cf3083b6d85554063b5acb153fc1c8be.md", + "title": "Quick start tutorials", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8d2b29253c00ae6a20730d0c9ad3284dc0fcabf5.md", + "original_doc_id": "8D2B29253C00AE6A20730D0C9AD3284DC0FCABF5", + "path": "corpus/watsonx-docsqa/docs/8d2b29253c00ae6a20730d0c9ad3284dc0fcabf5.md", + "title": "Regional availability for services and features", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/regional-datactr.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f908a5f1d788e2597335215a464817436a3d3ed1.md", + "original_doc_id": "F908A5F1D788E2597335215A464817436A3D3ED1", + "path": "corpus/watsonx-docsqa/docs/f908a5f1d788e2597335215a464817436a3d3ed1.md", + "title": "Levels of user access roles in IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/roles.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/abfaaf84948b090c8ea099ff44cc8cd878371073.md", + "original_doc_id": "ABFAAF84948B090C8EA099FF44CC8CD878371073", + "path": "corpus/watsonx-docsqa/docs/abfaaf84948b090c8ea099ff44cc8cd878371073.md", + "title": "IBM Cloud account security", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-account.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/da7407d415b3eff25ca3dd588bba677cc8cd3494.md", + "original_doc_id": "DA7407D415B3EFF25CA3DD588BBA677CC8CD3494", + "path": "corpus/watsonx-docsqa/docs/da7407d415b3eff25ca3dd588bba677cc8cd3494.md", + "title": "Collaborator security", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-collab.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f0b03ce62e6dc8ac7598a8b8316c4bf8cea132d5.md", + "original_doc_id": "F0B03CE62E6DC8AC7598A8B8316C4BF8CEA132D5", + "path": "corpus/watsonx-docsqa/docs/f0b03ce62e6dc8ac7598a8b8316c4bf8cea132d5.md", + "title": "Data security", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4ef4409d11dd4d5360d711eea8e1e71dac4c0bd7.md", + "original_doc_id": "4EF4409D11DD4D5360D711EEA8E1E71DAC4C0BD7", + "path": "corpus/watsonx-docsqa/docs/4ef4409d11dd4d5360d711eea8e1e71dac4c0bd7.md", + "title": "Enterprise security", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-enterprise.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/aac63365f37f6b307ba343f45706e388d24245d4.md", + "original_doc_id": "AAC63365F37F6B307BA343F45706E388D24245D4", + "path": "corpus/watsonx-docsqa/docs/aac63365f37f6b307ba343f45706e388d24245d4.md", + "title": "Network security", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3a81b302ee01fdc0ac111cff3abfdb96e3a0cdd6.md", + "original_doc_id": "3A81B302EE01FDC0AC111CFF3ABFDB96E3A0CDD6", + "path": "corpus/watsonx-docsqa/docs/3a81b302ee01fdc0ac111cff3abfdb96e3a0cdd6.md", + "title": "Security for IBM watsonx", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/581f43aa02d6c6861d2fdf220617cf3fbb903ae5.md", + "original_doc_id": "581F43AA02D6C6861D2FDF220617CF3FBB903AE5", + "path": "corpus/watsonx-docsqa/docs/581f43aa02d6c6861d2fdf220617cf3fbb903ae5.md", + "title": "Keeping your data secure and compliant", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b0da6cd45bfd0d3a91f0b3c4e7615de23fe4f350.md", + "original_doc_id": "B0DA6CD45BFD0D3A91F0B3C4E7615DE23FE4F350", + "path": "corpus/watsonx-docsqa/docs/b0da6cd45bfd0d3a91f0b3c4e7615de23fe4f350.md", + "title": "Setting up the Watson Studio and Watson Machine Learning services", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/set-up-ws.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/91838636de3442e218fd7beccde866113d10ddf3.md", + "original_doc_id": "91838636DE3442E218FD7BECCDE866113D10DDF3", + "path": "corpus/watsonx-docsqa/docs/91838636de3442e218fd7beccde866113d10ddf3.md", + "title": "Managing users and access", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-access.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9fd50170823ef108e2cf4ebf083b0085845fc3be.md", + "original_doc_id": "9FD50170823EF108E2CF4EBF083B0085845FC3BE", + "path": "corpus/watsonx-docsqa/docs/9fd50170823ef108e2cf4ebf083b0085845fc3be.md", + "title": "Setting up the IBM Cloud account", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-account.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d0dece55336bc8393593243d829b9d4b1e6159fd.md", + "original_doc_id": "D0DECE55336BC8393593243D829B9D4B1E6159FD", + "path": "corpus/watsonx-docsqa/docs/d0dece55336bc8393593243d829b9d4b1e6159fd.md", + "title": "Add users to the account", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-addl-users.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/27db2218237b89f557d3702f4270288e4460e9cb.md", + "original_doc_id": "27DB2218237B89F557D3702F4270288E4460E9CB", + "path": "corpus/watsonx-docsqa/docs/27db2218237b89f557d3702f4270288e4460e9cb.md", + "title": "Setting up the IBM watsonx platform for administrators", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-platform.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/323d19f0757433758d1743b0a62dacc98d286ec5.md", + "original_doc_id": "323D19F0757433758D1743B0A62DACC98D286EC5", + "path": "corpus/watsonx-docsqa/docs/323d19f0757433758d1743b0a62dacc98d286ec5.md", + "title": "Signing up for IBM watsonx as a Service", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/signup-wx.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e334a64775ae571c661cdcc847669f0e20c207ff.md", + "original_doc_id": "E334A64775AE571C661CDCC847669F0E20C207FF", + "path": "corpus/watsonx-docsqa/docs/e334a64775ae571c661cdcc847669f0e20c207ff.md", + "title": "Video library", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5287ef2a9e06aaec6a8fe651feba2d46d2f07502.md", + "original_doc_id": "5287EF2A9E06AAEC6A8FE651FEBA2D46D2F07502", + "path": "corpus/watsonx-docsqa/docs/5287ef2a9e06aaec6a8fe651feba2d46d2f07502.md", + "title": "Visualizations of assets", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/visualizations.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/438b5abac4d30492c2f192ea551e9514df877831.md", + "original_doc_id": "438B5ABAC4D30492C2F192EA551E9514DF877831", + "path": "corpus/watsonx-docsqa/docs/438b5abac4d30492c2f192ea551e9514df877831.md", + "title": "IBM watsonx APIs", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wdp-apis.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5bc1631d896899d03e7d8dd2296c21656dd169ff.md", + "original_doc_id": "5BC1631D896899D03E7D8DD2296C21656DD169FF", + "path": "corpus/watsonx-docsqa/docs/5bc1631d896899d03e7d8dd2296c21656dd169ff.md", + "title": "What's new", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/whats-new.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/caaa2e09b5b6f7ac550e936268b45d3cb7a412a1.md", + "original_doc_id": "CAAA2E09B5B6F7AC550E936268B45D3CB7A412A1", + "path": "corpus/watsonx-docsqa/docs/caaa2e09b5b6f7ac550e936268b45d3cb7a412a1.md", + "title": "Watson Machine Learning plans and compute usage", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3df4040f4f2e5704ef44e6742585ee853a2f2a37.md", + "original_doc_id": "3DF4040F4F2E5704EF44E6742585EE853A2F2A37", + "path": "corpus/watsonx-docsqa/docs/3df4040f4f2e5704ef44e6742585ee853a2f2a37.md", + "title": "Watson Studio service plans", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/ws-plans.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b508da024ee4722c3919c4d1118cf0410713a9c5.md", + "original_doc_id": "B508DA024EE4722C3919C4D1118CF0410713A9C5", + "path": "corpus/watsonx-docsqa/docs/b508da024ee4722c3919c4d1118cf0410713a9c5.md", + "title": "Adding data to a project", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fd3b0e405075464c05c52e5bb0c414a870b06334.md", + "original_doc_id": "FD3B0E405075464C05C52E5BB0C414A870B06334", + "path": "corpus/watsonx-docsqa/docs/fd3b0e405075464c05c52e5bb0c414a870b06334.md", + "title": "Administering a project", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/admin-project.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1d21c3dd339c26916f6df1ef3124c9d2d39c9acc.md", + "original_doc_id": "1D21C3DD339C26916F6DF1EF3124C9D2D39C9ACC", + "path": "corpus/watsonx-docsqa/docs/1d21c3dd339c26916f6df1ef3124c9d2d39c9acc.md", + "title": "Amazon S3 connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-amazon-s3.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e73062f1e8466ab5604358a0ad0d66f31c81507c.md", + "original_doc_id": "E73062F1E8466AB5604358A0AD0D66F31C81507C", + "path": "corpus/watsonx-docsqa/docs/e73062f1e8466ab5604358a0ad0d66f31c81507c.md", + "title": "Setting up temporary credentials or a Role ARN for Amazon S3", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-az3-tempcreds.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/be1c1c3648cb7f6f6c394334554b1ecedc3504dd.md", + "original_doc_id": "BE1C1C3648CB7F6F6C394334554B1ECEDC3504DD", + "path": "corpus/watsonx-docsqa/docs/be1c1c3648cb7f6f6c394334554b1ecedc3504dd.md", + "title": "Amazon RDS for MySQL connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azrds-mysql.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/82199291da8dbb7656b03232f5be43ba4d343654.md", + "original_doc_id": "82199291DA8DBB7656B03232F5BE43BA4D343654", + "path": "corpus/watsonx-docsqa/docs/82199291da8dbb7656b03232f5be43ba4d343654.md", + "title": "Amazon RDS for Oracle connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azrds-oracle.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ec284ab3dc23241975f76e0519b531407042aef1.md", + "original_doc_id": "EC284AB3DC23241975F76E0519B531407042AEF1", + "path": "corpus/watsonx-docsqa/docs/ec284ab3dc23241975f76e0519b531407042aef1.md", + "title": "Amazon RDS for PostgreSQL connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azrds-postresql.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/47b819e4861856fab3c5627661edd8e59fbed8a2.md", + "original_doc_id": "47B819E4861856FAB3C5627661EDD8E59FBED8A2", + "path": "corpus/watsonx-docsqa/docs/47b819e4861856fab3c5627661edd8e59fbed8a2.md", + "title": "Microsoft Azure SQL Database connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azure-sql.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/270242015183da2517df613fd951623042268bee.md", + "original_doc_id": "270242015183DA2517DF613FD951623042268BEE", + "path": "corpus/watsonx-docsqa/docs/270242015183da2517df613fd951623042268bee.md", + "title": "Microsoft Azure Blob Storage connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azureblob.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bc75f4741f871360b8e3ce356754c329323306f7.md", + "original_doc_id": "BC75F4741F871360B8E3CE356754C329323306F7", + "path": "corpus/watsonx-docsqa/docs/bc75f4741f871360b8e3ce356754c329323306f7.md", + "title": "Microsoft Azure Data Lake Storage connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azuredls.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c832eb23963c0f4bcddb2dd45c8e67001aee8f4f.md", + "original_doc_id": "C832EB23963C0F4BCDDB2DD45C8E67001AEE8F4F", + "path": "corpus/watsonx-docsqa/docs/c832eb23963c0f4bcddb2dd45c8e67001aee8f4f.md", + "title": "Microsoft Azure File Storage connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azurefs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4800c7e7c443ec310d775747125585f4671534fc.md", + "original_doc_id": "4800C7E7C443EC310D775747125585F4671534FC", + "path": "corpus/watsonx-docsqa/docs/4800c7e7c443ec310d775747125585f4671534fc.md", + "title": "Google BigQuery connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-bigquery.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b481bde61eeba2cc6b2a0c1d9c43d8dd56ab2a08.md", + "original_doc_id": "B481BDE61EEBA2CC6B2A0C1D9C43D8DD56AB2A08", + "path": "corpus/watsonx-docsqa/docs/b481bde61eeba2cc6b2a0c1d9c43d8dd56ab2a08.md", + "title": "Box connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-box.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e03dd29f683c4f22a7084c9ab8f1488c380170f0.md", + "original_doc_id": "E03DD29F683C4F22A7084C9AB8F1488C380170F0", + "path": "corpus/watsonx-docsqa/docs/e03dd29f683c4f22a7084c9ab8f1488c380170f0.md", + "title": "Apache Cassandra connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cassandra.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d5d7bd00bd17efe339c848f46345f2192fda5c11.md", + "original_doc_id": "D5D7BD00BD17EFE339C848F46345F2192FDA5C11", + "path": "corpus/watsonx-docsqa/docs/d5d7bd00bd17efe339c848f46345f2192fda5c11.md", + "title": "Google Cloud Storage connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cloud-storage.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1d393a73ebc623578dd6da2c09c20e97fae074d4.md", + "original_doc_id": "1D393A73EBC623578DD6DA2C09C20E97FAE074D4", + "path": "corpus/watsonx-docsqa/docs/1d393a73ebc623578dd6da2c09c20e97fae074d4.md", + "title": "IBM Cloudant connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cloudant.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/dedc196b72e081228279b523ba3585aed93c2370.md", + "original_doc_id": "DEDC196B72E081228279B523BA3585AED93C2370", + "path": "corpus/watsonx-docsqa/docs/dedc196b72e081228279b523ba3585aed93c2370.md", + "title": "Cloudera Impala connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cloudera.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/981bcfc7f5817524cb8e0c9fe04e3f267a268926.md", + "original_doc_id": "981BCFC7F5817524CB8E0C9FE04E3F267A268926", + "path": "corpus/watsonx-docsqa/docs/981bcfc7f5817524cb8e0c9fe04e3f267a268926.md", + "title": "IBM Cognos Analytics connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cognos.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c119b8d62c156451a8b8665e8969422803527df3.md", + "original_doc_id": "C119B8D62C156451A8B8665E8969422803527DF3", + "path": "corpus/watsonx-docsqa/docs/c119b8d62c156451a8b8665e8969422803527df3.md", + "title": "IBM Cloud Databases for MySQL connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-compose-mysql.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cd1c58ad8e180ab922890fa8182ff7f51c589962.md", + "original_doc_id": "CD1C58AD8E180AB922890FA8182FF7F51C589962", + "path": "corpus/watsonx-docsqa/docs/cd1c58ad8e180ab922890fa8182ff7f51c589962.md", + "title": "IBM Cloud Object Storage (infrastructure) connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos-infra.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ea3e8b5797ee8a3fd8aa34ea9a1eeb6d81b6a779.md", + "original_doc_id": "EA3E8B5797EE8A3FD8AA34EA9A1EEB6D81B6A779", + "path": "corpus/watsonx-docsqa/docs/ea3e8b5797ee8a3fd8aa34ea9a1eeb6d81b6a779.md", + "title": "IBM Cloud Object Storage connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2bd7112457a8b916f3b4701580570c85ae1b520e.md", + "original_doc_id": "2BD7112457A8B916F3B4701580570C85AE1B520E", + "path": "corpus/watsonx-docsqa/docs/2bd7112457a8b916f3b4701580570c85ae1b520e.md", + "title": "Microsoft Azure Cosmos DB connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cosmosdb.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d377da7cf67645f321593fa8b1536be2f0753333.md", + "original_doc_id": "D377DA7CF67645F321593FA8B1536BE2F0753333", + "path": "corpus/watsonx-docsqa/docs/d377da7cf67645f321593fa8b1536be2f0753333.md", + "title": "IBM Watson Query connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-data-virtual.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/eba93b500af79fe9bc96ff2ffc71078766532a86.md", + "original_doc_id": "EBA93B500AF79FE9BC96FF2FFC71078766532A86", + "path": "corpus/watsonx-docsqa/docs/eba93b500af79fe9bc96ff2ffc71078766532a86.md", + "title": "IBM Cloud Databases for DataStax connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-datastax.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/323360f59c9e5c3d6be4b7cd36927c23c0dfa268.md", + "original_doc_id": "323360F59C9E5C3D6BE4B7CD36927C23C0DFA268", + "path": "corpus/watsonx-docsqa/docs/323360f59c9e5c3d6be4b7cd36927c23c0dfa268.md", + "title": "IBM Data Virtualization Manager for z/OS connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-datavirt-z.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/456a228a64c2ad85e66f1fe0de558b4a426b197c.md", + "original_doc_id": "456A228A64C2AD85E66F1FE0DE558B4A426B197C", + "path": "corpus/watsonx-docsqa/docs/456a228a64c2ad85e66f1fe0de558b4a426b197c.md", + "title": "IBM Db2 Big SQL connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-bigsql.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8c953b2300b547ad82edd9697cab8a5985f5ead3.md", + "original_doc_id": "8C953B2300B547AD82EDD9697CAB8A5985F5EAD3", + "path": "corpus/watsonx-docsqa/docs/8c953b2300b547ad82edd9697cab8a5985f5ead3.md", + "title": "IBM Db2 on Cloud connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-cloud.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c61d407536d31a069aa857469a0eebfef1c0e1b8.md", + "original_doc_id": "C61D407536D31A069AA857469A0EEBFEF1C0E1B8", + "path": "corpus/watsonx-docsqa/docs/c61d407536d31a069aa857469a0eebfef1c0e1b8.md", + "title": "IBM Db2 Warehouse connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-wh.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9b89a3b2d7e1868f15a28eacf6d5c6214f7f12b7.md", + "original_doc_id": "9B89A3B2D7E1868F15A28EACF6D5C6214F7F12B7", + "path": "corpus/watsonx-docsqa/docs/9b89a3b2d7e1868f15a28eacf6d5c6214f7f12b7.md", + "title": "IBM Db2 connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2a95f85cd3f7250fcba52d8fdd82d1502fc617d6.md", + "original_doc_id": "2A95F85CD3F7250FCBA52D8FDD82D1502FC617D6", + "path": "corpus/watsonx-docsqa/docs/2a95f85cd3f7250fcba52d8fdd82d1502fc617d6.md", + "title": "IBM Db2 for i connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2i.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/be7f45c3e17998a50b8414d623007ed668b37c04.md", + "original_doc_id": "BE7F45C3E17998A50B8414D623007ED668B37C04", + "path": "corpus/watsonx-docsqa/docs/be7f45c3e17998a50b8414d623007ed668b37c04.md", + "title": "IBM Db2 for z/OS connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2zos.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/92c74e7245dfe20bf93f1d73039ed4df95375c6f.md", + "original_doc_id": "92C74E7245DFE20BF93F1D73039ED4DF95375C6F", + "path": "corpus/watsonx-docsqa/docs/92c74e7245dfe20bf93f1d73039ed4df95375c6f.md", + "title": "IBM Cloud Databases for PostgreSQL connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-dbase-postgresql.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7551cb2bcd77b26ae0e05154a3e8cc51c070d707.md", + "original_doc_id": "7551CB2BCD77B26AE0E05154A3E8CC51C070D707", + "path": "corpus/watsonx-docsqa/docs/7551cb2bcd77b26ae0e05154a3e8cc51c070d707.md", + "title": "Apache Derby connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-derby.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e700c898ec2efe96c76c2cac042e063529b23d3b.md", + "original_doc_id": "E700C898EC2EFE96C76C2CAC042E063529B23D3B", + "path": "corpus/watsonx-docsqa/docs/e700c898ec2efe96c76c2cac042e063529b23d3b.md", + "title": "Dremio connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-dremio.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1c42359bdf665ebca2bae4b9b3d5108f8097bf34.md", + "original_doc_id": "1C42359BDF665EBCA2BAE4B9B3D5108F8097BF34", + "path": "corpus/watsonx-docsqa/docs/1c42359bdf665ebca2bae4b9b3d5108f8097bf34.md", + "title": "Dropbox connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-dropbox.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/36d7217bc75c917100ae7df27dc14fdb919d1609.md", + "original_doc_id": "36D7217BC75C917100AE7DF27DC14FDB919D1609", + "path": "corpus/watsonx-docsqa/docs/36d7217bc75c917100ae7df27dc14fdb919d1609.md", + "title": "Elasticsearch connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-elastic.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8a69dd7bead4adb82c87a200309cd63ecbd625d8.md", + "original_doc_id": "8A69DD7BEAD4ADB82C87A200309CD63ECBD625D8", + "path": "corpus/watsonx-docsqa/docs/8a69dd7bead4adb82c87a200309cd63ecbd625d8.md", + "title": "FTP (remote file system) connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-ftp.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/631559e8401c52c3aac6d64e1f9da0f765fc4846.md", + "original_doc_id": "631559E8401C52C3AAC6D64E1F9DA0F765FC4846", + "path": "corpus/watsonx-docsqa/docs/631559e8401c52c3aac6d64e1f9da0f765fc4846.md", + "title": "Generic S3 connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-generics3.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/908121c9993cbedb4916c19d84605a9728fd27e5.md", + "original_doc_id": "908121C9993CBEDB4916C19D84605A9728FD27E5", + "path": "corpus/watsonx-docsqa/docs/908121c9993cbedb4916c19d84605a9728fd27e5.md", + "title": "Greenplum connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-greenplum.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/049dc7fc73042985f3258ef2cf3bb05114f7f175.md", + "original_doc_id": "049DC7FC73042985F3258EF2CF3BB05114F7F175", + "path": "corpus/watsonx-docsqa/docs/049dc7fc73042985f3258ef2cf3bb05114f7f175.md", + "title": "Apache HDFS connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-hdfs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4451c208e0350c4c480f50929bd6735588b6f2bc.md", + "original_doc_id": "4451C208E0350C4C480F50929BD6735588B6F2BC", + "path": "corpus/watsonx-docsqa/docs/4451c208e0350c4c480f50929bd6735588b6f2bc.md", + "title": "Apache Hive connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-hive.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2245768521f36e6f2df594e1bf3111dd63cc824a.md", + "original_doc_id": "2245768521F36E6F2DF594E1BF3111DD63CC824A", + "path": "corpus/watsonx-docsqa/docs/2245768521f36e6f2df594e1bf3111dd63cc824a.md", + "title": "HTTP connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-http.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fa15a8a5795baec1d8933a768407294110203e03.md", + "original_doc_id": "FA15A8A5795BAEC1D8933A768407294110203E03", + "path": "corpus/watsonx-docsqa/docs/fa15a8a5795baec1d8933a768407294110203e03.md", + "title": "IBM Informix connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-informix.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/102d3d188e3edc4a4aa55f731966ebb22c827822.md", + "original_doc_id": "102D3D188E3EDC4A4AA55F731966EBB22C827822", + "path": "corpus/watsonx-docsqa/docs/102d3d188e3edc4a4aa55f731966ebb22c827822.md", + "title": "Looker connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-looker.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fecb1c7b603627e1cf1386ad0ebdfe57fa485f93.md", + "original_doc_id": "FECB1C7B603627E1CF1386AD0EBDFE57FA485F93", + "path": "corpus/watsonx-docsqa/docs/fecb1c7b603627e1cf1386ad0ebdfe57fa485f93.md", + "title": "MariaDB connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mariadb.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fd0ba49bf07fcc9caf384a50b3012f98e4f1d81e.md", + "original_doc_id": "FD0BA49BF07FCC9CAF384A50B3012F98E4F1D81E", + "path": "corpus/watsonx-docsqa/docs/fd0ba49bf07fcc9caf384a50b3012f98e4f1d81e.md", + "title": "MongoDB connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mongo.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3721517369cf4ea8476bcbb39040542ba2a212d8.md", + "original_doc_id": "3721517369CF4EA8476BCBB39040542BA2A212D8", + "path": "corpus/watsonx-docsqa/docs/3721517369cf4ea8476bcbb39040542ba2a212d8.md", + "title": "IBM Cloud Databases for MongoDB connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mongodb.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ba78048bad0ee0f455762254f562704769ea4149.md", + "original_doc_id": "BA78048BAD0EE0F455762254F562704769EA4149", + "path": "corpus/watsonx-docsqa/docs/ba78048bad0ee0f455762254f562704769ea4149.md", + "title": "MySQL connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mysql.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4ca6000dc674cb2486d905f8531fc19bc88f887a.md", + "original_doc_id": "4CA6000DC674CB2486D905F8531FC19BC88F887A", + "path": "corpus/watsonx-docsqa/docs/4ca6000dc674cb2486d905f8531fc19bc88f887a.md", + "title": "OData connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-odata.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/96b0df7161ff334810f77fe93235bd4d548164a7.md", + "original_doc_id": "96B0DF7161FF334810F77FE93235BD4D548164A7", + "path": "corpus/watsonx-docsqa/docs/96b0df7161ff334810f77fe93235bd4d548164a7.md", + "title": "Oracle connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-oracle.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4517071b8cdd91311a13decdd9d0a7fd761aa616.md", + "original_doc_id": "4517071B8CDD91311A13DECDD9D0A7FD761AA616", + "path": "corpus/watsonx-docsqa/docs/4517071b8cdd91311a13decdd9d0a7fd761aa616.md", + "title": "IBM Planning Analytics connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-plananalytics.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1bed610a414085e625bd32aae5ffac81b41f97e0.md", + "original_doc_id": "1BED610A414085E625BD32AAE5FFAC81B41F97E0", + "path": "corpus/watsonx-docsqa/docs/1bed610a414085e625bd32aae5ffac81b41f97e0.md", + "title": "PostgreSQL connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-postgresql.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2353ffc21b5b117f70eeec0e71c9d6fb2f6dc022.md", + "original_doc_id": "2353FFC21B5B117F70EEEC0E71C9D6FB2F6DC022", + "path": "corpus/watsonx-docsqa/docs/2353ffc21b5b117f70eeec0e71c9d6fb2f6dc022.md", + "title": "Presto connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-presto.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2b5427922d2d03f0fddfe73bbde7e8b8dcda6a60.md", + "original_doc_id": "2B5427922D2D03F0FDDFE73BBDE7E8B8DCDA6A60", + "path": "corpus/watsonx-docsqa/docs/2b5427922d2d03f0fddfe73bbde7e8b8dcda6a60.md", + "title": "IBM Netezza Performance Server connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-puredata.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/85dfc4b40da36a5d66892b5b231c9743c67d7e71.md", + "original_doc_id": "85DFC4B40DA36A5D66892B5B231C9743C67D7E71", + "path": "corpus/watsonx-docsqa/docs/85dfc4b40da36a5d66892b5b231c9743c67d7e71.md", + "title": "Amazon Redshift connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-redshift.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/02326495f914d005bde7360f0826e8c140816613.md", + "original_doc_id": "02326495F914D005BDE7360F0826E8C140816613", + "path": "corpus/watsonx-docsqa/docs/02326495f914d005bde7360f0826e8c140816613.md", + "title": "Salesforce.com connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-salesforce.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9288d1e76019a9d1f08873e515b9798906cc1c4b.md", + "original_doc_id": "9288D1E76019A9D1F08873E515B9798906CC1C4B", + "path": "corpus/watsonx-docsqa/docs/9288d1e76019a9d1f08873e515b9798906cc1c4b.md", + "title": "SAP ASE connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sap-ase.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/bc1ad7048032258f29e1d4081a2eec98b36d13cf.md", + "original_doc_id": "BC1AD7048032258F29E1D4081A2EEC98B36D13CF", + "path": "corpus/watsonx-docsqa/docs/bc1ad7048032258f29e1d4081a2eec98b36d13cf.md", + "title": "SAP IQ connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sap-iq.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6cd7b46e0c35165bfe21be4967b68481e9be840f.md", + "original_doc_id": "6CD7B46E0C35165BFE21BE4967B68481E9BE840F", + "path": "corpus/watsonx-docsqa/docs/6cd7b46e0c35165bfe21be4967b68481e9be840f.md", + "title": "SAP OData connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sapodata.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/8b9532adfc4fe3d9213bbe56da3323c759426287.md", + "original_doc_id": "8B9532ADFC4FE3D9213BBE56DA3323C759426287", + "path": "corpus/watsonx-docsqa/docs/8b9532adfc4fe3d9213bbe56da3323c759426287.md", + "title": "SingleStoreDB connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-singlestore.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0b5c4d75ea0a1cd2ade09184ee2b159e23033cae.md", + "original_doc_id": "0B5C4D75EA0A1CD2ADE09184EE2B159E23033CAE", + "path": "corpus/watsonx-docsqa/docs/0b5c4d75ea0a1cd2ade09184ee2b159e23033cae.md", + "title": "Snowflake connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-snowflake.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7946dcf2f69a7420490a7b5ca677c2273de5764b.md", + "original_doc_id": "7946DCF2F69A7420490A7B5CA677C2273DE5764B", + "path": "corpus/watsonx-docsqa/docs/7946dcf2f69a7420490a7b5ca677c2273de5764b.md", + "title": "Microsoft SQL Server connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sql-server.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f64414c7f435b4b5e5a681a5f561c07780037836.md", + "original_doc_id": "F64414C7F435B4B5E5A681A5F561C07780037836", + "path": "corpus/watsonx-docsqa/docs/f64414c7f435b4b5e5a681a5f561c07780037836.md", + "title": "IBM Cloud Data Engine connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sqlquery.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4b8ebfdf4ea9e571d53720fe09a2ce610aecbcb9.md", + "original_doc_id": "4B8EBFDF4EA9E571D53720FE09A2CE610AECBCB9", + "path": "corpus/watsonx-docsqa/docs/4b8ebfdf4ea9e571d53720fe09a2ce610aecbcb9.md", + "title": "Tableau connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-tableau.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/71a4244c07321f32f283e49cfd6d6afa19639744.md", + "original_doc_id": "71A4244C07321F32F283E49CFD6D6AFA19639744", + "path": "corpus/watsonx-docsqa/docs/71a4244c07321f32f283e49cfd6d6afa19639744.md", + "title": "Teradata connection", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-teradata.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/53ee442d78abe20aaa100dda3ff139e566842c2e.md", + "original_doc_id": "53EE442D78ABE20AAA100DDA3FF139E566842C2E", + "path": "corpus/watsonx-docsqa/docs/53ee442d78abe20aaa100dda3ff139e566842c2e.md", + "title": "Connectors", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2200315ea9da921edff8a3322417bb211f15b4eb.md", + "original_doc_id": "2200315EA9DA921EDFF8A3322417BB211F15B4EB", + "path": "corpus/watsonx-docsqa/docs/2200315ea9da921edff8a3322417bb211f15b4eb.md", + "title": "Adding data from a connection to a project", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d9b02a6929162af5f13e95c700ce0e548f6a9ee3.md", + "original_doc_id": "D9B02A6929162AF5F13E95C700CE0E548F6A9EE3", + "path": "corpus/watsonx-docsqa/docs/d9b02a6929162af5f13e95c700ce0e548f6a9ee3.md", + "title": "Controlling access to Cloud Object Storage buckets", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/cos_buckets.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a7f2612ad7178c8afa4c8b7c2f210a10dd7ee5cc.md", + "original_doc_id": "A7F2612AD7178C8AFA4C8B7C2F210A10DD7EE5CC", + "path": "corpus/watsonx-docsqa/docs/a7f2612ad7178c8afa4c8b7c2f210a10dd7ee5cc.md", + "title": "Adding connections to projects", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1093c3d02f71f4fba221375302d20bc761e70aef.md", + "original_doc_id": "1093C3D02F71F4FBA221375302D20BC761E70AEF", + "path": "corpus/watsonx-docsqa/docs/1093c3d02f71f4fba221375302d20bc761e70aef.md", + "title": "Creating jobs in Data Refinery", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-dr.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fb9d913b400e9f00e6aa6eff7a7c8a84f5762dc9.md", + "original_doc_id": "FB9D913B400E9F00E6AA6EFF7A7C8A84F5762DC9", + "path": "corpus/watsonx-docsqa/docs/fb9d913b400e9f00e6aa6eff7a7c8a84f5762dc9.md", + "title": "Creating jobs in the Notebook editor", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-nb-editor.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/1c863b2624ab2712318442337c917143c19e7ddd.md", + "original_doc_id": "1C863B2624AB2712318442337C917143C19E7DDD", + "path": "corpus/watsonx-docsqa/docs/1c863b2624ab2712318442337c917143c19e7ddd.md", + "title": "Creating jobs for Pipelines", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-pipelines.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/27fcab0041feb8b819e329a319b12d2f4167318a.md", + "original_doc_id": "27FCAB0041FEB8B819E329A319B12D2F4167318A", + "path": "corpus/watsonx-docsqa/docs/27fcab0041feb8b819e329a319b12d2f4167318a.md", + "title": "Creating SPSS Modeler jobs", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-spss.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9370eeef3d5414148efc5cc390b4efbe3020f23d.md", + "original_doc_id": "9370EEEF3D5414148EFC5CC390B4EFBE3020F23D", + "path": "corpus/watsonx-docsqa/docs/9370eeef3d5414148efc5cc390b4efbe3020f23d.md", + "title": "Downloading data assets from a project", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/download.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/eee6714a8cf20e18ea398651b41e0278071ee42b.md", + "original_doc_id": "EEE6714A8CF20E18EA398651B41E0278071EE42B", + "path": "corpus/watsonx-docsqa/docs/eee6714a8cf20e18ea398651b41e0278071ee42b.md", + "title": "Exporting a project", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/export-project.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a5c7cf086b303923d48f8ad63cf85a6bccbbe3f5.md", + "original_doc_id": "A5C7CF086B303923D48F8AD63CF85A6BCCBBE3F5", + "path": "corpus/watsonx-docsqa/docs/a5c7cf086b303923d48f8ad63cf85a6bccbbe3f5.md", + "title": "Managing feature groups (beta)", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/feature-group.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5f398f2a5f6a2e75b9376b755c3ecf4b7f18b149.md", + "original_doc_id": "5F398F2A5F6A2E75B9376B755C3ECF4B7F18B149", + "path": "corpus/watsonx-docsqa/docs/5f398f2a5f6a2e75b9376b755c3ecf4b7f18b149.md", + "title": "Adding a connected folder asset to a project", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/folder-asset.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e4eca1e5e22f94051d1c8e115d9d874658b5697a.md", + "original_doc_id": "E4ECA1E5E22F94051D1C8E115D9D874658B5697A", + "path": "corpus/watsonx-docsqa/docs/e4eca1e5e22f94051d1c8e115d9d874658b5697a.md", + "title": "Getting and preparing data in a project", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/get-data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a4cea84825e512a73c509437103b89b6ef363d5b.md", + "original_doc_id": "A4CEA84825E512A73C509437103B89B6EF363D5B", + "path": "corpus/watsonx-docsqa/docs/a4cea84825e512a73c509437103b89b6ef363d5b.md", + "title": "Importing a project", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/import-project.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/97b722619afc616f13beb20cd7a8fbc29cff50d1.md", + "original_doc_id": "97B722619AFC616F13BEB20CD7A8FBC29CFF50D1", + "path": "corpus/watsonx-docsqa/docs/97b722619afc616f13beb20cd7a8fbc29cff50d1.md", + "title": "Viewing jobs across projects", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/job-views-projs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/28c4d682b46e9723f538988bb2bdb1eb65618e5e.md", + "original_doc_id": "28C4D682B46E9723F538988BB2BDB1EB65618E5E", + "path": "corpus/watsonx-docsqa/docs/28c4d682b46e9723f538988bb2bdb1eb65618e5e.md", + "title": "Creating and managing jobs in a project", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/83198577cac405ad1a9bf68be7a5caeb020d57d4.md", + "original_doc_id": "83198577CAC405AD1A9BF68BE7A5CAEB020D57D4", + "path": "corpus/watsonx-docsqa/docs/83198577cac405ad1a9bf68be7a5caeb020d57d4.md", + "title": "Leaving a project", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/leave-project.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/784686da695f28f867bc35c4416cb8d767d58b7a.md", + "original_doc_id": "784686DA695F28F867BC35C4416CB8D767D58B7A", + "path": "corpus/watsonx-docsqa/docs/784686da695f28f867bc35c4416cb8d767d58b7a.md", + "title": "Managing assets in projects", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-assets.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7935b285f3e7dbbdcda940a70cf92dc0e2ed6512.md", + "original_doc_id": "7935B285F3E7DBBDCDA940A70CF92DC0E2ED6512", + "path": "corpus/watsonx-docsqa/docs/7935b285f3e7dbbdcda940a70cf92dc0e2ed6512.md", + "title": "Working in projects", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c324305e8f756140b7b96492d73d35bb32794119.md", + "original_doc_id": "C324305E8F756140B7B96492D73D35BB32794119", + "path": "corpus/watsonx-docsqa/docs/c324305e8f756140b7b96492d73d35bb32794119.md", + "title": "Marking a project as sensitive", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/mark-sensitive.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a6d3281cf9382fa606cf60727452a304a5ccdfa5.md", + "original_doc_id": "A6D3281CF9382FA606CF60727452A304A5CCDFA5", + "path": "corpus/watsonx-docsqa/docs/a6d3281cf9382fa606cf60727452a304a5ccdfa5.md", + "title": "Adding platform connections", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e70109f320a53829d66f6e07ee0a9b79b59aee13.md", + "original_doc_id": "E70109F320A53829D66F6E07EE0A9B79B59AEE13", + "path": "corpus/watsonx-docsqa/docs/e70109f320a53829d66f6e07ee0a9b79b59aee13.md", + "title": "Your sandbox project", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/sandbox.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/977c81385f7825613f1edbd3c0dbf44c259ba8d7.md", + "original_doc_id": "977C81385F7825613F1EDBD3C0DBF44C259BA8D7", + "path": "corpus/watsonx-docsqa/docs/977c81385f7825613f1edbd3c0dbf44c259ba8d7.md", + "title": "Searching for assets and artifacts across the platform", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/search-assets.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/44ba508199b214448cb22b7658127e16dd4e7abf.md", + "original_doc_id": "44BA508199B214448CB22B7658127E16DD4E7ABF", + "path": "corpus/watsonx-docsqa/docs/44ba508199b214448cb22b7658127e16dd4e7abf.md", + "title": "Connecting to data behind a firewall", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c122739764b1ec75b64e1b740f493bad8616a9db.md", + "original_doc_id": "C122739764B1EC75B64E1B740F493BAD8616A9DB", + "path": "corpus/watsonx-docsqa/docs/c122739764b1ec75b64e1b740f493bad8616a9db.md", + "title": "Adding very large objects to a project's Cloud Object Storage", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/store-large-objs-in-cos.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3e791f66ad3d5fd3da45d85f27d6a1a7621a4cd3.md", + "original_doc_id": "3E791F66AD3D5FD3DA45D85F27D6A1A7621A4CD3", + "path": "corpus/watsonx-docsqa/docs/3e791f66ad3d5fd3da45d85f27d6a1a7621a4cd3.md", + "title": "Switching the platform for a project", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/switch-platform.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6922b4d2cb89eb1ef4aa112af8b7922327062b95.md", + "original_doc_id": "6922B4D2CB89EB1EF4AA112AF8B7922327062B95", + "path": "corpus/watsonx-docsqa/docs/6922b4d2cb89eb1ef4aa112af8b7922327062b95.md", + "title": "Adding task credentials", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/task-credentials.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/92b00bee2e48f01962bbbbac49cf87587710f35f.md", + "original_doc_id": "92B00BEE2E48F01962BBBBAC49CF87587710F35F", + "path": "corpus/watsonx-docsqa/docs/92b00bee2e48f01962bbbbac49cf87587710f35f.md", + "title": "Workload identity federation examples", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/wif-examples.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/777f72f32fd20e96c4a5f0cca461fe9a79334e96.md", + "original_doc_id": "777F72F32FD20E96C4A5F0CCA461FE9A79334E96", + "path": "corpus/watsonx-docsqa/docs/777f72f32fd20e96c4a5f0cca461fe9a79334e96.md", + "title": "Evaluating AI models with Watson OpenScale", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/getting-started.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/ac97ce4d4df6402240f1a6a67dfb9462bc1fafac.md", + "original_doc_id": "AC97CE4D4DF6402240F1A6A67DFB9462BC1FAFAC", + "path": "corpus/watsonx-docsqa/docs/ac97ce4d4df6402240f1a6a67dfb9462bc1fafac.md", + "title": "Configuring drift v2 evaluations in watsonx.governance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-driftv2-config.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f8ebee6125bee635dd8af7bf2f6340d58ce99958.md", + "original_doc_id": "F8EBEE6125BEE635DD8AF7BF2F6340D58CE99958", + "path": "corpus/watsonx-docsqa/docs/f8ebee6125bee635dd8af7bf2f6340d58ce99958.md", + "title": "Evaluating prompt templates in deployment spaces", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-eval-prompt-spaces.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b8581c38346f1fe8900d18db8fcef8145f5965bc.md", + "original_doc_id": "B8581C38346F1FE8900D18DB8FCEF8145F5965BC", + "path": "corpus/watsonx-docsqa/docs/b8581c38346f1fe8900d18db8fcef8145f5965bc.md", + "title": "Evaluating prompt templates in projects", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-eval-prompt.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/259e5a974f6170cbfdf7b0014cc1a0a0111423de.md", + "original_doc_id": "259E5A974F6170CBFDF7B0014CC1A0A0111423DE", + "path": "corpus/watsonx-docsqa/docs/259e5a974f6170cbfdf7b0014cc1a0a0111423de.md", + "title": "Feedback logging in watsonx.governance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-feedback-logging.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/dac8a5e350d74e41c1738f4e2a02258fecf9d20d.md", + "original_doc_id": "DAC8A5E350D74E41C1738F4E2A02258FECF9D20D", + "path": "corpus/watsonx-docsqa/docs/dac8a5e350d74e41c1738f4e2a02258fecf9d20d.md", + "title": "Managing data for model evaluations in watsonx.governance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-manage-data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/fb7f7b9a220c66f7e3407ca9553d974cd4a14402.md", + "original_doc_id": "FB7F7B9A220C66F7E3407CA9553D974CD4A14402", + "path": "corpus/watsonx-docsqa/docs/fb7f7b9a220c66f7e3407ca9553d974cd4a14402.md", + "title": "Managing feedback data for watsonx.governance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-manage-feedback-data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d2f4f71189d7f5c92ddc2ccb38f2bce1efd4bc65.md", + "original_doc_id": "D2F4F71189D7F5C92DDC2CCB38F2BCE1EFD4BC65", + "path": "corpus/watsonx-docsqa/docs/d2f4f71189d7f5c92ddc2ccb38f2bce1efd4bc65.md", + "title": "Managing payload data for watsonx.governance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-manage-payload-data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2339deef952ecf06246f2a5daed6925e00f52d64.md", + "original_doc_id": "2339DEEF952ECF06246F2A5DAED6925E00F52D64", + "path": "corpus/watsonx-docsqa/docs/2339deef952ecf06246f2a5daed6925e00f52d64.md", + "title": "watsonx.governance model health monitor evaluation metrics", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-model-health-metrics.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/cccf5ec3e34e81e3e25ffe29317cdac2ed1c936d.md", + "original_doc_id": "CCCF5EC3E34E81E3E25FFE29317CDAC2ED1C936D", + "path": "corpus/watsonx-docsqa/docs/cccf5ec3e34e81e3e25ffe29317cdac2ed1c936d.md", + "title": "Configuring quality evaluations in watsonx.governance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-monitor-accuracy.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2ec85cf6ab5e5a276da78f1129ad3f1f5c92f5bb.md", + "original_doc_id": "2EC85CF6AB5E5A276DA78F1129AD3F1F5C92F5BB", + "path": "corpus/watsonx-docsqa/docs/2ec85cf6ab5e5a276da78f1129ad3f1f5c92f5bb.md", + "title": "watsonx.governance generative AI quality evaluations", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-monitor-gen-quality.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b924d359f00db1671f86aca7a3ee226206dfbed1.md", + "original_doc_id": "B924D359F00DB1671F86ACA7A3EE226206DFBED1", + "path": "corpus/watsonx-docsqa/docs/b924d359f00db1671f86aca7a3ee226206dfbed1.md", + "title": "Configuring model evaluations in watsonx.governance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-monitors-overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/de9ce5d0599d0d181890911721738ba3dee01e34.md", + "original_doc_id": "DE9CE5D0599D0D181890911721738BA3DEE01E34", + "path": "corpus/watsonx-docsqa/docs/de9ce5d0599d0d181890911721738ba3dee01e34.md", + "title": "Payload logging in watsonx.governance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-payload-logging.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e54340e1ef02d2436758a56105b3182481ff1783.md", + "original_doc_id": "E54340E1EF02D2436758A56105B3182481FF1783", + "path": "corpus/watsonx-docsqa/docs/e54340e1ef02d2436758a56105b3182481ff1783.md", + "title": "watsonx.governance offering plan options", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-plan-options.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e45eeb80195e54d02a6f6cb7505f1fb73b4d4dab.md", + "original_doc_id": "E45EEB80195E54D02A6F6CB7505F1FB73B4D4DAB", + "path": "corpus/watsonx-docsqa/docs/e45eeb80195e54d02a6f6cb7505f1fb73b4d4dab.md", + "title": "Watson OpenScale offering plan options", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-plan-options2.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/6199bbb097894542ea31c726d8ef4a3357eed1e2.md", + "original_doc_id": "6199BBB097894542EA31C726D8EF4A3357EED1E2", + "path": "corpus/watsonx-docsqa/docs/6199bbb097894542ea31c726d8ef4a3357eed1e2.md", + "title": "Provisioning and launching watsonx.governance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-provision-launch.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/60cc59b176b08462143ea591dac074060ad988c7.md", + "original_doc_id": "60CC59B176B08462143EA591DAC074060AD988C7", + "path": "corpus/watsonx-docsqa/docs/60cc59b176b08462143ea591dac074060ad988c7.md", + "title": "Sending model transactions in watsonx.governance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-send-model-transactions.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/422554c1dcebabc93cb859b4a896908da48a540d.md", + "original_doc_id": "422554C1DCEBABC93CB859B4A896908DA48A540D", + "path": "corpus/watsonx-docsqa/docs/422554c1dcebabc93cb859b4a896908da48a540d.md", + "title": "Setting up watsonx.governance", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-setup-wos.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/225192bb81696d14887cc55070a6dfa14b3315f7.md", + "original_doc_id": "225192BB81696D14887CC55070A6DFA14B3315F7", + "path": "corpus/watsonx-docsqa/docs/225192bb81696d14887cc55070a6dfa14b3315f7.md", + "title": "Adding data to Data Refinery", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/asset_browser.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5b0b25c87c4c2d91e8376d2aff3726e4ca355f36.md", + "original_doc_id": "5B0B25C87C4C2D91E8376D2AFF3726E4CA355F36", + "path": "corpus/watsonx-docsqa/docs/5b0b25c87c4c2d91e8376d2aff3726e4ca355f36.md", + "title": "Interactive code templates in Data Refinery", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/code_operations.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0999f59bb8e2e2ab7722d57cdbc051a0984abe45.md", + "original_doc_id": "0999F59BB8E2E2AB7722D57CDBC051A0984ABE45", + "path": "corpus/watsonx-docsqa/docs/0999f59bb8e2e2ab7722d57cdbc051a0984abe45.md", + "title": "Managing Data Refinery flows", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/9c03418999e6b01345837d9dd0f8e0410ed5cb7d.md", + "original_doc_id": "9C03418999E6B01345837D9DD0F8E0410ED5CB7D", + "path": "corpus/watsonx-docsqa/docs/9c03418999e6b01345837d9dd0f8e0410ed5cb7d.md", + "title": "CLEANSE", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/gui_operations.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/82b2c3e8a59998daa1bc70938a0155ec8c9ed3a1.md", + "original_doc_id": "82B2C3E8A59998DAA1BC70938A0155EC8C9ED3A1", + "path": "corpus/watsonx-docsqa/docs/82b2c3e8a59998daa1bc70938a0155ec8c9ed3a1.md", + "title": "Validating your data in Data Refinery", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/metrics.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4b74e9409284f77897db58b77271337a4493a410.md", + "original_doc_id": "4B74E9409284F77897DB58B77271337A4493A410", + "path": "corpus/watsonx-docsqa/docs/4b74e9409284f77897db58b77271337a4493a410.md", + "title": "Supported data sources for Data Refinery", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refinery-datasources.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/653f494ee7f3d688fcaeb05aff303354d718eab5.md", + "original_doc_id": "653F494EE7F3D688FCAEB05AFF303354D718EAB5", + "path": "corpus/watsonx-docsqa/docs/653f494ee7f3d688fcaeb05aff303354d718eab5.md", + "title": "Refining data", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/751abcab00f67c93c253ec74d686e2cfcc0062ad.md", + "original_doc_id": "751ABCAB00F67C93C253EC74D686E2CFCC0062AD", + "path": "corpus/watsonx-docsqa/docs/751abcab00f67c93c253ec74d686e2cfcc0062ad.md", + "title": "Troubleshooting Data Refinery", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/ts_index.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/b8aa7399868c0ae8dd698c9048ebd50c3f17ef12.md", + "original_doc_id": "B8AA7399868C0AE8DD698C9048EBD50C3F17EF12", + "path": "corpus/watsonx-docsqa/docs/b8aa7399868c0ae8dd698c9048ebd50c3f17ef12.md", + "title": "Visualizing your data in Data Refinery", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/visualizations.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a4e9fae09be2f3c0191cbc14a56085b0773a2585.md", + "original_doc_id": "A4E9FAE09BE2F3C0191CBC14A56085B0773A2585", + "path": "corpus/watsonx-docsqa/docs/a4e9fae09be2f3c0191cbc14a56085b0773a2585.md", + "title": "Accessing data in AWS through access points from a notebook", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/satellite/satellite-connect-s3-bucket.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/eef0f3c3dc121f5c389e547bd20f2aa807074028.md", + "original_doc_id": "EEF0F3C3DC121F5C389E547BD20F2AA807074028", + "path": "corpus/watsonx-docsqa/docs/eef0f3c3dc121f5c389e547bd20f2aa807074028.md", + "title": "Key management by application", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/key-management-by-application.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/e778331bf398f2db0f6477ef689d0dd6a2aaa81e.md", + "original_doc_id": "E778331BF398F2DB0F6477EF689D0DD6A2AAA81E", + "path": "corpus/watsonx-docsqa/docs/e778331bf398f2db0f6477ef689d0dd6a2aaa81e.md", + "title": "Key management by KMS", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/key-management-by-kms.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/339f2ebdad7cd0a3445bdf69c69ab7b28b4353c4.md", + "original_doc_id": "339F2EBDAD7CD0A3445BDF69C69AB7B28B4353C4", + "path": "corpus/watsonx-docsqa/docs/339f2ebdad7cd0a3445bdf69c69ab7b28b4353c4.md", + "title": "Parquet modular encryption", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/parquet-encryption.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/2d08edd168fbee078290f386f7ec3eb1998adf02.md", + "original_doc_id": "2D08EDD168FBEE078290F386F7EC3EB1998ADF02", + "path": "corpus/watsonx-docsqa/docs/2d08edd168fbee078290f386f7ec3eb1998adf02.md", + "title": "Time reference system", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-reference-system.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0108f00736882ac35e3c56cd3ce0d91bcb5798a8.md", + "original_doc_id": "0108F00736882AC35E3C56CD3CE0D91BCB5798A8", + "path": "corpus/watsonx-docsqa/docs/0108f00736882ac35e3c56cd3ce0d91bcb5798a8.md", + "title": "Time series functions", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-functions.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/a6587cbe69b6227ce1d087cc141ccf13669f2060.md", + "original_doc_id": "A6587CBE69B6227CE1D087CC141CCF13669F2060", + "path": "corpus/watsonx-docsqa/docs/a6587cbe69b6227ce1d087cc141ccf13669f2060.md", + "title": "Time series key functionality", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-key-functionality.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f3c0ad81bbf56463510440f7f81eb146a6c0015c.md", + "original_doc_id": "F3C0AD81BBF56463510440F7F81EB146A6C0015C", + "path": "corpus/watsonx-docsqa/docs/f3c0ad81bbf56463510440f7f81eb146a6c0015c.md", + "title": "Time series lazy evaluation", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-lazy-evaluation.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/22d15f386dc333bc069eea8671e895c97956e754.md", + "original_doc_id": "22D15F386DC333BC069EEA8671E895C97956E754", + "path": "corpus/watsonx-docsqa/docs/22d15f386dc333bc069eea8671e895c97956e754.md", + "title": "Using the time series library", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-lib-using.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d5521b8ec8ced84a2e383b3b6d5bc20795ef87b7.md", + "original_doc_id": "D5521B8EC8CED84A2E383B3B6D5BC20795EF87B7", + "path": "corpus/watsonx-docsqa/docs/d5521b8ec8ced84a2e383b3b6d5bc20795ef87b7.md", + "title": "Time series analysis", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-lib.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/7e8d1f67fd96a81ff6d9459c1310919908000cbf.md", + "original_doc_id": "7E8D1F67FD96A81FF6D9459C1310919908000CBF", + "path": "corpus/watsonx-docsqa/docs/7e8d1f67fd96a81ff6d9459c1310919908000cbf.md", + "title": "Exporting synthetic data", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/export_data_sd.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/c52d7d525c33eb8fa5b5acc8b16243223d78ac68.md", + "original_doc_id": "C52D7D525C33EB8FA5B5ACC8B16243223D78AC68", + "path": "corpus/watsonx-docsqa/docs/c52d7d525c33eb8fa5b5acc8b16243223d78ac68.md", + "title": "Creating synthetic data from a custom data schema", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/generate_data_sd.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/204f36069ee071b185a1bce8370946a50bddcdd5.md", + "original_doc_id": "204F36069EE071B185A1BCE8370946A50BDDCDD5", + "path": "corpus/watsonx-docsqa/docs/204f36069ee071b185a1bce8370946a50bddcdd5.md", + "title": "Creating synthetic data from imported data", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/import_data_sd.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/971ae69d7d2a527c25f31a6c8d8d64ee68b48519.md", + "original_doc_id": "971AE69D7D2A527C25F31A6C8D8D64EE68B48519", + "path": "corpus/watsonx-docsqa/docs/971ae69d7d2a527c25f31a6c8d8d64ee68b48519.md", + "title": "Creating synthetic data from production data", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/mask_mimic_data_sd.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/30a8256a4972314da32827a081b7541138b454a9.md", + "original_doc_id": "30A8256A4972314DA32827A081B7541138B454A9", + "path": "corpus/watsonx-docsqa/docs/30a8256a4972314da32827a081b7541138b454a9.md", + "title": "Creating Synthetic data", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/synthetic_data_overview_sd.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/448502b5d06cd5bcaa58f569aa43aa2e0394a794.md", + "original_doc_id": "448502B5D06CD5BCAA58F569AA43AA2E0394A794", + "path": "corpus/watsonx-docsqa/docs/448502b5d06cd5bcaa58f569aa43aa2e0394a794.md", + "title": "Troubleshoot Watson Machine Learning", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/4a7f60f563f15cc32060c5f17cb44699a221ad5e.md", + "original_doc_id": "4A7F60F563F15CC32060C5F17CB44699A221AD5E", + "path": "corpus/watsonx-docsqa/docs/4a7f60f563f15cc32060c5f17cb44699a221ad5e.md", + "title": "IBM Cloud services status", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/service-status.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5a6081124d93acd0a12843f64984257a02bb3871.md", + "original_doc_id": "5A6081124D93ACD0A12843F64984257A02BB3871", + "path": "corpus/watsonx-docsqa/docs/5a6081124d93acd0a12843f64984257a02bb3871.md", + "title": "Troubleshooting connections", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/troubleshoot-conn.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/5d1bca52e974c3f4de54366a242df751e73acbd2.md", + "original_doc_id": "5D1BCA52E974C3F4DE54366A242DF751E73ACBD2", + "path": "corpus/watsonx-docsqa/docs/5d1bca52e974c3f4de54366a242df751e73acbd2.md", + "title": "Troubleshooting Cloud Object Storage for projects", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/troubleshoot-cos.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/3e24051d290e000441a4fdb326d73bb81505bd05.md", + "original_doc_id": "3E24051D290E000441A4FDB326D73BB81505BD05", + "path": "corpus/watsonx-docsqa/docs/3e24051d290e000441a4fdb326d73bb81505bd05.md", + "title": "Troubleshooting", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/troubleshoot.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/d0907278ca0ea55b0e0ed9e834810d502a817af0.md", + "original_doc_id": "D0907278CA0EA55B0E0ED9E834810D502A817AF0", + "path": "corpus/watsonx-docsqa/docs/d0907278ca0ea55b0e0ed9e834810d502a817af0.md", + "title": "Troubleshooting Synthetic Data Generator", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ts_sd.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/0b35e778b109957ee1cc48fa8e46ed7a1633e380.md", + "original_doc_id": "0B35E778B109957EE1CC48FA8E46ED7A1633E380", + "path": "corpus/watsonx-docsqa/docs/0b35e778b109957ee1cc48fa8e46ed7a1633e380.md", + "title": "Troubleshooting Watson OpenScale", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/wos-troubleshoot.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/93a3a5e1a633eb2ab616759dfb76dc433abd4d38.md", + "original_doc_id": "93A3A5E1A633EB2AB616759DFB76DC433ABD4D38", + "path": "corpus/watsonx-docsqa/docs/93a3a5e1a633eb2ab616759dfb76dc433abd4d38.md", + "title": "Troubleshooting Watson Studio on IBM Cloud", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/wscloud-troubleshoot.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f7b2dd759b6fc618d53ad49053c24ef8d35105c5.md", + "original_doc_id": "F7B2DD759B6FC618D53AD49053C24EF8D35105C5", + "path": "corpus/watsonx-docsqa/docs/f7b2dd759b6fc618d53ad49053c24ef8d35105c5.md", + "title": "Deploying and managing assets", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/wmls/wmls-deploy-overview.html?context=cdpaas&locale=en" + }, + { + "doc_id": "docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md", + "original_doc_id": "F003581774D3028EF53E61A002C20A6D36BA8E00", + "path": "corpus/watsonx-docsqa/docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md", + "title": "Glossary", + "url": "https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en" + } + ] +} \ No newline at end of file diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/00205c92c52fa28db619ee1f9c8d76fe8564db88.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/00205c92c52fa28db619ee1f9c8d76fe8564db88.md new file mode 100644 index 0000000..f2f9cf5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/00205c92c52fa28db619ee1f9c8d76fe8564db88.md @@ -0,0 +1,9 @@ +# History node (SPSS Modeler) + +# History node # + +History nodes are most often used for sequential data, such as time series data\. + +They are used to create new fields containing data from fields in previous records\. When using a History node, you may want to use data that is presorted by a particular field\. You can use a Sort node to do this\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0093065541aa4c3e90e47e3ace89596155ea1735.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0093065541aa4c3e90e47e3ace89596155ea1735.md new file mode 100644 index 0000000..0bb06b5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0093065541aa4c3e90e47e3ace89596155ea1735.md @@ -0,0 +1,26 @@ +# Selecting functions (SPSS Modeler) + +# Selecting functions # + +The function list displays all available SPSS Modeler functions and operators\. Scroll to select a function from the list, or, for easier searching, use the drop\-down list to display a subset of functions or operators\. Available functions are grouped into categories for easier searching\. + +Most of these categories are described in the Reference section of the CLEM language description\. For more information, see [Functions reference](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref.html#clem_function_ref)\. + +The other categories are as follows\. + + + + * General Functions\. Contains a selection of some of the most commonly\-used functions\. + * Recently Used\. Contains a list of CLEM functions used within the current session\. + * @ Functions\. Contains a list of all the special functions, which have their names preceded by an "@" sign\. Note: The `@DIFF1(FIELD1,FIELD2)` and `@DIFF2(FIELD1,FIELD2)` functions require that the two field types are the same (for example, both Integer or both Long or both Real)\. + * Database Functions\. If the flow includes a database connection, this selection lists the functions available from within that database, including user\-defined functions (UDFs)\. For more information, see [Database functions](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/expressionbuild_database_functions.html#expressionbuild_database_functions)\. + * Database Aggregates\. If the flow includes a database connection, this selection lists the aggregation options available from within that database\. These options are available in the Expression Builder of the Aggregate node\. + * Built\-In Aggregates\. Contains a list of the possible modes of aggregation that can be used\. + * Operators\. Lists all the operators you can use when building expressions\. Operators are also available from the buttons in the center of the dialog box\. + * All Functions\. Contains a complete list of available CLEM functions\. + + + +Double\-click a function to insert it into the expression field at the position of the cursor\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0108f00736882ac35e3c56cd3ce0d91bcb5798a8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0108f00736882ac35e3c56cd3ce0d91bcb5798a8.md new file mode 100644 index 0000000..37c17fa --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0108f00736882ac35e3c56cd3ce0d91bcb5798a8.md @@ -0,0 +1,300 @@ +# Time series functions + +# Time series functions # + +Time series functions are aggregate functions that operate on sequences of data values measured at points in time\. + +The following sections describe some of the time series functions available in different time series packages\. + +## Transforms ## + +Transforms are functions that are applied on a time series resulting in another time series\. The time series library supports various types of transforms, including provided transforms (by using `from tspy.functions import transformers`) as well as user defined transforms\. + +The following sample shows some provided transforms: + + #Interpolation + >>> ts = tspy.time_series([1.0, 2.0, 3.0, 4.0, 5.0, 6.0]) + >>> periodicity = 2 + >>> interp = interpolators.nearest(0.0) + >>> interp_ts = ts.resample(periodicity, interp) + >>> interp_ts.print() + TimeStamp: 0 Value: 1.0 + TimeStamp: 2 Value: 3.0 + TimeStamp: 4 Value: 5.0 + + #Fillna + >>> shift_ts = ts.shift(2) + print("shifted ts to add nulls") + print(shift_ts) + print("\nfilled ts to make nulls 0s") + null_filled_ts = shift_ts.fillna(interpolators.fill(0.0)) + print(null_filled_ts) + + shifted ts to add nulls + TimeStamp: 0 Value: null + TimeStamp: 1 Value: null + TimeStamp: 2 Value: 1.0 + TimeStamp: 3 Value: 2.0 + TimeStamp: 4 Value: 3.0 + TimeStamp: 5 Value: 4.0 + + filled ts to make nulls 0s + TimeStamp: 0 Value: 0.0 + TimeStamp: 1 Value: 0.0 + TimeStamp: 2 Value: 1.0 + TimeStamp: 3 Value: 2.0 + TimeStamp: 4 Value: 3.0 + TimeStamp: 5 Value: 4.0 + + # Additive White Gaussian Noise (AWGN) + >>> noise_ts = ts.transform(transformers.awgn(mean=0.0,sd=.03)) + >>> print(noise_ts) + TimeStamp: 0 Value: 0.9962378841388397 + TimeStamp: 1 Value: 1.9681980879378596 + TimeStamp: 2 Value: 3.0289374962174405 + TimeStamp: 3 Value: 3.990728648807705 + TimeStamp: 4 Value: 4.935338359740761 + + TimeStamp: 5 Value: 6.03395072999318 + +## Segmentation ## + +Segmentation or windowing is the process of splitting a time series into multiple segments\. The time series library supports various forms of segmentation and allows creating user\-defined segments as well\. + + + + * Window based segmentation + + This type of segmentation of a time series is based on user specified segment sizes. The segments can be record based or time based. There are options that allow for creating tumbling as well as sliding window based segments. + + >>> import tspy + >>> ts_orig = tspy.builder() + .add(tspy.observation(1,1.0)) + .add(tspy.observation(2,2.0)) + .add(tspy.observation(6,6.0)) + .result().to_time_series() + >>> ts_orig + timestamp: 1 Value: 1.0 + timestamp: 2 Value: 2.0 + timestamp: 6 Value: 6.0 + + >>> ts = ts_orig.segment_by_time(3,1) + >>> ts + timestamp: 1 Value: original bounds: (1,3) actual bounds: (1,2) observations: [(1,1.0),(2,2.0)] + timestamp: 2 Value: original bounds: (2,4) actual bounds: (2,2) observations: [(2,2.0)] + timestamp: 3 Value: this segment is empty + timestamp: 4 Value: original bounds: (4,6) actual bounds: (6,6) observations: [(6,6.0)] + * Anchor based segmentation + + Anchor based segmentation is a very important type of segmentation that creates a segment by anchoring on a specific lambda, which can be a simple value. An example is looking at events that preceded a 500 error or examining values after observing an anomaly. Variants of anchor based segmentation include providing a range with multiple markers. + + >>> import tspy + >>> ts_orig = tspy.time_series([1.0, 2.0, 3.0, 4.0, 5.0]) + >>> ts_orig + timestamp: 0 Value: 1.0 + timestamp: 1 Value: 2.0 + timestamp: 2 Value: 3.0 + timestamp: 3 Value: 4.0 + timestamp: 4 Value: 5.0 + + >>> ts = ts_orig.segment_by_anchor(lambda x: x % 2 == 0, 1, 2) + >>> ts + timestamp: 1 Value: original bounds: (0,3) actual bounds: (0,3) observations: [(0,1.0),(1,2.0),(2,3.0),(3,4.0)] + timestamp: 3 Value: original bounds: (2,5) actual bounds: (2,4) observations: [(2,3.0),(3,4.0),(4,5.0)] + * Segmenters + + There are several specialized segmenters provided out of the box by importing the `segmenters` package (using `from tspy.functions import segmenters`). An example segmenter is one that uses regression to segment a time series: + + >>> ts = tspy.time_series([1.0,2.0,3.0,4.0,5.0,2.0,1.0,-1.0,50.0,53.0,56.0]) + >>> max_error = .5 + >>> skip = 1 + >>> reg_sts = ts.to_segments(segmenters.regression(max_error,skip,use_relative=True)) + >>> reg_sts + + timestamp: 0 Value: range: (0, 4) outliers: {} + timestamp: 5 Value: range: (5, 7) outliers: {} + timestamp: 8 Value: range: (8, 10) outliers: {} + + + +## Reducers ## + +A reducer is a function that is applied to the values across a set of time series to produce a single value\. The time series `reducer` functions are similar to the reducer concept used by Hadoop/Spark\. This single value can be a collection, but more generally is a single object\. An example of a reducer function is averaging the values in a time series\. + +Several `reducer` functions are supported, including: + + + + * Distance reducers + + Distance reducers are a class of reducers that compute the distance between two time series. The library supports numeric as well as categorical distance functions on sequences. These include time warping distance measurements such as Itakura Parallelogram, Sakoe-Chiba Band, DTW non-constrained and DTW non-time warped contraints. Distribution distances such as Hungarian distance and Earth-Movers distance are also available. + + For categorical time series distance measurements, you can use Damerau Levenshtein and Jaro-Winkler distance measures. + + >>> from tspy.functions import * + >>> ts = tspy.time_series([1.0, 2.0, 3.0, 4.0, 5.0, 6.0]) + >>> ts2 = ts.transform(transformers.awgn(sd=.3)) + >>> dtw_distance = ts.reduce(ts2,reducers.dtw(lambda obs1, obs2: abs(obs1.value - obs2.value))) + >>> print(dtw_distance) + 1.8557981638880405 + * Math reducers + + Several convenient math reducers for numeric time series are provided. These include basic ones such as average, sum, standard deviation, and moments. Entropy, kurtosis, FFT and variants of it, various correlations, and histogram are also included. A convenient basic summarization reducer is the `describe` function that provides basic information about the time series. + + >>> from tspy.functions import * + >>> ts = tspy.time_series([1.0, 2.0, 3.0, 4.0, 5.0, 6.0]) + >>> ts2 = ts.transform(transformers.awgn(sd=.3)) + >>> corr = ts.reduce(ts2, reducers.correlation()) + >>> print(corr) + 0.9938941942380525 + + >>> adf = ts.reduce(reducers.adf()) + >>> print(adf) + pValue: -3.45 + satisfies test: false + + >>> ts2 = ts.transform(transformers.awgn(sd=.3)) + >>> granger = ts.reduce(ts2, reducers.granger(1)) + >>> print(granger) #f_stat, p_value, R2 + -1.7123613937876463,-3.874412217575385,1.0 + * Another basic reducer that is very useful for getting a first order understanding of the time series is the describe reducer\. The following illustrates this reducer: + + >>> desc = ts.describe() + >>> print(desc) + min inter-arrival-time: 1 + max inter-arrival-time: 1 + mean inter-arrival-time: 1.0 + top: null + unique: 6 + frequency: 1 + first: TimeStamp: 0 Value: 1.0 + last: TimeStamp: 5 Value: 6.0 + count: 6 + mean:3.5 + std:1.707825127659933 + min:1.0 + max:6.0 + 25%:1.75 + 50%:3.5 + 75%:5.25 + + + +## Temporal joins ## + +The library includes functions for temporal joins or joining time series based on their timestamps\. The join functions are similar to those in a database, including left, right, outer, inner, left outer, right outer joins, and so on\. The following sample codes shows some of these join functions: + + # Create a collection of observations (materialized TimeSeries) + observations_left = tspy.observations(tspy.observation(1, 0.0), tspy.observation(3, 1.0), tspy.observation(8, 3.0), tspy.observation(9, 2.5)) + observations_right = tspy.observations(tspy.observation(2, 2.0), tspy.observation(3, 1.5), tspy.observation(7, 4.0), tspy.observation(9, 5.5), tspy.observation(10, 4.5)) + + # Build TimeSeries from Observations + ts_left = observations_left.to_time_series() + ts_right = observations_right.to_time_series() + + # Perform full join + ts_full = ts_left.full_join(ts_right) + print(ts_full) + + TimeStamp: 1 Value: [0.0, null] + TimeStamp: 2 Value: [null, 2.0] + TimeStamp: 3 Value: [1.0, 1.5] + TimeStamp: 7 Value: [null, 4.0] + TimeStamp: 8 Value: [3.0, null] + TimeStamp: 9 Value: [2.5, 5.5] + TimeStamp: 10 Value: [null, 4.5] + + # Perform left align with interpolation + ts_left_aligned, ts_right_aligned = ts_left.left_align(ts_right, interpolators.nearest(0.0)) + + print("left ts result") + print(ts_left_aligned) + print("right ts result") + print(ts_right_aligned) + + left ts result + TimeStamp: 1 Value: 0.0 + TimeStamp: 3 Value: 1.0 + TimeStamp: 8 Value: 3.0 + TimeStamp: 9 Value: 2.5 + right ts result + TimeStamp: 1 Value: 0.0 + TimeStamp: 3 Value: 1.5 + TimeStamp: 8 Value: 4.0 + TimeStamp: 9 Value: 5.5 + +## Forecasting ## + +A key functionality provided by the time series library is forecasting\. The library includes functions for simple as well as complex forecasting models, including ARIMA, Exponential, Holt\-Winters, and BATS\. The following example shows the function to create a Holt\-Winters: + + import random + + model = tspy.forecasters.hws(samples_per_season=samples_per_season, initial_training_seasons=initial_training_seasons) + + for i in range(100): + timestamp = i + value = random.randint(1,10)* 1.0 + model.update_model(timestamp, value) + + print(model) + + Forecasting Model + Algorithm: HWSAdditive=5 (aLevel=0.001, bSlope=0.001, gSeas=0.001) level=6.087789839896166, slope=0.018901997884893912, seasonal(amp,per,avg)=(1.411203455586738,5, 0,-0.0037471500727535465) + + #Is model init-ed + if model.is_initialized(): + print(model.forecast_at(120)) + + 6.334135728495107 + + ts = tspy.time_series([float(i) for i in range(10)]) + + print(ts) + + TimeStamp: 0 Value: 0.0 + TimeStamp: 1 Value: 1.0 + TimeStamp: 2 Value: 2.0 + TimeStamp: 3 Value: 3.0 + TimeStamp: 4 Value: 4.0 + TimeStamp: 5 Value: 5.0 + TimeStamp: 6 Value: 6.0 + TimeStamp: 7 Value: 7.0 + TimeStamp: 8 Value: 8.0 + TimeStamp: 9 Value: 9.0 + + num_predictions = 5 + model = tspy.forecasters.auto(8) + confidence = .99 + + predictions = ts.forecast(num_predictions, model, confidence=confidence) + + print(predictions.to_time_series()) + + TimeStamp: 10 Value: {value=10.0, lower_bound=10.0, upper_bound=10.0, error=0.0} + TimeStamp: 11 Value: {value=10.997862810553725, lower_bound=9.934621260488143, upper_bound=12.061104360619307, error=0.41277640121597475} + TimeStamp: 12 Value: {value=11.996821082897318, lower_bound=10.704895525154571, upper_bound=13.288746640640065, error=0.5015571318964149} + TimeStamp: 13 Value: {value=12.995779355240911, lower_bound=11.50957896664928, upper_bound=14.481979743832543, error=0.5769793776877866} + TimeStamp: 14 Value: {value=13.994737627584504, lower_bound=12.33653268707341, upper_bound=15.652942568095598, error=0.6437557559526337} + + print(predictions.to_time_series().to_df()) + + timestamp value lower_bound upper_bound error + 0 10 10.000000 10.000000 10.000000 0.000000 + 1 11 10.997863 9.934621 12.061104 0.412776 + 2 12 11.996821 10.704896 13.288747 0.501557 + 3 13 12.995779 11.509579 14.481980 0.576979 + 4 14 13.994738 12.336533 15.652943 0.643756 + +## Time series SQL ## + +The time series library is tightly integrated with Apache Spark\. By using new data types in Spark Catalyst, you are able to perform time series SQL operations that scale out horizontally using Apache Spark\. This enables you to easily use time series extensions in IBM Analytics Engine or in solutions that include IBM Analytics Engine functionality like the Watson Studio Spark environments\. + +SQL extensions cover most aspects of the time series functions, including segmentation, transformations, reducers, forecasting, and I/O\. See [Analyzing time series data](https://cloud.ibm.com/docs/sql-query?topic=sql-query-ts_intro)\. + +## Learn more ## + +To use the `tspy` Python SDK, see the [`tspy` Python SDK documentation](https://ibm-cloud.github.io/tspy-docs/)\. + +**Parent topic:**[Time series analysis](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-lib.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/015755c65c274f262396747d3f32a59ae74c08d7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/015755c65c274f262396747d3f32a59ae74c08d7.md new file mode 100644 index 0000000..8807035 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/015755c65c274f262396747d3f32a59ae74c08d7.md @@ -0,0 +1,17 @@ +# Tree-AS node (SPSS Modeler) + +# Tree\-AS node # + +The Tree\-AS node can be used with data in a distributed environment\. With this node, you can choose to build decision trees using either a CHAID or Exhaustive CHAID model\. + +CHAID, or Chi\-squared Automatic Interaction Detection, is a classification method for building decision trees by using chi\-square statistics to identify optimal splits\. + +CHAID first examines the crosstabulations between each of the input fields and the outcome, and tests for significance using a chi\-square independence test\. If more than one of these relations is statistically significant, CHAID will select the input field that is the most significant (smallest `p` value)\. If an input has more than two categories, these are compared, and categories that show no differences in the outcome are collapsed together\. This is done by successively joining the pair of categories showing the least significant difference\. This category\-merging process stops when all remaining categories differ at the specified testing level\. For nominal input fields, any categories can be merged; for an ordinal set, only contiguous categories can be merged\. + +Exhaustive CHAID is a modification of CHAID that does a more thorough job of examining all possible splits for each predictor but takes longer to compute\. + +Requirements\. Target and input fields can be continuous or categorical; nodes can be split into two or more subgroups at each level\. Any ordinal fields used in the model must have numeric storage (not string)\. If necessary, use the Reclassify node to convert them\. + +Strengths\. CHAID can generate nonbinary trees, meaning that some splits have more than two branches\. It therefore tends to create a wider tree than the binary growing methods\. CHAID works for all types of inputs, and it accepts both case weights and frequency variables\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/01800e00bdfb7cfe0e751fa6c616160c48e6ed21.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/01800e00bdfb7cfe0e751fa6c616160c48e6ed21.md new file mode 100644 index 0000000..98f9f57 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/01800e00bdfb7cfe0e751fa6c616160c48e6ed21.md @@ -0,0 +1,36 @@ +# Random Trees node (SPSS Modeler) + +# Random Trees node # + +The Random Trees node can be used with data in a distributed environment\. In this node, you build an ensemble model that consists of multiple decision trees\. + +The Random Trees node is a tree\-based classification and prediction method that is built on Classification and Regression Tree methodology\. As with C&R Tree, this prediction method uses recursive partitioning to split the training records into segments with similar output field values\. The node starts by examining the input fields available to it to find the best split, which is measured by the reduction in an impurity index that results from the split\. The split defines two subgroups, each of which is then split into two more subgroups, and so on, until one of the stopping criteria is triggered\. All splits are binary (only two subgroups)\. + +The Random Trees node uses bootstrap sampling with replacement to generate sample data\. The sample data is used to grow a tree model\. During tree growth, Random Trees will not sample the data again\. Instead, it randomly selects part of the predictors and uses the best one to split a tree node\. This process is repeated when splitting each tree node\. This is the basic idea of growing a tree in random forest\. + +Random Trees uses C&R Tree\-like trees\. Since such trees are binary, each field for splitting results in two branches\. For a categorical field with multiple categories, the categories are grouped into two groups based on the inner splitting criterion\. Each tree grows to the largest extent possible (there is no pruning)\. In scoring, Random Trees combines individual tree scores by majority voting (for classification) or average (for regression)\. + +Random Trees differ from C&R Trees as follows: + + + + * Random Trees nodes randomly select a specified number of predictors and uses the best one from the selection to split a node\. In contrast, C&R Tree finds the best one from all predictors\. + * Each tree in Random Trees grows fully until each leaf node typically contains a single record\. So the tree depth could be very large\. But standard C&R Tree uses different stopping rules for tree growth, which usually leads to a much shallower tree\. + + + +Random Trees adds two features compared to C&R Tree: + + + + * The first feature is bagging, where replicas of the training dataset are created by sampling with replacement from the original dataset\. This action creates bootstrap samples that are of equal size to the original dataset, after which a component model is built on each replica\. Together these component models form an ensemble model\. + * The second feature is that, at each split of the tree, only a sampling of the input fields is considered for the impurity measure\. + + + +Requirements\. To train a Random Trees model, you need one or more Input fields and one Target field\. Target and input fields can be continuous (numeric range) or categorical\. Fields that are set to either Both or None are ignored\. Fields that are used in the model must have their types fully instantiated, and any ordinal (ordered set) fields that are used in the model must have numeric storage (not string)\. If necessary, the Reclassify node can be used to convert them\. + +Strengths\. Random Trees models are robust when you are dealing with large data sets and numbers of fields\. Due to the use of bagging and field sampling, they are much less prone to overfitting and thus the results that are seen in testing are more likely to be repeated when you use new data\. + +Note: When first creating a flow, you select which runtime to use\. By default, flows use the IBM SPSS Modeler runtime\. If you want to use native Spark algorithms instead of SPSS algorithms, select the Spark runtime\. Properties for this node will vary depending on which runtime option you choose\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/01c8222216b795904018497993cc5e44d51a3b35.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/01c8222216b795904018497993cc5e44d51a3b35.md new file mode 100644 index 0000000..08d77d0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/01c8222216b795904018497993cc5e44d51a3b35.md @@ -0,0 +1,26 @@ +# Handling missing values (SPSS Modeler) + +# Handling missing values # + +You should decide how to treat missing values in light of your business or domain knowledge\. To ease training time and increase accuracy, you may want to remove blanks from your data set\. On the other hand, the presence of blank values may lead to new business opportunities or additional insights\. + +In choosing the best technique, you should consider the following aspects of your data: + + + + * Size of the data set + * Number of fields containing blanks + * Amount of missing information + + + +In general terms, there are two approaches you can follow: + + + + * You can exclude fields or records with missing values + * You can impute, replace, or coerce missing values using a variety of methods + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/02244f39be9a15fa55c94c9f2775606247969a61.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/02244f39be9a15fa55c94c9f2775606247969a61.md new file mode 100644 index 0000000..1221e2a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/02244f39be9a15fa55c94c9f2775606247969a61.md @@ -0,0 +1,55 @@ +# Introduction to modeling (SPSS Modeler) + +# Introduction to modeling # + +A model is a set of rules, formulas, or equations that can be used to predict an outcome based on a set of input fields or variables\. For example, a financial institution might use a model to predict whether loan applicants are likely to be good or bad risks, based on information that is already known about past applicants\. + +Video disclaimer: Some minor steps and graphical elements in these videos might differ from your platform\. + +[https://video\.ibm\.com/embed/recorded/131116287](https://video.ibm.com/embed/recorded/131116287) + +The ability to predict an outcome is the central goal of predictive analytics, and understanding the modeling process is the key to using flows in Watson Studio\. + +Figure 1\. A decision tree model + +![A decision tree model](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/spss-tree-diagram-Jun2023.png) + +This example uses a decision tree model, which classifies records (and predicts a response) using a series of decision rules\. For example: + + IF income = Medium + AND cards <5 + THEN -> 'Good' + +While this example uses a CHAID (Chi\-squared Automatic Interaction Detection) model, it is intended as a general introduction, and most of the concepts apply broadly to other modeling types in Watson Studio\. + +To understand any model, you first need to understand the data that goes into it\. The data in this example contains information about the customers of a bank\. The following fields are used: + + + +| Field name | Description | +| -------------- | ------------------------------------------------------------- | +| Credit\_rating | Credit rating: 0=Bad, 1=Good, 9=missing values | +| Age | Age in years | +| Income | Income level: 1=Low, 2=Medium, 3=High | +| Credit\_cards | Number of credit cards held: 1=Less than five, 2=Five or more | +| Education | Level of education: 1=High school, 2=College | +| Car\_loans | Number of car loans taken out: 1=None or one, 2=More than two | + + + +The bank maintains a database of historical information on customers who have taken out loans with the bank, including whether or not they repaid the loans (Credit rating = Good) or defaulted (Credit rating = Bad)\. Using this existing data, the bank wants to build a model that will enable them to predict how likely future loan applicants are to default on the loan\. + +Using a decision tree model, you can analyze the characteristics of the two groups of customers and predict the likelihood of loan defaults\. + +This example uses the flow named Introduction to Modeling, available in the example project \. The data file is tree\_credit\.csv\. + +Let's take a look at the flow\. + + + +1. Open the Example Project\. +2. Scroll down to the Modeler flows section, click View all, and select the Introduction to Modeling flow\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/02326495f914d005bde7360f0826e8c140816613.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/02326495f914d005bde7360f0826e8c140816613.md new file mode 100644 index 0000000..86f7a1d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/02326495f914d005bde7360f0826e8c140816613.md @@ -0,0 +1,89 @@ +# Salesforce.com connection + +# Salesforce\.com connection # + +To access your data in Salesforce\.com, create a connection asset for it\. + +Salesforce\.com is a cloud\-based software company which provides customer relationship management (CRM)\. The Salesforce\.com connection supports the standard SQL query language to select, insert, update, and delete data from Salesforce\.com products and other supported products that use the Salesforce API\. + +## Other supported products that use the Salesforce API ## + + + + * Salesforce AppExchange + * FinancialForce + * Service Cloud + * ServiceMax + * Veeva CRM + + + +## Create a connection to Salesforce\.com ## + +To create the connection asset, you need these connection details: + + + + * The username to access the Salesforce\.com server\. + * The password and security token to access the Salesforce\.com server\. In the **Password** field, append your security token to the end of your password\. For example, `MypasswordMyAccessToken`\. For information about access tokens, see [Reset Your Security Token](https://help.salesforce.com/articleView?id=sf.user_security_token.htm&type=5)\. + * The Salesforce\.com server name\. The default is `login.salesforce.com`\. + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Salesforce\.com connections in the following workspaces and tools: + +**Projects** + + + + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Restriction ## + +You can only use this connection for source data\. You cannot write to data or export data with this connection\. + +## Known issue ## + +The following objects in the SFORCE schema are not supported: APPTABMEMBER, CONTENTDOCUMENTLINK, CONTENTFOLDERITEM, CONTENTFOLDERMEMBER, DATACLOUDADDRESS, DATACLOUDCOMPANY, DATACLOUDCONTACT, DATACLOUDANDBCOMPANY, DATASTATISTICS, ENTITYPARTICLE, EVENTBUSSUBSCRIBER, FIELDDEFINITION, FLEXQUEUEITEM, ICONDEFINITION, IDEACOMMENT, LISTVIEWCHARINSTANCE, LOGINEVENT, OUTGOINGEMAIL, OUTGOINGEMAILRELATION, OWNERCHANGEOPTIONINFO, PICKLISTVALUEINFO, PLATFORMACTION, RECORDACTIONHISTORY, RELATIONSHIPDOMAIN, RELATIONSHIPINFO, SEARCHLAYOUT, SITEDETAIL, USERAPPMENUITEM, USERENTITYACCESS, USERFIELDACCESS, USERRECORDACCESS, VOTE\. + +## Learn more ## + + + + * [Get Started with Salesforce](https://help.salesforce.com/s/articleView?id=sf.basics_welcome_salesforce_users.htm&type=5) + * [Salesforce editions with API access](https://help.salesforce.com/s/articleView?id=000326486&type=1) + + + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0294ab8c0fbc393f5c227a0f8bebccdc67b78b1d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0294ab8c0fbc393f5c227a0f8bebccdc67b78b1d.md new file mode 100644 index 0000000..73811de --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0294ab8c0fbc393f5c227a0f8bebccdc67b78b1d.md @@ -0,0 +1,11 @@ +# Balance node (SPSS Modeler) + +# Balance node # + +You can use Balance nodes to correct imbalances in datasets so they conform to specified test criteria\. + +For example, suppose that a dataset has only two values\-\-`low` or `high`\-\-and that 90% of the cases are `low` while only 10% of the cases are `high`\. Many modeling techniques have trouble with such biased data because they will tend to learn only the *low* outcome and ignore the *high* one, since it is more rare\. If the data is well balanced with approximately equal numbers of `low` and `high` outcomes, models will have a better chance of finding patterns that distinguish the two groups\. In this case, a Balance node is useful for creating a balancing directive that reduces cases with a *low* outcome\. + +Balancing is carried out by duplicating and then discarding records based on the conditions you specify\. Records for which no condition holds are always passed through\. Because this process works by duplicating and/or discarding records, the original sequence of your data is lost in downstream operations\. Be sure to derive any sequence\-related values before adding a Balance node to the data stream\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/02c5718919d676e7ea14d16ac226407cc675c95e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/02c5718919d676e7ea14d16ac226407cc675c95e.md new file mode 100644 index 0000000..117b0fc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/02c5718919d676e7ea14d16ac226407cc675c95e.md @@ -0,0 +1,31 @@ +# Decision Optimization model execution + +# Model execution # + +Once your model is deployed, you can submit Decision Optimization jobs to this deployment\. + +You can submit jobs specifying the: + + + + * **Input data**: the transaction data used as input by the model\. This can be inline or referenced + * **Output data**: to define how the output data is generated by model\. This is returned as inline or referenced data\. + * **Solve parameters**: to customize the behavior of the solution engine + + + +For more information see [Model input and output data adaptation](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/ModelIODataDefn.html#topic_modelIOAdapt) + +After submitting a job, you can use the job\-id to poll the job status to collect the: + + + + * Job execution status or error message + * Solve execution status, progress and log tail + * Inline or referenced output data + + + +**Job states** can be : `queued`, `running`, `completed`, `failed`, `canceled`\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/02d819d225558542a49ab6e43f94fe062a509ea5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/02d819d225558542a49ab6e43f94fe062a509ea5.md new file mode 100644 index 0000000..1d1097d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/02d819d225558542a49ab6e43f94fe062a509ea5.md @@ -0,0 +1,19 @@ +# dataassetexport properties + +# dataassetexport properties # + +![Data Asset Export node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/dataassetexportnode.png)You can use the Data Asset Export node to write to remove data sources using connections, write to a data file on your local computer, or write data to a project\. + + + +dataassetexport properties + +Table 1\. dataassetexport properties + +| `dataassetexport` properties | Data type | Property description | +| ---------------------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `user_settings` | *string* | Escaped JSON string containing the interaction properties for the connection\. Contact IBM for details about available interaction points\.

Example:

`user_settings: "{\"interactionProperties\":{\"write_mode\":\"write\",\"file_name\":\"output.csv\",\"file_format\":\"csv\",\"quote_numerics\":true,\"encoding\":\"utf-8\",\"first_line_header\":true,\"include_types\":false}}"`

Note that these values will change based on the type of connection you're using\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0301d6611a36e44c345083f6e2c3bde58de59982.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0301d6611a36e44c345083f6e2c3bde58de59982.md new file mode 100644 index 0000000..55b1a4a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0301d6611a36e44c345083f6e2c3bde58de59982.md @@ -0,0 +1,15 @@ +# Types of scripts + +# Types of scripts # + +SPSS Modeler uses three types of scripts: + + + + * Flow scripts are stored as a flow property and are therefore saved and loaded with a specific flow\. For example, you can write a flow script that automates the process of training and applying a model nugget\. You can also specify that whenever a particular flow runs, the script should be run instead of the flow's canvas content\. + * Standalone scripts aren't associated with any particular flow and are saved in external text files\. You might use a standalone script, for example, to manipulate multiple flows together\. + * SuperNode scripts are stored as a SuperNode flow property\. SuperNode scripts are only available in terminal SuperNodes\. You might use a SuperNode script to control the execution sequence of the SuperNode contents\. For nonterminal (import or process) SuperNodes, you can define properties for the SuperNode or the nodes it contains in your flow script directly\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0310b7fb9072e7f7e5d73f5af90ede62faa81286.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0310b7fb9072e7f7e5d73f5af90ede62faa81286.md new file mode 100644 index 0000000..7f43178 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0310b7fb9072e7f7e5d73f5af90ede62faa81286.md @@ -0,0 +1,63 @@ +# Managing hardware configurations + +# Managing hardware configurations # + +When you deploy certain assets in Watson Machine Learning, you can choose the type, size, and power of the hardware configuration that matches your computing needs\. + +## Deployment types that require hardware specifications ## + +Selecting a hardware specification is available for all [batch deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-details.html) types\. For [online deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-online.html), you can select a specific hardware specification if you're deploying: + + + + * Python Functions + * Tensorflow models + * Models with custom software specifications + + + +## Hardware configurations available for deploying assets ## + + + + * `XS`: 1x4 = 1 vCPU and 4 GB RAM + * `S`: 2x8 = 2 vCPU and 8 GB RAM + * `M`: 4x16 = 4 vCPU and 16 GB RAM + * `L`: 8x32 = 8 vCPU and 32 GB RAM + * `XL`: 16x64 = 16 vCPU and 64 GB RAM + + + +You can use the `XS` configuration to deploy: + + + + * Python functions + * Python scripts + * R scripts + * Models based on custom libraries and custom images + + + +For Decision Optimization deployments, you can use these hardware specifications: + + + + * `S` + * `M` + * `L` + * `XL` + + + +## Learn more ## + + + + * [Monitoring account resource usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html) + + + +**Parent topic:**[Managing predictive deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/033e2b1cd9e006383c2d2c045b8834bfbbab0f09.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/033e2b1cd9e006383c2d2c045b8834bfbbab0f09.md new file mode 100644 index 0000000..9f8b1ab --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/033e2b1cd9e006383c2d2c045b8834bfbbab0f09.md @@ -0,0 +1,19 @@ +# KDE Simulation node (SPSS Modeler) + +# KDE Simulation node # + +Kernel Density Estimation (KDE)© uses the Ball Tree or KD Tree algorithms for efficient queries, and walks the line between unsupervised learning, feature engineering, and data modeling\. + +Neighbor\-based approaches such as KDE are some of the most popular and useful density estimation techniques\. KDE can be performed in any number of dimensions, though in practice high dimensionality can cause a degradation of performance\. The KDE Modeling node and the KDE Simulation node in watsonx\.ai expose the core features and commonly used parameters of the KDE library\. The nodes are implemented in Python\. ^1^ + +To use a KDE node, you must set up an upstream Type node\. The KDE node will read input values from the Type node (or from the Types of an upstream import node)\. + +The KDE Modeling node is available under the Modeling node palette\. The KDE Modeling node generates a model nugget, and the nugget's scored values are kernel density values from the input data\. + +The KDE Simulation node is available under the Outputs node palette\. The KDE Simulation node generates a KDE Gen source node that can create some records that have the same distribution as the input data\. In the KDE Gen node properties, you can specify how many records the node will create (default is 1) and generate a random seed\. + +For more information about KDE, including examples, see the [KDE documentation](http://scikit-learn.org/stable/modules/density.html#kernel-density-estimation)\. ^1^ + +^1^ "User Guide\." *Kernel Density Estimation*\. Web\. © 2007\-2018, scikit\-learn developers\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/033f114bff6d5479c2b4be7c1542a4c778aba53e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/033f114bff6d5479c2b4be7c1542a4c778aba53e.md new file mode 100644 index 0000000..bfc5bc8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/033f114bff6d5479c2b4be7c1542a4c778aba53e.md @@ -0,0 +1,13 @@ +# Adding attributes to a class instance + +# Adding attributes to a class instance # + +Unlike in Java, in Python clients can add attributes to an instance of a class\. Only the one instance is changed\. For example, to add attributes to an instance `x`, set new values on that instance: + + x.attr1 = 1 + x.attr2 = 2 + . + . + x.attrN = n + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/035430afac1e73483636073c5bf48bcf8b4f5e1d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/035430afac1e73483636073c5bf48bcf8b4f5e1d.md new file mode 100644 index 0000000..7be1bda --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/035430afac1e73483636073c5bf48bcf8b4f5e1d.md @@ -0,0 +1,6 @@ +# Circle packing charts + +# Circle packing charts # + +Circle packing charts display hierarchical data as a set of nested areas to visualize a large amount of hierarchically structured data\. It's similar to a treemap, but uses circles instead of rectangles\. Circle packing charts use containment (nesting) to display hierarchy data\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/035ef4a1d7c465e8a72acc1c5c98198b4e95068b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/035ef4a1d7c465e8a72acc1c5c98198b4e95068b.md new file mode 100644 index 0000000..557c8c5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/035ef4a1d7c465e8a72acc1c5c98198b4e95068b.md @@ -0,0 +1,94 @@ +# Adding conditions to the pipeline + +# Adding conditions to the pipeline # + +Add conditions to a pipeline to handle various scenarios\. + +## Configuring conditions for the pipeline ## + +As you create a pipeline, you can specify conditions that must be met before you run the pipeline\. For example, you can set a condition that the output from a node must satisfy a particular condition before you proceed with the pipeline execution\. + +To define a condition: + + + +1. Hover over the link between two nodes\. +2. Click **Add condition**\. +3. Choose the type of condition: + + + + * [Condition Response](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-conditions.html?context=cdpaas&locale=en#node) checks a condition on the status of the previous node. + * [Simple condition](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-conditions.html?context=cdpaas&locale=en#simple) is a no-code condition in the form of an if-then statement. + * [Advanced condition](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-conditions.html?context=cdpaas&locale=en#advanced) Advanced condition uses expression code, providing the most features and flexibility. + + + +4. Define and save your expression\. + + + +![Defining a condition](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/pipelines_adding_condition.gif) + +When you define your expression, a summary captures the condition and the expected result\. For example: + +If **Run AutoAI** is **Successful**, then **Create deployment node**\. + +When you return to the flow, you see an indicator that you defined a condition\. Hover over the icon to edit or delete the condition\. + +![Viewing a successful condition](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/oflow-condition1.png) + +## Configuring a condition based on node status ## + +If you select **Condition Response** as your condition type, the previous node status must satisfy at least one of these conditions to continue with the flow: + + + + * Completed \- the node activity is completed without error\. + * Completed with warnings \- the node activity is completed but with warnings\. + * Completed with errors \- the node activity is completed, but with errors\. + * Failed \- the node activity failed to complete\. + * Cancelled \- the previous action or activity was canceled\. + + + +## Configuring a simple condition ## + +To configure a simple condition, choose the condition that must be satisfied to continue with the flow\. + + + +1. *Optional:* edit the default name\. +2. Depending on the node, choose a variable from the drop\-down options\. For example, if you are creating a condition based on a Run AutoAI node, you can choose Model metric as the variable to base your condition on\. +3. Based on the variable, choose an operator from: Equal to, Not equal to, Greater than, Less than, Greater than or equal to, Less than or equal to\. +4. Specify the required value\. For example, if you are basing a condition on an AutoAI metric, specify a list of values that consists of the available metrics\. +5. *Optional:* click the plus icon to add an **And** (all conditions must be met) or an **Or** (either condition must be met) to the expression to build a compound conditional statement\. +6. Review the summary and save the condition\. + + + +## Configuring an advanced condition ## + +Use coding constructs to build a more complex condition\. The next node runs when the condition is met\. You build the advanced condition by using the expression builder\. + + + +1. *Optional:* edit the default name\. +2. Add items from the **Expression elements** panel to the **Expression** canvas to build your condition\. You can also type your conditions and the elements autocomplete\. +3. When your expression is complete, review the summary and save the condition\. + + + +### Learn more ### + +For more information on using the code editor to build an expression, see: + + + + * [Functions used in pipelines Expression Builder](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-expr-builder.html) + + + +**Parent topic:**[Creating a pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-create.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/03a70c271775c3b15541b86e53e467844ef87296.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/03a70c271775c3b15541b86e53e467844ef87296.md new file mode 100644 index 0000000..d12d73d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/03a70c271775c3b15541b86e53e467844ef87296.md @@ -0,0 +1,12 @@ +# Remarks + +# Remarks # + +Remarks are comments that are introduced by the pound (or hash) sign (`#`)\. All text that follows the pound sign on the same line is considered part of the remark and is ignored\. A remark can start in any column\. + +The following example demonstrates the use of remarks: + + #The HelloWorld application is one of the most simple + print 'Hello World' # print the Hello World line + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/03c28b0a536906ca3597b4d382759bd791d0cfec.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/03c28b0a536906ca3597b4d382759bd791d0cfec.md new file mode 100644 index 0000000..f39258f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/03c28b0a536906ca3597b4d382759bd791d0cfec.md @@ -0,0 +1,21 @@ +# Identifiers + +# Identifiers # + +Identifiers are used to name variables, functions, classes, and keywords\. + +Identifiers can be any length, but must start with either an alphabetical character of uppercase or lowercase, or the underscore character (`_`)\. Names that start with an underscore are generally reserved for internal or private names\. After the first character, the identifier can contain any number and combination of alphabetical characters, numbers from 0\-9, and the underscore character\. + +There are some reserved words in Jython that can't be used to name variables, functions, or classes\. They fall under the following categories: + + + + * Statement introducers:`assert`, `break`, `class`, `continue`, `def`, `del`, `elif`, `else`, `except`, `exec`, `finally`, `for`, `from`, `global`, `if`, `import`, `pass`, `print`, `raise`, `return`, `try`, and `while` + * Parameter introducers:`as`, `import`, and `in` + * Operators:`and`, `in`, `is`, `lambda`, `not`, and `or` + + + +Improper keyword use generally results in a SyntaxError\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/03da4d2d23a65c146ba5afd8f7175908f868f3eb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/03da4d2d23a65c146ba5afd8f7175908f868f3eb.md new file mode 100644 index 0000000..d44a722 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/03da4d2d23a65c146ba5afd8f7175908f868f3eb.md @@ -0,0 +1,76 @@ +# Examining the model (SPSS Modeler) + +# Examining the model # + + + +1. Right\-click the Time Series model nugget and select View Model to see information about the models generated for each of the markets\. + + Figure 1. Time Series models generated for the markets + + ![Time Series models generated for the markets](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_bandwidth_forecast_examine.png) +2. In the left TARGET column, select any of the markets\. Then go to Model Information\. The Number of Predictors row shows how many fields were used as predictors for each target\. + + The other rows in the Model Information tables show various goodness-of-fit measures for each model. Stationary R-Squared measures how a model is better than a baseline model. If the final model is ARIMA(p,d,q)(P,D,Q), the baseline model is ARIMA(0,d,0)(0,D,0). If the final model is an Exponential Smoothing model, then d is 2 for Brown and Holt model and 1 for other models, and D is 1 if the seasonal length is greater than 1, otherwise D is 0. A negative stationary R squared means that the model under consideration is worse than the baseline model. Zero stationary R squared means that the model is as good or bad as the baseline model and a positive stationary R squared means the model is better than the baseline model + + The Statistic and df lines, and the Significance under Parameter Estimates, relate to the Ljung-Box statistic, a test of the randomness of the residual errors in the model. The more random the errors, the better the model is likely to be. Statistic is the Ljung-Box statistic itself, while df (degrees of freedom) indicates the number of model parameters that are free to vary when estimating a particular target. + + The Significance gives the significance value of the Ljung-Box statistic, providing another indication of whether the model is correctly specified. A significance value less than 0.05 indicates that the residual errors are not random, implying that there is structure in the observed series that is not accounted for by the model. + + Taking both the Stationary R-Squared and Significance values into account, the models that the Expert Modeler has chosen for `Market_3`, and `Market_4` are quite acceptable. The Significance values for `Market_1`, `Market_2`, and `Market_5` are all less than 0.05, indicating that some experimentation with better-fitting models for these markets might be necessary. + + The display shows a number of additional goodness-of-fit measures. The R-Squared value gives an estimation of the total variation in the time series that can be explained by the model. As the maximum value for this statistic is 1.0, our models are fine in this respect. + + RMSE is the root mean square error, a measure of how much the actual values of a series differ from the values predicted by the model, and is expressed in the same units as those used for the series itself. As this is a measurement of an error, we want this value to be as low as possible. At first sight it appears that the models for `Market_2` and `Market_3`, while still acceptable according to the statistics we have seen so far, are less successful than those for the other three markets. + + These additional goodness-of-fit measures include the mean absolute percentage errors ( MAPE) and its maximum value ( MAXAPE). Absolute percentage error is a measure of how much a target series varies from its model-predicted level, expressed as a percentage value. By examining the mean and maximum across all models, you can get an indication of the uncertainty in your predictions. + + The MAPE value shows that all models display a mean uncertainty of around 1%, which is very low. The MAXAPE value displays the maximum absolute percentage error and is useful for imagining a worst-case scenario for your forecasts. It shows that the largest percentage error for most of the models falls in the range of roughly 1.8% to 3.7%, again a very low set of figures, with only `Market_4` being higher at close to 7%. + + The MAE (mean absolute error) value shows the mean of the absolute values of the forecast errors. Like the RMSE value, this is expressed in the same units as those used for the series itself. MAXAE shows the largest forecast error in the same units and indicates worst-case scenario for the forecasts. + + Although these absolute values are interesting, it's the values of the percentage errors ( MAPE and MAXAPE) that are more useful in this case, as the target series represent subscriber numbers for markets of varying sizes. + + Do the MAPE and MAXAPE values represent an acceptable amount of uncertainty with the models? They are certainly very low. This is a situation in which business sense comes into play, because acceptable risk will change from problem to problem. We'll assume that the goodness-of-fit statistics fall within acceptable bounds, so let's go on to look at the residual errors. + + Examining the values of the autocorrelation function ( ACF) and partial autocorrelation function ( PACF) for the model residuals provides more quantitative insight into the models than simply viewing goodness-of-fit statistics. + + A well-specified time series model will capture all of the nonrandom variation, including seasonality, trend, and cyclic and other factors that are important. If this is the case, any error should not be correlated with itself (autocorrelated) over time. A significant structure in either of the autocorrelation functions would imply that the underlying model is incomplete. +3. For the fourth market, click Correlogram to display the values of the autocorrelation function ( ACF) and partial autocorrelation function ( PACF) for the residual errors in the model\. + + Figure 2. ACF and PACF values for the fourth market + + ![ACF and PACF values for the fourth market](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_bandwidth_forecast_examine_correlogram.png) + + In these plots, the original values of the error variable have been lagged (under BUILD OPTIONS - OUTPUT) up to the default value of 24 time periods and compared with the original value to see if there's any correlation over time. Ideally, the bars representing all lags of ACF and PACF should be within the shaded area. However, in practice, there may be some lags that extend outside of the shaded area. This is because, for example, some larger lags may not have been tried for inclusion in the model in order to save computation time. Some lags are insignificant and are removed from the model. If you want to improve the model further and don't care whether these lags are redundant or not, these plots serve as tips for you as to which lags are potential predictors. + + Should this occur, you'd need to check the lower ( PACF) plot to see whether the structure is confirmed there. The PACF plot looks at correlations after controlling for the series values at the intervening time points. + + The values for `Market_4` are all within the shaded area, so we can continue and check the values for the other markets. +4. Open the Correlogram for each of the other markets and the totals\. + + The values for the other markets all show some values outside the shaded area, confirming what we suspected earlier from their Significance values. We'll need to experiment with some different models for those markets at some point to see if we can get a better fit, but for the rest of this example, we'll concentrate on what else we can learn from the `Market_4` model. +5. Return to your flow canvas\. Attach a new Time Plot node to the Time Series model nugget\. Double\-click the node to open its properties\. +6. Deselect the Display series in separate panel option\. +7. For the Series list, add the `Market_4` and `$TS-Market_4` fields\. +8. Save the properties, then right\-click the Time Plot node and select Run to generate a line graph of the actual and forecast data for the first of the local markets\.Notice how the forecast (`$TS-Market_4`) line extends past the end of the actual data\. You now have a forecast of expected demand for the next three months in this market\. + + Figure 3. Time Plot of actual and forecast data for Market\_4 + + ![Time Plot of actual and forecast data for Market\_4](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_bandwidth_forecast_examine_line1.png) + + The lines for actual and forecast data over the entire time series are very close together on the graph, indicating that this is a reliable model for this particular time series. + + You have a reliable model for this particular market, but what margin of error does the forecast have? You can get an indication of this by examining the confidence interval. +9. Double\-click the last Time Plot node in the flow (the one labeled Market\_4 $TS\-Market\_4)\. +10. Add the `$TSLCI-Market_4` and `$TSUCI-Market_4` fields to the Series list\. +11. Save the properties and run the node again\. + + + +Now you have the same graph as before, but with the upper (`$TSUCI`) and lower (`$TSLCI`) limits of the confidence interval added\. Notice how the boundaries of the confidence interval diverge over the forecast period, indicating increasing uncertainty as you forecast further into the future\. However, as each time period goes by, you'll have another (in this case) month's worth of actual usage data on which to base your forecast\. In a real\-world scenario, you could read the new data into the flow and reapply your model now that you know it's reliable\. + +Figure 4\. Time Plot with confidence interval added + +![Time Plot with confidence interval added](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_bandwidth_forecast_examine_line2.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/03ff997603b065d2df1fbb49934ca8c348765acf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/03ff997603b065d2df1fbb49934ca8c348765acf.md new file mode 100644 index 0000000..2d51dd8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/03ff997603b065d2df1fbb49934ca8c348765acf.md @@ -0,0 +1,61 @@ +# Deploying Python functions in Watson Machine Learning + +# Deploying Python functions in Watson Machine Learning # + +You can deploy Python functions in Watson Machine Learning the same way that you can deploy models\. Your tools and apps can use the Watson Machine Learning Python client or REST API to send data to your deployed functions the same way that they send data to deployed models\. Deploying Python functions gives you the ability to hide details (such as credentials)\. You can also preprocess data before you pass it to models\. Additionally, you can handle errors and include calls to multiple models, all within the deployed function instead of in your application\. + +## Sample notebooks for creating and deploying Python functions ## + +For examples of how to create and deploy Python functions by using the Watson Machine Learning [Python client library](https://ibm.github.io/watson-machine-learning-sdk/), refer to these sample notebooks: + + + +| Sample name | Framework | Techniques demonstrated | +| -------------------------------------------------------------------------------------------------------------- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Use Python function to recognize hand\-written digits](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/1eddc77b3a4340d68f762625d40b64f9) | Python | Use a function to store a sample model and deploy it\. | +| [Predict business for cars](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/61a8b600f1bb183e2c471e7a64299f0e) | Hybrid(Tensorflow) | Set up an AI definition
Prepare the data
Create a Keras model by using Tensorflow
Deploy and score the model
Define, store, and deploy a Python function | +| [Deploy Python function for software specification](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/56825df5322b91daffd39426038808e9) | Core | Create a Python function
Create a web service
Score the model | + + + +The notebooks demonstrate the six steps for creating and deploying a function: + + + +1. Define the function\. +2. Authenticate and define a space\. +3. Store the function in the repository\. +4. Get the software specification\. +5. Deploy the stored function\. +6. Send data to the function for processing\. + + + +For links to other sample notebooks that use the Watson Machine Learning [Python client library](https://ibm.github.io/watson-machine-learning-sdk/), refer to [Using Watson Machine Learning in a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-samples-overview.html)\. + +## Increasing scalability for a function ## + +When you deploy a function from a deployment space or programmatically, a single copy of the function is deployed by default\. To increase scalability, you can increase the number of replicas by editing the configuration of the deployment\. More replicas allow for a larger volume of scoring requests\. + +The following example uses the Python client API to set the number of replicas to 3\. + + change_meta = { + client.deployments.ConfigurationMetaNames.HARDWARE_SPEC: { + "name":"S", + "num_nodes":3} + } + + client.deployments.update(, change_meta) + +## Learn more ## + + + + * To learn more about defining a deployable Python function, see **General requirements for deployable functions** section in [Writing and storing deployable Python functions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function-write.html)\. + * You can deploy a function from a deployment space through the user interface\. For more information, see [Deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html)\. + + + +**Parent topic:**[Managing predictive deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/049829eea8eecd997e6ca05584cde2d9bae92218.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/049829eea8eecd997e6ca05584cde2d9bae92218.md new file mode 100644 index 0000000..6842220 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/049829eea8eecd997e6ca05584cde2d9bae92218.md @@ -0,0 +1,7 @@ +# Field Operations node properties + +# Field Operations node properties # + +Refer to this section for a list of available properties for Field Operations nodes\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/049dc7fc73042985f3258ef2cf3bb05114f7f175.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/049dc7fc73042985f3258ef2cf3bb05114f7f175.md new file mode 100644 index 0000000..2e14053 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/049dc7fc73042985f3258ef2cf3bb05114f7f175.md @@ -0,0 +1,79 @@ +# Apache HDFS connection + +# Apache HDFS connection # + +To access your data in Apache HDFS, create a connection asset for it\. + +Apache Hadoop Distributed File System (HDFS) is a distributed file system that is designed to run on commodity hardware\. Apache HDFS was formerly Hortonworks HDFS\. + +## Create a connection to Apache HDFS ## + +To create the connection asset, you need these connection details\. The WebHDFS URL is required\. +The available properties in the connection form depend on whether you select **Connect to Apache Hive** so that you can write tables to the Hive data source\. + + + + * WebHDFS URL to access HDFS\. + * Hive host: Hostname or IP address of the Apache Hive server\. + * Hive database: The database in Apache Hive\. + * Hive port number: The port number of the Apache Hive server\. The default value is `10000`\. + * Hive HTTP path: The path of the endpoint such as gateway/default/hive when the server is configured for HTTP transport mode\. + * SSL certificate (if required by the Apache Hive server)\. + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Apache HDFS connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Apache HDFS setup ## + +[Install and set up a Hadoop cluster](https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html#Prerequisites) + +## Supported file types ## + +The Apache HDFS connection supports these file types: Avro, CSV, Delimited text, Excel, JSON, ORC, Parquet, SAS, SAV, SHP, and XML\. + +## Learn more ## + +[Apache HDFS Users Guide](https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/04b717fd06c5d906268e8530f4b521686065c6d5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/04b717fd06c5d906268e8530f4b521686065c6d5.md new file mode 100644 index 0000000..2e4f689 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/04b717fd06c5d906268e8530f4b521686065c6d5.md @@ -0,0 +1,161 @@ +# Data load support + +# Data load support # + +You can add automatically generated code to load data from project data assets to a notebook cell\. The asset type can be a file or a database connection\. + +By clicking in an empty code cell in your notebook, clicking the **Code snippets** icon (![the Code snippets icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/code-snippets-icon.png)) from the notebook toolbar, selecting **Read data** and an asset from the project, you can: + + + + * Insert the data source access credentials\. This capability is available for all data assets that are added to a project\. With the credentials, you can write your own code to access the asset and load the data into data structures of your choice\. + * Generate code that is added to the notebook cell\. The inserted code serves as a quick start to allow you to easily begin working with a data set or connection\. For production systems, you should carefully review the inserted code to determine if you should write your own code that better meets your needs\. + + When you run the code cell, the data is accessed and loaded into the data structure you selected. + + **Notes**: + + + + 1. The ability to provide generated code is disabled for some connections if: + + + + * The connection credentials are personal credentials + * The connection uses a secure gateway link + * The connection credentials are stored in vaults + + + + 2. If the file type or database connection that you are using doesn't appear in the following lists, you can select to create generic code. For Python this is a StreamingBody object and for R a textConnection object. + + + + + +The following tables show you which data source connections (file types and database connections) support the option to generate code\. The options for generating code vary depending on the data source, the notebook coding language, and the notebook runtime compute\. + +## Supported files types ## + + + +Table 1\. Supported file types + +| Data source | Notebook coding language | Compute engine type | Available support to load data | +| ------------------------ | ------------------------ | ---------------------------- | ----------------------------------------------------------------- | +| CSV files | | +| | Python | Anaconda Python distribution | Load data into pandasDataFrame | +| | | With Spark | Load data into pandasDataFrame and sparkSessionDataFrame | +| | | With Hadoop | Load data into pandasDataFrame and sparkSessionDataFrame | +| | R | Anaconda R distribution | Load data into R data frame | +| | | With Spark | Load data into R data frame and sparkSessionDataFrame | +| | | With Hadoop | Load data into R data frame and sparkSessionDataFrame | +| Python Script | | +| | Python | Anaconda Python distribution | Load data into pandasStreamingBody | +| | | With Spark | Load data into pandasStreamingBody | +| | | With Hadoop | Load data into pandasStreamingBody | +| | R | Anaconda R distribution | Load data into rRawObject | +| | | With Spark | Load data into rRawObject | +| | | With Hadoop | Load data into rRawObject | +| JSON files | | +| | Python | Anaconda Python distribution | Load data into pandasDataFrame | +| | | With Spark | Load data into pandasDataFrame and sparkSessionDataFrame | +| | | With Hadoop | Load data into pandasDataFrame and sparkSessionDataFrame | +| | R | Anaconda R distribution | Load data into R data frame | +| | | With Spark | Load data into R data frame, rRawObject and sparkSessionDataFrame | +| | | With Hadoop | Load data into R data frame, rRawObject and sparkSessionDataFrame | +| \.xlsx and \.xls files | | +| | Python | Anaconda Python distribution | Load data into pandasDataFrame | +| | | With Spark | Load data into pandasDataFrame | +| | | With Hadoop | Load data into pandasDataFrame | +| | R | Anaconda R distribution | Load data into rRawObject | +| | | With Spark | No data load support | +| | | With Hadoop | No data load support | +| Octet\-stream file types | | +| | Python | Anaconda Python distribution | Load data into pandasStreamingBody | +| | | With Spark | Load data into pandasStreamingBody | +| | R | Anaconda R distribution | Load data in rRawObject | +| | | With Spark | Load data in rDataObject | +| PDF file type | | +| | Python | Anaconda Python distribution | Load data into pandasStreamingBody | +| | | With Spark | Load data into pandasStreamingBody | +| | | With Hadoop | Load data into pandasStreamingBody | +| | R | Anaconda R distribution | Load data in rRawObject | +| | | With Spark | Load data in rDataObject | +| | | With Hadoop | Load data into rRawData | +| ZIP file type | | +| | Python | Anaconda Python distribution | Load data into pandasStreamingBody | +| | | With Spark | Load data into pandasStreamingBody | +| | R | Anaconda R distribution | Load data in rRawObject | +| | | With Spark | Load data in rDataObject | +| JPEG, PNG image files | | +| | Python | Anaconda Python distribution | Load data into pandasStreamingBody | +| | | With Spark | Load data into pandasStreamingBody | +| | | With Hadoop | Load data into pandasStreamingBody | +| | R | Anaconda R distribution | Load data in rRawObject | +| | | With Spark | Load data in rDataObject | +| | | With Hadoop | Load data in rDataObject | +| Binary files | | +| | Python | Anaconda Python distribution | Load data into pandasStreamingBody | +| | | With Spark | Load data into pandasStreamingBody | +| | | Hadoop | No data load support | +| | R | Anaconda R distribution | Load data in rRawObject | +| | | With Spark | Load data into rRawObject | +| | | Hadoop | Load data in rDataObject | + + + +## Supported database connections ## + + + +Table 2\. Supported database connections + +| Data source | Notebook coding language | Compute engine type | Available support to load data | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| \- [Db2 Warehouse on Cloud](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-wh.html)
\- [IBM Db2 on Cloud](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-cloud.html)
\- [IBM Db2 Database](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2.html) | | +| | Python | Anaconda Python distribution | Load data into ibmdbpyIda and ibmdbpyPandas | +| | | With Spark | Load data into ibmdbpyIda, ibmdbpyPandas and sparkSessionDataFrame | +| | | With Hadoop | Load data into ibmdbpyIda, ibmdbpyPandas and sparkSessionDataFrame | +| | R | Anaconda R distribution | Load data into ibmdbrIda and ibmdbrDataframe | +| | | With Spark | Load data into ibmdbrIda, ibmdbrDataFrame and sparkSessionDataFrame | +| | | With Hadoop | Load data into ibmdbrIda, ibmdbrDataFrame and sparkSessionDataFrame | +| \- [Db2 for z/OS](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-wh.html)
| | +| | Python | Anaconda Python distribution | Load data into ibmdbpyIda and ibmdbpyPandas | +| | | With Spark | No data load support | +| \- [Amazon Simple Storage Services (S3)](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-amazon-s3.html)
\- [Amazon Simple Storage Services (S3) with an IAM access policy](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-amazon-s3.html) | | +| | Python | Anaconda Python distribution | Load data into pandasStreamingBody | +| | | With Hadoop | Load data into pandasStreamingBody and sparkSessionSetup | +| | R | Anaconda R distributuion | Load data into rRawObject | +| | | With Hadoop | Load data into rRawObject and sparkSessionSetup | +| \- [IBM Cloud Databases for PostgreSQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-dbase-postgresql.html)
\- [Microsoft SQL Server](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sql-server.html) | | +| | Python | Anaconda Python distribution | Load data into pandasDataFrame | +| | | With Spark | Load data into pandasDataFrame | +| | R | Anaconda R distribution | Load data into R data frame | +| | | With Spark | Load data into R data frame and sparkSessionDataFrame | +| \- [IBM Cognos Analytics](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cognos.html) | | +| | Python | Anaconda Python distribution | Load data into pandasDataFrame

In the generated code:
\- Edit the path parameter in the last line of code
\- Remove the comment tagging

To read data, see [Reading data from a data source](https://www.ibm.com/support/knowledgecenter/en/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ca_notebook.doc/c_read_notebook.html)
To search data, see [Searching for data objects](https://www.ibm.com/support/knowledgecenter/en/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ca_notebook.doc/c_search_for_data_objects_notebook.html)
To write data, see [Writing data to a data source](https://www.ibm.com/support/knowledgecenter/en/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ca_notebook.doc/c_write_notebook.html) | +| | | With Spark | No data load support | +| | R | Anaconda R distribution | Load data into R data frame

In the generated code:
\- Edit the path parameter in the last line of code
\- Remove the comment tagging

To read data, see [Reading data from a data source](https://www.ibm.com/support/knowledgecenter/en/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ca_notebook.doc/c_read_notebook.html)
To search data, see [Searching for data objects](https://www.ibm.com/support/knowledgecenter/en/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ca_notebook.doc/c_search_for_data_objects_notebook.html)
To write data, see [Writing data to a data source](https://www.ibm.com/support/knowledgecenter/en/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ca_notebook.doc/c_write_notebook.html) | +| | | With Spark | No data load support | +| \- [Microsoft Azure Cosmos DB](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cosmosdb.html) | | +| | Python | Anaconda Python distribution | Load data into pandasDataFrame | +| | | With Spark | Load data into pandasDataFrame | +| | R | Anaconda R distribution | No data load support | +| | | With Spark | No data load support | +| \- [Amazon RDS for MySQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azrds-mysql.html)
| | +| | Python | Anaconda Python distribution | Load data into pandasDataFrame | +| | | With Spark | Load data into pandasDataFrame | +| | R | Anaconda R distribution | Load data into R data frame and sparkSessionDataFrame | +| | | With Spark | No data load support | +| \- [HTTP](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-http.html)
\- [Apache Cassandra](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cassandra.html)
\- [Amazon RDS for PostgreSQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azrds-postresql.html) | | +| | Python | Anaconda Python distribution | Load data into pandasDataFrame | +| | | With Spark | Load data into pandasDataFrame | +| | R | Anaconda R distribution | Load data into R data frame | +| | | With Spark | Load data into R data frame | + + + +**Parent topic:**[Loading and accessing data in a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/05275f4ec521878b13ad7dce825e167b2fc7ef93.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/05275f4ec521878b13ad7dce825e167b2fc7ef93.md new file mode 100644 index 0000000..694b53b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/05275f4ec521878b13ad7dce825e167b2fc7ef93.md @@ -0,0 +1,37 @@ +# Advanced frequency settings (SPSS Modeler) + +# Advanced frequency settings # + +You can build categories based on a straightforward and mechanical frequency technique\. With this technique, you can build one category for each item (type, concept, or pattern) that was found to be higher than a given record or document count\. Additionally, you can build a single category for all of the less frequently occurring items\. By count, we refer to the number of records or documents containing the extracted concept (and any of its synonyms), type, or pattern in question as opposed to the total number of occurrences in the entire text\. + +Grouping frequently occurring items can yield interesting results, since it may indicate a common or significant response\. The technique is very useful on the unused extraction results after other techniques have been applied\. Another application is to run this technique immediately after extraction when no other categories exist, edit the results to delete uninteresting categories, and then extend those categories so that they match even more records or documents\. + +Instead of using this technique, you could sort the concepts or concept patterns by descending number of records or documents in the extraction results pane and then drag\-and\-drop the ones with the most records into the categories pane to create the corresponding categories\. + +The following advanced settings are available for the Use frequencies to build categories option in the category settings\. + +Generate category descriptors at\. Select the kind of input for descriptors\. + + + + * Concepts level\. Selecting this option means that concepts or concept patterns frequencies will be used\. Concepts will be used if types were selected as input for category building and concept patterns are used, if type patterns were selected\. In general, applying this technique to the concept level will produce more specific results, since concepts and concept patterns represent a lower level of measurement\. + * Types level\. Selecting this option means that type or type patterns frequencies will be used\. Types will be used if types were selected as input for category building and type patterns are used, if type patterns were selected\. By applying this technique to the type level, you can get a quick view of the kind of information given\. + + + +Minimum record/doc\. count for items to have their own category\. With this option, you can build categories from frequently occurring items\. This option restricts the output to only those categories containing a descriptor that occurred in at least X number of records or documents, where X is the value to enter for this option\. + +Group all remaining items into a category called\. Use this option if you want to group all concepts or types occurring infrequently into a single catch\-all category with the name of your choice\. By default, this category is named Other\. + +Category input\. Select the group to which to apply the techniques: + + + + * Unused extraction results\. This option enables categories to be built from extraction results that aren't used in any existing categories\. This minimizes the tendency for records to match multiple categories and limits the number of categories produced\. + * All extraction results\. This option enables categories to be built using any of the extraction results\. This is most useful when no or few categories already exist\. + + + +Resolve duplicate category names by\. Select how to handle any new categories or subcategories whose names would be the same as existing categories\. You can either merge the new ones (and their descriptors) with the existing categories with the same name, or you can choose to skip the creation of any categories if a duplicate name is found in the existing categories\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/055727fba02274a87d30da162e6f5eca3ace233d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/055727fba02274a87d30da162e6f5eca3ace233d.md new file mode 100644 index 0000000..c74ea4e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/055727fba02274a87d30da162e6f5eca3ace233d.md @@ -0,0 +1,41 @@ +# featureselectionnode properties + +# featureselectionnode properties # + +![Feature Selection node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/featureselectionnodeicon.png)The Feature Selection node screens input fields for removal based on a set of criteria (such as the percentage of missing values); it then ranks the importance of remaining inputs relative to a specified target\. For example, given a data set with hundreds of potential inputs, which are most likely to be useful in modeling patient outcomes? + + + +featureselectionnode properties + +Table 1\. featureselectionnode properties + +| `featureselectionnode` Properties | Values | Property description | +| --------------------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `target` | *field* | Feature Selection models rank predictors relative to the specified target\. Weight and frequency fields are not used\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html) for more information\. | +| `screen_single_category` | *flag* | If `True`, screens fields that have too many records falling into the same category relative to the total number of records\. | +| `max_single_category` | *number* | Specifies the threshold used when `screen_single_category` is `True`\. | +| `screen_missing_values` | *flag* | If `True`, screens fields with too many missing values, expressed as a percentage of the total number of records\. | +| `max_missing_values` | *number* | | +| `screen_num_categories` | *flag* | If `True`, screens fields with too many categories relative to the total number of records\. | +| `max_num_categories` | *number* | | +| `screen_std_dev` | *flag* | If `True`, screens fields with a standard deviation of less than or equal to the specified minimum\. | +| `min_std_dev` | *number* | | +| `screen_coeff_of_var` | *flag* | If `True`, screens fields with a coefficient of variance less than or equal to the specified minimum\. | +| `min_coeff_of_var` | *number* | | +| `criteria` | `Pearson``Likelihood``CramersV``Lambda` | When ranking categorical predictors against a categorical target, specifies the measure on which the importance value is based\. | +| `unimportant_below` | *number* | Specifies the threshold *p* values used to rank variables as important, marginal, or unimportant\. Accepts values from 0\.0 to 1\.0\. | +| `important_above` | *number* | Accepts values from 0\.0 to 1\.0\. | +| `unimportant_label` | *string* | Specifies the label for the unimportant ranking\. | +| `marginal_label` | *string* | | +| `important_label` | *string* | | +| `selection_mode` | `ImportanceLevel``ImportanceValue``TopN` | | +| `select_important` | *flag* | When `selection_mode` is set to `ImportanceLevel`, specifies whether to select important fields\. | +| `select_marginal` | *flag* | When `selection_mode` is set to `ImportanceLevel`, specifies whether to select marginal fields\. | +| `select_unimportant` | *flag* | When `selection_mode` is set to `ImportanceLevel`, specifies whether to select unimportant fields\. | +| `importance_value` | *number* | When `selection_mode` is set to `ImportanceValue`, specifies the cutoff value to use\. Accepts values from 0 to 100\. | +| `top_n` | *integer* | When `selection_mode` is set to `TopN`, specifies the cutoff value to use\. Accepts values from 0 to 1000\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0563fc6874b43fa0bca09ae54805fe98bfa33042.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0563fc6874b43fa0bca09ae54805fe98bfa33042.md new file mode 100644 index 0000000..62ffb74 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0563fc6874b43fa0bca09ae54805fe98bfa33042.md @@ -0,0 +1,37 @@ +# kohonennode properties + +# kohonennode properties # + +![Kohonen node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/kohonennodeicon.png)The Kohonen node generates a type of neural network that can be used to cluster the data set into distinct groups\. When the network is fully trained, records that are similar should be close together on the output map, while records that are different will be far apart\. You can look at the number of observations captured by each unit in the model nugget to identify the strong units\. This may give you a sense of the appropriate number of clusters\. + + + +kohonennode properties + +Table 1\. kohonennode properties + +| `kohonennode` Properties | Values | Property description | +| ------------------------ | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `inputs` | \[*field1 \.\.\. fieldN*\] | Kohonen models use a list of input fields, but no target\. Frequency and weight fields are not used\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `continue` | *flag* | | +| `show_feedback` | *flag* | | +| `stop_on` | `Default`
`Time` | | +| `time` | *number* | | +| `optimize` | `Speed`
`Memory` | Use to specify whether model building should be optimized for speed or for memory\. | +| `cluster_label` | *flag* | | +| `mode` | `Simple`
`Expert` | | +| `width` | *number* | | +| `length` | *number* | | +| `decay_style` | `Linear`
`Exponential` | | +| `phase1_neighborhood` | *number* | | +| `phase1_eta` | *number* | | +| `phase1_cycles` | *number* | | +| `phase2_neighborhood` | *number* | | +| `phase2_eta` | *number* | | +| `phase2_cycles` | *number* | | +| `set_random_seed` | *Boolean* | If no random seed is set, the sequence of random values used to initialize the network weights will be different every time the node runs\. This can cause the node to create different models on different runs, even if the node settings and data values are exactly the same\. By selecting this option, you can set the random seed to a specific value so the resulting model is exactly reproducible\. | +| `random_seed` | *integer* | Seed | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/056e37762231e9e32f0f443987c32acf7bf1aed4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/056e37762231e9e32f0f443987c32acf7bf1aed4.md new file mode 100644 index 0000000..b4dd847 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/056e37762231e9e32f0f443987c32acf7bf1aed4.md @@ -0,0 +1,24 @@ +# Decision Optimization notebook multiple scenarios + +# Working with multiple scenarios # + +You can generate multiple scenarios to test your model against a wide range of data and understand how robust the model is\. + +This example steps you through the process to generate multiple scenarios with a model\. This makes it possible to test the performance of the model against multiple randomly generated data sets\. It's important in practice to check the robustness of a model against a wide range of data\. This helps ensure that the model performs well in potentially stochastic real\-world conditions\. + +The example is the `StaffPlanning` model in the **DO\-samples**\. + +The example is structured as follows: + + + + * The model `StaffPlanning` contains a default scenario based on two default data sets, along with five additional scenarios based on randomized data sets\. + * The Python notebook`CopyAndSolveScenarios` contains the random generator to create the new scenarios in the `StaffPlanning` model\. + + + +For general information about scenario management and configuration, see [Scenario pane](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface__scenariopanel) and [Overview](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface__section_overview)\. + +For information about writing methods and classes for scenarios, see the [ Decision Optimization Client Python API documentation](https://ibmdecisionoptimization.github.io/decision-optimization-client-doc/)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/05d687fc92fd17804374e20e7f330edae142f725.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/05d687fc92fd17804374e20e7f330edae142f725.md new file mode 100644 index 0000000..6ccd3f3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/05d687fc92fd17804374e20e7f330edae142f725.md @@ -0,0 +1,86 @@ +# Handling Pipeline errors + +# Handling Pipeline errors # + +You can specify how to respond to errors in a pipeline globally, with an error policy, and locally, by overriding the policy on the node level\. You can also create a custom error\-handling response\. + +## Setting global error policy ## + +The error policy sets the default behavior for errors in a pipeline\. You can override this behavior for any node in the pipeline\. + +To set the global error policy: + + + +1. Click the **Manage default settings** icon on the toolbar\. +2. Choose the default response to an error under the **Error policy**: + + + + * **Fail pipeline on error** stops the flow and initiates an error-handling flow. + * **Continue pipeline on error** tries to continue running the pipeline. + + Note: **Continue pipeline on error** affects nodes that use the default error policy and does not affect node-specific error policies. + + + +3. You can optionally create a custom error\-handling response for a flow failure\. + + + +## Specifying an error response ## + +If you opt for **Fail pipeline on error** for either the global error policy or for a node\-specific policy, you can further specify what happens on failure\. For example, if you check the **Show icon on nodes that are linked to an error\-handling pipeline**, an icon flags a node with an error to help debug the flow\. + +## Specifying a node\-specific error policy ## + +You can override the default error policy for any node in the pipeline\. + + + +1. Click a node to open the configuration pane\. +2. Check the option to **Override default error policy with:** + + + + * **Fail pipeline on error** + * **Continue pipeline on error** + + + + + +## Viewing all node policies ## + +To view all node\-specific error handling for a pipeline: + + + +1. Click **Manage default settings** on the toolbar\. +2. Click the **view all node policies** link under **Error policy**\. + + + +A list of all nodes in the pipeline show which nodes use the default policy, and which override the default policy\. Click a node name to see the policy details\. Use the view filter to show: + + + + * **All error policies**: all nodes + * **Default policy**: all nodes that use the default policy + * **Override default policy**: all nodes that override the default policy + * **Fail pipeline on error**: all nodes that stop the flow on error + * **Continue pipeline on error**: all nodes that try to continue the flow on error + + + +## Running the Fail on error flow ## + +If you specify that the flow fails on error, a secondary error handling flow starts when an error is encountered\. + +## Adding a custom error response ## + +If **Create custom error handling response** is checked on default settings for error policy, you can add an error handling node to the canvas so you can configure a custom error response\. The response applies to all nodes configured to fail when an error occurs\. + +**Parent topic:**[Creating a pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-create.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/05f38627c9ec286ca7c379a31aa27392a65411ab.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/05f38627c9ec286ca7c379a31aa27392a65411ab.md new file mode 100644 index 0000000..b65f25b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/05f38627c9ec286ca7c379a31aa27392a65411ab.md @@ -0,0 +1,15 @@ +# Examing the data (SPSS Modeler) + +# Examining the data # + +The series shows a general upward trend; that is, the series values tend to increase over time\. The upward trend is seemingly constant, which indicates a linear trend\. + +Figure 1\. Actual sales of men's clothing + +![Actual sales of men's clothing](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_forecast_series.png) + +The series also has a distinct seasonal pattern with annual highs in December, as indicated by the vertical lines on the graph\. The seasonal variations appear to grow with the upward series trend, which suggests multiplicative rather than additive seasonality\. + +Now that you've identified the characteristics of the series, you're ready to try modeling it\. The exponential smoothing method is useful for forecasting series that exhibit trend, seasonality, or both\. As we've seen, this data exhibits both characteristics\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/063d5e4c6e2094f964752d376b5ff49ffd47433b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/063d5e4c6e2094f964752d376b5ff49ffd47433b.md new file mode 100644 index 0000000..c9f15c3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/063d5e4c6e2094f964752d376b5ff49ffd47433b.md @@ -0,0 +1,34 @@ +# Data values (SPSS Modeler) + +# Data values # + +Using the Value mode column in the Type node settings, you can read values automatically from the data, or you can specify measures and values\. + +The options available in the Value mode drop\-down provide instructions for auto\-typing, as shown in the following table\. + + + +Table 1\. Instructions for auto\-typing + +| Option | Function | +| --------- | --------------------------------------------------------------------- | +| `Read` | Data is read when the node runs\. | +| `Extend` | Data is read and appended to the current data (if any exists)\. | +| `Pass` | No data is read\. | +| `Current` | Keep current data values\. | +| `Specify` | You can click the gear icon at the end of the row to specify values\. | + + + +Running a Type node or clicking Read Values auto\-types and reads values from your data source based on your selection\. You can also specify these values manually by using the Specify option and clicking the gear icon at the end of a row\. + +After you make changes for fields in the Type node, you can reset value information using the following buttons: + + + + * Using the Clear all values button, you can clear changes to field values made in this node (non\-inherited values) and reread values from upstream operations\. This option is useful for resetting changes that you may have made for specific fields upstream\. + * Using the Clear values button, you can reset values for all fields read into the node\. This option effectively sets the Value mode column to `Read` for all fields\. This option is useful for resetting values for all fields and rereading values and measurement levels from upstream operations\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0721692d3f363b864a241fc4644d7d57b2dff881.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0721692d3f363b864a241fc4644d7d57b2dff881.md new file mode 100644 index 0000000..5ec969e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0721692d3f363b864a241fc4644d7d57b2dff881.md @@ -0,0 +1,18 @@ +# Defining the dates (SPSS Modeler) + +# Defining the dates # + +Now you need to change the storage type of the `DATE_` field to date format\. + + + +1. Attach a Filler node to the Filter node, then double\-click the Filler node to open its properties +2. Add the `DATE_` field, set the Replace option to Always, and set the Replace with value to `to_date(DATE_)`\. + + Figure 1. Setting the date storage type + + ![Setting the date storage type](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_bandwidth_forecast_date1.png) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/074c9baeb0177e3cf57bac36e5fcbd13063498a1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/074c9baeb0177e3cf57bac36e5fcbd13063498a1.md new file mode 100644 index 0000000..bb680ed --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/074c9baeb0177e3cf57bac36e5fcbd13063498a1.md @@ -0,0 +1,32 @@ +# Governing assets in AI use cases + +# Governing assets in AI use cases # + +Create an AI use case to track and govern AI assets from request through production\. Factsheets capture details about the asset for each stage of the AI lifecycle to help you meet governance and compliance goals\. + +To learn about AI use cases, you can follow a tutorial in the *Getting started with watsonx\.governance* sample project\. Assets in the sample are prompt templates for a car insurance claim processing use case\. The prompts use car insurance claims as input and then use large language models to help insurance agents process the claims\. One prompt summarizes claims, another prompt extracts key information such as make and model, and the last prompt generates suggestions for the insurance agent\. + +In **Projects**, start a new project, then choose to create a project from a sample\. The project gallery includes the getting started sample\. + +![Getting started sample project](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-get-started-project.png) + +When your project is ready, open the Readme for a step\-by\-step tutorial\. + +![Getting started sample project](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-get-started-project-readme.png) + +## Get started with AI use cases ## + +Set up or work with AI use cases: + + + + * [Create an inventory](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-inventory-manage.html) for storing AI use cases + * [Set up an AI use case](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-use-cases.html) + * [Track assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-tracking-overview.html) in an AI use case + * [View factsheets](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-factsheet-viewing.html) for tracked assets + + + +**Parent topic:**[Governing AI assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/077afc6b667f6747ff066182e2f04af486c13368.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/077afc6b667f6747ff066182e2f04af486c13368.md new file mode 100644 index 0000000..c971030 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/077afc6b667f6747ff066182e2f04af486c13368.md @@ -0,0 +1,13 @@ +# Specifying values for a flag (SPSS Modeler) + +# Specifying values for a flag # + +Use flag fields to display data that has two distinct values\. The storage types for flags can be string, integer, real number, or date/time\. + +True\. Specify a flag value for the field when the condition is met\. + +False\. Specify a flag value for the field when the condition is not met\. + +Labels\. Specify labels for each value in the flag field\. These labels appear in a variety of locations, such as graphs, tables, output, and model browsers\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/07a75b90684d731c6b33fc552585d391e86a2a35.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/07a75b90684d731c6b33fc552585d391e86a2a35.md new file mode 100644 index 0000000..ff9c2fc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/07a75b90684d731c6b33fc552585d391e86a2a35.md @@ -0,0 +1,135 @@ +# Saving an AutoAI generated notebook + +# Saving an AutoAI generated notebook # + +To view the code that created a particular experiment, or interact with the experiment programmatically, you can save an experiment as a notebook\. You can also save an individual pipeline as a notebook so that you can review the code that is used in that pipeline\. + +## Working with AutoAI\-generated notebooks ## + +When you save an experiment or a pipeline as notebook, you can: + + + + * Access the saved notebooks from the *Notebooks* section on the *Assets* tab\. + * Review the code to understand the transformations applied to build the model\. This increases confidence in the process and contributes to explainable AI practices\. + * Enter your own authentication credentials by using the template provided\. + * Use and run the code within Watson Studio, or download the notebook code to use in another notebook server\. No matter where you use the notebook, it automatically installs all required dependencies, including libraries for: + + + + * `xgboost` + * `lightgbm` + * `scikit-learn` + * `autoai-libs` + * `ibm-watson-machine-learning` + * `snapml` + + + + * View the training data used to train the experiment and the test (holdout) data used to validate the experiment\. + + + +**Notes:** + + + + * Auto\-generated notebook code excutes successfully as written\. Modifying the code or changing the input data can adversely affect the code\. If you want to make a significant change, consider retraining the experiment by using AutoAI\. + * For more information on the estimators, or algorithms, and transformers that are applied to your data to train an experiment and create pipelines, refer to [Implementation details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html)\. + + + +## Saving an experiment as a notebook ## + +Save all of the code for an experiment to view the transformations and optimizations applied to create the model pipelines\. + +### What is included with the experiment notebook ### + +The experiment notebook provides annotated code so you can: + + + + * Interact with trained model pipelines + * Access model details programmatically (including feature importance and machine learning metrics)\. + * Visualize each pipeline as a graph, with each node documented, to provide transparency + * Compare pipelines + * Download selected pipelines and test locally + * Create a deployment and score the model + * Get the experiment definition or configuration in Python API, which you can use for automation or integration with other applications\. + + + +### Saving the code for an experiment ### + +To save an entire experiment as a notebook: + + + +1. After the experiment completes, click **Save code** from the Progress map panel\. +2. Name your notebook, add an optional description, choose a runtime environment, and save\. +3. Click the link in the notification to open the notebook and review the code\. You can also open the notebook from the *Notebooks* section of the *Assets* tab of your project\. + + + +## Saving an individual pipeline as a notebook ## + +Save an individual pipeline as a notebook so you can review the Scikit\-Learn source code for the trained model in a notebook\. + +Note: Currently, you cannot generate a pipeline notebook for an experiment with joined data sources\. + +### What is included with the pipeline notebook ### + +The experiment notebook provides annotated code that you can use to complete these tasks: + + + + * View the Scikit\-learn pipeline definition + * See the transformations applied for pipeline training + * Review the pipeline evaluation + + + +### Saving a pipeline as a notebook ### + +To save a pipeline as a notebook: + + + +1. Complete your AutoAI experiment\. +2. Select the pipeline that you want to save in the leaderboard, and click **Save** from the action menu for the pipeline, then **Save as notebook**\. +3. Name your notebook, add an optional description, choose a runtime environment, and save\. +4. Click the link in the notification to open the notebook and review the code\. You can also open the notebook from the *Notebooks* section of the *Assets* tab\. + + + +## Create sample notebooks ## + +To see for yourself what AutoAI\-generated notebooks look like: + + + +1. Follow the steps in [AutoAI tutorial](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai_example_binary_classifier.html) to create a binary classification experiment from sample data\. +2. After the experiment runs, click **Save code** in the experiment details panel\. +3. Name and save the experiment notebook\. +4. To save a pipeline as a model, select a pipeline from the leaderboard, then click **Save** and **Save as notebook**\. +5. Name and save the pipeline notebook\. +6. From *Assets* tab, open the resulting notebooks in the notebook editor and review the code\. + + + +## Additional resources ## + + + + * For details on the methods used in the code, see [Using AutoAI libraris with Python](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-lib-python.html)\. + * For more information on AutoAI notebooks, see this [blog post](https://lukasz-cmielowski.medium.com/watson-autoai-can-i-get-the-model-88a0fbae128a)\. + + + +## Next steps ## + +[Using autoai\-lib for Python](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-lib-python.html) + +**Parent topic:**[AutoAI overview](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/082349f7c1e486d18bca3bb7569d4de25a8e81a7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/082349f7c1e486d18bca3bb7569d4de25a8e81a7.md new file mode 100644 index 0000000..781351e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/082349f7c1e486d18bca3bb7569d4de25a8e81a7.md @@ -0,0 +1,22 @@ +# applydecisionlistnode properties + +# applydecisionlistnode properties # + +You can use Decision List modeling nodes to generate a Decision List model nugget\. The scripting name of this model nugget is *applydecisionlistnode*\. For more information on scripting the modeling node itself, see [decisionlistnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/decisionlistnodeslots.html#decisionlistnodeslots)\. + + + +applydecisionlistnode properties + +Table 1\. applydecisionlistnode properties + +| `applydecisionlistnode` Properties | Values | Property description | +| ---------------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `enable_sql_generation` | *flag* | When true, SPSS Modeler will try to push back the Decision List model to SQL\. | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `enable_sql_generation` | `false``true``native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/093bffcb43c46f1068a59a6b6338c955bf20aabf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/093bffcb43c46f1068a59a6b6338c955bf20aabf.md new file mode 100644 index 0000000..e0c544f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/093bffcb43c46f1068a59a6b6338c955bf20aabf.md @@ -0,0 +1,34 @@ +# multiplotnode properties + +# multiplotnode properties # + +![Multiplot node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/multiplotnodeicon.png)The Multiplot node creates a plot that displays multiple `Y` fields over a single `X` field\. The `Y` fields are plotted as colored lines; each is equivalent to a Plot node with Style set to Line and X Mode set to Sort\. Multiplots are useful when you want to explore the fluctuation of several variables over time\. + + + +multiplotnode properties + +Table 1\. multiplotnode properties + +| `multiplotnode` properties | Data type | Property description | +| -------------------------- | ------------------------------- | ---------------------------------------------------------------------- | +| `x_field` | *field* | | +| `y_fields` | *list* | | +| `panel_field` | *field* | | +| `animation_field` | *field* | | +| `normalize` | *flag* | | +| `use_overlay_expr` | *flag* | | +| `overlay_expression` | *string* | | +| `records_limit` | *number* | | +| `if_over_limit` | `PlotBins``PlotSample``PlotAll` | | +| `x_label_auto` | *flag* | | +| `x_label` | *string* | | +| `y_label_auto` | *flag* | | +| `y_label` | *string* | | +| `use_grid` | *flag* | | +| `graph_background` | *color* | Standard graph colors are described at the beginning of this section\. | +| `page_background` | *color* | Standard graph colors are described at the beginning of this section\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/09897dcf1128d66144d2b165564c228c16cd5ec5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/09897dcf1128d66144d2b165564c228c16cd5ec5.md new file mode 100644 index 0000000..6b7aa0f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/09897dcf1128d66144d2b165564c228c16cd5ec5.md @@ -0,0 +1,22 @@ +# Deploying foundation model assets + +# Deploying foundation model assets # + +Deploy foundation model assets to test the assets, put them into production, and monitor them\. + +After you save a prompt template as a project asset, you can promote it to a deployment space\. A deployment space is used to organize the assets for deployments and to manage access to deployed assets\. Use a *Pre\-production* space to test and validate assets, and use a *Production* space for deploying assets for productive use\. + +For details, see [Deploying a prompt template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/prompt-template-deploy.html)\. + +## Learn more ## + + + + * [Tracking prompt templates ](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-track-prompt-temp.html) + * [Evaluating a prompt template in a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-eval-prompt-spaces.html) + + + +**Parent topic:**[Deploying and managing assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/wmls/wmls-deploy-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0999f59bb8e2e2ab7722d57cdbc051a0984abe45.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0999f59bb8e2e2ab7722d57cdbc051a0984abe45.md new file mode 100644 index 0000000..bb224e6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0999f59bb8e2e2ab7722d57cdbc051a0984abe45.md @@ -0,0 +1,194 @@ +# Managing Data Refinery flows + +# Managing Data Refinery flows # + +A Data Refinery flow is an ordered set of steps to cleanse, shape, and enhance data\. As you [refine your data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html#refine) by [applying operations](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/gui_operations.html) to a data set, you dynamically build a customized Data Refinery flow that you can modify in real time and save for future use\. + +These are actions that you can do while you refine your data: + +**Working with the Data Refinery flow** + + + + * [Save a Data Refinery flow](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#save) + * [Run or schedule a job for Data Refinery flow](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#jobs) + * [Rename a Data Refinery flow](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#rename) + + + +**Steps** + + + + * [Undo or redo a step](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#undo) + * [Edit, duplicate, insert, or delete a step](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#edit-duplicate) + * [View the Data Refinery flow steps in a "snapshot view"](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#snapshot) + * [Export the Data Refinery flow data to a CSV file](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#export) + + + +**Working with the data sets** + + + + * [Change the source of a Data Refinery flow](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#change) + * [Edit the sample size](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#sample) + * [Edit the source properties ](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#edit-source) + * [Change the target of a Data Refinery flow](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#output) + * [Edit the target properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#edit-target) + * [Change the name of the Data Refinery flow target](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#change-name) + + + +**Actions on the project page** + + + + * [Reopen a Data Refinery flow to continue working](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#reopen) + * [Duplicate a Data Refinery flow](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#clone) + * [Delete a Data Refinery flow](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#remove) + * [Promote a Data Refinery flow to a space](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#promote) + + + +## Working with the Data Refinery flow ## + +### Save a Data Refinery flow ### + +Save a Data Refinery flow by clicking the Save Data Refinery flow icon ![Save icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/save.png) in the Data Refinery toolbar\. Data Refinery flows are saved to the project that you're working in\. Save a Data Refinery flow so that you can continue refining a data set later\. + +The default output of the Data Refinery flow is saved as a data asset *source\-file\-name*\_shaped\.csv\. For example, if the source file is `mydata.csv`, the default name and output for the Data Refinery flow is `mydata_csv_shaped`\. You can edit the name and add an extension by [changing the target of a Data Refinery flow](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#output)\. + +### Run or schedule a job for a Data Refinery flow ### + +Data Refinery supports large data sets, which can be time\-consuming and unwieldy to refine\. So that you can work quickly and efficiently, Data Refinery operates on a sample subset of rows in the data set\. The sample size is 1 MB or 10,000 rows, whichever comes first\. When you run a job for the Data Refinery flow, the entire data set is processed\. When you run the job, you select the runtime and you can add a one\-time or repeating schedule\. + +In Data Refinery, from the Data Refinery toolbar click the Jobs icon ![the run or schedule a job icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/Run-schedule_Blue.png), and then select **Save and create a job** or **Save and view jobs**\. + +After you save a Data Refinery flow, you can also create a job for it from the Project page\. Go to the **Assets** tab, select the Data Refinery flow, choose **New job** from the overflow menu (![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png))\. + +You must have the **Admin** or **Editor** role to view the job details or to edit or run the job\. With the **Viewer** role for the project, you can view only the job details\. + +For more information about jobs, see [Creating jobs in Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-dr.html)\. + +### Rename a Data Refinery flow ### + +On the Data Refinery toolbar, open the Info pane ![info icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/info-pane.png)\. Or open the Flow settings ![settings icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/settings.png) and go to the **General** tab\. + +## Steps ## + +### Undo or redo a step ### + +Click the undo (![undo icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/undo.png)) icon or the redo (![redo icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/redo.png)) icon on the toolbar\. + +### Edit, duplicate, insert, or delete a step ### + +In the Steps pane, click the overflow menu (![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png)) on the step for the operation that you want to change\. Select the action (**Edit**, **Duplicate**, **Insert step before**, **Insert step after**, or **Delete**)\. + + + + * If you select **Edit**, Data Refinery goes into edit mode and either displays the operation to be edited on the command line or in the Operation pane\. Apply the edited operation\. + + + + + + * If you select **Duplicate**, the duplicated step is inserted after the selected step\. + + + +Note:The **Duplicate** action is not available for the *Join* or *Union* operations\. + +Data Refinery updates the Data Refinery flow to reflect the changes and reruns all the operations\. + +### View the Data Refinery flow steps in a "snapshot view" ### + +To see what your data looked like at any point in time, click a previous step to put Data Refinery into snapshot view\. For example, if you click **Data source**, you see what your data looked like before you started refining it\. Click any operation step to see what your data looked like after that operation was applied\. To leave snapshot view, click **Viewing step x of y** or click the same step that you selected to get into snapshot view\. + +### Export the Data Refinery flow data to a CSV file ### + +Click Export (![export icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/export.png)) on the toolbar to export the data at the current step in your Data Refinery flow to a CSV file without saving or running a Data Refinery flow job\. Use this option, for example, if you want quick output of a Data Refinery flow that is in progress\. When you export the data, a CSV file is created and downloaded to your computer's **Downloads** folder (or the user\-specified download location) at the current step in the Data Refinery flow\. If you are in [snapshot view](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html?context=cdpaas&locale=en#snapshot), the output of the CSV file is at the step that you clicked\. If you are viewing a sample (subset) of the data, only the sample data will be in the output\. + +## Working with the data sets ## + +### Change the source of a Data Refinery flow ### + +Change the source of a Data Refinery flow\. Run the same Data Refinery flow but with a different source data set\. There are two ways that you can change the source: + + + + * In the **Steps** pane: Click the overflow menu (![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png)) next to **Data source**, select **Edit**, and then choose a different source data set\. + ![Edit source](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/edit-source.png) + * In the Flow settings: You can use this method if you want to change more than one data source in the same place\. For example, for a Join or a Union operation\. On the toolbar, open the Flow settings ![settings icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/settings.png)\. Go to the **Source data sets** tab and click the overflow menu (![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png)) next to the data source\. Select **Replace data source**, and then choose a different source data set\. + + + +For best results, the new data set should have a schema that is compatible to the original data set (for example, column names, number of columns, and data types)\. If the new data set has a different schema, operations that won't work with the schema will show errors\. You can edit or delete the operations, or change the source to one that has a more compatible schema\. + +### Edit the sample size ### + +When you run the job for the Data Refinery flow, the operations are performed on the full data set\. However, when you apply the operations interactively in Data Refinery, depending on the size of the data set, you view only a sample of the data\. + +Increase the sample size to see results that will be closer to the results of the Data Refinery flow job, but be aware that it might take longer to view the results in Data Refinery\. The maximum is a top\-row count of 10,000 rows or 1 MB, whichever comes first\. Decrease the sample size to view faster results\. Depending on the size of the data and the number and complexity of the operations, you might want to experiment with the sample size to see what works best for the data set\. + +On the toolbar, open the Flow settings ![settings icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/settings.png)\. Go to the **Source data sets** tab and click the overflow menu (![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png)) next to the data source, and select **Edit sample**\. + +### Edit the source properties ### + +The available properties depend on the data source\. Different properties are available for data assets and for data from different kinds of connections\. Change the file format only if the inferred file format is incorrect\. If you change the file format, the source is read with the new format, but the source file remains unchanged\. Changing the format source properties might be an iterative process\. Inspect your data after you apply an option\. + +On the toolbar, open the Flow settings ![settings icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/settings.png)\. Go to the **Source data sets** tab and click the overflow menu (![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png)) next to the data source, and select **Edit format**\. + +Important: Use caution if you edit the source properties\. Incorrect selections might produce unexpected results when the data is read or impair the Data Refinery flow job\. Inspect the results of the Data Refinery flow carefully\. + +### Change the target of a Data Refinery flow ### + +By default, the target of the Data Refinery is saved as a data asset in the project that you're working in\. + +To change the *target location*, open Flow settings ![settings icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/settings.png) from the toolbar\. Go to the **Target data set** tab, click **Select target**, and select a different target location\. + +### Edit the target properties ### + +The available properties depend on the data source\. Different properties are available for data assets and for data from different kinds of connections\. + +To change the target data set's properties, open the Flow settings ![settings icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/settings.png) from the toolbar\. Go to the **Target data set** tab, and click **Edit properties**\. + +#### Change the name of the Data Refinery flow target #### + +The name of the target data set is included in the fields that you can change when you edit the target properties\. + +By default, the target of the Data Refinery is saved as a data asset *source\-file\-name*\_shaped\.csv in the project\. For example, if the source is `mydata.csv`, the default name and output for the Data Refinery flow is the data asset `mydata_csv_shaped`\. + +Different properties and naming conventions apply to a target data set from a connection\. For example, if the data set is in Cloud Object Storage, the data set is identified in the **Bucket** and **File name** fields\. If the data set is in a Db2 database, the data set is identified in the **Schema name** and **Table name** fields\. + +Important: Use caution if you edit the target properties\. Incorrect selections might produce unexpected results or impair the Data Refinery flow job\. Inspect the results of the Data Refinery flow carefully\. + +## Actions on the project page ## + +### Reopen a Data Refinery flow to continue working ### + +To reopen a Data Refinery flow and continue refining your data, go to the project’s **Assets** tab\. Under **Asset types**, expand **Flows**, click **Data Refinery flow**\. Click the Data Refinery flow name\. + +### Duplicate a Data Refinery flow ### + +To create a copy of a Data Refinery flow, go to the project's **Assets** tab, expand **Flows**, click **Data Refinery flow**\. Select the Data Refinery flow, and then select **Duplicate** from the overflow menu (![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png))\. The Data Refinery flow is added to the Data Refinery flows list as "*original\-name* copy 1"\. + +### Delete a Data Refinery flow ### + +To delete a Data Refinery flow, go to the project's **Assets** tab, expand **Flows**, click **Data Refinery flow**\. Select the Data Refinery flow, and then select **Delete** from the overflow menu (![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png))\. + +### Promote a Data Refinery flow to a space ### + +Deployment spaces are used to manage a set of related assets in a separate environment from your projects\. You use a space to prepare data for a deployment job for Watson Machine Learning\. You can promote Data Refinery flows from multiple projects to a single space\. Complete the steps in the Data Refinery flow before you promote it because the Data Refinery flow is not editable in a space\. + +To promote a Data Refinery flow to a space, go to the project's **Assets** tab, expand **Flows**, click **Data Refinery flow**\. Select the Data Refinery flow\. Click the overflow menu (![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png)) for the Data Refinery flow, and then select **Promote**\. The source file for the Data Refinery flow and any other dependent data will be promoted as well\. + +To create or run a job for the Data Refinery flow in a space, go the space’s **Assets** tab, scroll down to the Data Refinery flow, and select **New job** (![the run or schedule a job icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/Run-schedule_Blue.png)) from the overflow menu (![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png))\. If you've already created the job, go to the **Jobs** tab to edit the job or view the job run details\. The shaped output of the Data Refinery flow job will be available on the space’s **Assets** tab\. You must have the **Admin** or **Editor** role to view the job details or to edit or run the job\. With the **Viewer** role for the project, you can only view the job details\. You can use the shaped output as input data for a job in Watson Machine Learning\. + +Restriction:When you promote a Data Refinery flow from a project to a space and the target of the Data Refinery flow is a *connected data asset*, you must manually promote the connected data asset\. This action ensures that the connected data asset's data is updated when you run the Data Refinery flow job in the space\. Otherwise, a successful run of the Data Refinery flow job will create a new data asset in the space\. + +For information about spaces, see [Deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html)\. + +**Parent topic:**[Refining data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/09bb38fb6df4c562a478d6d3dc54d22823f922fb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/09bb38fb6df4c562a478d6d3dc54d22823f922fb.md new file mode 100644 index 0000000..b4f169b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/09bb38fb6df4c562a478d6d3dc54d22823f922fb.md @@ -0,0 +1,9 @@ +# Record Operations nodes (SPSS Modeler) + +# Record Operations # + +Record Operations nodes are useful for making changes to data at the record level\. These operations are important during the data understanding and data preparation phases of data mining because they allow you to tailor the data to your particular business need\. + +For example, based on the results of a data audit conducted using the Data Audit node (Outputs palette), you might decide that you would like to merge customer purchase records for the past three months\. Using a Merge node, you can merge records based on the values of a key field, such as `Customer ID`\. Or you might discover that a database containing information about web site hits is unmanageable with over one million records\. Using a Sample node, you can select a subset of data for use in modeling\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0a507ff5262bad7a3fb3f3c478388cff78949941.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0a507ff5262bad7a3fb3f3c478388cff78949941.md new file mode 100644 index 0000000..9d93f7c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0a507ff5262bad7a3fb3f3c478388cff78949941.md @@ -0,0 +1,636 @@ +# Managing feature groups with assetframe-lib for Python (beta) + +# Managing feature groups with assetframe\-lib for Python (beta) # + +You can use the `assetframe-lib` to create, view and edit feature group information for data assets in Watson Studio notebooks\. + +Feature groups define additional metadata on columns of your data asset that can be used in downstream Machine Learning tasks\. See [Managing feature groups](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/feature-group.html) for more information about using feature groups in the UI\. + +## Setting up the `assetframe-lib` and `ibm-watson-studio-lib` libraries ## + +The `assetframe-lib` library for Python is pre\-installed and can be imported directly in a notebook in Watson Studio\. However, it relies on the [`ibm-watson-studio-lib`](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/using-ibm-ws-lib.html) library\. The following steps describe how to set up both libraries\. + +To insert the project token to your notebook: + + + +1. Click the **More** icon on your notebook toolbar and then click **Insert project token**\. + + If a project token exists, a cell is added to your notebook with the following information: + + from ibm_watson_studio_lib import access_project_or_space + wslib = access_project_or_space({"token":""}) + + `` is the value of the project token. + + If you are told in a message that no project token exists, click the link in the message to be redirected to the project's **Access Control** page where you can create a project token. You must be eligible to create a project token. + + To create a project token: + + + + 1. From the **Manage** tab, select the **Access Control** page, and click **New access token** under **Access tokens**. + 2. Enter a name, select **Editor** role for the project, and create a token. + 3. Go back to your notebook, click the **More** icon on the notebook toolbar and then click **Insert project token**. + + + +2. Import `assetframe-lib` and initialize it with the created `ibm-watson-studio-lib` instance\. + + from assetframe_lib import AssetFrame + AssetFrame._wslib = wslib + + + +## The assetframe\-lib functions and methods ## + +The assetframe\-lib library exposes a set of functions and methods that are grouped in the following way: + + + + * [Creating an asset frame](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/py_assetframe.html?context=cdpaas&locale=en#create-assetframe) + * [Creating, retrieving and removing features](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/py_assetframe.html?context=cdpaas&locale=en#create-features) + * [Specifying feature attributes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/py_assetframe.html?context=cdpaas&locale=en#specify-featureatt) + + + + * [Role](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/py_assetframe.html?context=cdpaas&locale=en#role) + * [Description](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/py_assetframe.html?context=cdpaas&locale=en#description) + * [Fairness information for favorable and unfavorable outcomes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/py_assetframe.html?context=cdpaas&locale=en#fairnessinfo) + * [Fairness information for monitored and reference groups](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/py_assetframe.html?context=cdpaas&locale=en#monitoredreference) + * [Value descriptions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/py_assetframe.html?context=cdpaas&locale=en#value-desc) + * [Recipe](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/py_assetframe.html?context=cdpaas&locale=en#recipe) + * [Tags](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/py_assetframe.html?context=cdpaas&locale=en#tags) + + + + * [Previewing data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/py_assetframe.html?context=cdpaas&locale=en#preview-data) + * [Getting fairness information](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/py_assetframe.html?context=cdpaas&locale=en#get-fairness) + + + +## Creating an asset frame ## + +An asset frame is used to define feature group metadata on an existing data asset or on a pandas DataFrame\. You can have exactly one feature group for each asset\. If you create an asset frame on a pandas DataFrame, you can store the pandas DataFrame along with the feature group metadata as a data asset in your project\. + +You can use one of the following functions to create your asset frame: + + + + * `AssetFrame.from_data_asset(asset_name, create_default_features=False)` + + This function creates a new asset frame wrapping an existing data asset in your project. If there is already a feature group for this asset, for example created in the user interface, it is read from the asset metadata. + + + + **Parameters:** + - `asset_name`: (Required) The name of a data asset in your project. + - `create_default_features`: (Optional) Creates features for all columns in the data asset. + + + + * `AssetFrame.from_pandas(name, dataframe, create_default_features=False)` + + This function creates a new asset frame wrapping a pandas DataFrame. + + **Parameters:** + + + + * `name`: (Required) The name of the asset frame. This name will be used as the name of the data asset if you store your feature group in your project in a later step. + * `dataframe`: (Required) A pandas DataFrame that you want to store along with feature group information. + * `create_default_features`: (Optional) Create features for all columns in the dataframe. + + Example of creating a asset frame from a pandas DataFrame: + + # Create an asset frame from a pandas DataFrame and set + # the name of the asset frame. + af = AssetFrame.from_pandas(dataframe=credit_risk_df, name="Credit Risk Training Data") + + + + + +## Creating, retrieving and removing features ## + +A feature defines metadata that can be used by downstream Machine Learning tasks\. You can create one feature per column in your data set\. + +You can use one of the following functions to create, retrieve or remove columns from your asset frame: + + + + * `add_feature(column_name, role='Input')` + + This function adds a new feature to your asset frame with the given role. + + **Parameters:** + + + + * `column_name`: (Required) The name of the column to create a feature for. + * `role`: (Optional) The role of the feature. It defaults to *Input*. + + Valid roles are: + + + + * *Input*: The input for a machine learning model + + * *Target*: The target of a prediction model + + * *Identifier*: The identifier of a row in your data set. + + + + + + * `create_default_features()` + + This function creates features for all columns in your data set. The roles of the features will default to *Input*. + * `get_features()` + + This function retrieves all features of the asset frame. + * `get_feature(column_name)` + + This function retrieves the feature for the given column name. + + **Parameters:** + + + + * `column_name`: (Required) The string name of the column to create the feature for. + + + + * `get_features_by_role(role)` + + This function retrieves all features of the dataframe with the given role. + + **Parameters:** + + + + * `role`: (Required) The role that the features must have. This can be *Input*, *Target* or *Identifier*. + + + + * `remove_feature(feature_or_column_name)` + + This function removes the feature from the asset frame. + + **Parameters:** + + + + * `feature_or_column_name`: (Required) A feature or the name of the column to remove the feature for. + + + + + +Example that shows creating features for all columns in the data set and retrieving one of those columns for further specifications: + + # Create features for all columns in the data set and retrieve a column + # for further specifications. + af.create_default_features() + risk_feat = af.get_feature('Risk') + +## Specifying feature attributes ## + +Features specify additional metadata on columns that may be used in downstream Machine Learning tasks\. + +You can use the following function to retrieve the column that the feature is defined for: + + + + * `get_column_name()` + + This function retrieves the column name that the feature is defined for. + + + +### Role ### + +The role specifies the intended usage of the feature in a Machine Learning task\. + +Valid roles are: + + + + * `Input`: The feature can be used as an input to a Machine Learning model\. + * `Identifier`: The feature uniquely identifies a row in the data set\. + * `Target`: The feature can be used as a target in a prediction algorithm\. + + + +At this time, a feature must have exactly one role\. + +You can use the following methods to work with the role: + + + + * `set_roles(roles)` + + This method sets the roles of the feature. + + **Parameters:** + + + + * `roles` : (Required) The roles to be used. Either as a single string or an array of strings. + + + + * `get_roles()` + + This method returns all roles of the feature. + + + +Example that shows getting a feature and setting a role: + + # Set the role of the feature 'Risk' to 'Target' to use it as a target in a prediction model. + risk_feat = af.get_feature('Risk') + risk_feat.set_roles('Target') + +### Description ### + +An optional description of the feature\. It defaults to `None`\. + +You can use the following methods to work with the description\. + + + + * `set_description(description)` + + This method sets the description of the feature. + + **Parameters:** + + + + * `description`: (Required) Either a string or `None` to remove the description. + + + + * `get_description()` + + This method returns the description of the feature. + + + +### Fairness information for favorable and unfavorable outcomes ### + +You can specify favorable and unfavorable labels for a feature with a `Target` role\. + +You can use the following methods to set and retrieve favorable or unfavorable labels\. + +#### Favorable outcomes #### + +You can use the following methods to set and get favorable labels: + + + + * `set_favorable_labels(labels)` + + This method sets favorable labels for the feature. + + **Parameters:** + + + + * `labels`: (Required) A string or list of strings with favorable labels. + + + + * `get_favorable_labels()` + + This method returns the favorable labels of the feature. + + + +#### Unfavorable outcomes #### + +You can use the following methods to set and get unfavorable labels: + + + + * `set_unfavorable_labels(labels)` + + This method sets unfavorable labels for the feature. + + **Parameters**: + + + + * `labels`: (Required) A string or list of strings with unfavorable labels. + + + + * `get_unfavorable_labels()` + + This method gets the unfavorable labels of the feature. + + + +Example that shows setting favorable and unfavorable labels: + + # Set favorable and unfavorable labels for the target feature 'Risk'. + risk_feat = af.get_feature('Risk') + risk_feat.set_favorable_labels("No Risk") + risk_feat.set_unfavorable_labels("Risk") + +### Fairness information for monitored and reference groups ### + +Some columns in your data might by prone to unfair bias\. You can specify monitored and reference groups for further usage in Machine Learning tasks\. They can be specified for features with the role `Input`\. + +You can either specify single values or ranges of numeric values as a string with square brackets and a start and end value, for example `[0,15]`\. + +You can use the following methods to set and retrieve monitored and reference groups: + + + + * `set_monitored_groups(groups)` + + This method sets monitored groups for the feature. + + **Parameters**: + + + + * `groups`: (Required) A string or list of strings with monitored groups. + + + + * `get_monitored_groups()` + + This method gets the monitored groups of the feature. + * `set_reference_groups(groups)` + + This method sets reference groups for the feature. + + **Parameters**: + + + + * `groups`: (Required) A string or list of strings with reference groups. + + + + * `get_reference_groups()` + + This method gets the reference groups of the feature. + + + +Example that shows setting monitored and reference groups: + + # Set monitored and reference groups for the features 'Sex' and 'Age'. + sex_feat = af.get_feature("Sex") + sex_feat.set_reference_groups("male") + sex_feat.set_monitored_groups("female") + + age_feat = af.get_feature("Age") + age_feat.set_monitored_groups("[0,25]") + age_feat.set_reference_groups("[26,80]") + +### Value descriptions ### + +You can use value descriptions to specify descriptions for column values in your data\. + +You can use the following methods to set and retrieve descriptions: + + + + * `set_value_descriptions(value_descriptions)` + + This method sets value descriptions for the feature. + + **Parameters:** + + + + * `value_descriptions`: (Required) A Pyton dictionary or list of dictionaries of the following format: `{'value': '', 'description': ''}` + + + + * `get_value_descriptions()` + + This method returns all value descriptions of the feature. + * `get_value_description(value)` + + This method returns the value description for the given value. + + **Parameters**: + + + + * `value`: (Required) The value to retrieve the value description for. + + + + * `add_value_description(value, description)` + + This method adds a value description with the given value and description to the list of value descriptions for the feature. + + **Parameters**: + + + + * `value`: (Required) The string value of the value description. + * `description`: (Required) The string description of the value description. + + + + * `remove_value_description(value)` + + This method removes the value description with the given value from the list of value descriptions of the feature. + + **Parameters**: + + + + * `value`: (Required) A value of the value description to be removed. + + + + + +Example that shows how to set value descriptions: + + plan_feat = af.get_feature("InstallmentPlans") + val_descriptions = [ + {'value': 'stores', + 'description': 'customer has additional business installment plan'}, + {'value': 'bank', + 'description': 'customer has additional personal installment plan'}, + {'value': 'none', + 'description': 'customer has no additional installment plan'} + ] + plan_feat.set_value_descriptions(val_descriptions) + +### Recipe ### + +You can use the recipe to describe how a feature was created, for example with a formula or a code snippet\. It defaults to `None`\. + +You can use the following methods to work with the recipe\. + + + + * `set_recipe(recipe)` + + This method sets the recipe of the feature. + + **Parameters**: + + + + * `recipe`: (Required) Either a string or None to remove the recipe. + + + + * `get_recipe()` + + This method returns the recipe of the feature. + + + +### Tags ### + +You can use tags to attach additional labels or information to your feature\. + +You can use the following methods to work with tags: + + + + * `set_tags(tags)` + + This method sets the tags of the feature. + + **Parameters**: + + + + * `tags`: (Required) Either as a single string or an array of strings. + + + + * `get_tags()` + + This method returns all tags of the feature. + + + +## Previewing data ## + +You can preview the data of your data asset or pandas DataFrame with additional information about your features like fairness information\. + +The data is displayed like a pandas DataFrame with optional header information about feature roles, descriptions or recipes\. Fairness information is displayed with coloring for favorable or unfavorable labels, monitored and reference groups\. + +At this time, you can retrieve up to 100 rows of sample data for a data asset\. + +Use the following function to preview data: + + + + * `head(num_rows=5, display_options=['role'])` + + This function returns the first `num_rows` rows of the data set in a pandas DataFrame. + + **Parameters**: + + + + * `num_rows` : (Optional) The number of rows to retrieve. + * `display_options`: (Optional) The column header can display additional information for a column in your data set. + + Use these options to display feature attributes: + + + + * `role`: Displays the role of a feature for this column. + * `description`: Displays the description of a feature for this column. + * `recipe`: Displays the recipe of a feature for this column. + + + + + + + +## Getting fairness information ## + +You can retrieve the fairness information of all features in your asset frame as a Python dictionary\. This includes all features containing monitored or reference groups (or both) as protected attributes and the target feature with favorable or unfavorable labels\. + +If the data type of a column with fairness information is numeric, the values of labels and groups are transformed to numeric values if possible\. + +Fairness information can be used directly in [AutoAI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-fairness.html) or [AI Fairness 360](https://www.ibm.com/opensource/open/projects/ai-fairness-360/)\. + +You can use the following function to retrieve fairness information of your asset frame: + + + + * `get_fairness_info(target=None)` + + This function returns a Python dictionary with favorable and unfavorable labels of the target column and protected attributes with monitored and reference groups. + + **Parameters**: + + + + * target: (Optional) The target feature. If there is only one feature with role `Target`, it will be used automatically. + + Example that shows how to retrieve fairness information: + + af.get_fairness_info() + + Output showing fairness information: + + { + 'favorable_labels': ['No Risk'], + 'unfavorable_labels': ['Risk'], + 'protected_attributes': [ + {'feature': 'Sex', + 'monitored_group': 'female'], + 'reference_group': 'male']}, + {'feature': 'Age', + 'monitored_group': 0.0, 25]], + 'reference_group': 26, 80]] + }] + } + + + + + +## Saving feature group information ## + +After you have fully specified or updated your features, you can save the whole feature group definition as metadata for your data asset\. + +If you created the asset frame from a pandas DataFrame, a new data asset will be created in the project storage with the name of the asset frame\. + +You can use the following method to store your feature group information: + + + + * `to_data_asset(overwrite_data=False)` + + This method saves feature group information to the assets metadata. It creates a new data asset, if the asset frame was created from a pandas DataFrame. + + **Parameters**: + + + + * `overwrite_data`: (Optional) Also overwrite the asset contents with the data from the asset frame. Defaults to `False`. + + + + + +## Learn more ## + +See the [Creating and using feature store data](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/e756adfa2855bdfc20f588f9c1986382) sample project in the Samples\. + +**Parent topic:**[Loading and accessing data in a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0a5c26b7b5b7c1e3afd8901d8b91f2e3c527da3e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0a5c26b7b5b7c1e3afd8901d8b91f2e3c527da3e.md new file mode 100644 index 0000000..3bba1ac --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0a5c26b7b5b7c1e3afd8901d8b91f2e3c527da3e.md @@ -0,0 +1,34 @@ +# Deriving a new field (SPSS Modeler) + +# Deriving a new field # + +Figure 1\. Scatterplot of drug distribution + +![Scatterplot of drug distribution](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_drug_scatterplot.png) + +Since the ratio of sodium to potassium seems to predict when to use drug `Y`, you can derive a field that contains the value of this ratio for each record\. This field might be useful later when you build a model to predict when to use each of the five drugs\. + + + +1. To simplify your flow layout, start by deleting all the nodes except the drug1n\.csv Data Asset node\. +2. Place a Derive node on the canvas and connect it to the drug1n\.csv Data Asset node\. + + Figure 2. Derive node + + ![Derive node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_drug_newfield_flow.png) +3. Double\-click the Derive node to edit its properties\. +4. Name the new field Na\_to\_K\. Since you obtain the new field by dividing the sodium value by the potassium value, enter Na/K for the expression\. You can also create an expression by clicking the calculator icon\. This opens the Expression Builder, a way to interactively create expressions using built\-in lists of functions, operands, and fields and their values\. +5. You can check the distribution of your new field by attaching a Histogram node to the Derive node\. In the Histogram node properties, specify `Na_to_K` as the field to be plotted and `Drug` as the color overlay field\. + + Figure 3. Histogram node + + ![Histogram node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_drug_newfield_histogram_flow.png) +6. Right\-click the Histogram node and select Run\. A histogram chart is added to the Outputs pane\. Based on the chart, you can conclude that when the `Na_to_K` value is around 15 or more, drug `Y` is the drug of choice\. + + Figure 4. Histogram chart output + + ![Histogram chart output](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_drug_histogram.png) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0a6d8500dac43a18ec5dd8fcc3d31c2a31546554.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0a6d8500dac43a18ec5dd8fcc3d31c2a31546554.md new file mode 100644 index 0000000..368e009 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0a6d8500dac43a18ec5dd8fcc3d31c2a31546554.md @@ -0,0 +1,73 @@ +# glmmnode properties + +# glmmnode properties # + +![GLMM node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/glmmnodeicon.png)A generalized linear mixed model (GLMM) extends the linear model so that the target can have a non\-normal distribution, is linearly related to the factors and covariates via a specified link function, and so that the observations can be correlated\. GLMM models cover a wide variety of models, from simple linear regression to complex multilevel models for non\-normal longitudinal data\. + + + +glmmnode properties + +Table 1\. glmmnode properties + +| `glmmnode` Properties | Values | Property description | +| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `residual_subject_spec` | *structured* | The combination of values of the specified categorical fields that uniquely define subjects within the data set | +| `repeated_measures` | *structured* | Fields used to identify repeated observations\. | +| `residual_group_spec` | \[*field1 \.\.\. fieldN*\] | Fields that define independent sets of repeated effects covariance parameters\. | +| `residual_covariance_type` | `Diagonal`
`AR1`
`ARMA11`
`COMPOUND_SYMMETRY`
`IDENTITY`
`TOEPLITZ`
`UNSTRUCTURED`
`VARIANCE_COMPONENTS` | Specifies covariance structure for residuals\. | +| `custom_target` | *flag* | Indicates whether to use target defined in upstream node (`false`) or custom target specified by `target_field` (`true`)\. | +| `target_field` | *field* | Field to use as target if `custom_target` is `true`\. | +| `use_trials` | *flag* | Indicates whether additional field or value specifying number of trials is to be used when target response is a number of events occurring in a set of trials\. Default is `false`\. | +| `use_field_or_value` | `Field`
`Value` | Indicates whether field (default) or value is used to specify number of trials\. | +| `trials_field` | *field* | Field to use to specify number of trials\. | +| `trials_value` | *integer* | Value to use to specify number of trials\. If specified, minimum value is 1\. | +| `use_custom_target_reference` | *flag* | Indicates whether custom reference category is to be used for a categorical target\. Default is `false`\. | +| `target_reference_value` | *string* | Reference category to use if `use_custom_target_reference` is `true`\. | +| `dist_link_combination` | `Nominal`
`Logit`
`GammaLog`
`BinomialLogit`
`PoissonLog`
`BinomialProbit`
`NegbinLog`
`BinomialLogC`
`Custom` | Common models for distribution of values for target\. Choose `Custom` to specify a distribution from the list provided by`target_distribution`\. | +| `target_distribution` | `Normal`
`Binomial`
`Multinomial`
`Gamma`
`Inverse`
`NegativeBinomial`
`Poisson` | Distribution of values for target when `dist_link_combination` is `Custom`\. | +| `link_function_type` | `Identity`
`LogC`
`Log`
`CLOGLOG``Logit`
`NLOGLOG``PROBIT`
`POWER`
`CAUCHIT` | Link function to relate target
values to predictors\.
If `target_distribution` is
`Binomial` you can use any
of the listed link functions\.
If `target_distribution` is
`Multinomial` you can use
`CLOGLOG`, `CAUCHIT`, `LOGIT`,
`NLOGLOG`, or `PROBIT`\.
If `target_distribution` is
anything other than `Binomial` or
`Multinomial` you can use
`IDENTITY`, `LOG`, or `POWER`\. | +| `link_function_param` | *number* | Link function parameter value to use\. Only applicable if `normal_link_function` or `link_function_type` is `POWER`\. | +| `use_predefined_inputs` | *flag* | Indicates whether fixed effect fields are to be those defined upstream as input fields (`true`) or those from `fixed_effects_list` (`false`)\. Default is `false`\. | +| `fixed_effects_list` | *structured* | If `use_predefined_inputs` is `false`, specifies the input fields to use as fixed effect fields\. | +| `use_intercept` | *flag* | If `true` (default), includes the intercept in the model\. | +| `random_effects_list` | *structured* | List of fields to specify as random effects\. | +| `regression_weight_field` | *field* | Field to use as analysis weight field\. | +| `use_offset` | `None``offset_value``offset_field` | Indicates how offset is specified\. Value `None` means no offset is used\. | +| `offset_value` | *number* | Value to use for offset if `use_offset` is set to `offset_value`\. | +| `offset_field` | *field* | Field to use for offset value if `use_offset` is set to `offset_field`\. | +| `target_category_order` | `Ascending``Descending``Data` | Sorting order for categorical targets\. Value `Data` specifies using the sort order found in the data\. Default is `Ascending`\. | +| `inputs_category_order` | `Ascending``Descending``Data` | Sorting order for categorical predictors\. Value `Data` specifies using the sort order found in the data\. Default is `Ascending`\. | +| `max_iterations` | *integer* | Maximum number of iterations the algorithm will perform\. A non\-negative integer; default is 100\. | +| `confidence_level` | *integer* | Confidence level used to compute interval estimates of the model coefficients\. A non\-negative integer; maximum is 100, default is 95\. | +| `degrees_of_freedom_method` | `Fixed``Varied` | Specifies how degrees of freedom are computed for significance test\. | +| `test_fixed_effects_coeffecients` | `Model``Robust` | Method for computing the parameter estimates covariance matrix\. | +| `use_p_converge` | *flag* | Option for parameter convergence\. | +| `p_converge` | *number* | Blank, or any positive value\. | +| `p_converge_type` | `Absolute``Relative` | | +| `use_l_converge` | *flag* | Option for log\-likelihood convergence\. | +| `l_converge` | *number* | Blank, or any positive value\. | +| `l_converge_type` | `Absolute``Relative` | | +| `use_h_converge` | *flag* | Option for Hessian convergence\. | +| `h_converge` | *number* | Blank, or any positive value\. | +| `h_converge_type` | `Absolute``Relative` | | +| `max_fisher_step` | *integer* | | +| `sing_tolerance` | *number* | | +| `use_model_name` | *flag* | Indicates whether to specify a custom name for the model (`true`) or to use the system\-generated name (`false`)\. Default is `false`\. | +| `model_name` | *string* | If `use_model_name` is `true`, specifies the model name to use\. | +| `confidence` | `onProbability``onIncrease` | Basis for computing scoring confidence value: highest predicted probability, or difference between highest and second highest predicted probabilities\. | +| `score_category_probabilities` | *flag* | If `true`, produces predicted probabilities for categorical targets\. Default is `false`\. | +| `max_categories` | *integer* | If `score_category_probabilities` is `true`, specifies maximum number of categories to save\. | +| `score_propensity` | *flag* | If `true`, produces propensity scores for flag target fields that indicate likelihood of "true" outcome for field\. | +| `emeans` | *structure* | For each categorical field from the fixed effects list, specifies whether to produce estimated marginal means\. | +| `covariance_list` | *structure* | For each continuous field from the fixed effects list, specifies whether to use the mean or a custom value when computing estimated marginal means\. | +| `mean_scale` | `Original``Transformed` | Specifies whether to compute estimated marginal means based on the original scale of the target (default) or on the link function transformation\. | +| `comparison_adjustment_method` | `LSD``SEQBONFERRONI``SEQSIDAK` | Adjustment method to use when performing hypothesis tests with multiple contrasts\. | +| `use_trials_field_or_value` | `"field"``"value"` | | +| `residual_subject_ui_spec` | *array* | Residual subject specification: The combination of values of the specified categorical fields should uniquely define subjects within the dataset\. For example, a single *Patient ID* field should be sufficient to define subjects in a single hospital, but the combination of *Hospital ID* and *Patient ID* may be necessary if patient identification numbers are not unique across hospitals\. | +| `repeated_ui_measures` | *array* | The fields specified here are used to identify repeated observations\. For example, a single variable *Week* might identify the 10 weeks of observations in a medical study, or *Month* and *Day* might be used together to identify daily observations over the course of a year\. | +| `spatial_field` | *array* | The variables in this list specify the coordinates of the repeated observations when one of the spatial covariance types is selected for the repeated covariance type\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b14841af65a8855e9d497ef05270b54b245daf8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b14841af65a8855e9d497ef05270b54b245daf8.md new file mode 100644 index 0000000..9026eb6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b14841af65a8855e9d497ef05270b54b245daf8.md @@ -0,0 +1,22 @@ +# userinputnode properties + +# userinputnode properties # + +![User Input node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/userinputnodeicon.png)The User Input node provides an easy way to create synthetic data—either from scratch or by altering existing data\. This is useful, for example, when you want to create a test dataset for modeling\. + + + +userinputnode properties + +Table 1\. userinputnode properties + +| `userinputnode` properties | Data type | Property description | +| -------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `data` | | | +| `names` | | Structured slot that sets or returns a list of field names generated by the node\. | +| `custom_storage` | `Unknown``String``Integer``Real``Time``Date``Timestamp` | Keyed slot that sets or returns the storage for a field\. | +| `data_mode` | `Combined``Ordered` | If `Combined` is specified, records are generated for each combination of set values and min/max values\. The number of records generated is equal to the product of the number of values in each field\. If `Ordered` is specified, one value is taken from each column for each record in order to generate a row of data\. The number of records generated is equal to the largest number values associated with a field\. Any fields with fewer data values will be padded with null values\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b35e778b109957ee1cc48fa8e46ed7a1633e380.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b35e778b109957ee1cc48fa8e46ed7a1633e380.md new file mode 100644 index 0000000..d520a15 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b35e778b109957ee1cc48fa8e46ed7a1633e380.md @@ -0,0 +1,181 @@ +# Troubleshooting Watson OpenScale + +# Troubleshooting Watson OpenScale # + +You can use the following techniques to work around problems with IBM Watson OpenScale\. + + + + * [When I use AutoAI, why am I getting an error about mismatched data?](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/wos-troubleshoot.html?context=cdpaas&locale=en#ts-trouble-common-autoai-binary) + * [Why am I getting errors during model configuration?](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/wos-troubleshoot.html?context=cdpaas&locale=en#ts-trouble-common-xgboost-wml-model-details) + * [Why are my class labels missing when I use XGBoost?](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/wos-troubleshoot.html?context=cdpaas&locale=en#ts-trouble-common-xgboost-multiclass) + * [Why are the payload analytics not displaying properly?](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/wos-troubleshoot.html?context=cdpaas&locale=en#ts-trouble-common-payloadfileformat) + * [Error: An error occurred while computing feature importance](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/wos-troubleshoot.html?context=cdpaas&locale=en#ts-trouble-wos-equals-sign-explainability) + * [Why are some of my active debias records missing?](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/wos-troubleshoot.html?context=cdpaas&locale=en#ts-trouble-common-payloadlogging-1000k-limit) + * [Watson OpenScale does not show any available schemas](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/wos-troubleshoot.html?context=cdpaas&locale=en#ts-available-schemas) + * [A monitor run fails with an `OutOfResources exception` error message](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/wos-troubleshoot.html?context=cdpaas&locale=en#ts-resources-exception) + + + +## When I use AutoAI, why am I getting an error about mismatched data? ## + +You receive an error message about mismatched data when using AutoAI for binary classification\. Note that AutoAI is only supported in IBM Watson OpenScale for IBM Cloud Pak for Data\. + +For binary classification type, AutoAI automatically sets the data type of the prediction column to boolean\. + +To fix this, implement one of the following solutions: + + + + * Change the label column values in the training data to integer values, such as `0` or `1` depending on the outcome\. + * Change the label column values in the training data to string value, such as `A` and `B`\. + + + +## Why am I getting errors during model configuration? ## + +The following error messages appear when you are configuring model details: **Field `feature_fields` references column ``, which is missing in `input_schema` of the model\. Feature not found in input schema\.** + +The preceding messages while completing the **Model details** section during configuration indicate a mismatch between the model input schema and the model training data schema: + +To fix the issue, you must determine which of the following conditions is causing the error and take corrective action: If you use IBM Watson Machine Learning as your machine learning provider and the model type is XGBoost/scikit\-learn refer to the Machine Learning [Python SDK documentation](https://ibm.github.io/watson-machine-learning-sdk/#repository) for important information about how to store the model\. To generate the drift detection model, you must use scikit\-learn version 0\.20\.2 in notebooks\. For all other cases, you must ensure that the training data column names match with the input schema column names\. + +## Why are my class labels missing when I use XGBoost? ## + +Native XGBoost multiclass classification does not return class labels\. + +By default, for binary and multiple class models, the XGBoost framework does not return class labels\. + +For XGBoost binary and multiple class models, you must update the model to return class labels\. + +## Why are the payload analytics not displaying properly? ## + +Payload analytics does not display properly and the following error message displays: **AIQDT0044E Forbidden character `"` in column name ``** + +For proper processing of payload analytics, Watson OpenScale does not support column names with double quotation marks (") in the payload\. This affects both scoring payload and feedback data in CSV and JSON formats\. + +Remove double quotation marks (") from the column names of the payload file\. + +## Error: An error occurred while computing feature importance ## + +You receive the following error message during processing: `Error: An error occurred while computing feature importance`\. + +Having an equals sign (=) in the column name of a dataset causes an issue with explainability\. + +Remove the equals sign (=) from the column name and send the dataset through processing again\. + +## Why are some of my active debias records missing? ## + +Active debias records do not reach the payload logging table\. + +When you use the active debias API, there is a limit of 1000 records that can be sent at one time for payload logging\. + +To avoid loss of data, you must use the active debias API to score in chunks of 1000 records or fewer\. + +For more information, see [Reviewing debiased transactions](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-insight-timechart.html)\. + +## Watson OpenScale does not show any available schemas ## + +When a user attempts to retrieve schema information for Watson OpenScale, none are available\. After attempting directly in DB2, without reference to Watson OpenScale, checking what schemas are available for the database userid also returns none\. + +Insufficient permissions for the database userid is causing database connection issues for Watson OpenScale\. + +Make sure the database user has the correct permissions needed for Watson OpenScale\. + +## A monitor run fails with an `OutOfResources exception` error message ## + +You receive an `OutOfResources exception` error message\. + +Although there's no longer a limit on the number of rows you can have in the feedback payload, scoring payload, or business payload tables\. The 50,000 limit now applies to the number of records you can run through the quality and bias monitors each billing period\. + +After you reach your limit, you must either upgrade to a Standard plan or wait for the next billing period\. + +## Missing deployments ## + +A deployed model does not show up as a deployment that can be selected to create a subscription\. + +There are different reasons that a deployment does not show up in the list of available deployed models\. If the model is not a supported type of model because it uses an unsupported algorithm or framework, it won't appear\. Your machine learning provider might not be configured properly\. It could also be that there are issues with permissions\. + +Use the following steps to resolve this issue: + + + +1. Check that the model is a supported type\. Not sure? For more information, see [Supported machine learning engines, frameworks, and models](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-frameworks-ovr.html)\. +2. Check that a machine learning provider exists in the Watson OpenScale configuration for the specific deployment space\. For more information, see [Deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html)\. +3. Check that the CP4D `admin` user has permission to access the deployment space\. + + + +### Watson OpenScale evaluation might fail due to large number of subscriptions ### + +If a Watson OpenScale instance contains too many subscriptions, such as 100 subscriptions, your quality evaluations might fail\. You can view the details of the failure in the log for the data mart service pod that displays the following error message: + + "Failure converting response to expected model EntityStreamSizeException: actual entity size (Some(8644836)) exceeded content length limit (8388608 bytes)! You can configure this by setting akka.http.[server|client].parsing.max-content-length or calling HttpEntity.withSizeLimit before materializing the dataBytes stream". + +You can use the `oc get pod -l component=aios-datamart` command to find the name of the pod\. You can also use the `oc logs ` command to the log for the pod\. + +To fix this error, you can use the following command to increase the maximum request body size by editing the `"ADDITIONAL_JVM_OPTIONS"` environment variable: + + oc patch woservice -p '{"spec": {"datamart": {"additional_jvm_options":"-Dakka.http.client.parsing.max-content-length=100m"} }}' --type=merge + +The release name is `"aiopenscale"` if you don't customize the release name when you install Watson OpenScale\. + +### Microsoft Azure ML Studio ### + + + + * Of the two types of Azure Machine Learning web services, only the `New` type is supported by Watson OpenScale\. The `Classic` type is not supported\. + * *Default input name must be used*: In the Azure web service, the default input name is `"input1"`\. Currently, this field is mandated for Watson OpenScale and, if it is missing, Watson OpenScale will not work\. + + If your Azure web service does not use the default name, change the input field name to `"input1"`, then redeploy your web service and reconfigure your OpenScale machine learning provider settings. + * If calls to Microsoft Azure ML Studio to list the machine learning models causes the response to time out, for example when you have many web services, you must increase timeout values\. You may need to work around this issue by changing the `/etc/haproxy/haproxy.cfg` configuration setting: + + + + * Log in to the load balancer node and update `/etc/haproxy/haproxy.cfg` to set the client and server timeout from `1m` to `5m`: + + timeout client 5m + timeout server 5m + * Run `systemctl restart haproxy` to restart the HAProxy load balancer. + + + + + +If you are using a different load balancer, other than HAProxy, you may need to adjust timeout values in a similar fashion\. + + + + * Of the two types of Azure Machine Learning web services, only the `New` type is supported by Watson OpenScale\. The `Classic` type is not supported\. + + + +### Uploading feedback data fails in production subscription after importing settings ### + +After importing the settings from your pre\-production space to your production space you might have problems uploading feedback data\. This happens when the datatypes do not match precisely\. When you import settings, the feedback table references the payload table for its column types\. You can avoid this issue by making sure that the payload data has the most precise value type first\. For example, you must prioritize a double datatype over an integer datatype\. + +### Microsoft Azure Machine Learning Service ### + +When performing model evaluation, you may encounter issues where Watson OpenScale is not able to communicate with Azure Machine Learning Service, when it needs to invoke deployment scoring endpoints\. Security tools that enforce your enterprise security policies, such as Symantec Blue Coat may prevent such access\. + +### Watson OpenScale fails to create a new Hive table for the batch deployment subscription ### + +When you choose to create a new Apache Hive table with the `Parquet` format during your Watson OpenScale batch deployment configuration, the following error might occur: + + Attribute name "table name" contains invalid character(s) among " ,;{}()\\n\\t=". Please use alias to rename it.; + +This error occurs if Watson OpenScale fails to run the `CREATE TABLE` SQL operation due to white space in a column name\. To avoid this error, you can remove any white space from your column names or change the Apache Hive format to `csv`\. + +### Watson OpenScale setup might fail with default Db2 database ### + +When you set up Watson OpenScale and specify the default Db2 database, the setup might fail to complete\. + +To fix this issue, you must run the following command in Cloud Pak for Data to update Db2: + + db2 update db cfg using DFT_EXTENT_SZ 32 + +After you run the command, you must create a new Db2 database to set up Watson OpenScale\. + +**Parent topic:**[Troubleshooting](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/troubleshoot.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b4e34a88c9328ec6e0cc8a690b466f441e5efc6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b4e34a88c9328ec6e0cc8a690b466f441e5efc6.md new file mode 100644 index 0000000..724a7df --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b4e34a88c9328ec6e0cc8a690b466f441e5efc6.md @@ -0,0 +1,66 @@ +# Upgrading services on IBM watsonx + +# Upgrading services on IBM watsonx # + +When you're ready to upgrade services, you can upgrade in place without losing any of your work or data\. + +Each service has its own plan and is independent of other plans\. + +**Required permissions** : You must have an IBM Cloud IAM access policy with the **Editor** or **Administrator** role on all account management services\. + +## Step 1: Update your IBM Cloud account ## + +You can skip this step if your IBM Cloud account has billing information with a Pay\-As\-You\-Go or a subscription plan\. + +You must update your IBM Cloud account in the following circumstances: + + + + * You have a Trial account from signing up for watsonx\. + * You have a Trial account that you [registered through an academic institution](https://ibm.biz/academic)\. + * You have a [Lite account](https://cloud.ibm.com/docs/account?topic=account-accounts#liteaccount) that you created before 25 October 2021\. + * You want to change a Pay\-As\-You\-Go plan to a subscription plan\. + + + +For instructions on updating your IBM Cloud account, see [Update your IBM Cloud account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-account.html##paid-account)\. + +## Step 2: Upgrade your service plans ## + +You can upgrade the service plans for services\. To upgrade service plans, you must have an IBM Cloud access policy with either the **Editor** or **Administrator** platform role for the services\. + +To upgrade a service plan: + + + +1. Click **Upgrade** on the header or choose **Administration > Account and billing > Upgrade service plans** from the main menu to open the **Upgrade service plans** page\. +2. Select one or more services to change the service plans\. +3. Click **Select plan** for each service in the **Pricing summary** pane\. Select the plan from the **Services catalog** page for the service\. +4. Agree to the terms, then click **Buy**\. Your service plans are instantly updated\. + + + +After the upgrade, the additional features and capacity for the new plan are automatically available\. For the following services, the difference between plans can be significant: + + + + * [Watson Studio offering plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/ws-plans.html) + * [Watson Machine Learning plans and compute usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html) + + + +## Learn more ## + + + + * [IBM Cloud docs: Account types](https://cloud.ibm.com/docs/account?topic=account-accounts) + * [IBM Cloud docs: Upgrading your account](https://cloud.ibm.com/docs/account?topic=account-upgrading-account) + * [Setting up the IBM Cloud account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-account.html) + * [Monitoring account resource usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html) + * [Find your account administrators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html#accountadmin) + + + +**Parent topic:**[Managing IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_console.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b54763a8146178f9f4809da458e4ddbd9e28b39.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b54763a8146178f9f4809da458e4ddbd9e28b39.md new file mode 100644 index 0000000..205f8d5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b54763a8146178f9f4809da458e4ddbd9e28b39.md @@ -0,0 +1,30 @@ +# twostepnode properties + +# twostepnode properties # + +![Twostep node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/twostepnodeicon.png)The TwoStep node uses a two\-step clustering method\. The first step makes a single pass through the data to compress the raw input data into a manageable set of subclusters\. The second step uses a hierarchical clustering method to progressively merge the subclusters into larger and larger clusters\. TwoStep has the advantage of automatically estimating the optimal number of clusters for the training data\. It can handle mixed field types and large data sets efficiently\. + + + +twostepnode properties + +Table 1\. twostepnode properties + +| `twostepnode` Properties | Values | Property description | +| ------------------------ | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `inputs` | \[*field1 \.\.\. fieldN*\] | TwoStep models use a list of input fields, but no target\. Weight and frequency fields are not recognized\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `standardize` | *flag* | | +| `exclude_outliers` | *flag* | | +| `percentage` | *number* | | +| `cluster_num_auto` | *flag* | | +| `min_num_clusters` | *number* | | +| `max_num_clusters` | *number* | | +| `num_clusters` | *number* | | +| `cluster_label` | `String``Number` | | +| `label_prefix` | *string* | | +| `distance_measure` | `Euclidean``Loglikelihood` | | +| `clustering_criterion` | `AIC``BIC` | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b5c4d75ea0a1cd2ade09184ee2b159e23033cae.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b5c4d75ea0a1cd2ade09184ee2b159e23033cae.md new file mode 100644 index 0000000..425d126 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0b5c4d75ea0a1cd2ade09184ee2b159e23033cae.md @@ -0,0 +1,87 @@ +# Snowflake connection + +# Snowflake connection # + +To access your data in Snowflake, you must create a connection asset for it\. + +Snowflake is a cloud\-based data storage and analytics service\. + +## Create a connection to Snowflake ## + +To create the connection asset, you need the following connection details: + + + + * Account name: The full name of your account + * Database name + * Role: The default access control role to use in the Snowflake session + * Warehouse: The virtual warehouse + + + +### Credentials ### + +Authentication method: + + + + * Username and password + * Key\-Pair: Enter the contents of the private key and the key passphrase (if configured)\. These properties must be set up by the Snowflake administrator\. For information, see [Key Pair Authentication & Key Pair Rotation](https://docs.snowflake.com/en/user-guide/key-pair-auth) in the Snowflake documentation\. + * Okta URL endpoint: If your company uses native Okta SSO authentication, enter the Okta URL endpoint for your Okta account\. Example: `https://.okta.com`\. Leave this field blank if you want to use the default authentication of Snowflake\. For information about federated authentication provided by Okta, see [Native SSO](https://docs.snowflake.com/en/user-guide/admin-security-fed-auth-use.html#native-sso-okta-only)\. + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Snowflake connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Snowflake setup ## + +[General Configuration ](https://docs.snowflake.com/en/user-guide/gen-conn-config.html) + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [Snowflake SQL Command Reference](https://docs.snowflake.com/en/sql-reference-commands.html) for the correct syntax\. + +## Learn more ## + +[Snowflake in 20 Minutes](https://docs.snowflake.com/en/user-guide/getting-started-tutorial.html) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0bd226c12cb659bf7711fe30c594e548525dbbd2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0bd226c12cb659bf7711fe30c594e548525dbbd2.md new file mode 100644 index 0000000..2346913 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0bd226c12cb659bf7711fe30c594e548525dbbd2.md @@ -0,0 +1,121 @@ +# Governing external models + +# Governing external models # + +Enable governance for models that are created in notebooks or outside of Cloud Pak for Data\. Track the results of model evaluations and model details in factsheets\. + +In addition to governing models trained by using Watson Machine Learning, you can govern models that are created by using third\-party tools such as Amazon Web Services or Microsoft Azure\. For a list of supported providers, see [Supported machine learning providers](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-frameworks-ovr.html)\. Additionally, models that are developed in notebooks are considered external models, so you can use AI Factsheets to govern models that you develop, deploy, and monitor on platforms other than Cloud Pak for Data\. + +Use the model evaluations provided with watsonx\.governance to measure performance metrics for a model you imported from an external provider\. Capture the facts in factsheets for the model and the evaluation metrics as part of an AI use case\. Use the tracked data as part of your governance and compliance strategy\. + +## Before you begin ## + +Before you can begin, make sure that you, or a user with an Admin role, does the following: + + + + * Enable the tracking of external models in an inventory\. + * Assign an owner for the inventory\. + + + +For details, see [Managing inventories](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-inventory-manage.html)\. + +## Preparing to track external models ## + +These points are an overview of the process for preserving facts for an external model\. + + + + * Tracked external models are listed under **AI use cases** in the main navigation menu\. + * You can use the API in a model notebook to save an external model asset to an inventory\. + * Associate the external model asset with an AI use case in the inventory to start preserving the facts\. Along with model metadata, new fields `External model identifier` and `External deployment identifier` describe how the models and deployments are identified in external systems, for example: AWS or Azure\. + * You can also automatically add external models to an inventory when they are evaluated in watsonx\.governance\. The destination inventory is established following these rules: + + + + * The external model is created in the Platform assets catalog if its corresponding development-time model exists in the Platform assets catalog or if there is no development-time model that is created in any inventory. + * If the corresponding development-time model is created in an inventory by using the Python client, then the model is created in that inventory. + + + + + +## Associating an external model asset with an AI use case ## + +Automatic external model tracking adds any external models that are evaluated in watsonx\.governance to the inventory where the development\-time model exists\. After the model is in the inventory, you can associate an external model asset with a use case in the following ways: + + + + * Use the API to save the external model asset to any inventory programmatically from a notebook\. The external model asset can then be associated with an AI use case\. + * Associate the external model that is created with Watson OpenScale evaluation with an AI use case\. + + + +### Creating an external model asset with the API ### + + + +1. Create a model in a notebook\. +2. Save the model\. For example, you can save to an S3 bucket\. +3. Use the API to create an external model asset (a representation of the external model) in an inventory\. For more information on API commands that interact with the inventory, see the [IBM\_AIGOV\_FACTS\_CLIENT documentation](https://s3.us.cloud-object-storage.appdomain.cloud/factsheets-client/index.html#externalmodelfactselements)\. + + + +### Registering an external model asset with an inventory ### + + + +1. Open the **Assets** tab in the inventory where you want to track the model\. +2. Select the External model asset that you want to track\. +3. Return to the **Assets** tab in the Inventory and click **Add to AI use case**\. +4. Select an existing AI use case or create a new one\. +5. Follow the prompts to save the details to the inventory\. + + + +### Registering an external model from Watson OpenScale ### + +If you are validating an external model in Watson OpenScale, you can associate an external model with an AI use case to track the lifecycle facts\. + + + +1. Add an external model to the OpenScale dashboard\. +2. If you already defined an AI use case with the API, the system recognizes the use case association\. +3. As you create and monitor a deployment, the facts are registered with the associated use case\. These facts display in the Validate or Operate stage, depending on how you classified the machine learning provider for the model\. + + + +## Populating the AI use case ## + +When facts are saved for an external model asset, they are associated with the pillar that represents their phase in the lifecycle, as follows: + + + + * If the external model asset is created from a notebook without deployment, it displays in the Develop pillar\. + * If the external model asset is created from a notebook with deployment, it displays in the Test pillar\. + * When the external model deployment is evaluated in OpenScale, it displays in the Validate or Operate stage, depending on how you classified the machine learning provider for the model\. + + + +## Example: tracking a Sagemaker model ## + +This sample model, created in Sagemaker, is registered for tracking and moves through the Test, Validate, and Operate phases\. + +![Sample external model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/factsheet-external1.png) + +## Viewing facts for an external model ## + +Viewing facts for an external model is slightly different from viewing facts for a Watson Machine Learning model\. These rules apply: + + + + * Click the **Assets** tab of the inventory containing the external model assets to view facts\. + * Unlike Watson Machine Learning model use cases, which have different fact sheets for models and deployments, fact sheets for external models combine information for the model and deployments on the same page\. + * Multiple assets with the same name can be created in an inventory\. To differentiate them the tags *development*, *pre\-production* and *production* are assigned automatically to reflect their state\. + + + +**Parent topic:**[Governing assets in AI use cases](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-use-cases.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0c836867dd758509b908532f35cfc5e160d81a19.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0c836867dd758509b908532f35cfc5e160d81a19.md new file mode 100644 index 0000000..0bc2157 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0c836867dd758509b908532f35cfc5e160d81a19.md @@ -0,0 +1,6 @@ +# Math curve charts + +# Math curve charts # + +A math curve chart plots mathematical equation curves that are based on user\-entered expressions\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0cb42f245df436af2bccb54b612786ca493b917b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0cb42f245df436af2bccb54b612786ca493b917b.md new file mode 100644 index 0000000..e27b8ec --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0cb42f245df436af2bccb54b612786ca493b917b.md @@ -0,0 +1,23 @@ +# Importing, replacing, and deleting nodes + +# Importing, replacing, and deleting nodes # + +Along with creating and connecting nodes, it's often necessary to replace and delete nodes from a flow\. The methods that are available for importing, replacing, and deleting nodes are summarized in the following table\. + + + +Methods for importing, replacing, and deleting nodes + +Table 1\. Methods for importing, replacing, and deleting nodes + +| Method | Return type | Description | +| ----------------------------------------------------------- | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `s.replace(originalNode, replacementNode, discardOriginal)` | Not applicable | Replaces the specified node from the specified flow\. Both the original node and replacement node must be owned by the specified flow\. | +| `s.insert(source, nodes, newIDs)` | List | Inserts copies of the nodes in the supplied list\. It's assumed that all nodes in the supplied list are contained within the specified flow\. The `newIDs` flag indicates whether new IDs should be generated for each node, or whether the existing ID should be copied and used\. It's assumed that all nodes in a flow have a unique ID, so this flag must be set to `True` if the source flow is the same as the specified flow\. The method returns the list of newly inserted nodes, where the order of the nodes is undefined (that is, the ordering is not necessarily the same as the order of the nodes in the input list)\. | +| `s.delete(node)` | Not applicable | Deletes the specified node from the specified flow\. The node must be owned by the specified flow\. | +| `s.deleteAll(nodes)` | Not applicable | Deletes all the specified nodes from the specified flow\. All nodes in the collection must belong to the specified flow\. | +| `s.clear()` | Not applicable | Deletes all nodes from the specified flow\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0e5c87704e816097ff9e649620a1818798b5db3f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0e5c87704e816097ff9e649620a1818798b5db3f.md new file mode 100644 index 0000000..080415b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0e5c87704e816097ff9e649620a1818798b5db3f.md @@ -0,0 +1,9 @@ +# Handling fields with missing values (SPSS Modeler) + +# Handling fields with missing values # + +If the majority of missing values are concentrated in a small number of fields, you can address them at the field level rather than at the record level\. This approach also allows you to experiment with the relative importance of particular fields before deciding on an approach for handling missing values\. If a field is unimportant in modeling, it probably isn't worth keeping, regardless of how many missing values it has\. + +For example, a market research company may collect data from a general questionnaire containing 50 questions\. Two of the questions address age and political persuasion, information that many people are reluctant to give\. In this case, `Age` and `Political_persuasion` have many missing values\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0e6365d1dd3ec522c4da68b662f05a0120617593.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0e6365d1dd3ec522c4da68b662f05a0120617593.md new file mode 100644 index 0000000..91e1a20 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0e6365d1dd3ec522c4da68b662f05a0120617593.md @@ -0,0 +1,119 @@ +# Tracking prompt templates + +# Tracking prompt templates # + +Track a prompt template in an AI use case to capture and share facts about the asset to help you meet governance and compliance goals\. + +## Tracking prompt templates ## + +A prompt template is the saved prompt input for a foundation model\. A prompt template can include variables so that it can be run with different options\. For example, if you have a prompt that summarizes meeting notes for project\-X, you can define a variable so that the same prompt can run for project\-Y\. + +You can add a saved prompt template to an AI use case to track the details for the prompt template\. In addition to recording details about the prompt template creation information and source model details, the factsheet tracks information from prompt template evaluations to capture performance metrics\. You can evaluate prompt templates before or after you start tracking a prompt template\. + +Important: Before you start tracking a prompt template in an AI use case, make sure the prompt template is stable\. After you enable tracking, the prompt template is locked, and you can no longer update it\. This is to preserve the integrity of the prompt template so that all of the facts collected in the factsheet apply to a single version of the prompt template\. If you are still experimenting with a prompt template, do not start tracking it in an AI use case\. + +### Before you begin ### + +Before you can track a prompt template, these conditions must be met\. + + + + * Be an administrator or editor for the project that contains the prompt template\. + * The prompt template must include at least one variable\. For more information, see [Building reusable prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-variables.html)\. + + + +Watch this video to see how to track a prompt template in an AI use case\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +### Tracking a prompt template or machine learning model in an AI use case ### + +You can add a prompt template to an AI use case from a project or space\. + + + +1. Open the project or space that contains the prompt template that you want to govern\. +2. From the action menu for the asset, click **View AI use case**\. ![Tracking a prompt template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-track-prompt1.png) + +3. If this prompt template is not already part of an AI use case, you are prompted to **Track in AI use case\.** When you start tracking a prompt template, it is locked and you can no longer edit it\. To make changes, you must create a new prompt template\. ![Starting to track a prompt template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-prompt-temp-track.png) + +4. Select an existing AI use case or follow the prompts to create a new one\. +5. Choose an existing approach or create a new approach\. An approach represents one facet of a complete solution\. Each approach creates a version set for all assets in the same approach\. +6. Choose a version numbering scheme\. All the assets in an approach share a common version\. Choose from: + + + + * *Experimental* if you plan to update frequently. + * *Stable* if the assets are not changing rapidly. + * *Custom* if you want to start a new version number. Version numbering must follow a schema of major.minor.patch. + + + + + +When tracking is enabled, all collaborators for the use case can review details for the prompt template\. + +![Viewing a tracked prompt template in an AI use case](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-track-prompt2.png) + +Details are captured for each lifecycle stage for a prompt template\. + + + + * **Develop** provides information about how the prompt is defined, including the prompt itself, creation date, foundation model that is used, prompt parameters set, and variables defined\. + * **Evaluate** displays the dimension metrics from evaluating your prompt template\. + * **Operate** provides details that are related to how the prompt template is deployed for productive use\. + + + +![Viewing the lifecycle for a tracked prompt template in an AI use case](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-track-prompt3.png) + +## Viewing the factsheet for a tracked prompt template ## + +Click the name of the prompt template in an AI use case to view the associated factsheet\. + +![Viewing the factsheet for a tracked prompt template in an AI use case](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-prompt-factsheet1.png) + +The factsheet for a prompt template collects this type of data: + + + + * **Governance** collects basic information such as the name of the AI use case, the description, and the approach name and version data\. + * **Foundation model** displays the name of the foundation model, the license ID, and the model publisher\. + * **Prompt template** shows the prompt name, ID, prompt input, and variables\. + * **Prompt parameters** collect the configuration options for the prompt template, including the decoding method and stopping criteria\. + * **Evaluation** displays the data from evaluation, including alerts, and metric data from the evaluation\. For example, this prompt template shows the metrics data for quality evaluations on the prompt template\. One threshold alert was triggered by the evaluation: ![Viewing evaluation metrics for a prompt template in an AI use case](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-prompt-factsheet2.png) + * **Validate** shows the data for how the prompt template was evaluated, including the data set used for the validation, alerts triggered, and evaluation metric data\. + * **Attachments** shows information about attachments that support the use case\. + + + +Note: As the prompt template moves from one stage of the lifecycle to the next, facts are added to the factsheet for the prompt template\. The factsheet always represents the latest state of the prompt template\. For example, if you validate a prompt template in a pre\-production deployment space, and then again in a production deployment space, the details from the production phase are recorded in the factsheet, overwriting previous evaluation results\. + +## Moving a prompt template through lifecycle stages ## + +When a prompt template is tracked, you can see details from creating the prompt template, and evaluating performance against appropriate metrics\. The next stage in the lifecycle is to \_*validate* the prompt template\. This involves testing the prompt template with new data\. If you are the prompt engineer who is tasked with validating the asset, follow these steps to validate the prompt template and capture the validation data in the associated factsheet\. + + + +1. From the project containing the prompt template, export the project to a compressed ZIP file\. +2. Create a new project and populate it with the exported ZIP file\. +3. Upload validation data, evaluate the prompt template, and save the results to the validation project\. +4. From the project, promote the prompt template to a new or existing deployment space that is designated as a **Production** stage\. The stage is assigned when the space is created and cannot be updated, so create a new space if you do not have a production space available\. ![Create or select a deployment space with Production stage](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-space-prod.png) +5. After you promote the prompt template to a deployment space, you can configure continuous monitoring\. +6. Details from monitoring the prompt template in a production space are displayed in the **Operate** lifecycle stage of the AI use case\. + + + +## Learn more ## + + + + * See [Deploying a prompt template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/prompt-template-deploy.html) for details on preparing a prompt template for production\. + * See [Evaluating prompt templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-eval-prompt.html) for details on evaluating a prompt template for dimensions such as accuracy or to test for the presence of hateful or abusive speech\. + + + +**Parent topic:**[Tracking assets in an AI use case](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-tracking-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0e7ff3238a69fa701a2067672493ccb1b9698cc1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0e7ff3238a69fa701a2067672493ccb1b9698cc1.md new file mode 100644 index 0000000..697b33f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0e7ff3238a69fa701a2067672493ccb1b9698cc1.md @@ -0,0 +1,21 @@ +# applylinearnode properties + +# applylinearnode properties # + +Linear modeling nodes can be used to generate a Linear model nugget\. The scripting name of this model nugget is *applylinearnode*\. For more information on scripting the modeling node itself, see [linearnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties/linearslots.html#linearslots)\. + + + +applylinearnode Properties + +Table 1\. applylinearnode Properties + +| `linear` Properties | Values | Property description | +| ----------------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `use_custom_name` | *flag* | | +| `custom_name` | *string* | | +| `enable_sql_generation` | `udf``native``puresql` | Used to set SQL generation options during flow execution\. The options are to push back to the database and score using an SPSS Modeler Server scoring adapter (if connected to a database with a scoring adapter installed), to score within SPSS Modeler, or to push back to the database and score using SQL\. The default value is `udf`\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0ea3470872bf545059b23b040ab1eb393630a29d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0ea3470872bf545059b23b040ab1eb393630a29d.md new file mode 100644 index 0000000..227a8f4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0ea3470872bf545059b23b040ab1eb393630a29d.md @@ -0,0 +1,29 @@ +# kdeexport properties + +# kdeexport properties # + +![KDE Simulation node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/pythonkdenodeicon.png)Kernel Density Estimation (KDE)© uses the Ball Tree or KD Tree algorithms for efficient queries, and combines concepts from unsupervised learning, feature engineering, and data modeling\. Neighbor\-based approaches such as KDE are some of the most popular and useful density estimation techniques\. The KDE Modeling and KDE Simulation nodes in SPSS Modeler expose the core features and commonly used parameters of the KDE library\. The nodes are implemented in Python\. + + + +kdeexport properties + +Table 1\. kdeexport properties + +| `kdeexport` properties | Data type | Property description | +| ---------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `custom_fields` | *boolean* | This option tells the node to use field information specified here instead of that given in any upstream Type node(s)\. After selecting this option, specify the fields as required\. | +| `inputs` | *field* | List of the field names for input\. | +| `bandwidth` | *double* | Default is `1`\. | +| `kernel` | *string* | The kernel to use: `gaussian` or `tophat`\. Default is `gaussian`\. | +| `algorithm` | *string* | The tree algorithm to use: `kd_tree`, `ball_tree`, or `auto`\. Default is `auto`\. | +| `metric` | *string* | The metric to use when calculating distance\. For the `kd_tree` algorithm, choose from: `Euclidean`, `Chebyshev`, `Cityblock`, `Minkowski`, `Manhattan`, `Infinity`, `P`, `L2`, or `L1`\. For the `ball_tree` algorithm, choose from: `Euclidian`, `Braycurtis`, `Chebyshev`, `Canberra`, `Cityblock`, `Dice`, `Hamming`, `Infinity`, `Jaccard`, `L1`, `L2`, `Minkowski`, `Matching`, `Manhattan`, `P`, `Rogersanimoto`, `Russellrao`, `Sokalmichener`, `Sokalsneath`, or `Kulsinski`\. Default is `Euclidean`\. | +| `atol` | *float* | The desired absolute tolerance of the result\. A larger tolerance will generally lead to faster execution\. Default is `0.0`\. | +| `rtol` | *float* | The desired relative tolerance of the result\. A larger tolerance will generally lead to faster execution\. Default is `1E-8`\. | +| `breadth_first` | *boolean* | Set to `True` to use a breadth\-first approach\. Set to `False` to use a depth\-first approach\. Default is `True`\. | +| `leaf_size` | *integer* | The leaf size of the underlying tree\. Default is `40`\. Changing this value may significantly impact the performance\. | +| `p_value` | *double* | Specify the P Value to use if you're using `Minkowski` for the metric\. Default is `1.5`\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0eceac44da213d067b5b5ea66694e6283457a441.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0eceac44da213d067b5b5ea66694e6283457a441.md new file mode 100644 index 0000000..6a8c4cf --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0eceac44da213d067b5b5ea66694e6283457a441.md @@ -0,0 +1,668 @@ +# ibm-watson-studio-lib for Python + +# ibm\-watson\-studio\-lib for Python # + +The `ibm-watson-studio-lib` library for Python provides access to assets\. It can be used in notebooks that are created in the notebook editor\. `ibm-watson-studio-lib` provides support for working with data assets and connections, as well as browsing functionality for all other asset types\. + +There are two kinds of data assets: + + + + * *Stored data assets* refer to files in the storage associated with the current project\. The library can load and save these files\. For data larger than one megabyte, this is not recommended\. The library requires that the data is kept in memory in its entirety, which might be inefficient when processing huge data sets\. + * *Connected data assets* represent data that must be accessed through a connection\. Using the library, you can retrieve the properties (metadata) of the connected data asset and its connection\. The functions do not return the data of a connected data asset\. You can either use the code that is generated for you when you click **Read data** on the Code snippets pane to access the data or you must write your own code\. + + + +Note: The `ibm-watson-studio-lib` functions do not encode or decode data when saving data to or getting data from a file\. Additionally, the `ibm-watson-studio-lib` functions can't be used to access connected folder assets (files on a path to the project storage)\. + +## Setting up the `ibm-watson-studio-lib` library ## + +The `ibm-watson-studio-lib` library for Python is pre\-installed and can be imported directly in a notebook in the notebook editor\. To use the `ibm-watson-studio-lib` library in your notebook, you need the ID of the project and the project token\. + +To insert the project token to your notebook: + + + +1. Click the **More** icon on your notebook toolbar and then click **Insert project token**\. + + If a project token exists, a cell is added to your notebook with the following information: + + from ibm_watson_studio_lib import access_project_or_space + wslib = access_project_or_space({"token":""}) + + `` is the value of the project token. + + If you are told in a message that no project token exists, click the link in the message to be redirected to the project's **Access Control** page where you can create a project token. You must be eligible to create a project token. For details, see [Manually adding the project token](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/token.html). + + To create a project token: + + + + 1. From the **Manage** tab, select the **Access Control** page, and click **New access token** under **Access tokens**. + 2. Enter a name, select **Editor** role for the project, and create a token. + 3. Go back to your notebook, click the **More** icon on the notebook toolbar and then click **Insert project token**. + + + + + +## Helper functions ## + +You can get information about the supported functions in the `ibm-watson-studio-lib` library programmatically by using `help(wslib)`, or for an individual function by using `help(wslib.`, for example `help(wslib.get_connection)`\. + +You can use the helper function `wslib.show(...)` for formatted printing of Python dictionaries and lists of dictionaries, which are the common result output type of the `ibm-watson-studio-lib` functions\. + +## The `ibm-watson-studio-lib` functions ## + +The `ibm-watson-studio-lib` library exposes a set of functions that are grouped in the following way: + + + + * [Get project information](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html?context=cdpaas&locale=en#get-infos) + * [Get authentication token](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html?context=cdpaas&locale=en#get-auth-token) + * [Fetch data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html?context=cdpaas&locale=en#fetch-data) + * [Save data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html?context=cdpaas&locale=en#save-data) + * [Get connection information](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html?context=cdpaas&locale=en#get-conn-info) + * [Get connected data information](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html?context=cdpaas&locale=en#get-conn-data-info) + * [Access assets by ID instead of name](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html?context=cdpaas&locale=en#access-by-id) + * [Access project storage directly](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html?context=cdpaas&locale=en#direct-proj-storage) + * [Spark support](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html?context=cdpaas&locale=en#spark-support) + * [Browse project assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html?context=cdpaas&locale=en#browse-assets) + + + +### Get project information ### + +While developing code, you might not know the exact names of data assets or connections\. The following functions provide lists of assets, from which you can pick the relevant ones\. In all examples, you can use `wslib.show(assets)` to pretty\-print the list\. The index of each item is printed in front of the item\. + + + + * `list_connections()` + + This function returns a list of the connections. The list of returned connections is not sorted by any criterion and can change when you call the function again. You can pass a dictionary item instead of a name to the `get_connection` function. + + For example: + + # Import the lib + from ibm_watson_studio_lib import access_project_or_space + wslib = access_project_or_space({"token":""}) + + assets = wslib.list_connections() + wslib.show(assets) + connprops = wslib.get_connection(assets[0]) + wslib.show(connprops) + * `list_connected_data()` + + This function returns the connected data assets. The list of returned connected data assets is not sorted by any criterion and can change when you call the function again. You can pass a dictionary item instead of a name to the `get_connected_data` function. + * `list_stored_data()` + + This function returns a list of the stored data assets (data files). The list of returned data assets is not sorted by any criterion and can change when you call the function again. You can pass a dictionary item instead of a name to the `load_data` and `save_data`functions. + + Note: A heuristic is applied to distinguish between connected data assets and stored data assets. However, there may be cases where a data asset of the wrong kind appears in the returned lists. + * `wslib.here` + + By using this entry point, you can retrieve metadata about the project that the lib is working with. The entry point `wslib.here` provides the following functions: + + + + * `get_name()` + + This function returns the name of the project. + * `get_description()` + + This function returns the description of the project. + * `get_ID()` + + This function returns the ID of the project. + * `get_storage()` + + This function returns storage information for the project. + + + + + +### Get authentication token ### + +Some tasks require an authentication token\. For example, if you want to run your own requests against the [Watson Data API](https://cloud.ibm.com/apidocs/watson-data-api-cpd), you need an authentication token\. + +You can use the following function to get the bearer token: + + + + * `get_current_token()` + + + +For example: + + from ibm_watson_studio_lib import access_project_or_space + wslib = access_project_or_space({"token":""}) + token = wslib.auth.get_current_token() + +This function returns the bearer token that is currently used by the `ibm-watson-studio-lib` library\. + +### Fetch data ### + +You can use the following functions to fetch data from a stored data asset (a file) in your project\. + + + + * `load_data(asset_name_or_item, attachment_type_or_item=None)` + + This function loads the data of a stored data asset into a BytesIO buffer. The function is not recommended for very large files. + + The function takes the following parameters: + + + + * `asset_name_or_item`: (Required) Either a string with the name of a stored data asset or an item like those returned by `list_stored_data()`. + * `attachment_type_or_item`: (Optional) Attachment type to load. A data asset can have more than one attachment with data. Without this parameter, the default attachment type, namely `data_asset` is loaded. Specify this parameter if the attachment type is not `data_asset`. For example, if a plain text data asset has an attached profile from Natural Language Analysis, this can be loaded as attachment type `data_profile_nlu`. + + Here is an example that shows you how to load the data of a data asset: + + + + + + ```python + # Import the lib + from ibm_watson_studio_lib import access_project_or_space + wslib = access_project_or_space({"token":""}) + + # Fetch the data from a file + my_file = wslib.load_data("MyFile.csv") + + # Read the CSV data file into a pandas DataFrame + my_file.seek(0) + import pandas as pd + pd.read_csv(my_file, nrows=10) + ``` + + + + * `download_file(asset_name_or_item, file_name=None, attachment_type_or_item=None)` + + This function downloads the data of a stored data asset and stores it in the specified file in the file system of your runtime. The file is overwritten if it already exists. + + The function takes the following parameters: + + + + * `asset_name_or_item`: (Required) Either a string with the name of a stored data asset or an item like those returned by `list_stored_data()`. + * `file_name`: (Optional) The name of the file that the downloaded data is stored to. It defaults to the asset's attachment name. + * `attachment_type_or_item`: (Optional) The attachment type to download. A data asset can have more than one attachment with data. Without this parameter, the default attachment type, namely `data_asset` is downloaded. Specify this parameter if the attachment type is not `data_asset`. For example, if a plain text data asset has an attached profile from Natural Language Analysis, this can be downlaoded loaded as attachment type `data_profile_nlu`. + + Here is an example that shows you how to you can use `download_file` to make your custom Python script available in your notebook: + + + + + + ```python + # Import the lib + from ibm_watson_studio_lib import access_project_or_space + wslib = access_project_or_space({"token":""}) + + # Let's assume you have a Python script "helpers.py" with helper functions on your local machine. + # Upload the script to your project using the Data Panel on the right of the opened notebook. + + # Download the script to the file system of your runtime + wslib.download_file("helpers.py") + + # import the required functions to use them in your notebook + from helpers import my_func + my_func() + ``` + +### Save data ### + +The functions to save data in your project storage do multiple things: + + + + * Store the data in project storage + * Add the data as a data asset (by creating an asset or overwriting an existing asset) to your project so you can see the data in the data assets list in your project\. + * Associate the asset with the file in the storage\. + + + +You can use the following functions to save data: + + + + * `save_data(asset_name_or_item, data, overwrite=None, mime_type=None, file_name=None)` + + This function saves data in memory to the project storage. + + The function takes the following parameters: + + + + * `asset_name_or_item`: (Required) The name of the created asset or list item that is returned by `list_stored_data()`. You can use the item if you like to overwrite an existing file. + * `data`: (Required) The data to upload. This can be any object of type `bytes-like-object`, for example a byte buffer. + * `overwrite`: (Optional) Overwrites the data of a stored data asset if it already exists. By default, this is set to false. If an asset item is passed instead of a name, the behavior is to overwrite the asset. + * `mime_type`: (Optional) The MIME type for the created asset. By default the MIME type is determined from the asset name suffix. If you use asset names without a suffix, specify the MIME type here. For example `mime_type=application/text` for plain text data. This parameter is ignored when overwriting an asset. + * `file_name`: (Optional) The file name to be used in the project storage. The data is saved in the storage associated with the project. When creating a new asset, the file name is derived from the asset name, but might be different. If you want to access the file directly, you can specify a file name. This parameter is ignored when overwriting an asset. + + Here is an example that shows you how to save data to a file: + + + + + + ```python + # Import the lib + from ibm_watson_studio_lib import access_project_or_space + wslib = access_project_or_space({"token":""}) + + # let's assume you have the pandas DataFrame pandas_df which contains the data + # you want to save as a csv file + wslib.save_data("my_asset_name.csv", pandas_df.to_csv(index=False).encode()) + + # the function returns a dict which contains the asset_name, asset_id, file_name and additional information upon successful saving of the data + ``` + + + + * `upload_file(file_path, asset_name=None, file_name=None, overwrite=False, mime_type=None)` This function saves data in the file system in the runtime to a file associated with your project\. The function takes the following parameters: + + + + * `file_path`: (Required) The path to the file in the file system. + * `asset_name`: (Optional) The name of the data asset that is created. It defaults to the name of the file to be uploaded. + * `file_name`: (Optional) The name of the file that is created in the storage associated with the project. It defaults to the name of the file to be uploaded. + * `overwrite`: (Optional) Overwrites an existing file in storage. Defaults to false. + * `mime_type`: (Optional) The MIME type for the created asset. By default the MIME type is determined from the asset name suffix. If you use asset names without a suffix, specify the MIME type here. For example `mime_type='application/text'` for plain text data. This parameter is ignored when overwriting an asset. + + Here is an example that shows you how you can upload a file to the project: + + + + + + ```python + # Import the lib + from ibm_watson_studio_lib import access_project_or_space + wslib = access_project_or_space({"token":""}) + + # Let's assume you have downloaded a file and want to save it + # in your project. + import urllib.request + urllib.request.urlretrieve("https://some/url/data_file.csv", "data_file.csv") + wslib.upload_file("data_file.csv") + + # The function returns a dictionary which contains the asset_name, asset_id, file_name and additional information upon successful saving of the data. + ``` + +### Get connection information ### + +You can use the following function to access the connection metadata of a given connection\. + + + + * `get_connection(name_or_item)` + + This function returns the properties (metadata) of a connection which you can use to fetch data from the connection data source. Use `wslib.show(connprops)` to view the properties. The special key `"."` in the returned dictionary provides information about the connection asset. + + The function takes the following required parameter: + + + + * `name_or_item`: Either a string with the name of a connection or an item like those returned by `list_connections()`. + + Note that when you work with notebooks, you can click **Read data** on the Code snippets pane to generate code to load data from a connection into a pandas DataFrame for example. + + + + + +### Get connected data information ### + +You can use the following function to access the metadata of a connected data asset\. + + + + * `get_connected_data(name_or_item)` + + This function returns the properties of a connected data asset, including the properties of the underlying connection. Use `wslib.show()` to view the properties. The special key `"."` in the returned dictionary provides information about the data and the connection assets. + + The function takes the following required parameter: + + + + * `name_or_item`: Either a string with the name of a connected data asset or an item like those returned by `list_connected_data()`. + + Note that when you work with notebooks, you can click **Read data** on the Code snippets pane to generate code to load data from a connected data asset into a pandas DataFrame for example. + + + + + +### Access asset by ID instead of name ### + +You should preferably always access data assets and connections by a unique name\. Asset names are not necessarily always unique and the `ibm-watson-studio-lib` functions will raise an exception when a name is ambiguous\. You can rename data assets in the UI to resolve the conflict\. + +Accessing assets by a unique ID is possible but is discouraged as IDs are valid only in the current project and will break code when transferred to a different project\. This can happen for example, when projects are exported and re\-imported\. You can get the ID of a connection, connected or stored data asset by using the corresponding list function, for example `list_connections()`\. + +The entry point `wslib.by_id` provides the following functions: + + + + * `get_connection(asset_id)` + + This function accesses a connection by the connection asset ID. + * `get_connected_data(asset_id)` + + This function accesses a connected data asset by the connected data asset ID. + * `load_data(asset_id, attachment_type_or_item=None)` + + This function loads the data of a stored data asset by passing the asset ID. See [`load_data()`](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html?context=cdpaas&locale=en#fetch-data) for a description of the other parameters you can pass. + * `save_data(asset_id, data, overwrite=None, mime_type=None, file_name=None)` + + This function saves data to a stored data asset by passing the asset ID. This implies `overwrite=True`. See [`save_data()`](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html?context=cdpaas&locale=en#save-data) for a description of the other parameters you can pass. + * `download_file(asset_id, file_name=None, attachment_type_or_item=None)` + + This function downloads the data of a stored data asset by passing the asset ID. See [`download_file()`](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html?context=cdpaas&locale=en#fetch-data) for a description of the other parameters you can pass. + + + +### Access project storage directly ### + +You can fetch data from project storage and store data in project storage without synchronizing the project assets using the entry point `wslib.storage`\. + +The entry point `wslib.storage` provides the following functions: + + + + * `fetch_data(filename)` + + This function returns the data in a file as a BytesIO buffer. The file does not need to be registered as a data asset. + + The function takes the following required parameter: + + + + * `filename`: The name of the file in the projectstorage. + + + + * `store_data(filename, data, overwrite=False)` + + This function saves data in memory to storage, but does not create a new data asset. The function returns a dictionary which contains the file name, file path and additional information. Use `wslib.show()` to print the information. + + The function takes the following parameters: + + + + * `filename`: (Required) The name of the file in the project storage. + * `data`: (Required) The data to save as a bytes-like object. + * `overwrite`: (Optional) Overwrites the data of a file in storage if it already exists. By default, this is set to false. + + + + * `download_file(storage_filename, local_filename=None)` + + This function downloads the data in a file in storage and stores it in the specified local file. The local file is overwritten if it already existed. + + The function takes the following parameters: + + + + * `storage_filename`: (Required) The name of the file in storage to download. + * `local_filename`: (Optional) The name of the file in the local file system of your runtime to downloaded the file to. Omit this parameter to use the storage file name. + + + + * `register_asset(storage_path, asset_name=None, mime_type=None)` + + This function registers the file in storage as a data asset in your project. This operation fails if a data asset with the same name already exists. + + + +You can use this function if you have very large files that you cannot upload via save\_data()\. You can upload large files directly to the IBM Cloud Object Storage bucket of your project, for example via the UI, and then register them as data assets using `register_asset()`\. + +The function takes the following parameters: + + + + * `storage_path`: (Required) The path of the file in storage\. + * `asset_name`: (Optional) The name of the created asset\. It defaults to the file name\. + * `mime_type`: (Optional) The MIME type for the created asset\. By default the MIME type is determined from the asset name suffix\. Use this parameter to specify a MIME type if your file name does not have a file extension or if you want to set a different MIME type\. + + Note: You can register a file several times as a different data asset. Deleting one of those assets in the project also deletes the file in storage, which means that other asset references to the file might be broken. + + + +### Spark support ### + +The entry point `wslib.spark` provides functions to access files in storage with Spark\. To get help information about the available functions, use `help(wslib.spark.API)`\. + +The entry point `wslib.spark` provides the following functions: + + + + * `provide_spark_context(sc)` + + Use this function to enable Spark support. + + The function takes the following required parameter: + + + + * sc: The SparkContext. It is provided in the notebook runtime. + + The following example shows you how to set up Spark support: + + from ibm_watson_studio_lib import access_project_or_space + wslib = access_project_or_space({"token":""}) + wslib.spark.provide_spark_context(sc) + + + + * `get_data_url(asset_name)` + + This function returns a URL to access a file in storage from Spark via Hadoop. + + The function takes the following required parameter: + + + + * `asset_name`: The name of the asset. + + + + * `storage.get_data_url(file_name)` + + This function returns a URL to access a file in storage from Spark via Hadoop. The function expects the file name and not the asset name. + + The function takes the following required parameter: + + + + * `file_name`: The name of a file in the project storage. + + + + + +### Browse project assets ### + +The entry point `wslib.assets` provides generic, read\-only access to assets of any type\. For selected asset types, there are dedicated functions that provide additional data\. To get help on the available functions, use `help(wslib.assets.API)`\. + +The following naming conventions apply: + + + + * Functions named `list_` return a list of Python dictionaries\. Each dictionary represents one asset and includes a small set of properties (metadata) that identifies the asset\. + * Functions named `get_` return a single Python dictionary with the properties for the asset\. + + + +To pretty\-print a dictionary or list of dictionaries, use `wslib.show()`\. + +The functions expect either the name of an asset, or an item from a list as the parameter\. By default, the functions return only a subset of the available asset properties\. By setting the parameter `raw=True`, you can get the full set of asset properties\. + +The entry point `wslib.assets` provides the following functions: + + + + * `list_assets(asset_type, name=None, query=None, selector=None, raw=False)` + + This function lists all assets for the given type with respect to the given constraints. + + The function takes the following parameters: + + + + * `asset_type`: (Required) The type of the assets to list, for example `data_asset`. See `list_asset_types()` for a list of the available asset types. Use asset type `asset` for the list of all available assets in the project. + * `name`: (Optional) The name of the asset to list. Use this parameter if more than one asset with the same name exists. You can only specify either `name` and `query`. + * `query`: (Optional) A query string that is passed to the Watson Data API to search for assets. You can only specify either `name` and `query`. + * `selector`: (Optional) A custom filter function on the candidate asset dictionary items. If the selector function returns `True`, the asset is included in the returned asset list. + * `raw`: (Optional) Returns all of the available metadata. By default, the parameter is set to `False` and only a subset of the properties is returned. + + + + Examples of using the `list_assets` function: + + + + # Import the lib + from ibm_watson_studio_lib import access_project_or_space + wslib = access_project_or_space({"token":""}) + + # List all assets in the project + all_assets = wslib.assets.list_assets("asset") + wslib.show(all_assets) + + # List all data assets with name 'MyFile.csv' + assets_by_name = wslib.assets.list_assets("data_asset", name="MyFile.csv") + + # List all data assets whose name starts with "MyF" + assets_by_query = wslib.assets.list_assets("data_asset", query="asset.name:(MyF*)") + + # List all data assets which are larger than 1MB + sizeFilter = lambda x: x['metadata'] > 1000000 + large_assets = wslib.assets.list_assets("data_asset", selector=sizeFilter, raw=True) + + # List all notebooks + notebooks = wslib.assets.list_assets("notebook") + + + + * `list_asset_types(raw=False)` + + This function lists all available asset types. + + The function can take the following parameter: + + + + * `raw`: (Optional) Returns the full set of metadata. By default, the parameter is `False` and only a subset of the properties is returned. + + + + * `list_datasource_types(raw=False)` + + This function lists all available data source types. + + The function can take the following parameter: + + + + * `raw`: (Optional) Returns the full set of metadata. By default, the parameter is `False` and only a subset of the properties is returned. + + + + * `get_asset(name_or_item, asset_type=None, raw=False)` + + The function returns the metadata of an asset. + + The function takes the following parameters: + + + + * `name_or_item`: (Required) The name of the asset or an item like those returned by `list_assets()` + * `asset_type`: (Optional) The type of the asset. If the parameter `name_or_item` contains a string for the name of the asset, setting `asset_type` is required. + * `raw`: (Optional) Returns the full set of metadata. By default, the parameter is `False` and only a subset of the properties is returned. + + Example of using the `list_assets` and `get_asset` functions: + + notebooks = wslib.assets.list_assets('notebook') + wslib.show(notebooks) + + notebook = wslib.assets.get_asset(notebooks[0]) + wslib.show(notebook) + + + + * `get_connection(name_or_item, with_datasourcetype=False, raw=False)` + + This function returns the metadata of a connection. + + The function takes the following parameters: + + + + * `name_or_item`: (Required) The name of the connection or an item like those returned by `list_connections()` + * `with_datasourcetype`: (Optional) Returns additional information about the data source type of the connection. + * `raw`: (Optional) Returns the full set of metadata. By default, the parameter is `False` and only a subset of the properties is returned. + + + + * `get_connected_data(name_or_item, with_datasourcetype=False, raw=False)` + + This function returns the metadata of a connected data asset. + + The function takes the following parameters: + + + + * `name_or_item`: (Required) The name of the connected data asset or an item like those returned by `list_connected_data()` + * `with_datasourcetype`: (Optional) Returns additional information about the data source type of the associated connected data asset. + * `raw`: (Optional) Returns the full set of metadata. By default, the parameter is `False` and only a subset of the properties is returned. + + + + * `get_stored_data(name_or_item, raw=False)` + + This function returns the metadata of a stored data asset. + + The function takes the following parameters: + + + + * `name_or_item`: (Required) The name of the stored data asset or an item like those returned by `list_stored_data()` + * `raw`: (Optional) Returns the full set of metadata. By default, the parameter is `False` and only a subset of the properties is returned. + + + + * `list_attachments(name_or_item_or_asset, asset_type=None, raw=False)` + + This function returns a list of the attachments of an asset. + + The function takes the following parameters: + + + + * `name_or_item_or_asset`: (Required) The name of the asset or an item like those returned by `list_stored_data()` or `get_asset()`. + * `asset_type`: (Optional) The type of the asset. It defaults to type `data_asset`. + * `raw`: (Optional) Returns the full set of metadata. By default, the parameter is `False` and only a subset of the properties is returned. + + + + Example of using the `list_attachments` function to read an attachment of a stored data asset: + + assets = wslib.list_stored_data() + wslib.show(assets) + + asset = assets[0] + attachments = wslib.assets.list_attachments(asset) + wslib.show(attachments) + buffer = wslib.load_data(asset, attachments[0]) + + + +**Parent topic:**[Using ibm\-watson\-studio\-lib](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/using-ibm-ws-lib.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0efc1aa12637c84918cef9fa5de5da424822330c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0efc1aa12637c84918cef9fa5de5da424822330c.md new file mode 100644 index 0000000..cc47be4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0efc1aa12637c84918cef9fa5de5da424822330c.md @@ -0,0 +1,17 @@ +# Decision Optimization Modeling Assistant scheduling tutorial + +# Formulating and running a model: house construction scheduling # + +This tutorial shows you how to use the Modeling Assistant to define, formulate and run a model for a house construction scheduling problem\. The completed model with data is also provided in the **DO\-samples**, see [Importing Model Builder samples](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/docExamples.html#Examples__section_modelbuildersamples)\. + +In this section: + + + + * [Modeling Assistant House construction scheduling tutorial](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/exhousebuild.html?context=cdpaas&locale=en#cogusercase__section_The_problem) + * [More about the model view](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/exhousebuild.html?context=cdpaas&locale=en#cogusercase__section_tbl_kdj_t1b) + * [Generating a Python notebook from your scenario](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/exhousebuild.html?context=cdpaas&locale=en#cogusercase__section_j2m_xnh_4bb) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0f13adfc739d217925ddcebb152284565bd43de8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0f13adfc739d217925ddcebb152284565bd43de8.md new file mode 100644 index 0000000..ea99621 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0f13adfc739d217925ddcebb152284565bd43de8.md @@ -0,0 +1,176 @@ +# Customizing details for a use case or factsheet + +# Customizing details for a use case or factsheet # + +You can programmatically customize the information that is collected in factsheets for AI use cases\. Use customized factsheets as part of your AI Governance strategy\. + +## Updating a model or model use case programmatically ## + +You might want to update a model use case or model factsheet with additional information\. For example, some companies have a standard set of details they want to accompany a model use case or model facts\. + +Currently, you must update the tenant\-level asset types by modifying the user attributes that uses the [Watson Data REST API](https://cloud.ibm.com/apidocs/watson-data-api#introduction) to update the asset\. + +## Updating a custom asset type ## + +Follow these steps to update a custom asset type: + + + +1. Provide the `bss_account_id` query parameter for the [`getcatalogtype` method](https://cloud.ibm.com/apidocs/watson-data-api#getcatalogtype)\. +2. Provide `asset_type` as `model_entry_user` if you are updating attributes for `model_entry`\. Provide `asset_type` as `modelfacts_user` if you are updating attributes for model facts\. +3. Retrieve the current asset type definition by using the [`getcatalogtype` method](https://cloud.ibm.com/apidocs/watson-data-api#getcatalogtype) where `asset_type` is either `modelfacts_user` or `model_entry_user`\. +4. Update the current asset type definition with the custom attributes by adding them to properties JSON object following the schema that is defined in the API documentation\. The following types of attributes are supported to view and edit from the user interface of the model use case or model: + + + + * string + * date + * integer + + + +5. After the JSON is updated with the new properties, start the changes by using the [`replaceassettype` method](https://cloud.ibm.com/apidocs/watson-data-api#replaceassettype)\. Provide the `asset_type` , `bss_account_id`, and request payload\. + + + +When the update is complete, you can view the custom attributes in the AI use case details page and model details page\. + +## Example 1: Retrieving and updating the `model_entry_user` asset type ## + +Note:This example updates the use case user data\. You can use the same format but substitute `modelfacts_user` to retrieve and update details for the model factsheet\. + +This curl command retrieves the asset type `model_entry_user`: + + curl -X GET --header 'Accept: application/json' --header "Authorization: ZenApiKey ${MY_TOKEN}" 'https://api.dataplatform.cloud.ibm.com:443/v2/asset_types/model_entry_user?bss_account_id=' + +This snippet is a sample response payload for model use case user details: + + { + "description": "The model use case to capture user defined attributes.", + "fields": [], + "relationships": [], + "properties": {}, + "decorates": [{ + "asset_type_name": "model_entry" + }], + "global_search_searchable": [], + "localized_metadata_attributes": { + "name": { + "default": "Additional details", + "en": "Additional details" + } + }, + "attribute_only": false, + "name": "model_entry_user", + "version": 1, + "scope": "ACCOUNT" + } + +This curl command updates the `model_entry_user` asset type: + + curl -X PUT --header 'Content-Type: application/json' --header 'Accept: application/json' --header "Authorization: ZenApiKey ${MY_TOKEN}" -d '@requestbody.json' 'https://api.dataplatform.cloud.ibm.com:443/v2/asset_types/model_entry_user?bss_account_id=' + +The `requestbody.json` contents look like this: + + { + "description": "The model use case to capture user defined attributes.", + "fields": [], + "relationships": [], + "properties": { + "user_attribute1": { + "type": "string", + "description": "User attribute1", + "placeholder": "User attribute1", + "is_array": false, + "required": true, + "hidden": false, + "readonly": false, + "default_value": "None", + "label": { + "default": "User attribute1" + } + }, + "user_attribute2": { + "type": "integer", + "description": "User attribute2", + "placeholder": "User attribute2", + "is_array": false, + "required": true, + "hidden": false, + "readonly": false, + "label": { + "default": "User attribute2" + } + }, + "user_attribute3": { + "type": "date", + "description": "User attribute3", + "placeholder": "User attribute3", + "is_array": false, + "required": true, + "hidden": false, + "readonly": false, + "default_value": "None", + "label": { + "default": "User attribute3" + } + + } + "decorates": [{ + "asset_type_name": "model_entry" + }], + "global_search_searchable": [], + "attribute_only": false, + "localized_metadata_attributes": { + "name": { + "default": "Additional details", + "en": "Additional details" + } + } + } + +## Updating user details by using the Python client ## + +You can also update and replace an asset type with properties by using a Python script\. For details, see [fact sheet elements description](https://s3.us.cloud-object-storage.appdomain.cloud/factsheets-client/index.html#factsheet-asset-elements)\. + +After you update asset type definitions with custom attributes, you can provide values for those attributes from the model use case overview and model details pages\. You can also update values to the custom attributes that use these Python API client methods: + + + + * [Model Asset Utilities](https://s3.us.cloud-object-storage.appdomain.cloud/factsheets-client/index.html#ibm_aigov_facts_client.factsheet.asset_utils_model.ModelAssetUtilities.set_custom_fact) + * [Model Entry Utilities](https://s3.us.cloud-object-storage.appdomain.cloud/factsheets-client/index.html#ibm_aigov_facts_client.factsheet.asset_utils_model.ModelEntryUtilities.set_custom_fact) + + + +## Capturing cell facts for a model ## + +When a data scientist develops a model in a notebook, they generate visualizations for key model details, such as ROC curve, confusion matrix, panda profiling report, or the output of any cell execution\. To capture those facts as part of a model use case, use the ['capture\_cell\_facts\`](https://s3.us.cloud-object-storage.appdomain.cloud/factsheets-client/index.html#capture-cell-facts) function in the AI Factsheets Python client library\. + +## Troubleshooting custom fields ## + +After you customize fields and make them available to users, a user trying to update fields in the **Additional details** section of model details might get this error: + + Update failed. To update an asset attribute, you must be a catalog Admin or an asset owner or member with the Editor role. Ask a catalog Admin to update your catalog role or ask an asset member with the Editor role to add you as a member. + +If the user already has edit permission on the model and is still getting the error message, follow these steps to resolve it\. + + + +1. Invoke the API command for [createassetattributenewv2](https://cloud.ibm.com/apidocs/watson-data-api-cpd#createassetattributenewv2)\. +2. Use this payload with the command: + + { + "name": "modelfacts_system", + "entity": { + } + } + + where `asset_id` is the `model_id`. Enter either `project_id` or `space_id` or `catalog_id` where the model exists. + + + +## Learn more ## + +Find out about working with an inventory programmatically, by using the [IBM\_AIGOV\_FACTS\_CLIENT documentation](https://s3.us.cloud-object-storage.appdomain.cloud/factsheets-client/index.html)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0f58073f0d5b237c3241126e98851a9e0c912792.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0f58073f0d5b237c3241126e98851a9e0c912792.md new file mode 100644 index 0000000..bc9dadf --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0f58073f0d5b237c3241126e98851a9e0c912792.md @@ -0,0 +1,35 @@ +# Uploading a text analysis package (TAP) in a Text Mining node (SPSS Modeler) + +# Uploading a custom asset in a Text Mining node # + +You can add a custom text analysis package (TAP) or template directly in the Text Mining node\. When your SPSS Modeler flow runs, it will use your custom asset\. + +## Procedure ## + + + +1. If you want to download a TAP, save it locally\. + + + + 1. Click Text analysis package while in the Text Analytics Workbench. + 2. Enter details about the asset, and then click Submit. The text analysis package is saved locally as a .tap file. + + + +2. If you want to download a template, see [Linguistic resources](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/tmwb-linguistic-resource.html#tmwb-templates-intro__DownloadAssetsSteps)\. +3. Add the TAP or template file to another Text Mining node\. + + + + 1. In the Text Mining node, click Select resources. + 2. Click the Text analysis package or Resource template tab depending on the asset you want. + 3. Click Import , and then browse to or drag-and-drop your TAP or template. + 4. Enter details about the asset, and then click Add. You can now see the uploaded TAP in the list of resources. It is also saved to your project as a project asset. + 5. Click Ok. + + + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0f686bf5943844896a5385e01d440548081d2688.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0f686bf5943844896a5385e01d440548081d2688.md new file mode 100644 index 0000000..4da4e46 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0f686bf5943844896a5385e01d440548081d2688.md @@ -0,0 +1,18 @@ +# Handling blanks and missing values (SPSS Modeler) + +# Handling blanks and missing values # + +Replacing blanks or missing values is a common data preparation task for data miners\. CLEM provides you with a number of tools to automate blank handling\. + +The Filler node is the most common place to work with blanks; however, the following functions can be used in any node that accepts CLEM expressions: + + + + * `@BLANK(FIELD)` can be used to determine records whose values are blank for a particular field, such as `Age`\. + * `@NULL(FIELD)` can be used to determine records whose values are system\-missing for the specified field(s)\. In SPSS Modeler, system\-missing values are displayed as $null$ values\. + + + +See [Functions handling blanks and null values](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_blanksnulls.html#clem_function_ref_blanksnulls) for more information\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0faf8791603eb1a93adc49ea8f9e5859d1e3360f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0faf8791603eb1a93adc49ea8f9e5859d1e3360f.md new file mode 100644 index 0000000..bed3e39 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/0faf8791603eb1a93adc49ea8f9e5859d1e3360f.md @@ -0,0 +1,19 @@ +# Time Intervals node (SPSS Modeler) + +# Time Intervals node # + +Use the Time Intervals node to specify intervals and derive a new time field for estimating or forecasting\. A full range of time intervals is supported, from seconds to years\. + +Use the node to derive a new time field\. The new field has the same storage type as the input time field you chose\. The node generates the following items: + + + + * The field specified in the node properties as the Time Field, along with the chosen prefix/suffix\. By default the prefix is `$TI_`\. + * The fields specified in the node properties as the Dimension fields\. + * The fields specified in the node properties as the Fields to aggregate\. + + + +You can also generate a number of extra fields, depending on the selected interval or period (such as the minute or second within which a measurement falls)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/102d3d188e3edc4a4aa55f731966ebb22c827822.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/102d3d188e3edc4a4aa55f731966ebb22c827822.md new file mode 100644 index 0000000..b846880 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/102d3d188e3edc4a4aa55f731966ebb22c827822.md @@ -0,0 +1,82 @@ +# Looker connection + +# Looker connection # + +To access your data in Looker, create a connection asset for it\. + +Looker is a business intelligence software and big data analytics platform that helps you explore, analyze and share real\-time business analytics\. + +## Create a connection to Looker ## + +To create the connection asset, you need these connection details: + + + + * Hostname or IP address + * Port number of the Looker server + * Client ID and Client secret + + + +Before you configure the connection, set up API3 credentials for your Looker instance\. For details, see [Looker API Authentication](https://www.ibm.com/links?url=https%3A%2F%2Fdocs.looker.com%2Freference%2Fapi-and-integration%2Fapi-auth)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Looker connections in the following workspaces and tools: + +**Projects** + + + + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Looker setup ## + +[Set up and administer Looker](https://docs.looker.com/admin-options) + +## Restriction ## + +You can use this connection only for source data\. You cannot write to data or export data with this connection\. + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the Looker documentation, [Using SQL Runner](https://docs.looker.com/data-modeling/learning-lookml/sql-runner-create-queries), for the correct syntax\. + +## Supported file types ## + +The Looker connection supports these file types: CSV, Delimited text, Excel, JSON\. + +## Learn more ## + +[Looker documentation](https://docs.looker.com/) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1093c3d02f71f4fba221375302d20bc761e70aef.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1093c3d02f71f4fba221375302d20bc761e70aef.md new file mode 100644 index 0000000..f39edbf --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1093c3d02f71f4fba221375302d20bc761e70aef.md @@ -0,0 +1,38 @@ +# Creating jobs in Data Refinery + +# Creating jobs in Data Refinery # + +You can create a job to run a Data Refinery flow directly in Data Refinery\. + +To create a Data Refinery flow job: + + + +1. In Data Refinery, click the Jobs icon ![the jobs icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/Run-schedule_Blue.png) from the Data Refinery toolbar and select **Save and create a job**\. +2. Define the job details by entering a name and a description (optional)\. +3. On the Configure page, select an environment runtime for the job, and optionally modify the job retention settings\. +4. On the Schedule page, you can optionally add a one\-time or repeating schedule\. + + If you define a start day and time without selecting **Repeat**, the job will run exactly one time at the specified day and time. If you define a start date and time and you select **Repeat**, the job will run for the first time at the timestamp indicated in the Repeat section. + + You can't change the time zone; the schedule uses your web browser's time zone setting. If you exclude certain weekdays, the job might not run as you would expect. The reason might be due to a discrepancy between the time zone of the user who creates the schedule, and the time zone of the compute node where the job runs. +5. Optional: Set up notifications for the job\. You can select the type of alerts to receive\. +6. Review the job settings\. Then, create the job and run it immediately, or create the job and run it later\. + + The Data Refinery flow job is listed in the **Jobs** in your project. + + + +## Learn more ## + + + + * [Compute resource options for Data Refinery in projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spark-dr-envs.html) + * [Viewing job details](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html#view-job-details) + * [Refining data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + + + +**Parent topic**: [Jobs](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/114ebf33612531c5020fd739010049e5126e0e5b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/114ebf33612531c5020fd739010049e5126e0e5b.md new file mode 100644 index 0000000..bb4febb --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/114ebf33612531c5020fd739010049e5126e0e5b.md @@ -0,0 +1,22 @@ +# XGBoost-AS node (SPSS Modeler) + +# XGBoost\-AS node # + +XGBoost© is an advanced implementation of a gradient boosting algorithm\. Boosting algorithms iteratively learn weak classifiers and then add them to a final strong classifier\. XGBoost is very flexible and provides many parameters that can be overwhelming to most users, so the XGBoost\-AS node in Watson Studio exposes the core features and commonly used parameters\. The XGBoost\-AS node is implemented in Spark\. + +For more information about boosting algorithms, see the [XGBoost Tutorials](http://xgboost.readthedocs.io/en/latest/tutorials/index.html)\. ^1^ + +Note that the XGBoost cross\-validation function is not supported in Watson Studio\. You can use the Partition node for this functionality\. Also note that XGBoost in Watson Studio performs one\-hot encoding automatically for categorical variables\. + +Notes: + + + + * On Mac, version 10\.12\.3 or higher is required for building XGBoost\-AS models\. + * XGBoost isn't supported on IBM POWER\. + + + +^1^ "XGBoost Tutorials\." *Scalable and Flexible Gradient Boosting*\. Web\. © 2015\-2016 DMLC\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/116575c57d15c410ac921aebfaf607e2f86e6c05.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/116575c57d15c410ac921aebfaf607e2f86e6c05.md new file mode 100644 index 0000000..681b1de --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/116575c57d15c410ac921aebfaf607e2f86e6c05.md @@ -0,0 +1,20 @@ +# applyxgboosttreenode properties + +# applyxgboosttreenode properties # + +You can use the XGBoost Tree node to generate an XGBoost Tree model nugget\. The scripting name of this model nugget is *applyxgboosttreenode*\. For more information on scripting the modeling node itself, see [xgboosttreenode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/xgboosttreenodeslots.html#xboosttreenodeslots)\. + + + +applyxgboosttreenode properties + +Table 1\. applyxgboosttreenode properties + +| `applyxgboosttreenode` properties | Data type | Property description | +| --------------------------------- | --------- | -------------------- | +| `use_model_name` | | | +| `model_name` | | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/11a093cb8f1d24ea066663b3991084a84fc32bf2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/11a093cb8f1d24ea066663b3991084a84fc32bf2.md new file mode 100644 index 0000000..f9651f6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/11a093cb8f1d24ea066663b3991084a84fc32bf2.md @@ -0,0 +1,104 @@ +# Creating jobs in deployment spaces + +# Creating jobs in deployment spaces # + +A job is a way of running a batch deployment, or a self\-contained asset like a script, notebook, code package, or flow in Watson Machine Learning\. You can select the input and output for your job and choose to run it manually or on a schedule\. From a deployment space, you can create, schedule, run, and manage jobs\. + +## Creating a batch deployment job ## + +Follow these steps when you are creating a batch deployment job: + +Important: You must have an existing batch deployment to create a batch job\. + + + +1. From the **Deployments** tab, select your deployment and click **New job**\. The *Create a job* dialog box opens\. +2. In the *Define details* section, enter your job name, an optional description, and click **Next**\. +3. In the *Configure* section, select a hardware specification\. + You can follow these steps to optionally configure environment variables and job run retention settings: + + + + * Optional: If you are deploying a Python script, an R script, or a notebook, then you can enter environment variables to pass parameters to the job. Click **Environment variables** to enter the *key* - *value* pair. + * Optional: To avoid finishing resources by retaining all historical job metadata, follow one of these options: + + + + * Click **By amount** to set thresholds for saving a set number of job runs and associated logs. + * Click **By duration (days)** to set thresholds for saving artifacts for a specified number of days. + + + + + +4. Optional: In the *Schedule* section, toggle the **Schedule off** button to schedule a run\. You can set a date and time for start of schedule and set a schedule for repetition\. Click **Next**\. + + Note: If you don't specify a schedule, the job runs immediately. +5. Optional: In the *Notify* section, toggle the **Off** button to turn on notifications associated with this job\. Click **Next**\. + + Note: You can receive notifications for three types of events: success, warning, and failure. +6. In the *Choose data* section, provide inline data that corresponds with your model schema\. You can provide input in JSON format\. Click **Next**\. See [Example JSON payload for inline data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-jobs.html?context=cdpaas&locale=en#example-json)\. +7. In the *Review and create* section, verify your job details, and click **Create and run**\. + + + +**Notes**: + + + + * Scheduled jobs display on the **Jobs** tab of the deployment space\. + * Results of job runs are written to the specified output file and saved as a space asset\. + * A data asset can be a data source file that you promoted to the space, a connected data source, or tables from databases and files from file\-based data sources\. + * If you exclude certain weekdays in your job schedule, the job might not run as you would expect\. The reason is due to a discrepancy between the time zone of the user who creates the schedule, and the time zone of the main node where the job runs\. + * When you create or modify a scheduled job, an API key is generated\. Future runs use this generated API key\. + + + +### Example JSON payload for inline data ### + + { + "deployment": { + "id": "" + }, + "space_id": "", + "name": "test_v4_inline", + "scoring": { + "input_data": [{ + "fields": "AGE", "SEX", "BP", "CHOLESTEROL", "NA", "K"], + "values": 47, "M", "LOW", "HIGH", 0.739, 0.056], 47, "M", "LOW", "HIGH", 0.739, 0.056]] + }] + } + } + +## Queuing and concurrent job executions ## + +The maximum number of concurrent jobs for each deployment is handled internally by the deployment service\. For batch deployment, by default, two jobs can be run concurrently\. Any deployment job request for a batch deployment that already has two running jobs is placed in a queue for execution later\. When any of the running jobs is completed, the next job in the queue is run\. The queue has no size limit\. + +## Limitation on using large inline payloads for batch deployments ## + +Batch deployment jobs that use large inline payload might get stuck in `starting` or `running` state\. + +Tip: If you provide huge payloads to batch deployments, use data references instead of inline\. + +## Retention of deployment job metadata ## + +Job\-related metadata is persisted and can be accessed until the job and its deployment are deleted\. + +## Viewing deployment job details ## + +When you create or view a batch job, the deployment ID and the job ID are displayed\. + +![Job IDs](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/job-ids.png) + + + + * The deployment ID represents the deployment definition, including the hardware and software configurations and related assets\. + * The job ID represents the details for a job, including input data and an output location and a schedule for running the job\. + + + +Use these IDs to refer to the job in Watson Machine Learning [REST API](https://cloud.ibm.com/apidocs/machine-learning) requests or in notebooks that use the Watson Machine Learning [Python client library](https://ibm.github.io/watson-machine-learning-sdk/)\. + +**Parent topic:**[Managing predictive deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/120cae8361ae4e0b6fe4d6f0d32eee9517f11190.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/120cae8361ae4e0b6fe4d6f0d32eee9517f11190.md new file mode 100644 index 0000000..b93419f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/120cae8361ae4e0b6fe4d6f0d32eee9517f11190.md @@ -0,0 +1,40 @@ +# Choosing a foundation model in watsonx.ai + +# Choosing a foundation model in watsonx\.ai # + +To determine which models might work well for your project, consider model attributes, such as license, pretraining data, model size, and how the model was fine\-tuned\. After you have a short list of models that best fit your use case, systematically test the models to see which ones consistently return the results you want\. + + + +Table 1\. Considerations for choosing a foundation model in IBM watsonx\.ai + +| Model attribute | Considerations | +| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Context length | Sometimes called *context window length*, *context window*, or *maximum sequence length*, context length is the maximum allowed value for the number of tokens in the input prompt plus the number of tokens in the generated output\. When you generate output with models in watsonx\.ai, the number of tokens in the generated output is limited by the Max tokens parameter\. For some models, the token length of model output for Lite plans is limited by a dynamic, model\-specific, environment\-driven upper limit\. | +| Cost | The cost of using foundation models is measured in resource units\. The price of a resource unit is based on the rate of the billing class for the foundation model\. | +| Fine\-tuning | After being pretrained, many foundation models are fine\-tuned for specific tasks, such as classification, information extraction, summarization, responding to instructions, answering questions, or participating in a back\-and\-forth dialog chat\. A model that was fine\-tuned on tasks similar to your planned use typically perform better with zero\-shot prompts than models that were not fine\-tuned in a way that fits your use case\. One way to improve results for a fine\-tuned model is to structure your prompt in the same format as prompts in the data sets that were used to fine\-tune that model\. | +| Instruction\-tuned | *Instruction\-tuned* means that the model was fine\-tuned with prompts that include an instruction\. When a model is instruction\-tuned, it typically responds well to prompts that have an instruction even if those prompts don't have examples\. | +| IP indemnity | In addition to license terms, review the intellectual property indemnification policy for the model\. Some foundation model providers require you to exempt them from liability for any IP infringement that might result from the use of their AI models\. For information about contractual protections related to IBM watsonx\.ai, see the [IBM watsonx\.ai service description](https://www.ibm.com/support/customer/csol/terms/?id=i126-7747)\. | +| License | In general, each foundation model comes with a different license that limits how the model can be used\. Review model licenses to make sure that you can use a model for your planned solution\. | +| Model architecture | The architecture of the model influences how the model behaves\. A transformer\-based model typically has one of the following architectures:
• *Encoder\-only*: Understands input text at the sentence level by transforming input sequences into representational vectors called embeddings\. Common tasks for encoder\-only models include classification and entity extraction\.
• *Decoder\-only*: Generates output text word\-by\-word by inference from the input sequence\. Common tasks for decoder\-only models include generating text and answering questions\.
• *Encoder\-decoder*: Both understands input text and generates output text based on the input text\. Common tasks for encoder\-decoder models include translation and summarization\. | +| Regional availability | You can work with models that are available in the same IBM Cloud regional data center as your watsonx services\. | +| Supported natural languages | Many foundation models work well in English only\. But some model creators include multiple languages in the pretraining data sets to fine\-tune their model on tasks in different languages, and to test their model's performance in multiple languages\. If you plan to build a solution for a global audience or a solution that does translation tasks, look for models that were created with multilingual support in mind\. | +| Supported programming languages | Not all foundation models work well for programming use cases\. If you are planning to create a solution that summarizes, converts, generates, or otherwise processes code, review which programming languages were included in a model's pretraining data sets and fine\-tuning activities to determine whether that model is a fit for your use case\. | + + + +## Learn more ## + + + + * [Tokens and tokenization](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tokens.html) + * [Model parameters for prompting](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-model-parameters.html) + * [Prompt tips](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-tips.html) + * [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html) + * [Regional availability for foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/regional-datactr.html#data-centers) + + + +**Parent topic:**[Supported foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/123987d173c0db88d8e1f59af46a8d9313a8e601.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/123987d173c0db88d8e1f59af46a8d9313a8e601.md new file mode 100644 index 0000000..3506502 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/123987d173c0db88d8e1f59af46a8d9313a8e601.md @@ -0,0 +1,25 @@ +# extensionexportnode properties + +# extensionexportnode properties # + +![Extension Export node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/extensionexportnode.png)With the Extension Export node, you can run R or Python for Spark scripts to export data\. + + + +extensionexportnode properties + +Table 1\. extensionexportnode properties + +| `extensionexportnode` properties | Data type | Property description | +| -------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------- | +| `syntax_type` | *R**Python* | Specify which script runs: R or Python (R is the default)\. | +| `r_syntax` | *string* | The R scripting syntax to run\. | +| `python_syntax` | *string* | The Python scripting syntax to run\. | +| `convert_flags` | `StringsAndDoubles LogicalValues` | Option to convert flag fields\. | +| `convert_missing` | *flag* | Option to convert missing values to the R NA value\. | +| `convert_datetime` | *flag* | Option to convert variables with date or datetime formats to R date/time formats\. | +| `convert_datetime_class` | `POSIXct POSIXlt` | Options to specify to what format variables with date or datetime formats are converted\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1243d4c8499cc9be45cd9c1f6eb34254f1b9b4d7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1243d4c8499cc9be45cd9c1f6eb34254f1b9b4d7.md new file mode 100644 index 0000000..762b2cb --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1243d4c8499cc9be45cd9c1f6eb34254f1b9b4d7.md @@ -0,0 +1,49 @@ +# Getting information about nodes + +# Getting information about nodes # + +Nodes fall into a number of different categories such as data import and export nodes, model building nodes, and other types of nodes\. Every node provides a number of methods that can be used to find out information about the node\. + +The methods that can be used to obtain the ID, name, and label of a node are summarized in the following table\. + + + +Methods to obtain the ID, name, and label of a node + +Table 1\. Methods to obtain the ID, name, and label of a node + +| Method | Return type | Description | +| ------------------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `n.getLabel()` | *string* | Returns the display label of the specified node\. The label is the value of the property `custom_name` only if that property is a non\-empty string and the `use_custom_name` property is not set; otherwise, the label is the value of `getName()`\. | +| `n.setLabel(label)` | Not applicable | Sets the display label of the specified node\. If the new label is a non\-empty string it is assigned to the property `custom_name`, and `False` is assigned to the property `use_custom_name` so that the specified label takes precedence; otherwise, an empty string is assigned to the property `custom_name` and `True` is assigned to the property `use_custom_name`\. | +| `n.getName()` | *string* | Returns the name of the specified node\. | +| `n.getID()` | *string* | Returns the ID of the specified node\. A new ID is created each time a new node is created\. The ID is persisted with the node when it's saved as part of a flow so that when the flow is opened, the node IDs are preserved\. However, if a saved node is inserted into a flow, the inserted node is considered to be a new object and will be allocated a new ID\. | + + + +Methods that can be used to obtain other information about a node are summarized in the following table\. + + + +Methods for obtaining information about a node + +Table 2\. Methods for obtaining information about a node + +| Method | Return type | Description | +| -------------------------------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------- | +| `n.getTypeName()` | *string* | Returns the scripting name of this node\. This is the same name that could be used to create a new instance of this node\. | +| `n.isInitial()` | *Boolean* | Returns `True` if this is an initial node (one that occurs at the start of a flow)\. | +| `n.isInline()` | *Boolean* | Returns `True` if this is an in\-line node (one that occurs mid\-flow)\. | +| `n.isTerminal()` | *Boolean* | Returns `True` if this is a terminal node (one that occurs at the end of a flow)\. | +| `n.getXPosition()` | *int* | Returns the x position offset of the node in the flow\. | +| `n.getYPosition()` | *int* | Returns the y position offset of the node in the flow\. | +| `n.setXYPosition(x, y)` | Not applicable | Sets the position of the node in the flow\. | +| `n.setPositionBetween(source, target)` | Not applicable | Sets the position of the node in the flow so that it's positioned between the supplied nodes\. | +| `n.isCacheEnabled()` | *Boolean* | Returns `True` if the cache is enabled; returns `False` otherwise\. | +| `n.setCacheEnabled(val)` | Not applicable | Enables or disables the cache for this object\. If the cache is full and the caching becomes disabled, the cache is flushed\. | +| `n.isCacheFull()` | *Boolean* | Returns `True` if the cache is full; returns `False` otherwise\. | +| `n.flushCache()` | Not applicable | Flushes the cache of this node\. Has no affect if the cache is not enabled or is not full\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/134eb5d79038b55a3a6ac019016a21ec2b6a1917.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/134eb5d79038b55a3a6ac019016a21ec2b6a1917.md new file mode 100644 index 0000000..1d91cfb --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/134eb5d79038b55a3a6ac019016a21ec2b6a1917.md @@ -0,0 +1,23 @@ +# Deploying Java models + +# Deploying Java models for Decision Optimization # + +You can deploy Decision Optimization Java models in Watson Machine Learning by using the Watson Machine Learning REST API\. + +With the Java worker API, you can create optimization models with OPL, CPLEX, and CP Optimizer Java APIs\. Therefore, you can easily create your models locally, package them and deploy them on Watson Machine Learning by using the boilerplate that is provided in the public [Java worker GitHub](https://github.com/IBMDecisionOptimization/cplex-java-worker/blob/master/README.md)\. + +The Decision Optimization[Java worker GitHub](https://github.com/IBMDecisionOptimization/cplex-java-worker/blob/master/README.md) contains a boilerplate with everything that you need to run, deploy, and verify your Java models in Watson Machine Learning, including an example\. You can use the code in this repository to package your Decision Optimization Java model in a `.jar` file that can be used as a Watson Machine Learning model\. For more information about Java worker parameters, see the [Java documentation](https://github.com/IBMDecisionOptimization/do-maven-repo/blob/master/com/ibm/analytics/optim/api_java_client/1.0.0/api_java_client-1.0.0-javadoc.jar)\. + +You can build your Decision Optimization models in Java or you can use Java worker to package CPLEX, CPO, and OPL models\. + +For more information about these models, see the following reference manuals\. + + + + * [Java CPLEX reference documentation](https://www.ibm.com/docs/en/SSSA5P_22.1.1/ilog.odms.cplex.help/refjavacplex/html/overview-summary.html) + * [Java CPO reference documentation](https://www.ibm.com/docs/en/SSSA5P_22.1.1/ilog.odms.cpo.help/refjavacpoptimizer/html/overview-summary.html) + * [Java OPL reference documentation](https://www.ibm.com/docs/en/SSSA5P_22.1.1/ilog.odms.ide.help/refjavaopl/html/overview-summary.html) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/135ad82faaa11fd4fec7ce7a31516e98ee3d0ea5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/135ad82faaa11fd4fec7ce7a31516e98ee3d0ea5.md new file mode 100644 index 0000000..4c08727 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/135ad82faaa11fd4fec7ce7a31516e98ee3d0ea5.md @@ -0,0 +1,37 @@ +# Decision Optimization solve parameters + +# Solve parameters # + +To control solve behavior, you can specify Decision Optimization solve parameters in your request as named value pairs\. + +For example: + + "solve_parameters" : { + "oaas.logAttachmentName":"log.txt", + "oaas.logTailEnabled":"true" + } + +You can use this code to collect the engine log tail during the solve and the whole engine log as output at the end of the solve\. + +You can use these parameters in your request\. + + + +| Name | Type | Description | +| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `oaas.timeLimit` | Number | You can use this parameter to set a time limit in milliseconds\. | +| `oaas.resultsFormat` | Enum



* `JSON`
* `CSV`
* `XML`
* `TEXT`
* `XLSX`


| Specifies the format for returned results\. The default formats are as follows:



* CPLEX \- `.xml`
* CPO \- `.json`
* OPL \- `.csv`
* DOcplex \- `.json`



Other formats might or might not be supported depending on the application type\. | +| `oaas.oplRunConfig` | String | Specifies the name of the OPL run configuration to be executed\. | +| `oaas.docplex.python` | `3.10` | You can use this parameter to set the Python version for the run in your deployed model\. If not specified, 3\.10 is used by default\. | +| `oaas.logTailEnabled` | Boolean | Use this parameter to include the log tail in the solve status\. | +| `oaas.logAttachmentName` | String | If defined, engine logs will be defined as a job output attachment\. | +| `oaas.engineLogLevel` | Enum



* `OFF`
* `SEVERE`
* `WARNING`
* `INFO`
* `CONFIG`
* `FINE`
* `FINER`
* `FINEST`


| You can use this parameter to define the level of detail that is provided by the engine log\. The default value is `INFO`\. | +| `oaas.logLimit` | Number | Maximum log\-size limit in number of characters\. | +| `oaas.dumpZipName` | Can be viewed as Boolean (see Description) | If defined, a job dump (inputs and outputs) `.zip` file is provided with this name as a job output attachment\. The name can contain a placeholder `${job_id}`\. If defined with no value, `dump_${job_id}.zip attachmentName` is used\. If not defined, by default, no job dump `.zip` file is attached\. | +| `oaas.dumpZipRules` | String | If defined, ta `.zip` file is generated according to specific job rules (RFC 1960\-based Filter)\. It must be used in conjunction with the `{@link DUMP_ZIP_NAME}` parameter\. Filters can be defined on the duration and the following `{@link com.ibm.optim.executionservice.model.solve.SolveState}` properties:



* `duration`
* `solveState.executionStatus`
* `solveState.interruptionStatus`
* `solveState.solveStatus`
* `solveState.failureInfo.type`



Example:

`(duration>=1000) or (&(duration<1000)(!(solveState.solveStatus=OPTIMAL_SOLUTION))) or (|(solveState.interruptionStatus=OUT_OF_MEMORY) (solveState.failureInfo.type=INFRASTRUCTURE))`

(duration>=1000) or (&(duration<1000)(\!(solveState\.solveStatus=OPTIMAL\_SOLUTION))) or (\|(solveState\.interruptionStatus=OUT\_OF\_MEMORY) (solveState\.failureInfo\.type=INFRASTRUCTURE)) | +| `oaas.outputUploadPeriod` | Number | Intermediate output in minutes\. This parameter can be used to set up intermediate output publication (if any)\. | +| `oaas.outputUploadFiles` | String (RegExp) | RegExp filter for files to be included in the output upload\. If nothing is defined, all outputs are added\.

Example:

`job_${job_id}_log_${update_time}.txt` | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1399cd9c09634e30c0f099c0fae66a756153dab1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1399cd9c09634e30c0f099c0fae66a756153dab1.md new file mode 100644 index 0000000..ff079dc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1399cd9c09634e30c0f099c0fae66a756153dab1.md @@ -0,0 +1,15 @@ +# Learning and testing (SPSS Modeler) + +# Learning and testing # + +The flow trains a neural network and a decision tree to make this prediction of revenue increase\. + +Figure 1\. Retail Sales Promotion example flow + +![Retail Sales Promotion example flow](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_retail.png) + +After you run the flow to generate the model nuggets, you can test the results of the learning process\. You do this by connecting the decision tree and network in series between the Type node and a new Analysis node, changing the Data Asset import node to point to goods2n\.csv, and running the Analysis node\. From the output of this node, in particular from the linear correlation between the predicted increase and the correct answer, you will find that the trained systems predict the increase in revenue with a high degree of success\. + +Further exploration might focus on the cases where the trained systems make relatively large errors\. These could be identified by plotting the predicted increase in revenue against the actual increase\. Outliers on this graph could be selected using the interactive graphics within SPSS Modeler, and from their properties, it might be possible to tune the data description or learning process to improve accuracy\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/13a1ff3338f4ac1eb2cf3ff6781283b49ac8b5a6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/13a1ff3338f4ac1eb2cf3ff6781283b49ac8b5a6.md new file mode 100644 index 0000000..4df01dc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/13a1ff3338f4ac1eb2cf3ff6781283b49ac8b5a6.md @@ -0,0 +1,15 @@ +# K-Means node (SPSS Modeler) + +# K\-Means node # + +The K\-Means node provides a method of cluster analysis\. It can be used to cluster the dataset into distinct groups when you don't know what those groups are at the beginning\. Unlike most learning methods in SPSS Modeler, K\-Means models do not use a target field\. This type of learning, with no target field, is called unsupervised learning\. Instead of trying to predict an outcome, K\-Means tries to uncover patterns in the set of input fields\. Records are grouped so that records within a group or cluster tend to be similar to each other, but records in different groups are dissimilar\. + +K\-Means works by defining a set of starting cluster centers derived from data\. It then assigns each record to the cluster to which it is most similar, based on the record's input field values\. After all cases have been assigned, the cluster centers are updated to reflect the new set of records assigned to each cluster\. The records are then checked again to see whether they should be reassigned to a different cluster, and the record assignment/cluster iteration process continues until either the maximum number of iterations is reached, or the change between one iteration and the next fails to exceed a specified threshold\. + +Note: The resulting model depends to a certain extent on the order of the training data\. Reordering the data and rebuilding the model may lead to a different final cluster model\. + +Requirements\. To train a K\-Means model, you need one or more fields with the role set to `Input`\. Fields with the role set to `Output`, `Both`, or `None` are ignored\. + +Strengths\. You do not need to have data on group membership to build a K\-Means model\. The K\-Means model is often the fastest method of clustering for large datasets\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/13d83af5ccd616f312472fbab4ac7d7a56d0f41d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/13d83af5ccd616f312472fbab4ac7d7a56d0f41d.md new file mode 100644 index 0000000..d7f292e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/13d83af5ccd616f312472fbab4ac7d7a56d0f41d.md @@ -0,0 +1,14 @@ +# Using an Analysis node (SPSS Modeler) + +# Using an Analysis node # + +You can assess the accuracy of the model using an Analysis node\. From the Palette, under Outputs, place an Analysis node on the canvas and attach it to the C5\.0 model nugget\. Then right\-click the Analysis node and select Run\. + +Figure 1\. Analysis node + +![Analysis node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_drug_analysis.png)The Analysis node output shows that with this artificial dataset, the model correctly predicted the choice of drug for every record in the dataset\. With a real dataset you are unlikely to see 100% accuracy, but you can use the Analysis node to help determine whether the model is acceptably accurate for your particular application\. + +Figure 2\. Analysis node output + +![Analysis node output](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_drug_analysis_output.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/13f7c9c7b52ec7152f2b3d81b6eb42db0319a6f4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/13f7c9c7b52ec7152f2b3d81b6eb42db0319a6f4.md new file mode 100644 index 0000000..c741fa8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/13f7c9c7b52ec7152f2b3d81b6eb42db0319a6f4.md @@ -0,0 +1,8 @@ +# Histogram node (SPSS Modeler) + +# Histogram node # + +Histogram nodes show the occurrence of values for numeric fields\. They are often used to explore the data before manipulations and model building\. Similar to the Distribution node, Histogram nodes are frequently used to reveal imbalances in the data\. + +Note: To show the occurrence of values for symbolic fields, you should use a Distribution node\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/14005f26f286b03f8ac692d42e9f3dfce1f66962.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/14005f26f286b03f8ac692d42e9f3dfce1f66962.md new file mode 100644 index 0000000..2aa9677 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/14005f26f286b03f8ac692d42e9f3dfce1f66962.md @@ -0,0 +1,32 @@ +# extensionoutputnode properties + +# extensionoutputnode properties # + +![Extension Output node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/extensionoutputnode.png)With the Extension Output node, you can analyze data and the results of model scoring using your own custom R or Python for Spark script\. The output of the analysis can be text or graphical\. + +Note that many of the properties on this page are for streams from SPSS Modeler desktop\. + + + +extensionoutputnode properties + +Table 1\. extensionoutputnode properties + +| `extensionoutputnode` properties | Data type | Property description | +| -------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------- | +| `syntax_type` | *R**Python* | Specify which script runs: R or Python (R is the default)\. | +| `r_syntax` | *string* | R scripting syntax for model scoring\. | +| `python_syntax` | *string* | Python scripting syntax for model scoring\. | +| `convert_flags` | `StringsAndDoubles LogicalValues` | Option to convert flag fields\. | +| `convert_missing` | *flag* | Option to convert missing values to the R NA value\. | +| `convert_datetime` | *flag* | Option to convert variables with date or datetime formats to R date/time formats\. | +| `convert_datetime_class` | `POSIXct POSIXlt` | Options to specify to what format variables with date or datetime formats are converted\. | +| `output_to` | `Screen File` | Specify the output type (`Screen` or `File`)\. | +| `output_type` | `Graph Text` | Specify whether to produce graphical or text output\. | +| `full_filename` | *string* | File name to use for the generated output\. | +| `graph_file_type` | `HTML COU` | File type for the output file ( \.html or \.cou)\. | +| `text_file_type` | `HTML TEXT COU` | Specify the file type for text output ( \.html, \.txt, or \.cou)\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/14416203d840c788359110b18cfd9ce922de0d67.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/14416203d840c788359110b18cfd9ce922de0d67.md new file mode 100644 index 0000000..cad2f05 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/14416203d840c788359110b18cfd9ce922de0d67.md @@ -0,0 +1,7 @@ +# applyautoclusternode properties + +# applyautoclusternode properties # + +You can use Auto Cluster modeling nodes to generate an Auto Cluster model nugget\. The scripting name of this model nugget is *applyautoclusternode*\. No other properties exist for this model nugget\. For more information on scripting the modeling node itself, see [autoclusternode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/autoclusternodeslots.html#autoclusternodeslots)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1453d1cad565842eea24c8d92963bd73338ef0f1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1453d1cad565842eea24c8d92963bd73338ef0f1.md new file mode 100644 index 0000000..b171324 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1453d1cad565842eea24c8d92963bd73338ef0f1.md @@ -0,0 +1,20 @@ +# Histogram charts + +# Histogram charts # + +A histogram is similar in appearance to a bar chart, but instead of comparing categories or looking for trends over time, each bar represents how data is distributed in a single category\. Each bar represents a continuous range of data or the number of frequencies for a specific data point\. + +Histograms are useful for showing the distribution of a single scale variable\. Data are binned and summarized by using a count or percentage statistic\. A variation of a histogram is a frequency polygon, which is like a typical histogram except that the area graphic element is used instead of the bar graphic element\. + +Another variation of the histogram is the population pyramid\. Its name is derived from its most common use: summarizing population data\. When used with population data, it is split by gender to provide two back\-to\-back, horizontal histograms of age data\. In countries with a young population, the shape of the resulting graph resembles a pyramid\. + +Footnote +: The chart footnote, which is placed beneath the chart\. + +XAxis label +: The x\-axis label, which is placed beneath the x\-axis\. + +YAxis label +: The y\-axis label, which is placed above the y\-axis\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1483016be71021f31b8193239d319f34d8e01c9c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1483016be71021f31b8193239d319f34d8e01c9c.md new file mode 100644 index 0000000..f70c9f8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1483016be71021f31b8193239d319f34d8e01c9c.md @@ -0,0 +1,71 @@ +# Supported machine learning tools, libraries, frameworks, and software specifications + +# Supported machine learning tools, libraries, frameworks, and software specifications # + +In IBM Watson Machine Learning, you can use popular tools, libraries, and frameworks to train and deploy machine learning models and functions\. The environment for these models and functions is made up of specific hardware and software specifications\. + +Software specifications define the language and version that you use for a model or function\. You can use software specifications to configure the software that is used for running your models and functions\. By using software specifications, you can precisely define the software version to be used and include your own extensions (for example, by using conda \.yml files or custom libraries)\. + +You can get a list of available software and hardware specifications and then use their names and IDs for use with your deployment\. For more information, see [Python client](https://ibm.github.io/watson-machine-learning-sdk/) or [REST API](https://cloud.ibm.com/apidocs/machine-learning)\. + +## Predefined software specifications ## + +You can use popular tools, libraries, and frameworks to train and deploy machine learning models and functions\. + +This table lists the predefined (base) model types and software specifications\. + + + +List of predefined (base) model types and software specifications + +| Framework\*\* | Versions | Model Type | Default software specification | +| --------------------- | ------------ | -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| AutoAI | 0\.1 | NA | autoai\-kb\_rt22\.2\-py3\.10
autoai\-ts\_rt22\.2\-py3\.10
hybrid\_0\.1
autoai\-kb\_rt23\.1\-py3\.10
autoai\-ts\_rt23\.1\-py3\.10
autoai\-tsad\_rt23\.1\-py3\.10
autoai\-tsad\_rt22\.2\-py3\.10 | +| Decision Optimization | 20\.1 | do\-docplex\_20\.1
do\-opl\_20\.1
do\-cplex\_20\.1
do\-cpo\_20\.1 | do\_20\.1 | +| Decision Optimization | 22\.1 | do\-docplex\_22\.1
do\-opl\_22\.1
do\-cplex\_22\.1
do\-cpo\_22\.1 | do\_22\.1 | +| Hybrid/AutoML | 0\.1 | wml\-hybrid\_0\.1 | hybrid\_0\.1 | +| PMML | 3\.0 to 4\.3 | pmml*\. (or) pmml*\.\.\*3\.0 \- 4\.3 | pmml\-3\.0\_4\.3 | +| PyTorch | 1\.12 | pytorch\-onnx\_1\.12
pytorch\-onnx\_rt22\.2 | runtime\-22\.2\-py3\.10
pytorch\-onnx\_rt22\.2\-py3\.10
pytorch\-onnx\_rt22\.2\-py3\.10\-edt | +| PyTorch | 2\.0 | pytorch\-onnx\_2\.0
pytorch\-onnx\_rt23\.1 | runtime\-23\.1\-py3\.10
pytorch\-onnx\_rt23\.1\-py3\.10
pytorch\-onnx\_rt23\.1\-py3\.10\-edt
pytorch\-onnx\_rt23\.1\-py3\.10\-dist | +| Python Functions | 0\.1 | NA | runtime\-22\.2\-py3\.10
runtime\-23\.1\-py3\.10 | +| Python Scripts | 0\.1 | NA | runtime\-22\.2\-py3\.10
runtime\-23\.1\-py3\.10 | +| Scikit\-learn | 1\.1 | scikit\-learn\_1\.1 | runtime\-22\.2\-py3\.10
runtime\-23\.1\-py3\.10 | +| Spark | 3\.3 | mllib\_3\.3 | spark\-mllib\_3\.3 | +| SPSS | 17\.1 | spss\-modeler\_17\.1 | spss\-modeler\_17\.1 | +| SPSS | 18\.1 | spss\-modeler\_18\.1 | spss\-modeler\_18\.1 | +| SPSS | 18\.2 | spss\-modeler\_18\.2 | spss\-modeler\_18\.2 | +| Tensorflow | 2\.9 | tensorflow\_2\.9
tensorflow\_rt22\.2 | runtime\-22\.2\-py3\.10
tensorflow\_rt22\.2\-py3\.10 | +| Tensorflow | 2\.12 | tensorflow\_2\.12
tensorflow\_rt23\.1 | runtime\-23\.1\-py3\.10
tensorflow\_rt23\.1\-py3\.10\-dist
tensorflow\_rt23\.1\-py3\.10\-edt
tensorflow\_rt23\.1\-py3\.10 | +| XGBoost | 1\.6 | xgboost\_1\.6 or scikit\-learn\_1\.1 (see notes) | runtime\-22\.2\-py3\.10
runtime\-23\.1\-py3\.10 | + + + +When you have assets that rely on discontinued software specifications or frameworks, in some cases the migration is seamless\. In other cases, your action is required to retrain or redeploy assets\. + + + + * Existing deployments of models that are built with discontinued framework versions or software specifications are removed on the date of discontinuation\. + * No new deployments of models that are built with discontinued framework versions or software specifications are allowed\. + + + +## Learn more ## + + + + * To learn more about how to customize software specifications, see [Customizing with third\-party and private Python libraries](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-create-custom-software-spec.html)\. + * To learn more about how to use and customize environments, see [Environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html)\. + * To learn more about how to use software specifications for deployments, see the following Jupyter notebooks: + + + + * [Using REST API and cURL](https://github.com/IBM/watson-machine-learning-samples/tree/master/cloud/notebooks/rest_api/curl/deployments) + * [Using the Python client](https://github.com/IBM/watson-machine-learning-samples/tree/master/cloud/notebooks/python_sdk/deployments) + + + + + +**Parent topic:**[Frameworks and software specifications](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-frame-and-specs.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/14a06de43e6b08188a7672b5be8068a572de5b7c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/14a06de43e6b08188a7672b5be8068a572de5b7c.md new file mode 100644 index 0000000..db139a6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/14a06de43e6b08188a7672b5be8068a572de5b7c.md @@ -0,0 +1,19 @@ +# Scripting and automation + +# Scripting and automation # + +Scripting in SPSS Modeler is a powerful tool for automating processes in the user interface\. Scripts can perform the same types of actions that you perform with a mouse or a keyboard, and you can use them to automate tasks that would be highly repetitive or time consuming to perform manually\. + +You can use scripts to: + + + + * Impose a specific order for node executions in a flow\. + * Set properties for a node as well as perform derivations using a subset of CLEM (Control Language for Expression Manipulation)\. + * Specify an automatic sequence of actions that normally involves user interaction—for example, you can build a model and then test it\. + * Set up complex processes that require substantial user interaction—for example, cross\-validation procedures that require repeated model generation and testing\. + * Set up processes that manipulate flows—for example, you can take a model training flow, run it, and produce the corresponding model\-testing flow automatically\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/14f850b810e969ce2646d5641300fb407a6c49c5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/14f850b810e969ce2646d5641300fb407a6c49c5.md new file mode 100644 index 0000000..68bb5c3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/14f850b810e969ce2646d5641300fb407a6c49c5.md @@ -0,0 +1,11 @@ +# Strings + +# Strings # + +A string is an immutable sequence of characters that's treated as a value\. Strings support all of the immutable sequence functions and operators that result in a new string\. For example, `"abcdef"[1:4]` results in the output `"bcd"`\. + +In Python, characters are represented by strings of length one\. + +Strings literals are defined by the use of single or triple quoting\. Strings that are defined using single quotes can't span lines, while strings that are defined using triple quotes can\. You can enclose a string in single quotes (`'`) or double quotes (`"`)\. A quoting character may contain the other quoting character un\-escaped or the quoting character escaped, that's preceded by the backslash (`\`) character\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/156f8a58809d3a4d8f80d02481e5adde513edeaa.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/156f8a58809d3a4d8f80d02481e5adde513edeaa.md new file mode 100644 index 0000000..c1480ee --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/156f8a58809d3a4d8f80d02481e5adde513edeaa.md @@ -0,0 +1,108 @@ +# Concepts extraction block + +# Concepts extraction block # + +The Watson Natural Language Processing Concepts block extracts general DBPedia concepts (concepts drawn from language\-specific Wikipedia versions) that are directly referenced or alluded to, but not directly referenced, in the input text\. + +**Block name** + +`concepts_alchemy__stock` + +**Supported languages** + +The Concepts block is available for the following languages\. For a list of the language codes and the corresponding language, see [Language codes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html#lang-codes)\. + +de, en, es, fr, it, ja, ko, pt + +**Capabilities** + +Use this block to assign concepts from [DBPedia](https://www.dbpedia.org/) (2016 edition)\. The output types are based on DBPedia\. + +**Dependencies on other blocks** + +The following block must run before you can run the Concepts extraction block: + + + + * `syntax_izumo__stock` + + + +**Code sample** + + import watson_nlp + + # Load Syntax and a Concepts model for English + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + concepts_model = watson_nlp.load('concepts_alchemy_en_stock') + # Run the syntax model on the input text + syntax_prediction = syntax_model.run('IBM announced new advances in quantum computing') + + # Run the concepts model on the result of syntax + concepts = concepts_model.run(syntax_prediction) + print(concepts) + +Output of the code sample: + + { + "concepts": [ + { + "text": "IBM", + "relevance": 0.9842190146446228, + "dbpedia_resource": "http://dbpedia.org/resource/IBM" + }, + { + "text": "Quantum_computing", + "relevance": 0.9797260165214539, + "dbpedia_resource": "http://dbpedia.org/resource/Quantum_computing" + }, + { + "text": "Computing", + "relevance": 0.9080164432525635, + "dbpedia_resource": "http://dbpedia.org/resource/Computing" + }, + { + "text": "Shor's_algorithm", + "relevance": 0.7580527067184448, + "dbpedia_resource": "http://dbpedia.org/resource/Shor's_algorithm" + }, + { + "text": "Quantum_dot", + "relevance": 0.7069802284240723, + "dbpedia_resource": "http://dbpedia.org/resource/Quantum_dot" + }, + { + "text": "Quantum_algorithm", + "relevance": 0.7063655853271484, + "dbpedia_resource": "http://dbpedia.org/resource/Quantum_algorithm" + }, + { + "text": "Qubit", + "relevance": 0.7063655853271484, + "dbpedia_resource": "http://dbpedia.org/resource/Qubit" + }, + { + "text": "DNA_computing", + "relevance": 0.7044616341590881, + "dbpedia_resource": "http://dbpedia.org/resource/DNA_computing" + }, + { + "text": "Computation", + "relevance": 0.7044616341590881, + "dbpedia_resource": "http://dbpedia.org/resource/Computation" + }, + { + "text": "Computer", + "relevance": 0.7044616341590881, + "dbpedia_resource": "http://dbpedia.org/resource/Computer" + } + ], + "producer_id": { + "name": "Alchemy Concepts", + "version": "0.0.1" + } + } + +**Parent topic:**[Watson Natural Language Processing block catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/15a014c514b00ff78c689585f393e21bae922db2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/15a014c514b00ff78c689585f393e21bae922db2.md new file mode 100644 index 0000000..ef3b2cc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/15a014c514b00ff78c689585f393e21bae922db2.md @@ -0,0 +1,46 @@ +# Methods for tuning foundation models + +# Methods for tuning foundation models # + +Learn more about different tuning methods and how they work\. + +Models can be tuned in the following ways: + + + + * **Fine\-tuning**: Changes the parameters of the underlying foundation model to guide the model to generate output that is optimized for a task\. + + Note: You currently cannot fine-tune models in Tuning Studio. + * **Prompt\-tuning**: Adjusts the content of the prompt that is passed to the model to guide the model to generate output that matches a pattern you specify\. The underlying foundation model and its parameters are not edited\. Only the prompt input is altered\. + + When you prompt-tune a model, the underlying foundation model can be used to address different business needs without being retrained each time. As a result, you reduce computational needs and inference costs. + + + +## How prompt\-tuning works ## + +Foundation models are sensitive to the input that you give them\. Your input, or how you *prompt* the model, can introduce context that the model will use to tailor its generated output\. Prompt engineering to find the *right* prompt often works well\. However, it can be time\-consuming, error\-prone, and its effectiveness can be restricted by the context window length that is allowed by the underlying model\. + +Prompt\-tuning a model in the Tuning Studio applies machine learning to the task of prompt engineering\. Instead of adding words to the input itself, prompt\-tuning is a method for finding a sequence of values that, when added as a prefix to the input text, improve the model's ability to generate the output you want\. This sequence of values is called a *prompt vector*\. + +Normally, words in the prompt are vectorized by the model\. Vectorization is the process of converting text to tokens, and then to numbers defined by the model's tokenizer to identify the tokens\. Lastly, the token IDs are encoded, meaning they are converted into a vector representation, which is the input format that is expected by the embedding layer of the model\. Prompt\-tuning bypasses the model's text\-vectorization process and instead crafts a prompt vector directly\. This changeable prompt vector is concatenated to the vectorized input text and the two are passed as one input to the embedding layer of the model\. Values from this crafted prompt vector affect the word embedding weights that are set by the model and influence the words that the model chooses to add to the output\. + +To find the best values for the prompt vector, you run a tuning experiment\. You demonstrate the type of output that you want for a corresponding input by providing the model with input and output example pairs in training data\. With each training run of the experiment, the generated output is compared to the training data output\. Based on what it learns from differences between the two, the experiment adjusts the values in the prompt vector\. After many runs through the training data, the model finds the prompt vector that works best\. + +You can choose to start the training process by providing text that is vectorized by the experiment\. Or you can let the experiment use random values in the prompt vector\. Either way, unless the initial values are exactly right, they will be changed repeatedly as part of the training process\. Providing your own initialization text can help the experiment reach a good result more quickly\. + +The result of the experiment is a tuned version of the underlying model\. You submit input to the tuned model for inferencing and the model generates output that follows the tuned\-for pattern\. + +For more information about this tuning method, read the research paper named [The Power of Scale for Parameter\-Efficient Prompt Tuning](https://arxiv.org/abs/2104.08691)\. + +## Learn more ## + + + + * [Tuning parameters](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-parameters.html) + + + +**Parent topic:**[Tuning Studio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-studio.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/15d57c8193b99b8525bc2999ef82ef1cd7eae8ad.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/15d57c8193b99b8525bc2999ef82ef1cd7eae8ad.md new file mode 100644 index 0000000..afa4b1a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/15d57c8193b99b8525bc2999ef82ef1cd7eae8ad.md @@ -0,0 +1,58 @@ +# Watson Natural Language Processing task catalog + +# Watson Natural Language Processing task catalog # + +Watson Natural Language Processing encapsulates natural language functionality in standardized components called blocks or workflows\. Each block or workflow can be loaded and run in a notebook, some directly on input data, others in a given order\. + +This topic contains descriptions of the natural language processing tasks supported in the Watson Natural Language Processing library\. It lists the task names, the languages that are supported, dependencies to other blocks and includes sample code of how you use the natural language processing functionality in a Python notebook\. + +The following natural language processing tasks are supported as blocks or workflows in the Watson Natural Language Processing library: + + + + * [Language detection](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-language-detection.html) + * [Syntax analysis](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-syntax.html) + * [Noun phrase extraction](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-noun-phrase.html) + * [Keyword extraction and ranking](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-keyword.html) + * [Entity extraction](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-entity-enhanced.html) + * [Sentiment classification](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-sentiment.html) + * [Tone classification](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-tone.html) + * [Emotion classification](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-emotion.html) + * [Concepts extraction](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-concept-ext.html) + * [Relations extraction](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-relation-extraction.html) + * [Hierarchical text categorization](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-hierarchical-cat.html) + + + +## Language codes ## + +Many of the pre\-trained models are available in many languages\. The following table lists the language codes and the corresponding language\. + + + +Language codes and their corresponding language equivalents + +| Language code | Corresponding language | Language code | Corresponding language | +| ------------- | ---------------------- | ------------- | ---------------------- | +| af | Afrikaans | ar | Arabic | +| bs | Bosnian | ca | Catalan | +| cs | Czech | da | Danish | +| de | German | el | Greek | +| en | English | es | Spanish | +| fi | Finnish | fr | French | +| he | Hebrew | hi | Hindi | +| hr | Croatian | it | Italian | +| ja | Japanese | ko | Korean | +| nb | Norwegian Bokmål | nl | Dutch | +| nn | Norwegian Nynorsk | pl | Polish | +| pt | Portuguese | ro | Romanian | +| ru | Russian | sk | Slovak | +| sr | Serbian | sv | Swedish | +| tr | Turkish | zh\_cn | Chinese (Simplified) | +| zh\_tw | Chinese (Traditional) | + + + +**Parent topic:**[Watson Natural language Processing library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/16048584b029b9be5da50d7f9d9ae85ffe740718.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/16048584b029b9be5da50d7f9d9ae85ffe740718.md new file mode 100644 index 0000000..78838f3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/16048584b029b9be5da50d7f9d9ae85ffe740718.md @@ -0,0 +1,53 @@ +# discriminantnode properties + +# discriminantnode properties # + +![Discriminant node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/discriminantnodeicon.png)Discriminant analysis makes more stringent assumptions than logistic regression, but can be a valuable alternative or supplement to a logistic regression analysis when those assumptions are met\. + + + +discriminantnode properties + +Table 1\. discriminantnode properties + +| `discriminantnode` Properties | Values | Property description | +| --------------------------------- | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `target` | *field* | Discriminant models require a single target field and one or more input fields\. Weight and frequency fields aren't used\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `method` | `Enter`
`Stepwise` | | +| `mode` | `Simple`
`Expert` | | +| `prior_probabilities` | `AllEqual`
`ComputeFromSizes` | | +| `covariance_matrix` | `WithinGroups`
`SeparateGroups` | | +| `means` | *flag* | Statistics options in the node properties under Expert Options\. | +| `univariate_anovas` | *flag* | | +| `box_m` | *flag* | | +| `within_group_covariance` | *flag* | | +| `within_groups_correlation` | *flag* | | +| `separate_groups_covariance` | *flag* | | +| `total_covariance` | *flag* | | +| `fishers` | *flag* | | +| `unstandardized` | *flag* | | +| `casewise_results` | *flag* | Classification options in the node properties under Expert Options\. | +| `limit_to_first` | *number* | Default value is 10\. | +| `summary_table` | *flag* | | +| `leave_one_classification` | *flag* | | +| `separate_groups_covariance` | *flag* | Matrices option Separate\-groups covariance\. | +| `territorial_map` | *flag* | | +| `combined_groups` | *flag* | Plot option Combined\-groups\. | +| `separate_groups` | *flag* | Plot option Separate\-groups\. | +| `summary_of_steps` | *flag* | | +| `F_pairwise` | *flag* | | +| `stepwise_method``` | `WilksLambda`
`UnexplainedVariance`
`MahalanobisDistance`
`SmallestF`
`RaosV` | | +| `V_to_enter` | *number* | | +| `criteria` | `UseValue`
`UseProbability` | | +| `F_value_entry` | *number* | Default value is 3\.84\. | +| `F_value_removal` | *number* | Default value is 2\.71\. | +| `probability_entry` | *number* | Default value is 0\.05\. | +| `probability_removal` | *number* | Default value is 0\.10\. | +| `calculate_variable_importance` | *flag* | | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `adjusted_propensity_partition` | `Test`
`Validation` | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/163eeb3dbaff3b01d831f717eeb7487642c93080.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/163eeb3dbaff3b01d831f717eeb7487642c93080.md new file mode 100644 index 0000000..7361a13 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/163eeb3dbaff3b01d831f717eeb7487642c93080.md @@ -0,0 +1,62 @@ +# Troubleshooting AutoAI experiments + +# Troubleshooting AutoAI experiments # + +The following list contains the common problems that are known for AutoAI\. If your AutoAI experiment fails to run or deploy successfully, review some of these common problems and resolutions\. + +## Passing incomplete or outlier input value to deployment can lead to outlier prediction ## + +After you deploy your machine learning model, note that providing input data that is markedly different from data that is used to train the model can produce an outlier prediction\. When linear regression algorithms such as Ridge and LinearRegression are passed an out of scale input value, the model extrapolates the values and assigns a relatively large weight to it, producing a score that is not in line with conforming data\. + +## Time Series pipeline with supporting features fails on retrieval ## + +If you train an AutoAI Time Series experiment by using supporting features and you get the error 'Error: name 'tspy\_interpolators' is not defined' when the system tries to retrieve the pipeline for predictions, check to make sure your system is running Java 8 or higher\. + +## Running a pipeline or experiment notebook fails with a software specification error ## + +If supported software specifications for AutoAI experiments change, you might get an error when you run a notebook built with an older software specification, such as an older version of Python\. In this case, run the experiment again, then save a new notebook and try again\. + +## Resolving an Out of Memory error ## + +If you get a memory error when you run a cell from an AutoAI generated notebook, create a notebook runtime with more resources for the AutoAI notebook and execute the cell again\. + +## Notebook for an experiment with subsampling can fail generating predictions ## + +If you do pipeline refinery to prepare the model, and the experiment uses subsampling of the data during training, you might encounter an “unknown class” error when you run a notebook that is saved from the experiment\. + +The problem stems from an unknown class that is not included in the training data set\. The workaround is to use the entire data set for training or re\-create the subsampling that is used in the experiment\. + +To subsample the training data (before `fit()`), provide sample size by number of rows or by fraction of the sample (as done in the experiment)\. + + + + * If number of records was used in subsampling settings, you can increase the value of `n`\. For example: + + train_df = train_df.sample(n=1000) + * If subsampling is represented as a fraction of the data set, increase the value of `frac`\. For example: + + train_df = train_df.sample(frac=0.4, random_state=experiment_metadata['random_state']) + + + +## Pipeline creation fails for binary classification ## + +AutoAI analyzes a subset of the data to determine the best fit for experiment type\. If the sample data in the prediction column contains only two values, AutoAI recommends a binary classification experiment and applies the related algorithms\. However, if the full data set contains more than two values in the prediction column the binary classification fails and you get an error that indicates that AutoAI cannot create the pipelines\. + +In this case, manually change the experiment type from binary to either multiclass, for a defined set of values, or regression, for an unspecified set of values\. + + + +1. Click the **Reconfigure Experiment** icon to edit the experiment settings\. +2. On the *Prediction* page of Experiment Settings, change the prediction type to the one that best matches the data in the prediction column\. +3. Save the changes and run the experiment again\. + + + +## Next steps ## + +[AutoAI overview](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) + +**Parent topic:**[AutoAI overview](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/167d5677958594ba275e34b8748f7e8091782560.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/167d5677958594ba275e34b8748f7e8091782560.md new file mode 100644 index 0000000..d0d2b89 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/167d5677958594ba275e34b8748f7e8091782560.md @@ -0,0 +1,48 @@ +# Decision Optimization experiment UI views and scenarios + +# Decision Optimization experiment views and scenarios # + +The Decision Optimization experiment UI has different views in which you can select data, create models, solve different scenarios, and visualize the results\. + +Quick links to sections: + + + + * [ Overview](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html?context=cdpaas&locale=en#ModelBuilderInterface__section_overview) + * [Hardware and software configuration](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html?context=cdpaas&locale=en#ModelBuilderInterface__section_environment) + * [Prepare data view](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html?context=cdpaas&locale=en#ModelBuilderInterface__section_preparedata) + * [Build model view](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html?context=cdpaas&locale=en#ModelBuilderInterface__ModelView) + * [Multiple model files](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html?context=cdpaas&locale=en#ModelBuilderInterface__section_g21_p5n_plb) + * [Run models](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html?context=cdpaas&locale=en#ModelBuilderInterface__runmodel) + * [Run configuration](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html?context=cdpaas&locale=en#ModelBuilderInterface__section_runconfig) + * [Run environment tab](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html?context=cdpaas&locale=en#ModelBuilderInterface__envtabConfigRun) + * [Explore solution view](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html?context=cdpaas&locale=en#ModelBuilderInterface__solution) + * [Scenario pane](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html?context=cdpaas&locale=en#ModelBuilderInterface__scenariopanel) + * [Generating notebooks from scenarios](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html?context=cdpaas&locale=en#ModelBuilderInterface__generateNB) + * [Importing scenarios](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html?context=cdpaas&locale=en#ModelBuilderInterface__p_Importingscenarios) + * [Exporting scenarios](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html?context=cdpaas&locale=en#ModelBuilderInterface__p_Exportingscenarios) + + + +Note: To create and run Optimization models, you must have both a Machine Learning service added to your project and a deployment space that is associated with your experiment: + + + +1. Add a [**Machine Learning** service](https://cloud.ibm.com/catalog/services/machine-learning) to your project\. You can either add this service at the project level (see [Creating a Watson Machine Learning Service instance](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-service-instance.html)), or you can add it when you first create a new Decision Optimization experiment: click Add a Machine Learning service, select, or create a New service, click Associate, then close the window\. +2. Associate a [**deployment space**](https://dataplatform.cloud.ibm.com/ml-runtime/spaces) with your Decision Optimization experiment (see [Deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html#create))\. A deployment space can be created or selected when you first create a new Decision Optimization experiment: click Create a deployment space, enter a name for your deployment space, and click Create\. For existing models, you can also create, or select a space in the [Overview](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface__section_overview) information pane\. + + + +When you add a **Decision Optimization experiment** as an asset in your project, you open the **Decision Optimization experiment UI**\. + +With the Decision Optimization experiment UI, you can create and solve prescriptive optimization models that focus on the specific business problem that you want to solve\. To edit and solve models, you must have Admin or Editor roles in the project\. Viewers of shared projects can only see experiments, but cannot modify or run them\. + +You can create a Decision Optimization model from scratch by entering a name or by choosing a `.zip` file, and then selecting Create\. Scenario 1 opens\. + +With the Decision Optimization experiment UI, you can create several scenarios, with different data sets and optimization models\. Thus, you, can create and compare different scenarios and see what impact changes can have on a problem\. + +For a step\-by\-step guide to build, solve and deploy a Decision Optimization model, by using the user interface, see the [Quick start tutorial with video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html)\. + +For each of the following views, you can organize your screen as full\-screen or as a **split\-screen**\. To do so, hover over one of the view tabs ( Prepare data, Build model, Explore solution) for a second or two\. A menu then appears where you can select Full Screen, Left or Right\. For example, if you choose Left for the Prepare data view, and then choose Right for the Explore solution view, you can see both these views on the same screen\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/17470065afc59337b207721ab539b4622bbb3055.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/17470065afc59337b207721ab539b4622bbb3055.md new file mode 100644 index 0000000..3db8f66 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/17470065afc59337b207721ab539b4622bbb3055.md @@ -0,0 +1,9 @@ +# Scripting with Python for Spark (SPSS Modeler) + +# Scripting with Python for Spark # + +SPSS Modeler can run Python scripts using the Apache Spark framework to process data\. This documentation provides the Python API description for the interfaces provided\. + +The SPSS Modeler installation includes a Spark distribution\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/174d6fdf73627d7b2258d7f351c3d0156c06d1dc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/174d6fdf73627d7b2258d7f351c3d0156c06d1dc.md new file mode 100644 index 0000000..9361961 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/174d6fdf73627d7b2258d7f351c3d0156c06d1dc.md @@ -0,0 +1,714 @@ +# Category types + +# Category types # + +The categories that are returned by the the Watson Natural Language Processing Categories block are based on the IAB Tech Lab Content Taxonomy, which provides common language categories that can be used when describing content\. + +The following table lists the IAB categories taxonomy returned by the Categories block\. + + + +| LEVEL 1 | LEVEL 2 | LEVEL 3 | LEVEL 4 | +| ------------------------ | ----------------------------------- | ---------------------------------------------- | ------------------------------------ | +| Automotive | | | | +| Automotive | Auto Body Styles | | | +| Automotive | Auto Body Styles | Commercial Trucks | | +| Automotive | Auto Body Styles | Sedan | | +| Automotive | Auto Body Styles | Station Wagon | | +| Automotive | Auto Body Styles | SUV | | +| Automotive | Auto Body Styles | Van | | +| Automotive | Auto Body Styles | Convertible | | +| Automotive | Auto Body Styles | Coupe | | +| Automotive | Auto Body Styles | Crossover | | +| Automotive | Auto Body Styles | Hatchback | | +| Automotive | Auto Body Styles | Microcar | | +| Automotive | Auto Body Styles | Minivan | | +| Automotive | Auto Body Styles | Off\-Road Vehicles | | +| Automotive | Auto Body Styles | Pickup Trucks | | +| Automotive | Auto Type | | | +| Automotive | Auto Type | Budget Cars | | +| Automotive | Auto Type | Certified Pre\-Owned Cars | | +| Automotive | Auto Type | Classic Cars | | +| Automotive | Auto Type | Concept Cars | | +| Automotive | Auto Type | Driverless Cars | | +| Automotive | Auto Type | Green Vehicles | | +| Automotive | Auto Type | Luxury Cars | | +| Automotive | Auto Type | Performance Cars | | +| Automotive | Car Culture | | | +| Automotive | Dash Cam Videos | | | +| Automotive | Motorcycles | | | +| Automotive | Road\-Side Assistance | | | +| Automotive | Scooters | | | +| Automotive | Auto Buying and Selling | | | +| Automotive | Auto Insurance | | | +| Automotive | Auto Parts | | | +| Automotive | Auto Recalls | | | +| Automotive | Auto Repair | | | +| Automotive | Auto Safety | | | +| Automotive | Auto Shows | | | +| Automotive | Auto Technology | | | +| Automotive | Auto Technology | Auto Infotainment Technologies | | +| Automotive | Auto Technology | Auto Navigation Systems | | +| Automotive | Auto Technology | Auto Safety Technologies | | +| Automotive | Auto Rentals | | | +| Books and Literature | | | | +| Books and Literature | Art and Photography Books | | | +| Books and Literature | Biographies | | | +| Books and Literature | Children's Literature | | | +| Books and Literature | Comics and Graphic Novels | | | +| Books and Literature | Cookbooks | | | +| Books and Literature | Fiction | | | +| Books and Literature | Poetry | | | +| Books and Literature | Travel Books | | | +| Books and Literature | Young Adult Literature | | | +| Business and Finance | | | | +| Business and Finance | Business | | | +| Business and Finance | Business | Business Accounting & Finance | | +| Business and Finance | Business | Human Resources | | +| Business and Finance | Business | Large Business | | +| Business and Finance | Business | Logistics | | +| Business and Finance | Business | Marketing and Advertising | | +| Business and Finance | Business | Sales | | +| Business and Finance | Business | Small and Medium\-sized Business | | +| Business and Finance | Business | Startups | | +| Business and Finance | Business | Business Administration | | +| Business and Finance | Business | Business Banking & Finance | | +| Business and Finance | Business | Business Banking & Finance | Angel Investment | +| Business and Finance | Business | Business Banking & Finance | Bankruptcy | +| Business and Finance | Business | Business Banking & Finance | Business Loans | +| Business and Finance | Business | Business Banking & Finance | Debt Factoring & Invoice Discounting | +| Business and Finance | Business | Business Banking & Finance | Mergers and Acquisitions | +| Business and Finance | Business | Business Banking & Finance | Private Equity | +| Business and Finance | Business | Business Banking & Finance | Sale & Lease Back | +| Business and Finance | Business | Business Banking & Finance | Venture Capital | +| Business and Finance | Business | Business I\.T\. | | +| Business and Finance | Business | Business Operations | | +| Business and Finance | Business | Consumer Issues | | +| Business and Finance | Business | Consumer Issues | Recalls | +| Business and Finance | Business | Executive Leadership & Management | | +| Business and Finance | Business | Government Business | | +| Business and Finance | Business | Green Solutions | | +| Business and Finance | Business | Business Utilities | | +| Business and Finance | Economy | | | +| Business and Finance | Economy | Commodities | | +| Business and Finance | Economy | Currencies | | +| Business and Finance | Economy | Financial Crisis | | +| Business and Finance | Economy | Financial Reform | | +| Business and Finance | Economy | Financial Regulation | | +| Business and Finance | Economy | Gasoline Prices | | +| Business and Finance | Economy | Housing Market | | +| Business and Finance | Economy | Interest Rates | | +| Business and Finance | Economy | Job Market | | +| Business and Finance | Industries | | | +| Business and Finance | Industries | Advertising Industry | | +| Business and Finance | Industries | Education industry | | +| Business and Finance | Industries | Entertainment Industry | | +| Business and Finance | Industries | Environmental Services Industry | | +| Business and Finance | Industries | Financial Industry | | +| Business and Finance | Industries | Food Industry | | +| Business and Finance | Industries | Healthcare Industry | | +| Business and Finance | Industries | Hospitality Industry | | +| Business and Finance | Industries | Information Services Industry | | +| Business and Finance | Industries | Legal Services Industry | | +| Business and Finance | Industries | Logistics and Transportation Industry | | +| Business and Finance | Industries | Agriculture | | +| Business and Finance | Industries | Management Consulting Industry | | +| Business and Finance | Industries | Manufacturing Industry | | +| Business and Finance | Industries | Mechanical and Industrial Engineering Industry | | +| Business and Finance | Industries | Media Industry | | +| Business and Finance | Industries | Metals Industry | | +| Business and Finance | Industries | Non\-Profit Organizations | | +| Business and Finance | Industries | Pharmaceutical Industry | | +| Business and Finance | Industries | Power and Energy Industry | | +| Business and Finance | Industries | Publishing Industry | | +| Business and Finance | Industries | Real Estate Industry | | +| Business and Finance | Industries | Apparel Industry | | +| Business and Finance | Industries | Retail Industry | | +| Business and Finance | Industries | Technology Industry | | +| Business and Finance | Industries | Telecommunications Industry | | +| Business and Finance | Industries | Automotive Industry | | +| Business and Finance | Industries | Aviation Industry | | +| Business and Finance | Industries | Biotech and Biomedical Industry | | +| Business and Finance | Industries | Civil Engineering Industry | | +| Business and Finance | Industries | Construction Industry | | +| Business and Finance | Industries | Defense Industry | | +| Careers | | | | +| Careers | Apprenticeships | | | +| Careers | Career Advice | | | +| Careers | Career Planning | | | +| Careers | Job Search | | | +| Careers | Job Search | Job Fairs | | +| Careers | Job Search | Resume Writing and Advice | | +| Careers | Remote Working | | | +| Careers | Vocational Training | | | +| Education | | | | +| Education | Adult Education | | | +| Education | Private School | | | +| Education | Secondary Education | | | +| Education | Special Education | | | +| Education | College Education | | | +| Education | College Education | College Planning | | +| Education | College Education | Postgraduate Education | | +| Education | College Education | Postgraduate Education | Professional School | +| Education | College Education | Undergraduate Education | | +| Education | Early Childhood Education | | | +| Education | Educational Assessment | | | +| Education | Educational Assessment | Standardized Testing | | +| Education | Homeschooling | | | +| Education | Homework and Study | | | +| Education | Language Learning | | | +| Education | Online Education | | | +| Education | Primary Education | | | +| Events and Attractions | | | | +| Events and Attractions | Amusement and Theme Parks | | | +| Events and Attractions | Fashion Events | | | +| Events and Attractions | Historic Site and Landmark Tours | | | +| Events and Attractions | Malls & Shopping Centers | | | +| Events and Attractions | Museums & Galleries | | | +| Events and Attractions | Musicals | | | +| Events and Attractions | National & Civic Holidays | | | +| Events and Attractions | Nightclubs | | | +| Events and Attractions | Outdoor Activities | | | +| Events and Attractions | Parks & Nature | | | +| Events and Attractions | Party Supplies and Decorations | | | +| Events and Attractions | Awards Shows | | | +| Events and Attractions | Personal Celebrations & Life Events | | | +| Events and Attractions | Personal Celebrations & Life Events | Anniversary | | +| Events and Attractions | Personal Celebrations & Life Events | Wedding | | +| Events and Attractions | Personal Celebrations & Life Events | Baby Shower | | +| Events and Attractions | Personal Celebrations & Life Events | Bachelor Party | | +| Events and Attractions | Personal Celebrations & Life Events | Bachelorette Party | | +| Events and Attractions | Personal Celebrations & Life Events | Birth | | +| Events and Attractions | Personal Celebrations & Life Events | Birthday | | +| Events and Attractions | Personal Celebrations & Life Events | Funeral | | +| Events and Attractions | Personal Celebrations & Life Events | Graduation | | +| Events and Attractions | Personal Celebrations & Life Events | Prom | | +| Events and Attractions | Political Event | | | +| Events and Attractions | Religious Events | | | +| Events and Attractions | Sporting Events | | | +| Events and Attractions | Theater Venues and Events | | | +| Events and Attractions | Zoos & Aquariums | | | +| Events and Attractions | Bars & Restaurants | | | +| Events and Attractions | Business Expos & Conferences | | | +| Events and Attractions | Casinos & Gambling | | | +| Events and Attractions | Cinemas and Events | | | +| Events and Attractions | Comedy Events | | | +| Events and Attractions | Concerts & Music Events | | | +| Events and Attractions | Fan Conventions | | | +| Family and Relationships | | | | +| Family and Relationships | Bereavement | | | +| Family and Relationships | Dating | | | +| Family and Relationships | Divorce | | | +| Family and Relationships | Eldercare | | | +| Family and Relationships | Marriage and Civil Unions | | | +| Family and Relationships | Parenting | | | +| Family and Relationships | Parenting | Adoption and Fostering | | +| Family and Relationships | Parenting | Daycare and Pre\-School | | +| Family and Relationships | Parenting | Internet Safety | | +| Family and Relationships | Parenting | Parenting Babies and Toddlers | | +| Family and Relationships | Parenting | Parenting Children Aged 4\-11 | | +| Family and Relationships | Parenting | Parenting Teens | | +| Family and Relationships | Parenting | Special Needs Kids | | +| Family and Relationships | Single Life | | | +| Fine Art | | | | +| Fine Art | Costume | | | +| Fine Art | Dance | | | +| Fine Art | Design | | | +| Fine Art | Digital Arts | | | +| Fine Art | Fine Art Photography | | | +| Fine Art | Modern Art | | | +| Fine Art | Opera | | | +| Fine Art | Theater | | | +| Food & Drink | | | | +| Food & Drink | Alcoholic Beverages | | | +| Food & Drink | Vegan Diets | | | +| Food & Drink | Vegetarian Diets | | | +| Food & Drink | World Cuisines | | | +| Food & Drink | Barbecues and Grilling | | | +| Food & Drink | Cooking | | | +| Food & Drink | Desserts and Baking | | | +| Food & Drink | Dining Out | | | +| Food & Drink | Food Allergies | | | +| Food & Drink | Food Movements | | | +| Food & Drink | Healthy Cooking and Eating | | | +| Food & Drink | Non\-Alcoholic Beverages | | | +| Healthy Living | | | | +| Healthy Living | Children's Health | | | +| Healthy Living | Fitness and Exercise | | | +| Healthy Living | Fitness and Exercise | Participant Sports | | +| Healthy Living | Fitness and Exercise | Running and Jogging | | +| Healthy Living | Men's Health | | | +| Healthy Living | Nutrition | | | +| Healthy Living | Senior Health | | | +| Healthy Living | Weight Loss | | | +| Healthy Living | Wellness | | | +| Healthy Living | Wellness | Alternative Medicine | | +| Healthy Living | Wellness | Alternative Medicine | Herbs and Supplements | +| Healthy Living | Wellness | Alternative Medicine | Holistic Health | +| Healthy Living | Wellness | Physical Therapy | | +| Healthy Living | Wellness | Smoking Cessation | | +| Healthy Living | Women's Health | | | +| Hobbies & Interests | | | | +| Hobbies & Interests | Antiquing and Antiques | | | +| Hobbies & Interests | Magic and Illusion | | | +| Hobbies & Interests | Model Toys | | | +| Hobbies & Interests | Musical Instruments | | | +| Hobbies & Interests | Paranormal Phenomena | | | +| Hobbies & Interests | Radio Control | | | +| Hobbies & Interests | Sci\-fi and Fantasy | | | +| Hobbies & Interests | Workshops and Classes | | | +| Hobbies & Interests | Arts and Crafts | | | +| Hobbies & Interests | Arts and Crafts | Beadwork | | +| Hobbies & Interests | Arts and Crafts | Candle and Soap Making | | +| Hobbies & Interests | Arts and Crafts | Drawing and Sketching | | +| Hobbies & Interests | Arts and Crafts | Jewelry Making | | +| Hobbies & Interests | Arts and Crafts | Needlework | | +| Hobbies & Interests | Arts and Crafts | Painting | | +| Hobbies & Interests | Arts and Crafts | Photography | | +| Hobbies & Interests | Arts and Crafts | Scrapbooking | | +| Hobbies & Interests | Arts and Crafts | Woodworking | | +| Hobbies & Interests | Beekeeping | | | +| Hobbies & Interests | Birdwatching | | | +| Hobbies & Interests | Cigars | | | +| Hobbies & Interests | Collecting | | | +| Hobbies & Interests | Collecting | Comic Books | | +| Hobbies & Interests | Collecting | Stamps and Coins | | +| Hobbies & Interests | Content Production | | | +| Hobbies & Interests | Content Production | Audio Production | | +| Hobbies & Interests | Content Production | Freelance Writing | | +| Hobbies & Interests | Content Production | Screenwriting | | +| Hobbies & Interests | Content Production | Video Production | | +| Hobbies & Interests | Games and Puzzles | | | +| Hobbies & Interests | Games and Puzzles | Board Games and Puzzles | | +| Hobbies & Interests | Games and Puzzles | Card Games | | +| Hobbies & Interests | Games and Puzzles | Roleplaying Games | | +| Hobbies & Interests | Genealogy and Ancestry | | | +| Home & Garden | | | | +| Home & Garden | Gardening | | | +| Home & Garden | Remodeling & Construction | | | +| Home & Garden | Smart Home | | | +| Home & Garden | Home Appliances | | | +| Home & Garden | Home Entertaining | | | +| Home & Garden | Home Improvement | | | +| Home & Garden | Home Security | | | +| Home & Garden | Indoor Environmental Quality | | | +| Home & Garden | Interior Decorating | | | +| Home & Garden | Landscaping | | | +| Home & Garden | Outdoor Decorating | | | +| Medical Health | | | | +| Medical Health | Diseases and Conditions | | | +| Medical Health | Diseases and Conditions | Allergies | | +| Medical Health | Diseases and Conditions | Ear, Nose and Throat Conditions | | +| Medical Health | Diseases and Conditions | Endocrine and Metabolic Diseases | | +| Medical Health | Diseases and Conditions | Endocrine and Metabolic Diseases | Hormonal Disorders | +| Medical Health | Diseases and Conditions | Endocrine and Metabolic Diseases | Menopause | +| Medical Health | Diseases and Conditions | Endocrine and Metabolic Diseases | Thyroid Disorders | +| Medical Health | Diseases and Conditions | Eye and Vision Conditions | | +| Medical Health | Diseases and Conditions | Foot Health | | +| Medical Health | Diseases and Conditions | Heart and Cardiovascular Diseases | | +| Medical Health | Diseases and Conditions | Infectious Diseases | | +| Medical Health | Diseases and Conditions | Injuries | | +| Medical Health | Diseases and Conditions | Injuries | First Aid | +| Medical Health | Diseases and Conditions | Lung and Respiratory Health | | +| Medical Health | Diseases and Conditions | Mental Health | | +| Medical Health | Diseases and Conditions | Reproductive Health | | +| Medical Health | Diseases and Conditions | Reproductive Health | Birth Control | +| Medical Health | Diseases and Conditions | Reproductive Health | Infertility | +| Medical Health | Diseases and Conditions | Reproductive Health | Pregnancy | +| Medical Health | Diseases and Conditions | Blood Disorders | | +| Medical Health | Diseases and Conditions | Sexual Health | | +| Medical Health | Diseases and Conditions | Sexual Health | Sexual Conditions | +| Medical Health | Diseases and Conditions | Skin and Dermatology | | +| Medical Health | Diseases and Conditions | Sleep Disorders | | +| Medical Health | Diseases and Conditions | Substance Abuse | | +| Medical Health | Diseases and Conditions | Bone and Joint Conditions | | +| Medical Health | Diseases and Conditions | Brain and Nervous System Disorders | | +| Medical Health | Diseases and Conditions | Cancer | | +| Medical Health | Diseases and Conditions | Cold and Flu | | +| Medical Health | Diseases and Conditions | Dental Health | | +| Medical Health | Diseases and Conditions | Diabetes | | +| Medical Health | Diseases and Conditions | Digestive Disorders | | +| Medical Health | Medical Tests | | | +| Medical Health | Pharmaceutical Drugs | | | +| Medical Health | Surgery | | | +| Medical Health | Vaccines | | | +| Medical Health | Cosmetic Medical Services | | | +| Movies | | | | +| Movies | Action and Adventure Movies | | | +| Movies | Romance Movies | | | +| Movies | Science Fiction Movies | | | +| Movies | Indie and Arthouse Movies | | | +| Movies | Animation Movies | | | +| Movies | Comedy Movies | | | +| Movies | Crime and Mystery Movies | | | +| Movies | Documentary Movies | | | +| Movies | Drama Movies | | | +| Movies | Family and Children Movies | | | +| Movies | Fantasy Movies | | | +| Movies | Horror Movies | | | +| Movies | World Movies | | | +| Music and Audio | | | | +| Music and Audio | Adult Contemporary Music | | | +| Music and Audio | Adult Contemporary Music | Soft AC Music | | +| Music and Audio | Adult Contemporary Music | Urban AC Music | | +| Music and Audio | Adult Album Alternative | | | +| Music and Audio | Alternative Music | | | +| Music and Audio | Children's Music | | | +| Music and Audio | Classic Hits | | | +| Music and Audio | Classical Music | | | +| Music and Audio | College Radio | | | +| Music and Audio | Comedy (Music and Audio) | | | +| Music and Audio | Contemporary Hits/Pop/Top 40 | | | +| Music and Audio | Country Music | | | +| Music and Audio | Dance and Electronic Music | | | +| Music and Audio | World/International Music | | | +| Music and Audio | Songwriters/Folk | | | +| Music and Audio | Gospel Music | | | +| Music and Audio | Hip Hop Music | | | +| Music and Audio | Inspirational/New Age Music | | | +| Music and Audio | Jazz | | | +| Music and Audio | Oldies/Adult Standards | | | +| Music and Audio | Reggae | | | +| Music and Audio | Blues | | | +| Music and Audio | Religious (Music and Audio) | | | +| Music and Audio | R&B/Soul/Funk | | | +| Music and Audio | Rock Music | | | +| Music and Audio | Rock Music | Album\-oriented Rock | | +| Music and Audio | Rock Music | Alternative Rock | | +| Music and Audio | Rock Music | Classic Rock | | +| Music and Audio | Rock Music | Hard Rock | | +| Music and Audio | Rock Music | Soft Rock | | +| Music and Audio | Soundtracks, TV and Showtunes | | | +| Music and Audio | Sports Radio | | | +| Music and Audio | Talk Radio | | | +| Music and Audio | Talk Radio | Business News Radio | | +| Music and Audio | Talk Radio | Educational Radio | | +| Music and Audio | Talk Radio | News Radio | | +| Music and Audio | Talk Radio | News/Talk Radio | | +| Music and Audio | Talk Radio | Public Radio | | +| Music and Audio | Urban Contemporary Music | | | +| Music and Audio | Variety (Music and Audio) | | | +| News and Politics | | | | +| News and Politics | Crime | | | +| News and Politics | Disasters | | | +| News and Politics | International News | | | +| News and Politics | Law | | | +| News and Politics | Local News | | | +| News and Politics | National News | | | +| News and Politics | Politics | | | +| News and Politics | Politics | Elections | | +| News and Politics | Politics | Political Issues | | +| News and Politics | Politics | War and Conflicts | | +| News and Politics | Weather | | | +| Personal Finance | | | | +| Personal Finance | Consumer Banking | | | +| Personal Finance | Financial Assistance | | | +| Personal Finance | Financial Assistance | Government Support and Welfare | | +| Personal Finance | Financial Assistance | Student Financial Aid | | +| Personal Finance | Financial Planning | | | +| Personal Finance | Frugal Living | | | +| Personal Finance | Insurance | | | +| Personal Finance | Insurance | Health Insurance | | +| Personal Finance | Insurance | Home Insurance | | +| Personal Finance | Insurance | Life Insurance | | +| Personal Finance | Insurance | Motor Insurance | | +| Personal Finance | Insurance | Pet Insurance | | +| Personal Finance | Insurance | Travel Insurance | | +| Personal Finance | Personal Debt | | | +| Personal Finance | Personal Debt | Credit Cards | | +| Personal Finance | Personal Debt | Home Financing | | +| Personal Finance | Personal Debt | Personal Loans | | +| Personal Finance | Personal Debt | Student Loans | | +| Personal Finance | Personal Investing | | | +| Personal Finance | Personal Investing | Hedge Funds | | +| Personal Finance | Personal Investing | Mutual Funds | | +| Personal Finance | Personal Investing | Options | | +| Personal Finance | Personal Investing | Stocks and Bonds | | +| Personal Finance | Personal Taxes | | | +| Personal Finance | Retirement Planning | | | +| Personal Finance | Home Utilities | | | +| Personal Finance | Home Utilities | Gas and Electric | | +| Personal Finance | Home Utilities | Internet Service Providers | | +| Personal Finance | Home Utilities | Phone Services | | +| Personal Finance | Home Utilities | Water Services | | +| Pets | | | | +| Pets | Birds | | | +| Pets | Cats | | | +| Pets | Dogs | | | +| Pets | Fish and Aquariums | | | +| Pets | Large Animals | | | +| Pets | Pet Adoptions | | | +| Pets | Reptiles | | | +| Pets | Veterinary Medicine | | | +| Pets | Pet Supplies | | | +| Pop Culture | | | | +| Pop Culture | Celebrity Deaths | | | +| Pop Culture | Celebrity Families | | | +| Pop Culture | Celebrity Homes | | | +| Pop Culture | Celebrity Pregnancy | | | +| Pop Culture | Celebrity Relationships | | | +| Pop Culture | Celebrity Scandal | | | +| Pop Culture | Celebrity Style | | | +| Pop Culture | Humor and Satire | | | +| Real Estate | | | | +| Real Estate | Apartments | | | +| Real Estate | Retail Property | | | +| Real Estate | Vacation Properties | | | +| Real Estate | Developmental Sites | | | +| Real Estate | Hotel Properties | | | +| Real Estate | Houses | | | +| Real Estate | Industrial Property | | | +| Real Estate | Land and Farms | | | +| Real Estate | Office Property | | | +| Real Estate | Real Estate Buying and Selling | | | +| Real Estate | Real Estate Renting and Leasing | | | +| Religion & Spirituality | | | | +| Religion & Spirituality | Agnosticism | | | +| Religion & Spirituality | Spirituality | | | +| Religion & Spirituality | Astrology | | | +| Religion & Spirituality | Atheism | | | +| Religion & Spirituality | Buddhism | | | +| Religion & Spirituality | Christianity | | | +| Religion & Spirituality | Hinduism | | | +| Religion & Spirituality | Islam | | | +| Religion & Spirituality | Judaism | | | +| Religion & Spirituality | Sikhism | | | +| Science | | | | +| Science | Biological Sciences | | | +| Science | Chemistry | | | +| Science | Environment | | | +| Science | Genetics | | | +| Science | Geography | | | +| Science | Geology | | | +| Science | Physics | | | +| Science | Space and Astronomy | | | +| Shopping | | | | +| Shopping | Coupons and Discounts | | | +| Shopping | Flower Shopping | | | +| Shopping | Gifts and Greetings Cards | | | +| Shopping | Grocery Shopping | | | +| Shopping | Holiday Shopping | | | +| Shopping | Household Supplies | | | +| Shopping | Lotteries and Scratchcards | | | +| Shopping | Sales and Promotions | | | +| Shopping | Children's Games and Toys | | | +| Sports | | | | +| Sports | American Football | | | +| Sports | Boxing | | | +| Sports | Cheerleading | | | +| Sports | College Sports | | | +| Sports | College Sports | College Football | | +| Sports | College Sports | College Basketball | | +| Sports | College Sports | College Baseball | | +| Sports | Cricket | | | +| Sports | Cycling | | | +| Sports | Darts | | | +| Sports | Disabled Sports | | | +| Sports | Diving | | | +| Sports | Equine Sports | | | +| Sports | Equine Sports | Horse Racing | | +| Sports | Extreme Sports | | | +| Sports | Extreme Sports | Canoeing and Kayaking | | +| Sports | Extreme Sports | Climbing | | +| Sports | Extreme Sports | Paintball | | +| Sports | Extreme Sports | Scuba Diving | | +| Sports | Extreme Sports | Skateboarding | | +| Sports | Extreme Sports | Snowboarding | | +| Sports | Extreme Sports | Surfing and Bodyboarding | | +| Sports | Extreme Sports | Waterskiing and Wakeboarding | | +| Sports | Australian Rules Football | | | +| Sports | Fantasy Sports | | | +| Sports | Field Hockey | | | +| Sports | Figure Skating | | | +| Sports | Fishing Sports | | | +| Sports | Golf | | | +| Sports | Gymnastics | | | +| Sports | Hunting and Shooting | | | +| Sports | Ice Hockey | | | +| Sports | Inline Skating | | | +| Sports | Lacrosse | | | +| Sports | Auto Racing | | | +| Sports | Auto Racing | Motorcycle Sports | | +| Sports | Martial Arts | | | +| Sports | Olympic Sports | | | +| Sports | Olympic Sports | Summer Olympic Sports | | +| Sports | Olympic Sports | Winter Olympic Sports | | +| Sports | Poker and Professional Gambling | | | +| Sports | Rodeo | | | +| Sports | Rowing | | | +| Sports | Rugby | | | +| Sports | Rugby | Rugby League | | +| Sports | Rugby | Rugby Union | | +| Sports | Sailing | | | +| Sports | Skiing | | | +| Sports | Snooker/Pool/Billiards | | | +| Sports | Soccer | | | +| Sports | Badminton | | | +| Sports | Softball | | | +| Sports | Squash | | | +| Sports | Swimming | | | +| Sports | Table Tennis | | | +| Sports | Tennis | | | +| Sports | Track and Field | | | +| Sports | Volleyball | | | +| Sports | Walking | | | +| Sports | Water Polo | | | +| Sports | Weightlifting | | | +| Sports | Baseball | | | +| Sports | Wrestling | | | +| Sports | Basketball | | | +| Sports | Beach Volleyball | | | +| Sports | Bodybuilding | | | +| Sports | Bowling | | | +| Sports | Sports Equipment | | | +| Style & Fashion | | | | +| Style & Fashion | Beauty | | | +| Style & Fashion | Beauty | Hair Care | | +| Style & Fashion | Beauty | Makeup and Accessories | | +| Style & Fashion | Beauty | Nail Care | | +| Style & Fashion | Beauty | Natural and Organic Beauty | | +| Style & Fashion | Beauty | Perfume and Fragrance | | +| Style & Fashion | Beauty | Skin Care | | +| Style & Fashion | Women's Fashion | | | +| Style & Fashion | Women's Fashion | Women's Accessories | | +| Style & Fashion | Women's Fashion | Women's Accessories | Women's Glasses | +| Style & Fashion | Women's Fashion | Women's Accessories | Women's Handbags and Wallets | +| Style & Fashion | Women's Fashion | Women's Accessories | Women's Hats and Scarves | +| Style & Fashion | Women's Fashion | Women's Accessories | Women's Jewelry and Watches | +| Style & Fashion | Women's Fashion | Women's Clothing | | +| Style & Fashion | Women's Fashion | Women's Clothing | Women's Business Wear | +| Style & Fashion | Women's Fashion | Women's Clothing | Women's Casual Wear | +| Style & Fashion | Women's Fashion | Women's Clothing | Women's Formal Wear | +| Style & Fashion | Women's Fashion | Women's Clothing | Women's Intimates and Sleepwear | +| Style & Fashion | Women's Fashion | Women's Clothing | Women's Outerwear | +| Style & Fashion | Women's Fashion | Women's Clothing | Women's Sportswear | +| Style & Fashion | Women's Fashion | Women's Shoes and Footwear | | +| Style & Fashion | Body Art | | | +| Style & Fashion | Children's Clothing | | | +| Style & Fashion | Designer Clothing | | | +| Style & Fashion | Fashion Trends | | | +| Style & Fashion | High Fashion | | | +| Style & Fashion | Men's Fashion | | | +| Style & Fashion | Men's Fashion | Men's Accessories | | +| Style & Fashion | Men's Fashion | Men's Accessories | Men's Jewelry and Watches | +| Style & Fashion | Men's Fashion | Men's Clothing | | +| Style & Fashion | Men's Fashion | Men's Clothing | Men's Business Wear | +| Style & Fashion | Men's Fashion | Men's Clothing | Men's Casual Wear | +| Style & Fashion | Men's Fashion | Men's Clothing | Men's Formal Wear | +| Style & Fashion | Men's Fashion | Men's Clothing | Men's Outerwear | +| Style & Fashion | Men's Fashion | Men's Clothing | Men's Sportswear | +| Style & Fashion | Men's Fashion | Men's Clothing | Men's Underwear and Sleepwear | +| Style & Fashion | Men's Fashion | Men's Shoes and Footwear | | +| Style & Fashion | Personal Care | | | +| Style & Fashion | Personal Care | Bath and Shower | | +| Style & Fashion | Personal Care | Deodorant and Antiperspirant | | +| Style & Fashion | Personal Care | Oral care | | +| Style & Fashion | Personal Care | Shaving | | +| Style & Fashion | Street Style | | | +| Technology & Computing | | | | +| Technology & Computing | Artificial Intelligence | | | +| Technology & Computing | Augmented Reality | | | +| Technology & Computing | Computing | | | +| Technology & Computing | Computing | Computer Networking | | +| Technology & Computing | Computing | Computer Peripherals | | +| Technology & Computing | Computing | Computer Software and Applications | | +| Technology & Computing | Computing | Computer Software and Applications | 3\-D Graphics | +| Technology & Computing | Computing | Computer Software and Applications | Photo Editing Software | +| Technology & Computing | Computing | Computer Software and Applications | Shareware and Freeware | +| Technology & Computing | Computing | Computer Software and Applications | Video Software | +| Technology & Computing | Computing | Computer Software and Applications | Web Conferencing | +| Technology & Computing | Computing | Computer Software and Applications | Antivirus Software | +| Technology & Computing | Computing | Computer Software and Applications | Browsers | +| Technology & Computing | Computing | Computer Software and Applications | Computer Animation | +| Technology & Computing | Computing | Computer Software and Applications | Databases | +| Technology & Computing | Computing | Computer Software and Applications | Desktop Publishing | +| Technology & Computing | Computing | Computer Software and Applications | Digital Audio | +| Technology & Computing | Computing | Computer Software and Applications | Graphics Software | +| Technology & Computing | Computing | Computer Software and Applications | Operating Systems | +| Technology & Computing | Computing | Data Storage and Warehousing | | +| Technology & Computing | Computing | Desktops | | +| Technology & Computing | Computing | Information and Network Security | | +| Technology & Computing | Computing | Internet | | +| Technology & Computing | Computing | Internet | Cloud Computing | +| Technology & Computing | Computing | Internet | Web Development | +| Technology & Computing | Computing | Internet | Web Hosting | +| Technology & Computing | Computing | Internet | Email | +| Technology & Computing | Computing | Internet | Internet for Beginners | +| Technology & Computing | Computing | Internet | Internet of Things | +| Technology & Computing | Computing | Internet | IT and Internet Support | +| Technology & Computing | Computing | Internet | Search | +| Technology & Computing | Computing | Internet | Social Networking | +| Technology & Computing | Computing | Internet | Web Design and HTML | +| Technology & Computing | Computing | Laptops | | +| Technology & Computing | Computing | Programming Languages | | +| Technology & Computing | Consumer Electronics | | | +| Technology & Computing | Consumer Electronics | Cameras and Camcorders | | +| Technology & Computing | Consumer Electronics | Home Entertainment Systems | | +| Technology & Computing | Consumer Electronics | Smartphones | | +| Technology & Computing | Consumer Electronics | Tablets and E\-readers | | +| Technology & Computing | Consumer Electronics | Wearable Technology | | +| Technology & Computing | Robotics | | | +| Technology & Computing | Virtual Reality | | | +| Television | | | | +| Television | Animation TV | | | +| Television | Soap Opera TV | | | +| Television | Special Interest TV | | | +| Television | Sports TV | | | +| Television | Children's TV | | | +| Television | Comedy TV | | | +| Television | Drama TV | | | +| Television | Factual TV | | | +| Television | Holiday TV | | | +| Television | Music TV | | | +| Television | Reality TV | | | +| Television | Science Fiction TV | | | +| Travel | | | | +| Travel | Travel Accessories | | | +| Travel | Travel Locations | | | +| Travel | Travel Locations | Africa Travel | | +| Travel | Travel Locations | Asia Travel | | +| Travel | Travel Locations | Australia and Oceania Travel | | +| Travel | Travel Locations | Europe Travel | | +| Travel | Travel Locations | North America Travel | | +| Travel | Travel Locations | Polar Travel | | +| Travel | Travel Locations | South America Travel | | +| Travel | Travel Preparation and Advice | | | +| Travel | Travel Type | | | +| Travel | Travel Type | Adventure Travel | | +| Travel | Travel Type | Family Travel | | +| Travel | Travel Type | Honeymoons and Getaways | | +| Travel | Travel Type | Hotels and Motels | | +| Travel | Travel Type | Rail Travel | | +| Travel | Travel Type | Road Trips | | +| Travel | Travel Type | Spas | | +| Travel | Travel Type | Air Travel | | +| Travel | Travel Type | Beach Travel | | +| Travel | Travel Type | Bed & Breakfasts | | +| Travel | Travel Type | Budget Travel | | +| Travel | Travel Type | Business Travel | | +| Travel | Travel Type | Camping | | +| Travel | Travel Type | Cruises | | +| Travel | Travel Type | Day Trips | | +| Video Gaming | | | | +| Video Gaming | Console Games | | | +| Video Gaming | eSports | | | +| Video Gaming | Mobile Games | | | +| Video Gaming | PC Games | | | +| Video Gaming | Video Game Genres | | | +| Video Gaming | Video Game Genres | Action Video Games | | +| Video Gaming | Video Game Genres | Role\-Playing Video Games | | +| Video Gaming | Video Game Genres | Simulation Video Games | | +| Video Gaming | Video Game Genres | Sports Video Games | | +| Video Gaming | Video Game Genres | Strategy Video Games | | +| Video Gaming | Video Game Genres | Action\-Adventure Video Games | | +| Video Gaming | Video Game Genres | Adventure Video Games | | +| Video Gaming | Video Game Genres | Casual Games | | +| Video Gaming | Video Game Genres | Educational Video Games | | +| Video Gaming | Video Game Genres | Exercise and Fitness Video Games | | +| Video Gaming | Video Game Genres | MMOs | | +| Video Gaming | Video Game Genres | Music and Party Video Games | | +| Video Gaming | Video Game Genres | Puzzle Video Games | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/179bdefa68b788a2c197f0094c43979d9265ba77.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/179bdefa68b788a2c197f0094c43979d9265ba77.md new file mode 100644 index 0000000..5b7a632 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/179bdefa68b788a2c197f0094c43979d9265ba77.md @@ -0,0 +1,7 @@ +# Data Asset Import node properties + +# Data Asset Import node properties # + +Refer to this section for a list of available properties for Import nodes\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/17ac1becae0867381bc236d4c0cc8fc4b8921a0a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/17ac1becae0867381bc236d4c0cc8fc4b8921a0a.md new file mode 100644 index 0000000..a085972 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/17ac1becae0867381bc236d4c0cc8fc4b8921a0a.md @@ -0,0 +1,39 @@ +# Compute resource options for Tuning Studio experiments in projects + +# Compute resource options for Tuning Studio experiments in projects # + +A Tuning Studio experiment has a single hardware configuration\. + +The following table shows the hardware configuration that is used when tuning foundation models in a tuning experiment\. + + + +Hardware configuration available in projects for Tuning Studio + +| Capacity type | Capacity units per hour | +| ------------- | ----------------------- | + + + +NVIDIA A100 80GB GPU\|43\| + +## Compute usage in projects ## + +Tuning Studio consumes compute resources as CUH from the Watson Machine Learning service\. + +You can monitor the total monthly amount of CUH consumption for the Watson Machine Learning service on the **Resource usage** page on the **Manage** tab of your project\. + +## Learn more ## + + + + * [Tuning Studio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-studio.html) + * [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html) + * [Compute resource options for assets and deployments in spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-cuh-deploy-spaces.html) + * [Monitoring account resource usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html) + + + +**Parent topic:**[Choosing compute resources for tools](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/17e39c164e92d0646c4dddadfdf178bf3b5e2ad0.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/17e39c164e92d0646c4dddadfdf178bf3b5e2ad0.md new file mode 100644 index 0000000..15a1e3e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/17e39c164e92d0646c4dddadfdf178bf3b5e2ad0.md @@ -0,0 +1,26 @@ +# settoflagnode properties + +# settoflagnode properties # + +![SetToFlag node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/settoflagnodeicon.png)The SetToFlag node derives multiple flag fields based on the categorical values defined for one or more nominal fields\. + + + +settoflagnode properties + +Table 1\. settoflagnode properties + +| `settoflagnode` properties | Data type | Property description | +| -------------------------- | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | +| `fields_from` | \[*category category category*\] `all` | | +| `true_value` | *string* | Specifies the true value used by the node when setting a flag\. The default is `T`\. | +| `false_value` | *string* | Specifies the false value used by the node when setting a flag\. The default is `F`\. | +| `use_extension` | *flag* | Use an extension as a suffix or prefix to the new flag field\. | +| `extension` | *string* | | +| `add_as` | `Suffix``Prefix` | Specifies whether the extension is added as a suffix or prefix\. | +| `aggregate` | *flag* | Groups records together based on key fields\. All flag fields in a group are enabled if any record is set to true\. | +| `keys` | *list* | Key fields\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/185c42ab06de9ff515dcd03213f5c4608c6faebf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/185c42ab06de9ff515dcd03213f5c4608c6faebf.md new file mode 100644 index 0000000..4363049 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/185c42ab06de9ff515dcd03213f5c4608c6faebf.md @@ -0,0 +1,18 @@ +# Reals (SPSS Modeler) + +# Reals # + +*Real* refers to a floating\-point number\. Reals are represented by one or more digits followed by a decimal point followed by one or more digits\. CLEM reals are held in double precision\. + +Optionally, you can place a minus sign (−) before the real to denote a negative number (for example, `1.234`, `0.999`, −`77.001`)\. Use the form <*number*> e <*exponent*> to express a real number in exponential notation (for example, `1234.0e5`, `1.7e`−`2`)\. When SPSS Modeler reads number strings from files and converts them automatically to numbers, numbers with no leading digit before the decimal point or with no digit after the point are accepted (for example, `999.` or `.11`)\. However, these forms are illegal in CLEM expressions\. + +Note: When referencing real numbers in CLEM expressions, a period must be used as the decimal separator, regardless of any settings for the current flow or locale\. For example, specify + + Na > 0.6 + +rather than + + Na > 0,6 + +This applies even if a comma is selected as the decimal symbol in the flow properties and is consistent with the general guideline that code syntax should be independent of any specific locale or convention\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/189f970cf3b162e67b98b2a928b36193169e3caf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/189f970cf3b162e67b98b2a928b36193169e3caf.md new file mode 100644 index 0000000..b25158b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/189f970cf3b162e67b98b2a928b36193169e3caf.md @@ -0,0 +1,15 @@ +# Working with your data (SPSS Modeler) + +# Working with your data # + +To see a quick sample of a flow's data, right\-click a node a select Preview\. To more thoroughly examine your data, use a Charts node to launch the chart builder\. + +With the chart builder, you can use advanced visualizations to explore your data from different perspectives and identify patterns, connections, and relationships within your data\. You can also visualize your data with these same charts in a Data Refinery flow\. + +Figure 1\. Sample visualizations available for a flow + +![Shows four example charts available in Visualizations](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/charts_thumbnail4.png) + +For more information, see [Visualizing your data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/visualizations.html)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/18a7a354c4b46e26df8304755c8be954bb922b04.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/18a7a354c4b46e26df8304755c8be954bb922b04.md new file mode 100644 index 0000000..a0cca53 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/18a7a354c4b46e26df8304755c8be954bb922b04.md @@ -0,0 +1,15 @@ +# Browsing a model (SPSS Modeler) + +# Browsing the model # + +When the C5\.0 node runs, its model nugget is added to the flow\. To browse the model, right\-click the model nugget and choose View Model\. + +The Tree Diagram displays the set of rules generated by the C5\.0 node in a tree format\. Now you can see the missing pieces of the puzzle\. For people with an `Na-to-K` ratio less than `14.829` and high blood pressure, age determines the choice of drug\. For people with low blood pressure, cholesterol level seems to be the best predictor\. + +Figure 1\. Tree diagram + +![Tree diagram](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_drug_browse_tree.png) + +You can hover over the nodes in the tree to see more details such as the number of cases for each blood pressure category and the confidence percentage of cases\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/18c44d2a29b576f708bc515cede91227b6b4fc4e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/18c44d2a29b576f708bc515cede91227b6b4fc4e.md new file mode 100644 index 0000000..7823d82 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/18c44d2a29b576f708bc515cede91227b6b4fc4e.md @@ -0,0 +1,17 @@ +# Time Series node (SPSS Modeler) + +# Time Series node # + +The Time Series node can be used with data in either a local or distributed environment\. With this node, you can choose to estimate and build exponential smoothing, univariate Autoregressive Integrated Moving Average (ARIMA), or multivariate ARIMA (or transfer function) models for time series, and produce forecasts based on the time series data\. + +Exponential smoothing is a method of forecasting that uses weighted values of previous series observations to predict future values\. As such, exponential smoothing is not based on a theoretical understanding of the data\. It forecasts one point at a time, adjusting its forecasts as new data come in\. The technique is useful for forecasting series that exhibit trend, seasonality, or both\. You can choose from various exponential smoothing models that differ in their treatment of trend and seasonality\. + +ARIMA models provide more sophisticated methods for modeling trend and seasonal components than do exponential smoothing models, and, in particular, they allow the added benefit of including independent (predictor) variables in the model\. This involves explicitly specifying autoregressive and moving average orders as well as the degree of differencing\. You can include predictor variables and define transfer functions for any or all of them, as well as specify automatic detection of outliers or an explicit set of outliers\. + +Note: In practical terms, ARIMA models are most useful if you want to include predictors that might help to explain the behavior of the series that is being forecast, such as the number of catalogs that are mailed or the number of hits to a company web page\. Exponential smoothing models describe the behavior of the time series without attempting to understand why it behaves as it does\. For example, a series that historically peaks every 12 months will probably continue to do so even if you don't know why\. + +An Expert Modeler option is also available, which attempts to automatically identify and estimate the best\-fitting ARIMA or exponential smoothing model for one or more target variables, thus eliminating the need to identify an appropriate model through trial and error\. If in doubt, use the Expert Modeler option\. + +If predictor variables are specified, the Expert Modeler selects those variables that have a statistically significant relationship with the dependent series for inclusion in ARIMA models\. Model variables are transformed where appropriate using differencing and/or a square root or natural log transformation\. By default, the Expert Modeler considers all exponential smoothing models and all ARIMA models and picks the best model among them for each target field\. You can, however, limit the Expert Modeler only to pick the best of the exponential smoothing models or only to pick the best of the ARIMA models\. You can also specify automatic detection of outliers\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1924ae74643c2d9d416204693c9bb84d5212e3b0.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1924ae74643c2d9d416204693c9bb84d5212e3b0.md new file mode 100644 index 0000000..00d2e86 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1924ae74643c2d9d416204693c9bb84d5212e3b0.md @@ -0,0 +1,53 @@ +# Building an deploying the model (SPSS Modeler) + +# Building and deploying the model # + + + +1. When your model is ready, click Generate a model to generate a text nugget\. + + Figure 1. Generate a new model + + ![Generate a new model](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_build.png) + + Figure 2. Build a category model + + ![Build a category model](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_buildcat.png) +2. If you want to save the Text Analytics Workbench session, instead click Return to flow and then Save and exit\. + + Figure 3. Saving your session + + ![Saving your session](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_build_save.png)The generated text nugget appears on your flow canvas. + + Figure 4. Generated text nugget + + ![Generated text nugget](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_build_nugget.png)After the category model has been validated and generated in the Text Analytics Workbench, you can deploy it in your flow and score the same data set or score a new one. + + Figure 5. Example flow with two modes for scoring + + ![Example flow with two modes for scoring](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_build_ex.png)This example flow illustrates the two modes for scoring: + + + + * Categories as fields. With this option, there are just as many output records as there were in the input. However, each record now contains one new field for every category that was selected on the Model tab. For each field, enter a flag value for true and for false, such as `True/False`, or `1/0`. In this flow, values are set to `1` and `0` to aggregate results and count the number of positive, negative, mixed (both positive and negative), or no score (no opinion) answers. + + Figure 6. Model results - categories as fields + + ![Model results - categories as fields](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_build_excats.png) + * Categories as records. With this option, a new record is created for each `category, document` pair. Typically, there are more records in the output than there were in the input. Along with the input fields, new fields are also added to the data depending on what kind of model it is. + + Figure 7. Model results - categories as records + + ![Model results - categories as records](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_build_exrecs.png) + + + +3. You can add a Select node after the DeriveSentiment SuperNode, include `Sentiments=Pos`, and add a Charts node to gain quick insight about what guests appreciate about the hotel: + + Figure 8. Chart of positive opinions + + ![Chart of positive opinions](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_positive.png) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/198246e6e7f694d36936989d23b2255b15c2a92b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/198246e6e7f694d36936989d23b2255b15c2a92b.md new file mode 100644 index 0000000..7fe7043 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/198246e6e7f694d36936989d23b2255b15c2a92b.md @@ -0,0 +1,32 @@ +# XML content model + +# XML content model # + +The XML content model provides access to XML\-based content\. + +The XML content model supports the ability to access components based on XPath expressions\. XPath expressions are strings that define which elements or attributes are required by the caller\. The XML content model hides the details of constructing various objects and compiling expressions that are typically required by XPath support\. It is simpler to call from Python scripting\. + +The XML content model includes a function that returns the XML document as a string, so Python script users can use their preferred Python library to parse the XML\. + + + +Methods for the XML content model + +Table 1\. Methods for the XML content model + +| Method | Return types | Description | +| ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | +| `getXMLAsString()` | `String` | Returns the XML as a string\. | +| `getNumericValue(String xpath)` | `number` | Returns the result of evaluating the path with return type of numeric (for example, count the number of elements that match the path expression)\. | +| `getBooleanValue(String xpath)` | `boolean` | Returns the boolean result of evaluating the specified path expression\. | +| `getStringValue(String xpath, String attribute)` | `String` | Returns either the attribute value or XML node value that matches the specified path\. | +| `getStringValues(String xpath, String attribute)` | `List of strings` | Returns a list of all attribute values or XML node values that match the specified path\. | +| `getValuesList(String xpath, attributes, boolean includeValue)` | `List of lists of strings` | Returns a list of all attribute values that match the specified path along with the XML node value if required\. | +| `getValuesMap(String xpath, String keyAttribute, attributes, boolean includeValue)` | `Hash table (key:string, value:list of string)` | Returns a hash table that uses either the key attribute or XML node value as key, and the list of specified attribute values as table values\. | +| `isNamespaceAware()` | `boolean` | Returns whether the XML parsers should be aware of namespaces\. Default is `False`\. | +| `setNamespaceAware(boolean value)` | `void` | Sets whether the XML parsers should be aware of namespaces\. This also calls `reset()` to ensure changes are picked up by subsequent calls\. | +| `reset()` | `void` | Flushes any internal storage associated with this content model (for example, a cached DOM object)\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/19ae3adcf2da2ffe5186553229fef07cb2b55043.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/19ae3adcf2da2ffe5186553229fef07cb2b55043.md new file mode 100644 index 0000000..c065662 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/19ae3adcf2da2ffe5186553229fef07cb2b55043.md @@ -0,0 +1,50 @@ +# autonumericnode properties + +# autonumericnode properties # + +![Auto Numeric node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/rangepredictornodeicon.png)The Auto Numeric node estimates and compares models for continuous numeric range outcomes using a number of different methods\. The node works in the same manner as the Auto Classifier node, allowing you to choose the algorithms to use and to experiment with multiple combinations of options in a single modeling pass\. Supported algorithms include neural networks, C&R Tree, CHAID, linear regression, generalized linear regression, and support vector machines (SVM)\. Models can be compared based on correlation, relative error, or number of variables used\. + + + +autonumericnode properties + +Table 1\. autonumericnode properties + +| `autonumericnode` Properties | Values | Property description | +| ------------------------------------ | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `custom_fields` | *flag* | If True, custom field settings will be used instead of type node settings\. | +| `target` | *field* | The Auto Numeric node requires a single target and one or more input fields\. Weight and frequency fields can also be specified\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `inputs` | *\[field1 … field2\]* | | +| `partition` | *field* | | +| `use_frequency` | *flag* | | +| `frequency_field` | *field* | | +| `use_weight` | *flag* | | +| `weight_field` | *field* | | +| `use_partitioned_data` | *flag* | If a partition field is defined, only the training data is used for model building\. | +| `ranking_measure` | `Correlation``NumberOfFields` | | +| `ranking_dataset` | `Test``Training` | | +| `number_of_models` | *integer* | Number of models to include in the model nugget\. Specify an integer between 1 and 100\. | +| `calculate_variable_importance` | *flag* | | +| `enable_correlation_limit` | *flag* | | +| `correlation_limit` | *integer* | | +| `enable_number_of_fields_limit` | *flag* | | +| `number_of_fields_limit` | *integer* | | +| `enable_relative_error_limit` | *flag* | | +| `relative_error_limit` | *integer* | | +| `enable_model_build_time_limit` | *flag* | | +| `model_build_time_limit` | *integer* | | +| `enable_stop_after_time_limit` | *flag* | | +| `stop_after_time_limit` | *integer* | | +| `stop_if_valid_model` | *flag* | | +| `` | *flag* | Enables or disables the use of a specific algorithm\. | +| `.` | *string* | Sets a property value for a specific algorithm\. See [Setting algorithm properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/factorymodeling_algorithmproperties.html#factorymodeling_algorithmproperties) for more information\. | +| `use_cross_validation` | *boolean* | Instead of using a single partition, a cross validation partition is used\. | +| `number_of_folds` | *integer* | N fold parameter for cross validation, with range from 3 to 10\. | +| `set_random_seed` | *boolean* | Setting a random seed allows you to replicate analyses\. Specify an integer or click Generate, which will create a pseudo\-random integer between 1 and 2147483647, inclusive\. By default, analyses are replicated with seed 229176228\. | +| `random_seed` | *integer* | Random seed | +| `filter_individual_model_output` | *boolean* | Removes from the output all of the additional fields generated by the individual models that feed into the Ensemble node\. Select this option if you're interested only in the combined score from all of the input models\. Ensure that this option is deselected if, for example, you want to use an Analysis node or Evaluation node to compare the accuracy of the combined score with that of each of the individual input models\. | +| `calculate_standard_error` | *boolean* | For a continuous (numeric range) target, a standard error calculation runs by default to calculate the difference between the measured or estimated values and the true values; and to show how close those estimates matched\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/19ba0bfc40b6212b42f38487f1533bb65647850e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/19ba0bfc40b6212b42f38487f1533bb65647850e.md new file mode 100644 index 0000000..b171b39 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/19ba0bfc40b6212b42f38487f1533bb65647850e.md @@ -0,0 +1,284 @@ +# Importing models to a deployment space + +# Importing models to a deployment space # + +Import machine learning models trained outside of IBM Watson Machine Learning so that you can deploy and test the models\. Review the model frameworks that are available for importing models\. + +Here, *to import a trained model* means: + + + +1. Store the trained model in your Watson Machine Learning repository +2. Optional: Deploy the stored model in your Watson Machine Learning service + + + +and *repository* means a Cloud Object Storage bucket\. For more information, see [Creating deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-create.html)\. + +You can import a model in these ways: + + + + * [Directly through the UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#ui-import) + * [By using a path to a file](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#path-file-import) + * [By using a path to a directory](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#path-dir-import) + * [Import a model object](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#object-import) + + + +For more information, see [Importing models by ML framework](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#supported-formats)\. + +For more information, see [Things to consider when you import models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#model-import-considerations)\. + +For an example of how to add a model programmatically by using the Python client, refer to this notebook: + + + + * [Use PMML to predict iris species\.](https://github.com/IBM/watson-machine-learning-samples/blob/df8e5122a521638cb37245254fe35d3a18cd3f59/cloud/notebooks/python_sdk/deployments/pmml/Use%20PMML%20to%20predict%20iris%20species.ipynb) + + + +For an example of how to add a model programmatically by using the REST API, refer to this notebook: + + + + * [Use scikit\-learn to predict diabetes progression](https://github.com/IBM/watson-machine-learning-samples/blob/be84bcd25d17211f41fb34ec262b418f6cd6c87b/cloud/notebooks/rest_api/curl/deployments/scikit/Use%20scikit-learn%20to%20predict%20diabetes%20progression.ipynb) + + + +## Available ways to import models, per framework type ## + +This table lists the available ways to import models to Watson Machine Learning, per framework type\. + + + +Import options for models, per framework type + +| Import option | Spark MLlib | Scikit\-learn | XGBoost | TensorFlow | PyTorch | +| ---------------------------------------------------------------------------------- | ----------- | ------------- | ------- | ---------- | ------- | +| [Importing a model object](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#object-import) | ✓ | ✓ | ✓ | | | +| [Importing a model by using a path to a file](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#path-file-import) | | ✓ | ✓ | ✓ | ✓ | +| [Importing a model by using a path to a directory](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#path-dir-import) | | ✓ | ✓ | ✓ | ✓ | + + + +### Adding a model by using UI ### + +Note:If you want to import a model in the PMML format, you can directly import the model `.xml` file\. + +To import a model by using UI: + + + +1. From the **Assets** tab of your space in Watson Machine Learning, click **Import assets**\. +2. Select `Local file` and then select **Model**\. +3. Select the model file that you want to import and click **Import**\. + + + +The importing mechanism automatically selects a matching model type and software specification based on the version string in the `.xml` file\. + +### Importing a model object ### + +Note:This import method is supported by a limited number of ML frameworks\. For more information, see [Available ways to import models, per framework type](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#supported-formats)\. + +To import a model object: + + + +1. If your model is located in a remote location, follow [Downloading a model that is stored in a remote location](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#model-download)\. +2. Store the model object in your Watson Machine Learning repository\. For more information, see [Storing model in Watson Machine Learning repository](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#store-in-repo)\. + + + +### Importing a model by using a path to a file ### + +Note:This import method is supported by a limited number of ML frameworks\. For more information, see [Available ways to import models, per framework type](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#supported-formats)\. + +To import a model by using a path to a file: + + + +1. If your model is located in a remote location, follow [Downloading a model that is stored in a remote location](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#model-download) to download it\. +2. If your model is located locally, place it in a specific directory: + + !cp + !cd +3. For **Scikit\-learn**, **XGBoost**, **Tensorflow**, and **PyTorch** models, if the downloaded file is not a `.tar.gz` archive, make an archive: + + !tar -zcvf .tar.gz + + The model file must be at the top-level folder of the directory, for example: + + assets/ + + variables/ + variables/variables.data-00000-of-00001 + variables/variables.index +4. Use the path to the saved file to store the model file in your Watson Machine Learning repository\. For more information, see [Storing model in Watson Machine Learning repository](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#store-in-repo)\. + + + +### Importing a model by using a path to a directory ### + +Note:This import method is supported by a limited number of ML frameworks\. For more information, see [Available ways to import models, per framework type](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#supported-formats)\. + +To import a model by using a path to a directory: + + + +1. If your model is located in a remote location, refer to [Downloading a model stored in a remote location](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#model-download)\. +2. If your model is located locally, place it in a specific directory: + + !cp + !cd + + For **scikit-learn**, **XGBoost**, **Tensorflow**, and **PyTorch** models, the model file must be at the top-level folder of the directory, for example: + + assets/ + + variables/ + variables/variables.data-00000-of-00001 + variables/variables.index +3. Use the directory path to store the model file in your Watson Machine Learning repository\. For more information, see [Storing model in Watson Machine Learning repository](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#store-in-repo)\. + + + +### Downloading a model stored in a remote location ### + +Follow this sample code to download your model from a remote location: + + import os + from wget import download + + target_dir = '' + if not os.path.isdir(target_dir): + os.mkdir(target_dir) + filename = os.path.join(target_dir, '') + if not os.path.isfile(filename): + filename = download('', out = target_dir) + +## Things to consider when you import models ## + +To learn more about importing a specific model type, see: + + + + * [Models saved in PMML format](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#pmml-import) + * [Spark MLlib models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#spark-ml-lib-import) + * [Scikit\-learn models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#scikit-learn-import) + * [XGBoost models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#xgboost-import) + * [TensorFlow models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#tf-import) + * [PyTorch models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#pt-import) + + + +To learn more about frameworks that you can use with Watson Machine Learning, see [Supported frameworks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/pm_service_supported_frameworks.html)\. + +### Models saved in PMML format ### + + + + * The only available deployment type for models that are imported from PMML is online deployment\. + * The PMML file must have the `.xml` file extension\. + * PMML models cannot be used in an SPSS stream flow\. + * The PMML file must not contain a prolog\. Depending on the library that you are using when you save your model, a prolog might be added to the beginning of the file by default\. For example, if your file contains a prolog string such as `spark-mllib-lr-model-pmml.xml`, remove the string before you import the PMML file to the deployment space\. + + + +Depending on the library that you are using when you save your model, a prolog might be added to the beginning of the file by default, like in this example: + + :::::::::::::: + spark-mllib-lr-model-pmml.xml + :::::::::::::: + +You must remove that prolog before you can import the PMML file to Watson Machine Learning\. + +### Spark MLlib models ### + + + + * Only classification and regression models are available\. + * Custom transformers, user\-defined functions, and classes are not available\. + + + +### Scikit\-learn models ### + + + + * `.pkl` and `.pickle` are the available import formats\. + * To serialize or pickle the model, use the `joblib` package\. + * Only classification and regression models are available\. + * Pandas Dataframe input type for `predict()` API is not available\. + * The only available deployment type for scikit\-learn models is online deployment\. + + + +### XGBoost models ### + + + + * `.pkl` and `.pickle` are the available import formats\. + * To serialize or pickle the model, use the `joblib` package\. + * Only classification and regression models are available\. + * Pandas Dataframe input type for `predict()` API is not available\. + * The only available deployment type for XGBoost models is online deployment\. + + + +### TensorFlow models ### + + + + * `.pb`, `.h5`, and `.hdf5` are the available import formats\. + * To save or serialize a TensorFlow model, use the `tf.saved_model.save()` method\. + * `tf.estimator` is not available\. + * The only available deployment types for TensorFlow models are: online deployment and batch deployment\. + + + +### PyTorch models ### + + + + * The only available deployment type for PyTorch models is online deployment\. + * For a Pytorch model to be importable to Watson Machine Learning, it must be previously exported to `.onnx` format\. Refer to this code\. + + torch.onnx.export(, , ".onnx", verbose=True, input_names=, output_names=) + + + +## Storing a model in your Watson Machine Learning repository ## + +Use this code to store your model in your Watson Machine Learning repository: + + from ibm_watson_machine_learning import APIClient + + client = APIClient() + sw_spec_uid = client.software_specifications.get_uid_by_name("") + + meta_props = { + client.repository.ModelMetaNames.NAME: "", + client.repository.ModelMetaNames.SOFTWARE_SPEC_UID: sw_spec_uid, + client.repository.ModelMetaNames.TYPE: ""} + + client.repository.store_model(model=, meta_props=meta_props) + +**Notes**: + + + + * Depending on the model framework used, `` can be the actual model object, a full path to a saved model file, or a path to a directory where the model file is located\. For more information, see [Available ways to import models, per framework type](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html?context=cdpaas&locale=en#supported-formats)\. + * For a list of available software specifications to use as ``, use the `client.software_specifications.list()` method\. + * For a list of available model types to use as `model_type`, refer to [Software specifications and hardware specifications for deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/pm_service_supported_frameworks.html)\. + * When you export a Pytorch model to the `.onnx` format, specify the `keep_initializers_as_inputs=True` flag and set `opset_version` to 9 (Watson Machine Learning deployments use the `caffe2` ONNX runtime that doesn't support opset versions higher than 9)\. + + torch.onnx.export(net, x, 'lin_reg1.onnx', verbose=True, keep_initializers_as_inputs=True, opset_version=9) + * To learn more about how to create the `` dictionary, refer to [Watson Machine Learning authentication](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-authentication.html)\. + + + +**Parent topic:**[Assets in deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets-all.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1a548d934dfe57dd0f12195461f2ddb348eae68c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1a548d934dfe57dd0f12195461f2ddb348eae68c.md new file mode 100644 index 0000000..1955f91 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1a548d934dfe57dd0f12195461f2ddb348eae68c.md @@ -0,0 +1,7 @@ +# Automated modeling for a flag target (SPSS Modeler) + +# Automated modeling for a flag target # + +With the Auto Classifier node, you can automatically create and compare a number of different models for either flag (such as whether or not a given customer is likely to default on a loan or respond to a particular offer) or nominal (set) targets\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1a5f15e64aabdca9e2785588e76f3ebe22a1c426.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1a5f15e64aabdca9e2785588e76f3ebe22a1c426.md new file mode 100644 index 0000000..1bf1e34 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1a5f15e64aabdca9e2785588e76f3ebe22a1c426.md @@ -0,0 +1,9 @@ +# Decision List node (SPSS Modeler) + +# Decision List node # + +Decision List models identify subgroups or segments that show a higher or lower likelihood of a binary (yes or no) outcome relative to the overall sample\. + +For example, you might look for customers who are least likely to churn or most likely to say yes to a particular offer or campaign\. The Decision List Viewer gives you complete control over the model, enabling you to edit segments, add your own business rules, specify how each segment is scored, and customize the model in a number of other ways to optimize the proportion of hits across all segments\. As such, it is particularly well\-suited for generating mailing lists or otherwise identifying which records to target for a particular campaign\. You can also use multiple mining tasks to combine modeling approaches—for example, by identifying high\- and low\-performing segments within the same model and including or excluding each in the scoring stage as appropriate\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1acf5ed461253f09db844c2d84c1ae21277bc1e6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1acf5ed461253f09db844c2d84c1ae21277bc1e6.md new file mode 100644 index 0000000..0ba01dc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1acf5ed461253f09db844c2d84c1ae21277bc1e6.md @@ -0,0 +1,22 @@ +# Auto Classifier node (SPSS Modeler) + +# Auto Classifier node # + +The Auto Classifier node estimates and compares models for either nominal (set) or binary (yes/no) targets, using a number of different methods, enabling you to try out a variety of approaches in a single modeling run\. You can select the algorithms to use, and experiment with multiple combinations of options\. For example, rather than choose between Radial Basis Function, polynomial, sigmoid, or linear methods for an SVM, you can try them all\. The node explores every possible combination of options, ranks each candidate model based on the measure you specify, and saves the best models for use in scoring or further analysis\. + +Example +: A retail company has historical data tracking the offers made to specific customers in past campaigns\. The company now wants to achieve more profitable results by matching the appropriate offer to each customer\. + +Requirements +: A target field with a measurement level of either `Nominal` or `Flag` (with the role set to Target), and at least one input field (with the role set to Input)\. For a flag field, the `True` value defined for the target is assumed to represent a hit when calculating profits, lift, and related statistics\. Input fields can have a measurement level of `Continuous` or `Categorical`, with the limitation that some inputs may not be appropriate for some model types\. For example, ordinal fields used as inputs in C&R Tree, CHAID, and QUEST models must have numeric storage (not string), and will be ignored by these models if specified otherwise\. Similarly, continuous input fields can be binned in some cases\. The requirements are the same as when using the individual modeling nodes; for example, a Bayes Net model works the same whether generated from the Bayes Net node or the Auto Classifier node\. + +Frequency and weight fields +: Frequency and weight are used to give extra importance to some records over others because, for example, the user knows that the build dataset under\-represents a section of the parent population (Weight) or because one record represents a number of identical cases (Frequency)\. If specified, a frequency field can be used by C&R Tree, CHAID, QUEST, Decision List, and Bayes Net models\. A weight field can be used by C&RT, CHAID, and C5\.0 models\. Other model types will ignore these fields and build the models anyway\. Frequency and weight fields are used only for model building, and are not considered when evaluating or scoring models\. + +Prefixes +: If you attach a table node to the nugget for the Auto Classifier Node, there are several new variables in the table with names that begin with a $ prefix\. +: The names of the fields that are generated during scoring are based on the target field, but with a standard prefix\. Different model types use different sets of prefixes\. +: For example, the prefixes $G, $R, $C are used as the prefix for predictions that are generated by the Generalized Linear model, CHAID model, and C5\.0 model, respectively\. $X is typically generated by using an ensemble, and $XR, $XS, and $XF are used as prefixes in cases where the target field is a Continuous, Categorical, or Flag field, respectively\. +: $\.\.C prefixes are used for prediction confidence of a Categorical, or Flag target; for example, $XFC is used as a prefix for ensemble Flag prediction confidence\. $RC and $CC are the prefixes for a single prediction of confidence for a CHAID model and C5\.0 model respectively\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1b0ab9084c7dd9546bdc2f376b58e32c0ecfee85.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1b0ab9084c7dd9546bdc2f376b58e32c0ecfee85.md new file mode 100644 index 0000000..84ec3ff --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1b0ab9084c7dd9546bdc2f376b58e32c0ecfee85.md @@ -0,0 +1,9 @@ +# Extension Model node (SPSS Modeler) + +# Extension Model node # + +With the Extension Model node, you can run R scripts or Python for Spark scripts to build and score models\. + +After adding the node to your canvas, double\-click the node to open its properties\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1b83fe669cb3776d00a1a78e4764f115dfd5a40a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1b83fe669cb3776d00a1a78e4764f115dfd5a40a.md new file mode 100644 index 0000000..f02456a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1b83fe669cb3776d00a1a78e4764f115dfd5a40a.md @@ -0,0 +1,9 @@ +# Output node properties + +# Output node properties # + +Refer to this section for a list of available properties for Output nodes\. + +Output node properties differ slightly from those of other node types\. Rather than referring to a particular node option, output node properties store a reference to the output object\. This can be useful in taking a value from a table and then setting it as a flow parameter\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1bb1684259f93d91580690d898140d98f12611ed.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1bb1684259f93d91580690d898140d98f12611ed.md new file mode 100644 index 0000000..6bef6fc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1bb1684259f93d91580690d898140d98f12611ed.md @@ -0,0 +1,9 @@ +# Deploying Decision Optimization models + +# Decision Optimization # + +When you have created and solved your Decision Optimization models, you can deploy them using Watson Machine Learning\. + +See the [Decision Optimization experiment UI](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/buildingmodels.html#topic_buildingmodels) for building and solving models\. The following sections describe how you can deploy your models\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1bc1fe73146c70fa2a76241470314a4732efd918.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1bc1fe73146c70fa2a76241470314a4732efd918.md new file mode 100644 index 0000000..5f282d1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1bc1fe73146c70fa2a76241470314a4732efd918.md @@ -0,0 +1,11 @@ +# Isotonic-AS node (SPSS Modeler) + +# Isotonic\-AS node # + +Isotonic Regression belongs to the family of regression algorithms\. The Isotonic\-AS node in watsonx\.ai is implemented in Spark\. + +For details, see [Isotonic regression](https://spark.apache.org/docs/2.2.0/mllib-isotonic-regression.html)\. ^1^ + +^1^ "Regression \- RDD\-based API\." *Apache Spark*\. MLlib: Main Guide\. Web\. 3 Oct 2017\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1bd28f052373c2e70130c7539d399d76f9d2aafe.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1bd28f052373c2e70130c7539d399d76f9d2aafe.md new file mode 100644 index 0000000..341f251 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1bd28f052373c2e70130c7539d399d76f9d2aafe.md @@ -0,0 +1,25 @@ +# Accessing the components in your pipeline + +## Accessing the components in your pipeline ## + +When you use a pipeline to automate a flow, you must have access to all of the elements in the pipeline\. Make sure that you create and run pipelines with the proper access to all assets, projects, and spaces used in the pipeline\. Collaborators who run the pipeline must also be able to access the pipeline components\. + +### Managing pipeline credentials ### + +To run a job, the pipeline must have access to IBM Cloud credentials\. Typically, a pipeline uses your personal IBM Cloud API key to execute long\-running operations in the pipeline without disruption\. If credentials are not available when you create the job, you are prompted to supply an API key or create a new one\. + +To generate an API key from your IBM Cloud user account, go to [Manage access and users \- API Keys](https://cloud.ibm.com/iam/apikeys) and create or select an API key for your user account\. + +You can also generate and rotate API keys from **Profile and settings > User API key**\. For more information, see [Managing the user API key](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-apikeys.html)\. + +Alternatively, you can request that a key is generated for the pipeline\. In either scenario, name and copy the key, protecting it as you would a password\. + +## Adding assets to a pipeline ## + +When you create a pipeline, you add assets, such as data, notebooks, deployment jobs, or Data Refinery jobs to the pipeline to orchestrate a sequential process\. The ***strongly recommended*** method for adding assets to a pipeline is to collect the assets in the project containing the pipeline and use the asset browser to select project assets for the pipeline\. + +Attention: Although you can include assets from other projects, doing so can introduce complexities and potential problems in your pipeline and could be prohibited in a future release\. The recommended practice is to use assets from the current project\. + +**Parent topic:**[Getting started with Watson Pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-get-started.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1bed610a414085e625bd32aae5ffac81b41f97e0.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1bed610a414085e625bd32aae5ffac81b41f97e0.md new file mode 100644 index 0000000..47583d5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1bed610a414085e625bd32aae5ffac81b41f97e0.md @@ -0,0 +1,92 @@ +# PostgreSQL connection + +# PostgreSQL connection # + +To access your data in PostgreSQL, you must create a connection asset for it\. + +PostgreSQL is an open source and customizable object\-relational database\. + +## Supported versions ## + + + + * PostgreSQL 15\.0 and later + * PostgreSQL 14\.0 and later + * PostgreSQL 13\.0 and later + * PostgreSQL 12\.0 and later + * PostgreSQL 11\.0 and later + * PostgreSQL 10\.1 and later + * PostgreSQL 9\.6 and later + + + +## Create a connection to PostgreSQL ## + +To create the connection asset, you need the following connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Username and password + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use PostgreSQL connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## PostgreSQL setup ## + +[PostgreSQL installation](https://www.pgadmin.org/docs/pgadmin4/latest/getting_started.html) + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [SQL Syntax](https://www.postgresql.org/docs/current/sql-syntax.html) in the PostgreSQL documentation\. + +## Learn more ## + +[PostgreSQL documentation](https://www.postgresql.org/docs/) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1c19733ed0d3400baf6ff05317475a6518b5ba1a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1c19733ed0d3400baf6ff05317475a6518b5ba1a.md new file mode 100644 index 0000000..4c378fd --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1c19733ed0d3400baf6ff05317475a6518b5ba1a.md @@ -0,0 +1,31 @@ +# partitionnode properties + +# partitionnode properties # + +![Partition node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/partitionnodeicon.png)The Partition node generates a partition field, which splits the data into separate subsets for the training, testing, and validation stages of model building\. + + + +partitionnode properties + +Table 1\. partitionnode properties + +| `partitionnode` properties | Data type | Property description | +| -------------------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `new_name` | *string* | Name of the partition field generated by the node\. | +| `create_validation` | *flag* | Specifies whether a validation partition should be created\. | +| `training_size` | *integer* | Percentage of records (0–100) to be allocated to the training partition\. | +| `testing_size` | *integer* | Percentage of records (0–100) to be allocated to the testing partition\. | +| `validation_size` | *integer* | Percentage of records (0–100) to be allocated to the validation partition\. Ignored if a validation partition is not created\. | +| `training_label` | *string* | Label for the training partition\. | +| `testing_label` | *string* | Label for the testing partition\. | +| `validation_label` | *string* | Label for the validation partition\. Ignored if a validation partition is not created\. | +| `value_mode` | `System``SystemAndLabel``Label` | Specifies the values used to represent each partition in the data\. For example, the training sample can be represented by the system integer `1`, the label `Training`, or a combination of the two, `1_Training`\. | +| `set_random_seed` | *Boolean* | Specifies whether a user\-specified random seed should be used\. | +| `random_seed` | *integer* | A user\-specified random seed value\. For this value to be used, `set_random_seed` must be set to `True`\. | +| `enable_sql_generation` | *Boolean* | Specifies whether to use SQL pushback to assign records to partitions\. | +| `unique_field` | | Specifies the input field used to ensure that records are assigned to partitions in a random but repeatable way\. For this value to be used, `enable_sql_generation` must be set to `True`\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1c20bd9f24d670dd18b6bc28e020fbb23c742682.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1c20bd9f24d670dd18b6bc28e020fbb23c742682.md new file mode 100644 index 0000000..3d5d488 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1c20bd9f24d670dd18b6bc28e020fbb23c742682.md @@ -0,0 +1,44 @@ +# Creating advanced custom constraints with Python in the Decision Optimization Modeling Assistant + +# Creating advanced custom constraints with Python # + +This Decision Optimization Modeling Assistant example shows you how to create advanced custom constraints that use Python\. + +## Procedure ## + +To create a new advanced custom constraint: + + + +1. In the Build model view of your open Modeling Assistant model, look at the Suggestions pane\. If you have Display by category selected, expand the Others section to locate New custom constraint, and click it to add it to your model\. Alternatively, without categories displayed, you can enter, for example, custom in the search field to find the same suggestion and click it to add it to your model\.A new custom constraint is added to your model\. + + ![New custom constraint in model, with elements highlighted to be completed by user.](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/images/newcustomconstraint.jpg) +2. Click Enter your constraint\. Use \[brackets\] for data, concepts, variables, or parameters and enter the constraint you want to specify\. For example, type No \[employees\] has \[onCallDuties\] for more than \[2\] consecutive days and press enter\.The specification is displayed with default parameters (`parameter1, parameter2, parameter3`) for you to customize\. These parameters will be passed to the Python function that implements this custom rule\. + + ![Custom constraint expanded to show default parameters and function name.](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/images/customconstraintFillParameters.jpg) +3. Edit the default parameters in the specification to give them more meaningful names\. For example, change the parameters to `employees, on_call_duties`, and `limit` and click enter\. +4. Click function name and enter a name for the function\. For example, type limitConsecutiveAssignments and click enter\.Your function name is added and an Edit Python button appears\. + + ![Custom rule showing customized parameters and Edit Python button.](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/images/customconstraintParameters.jpg) +5. Click the Edit Python button\.A new window opens showing you Python code that you can edit to implement your custom rule\. You can see your customized parameters in the code as follows: + + ![Python code showing block to be customized](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/images/CustomRulePythoncode.jpg) + + Notice that the code is documented with corresponding data frames and table column names as you have defined in the custom rule. The limit is not documented as this is a numerical value. +6. Optional: You can edit the Python code directly in this window, but you might find it useful to edit and debug your code in a notebook before using it here\. In this case, close this window for now and in the Scenario pane, expand the three vertical dots and select Generate a notebook for this scenario that contains the custom rule\. Enter a name for this notebook\.The notebook is created in your project assets ready for you to edit and debug\. Once you have edited, run and debugged it you can copy the code for your custom function back into this Edit Python window in the Modeling Assistant\. +7. Edit the Python code in the Modeling Assistant custom rule Edit Python window\. For example, you can define the rule for consecutive days in Python as follows: + + def limitConsecutiveAssignments(self, mdl, employees, on_call_duties, limit): + global helper_add_labeled_cplex_constraint, helper_get_index_names_for_type, helper_get_column_name_for_property + print('Adding constraints for the custom rule') + for employee, duties in employees.associated(on_call_duties): + duties_day_idx = duties.join(Day) # Retrieve Day index from Day label + for d in Day['index']: + end = d + limit + 1 # One must enforce that there are no occurence of (limit + 1) working consecutive days + duties_in_win = duties_day_idx[((duties_day_idx'index'] >= d) & (duties_day_idx'index'] <= end)) | (duties_day_idx'index'] <= end - 7)] + mdl.add_constraint(mdl.sum(duties_in_win.onCallDutyVar) <= limit) +8. Click the Run button to run your model with your custom constraint\.When the run is completed you can see the results in the **Explore solution** view\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1c42359bdf665ebca2bae4b9b3d5108f8097bf34.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1c42359bdf665ebca2bae4b9b3d5108f8097bf34.md new file mode 100644 index 0000000..11da729 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1c42359bdf665ebca2bae4b9b3d5108f8097bf34.md @@ -0,0 +1,65 @@ +# Dropbox connection + +# Dropbox connection # + +To access your data in Dropbox, create a connection asset for it\. + +Dropbox is a cloud storage service that lets you host and synchronize files on your devices\. + +## Create a connection to Dropbox ## + +To create the connection asset, you need an Access token\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Dropbox connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * SPSS Modeler + * Synthetic Data Generator (Synthetic Data Generator service) + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Dropbox setup ## + +[Dropbox plans](https://www.dropbox.com/plans) + +## Supported file types ## + +The Dropbox connection supports these file types: Avro, CSV, Delimited text, Excel, JSON, ORC, Parquet, SAS, SAV, SHP, and XML\. + +## Learn more ## + +[Dropbox quick start guides](https://help.dropbox.com/guide) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1c863b2624ab2712318442337c917143c19e7ddd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1c863b2624ab2712318442337c917143c19e7ddd.md new file mode 100644 index 0000000..9cc813f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1c863b2624ab2712318442337c917143c19e7ddd.md @@ -0,0 +1,40 @@ +# Creating jobs for Pipelines + +# Creating jobs for Pipelines # + +You can create jobs for Pipelines\. + +To create a Pipelines job: + + + +1. Open your Pipelines asset from the project\. +2. Click **Run pipeline > Create a job**\. +3. On the **Create a job** page, you can choose the asset version that you'd like to run\. The most recently saved version of the Pipelines is used by default\. +4. Give a name and optional description for your job\. Click **next**\. +5. Define your IAM API key\. The most recently used API key is used by default\. If you'd like to use a new API key, click **Generate new API key**\. Click **next**\. +6. You can schedule your job by toggling *Schedule off* to *Schedule to run*\. You can choose either or both options: + + + + * *Start on*: Choose a date for your scheduled job to run. The time zone is GMT-0400 (Eastern Daylight Time). If you do not choose a start date, the job will never run automatically and must be started manually. + + * *Repeat*: You can choose to schedule the repeated frequency (every minute to every month), exclude running the job on certain days, and choose an end date. If you do not choose to repeat the job, it runs one time if a start date is given, or does not run. + + + +7. Review your job settings and click **Create**\. The Pipelines job is listed under **Jobs** in your project\. + + + +## Learn more ## + + + + * [Viewing jobs across projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/job-views-projs.html) + + + +**Parent topic:**[Creating and managing jobs](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d1659b46a454170a597b0450fd99c16eec5b1ad.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d1659b46a454170a597b0450fd99c16eec5b1ad.md new file mode 100644 index 0000000..a04d50e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d1659b46a454170a597b0450fd99c16eec5b1ad.md @@ -0,0 +1,33 @@ +# Bitwise integer operations (SPSS Modeler) + +# Bitwise integer operations # + +These functions enable integers to be manipulated as bit patterns representing two's\-complement values, where bit position `N` has weight `2**N`\. + +Bits are numbered from 0 upward\. These operations act as though the sign bit of an integer is extended indefinitely to the left\. Thus, everywhere above its most significant bit, a positive integer has 0 bits and a negative integer has 1 bit\. + + + +CLEM bitwise integer operations + +Table 1\. CLEM bitwise integer operations + +| Function | Result | Description | +| ----------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `~~ INT1` | *Integer* | Produces the bitwise complement of the integer *INT1*\. That is, there is a 1 in the result for each bit position for which *INT1* has 0\. It is always true that `~~ INT = –(INT + 1)`\. | +| `INT1 || INT2` | *Integer* | The result of this operation is the bitwise "inclusive or" of *INT1* and *INT2*\. That is, there is a 1 in the result for each bit position for which there is a 1 in either *INT1* or *INT2* or both\. | +| `INT1 ||/& INT2` | *Integer* | The result of this operation is the bitwise "exclusive or" of *INT1* and *INT2*\. That is, there is a 1 in the result for each bit position for which there is a 1 in either *INT1* or *INT2* but not in both\. | +| `INT1 && INT2` | *Integer* | Produces the bitwise "and" of the integers *INT1* and *INT2*\. That is, there is a 1 in the result for each bit position for which there is a 1 in both *INT1* and *INT2*\. | +| `INT1 &&~~ INT2` | *Integer* | Produces the bitwise "and" of *INT1* and the bitwise complement of *INT2*\. That is, there is a 1 in the result for each bit position for which there is a 1 in *INT1* and a 0 in *INT2*\. This is the same as `INT1``&& (~~INT2)` and is useful for clearing bits of *INT1* set in *INT2*\. | +| `INT << N` | *Integer* | Produces the bit pattern of *INT1* shifted left by *N* positions\. A negative value for *N* produces a right shift\. | +| `INT >> N` | *Integer* | Produces the bit pattern of *INT1* shifted right by *N* positions\. A negative value for *N* produces a left shift\. | +| `INT1 &&=_0 INT2` | *Boolean* | Equivalent to the Boolean expression `INT1 && INT2 /== 0` but is more efficient\. | +| `INT1 &&/=_0 INT2` | *Boolean* | Equivalent to the Boolean expression `INT1 && INT2 == 0` but is more efficient\. | +| `integer_bitcount(INT)` | *Integer* | Counts the number of 1 or 0 bits in the two's\-complement representation of *INT*\. If *INT* is non\-negative, *N* is the number of 1 bits\. If *INT* is negative, it is the number of 0 bits\. Owing to the sign extension, there are an infinite number of 0 bits in a non\-negative integer or 1 bits in a negative integer\. It is always the case that `integer_bitcount(INT) = integer_bitcount(-(INT+1))`\. | +| `integer_leastbit(INT)` | *Integer* | Returns the bit position *N* of the least\-significant bit set in the integer *INT*\. *N* is the highest power of 2 by which *INT* divides exactly\. | +| `integer_length(INT)` | *Integer* | Returns the length in bits of *INT* as a two's\-complement integer\. That is, *N* is the smallest integer such that `INT < (1 << N) if INT >= 0 INT >= (–1 << N) if INT < 0`\. If *INT* is non\-negative, then the representation of *INT* as an unsigned integer requires a field of at least *N* bits\. Alternatively, a minimum of *N\+1* bits is required to represent *INT* as a signed integer, regardless of its sign\. | +| `testbit(INT, N)` | *Boolean* | Tests the bit at position *N* in the integer *INT* and returns the state of bit *N* as a Boolean value, which is true for 1 and false for 0\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d1783967cbf46a0b75539badbaa1d601bc9f412.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d1783967cbf46a0b75539badbaa1d601bc9f412.md new file mode 100644 index 0000000..846f053 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d1783967cbf46a0b75539badbaa1d601bc9f412.md @@ -0,0 +1,53 @@ +# Frameworks, fusion methods, and Python versions + +# Frameworks, fusion methods, and Python versions # + +These are the available machine learning model frameworks and model fusion methods for the Federated Learning model\. The software spec and frameworks are also compatible with specific Python versions\. + +## Frameworks and fusion methods ## + +This table lists supported software frameworks for building Federated Learning models\. For each framework you can see the supported model types, fusion methods, and hyperparameter options\. + + + +Table 1\. Frameworks and fusion methods + +| Frameworks | Model Type | Fusion Method | Description | Hyperparameters | +| ---------------------------------------------------------------------------------------------------------------------------------- | --------------- | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| **TensorFlow**
Used to build neural networks\.
See [Save the Tensorflow model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-models.html#tf-config)\. | Any | Simple Avg | Simplest aggregation that is used as a baseline where all parties' model updates are equally weighted\. | \- Rounds
\- Termination predicate *(Optional)*
\- Quorum *(Optional)*
\- Max Timeout *(Optional)* | +| | | Weighted Avg | Weights the average of updates based on the number of each party sample\. Use with training data sets of widely differing sizes\. | \- Rounds
\- Termination predicate *(Optional)*
\- Quorum *(Optional)*
\- Max Timeout *(Optional)* | +| **Scikit\-learn**
Used for predictive data analysis\.
See [Save the Scikit\-learn model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-models.html#sklearn-config)\. | Classification | Simple Avg | Simplest aggregation that is used as a baseline where all parties' model updates are equally weighted\. | \- Rounds
\- Termination predicate *(Optional)* | +| | | Weighted Avg | Weights the average of updates based on the number of each party sample\. Use with training data sets of widely differing sizes\. | \- Rounds
\- Termination predicate *(Optional)* | +| | Regression | Simple Avg | Simplest aggregation that is used as a baseline where all parties' model updates are equally weighted\. | \- Rounds | +| | | Weighted Avg | Weights the average of updates based on the number of each party sample\. Use with training data sets of widely differing sizes\. | \- Rounds | +| | XGBoost | XGBoost Classification | Use to build classification models that use XGBoost\. | \- Learning rate
\- Loss
\- Rounds
\- Number of classes | +| | | XGBoost Regression | Use to build regression models that use XGBoost\. | \- Learning rate
\- Rounds
\- Loss | +| | | K\-Means/SPAHM | Used to train KMeans (unsupervised learning) models when parties have heterogeneous data sets\. | \- Max Iter
\- N cluster | +| **Pytorch**
Used for training neural network models\.
See [Save the Pytorch model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-models.html#pytorch)\. | Any | Simple Avg | Simplest aggregation that is used as a baseline where all parties' model updates are equally weighted\. | \- Rounds
\- Epochs
\- Quorum *(Optional)*
\- Max Timeout *(Optional)* | +| | Neural Networks | Probabilistic Federated Neural Matching (PFNM) | Communication\-efficient method for fully connected neural networks when parties have heterogeneous data sets\. | \- Rounds
\- Termination accuracy *(Optional)*
\- Epochs
\- sigma
\- sigma0
\- gamma
\- iters | + + + +## Software specifications and Python version by framework ## + +This table lists the software spec and Python versions available for each framework\. + + + +Software specifications and Python version by framework + +| Watson Studio frameworks | Python version | Software Spec | Python Client Extras | Framework package | +| ------------------------ | -------------- | ----------------------- | -------------------- | --------------------- | +| scikit\-learn | 3\.10 | runtime\-22\.2\-py3\.10 | fl\-rt22\.2\-py3\.10 | scikit\-learn 1\.1\.1 | +| Tensorflow | 3\.10 | runtime\-22\.2\-py3\.10 | fl\-rt22\.2\-py3\.10 | tensorflow 2\.9\.2 | +| PyTorch | 3\.10 | runtime\-22\.2\-py3\.10 | fl\-rt22\.2\-py3\.10 | torch 1\.12\.1 | + + + +## Learn more ## + +[Hyperparameter definitions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-param.html) + +**Parent topic:**[IBM Federated Learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fed-lea.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d21c3dd339c26916f6df1ef3124c9d2d39c9acc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d21c3dd339c26916f6df1ef3124c9d2d39c9acc.md new file mode 100644 index 0000000..cc2acec --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d21c3dd339c26916f6df1ef3124c9d2d39c9acc.md @@ -0,0 +1,109 @@ +# Amazon S3 connection + +# Amazon S3 connection # + +To access your data in Amazon S3, create a connection asset for it\. + +Amazon S3 (Amazon Simple Storage Service) is a service that is offered by Amazon Web Services (AWS) that provides object storage through a web service interface\. + +For other types of S3\-compliant connections, you can use the [Generic S3 connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-generics3.html)\. + +## Create a connection to Amazon S3 ## + +To create the connection asset, you need these connection details: + + + + * **Bucket**: Bucket name that contains the files\. If your AWS credentials have permissions to list buckets and access all buckets, then you only need to supply the credentials\. If your credentials don't have the privilege to list buckets and can only access a particular bucket, then you need to specify the bucket\. + * **Endpoint URL**: Use for an AWS GovCloud instance\. Include the region code\. For example, `https://s3..amazonaws.com`\. For the list of region codes, see [AWS service endpoints](https://docs.aws.amazon.com/general/latest/gr/rande.html#regional-endpoints)\. + * **Region**: Amazon Web Services (AWS) region\. If you specify an Endpoint URL that is not for the AWS default region (us\-west\-2), then you should also enter a value for Region\. + + + +Select **Server proxy** to access the Amazon S3 data source through a proxy server\. Depending on its setup, a proxy server can provide load balancing, increased security, and privacy\. The proxy server settings are independent of the authentication credentials and the personal or shared credentials selection\. + + + + * **Proxy host**: The proxy URL\. For example, `https://proxy.example.com`\. + * **Proxy port number**: The port number to connect to the proxy server\. For example, `8080` or `8443`\. + * The **Proxy username** and **Proxy password** fields are optional\. + + + +### Credentials ### + +The combination of **Access key** and **Secret key** is the minimum credentials\. + +If the Amazon S3 account owner has set up temporary credentials or a Role ARN (Amazon Resource Name), enter the values provided by the Amazon S3 account owner for the applicable authentication combination: + + + + * **Access key**, **Secret key**, and **Session token** + * **Access key**, **Secret key**, **Role ARN**, **Role session name**, and optional **Duration seconds** + * **Access key**, **Secret key**, **Role ARN**, **Role session name**, **External ID**, and optional **Duration seconds** + + + +For setup instructions for the Amazon S3 account owner, see [Setting up temporary credentials or a Role ARN for Amazon S3](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-az3-tempcreds.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Amazon S3 connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Decision Optimization + * Notebooks\. Click **Read data** on the **Code snippets** pane to get the connection credentials and load the data into a data structure\. See [Load data from data source connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html#conns)\. + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Amazon S3 setup ## + +See the [Amazon Simple Storage Service User Guide](https://docs.aws.amazon.com/AmazonS3/latest/userguide/setting-up-s3.html) for the setup steps\. + +## Restriction ## + +Folders cannot be named with the slash symbol (`/`) because the slash symbol is a delimiter for the file structure\. + +## Supported file types ## + +The Amazon S3 connection supports these file types: Avro, CSV, Delimited text, Excel, JSON, ORC, Parquet, SAS, SAV, SHP, and XML\. + +## Learn more ## + +[Amazon S3 documentation](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) + +**Related connection**: [Generic S3 connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-generics3.html) + +**Parent topic**: [Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d393a73ebc623578dd6da2c09c20e97fae074d4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d393a73ebc623578dd6da2c09c20e97fae074d4.md new file mode 100644 index 0000000..17f5407 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d393a73ebc623578dd6da2c09c20e97fae074d4.md @@ -0,0 +1,75 @@ +# IBM Cloudant connection + +# IBM Cloudant connection # + +To access your data in IBM Cloudant, create a connection asset for it\. + +Cloudant is a JSON document database available in IBM Cloud\. + +## Create a connection to Cloudant ## + +To create the connection asset, you need these connection details: + + + + * URL to the Cloudant database + * Database name + * Username and password + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Cloudant connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Cloudant setup ## + +To set up the Cloudant database on IBM Cloud, see [Getting started with IBM Cloudant](https://cloud.ibm.com/docs/Cloudant?topic=Cloudant-getting-started-with-cloudant)\. +When you create your Cloudant service, for **Authentication method**, select **IAM and legacy credentials**\. + +## Restriction ## + +IBM Cloud Query (CQ) is not supported\. + +## Learn more ## + +[IBM Cloudant docs](https://cloud.ibm.com/docs/Cloudant) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d46d1240377aea562f14a560cb9f24df33edf88.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d46d1240377aea562f14a560cb9f24df33edf88.md new file mode 100644 index 0000000..bb982ec --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d46d1240377aea562f14a560cb9f24df33edf88.md @@ -0,0 +1,9 @@ +# Extension Output node (SPSS Modeler) + +# Extension Output node # + +With the Extension Output node, you can run R scripts or Python for Spark scripts to produce output\. + +After adding the node to your canvas, double\-click the node to open its properties\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d5d80dff65ee4195713eeeb43f1291b79779a6b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d5d80dff65ee4195713eeeb43f1291b79779a6b.md new file mode 100644 index 0000000..39f27bb --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1d5d80dff65ee4195713eeeb43f1291b79779a6b.md @@ -0,0 +1,43 @@ +# Bayes Net node (SPSS Modeler) + +# Bayes Net node # + +The Bayesian Network node enables you to build a probability model by combining observed and recorded evidence with "common\-sense" real\-world knowledge to establish the likelihood of occurrences by using seemingly unlinked attributes\. The node focuses on Tree Augmented Naïve Bayes (TAN) and Markov Blanket networks that are primarily used for classification\. + +Bayesian networks are used for making predictions in many varied situations; some examples are: + + + + * Selecting loan opportunities with low default risk\. + * Estimating when equipment will need service, parts, or replacement, based on sensor input and existing records\. + * Resolving customer problems via online troubleshooting tools\. + * Diagnosing and troubleshooting cellular telephone networks in real\-time\. + * Assessing the potential risks and rewards of research\-and\-development projects in order to focus resources on the best opportunities\. + + + +A Bayesian network is a graphical model that displays variables (often referred to as **nodes**) in a dataset and the probabilistic, or conditional, independencies between them\. Causal relationships between nodes may be represented by a Bayesian network; however, the links in the network (also known as **arcs**) do not necessarily represent direct cause and effect\. For example, a Bayesian network can be used to calculate the probability of a patient having a specific disease, given the presence or absence of certain symptoms and other relevant data, if the probabilistic independencies between symptoms and disease as displayed on the graph hold true\. Networks are very robust where information is missing and make the best possible prediction using whatever information is present\. + +A common, basic, example of a Bayesian network was created by Lauritzen and Spiegelhalter (1988)\. It is often referred to as the "Asia" model and is a simplified version of a network that may be used to diagnose a doctor's new patients; the direction of the links roughly corresponding to causality\. Each node represents a facet that may relate to the patient's condition; for example, "Smoking" indicates that they are a confirmed smoker, and "VisitAsia" shows if they recently visited Asia\. Probability relationships are shown by the links between any nodes; for example, smoking increases the chances of the patient developing both bronchitis and lung cancer, whereas age only seems to be associated with the possibility of developing lung cancer\. In the same way, abnormalities on an x\-ray of the lungs may be caused by either tuberculosis or lung cancer, while the chances of a patient suffering from shortness of breath (dyspnea) are increased if they also suffer from either bronchitis or lung cancer\. + +Figure 1\. Lauritzen and Spegelhalter's Asia network example + +![Lauritzen and Spegelhalter's Asia network example](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/bn_asia.jpg) + +There are several reasons why you might decide to use a Bayesian network: + + + + * It helps you learn about causal relationships\. From this, it enables you to understand a problem area and to predict the consequences of any intervention\. + * The network provides an efficient approach for avoiding the overfitting of data\. + * A clear visualization of the relationships involved is easily observed\. + + + +Requirements\. Target fields must be categorical and can have a measurement level of *Nominal*, *Ordinal*, or *Flag*\. Inputs can be fields of any type\. Continuous (numeric range) input fields will be automatically binned; however, if the distribution is skewed, you may obtain better results by manually binning the fields using a Binning node before the Bayesian Network node\. For example, use Optimal Binning where the Supervisor field is the same as the Bayesian Network node Target field\. + +Example\. An analyst for a bank wants to be able to predict customers, or potential customers, who are likely to default on their loan repayments\. You can use a Bayesian network model to identify the characteristics of customers most likely to default, and build several different types of model to establish which is the best at predicting potential defaulters\. + +Example\. A telecommunications operator wants to reduce the number of customers who leave the business (known as "churn"), and update the model on a monthly basis using each preceding month's data\. You can use a Bayesian network model to identify the characteristics of customers most likely to churn, and continue training the model each month with the new data\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1dd1ed59e93da4f6576e7eb1e420213ab34dd1dd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1dd1ed59e93da4f6576e7eb1e420213ab34dd1dd.md new file mode 100644 index 0000000..73ffd76 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1dd1ed59e93da4f6576e7eb1e420213ab34dd1dd.md @@ -0,0 +1,13 @@ +# KNN node (SPSS Modeler) + +# KNN node # + +Nearest Neighbor Analysis is a method for classifying cases based on their similarity to other cases\. In machine learning, it was developed as a way to recognize patterns of data without requiring an exact match to any stored patterns, or cases\. Similar cases are near each other and dissimilar cases are distant from each other\. Thus, the distance between two cases is a measure of their dissimilarity\. + +Cases that are near each other are said to be "neighbors\." When a new case (holdout) is presented, its distance from each of the cases in the model is computed\. The classifications of the most similar cases – the nearest neighbors – are tallied and the new case is placed into the category that contains the greatest number of nearest neighbors\. + +You can specify the number of nearest neighbors to examine; this value is called `k`\. The pictures show how a new case would be classified using two different values of `k`\. When `k` = 5, the new case is placed in category `1` because a majority of the nearest neighbors belong to category `1`\. However, when `k` = 9, the new case is placed in category `0` because a majority of the nearest neighbors belong to category `0`\. + +Nearest neighbor analysis can also be used to compute values for a continuous target\. In this situation, the average or median target value of the nearest neighbors is used to obtain the predicted value for the new case\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1e28b88cde98715bcd89dcf48a459002fcda1e0e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1e28b88cde98715bcd89dcf48a459002fcda1e0e.md new file mode 100644 index 0000000..c174efc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1e28b88cde98715bcd89dcf48a459002fcda1e0e.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Toxicity # + +![icon for misuse risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-misuse.svg)Risks associated with outputMisuseNew + +### Description ### + +Toxicity is the possibility that a model could be used to generate toxic, hateful, abusive, or aggressive content\. + +### Why is toxicity a concern for foundation models? ### + +Intentionally spreading toxic, hateful, abusive, or aggressive content is unethical and can be illegal\. Recipients of such content might face more serious harms\. A model that has this potential must be properly governed\. Otherwise, business entities could face fines, reputational harms, and other legal consequences\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1ec0aabfa78901776901cb2c57aff822855b6b5e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1ec0aabfa78901776901cb2c57aff822855b6b5e.md new file mode 100644 index 0000000..750b7a1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1ec0aabfa78901776901cb2c57aff822855b6b5e.md @@ -0,0 +1,81 @@ +# Hierarchical text categorization + +# Hierarchical text categorization # + +The Watson Natural Language Processing Categories block assigns individual nodes within a hierarchical taxonomy to an input document\. For example, in the text *IBM announces new advances in quantum computing*, examples of extracted categories are `technology and computing/hardware/computer` and `technology and computing/operating systems`\. These categories represent level 3 and level 2 nodes in a hierarchical taxonomy\. + +This block differs from the Classification block in that training starts from a set of seed phrases associated with each node in the taxonomy, and does not require labeled documents\. + +Note that the Hierarchical text categorization block can only be used in a notebook that is started in an environment based on Runtime 22\.2 or Runtime 23\.1 that includes the Watson Natural Language Processing library\. + +**Block name** + +`categories_esa_en_stock` + +**Supported languages** + +The Categories block is available for the following languages\. For a list of the language codes and the corresponding language, see [Language codes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html#lang-codes)\. + +de, en + +**Capabilities** + +Use this block to determine the topics of documents on the web by categorizing web pages into a taxonomy of general domain topics, for ad placement and content recommendation\. The model was tested on data from news reports and general web pages\. + +For a list of the categories that can be returned, see [Category types](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-returned-categories.html)\. + +**Dependencies on other blocks** + +The following block must run before you can run the hierarchical categorization block: + + + + * `syntax_izumo__stock` + + + +**Code sample** + + import watson_nlp + + # Load Syntax and a Categories model for English + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + categories_model = watson_nlp.load('categories_esa_en_stock') + + # Run the syntax model on the input text + syntax_prediction = syntax_model.run('IBM announced new advances in quantum computing') + + # Run the categories model on the result of syntax + categories = categories_model.run(syntax_prediction) + print(categories) + +Output of the code sample: + + { + "categories": [ + { + "labels": + "technology & computing", + "computing" + ], + "score": 0.992489, + "explanation": ] + }, + { + "labels": + "science", + "physics" + ], + "score": 0.945449, + "explanation": ] + } + ], + "producer_id": { + "name": "ESA Hierarchical Categories", + "version": "1.0.0" + } + } + +**Parent topic:**[Watson Natural Language Processing task catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1f14865c04b28b02ee0760d7099554a916e26926.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1f14865c04b28b02ee0760d7099554a916e26926.md new file mode 100644 index 0000000..6e1f7a5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1f14865c04b28b02ee0760d7099554a916e26926.md @@ -0,0 +1,70 @@ +# Creating the catalog for platform connections + +# Creating the catalog for platform connections # + +You can create a Platform assets catalog to share connections across your organization\. Any user who you add as a collaborator to the catalog can see these connections\. + +You can add an unlimited number of collaborators and connection assets to the Platform assets catalog\. + +If you are signed up for both Cloud Pak for Data as a Service and watsonx, you share a single Platform assets catalog between the two platforms\. Any connection assets that you add to the catalog on either platform are available in both platforms\. However, if you add other types of assets to the Platform assets catalog on Cloud Pak for Data as a Service, you can't access those types of assets on watsonx\. + +## Requirements ## + +Before you create the Platform assets catalog, understand the required permissions and the requirements for storage and duplicate handling\. + +**Required permission** : You must have the IAM Administrator role in the IBM Cloud account\. : To view your roles, go to **Administration > Access (IAM**)\. Then select **Roles** in the IBM Cloud console\. + +**Storage requirement** : You must specify the IBM Cloud Object Storage instance configured during [IBM Cloud account setup](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/storage-options.html)\. If you are not an administrator for the IBM Cloud Object Storage instance, it must be [configured to allow catalog creation](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html)\. + +**Duplicate asset handling** : Assets are considered duplicates if they have the same asset type and the same name\. : Select how to handle duplicate assets: : \- Update original assets : \- Overwrite original assets : \- Allow duplicates (default) : \- Preserve original assets and reject duplicates : You can change the duplicate handling preferences at any time on the catalog **Settings** page\. + +## Creating the Platform assets catalog ## + +To create the Platform assets catalog: + + + +1. From the main menu, choose **Data > Platform connections**\. +2. Click **Create catalog**\. +3. Select the IBM Cloud Object Storage service\. If you don't have an existing service instance, [create a IBM Cloud Object Storage service instance](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html) and then refresh the page\. +4. Click **Create**\. The Platform assets catalog is created in a dedicated storage bucket\. Initially, you are the only collaborator in the catalog\. +5. Add collaborators to the catalog\. Go to the **Access control** page in the catalog and add collaborators\. You assign each user a [role](https://dataplatform.cloud.ibm.com/docs/content/wsj/catalog/platform-assets.html?context=cdpaas&locale=en#roles): + + + + * Assign the **Admin** role at least one other user so that you are not the only person who can add collaborators. + * Assign the **Editor** role to all users who are responsible for adding connections to the catalog. + * Assign the **Viewer** role to the users who need to find connections and use them in projects. + + + + You can give all the users access to the Platform assets catalog by assigning the **Viewer** role to the **Public Access** group. By default, all users in your account are members of the **Public Access** group. See [add collaborators](https://dataplatform.cloud.ibm.com/docs/content/wsj/catalog/catalog-collaborators.html). + +6. Add connections to the catalog\. You can delegate this step to other collaborators who have the **Admin** or **Editor** role\. See [Add connections to the Platform assets catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + + + +### Platform assets catalog collaborator roles ### + +The Platform assets catalog roles provide the permissions in the following table\. + + + +| Action | Viewer | Editor | Admin | +| --------------------------- | ------ | ------ | ----- | +| View connections | ✓ | ✓ | ✓ | +| Use connections in projects | ✓ | ✓ | ✓ | +| Use connections in spaces | ✓ | ✓ | ✓ | +| View collaborators | ✓ | ✓ | ✓ | +| Add connections | | ✓ | ✓ | +| Modify connections | | ✓ | ✓ | +| Delete connections | | ✓ | ✓ | +| Add or remove collaborators | | | ✓ | +| Change collaborator roles | | | ✓ | +| Delete the catalog | | | ✓ | + + + +**Parent topic:**[Setting up the platform for administrators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-platform.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1f781da5779dafefbb53038f71a18bbe2649117b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1f781da5779dafefbb53038f71a18bbe2649117b.md new file mode 100644 index 0000000..4cc74d9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1f781da5779dafefbb53038f71a18bbe2649117b.md @@ -0,0 +1,52 @@ +# associationrulesnode properties + +# associationrulesnode properties # + +![Association Rules node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/gsar_node_icon.png)The Association Rules node is similar to the Apriori Node\. However, unlike Apriori, the Association Rules node can process list data\. In addition, the Association Rules node can be used with SPSS Analytic Server to process big data and take advantage of faster parallel processing\. + + + +associationrulesnode properties + +Table 1\. associationrulesnode properties + +| `associationrulesnode` properties | Data type | Property description | +| --------------------------------- | ---------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `predictions` | *field* | Fields in this list can only appear as a predictor of a rule | +| `conditions` | *\[field1\.\.\.fieldN\]* | Fields in this list can only appear as a condition of a rule | +| `max_rule_conditions` | *integer* | The maximum number of conditions that can be included in a single rule\. Minimum 1, maximum 9\. | +| `max_rule_predictions` | *integer* | The maximum number of predictions that can be included in a single rule\. Minimum 1, maximum 5\. | +| `max_num_rules` | *integer* | The maximum number of rules that can be considered as part of rule building\. Minimum 1, maximum 10,000\. | +| `rule_criterion_top_n` | `Confidence``Rulesupport``Lift``Conditionsupport``Deployability` | The rule criterion that determines the value by which the top "N" rules in the model are chosen\. | +| `true_flags` | *Boolean* | Setting as *Y* determines that only the true values for flag fields are considered during rule building\. | +| `rule_criterion` | *Boolean* | Setting as *Y* determines that the rule criterion values are used for excluding rules during model building\. | +| `min_confidence` | *number* | 0\.1 to 100 \- the percentage value for the minimum required confidence level for a rule produced by the model\. If the model produces a rule with a confidence level less than the value specified here the rule is discarded\. | +| `min_rule_support` | *number* | 0\.1 to 100 \- the percentage value for the minimum required rule support for a rule produced by the model\. If the model produces a rule with a rule support level less than the specified value the rule is discarded\. | +| `min_condition_support` | *number* | 0\.1 to 100 \- the percentage value for the minimum required condition support for a rule produced by the model\. If the model produces a rule with a condition support level less than the specified value the rule is discarded\. | +| `min_lift` | *integer* | 1 to 10 \- represents the minimum required lift for a rule produced by the model\. If the model produces a rule with a lift level less than the specified value the rule is discarded\. | +| `exclude_rules` | *Boolean* | Used to select a list of related fields from which you do not want the model to create rules\. Example: `set :gsarsnode.exclude_rules = [field1,field2, field3]],field4, field5]]]` \- where each list of fields separated by \[\] is a row in the table\. | +| `num_bins` | *integer* | Set the number of automatic bins that continuous fields are binned to\. Minimum 2, maximum 10\. | +| `max_list_length` | *integer* | Applies to any list fields for which the maximum length is not known\. Elements in the list up until the number specified here are included in the model build; any further elements are discarded\. Minimum 1, maximum 100\. | +| `output_confidence` | *Boolean* | | +| `output_rule_support` | *Boolean* | | +| `output_lift` | *Boolean* | | +| `output_condition_support` | *Boolean* | | +| `output_deployability` | *Boolean* | | +| `rules_to_display` | `upto``all` | The maximum number of rules to display in the output tables\. | +| `display_upto` | *integer* | If `upto` is set in `rules_to_display`, set the number of rules to display in the output tables\. Minimum 1\. | +| `field_transformations` | *Boolean* | | +| `records_summary` | *Boolean* | | +| `rule_statistics` | *Boolean* | | +| `most_frequent_values` | *Boolean* | | +| `most_frequent_fields` | *Boolean* | | +| `word_cloud` | *Boolean* | | +| `word_cloud_sort` | `Confidence``Rulesupport``Lift``Conditionsupport``Deployability` | | +| `word_cloud_display` | *integer* | Minimum 1, maximum 20 | +| `max_predictions` | *integer* | The maximum number of rules that can be applied to each input to the score\. | +| `criterion` | `Confidence``Rulesupport``Lift``Conditionsupport``Deployability` | Select the measure used to determine the strength of rules\. | +| `allow_repeats` | *Boolean* | Determine whether rules with the same prediction are included in the score\. | +| `check_input` | `NoPredictions``Predictions``NoCheck` | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1fefe3c6f1a20841fa1ae6afaa85cc7ff36778ac.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1fefe3c6f1a20841fa1ae6afaa85cc7ff36778ac.md new file mode 100644 index 0000000..bb35161 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/1fefe3c6f1a20841fa1ae6afaa85cc7ff36778ac.md @@ -0,0 +1,107 @@ +# Metadata: Information about data + +# Metadata: Information about data # + +Because nodes are connected together in a flow, information about the columns or fields that are available at each node is available\. For example, in the SPSS Modeler user interface, this allows you to select which fields to sort or aggregate by\. This information is called the data model\. + +Scripts can also access the data model by looking at the fields coming into or out of a node\. For some nodes, the input and output data models are the same (for example, a Sort node simply reorders the records but doesn't change the data model)\. Some, such as the Derive node, can add new fields\. Others, such as the Filter node, can rename or remove fields\. + +In the following example, the script takes a standard IBM® SPSS® Modeler druglearn\.str flow, and for each field, builds a model with one of the input fields dropped\. It does this by: + + + +1. Accessing the output data model from the Type node\. +2. Looping through each field in the output data model\. +3. Modifying the Filter node for each input field\. +4. Changing the name of the model being built\. +5. Running the model build node\. + + + +Note: Before running the script in the druglean\.str flow, remember to set the scripting language to Python if the flow was created in an old version of IBM SPSS Modeler desktop and its scripting language is set to Legacy)\. + + import modeler.api + + stream = modeler.script.stream() + filternode = stream.findByType("filter", None) + typenode = stream.findByType("type", None) + c50node = stream.findByType("c50", None) + # Always use a custom model name + c50node.setPropertyValue("use_model_name", True) + + lastRemoved = None + fields = typenode.getOutputDataModel() + for field in fields: + # If this is the target field then ignore it + if field.getModelingRole() == modeler.api.ModelingRole.OUT: + continue + + # Re-enable the field that was most recently removed + if lastRemoved != None: + filternode.setKeyedPropertyValue("include", lastRemoved, True) + + # Remove the field + lastRemoved = field.getColumnName() + filternode.setKeyedPropertyValue("include", lastRemoved, False) + + # Set the name of the new model then run the build + c50node.setPropertyValue("model_name", "Exclude " + lastRemoved) + c50node.run([]) + +The `DataModel` object provides a number of methods for accessing information about the fields or columns within the data model\. These methods are summarized in the following table\. + + + +DataModel object methods for accessing information about fields or columns + +Table 1\. DataModel object methods for accessing information about fields or columns + +| Method | Return type | Description | +| ------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------- | +| `d.getColumnCount()` | *int* | Returns the number of columns in the data model\. | +| `d.columnIterator()` | Iterator | Returns an iterator that returns each column in the "natural" insert order\. The iterator returns instances of `Column`\. | +| `d.nameIterator()` | Iterator | Returns an iterator that returns the name of each column in the "natural" insert order\. | +| `d.contains(name)` | *Boolean* | Returns `True` if a column with the supplied name exists in this DataModel, `False` otherwise\. | +| `d.getColumn(name)` | Column | Returns the column with the specified name\. | +| `d.getColumnGroup(name)` | ColumnGroup | Returns the named column group or `None` if no such column group exists\. | +| `d.getColumnGroupCount()` | *int* | Returns the number of column groups in this data model\. | +| `d.columnGroupIterator()` | Iterator | Returns an iterator that returns each column group in turn\. | +| `d.toArray()` | Column\[\] | Returns the data model as an array of columns\. The columns are ordered in their "natural" insert order\. | + + + +Each field (`Column` object) includes a number of methods for accessing information about the column\. The following table shows a selection of these\. + + + +Column object methods for accessing information about the column + +Table 2\. Column object methods for accessing information about the column + +| Method | Return type | Description | +| ------------------------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------- | +| `c.getColumnName()` | *string* | Returns the name of the column\. | +| `c.getColumnLabel()` | *string* | Returns the label of the column or an empty string if there is no label associated with the column\. | +| `c.getMeasureType()` | MeasureType | Returns the measure type for the column\. | +| `c.getStorageType()` | StorageType | Returns the storage type for the column\. | +| `c.isMeasureDiscrete()` | *Boolean* | Returns `True` if the column is discrete\. Columns that are either a set or a flag are considered discrete\. | +| `c.isModelOutputColumn()` | *Boolean* | Returns `True` if the column is a model output column\. | +| `c.isStorageDatetime()` | *Boolean* | Returns `True` if the column's storage is a time, date or timestamp value\. | +| `c.isStorageNumeric()` | *Boolean* | Returns `True` if the column's storage is an integer or a real number\. | +| `c.isValidValue(value)` | *Boolean* | Returns `True` if the specified value is valid for this storage, and `valid` when the valid column values are known\. | +| `c.getModelingRole()` | ModelingRole | Returns the modeling role for the column\. | +| `c.getSetValues()` | Object\[\] | Returns an array of valid values for the column, or `None` if either the values are not known or the column is not a set\. | +| `c.getValueLabel(value)` | *string* | Returns the label for the value in the column, or an empty string if there is no label associated with the value\. | +| `c.getFalseFlag()` | Object | Returns the "false" indicator value for the column, or `None` if either the value is not known or the column is not a flag\. | +| `c.getTrueFlag()` | Object | Returns the "true" indicator value for the column, or `None` if either the value is not known or the column is not a flag\. | +| `c.getLowerBound()` | Object | Returns the lower bound value for the values in the column, or `None` if either the value is not known or the column is not continuous\. | +| `c.getUpperBound()` | Object | Returns the upper bound value for the values in the column, or `None` if either the value is not known or the column is not continuous\. | + + + +Note that most of the methods that access information about a column have equivalent methods defined on the `DataModel` object itself\. For example, the two following statements are equivalent: + + dataModel.getColumn("someName").getModelingRole() + dataModel.getModelingRole("someName") + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/204f36069ee071b185a1bce8370946a50bddcdd5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/204f36069ee071b185a1bce8370946a50bddcdd5.md new file mode 100644 index 0000000..a2f4dd0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/204f36069ee071b185a1bce8370946a50bddcdd5.md @@ -0,0 +1,102 @@ +# Creating synthetic data from imported data + +# Creating synthetic data from imported data # + +Supported data sources for Synthetic Data Generator\. + +Using Synthetic Data Generator, you can connect to your data no matter where it lives, using either connectors or data files\. + +## Data size ## + +The Synthetic Data Generator environment can import up to ~2\.5GB of data\. + +## Connectors ## + +The following table lists the data sources that you can connect to using Synthetic Data Generator\. + + + +| Connector | Read Only | Read & Write | Notes | +| ------------------------------------------------------------------------------------------------------ | --------- | ------------ | --------------------------------------------------------------------- | +| [Amazon RDS for MySQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azrds-mysql.html) | | ✓ | **Replace the data set** option isn't supported for this connection\. | +| [Amazon RDS for PostgreSQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azrds-postresql.html) | | ✓ | **Replace the data set** option isn't supported for this connection\. | +| [Amazon Redshift](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-redshift.html) | | ✓ | | +| [Amazon S3](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-amazon-s3.html) | | ✓ | | +| [Apache Cassandra](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cassandra.html) | | ✓ | | +| [Apache Derby](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-derby.html) | | ✓ | | +| [Apache HDFS (formerly known as "Hortonworks HDFS")](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-hdfs.html) | | ✓ | | +| [Apache Hive](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-hive.html) | ✓ | | | +| [Box](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-box.html) | ✓ | ✓ | | +| [Cloud Object\-Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html) | | ✓ | | +| [Cloud Object\-Storage (infrastructure)](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos-infra.html) | | ✓ | | +| [Cloudant](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cloudant.html) | | ✓ | | +| [Cloudera Impala](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cloudera.html) | ✓ | | | +| [Cognos\-Analytics](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cognos.html) | ✓ | | | +| [Data Virtualization Manager for z/OS](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-datavirt-z.html) | ✓ | | | +| [Db2](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2.html) | | ✓ | | +| [Db2 Big SQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-bigsql.html) | | ✓ | | +| [Db2 for i](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2i.html) | | ✓ | | +| [Db2 for z/OS](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2zos.html) | | ✓ | | +| [Db2 on Cloud](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-cloud.html) | | ✓ | | +| [Db2 Warehouse](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-wh.html) | | ✓ | | +| [Dropbox](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-dropbox.html) | | ✓ | | +| [FTP (remote file system transfer)](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-ftp.html) | | ✓ | | +| [Google BigQuery](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-bigquery.html) | | ✓ | | +| [Google Cloud Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cloud-storage.html) | | ✓ | | +| [Greenplum](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-greenplum.html) | | ✓ | | +| [HTTP](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-http.html) | ✓ | | | +| [IBM Cloud Databases for MySQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-compose-mysql.html) | | ✓ | | +| [IBM Cloud Data Engine](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sqlquery.html) | ✓ | | | +| [IBM Cloud Databases for DataStax](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-datastax.html) | | ✓ | | +| [IBM Cloud Databases for MongoDB](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mongodb.html) | ✓ | | | +| [IBM Cloud Databases for PostgreSQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-dbase-postgresql.html) | | ✓ | | +| [IBM Watson Query](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-data-virtual.html) | ✓ | | | +| [Informix](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-informix.html) | | ✓ | | +| [Looker](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-looker.html) | ✓ | | | +| [MariaDB](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mariadb.html) | | | | +| [Microsoft Azure Blob Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azureblob.html) | | ✓ | | +| [Microsoft Azure Cosmos DB](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cosmosdb.html) | | ✓ | | +| [Microsoft Azure Data Lake Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azuredls.html) | | ✓ | | +| [Microsoft Azure File Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azurefs.html) | | ✓ | | +| [Microsoft Azure SQL Database](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azure-sql.html) | | ✓ | | +| [Microsoft SQL Server](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sql-server.html) | | ✓ | SQL pushback isn't supported when Active Directory is enabled\. | +| [MongoDB](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mongodb.html) | ✓ | | | +| [MySQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mysql.html) | | ✓ | | +| [Netezza Performance Server](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-puredata.html) | | ✓ | | +| [OData](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-odata.html) | | ✓ | | +| [Oracle](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-oracle.html) | | ✓ | | +| [Planning Analytics (formerly known as "IBM TM1")](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-plananalytics.html) | | ✓ | Only the **Replace the data set** option is supported\. | +| [PostgreSQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-postgresql.html) | | ✓ | | +| [Presto](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-presto.html) | ✓ | | | +| [Salesforce\.com](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-salesforce.html) | ✓ | | | +| [SAP ASE](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sap-ase.html) | | ✓ | | +| [SAP IQ](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sap-iq.html) | ✓ | | | +| [SAP OData](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sapodata.html) | | ✓ | | +| [Snowflake](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-snowflake.html) | | ✓ | | +| [Tableau](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-tableau.html) | ✓ | | | +| [Teradata](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-teradata.html) | | ✓ | + + + +## Data files ## + +In addition to using data from remote data sources or integrated databases, you can use data from files\. You can work with data from the following types of files using Synthetic Data Generator\. + + + +| Connector | Read Only | Read & Write | +| ----------------- | --------- | ------------ | +| AVRO | ✓ | | +| CSV/delimited | | ✓ | +| Excel (XLS, XLSX) | | ✓ | +| JSON | | ✓ | +| ORC | | | +| Parquet | | | +| SAS | ✓ | | +| SAV | | ✓ | +| SHP | | | +| XML | | ✓ | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/20cfe34d5494ab0ae2ef8b6f65396edbf667f688.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/20cfe34d5494ab0ae2ef8b6f65396edbf667f688.md new file mode 100644 index 0000000..0fbc52d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/20cfe34d5494ab0ae2ef8b6f65396edbf667f688.md @@ -0,0 +1,27 @@ +# Space-Time-Boxes node (SPSS Modeler) + +# Space\-Time\-Boxes node # + +Space\-Time\-Boxes (STB) are an extension of Geohashed spatial locations\. More specifically, an STB is an alphanumeric string that represents a regularly shaped region of space and time\. + +For example, the STB dr5ru7\|2013\-01\-01 00:00:00\|2013\-01\-01 00:15:00 is made up of the following three parts: + + + + * The geohash dr5ru7 + * The start timestamp 2013\-01\-01 00:00:00 + * The end timestamp 2013\-01\-01 00:15:00 + + + +As an example, you could use space and time information to improve confidence that two entities are the same because they are virtually in the same place at the same time\. Alternatively, you could improve the accuracy of relationship identification by showing that two entities are related due to their proximity in space and time\. + +In the node properties, you can choose the Individual Records or Hangouts mode as appropriate for your requirements\. Both modes require the same basic details, as follows: + +Latitude field\. Select the field that identifies the latitude (in WGS84 coordinate system)\. + +Longitude field\. Select the field that identifies the longitude (in WGS84 coordinate system)\. + +Timestamp field\. Select the field that identifies the time or date\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/20d6b2732be17c12226f186559fbea647799f3b8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/20d6b2732be17c12226f186559fbea647799f3b8.md new file mode 100644 index 0000000..49348e3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/20d6b2732be17c12226f186559fbea647799f3b8.md @@ -0,0 +1,45 @@ +# Examples + +# Examples # + +The `print` keyword prints the arguments immediately following it\. If the statement is followed by a comma, a new line isn't included in the output\. For example: + + print "This demonstrates the use of a", + print " comma at the end of a print statement." + +This will result in the following output: + + This demonstrates the use of a comma at the end of a print statement. + +The `for` statement iterates through a block of code\. For example: + + mylist1 = ["one", "two", "three"] + for lv in mylist1: + print lv + continue + +In this example, three strings are assigned to the list `mylist1`\. The elements of the list are then printed, with one element of each line\. This results in the following output: + + one + two + three + +In this example, the iterator `lv` takes the value of each element in the list `mylist1` in turn as the `for` loop implements the code block for each element\. An iterator can be any valid identifier of any length\. + +The `if` statement is a conditional statement\. It evaluates the condition and returns either true or false, depending on the result of the evaluation\. For example: + + mylist1 = ["one", "two", "three"] + for lv in mylist1: + if lv == "two" + print "The value of lv is ", lv + else + print "The value of lv is not two, but ", lv + continue + +In this example, the value of the iterator `lv` is evaluated\. If the value of `lv` is `two`, a different string is returned to the string that's returned if the value of `lv` is not `two`\. This results in the following output: + + The value of lv is not two, but one + The value of lv is two + The value of lv is not two, but three + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/21db0146b79b8256259507c62876e01ada143bd6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/21db0146b79b8256259507c62876e01ada143bd6.md new file mode 100644 index 0000000..67dec74 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/21db0146b79b8256259507c62876e01ada143bd6.md @@ -0,0 +1,29 @@ +# Measurement levels (SPSS Modeler) + +# Measurement levels # + +The measure, also referred to as measurement level, describes the usage of data fields in SPSS Modeler\. + +You can specify the Measure in the node properties of an import node or a Type node\. For example, you may want to set the measure for an integer field with values of `1` and `0` to Flag\. This usually indicates that `1 = True` and `0 = False`\. + +Storage versus measurement\. Note that the measurement level of a field is different from its storage type, which indicates whether data is stored as a string, integer, real number, date, time, or timestamp\. While you can modify data types at any point in a flow by using a Type node, storage must be determined at the source when reading data in (although you can subsequently change it using a conversion function)\. + +The following measurement levels are available: + + + + * Default\. Data whose storage type and values are unknown (for example, because they haven't yet been read) are displayed as Default\. + * Continuous\. Used to describe numeric values, such as a range of 0–100 or 0\.75–1\.25\. A continuous value can be an integer, real number, or date/time\. + * Categorical\. Used for string values when an exact number of distinct values is unknown\. This is an uninstantiated data type, meaning that all possible information about the storage and usage of the data is not yet known\. After data is read, the measurement level will be Flag, Nominal, or Typeless, depending on the maximum number of members for nominal fields specified\. + * Flag\. Used for data with two distinct values that indicate the presence or absence of a trait, such as `true` and `false`, `Yes` and `No`, or `0` and `1`\. The values used may vary, but one must always be designated as the "true" value, and the other as the "false" value\. Data may be represented as text, integer, real number, date, time, or timestamp\. + * Nominal\. Used to describe data with multiple distinct values, each treated as a member of a set, such as `small/medium/large`\. Nominal data can have any storage—numeric, string, or date/time\. Note that setting the measurement level to Nominal doesn't automatically change the values to string storage\. + * Ordinal\. Used to describe data with multiple distinct values that have an inherent order\. For example, salary categories or satisfaction rankings can be typed as ordinal data\. The order is defined by the natural sort order of the data elements\. For example, `1, 3, 5` is the default sort order for a set of integers, while `HIGH, LOW, NORMAL` (ascending alphabetically) is the order for a set of strings\. The ordinal measurement level enables you to define a set of categorical data as ordinal data for the purposes of visualization, model building, and export to other applications (such as IBM SPSS Statistics) that recognize ordinal data as a distinct type\. You can use an ordinal field anywhere that a nominal field can be used\. Additionally, fields of any storage type (real, integer, string, date, time, and so on) can be defined as ordinal\. + * Typeless\. Used for data that doesn't conform to any of the Default, Continuous, Categorical, Flag, Nominal, or Ordinal types, for fields with a single value, or for nominal data where the set has more members than the defined maximum\. Typeless is also useful for cases in which the measurement level would otherwise be a set with many members (such as an account number)\. When you select Typeless for a field, the role is automatically set to None, with Record ID as the only alternative\. The default maximum size for sets is 250 unique values\. + * Collection\. Used to identify non\-geospatial data that is recorded in a list\. A collection is effectively a list field of zero depth, where the elements in that list have one of the other measurement levels\. + * Geospatial\. Used with the List storage type to identify geospatial data\. Lists can be either List of Integer or List of Real fields with a list depth that's between zero and two, inclusive\. + + + +You can manually specify measurement levels, or you can allow the software to read the data and determine the measurement level based on the values it reads\. Alternatively, where you have several continuous data fields that should be treated as categorical data, you can choose an option to convert them\. See [Converting continuous data](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_convert.html)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2200315ea9da921edff8a3322417bb211f15b4eb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2200315ea9da921edff8a3322417bb211f15b4eb.md new file mode 100644 index 0000000..eea093e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2200315ea9da921edff8a3322417bb211f15b4eb.md @@ -0,0 +1,101 @@ +# Adding data from a connection to a project + +# Adding data from a connection to a project # + +A *connected data asset* is a pointer to data that is accessed through a connection to an external data source\. You create a connected data asset by specifying a connection, any intermediate structures or paths, and a relational table or view, a set of partitioned data files, or a file\. When you access a connected data asset, the data is dynamically retrieved from the data source\. + +You can also add a connected folder asset that is accessed through a connection in the same way\. See [Add a connected folder asset to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/folder-asset.html)\. + +Partitioned data assets have previews and profiles like relational tables\. However, you cannot yet shape and cleanse partitioned data assets with the Data Refinery tool\. + +To add a data asset from a connection to a project: + + + +1. From the project page, click the **Assets** tab, and then click **Import assets > Connected data**\. +2. Select an existing connection asset as the source of the data\. If you don't have any connection assets, cancel and go to **New asset > Connect to a data source**, and [create a connection asset](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. +3. Select the data you want\. You can select multiple connected data assets from the same connection\. Click **Import**\. For partitioned data, select the folder that contains the files\. If the files are recognized as partitioned data, you see the message `This folder contains a partitioned data set.` +4. Type a name and description\. +5. Click **Create**\. The asset appears on the project **Assets** page\. + + + +When you click on the asset name, you can see this information about connected assets: + + + + * The asset name and description + * The tags for the asset + * The name of the person who created the asset + * The size of the data + * The date when the asset was added to the project + * The date when the asset was last modified + * A [preview](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/previews.html) of relational data + * A [profile](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/profile.html) of relational data + + + +Watch this video to see how to create a connection and add connected data to a project\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + + + + * Transcript + + Synchronize transcript with video + + + + | Time | Transcript | + | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | 00:00 | This video shows you how to set up a connection to a data source and add connected data to a Watson Studio project. | + | 00:08 | If you have data stored in a data source, you can set up a connection to that data source from any project. | + | 00:16 | From here, you can add different elements to the project. | + | 00:20 | In this case, you want to add a connection. | + | 00:24 | You can create a new connection to an IBM service, such as IBM Db2 and Cloud Object Storage, or to a service from third parties, such as Amazon, Microsoft or Apache. | + | 00:39 | And you can filter the list based on compatible services. | + | 00:45 | You can also add a connection that was created at the platform level, which can be used across projects and catalogs. | + | 00:54 | Or you can create a connection to one of your provisioned IBM Cloud services. | + | 00:59 | In this case, select the provisioned IBM Cloud service for Db2 Warehouse on Cloud. | + | 01:08 | If the credentials are not prepopulated, you can get the credentials for the instance from the IBM Cloud service launch page. | + | 01:17 | First, test the connection and then create the connection. | + | 01:25 | The new connection now displays in the list of data assets. | + | 01:30 | Next, add connected data assets to this project. | + | 01:37 | Select the source - in this case, it's the Db2 Warehouse on Cloud connection just created. | + | 01:43 | Then select the schema and table. | + | 01:50 | You can see that this will add a reference to the data within this connection and include it in the target project. | + | 01:58 | Provide a name and a description and click "Create". | + | 02:06 | The data now displays in the list of data assets. | + | 02:09 | Open the data set to get a preview; and from here you can move directly into refining the data. | + | 02:17 | Find more videos in the Cloud Pak for Data as a Service documentation. | + + + + + +## Next steps ## + + + + * [Refine the data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + * [Analyze the data or build models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-science.html) + + + +## Learn more ## + + + + * [Connected folder assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/folder-asset.html) + * [Connection assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) + + + +**Parent topic:** + +[Adding data to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/220e465dbc0c22ff06f80df18b25044dd1ebc787.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/220e465dbc0c22ff06f80df18b25044dd1ebc787.md new file mode 100644 index 0000000..5c70924 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/220e465dbc0c22ff06f80df18b25044dd1ebc787.md @@ -0,0 +1,138 @@ +# Quick start: Generate synthetic tabular data + +# Quick start: Generate synthetic tabular data # + +Take this tutorial to learn how to generate synthetic tabular data in IBM watsonx\.ai\. The benefit to synthetic data is that you can procure the data on\-demand, then customize to fit your use case, and produce it in large quantities\. This tutorial helps you learn how to use the graphical flow editor tool, Synthetic Data Generator, to generate synthetic tabular data based on production data or a custom data schema using visual flows and modeling algorithms\. + +**Required services** : Watson Studio + +Your basic workflow includes these tasks: + + + +1. Open a project\. Projects are where you can collaborate with others to work with data\. +2. Add your data to the project\. You can add CSV files or data from a remote data source through a connection\. +3. Create and run a synthetic data flow to the project\. You use the graphical flow editor tool Synthetic Data Generator to generate synthetic tabular data based on production data or a custom data schema using visual flows and modeling algorithms\. +4. Review the synthetic data flow and output\. + + + +## Read about synthetic data ## + +Synthetic data is information that has been generated on a computer to augment or replace real data to improve AI models, protect sensitive data, and mitigate bias\. Synthetic data helps to mitigate many of the logistical, ethical, and privacy issues that come with training machine learning models on real\-world examples\. + +[Read more about Synthetic data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/synthetic_data_overview_sd.html) + +## Watch a video about generating synthetic tabular data ## + +![Watch Video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) Watch this video to preview the steps in this tutorial\. There might be slight differences in the user interface shown in the video\. The video is intended to be a companion to the written tutorial\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Try a tutorial to generate synthetic tabular data ## + +In this tutorial, you will complete these tasks: + + + + * [Task 1: Open a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-generate-data.html?context=cdpaas&locale=en#step01) + * [Task 2: Add data to your project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-generate-data.html?context=cdpaas&locale=en#step02) + * [Task 3: Create a synthetic data flow](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-generate-data.html?context=cdpaas&locale=en#step03) + * [Task 4: Review the data flow and output](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-generate-data.html?context=cdpaas&locale=en#step04) + + + +Expand all sections + + + + * Tips for completing this tutorial + + \#\#\# Use the video picture-in-picture Tip: Start the video, then as you scroll through the tutorial, the video moves to picture-in-picture mode. Close the video table of contents for the best experience with picture-in-picture. You can use picture-in-picture mode so you can follow the video as you complete the tasks in this tutorial. Click the timestamps for each task to follow along.The following animated image shows how to use the video picture-in-picture and table of contents features: ![How to use picture-in-picture and chapters](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/pip-and-chapters.gif)\{: width="560px" height="315px" data-tearsheet="this"\} \#\#\# Get help in the community If you need help with this tutorial, you can ask a question or find an answer in the [Cloud Pak for Data Community discussion forum](https://community.ibm.com/community/user/cloudpakfordata/communities/community-home/digestviewer?communitykey=c0c16ff2-10ef-4b50-ae4c-57d769937235)\{: new\_window\}. \#\#\# Set up your browser windows For the optimal experience completing this tutorial, open Cloud Pak for Data in one browser window, and keep this tutorial page open in another browser window to switch easily between the two applications. Consider arranging the two browser windows side-by-side to make it easier to follow along. ![Side-by-side tutorial and UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/tutorial-side-by-side.png)\{: width="560px" height="315px" data-tearsheet="this"\} Tip: If you encounter a guided tour while completing this tutorial in the user interface, click **Maybe later**. + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-generate-data.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 1: Open a project + + You need a project to to store the assets. Watch a video to see how to create a sandbox project and associate a service. Then follow the steps to verify that you have an existing project or create a sandbox project. + + This video provides a visual method to learn the concepts and tasks in this documentation. + + 1. From the watsonx home screen, scroll to the *Projects* section. If you see any projects listed, then skip to [Task 2](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-generate-data.html?context=cdpaas&locale=en#step02). If you don't see any projects, then follow these steps to create a project. 1. Click **Create a sandbox project**. When the project is created, you will see the sandbox project in the *Projects* section. For more information or to watch a video, see [Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html)\{: new\_window\}. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the home screen with the sandbox listed in the Projects section. You are now ready to open the Prompt Lab. + + ![Home screen with sandbox project listed.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-home-screen.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-generate-data.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 2: Add data to your project + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:24. The data set used in this tutorial contains typical information that a company gathers about their customers, and is available in the Samples. Follow these steps to find the data set in the Samples and add it to your project: 1. Access the [Customers data set](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/4bfbe430a82e23821aed0647b506da93)\{: new\_window\} in the Samples. 1. Click **Add to project**. 1. Select your project from the list, and click **Add**. 1. After the data set is added, click **View Project**. For more information on adding data assets from the Samples to your project, see [Loading and accessing data in a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html). \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the Assets tab in the project. Now you are ready to create the synthetic data flow. + + ![The following image shows the Assets tab in the project.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-synthetic-data-assets-tab.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-generate-data.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 3: Create a synthetic data flow + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:43. Use the Synthetic Data Generator to create a data flow that generates synthetic tabular data based on production data or a custom data schema using visual flows and modeling algorithms. Follow these steps to create a synthetic data flow asset in your project: 1. From the *Assets* tab in your project, click **New asset > Generate synthetic tabular data**. 1. For the name, type `Bank customers`\{: .cp\}. 1. Click **Create**. 1. On the *Welcome to Synthetic Data Generator* screen, click **First time user**, and click **Continue**. This option provides a guided experience for you to build the data flow. 1. Review the two use cases: - Leverage your existing data: Generate a structured synthetic data set based on your production data. You can connect to a database, import or upload a file, mask, and generate your output before exporting. - Create from custom data: Generate a structured synthetic data set based on meta data. You can define the data within each table column, their distributions, and any correlations. 1. Select the **Leverage your existing data** use case, and click **Next** to import existing data. 1. Click **Select data from project** to use the customers data asset that you added from the Samples. 1. Select **Data asset > customers.csv**. 1. Click **Select**. 1. Click **Next**. 1. In the list of columns, search for `creditcard_number`\{: .cp\}. 1. In the *Anonymize* column for `CREDITCARD_NUMBER`, select **Yes** to mask customers' credit card numbers. 1. Click **Next**. 1. Accept the default settings on the *Mimic options* page. These options generate synthetic data, based on your production data, using a set of candidate statistical distributions to modify each column in your data. Click **Next**. 1. For the *File name*, type `bank_customers.csv`\{: .cp\}, and click **Next**. 1. Review the settings, and click **Save and run**. The Synthetic Data Generator tool displays with the data flow. Wait for the run to complete. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the data flow open in the Synthetic Data Generator. Now you can explore the data flow and view the output. + + ![The following image shows the data flow open in the Synthetic Data Generator.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-synthetic-data-flow.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-generate-data.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 4: Review the data flow and output + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 01:48. When the run completes, you can explore the data flow. Follow these steps to review the synthetic data flow and the results: 1. Click the **Palette** icon ![Palette icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/side-panel-close-filled.svg)\{: iih\} to close the node panel. 1. Double-click the **Import** node to see the settings. 1. Review the *Data* properties. The tool read the data set from the project and filled in the appropriate data properties. 1. Expand the **Types** section. The tool read the values and columns in the data set. 1. Click **Cancel**. 1. Double-click the **Anonymize** node to see the settings. 1. Verify that the *CREDITCARD\_NUMBER* column is set to be anonymized. 1. Expand the **Anonymize values** section. Here you can customize how the values are anonymized. 1. Click **Cancel**. 1. Double-click the **Mimic** node to see the settings. 1. Review the default settings to mimic the data in the source customers data set. 1. Click **Cancel**. 1. Double-click the **Generate** node to see the settings. 1. Review the list of *Synthesized columns*. 1. Optional: Review the *Correlations* and *Advanced Options*. 1. Click **Cancel**. 1. Double-click the **Export** node to see the settings. 1. Optional: By default the exported data is stored in the project. Click **Change path** to store the exported data in a connection, such as Db2 Warehouse. 1. Click **Cancel**. 1. Click your project name to return to the *Assets* tab. ![Project breadcrumbs](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-sandbox-breadcrumbs.png)\{: biw\} 1. Click **bank\_customers.csv** to see a preview of the generated synthetic tabular data. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the exported, generated synthetic tabular data set. + + ![The following image shows the exported, generated synthetic tabular data set.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-synthetic-data.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-generate-data.html?context=cdpaas&locale=en#video-preview) + + + +## Next steps ## + +Try these additional tutorials to get more hands\-on experience with watsonx\.ai: + + + + * [Refine data](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html) + * [Analyze data in a Jupyter notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html) + * [Build machine learning models](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html#tutorials-for-building-deploying-and-trusting-models) + + + +## Additional resources ## + + + + * View more [videos](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html)\. + * Find sample data sets, projects, models, prompts, and notebooks in the Samples to gain hands\-on experience: + + ![Notebook icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook.svg)[Notebooks](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=notebook) that you can add to your project to get started analyzing data and building models. + + ![Project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/ibm-cloud--projects.svg)[Projects](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=project-template) that you can import containing notebooks, data sets, prompts, and other assets. + + ![Data set icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/data--set.svg)[Data sets](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=dataset) that you can add to your project to refine, analyze, and build models. + + ![Prompt icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/prompt.svg)[Prompts](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=example-prompt) that you can use in the Prompt Lab to prompt a foundation model. + + ![Model icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/model.svg)[Foundation models](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=foundation-model) that you can use in the Prompt Lab. + * [Overview of watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/overview-wx.html) + + + +**Parent topic:**[Quick start tutorials](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/221f46d0a3c2c3d3a623be815b45e8b90af61340.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/221f46d0a3c2c3d3a623be815b45e8b90af61340.md new file mode 100644 index 0000000..38faf50 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/221f46d0a3c2c3d3a623be815b45e8b90af61340.md @@ -0,0 +1,27 @@ +# {{ document.title.text }} + +# Data transparency # + +![icon for transparency risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-transparency.svg)Risks associated with inputTraining and tuning phaseTransparencyAmplified + +### Description ### + +Without accurate documentation on how a model's data was collected, curated, and used to train a model, it might be harder to satisfactorily explain the behavior of the model with respect to the data\. + +### Why is data transparency a concern for foundation models? ### + +Data transparency is important for legal compliance and AI ethics\. Missing information limits the ability to evaluate risks associated with the data\. The lack of standardized requirements might limit disclosure as organizations protect trade secrets and try to limit others from copying their models\. + +Example + +#### Data and Model Metadata Disclosure #### + +OpenAI's technical report is an example of the dichotomy around disclosing data and model metadata\. While many model developers see value in enabling transparency for consumers, disclosure poses real safety issues and could increase the ability to misuse the models\. In the GPT\-4 technical report, they state: "Given both the competitive landscape and the safety implications of large\-scale models like GPT\-4, this report contains no further details about the architecture (including model size), hardware, training compute, dataset construction, training method, or similar\." + +Sources: + +[OpenAI, March 2023](https://cdn.openai.com/papers/gpt-4.pdf) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2245768521f36e6f2df594e1bf3111dd63cc824a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2245768521f36e6f2df594e1bf3111dd63cc824a.md new file mode 100644 index 0000000..faaec07 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2245768521f36e6f2df594e1bf3111dd63cc824a.md @@ -0,0 +1,66 @@ +# HTTP connection + +# HTTP connection # + +To access your data from a URL, create an HTTP connection asset for it\. + +## Supported file ## + +Use the full path in the URL to the file that you want to read\. You cannot browse for files\. + +## Certificates ## + +Enter the SSL certificate of the host to be trusted\. The SSL certificate is needed only when the host certificate is not signed by a known certificate authority\. + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use HTTP connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Notebooks\. Click **Read data** on the **Code snippets** pane to get the connection credentials and load the data into a data structure\. See [Load data from data source connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html#conns)\. + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Restriction ## + +You can use this connection only for source data\. You cannot write to data or export data with this connection\. + +## Supported file types ## + +The HTTP connection supports these file types: Avro, CSV, Delimited text, Excel, JSON, ORC, Parquet, SAS, SAV, SHP, and XML\. + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/225192bb81696d14887cc55070a6dfa14b3315f7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/225192bb81696d14887cc55070a6dfa14b3315f7.md new file mode 100644 index 0000000..de00a6f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/225192bb81696d14887cc55070a6dfa14b3315f7.md @@ -0,0 +1,65 @@ +# Adding data to Data Refinery + +# Adding data to Data Refinery # + +After you [create a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html) and you [create connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) or you [add data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html) to the project, you can then add data to Data Refinery and start prepping that data for analysis\. + +You can add data to Data Refinery in one of several ways: + + + + * Select **Prepare data** from the overflow menu (![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png)) of a data asset in the **All assets** list for the project + * Preview a data asset in the project and then click **Prepare data** + * Navigate to Data Refinery first and then add data to it + + + +## Navigate to Data Refinery ## + + + +1. Access Data Refinery from within a project\. Click the **Assets** tab\. +2. Click **New asset > Prepare and visualize data**\. +3. Select the data that you want to work with from **Data assets** or from **Connections**\. + + From **Data assets**: + + + + * Select a data file (the selection includes data files that were already shaped with Data Refinery) + * Select a connected data asset + + + + From **Connections**: + + + + * Select a connection and file + * Select a connection, folder, and file + * Select a connection, schema, and table or view + + + + Data Refinery supports these file types: Avro, CSV, delimited text files, JSON, Microsoft Excel (xls and xlsx formats. First sheet only, except for connections and connected data assets.), Parquet, SAS with the "sas7bdat" extension (read only), TSV (read only) + + Data Refinery operates on a sample subset of rows in the data set. The sample size is 1 MB or 10,000 rows, whichever comes first. However, when you run a job for the Data Refinery flow, the entire data set is processed. If the Data Refinery flow fails with a large data asset, see workarounds in [Troubleshooting Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/ts_index.html). + + Data connections marked with a key icon (![the key symbol for private connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/privatekey.png)) are locked. If you are authorized to access the data source, you are asked to enter your personal credentials the first time you select it. This one-time step permanently unlocks the connection for you. After you have unlocked the connection, the key icon is no longer displayed. See [Adding connections to projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html). +4. Click **Add** to load the data into Data Refinery\. + + + +## Next steps ## + + + + * [Refine your data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + * [Validate your data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/metrics.html) + * [Use visualizations to gain insights into your data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/visualizations.html) + + + +**Parent topic:**[Refining data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/22a8f7539d1374784e9bf247b1370c430910f43d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/22a8f7539d1374784e9bf247b1370c430910f43d.md new file mode 100644 index 0000000..01d7417 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/22a8f7539d1374784e9bf247b1370c430910f43d.md @@ -0,0 +1,19 @@ +# KDE node (SPSS Modeler) + +# KDE node # + +Kernel Density Estimation (KDE)© uses the Ball Tree or KD Tree algorithms for efficient queries, and walks the line between unsupervised learning, feature engineering, and data modeling\. + +Neighbor\-based approaches such as KDE are some of the most popular and useful density estimation techniques\. KDE can be performed in any number of dimensions, though in practice high dimensionality can cause a degradation of performance\. The KDE Modeling node and the KDE Simulation node in watsonx\.ai expose the core features and commonly used parameters of the KDE library\. The nodes are implemented in Python\. ^1^ + +To use a KDE node, you must set up an upstream Type node\. The KDE node will read input values from the Type node (or from the Types of an upstream import node)\. + +The KDE Modeling node is available under the Modeling node palette\. The KDE Modeling node generates a model nugget, and the nugget's scored values are kernel density values from the input data\. + +The KDE Simulation node is available under the Outputs node palette\. The KDE Simulation node generates a KDE Gen source node that can create some records that have the same distribution as the input data\. In the KDE Gen node properties, you can specify how many records the node will create (default is 1) and generate a random seed\. + +For more information about KDE, including examples, see the [KDE documentation](http://scikit-learn.org/stable/modules/density.html#kernel-density-estimation)\. ^1^ + +^1^ "User Guide\." *Kernel Density Estimation*\. Web\. © 2007\-2018, scikit\-learn developers\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/22b8136f68ac74838b9c2b9eaf3996ccfaa14921.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/22b8136f68ac74838b9c2b9eaf3996ccfaa14921.md new file mode 100644 index 0000000..f36d0c4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/22b8136f68ac74838b9c2b9eaf3996ccfaa14921.md @@ -0,0 +1,9 @@ +# Transpose node (SPSS Modeler) + +# Transpose node # + +By default, columns are fields and rows are records or observations\. If necessary, you can use a Transpose node to swap the data in rows and columns so that fields become records and records become fields\. + +For example, if you have time series data where each series is a row rather than a column, you can transpose the data prior to analysis\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/22d15f386dc333bc069eea8671e895c97956e754.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/22d15f386dc333bc069eea8671e895c97956e754.md new file mode 100644 index 0000000..9539861 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/22d15f386dc333bc069eea8671e895c97956e754.md @@ -0,0 +1,245 @@ +# Using the time series library + +# Using the time series library # + +To get started working with the time series library, import the library to your Python notebook or application\. + +Use this command to import the time series library: + + # Import the package + import tspy + +## Creating a time series ## + +To create a time series and use the library functions, you must decide on the data source\. Supported data sources include: + + + + * In\-memory lists + * pandas DataFrames + * In\-memory collections of observations (using the `ObservationCollection` construct) + * User\-defined readers (using the `TimeSeriesReader` construct) + + + +The following example shows ingesting data from an in\-memory list: + + ts = tspy.time_series([5.0, 2.0, 4.0, 6.0, 6.0, 7.0]) + ts + +The output is as follows: + + TimeStamp: 0 Value: 5.0 + TimeStamp: 1 Value: 2.0 + TimeStamp: 2 Value: 4.0 + TimeStamp: 3 Value: 6.0 + TimeStamp: 4 Value: 6.0 + TimeStamp: 5 Value: 7.0 + +You can also operate on many time\-series at the same time by using the `MultiTimeSeries` construct\. A `MultiTimeSeries` is essentially a dictionary of time series, where each time series has its own unique key\. The time series are not aligned in time\. + +The `MultiTimeSeries` construct provides similar methods for transforming and ingesting as the single time series construct: + + mts = tspy.multi_time_series({ + "ts1": tspy.time_series([1.0, 2.0, 3.0]), + "ts2": tspy.time_series([5.0, 2.0, 4.0, 5.0]) + }) + +The output is the following: + + ts2 time series + ------------------------------ + TimeStamp: 0 Value: 5.0 + TimeStamp: 1 Value: 2.0 + TimeStamp: 2 Value: 4.0 + TimeStamp: 3 Value: 5.0 + ts1 time series + ------------------------------ + TimeStamp: 0 Value: 1.0 + TimeStamp: 1 Value: 2.0 + TimeStamp: 2 Value: 3.0 + +## Interpreting time ## + +By default, a time series uses a `long` data type to denote when a given observation was created, which is referred to as a time tick\. A time reference system is used for time series with timestamps that are human interpretable\. See [Using time reference system](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-reference-system.html)\. + +The following example shows how to create a simple time series where each index denotes a day after the start time of `1990-01-01`: + + import datetime + granularity = datetime.timedelta(days=1) + start_time = datetime.datetime(1990, 1, 1, 0, 0, 0, 0, tzinfo=datetime.timezone.utc) + + ts = tspy.time_series([5.0, 2.0, 4.0, 6.0, 6.0, 7.0], granularity=granularity, start_time=start_time) + ts + +The output is as follows: + + TimeStamp: 1990-01-01T00:00Z Value: 5.0 + TimeStamp: 1990-01-02T00:00Z Value: 2.0 + TimeStamp: 1990-01-03T00:00Z Value: 4.0 + TimeStamp: 1990-01-04T00:00Z Value: 6.0 + TimeStamp: 1990-01-05T00:00Z Value: 6.0 + TimeStamp: 1990-01-06T00:00Z Value: 7.0 + +## Performing simple transformations ## + +Transformations are functions which, when given one or more time series, return a new time series\. + +For example, to segment a time series into windows where each window is of `size=3`, sliding by 2 records, you can use the following method: + + window_ts = ts.segment(3, 2) + window_ts + +The output is as follows: + + TimeStamp: 0 Value: original bounds: (0,2) actual bounds: (0,2) observations: [(0,5.0),(1,2.0),(2,4.0)] + TimeStamp: 2 Value: original bounds: (2,4) actual bounds: (2,4) observations: [(2,4.0),(3,6.0),(4,6.0)] + +This example shows adding 1 to each value in a time series: + + add_one_ts = ts.map(lambda x: x + 1) + add_one_ts + +The output is as follows: + + TimeStamp: 0 Value: 6.0 + TimeStamp: 1 Value: 3.0 + TimeStamp: 2 Value: 5.0 + TimeStamp: 3 Value: 7.0 + TimeStamp: 4 Value: 7.0 + TimeStamp: 5 Value: 8.0 + +Or you can temporally left join a time series, for example `ts` with another time series `ts2`: + + ts2 = tspy.time_series([1.0, 2.0, 3.0]) + joined_ts = ts.left_join(ts2) + joined_ts + +The output is as follows: + + TimeStamp: 0 Value: [5.0, 1.0] + TimeStamp: 1 Value: [2.0, 2.0] + TimeStamp: 2 Value: [4.0, 3.0] + TimeStamp: 3 Value: [6.0, null] + TimeStamp: 4 Value: [6.0, null] + TimeStamp: 5 Value: [7.0, null] + +### Using transformers ### + +A rich suite of built\-in transformers is provided in the transformers package\. Import the package to use the provided transformer functions: + + from tspy.builders.functions import transformers + +After you have added the package, you can transform data in a time series be using the `transform` method\. + +For example, to perform a difference on a time\-series: + + ts_diff = ts.transform(transformers.difference()) + +Here the output is: + + TimeStamp: 1 Value: -3.0 + TimeStamp: 2 Value: 2.0 + TimeStamp: 3 Value: 2.0 + TimeStamp: 4 Value: 0.0 + TimeStamp: 5 Value: 1.0 + +### Using reducers ### + +Similar to the transformers package, you can reduce a time series by using methods provided by the reducers package\. You can import the reducers package as follows: + + from tspy.builders.functions import reducers + +After you have imported the package, use the `reduce` method to get the average over a time\-series for example: + + avg = ts.reduce(reducers.average()) + avg + +This outputs: + + 5.0 + +Reducers have a special property that enables them to be used alongside segmentation transformations (hourly sum, avg in the window prior to an error occurring, and others)\. Because the output of a `segmentation + reducer` is a time series, the `transform` method is used\. + +For example, to segment into windows of size 3 and get the average across each window, use: + + avg_windows_ts = ts.segment(3).transform(reducers.average()) + +This results in: + + imeStamp: 0 Value: 3.6666666666666665 + TimeStamp: 1 Value: 4.0 + TimeStamp: 2 Value: 5.333333333333333 + TimeStamp: 3 Value: 6.333333333333333 + +## Graphing time series ## + +Lazy evaluation is used when graphing a time series\. When you graph a time series, you can do one of the following: + + + + * Collect the observations of the time series, which returns an `BoundTimeSeries` + * Reduce the time series to a value or collection of values + * Perform save or print operations + + + +For example, to collect and return all of the values of a timeseries: + + observations = ts.materialize() + observations + +This results in: + + [(0,5.0),(1,2.0),(2,4.0),(3,6.0),(4,6.0),(5,7.0)] + +To collect a range from a time series, use: + + observations = ts[1:3] # same as ts.materialize(1, 3) + observations + +Here the output is: + + [(1,2.0),(2,4.0),(3,6.0)] + +Note that a time series is optimized for range queries if the time series is periodic in nature\. + +Using the `describe` on a current time series, also graphs the time series: + + describe_obj = ts.describe() + describe_obj + +The output is: + + min inter-arrival-time: 1 + max inter-arrival-time: 1 + mean inter-arrival-time: 1.0 + top: 6.0 + unique: 5 + frequency: 2 + first: TimeStamp: 0 Value: 5.0 + last: TimeStamp: 5 Value: 7.0 + count: 6 + mean:5.0 + std:1.632993161855452 + min:2.0 + max:7.0 + 25%:3.5 + 50%:5.5 + 75%:6.25 + +## Learn more ## + + + + * [Time series key functionality](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-key-functionality.html) + * [Time series functions](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-functions.html) + * [Time series lazy evaluation](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-lazy-evaluation.html) + * [Using time reference system](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-reference-system.html) + * [`tspy` Python SDK documentation](https://ibm-cloud.github.io/tspy-docs/) + + + +**Parent topic:**[Time series analysis](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-lib.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/23060b35041c9abd00099b1e0b1d83daff453c6d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/23060b35041c9abd00099b1e0b1d83daff453c6d.md new file mode 100644 index 0000000..290fbbc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/23060b35041c9abd00099b1e0b1d83daff453c6d.md @@ -0,0 +1,93 @@ +# Collaboration roles for governance + +# Collaboration roles for governance # + +Review the collaboration roles for managing access to governance tools such as inventories, AI use cases, and evaluations\. + +## User roles and permissions for governance ## + +The permissions that you allow you to work with governance artifacts depend on your watsonx roles: + + + + * IAM Platform access roles determine your permissions for the IBM Cloud account\. At least the Viewer role is required to work with services\. + * IAM Service access roles determine your permissions within services\. + * Workspace collaborator roles determine what actions you have permission to perform within workspaces in IBM watsonx\. + + + +For details, see [Levels of user access roles in IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/roles.html)\. + +## Roles for governance ## + +If you have the IAM Platform Admin role, you can: + + + + * Provision watsonx\.governance + * Create inventory + * Create platform assets catalog + * Enable external model tracking + * Create attachment fact definitions + * Customize report templates + + + +If you have these workspace roles for an inventory, you can: + + + +Governance permissions for inventories + +| Enabled permission | Viewer | Editor | Admin/Owner | +| -------------------------------------------------------------------------------------- | ------ | ------ | ----------- | +| Create and edit AI use cases | | ✓ | ✓ | +| View AI use cases | ✓ | ✓ | ✓ | +| Add collaborators to an inventory | | | ✓ | +| Delete inventory | | | ✓ | +| Evaluate model deployment | | ✓ | ✓ | +| Add collaborators to a use case | | ✓ | ✓ | +| Generate reports | ✓ | ✓ | ✓ | +| Add attachments to a use case | | ✓ | ✓ | +| Update asset type definitions
(For example: model\_entry\_user, modelfacts\_user) | | | ✓ | + + + +If you have these workspace roles for an AI use case, you can: + + + +Governance permissions for AI use cases + +| Enabled permission | Editor/Collaborator | Admin/Owner | +| --------------------------------- | ------------------- | ----------- | +| Delete AI use cases | | ✓ | +| Add collaborators to the use case | | ✓ | +| Edit AI use case | ✓ | ✓ | +| Edit use case | ✓ | ✓ | +| Add values to custom facts | ✓ | ✓ | +| Upload attachments to use case | ✓ | ✓ | + + + +If you have these workspace roles for a project or space, you can: + + + +Governance permissions for project and space roles + +| Enabled permission | Viewer | Editor/Collaborator | Admin/Owner | +| ------------------------------ | ------ | ------------------- | ----------- | +| Track/untrack prompt template | | ✓ | ✓ | +| Upload attachments to use case | | ✓ | ✓ | +| Add values to custom facts | | ✓ | ✓ | +| View AI factsheet | ✓ | ✓ | ✓ | +| Generate report | ✓ | ✓ | ✓ | + + + +## Learn more ## + +**Parent topic:**[Governing assets in AI use cases](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-use-cases.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/23080e48c7b666c07e92a6e4f4bb256d77be49b4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/23080e48c7b666c07e92a6e4f4bb256d77be49b4.md new file mode 100644 index 0000000..516c9af --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/23080e48c7b666c07e92a6e4f4bb256d77be49b4.md @@ -0,0 +1,58 @@ +# Tips and shortcuts for SPSS Modeler + +# Tips and shortcuts # + +Work quickly and easily by familiarizing yourself with the following shortcuts and tips: + + + + * **Quickly find nodes\.** You can use the search bar on the Nodes palette to search for certain node types, and hover over them to see helpful descriptions\. + * **Quickly edit nodes\.** After adding a node to your flow, double\-click it to open its properties\. + * **Add a node to a flow connection\.** To add a new node between two connected nodes, drag the node to the connection line\. + * **Replace a connection\.** To replace an existing connection on a node, simply create a new connection and the old one will be replaced\. + * **Start from an SPSS Modeler stream\.** You can import a stream ( \.str) that was created in SPSS Modeler Subscription or SPSS Modeler client + * **Use tool tips\.** In node properties, helpful tool tips are available in various locations\. Hover over the tooltip icon to see tool tips\. ![Tool tips icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/spss_tooltip.png) + * **Rename nodes and add annotations\.** Each node properties panel includes an Annotations section in which you can specify a custom name for nodes on the canvas\. You can also include lengthy annotations to track progress, save process details, and denote any business decisions required or achieved\. + * **Generate new nodes from table output\.** When viewing table output, you can select one or more fields, click Generate, and select a node to add to your flow\. + * **Insert values automatically into a CLEM expression\.** Using the Expression Builder, accessible from various areas of the user interface (such as those for Derive and Filler nodes), you can automatically insert field values into a CLEM expression\. + + + +Keyboard shortcuts are available for SPSS Modeler\. See the following table\. Note that all **Ctrl** keys listed are **Cmd** on macOS\. + + + +Shortcut keys + +Table 1\. Shortcut keys + +| Shortcut Key | Function | +| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Ctrl \+ F1 | Navigate to the header\. | +| Ctrl \+ F2 | Navigate to the Nodes palette, then use arrow keys to move between nodes\. Press Enter or the space key to add the selected node to your canvas\. | +| Ctrl \+ F3 | Navigate to the toolbar\. | +| Ctrl \+ F4 | Navigate to the flow canvas, then use arrow keys to move between nodes\. Press Enter or space twice to open the node's context menu\. Then use the arrow keys to select the desired context menu action and press Enter or space to perform the action\. | +| Ctrl \+ F5 | Navigate to the node properties panel if it's open\. | +| Ctrl \+ F6 | Move between areas of the user interface (header, palette, canvas, toolbar, etc\.)\. | +| Ctrl \+ F7 | Open and navigate to the Messages panel\. | +| Ctrl \+ F8 | Open and navigate to the Outputs panel\. | +| Ctrl \+ A | Select all nodes when focus is on the canvas | +| Ctrl \+ E | With a node selected on the canvas, open its node properties\. Then use the tab or arrow keys to move around the list of node properties\. Press Ctrl \+ S to save your changes or press Ctrl \+ to cancel your changes\. | +| Ctrl \+ I | Open the settings panel\. | +| Ctrl \+ J | With a node selected on the canvas, connect it to another node\. Use the arrow keys to select the node to connect to, then press Enter or space (or press Esc to cancel)\. | +| Ctrl \+ K | Disconnect a node\. | +| Ctrl \+ Enter | Run a branch from where the focus is\. | +| Ctrl \+ Shift \+ Enter | Run the entire flow\. | +| Ctrl \+ Shift \+ P | Launch preview\. | +| Ctrl \+ arrow | Move a selected node around the canvas\. | +| Ctrl \+ Alt \+ arrow | Move the canvas in a direction\. | +| Ctrl \+ Shift \+ arrow | Move a selected node around the canvas ten times faster than Ctrl \+ arrow\. | +| Ctrl \+ Shift \+ C | Toggle cache on/off\. | +| Ctrl \+ Shift \+ up arrow | Select all nodes upstream of the selected node\. | +| Ctrl \+ Shift \+ down arrow | Select all nodes downstream of the selected node\. | +| Enter \+ space twice | Open the context menu when a node is selected on the flow canvas | +| Shift \+ arrow | Select multiple nodes\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/23296aad76933152d5d3e9dd875ebbd3fb7575ea.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/23296aad76933152d5d3e9dd875ebbd3fb7575ea.md new file mode 100644 index 0000000..2328696 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/23296aad76933152d5d3e9dd875ebbd3fb7575ea.md @@ -0,0 +1,5 @@ +# Building CLEM expressions (SPSS Modeler) + +# Building CLEM (legacy) expressions # + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2339deef952ecf06246f2a5daed6925e00f52d64.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2339deef952ecf06246f2a5daed6925e00f52d64.md new file mode 100644 index 0000000..5fdf1f8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2339deef952ecf06246f2a5daed6925e00f52d64.md @@ -0,0 +1,59 @@ +# watsonx.governance model health monitor evaluation metrics + +# watsonx\.governance model health monitor evaluation metrics # + +watsonx\.governance enables model health monitor evaluations by default to help you understand your model behavior and performance\. You can use model health metrics to determine how efficiently your model deployment processes your transactions\. + +## Supported model health metrics ## + +The following metric categories for model health evaluations are supported by watsonx\.governance\. Each category contains metrics that provide details about your model performance: + + + + * Scoring requests + + watsonx.governance calculates the number of scoring requests that your model deployment receives during model health evaluations. This metric category is supported for traditional machine learning models and foundation models. + + + + + + * Records + + watsonx.governance calculates the **total**, **average**, **minimum**, **maximum**, and **median** number of transaction records that are processed across scoring requests during model health evaluations. This metric category is supported for traditional machine learning models and foundation models. + + + + + + * Token count + + watsonx.governance calculates the number of tokens that are processed across scoring requests for your model deployment. This metric category is supported for foundation models only. watsonx.governance calculates the following metrics to measure token count during evaluations: - **Input token count**: Calculates the **total**, **average**, **minimum**, **maximum**, and **median** input token count across multiple scoring requests during evaluations - **Output token count**: Calculates the **total**, **average**, **minimum**, **maximum**, and **median** output token count across scoring requests during evaluations + + + + + + * Throughput and latency + + watsonx.governance calculates latency by tracking the time that it takes to process scoring requests and transaction records per millisecond (ms). Throughput is calculated by tracking the number of scoring requests and transaction records that are processed per second. To calculate throughput and latency, watsonx.governance uses the `response_time` value from your scoring requests to track the time that your model deployment takes to process scoring requests. For Watson Machine Learning deployments, Watson OpenScale automatically detects the `response_time` value when you configure evaluations. For external and custom deployments, you must specify the `response_time` value when you send scoring requests to calculate throughput and latency as shown in the following example from the Watson OpenScale [Python SDK](https://client-docs.aiopenscale.cloud.ibm.com/html/index.html): `python from ibm_watson_openscale.supporting_classes.payload_record import PayloadRecord client.data_sets.store_records( data_set_id=payload_data_set_id, request_body=[ PayloadRecord( scoring_id=, request=openscale_input, response=openscale_output, response_time=, user_id=) ] )` watsonx.governance calculates the following metrics to measure thoughput and latency during evaluations: - **API latency**: Time taken (in ms) to process a scoring request by your model deployment. - **API throughput**: Number of scoring requests processed by your model deployment per second - **Record latency**: Time taken (in ms) to process a record by your model deployment - **Record throughput**: Number of records processed by your model deployment per second This metric category is supported for traditional machine learning models and foundation models. + + + + + + * Users + + watsonx.governance calculates the number of users that send scoring requests to your model deployments. This metric category is supported for traditional machine learning models and foundation models. To calculate the number of users, watsonx.governance uses the `user_id` from scoring requests to identify the users that send the scoring requests that your model receives. For external and custom deployments, you must specify the `user_id` value when you send scoring requests to calculate the number of users as shown in the following example from the Watson OpenScale [Python SDK](https://client-docs.aiopenscale.cloud.ibm.com/html/index.html): `python from ibm_watson_openscale.supporting_classes.payload_record import PayloadRecord client.data_sets.store_records( data_set_id=payload_data_set_id, request_body=[ PayloadRecord( scoring_id=, request=openscale_input, response=openscale_output, response_time=, user_id=). --> value to be supplied by user ] )` When you view a summary of the **Users** metric in watsonx.governance, you can use the real-time view to see the total number of users and the aggregated views to see the average number of users. + + + + + + * Payload size + + watsonx.governance calculates the **total**, **average**, **minimum**, **maximum**, and **median** payload size of the transaction records that your model deployment processes across scoring requests in kilobytes (KB). watsonx.governance does not support payload size metrics for image models. This metric category is supported for traditional machine learning models only. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2353ffc21b5b117f70eeec0e71c9d6fb2f6dc022.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2353ffc21b5b117f70eeec0e71c9d6fb2f6dc022.md new file mode 100644 index 0000000..e51cfe5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2353ffc21b5b117f70eeec0e71c9d6fb2f6dc022.md @@ -0,0 +1,106 @@ +# Presto connection + +# Presto connection # + +To access your data in Presto, create a connection asset for it\. + +Presto is a fast and reliable SQL engine for Data Analytics and the Open Lakehouse\. + +## Supported versions ## + + + + * Version 0\.279 and earlier + + + +## Create a connection to Presto ## + +To create the connection asset, you need these connection details: + + + + * Hostname or IP address + * Port + * Username + * Password (required if you connect to Presto with SSL enabled) + * SSL certificate (if required by the Presto server) + + + +### Connecting to Presto within IBM watsonx\.data ### + +To connect to a Presto server within watsonx\.data on IBM Cloud, use these connection details: + + + + * Username: `ibmlhapikey` + * Password (for SSL\-enabled, which is the default): An IBM Cloud API key\. For more information, see [Connecting to Presto server](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-con-presto-serv)\. + + + +To connect to a Presto server within watsonx\.data on Cloud Pak for Data or stand\-alone watsonx\.data, use the username and password that you use for the watsonx\.data console\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** +Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** +Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use the Presto connection in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Presto setup ## + +To set up Presto, see [Presto installation](https://prestodb.io/docs/current/installation.html)\. + +## Restriction ## + +You can use this connection only for source data\. You cannot write to data or export data with this connection\. + +## Limitation ## + +The Presto connection does not support the Apache Cassandra Time data type\. + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [SQL Statement Syntax](https://prestodb.io/docs/current/sql.html) for the correct syntax\. + +## Learn more ## + +[Presto documentation](https://prestodb.io/docs/current/index.html) + +**Parent topic**: [Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2372aeeeb4da6a3e94273cb46224ed09cd84cd9e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2372aeeeb4da6a3e94273cb46224ed09cd84cd9e.md new file mode 100644 index 0000000..d549ecd --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2372aeeeb4da6a3e94273cb46224ed09cd84cd9e.md @@ -0,0 +1,142 @@ +# Tuning a foundation model + +# Tuning a foundation model # + +To tune a foundation model, create a tuning experiment that guides the foundation model to return the output you want in the format you want\. + +## Requirements ## + +If you signed up for watsonx\.ai and specified the Dallas region, all requirements are met and you're ready to use the Tuning Studio\. + +The Tuning Studio is available from a project that is created for you automatically when you sign up for watsonx\.ai\. The project is named *sandbox* and you can use it to get started with testing and customizing foundation models\. + +## Before you begin ## + +Experiment with the Prompt Lab to determine the best model to use for your task\. Craft and try prompts until you find the input and output patterns that generate the best results from the model\. For more information, see [Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html)\. + +Create a set of example prompts that follow the patterns that generate the best results based on your prompt engineering work\. For more information, see [Data formats](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-data.html)\. + +## Tune a model ## + + + +1. Click the **Tune a foundation model with labeled data** task\. +2. Name the tuning experiment\. +3. **Optional**: Add a description and tags\. Add a description as a reminder to yourself and to help collaborators understand the goal of the tuned model\. Assigning a tag gives you a way to filter your tuning assets later to show only the assets associated with a tag\. +4. Click **Create**\. +5. The **flan\-t5\-xl** foundation model is selected for you to tune\. + + To read more about the model, click the **Preview** icon (![Preview icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-preview-icon.png)) that is displayed from the drop-down list. + + For more information, see the [model card](https://huggingface.co/google/flan-t5-xl) +6. Choose how to initialize the prompt from the following options: + + **Text** : Uses text that you specify. + + **Random** : Uses values that are generated for you as part of the tuning experiment. + + These options are related to the prompt tuning method for tuning models. For more information about how each option affects the tuning experiment, see [How prompt-tuning works](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-methods.html##how-prompt-tuning-works). +7. **Required for the *Text* initialization method only**: Add the initialization text that you want to include with the prompt\. + + + + * For a classification task, give an instruction that describes what you want to classify and lists the class labels to be used. For example, *Classify whether the sentiment of each comment is Positive or Negative*. + * For a generative task, describe what you want the model to provide in the output. For example, *Make the case for allowing employees to work from home a few days a week*. + * For a summarization task, give an instruction such as, *Summarize the main points from a meeting transcript*. + + + +8. Choose a task type\. + + Choose the task type that most closely matches what you want the model to do: + + **Classification** : Predicts categorical labels from features. For example, given a set of customer comments, you might want to label each statement as a question or a problem. By separating out customer problems, you can find and address them more quickly. + + **Generation** : Generates text. For example, writes a promotional email. + + **Summarization** : Generates text that describes the main ideas that are expressed in a body of text. For example, summarizes a research paper. + + Whichever task you choose, the input is submitted to the underlying foundation model as a generative request type during the experiment. For classification tasks, class names are taken into account in the prompts that are used to tune the model. As models and tuning methods evolve, task-specific enhancements are likely to be added that you can leverage if tasks are represented accurately. +9. **Required for classification tasks only**: In the **Classification output (verbalizer)** field, add the class labels that you want the model to use one at a time\. + + Important: Specify the same labels that are used in your training data. + + During the tuning experiment, class label information is submitted along with the input examples from the training data. +10. Add the training data that will be used to tune the model\. You can upload a file or use an asset from your project\. + + To see examples of how to format your file, expand *What should your data look like?*, and then click **Preview template**. For more information, see [Data formats](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-data.html). +11. **Optional**: If you want to limit the size of the input or output examples that are used during training, adjust the maximum number of tokens that are allowed\. Expand *What should your data look like?*, and then drag the sliders to change the values\. Limiting the size can reduce the time that it takes to run the tuning experiment\. For more information, see [Controlling the number of tokens used](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-tune.html?context=cdpaas&locale=en#tuning-tokens)\. +12. **Optional**: Click *Configure parameters* to edit the parameters that are used by the tuning experiment\. + + The tuning run is configured with parameter values that represent a good starting point for tuning a model. You can adjust them if you want. + + For more information about the available parameters and what they do, see [Tuning parameters](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-parameters.html). + + After you change parameter values, click **Save**. +13. Click **Start tuning**\. + + + +The tuning experiment begins\. It might take a few minutes to a few hours depending on the size of your training data and the availability of compute resources\. When the experiment is finished, the status shows as completed\. + +A tuned model asset is not created until after you create a deployment from a completed tuning experiment\. For more information, see [Deploying a tuned model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-deploy.html)\. + +### Controlling the number of tokens used ### + +You can change the number of tokens that are allowed in the model input and output during a tuning experiment\. + + + +Table 1: Token number parameters + +| Parameter name | Value options | Default value | +| --------------------- | ------------- | ------------- | +| Maximum input tokens | 1 \- 256 | 256 | +| Maximum output tokens | 1 \- 128 | 128 | + + + +You already have some control over the input size\. The input text that is used during a tuning experiment comes from your training data\. So, you can manage the input size by keeping your example inputs to a set length\. However, you might be getting training data that isn't curated from another team or process\. In that case, you can use the **Maximum input tokens** slider to manage the input size\. If you set the parameter to 200 and the training data has an example input with 1,000 tokens, for example, the example is truncated\. Only the first 200 tokens of the example input are used\. + +The **Max output tokens** value is important because it controls the number of tokens that the model is allowed to generate as output at training time\. You can use the slider to limit the output size, which helps the model to generate concise output\. + +For classification tasks, minimizing the size of the output is a good way to force a generative model to return the class label only, without repeating the classification pattern in the output\. + +For natural language models, words are converted to tokens\. 256 tokens is equal to approximately 130—170 words\. 128 tokens is equal to approximately 65—85 words\. However, token numbers are difficult to estimate and can differ by model\. For more information, see [Tokens and tokenization](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tokens.html)\. + +## Evaluating the tuning experiment ## + +When the experiment is finished, a loss function graph is displayed that illustrates the improvement in the model output over time\. The epochs are shown on the x\-axis and a measure of the difference between predicted and actual results per epoch is shown on the y\-axis\. The value that is shown per epoch is calculated from the average gradient value from all of the accumulation steps in the epoch\. + +The best experiment outcome is represented by a downward\-sloping curve\. A decreasing curve means that the model gets better at generating the expected outputs in the expected format over time\. + +If the gradient value for the last epoch remains too high, you can run another experiment\. To help improve the results, try one of the following approaches: + + + + * Augment or edit the training data that you're using\. + * Adjust the experiment parameters\. + + + +When you're satisfied with the results from the tuning experiment, deploy the tuned foundation model\. For more information, see [Deploying a tuned model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-deploy.html)\. + +## Learn more ## + + + + * [Data formats](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-data.html) + * [Tuning parameters](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-parameters.html) + + + + + + * [Quick start: Tune a foundation model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html) + * [Sample notebook: Tune a model to classify CFPB documents in watsonx](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/bf57e8896f3e50c638b5a378780f7502) + + + +**Parent topic:**[Tuning Studio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-studio.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2413c64687e434b4b2095163a5106c0c62aa3f59.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2413c64687e434b4b2095163a5106c0c62aa3f59.md new file mode 100644 index 0000000..509706f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2413c64687e434b4b2095163a5106c0c62aa3f59.md @@ -0,0 +1,22 @@ +# Blocks of code + +# Blocks of code # + +Blocks of code are groups of statements you can use where single statements are expected\. + +Blocks of code can follow any of the following statements: `if`, `elif`, `else`, `for`, `while`, `try`, `except`, `def`, and `class`\. These statements introduce the block of code with the colon character (`:`)\. For example: + + if x == 1: + y = 2 + z = 3 + elif: + y = 4 + z = 5 + +Use indentation to delimit code blocks (rather than the curly braces used in Java)\. All lines in a block must be indented to the same position\. This is because a change in the indentation indicates the end of a code block\. It's common to indent by four spaces per level\. We recommend you use spaces to indent the lines, rather than tabs\. Spaces and tabs must not be mixed\. The lines in the outermost block of a module must start at column one, or a SyntaxError will occur\. + +The statements that make up a code block (and follow the colon) can also be on a single line, separated by semicolons\. For example: + + if x == 1: y = 2; z = 3; + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/24d2987869b1c8c34efa1204903a7a8f3e35d459.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/24d2987869b1c8c34efa1204903a7a8f3e35d459.md new file mode 100644 index 0000000..4ab48c3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/24d2987869b1c8c34efa1204903a7a8f3e35d459.md @@ -0,0 +1,13 @@ +# Specifying values for geospatial data (SPSS Modeler) + +# Specifying values for geospatial data # + +Geospatial fields display geospatial data that's in a list\. For the Geospatial measurement level, you can use various options to set the measurement level of the elements within the list\. + +Type\. Select the measurement sublevel of the geospatial field\. The available sublevels are determined by the depth of the list field\. The defaults are: Point (zero depth), LineString (depth of one), and Polygon (depth of one)\. + +For more information about sublevels, see [Geospatial measurement sublevels](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type_levels_geo.html)\. + +Coordinate system\. This option is only available if you changed the measurement level to Geospatial from a non\-geospatial level\. To apply a coordinate system to your geospatial data, select this option\. To use a different coordinate system, click Change\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/256ed6ca079a147359a51199dc333b23c2708b42.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/256ed6ca079a147359a51199dc333b23c2708b42.md new file mode 100644 index 0000000..3b9b43d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/256ed6ca079a147359a51199dc333b23c2708b42.md @@ -0,0 +1,220 @@ +# Asset types and properties + +# Asset types and properties # + +You create content, in the form of assets, when you work with tools in collaborative workspaces\. An *asset* is an item that contains information about a data set, a model, or another item that works with data\. + +You add assets by importing them or creating them with tools\. You work with assets in collaborative workspaces\. The workspace that you use depends on your tasks\. + + + + * **Projects** + Where you collaborate with others to work with data and create assets. Most tools are in projects and you run assets that contain code in projects. For example, you can import data, prepare data, analyze data, or create models in projects. See [Projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html). + + + + + + * **Deployment spaces** + Where you deploy and run assets that are ready for testing or production. You move assets from projects into deployment spaces and then create deployments from those assets. You monitor and update deployments as necessary. See [Deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html). + + + +You can find any asset in any of the workspaces for which you are a collaborator by searching for it from the global search bar\. See [Searching for assets across the platform](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/search-assets.html)\. + +You can create many different types of assets, but all assets have some common properties: + + + + * [Asset types](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html?context=cdpaas&locale=en#types) + * [Common properties for assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html?context=cdpaas&locale=en#common) + * [Data asset types and their properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html?context=cdpaas&locale=en#data) + + + +## Asset types ## + +To create most types of assets, you must use a specific tool\. + +The following table lists the types of assets that you can create, the tools you need to create them, and the workspaces where you can add them\. + + + +Asset types + +| Asset type | Description | Tools to create it | Workspaces | +| --------------------------------------------------------------- | ------------------------------------------------------------------------------- | -------------------------------------------------- | ---------------- | +| [AutoAI experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) | Automatically generates candidate predictive model pipelines\. | AutoAI | Projects | +| [Connected data asset](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html?context=cdpaas&locale=en#data) | Represents data that is accessed through a connection to a remote data source\. | Connected data tool | Projects, Spaces | +| [Connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html?context=cdpaas&locale=en#data) | Contains the information to connect to a data source\. | Connection tool | Projects, Spaces | +| [Data asset from a file](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html?context=cdpaas&locale=en#data) | Represents a file that you uploaded from your local system\. | Upload pane | Projects, Spaces | +| [Data Refinery flow](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html) | Prepares data\. | Data Refinery | Projects, Spaces | +| [Decision Optimization experiment](https://dataplatform.cloud.ibm.com/docs/content/DO/DOWS-Cloud_home.html) | Solves optimization problems\. | Decision Optimization | Projects | +| [Federated Learning experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fed-lea.html) | Trains a common model on a set of remote data sources\. | Federated Learning | Projects | +| [Folder asset](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html?context=cdpaas&locale=en#data) | Represents a folder in IBM Cloud Object Storage\. | Connected data tool | Projects, Spaces | +| [Jupyter notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebooks-and-scripts.html) | Runs Python or R code to analyze data or build models\. | Jupyter notebook editor, AutoAI, Prompt Lab | Projects | +| Model | Contains information about a saved or imported model\. | Various tools that run experiments or train models | Projects, Spaces | +| [Model use case](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-create-use-case.html) | Tracks the lifecycle of a model from request to production\. | watsonx\.governance | Inventory | +| [Pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-overview.html) | Automates the model lifecycle\. | Watson Pipelines | Projects | +| [Prompt template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) | A single prompt\. | Prompt Lab | Projects | +| [Prompt session](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) | The history of a working session in the Prompt Lab\. | Prompt Lab | Projects | +| [Python function](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function.html) | Contains Python code to support a model in production\. | Jupyter notebook editor | Projects, Spaces | +| [Script](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-script.html) | Contains a Python or R script to support a model in production\. | Jupyter notebook editor, RStudio | Projects, Spaces | +| [SPSS Modeler flow](https://dataplatform.cloud.ibm.com/docs/content/wsd/spss-modeler.html) | Runs a flow to prepare data and build a model\. | SPSS Modeler | Projects | +| [Visualization](https://dataplatform.cloud.ibm.com/docs/content/dataview/idh_idc_cg_help_main.html) | Shows visualizations from a data asset\. | **Visualization** page in data assets | Projects | +| [Synthetic data flow](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/synthetic_data_overview_sd.html) | Generates synthetic tabular data\. | Synthetic Data Generator | Projects | +| [Tuned model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-deploy.html) | A tuned foundation model\. | Tuning Studio | Projects | +| [Tuning experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-tune.html) | A tuning experiment that builds a tuned foundation model\. | Tuning Studio | Projects | + + + +## Common properties for assets ## + +Assets accumulate information in properties when you create them, use them, or when they are updated by automated processes\. Some properties are provided by users and can be edited by users\. Other properties are automatically provided by the system\. Most system\-provided properties can't be edited by users\. + +### Common properties for assets everywhere ### + +Most types of assets have the properties that are listed in the following table in all the workspaces where those asset types exist\. + + + +Common properties for assets + +| Property | Description | Editable? | +| ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | +| Name | The asset name\. Can contain up to 255 characters\. Supports multibyte characters\. Cannot be empty, contain Unicode control characters, or contain only blank spaces\. Asset names do not need to be unique within a project or deployment space\. | Yes | +| Description | Optional\. Supports multibyte characters and hyperlinks\. | Yes | +| Creation date | The timestamp of when the asset was created or imported\. | No | +| Creator or Owner | The username or email address of the person who created or imported the asset\. | No | +| Last modified date | The timestamp of when the asset was last modified\. | No | +| Last editor | The username or email address of the person who last modified the asset\. | No | + + + +### Common properties for assets that run in tools ### + +Some assets are associated with running a tool\. For example, an AutoAI experiment asset runs in the AutoAI tool\. Assets that run in tools are also known as operational assets\. Every time that you run assets in tools, you start a job\. You can monitor and schedule jobs\. Jobs use compute resources\. Compute resources are measured in capacity unit hours (CUH) and are tracked\. Depending on your service plans, you can have a limited amount of CUH per month, or pay for the CUH that you use every month\. + +For many assets that run in tools, you have a choice of the compute environment configuration to use\. Typically, larger and faster environment configurations consume compute resources faster\. + +In addition to basic properties, most assets that run in tools contain the following types of information in projects: + + + +Properties for assets in projects + +| Properties | Description | Editable? | Workspaces | +| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------- | --------- | ---------------- | +| Environment definition | The environment template, hardware specification, and software specification for running the asset\. See [Environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html)\. | Yes | Projects, Spaces | +| Settings | Information that defines how the asset is run\. Specific to each type of asset\. | Yes | Projects | +| Associated data assets | The data that the asset is working on\. | Yes | Projects | +| Jobs | Information about how to run the asset, including the environment definition, schedule, and notification options\. See [Jobs](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html)\. | Yes | Projects, Spaces | + + + +## Data asset types and their properties ## + +Data asset types contain metadata and other information about data, including how to access the data\. + +How you create a data asset depends on where your data is: + + + + * If your data is in a file, you upload the file from your local system to a project or deployment space\. + * If your data is in a remote data source, you first create a *connection asset* that defines the connection to that data source\. Then, you create a data asset by selecting the connection, the path or other structure, and the table or file that contains the data\. This type of data asset is called a *connected data asset*\. + + + +The following graphic illustrates how data assets from files point to uploaded files in Cloud Object Storage\. Connected data assets require a connection asset and point to data in a remote data source\. + +![This graphic shows that data assets from files point to uploaded files and connected data assets require a connection asset and point to data in a remote data source\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/data-assets.svg) + +You can create the following types of data assets in a project or deployment space: + + + + * **Data asset from a file** + Represents a file that you uploaded from your local system. The file is stored in the object storage container on the IBM Cloud Object Storage instance that is associated with the workspace. The contents of the file can include structured data, unstructured textual data, images, and other types of data. You can create a data asset with a file of any format. However, you can do more actions on CSV files than other file types. See [Properties of data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html?context=cdpaas&locale=en#prop-data). + + You can create a data asset from a file by uploading a file in a workspace. You can also create data files with tools and convert them to assets. For example, you can create data assets from files with the Data Refinery, Jupyter notebook, and RStudio tools. + * **Connected data asset** + Represents a table, file, or folder that is accessed through a connection to a remote data source. The connection is defined in the connection asset that is associated with the connected data asset. You can create a connected data asset for every supported connection. When you access a connected data asset, the data is dynamically retrieved from the data source. See [Properties of data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html?context=cdpaas&locale=en#prop-data). + + You can import connected data assets from a data source with the connected data tool in a workspace. + * **Folder asset** + Represents a folder in IBM Cloud Object Storage. A folder data asset is special case of a connected data asset. You create a folder data asset by specifying the path to the folder and the IBM Cloud Object Storage connection asset. You can view the files and subfolders that share the path with the folder data asset. The files that you can view within the folder data asset are not themselves data assets. For example, you can create a folder data asset for a path that contains news feeds that are continuously updated. See [Properties of data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html?context=cdpaas&locale=en#prop-data). + + You can import folder assets from IBM Cloud Object Storage with the connected data tool in a workspace. + * **Connection asset** + Contains the information necessary to create a connection to a data source. See [Properties of connection assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html?context=cdpaas&locale=en#conn). + + You can create connections with the connection tool in a workspace. + + + +Learn more about creating and importing data assets: + + + + * [Adding data to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html) + * [Adding data assets to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html) + + + +### Properties of data assets from files and connected data assets ### + +In addition to basic properties, data assets from files and connected data assets have the properties or pages that are listed in the following table\. + + + +Properties of data assets from files and connected data assets + +| Property or page | Description | Editable? | Workspaces | +| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | ---------------- | +| Tags | Optional\. Text labels that users create to simplify searching\. A tag consists of one string of up to 255 characters\. It can contain spaces, letters, numbers, underscores, dashes, and the symbols \# and @\. | Yes | Projects | +| Format | The MIME type of a file\. Automatically detected\. | Yes | Projects, Spaces | +| Source | Information about the data file in storage or the data source and connection\. | No | Projects, Spaces | +| Asset details | Information about the size of the data, the number of columns and rows, and the asset version\. | No | Projects, Spaces | +| **Preview asset** | A preview of the data that includes a limited set of columns and rows from the original data source\. See [Asset contents or previews](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/previews.html)\. | No | Projects, Spaces | +| **Profile** page | Metadata and statistics about the content of the data\. See [Profile](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/profile.html)\. | Yes | Projects | +| **Visualizations** page | Charts and graphs that users create to understand the data\. See [Visualizations](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/visualizations.html)\. | Yes | Projects | +| **Feature group** page | Information about which columns in the data asset are used as features in models\. See [Managing feature groups](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/feature-group.html)\. | Yes | Projects, Spaces | + + + +### Properties of connection assets ### + +The properties of connection assets depend on the data source that you select when you create a connection\. See [Connection types](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html)\. Connection assets for most data sources have the properties that are listed in the following table\. + + + +Properties of connection assets + +| Properties | Description | Editable? | Workspaces | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | ---------------- | +| Connection details | The information that identifies the data source\. For example, the database name, hostname, IP address, port, instance ID, bucket, endpoint URL, and so on\. | Yes | Projects, Spaces | +| Credential setting | Whether the credentials are shared across the platform (default) or each user must enter their personal credentials\. Not all data sources support personal credentials\. | Yes | Projects, Spaces | +| Authentication method | The format of the credentials information\. For example, an API key or a username and password\. | Yes | Projects, Spaces | +| Credentials | The username and password, API key, or other credentials, as required by the data source and the specified authentication method\. | Yes | Projects, Spaces | +| Certificates | Whether the data source port is configured to accept SSL connections and other information about the SSL certificate\. | Yes | Projects, Spaces | +| Private connectivity | The method to connect to a database that is not externalized to the internet\. See [Connecting to data behind a firewall](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. | Yes | Projects, Spaces | + + + +## Learn more ## + + + + * [Profiles](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/profile.html) + * [Searching for assets across the platform](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/search-assets.html) + * [Asset contents or previews](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/previews.html) + * [Activities](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/asset-activities.html) + * [Visualizations](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/visualizations.html) + * [Getting started](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-wdp.html) + * [Connection types](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + + +**Parent topic:**[Overview of IBM watsonx\.ai](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/overview-wx.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2581dd8f04f917ba91f1201137ae0efea1f82e26.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2581dd8f04f917ba91f1201137ae0efea1f82e26.md new file mode 100644 index 0000000..ac12f4b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2581dd8f04f917ba91f1201137ae0efea1f82e26.md @@ -0,0 +1,15 @@ +# Random Forest node (SPSS Modeler) + +# Random Forest node # + +Random Forest© is an advanced implementation of a bagging algorithm with a tree model as the base model\. + +In random forests, each tree in the ensemble is built from a sample drawn with replacement (for example, a bootstrap sample) from the training set\. When splitting a node during the construction of the tree, the split that is chosen is no longer the best split among all features\. Instead, the split that is picked is the best split among a random subset of the features\. Because of this randomness, the bias of the forest usually slightly increases (with respect to the bias of a single non\-random tree) but, due to averaging, its variance also decreases, usually more than compensating for the increase in bias, hence yielding an overall better model\.^1^ + +The Random Forest node in watsonx\.ai is implemented in Python\. The nodes palette contains this node and other Python nodes\. + +For more information about random forest algorithms, see [Forests of randomized trees](https://scikit-learn.org/stable/modules/ensemble.html#forest)\. + +^1^L\. Breiman, "Random Forests," Machine Learning, 45(1), 5\-32, 2001\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/259e5a974f6170cbfdf7b0014cc1a0a0111423de.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/259e5a974f6170cbfdf7b0014cc1a0a0111423de.md new file mode 100644 index 0000000..19e808a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/259e5a974f6170cbfdf7b0014cc1a0a0111423de.md @@ -0,0 +1,22 @@ +# Feedback logging in watsonx.governance + +# Feedback logging in watsonx\.governance # + +You can enable feedback logging in watsonx\.governance to configure model evaluations\. + +To [manage feedback data](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-manage-feedback-data.html) for configuring quality and generative AI quality evaluations, watsonx\.governance must log your feedback data in the feedback logging table\. + +Generative AI quality evaluations use feedback data to generate results for the following task types when you evaluate prompt templates: + + + + * Text summarization + * Content generation + * Question answering + * Entity extraction + + + +Quality evaluations use feedback data to generate results for text classification tasks\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/262c45d286c9b8a7edba8635e636824f2b043d73.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/262c45d286c9b8a7edba8635e636824f2b043d73.md new file mode 100644 index 0000000..eab0803 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/262c45d286c9b8a7edba8635e636824f2b043d73.md @@ -0,0 +1,18 @@ +# SQL optimization (SPSS Modeler) + +# How does SQL pushback work? # + +The initial fragments of a flow leading from the data import nodes are the main targets for SQL generation\. When a node is encountered that can't be compiled to SQL, the data is extracted from the database and subsequent processing is performed\. + +During flow preparation and prior to running, the SQL generation process happens as follows: + + + + * The software reorders flows to move downstream nodes into the “SQL zone” where it can be proven safe to do so\. + * Working from the import nodes toward the terminal nodes, SQL expressions are constructed incrementally\. This phase stops when a node is encountered that can't be converted to SQL or when the terminal node (for example, a Table node or a Graph node) is converted to SQL\. At the end of this phase, each node is labeled with an SQL statement if the node and its predecessors have an SQL equivalent\. + * Working from the nodes with the most complicated SQL equivalents back toward the import nodes, the SQL is checked for validity\. The SQL that was successfully validated is chosen for execution\. + * Nodes for which all operations have generated SQL are highlighted with a SQL icon next to the node on the flow canvas\. Based on the results, you may want to further reorganize your flow where appropriate to take full advantage of database execution\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/265714702b012f1010ce06d97ec16623360f4e2b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/265714702b012f1010ce06d97ec16623360f4e2b.md new file mode 100644 index 0000000..b0025b7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/265714702b012f1010ce06d97ec16623360f4e2b.md @@ -0,0 +1,15 @@ +# RFM Aggregate node (SPSS Modeler) + +# RFM Aggregate node # + +The Recency, Frequency, Monetary (RFM) Aggregate node allows you to take customers' historical transactional data, strip away any unused data, and combine all of their remaining transaction data into a single row (using their unique customer ID as a key) that lists when they last dealt with you (recency), how many transactions they have made (frequency), and the total value of those transactions (monetary)\. + +Before proceeding with any aggregation, you should take time to clean the data, concentrating especially on any missing values\. + +After you identify and transform the data using the RFM Aggregate node, you might use an RFM Analysis node to carry out further analysis\. + +Note that after the data file has been run through the RFM Aggregate node, it won't have any target values; therefore, before using the data file as input for further predictive analysis with any modeling nodes such as C5\.0 or CHAID, you need to merge it with other customer data (for example, by matching the customer IDs)\. + +The RFM Aggregate and RFM Analysis nodes use independent binning; that is, they rank and bin data on each measure of recency, frequency, and monetary value, without regard to their values or the other two measures\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/26fb8b86499454efd078384d70b02917d1c7dae1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/26fb8b86499454efd078384d70b02917d1c7dae1.md new file mode 100644 index 0000000..4bed2ca --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/26fb8b86499454efd078384d70b02917d1c7dae1.md @@ -0,0 +1,16 @@ +# Services and integrations + +# Services and integrations # + +You can extend the functionality of the platform by provisioning other services and components, and integrating with other cloud platforms\. + + + + * [Provision instances of services and components from the Services catalog](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/cloud-services.html)\. Add service instances and components to the IBM Cloud account to add functionality to the platform\. You must be the owner or be assigned the **Administrator** or **Editor** role in the IBM Cloud account for IBM watsonx to provision service instances\. + * [Integrate with other cloud platforms](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/int-cloud.html)\. Allow users to easily create connections to data sources on those cloud platforms\. You must have the required roles or permissions on the other cloud platform accounts\. + * [View regional availability and limitations](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/regional-datactr.html)\. Get information about where services are available by region\. + * To integrate with data sources, you can [create many types of connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) to work with a broad array of data sources\. Refer to [Connecting to data behind a firewall](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html) to create secure connections for data sources that are not externalized to the internet\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/270242015183da2517df613fd951623042268bee.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/270242015183da2517df613fd951623042268bee.md new file mode 100644 index 0000000..8dedc29 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/270242015183da2517df613fd951623042268bee.md @@ -0,0 +1,78 @@ +# Microsoft Azure Blob Storage connection + +# Microsoft Azure Blob Storage connection # + +To access your data in Microsoft Azure Blob Storage, create a connection asset for it\. + +Azure Blob Storage is used for storing large amounts of data in the cloud\. + +## Create a connection to Microsoft Azure Blob Storage ## + +To create the connection asset, you need these connection details: + +Connection string: Authentication is managed by the Azure portal access keys\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Azure Blob Storage connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Azure Blob Storage connection string setup ## + +Set up blob storage and access keys on the Microsoft Azure portal\. For instructions see: + + + + * [Quickstart: Upload, download, and list blobs with the Azure portal](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-portal) + * [Manage storage account access keys](https://docs.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage) + + + +Example connection string, which you can find in the **ApiKeys** section of the container: + +`DefaultEndpointsProtocol=https;AccountName=sampleaccount;AccountKey=samplekey;EndpointSuffix=core.windows.net` + +## Supported file types ## + +The Azure Blob Storage connection supports these file types: Avro, CSV, Delimited text, Excel, JSON, ORC, Parquet, SAS, SAV, SHP, and XML\. + +## Learn more ## + +[Microsoft Azure](https://azure.microsoft.com) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27091a60ba512e180c699261ecffdc3a621418a5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27091a60ba512e180c699261ecffdc3a621418a5.md new file mode 100644 index 0000000..8b4772e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27091a60ba512e180c699261ecffdc3a621418a5.md @@ -0,0 +1,28 @@ +# Association Rules node (SPSS Modeler) + +# Association Rules node # + +Association rules associate a particular conclusion (the purchase of a particular product, for example) with a set of conditions (the purchase of several other products, for example)\. + +For example, the rule + + beer <= cannedveg & frozenmeal (173, 17.0%, 0.84) + +states that `beer` often occurs when `cannedveg` and `frozenmeal` occur together\. The rule is 84% reliable and applies to 17% of the data, or 173 records\. Association rule algorithms automatically find the associations that you could find manually using visualization techniques, such as the Web node\. + +The advantage of association rule algorithms over the more standard decision tree algorithms (C5\.0 and C&R Trees) is that associations can exist between *any* of the attributes\. A decision tree algorithm will build rules with only a single conclusion, whereas association algorithms attempt to find many rules, each of which may have a different conclusion\. + +The disadvantage of association algorithms is that they are trying to find patterns within a potentially very large search space and, hence, can require much more time to run than a decision tree algorithm\. The algorithms use a generate and test method for finding rules\-\-simple rules are generated initially, and these are validated against the dataset\. The good rules are stored and all rules, subject to various constraints, are then specialized\. Specialization is the process of adding conditions to a rule\. These new rules are then validated against the data, and the process iteratively stores the best or most interesting rules found\. The user usually supplies some limit to the possible number of antecedents to allow in a rule, and various techniques based on information theory or efficient indexing schemes are used to reduce the potentially large search space\. + +At the end of the processing, a table of the best rules is presented\. Unlike a decision tree, this set of association rules cannot be used directly to make predictions in the way that a standard model (such as a decision tree or a neural network) can\. This is due to the many different possible conclusions for the rules\. Another level of transformation is required to transform the association rules into a classification rule set\. Hence, the association rules produced by association algorithms are known as unrefined models\. Although the user can browse these unrefined models, they cannot be used explicitly as classification models unless the user tells the system to generate a classification model from the unrefined model\. This is done from the browser through a Generate menu option\. + +Two association rule algorithms are supported: + + + + * The Apriori node extracts a set of rules from the data, pulling out the rules with the highest information content\. Apriori offers five different methods of selecting rules and uses a sophisticated indexing scheme to process large data sets efficiently\. For large problems, Apriori is generally faster to train; it has no arbitrary limit on the number of rules that can be retained, and it can handle rules with up to 32 preconditions\. Apriori requires that input and output fields all be categorical but delivers better performance because it is optimized for this type of data\. + * The Sequence node discovers association rules in sequential or time\-oriented data\. A sequence is a list of item sets that tends to occur in a predictable order\. For example, a customer who purchases a razor and aftershave lotion may purchase shaving cream the next time he shops\. The Sequence node is based on the CARMA association rules algorithm, which uses an efficient two\-pass method for finding sequences\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2746f2e53d41f5810d92d843af8c0ab2b36a0d47.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2746f2e53d41f5810d92d843af8c0ab2b36a0d47.md new file mode 100644 index 0000000..21bf41f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2746f2e53d41f5810d92d843af8c0ab2b36a0d47.md @@ -0,0 +1,11 @@ +# Selecting a Decision domain in the Modeling Assistant + +# Selecting a Decision domain in the Modeling Assistant # + +There are different decision domains currently available in the Modeling Assistant and you can be guided to choose the right domain for your problem\. + +Once you have added and imported your data into your model, the Modeling Assistant helps you to formulate your optimization model by offering you suggestions in natural language that you can edit\. In order to make intelligent suggestions using your data, and to ensure that the proposed model formulation is well suited to your problem, you are asked to start by selecting a decision domain for your model\. + +If you need a decision domain that is not currently supported by the Modeling Assistant, you can still formulate your model as a Python notebook or as an OPL model in the experiment UI editor\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2756dead36ac092838f80acffe6ecee13a22a376.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2756dead36ac092838f80acffe6ecee13a22a376.md new file mode 100644 index 0000000..73b1356 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2756dead36ac092838f80acffe6ecee13a22a376.md @@ -0,0 +1,23 @@ +# isotonicasnode properties + +# isotonicasnode properties # + +![Isotonic\-AS node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/sparkisotonicasnodeicon.png)Isotonic Regression belongs to the family of regression algorithms\. The Isotonic\-AS node in SPSS Modeler is implemented in Spark\. For details about Isotonic Regression algorithms, see [https://spark\.apache\.org/docs/2\.2\.0/mllib\-isotonic\-regression\.html](https://spark.apache.org/docs/2.2.0/mllib-isotonic-regression.html)\. + + + +isotonicasnode properties + +Table 1\. isotonicasnode properties + +| `isotonicasnode` properties | Data type | Property description | +| --------------------------- | --------- | ---------------------------------------------------------------------------------------------------- | +| `label` | *string* | This property is a dependent variable for which isotonic regression is calculated\. | +| `features` | *string* | This property is an independent variable\. | +| `weightCol` | *string* | The weight represents a number of measures\. Default is `1`\. | +| `isotonic` | *Boolean* | This property indicates whether the type is `isotonic` or `antitonic`\. | +| `featureIndex` | *integer* | This property is for the index of the feature if `featuresCol` is a vector column\. Default is `0`\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2757f7f9b9e4975b9e53da5b4508ff9d7a41a0a4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2757f7f9b9e4975b9e53da5b4508ff9d7a41a0a4.md new file mode 100644 index 0000000..dabdb24 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2757f7f9b9e4975b9e53da5b4508ff9d7a41a0a4.md @@ -0,0 +1,125 @@ +# Creating a text analysis experiment + +# Creating a text analysis experiment # + +Use AutoAI's text analysis feature to perform text analysis of your experiments\. For example, perform basic sentiment analysis to predict an outcome based on text comments\. + +Note: Text analysis is only available for AutoAI classification and regression experiments\. This feature is not available for time series experiments\. + +## Text analysis overview ## + +When you create an experiment that uses the text analysis feature, the AutoAI process uses the `word2vec` algorithm to transform the text into vectors, then compares the vectors to establish the impact on the prediction column\. + +The `word2vec` algorithm takes a corpus of text as input and outputs a set of vectors\. By turning text into a numerical representation, it can detect and compare similar words\. When trained with enough data, `word2vec` can make accurate predictions about a word's meaning or relationship to other words\. The predictions can be used to analyze text and guess at the meaning in sentiment analysis applications\. + +During the feature engineering phase of the experiment training, 20 features are generated for the text column, by using the `word2vec` algorithm\. Auto\-detection of text features is based on analyzing the number of unique values in a column and the number of tokens in a record (minimum number = 3)\. If the number of unique values is less than number of all values divided by 5, the column is not treated as text\. + +When the experiment completes, you can review the feature engineering results from the pipeline details page\. You can also save a pipeline as a notebook, where you can review the transformations and see a visualization of the transformations\. + +Note: When you review the experiment, if you determine that a text column was not detected and processed by the auto\-detection, you can specify the text column manually in the experiment settings\. + +In this example, the comments for a fictional car rental company are used to train a model that predicts a satisfaction rating when a new comment is entered\. + +Watch this short video to see this example and then read further details about the text feature below the video\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + + + + * Transcript + + Synchronize transcript with video + + + + | Time | Transcript | + | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | 00:00 | In this video you'll see how to create an AutoAI experiment to perform sentiment analysis on a text file. | + | 00:09 | You can use the text feature engineering to perform text analysis in your experiments. | + | 00:15 | For example, perform basic sentiment analysis to predict an outcome based on text comments. | + | 00:22 | Start in a project and add an asset to that project, a new AutoAI experiment. | + | 00:29 | Just provide a name, description, select a machine learning service, and then create the experiment. | + | 00:38 | When the AutoAI experiment builder displays, you can add the data set. | + | 00:43 | In this case, the data set is already stored in the project as a data asset. | + | 00:48 | Select the asset to add to the experiment. | + | 00:53 | Before continuing, preview the data. | + | 00:56 | This data set has two columns. | + | 00:59 | The first contains the customers' comments and the second contains either 0, for "Not satisfied", or 1, for "Satisfied". | + | 01:08 | This isn't a time series forecast, so select "No" for that option. | + | 01:13 | Then select the column to predict, which is "Satisfaction" in this example. | + | 01:19 | AutoAI determines that the satisfaction column contains two possible values, making it suitable for a binary classification model. | + | 01:28 | And the positive class is 1, for "Satisfied". | + | 01:32 | Open the experiment settings if you'd like to customize the experiment. | + | 01:36 | On the data source panel, you'll see some options for the text feature engineering. | + | 01:41 | You can automatically select the text columns, or you can exercise more control by manually specifying the columns for text feature engineering. | + | 01:52 | You can also select how many vectors to create for each column during text feature engineering. | + | 01:58 | A lower number faster and a higher number is more accurate, but slower. | + | 02:03 | Now, run the experiment to view the transformations and progress. | + | 02:09 | When you create an experiment that uses the text analysis feature, the AutoAI process uses the word2vec algorithm to transform the text into vectors, then compares the vectors to establish the impact on the prediction column. | + | 02:23 | During the feature engineering phase of the experiment training, twenty features are generated for the text column using the word2vec algorithm. | + | 02:33 | When the experiment completes, you can review the feature engineering results from the pipeline details page. | + | 02:40 | On the Features summary panel, you can review the text transformations. | + | 02:45 | You can see that AutoAI created several text features by applying the algorithm function to the column elements, along with the feature importance showing which features contribute most to your prediction output. | + | 02:59 | You can save this pipeline as a model or as a notebook. | + | 03:03 | The notebook contains the code to see the transformations and visualizations of those transformations. | + | 03:09 | In this case, create a model. | + | 03:13 | Use the link to view the model. | + | 03:16 | Now, promote the model to a deployment space. | + | 03:23 | Here are the model details, and from here you can deploy the model. | + | 03:28 | In this case, it will be an online deployment. | + | 03:36 | When that completes, open the deployment. | + | 03:39 | On the test app, you can specify one or more comments to analyze. | + | 03:46 | Then, click "Predict". | + | 03:49 | The first customer is predicted not to be satisfied with the service. | + | 03:54 | And the second customer is predicted to be satisfied with the service. | + | 03:59 | Find more videos in the Cloud Pak for Data as a Service documentation. | + + + + + +Given a data set that contains a column of review comments for the rental experience (Customer\_service), and a column that contains a binary satisfaction rating (Satisfaction) where 0 represents a negative comment and 1 represents a positive comment, the experiment is trained to predict a satisfaction rating when new feedback is entered\. + +### Training a text transformation experiment ### + +After you load the data set and specify the prediction column (Satisfaction), the *Experiment settings* selects the *Use text feature engineering* option\. + +![Data source settings for use text feature engineering](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-text-transform1.png) + +Note some of the details for tuning your text analysis experiment: + + + + * You can accept the default selection of automatically selecting the text columns or you can exercise more control by manually specifying the columns for text feature engineering\. + * As the experiment runs, a default of 20 features is generated for the text column by using the `word2vec` algorithm\. You can edit that value to increase or decrease the number of features\. The more vectors that you generate the more accurate your model are, but the longer training takess\. + * The remainder of the options applies to all types of experiments so you can fine\-tune how to handle the final training data\. + + + +Run the experiment to view the transformations in progress\. + +![Pipeline leaderboard of algorithm](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-text-transform4.png) + +Select the name of a pipeline, then click **Feature summary** to review the text transformations\. + +![Feature summary of individual pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-text-transform2.png) + +You can also save the experiment pipeline as a notebook and review the transformations as a visualization\. + +### Deploying and scoring a text transformation model ### + +When you score this model, enter new comments to get a prediction with a confidence score for whether the comment results in a positive or negative satisfaction rating\. + +For example, entering the comment "It took us almost three hours to get a car\. It was absurd" predicts a satisfaction rating of 0 with a confidence score of 95%\. + +![Predicting a satisfaction score](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-text-transform3.png) + +## Next steps ## + +[Building a time series forecast experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries.html) + +**Parent topic:**[Building an AutoAI model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-build.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2779271745a02f4de48bd92ab93a7a4be4a73d38.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2779271745a02f4de48bd92ab93a7a4be4a73d38.md new file mode 100644 index 0000000..d614124 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2779271745a02f4de48bd92ab93a7a4be4a73d38.md @@ -0,0 +1,28 @@ +# Classifying telecommunications customers (SPSS Modeler) + +# Classifying telecommunications customers # + +Logistic regression is a statistical technique for classifying records based on values of input fields\. It is analogous to linear regression, but takes a categorical target field instead of a numeric one\. + +For example, suppose a telecommunications provider has segmented its customer base by service usage patterns, categorizing the customers into four groups\. If demographic data can be used to predict group membership, you can customize offers for individual prospective customers\. + +This example uses the flow named Classifying Telecommmunications Customers, available in the example project \. The data file is telco\.csv\. + +The example focuses on using demographic data to predict usage patterns\. The target field `custcat` has four possible values that correspond to the four customer groups, as follows: + + + +Table 1\. Possible values for the target field + +| Value | Label | +| ----- | ------------- | +| 1 | Basic Service | +| 2 | E\-Service | +| 3 | Plus Service | +| 4 | Total Service | + + + +Because the target has multiple categories, a multinomial model is used\. In the case of a target with two distinct categories, such as yes/no, true/false, or churn/don't churn, a binomial model could be created instead\. See [Telecommunications churn](https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_churn.html#tut_churn) for more information\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/277c8cb678caf766466ede03c506eb0a822fd400.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/277c8cb678caf766466ede03c506eb0a822fd400.md new file mode 100644 index 0000000..0bee66a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/277c8cb678caf766466ede03c506eb0a822fd400.md @@ -0,0 +1,14 @@ +# Supported data sources in Decision Optimization + +# Supported data sources in Decision Optimization # + +Decision Optimization supports the following relational and nonrelational data sources on \. watsonx\.ai\. + + + + * [IBM data sources](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/DOconnections.html?context=cdpaas&locale=en#DOConnections__ibm-data-src) + * [Third\-party data sources](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/DOconnections.html?context=cdpaas&locale=en#DOConnections__third-party-data-src) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27963df2327fbe202b836ac5905258d063a8770d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27963df2327fbe202b836ac5905258d063a8770d.md new file mode 100644 index 0000000..bb99de4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27963df2327fbe202b836ac5905258d063a8770d.md @@ -0,0 +1,22 @@ +# applyautoclassifiernode properties + +# applyautoclassifiernode properties # + +You can use Auto Classifier modeling nodes to generate an Auto Classifier model nugget\. The scripting name of this model nugget is *applyautoclassifiernode*\. For more information on scripting the modeling node itself, see [autoclassifiernode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/binaryclassifiernodeslots.html#binaryclassifiernodeslots)\. + + + +applyautoclassifiernode properties + +Table 1\. applyautoclassifiernode properties + +| `applyautoclassifiernode` Properties | Values | Property description | +| ------------------------------------ | -------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `flag_ensemble_method` | `Voting``ConfidenceWeightedVoting``RawPropensityWeightedVoting``HighestConfidence``AverageRawPropensity` | Specifies the method used to determine the ensemble score\. This setting applies only if the selected target is a flag field\. | +| `flag_voting_tie_selection` | `Random``HighestConfidence``RawPropensity` | If a voting method is selected, specifies how ties are resolved\. This setting applies only if the selected target is a flag field\. | +| `set_ensemble_method` | `Voting``ConfidenceWeightedVoting``HighestConfidence` | Specifies the method used to determine the ensemble score\. This setting applies only if the selected target is a set field\. | +| `set_voting_tie_selection` | `Random``HighestConfidence` | If a voting method is selected, specifies how ties are resolved\. This setting applies only if the selected target is a nominal field\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27a861059a73e83bc02c633ee194dac6f8ace374.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27a861059a73e83bc02c633ee194dac6f8ace374.md new file mode 100644 index 0000000..abc9744 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27a861059a73e83bc02c633ee194dac6f8ace374.md @@ -0,0 +1,44 @@ +# Batch deployment input details for Pytorch models + +# Batch deployment input details for Pytorch models # + +Follow these rules when you are specifying input details for batch deployments of Pytorch models\. + +Data type summary table: + + + +| Data | Description | +| ------------ | -------------------------------------- | +| Type | inline, data references | +| File formats | \.zip archive that contains JSON files | + + + +## Data sources ## + +Input or output data references: + + + + * Local or managed assets from the space + * Connected (remote) assets: Cloud Object Storage + + + +If you are specifying input/output data references programmatically: + + + + * Data source reference `type` depends on the asset type\. Refer to the **Data source reference types** section in [Adding data assets to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + * If you deploy Pytorch models with ONNX format, specify the `keep_initializers_as_inputs=True` flag and set `opset_version` to `9` (always set `opset_version` to the most recent version that is supported by the deployment runtime)\. + + torch.onnx.export(net, x, 'lin_reg1.onnx', verbose=True, keep_initializers_as_inputs=True, opset_version=9) + + + +Note: The environment variables parameter of deployment jobs is not applicable\. + +**Parent topic:**[Batch deployment input details by framework](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-by-framework.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27db2218237b89f557d3702f4270288e4460e9cb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27db2218237b89f557d3702f4270288e4460e9cb.md new file mode 100644 index 0000000..671ba58 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27db2218237b89f557d3702f4270288e4460e9cb.md @@ -0,0 +1,58 @@ +# Setting up the IBM watsonx platform for administrators + +# Setting up the IBM watsonx platform for administrators # + +To set up the watsonx platform for your organization, sign up for IBM watsonx\.ai, upgrade to a paid plan, set up the services that you need, and add your users with the appropriate permissions\. + +IBM watsonx\.ai on the watsonx platform includes cloud\-based services that provide data preparation, data science, and AI modeling capabilities\. The watsonx platform is protected by the same powerful security constraints that are available on IBM Cloud\. + + + +Table 1\. Configuration steps for IBM watsonx + +| Task | Location | Required Role | Description | +| ----------------------------------------------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Set up the IBM Cloud account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-account.html) | IBM Cloud | Account Owner | Set up a paid account\. | +| [Manage users and access](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-access.html) | IBM Cloud | Administrator | Invite users to join the account, create user access groups, and assign roles or access groups to users to provide access\. | +| [Set up IBM Cloud Object Storage for use with IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html) | IBM Cloud and IBM watsonx | Administrator | Create a test project to initialize IBM Cloud Object Storage and set the location to Global in each user's profile\. | +| [Set up the Watson Studio and Watson Machine Learning services](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/set-up-ws.html) | IBM Cloud and IBM watsonx | Administrator | Upgrade to a paid plan\. | +| [Create the Platform assets catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/catalog/platform-assets.html) | IBM watsonx | Administrator or Manager role for the Cloud Pak for Data service | Add connections to the platform assets catalog for use by collaborators\. | +| [Set up watsonx\.governance](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-setup-wos.html) | IBM Cloud and IBM watsonx | Administrator or Editor | Create access policies and assign roles to users\. | +| [Configure firewall access](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall_ovrvw.html) (if necessary) | IBM watsonx and cloud provider firewall configuration | Administrator | Configure inbound access through a firewall\. | +| Optional\. [Configure security mechanisms](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html) | IBM Cloud | Administrator | IBM watsonx has five security levels to ensure that data, application endpoints, and identity are protected\. For a list of common security mechanisms, see [Common security mechanisms](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-platform.html?context=cdpaas&locale=en#security)\. | +| Optional\. [Connect to data behind a firewall](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html) | IBM Cloud | Administrator | Securely connect to databases that are hosted behind a firewall\. | +| Optional\. [Configure integrations with other cloud platforms](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/int-cloud.html) | IBM Cloud and IBM watsonx | Administrator | Connect to services on other cloud platforms\. | + + + +## Common security mechanisms ## + +As an IBM Cloud account owner or administrator, you set up security for the account by providing single sign\-on, IAM role\-based access control, secure communication, and other security constraints\. + +Following are common security mechanisms for the IBM watsonx platform: + + + + * Encrypt your instance with your own key\. See [Encrypt your IBM Cloud Object Storage instance with your own key](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html#byok)\. + * Use IBM Key Protect to encrypt key data assets in Cloud Object Storage\. See [Encrypting at rest data](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-data.html#encrypting-at-rest-data)\. + * Support single sign\-on using SAML federation or Active Directory\. See [SSO with Federated IDs](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-account.html#sso-with-federated-ids)\. + * Configure secure connections to databases that are behind a firewall\. See [Connecting to data behind a firewall](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html) + * Configure secure communication between services with Service Endpoints\. See [Private network service endpoints](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html#private-network-service-endpoints)\. + * Control access at the IP address level\. See [Allow specific IP addresses](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html#allow-specific-ip-addresses)\. + * Require personal credentials when creating connections\. The default setting is shared credentials\. See [Managing your account settings](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/account-settings.html#set-the-credentials-for-connections)\. + + + +## Learn more ## + + + + * HIPAA readiness is available for some regions and plans\. See [HIPAA readiness](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security.html#hipaa)\. + * See [Security for IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html) for a complete list of security constraints available in IBM watsonx\. + * See [Overview of watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/overview-wx.html) to understand the architecture of the platform\. + + + +**Parent topic:**[Getting started](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-wdp.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27e7ad16129a9dc8ac8ce2ee79c9b584d441f0de.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27e7ad16129a9dc8ac8ce2ee79c9b584d441f0de.md new file mode 100644 index 0000000..289eca5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27e7ad16129a9dc8ac8ce2ee79c9b584d441f0de.md @@ -0,0 +1,51 @@ +# Accessing flow run results + +# Accessing flow run results # + +Many SPSS Modeler nodes produce output objects such as models, charts, and tabular data\. Many of these outputs contain useful values that can be used by scripts to guide subsequent runs\. These values are grouped into content containers (referred to as simply containers) which can be accessed using tags or IDs that identify each container\. The way these values are accessed depends on the format or "content model" used by that container\. + +For example, many predictive model outputs use a variant of XML called PMML to represent information about the model such as which fields a decision tree uses at each split, or how the neurons in a neural network are connected and with what strengths\. Model outputs that use PMML provide an XML Content Model that can be used to access that information\. For example: + + stream = modeler.script.stream() + # Assume the flow contains a single C5.0 model builder node + # and that the datasource, predictors, and targets have already been + # set up + modelbuilder = stream.findByType("c50", None) + results = [] + modelbuilder.run(results) + modeloutput = results[0] + + # Now that we have the C5.0 model output object, access the + # relevant content model + cm = modeloutput.getContentModel("PMML") + + # The PMML content model is a generic XML-based content model that + # uses XPath syntax. Use that to find the names of the data fields. + # The call returns a list of strings match the XPath values + dataFieldNames = cm.getStringValues("/PMML/DataDictionary/DataField", "name") + +SPSS Modeler supports the following content models in scripting: + + + + * Table content model provides access to the simple tabular data represented as rows and columns\. + * XML content model provides access to content stored in XML format\. + * JSON content model provides access to content stored in JSON format\. + * Column statistics content model provides access to summary statistics about a specific field\. + * Pair\-wise column statistics content model provides access to summary statistics between two fields or values between two separate fields\. + + + +Note that the following nodes don't contain these content models: + + + + * Time Series + * Discriminant + * SLRM + * All Extension nodes + * All Database Modeling nodes + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27fcab0041feb8b819e329a319b12d2f4167318a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27fcab0041feb8b819e329a319b12d2f4167318a.md new file mode 100644 index 0000000..470b289 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/27fcab0041feb8b819e329a319b12d2f4167318a.md @@ -0,0 +1,48 @@ +# Creating SPSS Modeler jobs + +# Creating SPSS Modeler jobs # + +You can create a job to run an SPSS Modeler flow\. + +To create an SPSS Modeler job: + + + +1. In SPSS Modeler, click the **Create a job** icon ![the jobs icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/Run-schedule_Blue.png) from the toolbar and select **Create a job**\. A wizard will appear\. Click **Next** to proceed through each page of the wizard as described here\. +2. Define the job details by entering a name and a description (optional)\. If desired, you can also specify retention settings for the job\. Select **Job run retention settings** to set how long to retain finished job runs and job run artifacts such as logs\. You can select one of the following retention methods\. Be mindful when changing the default as too many job run files can quickly use up project storage\. + + + + * **By duration (days)**. Specify the number of days to retain job runs and job artifacts. The retention value is set to 7 days by default (the last 7 days of job runs retained). + * **By amount**. Specify the last number of finished job runs and job artifacts to keep. The retention value is set to 200 jobs by default. + + + +3. On the Flow parameters page, you can set values for flow parameters if any exist for the flow\. They are, in effect, user\-defined variables that are saved and persisted with the flow\. Parameters are often used in scripting to control the behavior of the script by providing information about fields and values that don't need to be hard coded in the script\. See [Setting properties for flows](https://dataplatform.cloud.ibm.com/docs/content/wsd/flow_properties.html) for more information\. + + For example, your flow might contain a parameter called **age\_param** that you choose to set to **40** here, and a parameter called **bp\_param** you might set to **HIGH**. +4. On the Configuration page, you can choose whether the job will run the entire flow or one or more branches of the flow\. +5. On the Schedule page, you can optionally add a one\-time or repeating schedule\. + + If you define a start day and time without selecting **Repeat**, the job will run exactly one time at the specified day and time. If you define a start date and time and you select **Repeat**, the job will run for the first time at the timestamp indicated in the Repeat section. + + You can't change the time zone; the schedule uses your web browser's time zone setting. If you exclude certain weekdays, the job might not run as you would expect. The reason might be due to a discrepancy between the time zone of the user who creates the schedule, and the time zone of the compute node where the job runs. +6. Optionally turn on notifications for the job\. You can select the type of alerts to receive\. +7. Review the job settings\. Click **Save** to create the job\. + + The SPSS Modeler job is listed under **Jobs** in your project. + + + +## Learn more ## + + + + * [Viewing job details](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html#view-job-details) + * [SPSS Modeler documentation](https://dataplatform.cloud.ibm.com/docs/content/wsd/spss-modeler.html) + + + +**Parent topic**: [Jobs](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/28243d1c0b8bcf04fe3556990d40d1a31f4cb58d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/28243d1c0b8bcf04fe3556990d40d1a31f4cb58d.md new file mode 100644 index 0000000..8bfa6b9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/28243d1c0b8bcf04fe3556990d40d1a31f4cb58d.md @@ -0,0 +1,102 @@ +# Manage default settings + +# Manage default settings # + +You can manage the global settings of your IBM Watson Pipelines such as a default error policy and default rules for node caching\. + +Global settings apply to all nodes in the pipeline unless local node settings overwrite them\. To update global settings, click the **Manage default settings** icon ![gear icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/ml-setting-icon.png) on the toolbar\. You can configure: + + + + * [Error policy](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-global-settings.html?context=cdpaas&locale=en#err-pol) + * [Node caching](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-global-settings.html?context=cdpaas&locale=en#node-cache) + + + +## Setting global error policy ## + +You can define the behavior of Pipelines when an error occurs\. + + + + * **Fail pipeline on error** stops the flow and initiates an error\-handling flow\. + * **Continue pipeline on error** tries to continue running the pipeline\. + + + +### Error handling ### + +You can configure the behavior of Pipelines for error handling\. + + + + * **Create custom\-error handling response**: Customize an error\-handling response\. Add an error handling node to the canvas so you can configure a custom error response\. The response applies to all configured nodes to fail when an error occurs\. + + + + * **Show icon on nodes linked to error handling pipeline**: An icon flags a node with an error to help debug the flow. + + + + + +To learn more about error handling, see [Managing pipeline errors](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-errors.html) + +## Setting node caches ## + +Manual caching for nodes sets the default for how the pipeline caches and stores information\. You can override these settings for individual nodes\. + +### Default cache usage frequency ### + +You can change the following cache settings: + +#### Caching method #### + +Choose whether to enable automatic caching for all nodes or choose to manually set cache conditions for specific nodes\. + + + + * Enable automatic caching for all nodes (recommended) + All nodes that support caching enable it by default. Setting *Creation Mode* or *Copy Mode* in your node's settings to `Overwrite` automatically disables cache, if the node supports these setting parameters. + * Enable caching for specific nodes in the node properties panel\. + In individual nodes, you can select **Create data cache at this node** in **Output** to allow caching for individual nodes. A save icon appears on nodes that uses this feature. + + + +#### Cache usage #### + +Choose the conditions for using cached data\. + + + + * Do not use cache + * Always use cache + * Use cache when all selected conditions are met + + + + * Retrying from a previous failed run + * Input values for the current pipeline are unchanged from previous run + * Pipeline version is unchanged from previous run + + + + + +To view and download your cache data, see **Run tracker** in your flow\. You can download the results by opening a preview of the node's cache and clicking the download icon\. + +### Resetting the cache ### + +If your cache was enabled, you can choose to reset your cache when you run a Pipelines job\. When you click **Run again**, you can select *Clear pipeline cache* in **Define run settings**\. By choosing this option, you are overriding the default cache settings to reset the cache for the current run\. However, the pipeline still creates cache for subsequent runs while cache is enabled\. + +## Managing your Pipelines settings ## + +Configure other global settings for your Pipelines asset\. + +### Autosave ### + +Choose to automatically save your current Pipelines canvas at a selected frequency\. Only changes that impact core pipeline flow are saved\. + +**Parent topic:**[IBM Watson Pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2828fd5943abba08aa260f1080b850c90fc4efbe.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2828fd5943abba08aa260f1080b850c90fc4efbe.md new file mode 100644 index 0000000..9e2affa --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2828fd5943abba08aa260f1080b850c90fc4efbe.md @@ -0,0 +1,11 @@ +# Reducing input data string length (SPSS Modeler) + +# Reducing input data string length # + +For binomial logistic regression, and auto classifier models that include a binomial logistic regression model, string fields are limited to a maximum of eight characters\. Where strings are more than eight characters, you can recode them using a Reclassify node\. + +This example uses the flow named Reducing Input Data String Length, available in the example project \. The data file is drug\_long\_name\.csv\. + +This example focuses on a small part of a flow to show the type of errors that may be generated with overlong strings, and explains how to use the Reclassify node to change the string details to an acceptable length\. Although the example uses a binomial Logistic Regression node, it is equally applicable when using the Auto Classifier node to generate a binomial Logistic Regression model\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/28c4d682b46e9723f538988bb2bdb1eb65618e5e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/28c4d682b46e9723f538988bb2bdb1eb65618e5e.md new file mode 100644 index 0000000..54b8559 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/28c4d682b46e9723f538988bb2bdb1eb65618e5e.md @@ -0,0 +1,108 @@ +# Creating and managing jobs in a project + +# Creating and managing jobs in a project # + +You create jobs to run assets or files in tools, such as Data Refinery flows, SPSS Modeler flows, Notebooks, and scripts, in a project\. + +When you create a job you define the properties for the job, such as the name, definition, environment runtime, schedule and notification specifications on different pages\. You can run a job immediately or wait for the job to run at the next scheduled interval\. + +Each time a job is started, a job run is created, which you can monitor and use to compare with the job run history of previous runs\. You can view detailed information about each job run, job state changes, and job failures in the job run log\. + +How you create a job depends on the asset or file\. + + + +Job creation options for assets or files + +| Asset or file | Create job in tool | Create job from the Assets page | More information | +| --------------------------------------- | ------------------ | ------------------------------- | ---------------------------------------- | +| Data Refinery flow | ✓ | ✓ | [Creating jobs in Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-dr.html) | +| SPSS Modeler flow | ✓ | ✓ | [Creating jobs in SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-spss.html) | +| Notebook created in the Notebook editor | ✓ | ✓ | [Creating jobs in the Notebook editor](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-nb-editor.html) | +| Pipelines | ✓ | | [Creating jobs for Pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-pipelines.html) | + + + +## Creating jobs from the Assets page ## + +You can create a job to run an asset from the project's **Assets** page\. + +**Required permissions** : You must have an **Editor** or **Admin** role in the project\. + +Restriction:You cannot run a job by using an API key from a [service ID](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-authentication.html)\. + +To create jobs for a listed asset from the **Assets** page of a project: + + + +1. Select the asset from the section for your asset type and choose **New job** from the menu icon with the lists of options (![actions icon three vertical dots](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png)) at the end of the table row\. +2. Define the job details by entering a name and a description (optional)\. +3. If you can select **Setting**, specify the settings that you want for the job\. +4. If you can select **Configure**, choose an environment runtime for the job\. Depending on the asset type, you can optionally configure more settings, for example environment variables or script arguments\. + + To avoid accumulating too many finished job runs and job run artifacts, set how long to retain finished job runs and job run artifacts like logs or notebook results. You can either select the number of days to retain the job runs or the last number of job runs to keep. +5. On the **Schedule** page, you can optionally add a one\-time or repeating schedule\. + + If you select the **Repeat** option and unit of **Minutes** with the value of *n*, the job runs at the start of the hour, and then at every multiple of *n*. For example, if you specify a value of 11 it will run at 0, 11, 22, 33, 44 and 55 minutes of each hour. + + If you also select the **Start of Schedule** option, the job starts to run at the first multiple of *n* of the hour that occurs after the time that you provide in the **Start Time** field. For example, if you enter 10:24 for the **Start of Time** value, and you select **Repeat** and set the job to repeat every 14 minutes, then your job will run at 10:42, 10:56, 11:00, 11:14. 11:28, 11:42, 11:56, and so on. + + You can't change the time zone; the schedule uses your web browser's time zone setting. If you exclude certain weekdays, the job might not run as you would expect. The reason might be due to a discrepancy between the time zone of the user who creates the schedule, and the time zone of the compute node where the job runs. + + An API key is generated when you create a scheduled job, and future runs will use this API key. If you didn't create a scheduled job but choose to modify one, an API key is generated for you when you modify the job and future runs will use this API key. +6. (Optional): Select to see notifications for the job\. You can select the type of alerts to receive\. +7. Review the job settings\. Then, create the job and run it immediately, or create the job and run it later\. + + + +## Managing jobs ## + +You can view all of the jobs that exist for your project from the project's **Jobs** page\. With **Admin** or **Editor** role for the project, you can view and edit the job details\. You can run jobs manually and you can delete jobs\. With **Viewer** role for the project, you can only view the job details\. You can't run or delete jobs with Viewer role\. + +To view the details of a specific job, click the job\. From the job's details page, you can: + + + + * *View the runs* for that job and the status of each run\. If a run failed, you can select the run and view the log tail or download the entire log file to help you troubleshoot the run\. A failed run might be related to a temporary connection or environment problem\. Try running the job again\. If the job still fails, you can send the log to Customer Support\. + * *Edit job settings* by clicking **Edit job**, for example to change schedule settings or to pick another environment template\. + * *Run the job manually* by clicking ![the run icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/run-job.png) from the job's action bar\. You can start a scheduled job based on the schedule and on demand\. + * *Delete* the job by clicking ![the bin icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/delete-job.png) from the job's action bar\. + + + +### Viewing and editing jobs in a tool ### + +You can view and edit job settings associated with an asset directly in the following tools: + + + + * Data Refinery + * DataStage + * Match 360 + * Notebook editor or viewer + * Pipelines + + + +#### Viewing and editing jobs in Data Refinery, Notebooks, and Pipelines #### + + + +1. In the tool, click the Jobs icon ![the jobs icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/Run-schedule_Blue.png) from the toolbar and select **Save and view jobs**\. This action lists the jobs that exist for the asset\. +2. Select a job to see its details\. You can change job settings by clicking **Edit job**\. + + + +## Learn more ## + + + + * [Creating jobs in Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-dr.html) + * [Creating jobs in the Notebook editor or Notebook viewer](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-nb-editor.html) + * [Creating jobs for Pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-pipelines.html) + + + +**Parent topic:**[Working in projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/28f15ac17715506bb29327874de7f76cb9fb2908.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/28f15ac17715506bb29327874de7f76cb9fb2908.md new file mode 100644 index 0000000..7ea5dae --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/28f15ac17715506bb29327874de7f76cb9fb2908.md @@ -0,0 +1,29 @@ +# Administering your accounts and services + +# Administering your accounts and services # + +For most administration tasks, you must be the IBM Cloud account owner or administrator\. If you log in to your own account, you are the account owner\. If you log in to someone else's account or an enterprise account, you might not be the account owner or administrator\. + +Tasks for all users: + + + + * [Managing your personal settings](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/personal-settings.html) + * [Determining your roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/your-roles.html) + * [Understanding accessibility features](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/accessibility.html) + + + +Tasks for IBM Cloud account owners or administrators in IBM watsonx and in IBM Cloud: + + + + * [Managing IBM watsonx services](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_console.html) + * [Securing IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html) + * [Managing your IBM Cloud account](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/manage-account.html) + * [Adding and managing IBM Cloud services](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/create-services.html) + * [Reading notices](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/notices.html) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2904e26946523bb3e78975f68a822f5f2a32b9f5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2904e26946523bb3e78975f68a822f5f2a32b9f5.md new file mode 100644 index 0000000..a543c6d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2904e26946523bb3e78975f68a822f5f2a32b9f5.md @@ -0,0 +1,32 @@ +# Trigonometric functions (SPSS Modeler) + +# Trigonometric functions # + +All of the functions in this section either take an angle as an argument or return one as a result\. + + + +CLEM trigonometric functions + +Table 1\. CLEM trigonometric functions + +| Function | Result | Description | +| ----------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `arccos(NUM)` | *Real* | Computes the arccosine of the specified angle\. | +| `arccosh(NUM)` | *Real* | Computes the hyperbolic arccosine of the specified angle\. | +| `arcsin(NUM)` | *Real* | Computes the arcsine of the specified angle\. | +| `arcsinh(NUM)` | *Real* | Computes the hyperbolic arcsine of the specified angle\. | +| `arctan(NUM)` | *Real* | Computes the arctangent of the specified angle\. | +| `arctan2(NUM_Y, NUM_X)` | *Real* | Computes the arctangent of `NUM_Y / NUM_X` and uses the signs of the two numbers to derive quadrant information\. The result is a real in the range `- pi < ANGLE <= pi (radians) – 180 < ANGLE <= 180 (degrees)` | +| `arctanh(NUM)` | *Real* | Computes the hyperbolic arctangent of the specified angle\. | +| `cos(NUM)` | *Real* | Computes the cosine of the specified angle\. | +| `cosh(NUM)` | *Real* | Computes the hyperbolic cosine of the specified angle\. | +| `pi` | *Real* | This constant is the best real approximation to pi\. | +| `sin(NUM)` | *Real* | Computes the sine of the specified angle\. | +| `sinh(NUM)` | *Real* | Computes the hyperbolic sine of the specified angle\. | +| `tan(NUM)` | *Real* | Computes the tangent of the specified angle\. | +| `tanh(NUM)` | *Real* | Computes the hyperbolic tangent of the specified angle\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2910b7c4cd65f8e4add1607791dd22bed468b61d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2910b7c4cd65f8e4add1607791dd22bed468b61d.md new file mode 100644 index 0000000..f997e6a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2910b7c4cd65f8e4add1607791dd22bed468b61d.md @@ -0,0 +1,6 @@ +# Dual Y-axes charts + +# Dual Y\-axes charts # + +A dual Y\-axes chart summarizes or plots two Y\-axes variables that have different domains\. For example, you can plot the number of cases on one axis and the mean salary on another\. This chart can also be a mix of different graphic elements so that the dual Y\-axes chart encompasses several of the different chart types\. Dual Y\-axes charts can display the counts as a line and the mean of each category as a bar\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/292c0e87b8e56b15991c954508ab125a8fb80972.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/292c0e87b8e56b15991c954508ab125a8fb80972.md new file mode 100644 index 0000000..dfc10ed --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/292c0e87b8e56b15991c954508ab125a8fb80972.md @@ -0,0 +1,24 @@ +# applyapriorinode properties + +# applyapriorinode properties # + +You can use Apriori modeling nodes to generate an Apriori model nugget\. The scripting name of this model nugget is *applyapriorinode*\. For more information on scripting the modeling node itself, see [apriorinode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/apriorinodeslots.html#apriorinodeslots)\. + + + +applyapriorinode properties + +Table 1\. applyapriorinode properties + +| `applyapriorinode` Properties | Values | Property description | +| ----------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `max_predictions` | *number (integer)* | | +| `ignore_unmatached` | *flag* | | +| `allow_repeats` | *flag* | | +| `check_basket` | `NoPredictions``Predictions``NoCheck` | | +| `criterion` | `Confidence``Support``RuleSupport``Lift``Deployability` | | +| `enable_sql_generation` | `udf``native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/292d19849e8fbe48869f5e3a50439964563a90d1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/292d19849e8fbe48869f5e3a50439964563a90d1.md new file mode 100644 index 0000000..875869e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/292d19849e8fbe48869f5e3a50439964563a90d1.md @@ -0,0 +1,168 @@ +# Quick start: Analyze data in a Jupyter notebook + +# Quick start: Analyze data in a Jupyter notebook # + +You can create a notebook in which you run code to prepare, visualize, and analyze data, or build and train a model\. Read about Jupyter notebooks, then watch a video and take a tutorial that’s suitable for users with some knowledge of Python code\. + +Your basic workflow includes these tasks: + + + +1. Open your sandbox project\. Projects are where you can collaborate with others to work with data\. +2. Add your data to the project\. You can add CSV files or data from a remote data source through a connection\. +3. Create a notebook in the project\. +4. Add code to the notebook to load and analyze your data\. +5. Run your notebook and share the results with your colleagues\. + + + +## Read about notebooks ## + +A Jupyter notebook is a web\-based environment for interactive computing\. You can run small pieces of code that process your data, and you can immediately view the results of your computation\. Notebooks include all of the building blocks you need to work with data: + + + + * The data + * The code computations that process the data + * Visualizations of the results + * Text and rich media to enhance understanding + + + +[Read more about notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-editor.html) + +## Watch a video about notebooks ## + +![Watch Video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) Watch this video to learn the basics of Jupyter notebooks\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Try a tutorial to create a notebook ## + +In this tutorial, you will complete these tasks: + + + + * [Task 1: Open a project\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html?context=cdpaas&locale=en#step01) + * [Task 2: Add a notebook to your project\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html?context=cdpaas&locale=en#step02) + * [Task 3: Load a file and save the notebook\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html?context=cdpaas&locale=en#step03) + * [Task 4: Find and edit the notebook\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html?context=cdpaas&locale=en#step04) + * [Task 5: Share read\-only version of the notebook\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html?context=cdpaas&locale=en#step05) + * [Task 6: Schedule a notebook to run at a different time\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html?context=cdpaas&locale=en#step06) + + + +This tutorial will take approximately 15 minutes to complete\. + +Expand all sections + + + + * Tips for completing this tutorial + + \#\#\# Use the video picture-in-picture Tip: Start the video, then as you scroll through the tutorial, the video moves to picture-in-picture mode. Close the video table of contents for the best experience with picture-in-picture. You can use picture-in-picture mode so you can follow the video as you complete the tasks in this tutorial. Click the timestamps for each task to follow along.The following animated image shows how to use the video picture-in-picture and table of contents features: ![How to use picture-in-picture and chapters](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/pip-and-chapters.gif)\{: width="560px" height="315px" data-tearsheet="this"\} \#\#\# Get help in the community If you need help with this tutorial, you can ask a question or find an answer in the [Cloud Pak for Data Community discussion forum](https://community.ibm.com/community/user/cloudpakfordata/communities/community-home/digestviewer?communitykey=c0c16ff2-10ef-4b50-ae4c-57d769937235)\{: new\_window\}. \#\#\# Set up your browser windows For the optimal experience completing this tutorial, open Cloud Pak for Data in one browser window, and keep this tutorial page open in another browser window to switch easily between the two applications. Consider arranging the two browser windows side-by-side to make it easier to follow along. ![Side-by-side tutorial and UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/tutorial-side-by-side.png)\{: width="560px" height="315px" data-tearsheet="this"\} Tip: If you encounter a guided tour while completing this tutorial in the user interface, click **Maybe later**. + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 1: Open a project + + You need a project to store the notebook and data asset. You can use your sandbox project or create a project. Follow these steps to open a project and add a data asset to the project: 1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg)\{: iih\}, choose **Projects > View all projects** 1. Open your sandbox project. If you want to use a new project: 1. Click **New project**. 1. Select **Create an empty project**. 1. Enter a name and optional description for the project. 1. Choose an existing [object storage service instance](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/storage-options.html)\{: new\_window\} or create a new one. 1. Click **Create**. 1. From the navigation menu, click **Samples**. 1. Search for an interesting data set, and select the data set. 1. Click **Add to project**. 1. Select the project from the list, and click **Add**. 1. After the data set is added, click **View Project**. 1. In the project, click the **Assets** tab to see the data set. For more information, see [Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html)\{: new\_window\}. + \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the Assets tab in the project. + + ![The following image shows the Assets tab in the project.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/gs-notebook-assets-tab-01.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 2: Add a notebook to your project + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:06. Follow these steps to create a new notebook in your project. 1. In your project, on the *Assets* tab, click **New asset > Work with data and models in Python or R notebooks**. 1. Type a name and description (optional). 1. Select a runtime environment for this notebook. 1. Click **Create**. Wait for the notebook editor to load. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows blank notebook. + + ![The following image shows the blank notebook.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/gs-notebook-editor.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 3: Load a file and save the notebook + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:23. Now you can access the data asset in your notebook that you uploaded to your project earlier. Follow these steps to load data into a data frame: 1. Click in an empty code cell in your notebook. 1. Click the **Code snippets** icon ( ![the Code snippets icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/code-snippets-icon.png)\{: iih\}). 1. In the side pane, click **Read data**. 1. Click **Select data from project**. 1. Locate the data asset from the project, and click **Select**. 1. In the *Load as* drop-down list, select the load option that you prefer. 1. Click **Insert code to cell**. The code to read and load the data asset is inserted into the cell. 1. Click **Run** to run your code. The first few rows of your data set will display. 1. To save a version of your notebook, click **File > Save Version**. You can also just save your notebook with **File > Save**. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the notebook with the pandas DataFrame. + + ![The following image shows the notebook with the pandas DataFrame.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/gs-notebook-cell01.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 4: Find and edit the notebook + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 01:19. Follow these steps to locate the saved notebook on the Assets tab, and edit the notebook: 1. In the project navigation trail, click your project name to return to your project. 1. Click the **Assets** tab to find the notebook. 1. When you click the notebook, it will open in `READ ONLY` mode. 1. To edit the notebook, click the **pencil** icon ![Pencil icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/edit.svg)\{: iih\}. 1. Click the **Information** icon ![Information icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/information.svg)\{: iih\} to open the *Information* panel. 1. On the *General* tab, edit the name and description of the notebook. 1. Click the **Environment** tab to see how you can change the environment used to run the notebook or update the runtime status to either stop and restart. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the notebook with the Information panel displayed. + + ![The following image shows the notebook with the Information panel displayed.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/gs-notebook-environment.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 5: Share read\-only version of the notebook + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 01:52. Follow these steps to create a link to the notebook to share with colleagues: 1. Click the **Share** icon ![Share icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/share.svg)\{: iih\} if you would like to share the read-only view of the notebook. 1. Click to turn on the **Share with anyone who has the link** toggle button. 1. Select what content you would like to share through a link or social media. 1. Click the **Copy** icon ![Copy icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/copy.svg)\{: iih\} to copy a direct link to this notebook. 1. Click **Close**. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the Share dialog box. + + ![The following image shows the Share dialog box.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/gs-notebook-share.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 6: Schedule a notebook to run at a different time + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 02:08. Follow these steps to create a job to schedule the notebook to run at a specific time or repeat based on a schedule: 1. Click the **Jobs** icon, and select **Create a job**. + ![Create a job](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/gs-notebook-create-job.png) 1. Provide the name and description of the job, and click **Next**. 1. Select the notebook version and environment runtime, and click **Next**. 1. (Optional) Click the toggle button to schedule a run. Specify the date, time and if you would like the job to repeat, and click **Next**. 1. (Optional) click the toggle button to receive notifications for this job, and click **Next**. 1. Review the details, and click either **Create** (to create the job, but not run the job immediately) or **Create and run** (to run the job immediately). 1. The job will display in the **Jobs** tab in the project. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the Jobs tab. + + ![The following image shows the Jobs tab.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/gs-notebook-job.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html?context=cdpaas&locale=en#video-preview) + + + +## Next steps ## + +Now you can use this data set for further analysis\. For example, you or other users can do any of these tasks: + + + + * [Cleansing and shaping data](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html) + * [Build and train a model with the data asset](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html) + + + +## Additional resources ## + + + + * View more [videos](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html)\. + * Find sample data sets, projects, models, prompts, and notebooks in the Samples to gain hands\-on experience: + + ![Notebook icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook.svg)[Notebooks](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=notebook) that you can add to your project to get started analyzing data and building models. + + ![Project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/ibm-cloud--projects.svg)[Projects](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=project-template) that you can import containing notebooks, data sets, prompts, and other assets. + + ![Data set icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/data--set.svg)[Data sets](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=dataset) that you can add to your project to refine, analyze, and build models. + + ![Prompt icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/prompt.svg)[Prompts](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=example-prompt) that you can use in the Prompt Lab to prompt a foundation model. + + ![Model icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/model.svg)[Foundation models](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=foundation-model) that you can use in the Prompt Lab. + + + +**Parent topic:**[Quick start tutorials](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2939716bfa6089c8b6373ed7c6397af71389a5c8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2939716bfa6089c8b6373ed7c6397af71389a5c8.md new file mode 100644 index 0000000..0ea8bc1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2939716bfa6089c8b6373ed7c6397af71389a5c8.md @@ -0,0 +1,19 @@ +# applykohonennode properties + +# applykohonennode properties # + +You can use Kohonen modeling nodes to generate a Kohonen model nugget\. The scripting name of this model nugget is *applykohonennode*\. For more information on scripting the modeling node itself, see [c50node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/c50nodeslots.html#c50nodeslots)\. + + + +applykohonennode properties + +Table 1\. applykohonennode properties + +| `applykohonennode` Properties | Values | Property description | +| ----------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `enable_sql_generation` | `false``true``native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/299cee894dff422aac8bf49b53cac700de1b172d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/299cee894dff422aac8bf49b53cac700de1b172d.md new file mode 100644 index 0000000..0cbf875 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/299cee894dff422aac8bf49b53cac700de1b172d.md @@ -0,0 +1,33 @@ +# Global functions (SPSS Modeler) + +# Global functions # + +The functions `@MEAN`, `@SUM`, `@MIN`, `@MAX`, and `@SDEV` work on, at most, all of the records read up to and including the current one\. In some cases, however, it is useful to be able to work out how values in the current record compare with values seen in the entire data set\. Using a Set Globals node to generate values across the entire data set, you can access these values in a CLEM expression using the global functions\. + +For example, + + @GLOBAL_MAX(Age) + +returns the highest value of `Age` in the data set, while the expression + + (Value - @GLOBAL_MEAN(Value)) / @GLOBAL_SDEV(Value) + +expresses the difference between this record's `Value` and the global mean as a number of standard deviations\. You can use global values only after they have been calculated by a Set Globals node\. + + + +CLEM global functions + +Table 1\. CLEM global functions + +| Function | Result | Description | +| --------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `@GLOBAL_MAX(FIELD)` | *Number* | Returns the maximum value for *FIELD* over the whole data set, as previously generated by a Set Globals node\. *FIELD* must be the name of a numeric, date/time/datetime, or string field\. If the corresponding global value has not been set, an error occurs\. | +| `@GLOBAL_MIN(FIELD)` | *Number* | Returns the minimum value for *FIELD* over the whole data set, as previously generated by a Set Globals node\. *FIELD* must be the name of a numeric, date/time/datetime, or string field\. If the corresponding global value has not been set, an error occurs\. | +| `@GLOBAL_SDEV(FIELD)` | *Number* | Returns the standard deviation of values for *FIELD* over the whole data set, as previously generated by a Set Globals node\. *FIELD* must be the name of a numeric field\. If the corresponding global value has not been set, an error occurs\. | +| `@GLOBAL_MEAN(FIELD)` | *Number* | Returns the mean average of values for *FIELD* over the whole data set, as previously generated by a Set Globals node\. *FIELD* must be the name of a numeric field\. If the corresponding global value has not been set, an error occurs\. | +| `@GLOBAL_SUM(FIELD)` | *Number* | Returns the sum of values for *FIELD* over the whole data set, as previously generated by a Set Globals node\. *FIELD* must be the name of a numeric field\. If the corresponding global value has not been set, an error occurs\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/29a9834843b2d6e7417c09a5385b83bcb13d814c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/29a9834843b2d6e7417c09a5385b83bcb13d814c.md new file mode 100644 index 0000000..dbc4c0b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/29a9834843b2d6e7417c09a5385b83bcb13d814c.md @@ -0,0 +1,185 @@ +# Managing outdated software specifications or frameworks + +# Managing outdated software specifications or frameworks # + +Use these guidelines when you are updating assets that refer to outdated software specifications or frameworks\. + +In some cases, asset update is seamless\. In other cases, you must retrain or redeploy the assets\. For general guidelines, refer to [Migrating assets that refer to discontinued software specifications](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html?context=cdpaas&locale=en#discont-soft-spec) or [Migrating assets that refer to discontinued framework versions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html?context=cdpaas&locale=en#discont-framewrk)\. + +For more information, see the following sections: + + + + * [Updating software specifications](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html?context=cdpaas&locale=en#update-soft-specs) + * [Updating a machine learning model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html?context=cdpaas&locale=en#upgrade-model) + * [Updating a Python function](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html?context=cdpaas&locale=en#upgr-function) + * [Retraining an SPSS Modeler flow](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html?context=cdpaas&locale=en#retrain-spss) + + + +## Managing assets that refer to discontinued software specifications ## + + + + * During migration, assets that refer to the discontinued software specification are mapped to a comparable\-supported default software specification (only in cases where the model type is still supported)\. + * When you create new deployments of the migrated assets, the updated software specification in the asset metadata is used\. + * Existing deployments of the migrated assets are updated to use the new software specification\. If deployment or scoring fails due to framework or library version incompatibilities, follow the instructions in [Updating software specifications](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html?context=cdpaas&locale=en#update-soft-specs)\. If the problem persists, follow the steps that are listed in [Updating a machine learning model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html?context=cdpaas&locale=en#upgrade-model)\. + + + +## Migrating assets that refer to discontinued framework versions ## + + + + * During migration, model types are not be updated\. You must manually update this data\. For more information, see [Updating a machine learning model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html?context=cdpaas&locale=en#upgrade-model)\. + * After migration, the existing deployments are removed and new deployments for the deprecated framework are not allowed\. + + + +## Updating software specifications ## + +You can update software specifications from the UI or by using the API\. For more information, see the following sections: + + + + * [Updating software specifications from the UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html?context=cdpaas&locale=en#update-soft-specs-ui) + * [Updating software specifications by using the API](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html?context=cdpaas&locale=en#update-soft-specs-api) + + + +### Updating software specifications from the UI ### + + + +1. From the deployment space, click the model (make sure it does not have any active deployments\.) +2. Click the `i` symbol to check model details\. +3. Use the dropdown list to update the software specification\. + + + +Refer to the example image: + +![Updating software specifications through the UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/update-software-spec-via-ui.png) + +### Updating software specifications by using the API ### + +You can update a software specification by using the API Patch command: + +For `software_spec` field, type `/software_spec`\. For `value` field, use either the ID or the name of the new software specification\. + +Refer to this example: + + curl -X PATCH '/ml/v4/models/6f01d512-fe0f-41cd-9a52-1e200c525c84?space_id=f2ddb8ce-7b10-4846-9ab0-62454a449802&project_id=&version=' \n--data-raw '[ + { + "op":"replace", + "path":"/software_spec", + "value":{ + "id":"6f01d512-fe0f-41cd-9a52-1e200c525c84" // or "name":"tensorflow_rt22.1-py3.9" + } + } + ]' + +For more information, see [Updating an asset by using the Patch API command](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-update.html#update-asset-api)\. + +## Updating a machine learning model ## + +Follow these steps to update a model built with a deprecated framework\. + +### Option 1: Save the model with a compatible framework ### + + + +1. Download the model by using either the Watson Machine Learning [REST API](https://cloud.ibm.com/apidocs/machine-learning) or the Watson Machine Learning [Python client library](https://ibm.github.io/watson-machine-learning-sdk/)\. + + The following example shows how to download your model: + + client.repository.download(, filename="xyz.tar.gz") +2. Edit model metadata with the model type and version that is supported in the current release\. For more information, see [Software specifications and hardware specifications for deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/pm_service_supported_frameworks.html)\. + + The following example shows how to edit model metadata: + + model_metadata = { + client.repository.ModelMetaNames.NAME: "example model", + client.repository.ModelMetaNames.DESCRIPTION: "example description", + client.repository.ModelMetaNames.TYPE: "", + client.repository.ModelMetaNames.SOFTWARE_SPEC_UID: + client.software_specifications.get_uid_by_name("") + } +3. Save the model to the Watson Machine Learning repository\. The following example shows how to save the model to the repository: + + model_details = client.repository.store_model(model="xyz.tar.gz", meta_props=model_metadata) +4. Deploy the model\. +5. Score the model to generate predictions\. + + + +If deployment or scoring fails, the model is not compatible with the new version that was used for saving the model\. In this case, use [Option 2](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html?context=cdpaas&locale=en#retrain-option2)\. + +### Option 2: Retrain the model with a compatible framework ### + + + +1. Retrain the model with a model type and version that is supported in the current version\. +2. Save the model with the supported model type and version\. +3. Deploy and score the model\. + + + +It is also possible to update a model by using the API\. For more information, see [Updating an asset by using the Patch API command](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-update.html#update-asset-api)\. + +## Updating a Python function ## + +Follow these steps to update a Python function built with a deprecated framework\. + +### Option 1: Save the Python function with a compatible runtime or software specification ### + + + +1. Download the Python function by using either the Watson Machine Learning [REST API](https://cloud.ibm.com/apidocs/machine-learning) or the Watson Machine Learning [Python client library](https://ibm.github.io/watson-machine-learning-sdk/)\. +2. Save the Python function with a supported runtime or software specification version\. For more information, see [Software specifications and hardware specifications for deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/pm_service_supported_frameworks.html)\. +3. Deploy the Python function\. +4. Score the Python function to generate predictions\. + + + +If your Python function fails during scoring, the function is not compatible with the new runtime or software specification version that was used for saving the Python function\. In this case, use [Option 2](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html?context=cdpaas&locale=en#modify-option2)\. + +### Option 2: Modify the function code and save it with a compatible runtime or software specification ### + + + +1. Modify the Python function code to make it compatible with the new runtime or software specification version\. In some cases, you must update dependent libraries that are installed within the Python function code\. +2. Save the Python function with the new runtime or software specification version\. +3. Deploy and score the Python function\. + + + +It is also possible to update a function by using the API\. For more information, see [Updating an asset by using the Patch API command](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-update.html#update-asset-api)\. + +## Retraining an SPSS Modeler flow ## + +Some models that were built with SPSS Modeler in IBM Watson Studio Cloud before 1 September 2020 can no longer be deployed by using Watson Machine Learning\. This problem is caused by an upgrade of the Python version in supported SPSS Modeler runtimes\. If you're using one of the following six nodes in your SPSS Modeler flow, you must rebuild and redeploy your models with SPSS Modeler and Watson Machine Learning: + + + + * XGBoost Tree + * XGBoost Linear + * One\-Class SVM + * HDBSCAN + * KDE Modeling + * Gaussian Mixture + + + +To retrain your SPSS Modeler flow, follow these steps: + + + + * If you're using the Watson Studio user interface, open the SPSS Modeler flow in Watson Studio, retrain, and save the model to Watson Machine Learning\. After you save the model to the project, you can promote it to a deployment space and create a new deployment\. + * If you're using [REST API](https://cloud.ibm.com/apidocs/machine-learning) or [Python client](https://ibm.github.io/watson-machine-learning-sdk/), retrain the model by using SPSS Modeler and save the model to the Watson Machine Learning repository with the model type `spss-modeler-18.2`\. + + + +**Parent topic:**[Frameworks and software specifications](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-frame-and-specs.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/29af55b95d387be39d4e9d328936b95cad5beb67.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/29af55b95d387be39d4e9d328936b95cad5beb67.md new file mode 100644 index 0000000..502f7be --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/29af55b95d387be39d4e9d328936b95cad5beb67.md @@ -0,0 +1,7 @@ +# applysequencenode properties + +# applysequencenode properties # + +You can use Sequence modeling nodes to generate a Sequence model nugget\. The scripting name of this model nugget is *applysequencenode*\. No other properties exist for this model nugget\. For more information on scripting the modeling node itself, see [sequencenode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/sequencenodeslots.html#sequencenodeslots)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/29dcfc3fb6ee0ccba63e0ff3a797936da9e0c874.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/29dcfc3fb6ee0ccba63e0ff3a797936da9e0c874.md new file mode 100644 index 0000000..5730bc9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/29dcfc3fb6ee0ccba63e0ff3a797936da9e0c874.md @@ -0,0 +1,18 @@ +# Properties reference overview + +# Properties reference overview # + +You can specify a number of different properties for nodes, flows, projects, and SuperNodes\. Some properties are common to all nodes, such as name, annotation, and ToolTip, while others are specific to certain types of nodes\. Other properties refer to high\-level flow operations, such as caching or SuperNode behavior\. Properties can be accessed through the standard user interface (for example, when you open the properties for a node) and can also be used in a number of other ways\. + + + + * Properties can be modified through scripts, as described in this section\. For more information, see [Syntax for properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/slot_parameter_syntax.html)\. + * Node properties can be used in SuperNode parameters\. + + + +In the context of scripting within SPSS Modeler, node and flow properties are often called slot parameters\. In this documentation, they are referred to as node properties or flow properties\. + +For more information about the scripting language, see [The scripting language](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_language_overview.html)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/29deec30687f805460a83dd924d2f119274d25f8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/29deec30687f805460a83dd924d2f119274d25f8.md new file mode 100644 index 0000000..79c145f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/29deec30687f805460a83dd924d2f119274d25f8.md @@ -0,0 +1,22 @@ +# Probability functions (SPSS Modeler) + +# Probability functions # + +Probability functions return probabilities based on various distributions, such as the probability that a value from Student's *t* distribution will be less than a specific value\. + + + +CLEM probability functions + +Table 1\. CLEM probability functions + +| Function | Result | Description | +| ------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `cdf_chisq(NUM, DF)` | *Real* | Returns the probability that a value from the chi\-square distribution with the specified degrees of freedom will be less than the specified number\. | +| `cdf_f(NUM, DF1, DF2)` | *Real* | Returns the probability that a value from the *F* distribution, with degrees of freedom *DF1* and *DF2*, will be less than the specified number\. | +| `cdf_normal(NUM, MEAN, STDDEV)` | *Real* | Returns the probability that a value from the normal distribution with the specified mean and standard deviation will be less than the specified number\. | +| `cdf_t(NUM, DF)` | *Real* | Returns the probability that a value from Student's *t* distribution with the specified degrees of freedom will be less than the specified number\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2a3f647a7f4eb8fb4270d4e78245f18bfde29ad8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2a3f647a7f4eb8fb4270d4e78245f18bfde29ad8.md new file mode 100644 index 0000000..4b10b48 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2a3f647a7f4eb8fb4270d4e78245f18bfde29ad8.md @@ -0,0 +1,70 @@ +# Sharing notebooks with a URL + +# Sharing notebooks with a URL # + +You can create a URL to share the last saved version of a notebook on social media or with people outside of Watson Studio\. The URL shows a read\-only view of the notebook\. Anyone who has the URL can view or download the notebook\. + +**Required permissions:** + +You must have the **Admin** or **Editor** role in the project to share a notebook URL\. The shared notebook shows the author of the shared version and when the notebook version was last updated\. + +## Sharing a notebook URL ## + +To share a notebook URL: + + + +1. Open the notebook in edit mode\. +2. If necessary, add code to [hide sensitive code cells](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/hide_code.html)\. +3. Create a saved version of the notebook by clicking **File > Save Version**\. +4. Click the **Share** icon (![Share icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/share_icon.png)) from the notebook action bar\. + + ![Share notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/share_notebook.png) +5. Select to share the link\. +6. Choose a sharing option: + + + + * Choose **Only text and output** to hide all code cells. + * Choose **All content excluding sensitive code cells** to hide code cells that you marked as sensitive. + * Choose **All content, including code** to show everything, even code cells that you marked as sensitive. Make sure that you remove your credential and other sensitive information before you choose this option and every time before you save a new version of the notebook. + + + +7. Copy the link or choose a social media site on which to share the URL\. + + + +Note: The URL remains valid while the project and notebook exist and while the notebook is shared\. If you [unshare the notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/share-notebooks.html?context=cdpaas&locale=en#unsharing), the URL becomes invalid\. When you unshare, and then re\-share the notebook, the URL will be the same again\. + +## Updating a shared notebook ## + +To update a shared notebook: + + + +1. Open the notebook in edit mode\. +2. Make changes to the notebook\. +3. Create a new version of the notebook by clicking **File > Save Version**\. + + + +Note: Clicking File > Save saves your changes but it doesn't create a new version of the notebook; the shared URL still points to the older version of the notebook\. + +## Unsharing a notebook URL ## + +To unshare a notebook URL: + + + +1. Open the notebook in edit mode\. +2. Click the **Share** icon (![Share icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/share_icon.png)) from the notebook action bar\. + + ![Share notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/share_notebook.png) +3. Unselect the **Share with anyone who has the link** toggle\. + + + +**Parent topic:**[Managing the lifecycle of notebooks and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-nb-lifecycle.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2a95f85cd3f7250fcba52d8fdd82d1502fc617d6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2a95f85cd3f7250fcba52d8fdd82d1502fc617d6.md new file mode 100644 index 0000000..2f6caff --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2a95f85cd3f7250fcba52d8fdd82d1502fc617d6.md @@ -0,0 +1,122 @@ +# IBM Db2 for i connection + +# IBM Db2 for i connection # + +To access your data in IBM Db2 for i, create a connection asset for it\. + +Db2 for i is the relational database manager that is fully integrated on your system\. Because it is integrated on the system, Db2 for i is easy to use and manage\. + +## Supported versions ## + +IBM DB2 for i 7\.2\+ + +## Prerequisites ## + +### Obtain the certificate file ### + +A certificate file on the Db2 for i server is required to use this connection\. To obtain an IBM Db2 Connect Unlimited Edition license certificate file, go to [IBM Db2 Connect: Pricing](https://www.ibm.com/products/db2-connect/pricing) and [Installing the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/com.ibm.db2.luw.apdv.gs.doc/doc/t0010264.html)\. For installation instructions, see [Activating the license certificate file for Db2 Connect Unlimited Edition](https://www.ibm.com/docs/SSEPGG_11.5.0/com.ibm.db2.luw.licensing.doc/doc/t0057375.html)\. + +### Run the bind command ### + +Run the following commands from the Db2 client that is configured to access the Db2 for i server\. +You need to run the bind command only once per remote database per Db2 client version\. + + db2 connect to DBALIAS user USERID using PASSWORD + db2 bind path@ddcs400.lst blocking all sqlerror continue messages ddcs400.msg grant public + db2 connect reset + +For information about bind commands, see [Binding applications and utilities](https://www.ibm.com/docs/SSEPGG_11.5.0/com.ibm.db2.luw.qb.dbconn.doc/doc/c0005595.html)\. + +### Run catalog commands ### + +Run the following catalog commands from the Db2 client that is configured to access the Db2 for i server: + + + +1. db2 catalog tcpip node node_name remote hostname_or_address server port_no_or_service_name + + Example: + `db2 catalog tcpip node db2i123 remote 192.0.2.0 server 446` + +2. db2 catalog dcs database local_name as real_db_name + + Example: + `db2 catalog dcs database db2i123 as db2i123` + +3. db2 catalog database local_name as alias at node node_name authentication server + + Example: + `db2 catalog database db2i123 as db2i123 at node db2i123 authentication server` + + + +For information about catalog commands, see [CATALOG TCPIP NODE](https://www.ibm.com/docs/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001944.html) and [CATALOG DCS DATABASE](https://www.ibm.com/docs/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001937.html)\. + +## Create a connection to Db2 for i ## + +To create the connection asset, you need these connection details: + + + + * Hostname or IP address + * Port number + * Location: The unique name of the Db2 location you want to access + * Username and password + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Db2 for i connections in the following workspaces and tools: + +**Projects** + + + + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Restriction ## + +For SPSS Modeler, you can use this connection only to import data\. You cannot export data to this connection or to a Db2 for i connection connected data asset\. + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [ Db2 for i SQL reference](https://www.ibm.com/docs/ssw_ibm_i_72/db2/rbafzintro.htm) for the correct syntax\. + +## Learn more ## + +[IBM Db2 for i documentation](https://www.ibm.com/docs/i) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2aec614e6cbe5d4963d53dec7e22877d5a1bede8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2aec614e6cbe5d4963d53dec7e22877d5a1bede8.md new file mode 100644 index 0000000..c253452 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2aec614e6cbe5d4963d53dec7e22877d5a1bede8.md @@ -0,0 +1,9 @@ +# Graph nodes (SPSS Modeler) + +# Graphs # + +Several phases of the data mining process use graphs and charts to explore data brought in to watsonx\.ai\. + +For example, you can connect a Plot or Distribution node to a data source to gain insight into data types and distributions\. You can then perform record and field manipulations to prepare the data for downstream modeling operations\. Another common use of graphs is to check the distribution and relationships between newly derived fields\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b2899a3878e20a4b73b0f11cfc4fd815a81e13f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b2899a3878e20a4b73b0f11cfc4fd815a81e13f.md new file mode 100644 index 0000000..a92b6e3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b2899a3878e20a4b73b0f11cfc4fd815a81e13f.md @@ -0,0 +1,23 @@ +# applyquestnode properties + +# applyquestnode properties # + +You can use QUEST modeling nodes can be used to generate a QUEST model nugget\. The scripting name of this model nugget is *applyquestnode*\. For more information on scripting the modeling node itself, see [questnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/questnodeslots.html)\. + + + +applyquestnode properties + +Table 1\. applyquestnode properties + +| `applyquestnode` Properties | Values | Property description | +| --------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `sql_generate` | `Never`
`NoMissingValues`
`MissingValues`
`native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | +| `calculate_conf` | *flag* | | +| `display_rule_id` | *flag* | Adds a field in the scoring output that indicates the ID for the terminal node to which each record is assigned\. | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b4d4ca6a91c05d12f5c7942e73abae74bf08472.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b4d4ca6a91c05d12f5c7942e73abae74bf08472.md new file mode 100644 index 0000000..f7fc51c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b4d4ca6a91c05d12f5c7942e73abae74bf08472.md @@ -0,0 +1,34 @@ +# slrmnode properties + +# slrmnode properties # + +![SLRM ode icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/selflearn_icon.png)The Self\-Learning Response Model (SLRM) node enables you to build a model in which a single new case, or small number of new cases, can be used to reestimate the model without having to retrain the model using all data\. + + + +slrmnode properties + +Table 1\. slrmnode properties + +| `slrmnode` Properties | Values | Property description | +| ---------------------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `target` | *field* | The target field must be a nominal or flag field\. A frequency field can also be specified\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `target_response` | *field* | Type must be flag\. | +| `continue_training_existing_model` | *flag* | | +| `target_field_values` | *flag* | Use all: Use all values from source\. Specify: Select values required\. | +| `target_field_values_specify` | *\[field1 \.\.\. fieldN\]* | | +| `include_model_assessment` | *flag* | | +| `model_assessment_random_seed` | *number* | Must be a real number\. | +| `model_assessment_sample_size` | *number* | Must be a real number\. | +| `model_assessment_iterations` | *number* | Number of iterations\. | +| `display_model_evaluation` | *flag* | | +| `max_predictions` | *number* | | +| `randomization` | *number* | | +| `scoring_random_seed` | *number* | | +| `sort` | `Ascending``Descending` | Specifies whether the offers with the highest or lowest scores will be displayed first\. | +| `model_reliability` | *flag* | | +| `calculate_variable_importance` | *flag* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b5427922d2d03f0fddfe73bbde7e8b8dcda6a60.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b5427922d2d03f0fddfe73bbde7e8b8dcda6a60.md new file mode 100644 index 0000000..fe6c191 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b5427922d2d03f0fddfe73bbde7e8b8dcda6a60.md @@ -0,0 +1,102 @@ +# IBM Netezza Performance Server connection + +# IBM Netezza Performance Server connection # + +To access your data in IBM Netezza Performance Server, you must create a connection asset for it\. + +Netezza Performance Server is a platform for high\-performance data warehousing and analytics\. + +## Supported versions ## + + + + * IBM Netezza Performance Server 11\.x + * IBM Netezza appliance software 7\.0\.x, 7\.1\.x, 7\.2\.x + + + +## Create a connection to Netezza Performance Server ## + +To create the connection asset, you need the following connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Username and password + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Netezza Performance Server connections in the following workspaces and tools: + +**Projects** + + + + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Netezza Performance Server setup ## + + + + * [Netezza Performance Server Getting started](https://www.ibm.com/docs/SSTNZ3/get-started/get_strt.html) + * [PureData System for Analytics Initial system setup](https://www.ibm.com/docs/psfa/7.2.1?topic=overview-initial-system-setup-information) + + + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the product documentation: + + + + * [Netezza Performance Server SQL command reference](https://www.ibm.com/docs/SSTNZ3/nps-cpds-20X/dbuser/r_dbuser_ntz_sql_command_reference.html) + * [PureData System for Analytics IBM Netezza SQL Extensions toolkit](https://www.ibm.com/docs/en/psfa/7.2.1?topic=netezza-sql-extensions-toolkit) + + + +## Learn more ## + + + + * [IBM Netezza Performance Server documentation](https://www.ibm.com/docs/netezza) + * [IBM PureData System for Analytics documentation](https://www.ibm.com/docs/psfa) + + + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b67d1eb41065cf9da0eb68d429b69803d49eaa1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b67d1eb41065cf9da0eb68d429b69803d49eaa1.md new file mode 100644 index 0000000..9d7cb45 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b67d1eb41065cf9da0eb68d429b69803d49eaa1.md @@ -0,0 +1,7 @@ +# Reference information + +# Reference information # + +This section provides reference information about various topics\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b6dc49f4afde44dd385ae09caab02a3f1db4259.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b6dc49f4afde44dd385ae09caab02a3f1db4259.md new file mode 100644 index 0000000..5e4348c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2b6dc49f4afde44dd385ae09caab02a3f1db4259.md @@ -0,0 +1,36 @@ +# Choosing compute resources for running tools in projects + +# Choosing compute resources for running tools in projects # + +You use compute resources in projects when you run jobs and most tools\. Depending on the tool, you might have a choice of compute resources for the runtime for the tool\. + +Compute resources are known as either environment templates or hardware and software specifications\. In general, compute resources with larger hardware configurations incur larger usage costs\. + +These tools have multiple choices for configuring runtimes that you can choose from: + + + + * [Notebook editor](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html) + * [Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spark-dr-envs.html) + * [SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spss-envs.html) + * [AutoAI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-autoai.html) + * [Decision Optimization experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-decisionopt.html) + * [RStudio IDE](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-envs.html) + * [Synthetic Data Generator](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/synthetic-envs.html) + * [Tuning Studio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-fm-tuning.html) + + + +Prompt Lab does not consume compute resources\. Prompt Lab usage is measured by the number of processed tokens\. + +## Learn more ## + + + + * [Monitoring account resource usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html) + + + +**Parent topic:**[Projects ](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2baf01b064f3005647a010df369cc49c6534ffb3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2baf01b064f3005647a010df369cc49c6534ffb3.md new file mode 100644 index 0000000..ad53653 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2baf01b064f3005647a010df369cc49c6534ffb3.md @@ -0,0 +1,27 @@ +# {{ document.title.text }} + +# Personal information in output # + +![icon for privacy risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-privacy.svg)Risks associated with outputPrivacyNew + +### Description ### + +When personal identifiable information (PII) or sensitive personal information (SPI) are used in the training data, fine\-tuning data, or as part of the prompt, models might reveal that data in the generated output\. + +### Why is personal information in output a concern for foundation models? ### + +Output data must be reviewed with respect to privacy laws and regulations, as business entities could face fines, reputational harms, and other legal consequences if found in violation of data privacy or usage laws\. + +Example + +#### Exposure of personal information #### + +Per the source article, ChatGPT suffered a bug and exposed titles and active users' chat history to other users\. Later, OpenAI shared that even more private data from a small number of users was exposed including, active user’s first and last name, email address, payment address, the last four digits of their credit card number, and credit card expiration date\. In addition, it was reported that the payment\-related information of 1\.2% of ChatGPT Plus subscribers were also exposed in the outage\. + +Sources: + +[The Hindu Business Line, March 2023](https://www.thehindubusinessline.com/info-tech/openai-admits-data-breach-at-chatgpt-private-data-of-premium-users-exposed/article66659944.ece) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2bb452b4c9e3458bc02a9d392961e9c643e402de.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2bb452b4c9e3458bc02a9d392961e9c643e402de.md new file mode 100644 index 0000000..df55a87 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2bb452b4c9e3458bc02a9d392961e9c643e402de.md @@ -0,0 +1,227 @@ +# Feature differences between watsonx deployments + +# Feature differences between watsonx deployments # + +IBM watsonx as a Service and watsonx on Cloud Pak for Data software have some differences in features and implementation\. IBM watsonx as a Service is a set of IBM Cloud services\. Watsonx services on Cloud Pak for Data 4\.8 are offered as software that you must install and maintain\. Services that are available on both deployments also have differences in features on IBM watsonx as a Service compared to watsonx software on Cloud Pak for Data 4\.8\. + + + + * [Platform differences](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/feature-matrix.html?context=cdpaas&locale=en#platform) + * [Common features across services](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/feature-matrix.html?context=cdpaas&locale=en#common) + * [Watson Studio](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/feature-matrix.html?context=cdpaas&locale=en#ws) + * [Watson Machine Learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/feature-matrix.html?context=cdpaas&locale=en#wml) + * [Watson OpenScale](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/feature-matrix.html?context=cdpaas&locale=en#wos) + + + +## Platform differences ## + +IBM watsonx as a Service and watsonx software on Cloud Pak for Data share a common code base, however, they differ in the following key ways: + + + +Platform differences + +| Features | As a service | Software | +| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Software, hardware, and installation | IBM watsonx is fully managed by IBM on IBM Cloud\. Software updates are automatic\. Scaling of compute resources and storage is automatic\. You sign up at [https://dataplatform\.cloud\.ibm\.com](https://dataplatform.cloud.ibm.com)\. | You provide and maintain hardware\. You install, maintain, and upgrade the software\. See [Software requirements](https://www.ibm.com/docs/SSQNUZ_4.8.x/sys-reqs/software-reqs.html)\. | +| Storage | You provision a IBM Cloud Object Storage service instance to provide storage\. See [IBM Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/cloud-object-storage.html)\. | You provide persistent storage on a Red Hat OpenShift cluster\. See [Storage requirements](https://www.ibm.com/docs/SSQNUZ_4.8.x/sys-reqs/storage-requirements.html)\. | +| Compute resources for running workloads | Users choose the appropriate runtime for their jobs\. Compute usage is billed based on the rate for the runtime environment and the duration of the job\. See [Monitor account resource usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html)\. | You set up the number of Red Hat OpenShift nodes with the appropriate number of vCPUs\. See [Hardware requirements](https://www.ibm.com/docs/SSQNUZ_4.8.x/sys-reqs/hardware-reqs.html) and [Monitoring the platform](https://www.ibm.com/docs/SSQNUZ_4.8.x/cpd/admin/platform-management.html)\. | +| Cost | You buy each service that you need at the appropriate plan level\. Many services bill for compute and other resource consumption\. See each service page in the [IBM Cloud catalog](https://cloud.ibm.com/catalog) or in the services catalog on IBM watsonx, by selecting **Administration > Services > Services catalog** from the navigation menu\. | You buy a software license based on the services that you need\. See [Cloud Pak for Data](https://cloud.ibm.com/catalog/content/ibm-cp-datacore-6825cc5d-dbf8-4ba2-ad98-690e6f221701-global)\. | +| Security, compliance, and isolation | The data security, network security, security standards compliance, and isolation of IBM watsonx are managed by IBM Cloud\. You can set up extra security and encryption options\. See [Security of IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html)\. | Red Hat OpenShift Container Platform provides basic security features\. Cloud Pak for Data is assessed for various Privacy and Compliance regulations and provides features that you can use in preparation for various privacy and compliance assessments\. You are responsible for additional security features, encryption, and network isolation\. See [Security considerations](https://www.ibm.com/docs/SSQNUZ_4.8.x/cpd/plan/security.html)\. | +| Available services | Most watsonx services are available in both deployment environments\.
See [Services for IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/cloud-services.html)\. | Includes many other services for other components and solutions\. See [Services for Cloud Pak for Data 4\.8](https://www.ibm.com/docs/SSQNUZ_4.8.x/svc-nav/head/services.html)\. | +| User management | You add users and user groups and manage their account roles and permissions with IBM Cloud Identity and Access Management\. See [Add users to the account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-addl-users.html)\.
You can also set up SAML federation on IBM Cloud\. See [IBM Cloud docs: How IBM Cloud IAM works](https://cloud.ibm.com/docs/account?topic=account-iamoverview)\. | You can add users and create user groups from the **Administration** menu\. You can use the Identity and Access Management Service or use your existing SAML SSO or LDAP provider for identity and password management\. You can create dynamic, attribute\-based user groups\. See [User management](https://www.ibm.com/docs/SSQNUZ_4.8.x/cpd/admin/users.html)\. | + + + +## Common features across services ## + +The following features that are provided with the platform are effectively the same for services on IBM watsonx as a Service and watsonx software on Cloud Pak for Data 4\.8: + + + + * Global search for assets across the platform + * The Platform assets catalog for sharing connections across the platform + * Role\-based user management within collaborative workspaces across the platform + * Common infrastructure for assets and workspaces + * A services catalog for adding services + * View compute usage from the **Administration** menu + + + +The following table describes differences in features across services between IBM watsonx as a Service and watsonx software on Cloud Pak for Data 4\.8: + + + +Differences in common features across services + +| Feature | As a service | Software | +| -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| Manage all projects | Users with the **Manage projects** permission from the IAM service access **Manager** role for the IBM Cloud Pak for Data service can join any project with the **Admin** role and then manage or delete the project\. | Users with the **Manage projects** permission can join any project with the **Admin** role and then manage or delete the project\. | +| Connections to remote data sources | Most supported data sources are common to both deployment environments\.
See [Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html)\. | See [Supported data sources](https://www.ibm.com/docs/SSQNUZ_4.8.x/cpd/access/data-sources.html)\. | +| Connection credentials that are personal or shared | Connections in projects and catalogs can require personal credentials or allow shared credentials\. Shared credentials can be disabled at the account level\. | Platform connections can require personal credentials or allow shared credentials\. Shared credentials can be disabled at the platform level\. | +| Connection credentials from secrets in a vault | Not available | Available | +| Kerberos authentication | Not available | Available for [some services and connections](https://www.ibm.com/docs/SSQNUZ_4.8.x/cpd/plan/kerberos.html) | +| Sample assets and projects from the Samples app | Available | Not available | +| Custom JDBC connector | Not available | Available starting in 4\.8\.0 | + + + +## Watson Studio ## + +The following Watson Studio features are effectively the same on IBM watsonx as a Service and watsonx software on Cloud Pak for Data 4\.8: + + + + * Collaboration in projects and deployment spaces + * Accessing project assets programmatically + * Project import and export by using a project ZIP file + * Jupyter notebooks + * Job scheduling + * Data Refinery + * Watson Natural Language Processing for Python + + + +This table describes the feature differences between the Watson Studio service on the as\-a\-service and software deployment environments, differences between offering plans, and whether additional services are required\. For more information about feature differences between offering plans on IBM watsonx, see [Watson Studio offering plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/ws-plans.html)\. + + + +Differences in Watson Studio + +| Feature | As a service | Software | +| -------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Sandbox project | Created automatically | Not available | +| Create project | Create:
• An empty project
• A project from a sample in the Samples
• A project from file | Create:
• An empty project
• A project from file
• A project with Git integration | +| Git integration | • Publish notebooks on GitHub
• Publish notebooks as gist | • Integrate a project with Git
• sync assets to repository in one project and use those assets into another project | +| Project terminal for advanced Git operations | Not available | Available in projects with default Git integration | +| Organize assets in projects with folders | Not available | Available starting with 4\.8\.0 | +| Foundation model inferencing | Available | Requires the watsonx\.ai service\. | +| Foundation model tuning | Available | Not available | +| Supported foundation models | Most foundation models are available on both deployments\. See [Supported foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html) | Requires that the models are installed on the cluster\. See [Supported foundation models](https://www.ibm.com/docs/SSQNUZ_4.8.x/wsj/analyze-data/fm-models.html)\. | +| AI guardrails for prompting | Available | Not available | +| Prompt variables | Available | Not available | +| Synthentic data generation | Available | Requires the Synthetic Data Generator service\. | +| JupyterLab | Not available | Available in projects with Git integration | +| Visual Studio Code integration | Not available | Available | +| RStudio | Cannot integrate with Git | Can integrate with Git\. Requires an RStudio Server Runtimes service\. | +| Python scripts | Not available | Work with Python scripts in JupyterLab\. Requires a Watson Studio Runtimes service\. | +| Generate code to load data to a notebook by using the Flight service | Not available | Available | +| Manage notebook lifecycle | Not available | Use CPDCTL for notebook lifecycle management | +| Code package assets (set of dependent files in a folder structure) | Not available | Use CPDCTL to create code package assets in a deployment space | +| Promote notebooks to spaces | Not available | Available manually from the project's Assets page or programmatically by using CPDCTL | +| Python with GPU | Support available for a single GPU type only (Nvidia K80) | Support available for multiple Nvidia GPU types\. Requires a Watson Studio Runtimes service\. | +| Create and use custom images | Not available | Create custom images for Python (with and without GPU), R, JupyterLab (with and without GPU), RStudio, and SPSS environments\. Requires a Watson Studio Runtimes and other applicable services\. | +| Anaconda Repository | Not available | Use to create custom environments and custom images | +| Hadoop integration | Not available | Build and train models, and run Data Refinery flows on a Hadoop cluster\. Requires the Execution Engine for Apache Hadoop service\. | +| Decision Optimization | Available | Requires the Decision Optimization service\. | +| SPSS Modeler | Available | Requires the SPSS Modeler service\. | +| Watson Pipelines | Available | Requires the Watson Pipelines service\. | + + + +## Watson Machine Learning ## + +The following Watson Machine Learning features are effectively the same on IBM watsonx as a Service and watsonx software on Cloud Pak for Data 4\.8: + + + + * Collaboration in projects and deployment spaces + * Deploy models + * Deploy functions + * Watson Machine Learning REST APIs + * Watson Machine Learning Python client + * Create online deployments + * Scale and update deployments + * Define and use custom components + * Use Federated Learning to train a common model with separate and secure data sources + * Monitor deployments across spaces + * Updated forms for testing online deployment + * Use nested pipelines + * AutoAI data imputation + * AutoAI fairness evaluation + * AutoAI time series supporting features + + + +This table describes the differences in features between the Watson Machine Learning service on the as\-a\-service and software deployment environments, differences between offering plans, and whether additional services are required\. For details about functionality differences between offering plans on IBM watsonx, see [Watson Machine Learning offering plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + + + +Feature differences between Watson Machine Learning deployments + +| Feature | As a service | Software | +| --------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| AutoAI training input | Current [supported data sources](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) | [Supported data sources](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) change by release | +| AutoAI experiment compute configuration | 8 CPU and 32 GB | [Different sizes available](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) | +| AutoAI limits on data size
and number of prediction targets | Set limits | [Limits differ by compute configuration](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) | +| AutoAI incremental learning | Not available | Available | +| Deploy using popular frameworks
and software specifications | Check for latest [supported versions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-frame-and-specs.html) | [Supported versions](https://www.ibm.com/docs/SSQNUZ_4.8.x/wsj/analyze-data/ml-manage-frame-and-specs.html) differ by release | +| Connect to databases for batch deployments | Check for [support by deployment type](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-details.html) | Check for support by [deployment type](https://www.ibm.com/docs/SSQNUZ_4.8.x/wsj/analyze-data/deploy-batch-details.html)
and by version | +| Deploy and score Python scripts | Available via Python client | Create scripts in JupyterLab or Python client, then deploy | +| Deploy and batch score R Scripts | Not available | Available | +| Deploy Shiny apps | Not available | Create and deploy Shiny apps
Deploy from code package | +| Evaluate jobs for fairness, or drift | Requires the Watson OpenScale service | Requires the Watson OpenScale service | +| Evaluate online deployments in a space
for fairness, drift or explainability | Not available | Available
Requires the Watson OpenScale service | +| Control space creation | No restrictions by role | Use permissions to control who can view and create spaces | +| Import from GIT project to space | Not available | Available | +| Code package automatically created when importing
from Git project to space | Not available | Available | +| Update RShiny app from code package | Not available | Available | +| Track model details in a model inventory | Register models to view factsheets with lifecycle details\. Requires the IBM Knowledge Catalog service\. | Available
Requires the AI Factsheets service\. | +| Create and use custom images | Not available | Create custom images for Python or SPSS | +| Notify collaborators about Pipeline events | Not available | Use Send Mail to notify collaborators | +| Import project or space file into a nonempty space | Not available | Available | +| Deep Learning Experiments | Not available | Requires the Watson Machine Learning Accelerator service | +| Provision and manage IBM Cloud service instances | Add instances for Watson Machine Learning
or Watson OpenScale | Services are provisioned on the cluster
by the administrator | + + + +## Watson OpenScale ## + +The following Watson OpenScale features are effectively the same on IBM watsonx as a Service and watsonx software on Cloud Pak for Data 4\.8: + + + + * Evaluate deployments for fairness + * Evaluate the quality of deployments + * Monitor deployments for drift + * View and compare model results in an Insights dashboard + * Add deployments from the machine learning provider of your choice + * Set alerts to trigger when evaluations fall below a specified threshold + * Evaluate deployments in a user interface or notebook + * Custom evaluations and metrics + * View details about evaluations in model factsheets + + + +This table describes the differences in features between the Watson OpenScale service on the as\-a\-service and software deployment environments, differences between offering plans, and whether additional services are required\. + + + +Differences IBM Watson OpenScale + +| Feature | As a service | Software | +| ---------------------------------------------- | ------------- | ----------------------------------- | +| Upload pre\-scored test data | Not available | Available | +| IBM SPSS Collaboration and Deployment Services | Not available | Available | +| Batch processing | Not available | Available | +| Support access control by user groups | Not available | Available | +| Free database and Postgres plans | Available | Postgres available starting in 4\.8 | +| Set up multiple instances | Not available | Available | +| Integration with OpenPages | Not available | Available | + + + +## Learn more ## + + + + * [Services for IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/cloud-services.html) + * [Services for Cloud Pak for Data 4\.8](https://www.ibm.com/docs/SSQNUZ_4.8.x/svc-nav/head/services.html) + * [Cloud deployment environment options for Cloud Pak for Data 4\.8](https://www.ibm.com/docs/SSQNUZ_4.8.x/cpd/plan/deployment-environments.html) + + + +**Parent topic:**[Overview of watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/overview-wx.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2bcbd3d61cc24296ea38b26b10306b7f50ce4988.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2bcbd3d61cc24296ea38b26b10306b7f50ce4988.md new file mode 100644 index 0000000..d94bce0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2bcbd3d61cc24296ea38b26b10306b7f50ce4988.md @@ -0,0 +1,36 @@ +# astimeintervalsnode properties + +# astimeintervalsnode properties # + +![Time Intervals node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/timeintervalnodeicon.png)Use the Time Intervals node to specify intervals and derive a new time field for estimating or forecasting\. A full range of time intervals is supported, from seconds to years\. + + + +astimeintervalsnode properties + +Table 1\. astimeintervalsnode properties + +| `astimeintervalsnode` properties | Data type | Property description | +| -------------------------------- | --------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `time_field` | *field* | Can accept only a single continuous field\. That field is used by the node as the aggregation key for converting the interval\. If an integer field is used here it's considered to be a time index\. | +| `dimensions` | *\[field1 field2 … fieldn\]* | These fields are used to create individual time series based on the field values\. | +| `fields_to_aggregate` | *\[field1 field2 … fieldn\]* | These fields are aggregated as part of changing the period of the time field\. Any fields not included in this picker are filtered out of the data leaving the node\. | +| `interval_type_timestamp` | `Years`
`Quarters`
`Months`
`Weeks`
`Days`
`Hours`
`Minutes`
`Seconds` | Specify intervals and derive a new time field for estimating or forecasting\. | +| `interval_type_time` | `Hours`
`Minutes`
`Seconds` | | +| `interval_type_date` | `Years`
`Quarters`
`Months`
`Weeks`
`Days` | Time interval | +| `interval_type_integer` | `Periods` | Time interval | +| `periods_per_interval` | *integer* | Periods per interval | +| `start_month` | `January``February``March``April``May``June``July``August``September``October``November``December` | | +| `week_begins_on` | `Sunday Monday Tuesday Wednesday Thursday Friday Saturday` | | +| `minute_interval` | `1 2 3 4 5 6 10 12 15 20 30` | | +| `second_interval` | `1 2 3 4 5 6 10 12 15 20 30` | | +| `agg_range_default` | `Sum Mean Min Max Median 1stQuartile 3rdQuartile` | Available functions for continuous fields include `Sum`, `Mean`, `Min`, `Max`, `Median`, `1st Quartile`, and `3rd Quartile`\. | +| `agg_set_default` | `Mode Min Max` | Nominal options include `Mode`, `Min`, and `Max`\. | +| `agg_flag_default` | `TrueIfAnyTrue FalseIfAnyFalse` | Options are either `True` if any true or `False` if any false\. | +| `custom_agg` | *array* | Custom settings for specified fields\. | +| `field_name_extension` | *string* | Specify the prefix or suffix applied to all fields generated by the node\. | +| `field_name_extension_as_prefix` | `true false` | Add extension as prefix\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2bcc4276ea71978ffa874621715be92a9667390f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2bcc4276ea71978ffa874621715be92a9667390f.md new file mode 100644 index 0000000..fbc923a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2bcc4276ea71978ffa874621715be92a9667390f.md @@ -0,0 +1,72 @@ +# Using Spark in RStudio + +# Using Spark in RStudio # + +Although the RStudio IDE cannot be started in a Spark with R environment runtime, you can use Spark in your R scripts and Shiny apps by accessing Spark kernels programmatically\. RStudio uses the `sparklyr` package to connect to Spark from R\. The `sparklyr` package includes a `dplyr` interface to Spark data frames as well as an R interface to Spark’s distributed machine learning pipelines\. + +You can connect to Spark from RStudio: + + + + * By connecting to a Spark kernel that runs locally in the RStudio container in IBM Watson Studio + + + +RStudio includes sample code snippets that show you how to connect to a Spark kernel in your applications for both methods\. + +To use Spark in RStudio after you have launched the IDE: + + + +1. Locate the `ibm_sparkaas_demos` directory under your home directory and open it\. The directory contains the following R scripts: + + + + * A readme with details on the included R sample scripts + * `spark_kernel_basic_local.R` includes sample code of how to connect to a local Spark kernel + * `spark_kernel_basic_remote.R` includes sample code of how to connect to a remote Spark kernel + * The files `sparkaas_flights.R`and `sparkaas_mtcars.R` are two examples of how to use Spark in a small sample application + + + +2. Use the sample code snippets in your R scripts or applications to help you get started using Spark\. + + + +## Connecting to Spark from RStudio ## + +To connect to Spark from RStudio using the `Sparklyr` R package, you need a Spark with R environment\. You can either use the default Spark with R environment that is provided or create a custom Spark with R environment\. To create a custom environment, see [Creating environment templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-customize-env-definition.html)\. + +Follow these steps after you launch RStudio in an RStudio environment: + +Use the following sample code to get a listing of the Spark environment details and to connect to a Spark kernel from your RStudio session: + + # load spark R packages + library(ibmwsrspark) + library(sparklyr) + + # load kernels + kernels <- load_spark_kernels() + + # display kernels + display_spark_kernels() + + # get spark kernel Configuration + + conf <- get_spark_config(kernels[1]) + # Set spark configuration + conf$spark.driver.maxResultSize <- "1G" + # connect to Spark kernel + + sc <- spark_connect(config = conf) + +Then to disconnect from Spark, use: + + # disconnect + spark_disconnect(sc) + +Examples of these commands are provided in the readme under `/home/wsuser/ibm_sparkaas_demos`\. + +**Parent topic:**[RStudio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2bd7112457a8b916f3b4701580570c85ae1b520e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2bd7112457a8b916f3b4701580570c85ae1b520e.md new file mode 100644 index 0000000..7a12399 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2bd7112457a8b916f3b4701580570c85ae1b520e.md @@ -0,0 +1,86 @@ +# Microsoft Azure Cosmos DB connection + +# Microsoft Azure Cosmos DB connection # + +To access your data in Microsoft Azure Cosmos DB, create a connection asset for it\. + +Azure Cosmos DB is a fully managed NoSQL database service\. + +## Create a connection to Microsoft Azure Cosmos DB ## + +To create the connection asset, you need these connection details: + + + + * Hostname + * Port number + * Master key: The Azure Cosmos Database primary read\-write key + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Microsoft Azure Cosmos DB connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Decision Optimization + * Notebooks\. Click **Read data** on the **Code snippets** pane to get the connection credentials and load the data into a data structure\. See [Load data from data source connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html#conns)\. + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Azure Cosmos DB setup ## + + + + * Set up Azure Cosmos DB: [Azure portal](https://docs.microsoft.com/en-us/azure/cosmos-db/create-cosmosdb-resources-portal) + * Secure access to data in Azure Cosmos DB: [Master keys](https://docs.microsoft.com/en-us/azure/cosmos-db/secure-access-to-data#master-keys) + + + +## Restrictions ## + +Only the Core (SQL) API is supported\. + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [Azure Cosmos DB documentation](https://docs.microsoft.com/azure/cosmos-db/) for the correct syntax\. + +## Learn more ## + +[Azure Cosmos DB](https://azure.microsoft.com/en-us/services/cosmos-db/) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c0ebf0ccb497f41c14a5895ef97c01864bfc3d2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c0ebf0ccb497f41c14a5895ef97c01864bfc3d2.md new file mode 100644 index 0000000..fe2b1fa --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c0ebf0ccb497f41c14a5895ef97c01864bfc3d2.md @@ -0,0 +1,36 @@ +# Spatial functions (SPSS Modeler) + +# Spatial functions # + +Spatial functions can be used with geospatial data\. For example, they allow you to calculate the distances between two points, the area of a polygon, and so on\. + +There can also be situations that require a merge of multiple geospatial data sets that are based on a spatial predicate (within, close to, and so on), which can be done through a merge condition\. + +Notes: + + + + * These spatial functions don't apply to three\-dimensional data\. If you import three\-dimensional data into a flow, only the first two dimensions are used by these functions\. The z\-axis values are ignored\. + * Geospatial functions aren't supported\. + + + + + +CLEM spatial functions + +Table 1\. CLEM spatial functions + +| Function | Result | Description | +| --------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `close_to(SHAPE,SHAPE,NUM)` | *Boolean* | Tests whether 2 shapes are within a certain DISTANCE of each other\. If a projected coordinate system is used, DISTANCE is in meters\. If no coordinate system is used, it is an arbitrary unit\. | +| `crosses(SHAPE,SHAPE)` | *Boolean* | Tests whether 2 shapes cross each other\. This function is suitable for 2 linestring shapes, or 1 linestring and 1 polygon\. | +| `overlap(SHAPE,SHAPE)` | *Boolean* | Tests whether there is an intersection between 2 polygons and that the intersection is interior to both shapes\. | +| `within(SHAPE,SHAPE)` | *Boolean* | Tests whether the entirety of SHAPE1 is contained within a POLYGON\. | +| `area(SHAPE)` | *Real* | Returns the area of the specified POLYGON\. If a projected system is used, the function returns meters squared\. If no coordinate system is used, it is an arbitrary unit\. The shape must be a POLYGON or a MULTIPOLYGON\. | +| `num_points(SHAPE,LIST)` | *Integer* | Returns the number of points from a point field (MULTIPOINT) which are contained within the bounds of a POLYGON\. SHAPE1 must be a POLYGON or a MULTIPOLYGON\. | +| `distance(SHAPE,SHAPE)` | *Real* | Returns the distance between SHAPE1 and SHAPE2\. If a projected coordinate system is used, the function returns meters\. If no coordinate system is used, it is an arbitrary unit\. SHAPE1 and SHAPE2 can be any geo measurement type\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c17e0a9e72fe65317838e81acf1fa77620e0c6c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c17e0a9e72fe65317838e81acf1fa77620e0c6c.md new file mode 100644 index 0000000..2fd2003 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c17e0a9e72fe65317838e81acf1fa77620e0c6c.md @@ -0,0 +1,37 @@ +# analysisnode properties + +# analysisnode properties # + +![Analysis node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/analysisnodeicon.png)The Analysis node evaluates predictive models' ability to generate accurate predictions\. Analysis nodes perform various comparisons between predicted values and actual values for one or more model nuggets\. They can also compare predictive models to each other\. + + + +analysisnode properties + +Table 1\. analysisnode properties + +| `analysisnode` properties | Data type | Property description | +| ------------------------- | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | +| `output_mode` | `Screen``File` | Used to specify target location for output generated from the output node\. | +| `use_output_name` | *flag* | Specifies whether a custom output name is used\. | +| `output_name` | *string* | If `use_output_name` is true, specifies the name to use\. | +| `output_format` | `Text` (\.*txt*) `HTML` (\.*html*) `Output` (\.*cou*) | Used to specify the type of output\. | +| `by_fields` | *list* | | +| `full_filename` | *string* | If disk, data, or HTML output, the name of the output file\. | +| `coincidence` | *flag* | | +| `performance` | *flag* | | +| `evaluation_binary` | *flag* | | +| `confidence` | *flag* | | +| `threshold` | *number* | | +| `improve_accuracy` | *number* | | +| `field_detection_method` | `Metadata``Name` | Determines how predicted fields are matched to the original target field\. Specify `Metadata` or `Name`\. | +| `inc_user_measure` | *flag* | | +| `user_if` | *expr* | | +| `user_then` | *expr* | | +| `user_else` | *expr* | | +| `user_compute` | `[Mean Sum Min Max SDev]` | | +| `split_by_partition` | *boolean* | Whether to separate by partition\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c1e91540bd58780f781f8a06e2b5c62035ca84b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c1e91540bd58780f781f8a06e2b5c62035ca84b.md new file mode 100644 index 0000000..8eba6af --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c1e91540bd58780f781f8a06e2b5c62035ca84b.md @@ -0,0 +1,21 @@ +# applydiscriminantnode properties + +# applydiscriminantnode properties # + +You can use Discriminant modeling nodes to generate a Discriminant model nugget\. The scripting name of this model nugget is *applydiscriminantnode*\. For more information on scripting the modeling node itself, see [discriminantnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/discriminantnodeslots.html#discriminantnodeslots)\. + + + +applydiscriminantnode properties + +Table 1\. applydiscriminantnode properties + +| `applydiscriminantnode` Properties | Values | Property description | +| ---------------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `enable_sql_generation` | `false``native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c669e0145dac26a7517d9402874bac048e46e82.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c669e0145dac26a7517d9402874bac048e46e82.md new file mode 100644 index 0000000..569830f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c669e0145dac26a7517d9402874bac048e46e82.md @@ -0,0 +1,21 @@ +# SQL optimization (SPSS Modeler) + +# Tips for maximizing SQL pushback # + +To get the best performance boost from SQL optimization, pay attention to the items in this section\. + +Flow order\. SQL generation may be halted when the function of the node has no semantic equivalent in SQL because SPSS Modeler’s data\-mining functionality is richer than the traditional data\-processing operations supported by standard SQL\. When this happens, SQL generation is also suppressed for any downstream nodes\. Therefore, you may be able to significantly improve performance by reordering nodes to put operations that halt SQL as far downstream as possible\. The SQL optimizer can do a certain amount of reordering automatically, but further improvements may be possible\. A good candidate for this is the Select node, which can often be brought forward\. See [Nodes supporting SQL pushback](https://dataplatform.cloud.ibm.com/docs/content/wsd/sql_nodes.html) for more information\. + +CLEM expressions\. If a flow can't be reordered, you may be able to change node options or CLEM expressions or otherwise recast the way the operation is performed, so that it no longer inhibits SQL generation\. Derive, Select, and similar nodes can commonly be rendered into SQL, provided that all of the CLEM expression operators have SQL equivalents\. Most operators can be rendered, but there are a number of operators that inhibit SQL generation (in particular, the sequence functions \[“@ functions”\])\. Sometimes generation is halted because the generated query has become too complex for the database to handle\. See [CLEM expressions and operators supporting SQL pushback](https://dataplatform.cloud.ibm.com/docs/content/wsd/sql_clem.html) for more information\. + +Multiple input nodes\. Where a flow has multiple data import nodes, SQL generation is applied to each import branch independently\. If generation is halted on one branch, it can continue on another\. Where two branches merge (and both branches can be expressed in SQL up to the merge), the merge itself can often be replaced with a database join, and generation can be continued downstream\. + +Scoring models\. In\-database scoring is supported for some models by rendering the generated model into SQL\. However, some models generate extremely complex SQL expressions that aren't always evaluated effectively within the database\. For this reason, SQL generation must be enabled separately for each generated model nugget\. If you find that a model nugget is inhibiting SQL generation, open the model nugget's settings and select Generate SQL for this model (with some models, you may have additional options controlling generation)\. Run tests to confirm that the option is beneficial for your application\. See [Nodes supporting SQL pushback](https://dataplatform.cloud.ibm.com/docs/content/wsd/sql_nodes.html) for more information\. + +When testing modeling nodes to see if SQL generation for models works effectively, we recommend first saving all flows from SPSS Modeler\. Note that some database systems may hang while trying to process the (potentially complex) generated SQL\. + +Database caching\. If you are using a node cache to save data at critical points in the flow (for example, following a Merge or Aggregate node), make sure that database caching is enabled along with SQL optimization\. This will allow data to be cached to a temporary table in the database (rather than the file system) in most cases\. + +Vendor\-specific SQL\. Most of the generated SQL is standards\-conforming (SQL\-92), but some nonstandard, vendor\-specific features are exploited where practical\. The degree of SQL optimization can vary, depending on the database source\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c6b0f77c4ca0cafb52e1fe3e10800d56015cadf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c6b0f77c4ca0cafb52e1fe3e10800d56015cadf.md new file mode 100644 index 0000000..93ef72b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c6b0f77c4ca0cafb52e1fe3e10800d56015cadf.md @@ -0,0 +1,54 @@ +# Creating and managing IBM Cloud services + +# Creating and managing IBM Cloud services # + +You can create IBM Cloud service instances within IBM watsonx from the Services catalog\. + +**Prerequisite** : You must be [signed up for watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/signup-wx.html)\. + +**Required permissions** : For creating or managing a service instance, you must have **Administrator** or **Editor** platform access roles in the IBM Cloud account for IBM watsonx\. If you signed up for IBM watsonx with your own IBM Cloud account, you are the owner of the account\. Otherwise, you can [check your IBM Cloud account roles and permissions](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/your-roles.html)\. + +## Creating a service ## + +To view the Services catalog, select **Administration > Services > Services catalog** from the main menu\. For a description of each service, see [Services](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/cloud-services.html)\. + +To check which service instances you have, select **Administration > Services > Service instances** from the main menu\. You can filter which services you see by resource group, organization, and region\. + +To create a service: + + + +1. Log in to IBM watsonx\. +2. Select **Administration > Services > Services catalog** from the main menu\. +3. Click the service you want to create\. +4. Specify the IBM Cloud service region\. +5. Select a plan\. +6. If necessary, select the resource group or organization\. +7. Click **Create**\. + + + +## Managing services ## + +To manage a service: + + + +1. Select **Administration > Services > Services instances** from the main menu\. +2. Click the Action menu next to the service name and select **Manage in IBM Cloud**\. The service page in IBM Cloud opens in a separate browser tab\. +3. To change pricing plans, select **Plan** and choose the desired plan\. + + + +## Learn more ## + + + + * [Associate a service with a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assoc-services.html) + * [Managing the platform](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_console.html) + + + +**Parent topic:**[IBM Cloud services](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/cloud-services.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c991135b30b24a268fc9d847e3f43522543a96b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c991135b30b24a268fc9d847e3f43522543a96b.md new file mode 100644 index 0000000..8689e90 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c991135b30b24a268fc9d847e3f43522543a96b.md @@ -0,0 +1,11 @@ +# Specifying values and labels for nominal and ordinal data (SPSS Modeler) + +# Specifying values and labels for nominal and ordinal data # + +Nominal (set) and ordinal (ordered set) measurement levels indicate that the data values are used discretely as a member of the set\. The storage types for a set can be string, integer, real number, or date/time\. + +The following controls are unique to nominal and ordinal fields\. You can use them to specify values and labels\. Select the desired field in the Type node settings and then click the gear icon at the end of its row\. + +Values and Labels\. You can specify values based on your knowledge of the current field\. You can enter expected values for the field and check the dataset's conformity to these values using the Check options\. And you can specify lables for each value in the set\. Thse labels appear in a variety of locations, such as graphs, tables, output, and model browsers\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c9d0d0309e01ff2ee0d298a16011857de068038.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c9d0d0309e01ff2ee0d298a16011857de068038.md new file mode 100644 index 0000000..c04c386 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2c9d0d0309e01ff2ee0d298a16011857de068038.md @@ -0,0 +1,7 @@ +# Chart types + +# Chart types # + +The gallery contains a collection of the most commonly used charts\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d08edd168fbee078290f386f7ec3eb1998adf02.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d08edd168fbee078290f386f7ec3eb1998adf02.md new file mode 100644 index 0000000..4dbd397 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d08edd168fbee078290f386f7ec3eb1998adf02.md @@ -0,0 +1,209 @@ +# Time reference system + +# Time reference system # + +Time reference system (TRS) is a local, regional or global system used to identify time\. + +A time reference system defines a specific projection for forward and reverse mapping between a timestamp and its numeric representation\. A common example that most users are familiar with is UTC time, which maps a timestamp, for example, (1 Jan 2019, 12 midnight (GMT) into a 64\-bit integer value (1546300800000), which captures the number of milliseconds that have elapsed since 1 Jan 1970, 12 midnight (GMT)\. Generally speaking, the timestamp value is better suited for human readability, while the numeric representation is better suited for machine processing\. + +In the time series library, a time series can be associated with a TRS\. A TRS is composed of a: + + + + * Time tick that captures time granularity, for example 1 minute + * Zoned date time that captures a start time, for example `1 Jan 2019, 12 midnight US Eastern Daylight Savings time (EDT)`\. A timestamp is mapped into a numeric representation by computing the number of elapsed time ticks since the start time\. A numeric representation is scaled by the granularity and shifted by the start time when it is mapped back to a timestamp\. + + + +Note that this forward \+ reverse projection might lead to time loss\. For instance, if the true time granularity of a time series is in seconds, then forward and reverse mapping of the time stamps `09:00:01` and `09:00:02` (to be read as `hh:mm:ss`) to a granularity of one minute would result in the time stamps `09:00:00` and `09:00:00` respectively\. In this example, a time series, whose granularity is in seconds, is being mapped to minutes and thus the reverse mapping looses information\. However, if the mapped granularity is higher than the granularity of the input time series (more specifically, if the time series granularity is an integral multiple of the mapped granularity) then the forward \+ reverse projection is guaranteed to be lossless\. For example, mapping a time series, whose granularity is in minutes, to seconds and reverse projecting it to minutes would result in lossless reconstruction of the timestamps\. + +## Setting TRS ## + +When a time series is created, it is associated with a TRS (or None if no TRS is specified)\. If the TRS is None, then the numeric values cannot be mapped to timestamps\. Note that TRS can only be set on a time series at construction time\. The reason is that a time series by design is an immutable object\. Immutability comes in handy when the library is used in multi\-threaded environments or in distributed computing environments such as Apache Spark\. While a TRS can be set only at construction time, it can be changed using the `with_trs` method as described in the next section\. `with_trs` produces a new time series and thus has no impact on immutability\. + +Let us consider a simple time series created from an in\-memory list: + + values = [1.0, 2.0, 4.0] + x = tspy.time_series(values) + x + +This returns: + + TimeStamp: 0 Value: 1.0 + TimeStamp: 1 Value: 2.0 + TimeStamp: 2 Value: 4.0 + +At construction time, the time series can be associated with a TRS\. Associating a TRS with a time series allows its numeric timestamps to be as per the time tick and offset/timezone\. The following example shows `1 minute and 1 Jan 2019, 12 midnight (GMT)`: + + zdt = datetime.datetime(2019,1,1,0,0,0,0,tzinfo=datetime.timezone.utc) + x_trs = tspy.time_series(data, granularity=datetime.timedelta(minutes=1), start_time=zdt) + x_trs + +This returns: + + TimeStamp: 2019-01-01T00:00Z Value: 1.0 + TimeStamp: 2019-01-01T00:01Z Value: 2.0 + TimeStamp: 2019-01-01T00:02Z Value: 4.0 + +Here is another example where the numeric timestamps are reinterpreted with a time tick of one hour and offset/timezone as `1 Jan 2019, 12 midnight US Eastern Daylight Savings time (EDT)`\. + + tz_edt = datetime.timezone.edt + zdt = datetime.datetime(2019,1,1,0,0,0,0,tzinfo=tz_edt) + x_trs = tspy.time_series(data, granularity=datetime.timedelta(hours=1), start_time=zdt) + x_trs + +This returns: + + TimeStamp: 2019-01-01T00:00-04:00 Value: 1.0 + TimeStamp: 2019-01-01T00:01-04:00 Value: 2.0 + TimeStamp: 2019-01-01T00:02-04:00 Value: 4.0 + +Note that the timestamps now indicate an offset of \-4 hours from GMT (EDT timezone) and captures the time tick of one hour\. Also note that setting a TRS does NOT change the numeric timestamps \- it only specifies a way of interpreting numeric timestamps\. + + x_trs.print(human_readable=False) + +This returns: + + TimeStamp: 0 Value: 1.0 + TimeStamp: 1 Value: 2.0 + TimeStamp: 2 Value: 4.0 + +## Changing TRS ## + +You can change the TRS associated with a time series using the `with_trs` function\. Note that this function will throw an exception if the input time series is not associated with a TRS (if TRS is None)\. Using `with_trs` changes the numeric timestamps\. + +The following code sample shows TRS set at contructions time without using `with_trs`: + + # 1546300800 is the epoch time in seconds for 1 Jan 2019, 12 midnight GMT + zdt1 = datetime.datetime(1970,1,1,0,0,0,0,tzinfo=datetime.timezone.utc) + y = tspy.observations.of(tspy.observation(1546300800, 1.0),tspy.observation(1546300860, 2.0), tspy.observation(1546300920, + 4.0)).to_time_series(granularity=datetime.timedelta(seconds=1), start_time=zdt1) + y.print() + y.print(human_readable=False) + +This returns: + + TimeStamp: 2019-01-01T00:00Z Value: 1.0 + TimeStamp: 2019-01-01T00:01Z Value: 2.0 + TimeStamp: 2019-01-01T00:02Z Value: 4.0 + + # TRS has been set during construction time - no changes to numeric timestamps + TimeStamp: 1546300800 Value: 1.0 + TimeStamp: 1546300860 Value: 2.0 + TimeStamp: 1546300920 Value: 4.0 + +The following example shows how to apply `with_trs` to change `granularity` to one minute and retain the original time offset (1 Jan 1970, 12 midnight GMT): + + y_minutely_1970 = y.with_trs(granularity=datetime.timedelta(minutes=1), start_time=zdt1) + y_minutely_1970.print() + y_minutely_1970.print(human_readable=False) + +This returns: + + TimeStamp: 2019-01-01T00:00Z Value: 1.0 + TimeStamp: 2019-01-01T00:01Z Value: 2.0 + TimeStamp: 2019-01-01T00:02Z Value: 4.0 + + # numeric timestamps have changed to number of elapsed minutes since 1 Jan 1970, 12 midnight GMT + TimeStamp: 25771680 Value: 1.0 + TimeStamp: 25771681 Value: 2.0 + TimeStamp: 25771682 Value: 4.0 + +Now apply `with_trs` to change `granularity` to one minute and the offset to 1 Jan 2019, 12 midnight GMT: + + zdt2 = datetime.datetime(2019,1,1,0,0,0,0,tzinfo=datetime.timezone.utc) + y_minutely = y.with_trs(granularity=datetime.timedelta(minutes=1), start_time=zdt2) + y_minutely.print() + y_minutely.print(human_readable=False) + +This returns: + + TimeStamp: 2019-01-01T00:00Z Value: 1.0 + TimeStamp: 2019-01-01T00:01Z Value: 2.0 + TimeStamp: 2019-01-01T00:02Z Value: 4.0 + + # numeric timestamps are now minutes elapsed since 1 Jan 2019, 12 midnight GMT + TimeStamp: 0 Value: 1.0 + TimeStamp: 1 Value: 2.0 + TimeStamp: 2 Value: 4.0 + +To better understand how it impacts post processing, let's examine the following\. Note that `materialize` on numeric timestamps operates on the underlying numeric timestamps associated with the time series\. + + print(y.materialize(0,2)) + print(y_minutely_1970.materialize(0,2)) + print(y_minutely.materialize(0,2)) + +This returns: + + # numeric timestamps in y are in the range 1546300800, 1546300920 and thus y.materialize(0,2) is empty + [] + # numeric timestamps in y_minutely_1970 are in the range 25771680, 25771682 and thus y_minutely_1970.materialize(0,2) is empty + [] + # numeric timestamps in y_minutely are in the range 0, 2 + [(0,1.0),(1,2.0),(2,4.0)] + +The method `materialize` can also be applied to datetime objects\. This results in an exception if the underlying time series is not associated with a TRS (if TRS is None)\. Assuming the underlying time series has a TRS, the datetime objects are mapped to a numeric range using the TRS\. + + # Jan 1 2019, 12 midnight GMT + dt_beg = datetime.datetime(2019,1,1,0,0,0,0,tzinfo=datetime.timezone.utc) + # Jan 1 2019, 12:02 AM GMT + dt_end = datetime.datetime(2019,1,1,0,2,0,0,tzinfo=datetime.timezone.utc) + + print(y.materialize(dt_beg, dt_end)) + print(y_minutely_1970.materialize(dt_beg, dt_end)) + print(y_minutely.materialize(dt_beg, dt_end)) + + # materialize on y in UTC millis + [(1546300800,1.0),(1546300860,2.0), (1546300920,4.0)] + # materialize on y_minutely_1970 in UTC minutes + [(25771680,1.0),(25771681,2.0),(25771682,4.0)] + # materialize on y_minutely in minutes offset by 1 Jan 2019, 12 midnight + [(0,1.0),(1,2.0),(2,4.0)] + +## Duplicate timestamps ## + +Changing the TRS can result in duplicate timestamps\. The following example changes the granularity to one hour which results in duplicate timestamps\. The time series library handles duplicate timestamps seamlessly and provides convenience combiners to reduce values associated with duplicate timestamps into a single value, for example by calculating an average of the values grouped by duplicate timestamps\. + + y_hourly = y_minutely.with_trs(granularity=datetime.timedelta(hours=1), start_time=zdt2) + print(y_minutely) + print(y_minutely.materialize(0,2)) + + print(y_hourly) + print(y_hourly.materialize(0,0)) + +This returns: + + # y_minutely - minutely time series + TimeStamp: 2019-01-01T00:00Z Value: 1.0 + TimeStamp: 2019-01-01T00:01Z Value: 2.0 + TimeStamp: 2019-01-01T00:02Z Value: 4.0 + + # y_minutely has numeric timestamps 0, 1 and 2 + [(0,1.0),(1,2.0),(2,4.0)] + + # y_hourly - hourly time series has duplicate timestamps + TimeStamp: 2019-01-01T00:00Z Value: 1.0 + TimeStamp: 2019-01-01T00:00Z Value: 2.0 + TimeStamp: 2019-01-01T00:00Z Value: 4.0 + + # y_hourly has numeric timestamps of all 0 + [(0,1.0),(0,2.0),(0,4.0)] + +Duplicate timestamps can be optionally combined as follows: + + y_hourly_averaged = y_hourly.transform(transformers.combine_duplicate_granularity(lambda x: sum(x)/len(x)) + print(y_hourly_averaged.materialize(0,0)) + +This returns: + + # values corresponding to the duplicate numeric timestamp 0 have been combined using average + # average = (1+2+4)/3 = 2.33 + [(0,2.33)] + +## Learn more ## + +To use the `tspy` Python SDK, see the [`tspy` Python SDK documentation](https://ibm-cloud.github.io/tspy-docs/)\. + +**Parent topic:**[Time series analysis](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-lib.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d3a398b8394671d9383f214ff5e69a00391bb22.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d3a398b8394671d9383f214ff5e69a00391bb22.md new file mode 100644 index 0000000..7e8f303 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d3a398b8394671d9383f214ff5e69a00391bb22.md @@ -0,0 +1,27 @@ +# {{ document.title.text }} + +# Confidential data in prompt # + +![icon for intellectual property risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-intellectual-property.svg)Risks associated with inputInferenceIntellectual propertyNew + +### Description ### + +Inclusion of confidential data as a part of a generative model's prompt, either through the system prompt design or through the inclusion of end user input, might later result in unintended reuse or disclosure of that information\. + +### Why is confidential data in prompt a concern for foundation models? ### + +If not properly developed to secure confidential data, the model might expose confidential information or IP in the generated output\. Additionally, end users' confidential information might be unintentionally collected and stored\. + +Example + +#### Disclosure of Confidential Information #### + +As per the source article, employees of Samsung disclosed confidential information to OpenAI through their use of ChatGPT\. In one instance, an employee pasted confidential source code to check for errors\. In another, an employee shared code with ChatGPT and "requested code optimization\." A third shared a recording of a meeting to convert into notes for a presentation\. Samsung has limited internal ChatGPT usage in response to these incidents, but it is unlikely that they will be able to recall any of their data\. Additionally, that article highlighted that in response to the risk of leaking confidential information and other sensitive information, companies like Apple, JPMorgan Chase\. Deutsche Bank, Verizon, Walmart, Samsung, Amazon, and Accenture have placed several restrictions on the usage of ChatGPT\. + +Sources: + +[Business Insider, February 2023](https://www.businessinsider.com/walmart-warns-workers-dont-share-sensitive-information-chatgpt-generative-ai-2023-2) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d3f7f5efb161e0d88ae69c4710d70aa99db0bde.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d3f7f5efb161e0d88ae69c4710d70aa99db0bde.md new file mode 100644 index 0000000..4438a3d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d3f7f5efb161e0d88ae69c4710d70aa99db0bde.md @@ -0,0 +1,11 @@ +# Reclassify node (SPSS Modeler) + +# Reclassify node # + +The Reclassify node enables the transformation from one set of categorical values to another\. Reclassification is useful for collapsing categories or regrouping data for analysis\. + +For example, you could reclassify the values for `Product` into three groups, such as `Kitchenware`, `Bath and Linens`, and `Appliances`\. + +Reclassification can be performed for one or more symbolic fields\. You can also choose to substitute the new values for the existing field or generate a new field\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d5b33f1352d8ba7cef029d1979ccf0d44aad63e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d5b33f1352d8ba7cef029d1979ccf0d44aad63e.md new file mode 100644 index 0000000..b85c2e1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d5b33f1352d8ba7cef029d1979ccf0d44aad63e.md @@ -0,0 +1,30 @@ +# Building the flow (SPSS Modeler) + +# Building the flow # + + + +1. Add a Data Asset node that points to property\_values\_train\.csv\. +2. Add a Type node, and select `taxable_value` as the target field (Role = Target)\. Other fields will be used as predictors\. + + Figure 1. Setting the measurement level and role + + ![Setting the role](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autocont_build_target.png) +3. Attach an Auto Numeric node, and select Correlation as the metric used to rank models (under BASICS in the node properties)\. +4. Set the Number of models to use to 3\. This means that the three best models will be built when you run the node\. + + Figure 2. Auto Numeric node BASICS + + ![Setting BASIC options](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autocont_build_basics.png) +5. Under EXPERT, leave the default settings in place\. The node will estimate a single model for each algorithm, for a total of six models\. (Alternatively, you can modify these settings to compare multiple variants for each model type\.) + + Because you set Number of models to use to 3 under BASICS, the node will calculate the accuracy of the six algorithms and build a single model nugget containing the three most accurate. + + Figure 3. Auto Numeric node EXPERT options + + ![Setting EXPERT options](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autocont_build_expert.png) +6. Under ENSEMBLE, leave the default settings in place\. Since this is a continuous target, the ensemble score is generated by averaging the scores for the individual models\.![ENSEMBLE options](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autocont_build_ensemble.png) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d81fcd3e78a5cc7b435198a59522ae6bf8640ed.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d81fcd3e78a5cc7b435198a59522ae6bf8640ed.md new file mode 100644 index 0000000..b9c3885 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d81fcd3e78a5cc7b435198a59522ae6bf8640ed.md @@ -0,0 +1,102 @@ +# SPSS predictive analytics survival analysis algorithms in notebooks + +# SPSS predictive analytics survival analysis algorithms in notebooks # + +You can use non\-parametric distribution fitting, parametric distribution fitting, or parametric regression modeling SPSS predictive analytics algorithms in notebooks\. + +## Non\-Parametric Distribution Fitting ## + +Survival analysis analyzes data where the outcome variable is the time until the occurrence of an event of interest\. The distribution of the event times is typically described by a survival function\. + +Non\-parametric Distribution Fitting (NPDF) provides an estimate of the survival function without making any assumptions concerning the distribution of the data\. NPDF includes Kaplan\-Meier estimation, life tables, and specialized extension algorithms to support left censored, interval censored, and recurrent event data\. + +**Python example code:** + + from spss.ml.survivalanalysis import NonParametricDistributionFitting + from spss.ml.survivalanalysis.params import DefinedStatus, Points, StatusItem + + npdf = NonParametricDistributionFitting(). \ + setAlgorithm("KM"). \ + setBeginField("time"). \ + setStatusField("status"). \ + setStrataFields(["treatment"]). \ + setGroupFields(["gender"]). \ + setUndefinedStatus("INTERVALCENSORED"). \ + setDefinedStatus( + DefinedStatus( + failure=StatusItem(points = Points("1")), + rightCensored=StatusItem(points = Points("0")))). \ + setOutMeanSurvivalTime(True) + + npdfModel = npdf.fit(df) + predictions = npdfModel.transform(data) + predictions.show() + +## Parametric Distribution Fitting ## + +Survival analysis analyzes data where the outcome variable is the time until the occurrence of an event of interest\. The distribution of the event times is typically described by a survival function\. + +Parametric Distribution Fitting (PDF) provides an estimate of the survival function by comparing the functions for several known distributions (exponential, Weibull, log\-normal, and log\-logistic) to determine which, if any, describes the data best\. In addition, the distributions for two or more groups of cases can be compared\. + +**Python excample code:** + + from spss.ml.survivalanalysis import ParametricDistributionFitting + from spss.ml.survivalanalysis.params import DefinedStatus, Points, StatusItem + + pdf = ParametricDistributionFitting(). \ + setBeginField("begintime"). \ + setEndField("endtime"). \ + setStatusField("status"). \ + setFreqField("frequency"). \ + setDefinedStatus( + DefinedStatus( + failure=StatusItem(points=Points("F")), + rightCensored=StatusItem(points=Points("R")), + leftCensored=StatusItem(points=Points("L"))) + ). \ + setMedianRankEstimation("RRY"). \ + setMedianRankObtainMethod("BetaFDistribution"). \ + setStatusConflictTreatment("DERIVATION"). \ + setEstimationMethod("MRR"). \ + setDistribution("Weibull"). \ + setOutProbDensityFunc(True). \ + setOutCumDistFunc(True). \ + setOutSurvivalFunc(True). \ + setOutRegressionPlot(True). \ + setOutMedianRankRegPlot(True). \ + setComputeGroupComparison(True) + + pdfModel = pdf.fit(data) + predictions = pdfModel.transform(data) + predictions.show() + +## Parametric regression modeling ## + +Parametric regression modeling (PRM) is a survival analysis technique that incorporates the effects of covariates on the survival times\. PRM includes two model types: accelerated failure time and frailty\. Accelerated failure time models assume that the relationship of the logarithm of survival time and the covariates is linear\. Frailty, or random effects, models are useful for analyzing recurrent events, correlated survival data, or when observations are clustered into groups\. + +PRM automatically selects the survival time distribution (exponential, Weibull, log\-normal, or log\-logistic) that best describes the survival times\. + +**Python example code:** + + from spss.ml.survivalanalysis import ParametricRegression + from spss.ml.survivalanalysis.params import DefinedStatus, Points, StatusItem + + prm = ParametricRegression(). \ + setBeginField("startTime"). \ + setEndField("endTime"). \ + setStatusField("status"). \ + setPredictorFields(["age", "surgery", "transplant"]). \ + setDefinedStatus( + DefinedStatus( + failure=StatusItem(points=Points("0.0")), + intervalCensored=StatusItem(points=Points("1.0")))) + + prmModel = prm.fit(data) + PMML = prmModel.toPMML() + statXML = prmModel.statXML() + predictions = prmModel.transform(data) + predictions.show() + +**Parent topic:**[SPSS predictive analytics algorithms](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spss-algorithms.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d9ace87f4859bf7ef8cdf4ebbf8307c51034471.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d9ace87f4859bf7ef8cdf4ebbf8307c51034471.md new file mode 100644 index 0000000..99e8c18 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2d9ace87f4859bf7ef8cdf4ebbf8307c51034471.md @@ -0,0 +1,12 @@ +# Linear-AS node (SPSS Modeler) + +# Linear\-AS node # + +Linear regression is a common statistical technique for classifying records based on the values of numeric input fields\. Linear regression fits a straight line or surface that minimizes the discrepancies between predicted and actual output values\. + +Requirements\. Only numeric fields and categorical predictors can be used in a linear regression model\. You must have exactly one target field (with the role set to Target) and one or more predictors (with the role set to Input)\. Fields with a role of Both or None are ignored, as are non\-numeric fields\. (If necessary, non\-numeric fields can be recoded using a Derive node\.) + +Strengths\. Linear regression models are relatively simple and give an easily interpreted mathematical formula for generating predictions\. Because linear regression is a long\-established statistical procedure, the properties of these models are well understood\. Linear models are also typically very fast to train\. The Linear node provides methods for automatic field selection in order to eliminate non\-significant input fields from the equation\. + +Note: In cases where the target field is categorical rather than a continuous range, such as yes/no or churn/don't churn, logistic regression can be used as an alternative\. Logistic regression also provides support for non\-numeric inputs, removing the need to recode these fields\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2e1f6d5703ce75af284903c20e5dbdfa1ae706b4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2e1f6d5703ce75af284903c20e5dbdfa1ae706b4.md new file mode 100644 index 0000000..40b4f18 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2e1f6d5703ce75af284903c20e5dbdfa1ae706b4.md @@ -0,0 +1,35 @@ +# Decision Optimization notebook tutorial + +# Solving and analyzing a model: the diet problem # + +This example shows you how to create and solve a Python\-based model by using a sample\. + +## Procedure ## + +To create and solve a Python\-based model by using a sample: + + + +1. Download and extract all the [DO\-samples](https://github.com/IBMDecisionOptimization/DO-Samples) on to your computer\. You can also download just the diet\.zip file from the Model\_Builder subfolder for your product and version, but in this case, do not extract it\. +2. Open your project or create an empty project\. +3. On the Manage tab of your project, select the Services and integrations section and click Associate service\. Then select an existing Machine Learning service instance (or create a new one ) and click Associate\. When the service is associated, a success message is displayed, and you can then close the Associate service window\. +4. Select the Assets tab\. +5. Select New asset > Solve optimization problems in the Work with models section\. +6. Click Local file in the Solve optimization problems window that opens\. +7. Browse to find the Model\_Builder folder in your downloaded DO\-samples\. Select the relevant product and version subfolder\. Choose the Diet\.zip file and click Open\. Alternatively use drag and drop\. +8. If you haven't already associated a Machine Learning service with your project, you must first select Add a Machine Learning service to select or create one before you choose a deployment space for your experiment\. +9. Click New deployment space, enter a name, and click Create (or select an existing space from the drop\-down menu)\. +10. Click **Create**\.A Decision Optimization model is created with the same name as the sample\. +11. In the Prepare data view, you can see the data assets imported\.These tables represent the min and max values for nutrients in the diet (`diet_nutrients`), the nutrients in different foods (`diet_food_nutrients`), and the price and quantity of specific foods (`diet_food`)\. + + ![Tables of input data in Prepare data view](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/images/Cloudpreparedata2.png) +12. Click Build model in the sidebar to view your model\.The Python model minimizes the cost of the food in the diet while satisfying minimum nutrient and calorie requirements\. + + ![Python model for diet problem displayed in Run model view](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/images/newrunmodel3.png) + + Note also how the **inputs** (tables in the Prepare data view) and the **outputs** (in this case the solution table to be displayed in the Explore solution view) are specified in this model. +13. Run the model by clicking the **Run** button in the Build model view\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2e2a2be1cb20ef0c663e591532d71cfb5637e57f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2e2a2be1cb20ef0c663e591532d71cfb5637e57f.md new file mode 100644 index 0000000..56a8035 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2e2a2be1cb20ef0c663e591532d71cfb5637e57f.md @@ -0,0 +1,9 @@ +# Streaming TCM node (SPSS Modeler) + +# Streaming TCM node # + +You can use this node to build and score temporal causal models in one step\. + +After adding a Streaming TCM node to your flow canvas, double\-click it to open the node properties\. To see information about the properties, hover over the tool\-tip icons\. For more information about temporal causal modeling, see [TCM node](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/tcm.html)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2ec85cf6ab5e5a276da78f1129ad3f1f5c92f5bb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2ec85cf6ab5e5a276da78f1129ad3f1f5c92f5bb.md new file mode 100644 index 0000000..3a26bff --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2ec85cf6ab5e5a276da78f1129ad3f1f5c92f5bb.md @@ -0,0 +1,122 @@ +# watsonx.governance generative AI quality evaluations + +# watsonx\.governance generative AI quality evaluations # + +You can use watsonx\.governance generative AI quality evaluations to measure how well your foundation model performs tasks\. + +When you [evaluate prompt templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-eval-prompt.html), you can review a summary of generative AI quality evaluation results for the following task types: + + + + * Text summarization + * Content generation + * Entity extraction + * Question answering + + + +The summary displays scores and violations for metrics that are calculated with default settings\. + +To configure generative AI quality evaluations with your own settings, you can set a minimum sample size and set threshold values for each metric as shown in the following example: + +![Configure generative AI quality evaluations](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-config-eval-settings.png) + +The minimum sample size indicates the minimum number of model transaction records that you want to evaluate and the threshold values create alerts when your metric scores violate your thresholds\. The metric scores must be higher than the lower threshold values to avoid violations\. Higher metric values indicate better scores\. + +## Supported generative AI quality metrics ## + +The following generative AI quality metrics are supported by watsonx\.governance: + + + + * ROUGE + + [ROUGE](https://github.com/huggingface/evaluate/tree/main/metrics/rouge) is a set of metrics that assess how well a generated summary or translation compares to one or more reference summaries or translations. The generative AI quality evaluation calculates the rouge1, rouge2, and rougeLSum metrics. - **Task types**: - Text summarization - Content generation - Question answering - Entity extraction - **Parameters**: - Use stemmer: If true, users Porter stemmer to strip word suffixes. Defaults to false. - **Thresholds**: - Lower bound: 0.8 - Upper boud: 1.0 + + + + + + * SARI + + [SARI](https://github.com/huggingface/evaluate/tree/main/metrics/sari) compares the predicted simplified sentences against the reference and the source sentences and explicitly measures the goodness of words that are added, deleted, and kept by the system. - **Task types**: - Text summarization - **Thresholds**: - Lower bound: 0 - Upper bound: 100 + + + + + + * METEOR + + [METEOR](https://github.com/huggingface/evaluate/tree/main/metrics/meteor) is calculated with the harmonic mean of precision and recall to capture how well-ordered the matched words in machine translations are in relation to human-produced reference translations. - **Task types**: - Text summarization - Content generation - **Parameters**: - Alpha: Controls relative weights of precision and recall + - Beta: Controls shape of penalty as a function of fragmentation. - Gamma: The relative weight assigned to fragmentation penalty. + - **Thresholds**: - Lower bound: 0 - Upper bound: 1 + + + + + + * Text quality + + Text quality evaluates the output of a model against [SuperGLUE](https://github.com/huggingface/evaluate/tree/af3c30561d840b83e54fc5f7150ea58046d6af69/metrics/super_glue) datasets by measuring the [F1 score](https://github.com/huggingface/evaluate/tree/main/metrics/f1), [precision](https://github.com/huggingface/evaluate/tree/main/metrics/precision), and [recall](https://github.com/huggingface/evaluate/tree/main/metrics/recall) against the model predictions and its ground truth data. It is calculated by normalizing the input strings and checking the number of similar tokens between the predictions and references. - **Task types**: - Text summarization - Content generation - **Thresholds**: - Lower bound: 0.8 - Upper bound: 1 + + + + + + * BLEU + + [BLEU](https://github.com/huggingface/evaluate/blob/main/metrics/bleu/README.md) evaluates the quality of machine-translated text when translated from one natural language to another by comparing individual translated segments to a set of reference translations. - **Task types**: - Text summarization - Content generation - Question answering - **Parameters**: - Max order: Maximum n-gram order to use when completing BLEU score - Smooth: Whether or not to apply Lin et al. 2004 smoothing - **Thresholds**: - Lower bound: 0.8 - Upper bound: 1 + + + + + + * Sentence similarity + + [Sentence similarity](https://huggingface.co/tasks/sentence-similarity#:~:text=Sentence%20Similarity%20is%20the%20task,similar%20they%20are%20between%20them) determines how similar two texts are by converting input texts into vectors that capture semantic information and calculating their similarity. It measures Jaccard similarity and Cosine similarity. - **Task types**: Text summarization - **Thresholds**: - Lower limit: 0.8 - Upper limit: 1 + + + + + + * PII + + [PII](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-entity-enhanced.html#rule-based-pii) measures if the provided content contains any personally identifiable information in the input and output data by using the Watson Natural Language Processing Entity extraction model. - **Task types**: - Text summarization - Content generation - Question answering - **Thresholds**: - Upper limit: 0 + + + + + + * HAP + + HAP measures if there is any toxic content in the input data provided to the model, and also any toxic content in the model generated output. - **Task types**: - Text summarization - Content generation - Question answering - **Thesholds** - Upper limit: 0 + + + + + + * Readability + + The readability score determines the readability, complexity, and grade level of the model's output. - **Task types**: - Text summarization - Content generation - **Thresholds**: - Lower limit: 60 + + + + + + * Exact match + + [Exact match](https://github.com/huggingface/evaluate/tree/main/metrics/exact_match) returns the rate at which the input predicted strings exactly match their references. - **Task types**: - Question answering - Entity extraction - **Parameters**: - Regexes to ignore: Regex expressions of characters to ignore when calculating the exact matches. - Ignore case: If True, turns everything to lowercase so that capitalization differences are ignored. - Ignore punctuation: If True, removes punctuation before comparing strings. - Ignore numbers: If True, removes all digits before comparing strings. - **Thresholds**: - Lower limit: 0.8 - Upper limit: 1 + + + + + + * Multi\-label/class metrics + + Multi-label/class metrics measure model performance for multi-label/multi-class predictions. - **Metrics**: - Micro F1 score - Macro F1 score - Micro precision - Macro precision - Micro recall - Macro recall - **Task types**: Entity extraction - **Thresholds**: - Lower limit: 0.8 - Upper limit: 1 + + + +**Parent topic:**[Configuring model evaluations](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-monitors-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2ed4d7860687b2ef6f85ff81b6af4cfd2c6ea839.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2ed4d7860687b2ef6f85ff81b6af4cfd2c6ea839.md new file mode 100644 index 0000000..c04a374 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2ed4d7860687b2ef6f85ff81b6af4cfd2c6ea839.md @@ -0,0 +1,27 @@ +# Creating the flow (SPSS Modeler) + +# Creating the flow # + + + +1. Create a new flow and add a Data Asset node that points to catalog\_seasfac\.csv\. +2. Connect a Type node to the Data Asset node and double\-click it to open its properties\. +3. Click Read Values\. For the `men` field, set the role to Target\. + + Figure 1. Specifying the target field + + ![Specifying the target field](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_forecast_fields.png) +4. Set the role for all other fields to `None` and click `Save`\. +5. Attach a Time Plot graph node to the Type node and double\-click it\. + + Figure 2. Plotting the time series + + ![Plotting the time series](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_forecast_plot.png) +6. For the Plot, add the field `men` to the Series list\. +7. Select Use custom x axis field label and select `date`\. +8. Deselect the Normalize option and click Save\. +9. Run the flow\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2ee7bf839ffa16ec1a7f9ed82662efe539fd29c2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2ee7bf839ffa16ec1a7f9ed82662efe539fd29c2.md new file mode 100644 index 0000000..1a0f775 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2ee7bf839ffa16ec1a7f9ed82662efe539fd29c2.md @@ -0,0 +1,202 @@ +# Run the built-in sample pipeline + +# Run the built\-in sample pipeline # + +You can view and run a built\-in sample pipeline that uses sample data to learn how to automate machine learning flows in Watson Pipelines\. + +## What's happening in the sample pipeline? ## + +The sample pipeline gets training data, trains a machine learning model by using the AutoAI tool, and selects the best pipeline to save as a model\. The model is then copied to a deployment space where it is deployed\. + +The sample illustrates how you can automate an end\-to\-end flow to make the lifecycle easier to run and monitor\. + +The sample pipeline looks like this: + +![Sample orchestration pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/oflow-tutorial1.png) + +The tutorial steps you through this process: + + + +1. [Prerequisites](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-sample.html?context=cdpaas&locale=en#set-up) +2. [Preview creating and running the sample pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-sample.html?context=cdpaas&locale=en#preview) +3. [Creating the sample pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-sample.html?context=cdpaas&locale=en#create-sample) +4. [Running the sample pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-sample.html?context=cdpaas&locale=en#run-flow) +5. [Reviewing the results](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-sample.html?context=cdpaas&locale=en#review-results) +6. [Exploring the sample nodes and configuration](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-sample.html?context=cdpaas&locale=en#explore-sample) + + + +## Prerequisites ## + +To run this sample, you must first create: + + + + * A [project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html), where you can run the sample pipeline\. + * A [deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-create.html), where you can view and test the results\. The deployment space is required to run the sample pipeline\. + + + +## Preview creating and running the sample pipeline ## + +Watch this video to see how to create and run a sample pipeline\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Creating the sample pipeline ## + +Create the sample pipeline in the Pipelines editor\. + + + +1. Open the project where you want to create the pipeline\. +2. From the *Assets* tab, click **New asset > Automate model lifecycle**\. +3. Click the **Samples** tab, and select the **Orchestrate an AutoAI experiment**\. +4. Enter a name for the pipeline\. For example, enter *Bank marketing sample*\. +5. Click **Create** to open the canvas\. + + + +## Running the sample pipeline ## + +To run the sample pipeline: + + + +1. Click **Run pipeline** on the canvas toolbar, then choose **Trial run**\. +2. Select a deployment space when prompted to provide a value for the *deployment\_space* pipeline parameter\. + + + + 1. Click **Select Space**. + 2. Expand the **Spaces** section. + 3. Select your deployment space. + 4. Click **Choose**. + + + +3. Provide an API key if it is your first time to run a pipeline\. Pipeline assets use your personal IBM Cloud API key to run operations securely without disruption\. + + + + * If you have an existing API key, click **Use existing API key**, paste the API key, and click **Save**. + * If you don't have an existing API key, click **Generate new API key**, provide a name, and click **Save**. Copy the API key, and then save the API key for future use. When you're done, click **Close**. + + + +4. Click **Run** to start the pipeline\. + + + +## Reviewing the results ## + +When the pipeline run completes, you can view the output to see the results\. + +![Sample pipeline run output](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/oflow-results1.png) + +Open the deployment space that you specified as part of the pipeline\. You see the new deployment in the space: + +![Sample pipeline deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/oflow-results-space.png) + +If you want to test the deployment, use the deployment space **Test** page to submit payload data in JSON format and get a score back\. For example, click the **JSON** tab and enter this input data: + + {"input_data": [{"fields": "age","job","marital","education","default","balance","housing","loan","contact","day","month","duration","campaign","pdays","previous","poutcome"],"values": "30","unemployed","married","primary","no","1787","no","no","cellular","19","oct","79","1","-1","0","unknown"]]}]} + +When you click **Predict**, the model generates output with a confidence score for the prediction of whether a customer subscribes to a term deposit promotion\. + +![Prediction score for the sample model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/oflow-gall-sample-output.png) + +In this case, the prediction of "no" is accompanied by a confidence score of close to 95%, predicting that the client will most likely not subscribe to a term deposit\. + +## Exploring the sample nodes and configuration ## + +Get a deeper understanding of how the sample nodes were configured to work in concert in the pipeline sample\. + +### Viewing the pipeline parameter ### + +A pipeline parameter specifies a setting for the entire pipeline\. In the sample pipeline, a pipeline parameter is used to specify a deployment space where the model that is saved from the AutoAI experiment is stored and deployed\. You are prompted to select the deployment space the pipeline parameter links to\. + +Click the Global objects icon ![global objects icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/global-objects-icon.png) on the canvas toolbar to view or create pipeline parameters\. In the sample pipeline, the pipeline parameter is named *deployment\_space* and is of type *Space*\. Click the name of the pipeline parameter to view the details\. In the sample, the pipeline parameter is used with the **Create data file** node and the **Create AutoAI experiment** node\. + +![Flow parameter to specify deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/oflow-flow-param3.png) + +### Loading the training data for the AutoAI experiment ### + +In this step, a **Create data file** node is configured to access the data set for the experiment\. Click the node to view the configuration\. The data file is `bank-marketing-data.csv`, which provides sample data to predict whether a bank customer signs up for a term deposit\. The data rests in a Cloud Object Storage bucket and can be refreshed to keep the model training up to date\. + + + +| Option | Value | +| ------------ | ----------------------------------------------------------------------------------------------------------------- | +| File | The location of the data asset for training the AutoAI experiment\. In this case, the data file is in a project\. | +| File path | The name of the asset, `bank-marketing-data.csv`\. | +| Target scope | For this sample, the target is a deployment space\. | + + + +### Creating the AutoAI experiment ### + +The node to **Create AutoAI experiment** is configured with these values: + + + +| Option | Value | +| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| AutoAI experiment name | onboarding\-bank\-marketing\-prediction | +| Scope | For this sample, the target is a deployment space\. | +| Prediction type | binary | +| Prediction column (label) | y | +| Positive class | yes | +| Training data split ration | 0\.9 | +| Algorithms to include | GradientBoostingClassifierEstimator
XGBClassifierEstimator | +| Algorithms to use | 1 | +| Metric to optimize | ROC AUC | +| Optimize metric (optional) | *default* | +| Hardware specification (optional) | *default* | +| AutoAI experiment description | This experiment uses a sample file, which contains text data that is collected from phone calls to a Portuguese bank in response to a marketing campaign\. The classification goal is to predict whether a client subscribes to a term deposit, represented by variable y\. | +| AutoAI experiment tags (optional) | *none* | +| Creation mode (optional) | *default* | + + + +Those options define an experiment that uses the bank marketing data to predict whether a customer is likely to enroll in a promotion\. + +### Running the AutoAI experiment ### + +In this step, the **Run AutoAI experiment** node runs the AutoAI experiment *onboarding\-bank\-marketing\-prediction*, trains the pipelines, then saves the best model\. + + + +| Option | Value | +| ----------------------------- | --------------------------------------------------------------------------------------------------- | +| AutoAI experiment | Takes the output from the **Create AutoAI** node as the input to run the experiment\. | +| Training data assets | Takes the output from the **Create Data File** node as the training data input for the experiment\. | +| Model count | 1 | +| Holdout data asset (optional) | *none* | +| Models count (optional) | 3 | +| Run name (optional) | *none* | +| Model name prefix (optional) | *none* | +| Run description (optional) | *none* | +| Run tags (optional) | *none* | +| Creation mode (optional) | *default* | +| Error policy (optional) | *default* | + + + +### Deploying the model to a web service ### + +The **Create Web deployment** node creates an online deployment that is named *onboarding\-bank\-marketing\-prediction\-deployment* so you can deliver data and get predictions back in real time from the REST API endpoint\. + + + +| Option | Value | +| --------------- | ------------------------------------------------------------------------------------------------ | +| ML asset | Takes the best model output from the **Run AutoAI** node as the input to create the deployment\. | +| Deployment name | onboarding\-bank\-marketing\-prediction\-deployment | + + + +**Parent topic:**[IBM Watson Pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2ef8007555bc60cd700ba44ecc0fafaa024f4bc0.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2ef8007555bc60cd700ba44ecc0fafaa024f4bc0.md new file mode 100644 index 0000000..52dfd44 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2ef8007555bc60cd700ba44ecc0fafaa024f4bc0.md @@ -0,0 +1,29 @@ +# {{ document.title.text }} + +# Jailbreaking # + +![icon for multi\-category risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-multi-category.svg)Risks associated with inputInferenceMulti\-categoryAmplified + +### Description ### + +An attack that attempts to break through the guardrails established in the model is known as jailbreaking\. + +### Why is jailbreaking a concern for foundation models? ### + +Jailbreaking attacks can be used to alter model behavior and benefit the attacker\. If not properly controlled, business entities can face fines, reputational harm, and other legal consequences\. + +Example + +#### Bypassing LLM guardrails #### + +Cited in a [study](https://arxiv.org/abs/2307.15043) from researchers at Carnegie Mellon University, The Center for AI Safety, and the Bosch Center for AI, claims to have discovered a simple prompt addendum that allowed the researchers to trick models into answering dangerous or sensitive questions and is simple enough to be automated and used for a wide range of commercial and open\-source products, including ChatGPT, Google Bard, Meta’s LLaMA, Vicuna, Claude, and others\. According to the paper, the researchers were able to use the additions to reliably coax forbidden answers for Vicuna (99%), ChatGPT 3\.5 and 4\.0 (up to 84%), and PaLM\-2 (66%)\. + +Sources: + +[SC Magazine, July 2023](https://www.scmagazine.com/news/researchers-find-universal-jailbreak-prompts-for-multiple-ai-chat-models) + +[The New York Times, July 2023](https://www.nytimes.com/2023/07/27/business/ai-chatgpt-safety-research.html) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2f88cc7897776ead3f1a7052a740701b8e1a6969.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2f88cc7897776ead3f1a7052a740701b8e1a6969.md new file mode 100644 index 0000000..c1bf40a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/2f88cc7897776ead3f1a7052a740701b8e1a6969.md @@ -0,0 +1,21 @@ +# setglobalsnode properties + +# setglobalsnode properties # + +![Set Globals node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/setglobalsnodeicon.png)The Set Globals node scans the data and computes summary values that can be used in CLEM expressions\. For example, you can use this node to compute statistics for a field called `age` and then use the overall mean of `age` in CLEM expressions by inserting the function `@GLOBAL_MEAN(age)`\. + + + +setglobalsnode properties + +Table 1\. setglobalsnode properties + +| `setglobalsnode` properties | Data type | Property description | +| --------------------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `globals` | `[Sum Mean Min Max SDev]` | Structured property where fields to be set must be referenced with the following syntax: `node.setKeyedPropertyValue( "globals", "Age", ["Max", "Sum", "Mean", "SDev"])` | +| `clear_first` | *flag* | | +| `show_preview` | *flag* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3094e343d06da6ae0d0d5d4865c7b0d806dc61a1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3094e343d06da6ae0d0d5d4865c7b0d806dc61a1.md new file mode 100644 index 0000000..2d23f67 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3094e343d06da6ae0d0d5d4865c7b0d806dc61a1.md @@ -0,0 +1,6 @@ +# Multi-chart charts + +# Multi\-chart charts # + +Multi\-chart charts provide options for creating multiple charts\. The charts can be of the same or different types, and can include different variables from the same data set\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/30a8256a4972314da32827a081b7541138b454a9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/30a8256a4972314da32827a081b7541138b454a9.md new file mode 100644 index 0000000..d5fc513 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/30a8256a4972314da32827a081b7541138b454a9.md @@ -0,0 +1,44 @@ +# Creating Synthetic data + +# Creating Synthetic data # + +Use the graphical flow editor tool *Synthetic Data Generator* to generate synthetic tabular data based on production data or a custom data schema using visual flows and modeling algorithms\. + +To create synthetic data, the first option is to use the *Synthetic Data Generator* graphical flow editor tool to *mask* and *mimic* production data, and then to load the result into a different location\. + +The second option is to use the *Synthetic Data Generator* graphical flow editor to *generate* synthetic data from a custom data schema using visual flows and modeling algorithms\. + +This image shows an overview of the *Synthetic Data Generator* graphical flow editor\. ![Synthetic Data Generator overview](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/sd-overview.png) + +**Data format** Learn more about [Creating synthetic data from imported data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/import_data_sd.html)\. + +**Data size** : The *Synthetic Data Generator* environment can import up to ~2\.5GB of data\. + +## Prerequisites ## + +Before you can create synthetic data, you need [to create a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html)\. + +## Create synthetic data ## + +1\. Access the *Synthetic Data Generator* tool from within a project\. To select a new asset, open a tool, and create an asset, click **New asset**\. + +2\. Select **All > Prepare Data > Generate synthetic tabular data** from the *What do you want to do?* window\. ![What do you want to do window](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/sd-what-do-you-want.png) + +3\. The **Generate synthetic tabular data** window opens\. Add a name for the asset and a description (optional)\. Click **Create**\. The flow will open and it might take a minute to create a new session for the flow\. ![Generate synthetic tabular data flow asset](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/sd-generate-synthetic-tabular-data-flow-asset.png) + +4\. The **Welcome to Synthetic Data Generator** wizard opens\. You can choose to get started as a first time or experienced user\. +![Synthetic Data Generator Get started wizard](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/sd-wizard.png) + +5\. If you choose to get started as a first time user, the **Generate synthetic tabular data flow** window opens\. ![Generate synthetic tabular data flow window](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/sd-mimic-mask-flow.png) + +## Learn more ## + + + + * [Creating synthetic data from production data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/mask_mimic_data_sd.html) + * [Creating synthetic data from a custom data schema](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/generate_data_sd.html) + * Try the [Generate synthetic tabular data tutorial](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-generate-data.html) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/312e91752782553d39c335d0daaf189025739bb4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/312e91752782553d39c335d0daaf189025739bb4.md new file mode 100644 index 0000000..d1b468d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/312e91752782553d39c335d0daaf189025739bb4.md @@ -0,0 +1,28 @@ +# Decision Optimization Modeling Assistant models + +# Modeling Assistant models # + +You can model and solve Decision Optimization problems using the Modeling Assistant (which enables you to formulate models in natural language)\. This requires little to no knowledge of Operational Research (OR) and does not require you to write Python code\. The Modeling Assistant is **only available in English** and is not globalized\. + +The basic workflow to create a model with the Modeling Assistant and examine it under different scenarios is as follows: + + + +1. Create a project\. +2. Add a Decision Optimization experiment (a scenario is created by default in the experiment UI)\. +3. Add and import your data into the scenario\. +4. Create a natural language model in the scenario, by first selecting your decision domain and then using the Modeling Assistant to guide you\. +5. Run the model to solve it and explore the solution\. +6. Create visualizations of solution and data\. +7. Copy the scenario and edit the model and/or the data\. +8. Solve the new scenario to see the impact of these changes\. + + + +![Workflow showing the previously mentioned steps](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/images/new_overviewcognitive-3.jpg) + +This is demonstrated with a simple [planning and scheduling example ](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/exhousebuild.html#cogusercase)\. + +For more information about deployment see \. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/315971ae6c6a4eede13e9e1449b2a36f548b928f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/315971ae6c6a4eede13e9e1449b2a36f548b928f.md new file mode 100644 index 0000000..6573000 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/315971ae6c6a4eede13e9e1449b2a36f548b928f.md @@ -0,0 +1,49 @@ +# Deleting a deployment + +# Deleting a deployment # + +Delete your deployment when you no longer need it to free up resources\. You can delete a deployment from a deployment space, or programmatically, by using the Python client or Watson Machine Learning APIs\. + +## Deleting a deployment from a space ## + +To remove a deployment: + + + +1. Open the **Deployments** page of your deployment space\. +2. Choose **Delete** from the action menu for the deployment name\. + ![Deleting a deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/deploy-delete.png) + + + +## Deleting a deployment by using the Python client ## + +Use the following method to delete the deployment\. + + client.deployments.delete(deployment_uid) + +Returns a `SUCCESS` message\. To check that the deployment was removed, you can list deployments and make sure that the deleted deployment is no longer listed\. + + client.deployments.list() + +Returns: + + ---- ---- ----- ------- ------------- + GUID NAME STATE CREATED ARTIFACT_TYPE + ---- ---- ----- ------- ------------- + +## Deleting a deployment by using the REST API ## + +Use the `DELETE` method for deleting a deployment\. + + DELETE /ml/v4/deployments/{deployment_id} + +For more information, see [Delete](https://cloud.ibm.com/apidocs/machine-learning#deployments-delete)\. + +For example, see the following code snippet: + + curl --location --request DELETE 'https://us-south.ml.cloud.ibm.com/ml/v4/deployments/:deployment_id?space_id=&version=2020-09-01' + +**Parent topic:**[Managing predictive deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/316974f0a70ee2199bf6cd912e62bfb53d200f0a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/316974f0a70ee2199bf6cd912e62bfb53d200f0a.md new file mode 100644 index 0000000..8795bd7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/316974f0a70ee2199bf6cd912e62bfb53d200f0a.md @@ -0,0 +1,190 @@ +# Quick start: Build and deploy a machine learning model in a Jupyter notebook + +# Quick start: Build and deploy a machine learning model in a Jupyter notebook # + +You can create, train, and deploy machine learning models with Watson Machine Learning in a Jupyter notebook\. Read about the Jupyter notebooks, then watch a video and take a tutorial that’s suitable for intermediate users and requires coding\. + +**Required services** : Watson Studio : Watson Machine Learning + +Your basic workflow includes these tasks: + + + +1. Open your sandbox project\. Projects are where you can collaborate with others to work with data\. +2. Add a notebook to the project\. You can create a blank notebook or import a notebook from a file or GitHub repository\. +3. Add code and run the notebook\. +4. Review the model pipelines and save the desired pipeline as a model\. +5. Deploy and test your model\. + + + +## Read about Jupyter notebooks ## + +A Jupyter notebook is a web\-based environment for interactive computing\. If you choose to build a machine learning model in a notebook, you should be comfortable with coding in a Jupyter notebook\. You can run small pieces of code that process your data, and then immediately view the results of your computation\. Using this tool, you can assemble, test, and run all of the building blocks you need to work with data, save the data to Watson Machine Learning, and deploy the model\. + +[Read more about training models in notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-samples-overview.html) + +[Learn about other ways to build models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-science.html) + +## Watch a video about creating a model in a Jupyter notebook ## + +![Watch Video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) Watch this video to see how to train, deploy, and test a machine learning model in a Jupyter notebook\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Try a tutorial to create a model in a Jupyter notebook ## + +In this tutorial, you will complete these tasks: + + + + * [Task 1: Open a project\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html?context=cdpaas&locale=en#step01) + * [Task 2: Add a notebook to your project\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html?context=cdpaas&locale=en#step02) + * [Task 3: Set up the environment\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html?context=cdpaas&locale=en#step03) + * [Task 4: Run the notebook:](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html?context=cdpaas&locale=en#step04) + + + + * Build and train a model. + * Save a pipeline as a model. + * Deploy the model. + * Test the deployed model. + + + + * [Task 5: View and test the deployed model in the deployment space\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html?context=cdpaas&locale=en#step05) + + + + + + * [(Optional) Clean up\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html?context=cdpaas&locale=en#step06) + + + +This tutorial will take approximately 30 minutes to complete\. + +### Sample data ### + +The sample data used in this tutorial is from data that is part of **scikit\-learn** and will be used to train a model to recognize images of hand\-written digits, from 0\-9\. + +Expand all sections + + + + * Tips for completing this tutorial + + \#\#\# Use the video picture-in-picture Tip: Start the video, then as you scroll through the tutorial, the video moves to picture-in-picture mode. Close the video table of contents for the best experience with picture-in-picture. You can use picture-in-picture mode so you can follow the video as you complete the tasks in this tutorial. Click the timestamps for each task to follow along.The following animated image shows how to use the video picture-in-picture and table of contents features: ![How to use picture-in-picture and chapters](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/pip-and-chapters.gif)\{: width="560px" height="315px" data-tearsheet="this"\} \#\#\# Get help in the community If you need help with this tutorial, you can ask a question or find an answer in the [Cloud Pak for Data Community discussion forum](https://community.ibm.com/community/user/cloudpakfordata/communities/community-home/digestviewer?communitykey=c0c16ff2-10ef-4b50-ae4c-57d769937235)\{: new\_window\}. \#\#\# Set up your browser windows For the optimal experience completing this tutorial, open Cloud Pak for Data in one browser window, and keep this tutorial page open in another browser window to switch easily between the two applications. Consider arranging the two browser windows side-by-side to make it easier to follow along. ![Side-by-side tutorial and UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/tutorial-side-by-side.png)\{: width="560px" height="315px" data-tearsheet="this"\} Tip: If you encounter a guided tour while completing this tutorial in the user interface, click **Maybe later**. + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 1: Open a project + + You need a project to store the data and the AutoAI experiment. You can use your sandbox project or create a project. 1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg)\{: iih\}, choose **Projects > View all projects** 1. Open your sandbox project. If you want to use a new project: 1. Click **New project**. 1. Select **Create an empty project**. 1. Enter a name and optional description for the project. 1. Choose an existing [object storage service instance](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/storage-options.html)\{: new\_window\} or create a new one. 1. Click **Create**. 1. When the project opens, click the **Manage** tab and select the **Services and integrations** page. ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:07. 1. On the *IBM services* tab, click **Associate service**. 1. Select your Watson Machine Learning instance. If you don't have a Watson Machine Learning service instance provisioned yet, follow these steps: 1. Click **New service**. 1. Select **Watson Machine Learning**. 1. Click **Create**. 1. Select the new service instance from the list. 1. Click **Associate service**. 1. If necessary, click **Cancel** to return to the *Services & Integrations* page. For more information or to watch a video, see [Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html)\{: new\_window\}. + For more information on associated services, see [Adding associated services](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assoc-services.html)\{: new\_window\}. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the new project. + + ![The following image shows the new project.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook-new-project.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 2: Add a notebook to your project + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:18. You will use a sample notebook in this tutorial. Follow these steps to add the sample notebook to your project: 1. Access the [Use sckit-learn to recognize hand-written digits notebook](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/e20607d75c8473daaade1e77c21717d4)\{: new\_window\} in the *Samples*. 1. Click **Add to project**. 1. Select the project from the list, and click **Add**. 1. Verify the notebook name and description (optional). 1. Select a runtime environment for this notebook. 1. Click **Create**. Wait for the notebook editor to load. 1. From the menu, click **Kernel > Restart & Clear Output**, then confirm by clicking **Restart and Clear All Outputs** to clear the output from the last saved run. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the new notebook. + + ![The following image shows the new notebook.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook-new-notebook.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 3: Set up the environment + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:44. The first section in the notebook sets up the environment by specifying your IBM Cloud credentials and Watson Machine Learning service instance location. Follow these steps to set up the environment in your notebook: 1. Scroll to the *Set up the environment* section. 1. Choose a method to obtain the API key and location. - Run the IBM Cloud CLI commands in the notebook from a command prompt. - Use the IBM Cloud console. 1. Launch the [API keys section in the IBM Cloud Console](https://cloud.ibm.com/iam/apikeys)\{: new\_window\}, and [create an API key](https://cloud.ibm.com/docs/account?topic=account-userapikey&interface=ui#create_user_key)\{: new\_window\}. 1. Access your [IBM Cloud resource list](https://cloud.ibm.com/resources)\{: new\_window\}, view your Watson Machine Learning service instance, and note the *Location*. 1. See the Watson Machine Learning [API Docs](https://cloud.ibm.com/apidocs/machine-learning)\{: new\_window\} for the correct endpoint URL. For example, Dallas is in us-south. 1. Paste your API key and location into cell 1. 1. Run cells 1 and 2. 1. Run cell 3 to install the `ibm-watson-machine-learning` package. 1. Run cell 4 to import the API client and create the API client instance using your credentials. 1. Run cell 5 to see a list of all existing deployment spaces. If you do not have a deployment space, then follow these steps: 1. Open another tab with your watsonx deployment. 1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg)\{: iih\}, click **Deployments**. 1. Click **New deployment space**. 1. Add a name and optional description for the deployment. 1. Click **Create**, then **View new space**. 1. Click the **Manage** tab. 1. Copy the **Space GUID** and close the tab, this value will be your `space_id`. 1. Copy and paste the appropriate deployment space ID into cell 6, then run cell 6 and cell 7 to set the default space. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the notebook with all of the environment variables set up. + + ![The following image shows the notebook with all of the environment variables set up.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook-cell07.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 4: Run the notebook + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 02:14. Now that all of the environment variables are set up, you can run the rest of the cells in the notebook. Follow these steps to read through the comments, run the cells, and review the output: 1. Run the cells in the *Explore data* section. 1. Run the cells in the *Create a scikit-learn model* section to. 1. Prepare the data by splitting it into three data sets (train, test, and score). 1. Create the pipeline. 1. Train the model. 1. Evaluate the model using the test data. 1. Run the cells in the *Publish model* section to publish the model, get model details, and get all models. 1. Run the cells in the *Create model deployment* section. 1. Run the cells in the *Get deployment details* section. 1. Run the cells in the *Score* section*, which sends a scoring request to the deployed model and shows the prediction. 1. Click \*File > Save* to save the notebook and its output. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the notebook with the prediction. + + ![The following image shows the notebook with the prediction.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook-prediction.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 5: View and test the deployed model in the deployment space + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 04:07. You can also view the model deployment directly from the deployment space. Follow these steps to test the deployed model in the space. 1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg)\{: iih\}, click **Deployments**. 1. Click the **Spaces** tab. 1. Select the appropriate deployment space from the list. 1. Click **Scikit model**. 1. Click **Deployment of scikit model**. 1. Review the *Endpoint* and *Code snippets*. 1. Click the **Test** tab. You can test the deployed model by pasting the following JSON code: `json {"input_data": [{"values": 0.0, 0.0, 5.0, 16.0, 16.0, 3.0, 0.0, 0.0, 0.0, 0.0, 9.0, 16.0, 7.0, 0.0, 0.0, 0.0, 0.0, 0.0, 12.0, 15.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 15.0, 16.0, 15.0, 4.0, 0.0, 0.0, 0.0, 0.0, 9.0, 13.0, 16.0, 9.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 14.0, 12.0, 0.0, 0.0, 0.0, 0.0, 5.0, 12.0, 16.0, 8.0, 0.0, 0.0, 0.0, 0.0, 3.0, 15.0, 15.0, 1.0, 0.0, 0.0], 0.0, 0.0, 6.0, 16.0, 12.0, 1.0, 0.0, 0.0, 0.0, 0.0, 5.0, 16.0, 13.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.0, 5.0, 15.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 8.0, 15.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 13.0, 13.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.0, 16.0, 9.0, 4.0, 1.0, 0.0, 0.0, 3.0, 16.0, 16.0, 16.0, 16.0, 10.0, 0.0, 0.0, 5.0, 16.0, 11.0, 9.0, 6.0, 2.0]]}]}` 1. Click **Predict**. The resulting prediction indicates that the hand-written digits are 5 and 4. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the *Test* tab with the prediction. + + ![The following image shows the \*Test\* tab with the prediction.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook-test-tab.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html?context=cdpaas&locale=en#video-preview) + + + + + + * (Optional) Task 6: Clean up + + If you'd like to remove all of the assets created by the notebook, create a new notebook based on the [Machine Learning artifacts management notebook](https://github.com/IBM/watson-machine-learning-samples/blob/master/cloud/notebooks/python_sdk/instance-management/Machine%20Learning%20artifacts%20management.ipynb)\{: new\_window\}. A link to this notebook is also available in the **Clean up** section of the *Use scikit-learn to recognize hand-written digits notebook* used in this tutorial. + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html?context=cdpaas&locale=en#video-preview) + + + +## Next steps ## + +Now you can use this data set for further analysis\. For example, you or other users can do any of these tasks: + + + + * [Cleansing and shaping data](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html) + * [Analyze the data in a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html) + + + +## Additional resources ## + + + + * Try these other methods to build models: + + + + * [Build and deploy a machine learning model with AutoAI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html) + * [Build and deploy a machine learning model with SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html) + * [Build and deploy a Decision Optimization model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html) + + + + * View more [videos](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html)\. + * Find sample data sets, projects, models, prompts, and notebooks in the Samples to gain hands\-on experience: + + ![Notebook icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook.svg)[Notebooks](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=notebook) that you can add to your project to get started analyzing data and building models. + + ![Project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/ibm-cloud--projects.svg)[Projects](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=project-template) that you can import containing notebooks, data sets, prompts, and other assets. + + ![Data set icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/data--set.svg)[Data sets](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=dataset) that you can add to your project to refine, analyze, and build models. + + ![Prompt icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/prompt.svg)[Prompts](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=example-prompt) that you can use in the Prompt Lab to prompt a foundation model. + + ![Model icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/model.svg)[Foundation models](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=foundation-model) that you can use in the Prompt Lab. + * Find more [Python client samples and examples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-samples-overview.html)\. + + + +**Parent topic:**[Quick start tutorials](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/31a670d6b3f0d7ab4ead7dae3795589f161249de.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/31a670d6b3f0d7ab4ead7dae3795589f161249de.md new file mode 100644 index 0000000..28a4dcc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/31a670d6b3f0d7ab4ead7dae3795589f161249de.md @@ -0,0 +1,12 @@ +# The Categories tab (SPSS Modeler) + +# The Categories tab # + +In the Text Analytics Workbench, you can use the Categories tab to create and explore categories as well as tweak the extraction results\. + +Extraction results can be refined by modifying the linguistic resources, which you can do directly from the Categories tab\. + +Figure 1\. Categories tab + +![Categories tab](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tmwb_categoryview.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/32217f5f0dee4a95c64b2bd92c25366706cc7e0c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/32217f5f0dee4a95c64b2bd92c25366706cc7e0c.md new file mode 100644 index 0000000..56988d9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/32217f5f0dee4a95c64b2bd92c25366706cc7e0c.md @@ -0,0 +1,5 @@ +# Databases for EDB on IBM watsonx + +# Databases for EDB on IBM watsonx # + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/322e404e76067637f1d0afdf44cbe309c2a53221.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/322e404e76067637f1d0afdf44cbe309c2a53221.md new file mode 100644 index 0000000..4c7073c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/322e404e76067637f1d0afdf44cbe309c2a53221.md @@ -0,0 +1,33 @@ +# Accessibility features in IBM watsonx content and documentation + +# Accessibility features in IBM watsonx content and documentation # + +IBM is committed to accessibility\. Accessibility features that follow compliance guidelines are included in IBM watsonx content and documentation to benefit users with disabilities\. Parts of the user interface of IBM watsonx are accessible, but not entirely\. Only documentation is compliant, with a subset of parts of the overall product\. + +IBM watsonx documentation uses the latest W3C Standard, [WAI\-ARIA 1\.0](https://www.w3.org/TR/wai-aria/) to ensure compliance with the [United States Access Board Section 508 Standards](https://www.access-board.gov/ict/), and the [ Web Content Accessibility Guidelines (WCAG) 2\.0](https://www.w3.org/TR/WCAG20/)\. + +The IBM watsonx online product documentation is enabled for accessibility\. Accessibility features help users who have a disability, such as restricted mobility or limited vision, to use information technology products successfully\. Documentation is provided in HTML so that it is easily accessible through assistive technology\. With the accessibility features of IBM watsonx, you can do the following tasks: + + + + * Use screen\-reader software and digital speech synthesizers to hear what is displayed on the screen\. Consult the product documentation of the assistive technology for details on using assistive technologies with HTML\-based information\. + * Use screen magnifiers to magnify what is displayed on the screen\. + * Operate specific or equivalent features by using only the keyboard\. + + + +For more information about the commitment that IBM has to accessibility, see [IBM Accessibility](http://www.ibm.com/able)\. + +## TTY service ## + +In addition to standard IBM help desk and support websites, IBM has established a TTY telephone service for use by deaf or hard of hearing customers to access sales and support services: + +800\-IBM\-3383 (800\-426\-3383) within North America + +## Additional interface information ## + +The IBM watsonx user interfaces do not have content that flashes 2 \- 55 times per second\. + +The IBM watsonx web user interfaces rely on cascading stylesheets to render content properly and to provide a usable experience\. If you are a low\-vision user, you can adjust your operating system display settings, and use settings such as high contrast mode\. You can control font size by using the device or web browser settings\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/323360f59c9e5c3d6be4b7cd36927c23c0dfa268.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/323360f59c9e5c3d6be4b7cd36927c23c0dfa268.md new file mode 100644 index 0000000..b484445 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/323360f59c9e5c3d6be4b7cd36927c23c0dfa268.md @@ -0,0 +1,66 @@ +# IBM Data Virtualization Manager for z/OS connection + +# IBM Data Virtualization Manager for z/OS connection # + +To access your data in Data Virtualization Manager for z/OS, create a connection asset for it\. + +Use the Data Virtualization Manager for z/OS connection to access data in your z/OS mainframe environment\. + +## Supported versions ## + +IBM Data Virtualization Manager for z/OS 1\.1\.0 + +## Create a connection to Data Virtualization Manager for z/OS ## + +To create the connection asset, you need these connection details: + + + + * Hostname or IP address + * Port number + * Username and password + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Data Virtualization Manager for z/OS connections in the following workspaces and tools: + + + + * Data Refinery + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/323d19f0757433758d1743b0a62dacc98d286ec5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/323d19f0757433758d1743b0a62dacc98d286ec5.md new file mode 100644 index 0000000..f1e7a39 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/323d19f0757433758d1743b0a62dacc98d286ec5.md @@ -0,0 +1,143 @@ +# Signing up for IBM watsonx as a Service + +# Signing up for IBM watsonx as a Service # + +IBM watsonx as a Service contains two components: watsonx\.ai and watsonx\.governance\. You can sign up for a personal version of either watsonx\.ai or watsonx\.governance at no initial cost, or sign up through an email invitation to join your organization's account\. Watsonx\.ai provides all the tools that you need to work with foundation models and machine learning models\. Watsonx\.governance provides the tools that you need to govern models\. + +After you sign up for the watsonx\.ai, you can add the watsonx\.governance component from the services catalog\. If you sign up for watsonx\.governance, watsonx\.ai is included automatically\. + + + + * [Signing up for a personal account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/signup-wx.html?context=cdpaas&locale=en#personal) + * [Signing up for your organization's account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/signup-wx.html?context=cdpaas&locale=en#orgacct) + * [Switching to your organization's account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/signup-wx.html?context=cdpaas&locale=en#switching) + * [Logging in using IBM App ID (beta)](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/signup-wx.html?context=cdpaas&locale=en#appid) + + + +## Signing up for a personal account ## + +When you sign up for watsonx\.ai or watsonx\.governance, you need an IBMid for an IBM Cloud account\. If you don't already have an IBMid, you can create one while you sign up for watsonx\.ai or watsonx\.governance\. For your IBM Cloud account, you enter your email address, personal information, and credit card information, which is used to verify your identity\. You are charged only if you upgrade to a billable plan and then consume billable services\. Lite plans do not incur charges\. + +The free version of watsonx\.ai contains Lite plans for the IBM Watson Studio and Watson Machine Learning services that provide the tools for working with foundation models and machine learning models\. The free version of watsonx\.governance contains the watsonx\.ai services plus a Lite plan for the watsonx\.governance service that provides the tools for governing models\. The Cloud Object Storage service is also included to provide storage\. + +To sign up for watsonx: + + + +1. Go to [Try IBM watsonx\.ai](https://dataplatform.cloud.ibm.com/registration/stepone?context=wx&apps=data_science_experience,watson_data_platform,cos&uucid=0b526de8c1c419db&utm_content=WXAWW) or [Try watsonx\.governance](https://dataplatform.cloud.ibm.com/registration/stepone?context=wx&apps=data_science_experience,watson_machine_learning,cos,aiopenscale&uucid=0cf8ca3f38ace12f&utm_content=WXGWW®ions=us-south)\. +2. Select the IBM Cloud service region\. You can select the Dallas or Frankfurt region\. +3. Enter your IBM Cloud account username and password\. If you don't have an IBM Cloud account, [create one](https://cloud.ibm.com/registration)\. +4. If you see the **Select account** screen, select the account and resource group where you want to use watsonx\. If you belong to an account with existing services, you can select it instead of your account\. The **Select account** screen does not display if you have only one account and resource group\. +5. Click **Continue**\. The account activation process begins\. + + + +Note:Stay with your default browser during the activation process\. If you land on the IBM Cloud Dashboard, return to the [Try IBM watsonx\.ai](https://dataplatform.cloud.ibm.com/registration/stepone?context=wx)\{: new\_window\} page or the [Try watsonx\.governance](https://dataplatform.cloud.ibm.com/registration/stepone?context=wx&apps=data_science_experience,watson_machine_learning,cos,aiopenscale&uucid=0cf8ca3f38ace12f&utm_content=WXGWW®ions=us-south)\{: external\} page and follow the link to log in with an existing account\. + +After the activation process completes, your watsonx home page is shown\. + +Bookmark your home page so that you can go directly to the watsonx site for your region to log in with your personal credentials\. + +If you're in your own account, you have the necessary permissions for complete access to projects and deployment spaces\. You can access another account by [switching to that account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/signup-wx.html?context=cdpaas&locale=en#switching)\. + +To set up an account for your organization, so that other users can share services and resources, see [Set up an account for your organization](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-account.html)\. + +## Signing up for your organization's account ## + +Before you can access your organization's watsonx account, you must be a member of your organization's IBM Cloud account\. Account administrators can invite users to join their organization's IBM Cloud account\. + +The administrator provides the following information: + + + + * The IBM Cloud account name for watsonx\. + * The resource group name for the watsonx account\. + * The IBM Cloud service region\. + + + +When the account administrator invites you, you receive an email from IBM Cloud with the title "You are invited to join an account in IBM Cloud\." with the name of the account\. + +To join your organization's account: + + + +1. Click the **Join now** link\. The expiry is 30 days\. +2. You are asked to log in with your IBMid\. IBMids are assigned to IBM Cloud account members\. If you don't have an IBMid, one is created for you when you join\. +3. Continue to the next screen and confirm that your information is correct, then accept the invite\. +4. Login in from the **Welcome** screen\. You are now logged in to the IBM Cloud account\. +5. Go to [Try IBM watsonx\.ai](https://dataplatform.cloud.ibm.com/registration/stepone?context=wx&apps=data_science_experience,watson_data_platform,cos&uucid=0b526de8c1c419db&utm_content=WXAWW) or [Try watsonx\.governance](https://dataplatform.cloud.ibm.com/registration/stepone?context=wx&apps=data_science_experience,watson_machine_learning,cos,aiopenscale&uucid=0cf8ca3f38ace12f&utm_content=WXGWW®ions=us-south)\. +6. Follow the prompts to sign up with your IBMid\. +7. On the **Select account** screen, select your organization's account and resource group\. +8. Click **Continue**\. + + + +You can see the name of the account you are currently working in on the menu bar\. + +![Account name](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/images/ent-accountname.png) + +## Switching to your organization's account ## + +You can switch to your organization's existing IBM Cloud account (or any other account for which you are a member) to share watsonx resources that are provisioned for that account\. + +If you are not already an account member, the account administrator must invite you to the IBM Cloud account\. You receive an email invitation to join the account\. After you accept the invitation, you can access the account and watsonx\. + +To switch to your organization's account: + + + +1. Log in to watsonx with your personal credentials\. +2. Select your organization's account name from the account list on the page header\. If you don't see the account list, click the **Account Switcher**![Account Switcher icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/account_switcher.png) to open it\. + + + +To switch regions: + + + +1. Select the region from the region list on the page header\. If you don't see the region list, click the **Region Switcher**![Region Switcher icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/region_switcher.png) to open it\. + + + +## Logging in to watsonx through IBM Cloud App ID (beta) ## + +IBM Cloud App ID integrates user authentication on IBM Cloud with user registries that are hosted on other identity providers\. If App ID is configured for your IBM Cloud account, your administrator provides an alias to log in to watsonx\. With App ID, you do not need to sign in to IBM Cloud\. Instead, you log in to watsonx with the App ID alias\. + +You cannot switch accounts when you log in through App ID\. + +To log in with App ID: + + + +1. Go to watsonx and choose to log in with App ID (Beta)\. +2. Enter the alias that was [provided to you by your administrator](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-appid.html)\. You are redirected to your company's login page\. +3. Enter your company credentials on your company's login page\. You are redirected back to watsonx\. + + + +Select the **Remember App ID** checkbox to save the App ID alias for future logins\. + +## Next steps ## + + + + * Go back to [Get started](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-wdp.html) and choose the right path for you\. + * Add services from the services catalog\. See [Creating and managing services](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/create-services.html)\. + + + +## Learn more ## + + + + * [Get help](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-help.html) + * [Browser support](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/browser-support.html) + * [Setting up IBM Cloud App ID (beta)](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-appid.html) + + + +**Parent topic:**[Getting started](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-wdp.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3259e737315294c6380ed46645ab8d073a5ed861.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3259e737315294c6380ed46645ab8d073a5ed861.md new file mode 100644 index 0000000..348a912 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3259e737315294c6380ed46645ab8d073a5ed861.md @@ -0,0 +1,23 @@ +# sortnode properties + +# sortnode properties # + +![Sort node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/sortnodeicon.png) The Sort node sorts records into ascending or descending order based on the values of one or more fields\. + + + +sortnode properties + +Table 1\. sortnode properties + +| `sortnode` properties | Data type | Property description | +| --------------------- | ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `keys` | *list* | Specifies the fields you want to sort against\. If no direction is specified, the default is used\. | +| `default_ascending` | *flag* | Specifies the default sort order\. | +| `use_existing_keys` | *flag* | Specifies whether sorting is optimized by using the previous sort order for fields that are already sorted\. | +| `existing_keys` | | Specifies the fields that are already sorted and the direction in which they are sorted\. Uses the same format as the `keys` property\. | +| `default_sort_order` | `Ascending`
`Descending` | Specify whether, by default, records are sorted in ascending or descending order of the sort key values\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/32a79d23c94fb1920db500d2dd9464c1316c62a5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/32a79d23c94fb1920db500d2dd9464c1316c62a5.md new file mode 100644 index 0000000..a57032d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/32a79d23c94fb1920db500d2dd9464c1316c62a5.md @@ -0,0 +1,50 @@ +# Comparison functions (SPSS Modeler) + +# Comparison functions # + +Comparison functions are used to compare field values to each other or to a specified string\. + +For example, you can check strings for equality using `=`\. An example of string equality verification is: `Class = "class 1"`\. + +For purposes of numeric comparison, *greater* means closer to positive infinity, and *lesser* means closer to negative infinity\. That is, all negative numbers are less than any positive number\. + + + +CLEM comparison functions + +Table 1\. CLEM comparison functions + +| Function | Result | Description | +| --------------------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `count_equal(ITEM1, LIST)` | *Integer* | Returns the number of values from a list of fields that are equal to *ITEM1* or null if *ITEM1* is null\. | +| `count_greater_than(ITEM1, LIST)` | *Integer* | Returns the number of values from a list of fields that are greater than *ITEM1* or null if *ITEM1* is null\. | +| `count_less_than(ITEM1, LIST)` | *Integer* | Returns the number of values from a list of fields that are less than *ITEM1* or null if *ITEM1* is null\. | +| `count_not_equal(ITEM1, LIST)` | *Integer* | Returns the number of values from a list of fields that aren't equal to *ITEM1* or null if *ITEM1* is null\. | +| `count_nulls(LIST)` | *Integer* | Returns the number of null values from a list of fields\. | +| `count_non_nulls(LIST)` | *Integer* | Returns the number of non\-null values from a list of fields\. | +| `date_before(DATE1, DATE2)` | *Boolean* | Used to check the ordering of date values\. Returns a true value if *DATE1* is before *DATE2*\. | +| `first_index(ITEM, LIST)` | *Integer* | Returns the index of the first field containing ITEM from a LIST of fields or 0 if the value isn't found\. Supported for string, integer, and real types only\. | +| `first_non_null(LIST)` | *Any* | Returns the first non\-null value in the supplied list of fields\. All storage types supported\. | +| `first_non_null_index(LIST)` | *Integer* | Returns the index of the first field in the specified LIST containing a non\-null value or 0 if all values are null\. All storage types are supported\. | +| `ITEM1 = ITEM2` | *Boolean* | Returns true for records where *ITEM1* is equal to *ITEM2*\. | +| `ITEM1 /= ITEM2` | *Boolean* | Returns true if the two strings are not identical or 0 if they're identical\. | +| `ITEM1 < ITEM2` | *Boolean* | Returns true for records where *ITEM1* is less than *ITEM2*\. | +| `ITEM1 <= ITEM2` | *Boolean* | Returns true for records where *ITEM1* is less than or equal to *ITEM2*\. | +| `ITEM1 > ITEM2` | *Boolean* | Returns true for records where *ITEM1* is greater than *ITEM2*\. | +| `ITEM1 >= ITEM2` | *Boolean* | Returns true for records where *ITEM1* is greater than or equal to *ITEM2*\. | +| `last_index(ITEM, LIST)` | *Integer* | Returns the index of the last field containing ITEM from a LIST of fields or 0 if the value isn't found\. Supported for string, integer, and real types only\. | +| `last_non_null(LIST)` | *Any* | Returns the last non\-null value in the supplied list of fields\. All storage types supported\. | +| `last_non_null_index(LIST)` | *Integer* | Returns the index of the last field in the specified LIST containing a non\-null value or 0 if all values are null\. All storage types are supported\. | +| `max(ITEM1, ITEM2)` | *Any* | Returns the greater of the two items: *ITEM1* or *ITEM2*\. | +| `max_index(LIST)` | *Integer* | Returns the index of the field containing the maximum value from a list of numeric fields or 0 if all values are null\. For example, if the third field listed contains the maximum, the index value 3 is returned\. If multiple fields contain the maximum value, the one listed first (leftmost) is returned\. | +| `max_n(LIST)` | *Number* | Returns the maximum value from a list of numeric fields or null if all of the field values are null\. | +| `member(ITEM, LIST)` | *Boolean* | Returns true if *ITEM* is a member of the specified *LIST*\. Otherwise, a false value is returned\. A list of field names can also be specified\. | +| `min(ITEM1, ITEM2)` | *Any* | Returns the lesser of the two items: *ITEM1* or *ITEM2*\. | +| `min_index(LIST)` | *Integer* | Returns the index of the field containing the minimum value from a list of numeric fields or 0 if all values are null\. For example, if the third field listed contains the minimum, the index value 3 is returned\. If multiple fields contain the minimum value, the one listed first (leftmost) is returned\. | +| `min_n(LIST)` | *Number* | Returns the minimum value from a list of numeric fields or null if all of the field values are null\. | +| `time_before(TIME1, TIME2)` | *Boolean* | Used to check the ordering of time values\. Returns a true value if *TIME1* is before *TIME2*\. | +| `value_at(INT, LIST)` | | Returns the value of each listed field at offset INT or NULL if the offset is outside the range of valid values (that is, less than 1 or greater than the number of listed fields)\. All storage types supported\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/32afafa1c90d43ba1d3330a64491039f63d9feb5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/32afafa1c90d43ba1d3330a64491039f63d9feb5.md new file mode 100644 index 0000000..150d542 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/32afafa1c90d43ba1d3330a64491039f63d9feb5.md @@ -0,0 +1,25 @@ +# Deploying scripts in Watson Machine Learning + +# Deploying scripts in Watson Machine Learning # + +When a script is copied to a deployment space, you can deploy it for use\. Supported script types are Python scripts\. [Batch deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-details.html) is the only supported deployment type for a script\. + + + + * When the script is promoted from a project, your software specification is included\. + * When you create a deployment job for a script, you must manually override the default environment with the correct environment for your script\. For more information, see [Creating a deployment job](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-jobs.html) + + + +## Learn more ## + + + + * To learn more about supported input and output types and setting environment variables, see [Batch deployment details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-details.html)\. + * To learn more about software specifications, see [Software specifications and hardware specifications for deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/pm_service_supported_frameworks.html)\. + + + +**Parent topic:**[Managing predictive deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3334dccdb9872c1e7f698751b138aa5af6cc8335.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3334dccdb9872c1e7f698751b138aa5af6cc8335.md new file mode 100644 index 0000000..518cd0f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3334dccdb9872c1e7f698751b138aa5af6cc8335.md @@ -0,0 +1,34 @@ +# Viewing a factsheet for a tracked asset + +# Viewing a factsheet for a tracked asset # + +Review the details that are captured for each tracked asset in an AI use case or print a report to share or archive\. + +## What is captured in a factsheet? ## + +From the point where you start tracking an asset in an AI use case, facts are collected in a factsheet for the asset\. As the asset moves from one phase of the lifecycle to the next, the facts are added to the appropriate section\. For example, a factsheet for a prompt template collects information for these categories: + + + +| Category | Description | +| ----------------- | -------------------------------------------------------------------------------------------------------------- | +| Governance | basic details for the governance, including the name of the use case, version number, and approach information | +| Foundation model | name and provider for the foundation model | +| Prompt template | prompt template name, description, input, and variables | +| Prompt parameters | options used to create the prompt template, such as decoding method | +| Evaluation | results of the most recent evaluation | +| Attachments | attached files and supporting documents | + + + +Important: The factsheet records the most recent activity in any category\. For example, if you evaluate a deployed prompt template in a pre\-production space, and then evaluate it in a production space, the details from the production evaluation are captured in the factsheet, over\-writing the previous data\. Thus, the factsheet maintains a complete record of the current state of the asset\. + +![Vewing a factsheet for a tracked prompt template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-view-factsheet1.png) + +## Next steps ## + +Click **Export report** to save a report of the factsheet\. + +**Parent topic:**[Governing assets in AI use cases](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-create-use-case.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/337cc5401082dfd6c8c79d49cd97f7bc197c7303.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/337cc5401082dfd6c8c79d49cd97f7bc197c7303.md new file mode 100644 index 0000000..45410df --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/337cc5401082dfd6c8c79d49cd97f7bc197c7303.md @@ -0,0 +1,23 @@ +# applyglmmnode properties + +# applyglmmnode properties # + +You can use GLMM modeling nodes to generate a GLMM model nugget\. The scripting name of this model nugget is *applyglmmnode*\. For more information on scripting the modeling node itself, see [glmmnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/glmmnodeslots.html#glmmnodeslots)\. + + + +applyglmmnode properties + +Table 1\. applyglmmnode properties + +| `applyglmmnode` Properties | Values | Property description | +| ------------------------------ | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `confidence` | `onProbability``onIncrease` | Basis for computing scoring confidence value: highest predicted probability, or difference between highest and second highest predicted probabilities\. | +| `score_category_probabilities` | *flag* | If set to `True`, produces the predicted probabilities for categorical targets\. A field is created for each category\. Default is `False`\. | +| `max_categories` | *integer* | Maximum number of categories for which to predict probabilities\. Used only if `score_category_probabilities` is `True`\. | +| `score_propensity` | *flag* | If set to `True`, produces raw propensity scores (likelihood of "True" outcome) for models with flag targets\. If partitions are in effect, also produces adjusted propensity scores based on the testing partition\. Default is `False`\. | +| `enable_sql_generation` | `false``true``native` | Used to set SQL generation options during flow execution\. The options are to push back to the database, or to score within SPSS Modeler\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/338f12b976b522389f5fabe438280565490fb280.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/338f12b976b522389f5fabe438280565490fb280.md new file mode 100644 index 0000000..e18bee9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/338f12b976b522389f5fabe438280565490fb280.md @@ -0,0 +1,13 @@ +# Discriminant node (SPSS Modeler) + +# Discriminant node # + +Discriminant analysis builds a predictive model for group membership\. The model is composed of a discriminant function (or, for more than two groups, a set of discriminant functions) based on linear combinations of the predictor variables that provide the best discrimination between the groups\. The functions are generated from a sample of cases for which group membership is known; the functions can then be applied to new cases that have measurements for the predictor variables but have unknown group membership\. + +Example\. A telecommunications company can use discriminant analysis to classify customers into groups based on usage data\. This allows them to score potential customers and target those who are most likely to be in the most valuable groups\. + +Requirements\. You need one or more input fields and exactly one target field\. The target must be a categorical field (with a measurement level of `Flag` or `Nominal`) with string or integer storage\. (Storage can be converted using a Filler or Derive node if necessary\. ) Fields set to `Both` or `None` are ignored\. Fields used in the model must have their types fully instantiated\. + +Strengths\. Discriminant analysis and Logistic Regression are both suitable classification models\. However, Discriminant analysis makes more assumptions about the input fields—for example, they are normally distributed and should be continuous, and they give better results if those requirements are met, especially if the sample size is small\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/33923fe20855d3ea3850294c0fb447ec3f1b7bdf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/33923fe20855d3ea3850294c0fb447ec3f1b7bdf.md new file mode 100644 index 0000000..144fe29 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/33923fe20855d3ea3850294c0fb447ec3f1b7bdf.md @@ -0,0 +1,27 @@ +# Decision Optimization experiments + +# Decision Optimization experiments # + +If you use the Decision Optimization experiment UI, you can take advantage of its many features in this user\-friendly environment\. For example, you can create and solve models, produce reports, compare scenarios and save models ready for deployment with Watson Machine Learning\. + +The Decision Optimization experiment UI facilitates workflow\. Here you can: + + + + * Select and edit the data relevant for your optimization problem, see [Prepare data view](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface__section_preparedata) + * Create, import, edit and solve Python models in the Decision Optimization experiment UI, see [Decision Optimization notebook tutorial](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Notebooks/solveModel.html#task_mtg_n3q_m1b) + * Create, import, edit and solve models expressed in natural language with the Modeling Assistant, see [Modeling Assistant tutorial](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/exhousebuild.html#cogusercase) + * Create, import, edit and solve OPL models in the Decision Optimization experiment UI, see [OPL models](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/OPLmodels.html#topic_oplmodels) + * Generate a notebook from your model, work with it as a notebook then reload it as a model, see [Generating a notebook from a scenario](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface__generateNB) and [Overview](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface__section_overview) + * Visualize data and solutions, see [Explore solution view](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface__solution) + * Investigate and compare solutions for multiple scenarios, see [Scenario pane](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface__scenariopanel) and [Overview](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface__section_overview) + * Easily create and share reports with tables, charts and notes using widgets provided in the [Visualization Editor](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/Visualization.html#topic_visualization) + * Save models that are ready for deployment in Watson Machine Learning, see [Scenario pane](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface__scenariopanel) and [Overview](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface__section_overview) + + + +See the [Decision Optimization experiment UI comparison table](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/DOintro.html#DOIntro__comparisontable) for a list of features available with and without the Decision Optimization experiment UI\. + +See [Views and scenarios](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface) for a description of the user interface and scenario management\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/339c9129c24aab66eeaf55a9f003f6501f72b81b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/339c9129c24aab66eeaf55a9f003f6501f72b81b.md new file mode 100644 index 0000000..8ec21c8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/339c9129c24aab66eeaf55a9f003f6501f72b81b.md @@ -0,0 +1,27 @@ +# {{ document.title.text }} + +# Hallucination # + +![icon for value alignment risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-value-alignment.svg)Risks associated with outputValue alignmentNew + +### Description ### + +Hallucinations occur when models produce factually inaccurate or untruthful information\. Often, hallucinatory output is presented in a plausible or convincing manner, making detection by end users difficult\. + +### Why is hallucination a concern for foundation models? ### + +False output can mislead users and be incorporated into downstream artifacts, further spreading misinformation\. This can harm both owners and users of the AI models\. Business entities could face fines, reputational harms, and other legal consequences\. + +Example + +#### Fake Legal Cases #### + +According to the source article, a lawyer cited fake cases and quotes generated by ChatGPT in a legal brief filed in federal court\. The lawyers consulted ChatGPT to supplement their legal research for an aviation injury claim\. The lawyer subsequently asked ChatGPT if the cases provided were fake\. The chatbot responded that they were real and “can be found on legal research databases such as Westlaw and LexisNexis\.” + +Sources: + +[AP News, June 2023](https://apnews.com/article/artificial-intelligence-chatgpt-fake-case-lawyers-d6ae9fa79d0542db9e1455397aef381c) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/339f2ebdad7cd0a3445bdf69c69ab7b28b4353c4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/339f2ebdad7cd0a3445bdf69c69ab7b28b4353c4.md new file mode 100644 index 0000000..541b401 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/339f2ebdad7cd0a3445bdf69c69ab7b28b4353c4.md @@ -0,0 +1,201 @@ +# Parquet modular encryption + +# Parquet modular encryption # + +If your data is stored in columnar format, you can use Parquet modular encryption to encrypt sensitive columns when writing Parquet files, and decrypt these columns when reading the encrypted files\. Encrypting data at the column level, enables you to decide which columns to encrypt and how to control the column access\. + +Besides ensuring privacy, Parquet modular encryption also protects the integrity of stored data\. Any tampering with file contents is detected and triggers a reader\-side exception\. + +Key features include: + + + +1. Parquet modular encryption and decryption is performed on the Spark cluster\. Therefore, sensitive data and the encryption keys are not visible to the storage\. +2. Standard Parquet features, such as encoding, compression, columnar projection and predicate push\-down, continue to work as usual on files with Parquet modular encryption format\. +3. You can choose one of two encryption algorithms that are defined in the Parquet specification\. Both algorithms support column encryption, however: + + + + * The default algorithm `AES-GCM` provides full protection against tampering with data and metadata parts in Parquet files. + * The alternative algorithm `AES-GCM-CTR` supports partial integrity protection of Parquet files. Only metadata parts are protected against tampering, not data parts. An advantage of this algorithm is that it has a lower throughput overhead compared to the `AES-GCM` algorithm. + + + +4. You can choose which columns to encrypt\. Other columns won't be encrypted, reducing the throughput overhead\. +5. Different columns can be encrypted with different keys\. +6. By default, the main Parquet metadata module (the file footer) is encrypted to hide the file schema and list of sensitive columns\. However, you can choose not to encrypt the file footers in order to enable legacy readers (such as other Spark distributions that don't yet support Parquet modular encryption) to read the unencrypted columns in the encrypted files\. +7. Encryption keys can be managed in one of two ways: + + + + * Directly by your application. See [Key management by application](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/key-management-by-application.html). + * By a key management system (KMS) that generates, stores and destroys encryption keys used by the Spark service. These keys never leave the KMS server, and therefore are invisible to other components, including the Spark service. See [Key management by KMS](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/key-management-by-kms.html). + + Note: Only master encryption keys (MEKs) need to be managed by your application or by a KMS. + + For each sensitive column, you must specify which master key to use for encryption. Also, a master key must be specified for the footer of each encrypted file (data frame). By default, the footer key will be used for footer encryption. However, if you choose a plain text footer mode, the footer won’t be encrypted, and the key will be used only for integrity verification of the footer. + + The encryption parameters can be passed via the standard Spark Hadoop configuration, for example by setting configuration values in the Hadoop configuration of the application's SparkContext: + + sc.hadoopConfiguration.set("" , "") + + Alternatively, you can pass parameter values through write options: + + .write + .option("" , "") + .parquet("") + + + + + +## Running with Parquet modular encryption ## + +Parquet modular encryption is available only in Spark notebooks that are run in an IBM Analytics Engine service instance\. Parquet modular encryption is not supported in notebooks that run in a Spark environment\. + +To enable Parquet modular encryption, set the following Spark classpath properties to point to the Parquet jar files that implement Parquet modular encryption, and to the key management jar file: + + + +1. Navigate to **Ambari > Spark > Config \-> Custom spark2\-default**\. +2. Add the following two parameters to point explicitly to the location of the JAR files\. Make sure that you edit the paths to use the actual version of jar files on the cluster\. + + spark.driver.extraClassPath=/home/common/lib/parquetEncryption/ibm-parquet-kms--jar-with-dependencies.jar:/home/common/lib/parquetEncryption/parquet-format-.jar:/home/common/lib/parquetEncryption/parquet-hadoop-.jar + + spark.executor.extraClassPath=/home/common/lib/parquetEncryption/ibm-parquet--jar-with-dependencies.jar:/home/common/lib/parquetEncryption/parquet-format-.jar:/home/common/lib/parquetEncryption/parquet-hadoop-.jar + + + +## Mandatory parameters ## + +The following parameters are required for writing encrypted data: + + + + * List of columns to encrypt, with the master encryption keys: + + parameter name: "encryption.column.keys" + parameter value: ":,;:,.." + * The footer key: + + parameter name: "encryption.footer.key" + parameter value: "" + + For example: + + dataFrame.write + .option("encryption.footer.key" , "k1") + .option("encryption.column.keys" , "k2:SSN,Address;k3:CreditCard") + .parquet("") + + Important:If neither the `encryption.column.keys` parameter nor the `encryption.footer.key` parameter is set, the file will not be encrypted. If only one of these parameters is set, an exception is thrown, because these parameters are mandatory for encrypted files. + + + +## Optional parameters ## + +The following optional parameters can be used when writing encrypted data: + + + + * The encryption algorithm `AES-GCM-CTR` + + By default, Parquet modular encryption uses the `AES-GCM` algorithm that provides full protection against tampering with data and metadata in Parquet files. However, as Spark 2.3.0 runs on Java 8, which doesn’t support AES acceleration in CPU hardware (this was only added in Java 9), the overhead of data integrity verification can affect workload throughput in certain situations. + + To compensate this, you can switch off the data integrity verification support and write the encrypted files with the alternative algorithm `AES-GCM-CTR`, which verifies the integrity of the metadata parts only and not that of the data parts, and has a lower throughput overhead compared to the `AES-GCM` algorithm. + + parameter name: "encryption.algorithm" + parameter value: "AES_GCM_CTR_V1" + * Plain text footer mode for legacy readers + + By default, the main Parquet metadata module (the file footer) is encrypted to hide the file schema and list of sensitive columns. However, you can decide not to encrypt the file footers in order to enable other Spark and Parquet readers (that don't yet support Parquet modular encryption) to read the unencrypted columns in the encrypted files. To switch off footer encryption, set the following parameter: + + parameter name: "encryption.plaintext.footer" + parameter value: "true" + + Important:The `encryption.footer.key` parameter must also be specified in the plain text footer mode. Although the footer is not encrypted, the key is used to sign the footer content, which means that new readers could verify its integrity. Legacy readers are not affected by the addition of the footer signature. + + + +## Usage examples ## + +The following sample code snippets for Python show how to create data frames, written to encrypted parquet files, and read from encrypted parquet files\. + + + + * Python: Writing encrypted data: + + from pyspark.sql import Row + + squaresDF = spark.createDataFrame( + sc.parallelize(range(1, 6)) + .map(lambda i: Row(int_column=i, square_int_column=i ** 2))) + + sc._jsc.hadoopConfiguration().set("encryption.key.list", + "key1: AAECAwQFBgcICQoLDA0ODw==, key2: AAECAAECAAECAAECAAECAA==") + sc._jsc.hadoopConfiguration().set("encryption.column.keys", + "key1:square_int_column") + sc._jsc.hadoopConfiguration().set("encryption.footer.key", "key2") + + encryptedParquetPath = "squares.parquet.encrypted" + squaresDF.write.parquet(encryptedParquetPath) + * Python: Reading encrypted data: + + sc._jsc.hadoopConfiguration().set("encryption.key.list", + "key1: AAECAwQFBgcICQoLDA0ODw==, key2: AAECAAECAAECAAECAAECAA==") + + encryptedParquetPath = "squares.parquet.encrypted" + parquetFile = spark.read.parquet(encryptedParquetPath) + parquetFile.show() + + + +The contents of the Python job file `InMemoryKMS.py` is as follows: + + from pyspark.sql import SparkSession + from pyspark import SparkContext + from pyspark.sql import Row + + if __name__ == "__main__": + spark = SparkSession \ + .builder \ + .appName("InMemoryKMS") \ + .getOrCreate() + sc = spark.sparkContext + ##KMS operation + print("Setup InMemoryKMS") + hconf = sc._jsc.hadoopConfiguration() + encryptedParquetFullName = "testparquet.encrypted" + print("Write Encrypted Parquet file") + hconf.set("encryption.key.list", "key1: AAECAwQFBgcICQoLDA0ODw==, key2: AAECAAECAAECAAECAAECAA==") + btDF = spark.createDataFrame(sc.parallelize(range(1, 6)).map(lambda i: Row(ssn=i, value=i ** 2))) + btDF.write.mode("overwrite").option("encryption.column.keys", "key1:ssn").option("encryption.footer.key", "key2").parquet(encryptedParquetFullName) + print("Read Encrypted Parquet file") + encrDataDF = spark.read.parquet(encryptedParquetFullName) + encrDataDF.createOrReplaceTempView("bloodtests") + queryResult = spark.sql("SELECT ssn, value FROM bloodtests") + queryResult.show(10) + sc.stop() + spark.stop() + +## Internals of encryption key handling ## + +When writing a Parquet file, a random data encryption key (DEK) is generated for each encrypted column and for the footer\. These keys are used to encrypt the data and the metadata modules in the Parquet file\. + +The data encryption key is then encrypted with a key encryption key (KEK), also generated inside Spark/Parquet for each master key\. The key encryption key is encrypted with a master encryption key (MEK) locally\. + +Encrypted data encryption keys and key encryption keys are stored in the Parquet file metadata, along with the master key identity\. Each key encryption key has a unique identity (generated locally as a secure random 16\-byte value), also stored in the file metadata\. + +When reading a Parquet file, the identifier of the master encryption key (MEK) and the encrypted key encryption key (KEK) with its identifier, and the encrypted data encryption key (DEK) are extracted from the file metadata\. + +The key encryption key is decrypted with the master encryption key locally\. Then the data encryption key (DEK) is decrypted locally, using the key encryption key (KEK)\. + +## Learn more ## + + + + * [Parquet modular encryption](https://github.com/apache/parquet-format/blob/apache-parquet-format-2.7.0/Encryption.md) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/33fe18d89140517ab2a75d6fc64a4a3db962b88b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/33fe18d89140517ab2a75d6fc64a4a3db962b88b.md new file mode 100644 index 0000000..0f2c152 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/33fe18d89140517ab2a75d6fc64a4a3db962b88b.md @@ -0,0 +1,125 @@ +# SQL optimization (SPSS Modeler) + +# CLEM expressions and operators supporting SQL pushback # + +The tables in this section list the mathematical operations and expressions that support SQL generation and are often used during data mining\. Operations absent from these tables don't support SQL generation\. + + + +Table 1\. Operators + +| Operations supporting SQL generation | Notes | +| ------------------------------------ | ----------------------------- | +| `+` | | +| `-` | | +| `/` | | +| `*` | | +| `><` | Used to concatenate strings\. | + + + + + +Table 2\. Relational operators + +| Operations supporting SQL generation | Notes | +| ------------------------------------ | ----------------------------- | +| `=` | | +| `/=` | Used to specify "not equal\." | +| `>` | | +| `>=` | | +| `<` | | +| `<=` | | + + + + + +Table 3\. Functions + +| Operations supporting SQL generation | Notes | +| ------------------------------------ | ----- | +| `abs` | | +| `allbutfirst` | | +| `allbutlast` | | +| `and` | | +| `arccos` | | +| `arcsin` | | +| `arctan` | | +| `arctanh` | | +| `cos` | | +| `div` | | +| `exp` | | +| `fracof` | | +| `hasstartstring` | | +| `hassubstring` | | +| `integer` | | +| `intof` | | +| `isaplhacode` | | +| `islowercode` | | +| `isnumbercode` | | +| `isstartstring` | | +| `issubstring` | | +| `isuppercode` | | +| `last` | | +| `length` | | +| `locchar` | | +| `log` | | +| `log10` | | +| `lowertoupper` | | +| `max` | | +| `member` | | +| `min` | | +| `negate` | | +| `not` | | +| `number` | | +| `or` | | +| `pi` | | +| `real` | | +| `rem` | | +| `round` | | +| `sign` | | +| `sin` | | +| `sqrt` | | +| `string` | | +| `strmember` | | +| `subscrs` | | +| `substring` | | +| `substring_between` | | +| `uppertolower` | | +| `to_string` | | + + + + + +Table 4\. Special functions + +| Operations supporting SQL generation | Notes | +| ------------------------------------ | ----------------------------------------------------------------------------------------------------- | +| `@NULL` | | +| `@GLOBAL_AVE` | You can use the special global functions to retrieve global values computed by the Set Globals node\. | +| `@GLOBAL_SUM` | | +| `@GLOBAL_MAX` | | +| `@GLOBAL_MEAN` | | +| `@GLOBAL_MIN` | | +| `@GLOBALSDEV` | | + + + + + +Table 5\. Aggregate functions + +| Operations supporting SQL generation | Notes | +| ------------------------------------ | ----- | +| `Sum` | | +| `Mean` | | +| `Min` | | +| `Max` | | +| `Count` | | +| `SDev` | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3426fb738655136d42fa32bd6cfbfd979a3d5574.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3426fb738655136d42fa32bd6cfbfd979a3d5574.md new file mode 100644 index 0000000..5f7eeb3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3426fb738655136d42fa32bd6cfbfd979a3d5574.md @@ -0,0 +1,37 @@ +# matrixnode properties + +# matrixnode properties # + +![Matrix node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/matrixnodeicon.png)The Matrix node creates a table that shows relationships between fields\. It's most commonly used to show the relationship between two symbolic fields, but it can also show relationships between flag fields or numeric fields\. + + + +matrixnode properties + +Table 1\. matrixnode properties + +| `matrixnode` properties | Data type | Property description | +| ------------------------ | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `fields` | `Selected``Flags``Numerics` | | +| `row` | *field* | | +| `column` | *field* | | +| `include_missing_values` | *flag* | Specifies whether user\-missing (blank) and system missing (null) values are included in the row and column output\. | +| `cell_contents` | `CrossTabs``Function` | | +| `function_field` | *string* | | +| `function` | `Sum``Mean``Min``Max``SDev` | | +| `sort_mode` | `Unsorted``Ascending``Descending` | | +| `highlight_top` | *number* | If non\-zero, then true\. | +| `highlight_bottom` | *number* | If non\-zero, then true\. | +| `display` | `[Counts``Expected``Residuals``RowPct``ColumnPct``TotalPct]` | | +| `include_totals` | *flag* | | +| `use_output_name` | *flag* | Specifies whether a custom output name is used\. | +| `output_name` | *string* | If `use_output_name` is true, specifies the name to use\. | +| `output_mode` | `Screen``File` | Used to specify target location for output generated from the output node\. | +| `output_format` | `Formatted` (\.*tab*) `Delimited` (\.*csv*) `HTML` (\.*html*) `Output` (\.*cou*) | Used to specify the type of output\. Both the `Formatted` and `Delimited` formats can take the modifier `transposed`, which transposes the rows and columns in the table\. | +| `paginate_output` | *flag* | When the `output_format` is `HTML`, causes the output to be separated into pages\. | +| `lines_per_page` | *number* | When used with `paginate_output`, specifies the lines per page of output\. | +| `full_filename` | *string* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/342ad3abfeeca87987ed595047cc869e15f148bf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/342ad3abfeeca87987ed595047cc869e15f148bf.md new file mode 100644 index 0000000..3124911 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/342ad3abfeeca87987ed595047cc869e15f148bf.md @@ -0,0 +1,9 @@ +# Generating a model nugget (SPSS Modeler) + +# Generating a model nugget # + +When you're working in the Text Analytics Workbench, you may want to use the work you've done to generate a category model nugget\. + +A model generated from a Text Analytics Workbench session is a category model nugget\. You must first have at least one category before you can generate a category model nugget\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3491f666270894ee4be071fd4a8551df94cb9889.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3491f666270894ee4be071fd4a8551df94cb9889.md new file mode 100644 index 0000000..a602f19 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3491f666270894ee4be071fd4a8551df94cb9889.md @@ -0,0 +1,25 @@ +# Defining class attributes and methods + +# Defining class attributes and methods # + +Any variable that's bound in a class is a class attribute\. Any function defined within a class is a method\. Methods receive an instance of the class, conventionally called `self`, as the first argument\. For example, to define some class attributes and methods, you might enter the following script: + + class MyClass + attr1 = 10 #class attributes + attr2 = "hello" + + def method1(self): + print MyClass.attr1 #reference the class attribute + + def method2(self): + print MyClass.attr2 #reference the class attribute + + def method3(self, text): + self.text = text #instance attribute + print text, self.text #print my argument and my attribute + + method4 = method3 #make an alias for method3 + +Inside a class, you should qualify all references to class attributes with the class name (for example, `MyClass.attr1`)\. All references to instance attributes should be qualified with the `self` variable (for example, `self.text`)\. Outside the class, you should qualify all references to class attributes with the class name (for example, `MyClass.attr1`) or with an instance of the class (for example, `x.attr1`, where `x` is an instance of the class)\. Outside the class, all references to instance variables should be qualified with an instance of the class (for example, `x.text`)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/34974dee293ba190cfa1b3383eb2417d0fd4b601.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/34974dee293ba190cfa1b3383eb2417d0fd4b601.md new file mode 100644 index 0000000..b84f16f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/34974dee293ba190cfa1b3383eb2417d0fd4b601.md @@ -0,0 +1,38 @@ +# Firewall access for AWS Redshift + +# Firewall access for AWS Redshift # + +Inbound firewall access allows IBM watsonx to connect to Redshift on AWS through the firewall\. You need inbound firewall access to work with your data stored in Redshift\. + +To connect to Redshift from IBM watsonx, you configure inbound access through the Redshift firewall by entering the IP ranges for IBM watsonx into the inbound firewall rules (also called ingress rules)\. Inbound access through the firewall is configurable if Redshift resides on a public subnet\. If Redshift resides on a private subnet, then no access is possible\. + +Follow these steps to configure inbound firewall access to AWS Redshift: + + + +1. Go to your provisioned Amazon Redshift cluster\. +2. Select **Properties** and then scroll down to **Network and security settings**\. +3. Click the **VPC security group**\. + + ![AWS VPC security group](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/images/int-aws-active.png) +4. Edit the active/default security group\. + + ![AWS active security group](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/images/int-aws-vpc.png) +5. Under **Inbound rules**, change the port range to 5439 to specify the Redshift port\. Then select **Edit inbound rules > Add rule**\. + + ![Edit inbound rules](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/images/int-aws-IPs.png) +6. From IBM watsonx, go to the **Administration > Cloud integrations** page\. +7. Click the **Firewall configuration** link to view the list of IP ranges used by IBM watsonx\. IP addresses can be viewed in either CIDR notation or as Start and End addresses\. +8. Copy each of the IP ranges listed and paste them into the **Source** field for inbound firewall rules\. + + + +## Learn more ## + + + + * [Working with Redshift\-managed VPC endpoints in Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-cluster-cross-vpc.html) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/34bc2f43f99778ffa7e2c3e414c3cfb32509276d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/34bc2f43f99778ffa7e2c3e414c3cfb32509276d.md new file mode 100644 index 0000000..d4c0a26 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/34bc2f43f99778ffa7e2c3e414c3cfb32509276d.md @@ -0,0 +1,170 @@ +# Detecting entities with a custom dictionary + +# Detecting entities with a custom dictionary # + +If you have a fixed set of terms that you want to detect, like a list of product names or organizations, you can create a dictionary\. Dictionary matching is very fast and resource\-efficient\. + +Watson Natural Language Processing dictionaries contain advanced matching capabilities that go beyond a simple string match, including: + + + + * Dictionary terms can consist of a single token, for example *wheel*, or multiple tokens, for example, *steering wheel*\. + * Dictionary term matching can be case\-sensitive or case\-insensitive\. With a case\-sensitive match, you can ensure that acronyms, like *ABS* don't match terms in the regular language, like *abs* that have a different meaning\. + * You can specify how to consolidate matches when multiple dictionary entries match the same text\. Given the two dictionary entries, *Watson* and *Watson Natural Language Processing*, you can configure which entry should match in "I like Watson Natural Language Processing": either only *Watson Natural Language Processing*, as it contains *Watson*, or both\. + * You can specify to match the lemma instead of enumerating all inflections\. This way, the single dictionary entry *mouse* will detect both *mouse* and *mice* in the text\. + * You can attach a label to each dictionary entry, for example *Organization category* to include additional metadata in the match\. + + + +All of these capabilities can be configured, so you can pick the right option for your use case\. + +## Types of dictionary files ## + +Watson Natural Language Processing supports two types of dictionary files: + + + + * Term list (ending in `.dict`) + + Example of a term list: + + Arthur + Allen + Albert + Alexa + * Table (ending in `.csv`) + + Example of a table: + + "label", "entry" + "ORGANIZATION", "NASA" + "COUNTRY", "USA" + "ACTOR", "Christian Bale" + + + +You can use multiple dictionaries during the same extraction\. You can also use both types at the same time, for example, run a single extraction with three dictionaries, one term list and two tables\. + +## Creating dictionary files ## + +Begin by creating a module directory inside your notebook\. This is a directory inside the notebook file system that will be used temporarily to store your dictionary files\. + +To create dictionary files in your notebook: + + + +1. Create a module directory\. Note that the name of the module folder cannot contain any dashes as this will cause errors\. + + import os + import watson_nlp + module_folder = "NLP_Dict_Module_1" + os.makedirs(module_folder, exist_ok=True) +2. Create dictionary files, and store them in the module directory\. You can either read in an external list or CSV file, or you can create dictionary files like so: + + # Create a term list dictionary + term_file = "names.dict" + with open(os.path.join(module_folder, term_file), 'w') as dictionary: + dictionary.write('Bruce') + dictionary.write('\n') + dictionary.write('Peter') + dictionary.write('\n') + + # Create a table dictionary + table_file = 'Places.csv' + with open(os.path.join(module_folder, table_file), 'w') as places: + places.write("\"label\", \"entry\"") + places.write("\n") + places.write("\"SIGHT\", \"Times Square\"") + places.write("\n") + places.write("\"PLACE\", \"5th Avenue\"") + places.write("\n") + + + +## Loading the dictionaries and configuring matching options ## + +The dictionaries can be loaded using the following helper methods\. + + + + * To load a single dictionary, use `watson_nlp.toolkit.rule_utils.DictionaryConfig ()` + * To load multiple dictionaries, use `watson_nlp.toolkit.rule_utils.DictionaryConfig.load_all([)])` + + + +For each dictionary, you need to specify a dictionary configuration\. The dictionary configuration is a Python dictionary, with the following attributes: + + + +| Attribute | Value | Description | Required | +| ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ | +| `name` | string | The name of the dictionary | Yes | +| `source` | string | The path to the dictionary, relative to `module_folder` | Yes | +| `dict_type` | file or table | Whether the dictionary artifact is a term list (file) or a table of mappings (table) | No\. The default is file | +| `consolidate` | ContainedWithin (Keep the longest match and deduplicate) / NotContainedWithin (Keep the shortest match and deduplicate) / ContainsButNotEqual (Keep longest match but keep duplicate matches) / ExactMatch (Deduplicate) / LeftToRight (Keep the leftmost longest non\-overlapping span) | What to do with dictionary matches that overlap\. | No\. The default is to not consolidate matches\. | +| `case` | exact / insensitive | Either match exact case or be case insensitive\. | No\. The default is exact match\. | +| `lemma` | True / False | Match the terms in the dictionary with the lemmas from the text\. The dictionary should contain only lemma forms\. For example, add `mouse` in the dictionary to match both `mouse` and `mice` in text\. Do not add `mice` in the dictionary\. To match terms that consist of multiple tokens in text, separate the lemmas of those terms in the dictionary by a space character\. | No\. The default is False\. | +| `mappings.columns` (columns `as attribute of` mappings: \{\}) | list \[ string \] | List of column headers in the same order as present in the table csv | Yes if `dict_type: table` | +| `mappings.entry` (entry `as attribute of` mappings: \{\}) | string | The name of the column header that contains the string to match against the document\. | Yes if `dict_type: table` | +| `label` | string | The label to attach to matches\. | No | + + + +**Code sample** + + # Load the dictionaries + dictionaries = watson_nlp.toolkit.rule_utils.DictionaryConfig.load_all([{ + 'name': 'Names', + 'source': term_file, + 'case':'insensitive' + }, { + 'name': 'places_and_sights_mappings', + 'source': table_file, + 'dict_type': 'table', + 'mappings': { + 'columns': 'label', 'entry'], + 'entry': 'entry' + } + }]) + +## Training a model that contains dictionaries ## + +After you have loaded the dictionaries, create a dictionary model and train the model using the `RBR.train()` method\. In the method, specify: + + + + * The module directory + * The language of the dictionary entries + * The dictionaries to use + + + +**Code sample** + + custom_dict_block = watson_nlp.resources.feature_extractor.RBR.train(module_folder, + language='en', dictionaries=dictionaries) + +## Applying the model on new data ## + +After you have trained the dictionaries, apply the model on new data using the `run()` method, as you would use on any of the existing pre\-trained blocks\. + +**Code sample** + + custom_dict_block.run('Bruce is at Times Square') + +Output of the code sample: + + {(0, 5): ['Names'], (12, 24): ['SIGHT']} + +To show the labels or the name of the dictionary: + + RBR_result = custom_dict_block.executor.get_raw_response('Bruce is at Times Square', language='en') + print(RBR_result) + +Output showing the labels: + + {'annotations': {'View_Names': [{'label': 'Names', 'match': {'location': {'begin': 0, 'end': 5}, 'text': 'Bruce'}}], 'View_places_and_sights_mappings': [{'label': 'SIGHT', 'match': {'location': {'begin': 12, 'end': 24}, 'text': 'Times Square'}}]}, 'instrumentationInfo': {'annotator': {'version': '1.0', 'key': 'Text match extractor for NLP_Dict_Module_1'}, 'runningTimeMS': 3, 'documentSizeChars': 32, 'numAnnotationsTotal': 2, 'numAnnotationsPerType': [{'annotationType': 'View_Names', 'numAnnotations': 1}, {'annotationType': 'View_places_and_sights_mappings', 'numAnnotations': 1}], 'interrupted': False, 'success': True}} + +**Parent topic:**[Creating your own models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-create-model.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/34ffe04319ce15e4451729b183c35f288a58a1b7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/34ffe04319ce15e4451729b183c35f288a58a1b7.md new file mode 100644 index 0000000..350e42b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/34ffe04319ce15e4451729b183c35f288a58a1b7.md @@ -0,0 +1,27 @@ +# {{ document.title.text }} + +# Data usage rights # + +![icon for intellectual property risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-intellectual-property.svg)Risks associated with inputTraining and tuning phaseIntellectual propertyAmplified + +### Description ### + +Terms of service, copyright laws, or other rules restrict the ability to use certain data for building models\. + +### Why is data usage rights a concern for foundation models? ### + +Laws and regulations concerning the use of data to train AI are unsettled and can vary from country to country, which creates challenges in the development of models\. If data usage violates rules or restrictions, business entities might face fines, reputational harms, and other legal consequences\. + +Example + +#### Text Copyright Infringement Claims #### + +According to the source article, bestselling novelists Sarah Silverman, Richard Kadrey, and Christopher Golden have sued Meta and OpenAI for copyright infringement\. The article further stated that the authors had alleged the two tech companies had “ingested” text from their books into generative AI software (LLMs) and failed to give them credit or compensation\. + +Sources: + +[Los Angeles Times, July 2023](https://www.latimes.com/entertainment-arts/books/story/2023-07-10/sarah-silverman-authors-sue-meta-openai-chatgpt-copyright-infringement) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3508f0dda4ccbdbb07bd583218f4e4260dc01c0d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3508f0dda4ccbdbb07bd583218f4e4260dc01c0d.md new file mode 100644 index 0000000..e2f3a26 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3508f0dda4ccbdbb07bd583218f4e4260dc01c0d.md @@ -0,0 +1,61 @@ +# Geospatial data analysis + +# Geospatial data analysis # + +You can use the geospatio\-temporal library to expand your data science analysis in Python notebooks to include location analytics by gathering, manipulating and displaying imagery, GPS, satellite photography and historical data\. + +The gespatio\-temporal library is available in all IBM Watson Studio Spark with Python runtime environments\. + +## Key functions ## + +The geospatio\-temporal library includes functions to read and write data, topological functions, geohashing, indexing, ellipsoidal and routing functions\. + +Key aspects of the library include: + + + + * All calculated geometries are accurate without the need for projections\. + * The geospatial functions take advantage of the distributed processing capabilities provided by Spark\. + * The library includes native geohashing support for geometries used in simple aggregations and in indexing, thereby improving storage retrieval considerably\. + * The library supports extensions of Spark distributed joins\. + * The library supports the SQL/MM extensions to Spark SQL\. + + + +## Getting started with the library ## + +Before you can start using the library in a notebook, you must register `STContext` in your notebook to access the `st` functions\. + +To register `STContext`: + + from pyst import STContext + stc = STContext(spark.sparkContext._gateway) + +## Next steps ## + +After you have registered `STContext` in your notebook, you can begin exploring the spatio\-temporal library for: + + + + * Functions to read and write data + * Topological functions + * Geohashing functions + * Geospatial indexing functions + * Ellipsoidal functions + * Routing functions + + + +Check out the following sample Python notebooks to learn how to use these different functions in Python notebooks: + + + + * [Use the spatio\-temporal library for location analytics](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/92c6ab6ea922d1da6a2cc9496a277005) + * [Use spatial indexing to query spatial data](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/a7432f0c29c5bda2fb42749f3628d981) + * [Spatial queries in PySpark](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/27ecffa80bd3a386fffca1d8d1256ba7) + + + +**Parent topic:**[Notebooks and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebooks-and-scripts.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/355ea8bd00a0246eacfef090af6a6b6f2bd92d4f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/355ea8bd00a0246eacfef090af6a6b6f2bd92d4f.md new file mode 100644 index 0000000..031b1b6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/355ea8bd00a0246eacfef090af6a6b6f2bd92d4f.md @@ -0,0 +1,106 @@ +# Extracting sentiment with a custom transformer model + +# Extracting sentiment with a custom transformer model # + +You can train your own models for sentiment extraction based on the Slate IBM Foundation model\. This pretrained model can be find\-tuned for your use case by training it on your specific input data\. + +The Slate IBM Foundation model is available only in Runtime 23\.1\. + +Note: Training transformer models is CPU and memory intensive\. Depending on the size of your training data, the environment might not be large enough to complete the training\. If you run into issues with the notebook kernel during training, create a custom notebook environment with a larger amount of CPU and memory, and use that to run your notebook\. Use a GPU\-based environment for training and also inference time, if it is available to you\. See [Creating your own environment template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-customize-env-definition.html)\. + + + + * [Input data format for training](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-extract-sentiment.html?context=cdpaas&locale=en#input) + * [Loading the pretrained model resources](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-extract-sentiment.html?context=cdpaas&locale=en#load) + * [Training the model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-extract-sentiment.html?context=cdpaas&locale=en#train) + * [Applying the model on new data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-extract-sentiment.html?context=cdpaas&locale=en#apply) + + + +## Input data format for training ## + +You need to provide a training and development data set to the training function\. The development data is usually around 10% of the training data\. Each training or development sample is represented as a JSON object\. It must have a **text** and a **labels** field\. The **text** represents the training example text, and the **labels** field is an array, which contains exactly one label of **positive**, **neutral**, or **negative**\. + +The following is an example of an array with sample training data: + + [ + { + "text": "I am happy", + "labels": "positive"] + }, + { + "text": "I am sad", + "labels": "negative"] + }, + { + "text": "The sky is blue", + "labels": "neutral"] + } + ] + +The training and development data sets are created as data streams from arrays of JSON objects\. To create the data streams, you might use the utility method `prepare_data_from_json`: + + import watson_nlp + from watson_nlp.toolkit.sentiment_analysis_utils.training import train_util as utils + + training_data_file = "train_data.json" + dev_data_file = "dev_data.json" + + train_stream = utils.prepare_data_from_json(training_data_file) + dev_stream = utils.prepare_data_from_json(dev_data_file) + +## Loading the pretrained model resources ## + +The pretrained Slate IBM Foundation model needs to be loaded before it passes to the training algorithm\. In addition, you need to load the syntax analysis models for the languages that are used in your input texts\. + +To load the model: + + # Load the pretrained Slate IBM Foundation model + pretrained_model_resource = watson_nlp.load('pretrained-model_slate.153m.distilled_many_transformer_multilingual_uncased') + + # Download relevant syntax analysis models + syntax_model_en = watson_nlp.load('syntax_izumo_en_stock') + syntax_model_de = watson_nlp.load('syntax_izumo_de_stock') + + # Create a list of all syntax analysis models + syntax_models = [syntax_model_en, syntax_model_de] + +## Training the model ## + +For all options that are available for configuring sentiment transformer training, enter: + + help(watson_nlp.workflows.sentiment.AggregatedSentiment.train_transformer) + +The `train_transformer` method creates a workflow model, which automatically runs syntax analysis and the trained sentiment classification\. In a subsequent step, enable language detection so that the workflow model can run on input text without any prerequisite information\. + +The following is a sample call using the input data and pretrained model from the previous section (Training the model): + + from watson_nlp.workflows.sentiment import AggregatedSentiment + + sentiment_model = AggregatedSentiment.train_transformer( + train_data_stream = train_stream, + dev_data_stream = dev_stream, + syntax_model=syntax_models, + pretrained_model_resource=pretrained_model_resource, + label_list=['negative', 'neutral', 'positive'], + learning_rate=2e-5, + num_train_epochs=10, + combine_approach="NON_NEUTRAL_MEAN", + keep_model_artifacts=True + ) + lang_detect_model = watson_nlp.load('lang-detect_izumo_multi_stock') + + sentiment_model.enable_lang_detect(lang_detect_model) + +## Applying the model on new data ## + +After you train the model on a data set, apply the model on new data by using the `run()` method, as you would use on any of the existing pre\-trained blocks\. + +Sample code: + + input_text = 'new input text' + sentiment_predictions = sentiment_model.run(input_text) + +**Parent topic:**[Creating your own models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-create-model_cloud.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/356dd425ad5be4ee255f2f95f7860b6fdfe3bcc0.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/356dd425ad5be4ee255f2f95f7860b6fdfe3bcc0.md new file mode 100644 index 0000000..ed3645a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/356dd425ad5be4ee255f2f95f7860b6fdfe3bcc0.md @@ -0,0 +1,19 @@ +# applytwostepAS properties + +# applytwostepAS properties # + +You can use TwoStep\-AS modeling nodes to generate a TwoStep\-AS model nugget\. The scripting name of this model nugget is *applytwostepAS*\. For more information on scripting the modeling node itself, see [twostepAS properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/twostep_as_nodeslots.html#twostep_as_nodeslots)\. + + + +applytwostepAS Properties + +Table 1\. applytwostepAS Properties + +| `applytwostepAS` Properties | Values | Property description | +| --------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `enable_sql_generation` | `false`
`true`
`native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/35a87caedb1f1b6739159b9c7a31cce7c8978431.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/35a87caedb1f1b6739159b9c7a31cce7c8978431.md new file mode 100644 index 0000000..051fec8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/35a87caedb1f1b6739159b9c7a31cce7c8978431.md @@ -0,0 +1,21 @@ +# Anomaly node (SPSS Modeler) + +# Anomaly node # + +Anomaly detection models are used to identify outliers, or unusual cases, in the data\. Unlike other modeling methods that store rules about unusual cases, anomaly detection models store information on what normal behavior looks like\. This makes it possible to identify outliers even if they do not conform to any known pattern, and it can be particularly useful in applications, such as fraud detection, where new patterns may constantly be emerging\. Anomaly detection is an unsupervised method, which means that it does not require a training dataset containing known cases of fraud to use as a starting point\. + +While traditional methods of identifying outliers generally look at one or two variables at a time, anomaly detection can examine large numbers of fields to identify clusters or peer groups into which similar records fall\. Each record can then be compared to others in its peer group to identify possible anomalies\. The further away a case is from the normal center, the more likely it is to be unusual\. For example, the algorithm might lump records into three distinct clusters and flag those that fall far from the center of any one cluster\. + +Each record is assigned an anomaly index, which is the ratio of the group deviation index to its average over the cluster that the case belongs to\. The larger the value of this index, the more deviation the case has than the average\. Under the usual circumstance, cases with anomaly index values less than 1 or even 1\.5 would not be considered as anomalies, because the deviation is just about the same or a bit more than the average\. However, cases with an index value greater than 2 could be good anomaly candidates because the deviation is at least twice the average\. + +Anomaly detection is an exploratory method designed for quick detection of unusual cases or records that should be candidates for further analysis\. These should be regarded as *suspected* anomalies, which, on closer examination, may or may not turn out to be real\. You may find that a record is perfectly valid but choose to screen it from the data for purposes of model building\. Alternatively, if the algorithm repeatedly turns up false anomalies, this may point to an error or artifact in the data collection process\. + +Note that anomaly detection identifies unusual records or cases through cluster analysis based on the set of fields selected in the model without regard for any specific target (dependent) field and regardless of whether those fields are relevant to the pattern you are trying to predict\. For this reason, you may want to use anomaly detection in combination with feature selection or another technique for screening and ranking fields\. For example, you can use feature selection to identify the most important fields relative to a specific target and then use anomaly detection to locate the records that are the most unusual with respect to those fields\. (An alternative approach would be to build a decision tree model and then examine any misclassified records as potential anomalies\. However, this method would be more difficult to replicate or automate on a large scale\.) + +Example\. In screening agricultural development grants for possible cases of fraud, anomaly detection can be used to discover deviations from the norm, highlighting those records that are abnormal and worthy of further investigation\. You are particularly interested in grant applications that seem to claim too much (or too little) money for the type and size of farm\. + +Requirements\. One or more input fields\. Note that only fields with a role set to Input using a source or Type node can be used as inputs\. Target fields (role set to Target or Both) are ignored\. + +Strengths\. By flagging cases that do *not* conform to a known set of rules rather than those that do, Anomaly Detection models can identify unusual cases even when they don't follow previously known patterns\. When used in combination with feature selection, anomaly detection makes it possible to screen large amounts of data to identify the records of greatest interest relatively quickly\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/35f4c4a97cf58fa0642d88e501314f3d75ff9e01.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/35f4c4a97cf58fa0642d88e501314f3d75ff9e01.md new file mode 100644 index 0000000..57b7162 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/35f4c4a97cf58fa0642d88e501314f3d75ff9e01.md @@ -0,0 +1,13 @@ +# Supported data sources (SPSS Modeler) + +# XGBoost Tree node # + +XGBoost Tree© is an advanced implementation of a gradient boosting algorithm with a tree model as the base model\. Boosting algorithms iteratively learn weak classifiers and then add them to a final strong classifier\. XGBoost Tree is very flexible and provides many parameters that can be overwhelming to most users, so the XGBoost Tree node in watsonx\.ai exposes the core features and commonly used parameters\. The node is implemented in Python\. + +For more information about boosting algorithms, see the [XGBoost Tutorials](http://xgboost.readthedocs.io/en/latest/tutorials/index.html)\. ^1^ + +Note that the XGBoost cross\-validation function is not supported in watsonx\.ai\. You can use the Partition node for this functionality\. Also note that XGBoost in watsonx\.ai performs one\-hot encoding automatically for categorical variables\. + +^1^ "XGBoost Tutorials\." *Scalable and Flexible Gradient Boosting*\. Web\. © 2015\-2016 DMLC\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3602c22051ea1148b07446605dd3c57bf7830c3a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3602c22051ea1148b07446605dd3c57bf7830c3a.md new file mode 100644 index 0000000..edbc37a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3602c22051ea1148b07446605dd3c57bf7830c3a.md @@ -0,0 +1,15 @@ +# How categorization works (SPSS Modeler) + +# How categorization works # + +When creating category models in Text Analytics, there are several different techniques you can choose from to create categories\. Because every dataset is unique, the number of techniques and the order in which you apply them may change\. + +Since your interpretation of the results may be different from someone else's, you may need to experiment with the different techniques to see which one produces the best results for your text data\. In Text Analytics, you can create category models in a workbench session in which you can explore and fine\-tune your categories further\. + +In this documentation, category building refers to the generation of category definitions and classification through the use of one or more built\-in techniques, and categorization refers to the scoring, or labeling, process whereby unique identifiers (name/ID/value) are assigned to the category definitions for each record or document\. + +During category building, the concepts and types that were extracted are used as the building blocks for your categories\. When you build categories, the records or documents are automatically assigned to categories if they contain text that matches an element of a category's definition\. + +Text Analytics offers you several automated category building techniques to help you categorize your documents or records quickly\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/36c8af3bbafff1c227cf611d7327afa8e378d6ec.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/36c8af3bbafff1c227cf611d7327afa8e378d6ec.md new file mode 100644 index 0000000..9044b9b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/36c8af3bbafff1c227cf611d7327afa8e378d6ec.md @@ -0,0 +1,10 @@ +# Restructure node (SPSS Modeler) + +# Restructure node # + +With the Restructure node, you can generate multiple fields based on the values of a nominal or flag field\. The newly generated fields can contain values from another field or numeric flags (0 and 1)\. The functionality of this node is similar to that of the Set to Flag node\. However, it offers more flexibility by allowing you to create fields of any type (including numeric flags), using the values from another field\. You can then perform aggregation or other manipulations with other nodes downstream\. (The Set to Flag node lets you aggregate fields in one step, which may be convenient if you are creating flag fields\.) + +Figure 1\. Restructure node + +![Restructure node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/restructure_node.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/36d7217bc75c917100ae7df27dc14fdb919d1609.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/36d7217bc75c917100ae7df27dc14fdb919d1609.md new file mode 100644 index 0000000..673f0d7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/36d7217bc75c917100ae7df27dc14fdb919d1609.md @@ -0,0 +1,92 @@ +# Elasticsearch connection + +# Elasticsearch connection # + +To access your data in Elasticsearch, create a connection asset for it\. + +Elasticsearch is a distributed, open source search and analytics engine\. Use the Elasticsearch connection to access JSON documents in Elasticsearch indexes\. + +## Supported versions ## + +Elasticsearch version 6\.0 or later + +## Create a connection to Elasticsearch ## + +To create the connection asset, you need these connection details: + + + + * Username and password + (Optional) Anonymous access + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Elasticsearch connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * SPSS Modeler + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Elasticsearch setup ## + +[Set up Elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup.html) + +## Restrictions ## + + + + * For Elasticsearch versions earlier than version 7, read is limited to 10,000 rows\. + * For Data Refinery, the only supported action on the target file is to append all the rows of the Data Refinery flow output to the existing data set\. + + + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [Elasticsearch Guide for SQL](https://www.elastic.co/guide/en/elasticsearch/reference/current/xpack-sql.html) for the correct syntax\. + +## Learn more ## + + + + * [Elasticsearch](https://www.elastic.co/elasticsearch/) + * [Elastic Docs](https://www.elastic.co/guide/en/elastic-stack/current/overview.html) + + + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3721517369cf4ea8476bcbb39040542ba2a212d8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3721517369cf4ea8476bcbb39040542ba2a212d8.md new file mode 100644 index 0000000..a3d8c64 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3721517369cf4ea8476bcbb39040542ba2a212d8.md @@ -0,0 +1,89 @@ +# IBM Cloud Databases for MongoDB connection + +# IBM Cloud Databases for MongoDB connection # + +To access your data in IBM Cloud Databases for MongoDB, create a connection asset for it\. + +IBM Cloud Databases for MongoDB is a MongoDB database that is managed by IBM Cloud\. It uses a JSON document store with a rich query and aggregation framework\. + +## Supported editions ## + + + + * MongoDB Community Edition + * MongoDB Enterprise Edition + + + +## Create a connection to IBM Cloud Databases for MongoDB ## + +To create the connection asset, you need these connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Authentication database: The name of the database in which the user was created\. + * Username and password + * SSL certificate (if required by the database server) + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use IBM Cloud Databases for MongoDB connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## IBM Cloud Databases for MongoDB setup ## + +[Getting Started Tutorial](https://cloud.ibm.com/docs/databases-for-mongodb?topic=databases-for-mongodb-getting-started-tutorial) + +## Restrictions ## + + + + * You can only use this connection for source data\. You cannot write to data or export data with this connection\. + * MongoDB Query Language (MQL) is not supported\. + + + +**Related connection**: [MongoDB connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mongo.html) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/378f6a8306234029de1642cbff8e44ed6848bf74.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/378f6a8306234029de1642cbff8e44ed6848bf74.md new file mode 100644 index 0000000..0e7f537 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/378f6a8306234029de1642cbff8e44ed6848bf74.md @@ -0,0 +1,9 @@ +# Extension Import node (SPSS Modeler) + +# Extension Import node # + +With the Extension Import node, you can run R scripts or Python for Spark scripts to import data\. + +After adding the node to your canvas, double\-click the node to open its properties\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/37d9428bd2e4a45ca968dad59d1005fb5fc4de9c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/37d9428bd2e4a45ca968dad59d1005fb5fc4de9c.md new file mode 100644 index 0000000..ff8a358 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/37d9428bd2e4a45ca968dad59d1005fb5fc4de9c.md @@ -0,0 +1,7 @@ +# C&R Tree node (SPSS Modeler) + +# C&R Tree node # + +The Classification and Regression (C&R) Tree node is a tree\-based classification and prediction method\. Similar to C5\.0, this method uses recursive partitioning to split the training records into segments with similar output field values\. The C&R Tree node starts by examining the input fields to find the best split, measured by the reduction in an impurity index that results from the split\. The split defines two subgroups, each of which is subsequently split into two more subgroups, and so on, until one of the stopping criteria is triggered\. All splits are binary (only two subgroups)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/37dc9376a7fb6eb772d242b85909a023c43c2417.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/37dc9376a7fb6eb772d242b85909a023c43c2417.md new file mode 100644 index 0000000..6032dbc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/37dc9376a7fb6eb772d242b85909a023c43c2417.md @@ -0,0 +1,246 @@ +# Federated Learning Tensorflow tutorial + +# Federated Learning Tensorflow tutorial # + +This tutorial demonstrates the usage of Federated Learning with the goal of training a machine learning model with data from different users without having users share their data\. The steps are done in a low code environment with the UI and with a Tensorflow framework\. + +Note:This is a step\-by\-step tutorial for running a UI driven Federated Learning experiment\. To see a code sample for an API driven approach, see [Federated Learning Tensorflow samples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-tf2-samples.html)\. Tip:In this tutorial, *admin* refers to the user that starts the Federated Learning experiment, and *party* refers to one or more users who send their model results after the experiment is started by the admin\. While the tutorial can be done by the admin and multiple parties, a single user can also complete a full runthrough as both the admin and the party\. For a simpler demonstrative purpose, in the following tutorial only one data set is submitted by one party\. For more information on the admin and party, see [Terminology](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-term.html)\. + +Watch this short video tutorial of how to create a Federated Learning experiment with Watson Studio\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +In this tutorial you will learn to: + + + + * [Step 1: Start Federated Learning as the admin](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-tf2-tutorial.html?context=cdpaas&locale=en#step-1) + * [Step 2: Train model as a party](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-tf2-tutorial.html?context=cdpaas&locale=en#step-2) + * [Step 3: Save and deploy the model online](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-tf2-tutorial.html?context=cdpaas&locale=en#step-3) + + + +## Step 1: Start Federated Learning as the admin ## + +In this tutorial, you train a Federated Learning experiment with a Tensorflow framework and the MNIST data set\. + +### Before you begin ### + + + +1. Log in to [IBM Cloud](https://cloud.ibm.com/)\. If you don't have an account, create one with any email\. +2. [Create a Watson Machine Learning service instance](https://cloud.ibm.com/catalog/services/machine-learning) if you do not have it set up in your environment\. +3. Log in to [watsonx](https://dataplatform.cloud.ibm.com/home2?context=wx)\. +4. Use an existing [project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html) or create a new one\. You must have at least admin permission\. +5. Associate the Watson Machine Learning service with your project\. + + + + 1. In your project, click the **Manage > Service & integrations**. + 2. Click **Associate service**. + 3. Select your Watson Machine Learning instance from the list, and click **Associate**; or click **New service** if you do not have one to set up an instance. + + + + ![Screenshot of associating the service](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl_tut_add_wml_service.png) + + + +### Start the aggregator ### + + + +1. Create the Federated learning experiment asset: + + + + 1. Click the **Assets** tab in your project. + 2. Click **New asset > Train models on distributed data**. + 3. Type a *Name* for your experiment and optionally a description. + 4. Verify the associated Watson Machine Learning instance under *Select a machine learning instance*. If you don't see a Watson Machine Learning instance associated, follow these steps: + + + + 1. Click **Associate a Machine Learning Service Instance**. + 2. Select an existing instance and click **Associate**, or create a **New service**. + 3. Click **Reload** to see the associated service. + + ![Screenshot of associating the service](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl_demo_2.png) + 4. Click **Next**. + + + + + +2. Configure the experiment\. + + + + 1. On the *Configure* page, select a *Hardware specification*. + 2. Under the *Machine learning framework* dropdown, select **Tensorflow 2**. + 3. Select a *Model type*. + 4. Download the [untrained model](https://github.com/IBMDataScience/sample-notebooks/raw/master/Files/tf_mnist_model.zip). + 5. Back in the Federated Learning experiment, click **Select** under *Model specification*. + 6. Drag the downloaded file named `tf_mnist_model.zip` onto the *Upload* file box.1. Select `runtime-22.2-py3.10` for the **Software Specification** dropdown. + 7. Give your model a name, and then click **Add**. + + ![Screenshot of importing an initial model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl_demo_3.png) + 8. Click **Weighted average** for the *Fusion method*, and click **Next**. + + ![Screenshot of Fusion methods UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl_demo_4.png) + + + +3. Define the hyperparameters\. + + + + 1. Accept the default hyperparameters or adjust as needed. + 2. When you are finished, click **Next**. + + + +4. Select remote training systems\. + + + + 1. Click **Add new systems**. + + ![Screenshot of Add RTS UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl_demo_7.png) + 2. Give your Remote Training System a name. + 3. Under **Allowed identities**, choose the user that is your party, and then click **Add**. In this tutorial, you can add a dummy user or yourself, for demonstrative purposes. + This user must be added to your project as a collaborator with *Editor* or higher permissions. Add additional systems by repeating this step for each remote party you intent to use. + 4. When you are finished, click **Add systems**. + + ![Screenshot of adding users](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl_demo_8.png) + 5. Return to the *Select remote training systems* page, verify that your system is selected, and then click **Next**. + + + +5. Review your settings, and then click **Create**\. +6. Watch the status\. Your Federated Learning experiment status is *Pending* when it starts\. When your experiment is ready for parties to connect, the status will change to *Setup – Waiting for remote systems*\. This may take a few minutes\. +7. Click **View setup information** to download the party configuration and the party connector script that can be run on the remote party\. +8. Click the download icon besides each of the remote training systems that you created, and then click **Party connector script**\. This gives you the party connector script\. Save the script to a directory on your machine\. + + ![Screenshot of Training UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl-demo_9_2.png) + + + +## Step 2: Train model as the party ## + +Follow these steps to train the model as a party: + + + +1. Ensure that you are using the same Python version as the admin\. Using a different Python version might cause compatibility issues\. To see Python versions compatible with different frameworks, see [Frameworks and Python version compatibility](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-frames.html#fl-py-fmwk)\. +2. Create a new local directory, and put your party connector script in it\. +3. [Download the data handler mnist\_keras\_data\_handler\.py](https://raw.githubusercontent.com/IBMDataScience/sample-notebooks/master/Files/mnist_keras_data_handler.py) by right\-clicking on it and click **Save link as**\. Save it to the same directory as the party connector script\. +4. [Download the MNIST handwriting data set](https://api.dataplatform.cloud.ibm.com/v2/gallery-assets/entries/903188bb984a30f38bb889102a1baae5/data) from our Samples\. In the the same directory as the party connector script, data handler, and the rest of your files, unzip it by running the unzip command `unzip MNIST-pkl.zip`\. +5. Install Watson Machine Learning\. + + + + * If you are using Linux, run `pip install 'ibm-watson-machine-learning[fl-rt22.2-py3.10]'`. + * If you are using Mac OS with M-series CPU and Conda, download the [installation script](https://raw.github.ibm.com/WML/federated-learning/master/docs/install_fl_rt22.2_macos.sh?token=AAAXW7VVQZF7LYMTX5VOW7DEDULLE) and then run `./install_fl_rt22.2_macos.sh `. + You now have the party connector script, `mnist_keras_data_handler.py`, `mnist-keras-test.pkl` and `mnist-keras-train.pkl`, data handler in the same directory. + + + +6. Your party connector script looks similar to the following\. Edit it by filling in the data file locations, the data handler, and API key for the user defined in the remote training system\. To get your API key, go to **Manage > Access(IAM) > API keys** in your [IBM Cloud account](https://cloud.ibm.com/iam/apikeys)\. If you don't have one, click **Create API key**, fill out the fields, and click **Create**\. + + from ibm_watson_machine_learning import APIClient + wml_credentials = { + "url": "https://us-south.ml.cloud.ibm.com", + "apikey": "" + } + wml_client = APIClient(wml_credentials) + wml_client.set.default_project("XXX-XXX-XXX-XXX-XXX") + party_metadata = { + wml_client.remote_training_systems.ConfigurationMetaNames.DATA_HANDLER: { + # Supply the name of the data handler class and path to it. + # The info section may be used to pass information to the + # data handler. + # For example, + # "name": "MnistSklearnDataHandler", + # "path": "example.mnist_sklearn_data_handler", + # "info": { + # "train_file": pwd + "/mnist-keras-train.pkl", + # "test_file": pwd + "/mnist-keras-test.pkl" + # } + "name": "", + "path": "", + "info": { + "" + } + } + } + party = wml_client.remote_training_systems.create_party("XXX-XXX-XXX-XXX-XXX", party_metadata) + party.monitor_logs() + party.run(aggregator_id="XXX-XXX-XXX-XXX-XXX", asynchronous=False) +7. Run the party connector script: `python3 rts__.py`\. + From the UI you can monitor the status of your Federated Learning experiment. + + + +## Step 3: Save and deploy the model online ## + +In this section, you will learn to save and deploy the model that you trained\. + + + +1. Save your model\. + + + + 1. In your completed Federated Learning experiment, click **Save model to project**. + 2. Give your model a name and click **Save**. + 3. Go to your project home. + + + +2. Create a deployment space, if you don't have one\. + + + + 1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg), click **Deployments**. + 2. Click **New deployment space**. + 3. Fill in the fields, and click **Create**. + + + +3. Promote the model to a space\. + + + + 1. Return to your project, and click the **Assets** tab. + 2. In the *Models* section, click the model to view its details page. + 3. Click **Promote to space**. + 4. Choose a deployment space for your trained model. + 5. Select the **Go to the model in the space after promoting it** option. + 6. Click **Promote**. + + + +4. When the model displays inside the deployment space, click **New deployment**\. + + + + 1. Select **Online** as the *Deployment type*. + 2. Specify a name for the deployment. + 3. Click **Create**. + + + +5. Click the **Deployments** tab to monitor your model's deployment status\. + + + +### Next steps ### + +Ready to create your own customized Federated Experiment? See the high level steps in [Creating your Federated Learning experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-start.html)\. + +**Parent topic:**[Federated Learning tutorial and samples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-demo.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/381d767decd07ef388611fd22c3f08fb89ba73ec.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/381d767decd07ef388611fd22c3f08fb89ba73ec.md new file mode 100644 index 0000000..7b934f9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/381d767decd07ef388611fd22c3f08fb89ba73ec.md @@ -0,0 +1,44 @@ +# The scripting context + +# The scripting context # + +The `modeler.script` module provides the context in which a script runs\. The module is automatically imported into an SPSS® Modeler script at run time\. The module defines four functions that provide a script with access to its execution environment: + + + + * The `session()` function returns the session for the script\. The session defines information such as the locale and the SPSS Modeler backend (either a local process or a networked SPSS Modeler Server) that's being used to run any flows\. + * The `stream()` function can be used with flow and SuperNode scripts\. This function returns the flow that owns either the flow script or the SuperNode script that's being run\. + * The `diagram()` function can be used with SuperNode scripts\. This function returns the diagram within the SuperNode\. For other script types, this function returns the same as the `stream()` function\. + * The `supernode()` function can be used with SuperNode scripts\. This function returns the SuperNode that owns the script that's being run\. + + + +The four functions and their outputs are summarized in the following table\. + + + +Summary of modeler.script functions + +Table 1\. Summary of `modeler.script` functions + +| Script type | `session()` | `stream()` | `diagram()` | `supernode()` | +| ----------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | ------------------- | +| Standalone | Returns a session | Returns the current managed flow at the time the script was invoked (for example, the flow passed via the batch mode `-stream` option), or `None`\. | Same as for `stream()` | Not applicable | +| Flow | Returns a session | Returns a flow | Same as for `stream()` | Not applicable | +| SuperNode | Returns a session | Returns a flow | Returns a SuperNode flow | Returns a SuperNode | + + + +The `modeler.script` module also defines a way of terminating the script with an exit code\. The `exit(exit-code)` function stops the script from running and returns the supplied integer exit code\. + +One of the methods that's defined for a flow is `runAll(List)`\. This method runs all executable nodes\. Any models or outputs that are generated by running the nodes are added to the supplied list\. + +It's common for a flow run to generate outputs such as models, graphs, and other output\. To capture this output, a script can supply a variable that's initialized to a list\. For example: + + stream = modeler.script.stream() + results = [] + stream.runAll(results) + +When execution is complete, any objects that are generated by the execution can be accessed from the `results` list\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/384eb2033ad74ea7044afc8bf1ddb06ff392cb08.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/384eb2033ad74ea7044afc8bf1ddb06ff392cb08.md new file mode 100644 index 0000000..fcc3480 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/384eb2033ad74ea7044afc8bf1ddb06ff392cb08.md @@ -0,0 +1,36 @@ +# Compute resource options for Synthetic Data Generator in projects + +# Compute resource options for Synthetic Data Generator in projects # + +To create data with the Synthetic Data Generator, you must have the Watson Studio and Watson Machine Learning services provisioned\. Running a synthetic data flow consumes compute resources from the Watson Studio service\. + +### Capacity units per hour for Synthetic Data Generator ### + + + +| Capacity type | Capacity units per hour | +| ------------------- | ----------------------- | +| 2 vCPU and 8 GB RAM | 7 | + + + +## Compute usage in projects ## + +Running a synthetic data flow consumes compute resources from the Watson Studio service\. + +You can monitor the total monthly amount of CUH consumption for Watson Studio on the **Resource usage** page on the **Manage** tab of your project\. + +## Learn more ## + + + + * [Synthetic data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/synthetic_data_overview_sd.html) + * [Watson Machine Learning service](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html) + * [Watson Studio service](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/ws-plans.html) + * [Monitoring account resource usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html) + + + +**Parent topic:**[Choosing compute resources for tools](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/385dec32600a9ded58fede3e98568fed789a400a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/385dec32600a9ded58fede3e98568fed789a400a.md new file mode 100644 index 0000000..0db6b62 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/385dec32600a9ded58fede3e98568fed789a400a.md @@ -0,0 +1,9 @@ +# Strings (SPSS Modeler) + +# Strings # + +Generally, you should enclose strings in double quotation marks\. Examples of strings are `"c35product2"` and `"referrerID"`\. + +To indicate special characters in a string, use a backslash (for example, `"\$65443"`)\. (To indicate a backslash character, use a double backslash, `\\`\.) You can use single quotes around a string, but the result is indistinguishable from a quoted field (`'referrerID'`)\. See [String functions](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_string.html#clem_function_ref_string) for more information\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3873a285dcb38ef4b4ed663bfa0df4047ab7692d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3873a285dcb38ef4b4ed663bfa0df4047ab7692d.md new file mode 100644 index 0000000..ee9cbb5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3873a285dcb38ef4b4ed663bfa0df4047ab7692d.md @@ -0,0 +1,6 @@ +# Word cloud charts + +# Word cloud charts # + +Word cloud charts present data as words, where the size and placement of any individual word is determined by how it is weighted\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3874aaf67ef04bb4d623fff07e1cdb4c25b3b33e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3874aaf67ef04bb4d623fff07e1cdb4c25b3b33e.md new file mode 100644 index 0000000..122bfb8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3874aaf67ef04bb4d623fff07e1cdb4c25b3b33e.md @@ -0,0 +1,12 @@ +# Tutorials (SPSS Modeler) + +# Tutorials # + +These tutorials use the assets that are available in the sample project, and they provide brief, targeted introductions to specific modeling methods and techniques\. + +You can build the example flows provided by following the steps in the tutorials\. + +Some of the simple flows are already completed in the projects, but you can still walk through them using their accompanying tutorials\. Some of the more complicated flows must be completed by following the steps in the tutorials\. + +Important: Before you begin the tutorials, complete the following steps to create the sample projects\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/38d24508b131beb6138652c2fd1e0380a001bb54.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/38d24508b131beb6138652c2fd1e0380a001bb54.md new file mode 100644 index 0000000..74c21d5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/38d24508b131beb6138652c2fd1e0380a001bb54.md @@ -0,0 +1,37 @@ +# Filler node (SPSS Modeler) + +# Filler node # + +Filler nodes are used to replace field values and change storage\. You can choose to replace values based on a specified CLEM condition, such as `@BLANK(FIELD)`\. Alternatively, you can choose to replace all blanks or null values with a specific value\. Filler nodes are often used in conjunction with the Type node to replace missing values\. + +Fill in fields\. Select fields from the dataset whose values will be examined and replaced\. The default behavior is to replace values depending on the specified Condition and Replace with expressions\. You can also select an alternative method of replacement using the Replace options\. + +Note: When selecting multiple fields to replace with a user\-defined value, it is important that the field types are similar (all numeric or all symbolic)\. + +Replace\. Select to replace the values of the selected field(s) using one of the following methods: + + + + * Based on condition\. This option activates the Condition field and Expression Builder for you to create an expression used as a condition for replacement with the value specified\. + * Always\. Replaces all values of the selected field\. For example, you could use this option to convert the storage of income to a string using the following CLEM expression: `(to_string(income))`\. + * Blank values\. Replaces all user\-specified blank values in the selected field\. The standard condition `@BLANK(@FIELD)` is used to select blanks\. *Note*: You can define blanks using the Types tab of the source node or with a Type node\. + * Null values\. Replaces all system null values in the selected field\. The standard condition `@NULL(@FIELD)` is used to select nulls\. + * Blank and null values\. Replaces both blank values and system nulls in the selected field\. This option is useful when you are unsure whether or not nulls have been defined as missing values\. + + + +Condition\. This option is available when you have selected the Based on condition option\. Use this text box to specify a CLEM expression for evaluating the selected fields\. Click the calculator button to open the Expression Builder\. + +Replace with\. Specify a CLEM expression to give a new value to the selected fields\. You can also replace the value with a null value by typing undef in the text box\. Click the calculator button to open the Expression Builder\. + +Note: When the field(s) selected are string, you should replace them with a string value\. Using the default 0 or another numeric value as the replacement value for string fields will result in an error\.Note that use of the following may change row order: + + + + * Running in a database via SQL pushback + * Deriving a list + * Calling any of the CLEM spatial functions + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/38dbe0e16434502696281563802b76f3e38b25d2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/38dbe0e16434502696281563802b76f3e38b25d2.md new file mode 100644 index 0000000..a56433e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/38dbe0e16434502696281563802b76f3e38b25d2.md @@ -0,0 +1,91 @@ +# Saving your work + +# Saving your work # + +Prompt engineering involves trial and error\. Keep track of your experimentation and save model\-and\-prompt combinations that generate the output you want\. + +When you save your work, you can choose to save it as different asset types\. Saving your work as an asset makes it possible to share your work with collaborators in the current project\. + + + +Table 1: Asset types + +| Asset type | When to use this asset type | What is saved | How to retrieve the asset | +| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | +| Prompt template asset | When you find a combination of prompt static text, prompt variables, and prompt engineering parameters that generate the results you want from a specific model and want to reuse it\. | Prompt text, model, prompt engineering parameters, and prompt variables\.
**Note**: The output that is generated by the model is not saved\. | From the **Saved prompt templates** tab | +| Prompt session asset | When you want to keep track of the steps involved with your experimentation so you know what you've tried and what you haven't\. | Prompt text, model, prompt engineering parameters, and model output for up to 500 prompts that are submitted during a prompt engineering session\. | From the **History** tab | +| Notebook asset | When you want to work with models programmatically, but want to start from the Prompt Lab interface for a better prompt engineering experience\. | Prompt text, model, prompt engineering parameters, and prompt variable names and default values are formatted as Python code and stored as a notebook\. | From the **Assets** page of the project | + + + +Each of these asset types is available from the project's **Assets** page\. Project collaborators with the **Admin** or **Editor** role can open and work with them\. Your prompt template and prompt session assets are locked automatically, but you can unlock them by clicking the lock icon (![Lock icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/lockicon-new.png))\. + +## Saving your work ## + +To save your prompt engineering work, complete the following steps: + + + +1. From the header of the prompt editor, click **Save work**, and then click **Save as**\. +2. Choose an asset type\. +3. Name the asset, and then optionally add a description\. +4. Choose the task type that best matches your goal\. +5. *If you save the prompt as a notebook asset only*: Select **View in project after saving**\. +6. Click **Save**\. + + + +## Working with prompts saved in a notebook ## + +When you save your work as a notebook asset, a Python notebook is built\. + +To work with a prompt notebook asset, complete the following steps: + + + +1. Open the notebook asset from the **Assets** tab of your project\. +2. Click the Edit icon (![edit notebook icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/edit.svg)) to instantiate the notebook so you can step through the code\. + + The notebook contains runnable code that manages the following steps for you: + + + + * Authenticates with the service. + * Defines a Python class. + * Defines the input text for the model and declares any prompt variables. You can edit the static prompt text and assign values to prompt variables. + * Uses the defined class to call the watsonx.ai inferencing API and pass your input to the foundation model. + * Shows the output that is generated by the foundation model. + + + +3. Use the notebook as is, or change it to meet the needs of your use case\. + + The Python code that is generated by using the Prompt Lab executes successfully. You must test and validate any changes that you make to the code. + + + +## Working with saved prompt templates ## + +To continue working with a saved prompt, open it from the **Saved prompt templates** tab of the Prompt Lab\. + +When you open a saved prompt template, **Autosave** is on, which means that any changes you make to the prompt will be reflected in the saved prompt template asset\. If you want the prompt template that you saved to remain unchanged, click **New prompt** to start a new prompt\. + +For more information, see [Building reusable prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-variables.html)\. + +## Working with saved prompt sessions ## + +To continue working with a saved prompt session, open it from the **History** tab of the Prompt Lab\. + +To review previous prompt submissions, you can click a prompt entry from the history to open it in the prompt editor\. If you prefer the results from the earlier prompt, you can reset it as your current prompt by clicking **Restore**\. When you restore an earlier prompt, your current prompt session is replaced by the earlier version of the prompt session\. + +## Learn more ## + + + + * [Security and privacy for foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-security.html) + + + +**Parent topic:**[Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/38fb0908b90954d96ceff54ba975de832286a0a7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/38fb0908b90954d96ceff54ba975de832286a0a7.md new file mode 100644 index 0000000..bb2bb06 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/38fb0908b90954d96ceff54ba975de832286a0a7.md @@ -0,0 +1,68 @@ +# Security and privacy for foundation models + +# Security and privacy for foundation models # + +Your work with foundation models is secure and private, in the same way that all your work on watsonx is secure and private\. + +Foundation models that you interact with through watsonx are hosted in IBM Cloud\. Your data is not sent to any third\-party or open source platforms\. + +The foundation model prompts that you create and engineer in the Prompt Lab or send by using the API are accessible only by you\. Your prompts are used only by you and are submitted only to models you choose\. Your prompt text is not accessible or used by IBM or any other person or organization\. + +You control whether prompts, model choices, and prompt engineering parameter settings are saved\. When saved, your data is stored in a dedicated IBM Cloud Object Storage bucket that is associated with your project\. + +Data that is stored in your project storage bucket is encrypted at rest and in motion\. You can delete your stored data at any time\. + +## Privacy of text in Prompt Lab during a session ## + +Text that you submit by clicking **Generate** from the prompt editor in Prompt Lab is reformatted as tokens, and then submitted to the foundation model you choose\. The submitted message is encrypted in transit\. + +Your prompt text is not saved unless you choose to save your work\. + +Unsaved prompt text is kept in the web page until the page is refreshed, at which time the prompt text is deleted\. + +## Privacy and security of saved work ## + +How saved work is managed differs based on the asset type that you choose to save: + + + + * **Prompt template asset**: The current prompt text, model, prompt engineering parameters, and any prompt variables are saved as a prompt template asset and stored in the IBM Cloud Object Storage bucket that is associated with your project\. Prompt template assets are retained until they are deleted or changed by you\. When autosave is on, if you open a saved prompt and change the text, the text in the saved prompt template asset is replaced\. + * **Prompt session asset**: A prompt session asset includes the prompt input text, model, prompt engineering parameters, and model output\. After you create the prompt session asset, prompt information for up to 500 submitted prompts is stored in the project storage bucket where it is retained for 30 days\. + * **Notebook asset**: Your prompt, model, prompt engineering parameters, and any prompt variables are formatted as Python code and stored as a notebook asset in the project storage bucket\. + + + +Only people with **Admin** or **Editor** role access to the project or the project storage bucket can view saved assets\. You control who can access your project and its associated Cloud Object Storage bucket\. + + + + * For more information about asset security, see [Data security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-data.html)\. + * For more information about managing project access, see [Project collaborators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html) + + + +## Logging and text in the Prompt Lab ## + +Nothing that you add to the prompt editor or submit to a model from the Prompt Lab or by using the API is logged by IBM\. Messages that are generated by foundation models and returned to the Prompt Lab also are not logged\. + +## Ownership of your content and foundation model output ## + +Content that you upload into watsonx is yours\. + +IBM does not use the content that you upload to watsonx or the output generated by a foundation model to further train or improve any IBM developed models\. + +IBM does not claim to have any ownership rights to any foundation model outputs\. You remain solely responsible for your content and the output of any foundation model\. + +## Learn more ## + + + + * [Watsonx terms](https://www.ibm.com/support/customer/csol/terms/?id=i126-9640&lc=en#detail-document) + * [IBM Watson Machine Learning terms](http://www.ibm.com/support/customer/csol/terms/?id=i126-6883) + * [IBM Watson Studio terms](https://www.ibm.com/support/customer/csol/terms/?id=i126-7747) + + + +**Parent topic:**[Foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/391dbd504569f02ccc48b181e3b953198c8f3c8a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/391dbd504569f02ccc48b181e3b953198c8f3c8a.md new file mode 100644 index 0000000..fec3e0b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/391dbd504569f02ccc48b181e3b953198c8f3c8a.md @@ -0,0 +1,91 @@ +# Managing an inventory for AI use cases + +# Managing an inventory for AI use cases # + +Create or manage an inventory for storing and reviewing AI use cases\. AI use cases collect governance facts for AI assets your organization tracks\. You can view all the AI use cases in an inventory or open one to explore the details of an AI asset\. + +## Creating an inventory for AI use cases ## + +You must have Admin rights to create and manage an inventory\. For more information, see [Collaboration roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-collab-roles.html)\. + + + +1. Click **AI use cases** from the navigation menu\. +2. Click the settings icon ![gear icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/ml-setting-icon.png) for the AI use cases view\. + + ![Opening settings for AI use cases inventory](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-use-case-settings.png) +3. Click **New inventory** on the **Inventory management** tab\. +4. Assign a name, add an optional description, and associate a Cloud Object Storage instance\. +5. (Optional) Click **General** to extend the functions of an inventory with these options: + + + + * If there is no Platform Access Catalog available for your account, you are prompted to create one. A Platform Access Catalog (PAC) is a platform catalog that provides a repository for inventory assets. It is required for governing external models or managing attachments and reports. + * Enable the option for **External model governance** to govern models that are trained with machine learning providers other than the Watson Machine Learning. For a list of supported providers, see [Supported machine learning providers](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-frameworks-ovr.html). + + + + + +## Adding collaborators to an inventory ## + +Inventories are meant to be collaborative so that multiple people that perform different roles can contribute to governance of key assets\. To add collaborators to an inventory: + + + +1. From the **Inventory management** tab, click **Set access** from the overflow menu for the inventory\. +2. Click **Add collaborators** to add collaborators individually, or by user group\. +3. Assign a role of Admin, Editor, or Viewer\. +4. Collaborators are added to the list for the inventory\. You can remove or change the assigned access as needed\. + + + +## Managing external models, report templates, and attachments ## + +You can extend inventory management to include the ability to govern external models, customize report templates, and manage attachments for factsheets\. + +Before you can access these services, you must have access to a Platform Access Catalog\. A Platform Access Catalog is a common catalog for storing data connections and is required for governing external models and notebooks, and for customizing report templates and creating attachment groups\. + +### Creating a Platform Assets Catalog ### + +If you have Admin access, you can create a Platform Access Catalog if one does not exist\. + + + +1. From the **General** tab of Inventory Management, you are prompted to create a Platform Access Catalog\. +2. Click **Get started** and follow the prompts to name the catalog, associate it with a Cloud Object Storage instance, and specify some configuration details\. +3. After the catalog is created, you can add users as collaborators in the catalog\. + + + +### Enabling governance of external models ### + +Enable governance for models that are created in notebooks or outside of Cloud Pak for Data\. Track the results of model evaluations and model details in factsheets\. + + + +1. From the General tab of an inventory, enable the option for **External model management**\. +2. Select an inventory for tracking external models\. +3. Select an owner, then click **Apply\.** + + + +Note: When external models are added, they are listed under AI use cases in the main navigation menu\. + +### Managing report templates ### + +As an inventory administrator, you can manage report templates to customize the report templates for inventory users\. + +For details, see [Managing report templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-manage-reports.html)\. + +### Managing attachments ### + +As an inventory administrator, you can create and manage attachment groups for AI use cases to provide the structure for users to attach supporting files to enrich a use case or a factsheet\. For example, if you want every use case to include approval documents, you can create a group to define placeholders for those documents in each use case\. Users can then upload the documents to those placeholder slots\. + +For more information, see [Managing attachments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-manage-attachments.html) + +## Learn more ## + +**Parent topic:**[Governing assets in AI use cases](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-use-cases.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/398a23291331968098b47496d504743991855a61.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/398a23291331968098b47496d504743991855a61.md new file mode 100644 index 0000000..db82ef1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/398a23291331968098b47496d504743991855a61.md @@ -0,0 +1,32 @@ +# kdemodel properties + +# kdemodel properties # + +![KDE Modeling node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/pythonkdenodeicon.png)Kernel Density Estimation (KDE)© uses the Ball Tree or KD Tree algorithms for efficient queries, and combines concepts from unsupervised learning, feature engineering, and data modeling\. Neighbor\-based approaches such as KDE are some of the most popular and useful density estimation techniques\. The KDE Modeling and KDE Simulation nodes in SPSS Modeler expose the core features and commonly used parameters of the KDE library\. The nodes are implemented in Python\. + + + +kdemodel properties + +Table 1\. kdemodel properties + +| `kdemodel` properties | Data type | Property description | +| --------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `custom_fields` | *boolean* | This option tells the node to use field information specified here instead of that given in any upstream Type node(s)\. After selecting this option, specify the following fields as required\. | +| `inputs` | *field* | List of the field names for input\. | +| `bandwidth` | *double* | Default is `1`\. | +| `kernel` | *string* | The kernel to use: `gaussian`, `tophat`, `epanechnikov`, `exponential`, `linear`, or `cosine`\. Default is `gaussian`\. | +| `algorithm` | *string* | The tree algorithm to use: `kd_tree`, `ball_tree`, or `auto`\. Default is `auto`\. | +| `metric` | *string* | The metric to use when calculating distance\. For the `kd_tree` algorithm, choose from: `Euclidean`, `Chebyshev`, `Cityblock`, `Minkowski`, `Manhattan`, `Infinity`, `P`, `L2`, or `L1`\. For the `ball_tree` algorithm, choose from: `Euclidian`, `Braycurtis`, `Chebyshev`, `Canberra`, `Cityblock`, `Dice`, `Hamming`, `Infinity`, `Jaccard`, `L1`, `L2`, `Minkowski`, `Matching`, `Manhattan`, `P`, `Rogersanimoto`, `Russellrao`, `Sokalmichener`, `Sokalsneath`, or `Kulsinski`\. Default is `Euclidean`\. | +| `atol` | *float* | The desired absolute tolerance of the result\. A larger tolerance will generally lead to faster execution\. Default is `0.0`\. | +| `rtol` | *float* | The desired relative tolerance of the result\. A larger tolerance will generally lead to faster execution\. Default is `1E-8`\. | +| `breadth_first` | *boolean* | Set to `True` to use a breadth\-first approach\. Set to `False` to use a depth\-first approach\. Default is `True`\. | +| `leaf_size` | *integer* | The leaf size of the underlying tree\. Default is `40`\. Changing this value may significantly impact the performance\. | +| `p_value` | *double* | Specify the P Value to use if you're using `Minkowski` for the metric\. Default is `1.5`\. | +| `custom_name` | | | +| `default_node_name` | | | +| `use_HPO` | | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/39ad64c9004e83507a968c5c0b1c8ef952b3eace.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/39ad64c9004e83507a968c5c0b1c8ef952b3eace.md new file mode 100644 index 0000000..cd713f9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/39ad64c9004e83507a968c5c0b1c8ef952b3eace.md @@ -0,0 +1,188 @@ +# Setting up IBM Cloud Object Storage for use with IBM watsonx + +# Setting up IBM Cloud Object Storage for use with IBM watsonx # + +An IBM Cloud Object Storage service instance is provisioned automatically with a Lite plan when you join IBM watsonx\. Workspaces, such as projects, require IBM Cloud Object Storage to store files that are related to assets, including uploaded data files or notebook files\. + +You can also connect to IBM Cloud Object Storage as a data source\. See [IBM Cloud Object Storage connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html)\. + +## Overview of setting up Cloud Object Storage ## + +To set up Cloud Object Storage, complete these tasks: + + + +1. [Generate an administrative key](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html?context=cdpaas&locale=en#gen-key)\. +2. [Ensure that Global location is set in each user's profile](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html?context=cdpaas&locale=en#global)\. +3. [Provide access to Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html?context=cdpaas&locale=en#access)\. + + + + * [Assign roles to enable access](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html?context=cdpaas&locale=en#assign). + * [Enable storage delegation](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html?context=cdpaas&locale=en#stor-del). + + + +4. [Optional: Protect sensitive data](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html?context=cdpaas&locale=en#protect)\. +5. [Optional: Encrypt your IBM Cloud Object Storage instance with your own key](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html?context=cdpaas&locale=en#byok)\. + + + +Watch the following video to see how administrators set up Cloud Object Storage for use with Cloud Pak for Data as a Service\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Generate an administrative key ## + +You generate an administrative key for Cloud Object Storage by creating an initial test project\. The test project can be deleted after its creation\. Its sole purpose is to generate the key\. + +To automatically generate the administrative key for your Cloud Object Storage instance: + + + +1. From the IBM watsonx main menu, select **Projects > View all projects** and then click **New project**\. +2. Specify to create an empty project\. +3. Enter a project name, such as "Test Project"\. +4. Select your Cloud Object Storage instance\. +5. Click **Create**\. The administrative key is generated\. +6. Delete the test project\. + + + +## Ensure that Global location is set for Cloud Object Storage in each user's profile ## + +Cloud Object Storage requires the Global location to be configured in each user's profile\. The Global location is configured automatically, but it might be changed by mistake\. An error occurs when a project is created if the Global location is not enabled in the user's profile\. Ask users to check that Global location is enabled\. + +[Check for the **Global** location in each user's profile](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/personal-settings.html)\. + +## Provide access to Cloud Object Storage ## + +You can provide different levels of access to Cloud Object Storage for people who need to work in IBM watsonx\. Using the storage delegation setting on the Cloud Object Storage instance, you can provide quick access to most users to create projects and catalogs\. However, another option is to provide targeted access by using IAM roles and access groups\. Role\-based access enacts stricter controls for viewing the Cloud Object Storage instance directly and for creating projects and catalogs\. If you decide to provide controlled access with IAM roles and access groups, you must disable storage delegation for the Cloud Object Storage instance\. + +You enable storage delegation for the Cloud Object Storage instance to provide access to nonadministrative users\. Users with minimal IAM permissions can create projects and catalogs, which automatically create buckets in the Cloud Object Storage instance\. See [Enable storage delegation for nonadministrative users](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html?context=cdpaas&locale=en#stor-del)\. + +You provide more controlled access with IAM roles and access groups\. For example, the Cloud Object Storage **Manager** role provides permissions to create projects and spaces together with the corresponding buckets in the Cloud Object Storage instance\. It also provides permissions to view all buckets and encryption root keys in the Cloud Object Storage instance, to view the metadata for a bucket and delete buckets, and to perform other administrative tasks that are related to buckets\. See [Assign roles to enable access](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html?context=cdpaas&locale=en#assign)\. + +No role assignments are needed for collaborators who work with the data in a project or catalog\. Users who are given collaborator roles can work in the project or catalog without storage delegation or an IAM role\. See [Project collaborator roles and permissions](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborator-permissions.html)\. + +### Assign roles to enable access ### + +The IBM Cloud account owner or administrator assigns appropriate roles to users to provide access to Cloud Object Storage\. Storage delegation must be disabled when using role\-based access\. + +Rather than assigning each individual user a set of roles, you can create an access group\. Access groups expedite role assignments by grouping permissions\. For instructions on creating access groups, see [IBM Cloud docs: Setting up access groups](https://cloud.ibm.com/docs/account?topic=account-groups&interface=ui)\. + +### Enable storage delegation ### + +Storage delegation for the Cloud Object Storage instance allows nonadministrative users to create projects, the Platform assets catalog, and the corresponding Cloud Object Storage buckets\. Storage delegation provides wide access to Cloud Object Storage and allows users with minimal permissions to create projects\. Storage delegation for projects also includes deployment spaces\. + +To enable storage delegation for the Cloud Object Storage instance: + + + +1. From the navigation menu, select **Administration > Configurations and settings > Storage delegation**\. +2. Set storage delegation for Projects to on\. +3. Optional\. If you want a non\-administrative user to create the Platform assets catalog, set storage delegation for Catalogs to on\. + + + +![Storage delegation](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/cos-delegation.png) + +## Optional: Encrypt your IBM Cloud Object Storage instance with your own key ## + +Encryption protects the data for your projects and catalogs\. Data at rest in Cloud Object Storage is encrypted by default with randomly generated keys that are managed by IBM\. For increased protection, you can create and manage your own encryption keys with IBM Key Protect\. IBM Key Protect for IBM Cloud is a centralized key management system for generating, managing, and deleting encryption keys used by IBM Cloud services\. + +For more information, see [IBM Cloud docs: IBM Key Protect for IBM Cloud](https://cloud.ibm.com/docs/services/key-protect?topic=key-protect-about#about)\. + +Not all [Watson Studio service plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/ws-plans.html) support the use of your own encryption keys\. Check your specific plan for details\. + +To encrypt your Cloud Object Storage instance with your own key, you need an instance of the IBM Key Project service\. Although Key Protect is a paid service, each account is allowed five keys without charge\. + +In IBM Cloud, provision Key Protect and generate a key: + + + +1. Create an instance of Key Protect for your account from the IBM Cloud catalog\. See [IBM Cloud docs: Provisioning the Key Protect service](https://cloud.ibm.com/docs/key-protect?topic=key-protect-provision&interface=ui)\. +2. Grant a service authorization between your Key Protect instance and your Cloud Object Storage instance\. Do not associate a key with a bucket\. If you don't grant the authorization, users cannot create projects and catalogs with the Cloud Object Storage instance\. For more information, see [IBM Cloud docs: Using authorizations to grant access between services](https://cloud.ibm.com/docs/account?topic=account-serviceauth&interface=ui)\. You can also grant a service authorization for a root key from Watson Studio, by choosing **Manage > Access (IAM)**\. +3. Create a root key to protect your Cloud Object Storage instance\. See [IBM Cloud docs: Creating root keys](https://cloud.ibm.com/docs/key-protect?topic=key-protect-create-root-keys&interface=ui#create_root_keys)\. + + + +In IBM watsonx, add the key to the Cloud Object Storage instance: + + + +1. Select **Administration > Configurations and settings > Storage delegation**\. +2. Slide the toggle for **Projects**, **Catalogs**, or both to select data for encryption with your key\. +3. Click **Add\.\.\.** under **Encryption keys** to add an encryption key\. +4. Select the **Key Protect instance** and the **Key Protect key**\. +5. Click **OK** to add the encryption key\. + + + +Important: If you change or remove the key, you lose access to existing encrypted data in the Cloud Object Storage instance\. + +## Optional: Protect sensitive data stored on Cloud Object Storage ## + +When you join IBM watsonx, a single Cloud Object Storage instance is automatically provisioned for you\. The Cloud Object Storage instance contains separate buckets for each project to store data assets and related files\. The ability to create projects and thus to add buckets to Cloud Object Storage is available only to users with the Platform **Administrator** role and the **Manager** role for the Cloud Object Storage Service\. Although only users with these roles can create projects and their accompanying buckets, any user with the **Editor** or **Viewer** role can see the data files\. For some businesses, the data files contain sensitive information and require stricter access controls\. + +### Control access to Cloud Object Storage with multiple instances ### + +For paid plans, you can control access to sensitive data files by creating one or more Cloud Object Storage instances and assigning access to specific users\. Project creators select the appropriate Cloud Object Storage instance when they create a project\. The data assets and files for the project are stored in a bucket in the selected instance\. Users with **Editor** or **Viewer** roles can work in the projects, but they cannot see the assets directly in the related Cloud Object Storage bucket\. You can assign access to a specific Cloud Object Storage instance either to an individual user or to an access group\. You must be the account owner or administrator to create service instances and assign access\. + +Extra fees are not incurred by creating more than one Cloud Object Storage instances because charges are determined by overall storage utilization\. The number of instances is not a factor for Cloud Object Storage fees\. + +Only one instance of Cloud Object Storage is allowed for the Lite plan\. You can change your pricing plan from the IBM Cloud catalog\. + +To create a Cloud Object Storage instance and assign access: + + + +1. Select **Services > Services catalog** from the navigation menu\. +2. Select **Storage > Cloud Object Storage**\. +3. Click **Create**\. A Service name is generated for you on IBM Cloud\. +4. Select **Manage > Access(IAM)**\. +5. Select **Users** or **Access groups**\. +6. Click **Assign access**\. +7. In the **Services** list, choose Cloud Object Storage\. +8. For **Resources**, choose: + + + + * Scope = Specific resources + * Attribute type = Service instance + * Operator = string equals + * Value = name of Cloud Object Storage + + + +9. **For Roles and actions**, choose: + + + + * Service access = Manager + * Platform access = Administrator + + + +10. Click **Add** and **Assign**\. + + + +The specified Cloud Object Storage instance can be accessed only by the user or access group with the Service role of Manager and the Platform role of Administrator\. Other users can work in the projects but cannot create projects or view assets directly in the bucket\. + +## Next step ## + +Finish the remaining steps for [setting up the platform](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-platform.html)\. + +## Learn more ## + + + + * [Security for IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html) + * [Data security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-data.html) + + + +**Parent topic:**[Setting up the platform](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-platform.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3a81b302ee01fdc0ac111cff3abfdb96e3a0cdd6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3a81b302ee01fdc0ac111cff3abfdb96e3a0cdd6.md new file mode 100644 index 0000000..4fb03ae --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3a81b302ee01fdc0ac111cff3abfdb96e3a0cdd6.md @@ -0,0 +1,54 @@ +# Security for IBM watsonx + +# Security for IBM watsonx # + +Security mechanisms in IBM watsonx provide protection for data, applications, identity, and resources\. You can configure security mechanisms on five levels for IBM Cloud security functions\. + +## Security levels in IBM watsonx ## + +Security for IBM watsonx is configured on levels to ensure that your data, application endpoints, and identity are protected on any cloud\. The security levels are: + + + +1. [Network security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html) – Network security protects the network infrastructure and the points where your database or applications interact with the cloud\. For example, you can protect your network by allowing IP addresses, by connecting securely to databases and third\-party clouds, and by securing endpoints\. +2. [Enterprise security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-enterprise.html) – Enterprises are multiple IBM Cloud accounts in a hierarchy\. For example, your company might have many teams that require one or more separate accounts for development, testing, and production environments\. Or, you can configure an enterprise to isolate workloads in separate accounts to meet compliance guidelines\. +3. [Account security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-account.html) – Account security includes IAM and Access group roles, Service IDs, monitoring, and other security mechanisms that are configured on IBM Cloud for your IBM Cloud account\. +4. [Data security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-data.html) – Data security protects the IBM Cloud Object Storage service instance, provides data encryption for at\-rest and in\-motion data, and other security mechanisms related to data\. +5. [Collaborator security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-collab.html) – Protect your workspaces by assigning role\-based access controls to collaborators in IBM watsonx\. + + + +IBM watsonx conforms to IBM Cloud security requirements\. See [IBM Cloud docs: How do I know that my data is safe?](https://cloud.ibm.com/docs/overview?topic=overview-security)\. + +## Resiliency ## + +IBM watsonx is disaster resistant: + + + + * The metadata for your projects and catalogs is stored in a three\-node dedicated Cloudant Enterprise cluster that spans multiple geographic locations\. + * The files that are associated with projects and catalogs are protected by the level of resiliency that is specified by the IBM Cloud Object Storage plan\. + + + +## Compliance ## + +See [Keep your data secure and compliant](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security.html)\. + +## Learn more ## + + + + * [watsonx terms](https://www.ibm.com/support/customer/csol/terms/?id=i126-9640&lc=en#detail-document) + * [IBM Watson Machine Learning terms](http://www.ibm.com/support/customer/csol/terms/?id=i126-6883) + * [IBM Watson Studio terms](https://www.ibm.com/support/customer/csol/terms/?id=i126-7747) + * [IBM Cloud Object Storage terms](https://www.ibm.com/software/sla/sladb.nsf/sla/bm-7857-03) + * [Managing security and compliance in IBM Cloud](https://cloud.ibm.com/docs/overview?topic=overview-manage-security-compliance) + * [Software Product Compatibility Reports: IBM Watson Studio](https://www.ibm.com/software/reports/compatibility/clarity-reports/report/html/softwareReqsForProduct?deliverableId=95E9BEA0B35711E7A9EB066095601ABB)\. + * [Software Product Compatibility Reports: IBM Watson Machine Learning service](https://www.ibm.com/software/reports/compatibility/clarity-reports/report/html/softwareReqsForProduct?deliverableId=850D9360405711E5B2E4A36A7B0C4479)\. + + + +**Parent topic:**[Administering your accounts and services](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/administer-accounts.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3a9dc582441c2474e183da0e7dac20fb182842c2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3a9dc582441c2474e183da0e7dac20fb182842c2.md new file mode 100644 index 0000000..b5f6ed2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3a9dc582441c2474e183da0e7dac20fb182842c2.md @@ -0,0 +1,13 @@ +# Auto Cluster node (SPSS Modeler) + +# Auto Cluster node # + +The Auto Cluster node estimates and compares clustering models that identify groups of records with similar characteristics\. The node works in the same manner as other automated modeling nodes, enabling you to experiment with multiple combinations of options in a single modeling pass\. Models can be compared using basic measures with which to attempt to filter and rank the usefulness of the cluster models, and provide a measure based on the importance of particular fields\. + +Clustering models are often used to identify groups that can be used as inputs in subsequent analyses\. For example, you may want to target groups of customers based on demographic characteristics such as income, or based on the services they have bought in the past\. You can do this without prior knowledge about the groups and their characteristics \-\- you may not know how many groups to look for, or what features to use in defining them\. Clustering models are often referred to as unsupervised learning models, since they do not use a target field, and do not return a specific prediction that can be evaluated as true or false\. The value of a clustering model is determined by its ability to capture interesting groupings in the data and provide useful descriptions of those groupings\. + +Requirements\. One or more fields that define characteristics of interest\. Cluster models do not use target fields in the same manner as other models, because they do not make specific predictions that can be assessed as true or false\. Instead, they are used to identify groups of cases that may be related\. For example, you cannot use a cluster model to predict whether a given customer will churn or respond to an offer\. But you can use a cluster model to assign customers to groups based on their tendency to do those things\. Weight and frequency fields are not used\. + +Evaluation fields\. While no target is used, you can optionally specify one or more evaluation fields to be used in comparing models\. The usefulness of a cluster model may be evaluated by measuring how well (or badly) the clusters differentiate these fields\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3acf4aabd6be9c3bc0e0a363c3bfffdd4a37b442.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3acf4aabd6be9c3bc0e0a363c3bfffdd4a37b442.md new file mode 100644 index 0000000..18fd383 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3acf4aabd6be9c3bc0e0a363c3bfffdd4a37b442.md @@ -0,0 +1,46 @@ +# Monitoring the experiment and saving the model + +# Monitoring the experiment and saving the model # + +Any party or admin with collaborator access to the experiment can monitor the experiment and save a copy of the model\. + +As the experiment runs, you can check the progress of the experiment\. After the training is complete, you can view your results, save and deploy the model, and then test the model with new data\. + +## Monitoring the experiment ## + +When all parties run the party connector script, the experiment starts training automatically\. As the training runs, you can view a dynamic diagram of the training progress\. For each round of training, you can view the four stages of a training round: + + + + * **Sending model**: Federated Learning sends the model metrics to each party\. + * **Training**: The process of training the data locally\. Each party trains to produce a local model that is fused\. No data is exchanged between parties\. + * **Receiving models**: After training is complete, each party sends its local model to the aggregator\. The data is not sent and remains private\. + * **Aggregating**: The aggregator combines the models that are sent by each of the remote parties to create an aggregated model\. + + + +## Saving your model ## + +When the training is complete, a chart that displays the model accuracy over each round of training is drawn\. Hover over the points on the chart for more information on a single point's exact metrics\. + +A **Training rounds** table shows details for each training round\. The table displays the participating parties' average accuracy of their model training for each round\. + +![Screenshot of View Setup Information](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl-display.png) + +When you are done with the viewing, click **Save model to project** to save the Federated Learning model to your project\. + +### Rerun the experiment ### + +You can rerun the experiment as many times as you need in your project\. + +Note:If you encounter errors when rerunning an experiment, see [Troubleshoot](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-troubleshoot.html) for more details\. + +### Deploying your model ### + +After you save your Federated Learning model, you can deploy and score the model like other machine learning models in a Watson Studio platform\. + +See [Deploying models](https://dataplatform.cloud.ibm.com/docs/content/wsj/wmls/wmls-deploy-overview.html) for more details\. + +**Parent topic:**[Creating a Federated Learning experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-start.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3af15cb9e302a9e0d7de22de648ef7b3dca1d865.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3af15cb9e302a9e0d7de22de648ef7b3dca1d865.md new file mode 100644 index 0000000..bc2fd77 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3af15cb9e302a9e0d7de22de648ef7b3dca1d865.md @@ -0,0 +1,214 @@ +# Tutorial: AutoAI univariate time series experiment + +# Tutorial: AutoAI univariate time series experiment # + +Use sample data to train a univariate (single prediction column) time series experiment that predicts minimum daily temperatures\. + +When you set up the experiment, you load data that tracks daily minimum temperatures for the city of Melbourne, Australia\. The experiment will generate a set of pipelines that use algorithms to predict future minimum daily temperatures\. After generating the pipelines, AutoAI compares and tests them, chooses the best performers, and presents them in a leaderboard for you to review\. + +## Data set overview ## + +The [*Mini\_Daily\_Temperatures*](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/de4d953f2a766fbc0469723eba0d93ef) data set describes the minimum daily temperatures over 10 years (1981\-1990) in the city Melbourne, Australia\. The units are in degrees celsius and the data set contains 3650 observations\. The source of the data is the Australian Bureau of Meteorology\. Details about the data set are described here: + +![Daily Min Temperature Spreadsheet](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_uni_table.png) + + + + * You will use the `Min_Temp` column as the prediction column to build pipelines and forecast the future daily minimum temperatures\. Before the pipeline training, the `date` column and `Min_Temp` column are used together to figure out the appropriate lookback window\. + * The prediction column forecasts a prediction for the daily minimum temperature on a specified day\. + * The sample data is *structured* in rows and columns and saved as a \.csv file\. + + + +## Tasks overview ## + +In this tutorial, you follow these steps to create a univariate time series experiment: + + + +1. [Create a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-uni-tutorial.html?context=cdpaas&locale=en#step0) +2. [Create an AutoAI experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-uni-tutorial.html?context=cdpaas&locale=en#step1) +3. [Configure the experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-uni-tutorial.html?context=cdpaas&locale=en#step2) +4. [Review experiment results](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-uni-tutorial.html?context=cdpaas&locale=en#step3) +5. [Deploy the trained model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-uni-tutorial.html?context=cdpaas&locale=en#step4) +6. [Test the deployed model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-uni-tutorial.html?context=cdpaas&locale=en#step5) + + + +## Create a project ## + +Follow these steps to download the [*Mini\_Daily\_Temperatures*](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/de4d953f2a766fbc0469723eba0d93ef) data set from the **Samples** and create an empty project: + + + +1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg), click **Samples** and download a local copy of the [*Mini\_Daily\_Temperatures*](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/de4d953f2a766fbc0469723eba0d93ef) data set\. +2. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg), click **Projects > View all projects**, then click **New Project**\. + + + + 1. Click **Create an empty project**. + 2. Enter a name and optional description for your project. + 3. Click **Create**. + + + + + +## Create an AutoAI experiment ## + +Follow these steps to create an AutoAI experiment and add sample data to your experiment: + + + +1. On the *Assets* tab from within your project, click **New asset > Build machine learning models automatically**\. +2. Specify a name and optional description for your experiment, then select **Create**\. +3. Select **Associate a Machine Learning service instance** to create a new service instance or associate an existing instance with your project\. Click **Reload** to confirm your configuration\. +4. Click **Create**\. +5. To add the sample data, choose one of the these methods: + + + + * If you downloaded your file locally, upload the training data file, *Daily\_Min\_Temperatures.csv*, by clicking **Browse** and then following the prompts. + + * If you already uploaded your file to your project, click **Select from project**, then select the **Data asset** tab and choose *Daily\_Min\_Temperatures.csv*. + + + + + +## Configure the experiment ## + +Follow these steps to configure your univariate AutoAI time series experiment: + + + +1. Click **Yes** for the option to create a Time Series Forecast\. +2. Choose as prediction columns: `Min_Temp`\. +3. Choose as the date/time column: `Date`\. + + ![Configuring experiment settings. Yes to time series forecast and min temp as the prediction column with Date as the date/time column.](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_uni_run_configuration.png) +4. Click **Experiment settings** to configure the experiment: + + + + 1. In the **Data source** page, select the **Time series** tab. + + 2. For this tutorial, accept the default value for *Number of backtests* (4), *Gap length* (0 steps), and *Holdout length* (20 steps). + + Note: The validation length changes if you change the value of any of the parameters: *Number of backtests*, *Gap length*, or *Holdout length*. + + c. Click **Cancel** to exit from the *Experiment settings*. + + + + ![Experiment settings on Data Source page](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_uni_exp_settings.png) +5. Click **Run experiment** to begin the training\. + + + +## Review experiment results ## + +The experiment takes several minutes to complete\. As the experiment trains, a visualization shows the transformations that are used to create pipelines\. Follow these steps to review experiment results and save the pipeline with the best performance\. + + + +1. (Optional): Hover over any node in the visualization to get details on the transformation for a particular pipeline\. + + ![Experiment summary generating pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_uni_pipeline_build.png) +2. (Optional): After the pipelines are listed on the leaderboard, click **Pipeline comparison** to see how they differ\. For example: + + ![Metric chart of pipeline comparison](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_uni_pipeline_comparison.png) +3. (Optional): When the training completes, the top three best performing pipelines are saved to the leaderboard\. Click **View discarded pipelines** to review pipelines with the least performance\. + + ![Ranked pipeline leaderboard based on accuracy](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_uni_pipeline_leaderboard.png) +4. Select the pipeline with Rank 1 and click **Save as** to create your model\. Then, select **Create**\. This action saves the pipeline under the **Models** section in the Assets tab\. + + + +## Deploy the trained model ## + +Before you can use your trained model to make predictions on new data, you must deploy the model\. Follow these steps to promote your trained model to a deployment space: + + + +1. You can deploy the model from the model details page\. To access the model details page, choose one of the these methods: + + + + * Click the model’s name in the notification that is displayed when you save the model. + * Open the *Assets* page for the project that contains the model and click the model’s name in the *Machine Learning Model* section. + + + +2. Click **Promote to Deployment Space**, then select or create a deployment space where the model will be deployed\. + (Optional): To create a deployment space, follow these steps: + + + + 1. From the **Target space** list, select **Create a new deployment space**. + + 2. Enter a name for your deployment space. + + 3. To associate a machine learning instance, go to **Select machine learning service (optional)** and select an instance from the list. + + 4. Click **Create**. + + + +3. After you select or create your space, click **Promote**\. +4. Click the deployment space link from the notification\. +5. From the Assets tab of the deployment space: + + + + 1. Hover over the model’s name and click the deployment icon ![Deploy icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/deploy-icon.png). + 2. In the page that opens, complete the fields: + + + + 1. Specify a name for the deployment. + 2. Select **Online** as the *Deployment type*. + 3. Click **Create**. + + + + + + + +After the deployment is complete, click the **Deployments** tab and select the deployment name to view the details page\. + +## Test the deployed model ## + +Follow these steps to test the deployed model from the deployment details page: + + + +1. On the **Test tab** of the deployment details page, click the terminal icon ![Terminal icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/terminal-icon.png) and enter the following JSON test data: + + { "input_data": [ { + + "fields": + + "Min_Temp" + + ], + + "values": + + 7], 15] + + ] + + } ] } + + Note: The test data replicates the data fields for the model, except the prediction field. +2. Click **Predict** to predict the future minimum temperature\. + + + +![Test tab for deployed model with JSON code as input data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_uni_test.png) + +**Parent topic:**[Building a time series experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3b2719c3b56d1bd40fa0d8c6853ddd078fd13d94.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3b2719c3b56d1bd40fa0d8c6853ddd078fd13d94.md new file mode 100644 index 0000000..c2c42d6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3b2719c3b56d1bd40fa0d8c6853ddd078fd13d94.md @@ -0,0 +1,98 @@ +# Customizing environment templates + +# Customizing environment templates # + +You can change the name, the description, and the hardware configuration of an environment template that you created\. You can customize the software configuration of Jupyter notebook environment templates through conda channels or by using pip\. You can provide a list of conda packages, a list of pip packages, or a combination of both\. When using conda packages, you can provide a list of additional conda channel locations through which the packages can be obtained\. + +**Required permissions** : You must be have the **Admin** or **Editor** role in the project to customize an environment template\. + +**Restrictions** : You cannot change the language of an existing environment template\. : You can’t customize the software configuration of a Spark environment template you created\. + +To customize an environment template that you created: + + + +1. Under your project's **Manage** tab, click the **Environments** page\. +2. In the **Active Runtimes** section, check that no runtime is active for the environment template you want to change\. +3. In the **Environment Templates** section, click the environment template you want to customize\. +4. Make your changes\. + + For a Juypter notebook environment template, select to create a customization and specify the libraries to add to the standard packages that are available by default. You can also use the customization to upgrade or downgrade packages that are part of the standard software configuration. + + The libraries that are added to an environment template through the customization aren't persisted; however, they are automatically installed each time the environment runtime is started. Note that if you add a library using `pip install` through a notebook cell and not through the customization, only you will be able to use this library; the library is not available to someone else using the same environment template. + + If you want you can use the provided template to add the custom libraries. There is a different template for Python and for R. The following example shows you how to add Python packages: + + # Modify the following content to add a software customization to an environment. + # To remove an existing customization, delete the entire content and click Apply. + + # Add conda channels below defaults, indented by two spaces and a hyphen. + channels: + - defaults + + # To add packages through conda or pip, remove the comment on the following line. + # dependencies: + + # Add conda packages here, indented by two spaces and a hyphen. + # Remove the comment on the following line and replace sample package name with your package name: + # - a_conda_package=1.0 + + # Add pip packages here, indented by four spaces and a hyphen. + # Remove the comments on the following lines and replace sample package name with your package name. + # - pip: + # - a_pip_package==1.0 + + **Important when customizing**: + + + + * Before you customize a package, verify that the changes you are planning have the intended effect. + + + + * `conda` can report the changes required for installing a given package, without actually installing it. You can verify the changes from your notebook. For example, for the library Plotly: + + + + * In a Python notebook, enter: `!conda install --dry-run plotly` + * In an R notebook, enter: `print(system2("conda", args=c("install","--dry-run","r-plotly"), stdout=TRUE))` + + + + * `pip` does install the package. However, restarting the runtime again after verification will remove the package. Here too you verify the changes from your notebook. For example, for the library Plotly: + + + + * In a Python notebook, enter: `!pip install plotly` + * In an R notebook, enter: `print(system2("pip", args="install plotly", stdout=TRUE))` + + + + + + * If you can get a package through `conda` from the default channels and through `pip` from PyPI, the preferred method is through `conda` from the default channels. + * Conda does dependency checking when installing packages which can be memory intensive if you add many packages to the customization. Ensure that you select an environment with sufficient RAM to enable dependency checking at the time the runtime is started. + * To prevent unnecessary dependency checking if you only want packages from one Conda channel, exclude the default channels by removing `defaults` from the channels list in the template and adding `nodefaults`. + * In addition to the Anaconda main channel, many packages for R can be found in Anaconda's R channel. In R environments, this channel is already part of the default channels, hence it does not need to be added separately. + * If you add packages only through pip or only through conda to the customization template, you must make sure that `dependencies` is not commented out in the template. + * When you specify a package version, use a single `=` for `conda` packages and `==` for `pip` packages. Wherever possible, specify a version number as this reduces the installation time and memory consumption significantly. If you don't specify a version, the package manager might pick the latest version available, or keep the version that is available in the package. + * You cannot add arbitrary notebook extensions as a customization because notebook extensions must be pre-installed. + + + +5. Apply your changes\. + + + +## Learn more ## + + + + * [Examples of customizations](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/example-customizations.html) + * [Installing custom packages through a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/install-cust-lib.html) + + + +**Parent topic:**[Managing compute resources](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3b763ffd1393292f4c3ca9d236440065b6660e8e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3b763ffd1393292f4c3ca9d236440065b6660e8e.md new file mode 100644 index 0000000..f980415 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3b763ffd1393292f4c3ca9d236440065b6660e8e.md @@ -0,0 +1,64 @@ +# twostepAS properties + +# twostepAS properties # + +![Twostep\-AS node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/twostepASnodeicon.png)TwoStep Cluster is an exploratory tool that's designed to reveal natural groupings (or clusters) within a data set that would otherwise not be apparent\. The algorithm that's employed by this procedure has several desirable features that differentiate it from traditional clustering techniques, such as handling of categorical and continuous variables, automatic selection of number of clusters, and scalability\. + + + +twostepAS properties + +Table 1\. twostepAS properties + +| `twostepAS` Properties | Values | Property description | +| --------------------------------------------------- | ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `inputs` | \[*f1 \.\.\. fN*\] | TwoStepAS models use a list of input fields, but no target\. Weight and frequency fields are not recognized\. | +| `use_predefined_roles` | *Boolean* | Default=`True` | +| `use_custom_field_assignments` | *Boolean* | Default=`False` | +| `cluster_num_auto` | *Boolean* | Default=`True` | +| `min_num_clusters` | *integer* | Default=`2` | +| `max_num_clusters` | *integer* | Default=`15` | +| `num_clusters` | *integer* | Default=`5` | +| `clustering_criterion` | `AIC`
`BIC` | | +| `automatic_clustering_method` | `use_clustering_criterion_setting`
`Distance_jump`
`Minimum`
`Maximum` | | +| `feature_importance_method` | `use_clustering_criterion_setting`
`effect_size` | | +| `use_random_seed` | *Boolean* | | +| `random_seed` | *integer* | | +| `distance_measure` | `Euclidean`
`Loglikelihood` | | +| `include_outlier_clusters` | *Boolean* | Default=`True` | +| `num_cases_in_feature_tree_leaf_is_less_than` | *integer* | Default=`10` | +| `top_perc_outliers` | *integer* | Default=`5` | +| `initial_dist_change_threshold` | *integer* | Default=`0` | +| `leaf_node_maximum_branches` | *integer* | Default=`8` | +| `non_leaf_node_maximum_branches` | *integer* | Default=`8` | +| `max_tree_depth` | *integer* | Default=`3` | +| `adjustment_weight_on_measurement_level` | *integer* | Default=`6` | +| `memory_allocation_mb` | *number* | Default=`512` | +| `delayed_split` | *Boolean* | Default=`True` | +| `fields_not_to_standardize` | \[*f1 \.\.\. fN*\] | | +| `adaptive_feature_selection` | *Boolean* | Default=`True` | +| `featureMisPercent` | *integer* | Default=`70` | +| `coefRange` | *number* | Default=`0.05` | +| `percCasesSingleCategory` | *integer* | Default=`95` | +| `numCases` | *integer* | Default=`24` | +| `include_model_specifications` | *Boolean* | Default=`True` | +| `include_record_summary` | *Boolean* | Default=`True` | +| `include_field_transformations` | *Boolean* | Default=`True` | +| `excluded_inputs` | *Boolean* | Default=`True` | +| `evaluate_model_quality` | *Boolean* | Default=`True` | +| `show_feature_importance bar chart` | *Boolean* | Default=`True` | +| `show_feature_importance_ word_cloud` | *Boolean* | Default=`True` | +| `show_outlier_clusters_interactive_table_and_chart` | *Boolean* | Default=`True` | +| `show_outlier_clusters_pivot_table` | *Boolean* | Default=True | +| `across_cluster_feature_importance` | *Boolean* | Default=`True` | +| `across_cluster_profiles_pivot_table` | *Boolean* | Default=`True` | +| `withinprofiles` | *Boolean* | Default=`True` | +| `cluster_distances` | *Boolean* | Default=`True` | +| `cluster_label` | `String`
`Number` | | +| `label_prefix` | `String` | | +| `evaluation_maxNum` | *integer* | The maximum number of outliers to display in the output\. If there are more than twenty outlier clusters, a pivot table will be displayed instead\. | +| `across_cluster_profiles_table_and_chart` | *Boolean* | Table and charts of feature importance and cluster centers for each input (field) used in the cluster solution\. Selecting different rows in the table displays a different chart\. For categorical fields, a bar chart is displayed\. For continuous fields, a chart of means and standard deviations is displayed\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3ba46a09cf64ce6120be65c44614995b50b67da1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3ba46a09cf64ce6120be65c44614995b50b67da1.md new file mode 100644 index 0000000..023f0c1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3ba46a09cf64ce6120be65c44614995b50b67da1.md @@ -0,0 +1,5 @@ +# Handling records with system missing values (SPSS Modeler) + +# Handling records with system missing values # + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3bb91ebacc556700f955c3e6e01d90e5256207cf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3bb91ebacc556700f955c3e6e01d90e5256207cf.md new file mode 100644 index 0000000..a51aaba --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3bb91ebacc556700f955c3e6e01d90e5256207cf.md @@ -0,0 +1,19 @@ +# Visualizing your data + +# Visualizing your data # + +You can discover insights from your data by creating visualizations\. By exploring data from different perspectives with visualizations, you can identify patterns, connections, and relationships within that data and quickly understand large amounts of information\. + +Data format +: Tabular: Avro, CSV, JSON, Parquet, TSV, SAV, Microsoft Excel \.xls and \.xlsx files, SAS, delimited text files, and connected data\. + + For more information about supported data sources, see [Connectors](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html). + +Data size +: No limit + +You can create graphics similar to the following example that shows how humidity values over time\. + +![Example visualization](https://dataplatform.cloud.ibm.com/docs/content/dataview/viz_main.png) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3beb81a5a5953cd570fa673b2496f8af98725438.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3beb81a5a5953cd570fa673b2496f8af98725438.md new file mode 100644 index 0000000..168809a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3beb81a5a5953cd570fa673b2496f8af98725438.md @@ -0,0 +1,26 @@ +# Decision Optimization notebook generating multiple scenarios + +# Generating multiple scenarios # + +This tutorial shows you how to generate multiple scenarios from a notebook using randomized data\. Generating multiple scenarios lets you test a model by exposing it to a wide range of data\. + +## Procedure ## + +To create and solve a scenario using a sample: + + + +1. Download and extract all the **[DO\-samples](https://github.com/IBMDecisionOptimization/DO-Samples)** on to your machine\. You can also download just the StaffPlanning\.zip file from the Model\_Builder subfolder for your product and version, but in this case do not extract it\. +2. Open your project or create an empty project\. +3. On the Manage tab of your project, select the Services and integrations section and click Associate service\. Then select an existing Machine Learning service instance (or create a new one ) and click Associate\. When the service is associated, a success message is displayed, and you can then close the Associate service window\. +4. Select the Assets tab\. +5. Select New asset > Solve optimization problems in the Work with models section\. +6. Click Local file in the Solve optimization problems window that opens\. +7. Browse to choose the StaffPlanning\.zip file in the **Model\_Builder** folder\. Select the relevant product and version subfolder in your downloaded DO\-samples\. +8. If you haven't already associated a Machine Learning service with your project, you must first select Add a Machine Learning service to select or create one before you choose a deployment space for your experiment\. +9. Click **Create**\.A Decision Optimization model is created with the same name as the sample\. +10. Working in Scenario 1 of the `StaffPlanning` model, you can see that the solution contains tables to identify which resources work which days to meet expected demand\. If there is no solution displayed, or to rerun the model, click **Build model** in the sidebar, then click **Run** to solve the model\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3c1d83e94ddc08d7a6229aedc49c895e86e660bf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3c1d83e94ddc08d7a6229aedc49c895e86e660bf.md new file mode 100644 index 0000000..54be70f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3c1d83e94ddc08d7a6229aedc49c895e86e660bf.md @@ -0,0 +1,21 @@ +# CLEM datatypes (SPSS Modeler) + +# CLEM datatypes # + +This section covers CLEM datatypes\. + +CLEM datatypes can be made up of any of the following: + + + + * Integers + * Reals + * Characters + * Strings + * Lists + * Fields + * Date/Time + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3c307031346d4fd7dd1a66e2a2f919713582b075.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3c307031346d4fd7dd1a66e2a2f919713582b075.md new file mode 100644 index 0000000..73983a9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3c307031346d4fd7dd1a66e2a2f919713582b075.md @@ -0,0 +1,22 @@ +# Hiding sensitive code cells in a notebook + +# Hiding sensitive code cells in a notebook # + +If your notebook includes code cells with sensitive data, such as credentials for data sources, you can hide those code cells from anyone you share your notebook with\. Any collaborators in the same project can see the cells, but when you share a notebook with a link, those cells will be hidden from anyone who uses the link\. + +To hide code cells: + + + +1. Open the notebook and select the code cell to hide\. +2. Insert a comment with the hide tag on the first line of the code cell\. + + For the Python and R languages, enter the following syntax: `# @hidden_cell` + + ![Syntax for hiding code cells](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/hide_tag.png) + + + +**Parent topic:**[Sharing notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/share-notebooks.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3ca99c6ef4745121c9865ab4119f3ab1b1a3bdb1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3ca99c6ef4745121c9865ab4119f3ab1b1a3bdb1.md new file mode 100644 index 0000000..f186f24 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3ca99c6ef4745121c9865ab4119f3ab1b1a3bdb1.md @@ -0,0 +1,134 @@ +# Data sources for scoring batch deployments + +# Data sources for scoring batch deployments # + +You can supply input data for a batch deployment job in several ways, including directly uploading a file or providing a link to database tables\. The types of allowable input data vary according to the type of deployment job that you are creating\. + +For supported input types by framework, refer to [Batch deployment input details by framework](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-by-framework.html)\. + +Input data can be supplied to a batch job as [inline data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-data-sources.html?context=cdpaas&locale=en#inline_data) or [data reference](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-data-sources.html?context=cdpaas&locale=en#data_ref)\. + +## Available input types for batch deployments by framework and asset type ## + + + +Available input types for batch deployments by framework and asset type + +| Framework | Batch deployment type | +| --------------------- | --------------------- | +| Decision optimization | Reference | +| Python function | Inline | +| PyTorch | Inline and Reference | +| Tensorflow | Inline and Reference | +| Scikit\-learn | Inline and Reference | +| Python scripts | Reference | +| Spark MLlib | Inline and Reference | +| SPSS | Inline and Reference | +| XGBoost | Inline and Reference | + + + +### Inline data description ### + +Inline type input data for batch processing is specified in the batch deployment job's payload\. For example, you can pass a CSV file as the deployment input in the UI or as a value for the `scoring.input_data` parameter in a notebook\. When the batch deployment job is completed, the output is written to the corresponding job's `scoring.predictions` metadata parameter\. + +### Data reference description ### + +Input and output data of type *data reference* that is used for batch processing can be stored: + + + + * In a remote data source, like a Cloud Object Storage bucket or an SQL or no\-SQL database\. + * As a local or managed data asset in a deployment space\. + + + +Details for data references include: + + + + * Data source reference `type` depends on the asset type\. Refer to **Data source reference types** section in [Adding data assets to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + * For `data_asset` type, the reference to input data must be specified as a `/v2/assets` href in the `input_data_references.location.href` parameter in the deployment job's payload\. The data asset that is specified is a reference to a local or a connected data asset\. Also, if the batch deployment job's output data must be persisted in a remote data source, the references to output data must be specified as a `/v2/assets` href in `output_data_reference.location.href` parameter in the deployment job's payload\. + * Any input and output `data_asset` references must be in the same space ID as the batch deployment\. + * If the batch deployment job's output data must be persisted in a deployment space as a local asset, `output_data_reference.location.name` must be specified\. When the batch deployment job is completed successfully, the asset with the specified name is created in the space\. + * Output data can contain information on where in a remote database the data asset is located\. In this situation, you can specify whether to append the batch output to the table or truncate the table and update the output data\. Use the `output_data_references.location.write_mode` parameter to specify the values `truncate` or `append`\. + + + + * Specifying `truncate` as value truncates the table and inserts the batch output data. + * Specifying `append` as value appends the batch output data to the remote database table. + * `write_mode` is applicable only for the `output_data_references` parameter. + * `write_mode` is applicable only for remote database-related data assets. This parameter is not applicable for a local data asset or a Cloud Object Storage based data asset. + + + + + +#### Example data\_asset payload #### + + "input_data_references": [{ + "type": "data_asset", + "connection": { + }, + "location": { + "href": "/v2/assets/?space_id=" + } + }] + +#### Example connection\_asset payload #### + + "input_data_references": [{ + "type": "connection_asset", + "connection": { + "id": "" + }, + "location": { + "bucket": "", + "file_name": "/" + } + + }] + +## Structuring the input data ## + +How you structure the input data, also known as the payload, for the batch job depends on the framework for the asset you are deploying\. + +A \.csv input file or other structured data formats must be formatted to match the schema of the asset\. List the column names (fields) in the first row and values to be scored in subsequent rows\. For example, see the following code snippet: + + PassengerId, Pclass, Name, Sex, Age, SibSp, Parch, Ticket, Fare, Cabin, Embarked + 1,3,"Braund, Mr. Owen Harris",0,22,1,0,A/5 21171,7.25,,S + 4,1,"Winslet, Mr. Leo Brown",1,65,1,0,B/5 200763,7.50,,S + +A JSON input file must provide the same information on fields and values, by using this format: + + {"input_data":[{ + "fields": , , ...], + "values": , , ...]] + }]} + +For example: + + {"input_data":[{ + "fields": "PassengerId","Pclass","Name","Sex","Age","SibSp","Parch","Ticket","Fare","Cabin","Embarked"], + "values": 1,3,"Braund, Mr. Owen Harris",0,22,1,0,"A/5 21171",7.25,null,"S"], + 4,1,"Winselt, Mr. Leo Brown",1,65,1,0,"B/5 200763",7.50,null,"S"]] + }]} + +### Preparing a payload that matches the schema of an existing model ### + +Refer to this sample code: + + model_details = client.repository.get_details("") # retrieves details and includes schema + columns_in_schema = [] + for i in range(0, len(model_details['entity']['input'].get('fields'))): + columns_in_schema.append(model_details['entity']['input'].get('fields')[i]) + + X = X[columns_in_schema] # where X is a pandas dataframe that contains values to be scored + #(...) + scoring_values = X.values.tolist() + array_of_input_fields = X.columns.tolist() + payload_scoring = {"input_data": [{"fields": array_of_input_fields],"values": scoring_values}]} + +**Parent topic:**[Creating a batch deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-details.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3cf77633a489e42b01086588d6613d65bfd51f7f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3cf77633a489e42b01086588d6613d65bfd51f7f.md new file mode 100644 index 0000000..4237ec9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3cf77633a489e42b01086588d6613d65bfd51f7f.md @@ -0,0 +1,15 @@ +# Scoring records (SPSS Modeler) + +# Scoring records # + +Earlier, we scored the same records used to estimate the model so we could evaluate how accurate the model was\. Now we'll score a different set of records from the ones used to create the model\. This is the goal of modeling with a target field: Study records for which you know the outcome, to identify patterns that will allow you to predict outcomes you don't yet know\. + +Figure 1\. Attaching new data for scoring + +![Attaching new data for scoring](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_intro_score.png) + +You could update the data asset Import node to point to a different data file, or you could add a new Import node that reads in the data you want to score\. Either way, the new dataset must contain the same input fields used by the model (`Age`, `Income level`, `Education` and so on), but not the target field `Credit rating`\. + +Alternatively, you could add the model nugget to any flow that includes the expected input fields\. Whether read from a file or a database, the source type doesn't matter as long as the field names and types match those used by the model\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3d1b3c707202f30f8995025f356f82abbe685b93.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3d1b3c707202f30f8995025f356f82abbe685b93.md new file mode 100644 index 0000000..f2e70aa --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3d1b3c707202f30f8995025f356f82abbe685b93.md @@ -0,0 +1,41 @@ +# Firewall access for Watson Studio + +# Firewall access for Watson Studio # + +Inbound firewall access is granted to the Watson Studio service by allowing the IP addresses for IBM watsonx on IBM Cloud\. + +If Watson Studio is installed behind a firewall, you must add the WebSocket connection for your region to the firewall settings\. Enabling the WebSocket connection is required for notebooks and RStudio\. + +Following are the WebSocket settings for each region: + + + +Table 1\. Regional WebSockets + +| Location | Region | WebSocket | +| ----------------------- | --------- | -------------------------------------------- | +| United States (Dallas) | us\-south | wss://dataplatform\.cloud\.ibm\.com | +| Europe (Frankfurt) | eu\-de | wss://eu\-de\.dataplatform\.cloud\.ibm\.com | +| United Kingdom (London) | eu\-gb | wss://eu\-gb\.dataplatform\.cloud\.ibm\.com | +| Asia Pacific (Tokyo) | jp\-tok | wss://jp\-tok\.dataplatform\.cloud\.ibm\.com | + + + +Follow these steps to look up the IP addresses for IBM watsonx and allow them on IBM Cloud: + + + +1. From the main menu, choose **Administration > Cloud integrations**\. +2. Click **Firewall configuration** to display the IP addresses for the current region\. Use CIDR notation\. +3. Copy each CIDR range into the **IP address restrictions** for either a user or an account\. You must also enter the allowed individual client IP addresses\. Enter the IP addresses as a comma\-separated list\. Then, click **Apply**\. +4. Repeat for each region to allow access for Watson Studio\. + + + +When you configure the allowed IP addresses for Watson Studio, you include the CIDR ranges for the Watson Studio cluster\. You can also allow individual client system IP addresses\. + +For step\-by\-step instructions for both user and account restrictions, see [IBM Cloud docs: Allowing specific IP addresses](https://cloud.ibm.com/docs/account?topic=account-ips) + +**Parent topic:**[Configuring firewall access](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall_ovrvw.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3d999c84c01328a45ebf0ecad358d858c634df5b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3d999c84c01328a45ebf0ecad358d858c634df5b.md new file mode 100644 index 0000000..43f5d49 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3d999c84c01328a45ebf0ecad358d858c634df5b.md @@ -0,0 +1,22 @@ +# Training data (SPSS Modeler) + +# Training data # + +The data file includes a field named `taxable_value`, which is the target field, or value, that you want to predict\. The other fields contain information such as neighborhood, building type, and interior volume, and may be used as predictors\. + + + +| Field name | Label | +| ----------------- | ------------------------------------ | +| `property_id` | Property ID | +| `neighborhood` | Area within the city | +| `building_type` | Type of building | +| `year_built` | Year built | +| `volume_interior` | Volume of interior | +| `volume_other` | Volume of garage and extra buildings | +| `lot_size` | Lot size | +| `taxable_value` | Taxable value | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3d9fb046d583a2d0177ecb4da25eeaeb4febcca9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3d9fb046d583a2d0177ecb4da25eeaeb4febcca9.md new file mode 100644 index 0000000..1618c95 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3d9fb046d583a2d0177ecb4da25eeaeb4febcca9.md @@ -0,0 +1,29 @@ +# Drug treatment - exploratory graphs (SPSS Modeler) + +# Drug treatment \- exploratory graphs # + +In this example, imagine you're a medical researcher compiling data for a study\. You've collected data about a set of patients, all of whom suffered from the same illness\. During their course of treatment, each patient responded to one of five medications\. Part of your job is to use data mining to find out which drug might be appropriate for a future patient with the same illness\. + +This example uses the flow named Drug Treatment \- Exploratory Graphs, available in the example project \. The data file is drug1n\.csv\. + +Figure 1\. Drug treatment example flow + +![Drug treatment example flow](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_data.png) + +The data fields used in this example are: + + + +| Data field | Description | +| ------------- | ---------------------------------------------- | +| `Age` | Age of patient (number) | +| `Sex` | `M` or `F` | +| `BP` | Blood pressure: `HIGH`, `NORMAL`, or `LOW` | +| `Cholesterol` | Blood cholesterol: `NORMAL` or `HIGH` | +| `Na` | Blood sodium concentration | +| `K` | Blood potassium concentration | +| `Drug` | Prescription drug to which a patient responded | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3dc76ac891e282badf1d7845b2b8a9b3a26de3d2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3dc76ac891e282badf1d7845b2b8a9b3a26de3d2.md new file mode 100644 index 0000000..1af1630 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3dc76ac891e282badf1d7845b2b8a9b3a26de3d2.md @@ -0,0 +1,7 @@ +# Export node properties + +# Export node properties # + +Refer to this section for a list of available properties for Export nodes\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3df4040f4f2e5704ef44e6742585ee853a2f2a37.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3df4040f4f2e5704ef44e6742585ee853a2f2a37.md new file mode 100644 index 0000000..ec1bf28 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3df4040f4f2e5704ef44e6742585ee853a2f2a37.md @@ -0,0 +1,93 @@ +# Watson Studio service plans + +# Watson Studio service plans # + +The plan you choose for Watson Studio affects the features and capabilities that you can use\. + +When you provision or upgrade Watson Studio, you can choose between a Lite and a Professional plan\. + +See the plan pages in [IBM Cloud catalog: Watson Studio](https://cloud.ibm.com/catalog/services/watson-studio) for pricing and feature information\. + +IBM Cloud account owners can choose between the Lite (unpaid) and Professional (paid) plan\. + +Under the Professional plan, you can provision multiple Watson Studio instances in an IBM Cloud account\. The Professional plan allows unlimited users and charges for compute usage which is measured in capacity unit hours (CUH)\. The Professional plan is the only paid plan option\. + +Under the Lite plan, you can provision one Watson Studio instance per IBM Cloud account\. The Lite plan allows only one user and limits the CUH to 10 hours per month\. Collaborators in your projects must have their own Watson Studio Lite plans\. + +Both Watson Studio plans contain these features without additional services: + + + + * Watson services APIs to run in notebooks\. + * [Jupyter notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebooks-and-scripts.html) to analyze data with Python or R code\. + * [RStudio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-overview.html) to analyze data with R code\. + * [SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsd/spss-modeler.html) to develop predictive models on a graphical canvas\. + * [Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) to shape and cleanse data\. + * [Watson Pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-overview.html) to orchestrate an end\-to\-end flow of assets from creation through deployment\. + * [Small runtime environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html) as compute resources for analytical tools\. + * [Spark runtime environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html#default-spark)\. The maximum number of Spark executors that can be used is restricted by the service plan\. + * [Environments with the Watson Natural Language Processing library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp.html) with pre\-trained models for language processing tasks that you can run on unstructured data\. + * [Environments with Decision Optimization libraries](https://dataplatform.cloud.ibm.com/docs/content/DO/DOWS-Cloud_home.html) to model and solve decision optimization problems that exceed the complexity that is supported by the Community Edition of the libraries in the other default Python environments\. + * [Connectors to data sources](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html)\. + * [Collaboration](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html) in projects and deployment spaces\. + * [Samples](https://dataplatform.cloud.ibm.com/gallery) for resources to help you learn and samples that you can use\. + + + +Both Watson Studio plans contain these features that also require the Watson Machine Learning service: + + + + * [Machine learning models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-overview.html) to build analytical models\. + * [AutoAI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) to automatically create a set of model candidates\. + * [Federated learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fed-lea.html) to collaboratively train a model with multiple remote parties without sharing data\. + * [Decision Optimization](https://dataplatform.cloud.ibm.com/docs/content/DO/DOWS-Cloud_home.html) to build models that solve business problems\. + * [Synthetic Data Generator](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/synthetic_data_overview_sd.html) to generate synthetic tabular data\. + + + +The Watson Studio Professional plan includes features that are not available in the Lite plan, including the following: + + + + * [Encrypt your IBM Cloud Object Storage instance with your own key](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html#byok)\. + * [Large runtime environments with 8 or more vCPUs](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html) as compute resources for analytical tools\. + * [GPU environments for running notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html##default-gpu)\. + * [Export projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/export-project.html)\. + + + +The Professional plan charges for [compute usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html) consumed per month\. Compute usage is measured in capacity unit hours (CUH)\. For details on computing resource allocation and consumption, see [Runtime usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/track-runtime-usage.html)\. + + + +Table 1\. Feature differences between Watson Studio plans + +| Feature | Lite | Professional | +| ---------------------- | ---------------- | ------------------------ | +| Custom encryption keys | | ✓ | +| Connectors | ✓ | ✓ | +| Large environments | | ✓ | +| Spark environments | 2 executors | Up to 35 executors | +| GPU environments | | ✓ Dallas region only | +| Export projects | | ✓ | +| Collaborators | 1 | Unlimited | +| Processing usage | 10 CUH per month | Unlimited \- pay per CUH | +| HIPAA readiness | | ✓ Dallas region only | + + + +## Learn more ## + + + + * [Watson Studio service overview](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/wsl.html) + * [Getting started](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-wdp.html) + * [Analyzing data and building models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-science.html) + * [Upgrade your plan](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/upgrade.html)\. + + + +**Parent topic:**[Watson Studio](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/wsl.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3e0860fd12fa0bb5be75c68fbd34d69a631f2324.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3e0860fd12fa0bb5be75c68fbd34d69a631f2324.md new file mode 100644 index 0000000..f980abc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3e0860fd12fa0bb5be75c68fbd34d69a631f2324.md @@ -0,0 +1,17 @@ +# Running and interrupting scripts + +# Running and interrupting scripts # + +You can run scripts in a number of ways\. For example, in the flow script or standalone script pane, click Run This Script to run the complete script\. + +You can run a script using any of the following methods: + + + + * Click Run script within a flow script or standalone script\. + * Run a flow where Run script is set as the default execution method\. + + + +Note: A SuperNode script runs when the SuperNode is run as long as you select Run script within the SuperNode script dialog box\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3e24051d290e000441a4fdb326d73bb81505bd05.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3e24051d290e000441a4fdb326d73bb81505bd05.md new file mode 100644 index 0000000..f29d2be --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3e24051d290e000441a4fdb326d73bb81505bd05.md @@ -0,0 +1,22 @@ +# Troubleshooting + +# Troubleshooting # + +If you encounter an issue in IBM watsonx, use the following resources to resolve the problem\. + + + + * [View IBM Cloud service status](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/service-status.html) + * [Troubleshoot connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/troubleshoot-conn.html) + * [Troubleshoot Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/ts_index.html) + * [Troubleshoot Synthetic Data Generator](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ts_sd.html) + * [Troubleshoot IBM Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/troubleshoot-cos.html) + * [Troubleshoot Watson Machine Learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html) + * [Troubleshoot Watson OpenScale](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/wos-troubleshoot.html) + * [Troubleshoot Watson Studio on IBM Cloud](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/wscloud-troubleshoot.html) + * [Known issues](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/known-issues.html) + * [Get help](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-help.html) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3e791f66ad3d5fd3da45d85f27d6a1a7621a4cd3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3e791f66ad3d5fd3da45d85f27d6a1a7621a4cd3.md new file mode 100644 index 0000000..23f0064 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3e791f66ad3d5fd3da45d85f27d6a1a7621a4cd3.md @@ -0,0 +1,126 @@ +# Switching the platform for a project + +# Switching the platform for a project # + +You can switch the platform for some projects between the Cloud Pak for Data as a Service and the watsonx platform\. When you switch the platform for a project, you can use the tools that are specific to that platform\. + +For example, you might switch an existing Cloud Pak for Data as a Service project to watsonx so that you can use the Prompt Lab tool and create prompt and prompt session assets\. See [Comparison between watsonx and Cloud Pak for Data as a Service](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/compare-platforms.html)\. + +Important:Foundation model inferencing with the Prompt Lab is available in the Dallas and Frankfurt regions\. Your Watson Studio and Watson Machine Learning service instances are shared between watsonx and Cloud Pak for Data as a Service\. If your Watson Studio and Watson Machine Learning service instances are provisioned in another region, you can't use foundation model inferencing or the Prompt Lab\. + + + + * [Requirements](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/switch-platform.html?context=cdpaas&locale=en#requirements) + * [Restrictions](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/switch-platform.html?context=cdpaas&locale=en#restrictions) + * [What happens when you switch a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/switch-platform.html?context=cdpaas&locale=en#consequences) + * [Switch the platform for a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/switch-platform.html?context=cdpaas&locale=en#move-one) + * [Switching multiple projects to watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/switch-platform.html?context=cdpaas&locale=en#move-many) + + + +## Requirements ## + +You can switch a project from one platform to the other if you have the required accounts and permissions\. + +**Required accounts** : You must be signed up for both Cloud Pak for Data as a Service and watsonx\. + +**Required permissions** : You must have the **Admin** role in the project that you want to switch\. + +**Required services** : The current account that you are working in must have both of these services provisioned: : \- Watson Studio : \- Watson Machine Learning + +**Project settings** : The project must have the **Restrict who can be a collaborator** setting enabled\. On Cloud Pak for Data as a Service, you can enable this setting during project creation\. On watsonx, this setting is automatic\. + +## Restrictions ## + +To switch a project from Cloud Pak for Data as a Service to watsonx, all the assets in the project must have asset types that are supported by both platforms\. + +Projects that contain any of the following asset types, but no other types of assets, are eligible to switch from Cloud Pak for Data as a Service to watsonx: + + + + * AutoAI experiment + * COBOL copybook + * Connected data asset + * Connection + * Data asset from a file + * Data Refinery flow + * Decision Optimization experiment + * Federated Learning experiment + * Folder asset + * Jupyter notebook + * Model + * Python function + * Script + * SPSS Modeler flow + * Visualization + + + +You can’t switch a project that contains assets that are specific to Cloud Pak for Data as a Service\. If you add any assets that you created with services other than Watson Studio and Watson Machine Learning to a project, you can't switch that project to watsonx\. Although Pipelines assets are supported in both Cloud Pak for Data as a Service and watsonx projects, you can't switch a project that contains pipeline assets because pipelines can reference unsupported assets\. + +You can switch a project that contains assets from watsonx to Cloud Pak for Data as a Service\. However, assets that are only supported in watsonx are not available on Cloud Pak for Data as a Service\. These assets include: + + + + * Prompt Lab assets + * Synthetic data flows + + + +For more information about asset types, see [Asset types and properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html)\. + +## What happens when you switch the platform for a project ## + +Switching a project between platforms has the following effects: + +**Collaborators** : Collaborators in the project receive notifications of the switch on the original platform\. If any collaborators do not have accounts for the destination platform, those collaborators can no longer access the project\. + +**Jobs** : Scheduled jobs are switched\. Any jobs that are running at the time of the switch continue until completion on the original platform\. Any jobs that are scheduled for times after the switch are run on the destination platform\. Job history is not retained\. + +**Environments** : Custom environment templates are retained\. + +**Project history** : Recent activity and asset activities are not retained\. + +**Resource usage** : Resource usage is cumulative because you continue to use the same service instances\. + +**Storage** : The project's IBM Cloud Object Storage bucket remains the same\. + +## Switch the platform for a project ## + +You can switch the platform for a project from within the project on the original platform\. You can switch between either Cloud Pak for Data as a Service and watsonx\. + +To switch the platform for a project: + + + +1. On the original platform, go to the project's **Manage** tab, select the **General** page, and in the **Controls** section, click **Switch platform**\. If you don't see a **Switch platform** button or the button is not active, you can't switch the project\. +2. Select the destination platform and click **Switch platform**\. + + + +## Switching multiple projects to watsonx ## + +You can switch one or more eligible projects to watsonx from Cloud Pak for Data as a Service from the watsonx home page\. + + + +1. On the watsonx home page, click the **Switch projects** icon (![Switch projects icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/move-projects-icon.svg))\. +2. Select the projects that you want to switch\. Only the projects that meet the requirements are listed\. +3. Optional\. You can view the projects that contain unsupported asset types and the projects for which you don't have the **Admin** role\. +4. Click the **Switch projects** icon\. + + + +## Learn more ## + + + + * [Comparison between watsonx and Cloud Pak for Data as a Service](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/compare-platforms.html) + * [Asset types and properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html) + * [Switching the platform for a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/switch-platform-space.html) + + + +**Parent topic:**[Administering projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/admin-project.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3eaafddade769d3b0300be1401bb3d7e68b312dd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3eaafddade769d3b0300be1401bb3d7e68b312dd.md new file mode 100644 index 0000000..4913489 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3eaafddade769d3b0300be1401bb3d7e68b312dd.md @@ -0,0 +1,19 @@ +# applyautonumericnode properties + +# applyautonumericnode properties # + +You can use Auto Numeric modeling nodes to generate an Auto Numeric model nugget\. The scripting name of this model nugget is *applyautonumericnode*\.For more information on scripting the modeling node itself, see [autonumericnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/rangepredictornodeslots.html#rangepredictornodeslots)\. + + + +applyautonumericnode properties + +Table 1\. applyautonumericnode properties + +| `applyautonumericnode` Properties | Values | Property description | +| --------------------------------- | ------ | -------------------- | +| `calculate_standard_error` | *flag* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3f0b3a581945a1c7fe243340843cc4671a4e32c6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3f0b3a581945a1c7fe243340843cc4671a4e32c6.md new file mode 100644 index 0000000..321b27b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3f0b3a581945a1c7fe243340843cc4671a4e32c6.md @@ -0,0 +1,201 @@ +# Applying fairness testing to AutoAI experiments + +# Applying fairness testing to AutoAI experiments # + +Evaluate an experiment for fairness to ensure that your results are not biased in favor of one group over another\. + +### Limitations ### + +Fairness evaluations are not supported for time series experiments\. + +## Evaluating experiments and models for fairness ## + +When you define an experiment and produce a machine learning model, you want to be sure that your results are reliable and unbiased\. Bias in a machine learning model can result when the model learns the wrong lessons during training\. This scenario can result when insufficient data or poor data collection or management results in a poor outcome when the model generates predictions\. It is important to evaluate an experiment for signs of bias to remediate them when necessary and build confidence in the model results\. + +AutoAI includes the following tools, techniques, and features to help you evaluate and remediate an experiment for bias\. + + + + * [Definitions and terms](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-fairness.html?context=cdpaas&locale=en#terms) + * [Applying fairness test for an AutoAI experiment in the UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-fairness.html?context=cdpaas&locale=en#fairness-ui) + * [Applying fairness test for an AutoAI experiment in a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-fairness.html?context=cdpaas&locale=en#fairness-api) + * [Evaluating results](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-fairness.html?context=cdpaas&locale=en#fairness-results) + * [Bias mitigation](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-fairness.html?context=cdpaas&locale=en#bias-mitigation) + + + +## Definitions and terms ## + +**Fairness Attribute** \- Bias or Fairness is typically measured by using a fairness attribute such as gender, ethnicity, or age\. + +**Monitored/Reference Group** \- Monitored group are those values of fairness attribute for which you want to measure bias\. Values in the monitored group are compared to values in the reference group\. For example, if `Fairness Attribute=Gender` is used to measure bias against females, then the monitored group value is “Female” and the reference group value is “Male”\. + +**Favourable/Unfavourable outcome** \- An important concept in bias detection is that of favorable and unfavorable outcome of the model\. For example, `Claim approved` might be considered a favorable outcome and `Claim denied` might be considered as an unfavorable outcome\. + +**Disparate impact** \- The metric used to measure bias (computed as the ratio of percentage of favorable outcome for the monitored group to the percentage of favorable outcome for the reference group)\. Bias is said to exist if the disparate impact value is less than a specified threshold\. + +For example, if 80% of insurance claims that are made by males are approved but only 60% of claims that are made by females are approved, then the disparate impact is: 60/80 = 0\.75\. Typically, the threshold value for bias is 0\.8\. As this disparate impact ratio is less than 0\.8, the model is considered to be biased\. + +Note when the disparate impact ratio is greater than 1\.25 \[inverse value (1/disparate impact) is under the threshold 0\.8\] it is also considered as biased\. + +## Watch a video about evaluating and improving fairness ## + +Watch this video to see how to evaluate a machine learning model for fairness to ensure that your results are not biased\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Applying fairness test for an AutoAI experiment in the UI ## + + + +1. Open **Experiment Settings**\. +2. Click the *Fairness* tab\. +3. Enable options for fairness\. The options are as follows: + + + + * *Fairness evaluation:* Enable this option to check each pipeline for bias by calculating the disparate impact ration. This method tracks whether a pipeline shoes a tendency to provide a favorable (preferred) outcome for one group more often than another. + * *Fairness threshold:* Set a fairness threshold to determine whether bias exists in a pipeline based on the value of the disparate impact ration. The default is 80, which represents a disparate impact ratio less than 0.80. + * *Favorable outcomes:* Specify the value from your prediction column that would be considered favorable. For example, the value might be "approved", "accepted" or whatever fits your prediction type. + * *Automatic protected attribute method:* Choose how to evaluate features that are a potential source of bias. You can specify automatic detection, in which case AutoAI detects commonly protected attributes, including: sex, ethnicity, marital status, age, and zip or postal code. Within each category, AutoAI tries to determine a protected group. For example, for the `sex` category, the monitored group would be `female`. + + Note: In automatic mode, it is likely that a feature is not identified correctly as a protected attribute if it has untypical values, for example, being in a language other than English. Auto-detect is only supported for English. + * *Manual protected attribute method:* Manually specify an outcome and supply the protected attribute by choosing from a list of attributes. Note when you manually supply attributes, you must then define a group and specify whether it is likely to have the expected outcomes (the reference group) or should be reviewed to detect variance from the expected outcomes (the monitored group). + + + + + +For example, this image shows a set of manually specified attribute groups for monitoring\. + +![Evaluating a group for potential bias](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-fairness1.png) + +Save the settings to apply and run the experiment to apply the fairness evaluation to your pipelines\. + +**Notes:** + + + + * For multiclass models, you can select multiple values in the prediction column to classify as favorable or not\. + * For regression models, you can specify a range of outcomes that are considered to be favorable or not\. + * Fairness evaluations are not currently available for time series experiments\. + + + +### List of automatically detected attributes for measuring fairness ### + +When automatic detection is enabled, AutoAI will automatically detect the following attributes if they are present in the training data\. The attributes must be in English\. + + + + * age + * citizen\_status + * color + * disability + * ethnicity + * gender + * genetic\_information + * handicap + * language + * marital + * political\_belief + * pregnancy + * religion + * veteran\_status + + + +## Applying fairness test for an AutoAI experiment in a notebook ## + +You can perform fairness testing in an AutoAI experiment that is trained in a notebook and extend the capabilities beyond what is provided in the UI\. + +### Bias detection example ### + +In this example, by using the Watson Machine Learning Python API (ibm\-watson\-machine\-learning), the optimizer configuration for bias detection is configured with the following input, where: + + + + * name \- experiment name + * prediction\_type \- type of the problem + * prediction\_column \- target column name + * fairness\_info \- bias detection configuration + + + + fairness_info = { + "protected_attributes": [ + { + "feature": "personal_status", + "reference_group": "male div/sep", "male mar/wid", "male single"], + "monitored_group": "female div/dep/mar"] + }, + { + "feature": "age", + "reference_group": 26, 100]], + "monitored_group": 1, 25]]} + ], + "favorable_labels": ["good"], + "unfavorable_labels": ["bad"], + } + + from ibm_watson_machine_learning.experiment import AutoAI + + experiment = AutoAI(wml_credentials, space_id=space_id) + pipeline_optimizer = experiment.optimizer( + name='Credit Risk Prediction and bias detection - AutoAI', + prediction_type=AutoAI.PredictionType.BINARY, + prediction_column='class', + scoring='accuracy', + fairness_info=fairness_info, + retrain_on_holdout=False + ) + +## Evaluating results ## + +You can view the evaluation results for each pipeline\. + + + +1. From the *Experiment summary* page, click the filter icon for the Pipeline leaderboard\. +2. Choose the Disparate impact metrics for your experiment\. This option evaluates one general metric and one metric for each monitored group\. +3. Review the pipeline metrics for disparate impact to determine whether you have a problem with bias or just to determine which pipeline performs better for a fairness evaluation\. + + + +In this example, the pipeline that was ranked first for accuracy also has a disparate income score that is within the acceptable limits\. + +![Viewing the fairness results](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-fairness3.png) + +## Bias mitigation ## + +If bias is detected in an experiment, you can mitigate it by optimizing your experiment by using "combined scorers": [`accuracy_and_disparate_impact`](https://lale.readthedocs.io/en/latest/modules/lale.lib.aif360.util.html#lale.lib.aif360.util.accuracy_and_disparate_impact) or [`r2_and_disparate_impact`](https://lale.readthedocs.io/en/latest/modules/lale.lib.aif360.util.html#lale.lib.aif360.util.r2_and_disparate_impact), both defined by the open source [LALE package](https://lale.readthedocs.io/en/latest/index.html)\. + +Combined scorers are used in the search and optimization process to return fair and accurate models\. + +For example, to optimize for bias detection for a classification experiment: + + + +1. Open **Experiment Settings**\. +2. On the *Predictions* page, choose to optimize **Accuracy and disparate impact** in the experiment\. +3. Rerun the experiment\. + + + +The *Accuracy and disparate impact* metric creates a combined score for accuracy and fairness for classification experiments\. A higher score indicates better performance and fairness measures\. If the disparate impact score is between 0\.9 and 1\.11 (an acceptable level), the accuracy score is returned\. Otherwise, a disparate impact value lower than the accuracy score is returned, with a lower (negative) value which indicates a fairness gap\. + +Note:Advanced users can use a [notebook to apply or review fairness detection methods](https://github.com/IBM/watson-machine-learning-samples/blob/master/cloud/notebooks/python_sdk/experiments/autoai/Use%20AutoAI%20to%20train%20fair%20models.ipynb)\. You can further refine a trained AutoAI model by using third\-party packages like: [lale, AIF360](https://lale.readthedocs.io/en/latest/modules/lale.lib.aif360.html#module-lale.lib.aif360) to extend the fairness and bias detection capabilities beyond what is provided with AutoAI by default\. + +Review a [sample notebook that evaluates pipelines for fairness](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-samples-overview.html)\. + +Read this [Medium blog post on Bias detection in AutoAI](https://lukasz-cmielowski.medium.com/bias-detection-and-mitigation-in-ibm-autoai-406db0e19181)\. + +### Next steps ### + +[Troubleshooting AutoAI experiments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-troubleshoot.html) + +**Parent topic**: [AutoAI overview](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3f3162bcd9976ed764717aa7004d9a755648b465.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3f3162bcd9976ed764717aa7004d9a755648b465.md new file mode 100644 index 0000000..b885c51 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3f3162bcd9976ed764717aa7004d9a755648b465.md @@ -0,0 +1,104 @@ +# Building an AutoAI model + +# Building an AutoAI model # + +AutoAI automatically prepares data, applies algorithms, and builds model pipelines that are best suited for your data and use case\. Learn how to generate the model pipelines that you can save as machine learning models\. + +Follow these steps to upload data and have AutoAI create the best model for your data and use case\. + + + +1. [Collect your input data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-build.html?context=cdpaas&locale=en#train-data) +2. [Open the AutoAI tool](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-build.html?context=cdpaas&locale=en#open-autoai) +3. [Specify details of your model and training data and start AutoAI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-build.html?context=cdpaas&locale=en#model-details) +4. [View the results](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-build.html?context=cdpaas&locale=en#view-results) + + + +## Collect your input data ## + +Collect and prepare your training data\. For details on allowable data sources, see [AutoAI overview](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html)\. + +Note:If you are creating an experiment with a single training data source, you have the option of using a second data source specifically as testing, or *holdout*, data for validating the pipelines\. + +## Open the AutoAI tool ## + +For your convenience, your AutoAI model creation uses the default storage that is associated with your project to store your data and to save model results\. + + + +1. Open your project\. +2. Click the **Assets** tab\. +3. Click **New asset > Build machine learning models automatically**\. + + + +Note: After you create an AutoAI asset it displays on the Assets page for your project in the **AutoAI experiments** section, so you can return to it\. + +## Specify details of your experiment ## + + + +1. Specify a name and description for your experiment\. +2. Select a machine learning service instance and click **Create**\. +3. Choose data from your project or upload it from your file system or from the asset browser, then press **Continue**\. Click the preview icon to review your data\. (Optional) Add a second file as holdout data for testing the trained pipelines\. +4. Choose the **Column to predict** for the data you want the experiment to predict\. + + + + * Based on analyzing a subset of the data set, AutoAI selects a default model type: binary classification, multiclass classification, or regression. Binary is selected if the target column has two possible values. Multiclass has a discrete set of 3 or more values. Regression has a continuous numeric variable in the target column. You can optionally override this selection. + + Note: The limit on values to classify is 200. Creating a classification experiment with many unique values in the prediction column is resource-intensive and affects the experiment's performance and training time. To maintain the quality of the experiment: + - AutoAI chooses a default metric for optimizing. For example, the default metric for a binary classification model is *Accuracy*. + - By default, 10% of the training data is held out to test the performance of the model. + + + +5. (Optional): Click **Experiment settings** to view or customize options for your AutoAI run\. For details on experiment settings, see [Configuring a classification or regression experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-config-class.html)\. +6. Click **Run Experiment** to begin model pipeline creation\. + + + +An infographic shows you the creation of pipelines for your data\. The duration of this phase depends on the size of your data set\. A notification message informs you if the processing time will be brief or require more time\. You can work in other parts of the product while the pipelines build\. + +![Relationship map of AutoAI generated pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_bank_sample_pipeline_build2.png) + +Hover over nodes in the infographic to explore the factors that pipelines share and their unique properties\. You can see the factors that pipelines share and the properties that make a pipeline unique\. For a guide to the data in the infographic, click the Legend tab in the information panel\. Or, to see a different view of the pipeline creation, click the Experiment details tab of the notification pane, then click **Switch views** to view the progress map\. In either view, click a pipeline node to view the associated pipeline in the leaderboard\. + +## View the results ## + +When the pipeline generation process completes, you can view the ranked model candidates and evaluate them before you save a pipeline as a model\. + +### Next steps ### + + + + * [Build an experiment from sample data](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html) + * [Configuring experiment settings](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-config-class.html) + * [Configure a text analysis experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-text-analysis.html) + + + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + + + + * Watch this video to see how to build a binary classification model + + This video provides a visual method to learn the concepts and tasks in this documentation. + + + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + + + + * Watch this video to see how to build a multiclass classification model + + This video provides a visual method to learn the concepts and tasks in this documentation. + + + +**Parent topic:**[AutoAI overview](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3f5d0fd7e429fedbfc62dfc9bab41b3cc5fb4e4f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3f5d0fd7e429fedbfc62dfc9bab41b3cc5fb4e4f.md new file mode 100644 index 0000000..b9bcb89 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/3f5d0fd7e429fedbfc62dfc9bab41b3cc5fb4e4f.md @@ -0,0 +1,38 @@ +# tablenode properties + +# tablenode properties # + +![Table node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/table_node_icon.png)The Table node displays data in table format\. This is useful whenever you need to inspect your data values\. + +Note: Some of the properties on this page might not be available in your platform\. + + + +tablenode properties + +Table 1\. tablenode properties + +| `tablenode` properties | Data type | Property description | +| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `full_filename` | *string* | If disk, data, or HTML output, the name of the output file\. | +| `use_output_name` | *flag* | Specifies whether a custom output name is used\. | +| `output_name` | *string* | If `use_output_name` is true, specifies the name to use\. | +| `output_mode` | `Screen`
`File` | Used to specify target location for output generated from the output node\. | +| `output_format` | `Formatted` (\.*tab*)
`Delimited` (\.*csv*)
`HTML` (\.*html*)
`Output` (\.*cou*) | Used to specify the type of output\. | +| `transpose_data` | *flag* | Transposes the data before export so that rows represent fields and columns represent records\. | +| `paginate_output` | *flag* | When the `output_format` is `HTML`, causes the output to be separated into pages\. | +| `lines_per_page` | *number* | When used with `paginate_output`, specifies the lines per page of output\. | +| `highlight_expr` | *string* | | +| `output` | *string* | A read\-only property that holds a reference to the last table built by the node\. | +| `value_labels` | *\[\[Value LabelString\]*
*\[Value LabelString\] \.\.\.\]* | Used to specify labels for value pairs\. | +| `display_places` | *integer* | Sets the number of decimal places for the field when displayed (applies only to fields with REAL storage)\. A value of `–1` will use the flow default\. | +| `export_places` | *integer* | Sets the number of decimal places for the field when exported (applies only to fields with REAL storage)\. A value of `–1` will use the stream default\. | +| `decimal_separator` | `DEFAULT`
`PERIOD`
`COMMA` | Sets the decimal separator for the field (applies only to fields with REAL storage)\. | +| `date_format` | `"DDMMYY" "MMDDYY" "YYMMDD" "YYYYMMDD" "YYYYDDD" DAY MONTH "DD-MM-YY" "DD-MM-YYYY" "MM-DD-YY" "MM-DD-YYYY" "DD-MON-YY" "DD-MON-YYYY" "YYYY-MM-DD" "DD.MM.YY" "DD.MM.YYYY" "MM.DD.YYYY" "DD.MON.YY" "DD.MON.YYYY" "DD/MM/YY" "DD/MM/YYYY" "MM/DD/YY" "MM/DD/YYYY" "DD/MON/YY" "DD/MON/YYYY" MON YYYY q Q YYYY ww WK YYYY` | Sets the date format for the field (applies only to fields with `DATE` or `TIMESTAMP` storage)\. | +| `time_format` | `"HHMMSS"`
`"HHMM"`
`"MMSS"`
`"HH:MM:SS"`
`"HH:MM"`
`"MM:SS"`
`"(H)H:(M)M:(S)S"`
`"(H)H:(M)M"`
`"(M)M:(S)S"`
`"HH.MM.SS"`
`"HH.MM"`
`"MM.SS"`
`"(H)H.(M)M.(S)S"`
`"(H)H.(M)M"`
`"(M)M.(S)S"` | Sets the time format for the field (applies only to fields with `TIME` or `TIMESTAMP` storage)\. | +| `column_width` | *integer* | Sets the column width for the field\. A value of `–1` will set column width to `Auto`\. | +| `justify` | `AUTO`
`CENTER`
`LEFT`
`RIGHT` | Sets the column justification for the field\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/400e9e780d8a149530df21e38b256b71bda12d83.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/400e9e780d8a149530df21e38b256b71bda12d83.md new file mode 100644 index 0000000..2ee0967 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/400e9e780d8a149530df21e38b256b71bda12d83.md @@ -0,0 +1,40 @@ +# Building the flow (SPSS Modeler) + +# Building the flow # + +Figure 1\. Example flow to classify customers using multinomial logistic regression + +![Example flow to classify customers using multinomial logistic regression](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_classify.png) + + + +1. Add a Data Asset node that points to telco\.csv\. +2. Add a Type node, double\-click it to open its properties, and click Read Values\. Make sure all measurement levels are set correctly\. For example, most fields with values of `0.0` and `1.0` can be regarded as flags\. + + Figure 2. Measurement levels + + ![Measurement levels](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_classify_measurement.png) + + Notice that `gender` is more correctly considered as a field with a set of two values, instead of a flag, so leave its measurement value as Nominal. +3. Set the role for the `custcat` field to Target\. Leave the role for all other fields set to Input\. +4. Since this example focuses on demographics, use a Filter node to include only the relevant fields: `region`, `age`, `marital`, `address`, `income`, `ed`, `employ`, `retire`, `gender`, `reside`, and `custcat`)\. Other fields will be excluded for the purpose of this analysis\. To filter them out, in the Filter node properties, click Add Columns and select the fields to exclude\. + + Figure 3. Filtering on demographic fields + + ![Filtering on demographic fields](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_classify_filter.png) + + (Alternatively, you could change the role to None for these fields rather than excluding them, or select the fields you want to use in the modeling node.) +5. In the Logistic node properties, under MODEL SETTINGS, select the Stepwise method\. Also select Multinomial, Main Effects, and Include constant in equation\. + + Figure 4. Example flow to classify customers using multinomial logistic regression + + ![Example flow to classify customers using multinomial logistic regression](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_classify_logistic.png) +6. Under EXPERT OPTIONS, select Expert mode, expand the Output section, and select Classification table\. + + Figure 5. Example flow to classify customers using multinomial logistic regression + + ![Example flow to classify customers using multinomial logistic regression](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_classify_output.png) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4058d0b5222f1c34abf1737a10da705e27480606.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4058d0b5222f1c34abf1737a10da705e27480606.md new file mode 100644 index 0000000..3db77a0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4058d0b5222f1c34abf1737a10da705e27480606.md @@ -0,0 +1,30 @@ +# Special fields (SPSS Modeler) + +# Special fields # + +Special functions are used to denote the specific fields under examination, or to generate a list of fields as input\. + +For example, when deriving multiple fields at once, you should use `@FIELD` to denote perform this derive action on the selected fields\. Using the expression `log(@FIELD)` derives a new log field for each selected field\. + + + +CLEM special fields + +Table 1\. CLEM special fields + +| Function | Result | Description | +| ----------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `@FIELD` | *Any* | Performs an action on all fields specified in the expression context\. | +| `@TARGET` | *Any* | When a CLEM expression is used in a user\-defined analysis function, `@TARGET` represents the target field or "correct value" for the target/predicted pair being analyzed\. This function is commonly used in an Analysis node\. | +| `@PREDICTED` | *Any* | When a CLEM expression is used in a user\-defined analysis function, `@PREDICTED` represents the predicted value for the target/predicted pair being analyzed\. This function is commonly used in an Analysis node\. | +| `@PARTITION_FIELD` | *Any* | Substitutes the name of the current partition field\. | +| `@TRAINING_PARTITION` | *Any* | Returns the value of the current training partition\. For example, to select training records using a Select node, use the CLEM expression: `@PARTITION_FIELD = @TRAINING_PARTITION` This ensures that the Select node will always work regardless of which values are used to represent each partition in the data\. | +| `@TESTING_PARTITION` | *Any* | Returns the value of the current testing partition\. | +| `@VALIDATION_PARTITION` | *Any* | Returns the value of the current validation partition\. | +| `@FIELDS_BETWEEN(start, end)` | *Any* | Returns the list of field names between the specified start and end fields (inclusive) based on the natural (that is, insert) order of the fields in the data\. | +| `@FIELDS_MATCHING(pattern)` | *Any* | Returns a list a field names matching a specified pattern\. A question mark (`?`) can be included in the pattern to match exactly one character; an asterisk (`*`) matches zero or more characters\. To match a literal question mark or asterisk (rather than using these as wildcards), a backslash (`\`) can be used as an escape character\.

Note: This requires a string literal as an argument; it can't use a nested expression to generate the argument\. | +| `@MULTI_RESPONSE_SET` | *Any* | Returns the list of fields in the named multiple response set\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/408fdab4f452ab2c207ee3416332d315598e3456.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/408fdab4f452ab2c207ee3416332d315598e3456.md new file mode 100644 index 0000000..861c87b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/408fdab4f452ab2c207ee3416332d315598e3456.md @@ -0,0 +1,5 @@ +# Databases for MongoDB on IBM watsonx + +# Databases for MongoDB on IBM watsonx # + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/40d279ada16512e67b7fb78fdac4ada9cfe5c645.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/40d279ada16512e67b7fb78fdac4ada9cfe5c645.md new file mode 100644 index 0000000..d151142 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/40d279ada16512e67b7fb78fdac4ada9cfe5c645.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Data provenance # + +![icon for transparency risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-transparency.svg)Risks associated with inputTraining and tuning phaseTransparencyAmplified + +### Description ### + +Without standardized and established methods for verifying where data came from, there are no guarantees that available data is what it claims to be\. + +### Why is data provenance a concern for foundation models? ### + +Not all data sources are trustworthy\. Data might have been unethically collected, manipulated, or falsified\. Using such data can result in undesirable behaviors in the model\. Business entities could face fines, reputational harms, and other legal consequences\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/40defbe604b3629caf8855a6d00ec14a0a6c92f3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/40defbe604b3629caf8855a6d00ec14a0a6c92f3.md new file mode 100644 index 0000000..426e16b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/40defbe604b3629caf8855a6d00ec14a0a6c92f3.md @@ -0,0 +1,15 @@ +# Watson Machine Learning on IBM watsonx + +# Watson Machine Learning on IBM watsonx # + +Watson Machine Learning is part of IBM® watsonx\.ai\. Watson Machine Learning provides a full range of tools for your team to build, train, and deploy Machine Learning models\. You can choose the tool with the level of automation or autonomy that matches your needs\. Watson Machine Learning provides the following tools: + + + + * AutoAI experiment builder for automatically processing structured data to generate model\-candidate pipelines\. The best\-performing pipelines can be saved as a machine learning model and deployed for scoring\. + * Deployment spaces give you the tools to view and manage model deployments\. + * Tools to view and manage model deployments\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/41167e3ad363b416d508b03a300e5acfaf83f042.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/41167e3ad363b416d508b03a300e5acfaf83f042.md new file mode 100644 index 0000000..c6bb04e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/41167e3ad363b416d508b03a300e5acfaf83f042.md @@ -0,0 +1,20 @@ +# Evaluation charts + +# Evaluation charts # + +Evaluation charts are similar to histograms or collection graphs\. Evaluation charts show how accurate models are in predicting particular outcomes\. They work by sorting records based on the predicted value and confidence of the prediction, splitting the records into groups of equal size (quantiles), and then plotting the value of the criterion for each quantile, from highest to lowest\. Multiple models are shown as separate lines in the plot\. + +Outcomes are handled by defining a specific value or range of values as a "hit"\. Hits usually indicate success of some sort (such as a sale to a customer) or an event of interest (such as a specific medical diagnosis)\. + +Flag +: Output fields are straightforward; hits correspond to `true` values\. + +Nominal +: For nominal output fields, the first value in the set defines a hit\. + +Continuous +: For continuous output fields, hits equal values greater than the midpoint of the field's range\. + +Evaluation charts can also be cumulative so that each point equals the value for the corresponding quantile plus all higher quantiles\. Cumulative charts usually convey the overall performance of models better, whereas noncumulative charts often excel at indicating particular problem areas for models\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/41ad83283a66cc3c467f70ea638b9c1c6681a160.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/41ad83283a66cc3c467f70ea638b9c1c6681a160.md new file mode 100644 index 0000000..65b1b3b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/41ad83283a66cc3c467f70ea638b9c1c6681a160.md @@ -0,0 +1,106 @@ +# Comparison of IBM watsonx as a Service and Cloud Pak for Data as a Service + +# Comparison of IBM watsonx as a Service and Cloud Pak for Data as a Service # + +IBM watsonx as a Service and Cloud Pak for Data as a Service have similar platform functionality and are compatible in many ways\. The watsonx platform provides a subset of the tools and services that are provided by Cloud Pak for Data as a Service\. However, watsonx\.ai and watsonx\.governance on watsonx provide more functionality than the same set of tools on Cloud Pak for Data as a Service\. + + + + * [Common platform functionality](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/compare-platforms.html?context=cdpaas&locale=en#platform) + * [Services on each platform](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/compare-platforms.html?context=cdpaas&locale=en#services) + * [Data science and MLOps tools](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/compare-platforms.html?context=cdpaas&locale=en#tools) + * [AI governance tools](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/compare-platforms.html?context=cdpaas&locale=en#gov) + + + +## Common platform functionality ## + +The following platform functionality is common to both watsonx and Cloud Pak for Data as a Service: + + + + * Security, compliance, and isolation + * Compute resources for running workloads + * Global search for assets across the platform + * The Platform assets catalog for sharing connections across the platform + * Role\-based user management within workspaces + * A services catalog for adding services + * View compute usage from the **Administration** menu + * Connections to remote data sources + * Connection credentials that are personal or shared + * Sample assets and projects + + + +If you are signed up for both watsonx and Cloud Pak for Data as a Service, you can switch between platforms\. See [Switching your platform](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/platform-switcher.html)\. + +## Services on each platform ## + +Both platforms provide services for data science and MLOps and AI governance use cases: + + + + * Watson Studio + * Watson Machine Learning + * Watson OpenScale + + + +However, the services for watsonx\.ai and watsonx\.governance on the watsonx platform include features for working with foundation models and generative AI that are not included in these services on Cloud Pak for Data as a Service\. + +Cloud Pak for Data as a Service also provides services for these use cases: + + + + * Data integration + * Data governance + + + +## Data science and AI tools ## + +Both platforms provide a common set of data science and AI tools\. However, on watsonx, you can also perform foundation model inferencing with the Prompt Lab tool or with a Python library in notebooks\. Foundation model inferencing and the Prompt Lab tool are not available on Cloud Pak for Data as a Service\. + +The following table shows which data science and AI tools are available on each platform\. + + + +Tools on watsonx and Cloud Pak for Data + +| Tool | On watsonx? | On Cloud Pak for Data? | +| ---------------------------- | ----------- | ---------------------- | +| [Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) | ✓ | No | +| [Synthetic Data Generator](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/synthetic_data_overview_sd.html) | ✓ | No | +| [Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) | ✓ | ✓ | +| [Visualizations](https://dataplatform.cloud.ibm.com/docs/content/dataview/idh_idc_cg_help_main.html) | ✓ | ✓ | +| [Jupyter notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-editor.html) | ✓ | ✓ | +| [Federated learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fed-lea.html) | ✓ | ✓ | +| [RStudio IDE](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-overview.html) | ✓ | ✓ | +| [SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsd/spss-modeler.html) | ✓ | ✓ | +| [Decision Optimization](https://dataplatform.cloud.ibm.com/docs/content/DO/DOWS-Cloud_home.html) | ✓ | ✓ | +| [AutoAI tool](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) | ✓ | ✓ | +| [Watson Pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-overview.html) | ✓ | ✓ | + + + +If you are signed up for Cloud Pak for Data as a Service, you can access watsonx and you can move your projects and deployment spaces that meet the requirements from one platform to the other\. See [Switching the platform for a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/switch-platform.html) and [Switching the platform for a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/switch-platform-space.html)\. + +## AI governance tools ## + +Both platforms contain the same AI use case inventory and evaluation tools\. However, on watsonx, you can track and evaluate generative AI assets and dimensions\. See [Comparison of governance solutions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-comparison.html)\. + +## Learn more ## + + + + * [Switching your platform](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/platform-switcher.html) + * [Switching the platform for a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/switch-platform.html) + * [Switching the platform for a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/switch-platform-space.html) + * [Overview of IBM watsonx as a Service](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/overview-wx.html) + * [Foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-overview.html) + + + +**Parent topic:**[Overview of watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/overview-wx.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/420946ca7e893cc5a2b3d1a8f47a7a2c7059d7f6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/420946ca7e893cc5a2b3d1a8f47a7a2c7059d7f6.md new file mode 100644 index 0000000..678aa82 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/420946ca7e893cc5a2b3d1a8f47a7a2c7059d7f6.md @@ -0,0 +1,22 @@ +# Screening predictors (SPSS Modeler) + +# Screening predictors # + +The Feature Selection node helps you identify the fields that are most important in predicting a certain outcome\. From a set of hundreds or even thousands of predictors, the Feature Selection node screens, ranks, and selects the predictors that may be most important\. Ultimately, you may end up with a quicker, more efficient model—one that uses fewer predictors, runs more quickly, and may be easier to understand\. + +The data used in this example represents a data warehouse for a hypothetical telephone company and contains information about responses to a special promotion by 5,000 of the company's customers\. The data includes many fields that contain customers' age, employment, income, and telephone usage statistics\. Three "target" fields show whether or not the customer responded to each of three offers\. The company wants to use this data to help predict which customers are most likely to respond to similar offers in the future\. + +This example uses the flow named Screening Predictors, available in the example project \. The data file is customer\_dbase\.csv\. + +This example focuses on only one of the offers as a target\. It uses the CHAID tree\-building node to develop a model to describe which customers are most likely to respond to the promotion\. It contrasts two approaches: + + + + * Without feature selection\. All predictor fields in the dataset are used as inputs to the CHAID tree\. + * With feature selection\. The Feature Selection node is used to select the best 10 predictors\. These are then input into the CHAID tree\. + + + +By comparing the two resulting tree models, we can see how feature selection can produce effective results\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/422554c1dcebabc93cb859b4a896908da48a540d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/422554c1dcebabc93cb859b4a896908da48a540d.md new file mode 100644 index 0000000..bbe8ef2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/422554c1dcebabc93cb859b4a896908da48a540d.md @@ -0,0 +1,87 @@ +# Setting up watsonx.governance + +# Setting up watsonx\.governance # + +You can set up watsonx\.governance to monitor model assets in your IBM watsonx projects or deployment spaces\. To set up watsonx\.governance, you can manage users and roles for your organization to control access to your projects or deployment spaces\. + +To set up watsonx\.governance, complete the following tasks: + + + + * [Creating access policies](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-setup-wos.html?context=cdpaas&locale=en#wos-access-policies) + * [Managing users and roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-setup-wos.html?context=cdpaas&locale=en#wos-users-wx) + + + +## Creating access policies ## + +You can complete the following steps to invite users to an IBM Cloud account that has a watsonx\.governance instance installed and assign service access\. + +**Required roles** : Users must have have the **Reader**, **Writer**, or higher IBM Cloud IAM Platform roles for service access\. Users that are assigned the **Writer** role or higher can access information across projects and deployment spaces in watsonx\.governance\. + + + +1. From the IBM Cloud homepage, click **Manage > Access (IAM)**\. +2. From the IAM dashboard, click **Users** and select **Invite user**\. +3. Complete the following fields: + + + + * *How do you want to assign access?* : `Access policy`. + * *Which service do you want to assign access to?* : `watsonx.governance` and click **Next**. + * *How do you want to scope the access* : Select the scope of access for users and click **Next**. + + + + * If you select **Specific resources**, select an attribute type and specify a value for each condition that you add. + * If you select **Service instance** in the *Attribute type* list, specify your instance in the *Value* field. + + + + + +4. If you have multiple instances, you must find the data mart ID to specify the instance that you want to assign users access to\. You can use one of the following methods to find the data mart ID: + + + + * On the **Insights** dashboard, click a model deployment tile and go to **Actions > View model information** to find the data mart ID. + * On the **Insights** dashboard, click the navigation menu on a model deployment tile and select **Configure monitors**. Then, go to the **Endpoints** tab and find the data mart ID in the **Integration details** section of the **Model information** tab. + + + +5. Select the **Reader** role in the **Service access** list\. +6. Assign access to users\. + + + + * If you are assigning access to new users, click **Add**, and then click **Invite** in the *Access summary* pane. + * If you are assigning access to existing users, click **Add**, and then click **Assign** in the *Access summary* pane. + + + + + +## watsonx\.governance users and roles ## + +You can assign roles to watsonx\.governance users to collaborate on model evaluations in [projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html#add-collaborators) and [deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/collaborator-permissions-wml.html#adding-collaborators)\. + +The following table lists permissions for roles that you can assign for access to evaluations\. The **Operator** and **Viewer** roles are equivalent\. + + + +Table 1\. Operations by role +The first row of the table describes separate roles that you can choose from when creating a user\. Each column provides a checkmark in the role category for the capability associated with that role\. + +| Operations | Admin role | Editor role | Viewer/Operator role | +|:------------------------------------------------------ |:----------:|:-----------:|:--------------------:| +| Evaluation | ✔ | ✔ | | +| View evaluation result | ✔ | ✔ | ✔ | +| Configure monitoring condition | ✔ | ✔ | | +| View monitoring condition | ✔ | ✔ | ✔ | +| Upload training data CSV file in model risk management | ✔ | ✔ | | + + + +**Parent topic:**[Setting up the platform for administrators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-platform.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4292721e4524ac59fa259576d39665946db8849d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4292721e4524ac59fa259576d39665946db8849d.md new file mode 100644 index 0000000..2df171e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4292721e4524ac59fa259576d39665946db8849d.md @@ -0,0 +1,34 @@ +# rfmanalysisnode properties + +# rfmanalysisnode properties # + +![RFM Analysis node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/rfm_analysis_icon.png)The Recency, Frequency, Monetary (RFM) Analysis node enables you to determine quantitatively which customers are likely to be the best ones by examining how recently they last purchased from you (recency), how often they purchased (frequency), and how much they spent over all transactions (monetary)\. + + + +rfmanalysisnode properties + +Table 1\. rfmanalysisnode properties + +| `rfmanalysisnode` properties | Data type | Property description | +| ---------------------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `recency` | *field* | Specify the recency field\. This may be a date, timestamp, or simple number\. | +| `frequency` | *field* | Specify the frequency field\. | +| `monetary` | *field* | Specify the monetary field\. | +| `recency_bins` | *integer* | Specify the number of recency bins to be generated\. | +| `recency_weight` | *number* | Specify the weighting to be applied to recency data\. The default is 100\. | +| `frequency_bins` | *integer* | Specify the number of frequency bins to be generated\. | +| `frequency_weight` | *number* | Specify the weighting to be applied to frequency data\. The default is 10\. | +| `monetary_bins` | *integer* | Specify the number of monetary bins to be generated\. | +| `monetary_weight` | *number* | Specify the weighting to be applied to monetary data\. The default is 1\. | +| `tied_values_method` | `Next``Current` | Specify which bin tied value data is to be put in\. | +| `recalculate_bins` | `Always``IfNecessary` | | +| `add_outliers` | *flag* | Available only if `recalculate_bins` is set to `IfNecessary`\. If set, records that lie below the lower bin will be added to the lower bin, and records above the highest bin will be added to the highest bin\. | +| `binned_field` | `Recency``Frequency``Monetary` | | +| `recency_thresholds` | *value value* | Available only if `recalculate_bins` is set to `Always`\. Specify the upper and lower thresholds for the recency bins\. The upper threshold of one bin is used as the lower threshold of the next—for example, `[10 30 60]` would define two bins, the first bin with upper and lower thresholds of 10 and 30, with the second bin thresholds of 30 and 60\. | +| `frequency_thresholds` | *value value* | Available only if `recalculate_bins` is set to `Always`\. | +| `monetary_thresholds` | *value value* | Available only if `recalculate_bins` is set to `Always`\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/42ae491240ef740e6a8c5cf32b817e606f554e49.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/42ae491240ef740e6a8c5cf32b817e606f554e49.md new file mode 100644 index 0000000..b05bf6d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/42ae491240ef740e6a8c5cf32b817e606f554e49.md @@ -0,0 +1,116 @@ +# Foundation model parameters: decoding and stopping criteria + +# Foundation model parameters: decoding and stopping criteria # + +You can specify parameters to control how the model generates output in response to your prompt\. This topic lists parameters that you can control in the Prompt Lab\. + +## Decoding ## + +*Decoding* is the process a model uses to choose the tokens in the generated output\. + +*Greedy decoding* selects the token with the highest probability at each step of the decoding process\. Greedy decoding produces output that closely matches the most common language in the model's pretraining data and in your prompt text, which is desirable in less creative or fact\-based use cases\. A weakness of greedy decoding is that it can cause repetitive loops in the generated output\. + +*Sampling decoding* is more variable, more random than greedy decoding\. Variability and randomness is desirable in creative use cases\. However, with greater variability comes the risk of nonsensical output\. Sampling decoding selects tokens from a probability distribution at each step: + + + + * *Temperature sampling* refers to selecting a high\- or low\-probability next token\. + * *Top\-k sampling* refers to selecting the next token randomly from a specified number, k, of tokens with the highest probabilities\. + * *Top\-p sampling* refers to selecting the next token randomly from the smallest set of tokens for which the cumulative probability exceeds a specified value, p\. (Top\-p sampling is also called *nucleus sampling*\.) + + + +You can specify values for both Top K and Top P\. When both parameters are used, Top K is applied first\. When Top P is computed, any tokens below the cutoff set by Top K are considered to have a probability of zero\. + + + +Table 1\. Supported values, defaults, and usage notes for sampling decoding + +| Parameter | Supported values | Default | Use | +| --------------- | ----------------------------------------------------------------------------------------------- | ------- | ----------------------------------------- | +| **Temperature** | Floating\-point number in the range 0\.0 (same as greedy decoding) to 2\.0 (maximum creativity) | 0\.7 | Higher values lead to greater variability | +| **Top K** | Integer in the range 1 to 100 | 50 | Higher values lead to greater variability | +| **Top P** | Floating\-point number in the range 0\.0 to 1\.0 | 1\.0 | Higher values lead to greater variability | + + + +### Random seed ### + +When you submit the same prompt to a model multiple times with sampling decoding, you'll usually get back different generated text each time\. This variability is the result of intentional pseudo\-randomness built into the decoding process\. *Random seed* refers to the number used to generate that pseudo\-random behavior\. + + + + * **Supported values:** Integer in the range 1 to 4 294 967 295 + * **Default:** Generated based on the current server system time + * **Use:** To produce repeatable results, set the same random seed value every time\. + + + +### Repetition penalty ### + +If you notice the result generated for your chosen prompt, model, and parameters consistently contains repetitive text, you can try adding a *repetition penalty*\. + + + + * **Supported values:** Floating\-point number in the range 1\.0 (no penalty) to 2\.0 (maximum penalty) + * **Default:** 1\.0 + * **Use:** The higher the penalty, the less likely it is that the result will include repeated text\. + + + +## Stopping criteria ## + +You can affect the length of the output generated by the model in two ways: specifying stop sequences and setting Min tokens and Max tokens\. Text generation stops after the model considers the output to be complete, a stop sequence is generated, or the maximum token limit is reached\. + +### Stop sequences ### + +A *stop sequence* is a string of one or more characters\. If you specify stop sequences, the model will automatically stop generating output after one of the stop sequences that you specify appears in the generated output\. For example, one way to cause a model to stop generating output after just one sentence is to specify a period as a stop sequence\. That way, after the model generates the first sentence and ends it with a period, output generation stops\. Choosing effective stop sequences depends on your use case and the nature of the generated output you expect\. + +**Supported values:** 0 to 6 strings, each no longer than 40 tokens + +**Default:** No stop sequence + +**Use:** + + + + * Stop sequences are ignored until after the number of tokens that are specified in the Min tokens parameter are generated\. + * If your prompt includes examples of input\-output pairs, ensure the sample output in the examples ends with one of the stop sequences\. + + + +### Minimum and maximum new tokens ### + +If you're finding the output from the model is too short or too long, try adjusting the parameters that control the number of generated tokens: + + + + * The *Min tokens* parameter controls the minimum number of tokens in the generated output + * The *Max tokens* parameter controls the maximum number of tokens in the generated output + + + +The maximum number of tokens that are allowed in the output differs by model\. For more information, see the *Maximum tokens* information in [Supported foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html)\. + +**Defaults:** + + + + * Min tokens: 0 + * Max tokens: 20 + + + +**Use:** + + + + * Min tokens must be less than or equal to Max tokens\. + * Because the cost of using foundation models in IBM watsonx\.ai is based on use, which is partly related to the number of tokens that are generated, specifying the lowest value for Max tokens that works for your use case is a cost\-saving strategy\. + * For Lite plans, output stops being generated after a dynamic, model\-specific, environment\-driven upper limit is reached, even if the value specified with the Max tokens parameter is not reached\. To determine the upper limit, see the *Tokens limits* section for the model in [Supported foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html) or call the [`get_details`](https://ibm.github.io/watson-machine-learning-sdk/foundation_models.html#ibm_watson_machine_learning.foundation_models.Model.get_details) function of the foundation models Python library\. + + + +**Parent topic:**[Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/42e228e8218a4fdef9f2ca0db53b5b594a475b88.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/42e228e8218a4fdef9f2ca0db53b5b594a475b88.md new file mode 100644 index 0000000..f09b927 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/42e228e8218a4fdef9f2ca0db53b5b594a475b88.md @@ -0,0 +1,9 @@ +# About text mining (SPSS Modeler) + +# About text mining # + +Today, an increasing amount of information is being held in unstructured and semi\-structured formats, such as customer e\-mails, call center notes, open\-ended survey responses, news feeds, web forms, etc\. This abundance of information poses a problem to many organizations that ask themselves: How can we collect, explore, and leverage this information? + +Text mining is the process of analyzing collections of textual materials in order to capture key concepts and themes and uncover hidden relationships and trends without requiring that you know the precise words or terms that authors have used to express those concepts\. Although they are quite different, text mining is sometimes confused with information retrieval\. While the accurate retrieval and storage of information is an enormous challenge, the extraction and management of quality content, terminology, and relationships contained within the information are crucial and critical processes\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/42f34465dd884e8110bb08a708a138532999714f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/42f34465dd884e8110bb08a708a138532999714f.md new file mode 100644 index 0000000..c539214 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/42f34465dd884e8110bb08a708a138532999714f.md @@ -0,0 +1,51 @@ +# Compute resource options for AutoAI experiments in projects + +# Compute resource options for AutoAI experiments in projects # + +When you run an AutoAI experiment in a project, the type, size, and power of the hardware configuration available depend on the type of experiment you build\. + + + + * [Default hardware configurations](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-autoai.html?context=cdpaas&locale=en#default) + * [Compute usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-autoai.html?context=cdpaas&locale=en#compute) + + + +## Default hardware configurations ## + +The type of hardware configuration available for your AutoAI experiment depends on the type of experiment you are building\. A standard AutoAI experiment, with a single data source, has a single, default hardware configuration\. An AutoAI experiment with joined data has options for increasing computational power\. + +### Capacity units per hour for AutoAI experiments ### + + + +Hardware configurations available in projects for AutoAI with a single data source + +| Capacity type | Capacity units per hour | +| -------------------- | ----------------------- | +| 8 vCPU and 32 GB RAM | 20 | + + + +The runtimes for AutoAI stop automatically when processing is complete\. + +## Compute usage in projects ## + +AutoAI consumes compute resources as CUH from the Watson Machine Learning service\. + +You can monitor the total monthly amount of CUH consumption for the Watson Machine Learning service on the **Resource usage** page on the **Manage** tab of your project\. + +## Learn more ## + + + + * [AutoAI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) + * [Watson Machine Learning service](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html) + * [Compute resource options for assets and deployments in spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-cuh-deploy-spaces.html) + * [Monitoring account resource usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html) + + + +**Parent topic:**[Choosing compute resources for tools](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/43071778b4e33375953afb1ab743b342d3cc906a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/43071778b4e33375953afb1ab743b342d3cc906a.md new file mode 100644 index 0000000..6912356 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/43071778b4e33375953afb1ab743b342d3cc906a.md @@ -0,0 +1,36 @@ +# Data preparation (SPSS Modeler) + +# Data preparation # + +Based on the results of exploring the data, the following flow derives the relevant data and learns to predict faults\. + +This example uses the flow named Condition Monitoring, available in the example project installed with the product\. The data files are cond1n\.csv and cond2n\.csv\. + + + +1. On the My Projects screen, click Example Project\. +2. Scroll down to the Modeler flows section, click View all, and select the Condition Monitoring flow\. + + + +Figure 1\. Condition Monitoring example flow + +![Condition Monitoring example flow](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_condition.png)The flow uses a number of Derive nodes to prepare the data for modeling\. + + + + * Data Asset import node\. Reads data file cond1n\.csv\. + * Pressure Warnings (Derive)\. Counts the number of momentary pressure warnings\. Reset when time returns to 0\. + * TempInc (Derive)\. Calculates momentary rate of temperature change using `@DIFF1`\. + * PowerInc (Derive)\. Calculates momentary rate of power change using `@DIFF1`\. + * PowerFlux (Derive)\. A flag, true if power varied in opposite directions in the last record and this one; that is, for a power peak or trough\. + * PowerState (Derive)\. A state that starts as `Stable` and switches to `Fluctuating` when two successive power fluxes are detected\. Switches back to `Stable` only when there hasn't been a power flux for five time intervals or when `Time` is reset\. + * PowerChange (Derive)\. Average of `PowerInc` over the last five time intervals\. + * TempChange (Derive)\. Average of `TempInc` over the last five time intervals\. + * Discard Initial (Select)\. Discards the first record of each time series to avoid large (incorrect) jumps in `Power` and `Temperature` at boundaries\. + * Discard fields (Filter)\. Cuts records down to `Uptime`, `Status`, `Outcome`, `Pressure Warnings`, `PowerState`, `PowerChange`, and `TempChange`\. + * Type\. Defines the role of `Outcome` as Target (the field to predict)\. In addition, defines the measurement level of `Outcome` as Nominal, `Pressure Warnings` as Continuous, and `PowerState` as Flag\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/433775834ea8ae82cbfa6077fc361c3c52a99e42.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/433775834ea8ae82cbfa6077fc361c3c52a99e42.md new file mode 100644 index 0000000..c24b167 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/433775834ea8ae82cbfa6077fc361c3c52a99e42.md @@ -0,0 +1,74 @@ +# Building the flow (SPSS Modeler) + +# Building the flow # + +Figure 1\. Example flow to classify customers using binomial logistic regression + +![Example flow to classify customers using binomial logistic regression](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_churn.png) + + + +1. Add a Data Asset node that points to telco\.csv\. +2. Add a Type node, double\-click it to open its properties, and make sure all measurement levels are set correctly\. For example, most fields with values of `0` and `1` can be regarded as flags, but certain fields, such as gender, are more accurately viewed as a nominal field with two values\. + + Figure 2. Measurement levels + + ![Measurement levels](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_churn_measurement.png) +3. Set the measurement level for the `churn` field to Flag, and set the role to Target\. Leave the role for all other fields set to Input\. +4. Add a Feature Selection modeling node to the Type node\. You can use a Feature Selection node to remove predictors or data that don't add any useful information about the predictor/target relationship\. +5. Run the flow\. Right\-click the resulting model nugget and select View Model\. You'll see a list of the most important fields\. +6. Add a Filter node after the Type node\. Not all of the data in the telco\.csv data file will be useful in predicting churn\. You can use the filter to only select data considered to be important for use as a predictor (the fields marked as Important in the model generated in the previous step)\. +7. Double\-click the Filter node to open its properties, select the option Retain the selected fields (all other fields are filtered), and add the following important fields from the Feature Selection model nugget: + + tenure + age + address + income + ed + employ + equip + callcard + wireless + longmon + tollmon + equipmon + cardmon + wiremon + longten + tollten + cardten + voice + pager + internet + callwait + confer + ebill + loglong + logtoll + lninc + custcat + churn +8. Add a Data Audit output node after the Filter node\. Right\-click the node and run it, then open the output that was added to the Outputs pane\. +9. Look at the % Complete column, which lets you identify any fields with large amounts of missing data\. In this case, the only field you need to amend is `logtoll`, which is less than 50% complete\. +10. Close the output, and add a Filler node after the Filter node\. Double\-click the node to open its properties, click Add Columns, and select the `logtoll` field\. +11. Under Replace, select Blank and null values\. Click Save to close the node properties\. +12. Right\-click the Filler node you just created and select Create supernode\. Double\-click the supernode and change its name to Missing Value Imputation\. +13. Add a Logistic node after the Filler node\. Double\-click the node to open its properties\. Under Model Settings, select the Binomial procedure and the Forwards Stepwise method\. + + Figure 3. Choosing model settings + + ![Choosing model settings](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_churn_model.png) +14. Under Expert Options, select Expert\. + + Figure 4. Choosing expert options + + ![Choosing expert options](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_churn_expert.png) +15. Click Output to open the display settings\. Select At each step, Iteration history, and Parameter estimates, then click OK\. + + Figure 5. Choosing expert options + + ![Choosing expert options](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_churn_expert_output.png) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/43785386700cf73e37a8f76adc4ef9fb01ee0aeb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/43785386700cf73e37a8f76adc4ef9fb01ee0aeb.md new file mode 100644 index 0000000..7cd7b21 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/43785386700cf73e37a8f76adc4ef9fb01ee0aeb.md @@ -0,0 +1,115 @@ +# Generating accurate output + +# Generating accurate output # + +Foundation models sometimes generate output that is not factually accurate\. If factual accuracy is important for your project, set yourself up for success by learning how and why these models might sometimes get facts wrong and how you can ground generated output in correct facts\. + +## Why foundation models get facts wrong ## + +Foundation models can get facts wrong for a few reasons: + + + + * Pre\-training builds word associations, not facts + * Pre\-training data sets contain out\-of\-date facts + * Pre\-training data sets do not contain esoteric or domain\-specific facts and jargon + * Sampling decoding is more likely to stray from the facts + + + +### Pre\-training builds word associations, not facts ### + +During pre\-training, a foundation model builds up a vocabulary of words ([tokens](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tokens.html)) encountered in the pre\-training data sets\. Also during pre\-training, statistical relationships between those words become encoded in the model weights\. + +For example, "Mount Everest" often appears near "tallest mountain in the world" in many articles, books, speeches, and other common pre\-training sources\. As a result, a pre\-trained model will probably correctly complete the prompt "The tallest mountain in the world is " with the output "Mount Everest\." + +These word associations can make it seem that facts have been encoded into these models too\. For very common knowledge and immutable facts, you might have good luck generating factually accurate output using pre\-trained foundation models with simple prompts like the tallest\-mountain example\. However, it is a risky strategy to rely on only pre\-trained word associations when using foundation models in applications where accuracy matters\. + +### Pre\-training data sets contain out\-of\-date facts ### + +Collecting pre\-training data sets and performing pre\-training runs can take a significant amount of time, sometimes months\. If a model was pre\-trained on a data set from several years ago, the model vocabulary and word associations encoded in the model weights won't reflect current world events or newly popular themes\. For this reason, if you submit the prompt "The most recent winner of the world cup of football (soccer) is " to a model pre\-trained on information a few years old, the generated output will be out of date\. + +### Pre\-training data sets do not contain esoteric or domain\-specific facts and jargon ### + +Common foundation model pre\-training data sets, such as [The Pile (Wikipedia)](https://en.wikipedia.org/wiki/The_Pile_%28dataset%29), contain hundreds of millions of documents\. Given how famous Mount Everest is, it's reasonable to expect a foundation model to have encoded a relationship between "tallest mountain in the world" and "Mount Everest"\. However, if a phenomenon, person, or concept is mentioned in only a handful of articles, chances are slim that a foundation model would have any word associations about that topic encoded in its weights\. Prompting a pre\-trained model about information that was not in its pre\-training data sets is unlikely to produce factually accurate generated output\. + +### Sampling decoding is more likely to stray from the facts ### + +Decoding is the process a model uses to choose the words (tokens) in the generated output: + + + + * Greedy decoding always selects the token with the highest probability + * Sampling decoding selects tokens pseudo\-randomly from a probability distribution + + + +Greedy decoding generates output that is more predictable and more repetitive\. Sampling decoding is more random, which feels "creative"\. If, based on pre\-training data sets, the most likely words to follow "The tallest mountain is " are "Mount Everest", then greedy decoding could reliably generate that factually correct output, whereas sampling decoding might sometimes generate the name of some other mountain or something that's not even a mountain\. + +## How to ground generated output in correct facts ## + +Rather than relying on only pre\-trained word associations for factual accuracy, provide context in your prompt text\. + +### Use context in your prompt text to establish facts ### + +When you prompt a foundation model to generate output, the words (tokens) in the generated output are influenced by the words in the model vocabulary and the words in the prompt text\. You can use your prompt text to boost factually accurate word associations\. + +#### Example 1 #### + +Here's a prompt to cause a model to complete a sentence declaring your favorite color: + + My favorite color is + +Given that only you know what your favorite color is, there's no way the model could reliably generate the correct output\. + +Instead, a color will be selected from colors mentioned in the model's pre\-training data: + + + + * If greedy decoding is used, whichever color appears most frequently with statements about favorite colors in pre\-training content will be selected\. + * If sampling decoding is used, a color will be selected randomly from colors mentioned most often as favorites in the pre\-training content\. + + + +#### Example 2 #### + +Here's a prompt that includes context to establish the facts: + + I recently painted my kitchen yellow, which is my favorite color. + + My favorite color is + +If you prompt a model with text that includes factually accurate context like this, then the output the model generates will be more likely to be accurate\. + +For more examples of including context in your prompt, see these samples: + + + + * [Sample 4a \- Answer a question based on an article](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#sample4a) + * [Sample 4b \- Answer a question based on an article](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#sample4b) + + + +### Use less "creative" decoding ### + +When you include context with the needed facts in your prompt, using greedy decoding is likely to generate accurate output\. If you need some variety in the output, you can experiment with sampling decoding with low values for parameters like `Temperature`, `Top P`, and `Top K`\. However, using sampling decoding increases the risk of inaccurate output\. + +## Retrieval\-augmented generation ## + +The retrieval\-augmented generation pattern scales out the technique of pulling context into prompts\. If you have a knowledge base, such as process documentation in web pages, legal contracts in PDF files, a database of products for sale, a GitHub repository of C\+\+ code files, or any other collection of information, you can use the retrieval\-augmented generation pattern to generate factually accurate output based on the information in that knowledge base\. + +Retrieval\-augmented generation involves three basic steps: + + + +1. Search for relevant content in your knowledge base +2. Pull the most relevant content into your prompt as context +3. Send the combined prompt text to the model to generate output + + + +For more information, see: [Retrieval\-augmented generation](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-rag.html) + +**Parent topic:**[Prompt tips](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-tips.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/438b5abac4d30492c2f192ea551e9514df877831.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/438b5abac4d30492c2f192ea551e9514df877831.md new file mode 100644 index 0000000..b2edf2d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/438b5abac4d30492c2f192ea551e9514df877831.md @@ -0,0 +1,55 @@ +# IBM watsonx APIs + +# IBM watsonx APIs # + +You can perform many of the tasks for watsonx with APIs\. + +## APIs for managing assets ## + +You can use a collection of REST APIs to manage data\-related assets and the people who need to use these assets\. See [Watson Data API](http://ibm.biz/wdp-api)\. + +## Connections in the Watson Data API ## + +Use the Watson Data API to create a connection in a catalog or project\. See [Connections in the Watson Data API](https://cloud.ibm.com/apidocs/watson-data-api#connections)\. + +## Python library for foundation models ## + +For the full library reference, see [Foundation models Python library](https://ibm.github.io/watson-machine-learning-sdk/foundation_models.html)\. + +For examples of how to use the foundation models Python library, see [Foundation models Python library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-python-lib.html)\. + +## APIs for machine learning ## + +Watson Machine Learning allows for managing spaces, deployments, and assets programmatically by using: + + + + * [REST API](https://cloud.ibm.com/apidocs/machine-learning) + * [Python client library](https://ibm.github.io/watson-machine-learning-sdk/) + + + +For links to sample Jupyter Notebooks that demonstrate how to manage spaces, deployments, and assets programmatically, see [Machine Learning Python client samples and examples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-samples-overview.html)\. + +## APIs for factsheets ## + +AI Factsheets allows managing settings, model entries, and report templates programmatically by using: + + + + * [REST API](https://cloud.ibm.com/apidocs/factsheets) + * [Python client library](https://s3.us.cloud-object-storage.appdomain.cloud/factsheets-client/index.html#factsheet-asset-elements) + + + +## Learn more ## + + + + * [Watson Data API](https://cloud.ibm.com/apidocs/watson-data-api) + * [Watson Machine Learning API docs](https://cloud.ibm.com/apidocs/machine-learning) + * [AI Factsheets API docs](https://cloud.ibm.com/apidocs/factsheets) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4451c208e0350c4c480f50929bd6735588b6f2bc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4451c208e0350c4c480f50929bd6735588b6f2bc.md new file mode 100644 index 0000000..5083120 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4451c208e0350c4c480f50929bd6735588b6f2bc.md @@ -0,0 +1,81 @@ +# Apache Hive connection + +# Apache Hive connection # + +To access your data in Apache Hive, you must create a connection asset for it\. + +Apache Hive is a data warehouse software project that provides data query and analysis and is built on top of Apache Hadoop\. + +## Supported versions ## + +Apache Hive 1\.0\.x, 1\.1\.x, 1\.2\.x\. 2\.0\.x, 2\.1\.x, 3\.0\.x, 3\.1\.x\. + +## Create a connection to Apache Hive ## + +To create the connection asset, you need the following connection details: + + + + * Database name + * Hostname or IP address + * Port number + * HTTP path (Optional): The path of the endpoint such as the gateway, default, or hive if the server is configured for the HTTP transport mode\. + * If required by the database server, the SSL certificate + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use the Apache Hive connection in the following workspaces and tools: + + + + * Data Refinery + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Apache Hive setup ## + +[Apache Hive installation and configuration](https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-InstallationandConfiguration) + +## Restriction ## + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [SQL Operations](https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-SQLOperations) in the Apache Hive documentation for the correct syntax\. + +## Learn more ## + +[Apache Hive documentation](https://cwiki.apache.org/confluence/display/Hive/GettingStarted) + +**Parent topic**: [Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/445b99372919de6b2c3e6a7e2c3f4caab0bf174c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/445b99372919de6b2c3e6a7e2c3f4caab0bf174c.md new file mode 100644 index 0000000..911ada2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/445b99372919de6b2c3e6a7e2c3f4caab0bf174c.md @@ -0,0 +1,195 @@ +# Configuring global objects for Watson Pipelines + +# Configuring global objects for Watson Pipelines # + +Use global objects to create configurable constants to configure your pipeline at run time\. Use parameters or user variables in pipelines to specify values at run time, rather than hardcoding the values\. Unlike pipeline parameters, user variables can be dynamically set during the flow\. + +Learn about creating: + + + + * [Pipeline parameters](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-flow-param.html?context=cdpaas&locale=en#flow) + * [Parameter sets](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-flow-param.html?context=cdpaas&locale=en#param-set) + * [User variables](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-flow-param.html?context=cdpaas&locale=en#user) + + + +## Pipeline parameters ## + +Use pipeline parameters to specify a value at pipeline runtime\. For example, if you want a user to enter a deployment space for pipeline output, use a parameter to prompt for the space name to use when the pipeline runs\. Specifying the value of the parameter each time that you run the job helps you use the correct resources\. + +About pipeline parameters: + + + + * can be assigned as a node value or assign it for the pipeline job\. + * can be assigned to any node, and a status indicator alerts you\. + * can be used for multiple nodes\. + + + +### Defining a pipeline parameter ### + + + +1. Create a pipeline parameter from the node configuration panel from the toolbar\. +2. Enter a name and an optional description\. The name must be lower *snake* case with lowercase letters, numbers, and underscores\. For example, `lower_snake_case_with_numbers_123` is a valid name\. The name must begin with a letter\. If the name does not comply, you get a 404 error when you try to run the pipeline\. +3. Assign a parameter type\. Depending on the parameter type, you might need to provide more details or assign a default value\. +4. Click **Add to list** to save the pipeline parameter\. + + + +Note: + +### Parameter types ### + +Parameter types are categorized as: + + + + * **Basic:** including data types to structure input to a pipeline or options for handling the creation of a duplicate space or asset\. + * **Resource:** for selecting a project, catalog, space, or asset\. + * **Instance:** for selecting a machine learning instance or a Cloud Object Storage instance\. + * **Other:** for specifying details, such as creation mode or error policy\. + + + +#### Example of using pipeline types #### + +To create a parameter of the type **Path**: + + + +1. Create a parameter set called **MASTER\_PARAMETER\_SET**\. +2. Create a parameter called `file_path` and set the type to **Path**\. +3. Set the value of `file_path` to `mnts/workspace/masterdir`\. +4. Drag the node **Wait for file** onto the canvas and set the *File location* value to `MASTER_PARAMETER_SET.file_path`\. +5. Connect the **Wait for file** with the **Run Bash script** node so that the latter node runs after the former\. +6. *Optional:* Test your parameter variable: + + + + 1. Add the environment variable parameter to your **MASTER\_PARAMETER\_SET** parameter set, for example `FILE_PATH`. + 2. Paste the following command into the *Script code* of the **Run Bash script**: + + echo File: $FILE_PATH + cat $FILE_PATH + + + +7. Run the pipeline\. The path `mnts/workspace/masterdir` is in both of the nodes' execution logs to see they passed successfully\. + + + +## Configuring a node with a pipeline parameter ## + +When you configure a node with a pipeline parameter, you can choose an existing pipeline parameter or create a new one as part of configuring a node\. + +For example: + + + +1. Create a pipeline parameter called *creationmode* and save it to the parameter list\. +2. Configure a *Create deployment space* node and click to open the configuration panel\. +3. Choose the **Pipeline parameter** as the input for the **Creation mode** option\. +4. Choose the *creationmode* pipeline parameter and save the configuration\. + + + +When you run the flow, the pipeline parameter is assigned when the space is created\. + +## Parameter sets ## + +Parameter sets are a group of related parameters to use in a pipeline\. For example, you might create one set of parameters to use in a test environment and another for use in a production environment\. + +Parameter sets can be created as a project asset\. Parameter sets created in the project are then available for use in pipelines in that project\. + +### Creating a parameter set as a project asset ### + +You can create a parameter set as a reusable project asset to use in pipelines\. + + + +1. Open an existing project or create a project\. +2. Click **New task > Collect multiple job parameters with specified values to reuse in jobs** from the available tasks\. +3. Assign a name for the set, and specify the details for each parameter in the set, including: + + + + * Name for the parameter + * Data type + * Prompt + * Default value + + + +4. Optionally create value sets for the parameters in the parameter set\. The value sets can be the different values for different contexts\. For example, you can create a Test value set with values for a test environment, and a production set for production values\. +5. Save the parameter set after you create all the parameters, s\. It becomes available for use in pipelines that are created in that project\. + + + +### Adding a parameter set for use in a pipeline ### + +To add a parameter set from a project: + + + +1. Click the global objects icon and switch to the **Parameter sets tab**\. +2. Click **Add parameter set** to add parameter sets from your project that you want to use in your pipeline\. +3. You can add or remove parameter sets from the list\. The parameter sets you specify for use in your pipeline becomes available when you assign parameters as input in the pipeline\. + + + +### Creating a parameter set from the parameters list in your pipeline ### + +You can create a parameter set from the parameters list for your pipeline + + + +1. Click the global objects icon and open the Pipeline Parameters\. +2. Select the parameters that you want in the set, then click the **Save as parameter set** icon\. +3. Enter a name and optional description for the set\. +4. Save to add the parameter set for use in your pipeline\. + + + +### Using a parameter set in a pipeline ### + +To use a parameter set: + + + +1. Choose **Assign pipeline parameter** as an input type from a node property sheet\. +2. Choose the parameter to assign\. A list displays all available parameters of the type for that input\. Available parameters can be individual parameters, and parameters defined as part of a set\. The parameter set name precedes the name of the parameter\. For example, *Parameter\_set\_name\.Parameter\_name*\. +3. Run the pipeline and select a value set for the corresponding value (if available), assign a value for the parameter, or accept the default value\. + + + +Note:You can use a parameter set in the expression builder by using the format `param_sets.`\. If a parameter set value contains an environment variable, you must use this syntax in the expression builder: `param_sets.MyParamSet["$ICU_DATA"]`\. Attention: If you delete a parameter, make sure that you remove the references to the parameter from your job design\. If you do not remove the references, your job might fail\. + +### Editing a parameter set in a job ### + +If you use a parameter set when you define a job, you can choose a value set to populate variables with the values in that set\. If you change and save the values, then edit the job and save changes, the parameter set values reset to the defaults\. + +## User variables ## + +Create user variables to assign values when the flow runs\. Unlike pipeline parameters, user variables can be modified during processing\. + +### Defining a user variable ### + +You can create user variables for use in your pipeline\. User variables, like parameters, are defined on the global level and are not specific to any node\. The initial value for a user variable must be set when you define it and cannot be set dynamically as the result of any node output\. When you define a user variable, you can use the **Set user variables** node to update it with node output\. + +To create a user variable: + + + +1. Create a variable from the **Update variable** node configuration panel or from the toolbar\. +2. Enter a name and an optional description\. The name must be lower *snake* case with lowercase letters, numbers, and underscores\. For example, lower\_snake\_case\_with\_numbers\_123 is a valid name\. The name must begin with a letter\. If the name does not comply, you get a 404 error when you try to run the pipeline\. +3. Complete the definition of the variable, including choosing a variable type and input type\. +4. Click **Add** to add the variable to the list\. It is now available for use in a node\. + + + +**Parent topic:**[Creating a pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-create.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/448502b5d06cd5bcaa58f569aa43aa2e0394a794.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/448502b5d06cd5bcaa58f569aa43aa2e0394a794.md new file mode 100644 index 0000000..51cebbb --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/448502b5d06cd5bcaa58f569aa43aa2e0394a794.md @@ -0,0 +1,771 @@ +# Troubleshoot Watson Machine Learning + +# Troubleshoot Watson Machine Learning # + +Here are the answers to common troubleshooting questions about using IBM Watson Machine Learning\. + +## Getting help and support for Watson Machine Learning ## + +If you have problems or questions when using Watson Machine Learning, you can get help by searching for information or by asking questions through a forum\. You can also open a support ticket\. + +When using the forums to ask a question, tag your question so that it is seen by the Watson Machine Learning development teams\. + +If you have technical questions about Watson Machine Learning, post your question on [Stack Overflow ![External link icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/launch-glyph.png)](http://stackoverflow.com/search?q=machine-learning+ibm-bluemix) and tag your question with "ibm\-bluemix" and "machine\-learning"\. + +For questions about the service and getting started instructions, use the [IBM developerWorks dW Answers ![External link icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/launch-glyph.png)](https://developer.ibm.com/answers/topics/machine-learning/?smartspace=bluemix) forum\. Include the "machine\-learning" and "bluemix" tags\. + +## Contents ## + + + + * [Authorization token has not been provided](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_missing_authorization_token) + * [Invalid authorization token](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_invalid_authorization_token) + * [Authorization token and instance\_id which was used in the request are not the same](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_not_matching_authorization_token) + * [Authorization token is expired](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_expired_authorization_token) + * [Public key needed for authentication is not available](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_missing_public_key) + * [Operation timed out after \{\{timeout\}\}](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_operation_timeout) + * [Unhandled exception of type \{\{type\}\} with \{\{status\}\}](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_unhandled_exception_with_status) + * [Unhandled exception of type \{\{type\}\} with \{\{response\}\}](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_unhandled_exception_with_response) + * [Unhandled exception of type \{\{type\}\} with \{\{json\}\}](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_unhandled_exception_with_json) + * [Unhandled exception of type \{\{type\}\} with \{\{message\}\}](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_unhandled_exception_with_message) + * [Requested object could not be found](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_not_found) + * [Underlying database reported too many requests](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_too_many_cloudant_requests) + * [The definition of the evaluation is not defined neither in the artifactModelVersion nor in the deployment\. It needs to be specified \\" \+\\n \\"at least in one of the places](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_missing_evaluation_definition) + * [Data module not found in IBM Federated Learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#fl_data_module_missing) + * [Evaluation requires learning configuration specified for the model](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_missing_learning_configuration) + * [Evaluation requires spark instance to be provided in `X-Spark-Service-Instance` header](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_missing_spark_definition_for_evaluation) + * [Model does not contain any version](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_missing_latest_model_version) + * [Patch operation can only modify existing learning configuration](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_patch_non_existing_learning_configuration) + * [Patch operation expects exactly one replace operation](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_patch_multiple_ops) + * [The given payload is missing required fields: FIELD or the values of the fields are corrupted](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_invalid_request_payload) + * [Provided evaluation method: METHOD is not supported\. Supported values: VALUE](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_evaluation_method_not_supported) + * [There can be only one active evaluation per model\. Request could not be completed because of existing active evaluation: \{\{url\}\}](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_active_evaluation_conflict) + * [The deployment type \{\{type\}\} is not supported](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_not_supported_deployment_type) + * [Incorrect input: (\{\{message\}\})](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_deserialization_error) + * [Insufficient data \- metric \{\{name\}\} could not be calculated](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_missing_metric) + * [For type \{\{type\}\} spark instance must be provided in `X-Spark-Service-Instance` header](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_missing_prediction_spark_definition) + * [Action \{\{action\}\} has failed with message \{\{message\}\}](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_http_client_error) + * [Path `{{path}}` is not allowed\. Only allowed path for patch stream is `/status`](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_wrong_stream_patch_path) + * [Patch operation is not allowed for instance of type `{{$type}}`](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_patch_not_supported) + * [Data connection `{{data}}` is invalid for feedback\_data\_ref](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_invalid_feedback_data_connection) + * [Path \{\{path\}\} is not allowed\. Only allowed path for patch model is `/deployed_version/url` or `/deployed_version/href` for V2](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_patch_model_path_not_allowed) + * [Parsing failure: \{\{msg\}\}](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_parsing_error) + * [Runtime environment for selected model: \{\{env\}\} is not supported for `learning configuration`\. Supported environments: \- \[\{\{supported\_envs\}\}\]](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_runtime_env_not_supported) + * [Current plan \\'\{\{plan\}\}\\' only allows \{\{limit\}\} deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_deployments_plan_limit_reached) + * [Database connection definition is not valid (\{\{code\}\})](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_sql_error) + * [There were problems while connecting underlying \{\{system\}\}](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_stream_tcp_error) + * [Error extracting X\-Spark\-Service\-Instance header: (\{\{message\}\})](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_spark_header_deserialization_error) + * [This functionality is forbidden for non beta users](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_not_beta_user) + * [\{\{code\}\} \{\{message\}\}](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_underlying_api_error) + * [Rate limit exceeded](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_rate_limit_exceeded) + * [Invalid query parameter `{{paramName}}` value: \{\{value\}\}](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_invalid_query_parameter_value) + * [Invalid token type: \{\{type\}\}](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_invalid_token_type) + * [Invalid token format\. Bearer token format should be used](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#ts_invalid_token_format) + * [Input JSON file is missing or invalid: 400](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#os_invalid_input) + * [Authorization token has expired: 401](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#os_expired_authorization_token) + * [Unknown deployment identification:404](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#os_unkown_depid) + * [Internal server error:500](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#os_internal_error) + * [Invalid type for ml\_artifact: Pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#os_invalid_type_artifact) + * [ValueError: Training\_data\_ref name and connection cannot be None, if Pipeline Artifact is not given\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/ml_troubleshooting.html?context=cdpaas&locale=en#pipeline_error) + + + +## Authorization token has not been provided\. ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +Authorization token has not been provided in the `Authorization` header\. + +### How to fix it ### + +Pass authorization token in the `Authorization` header\. + +## Invalid authorization token\. ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +Authorization token which has been provided cannot be decoded or parsed\. + +### How to fix it ### + +Pass correct authorization token in the `Authorization` header\. + +## Authorization token and instance\_id which was used in the request are not the same\. ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +The Authorization token which has been used is not generated for the service instance against which it was used\. + +### How to fix it ### + +Pass authorization token in the `Authorization` header which corresponds to the service instance which is being used\. + +## Authorization token is expired\. ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +Authorization token is expired\. + +### How to fix it ### + +Pass not expired authorization token in the `Authorization` header\. + +## Public key needed for authentication is not available\. ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +This is internal service issue\. + +### How to fix it ### + +The issue needs to be fixed by support team\. + +## Operation timed out after \{\{timeout\}\} ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +The timeout occurred during performing requested operation\. + +### How to fix it ### + +Try to invoke desired operation again\. + +## Unhandled exception of type \{\{type\}\} with \{\{status\}\} ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +This is internal service issue\. + +### How to fix it ### + +Try to invoke desired operation again\. If it occurs more times than it needs to be fixed by support team\. + +## Unhandled exception of type \{\{type\}\} with \{\{response\}\} ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +This is internal service issue\. + +### How to fix it ### + +Try to invoke desired operation again\. If it occurs more times than it needs to be fixed by support team\. + +## Unhandled exception of type \{\{type\}\} with \{\{json\}\} ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +This is internal service issue\. + +### How to fix it ### + +Try to invoke desired operation again\. If it occurs more times than it needs to be fixed by support team\. + +## Unhandled exception of type \{\{type\}\} with \{\{message\}\} ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +This is internal service issue\. + +### How to fix it ### + +Try to invoke desired operation again\. If it occurs more times than it needs to be fixed by support team\. + +## Requested object could not be found\. ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +The request resource could not be found\. + +### How to fix it ### + +Ensure that you are referring to the existing resource\. + +## Underlying database reported too many requests\. ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +The user has sent too many requests in a given amount of time\. + +### How to fix it ### + +Try to invoke desired operation again\. + +## The definition of the evaluation is not defined neither in the artifactModelVersion nor in the deployment\. It needs to be specified \\" \+\\n \\"at least in one of the places\. ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +Learning Configuration does not contain all required information + +### How to fix it ### + +Provide `definition` in `learning configuration` + +## Evaluation requires learning configuration specified for the model\. ## + +### What's happening ### + +There is no possibility to create `learning iteration`\. + +### Why it's happening ### + +There is no `learning configuration` defined for the model\. + +### How to fix it ### + +Create `learning configuration` and try to create `learning iteration` again\. + +## Evaluation requires spark instance to be provided in `X-Spark-Service-Instance` header ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +There is no all required information in `learning configuration` + +### How to fix it ### + +Provide `spark_service` in Learning Configuration or in `X-Spark-Service-Instance` header + +## Model does not contain any version\. ## + +### What's happening ### + +There is no possibility to create neither deployment nor set learning configuration\. + +### Why it's happening ### + +There is inconsistency related to the persistence of the model\. + +### How to fix it ### + +Try to persist the model again and try perform the action again\. + +## Data module not found in IBM Federated Learning\. ## + +### What's happening ### + +The data handler for IBM Federated Learning is trying to extract a data module from the FL library but is unable to find it\. You might see the following error message: + + ModuleNotFoundError: No module named 'ibmfl.util.datasets' + +### Why it's happening ### + +Possibly an outdated DataHandler\. + +### How to fix it ### + +Please review and update your DataHandler to conform to the latest spec\. Here is the link to the most recent [MNIST data handler](https://github.com/IBMDataScience/sample-notebooks/blob/master/Files/mnist_keras_data_handler.py) or ensure your sample versions are up\-to\-date\. + +## Patch operation can only modify existing learning configuration\. ## + +### What's happening ### + +There is no possibility to invoke patch REST API method to patch learning configuration\. + +### Why it's happening ### + +There is no `learning configuration` set for this model or model does not exist\. + +### How to fix it ### + +Endure that model exists and has already learning configuration set\. + +## Patch operation expects exactly one replace operation\. ## + +### What's happening ### + +The deployment cannot be patched\. + +### Why it's happening ### + +The patch payload contains more than one operation or the patch operation is different than `replace`\. + +### How to fix it ### + +Use only one operation in the patch payload which is `replace` operation + +## The given payload is missing required fields: FIELD or the values of the fields are corrupted\. ## + +### What's happening ### + +There is no possibility to process action which is related to access to the underlying data set\. + +### Why it's happening ### + +The access to the data set is not properly defined\. + +### How to fix it ### + +Correct the access definition for the data set\. + +## Provided evaluation method: METHOD is not supported\. Supported values: VALUE\. ## + +### What's happening ### + +There is no possibility to create learning configuration\. + +### Why it's happening ### + +The wrong evaluation method was used to create learning configuration\. + +### How to fix it ### + +Use supported evaluation method which is one of: `regression`, `binary`, `multiclass`\. + +## There can be only one active evaluation per model\. Request could not be completed because of existing active evaluation: \{\{url\}\} ## + +### What's happening ### + +There is no possibility to create another learning iteration + +### Why it's happening ### + +There can be only one running evaluation for the model\. + +### How to fix it ### + +See the already running evaluation or wait till it ends and start the new one\. + +## The deployment type \{\{type\}\} is not supported\. ## + +### What's happening ### + +There is no possibility to create deployment\. + +### Why it's happening ### + +Not supported deployment type was used\. + +### How to fix it ### + +Supported deployment type should be used\. + +## Incorrect input: (\{\{message\}\}) ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +There is an issue with parsing json\. + +### How to fix it ### + +Ensure that the correct json is passed in the request\. + +## Insufficient data \- metric \{\{name\}\} could not be calculated ## + +### What's happening ### + +Learning iteration has failed + +### Why it's happening ### + +Value for metric with defined threshold could not be calculated because of insufficient feedback data + +### How to fix it ### + +Review and improve data in data source `feedback_data_ref` in `learning configuration` + +## For type \{\{type\}\} spark instance must be provided in `X-Spark-Service-Instance` header ## + +### What's happening ### + +Deployment cannot be created + +### Why it's happening ### + +`batch` and `streaming` deployments require spark instance to be provided + +### How to fix it ### + +Provide spark instance in `X-Spark-Service-Instance` header + +## Action \{\{action\}\} has failed with message \{\{message\}\} ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +There was an issue with invoking underlying service\. + +### How to fix it ### + +If there is suggestion how to fix the issue than follow it\. Contact the support team if there is no suggestion in the message or the suggestion does not solve the issue\. + +## Path `{{path}}` is not allowed\. Only allowed path for patch stream is `/status` ## + +### What's happening ### + +There is no possibility to patch the stream deployment\. + +### Why it's happening ### + +The wrong path was used to patch the `stream` deployment\. + +### How to fix it ### + +Patch the `stream` deployment with supported path option which is `/status` (it allows to start/stop stream processing\. + +## Patch operation is not allowed for instance of type `{{$type}}` ## + +### What's happening ### + +There is no possibility to patch the deployment\. + +### Why it's happening ### + +The wrong deployment type is being patched\. + +### How to fix it ### + +Patch the `stream` deployment type\. + +## Data connection `{{data}}` is invalid for feedback\_data\_ref ## + +### What's happening ### + +There is no possibility to create `learning configuration` for the model\. + +### Why it's happening ### + +Not supported data source was used when defining feedback\_data\_ref\. + +### How to fix it ### + +Use only supported data source type which is `dashdb` + +## Path \{\{path\}\} is not allowed\. Only allowed path for patch model is `/deployed_version/url` or `/deployed_version/href` for V2 ## + +### What's happening ### + +There is no option to patch model\. + +### Why it's happening ### + +The wrong path was used during patching of the model\. + +### How to fix it ### + +Patch model with supported path which allows to update the version of deployed model\. + +## Parsing failure: \{\{msg\}\} ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +The requested payload could not be parsed successfully\. + +### How to fix it ### + +Ensure that your request payload is correct and can be parsed correctly\. + +## Runtime environment for selected model: \{\{env\}\} is not supported for `learning configuration`\. Supported environments: \[\{\{supported\_envs\}\}\]\. ## + +### What's happening ### + +There is no option to create `learning configuration` + +### Why it's happening ### + +The model for which the `learning_configuration` was tried to be created is not supported\. + +### How to fix it ### + +Create `learning configuration` for model which has supported runtime\. + +## Current plan \\'\{\{plan\}\}\\' only allows \{\{limit\}\} deployments ## + +### What's happening ### + +There is no possibility to create deployment\. + +### Why it's happening ### + +The limit for number of deployments was reached for the current plan\. + +### How to fix it ### + +Upgrade to the plan which does not have such limitation\. + +## Database connection definition is not valid (\{\{code\}\}) ## + +### What's happening ### + +There is no possibility utilize the `learning configuration` functionality\. + +### Why it's happening ### + +Database connection definition is not valid\. + +### How to fix it ### + +Try to fix the issue which is described by `code` returned by underlying database\. + +## There were problems while connecting underlying \{\{system\}\} ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +There was an issue during connection to the underlying system\. It might be temporary network issue\. + +### How to fix it ### + +Try to invoke desired operation again\. If it occurs more times than contact support team\. + +### What's happening ### + +There is no possibility to invoke REST API which requires Spark credentials + +### Why it's happening ### + +There is an issue with base\-64 decoding or parsing Spark credentials\. + +### How to fix it ### + +Ensure that the correct Spark credentials were correctly base\-64 encoded\. For more information, see the documentation\. + +## This functionality is forbidden for non beta users\. ## + +### What's happening ### + +The desired REST API cannot be invoked successfully\. + +### Why it's happening ### + +REST API which was invoked is currently in beta\. + +### How to fix it ### + +If you are interested in participating, add yourself to the wait list\. The details can be found in documentation\. + +## \{\{code\}\} \{\{message\}\} ## + +### What's happening ### + +The REST API cannot be invoked successfully\. + +### Why it's happening ### + +There was an issue with invoking underlying service\. + +### How to fix it ### + +If there is suggestion how to fix the issue then follow it\. Contact the support team if there is no suggestion in the message or the suggestion does not solve the issue\. + +## Rate limit exceeded\. ## + +### What's happening ### + +Rate limit exceeded\. + +### Why it's happening ### + +Rate limit for current plan has been exceeded\. + +### How to fix it ### + +To solve this problem, acquire another plan with a greater rate limit + +## Invalid query parameter `{{paramName}}` value: \{\{value\}\} ## + +### What's happening ### + +Validation error as passed incorrect value for query parameter\. + +### Why it's happening ### + +Error in getting result for query\. + +### How to fix it ### + +Correct query parameter value\. The details can be found in documentation\. + +## Invalid token type: \{\{type\}\} ## + +### What's happening ### + +Error regarding token type\. + +### Why it's happening ### + +Error in authorization\. + +### How to fix it ### + +Token should be started with `Bearer` prefix + +## Invalid token format\. Bearer token format should be used\. ## + +### What's happening ### + +Error regarding token format\. + +### Why it's happening ### + +Error in authorization\. + +### How to fix it ### + +Token should be bearer token and should start with `Bearer` prefix + +## Input JSON file is missing or invalid: 400 ## + +### What's happening ### + +The following message displays when you try to score online: **Input JSON file is missing or invalid**\. + +### Why it's happening ### + +This message displays when the scoring input payload doesn't match the expected input type that is required for scoring the model\. Specifically, the following reasons may apply: + + + + * The input payload is empty\. + * The input payload schema is not valid\. + * The input datatypes does not match the expected datatypes\. + + + +### How to fix it ### + +Correct the input payload\. Make sure that the payload has correct syntax, a valid schema, and proper data types\. After you make corrections, try to score online again\. For syntax issues, verify the JSON file by using the `jsonlint` command\. + +## Authorization token has expired: 401 ## + +### What's happening ### + +The following message displays when you try to score online: **Authorization failed**\. + +### Why it's happening ### + +This message displays when the token that is used for scoring has expired\. + +### How to fix it ### + +Re\-generate the token for this IBM Watson Machine Learning instance and then retry\. If you still see this issue contact IBM Support\. + +## Unknown deployment identification:404 ## + +### What's happening ### + +The following message displays when you try to score online **Unknown deployment identification**\. + +### Why it's happening ### + +This message displays when the deployment ID that is used for scoring does not exists\. + +### How to fix it ### + +Make sure you are providing the correct deployment ID\. If not, deploy the model with the deployment ID and then try scoring it again\. + +## Internal server error:500 ## + +### What's happening ### + +The following message displays when you try to score online: **Internal server error** + +### Why it's happening ### + +This message displays if the downstream data flow on which the online scoring depends fails\. + +### How to fix it ### + +After waiting for a period of time, try to score online again\. If it fails again then contact IBM Support\. + +## Invalid type for ml\_artifact: Pipeline ## + +### What's happening ### + +The following message displays when you try to publish Spark model using Common API client library on your workstation\. + +### Why it's happening ### + +This message displays if you have invalid pyspark setup in operating system\. + +### How to fix it ### + +Set up system environment paths according to the instruction: + + SPARK_HOME={installed_spark_path} + JAVA_HOME={installed_java_path} + PYTHONPATH=$SPARK_HOME/python/ + +## ValueError: Training\_data\_ref name and connection cannot be None, if Pipeline Artifact is not given\. ## + +### What's happening ### + +The training data set is missing or has not been properly referenced\. + +### Why it's happening ### + +The Pipeline Artifact is a training data set in this instance\. + +### How to fix it ### + +When persisting a Spark PipelineModel you MUST supply a training data set, if you don't the client says it doesn't support PipelineModels, rather than saying a PipelineModel must be accompanied by the training set\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/44ba508199b214448cb22b7658127e16dd4e7abf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/44ba508199b214448cb22b7658127e16dd4e7abf.md new file mode 100644 index 0000000..3be460e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/44ba508199b214448cb22b7658127e16dd4e7abf.md @@ -0,0 +1,257 @@ +# Connecting to data behind a firewall + +# Connecting to data behind a firewall # + +To connect to a database that is not accessible via the internet (for example, behind a firewall), you must set up a secure communication path between your on\-premises data source and IBM Cloud\. Use a Satellite Connector, a Satellite location, or a Secure Gateway instance for the secure communication path\. + + + + * [Set up a Satellite Connector](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html?context=cdpaas&locale=en#satctr): Satellite Connector is the replacement for Secure Gateway\. Satellite Connector uses a lightweight Docker\-based communication that creates secure and auditable communications from your on\-prem, cloud, or Edge environment back to IBM Cloud\. Your infrastructure needs only a container host, such as Docker\. For more information, see [Satellite Connector overview](https://cloud.ibm.com/docs/satellite?topic=satellite-understand-connectors&interface=ui)\. + + + + + + * [Set up a Satellite location](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html?context=cdpaas&locale=en#sl): A Satellite location provides the same secure communications to IBM Cloud as a Satellite Connector but adds high availability access by default plus the ability to communicate from IBM Cloud to your on\-prem location\. It supports managed cloud services on on\-premises, such as Managed OpenShift and Managed Databases, supported remotely by IBM Cloud PaaS SRE resources\. A Satellite location requires at least three x86 hosts in your infrastructure for the HA control plane\. A Satellite location is a superset of the capabilities of the Satellite Connector\. If you need only client data communication, set up a Satellite Connector\. + + + + + + * [Configure a Secure Gateway](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html?context=cdpaas&locale=en#gateway): Secure Gateway is IBM Cloud's former solution for communication between on\-prem or third\-party cloud environments\. Secure Gateway is now [deprecated by IBM Cloud](https://cloud.ibm.com/docs/SecureGateway?topic=SecureGateway-dep-overview)\. For a new connection, set up a Satellite Connector instead\. + + + +## Set up a Satellite Connector ## + +To set up a Satellite Connector, you create the Connector in your IBM Cloud account\. Next, you configure agents to run in your local Docker host platform on\-premises\. Finally, you create the endpoints for your data source that IBM watsonx uses to access the data source from IBM Cloud\. + +### Requirements for a Satellite Connector ### + +**Required permissions** : You must have Administrator access to the Satellite service in IAM access policies to do the steps in IBM Cloud\. + +**Required host systems** : Minimum one x86 Docker host in your own infrastructure to run the Connector container\. See [Minimum requirements](https://cloud.ibm.com/docs/satellite?topic=satellite-understand-connectors&interface=ui#min-requirements)\. + +### Setting up a Satellite Connector ### + +Note: Not all connections support Satellite\. If the connection supports Satellite, the **IBM Cloud Satellite** tile will be available in the **Private Connectivity** section of the **Create connection** form\. Alternatively, you can filter all the connections that support **Satellite** in the **New connection** page\. + + + +1. Access the **Create connector** page in IBM Cloud from one of these places: + + + + * Log in to the [Connectors](https://cloud.ibm.com/satellite/connectors) page in IBM Cloud. + * In IBM watsonx: + + + + 1. Go to the project page. Click the **Assets** tab. + 2. Click **New asset > Connect to a data source**. + 3. Select the IBM watsonx connector. + 4. In the **Create connection** page, scroll down to the **Private connectivity** section, and click the **IBM Cloud Satellite** tile. + 5. Click **Configure Satellite** and then log in to IBM Cloud. + 6. Click **Create connector**. + + + + + +2. Follow the steps for [Creating a Connector](https://cloud.ibm.com/docs/satellite?topic=satellite-create-connector)\. +3. Set up the Connector agent containers in your local Docker host environment\. For high availability, use three agents per connector that are deployed on separate Docker hosts\. It is best to use a separate infrastructure and network connectivity for each agent\. Follow the steps for [Running a Connector agent](https://cloud.ibm.com/docs/satellite?topic=satellite-run-agent-locally)\. + The agents will appear in the **Active Agents** list for the connector. +4. In IBM watsonx, go back to the **Create connection** page\. In the **Private connectivity** section, click **Reload**, and then select the Satellite Connector that you created\. + + + +In the [Satellite Connectors dashboard](https://cloud.ibm.com/satellite/connectors) in IBM Cloud, for each connection that you create, a user endpoint is added in the Satellite Connector\. + +## Set up a Satellite location ## + +Use the Satellite location feature of IBM Cloud Satellite to securely connect to a Satellite location that you configure for your IBM Cloud account\. + +### Requirements for a Satellite location ### + +**Required permissions** : You must be the Admin in the IBM Cloud account to do the tasks in IBM Cloud\. + +**Required host systems** : You need at least three computers or virtual machines in your own infrastructure to act as Satellite hosts\. Confirm the [host system requirements](https://cloud.ibm.com/docs/satellite?topic=satellite-host-reqs)\. (The IBM Cloud docs instructions for additional features such as Red Hat OpenShift clusters and Kubernetes are not required for a connection in IBM watsonx\.) + +Note: Not all connections support Satellite\. If the connection supports Satellite, the **IBM Cloud Satellite** tile will be available in the **Private Connectivity** section of the **Create connection** form\. Alternatively, you can filter all the connections that support **Satellite** in the **New connection** page\. + +### Setting up a Satellite location ### + +Configure the Satellite location in IBM Cloud\. + + + + * [Task 1: Create a Satellite location](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html?context=cdpaas&locale=en#task1) + * [Task 2: Attach the hosts to the Satellite location](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html?context=cdpaas&locale=en#task2) + * [Task 3: Assign the hosts to the control plane](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html?context=cdpaas&locale=en#task3) + * [Task 4: Create the connection secured with a Satellite location](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html?context=cdpaas&locale=en#task4) + * [Maintaining the Satellite location](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html?context=cdpaas&locale=en#maintain) + + + +### Task 1: Create a Satellite location ### + +A Satellite location is a representation of an environment in your infrastructure provider, such as an on\-prem data center or cloud\. To connect to data sources in IBM watsonx, you need three computers or virtual machines\. To create the Satellite location: + + + +1. Access the **Create a Satellite location** setup page in IBM Cloud from one of these places: + + + + * Log in to [IBM Cloud](https://cloud.ibm.com/satellite/overview), and select **Create location**. + * In IBM watsonx: + + + + 1. Go to the project page. Click the **Assets** tab. + 2. Click **New asset > Connect to a data source**. + 3. Select the connector. + 4. In the **Create connection** page, scroll down to the **Private connectivity** section, and click the **IBM Cloud Satellite** tile. + 5. Click **Configure Satellite** and then log in to IBM Cloud. + 6. Click **Create location**. + + These instructions follow the **On-premises & edge** template. Depending on your infrastructure, you can select a different template. Refer to the template instructions and the information at [Understanding Satellite location and hosts](https://cloud.ibm.com/docs/satellite?topic=satellite-location-host) in the IBM Cloud docs. + + + + + +2. Click **Edit** to modify the Satellite location information: + + + + * **Name**: You can use this field to differentiate between different networks such as `my US East network` or my `Japan network`. + * The **Tags** and **Description** fields are optional. + * **Managed from**: Select the IBM Cloud region that is closest to where your host machines physically reside. + * **Resource group**: is set to `default` by default. + * **Zones**: IBM automatically spreads the control plane instances across three zones within the same IBM Cloud multizone metro. For example, if you manage your location from the **wdc** metro in the US East region, your Satellite location control plane instances are spread across the us-east-1, us-east-2, and us-east-3 zones. This zonal spread ensures that your control plane is available, even if one zone becomes unavailable. + * **Red Hat CoreOS**: Do not select this option. Leave it cleared or as **No**. + * **Object storage**: Click **Edit** to enter the exact name of an existing IBM Cloud Object Storage bucket that you want to use to back up Satellite location control plane data. Otherwise, a new bucket is automatically created in an Object Storage instance in your account. + + + +3. Review your order details, and then click **Create location**\. + + A location control plane is deployed to one of the zones that are located in the IBM Cloud region that you selected. The control plane is ready for you to attach hosts to it. + + + +### Task 2: Attach the hosts to the Satellite location ### + +Attach three hosts that conform to the [host requirements](https://cloud.ibm.com/docs/satellite?topic=satellite-host-reqs) to the Satellite location\. + +#### Important considerations for Satellite location hosts #### + + + + * Satellite hosts are dedicated servers and cannot be shared with other applications\. You cannot log in to a host with SSH\. The root password will be changed\. + * You need only three hosts for IBM watsonx connections\. + * Worker nodes are not required\. Only control plane hosts are needed for IBM watsonx connections\. + * The Red Hat OpenShift Container Platform (OCP) is not needed for IBM watsonx connections\. + * Container Linux CoreOS Linux is not needed for IBM watsonx connections\. + * Hosts connect to IBM Cloud with the TLS 1\.3 protocol\. + + + +To attach the hosts to the Satellite location: + + + +1. From the [Satellite Locations dashboard](https://cloud.ibm.com/satellite/locations), click the name of your location\. +2. Click **Attach Hosts** to generate and download a script\. +3. Run the script on all the hosts to be attached to the Satellite location\. +4. Save the attach script in case you attach more hosts to the location in the future\. The token in the attach script is an API key, which must be treated and protected as sensitive information\. See [Maintaining the Satellite location](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html?context=cdpaas&locale=en#maintain)\. + + + +### Task 3: Assign the hosts to the control plane ### + +To assign the hosts: + + + +1. From the [Satellite Locations dashboard](https://cloud.ibm.com/satellite/locations), click the name of your location\. +2. For each host, click the overflow menu (![Overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/actions.png)) and then select **Assign**\. Assign one host to each zone\. + + + +### Task 4: Create the connection secured with a Satellite location ### + +To create the secure connection: + + + +1. In IBM watsonx, go to the project page\. Click the **Assets** tab\. +2. Click **New asset > Connect to a data source**\. +3. Select the connector\. +4. In the **Create connection** form, complete the connection details\. The hostname or IP address and the port of the data source must be available from each host that is attached to the Satellite location\. +5. Click **Reload**, and then select the Satellite location that you created\. + + + +In the [Satellite Locations dashboard](https://cloud.ibm.com/satellite/locations) in IBM Cloud, for each connection that you create, a link endpoint is created with **Destination type**`Location`, and **Created by**`Connectivity` in the Satellite location\. + +### Maintaining the Satellite location ### + + + + * The host attach script expires one year from the creation date\. To make sure that the hosts don't have authentication problems, download a new copy of the host attach script at least once per year\. + * Save the attach script in case you attach more hosts to the location in the future\. If you generate a new host attach script, it detaches all the existing hosts\. + * Hosts can be reclaimed by detaching them from the Satellite location and reloading the operating system in the infrastructure provider\. + + + +## Configure a Secure Gateway ## + +The IBM Cloud Secure Gateway service provides a remote client to create a secure connection to a database that is not externalized to the internet\. You can provision a Secure Gateway service in one service region and use it in service instances that you provisioned in other regions\. After you create an instance of the Secure Gateway service, you add a Secure Gateway\. + +Important: Secure Gateway is deprecated by IBM Cloud\. For information see [Secure Gateway deprecation overview and timeline](https://cloud.ibm.com/docs/SecureGateway?topic=SecureGateway-dep-overview#q082720___AMQ_SSL_ALLOW_DEFAULT_CERT__title__1)\. + +### Prerequisite ### + +When you log in to IBM watsonx, select **Enable Cloud Foundry access**\. + +Note: Not all connections support Secure Gateway\. If the connection supports Secure Gateway, the **IBM Cloud Secure Gateway** tile will be available in the **Private Connectivity** section of the **Create connection** form\. Alternatively, you can filter all the connections that support **Secure Gateway** in the **New connection** page\. + +To configure a secure gateway: + + + +1. Configure a secure gateway from the **Create connection** screen: + + + + 1. Click the **IBM Cloud Secure Gateway** tile. + 2. Click **New Secure Gateway** and then **Create Secure Gateway**. + Otherwise, from the main menu in IBM watsonx, choose **Administration > Services > Services catalog** and then select **Secure Gateway**. + + + +2. Select a service plan and click **Create**\. +3. On the **Services instances** page, find the Secure Gateway service and click its name\. +4. Follow the instructions to add a gateway [Adding a gateway](https://cloud.ibm.com/docs/SecureGateway?topic=SecureGateway-add-sg-gw)\. To maintain security for the connection, make sure that you configure the Secure Gateway to require a security token\. Make sure you copy your Gateway ID and security token\. +5. From within your new gateway, on the **Clients** tab, click **Connect Client** to open the **Connect Client** pane\. +6. Select the client download for your operating system\. +7. Follow the instructions for [installing the Client](https://cloud.ibm.com/docs/SecureGateway?topic=SecureGateway-client-install)\. +8. Depending on the resource authentication protocol that you specify, you might need to upload a certificate\. A destination is created when the connection is first established\. +9. In IBM watsonx, go to the project page\. Click the **Assets** tab\. In the **Private connectivity** section, click **Reload**, and then select the secure gateway that you created\. + + + +## Learn more ## + + + + * [Getting started with IBM Cloud Satellite](https://cloud.ibm.com/docs/satellite?topic=satellite-getting-started) + * [Secure Gateway deprecation](https://cloud.ibm.com/docs/SecureGateway) + + + +**Parent topic**: [Adding data to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/450caaacd51abdedab940cafb4bc47ebfbcbba67.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/450caaacd51abdedab940cafb4bc47ebfbcbba67.md new file mode 100644 index 0000000..630e23c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/450caaacd51abdedab940cafb4bc47ebfbcbba67.md @@ -0,0 +1,7 @@ +# Data metadata (SPSS Modeler) + +# Data metadata # + +This section describes how to set up the data model attributes based on `pyspark.sql.StructField`\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/451244d4e0cd8a3e96cd15ffaf0f3bda526cced2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/451244d4e0cd8a3e96cd15ffaf0f3bda526cced2.md new file mode 100644 index 0000000..ed39515 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/451244d4e0cd8a3e96cd15ffaf0f3bda526cced2.md @@ -0,0 +1,75 @@ +# Creating deployment spaces + +# Creating deployment spaces # + +Create a deployment space to store your assets, deploy assets, and manage your deployments\. + +**Required permissions:** +All users in your IBM Cloud account with the Editor IAM platform access role for all IAM enabled services or for Cloud Pak for Data can manage to create deployment spaces\. For more information, see [IAM Platform access roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/roles.html#platform)\. + +A deployment space is not associated with a project\. You can publish assets from multiple projects to a space\. For example, you might have a test space for evaluating deployments, and a production space for deployments you want to deploy in business applications\. + +Follow these steps to create a deployment space: + + + +1. From the navigation menu, select **Deployments** > **New deployment space**\. Enter a name for your deployment space\. +2. Optional: Add a description and tags\. + +3. Select a storage service to store your space assets\. + + + + * If you have a [Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/storage-options.html) repository that is associated with your IBM Cloud account, choose a repository from the list to store your space assets. + * If you do not have a [Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/storage-options.html) repository that is associated with your IBM Cloud account, you are prompted to create one. + + + +4. Optional: If you want to deploy assets from your space, select a machine learning service instance to associate with your deployment space\. + To associate a machine learning instance to a space, you must: + + + + * Be a space administrator. + * Have admin access to the machine learning service instance that you want to associate with the space. For more information, see [Creating a Watson Machine Learning service instance](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-service-instance.html). Tip: If you want to evaluate assets in the space, switch to the **Manage** tab and associate a Watson OpenScale instance. + + + +5. Optional: Assign the space to a deployment stage\. Deployment stages are used for [MLOps](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/modelops-overview.html), to manage access for assets in various stages of the AI lifecycle\. They are also used in [governance](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-overview.html), for tracking assets\. Choose from: + + + + * **Development** for assets under development. Assets that are tracked for governance are displayed in the *Develop* stage of their associated use case. + * **Testing** for assets that are being validated. Assets that are tracked for governance are displayed in the *Validate* stage of their associated use case. + * **Production** for assets in production. Assets that are tracked for governance are displayed in the *Operate* stage of their associated use case. + + + +6. Optional: Upload space assets, such as [exported project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/export-project.html) or [exported space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-export.html)\. If the imported space is encrypted, you must enter the password\. + + Tip: If you get an import error, clear your browser cookies and then try again. +7. Click **Create**\. + + + +## Viewing and managing deployment spaces ## + + + + * To view all deployment spaces that you can access, click **Deployments** on the navigation menu\. + * To view any of the details about the space after you create it, such as the associated service instance or storage ID, open your deployment space and then click the **Manage** tab\. + * Your space assets are stored in a Cloud Object Storage repository\. You can access this repository from IBM Cloud\. To find the bucket ID, open your deployment space, and click the **Manage** tab\. + + + +## Learn more ## + +To learn more about adding assets to a space and managing them, see [Assets in deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets-all.html)\. + +To learn more about creating a space and accessing its details programmatically, see [Notebook on managing spaces](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/e5e78be14e2260ccb4bcf8181d0967e3)\. + +To learn more about handling spaces programmatically, see [Python client](https://ibm.github.io/watson-machine-learning-sdk/) or [REST API](https://cloud.ibm.com/apidocs/machine-learning)\. + +**Parent topic:**[Deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4517071b8cdd91311a13decdd9d0a7fd761aa616.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4517071b8cdd91311a13decdd9d0a7fd761aa616.md new file mode 100644 index 0000000..9a844c5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4517071b8cdd91311a13decdd9d0a7fd761aa616.md @@ -0,0 +1,88 @@ +# IBM Planning Analytics connection + +# IBM Planning Analytics connection # + +To access your data in Planning Analytics, create a connection asset for it\. + +Planning Analytics (formerly known as "TM1") is an enterprise performance management database that stores data in in\-memory multidimensional OLAP cubes\. + +## Supported versions ## + +IBM Planning Analytics, version 2\.0\.5 or later + +## Create a connection to Planning Analytics ## + +To create the connection asset, you need these connection details: + + + + * TM1 server API root URL + * Authentication type (Basic or CAM Credentials) + * Username and password + * SSL certificate (if required by the database server) + + + +For authentication setup information, see [Authenticating and managing sessions](https://www.ibm.com/docs/SSD29G_2.0.0/com.ibm.swg.ba.cognos.tm1_rest_api.2.0.0.doc/dg_tm1_odata_auth.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Planning Analytics connections in the following workspaces and tools: + + + + * Data Refinery + * Decision Optimization experiments + * Notebooks\. Click **Read data** on the **Code snippets** pane to get the connection credentials and load the data into a data structure\. See [Load data from data source connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html#conns)\. + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Planning Analytics setup ## + +Enable TM1 REST APIs on the TM1 Server\. See TMI REST API [Installation and configuration](https://www.ibm.com/docs/SSD29G_2.0.0/com.ibm.swg.ba.cognos.tm1_rest_api.2.0.0.doc/dg_tm1_odata_install.html)\. + +## Cube dimension order ## + +**Versions earlier than TM1 11\.4** +For best performance, do not combine string and numeric data in a single cube\. However, if the cube does include both string and numeric data, the string elements must be in the last dimension when the cube is created\. Reordering dimensions later is ignored\. + +**Version TM1 11\.4 or later** +The default setting in Planning Analytics for cube creation is `current`\. This setting might cause errors or unexpected results when you use the Planning Analytics connection\. Instead, set the interaction property `use_creation_order` value to `true`\. + +## Restriction ## + +For Data Refinery, you can use this connection only as a source\. You cannot use this connection as a target connection or as a target connected data asset\. + +## Learn more ## + +[Planning Analytics product documentation](https://www.ibm.com/docs/planning-analytics/2.0.0) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4562c632e1cfaaedde1374b29bdd1a1cce5ece86.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4562c632e1cfaaedde1374b29bdd1a1cce5ece86.md new file mode 100644 index 0000000..7c78059 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4562c632e1cfaaedde1374b29bdd1a1cce5ece86.md @@ -0,0 +1,80 @@ +# Deployment space collaborator roles and permissions + +# Deployment space collaborator roles and permissions # + +When you add collaborators to a deployment space, you can specify which actions they can do by assigning them access levels\. Learn how to add collaborators to your deployment spaces and the differences between access levels\. + +## User roles and permissions in deployment spaces ## + +You can assign the following roles to collaborators based on the access level that you want to provide: + + + + * **Admin**: Administrators can control your deployment space assets, users, and settings\. + * **Editor**: Editors can control your space assets\. + * **Viewer**: Viewers can view your deployment space\. + + + +The following table provides details on permissions based on user access level: + + + +Deployment space permissions + +| Enabled permission | Viewer | Editor | Admin | +| --------------------------- | ------ | ------ | ----- | +| View assets and deployments | ✓ | ✓ | ✓ | +| Comment | ✓ | ✓ | ✓ | +| Monitor | ✓ | ✓ | ✓ | +| Test model deployment API | ✓ | ✓ | ✓ | +| Find implementation details | ✓ | ✓ | ✓ | +| Configure deployments | | ✓ | ✓ | +| Batch deployment score | | ✓ | ✓ | +| Online deployment score | ✓ | ✓ | ✓ | +| Update assets | | ✓ | ✓ | +| Import assets | | ✓ | ✓ | +| Download assets | | ✓ | ✓ | +| Deploy assets | | ✓ | ✓ | +| Remove assets | | ✓ | ✓ | +| Remove deployments | | ✓ | ✓ | +| View spaces/members | ✓ | ✓ | ✓ | +| Delete space | | | ✓ | + + + +### Service IDs ### + +You can create service IDs in IBM Cloud to enable an application outside of IBM Cloud access to your IBM Cloud services\. Service IDs are not tied to a specific user\. Therefore, if a user leaves an organization and is deleted from the account, the service ID remains\. Thus, your application or service stays up and running\. For more information, see [Creating and working with service IDs](https://cloud.ibm.com/docs/account?topic=account-serviceids)\. + +To learn more about assigning space access by using a service ID, see [Adding collaborators to your deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/collaborator-permissions-wml.html?context=cdpaas&locale=en#adding-collaborators)\. + +## Adding collaborators to your deployment space ## + +**Prerequisites:** +All users in your IBM Cloud account with the **Admin** IAM platform access role for all IAM enabled services can manage space collaborators\. For more information, see [IAM Platform access roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/roles.html#platform)\. + +**Restriction:** +You can add collaborators to your deployment space only if they are a part of your organization and if they provisioned Watson Studio\. + +To add one or more collaborators to a deployment space: + + + +1. From your deployment space, go to the **Manage** tab and click **Access Control**\. +2. Click **Add collaborators** and choose one of the following options: + + + + * If you want to add a user, click **Add users**. Assign a role that applies to the user. + * If you want to add pre-defined user groups, click . Assign a role that applies to all members of the group. + + + +3. Add the user or user groups that you want to have the same access level and click **Add**\. + + + +**Parent topic:**[Deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/456a228a64c2ad85e66f1fe0de558b4a426b197c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/456a228a64c2ad85e66f1fe0de558b4a426b197c.md new file mode 100644 index 0000000..61bf8ec --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/456a228a64c2ad85e66f1fe0de558b4a426b197c.md @@ -0,0 +1,82 @@ +# IBM Db2 Big SQL connection + +# IBM Db2 Big SQL connection # + +To access your data in IBM Db2 Big SQL, create a connection asset for it\. + +IBM Db2 Big SQL is a high performance massively parallel processing (MPP) SQL engine for Hadoop that makes querying enterprise data from across the organization an easy and secure experience\. + +## Supported versions ## + +Db2 Big SQL for Version 4\.1\+ + +## Create a connection to IBM Db2 Big SQL ## + +To create the connection asset, you need these connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Username and password + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use IBM Db2 Big SQL connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## IBM Db2 Big SQL setup ## + +[Installing IBM Db2 Big SQL](https://www.ibm.com/docs/SSCRJT_5.0.3/com.ibm.swg.im.bigsql.doc/doc/hdp_bigsql_versions.html) + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [ IBM Db2 Big SQL documentation](https://www.ibm.com/docs/SSCRJT_5.0.4/com.ibm.swg.im.bigsql.doc/doc/bi_sql_access.html) for the correct syntax\. + +## Learn more ## + +[Db2 Big SQL documentation](https://www.ibm.com/docs/en/db2-big-sql/5.0.3) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/45a1c384d8d6a730d73357e2bb3216edbd2f7ff2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/45a1c384d8d6a730d73357e2bb3216edbd2f7ff2.md new file mode 100644 index 0000000..e4fe407 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/45a1c384d8d6a730d73357e2bb3216edbd2f7ff2.md @@ -0,0 +1,204 @@ +# Writing deployable Python functions + +# Writing deployable Python functions # + +Learn how to write a Python function and then store it as an asset that allows for deploying models\. + +For a list of general requirements for deployable functions refer to [General requirements for deployable functions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function-write.html?context=cdpaas&locale=en#reqs)\. For information on what happens during a function deployment, refer to [Function deployment process](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function-write.html?context=cdpaas&locale=en#fundepro) + +## General requirements for deployable functions ## + +To be deployed successfully, a function must meet these requirements: + + + + * The Python function file on import must have the `score` function object as part of its scope\. Refer to [Score function requirements](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function-write.html?context=cdpaas&locale=en#score) + * Scoring input payload must meet the requirements that are listed in [Scoring input requirements](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function-write.html?context=cdpaas&locale=en#scoinreq) + * The output payload expected as output of `score` must include the schema of the `score_response` variable for status code 200\. Note that the `prediction` parameter, with an array of JSON objects as its value, is mandatory in the `score` output\. + * When you use the Python client to save a Python function that contains a reference to an outer function, only the code in the scope of the outer function (including its nested functions) is saved\. Therefore, the code outside the outer function's scope will not be saved and thus will not be available when you deploy the function\. + + + +### Score function requirements ### + + + + * Two ways to add the `score` function object exist: + + + + * explicitly, by user + * implicitly, by the method that is used to save the Python function as an asset in the Watson Machine Learning repository + + + + * The `score` function must accept a single, JSON input parameter\. + * The `score` function must return a JSON\-serializable object (for example: dictionaries or lists) + + + +### Scoring input requirements ### + + + + * The scoring input payload must include an array with the name `values`, as shown in this example schema\. + + {"input_data": [!{ + "values": "Hello world"]] + }] + } + + Note: + - The `input_data` parameter is mandatory in the payload. + - The `input_data` parameter can also include additional name-value pairs. + * The scoring input payload must be passed as input parameter value for `score`\. This way you can ensure that the value of the `score` input parameter is handled accordingly inside the `score`\. + * The scoring input payload must match the input requirements for the concerned Python function\. + * The scoring input payload must include an array that matches the [Example input data schema](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function-write.html?context=cdpaas&locale=en#exschema)\. + + + +#### Example input data schema #### + + {"input_data": [!{ + "values": "Hello world"]] + }] + } + +### Example Python code ### + + #wml_python_function + def my_deployable_function(): + + def score( payload ): + + message_from_input_payload = payload.get("input_data")[0].get("values")[0] + response_message = "Received message - {0}".format(message_from_input_payload) + + # Score using the pre-defined model + score_response = { + 'predictions': [{'fields': 'Response_message_field'], + 'values': response_message]] + }] + } + return score_response + + return score + + score = my_deployable_function() + +You can test your function like this: + + input_data = { "input_data": [{ "fields": "message" ]!, + "values": "Hello world" ]] + } + ] + } + function_result = score( input_data ) + print( function_result ) + +It returns the message "Hello world\!"\. + +## Function deployment process ## + +The Python code of your Function asset gets loaded as a Python module by the Watson Machine Learning engine by using an `import` statement\. This means that the code will be executed exactly once (when the function is deployed or each time when the corresponding pod gets restarted)\. The `score` function that is defined by the Function asset is then called in every prediction request\. + +## Handling deployable functions ## + +Use one of these methods to create a deployable Python function: + + + + * [Creating deployable functions through REST API](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function-write.html?context=cdpaas&locale=en#rest) + * [Creating deployable functions through the Python client](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function-write.html?context=cdpaas&locale=en#py) + + + +### Creating deployable functions through REST API ### + +For REST APIs, because the Python function is uploaded directly through a file, the file must already contain the `score` function\. Any one time import that needs to be done to be used later within the `score` function can be done within the global scope of the file\. When this file is deployed as a Python function, the one\-time imports available in the global scope get executed during the deployment and later simply reused with every prediction request\. + +Important:The function archive must be a `.gz` file\. + +Sample `score` function file: + + Score function.py + --------------------- + def score(input_data): + return {'predictions': [{'values': 'Just a test']]}]} + +Sample `score` function with one time imports: + + import subprocess + subprocess.check_output('pip install gensim --user', shell=True) + import gensim + + def score(input_data): + return {'predictions': [{'fields': 'gensim_version'], 'values': gensim.__version__]]}]} + +### Creating deployable functions through the Python client ### + +To persist a Python function as an asset, the Python client uses the `wml_client.repository.store_function` method\. You can do that in two ways: + + + + * [Persisting a function through a file that contains the Python function](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function-write.html?context=cdpaas&locale=en#persfufile) + * [Persisting a function through the function object](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function-write.html?context=cdpaas&locale=en#persfunob) + + + +#### Persisting a function through a file that contains the Python function #### + +This method is the same as persisting the Python function file through REST APIs (`score` must be defined in the scope of the Python source file)\. For details, refer to [Creating deployable functions through REST API](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function-write.html?context=cdpaas&locale=en#rest)\. + +Important:When you are calling the `wml_client.repository.store_function` method, pass the file name as the first argument\. + +#### Persisting a function through the function object #### + +You can persist Python function objects by creating Python Closures with a nested function named `score`\. The `score` function is returned by the outer function that is being stored as a function object, when called\. This `score` function must meet the requirements that are listed in [General requirements for deployable functions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function-write.html?context=cdpaas&locale=en#reqs)\. In this case, any one time imports and initial setup logic must be added in the outer nested function so that they get executed during deployment and get used within the `score` function\. Any recurring logic that is needed during the `prediction` request must be added within the nested `score` function\. + +Sample Python function save by using the Python client: + + def my_deployable_function(): + + import subprocess + subprocess.check_output('pip install gensim', shell=True) + import gensim + + def score(input_data): + import + message_from_input_payload = payload.get("input_data")[0].get("values")[0] + response_message = "Received message - {0}".format(message_from_input_payload) + + # Score using the pre-defined model + score_response = { + 'predictions': [{'fields': 'Response_message_field', 'installed_lib_version'], + 'values': response_message, gensim.__version__]] + }] + } + return score_response + + return score + + function_meta = { + client.repository.FunctionMetaNames.NAME:"test_function", + client.repository.FunctionMetaNames.SOFTWARE_SPEC_ID: sw_spec_id + } + func_details = client.repository.store_function(my_deployable_function, function_meta) + +In this scenario, the Python function takes up the job of creating a Python file taht contains the `score` function and persisting the function file as an asset in the Watson Machine Learning repository: + + score = my_deployable_function() + +## Learn more ## + + + + * [Python Closures](https://www.programiz.com/python-programming/closure) + * [Closures](https://www.learnpython.org/en/Closures) + * [Nested function, Scope of variable & closures in Python](https://www.codesdope.com/blog/article/nested-function-scope-of-variable-closures-in-pyth/) + + + +**Parent topic:**[Deploying Python functions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/461d1a8f855174f44550531ef8be6e67c29d3e3b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/461d1a8f855174f44550531ef8be6e67c29d3e3b.md new file mode 100644 index 0000000..9f3fcca --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/461d1a8f855174f44550531ef8be6e67c29d3e3b.md @@ -0,0 +1,19 @@ +# CARMA node (SPSS Modeler) + +# CARMA node # + +The CARMA node uses an association rules discovery algorithm to discover association rules in the data\. + +Association rules are statements in the form: + + if antecedent(s) then consequent(s) + +For example, if a Web customer purchases a wireless card and a high\-end wireless router, the customer is also likely to purchase a wireless music server if offered\. The CARMA model extracts a set of rules from the data without requiring you to specify input or target fields\. This means that the rules generated can be used for a wider variety of applications\. For example, you can use rules generated by this node to find a list of products or services (antecedents) whose consequent is the item that you want to promote this holiday season\. Using watsonx\.ai, you can determine which clients have purchased the antecedent products and construct a marketing campaign designed to promote the consequent product\. + +Requirements\. In contrast to Apriori, the CARMA node does not require Input or Target fields\. This is integral to the way the algorithm works and is equivalent to building an Apriori model with all fields set to Both\. You can constrain which items are listed only as antecedents or consequents by filtering the model after it is built\. For example, you can use the model browser to find a list of products or services (antecedents) whose consequent is the item that you want to promote this holiday season\. + +To create a CARMA rule set, you need to specify an ID field and one or more content fields\. The ID field can have any role or measurement level\. Fields with the role None are ignored\. Field types must be fully instantiated before executing the node\. Like Apriori, data may be in tabular or transactional format\. + +Strengths\. The CARMA node is based on the CARMA association rules algorithm\. In contrast to Apriori, the CARMA node offers build settings for rule support (support for both antecedent and consequent) rather than antecedent support\. CARMA also allows rules with multiple consequents\. Like Apriori, models generated by a CARMA node can be inserted into a data stream to create predictions\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/462a5ba596aadf9c38762611ca2578398f234bd4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/462a5ba596aadf9c38762611ca2578398f234bd4.md new file mode 100644 index 0000000..63d94f5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/462a5ba596aadf9c38762611ca2578398f234bd4.md @@ -0,0 +1,197 @@ +# Updating a deployment + +# Updating a deployment # + +After you create an online or a batch deployment, you can still update your deployment details and update the assets that are associated with your deployment\. + +For more information, see: + + + + * [Update deployment details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-update.html?context=cdpaas&locale=en#upd-general) + * [Update assets associated with a deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-update.html?context=cdpaas&locale=en#upd-assets) + + + +## Updating deployment details ## + +You can update general deployment details, such as deployment name, description, metadata, and tags by using one of these methods: + + + + * [Update deployment details from the UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-update.html?context=cdpaas&locale=en#update-details-ui)\. + * [Update deployment details by using the Patch API command](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-update.html?context=cdpaas&locale=en#update-details-api)\. + + + +### Updating deployment details from the UI ### + + + +1. From the **Deployments** tab of your deployment space, click the action menu for the deployment and choose **Edit settings**\. +2. Update the details and then click **Save**\. + + Tip: You can also update a deployment from the information sheet for the deployment. + + + +### Updating deployment details by using the Patch API command ### + +Use the [Watson Machine Learning API Patch](https://cloud.ibm.com/apidocs/machine-learning-cp#models-update) command to update deployment details\. + + curl -X PATCH '/ml/v4/deployments/?space_id=&version=' \n--data-raw '[ + { + "op": "", + "path": "", + "value": "" + }, + { + "op": "", + "path": "", + "value": "" + } + ]' + +For example, to update a description for deployment: + + curl -X PATCH '/ml/v4/deployments/?space_id=&version=' \n--data-raw '[ + { + "op": "replace", + "path": "/description", + "value": "" + }, + ]' + +**Notes**: + + + + * For ``, use `"add"`, `"remove"`, or `"replace"`\. + + + +## Updating assets associated with a deployment ## + +After you create an online or batch deployment, you can update the deployed asset from the same endpoint\. For example, if you have a better performing model, you can replace the deployed model with the improved version\. When the update is complete, the new model is available from the REST API endpoint\. + +Before you update an asset, make sure that these conditions are true: + + + + * The framework of the new model is compatible with the existing deployed model\. + * The input schema exists and matches for the new and deployed model\. + + Caution: Failure to follow these conditions can result in a failed deployment. + * For more information, see [Updating an asset from the deployment space UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-update.html?context=cdpaas&locale=en#update-asset-ui)\. + * For more information, see [Updating an asset by using the Patch API command](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-update.html?context=cdpaas&locale=en#update-asset-api)\. + + + +### Updating an asset from the deployment space UI ### + + + +1. From the **Deployments** tab of your deployment space, click the action menu for the deployment and choose **Edit**\. +2. Click **Replace asset**\. From the *Select an asset* dialog box, select the asset that you want to replace the current asset with and click **Select asset**\. +3. Click **Save**\. + + + +Important: Make sure that the new asset is compatible with the deployment\. + +![Replacing a deployed asset](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/deploy-update.png) + +### Updating an asset by using the Patch API command ### + +Use the Watson Machine Learning [API](https://cloud.ibm.com/apidocs/machine-learning)`Patch` command to update any supported asset\. + +Use this method to patch a model for an online deployment\. + + curl -X PATCH '/ml/v4/models/?space_id=&project_id=&version=' \n--data-raw '[ + { + "op": "", + "path": "", + "value": "" + }, + { + "op": "", + "path": "", + "value": "" + } + ]' + +For example, patch a model with ID `6f01d512-fe0f-41cd-9a52-1e200c525c84` in space ID `f2ddb8ce-7b10-4846-9ab0-62454a449802`: + + curl -X PATCH '/ml/v4/models/6f01d512-fe0f-41cd-9a52-1e200c525c84?space_id=f2ddb8ce-7b10-4846-9ab0-62454a449802&project_id=&version=' \n--data-raw '[ + + { + "op":"replace", + "path":"/asset", + "value":{ + "id":"6f01d512-fe0f-41cd-9a52-1e200c525c84", + "rev":"1" + } + } + ]' + +A successful output response looks like this: + + { + "entity": { + "asset": { + "href": "/v4/models/6f01d512-fe0f-41cd-9a52-1e200c525c84?space_id=f2ddb8ce-7b10-4846-9ab0-62454a449802", + "id": "6f01d512-fe0f-41cd-9a52-1e200c525c84" + }, + "custom": { + }, + "description": "Test V4 deployments", + "name": "test_v4_dep_online_space_hardware_spec", + "online": { + }, + "space": { + "href": "/v4/spaces/f2ddb8ce-7b10-4846-9ab0-62454a449802", + "id": "f2ddb8ce-7b10-4846-9ab0-62454a449802" + }, + "space_id": "f2ddb8ce-7b10-4846-9ab0-62454a449802", + "status": { + "online_url": { + "url": "https://example.com/v4/deployments/349dc1f7-9452-491b-8aa4-0777f784bd83/predictions" + }, + "state": "updating" + } + }, + "metadata": { + "created_at": "2020-06-08T16:51:08.315Z", + "description": "Test V4 deployments", + "guid": "349dc1f7-9452-491b-8aa4-0777f784bd83", + "href": "/v4/deployments/349dc1f7-9452-491b-8aa4-0777f784bd83", + "id": "349dc1f7-9452-491b-8aa4-0777f784bd83", + "modified_at": "2020-06-08T16:55:28.348Z", + "name": "test_v4_dep_online_space_hardware_spec", + "parent": { + "href": "" + }, + "space_id": "f2ddb8ce-7b10-4846-9ab0-62454a449802" + } + } + +**Notes:** + + + + * For ``, use `"add"`, `"remove"`, or `"replace"`\. + * The initial state for the PATCH API output is "updating"\. Keep polling the status until it changes to "ready", then retrieve the deployment meta\. + * Only the `ASSET` attribute can be specified for the asset patch\. Changing any other attribute results in an error\. + * The schema of the current model and the model being patched is compared to the deployed asset\. A warning message is returned in the output of the Patch request API if the two don't match\. For example, if a mismatch is detected, you can find this information in the output response\. + + "status": { + "message": { + "text": "The input schema of the asset being patched does not match with the currently deployed asset. Please ensure that the score payloads are up to date as per the asset being patched." + }, + * For more information, see [Updating software specifications by using the API](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html#update-soft-specs-api)\. + + + +**Parent topic:**[Managing predictive deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/46915afe957ca00c5b825c5f2bdc618bfea43de8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/46915afe957ca00c5b825c5f2bdc618bfea43de8.md new file mode 100644 index 0000000..5446729 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/46915afe957ca00c5b825c5f2bdc618bfea43de8.md @@ -0,0 +1,19 @@ +# dataassetimport properties + +# dataassetimport properties # + +![Data Asset Import node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/dataassetnodeicon.png) You can use the Data Asset import node to pull in data from remote data sources using connections or from your local computer\. + + + +dataassetimport properties + +Table 1\. dataassetimport properties + +| `dataassetimport` properties | Data type | Property description | +| ---------------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `connection_path` | string | Name of the data asset (table) you want to access from a selected connection\. The value of this property is: `/asset_name` or `/schema_name/table_name`\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/46b746b11cf60709bcea7f7c2c0aa1ec0ada5bc9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/46b746b11cf60709bcea7f7c2c0aa1ec0ada5bc9.md new file mode 100644 index 0000000..7819ef1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/46b746b11cf60709bcea7f7c2c0aa1ec0ada5bc9.md @@ -0,0 +1,76 @@ +# Selecting an AutoAI model + +# Selecting an AutoAI model # + +AutoAI automatically prepares data, applies algorithms, and attempts to build model pipelines that are best suited for your data and use case\. Learn how to evaluate the model pipelines so that you can save one as a model\. + +## Reviewing experiment results ## + +During AutoAI training, your data set is split to a training part and a hold\-out part\. The training part is used by the AutoAI training stages to generate the AutoAI model pipelines and cross\-validation scores that are used to rank them\. After AutoAI training, the hold\-out part is used for the resulting pipeline model evaluation and computation of performance information such as ROC curves and confusion matrices, which are shown in the leaderboard\. The training/hold\-out split ratio is 90/10\. + +As the training progresses, you are presented with a dynamic infographic and leaderboard\. Hover over nodes in the infographic to explore the factors that pipelines share and their unique properties\. For a guide to the data in the infographic, click the Legend tab in the information panel\. Or, to see a different view of the pipeline creation, click the Experiment details tab of the notification panel, then click **Switch views** to view the progress map\. In either view, click a pipeline node to view the associated pipeline in the leaderboard\. The leaderboard contains model pipelines that are ranked by cross\-validation scores\. + +## View the pipeline transformations ## + +Hover over a node in the infographic to view the transformations for a pipeline\. The sequence of data transformations consists of a pre\-processing transformer and a sequence of data transformers, if feature engineering was performed for the pipeline\. The algorithm is determined by model selection and optimization steps during AutoAI training\. + +![Pipeline transformation for AutoAI models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-bank-pipeline-transform.png) + +See [Implementation details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html) to review the technical details for creating the pipelines\. + +## View the leaderboard ## + +Each model pipeline is scored for various metrics and then ranked\. The default ranking metric for binary classification models is the area under the ROC curve\. For multi\-class classification models the default metric is accuracy\. For regression models, the default metric is the root mean\-squared error (RMSE)\. The highest\-ranked pipelines display in a leaderboard, so you can view more information about them\. The leaderboard also provides the option to save select model pipelines after you review them\. + +![Leaderboard AutoAI models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-bank-leaderboard.png) + +You can evaluate the pipelines as follows: + + + + * Click a pipeline in the leaderboard to view more detail about the metrics and performance\. + * Click **Compare** to view how the top pipelines compare\. + * Sort the leaderboard by a different metric\. + + + +![Expanding an AutoAI pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-bank-pipeline-expand.png) + +### Viewing the confusion matrix ### + +One of the details you can view for a pipeline for a binary classification experiment is a *Confusion matrix\.* + +The confusion matrix is based on the holdout data, which is the portion of the training dataset that is not used for training the model pipeline but only used to measure its performance on data that was not seen during training\. + +In a binary classification problem with a positive class and a negative class, the confusion matrix summarizes the pipeline model’s positive and negative predictions in four quadrants depending on their correctness regarding the positive or negative class labels of the holdout data set\. + +For example, the Bank sample experiment seeks to identify customers that take promotions that are offered to them\. The confusion matrix for the top\-ranked pipeline is: + +![Confusion matrix](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-confusion-matrix.png) + +The positive class is ‘yes’ (meaning a user takes the promotion)\. You can see that the measurement of true negatives, that is, customers the model predicted correctly they would refuse their promotions, is high\. + +Click the items in the navigation menu to view other details about the selected pipeline\. For example, **Feature importance** shows which data features contribute most to your prediction output\. + +## Save a pipeline as a model ## + +When you are satisfied with a pipeline, save it using one of these methods: + + + + * Click **Save model** to save the candidate pipeline as a model to your project so you can test and deploy it\. + * Click [**Save as notebook**](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-notebook.html) to create and save an auto\-generated notebook to your project\. You can review the code or run the experiment in the notebook\. + + + +## Next steps ## + +Promote the trained model to a deployment space so that you can test it with new data and generate predictions\. + +## Learn more ## + +[AutoAI implementation details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html) + +**Parent topic:**[AutoAI overview](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/47b819e4861856fab3c5627661edd8e59fbed8a2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/47b819e4861856fab3c5627661edd8e59fbed8a2.md new file mode 100644 index 0000000..ffe8e03 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/47b819e4861856fab3c5627661edd8e59fbed8a2.md @@ -0,0 +1,76 @@ +# Microsoft Azure SQL Database connection + +# Microsoft Azure SQL Database connection # + +To access your data in a Microsoft Azure SQL Database, create a connection asset for it\. + +Microsoft Azure SQL Database is a managed cloud database provided as part of Microsoft Azure\. + +## Create a connection to Microsoft Azure SQL Database ## + +To create the connection asset, you need these connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Select **Use Active Directory** if the server has been set up to use Azure Active Directory authentication (Azure AD)\. Enter your Azure AD user and password\. + * Username and password + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Microsoft Azure SQL Database connections in the following workspaces and tools: + + + + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [Azure SQL Database documentation](https://docs.microsoft.com/en-ca/azure/azure-sql/database/connect-query-content-reference-guide) for the correct syntax\. + +## Microsoft Azure SQL Database setup ## + +[Getting started with single databases in Azure SQL Database](https://docs.microsoft.com/en-ca/azure/azure-sql/database/quickstart-content-reference-guide) + +## Learn more ## + +[Azure SQL Database documentation](https://docs.microsoft.com/en-ca/azure/azure-sql/database/) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/47cc4851c049d805f02bd2058cd5c2ffa157981c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/47cc4851c049d805f02bd2058cd5c2ffa157981c.md new file mode 100644 index 0000000..974c273 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/47cc4851c049d805f02bd2058cd5c2ffa157981c.md @@ -0,0 +1,29 @@ +# Deployment spaces + +# Deployment spaces # + +Deployment spaces contain deployable assets, deployments, deployment jobs, associated input and output data, and the associated environments\. You can use spaces to deploy various assets and manage your deployments\. + +Deployment spaces are not associated with projects\. You can publish assets from multiple projects to a space, and you can deploy assets to more than one space\. For example, you might have a test space for evaluating deployments, and a production space for deployments that you want to deploy in business applications\. + +The deployments dashboard is an aggregate view of deployment activity available to you, across spaces\. For details, refer to [Deployments dashboard](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/operator-view.html)\. + +When you open a space from the UI, you see these elements: + +![Detailed information about a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/DeploymentSpace.svg) + +You can share a space with other people\. When you add collaborators to a deployment space, you can specify which actions they can do by assigning them access levels\. For details on space collaborator permissions, refer to [Deployment space collaborator roles and permissions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/collaborator-permissions-wml.html)\. + +## Learn more ## + + + + * [Creating deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-create.html) + * [Managing assets in a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets-all.html) + * [Creating deployments from a space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html) + * [Exporting space assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-export.html) + * [Deleting deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-delete.html) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4800c7e7c443ec310d775747125585f4671534fc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4800c7e7c443ec310d775747125585f4671534fc.md new file mode 100644 index 0000000..3debd8c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4800c7e7c443ec310d775747125585f4671534fc.md @@ -0,0 +1,183 @@ +# Google BigQuery connection + +# Google BigQuery connection # + +To access your data in Google BigQuery, you must create a connection asset for it\. + +Google BigQuery is a fully managed, serverless data warehouse that enables scalable analysis over petabytes of data\. + +## Create a connection to Google BigQuery ## + +To create the connection asset, choose an authentication method\. Choices include authentication with or without workload identity federation\. + +**Without workload identity federation** + + + + * Credentials: The contents of the Google service account key JSON file + * Client ID, Client secret, Access token, and Refresh token + + + +**With workload identity federation** +You use an external identity provider (IdP) for authentication\. An external identity provider uses Identity and Access Management (IAM) instead of service account keys\. IAM provides increased security and centralized management\. You can use workload identity federation authentication with an access token or with a token URL\. + +You can configure a Google BigQuery connection for workload identity federation with any identity provider that complies with the OpenID Connect (OIDC) specification and that satisfies the Google Cloud requirements that are described in [Prepare your external IdP](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-providers#oidc)\. The requirements include: + + + + * The identity provider must support OpenID Connect 1\.0\. + * The identity provider's OIDC metadata and JWKS endpoints must be publicly accessible over the internet\. Google Cloud uses these endpoints to download your identity provider's key set and uses that key set to validate tokens\. + * The identity provider is configured so that your workload can obtain ID tokens that meet these criteria: + + + + * Tokens are signed with the RS256 or ES256 algorithm. + * Tokens contain an aud claim. + + + + + +For examples of the workload identity federation configuration steps and the Google BigQuery connection details for Amazon Web Services (AWS) and Microsoft Azure, see [Workload identity federation examples](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/wif-examples.html)\. + +#### Workload Identity Federation with access token connection details #### + + + + * **Access token**: An access token from the identity provider to connect to BigQuery\. + * **Security Token Service audience**: The security token service audience that contains the project ID, pool ID, and provider ID\. Use this format: + + //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID + + For more information, see [Authenticate a workload using the REST API](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds#rest). + * **Service account email**: The email address of the Google service account to be impersonated\. For more information, see [Create a service account for the external workload](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds#create_a_service_account_for_the_external_workload)\. + * **Service account token lifetime** (optional): The lifetime in seconds of the service account access token\. The default lifetime of a service account access token is one hour\. For more information, see [URL\-sourced credentials](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-providers#url-sourced-credentials)\. + * **Token format**: Text or JSON with the Token field name for the name of the field in the JSON response that contains the token\. + * **Token field name**: The name of the field in the JSON response that contains the token\. This field appears only when the **Token format** is JSON\. + * **Token type**: AWS Signature Version 4 request, Google OAuth 2\.0 access token, ID token, JSON Web Token (JWT), or SAML 2\.0\. + + + +#### Workload Identity Federation with token URL connection details #### + + + + * **Security Token Service audience**: The security token service audience that contains the project ID, pool ID, and provider ID\. Use this format: + + //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID + + For more information, see [Authenticate a workload using the REST API](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds#rest). + * **Service account email**: The email address of the Google service account to be impersonated\. For more information, see [Create a service account for the external workload](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds#create_a_service_account_for_the_external_workload)\. + * **Service account token lifetime** (optional): The lifetime in seconds of the service account access token\. The default lifetime of a service account access token is one hour\. For more information, see [URL\-sourced credentials](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-providers#url-sourced-credentials)\. + * **Token URL**: The URL to retrieve a token\. + * **HTTP method**: HTTP method to use for the token URL request: GET, POST, or PUT\. + * **Request body** (for POST or PUT methods): The body of the HTTP request to retrieve a token\. + * **HTTP headers**: HTTP headers for the token URL request in JSON or as a JSON body\. Use format: `"Key1"="Value1","Key2"="Value2"`\. + * **Token format**: Text or JSON with the Token field name for the name of the field in the JSON response that contains the token\. + * **Token field name**: The name of the field in the JSON response that contains the token\. This field appears only when the **Token format** is JSON\. + * **Token type**: AWS Signature Version 4 request, Google OAuth 2\.0 access token, ID token, JSON Web Token (JWT), or SAML 2\.0\. + + + +### Other properties ### + +**Project ID** (optional) + +**Output JSON string format**: JSON string format for output values that are complex data types (for example, nested or repeated)\. + + + + * **Pretty**: Values are formatted before sending them to output\. Use this option to visually read a few rows\. + * **Raw**: (Default) No formatting\. Use this option for the best performance\. + + + +### Permissions ### + +The connection to Google BigQuery requires the following BigQuery permissions: + + + + * `bigquery.job.create` + * `bigquery.tables.get` + * `bigquery.tables.getData` + + + +Use one of three ways to gain these permissions: + + + + * Use the predefined BigQuery Cloud IAM role `bigquery.admin`, which includes these permissions; + * Use a combination of two roles, one from each column in the following table; or + * Create a custom role\. See [Create and manage custom roles](https://cloud.google.com/iam/docs/creating-custom-roles)\. + + + + + +| First role | Second role | +| --------------------- | ------------------ | +| `bigquery.dataEditor` | `bigquery.jobUser` | +| `bigquery.dataOwner` | `bigquery.user` | +| `bigquery.dataViewer` | | + + + +For more information about permissions and roles in Google BigQuery, see [Predefined roles and permissions](https://cloud.google.com/bigquery/docs/access-control)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Google BigQuery connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Google BigQuery setup ## + +[Quickstart by using the Cloud Console](https://cloud.google.com/bigquery/docs/quickstarts/quickstart-web-ui) + +## Learn more ## + + + + * [Google BigQuery documentation](https://cloud.google.com/bigquery/docs) + * [Google BigQuery workload identity federation examples](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/wif-examples.html) + + + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/484af9baf43ac6bcfdfaf7b0d353ccdf119033df.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/484af9baf43ac6bcfdfaf7b0d353ccdf119033df.md new file mode 100644 index 0000000..95043e9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/484af9baf43ac6bcfdfaf7b0d353ccdf119033df.md @@ -0,0 +1,82 @@ +# Getting started with the Watson Pipelines editor + +# Getting started with the Watson Pipelines editor # + +The Watson Pipelines editor is a graphical canvas where you can drag and drop nodes that you connect together into a pipeline for automating machine model operations\. + +You can open the Pipelines editor by creating a new Pipelines asset or editing an existing Pipelines asset\. To create a new asset in your project from the *Assets* tab, click **New asset > Automate model lifecycle**\. To edit an existing asset, click the pipeline asset name on the *Assets* tab\. + +The canvas opens with a set of annotated tools for you to use to create a pipeline\. The canvas includes the following components: + +![Pipeline canvas components](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/Pipeline-canvas.svg) + + + + * The **node palette** provides nodes that represent various actions for manipulating assets and altering the flow of control in a pipeline\. For example, you can add nodes to create assets such as data files, AutoAI experiments, or deployment spaces\. You can configure node actions based on conditions if files import successfully, such as feeding data into a notebook\. You can also use nodes to run and update assets\. As you build your pipeline, you connect the nodes, then configure operations on the nodes to create the pipeline\. These pipelines create a dynamic flow that addresses specific stages of the machine learning lifecycle\. + * The **toolbar** includes shortcuts to options related to running, editing, and viewing the pipeline\. + * The **parameters pane** provides context\-sensitive options for configuring the elements of your pipeline\. + + + +### The toolbar ### + +![Pipeline toolbar](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/Pipeline-toolbar.png) + +Use the Pipeline editor toolbar to: + + + + * Run the pipeline as a trial run or a scheduled job + * View the history of pipeline runs + * Cut, copy, or paste canvas objects + * Delete a selected node + * Drop a comment onto the canvas + * Configure global objects, such as pipeline parameters or user variables + * Manage default settings + * Arrange nodes vertically + * View last saved timestamp + * Zoom in or out + * Fit the pipeline to the view + * Show or hide global messages + + + +Hover over an icon on the toolbar to view the shortcut text\. + +### The node palette ### + +The node palette provides the objects that you need to create an end\-to\-end pipeline\. Click a top\-level node in the palette to see the related nodes\. + + + +| Node category | Description | Node type | +| ------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Copy | Use nodes to copy an asset or file, import assets, or export assets | Copy assets
Export assets
Import assets | +| Create | Create assets or containers for assets | Create AutoAI experiment
Create AutoAI time series experiment
Create batch deployment
Create data asset
Create deployment space
Create online deployment | +| Wait | Specify node\-level conditions for advancing the pipeline run | Wait for all results
Wait for any result
Wait for file | +| Control | Specify error handling | Loop in parallel
Loop in sequence
Set user variables
Terminate pipeline | +| Update | Update the configuration settings for a space, asset, or job\. | Update AutoAI experiment
Update batch deployment
Update deployment space
Update online deployment | +| Delete | Remove a specified asset, job, or space\. | Delete AutoAI experiment
Delete batch deployment
Delete deployment space
Delete online deployment | +| Run | Run an existing or ad hoc job\. | Run AutoAI experiment
Run Bash script
Run batch deployment
Run Data Refinery job
Run notebook job
Run pipeline job
Run Pipelines component job
Run SPSS Modeler job | + + + +### The parameters pane ### + +Double\-click a node to edit its configuration options\. Depending on the type, a node can define various input and output options or even allow the user to add inputs or outputs dynamically\. You can define the source of values in various ways\. For example, you can specify that the source of value for "ML asset" input for a batch deployment must be the output from a run notebook node\. + +For more information on parameters, see [Configuring pipeline components](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-config.html)\. + +## Next steps ## + + + + * [Planning a pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-planning.html) + * [Explore the sample pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-sample.html) + * [Create a pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-create.html) + + + +**Parent topic:**[Watson Pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/48cca78ceb92570bce08f4e1a5677e8cd7936095.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/48cca78ceb92570bce08f4e1a5677e8cd7936095.md new file mode 100644 index 0000000..219b2ca --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/48cca78ceb92570bce08f4e1a5677e8cd7936095.md @@ -0,0 +1,40 @@ +# Operations + +# Operations # + +Use an equals sign (`=`) to assign values\. + +For example, to assign the value `3` to a variable called `x`, you would use the following statement: + + x = 3 + +You can also use the equals sign to assign string type data to a variable\. For example, to assign the value `a string value` to the variable `y`, you would use the following statement: + + y = "a string value" + +The following table lists some commonly used comparison and numeric operations, and their descriptions\. + + + +Common comparison and numeric operations + +Table 1\. Common comparison and numeric operations + +| Operation | Description | +| -------------- | ------------------------------------ | +| `x < y` | Is `x` less than `y`? | +| `x > y` | Is `x` greater than `y`? | +| `x <= y` | Is `x` less than or equal to `y`? | +| `x >= y` | Is `x` greater than or equal to `y`? | +| `x == y` | Is `x` equal to `y`? | +| `x != y` | Is `x` not equal to `y`? | +| `x <> y` | Is `x` not equal to `y`? | +| `x + y` | Add `y` to `x` | +| `x - y` | Subtract `y` from `x` | +| `x * y` | Multiply `x` by `y` | +| `x / y` | Divide `x` by `y` | +| `x ** y` | Raise `x` to the `y` power | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/496c8703eba5c4c6bcd6d65ee60d3e768f1bf071.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/496c8703eba5c4c6bcd6d65ee60d3e768f1bf071.md new file mode 100644 index 0000000..6134390 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/496c8703eba5c4c6bcd6d65ee60d3e768f1bf071.md @@ -0,0 +1,96 @@ +# Integrating with Microsoft Azure + +# Integrating with Microsoft Azure # + +You can configure an integration with the Microsoft Azure platform to allow IBM watsonx users access to data sources from Microsoft Azure\. Before proceeding, make sure you have proper permissions\. For example, you'll need permission in your subscription to create an application integration in Azure Active Directory\. + +After you configure an integration, you'll see it under **Service instances**\. You'll see a new **Azure** tab that lists your instances of Data Lake Storage Gen1 and SQL Database\. + +To configure an integration with Microsoft Azure: + + + +1. Log on to your Microsoft Azure account at [https://portal\.azure\.com](https://portal.azure.com)\. +2. Navigate to the **Subscriptions** panel and copy your subscription ID\. + + + + + +1. In IBM watsonx, go to **Administration > Cloud integrations** and click the **Azure** tab\. Paste the subscription ID you copied in the previous step into the **Subscription ID** field\. + + + + + +1. In Microsoft Azure Active Directory, navigate to **Manage > App registrations** and click **New registration** to register an application\. Give it a name such as *IBM integration* and select the desired option for supported account types\. + + + + + +1. Copy the **Application (client) ID** and the **Tenant ID** and paste them into the appropriate fields on the IBM watsonx **Integrations** page, as you did with the subscription ID\. + + + + + +1. In Microsoft Azure, navigate to **Certificates & secrets > New client secret** to create a new secret\. + + **Important\!** + + + + * Write down your secret and store it in a safe place. After you leave this page, you won't be able to retrieve the secret again. You'd need to delete the secret and create a new one. + * If you ever need to revoke the secret for some reason, you can simply delete it from this page. + * Pay attention to the expiration date. When the secret expires, integration will stop working. + + + +2. Copy the secret from Microsoft Azure and paste it into the appropriate field on the **Integrations** page as you did with the subscription ID and client ID\. +3. Configure [firewall access](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/int-azure.html?context=cdpaas&locale=en#firewall)\. +4. Confirm that you can see your Azure services\. From the main menu, choose **Administration > Services > Services instances**\. Click the **Azure** tab to see those services\. + + + +Now users who have credentials to your Azure services can [create connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) to them by selecting them on the **Add connection** page\. Then they can access data from those connections by [creating connected data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + +## Configuring firewall access ## + +You must also configure access so IBM watsonx can access data through the firewall\. + +For Microsoft Azure SQL Database firewall: + + + +1. Open the database instance in Microsoft Azure\. +2. From the top list of actions, select **Set server firewall**\. +3. Set **Deny public network access** to **No**\. +4. In a separate tab or window, open IBM watsonx and go to **Administration > Cloud integrations**\. In the **Firewall configuration** panel, for each firewall IP range, copy the start and end address values into the list of rules in the Microsoft Azure QL Database firewall\. + + + +For Microsoft Azure Data Lake Storage Gen1 firewall: + + + +1. Open the Data Lake instance\. +2. Go to **Settings > Firewall and virtual networks**\. +3. In a separate tab or window, open IBM watsonx and go to **Administration > Cloud integrations**\. In the **Firewall configuration** panel, for each firewall IP range, copy the start and end address values into the list of rules under **Firewall** in the Data Lake instance\. + + + +You can now create connections, preview data from Microsoft Azure data sources, and access Microsoft Azure data in Notebooks, Data Refinery, SPSS Modeler, and other tools in projects and in catalogs\. You can see your Microsoft Azure instances under **Services > Service instances**\. + +## Next steps ## + + + + * [Set up a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html) + * [Create connections in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) + + + +**Parent topic:**[Integrations with other cloud platforms](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/int-cloud.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/497007d0d0abac3202bbf912a15bfc389066ebda.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/497007d0d0abac3202bbf912a15bfc389066ebda.md new file mode 100644 index 0000000..8c9dbfd --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/497007d0d0abac3202bbf912a15bfc389066ebda.md @@ -0,0 +1,91 @@ +# Decision Optimization experiment Python and CPLEX runtime versions and Python extensions + +# Configuring environments and adding Python extensions # + +You can change your default environment for Python and CPLEX in the experiment Overview\. + +## Procedure ## + +To change the default environment for DOcplex and Modeling Assistant models: + + + +1. Open the Overview, click ![information icon](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/images/infoicon.jpg) to open the Information pane, and select the Environments tab\. + + ![Environment tab of information pane](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/images/overviewinfoenvirons.png) +2. Expand the environment section according to your model type\. For Python and Modeling Assistant models, expand Python environment\. You can see the default Python environment (if one exists)\. To change the default environment for OPL, CPLEX, or CPO models, expand the appropriate environment section according to your model type and follow this same procedure\. +3. Expand the name of your environment, and select a different Python environment\. +4. Optional: **To create a new environment**: + + + + 1. Select New environment for Python. A new window opens for you to define your new environment. ![New environment window showing empty fields](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/images/overviewinfonewenv1.png) + 2. Enter a name, and select a CPLEX version, hardware specification, copies (number of nodes), Python version and (optionally) you can set Associate a Python extension to On to include any Python libraries that you want to add. + 3. Click New Python extension. + 4. Enter a name for your extension in the new Create a Python extension window that opens, and click Create. + 5. In the new Configure Python extension window that opens, you can set YAML code to On and enter or edit the provided YAML code.For example, use the provided template to add the custom libraries: + + # Modify the following content to add a software customization to an environment. + # To remove an existing customization, delete the entire content and click Apply. + + # Add conda channels on a new line after defaults, indented by two spaces and a hyphen. + channels: + - defaults + + # To add packages through conda or pip, remove the comment on the following line. + # dependencies: + + # Add conda packages here, indented by two spaces and a hyphen. + # Remove the comment on the following line and replace sample package name with your package name: + # - a_conda_package=1.0 + + # Add pip packages here, indented by four spaces and a hyphen. + # Remove the comments on the following lines and replace sample package name with your package name. + # - pip: + # - a_pip_package==1.0 + + You can also click Browse to add any Python libraries. + + For example, this image shows a dynamic programming Python library that is imported and YAML code set to On.![Configure Python extension window showing YAML code and a Dynamic Programming library included](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/images/PythonExtension.png) + + Click Done. + 6. Click Create in the New environment window. + + + + Your chosen (or newly created) environment appears as ticked in the Python environments drop-down list in the Environments tab. The tick indicates that this is the default Python environment for all scenarios in your experiment. +5. Select Manage experiment environments to see a detailed list of all existing environments for your experiment in the Environments tab\.![Manage experiment environment with two environments and drop\-down menu\.](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/images/manageenvextn.png) + + You can use the options provided by clicking the three vertical dots next to an environment to Edit, Set as default, Update in a deployment space or Delete the environment. You can also create a New environment from the Manage experiment environments window, but creating a new environment from this window does not make it the default unless you explicitly set is as the default. + + Updating your environment for Python or CPLEX versions: Python versions are regularly updated. If however you have explicitly specified an older Python version in your model, you must update this version specification or your models will not work. You can either create a new Python environment, as described earlier, or edit one from Manage experiment environments. This is also useful if you want to select a different version of CPLEX for your default environment. +6. Click the Python extensions tab\. + + ![Python extensions tab showing created extension](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/images/manageenvpyextn.png) + + Here you can view your Python extensions and see which environment it is used in. You can also create a New Python extension or use the options to Edit, Download, and Delete existing ones. If you edit a Python extension that is used by an experiment environment, the environment will be re-created. + + You can also view your Python environments in your deployment space assets and any Python extensions you have added will appear in the software specification. + + + + + +## Selecting a different run environment for a particular scenario ## + +You can choose different environments for individual scenarios on the Environment tab of the Run configuration pane\. + +### Procedure ### + + + +1. Open the Scenario pane and select your scenario in the Build model view\. +2. Click the Configure run icon next to the Run button to open the Run configuration pane and select the Environment tab\. +3. Choose Select run environment for this scenario, choose an environment from the drop\-down menu, and click Run\. +4. Open the Overview information pane\. You can now see that your scenario has your chosen environment, while other scenarios are not affected by this modification\. + + + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/49724d4b7690d4b215fe6f1c0a49c8b347f0c9a1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/49724d4b7690d4b215fe6f1c0a49c8b347f0c9a1.md new file mode 100644 index 0000000..c106f5f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/49724d4b7690d4b215fe6f1c0a49c8b347f0c9a1.md @@ -0,0 +1,6 @@ +# Custom charts + +# Custom charts # + +The custom charts option provides options for pasting or editing JSON code to create the wanted chart\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/499553788712e55abe1345c61ccdb15d1ce04e83.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/499553788712e55abe1345c61ccdb15d1ce04e83.md new file mode 100644 index 0000000..844b3f4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/499553788712e55abe1345c61ccdb15d1ce04e83.md @@ -0,0 +1,33 @@ +# carmanode properties + +# carmanode properties # + +![C5\.0 node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/carmanodeicon.png)The CARMA model extracts a set of rules from the data without requiring you to specify input or target fields\. In contrast to Apriori, the CARMA node offers build settings for rule support (support for both antecedent and consequent) rather than just antecedent support\. This means that the rules generated can be used for a wider variety of applications—for example, to find a list of products or services (antecedents) whose consequent is the item that you want to promote this holiday season\. + + + +carmanode properties + +Table 1\. carmanode properties + +| `carmanode` Properties | Values | Property description | +| --------------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `inputs` | *\[field1 \.\.\. fieldn\]* | CARMA models use a list of input fields, but no target\. Weight and frequency fields are not used\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `id_field` | *field* | Field used as the ID field for model building\. | +| `contiguous` | *flag* | Used to specify whether IDs in the ID field are contiguous\. | +| `use_transactional_data` | *flag* | | +| `content_field` | *field* | | +| `min_supp` | *number(percent)* | Relates to rule support rather than antecedent support\. The default is 20%\. | +| `min_conf` | *number(percent)* | The default is 20%\. | +| `max_size` | *number* | The default is 10\. | +| `mode` | `Simple``Expert` | The default is `Simple`\. | +| `exclude_multiple` | *flag* | Excludes rules with multiple consequents\. The default is `False`\. | +| `use_pruning` | *flag* | The default is `False`\. | +| `pruning_value` | *number* | The default is 500\. | +| `vary_support` | *flag* | | +| `estimated_transactions` | *integer* | | +| `rules_without_antecedents` | *flag* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4a7f60f563f15cc32060c5f17cb44699a221ad5e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4a7f60f563f15cc32060c5f17cb44699a221ad5e.md new file mode 100644 index 0000000..0e37b92 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4a7f60f563f15cc32060c5f17cb44699a221ad5e.md @@ -0,0 +1,13 @@ +# IBM Cloud services status + +# IBM Cloud services status # + +If you're having a problem with one of your services, go to the IBM Cloud Status page\. The Status page shows unplanned incidents, planned maintenance, announcements, and security bulletin notifications about key events that affect the IBM Cloud platform, infrastructure, and major services\. + +You can find the Status page by logging in to the IBM Cloud console\. Click **Support** from the menu bar, and then click **View cloud status** from the Support Center\. Or, you can access the page directly at [IBM Cloud \- Status](https://cloud.ibm.com/status?type=incident&component=ibm-cloud-platform&selected=status)\. Search for the service to view its status\. + +## Learn more ## + +[Viewing cloud status](https://cloud.ibm.com/docs/get-support?topic=get-support-viewing-cloud-status) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4b16740c786c0846194987998dad887250be95bf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4b16740c786c0846194987998dad887250be95bf.md new file mode 100644 index 0000000..450b266 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4b16740c786c0846194987998dad887250be95bf.md @@ -0,0 +1,32 @@ +# Hyperparameter definitions + +# Hyperparameter definitions # + +Definitions of hyperparameters used in the experiment training\. One or more of these hyperparameter options might be used, depending on your framework and fusion method\. + + + +Hyperparameter definitions + +| Hyperparameters | Description | +| --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Rounds | Int value\. The number of training iterations to complete between the aggregator and the remote systems\. | +| Termination accuracy *(Optional)* | Float value\. Takes `model_accuracy` and compares it to a numerical value\. If the condition is satisfied, then the experiment finishes early\.

For example, `termination_predicate: accuracy >= 0.8` finishes the experiment when the mean of model accuracy for participating parties is greater than or equal to 80%\. Currently, Federated Learning accepts one type of early termination condition (model accuracy) for classification models only\. | +| Quorum *(Optional)* | Float value\. Proceeds with model training after the aggregator reaches a certain ratio of party responses\. Takes a decimal value between 0 \- 1\. The default is 1\. The model training starts only after party responses reach the indicated ratio value\.
For example, setting this value to 0\.5 starts the training after 50% of the registered parties responded to the aggregator call\. | +| Max Timeout *(Optional)* | Int value\. Terminates the Federated Learning experiment if the waiting time for party responses exceeds this value in seconds\. Takes a numerical value up to 43200\. If this value in seconds passes and the `quorum` ratio is not reached, the experiment terminates\.

For example, `max_timeout = 1000` terminates the experiment after 1000 seconds if the parties do not respond in that time\. | +| Sketch accuracy vs privacy *(Optional)* | Float value\. Used with XGBoost training to control the relative accuracy of sketched data sent to the aggregator\. Takes a decimal value between 0 and 1\. Higher values will result in higher quality models but with a reduction in data privacy and increase in resource consumption\. | +| Number of classes | Int value\. Number of target classes for the classification model\. Required if "Loss" hyperparameter is:
\- `auto`
\- `binary_crossentropy`
\- `categorical_crossentropy`
| +| Learning rate | Decimal value\. The learning rate, also known as *shrinkage*\. This is used as a multiplicative factor for the leaves values\. | +| Loss | String value\. The loss function to use in the boosting process\.
\- `binary_crossentropy` (also known as logistic loss) is used for binary classification\.
\- `categorical_crossentropy` is used for multiclass classification\.
\- `auto` chooses either loss function depending on the nature of the problem\.
\- `least_squares` is used for regression\. | +| Max Iter | Int value\. The total number of passes over the local training data set to train a Scikit\-learn model\. | +| N cluster | Int value\. The number of clusters to form and the number of centroids to generate\. | +| Epoch *(Optional)* | Int value\. The number of local training iterations to be preformed by each remote party for each round\. For example, if you set Rounds to 2 and Epochs to 5, all remote parties train locally 5 times before the model is sent to the aggregator\. In round 2, the aggregator model is trained locally again by all parties 5 times and re\-sent to the aggregator\. | +| sigma | Float value\. Determines how far the local model neurons are allowed from the global model\. A bigger value allows more matching and produces a smaller global model\. Default value is 1\. | +| sigma0 | Float value\. Defines the permitted deviation of the global network neurons\. Default value is 1\. | +| gamma | Float value\. Indian Buffet Process parameter that controls the expected number of features in each observation\. Default value is 1\. | + + + +**Parent topic:**[Frameworks, fusion methods, and Python versions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-frames.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4b48ef3d089f3142b1ed604a32873217f89e052f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4b48ef3d089f3142b1ed604a32873217f89e052f.md new file mode 100644 index 0000000..6b31c6b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4b48ef3d089f3142b1ed604a32873217f89e052f.md @@ -0,0 +1,72 @@ +# Federated Learning architecture + +# Federated Learning architecture # + +IBM Federated Learning has two main components: the aggregator and the remote training parties\.  + +## Aggregator ## + +The aggregator is a model fusion processor\. The admin manages the aggregator\. + +The aggregator runs the following tasks: + + + + * Runs as a platform service in regions Dallas, Frankfurt, London, or Tokyo\. + * Starts with a Federated Learning experiment\. + + + +## Party ## + +A party is a user that provides model input to the Federated Learning experiment aggregator\. The party can be: + + + + * on any system that can run the Watson Machine Learning Python client and compatible with Watson Machine Learning frameworks\. + + Note:The system does not have to be specifically IBM watsonx. For a list of system requirements, see [Set up your system](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-setup.html). + * running on the system in any geographical location\. You are recommended to locate each party in the same region where the data is to avoid data extraction out of different regions\. + + + +This illustration shows the architecture of IBM Federated Learning\. + +A Remote Training System is used to authenticate the party's identity to the aggregator during training\. + +![Illustration of the Federated Learning architecture](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl-arch.svg) + +## User workflow ## + + + +1. The data scientist: + + + + 1. Identifies the data sources. + 2. Creates an initial "untrained" model. + 3. Creates a data handler file. + These tasks might overlap with a training party entity. + + + +2. A party connects to the aggregator on their system, which can be remote\. +3. An admin controls the Federated Learning experiment by: + + + + 1. Configuring the experiment to accommodate remote parties. + 2. Starting the aggregator. + + + + + +This illustration shows the actions that are associated with each role in the Federated Learning process\. + +![Illustration of the Federated Learning group workflow process](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl-workflow.svg) + +**Parent topic:**[Get started](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-get-started.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4b74e9409284f77897db58b77271337a4493a410.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4b74e9409284f77897db58b77271337a4493a410.md new file mode 100644 index 0000000..b54efbb --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4b74e9409284f77897db58b77271337a4493a410.md @@ -0,0 +1,67 @@ +# Supported data sources for Data Refinery + +# Supported data sources for Data Refinery # + +Data Refinery supports the following data sources in connections\. + +## IBM services ## + + + + * [IBM Cloud Data Engine](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sqlquery.html)*(Supports source connections only)* + * [IBM Cloud Databases for DataStax](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-datastax.html) + * [IBM Cloud Databases for MongoDB](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mongodb.html)*(Supports source connections only)* + * [IBM Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html) + * [IBM Cloudant](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cloudant.html) + * [IBM Cognos Analytics](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cognos.html)*(Supports source connections only)* + * [IBM Data Virtualization Manager for z/OS](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-datavirt-z.html) + * [IBM Db2](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2.html) + * [IBM Db2 Big SQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-bigsql.html) + * [IBM Db2 on Cloud](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-cloud.html) + * [IBM Db2 Warehouse](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-wh.html) + * [IBM Planning Analytics](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-plananalytics.html)*(Supports source connections only)* + * [IBM Watson Query](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-data-virtual.html)*(Supports source connections only)* + + + +## Third\-party services ## + + + + * [Amazon RDS for MySQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azrds-mysql.html) + * [Amazon RDS for Oracle](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azrds-oracle.html) + * [Amazon RDS for PostgreSQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azrds-postresql.html) + * [Amazon Redshift](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-redshift.html) + * [Amazon S3](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-amazon-s3.html) + * [Apache Cassandra](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cassandra.html) + * [Apache Derby](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-derby.html) + * [Apache HDFS](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-hdfs.html) + * [Apache Hive](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-hive.html)*(Supports source connections only)* + * [Box](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-box.html) + * [Cloudera Impala](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cloudera.html)*(Supports source connections only)* + * [Dremio](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-dremio.html) + * [Dropbox](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-dropbox.html) + * [Elasticsearch](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-elastic.html) + * [FTP](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-ftp.html) + * [Generic S3](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-generics3.html) + * [Google BigQuery](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-bigquery.html) + * [Google Cloud Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cloud-storage.html) + * [HTTP](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-http.html)*(Supports source connections only)* + * [MariaDB](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mariadb.html) + * [Microsoft Azure Blob Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azureblob.html) + * [Microsoft Azure Cosmos DB](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cosmosdb.html) + * [Microsoft SQL Server](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sql-server.html) + * [MongoDB](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mongo.html)*(Supports source connections only)* + * [OData](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-odata.html)*(Supports source connections only)* + * [Oracle](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-oracle.html) + * [PostgreSQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-postgresql.html) + * [Presto](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-presto.html)*(Supports source connections only)* + * [SAP OData](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sapodata.html)*(Supports source connections only)* + * [SingleStoreDB](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-singlestore.html) + * [Snowflake](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-snowflake.html) + + + +**Parent topic**: [Refining data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4b8ebfdf4ea9e571d53720fe09a2ce610aecbcb9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4b8ebfdf4ea9e571d53720fe09a2ce610aecbcb9.md new file mode 100644 index 0000000..81b5de2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4b8ebfdf4ea9e571d53720fe09a2ce610aecbcb9.md @@ -0,0 +1,93 @@ +# Tableau connection + +# Tableau connection # + +To access your data in Tableau, you must create a connection asset for it\. + +Tableau is an interactive data visualization platform\. + +## Supported products ## + +Tableau Server 2020\.3\.3 and Tableau Cloud + +## Create a connection to Tableau ## + +To create the connection asset, you need the following connection details: + + + + * Hostname or IP address + * Port number + * Site: The name of the Tableau site to use + * For **Authentication method**, you need either a username and password or an Access token (with Access token name and Access token secret)\. + * SSL certificate (if required by the database server) + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Tableau connections in the following workspaces and tools: **Projects** + + + + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Tableau setup ## + + + + * [Get Started with Tableau Server on Linux](https://help.tableau.com/current/server-linux/en-us/get_started_server.htm) + * [Get Started with Tableau Server on Windows](https://help.tableau.com/current/server/en-us/get_started_server.htm) + * [Get Started with Tableau Cloud](https://help.tableau.com/current/online/en-us/to_get_started.htm) + + + +## Restriction ## + +You can use this connection only for source data\. You cannot write to data or export data with this connection\. + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [Run Initial SQL](https://help.tableau.com/current/online/en-us/connect_basic_initialsql.htm) for the correct syntax\. + +## Learn more ## + + + + * [Tableau](https://www.tableau.com/) + * [SSL for Tableau Server on Linux](https://help.tableau.com/current/server-linux/en-us/ssl.htm) + * [SSL for Tableau Server on Windows](https://help.tableau.com/current/server/en-us/ssl.htm) + * [Security in Tableau Cloud](https://help.tableau.com/current/online/en-us/to_security.htm) + + + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4bfeb479bcb6bbd28dd18ec423fdc5fb9c39b4b6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4bfeb479bcb6bbd28dd18ec423fdc5fb9c39b4b6.md new file mode 100644 index 0000000..31086b9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4bfeb479bcb6bbd28dd18ec423fdc5fb9c39b4b6.md @@ -0,0 +1,56 @@ +# Determining your roles and permissions + +# Determining your roles and permissions # + +You have multiple roles within IBM Cloud and IBM watsonx that provide permissions\. You can determine what each of your roles are, and, when necessary, who can change your roles\. + +## Projects and catalogs roles ## + +To determine your role in a project or deployment space, look at the **Access Control** page on the **Manage** tab\. Your role is listed next to your name or the service ID you use to log in\. + +The permissions that are associated with each role are specific to the type of workspace: + + + + * [Project collaborator permissions](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborator-permissions.html) + * [Deployment space collaborator permissions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/collaborator-permissions-wml.html) + + + +If you want a different role, ask someone who has the **Admin** role on the **Access Control** page to change your role\. + +## IBM Cloud IAM account and service access roles ## + +You can see your IAM account and service access roles in IBM Cloud\. + +To see your IAM account and service access roles in IBM Cloud: + + + +1. From the IBM watsonx main menu, click **Administration > Access (IAM)**\. +2. Click **Users**, then click your name\. +3. Click the **Access policies** tab\. You might have multiple entries: + + + + * The **All resources in account (including future IAM enabled services)** entry shows your general roles for all services in the account. + * Other entries might show your roles for individual services. + + + + + +If you want the IBM Cloud account administrator role or another role, ask an IBM Cloud account owner or administrator to assign it to you\. You can [find your account administrators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html#accountadmin) on your **Access (IAM) > Users** page in IBM Cloud\. + +## Learn more ## + + + + * [Roles in IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/roles.html) + * [Find your IBM Cloud account owner or administrator](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html#accountadmin) + + + +**Parent topic:**[Administration](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/administer-accounts.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4c6242d9f2b3e125780fdf188f994270a6e2340d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4c6242d9f2b3e125780fdf188f994270a6e2340d.md new file mode 100644 index 0000000..8fda643 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4c6242d9f2b3e125780fdf188f994270a6e2340d.md @@ -0,0 +1,27 @@ +# Batch deployment input details by framework + +# Batch deployment input details by framework # + +Various data types are supported as input for batch deployments, depending on your specific model type\. + +For details, follow these links: + + + + * [AutoAI models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-autoai.html) + * [Decision optimization models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-do.html) + * [Python functions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-py-function.html) + * [Python scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-py-script.html) + * [Pytorch models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-pytorch.html) + * [Scikit\-Learn and XGBoost models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-scikit.html) + * [Spark models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-spark.html) + * [SPSS models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-spss.html) + * [Tensorflow models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-tensorflow.html) + + + +For more information, see [Using multiple inputs for an SPSS job](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-SPSS-multiple-input.html)\. + +**Parent topic:**[Creating a batch deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-details.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4c83f9c21ca1e70077c8004bd26fe5fb0fc947eb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4c83f9c21ca1e70077c8004bd26fe5fb0fc947eb.md new file mode 100644 index 0000000..1f0bece --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4c83f9c21ca1e70077c8004bd26fe5fb0fc947eb.md @@ -0,0 +1,10 @@ +# Append node (SPSS Modeler) + +# Append node # + +You can use Append nodes to concatenate sets of records\. Unlike Merge nodes, which join records from different sources together, Append nodes read and pass downstream all of the records from one source until there are no more\. Then the records from the next source are read using the same data structure (number of records, number of fields, and so on) as the first, or primary, input\. When the primary source has more fields than another input source, the system null string ($null$) will be used for any incomplete values\. + +Append nodes are useful for combining datasets with similar structures but different data\. For example, you might have transaction data stored in different files for different time periods, such as a sales data file for March and a separate one for April\. Assuming that they have the same structure (the same fields in the same order), the Append node will join them together into one large file, which you can then analyze\. + +Note: To append files, the field measurement levels must be similar\. For example, a `Nominal` field cannot be appended with a field whose measurement level is `Continuous`\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4ca6000dc674cb2486d905f8531fc19bc88f887a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4ca6000dc674cb2486d905f8531fc19bc88f887a.md new file mode 100644 index 0000000..0ce4462 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4ca6000dc674cb2486d905f8531fc19bc88f887a.md @@ -0,0 +1,89 @@ +# OData connection + +# OData connection # + +To access your data in OData, create a connection asset for it\. + +The OData (Open Data) protocol is a REST\-based data access protocol\. The OData connection reads data from a data source that uses the OData protocol\. + +## Supported versions ## + +The OData connection is supported on OData protocol version 2 or version 4\. + +## Create a connection to OData ## + +To create the connection asset, you need these connection details: + +Credentials type: + + + + * API Key + * Basic + * None + + + +Encryption: +SSL certificate (if required by the database server) + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use the OData connection in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## OData setup ## + +To set up the OData service, see [How to Use Web API OData to Build an OData V4 Service without Entity Framework](https://www.odata.org/blog/how-to-use-web-api-odata-to-build-an-odata-v4-service-without-entity-framework/)\. + +## Restrictions ## + + + + * For Data Refinery, you can use this connection only as a source\. You cannot use this connection as a target connection or as a target connected data asset\. + * For SPSS Modeler, you cannot create new entity sets\. + + + +## Learn more ## + +[www\.odata\.org](https://www.odata.org/) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4cd539b8153216f80b26729a35ad4cd04a9c27db.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4cd539b8153216f80b26729a35ad4cd04a9c27db.md new file mode 100644 index 0000000..300343b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4cd539b8153216f80b26729a35ad4cd04a9c27db.md @@ -0,0 +1,151 @@ +# Creating the initial model + +# Creating the initial model # + +Parties can create and save the initial model before training by following a set of examples\. + + + + * [Save the Tensorflow model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-models.html?context=cdpaas&locale=en#tf-config) + * [Save the Scikit\-learn model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-models.html?context=cdpaas&locale=en#sklearn-config) + * [Save the Pytorch model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-models.html?context=cdpaas&locale=en#pytorch) + + + +Consider the configuration examples that match your model type\. + +## Save the Tensorflow model ## + + import tensorflow as tf + from tensorflow.keras import * + from tensorflow.keras.layers import * + import numpy as np + import os + + class MyModel(Model): + def __init__(self): + super(MyModel, self).__init__() + self.conv1 = Conv2D(32, 3, activation='relu') + self.flatten = Flatten() + self.d1 = Dense(128, activation='relu') + self.d2 = Dense(10) + + def call(self, x): + x = self.conv1(x) + x = self.flatten(x) + x = self.d1(x) + return self.d2(x) + + # Create an instance of the model + + model = MyModel() + loss_object = tf.keras.losses.SparseCategoricalCrossentropy( + from_logits=True) + optimizer = tf.keras.optimizers.Adam() + acc = tf.keras.metrics.SparseCategoricalAccuracy(name='accuracy') + model.compile(optimizer=optimizer, loss=loss_object, metrics=[acc]) + img_rows, img_cols = 28, 28 + input_shape = (None, img_rows, img_cols, 1) + model.compute_output_shape(input_shape=input_shape) + + dir = "./model_architecture" + if not os.path.exists(dir): + os.makedirs(dir) + + model.save(dir) + +If you choose Tensorflow as the model framework, you need to save a Keras model as the `SavedModel` format\. A Keras model can be saved in `SavedModel` format by using `tf.keras.model.save()`\. + +To compress your files, run the command `zip -r mymodel.zip model_architecture`\. The contents of your `.zip` file must contain: + + mymodel.zip + └── model_architecture + ├── assets + ├── keras_metadata.pb + ├── saved_model.pb + └── variables + ├── variables.data-00000-of-00001 + └── variables.index + +## Save the Scikit\-learn model ## + + + + * [SKLearn classification](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-models.html?context=cdpaas&locale=en#sk-class) + * [SKLearn regression](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-models.html?context=cdpaas&locale=en#sk-reg) + * [SKLearn Kmeans](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-models.html?context=cdpaas&locale=en#sk-k) + + + +### SKLearn classification ### + + # SKLearn classification + + from sklearn.linear_model import SGDClassifier + import numpy as np + import joblib + + model = SGDClassifier(loss='log', penalty='l2') + model.classes_ = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) + # You must specify the class label for IBM Federated Learning using model.classes. Class labels must be contained in a numpy array. + # In the example, there are 10 classes. + + joblib.dump(model, "./model_architecture.pickle") + +### SKLearn regression ### + + # Sklearn regression + + from sklearn.linear_model import SGDRegressor + import pickle + + model = SGDRegressor(loss='huber', penalty='l2') + + with open("./model_architecture.pickle", 'wb') as f: + pickle.dump(model, f) + +### SKLearn Kmeans ### + + # SKLearn Kmeans + from sklearn.cluster import KMeans + import joblib + + model = KMeans() + joblib.dump(model, "./model_architecture.pickle") + +You need to create a `.zip` file that contains your model in pickle format by running the command `zip mymodel.zip model_architecture.pickle`\. The contents of your `.zip` file must contain: + + mymodel.zip + └── model_architecture.pickle + +## Save the PyTorch model ## + + import torch + import torch.nn as nn + + model = nn.Sequential( + nn.Flatten(start_dim=1, end_dim=-1), + nn.Linear(in_features=784, out_features=256, bias=True), + nn.ReLU(), + nn.Linear(in_features=256, out_features=256, bias=True), + nn.ReLU(), + nn.Linear(in_features=256, out_features=256, bias=True), + nn.ReLU(), + nn.Linear(in_features=256, out_features=100, bias=True), + nn.ReLU(), + nn.Linear(in_features=100, out_features=50, bias=True), + nn.ReLU(), + nn.Linear(in_features=50, out_features=10, bias=True), + nn.LogSoftmax(dim=1), + ).double() + + torch.save(model, "./model_architecture.pt") + +You need to create a `.zip` file containing your model in pickle format\. Run the command `zip mymodel.zip model_architecture.pt`\. The contents of your `.zip` file should contain: + + mymodel.zip + └── model_architecture.pt + +**Parent topic:**[Creating a Federated Learning experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-start.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4d299efff5b982097a5b9d48ea16041e4820a8bb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4d299efff5b982097a5b9d48ea16041e4820a8bb.md new file mode 100644 index 0000000..d406071 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4d299efff5b982097a5b9d48ea16041e4820a8bb.md @@ -0,0 +1,20 @@ +# Derive node (SPSS Modeler) + +# Derive node # + +One of the most powerful features in watsonx\.ai is the ability to modify data values and derive new fields from existing data\. During lengthy data mining projects, it is common to perform several derivations, such as extracting a customer ID from a string of Web log data or creating a customer lifetime value based on transaction and demographic data\. All of these transformations can be performed, using a variety of field operations nodes\. + +Several nodes provide the ability to derive new fields: + + + + * The Derive node modifies data values or creates new fields from one or more existing fields\. It creates fields of type formula, flag, nominal, state, count, and conditional\. + * The Reclassify node transforms one set of categorical values to another\. Reclassification is useful for collapsing categories or regrouping data for analysis\. + * The Binning node automatically creates new nominal (set) fields based on the values of one or more existing continuous (numeric range) fields\. For example, you can transform a continuous income field into a new categorical field containing groups of income as deviations from the mean\. After you create bins for the new field, you can generate a Derive node based on the cut points\. + * The Set to Flag node derives multiple flag fields based on the categorical values defined for one or more nominal fields\. + * The Restructure node converts a nominal or flag field into a group of fields that can be populated with the values of yet another field\. For example, given a field named `payment type`, with values of `credit`, `cash`, and `debit`, three new fields would be created (`credit`, `cash`, `debit`), each of which might contain the value of the actual payment made\. + + + +Tip: The Control Language for Expression Manipulation (CLEM) is a powerful tool you can use to analyze and manipulate the data used in your flows\. For example, you might use CLEM in a node to derive values\. For more information, see the [CLEM (legacy) language reference](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_language_reference.html)\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4d8b25691c26b2ba05f7e8a96b99fd3f15a124c6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4d8b25691c26b2ba05f7e8a96b99fd3f15a124c6.md new file mode 100644 index 0000000..9101d04 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4d8b25691c26b2ba05f7e8a96b99fd3f15a124c6.md @@ -0,0 +1,30 @@ +# Looping through nodes + +# Looping through nodes # + +You can use a `for` loop to loop through all the nodes in a flow\. For example, the following two script examples loop through all nodes and change field names in any Filter nodes to uppercase\. + +You can use this script in any flow that contains a Filter node, even if no fields are actually filtered\. Simply add a Filter node that passes all fields in order to change field names to uppercase across the board\. + + # Alternative 1: using the data model nameIterator() function + stream = modeler.script.stream() + for node in stream.iterator(): + if (node.getTypeName() == "filter"): + # nameIterator() returns the field names + for field in node.getInputDataModel().nameIterator(): + newname = field.upper() + node.setKeyedPropertyValue("new_name", field, newname) + + # Alternative 2: using the data model iterator() function + stream = modeler.script.stream() + for node in stream.iterator(): + if (node.getTypeName() == "filter"): + # iterator() returns the field objects so we need + # to call getColumnName() to get the name + for field in node.getInputDataModel().iterator(): + newname = field.getColumnName().upper() + node.setKeyedPropertyValue("new_name", field.getColumnName(), newname) + +The script loops through all nodes in the current flow, and checks whether each node is a Filter\. If so, the script loops through each field in the node and uses either the `field.upper()` or `field.getColumnName().upper()` function to change the name to uppercase\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4dd17198b8e7413469c1837ffdbaf109b307078c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4dd17198b8e7413469c1837ffdbaf109b307078c.md new file mode 100644 index 0000000..f6e955d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4dd17198b8e7413469c1837ffdbaf109b307078c.md @@ -0,0 +1,99 @@ +# Promoting assets to a deployment space + +# Promoting assets to a deployment space # + +Learn about how to promote assets from a project to a deployment space and the requirements for promoting specific asset types\. + +## Promoting assets to your deployment space ## + +You can promote assets from your project to a deployment space\. For a list of assets that can be promoted from a project to a deployment space, refer to [Adding assets to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets-all.html)\. When you are promoting assets, you can: + + + + * Choose an existing space or create a new one\. + * Add tags to help identify the promoted asset\. + * Choose dependent assets to promote them at the same time\. + + + +Follow these steps to promote your assets to your deployment space: + + + +1. From your project, go to the **Assets** tab\. +2. Select the **Options** (![Options icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png)) icon and click **Promote to space**\. + + + +Tip: If the asset that you want to promote is a model, you can also click the model name to open the model details page, and then click Promote to deployment space\. + +**Notes:** + + + + * Promoting assets and their dependencies from a project to a space by using the Watson Studio user interface is the recommended method to guarantee that the promotion flow results in a complete asset definition\. For example, relying on the [Watson Data API](https://cloud.ibm.com/apidocs/watson-data-api-cpd) to manage the promotion flow of an asset, together with its dependencies, can result in the promoted asset from being inaccessible from the space\. + * Promoting assets from default Git\-based projects is not supported\. + * Depending on your configuration and the type of asset that you promote, large asset attachments, typically more than 2 GB, can cause the promotion action to time out\. + + + +For more information, see: + + + + * [Promoting connections and connected data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-promote-assets.html?context=cdpaas&locale=en#promo-conn) + * [Promoting models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-promote-assets.html?context=cdpaas&locale=en#promo-model) + * [Promoting notebooks and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-promote-assets.html?context=cdpaas&locale=en#promo-nbs) + + + +## Promoting connections and connected data ## + +When you promote a connection that uses personal credentials or Cloud Pak for Data authentication to a deployment space, the credentials are not promoted\. You must provide the credentials information again or allow Cloud Pak for Data authentication\. Because Storage Volume connections support only personal credentials, to be able to use this type of asset after it is promoted to a space, you must provide the credentials again\. + +Some types of connections allow for using your personal platform credentials\. If you promote a connection or connected data that uses your personal platform credentials, tick the *Use my platform login credentials* checkbox\. + +Although you can promote any kind of data connection to a space, where you can use the connection is governed by factors such as model and deployment type\. For example, you can access any of the connected data by using a script\. However, in batch deployments you are limited to particular types of data, as listed in [Creating a batch deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-details.html)\. + +## Promoting models ## + +When you promote a model to a space: + + + + * Components that are required for a successful deployment, such as a custom software specification, model definition, or pipeline definition are automatically promoted as well\. + * The data assets that were used to train the model are not promoted with it\. Information on data assets used to train the model is included in model metadata\. + + + +## Promoting notebooks and scripts ## + +Tip: If you are using the Notebook editor, you must save a version of the notebook before you can promote it\. + + + + * If you created a job for a notebook and you selected **Log and updated version** as the job run result output, the notebook cannot be promoted to a deployment space\. + * If you are working in a notebook that you created before IBM Cloud Pak for Data 4\.0, and you want to promote this notebook to a deployment space, follow these steps to enable promoting it: + + + + 1. Save a new version of the notebook. + 2. Select the newly created version. + 3. Select either **Log and notebook** or **Log only** as the job run result output under **Advanced configuration**. + 4. Run your job again. + + Now you can promote it manually from the project **Assets** page or programmatically by using CPDCTL commands. + + + + + + + + * If you want to promote a notebook programmatically, use CPDCTL commands to move the notebook or script to a deployment space\. To learn how to use CPDCTL to move notebooks or scripts to spaces, refer to [CPDCTL code samples](https://github.com/IBM/cpdctl/tree/master/samples)\. For the reference guide, refer to [CPDCTL command reference](https://github.com/IBM/cpdctl/blob/master/README_command_reference.md#notebook_promote)\. + + + +**Parent topic:**[Assets in deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets-all.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4deafac111cf37f37a2f20cff35606827d940390.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4deafac111cf37f37a2f20cff35606827d940390.md new file mode 100644 index 0000000..a4fcda1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4deafac111cf37f37a2f20cff35606827d940390.md @@ -0,0 +1,48 @@ +# linearnode properties + +# linearnode properties # + +![Linear node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/alm_nodeicon.png)Linear regression models predict a continuous target based on linear relationships between the target and one or more predictors\. + + + +linearnode properties + +Table 1\. linearnode properties + +| `linearnode` Properties | Values | Property description | +| ---------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `target` | *field* | Specifies a single target field\. | +| `inputs` | \[*field1 \.\.\. fieldN*\] | Predictor fields used by the model\. | +| `continue_training_existing_model` | *flag* | | +| `objective` | `Standard`
`Bagging`
`Boosting`
`psm` | `psm` is used for very large datasets, and requires a server connection\. | +| `use_auto_data_preparation` | *flag* | | +| `confidence_level` | *number* | | +| `model_selection` | `ForwardStepwise`
`BestSubsets`
`None` | | +| `criteria_forward_stepwise` | `AICC`
`Fstatistics`
`AdjustedRSquare`
`ASE` | | +| `probability_entry` | *number* | | +| `probability_removal` | *number* | | +| `use_max_effects` | *flag* | | +| `max_effects` | *number* | | +| `use_max_steps` | *flag* | | +| `max_steps` | *number* | | +| `criteria_best_subsets` | `AICC`
`AdjustedRSquare`
`ASE` | | +| `combining_rule_continuous` | `Mean`
`Median` | | +| `component_models_n` | *number* | | +| `use_random_seed` | *flag* | | +| `random_seed` | *number* | | +| `use_custom_model_name` | *flag* | | +| `custom_model_name` | *string* | | +| `use_custom_name` | *flag* | | +| `custom_name` | *string* | | +| `tooltip` | *string* | | +| `keywords` | *string* | | +| `annotation` | *string* | | +| `perform_model_effect_tests` | *boolean* | Perform model effect tests for each regression effect\. | +| `confidence_level` | *double* | This is the interval of confidence used to compute estimates of the model coefficients\. Specify a value greater than 0 and less than 100\. The default is 95\. | +| `probability_entry` | *double* | If F Statistics is chosen as the criterion, then at each step the effect that has the smallest p\-value less than the specified threshold is added to the model (include effects with p\-values less than)\. The default is 0\.05\. | +| `probability_removal` | *double* | Any effects in the model with a p\-value greater than the specified threshold are removed (remove effects with p\-values greater than)\. The default is 0\.10\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4e571695fb4e12489157704d87f89df5dad1a580.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4e571695fb4e12489157704d87f89df5dad1a580.md new file mode 100644 index 0000000..5194fb9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4e571695fb4e12489157704d87f89df5dad1a580.md @@ -0,0 +1,9 @@ +# Field Operations nodes (SPSS Modeler) + +# Field Operations # + +After an initial data exploration, you will probably need to select, clean, or construct data in preparation for analysis\. The Field Operations palette contains many nodes useful for this transformation and preparation\. + +For example, using a Derive node, you might create an attribute that is not currently represented in the data\. Or you might use a Binning node to recode field values automatically for targeted analysis\. You will probably find yourself using a Type node frequently—it allows you to assign a measurement level, values, and a modeling role for each field in the dataset\. Its operations are useful for handling missing values and downstream modeling\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4e83416b551f557d5bda600450e6ccb7742eb51d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4e83416b551f557d5bda600450e6ccb7742eb51d.md new file mode 100644 index 0000000..07c157c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4e83416b551f557d5bda600450e6ccb7742eb51d.md @@ -0,0 +1,151 @@ +# Quick start: Prompt a foundation model with the retrieval-augmented generation pattern + +# Quick start: Prompt a foundation model with the retrieval\-augmented generation pattern # + +Take this tutorial to learn how to use foundation models in IBM watsonx\.ai to generate factually accurate output grounded in information in a knowledge base by applying the retrieval\-augmented generation pattern\. Foundation models can generate output that is factually inaccurate for a variety of reasons\. One way to improve the accuracy of generated output is to provide the needed facts as context in your prompt text\. This tutorial uses a sample notebook using the retrieval\-augmented generation pattern method to improve the accuracy of the generated output\. + +**Required services** : Watson Studio : Watson Machine Learning + +Your basic workflow includes these tasks: + + + +1. Open a project\. Projects are where you can collaborate with others to work with data\. +2. Add a notebook to your project\. You can create your own notebook, or add a [sample notebook](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=notebook) to your project\. +3. Add and edit code, then run the notebook\. +4. Review the notebook output\. + + + +## Read about retrieval\-augmented generation pattern ## + +You can scale out the technique of including context in your prompts by leveraging information in a knowledge base\. The retrieval\-augmented generation pattern involves three basic steps: + + + + * Search for relevant content in your knowledge base + * Pull the most relevant content into your prompt as context + * Send the combined prompt text to the model to generate output + + + +[Read more about the retrieval\-augmented generation pattern](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-rag.html?context=wx) + +## Watch a video about using the retrieval\-augmented generation pattern ## + +![Watch Video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) Watch this video to preview the steps in this tutorial\. There might be slight differences in the user interface shown in the video\. The video is intended to be a companion to the written tutorial\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Try a tutorial to prompt a foundation model with the retrieval\-augmented generation pattern ## + +In this tutorial, you will complete these tasks: + + + + * [Task 1: Open a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html?context=cdpaas&locale=en#step01) + * [Task 2: Add a sample notebook to your project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html?context=cdpaas&locale=en#step02) + * [Task 3: Edit the notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html?context=cdpaas&locale=en#step03) + * [Task 4: Run the notebook and review the output](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html?context=cdpaas&locale=en#step04) + + + +Expand all sections + + + + * Tips for completing this tutorial + + \#\#\# Use the video picture-in-picture Tip: Start the video, then as you scroll through the tutorial, the video moves to picture-in-picture mode. Close the video table of contents for the best experience with picture-in-picture. You can use picture-in-picture mode so you can follow the video as you complete the tasks in this tutorial. Click the timestamps for each task to follow along.The following animated image shows how to use the video picture-in-picture and table of contents features: ![How to use picture-in-picture and chapters](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/pip-and-chapters.gif)\{: width="560px" height="315px" data-tearsheet="this"\} \#\#\# Get help in the community If you need help with this tutorial, you can ask a question or find an answer in the [watsonx.ai Community discussion forum](https://community.ibm.com/community/user/watsonx/communities/community-home/digestviewer?communitykey=81927b7e-9a92-4236-a0e0-018a27c4ad6e)\{: new\_window\}. \#\#\# Set up your browser windows For the optimal experience completing this tutorial, open Cloud Pak for Data in one browser window, and keep this tutorial page open in another browser window to switch easily between the two applications. Consider arranging the two browser windows side-by-side to make it easier to follow along. ![Side-by-side tutorial and UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/tutorial-side-by-side-wx.png)\{: width="560px" height="315px" data-tearsheet="this"\} Tip: If you encounter a guided tour while completing this tutorial in the user interface, click **Maybe later**. + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 1: Open a project + + You need a project to store the sample notebook. Watch a video to see how to create a sandbox project and associate a service. Then follow the steps to verify that you have an existing project or create a sandbox project. + + This video provides a visual method to learn the concepts and tasks in this documentation. + + Follow the steps to verify that you have an existing project or create a project. 1. From the watsonx home screen, scroll to the *Projects* section. If you see any projects listed, then skip to [Associate the Watson Machine Learning service](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html?context=cdpaas&locale=en#associate). If you don't see any projects, then follow these steps to create a project. 1. Click **Create a sandbox project**. When the project is created, you will see the sandbox in the *Projects* section. 1. Open an existing project or the new sandbox project. \#\#\# Associate the Watson Machine Learning service with the project You will use Watson Machine Learning to prompt the foundation model, so follow these steps to associate your Watson Machine Learning service instance with your project. 1. In the project, click the **Manage** tab. 1. Click the **Services & Integrations** page. 1. Check if this project has an associated Watson Machine Learning service. If there is no associated service, then follow these steps: 1. Click **Associate service**. 1. Check the box next to your **Watson Machine Learning** service instance. 1. Click **Associate**. 1. If necessary, click **Cancel** to return to the *Services & Integrations* page. For more information or to watch a video, see [Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html)\{: new\_window\}. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the *Manage* tab with the associated service. You are now ready to add the sample notebook to your project. + + ![Manage tab in the project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-fm-associated-service.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 2: Add the sample notebook to your project + + The sample notebook uses a small knowledge base and a simple search component to demonstrate the basic pattern. The scenario used in this notebook is for a company that sells seeds for planting in a garden. The website for an online seed catalog has many articles to help customers plan their garden and ultimately select which seeds to purchase. The new widge is being added to the website to answer customer questions on the contents of the articles. Watch this video to see how to add a sample notebook to a project, and then follow the steps to add the notebook to your project. + + This video provides a visual method to learn the concepts and tasks in this documentation. + + 1. Access the [Simple introduction to retrieval-augmented generation with watsonx.ai](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/fed7cf6b-1c48-4d71-8c04-0fce0e000d43)\{: new\_window\} in the *Samples*. 1. Click **Add to project**. 1. Select your project from the list, and click **Add**. 1. Type the notebook name and description (optional). 1. Select a runtime environment for this notebook. 1. Click **Create**. Wait for the notebook editor to load. 1. From the menu, click **Kernel > Restart & Clear Output**, then confirm by clicking **Restart and Clear All Outputs** to clear the output from the last saved run. + For more information on associated services, see [Adding associated services](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assoc-services.html)\{: new\_window\}. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the notebook open in Edit mode. Now you are ready to set up the prerequisites for running the notebook. + + ![Notebook open in Edit mode](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-fm-notebook-begin.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 3: Edit the notebook + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:57. Before you can run the notebook, you need to set up the environment. Follow these steps to verify the notebook prerequisites: 1. Scroll to the *For IBM watsonx on IBM Cloud* section in the notebook to see the two prerequisites to run the notebook. 1. Under the *Create an IBM Cloud API key* section, you need to pass your credentials to the Watson Machine Learning API using an API key. If you don't already have a saved API key, then follow these steps to create an API key. + 1. Access the [IBM Cloud console API keys page](https://cloud.ibm.com/iam/apikeys)\{: new\_window\}. 1. Click **Create an IBM Cloud API key**. If you have any existing API keys, the button may be labelled **Create**. 1. Type a name and description. 1. Click **Create**. 1. **Copy** the API key. 1. Download the API key for future use. 1. Review the *Associate an instance of the Watson Machine Learning service with the current project* section. You completed this prerequisite in [Task 1](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html?context=cdpaas&locale=en#step01). 1. Scroll to the *Run the cell to provide the IBM Cloud API key* section: 1. Click the **Run** icon ![Run icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook-run.png)\{: iih\} to run the cell. 1. Paste the API key, and press `Enter`. 1. Under *Run the cell to set the credentials for IBM watsonx on IBM Cloud*, click the **Run** icon ![Run icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook-run.png)\{: iih\} to run the cell and set the credentials. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following images shows the notebook with the prerequisites completed. Now you are ready to run the notebook and review the output. + + ![Notebook with the prerequisites completed](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-fm-notebook-apikey.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 4: Run the notebook and review the output + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 01:03. The sample notebook includes information about the retrieval-augmented generation and how you can adapt the notebook for your specific use case. Follow these steps to run the notebook and review the output: 1. Scroll to the *Step 2: Create a Knowledge Base* section in the notebook: 1. Click the **Run** icon ![Run icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook-run.png)\{: iih\} for each of the three cells in that section. 1. Review the output for the three cells in the section. The code in these cells sets up the knowledge base as a collection of two articles. These articles were written as samples for watsonx.ai, they are not real articles published anywhere else. The authors and publication dates are fictional. 1. Scroll to the *Step 3: Build a simple search component* section in the notebook: 1. Click the **Run** icon ![Run icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook-run.png)\{: iih\} for each of the two cells in that section. 1. Review the output for the two cells in the section. The code in these cells builds a simple search component. Many articles that discuss retrieval-augmented generation assume the retrieval component uses a vector database. However, to perform the general retrieval-augmented generation pattern, any search-and-retrieve method that can reliably return relevant content from the knowledge base will do. In this notebook, the search component is a trivial search function that returns the index of one or the other of the two articles in the knowledge base, based on a simple regular expression match. 1. Scroll to the *Step 4: Craft prompt text* section in the notebook: 1. Click the **Run** icon ![Run icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook-run.png)\{: iih\} for each of the two cells in that section. 1. Review the output for the two cells in the section. The code in these cells crafts the prompt text. There is no one, best prompt for any given task. However, models that have been instruction-tuned, such as bigscience/mt0-xxl-13b, google/flan-t5-xxl-11b, or google/flan-ul2-20b, can generally perform this task with a sample prompt. Conservative decoding methods tend towards succinct answers. In the prompt, notice two string placeholders (marked with %s) that will be replaced at generation time: - The first placeholder will be replaced with the text of the relevant article from the knowledge base - The second placeholder will be replaced with the question to be answered 1. Scroll to the *Step 5: Generate output using the foundation models Python library* section in the notebook: 1. Click the **Run** icon ![Run icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook-run.png)\{: iih\} for each of the three cells in that section. 1. Review the output for the three cells in the section. The code in these cells generates output by using the Python library. You can prompt foundation models in watsonx.ai programmatically using the Python library. For more information about the library, see the following topics: - [Introduction to the foundation models Python library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-python-lib.html?context=wx)\{: new\_window\} - [Foundation models Python library reference](https://ibm.github.io/watson-machine-learning-sdk/foundation_models.html)\{: new\_window\} 1. Scroll to the *Step 6: Pull everything together to perform retrieval-augmented generation* section in the notebook: 1. Click the **Run** icon ![Run icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook-run.png)\{: iih\} for each of the two cells in that section. This code pulls everything together to perform retrieval-augmented generation. 1. Review the output for the first cell in the section. The code in this cell sets up the user input elements. 1. For the second cell in the section, type a question related to tomatoes or cucumbers to see the answer and the source. For example, `Do I use mulch with tomatoes?`. 1. Review the answer to your question. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the completed notebook. + + ![The completed notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-fm-notebook-complete.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html?context=cdpaas&locale=en#video-preview) + + + +## Next steps ## + + + + * ![Watch Video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) Watch the video beginning at 02:55 to learn about considerations for applying the retrieval\-augmented generation pattern to a production solution\. + * Try the [Prompt a foundation model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html) tutorial using Prompt Lab\. + + + +## Additional resources ## + + + + * [Foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html) + * [Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) + * [Python library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-python-lib.html) + * View more [videos](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html)\. + * Find sample data sets, projects, models, prompts, and notebooks in the Samples to gain hands\-on experience: + + ![Notebook icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook.svg)[Notebooks](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=notebook) that you can add to your project to get started analyzing data and building models. + + ![Project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/ibm-cloud--projects.svg)[Projects](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=project-template) that you can import containing notebooks, data sets, prompts, and other assets. + + ![Data set icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/data--set.svg)[Data sets](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=dataset) that you can add to your project to refine, analyze, and build models. + + ![Prompt icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/prompt.svg)[Prompts](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=example-prompt) that you can use in the Prompt Lab to prompt a foundation model. + + ![Model icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/model.svg)[Foundation models](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=foundation-model) that you can use in the Prompt Lab. + + + +**Parent topic:**[Quick start tutorials](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4ef4409d11dd4d5360d711eea8e1e71dac4c0bd7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4ef4409d11dd4d5360d711eea8e1e71dac4c0bd7.md new file mode 100644 index 0000000..8eca3e5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4ef4409d11dd4d5360d711eea8e1e71dac4c0bd7.md @@ -0,0 +1,29 @@ +# Enterprise security + +# Enterprise security # + +An enterprise is a hierarchy of IBM Cloud accounts that contains a parent account at the highest level with child account groups as the middle level and optional individual accounts that you can add at the lowest level\. To provide security between the levels of accounts, enterprises isolate user and access management between the enterprise account and its child accounts\. + +The users and their assigned access in the enterprise account are entirely separate from users in the child accounts, and no access is inherited between the two types of accounts\. User and access management in each enterprise and each account is entirely separate and must be managed by the account owner or a user given the Administrator role in the specific account\. + +Resources and services within an enterprise function the same as in stand\-alone accounts\. Each account in an enterprise can contain resource groups that manage access to multiple resources\. For account security and how to use resource groups, see [IBM Cloud account security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-account.html)\. + +## Use cases ## + +The user lists for each account are only visible to the users who are invited to that account\. Just because a user is invited and given access to manage the entire enterprise, it doesn't mean that they can view the users who are invited to each child account\. + +Both user management and access management are entirely separate in each account and in the enterprise itself\. This separation means that users who manage your enterprise can't access account resources within the child accounts unless you specifically enable them to\. For example, your financial officer can have the Administrator role on the Billing account management service within the enterprise account\. The financial officer must be invited to a child account with the appropriate access rights to view offers or update spending limits for the child account\. + +![Role inheritance for enterprises](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/enterprise_role_hierarchy.svg) + +## Learn more ## + +For an overview of enterprise accounts, see [IBM Cloud docs: What is an enterprise?](https://cloud.ibm.com/docs/account?topic=account-what-is-enterprise) + +For step\-by\-step instructions for setting up an enterprise hierarchy of accounts, see [IBM Cloud docs: Setting up an enterprise](https://cloud.ibm.com/docs/account?topic=account-enterprise-tutorial) + +For tips for setting up an enterprise, see [IBM Cloud docs: Best practices for setting up an enterprise](https://cloud.ibm.com/docs/account?topic=account-enterprise-best-practices) + +**Parent topic:**[Security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4f0098ce544ba8ac594f98af8df26b7911399750.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4f0098ce544ba8ac594f98af8df26b7911399750.md new file mode 100644 index 0000000..13add8c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4f0098ce544ba8ac594f98af8df26b7911399750.md @@ -0,0 +1,7 @@ +# hdbscannugget properties + +# hdbscannugget properties # + +You can use the HDBSCAN node to generate an HDBSCAN model nugget\. The scripting name of this model nugget is `hdbscannugget`\. No other properties exist for this model nugget\. For more information on scripting the modeling node itself, see [hdbscannode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/hdbscannodeslots.html#hdbscannodeslots)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4f733928b0f749ffddf2e6daef646a0524c54d67.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4f733928b0f749ffddf2e6daef646a0524c54d67.md new file mode 100644 index 0000000..baff768 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4f733928b0f749ffddf2e6daef646a0524c54d67.md @@ -0,0 +1,22 @@ +# Evaluation node (SPSS Modeler) + +# Evaluation node # + +The Evaluation node offers an easy way to evaluate and compare predictive models to choose the best model for your application\. Evaluation charts show how models perform in predicting particular outcomes\. They work by sorting records based on the predicted value and confidence of the prediction, splitting the records into groups of equal size (quantiles), and then plotting the value of the business criterion for each quantile, from highest to lowest\. Multiple models are shown as separate lines in the plot\. + +Outcomes are handled by defining a specific value or range of values as a hit\. Hits usually indicate success of some sort (such as a sale to a customer) or an event of interest (such as a specific medical diagnosis)\. You can define hit criteria under the OPTIONS section of the node properties, or you can use the default hit criteria as follows: + + + + * Flag output fields are straightforward; hits correspond to true values\. + * For Nominal output fields, the first value in the set defines a hit\. + * For Continuous output fields, hits equal values greater than the midpoint of the field's range\. + + + +There are six types of evaluation charts, each of which emphasizes a different evaluation criterion\. + +Evaluation charts can also be cumulative, so that each point equals the value for the corresponding quantile plus all higher quantiles\. Cumulative charts usually convey the overall performance of models better, whereas noncumulative charts often excel at indicating particular problem areas for models\. + +Note: The Evaluation node doesn't support the use of commas in field names\. If you have field names containing commas, you must either remove the commas or surround the field name in quotes\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4f89e6b2b76e64b9618f799611dd1b053d045222.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4f89e6b2b76e64b9618f799611dd1b053d045222.md new file mode 100644 index 0000000..2f8c36f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/4f89e6b2b76e64b9618f799611dd1b053d045222.md @@ -0,0 +1,55 @@ +# Batch deployment input details for Python functions + +# Batch deployment input details for Python functions # + +Follow these rules when you are specifying input details for batch deployments of Python functions\. + +Data type summary table: + + + +| Data | Description | +| ------------ | ----------- | +| Type | inline | +| File formats | N/A | + + + +You can deploy Python functions in Watson Machine Learning the same way that you can deploy models\. Your tools and apps can use the Watson Machine Learning Python client or REST API to send data to your deployed functions in the same way that they send data to deployed models\. Deploying functions gives you the ability to: + + + + * Hide details (such as credentials) + * Preprocess data before you pass it to models + * Handle errors + * Include calls to multiple models All of these actions take place within the deployed function, instead of in your application\. + + + +## Data sources ## + +If you are specifying input/output data references programmatically: + + + + * Data source reference `type` depends on the asset type\. Refer to the **Data source reference types** section in [Adding data assets to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + + + +**Notes:** + + + + * For connections of type [Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html) or [Cloud Object Storage (infrastructure)](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos-infra.html), you must configure **Access key** and **Secret key**, also known as [HMAC credentials](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-uhc-hmac-credentials-main)\. + * The environment variables parameter of deployment jobs is not applicable\. + * Make sure that the output is structured to match the output schema that is described in [Execute a synchronous deployment prediction](https://cloud.ibm.com/apidocs/machine-learning#deployments-compute-predictions)\. + + + +## Learn more ## + +[Deploying Python functions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function.html)\. + +**Parent topic:**[Batch deployment input details by framework](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-by-framework.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5042fbfb0c15aeded02ff805c4869ac838910c7a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5042fbfb0c15aeded02ff805c4869ac838910c7a.md new file mode 100644 index 0000000..fb3b2f6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5042fbfb0c15aeded02ff805c4869ac838910c7a.md @@ -0,0 +1,127 @@ +# AutoAI glossary + +# AutoAI glossary # + +Learn terms and concepts that are used in AutoAI for building and deploying machine learning models\. + +**aggregate score** +The aggregation of the four anomaly types: level shift, trend, localized extreme, variance\. A higher score indicates a stronger score\. + +**algorithm** +A formula applied to data to determine optimal ways to solve analytical problems\. + +**anomaly prediction** +An AutoAI time\-series model that can predict anomalies, or unexpected results, against new data\. + +**AutoAI experiment** +An automated training process that considers a series of training definitions and parameters to create a set of ranked pipelines as model candidates\. + +**batch employment** +Processes input data from a file, data connection, or connected data in a storage bucket and writes the output to a selected destination\. + +**bias detection (machine learning)** +To identify imbalances in the training data or prediction behavior of the model\. + +**binary classification** +A classification model with two classes and only assigns samples into one of the two classes\. + +**classification model** +A predictive model that predicts data in distinct categories\. + +**confusion matrix** +A performance measurement that determines the accuracy between a model’s positive and negative predicted outcomes to positive and negative actual outcomes\. + +**cross validation** +A technique that tests the effectiveness of machine learning models\. It is also used as a resampling procedure for models with limited data\. + +**data imputation** +Substituting missing values in a data set with estimated values\. + +**exogenous features** +Features that can influence the prediction model but cannot be influenced in return\. See also: Supporting features + +**fairness** +Determines whether a model produces biased outcomes that favor a monitored group over a reference group\. Fairness evaluations detect if the model shows a tendency to provide a favorable or preferable outcome more often for one group over another\. Typical categories to monitor are age, sex, and race\. + +**feature correlation** +The relationship between two features\. For example, postal code might have a strong correlation with income in some models\. + +**feature encoding** +Transforming categorical values into numerical values\. + +**feature importance** +The relative impact a particular column or feature has on the model's prediction or forecast\. + +**feature scaling** +Normalizing the range of independent variables or features in a data set\. + +**feature selection** +Identifying the columns of data that best support an accurate prediction or score\. + +**feature transformation** +In AutoAI, a phase of pipeline creation that applies algorithms to transform and optimize the training data to achieve the best outcome for the model type\. + +**holdout data** +Data used to test or validate the model's performance\. Holdout data can be a reserved portion of the training data, or it can be a separate file\. + +**hyperparameter optimization (HPO)** +The process for setting hyperparameter values to the settings that provide the most accurate model\. + +**incremental learning** +The process of training a model that uses data that is continually updated without forgetting data that is obtained from the preceding tasks\. + +**large tabular data** +Structured data that exceeds the limit on standard processing and must be processed in batches\. See incremental learning\. + +**labeled data** +Data that is labeled to identify the appropriate data vectors to be pulled in for model training\. + +**monitored group** +A class of data monitored to determine whether the results differ significantly from the results of the reference group\. For example, in a credit app, you might monitor applications in a particular age range and compare results to the age range more likely to recieve a positive outcome to evaluate whether there might be bias in the results\. + +**multiclass classification model** +A classification task with more than two classes\. For example, where a binary classification model predicts *yes* or *no* values, a multi\-class model predicts *yes*, *no*, *maybe*, or *not applicable*\. + +**multivariate time series** +Time series experiment that contains two or more changing variables\. For example, a time series model that forecasts the electricity usage of three clients\. + +**optimized metric** +The metric used to measure the performance of the model\. For example, accuracy is the typical metric that is used to measure the performance of a binary classification model\. + +**pipeline (model candidate pipeline)** +End\-to\-end outline that illustrates the steos in a workflow\. + +**positive class** +The class that is related to your objective function\. + +**reference group** +A group that you identify as most likely to receive a positive result in a predictive model\. You can then compare the results to a monitored group to look for potential bias in outcomes\. + +**regression model** +A model that relates a dependent variable to one or more independent variable\. + +**scoring** +In machine learning, the process of measuring the confidence of a predicted outcome\. + +**supporting features** +Input features that can influence the prediction target\. See also: Exogenus features + +**text classification** +A model that automatically identifies and classifies text into distinct categories\. + +**time series model (AutoAI)** +A model that tracks data over time\. + +**trained model** +A model that is ready to be deployed\. + +**training** +The initial stage of model building, involving a subset of the source data\. The model can then be tested against a further, different subset for which the outcome is already known\. + +**training data** +Data used to teach and train a model's learning algorithm\. + +**univariate time series** +Time series experiment that contains only one changing variable\. For example, a time series model that forecasts the temperature has a single prediction column of the temperature\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5062008d59b761c5cf7f32f131021ea81a03b048.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5062008d59b761c5cf7f32f131021ea81a03b048.md new file mode 100644 index 0000000..d48a17f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5062008d59b761c5cf7f32f131021ea81a03b048.md @@ -0,0 +1,33 @@ +# timeplotnode properties + +# timeplotnode properties # + +![Time Plot node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/timeplotnodeicon.png)The Time Plot node displays one or more sets of time series data\. Typically, you would first use a Time Intervals node to create a *TimeLabel* field, which would be used to label the *x* axis\. + + + +timeplotnode properties + +Table 1\. timeplotnode properties + +| `timeplotnode` properties | Data type | Property description | +| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | +| `plot_series` | `Series``Models` | | +| `use_custom_x_field` | *flag* | | +| `x_field` | *field* | | +| `y_fields` | *list* | | +| `panel` | *flag* | | +| `normalize` | *flag* | | +| `line` | *flag* | | +| `points` | *flag* | | +| `point_type` | `Rectangle`
`Dot`
`Triangle`
`Hexagon`
`Plus`
`Pentagon`
`Star`
`BowTie`
`HorizontalDash`
`VerticalDash`
`IronCross`
`Factory`
`House`
`Cathedral`
`OnionDome`
`ConcaveTriangle``OblateGlobe`
`CatEye`
`FourSidedPillow`
`RoundRectangle`
`Fan` | | +| `smoother` | *flag* | You can add smoothers to the plot only if you set `panel` to `True`\. | +| `use_records_limit` | *flag* | | +| `records_limit` | *integer* | | +| `symbol_size` | *number* | Specifies a symbol size\. | +| `panel_layout` | `Horizontal``Vertical` | | +| `use_grid` | *boolean* | Display grid lines\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/50636405c61e0af7d2ee0ee31256c4cd0f6c5ded.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/50636405c61e0af7d2ee0ee31256c4cd0f6c5ded.md new file mode 100644 index 0000000..e6e9850 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/50636405c61e0af7d2ee0ee31256c4cd0f6c5ded.md @@ -0,0 +1,20 @@ +# PCA/Factor node (SPSS Modeler) + +# PCA/Factor node # + +The PCA/Factor node provides powerful data\-reduction techniques to reduce the complexity of your data\. Two similar but distinct approaches are provided\. + + + + * Principal components analysis (PCA) finds linear combinations of the input fields that do the best job of capturing the variance in the entire set of fields, where the components are orthogonal (perpendicular) to each other\. PCA focuses on all variance, including both shared and unique variance\. + * Factor analysis attempts to identify underlying concepts, or factors, that explain the pattern of correlations within a set of observed fields\. Factor analysis focuses on shared variance only\. Variance that is unique to specific fields is not considered in estimating the model\. Several methods of factor analysis are provided by the Factor/PCA node\. + + + +For both approaches, the goal is to find a small number of derived fields that effectively summarize the information in the original set of fields\. + +Requirements\. Only numeric fields can be used in a PCA\-Factor model\. To estimate a factor analysis or PCA, you need one or more fields with the role set to `Input` fields\. Fields with the role set to `Target`, `Both`, or `None` are ignored, as are non\-numeric fields\. + +Strengths\. Factor analysis and PCA can effectively reduce the complexity of your data without sacrificing much of the information content\. These techniques can help you build more robust models that execute more quickly than would be possible with the raw input fields\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/510bb82156702471c527d6ef7e51fe69ef746004.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/510bb82156702471c527d6ef7e51fe69ef746004.md new file mode 100644 index 0000000..a3f3f47 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/510bb82156702471c527d6ef7e51fe69ef746004.md @@ -0,0 +1,230 @@ +# Time series implementation details + +# Time series implementation details # + +These implementation details describe the stages and processing that are specific to an AutoAI time series experiment\. + +## Implementation details ## + +Refer to these implementation and configuration details for your time series experiment\. + + + + * [Time series stages](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries-details.html?context=cdpaas&locale=en#ts-stages) for processing an experiment\. + * [Time series optimizing metrics](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries-details.html?context=cdpaas&locale=en#ts-metrics) for tuning your pipelines\. + * [Time series algorithms](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries-details.html?context=cdpaas&locale=en#ts-algorithms) for building the pipelines\. + * [Supported date and time formats](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries-details.html?context=cdpaas&locale=en#ts-date-time)\. + + + +## Time series stages ## + +An AutoAI time series experiment includes these stages when an experiment runs: + + + +1. [Initialization](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries-details.html?context=cdpaas&locale=en#initialization) +2. [Pipeline selection](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries-details.html?context=cdpaas&locale=en#pipeline-selection) +3. [Model evaluation](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries-details.html?context=cdpaas&locale=en#model-eval) +4. [Final pipeline generation](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries-details.html?context=cdpaas&locale=en#final-pipeline) +5. [Backtest](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries-details.html?context=cdpaas&locale=en#backtest) + + + +### Stage 1: Initialization ### + +The initialization stage processes the training data, in this sequence: + + + + * Load the data + * Split the data set *L* into training data *T* and holdout data *H* + * Set the validation, timestamp column handling, and lookback window generation\. **Notes:** + + + + * The training data (*T*) is equal to the data set (*L*) minus the holdout (*H*). When you configure the experiment, you can adjust the size of the holdout data. By default, the size of the holdout data is 20 steps. + * You can optionally specify the timestamp column. + * By default, a lookback window is generated automatically by detecting the seasonal period by using signal processing method. However, if you have an idea of an appropriate lookback window, you can specify the value directly. + + + + + +### Stage 2: Pipeline selection ### + +The pipeline selection step uses an efficient method called *T\-Daub* (Time Series Data Allocation Using Upper Bounds)\. The method selects pipelines by allocating more training data to the most promising pipelines, while allocating less training data to unpromising pipelines\. In this way, not all pipelines see the complete set of data, and the selection process is typically faster\. The following steps describe the process overview: + + + +1. All pipelines are sequentially allocated several small subsets of training data\. The latest data is allocated first\. +2. Each pipeline is trained on every allocated subset of training data and evaluated with testing data (holdout data)\. +3. A linear regression model is applied to each pipeline by using the data set described in the previous step\. +4. The accuracy score of the pipeline is projected on the entire training data set\. This method results in a data set containing the accuracy and size of allocated data for each pipeline\. +5. The best pipeline is selected according to the projected accuracy and allotted rank 1\. +6. More data is allocated to the best pipeline\. Then, the projected accuracy is updated for the other pipelines\. +7. The prior two steps are repeated until the top *N* pipelines are trained on all the data\. + + + +### Stage 3: Model evaluation ### + +In this step, the winning pipelines *N* are retrained on the entire training data set *T*\. Further, they are evaluated with the holdout data *H*\. + +### Stage 4: Final pipeline generation ### + +In this step, the winning pipelines are retrained on the entire data set (*L*) and generated as the final pipelines\. + +As the retraining of each pipeline completes, the pipeline is posted to the leaderboard\. You can select to inspect the pipeline details or save the pipeline as a model\. + +### Stage 5: Backtest ### + +In the final step, the winning pipelines are retrained and evaluated by using the backtest method\. The following steps describe the backtest method: + + + +1. The training data length is determined based on the number of backtests, gap length, and holdout size\. To learn more about these parameters, see [Building a time series experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries.html)\. +2. Starting from the oldest data, the experiment is trained by using the training data\. +3. Further, the experiment is evaluated on the first validation data set\. If the gap length is non\-zero, any data in the gap is skipped over\. +4. The training data window is advanced by increasing the holdout size and gap length to form a new training set\. +5. A fresh experiment is trained with this new data and evaluated with the next validation data set\. +6. The prior two steps are repeated for the remaining backtesting periods\. + + + +## Time series optimization metrics ## + +Accept the default metric, or choose a metric to optimize for your experiment\. + + + +| Metric | Description | +| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Symmetric Mean Absolute Percentage Error (SMAPE) | At each fitted point, the absolute difference between actual value and predicted value is divided by half the sum of absolute actual value and predicted value\. Then, the average is calculated for all such values across all the fitted points\. | +| Mean Absolute Error (MAE) | Average of absolute differences between the actual values and predicted values\. | +| Root Mean Squared Error (RMSE) | Square root of the mean of the squared differences between the actual values and predicted values\. | +| R^2^ | Measure of how the model performance compares to the baseline model, or mean model\. The R^2^ must be equal or less than 1\. Negative R^2^ value means that the model under consideration is worse than the mean model\. Zero R^2^ value means that the model under consideration is as good or bad as the mean model\. Positive R^2^ value means that the model under consideration is better than the mean model\. | + + + +### Reviewing the metrics for an experiment ### + +When you view the results for a time series experiment, you see the values for metrics used to train the experiment in the pipeline leaderboard: + +![Reviewing experiment results](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-ts-results.png) + +You can see that the accuracy measures for time\-series experiments may vary widely, depending on the experiment data evaluated\. + + + + * Validation is the score calculated on training data\. + * Holdout is the score calculated on the reserved holdout data\. + * Backtest is the mean score from all backtests scores\. + + + +## Time series algorithms ## + +These algorithms are available for your time series experiment\. You can use the algorithms that are selected by default, or you can configure your experiment to include or exclude specific algorithms\. + + + +| Algorithm | Description | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| ARIMA | Autoregressive Integrated Moving Average (ARIMA) model is a typical time series model, which can transform non\-stationary data to stationary data through differencing, and then forecast the next value by using the past values, including the lagged values and lagged forecast errors | +| BATS | The BATS algorithm combines Box\-Cox Transformation, ARMA residuals, Trend, and Seasonality factors to forecast future values\. | +| Ensembler | Ensembler combines multiple forecast methods to overcome accuracy of simple prediction and to avoid possible overfit\. | +| Holt\-Winters | Uses triple exponential smoothing to forecast data points in a series, if the series is repetitive over time (seasonal)\. Two types of Holt\-Winters models are provided: additive Holt\-Winters, and multiplicative Holt\-Winters | +| Random Forest | Tree\-based regression model where each tree in the ensemble is built from a sample that is drawn with replacement (for example, a bootstrap sample) from the training set\. | +| Support Vector Machine (SVM) | SVMs are a type of machine learning models that can be used for both regression and classification\. SVMs use a hyperplane to divide the data into separate classes\. | +| Linear regression | Builds a linear relationship between time series variable and the date/time or time index with residuals that follow the AR process\. | + + + +## Supported date and time formats ## + +The date/time formats supported in time series experiments are based on the definitions that are provided by [dateutil](https://dateutil.readthedocs.io/en/stable/parser.html)\. + +Supported date formats are: + +Common: + + YYYY + YYYY-MM, YYYY/MM, or YYYYMM + YYYY-MM-DD or YYYYMMDD + mm/dd/yyyy + mm-dd-yyyy + JAN YYYY + +Uncommon: + + YYYY-Www or YYYYWww - ISO week (day defaults to 0) + YYYY-Www-D or YYYYWwwD - ISO week and day + +Numberng for the ISO week and day values follows the same logic as datetime\.date\.isocalendar()\. + +Supported time formats are: + + hh + hh:mm or hhmm + hh:mm:ss or hhmmss + hh:mm:ss.ssssss (Up to 6 sub-second digits) + dd-MMM + yyyy/mm + +**Notes:** + + + + * Midnight can be represented as 00:00 or 24:00\. The decimal separator can be either a period or a comma\. + * Dates can be submitted as strings, with double quotation marks, such as "1958\-01\-16"\. + + + +## Supporting features ## + +Supporting features, also known as exogenous features, are input features that can influence the prediction target\. You can use supporting features to include additional columns from your data set to improve the prediction and increase your model’s accuracy\. For example, in a time series experiment to predict prices over time, a supporting feature might be data on sales and promotions\. Or, in a model that forecasts energy consumption, including daily temperature makes the forecast more accurate\. + +### Algorithms and pipelines that use Supporting features ### + +Only a subset of algorithms allow supporting features\. For example, Holt\-winters and BATS do not support the use of supporting features\. Algorithms that do not support supporting features ignore your selection for supporting features when you run the experiment\. + +Some algorithms use supporting features for certain variations of the algorithm, but not for others\. For example, you can generate two different pipelines with the Random Forest algorithm, *RandomForestRegressor* and *ExogenousRandomForestRegressor*\. The *ExogenousRandomForestRegressor* variation provides support for supporting features, whereas *RandomForestRegressor* does not\. + +This table details whether an algorithm provides support for Supporting features in a time series experiment: + + + +| Algorithm | Pipeline | Provide support for Supporting features | +| ------------- | ----------------------------------- | --------------------------------------- | +| Random forest | RandomForestRegressor | No | +| Random forest | ExogenousRandomForestRegressor | Yes | +| SVM | SVM | No | +| SVM | ExogenousSVM | Yes | +| Ensembler | LocalizedFlattenEnsembler | Yes | +| Ensembler | DifferenceFlattenEnsembler | No | +| Ensembler | FlattenEnsembler | No | +| Ensembler | ExogenousLocalizedFlattenEnsembler | Yes | +| Ensembler | ExogenousDifferenceFlattenEnsembler | Yes | +| Ensembler | ExogenousFlattenEnsembler | Yes | +| Regression | MT2RForecaster | No | +| Regression | ExogenousMT2RForecaster | Yes | +| Holt\-winters | HoltWinterAdditive | No | +| Holt\-winters | HoltWinterMultiplicative | No | +| BATS | BATS | No | +| ARIMA | ARIMA | No | +| ARIMA | ARIMAX | Yes | +| ARIMA | ARIMAX\_RSAR | Yes | +| ARIMA | ARIMAX\_PALR | Yes | +| ARIMA | ARIMAX\_RAR | Yes | +| ARIMA | ARIMAX\_DMLR | Yes | + + + +## Learn more ## + +[Scoring a time series model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-score.html) + +**Parent topic:**[Building a time series experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/51389b2d808c1f7d81df9ec75f053528ae1bc128.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/51389b2d808c1f7d81df9ec75f053528ae1bc128.md new file mode 100644 index 0000000..51806cf --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/51389b2d808c1f7d81df9ec75f053528ae1bc128.md @@ -0,0 +1,10 @@ +# Sim Fit node (SPSS Modeler) + +# Sim Fit node # + +The Simulation Fitting node fits a set of candidate statistical distributions to each field in the data\. The fit of each distribution to a field is assessed using a goodness of fit criterion\. When a Simulation Fitting node runs, a Simulation Generate node is built (or an existing node is updated)\. Each field is assigned its best fitting distribution\. The Simulation Generate node can then be used to generate simulated data for each field\. + +Although the Simulation Fitting node is a terminal node, it does not add output to the Outputs panel, or export data\. + +Note: If the historical data is sparse (that is, there are many missing values), it may be difficult for the fitting component to find enough valid values to fit distributions to the data\. In cases where the data is sparse, before fitting you should either remove the sparse fields if they are not required, or impute the missing values\. Using the QUALITY options in the Data Audit node, you can view the number of complete records, identify which fields are sparse, and select an imputation method\. If there are an insufficient number of records for distribution fitting, you can use a Balance node to increase the number of records\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/51426dcf985b97af6172727afcf353a481591560.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/51426dcf985b97af6172727afcf353a481591560.md new file mode 100644 index 0000000..7a3070c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/51426dcf985b97af6172727afcf353a481591560.md @@ -0,0 +1,133 @@ +# Create the data handler + +# Create the data handler # + +Each party in a Federated Learning experiment must get a data handler to process their data\. You or a data scientist must create the data handler\. A data handler is a Python class that loads and transforms data so that all data for the experiment is in a consistent format\. + +## About the data handler class ## + +The data handler performs the following functions: + + + + * Accesses the data that is required to train the model\. For example, reads data from a CSV file into a Pandas data frame\. + * Pre\-processes the data so data is in a consistent format across all parties\. Some example cases are as follows: + + + + * The **Date** column might be stored as a time epoch or timestamp. + * The **Country** column might be encoded or abbreviated. + + + + * The data handler ensures that the data formatting is in agreement\. + + + + * *Optional:* feature engineer as needed. + + + + + +The following illustration shows how a data handler is used to process data and make it consumable by the experiment: + +![A use case of the data handler unifying data formats](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl-data-handler.svg) + +## Data handler template ## + +A general data handler template is as follows: + + # your import statements + + from ibmfl.data.data_handler import DataHandler + + class MyDataHandler(DataHandler): + """ + Data handler for your dataset. + """ + def __init__(self, data_config=None): + super().__init__() + self.file_name = None + if data_config is not None: + # This can be any string field. + # For example, if your data set is in `csv` format, + # can be "CSV", ".csv", "csv", "csv_file" and more. + if '' in data_config: + self.file_name = data_config[''] + # extract other additional parameters from `info` if any. + + # load and preprocess the training and testing data + self.load_and_preprocess_data() + + """ + # Example: + # (self.x_train, self.y_train), (self.x_test, self.y_test) = self.load_dataset() + """ + + def load_and_preprocess_data(self): + """ + Loads and pre-processeses local datasets, + and updates self.x_train, self.y_train, self.x_test, self.y_test. + + # Example: + # return (self.x_train, self.y_train), (self.x_test, self.y_test) + """ + + pass + + def get_data(self): + """ + Gets the prepared training and testing data. + + :return: ((x_train, y_train), (x_test, y_test)) # most build-in training modules expect data is returned in this format + :rtype: `tuple` + + This function should be as brief as possible. Any pre-processing operations should be performed in a separate function and not inside get_data(), especially computationally expensive ones. + + # Example: + # X, y = load_somedata() + # x_train, x_test, y_train, y_test = \ + # train_test_split(X, y, test_size=TEST_SIZE, random_state=RANDOM_STATE) + # return (x_train, y_train), (x_test, y_test) + """ + pass + + def preprocess(self, X, y): + pass + +**Parameters** + + + + * `your_data_file_type`: This can be any string field\. For example, if your data set is in `csv` format, `your_data_file_type` can be "CSV", "\.csv", "csv", "csv\_file" and more\. + + + +### Return a data generator defined by Keras or Tensorflow ### + +The following is a code example that needs to be included as part of the `get_data` function to return a data generator defined by Keras or Tensorflow: + + train_gen = ImageDataGenerator(rotation_range=8, + width_sht_range=0.08, + shear_range=0.3, + height_shift_range=0.08, + zoom_range=0.08) + + train_datagenerator = train_gen.flow( + x_train, y_train, batch_size=64) + + return train_datagenerator + +## Data handler examples ## + + + + * [MNIST Keras data handler](https://github.com/IBMDataScience/sample-notebooks/blob/master/Files/mnist_keras_data_handler.py) + * [Adult XGBoost data handler](https://github.com/IBMDataScience/sample-notebooks/blob/master/Files/adult_sklearn_data_handler.py) + + + +**Parent topic:**[Creating a Federated Learning experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-start.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/51747f17f413f1f34cfd73d170de392d874d03dd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/51747f17f413f1f34cfd73d170de392d874d03dd.md new file mode 100644 index 0000000..d7adf4c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/51747f17f413f1f34cfd73d170de392d874d03dd.md @@ -0,0 +1,110 @@ +# Parameters for tuning foundation models + +# Parameters for tuning foundation models # + +Tuning parameters configure the tuning experiments that you use to tune the model\. + +During the experiment, the tuning model repeatedly adjusts the structure of the prompt so that its predictions can get better over time\. + +The following diagram illustrates the steps that occur during a tuning training experiment run\. The parts of the experiment flow that you can configure are highlighted\. These decision points correspond with experiment tuning parameters that you control\. + +![Tuning experiment run process](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fm-tuning-training-experiment.png) + +The diagram shows the following steps of the experiment: + + + +1. Starts from the initialization method that you choose to use to initialize the prompt\. + + If the *initialization method* parameter is set to `text`, then you must add the initialization text. +2. If specified, tokenizes the initialization text and converts it into a prompt vector\. +3. Reads the training data, tokenizes it, and converts it into batches\. + + The size of the batches is determined by the *batch size* parameter. +4. Sends input from the examples in the batch to the foundation model for the model to process and generate output\. +5. Compares the model's output to the output from the training data that corresponds to the training data input that was submitted\. Then, computes the loss gradient, which is the difference between the predicted output and the actual output from the training data\. + + At some point, the experiment adjusts the prompt vector that is added to the input based on the performance of the model. When this adjustment occurs depends on how the *Accumulation steps* parameter is configured. +6. Adjustments are applied to the prompt vector that was initialized in Step 2\. The degree to which the vector is changed is controlled by the *Learning rate* parameter\. The edited prompt vector is added as a prefix to the input from the next example in the training data, and is submitted to the model as input\. +7. The process repeats until all of the examples in all of the batches are processed\. +8. The entire set of batches are processed again as many times as is specified in the *Number of epochs* parameter\. + + + +Note: No layer of the base foundation model is changed during this process\. + +## Parameter details ## + +The parameters that you change when you tune a model are related to the tuning experiment, not to the underlying foundation model\. + + + +Table 1: Tuning parameters + +| Parameter name | Value options | Default value | Learn more | +| ---------------------------------- | ------------- | ------------- | ---------------------------------------------------- | +| Initialization method | Random, Text | Random | [Initializing prompt tuning](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-parameters.html?context=cdpaas&locale=en#initialize) | +| Initialization text | None | None | [Initializing prompt tuning](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-parameters.html?context=cdpaas&locale=en#initialize) | +| Batch size | 1 \- 16 | 16 | [Segmenting the training data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-parameters.html?context=cdpaas&locale=en#segment) | +| Accumulation steps | 1 \- 128 | 16 | [Segmenting the training data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-parameters.html?context=cdpaas&locale=en#segment) | +| Learning rate | 0\.01 \- 0\.5 | 0\.3 | [Managing the learning rate](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-parameters.html?context=cdpaas&locale=en#learning-rate) | +| Number of epochs (training cycles) | 1 \- 50 | 20 | [Choosing the number of training runs to complete](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-parameters.html?context=cdpaas&locale=en#runs) | + + + +### Segmenting the training data ### + +When an experiment runs, the experiment first breaks the training data into smaller batches, and then trains on one batch at a time\. Each batch must fit in GPU memory to be processed\. To reduce the amount of GPU memory that is needed, you can configure the tuning experiment to postpone making adjustments until more than one batch is processed\. Tuning runs on a batch and its performance metrics are calculated, but the prompt vector isn't changed\. Instead, the performance information is collected over some number of batches before the cumulative performance metrics are evaluated\. + +Use the following parameters to control how the training data is segmented: + +**Batch size** Number of labeled examples (also known as *samples*) to process at one time\. + +For example, for a data set with 1,000 examples and a batch size of 10, the data set is divided into 100 batches of 10 examples each\. + +If the training data set is small, specify a smaller batch size to ensure that each batch has enough examples in it\. + +**Accumulation steps**: Number of batches to process before the prompt vector is adjusted\. + +For example, if the data set is divided into 100 batches and you set the accumulation steps value to 10, then the prompt vector is adjusted 10 times instead of 100 times\. + +### Initializing prompt tuning ### + +When you create an experiment, you can choose whether to specify your own text to serve as the initial prompt vector or let the experiment generate it for you\. These new tokens start the training process either in random positions, or based on the embedding of a vocabulary or instruction that you specify in text\. Studies show that as the size of the underlying model grows beyond 10 billion parameters, the initialization method that is used becomes less important\. + +The choice that you make when you create the tuning experiment customizes how the prompt is initialized\. + +**Initialization method**: Choose a method from the following options: + + + + * Text: The Prompt Tuning method is used where you specify the initialization text of the prompt yourself\. + * Random: The Prompt Tuning method is used that allows the experiment to add values that are chosen at random to include with the prompt\. + + + +**Initialization text**: The text that you want to add\. Specify a task description or instructions similar to what you use for zero\-shot prompting\. + +### Managing the learning rate ### + +The **learning rate** parameter determines how much to change the prompt vector when the it is adjusted\. The higher the number, the greater the change to the vector\. + +### Choosing the number of training runs to complete ### + +The **Number of epochs** parameter specifies the number of times to cycle through the training data\. + +For example, with a batch size of 10 and a data set with 1,000 examples, one epoch must process 100 batches and update the prompt vector 100 times\. If you set the number of epochs to 20, the model is passed through the data set 20 times, which means it processes a total of 2,000 batches during the tuning process\. + +The higher the number of epochs and bigger your training data, the longer it takes to tune a model\. + +### Learn more ### + + + + * [Data formats](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-data.html) + + + +**Parent topic:**[Tuning a model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-tune.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/52507fe59c92ef1667e463b2c5d709c139673f4d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/52507fe59c92ef1667e463b2c5d709c139673f4d.md new file mode 100644 index 0000000..88ef619 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/52507fe59c92ef1667e463b2c5d709c139673f4d.md @@ -0,0 +1,19 @@ +# Foundation model terms of use in watsonx.ai + +# Foundation model terms of use in watsonx\.ai # + +Review these model terms of use to understand your responsibilities and risks with foundation models\. + +By using any foundation model provided with this IBM offering, you acknowledge and understand that: + + + + * Some models that are included in this IBM offering are Non\-IBM Products\. Review the applicable model information for details on the third\-party provider and license terms that apply\. See [Supported foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html)\. + * Third Party models have been trained with data that may contain biases and inaccuracies and could generate outputs containing misinformation, obscene or offensive language, or discriminatory content\. Users should review and validate the outputs that are generated\. + * The output that is generated by all models is provided to augment, not replace, human decision\-making by the Client\. + + + +**Parent topic:**[Foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5287ef2a9e06aaec6a8fe651feba2d46d2f07502.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5287ef2a9e06aaec6a8fe651feba2d46d2f07502.md new file mode 100644 index 0000000..760be81 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5287ef2a9e06aaec6a8fe651feba2d46d2f07502.md @@ -0,0 +1,46 @@ +# Visualizations of assets + +# Visualizations of assets # + +In your project, you can create visualizations of data assets to further explore and discover insights\. To create and view visualizations, open a data asset and go to the **Visualization** tab\. + +## Requirements and restrictions ## + +You can view the visualization of assets under the following circumstances\. + + + + * **Required permissions** + To view this page, you can have any role in a project. To edit or update information on this page, you must have the **Editor** or **Admin** role. + * **Workspaces** + You can view the asset visualization in projects. + * **Types of assets** + These types of assets create a visualization: + + + + * Data asset from file: Avro, CSV, JSON, Parquet, TSV, SAV, Microsoft Excel .xls and .xlsx files, SAS, delimited text files + * Connected data assets + + + + + + + + * **Collaboration** + Visualization assets created by a user can be viewed or edited by other collaborators of the same project, depending on the assigned permissions. + + + +## Learn more ## + + + + * [Visualizing your data](https://dataplatform.cloud.ibm.com/docs/content/dataview/idh_idc_cg_help_main.html) + + + +**Parent topic:**[Asset types and properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/53019dd52edb5790460dff9a02363856b83cafb7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/53019dd52edb5790460dff9a02363856b83cafb7.md new file mode 100644 index 0000000..63d2f23 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/53019dd52edb5790460dff9a02363856b83cafb7.md @@ -0,0 +1,81 @@ +# Managing predictive deployments + +# Managing predictive deployments # + +For proper deployment, you must set up a deployment space and then select and configure a specific deployment type\. After you deploy assets, you can manage and update them to make sure they perform well and to monitor their accuracy\. + +To be able to deploy assets from a space, you must have a machine learning service instance that is provisioned and associated with that space\. For more information, see [Associating a service instance with a space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-service-instance.html#associating-instance-with-space)\. + +Online and batch deployments provide simple ways to create an online scoring endpoint or do batch scoring with your models\. + +If you want to implement a custom logic: + + + + * Create a Python function to use for creating your online endpoint + * Write a notebook or script for batch scoring + + + +Note: If you create a notebook or a script to perform batch scoring such an asset runs as a platform job, not as a batch deployment\. + +### Deployable assets ### + +Following is the list of assets that you can deploy from a Watson Machine Learning space, with information on applicable deployment types: + + + +List of assets that you can deploy + +| Asset type | Batch deployment | Online deployment | +| ---------- | ---------------- | ----------------- | +| Functions | Yes | Yes | +| Models | Yes | Yes | +| Scripts | Yes | No | + + + +An R Shiny app is the only asset type that is supported for web app deployments\. + +**Notes:** + + + + * A deployment job is a way of running a batch deployment, or a self\-contained asset like a flow in Watson Machine Learning\. You can select the input and output for your job and choose to run it manually or on a schedule\. For more information, see [Creating a deployment job](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-jobs.html)\. + * Notebooks and flows use notebook environments\. You can run them in a deployment space, but they are not deployable\. + + + +For more information, see: + + + + * [Creating online deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-online.html) + * [Creating batch deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-details.html) + * [Deploying Python functions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function.html) + * [Deploying scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-script.html) + + + +After you deploy assets, you can manage and update them to make sure they perform well and to monitor their accuracy\. Some ways to manage or update a deployment are as follows: + + + + * [Manage deployment jobs](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-jobs.html)\. After you create one or more jobs, you can view and manage them from the **Jobs** tab of your deployment space\. + * [Update a deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-update.html)\. For example, you can replace a model with a better\-performing version without having to create a new deployment\. + * [Scale a deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-scaling.html) to increase availability and throughput by creating replicas of the deployment\. + * [Delete a deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-delete.html) to remove a deployment and free up resources\. + + + +## Learn more ## + + + + * [Full list of asset types that can be added to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets-all.html) + + + +**Parent topic:**[Deploying and managing models](https://dataplatform.cloud.ibm.com/docs/content/wsj/wmls/wmls-deploy-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/536ef493ab96990de8e237edb8a97db989ef15c8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/536ef493ab96990de8e237edb8a97db989ef15c8.md new file mode 100644 index 0000000..081520a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/536ef493ab96990de8e237edb8a97db989ef15c8.md @@ -0,0 +1,106 @@ +# Creating a pipeline + +# Creating a pipeline # + +Create a pipeline to run an end\-to\-end scenario to automate all or part of the AI lifecycle\. For example, create a pipeline that creates and trains an asset, promotes it to a space, creates a deployment, then scores the model\. + +Watch this video to see how to create and run a sample pipeline\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Overview: Adding a pipeline to a project ## + +Follow these steps to add a pipeline to a project: + + + +1. Open a project\. +2. Click **New task > Automate model lifecycle**\. +3. Enter a name and an optional description\. +4. Click **Create** to open the canvas\. + + + +### Pipeline access ### + +When you use a pipeline to automate a flow, you must have access to all of the elements in the pipeline\. Make sure that you create and run pipelines with the proper access to all assets, projects, and spaces used in the pipeline\. + +### Related services ### + +In addition to access to all elements in a pipeline, you must have the services available to run all assets you add to a pipeline\. For example, if you automate a pipeline that trains and deploys a model, you must have the Watson Studio and Watson Machine Learning services\. If a required service is missing, the pipeline will not run\. This table lists assets that require services in addition to Watson Studio: + + + +| Asset | Required service | +| ------------------------------- | ----------------------- | +| AutoAI experiment | Watson Machine Learning | +| Batch deployment job | Watson Machine Learning | +| Online deployment (web service) | Watson Machine Learning | + + + +## Overview: Building a pipeline ## + +Follow these high\-level steps to build and run a pipeline\. + + + +1. Drag any node objects onto the canvas\. For example, drag a **Run notebook job** node onto the canvas\. +2. Use the action menu for each node to view and select options\. +3. Configure a node as required\. You are prompted to supply the required input options\. For some nodes, you can view or configure output options as well\. For examples of configuring nodes, see [Configuring pipeline components](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-config.html)\. +4. Drag from one node to another to connect and order the pipeline\. +5. Optional: Click the **Global objects** icon ![global objects icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/global-objects-icon.png) in the toolbar to configure runtime options for the pipeline\. +6. When the pipeline is complete, click the **Run** icon on the toolbar to run the pipeline\. You can run a trial to test the pipeline, or you can schedule a job when you are confident in the pipeline\. + + + +### Configuring nodes ### + +As you add nodes to a pipeline, you must configure them to provide all of the required details\. For example, if you add a node to run an AutoAI experiment, you must configure the node to specify the experiment, load the training data, and specify the output file: + +![AutoAI node parameters](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/OE-run-autoai-node.png) + +### Connecting nodes ### + +When you build a complete pipeline, the nodes must be connected in the order in which they run in the pipeline\. To connect nodes, hover over a node and drag a connection to the target node\. Disconnected nodes are run in parallel\. + +![Connecting nodes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/pipelines_conecting_nodes_gif.gif) + +### Defining pipeline parameters ### + +A pipeline parameter defines a global variable for the whole pipeline\. Use pipeline parameters to specify data from one of these categories: + + + +| Parameter type | Can specify | +| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | +| Basic | JSON types such as string, integer, or a JSON object | +| CPDPath | Resources available within the platform, such as assets, asset containers, connections, notebooks, hardware specs, projects, spaces, or jobs | +| InstanceCRN | Storage, machine learning instances, and other services\. | +| Other | Various configuration types, such as status, timeout length, estimator, error policies and other various configuration types\. | + + + +To specify a pipeline parameter: + + + +1. Click the global objects icon ![global objects icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/global-objects-icon.png) in the toolbar to open the **Manage global objects** window\. +2. Select the **Pipeline parameters** tab to configure parameters\. +3. Click **Add pipeline parameter**\. +4. Specify a name and an optional description\. +5. Select a type and provide any required information\. +6. Click **Add** when the definition is complete, and repeat the previous steps until you finish defining the parameters\. +7. Close the **Manage global objects** dialog\. + + + +The parameters are now available to the pipeline\. + +## Next steps ## + +[Configure pipeline components](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-config.html) + +**Parent topic:**[IBM Watson Pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/538ecae0b5aa21e499f39c2637764a05bff7b6b6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/538ecae0b5aa21e499f39c2637764a05bff7b6b6.md new file mode 100644 index 0000000..7c04106 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/538ecae0b5aa21e499f39c2637764a05bff7b6b6.md @@ -0,0 +1,57 @@ +# Managing and customizing report templates + +# Managing and customizing report templates # + +If the default report templates that are provided with AI Factsheets do not meet your needs, you can download a default report template, customize it, and upload the new template\. + +## Customizing a custom report template ## + +Any user with at least Editor access can create a report from an AI use case that captures all the details from An AI use case\. You can use reports for compliance verification, archiving, or other purposes\. + +If the default templates for the reports do not meet the needs of your organization, you can customize the report templates, the branding file, or the default stylesheet\. For example, you can replace the IBM logo with your own logo image file\. You must have the Admin role for managing inventories to customize report templates\. + +Follow these steps to customize a report template\. + +### Downloading a report ### + +To download a report template from the UI: + + + +1. Open the AI uses cases settings and click the **Report templates** tab\. If you do not see this tab, you might have insufficient access\. +2. In the options menu for a report template, click **Download**\. ![Downloading a report template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-report-template.png) +3. Open the `.ftl` file in an editor\. +4. Edit the template by using instructions from [Apache FreeMarker](https://freemarker.apache.org/) or the API commands\. + + + +To download a report template by using APIs: + + + +1. Use the `GET` endpoint for `/v1/aigov/report_templates` in the [IBM Watson Data API](https://cloud.ibm.com/apidocs/watson-data-api) to list the available templates\. Note the ID for the template that you want to download\. +2. Use the `GET` endpoint `/v1/aigov/report_templates/{template_id}/content` with the template ID to download the template file\. +3. Open the `.ftl` file in an editor\. +4. Edit the template by using instructions from [Apache FreeMarker](https://freemarker.apache.org/) or the API commands\. + + + +### Uploading a template ### + + + +1. Open the AI uses cases settings and click the **Report templates** tab\. If you do not see this tab, you might have insufficient access\. +2. Click **Add template**\. +3. Specify a name for the template and an optional description\. +4. Choose the type of template: model or model use case\. The reports are available for external models and Watson Machine Learning models\. +5. Upload the updated `FTL` file\. + + + +Restriction:The `ftl` file that you upload must not import any other files\. Support is not yet available for `import` statements other than system templates in the `ftl` file\. + +The custom template displays in the Report templates section and is available for creating reports\. Click **Edit** or **Delete** from the action menu for a custom template to update the template details or to remove the template\. + +**Parent topic:**[Creating and managing inventories](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-inventory-manage.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/53ee442d78abe20aaa100dda3ff139e566842c2e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/53ee442d78abe20aaa100dda3ff139e566842c2e.md new file mode 100644 index 0000000..9985298 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/53ee442d78abe20aaa100dda3ff139e566842c2e.md @@ -0,0 +1,126 @@ +# Connectors + +# Connectors # + +You can add connections to a broad array of data sources in projects\. Source connections can be used to read data; target connections can be used to load (save) data\. When you create a target connection, be sure to use credentials that have Write permission or you won't be able to save data to the target\. + +From a project, you must [create a connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) to a data source before you can read data from it or load data to it\. + + + + * [IBM services](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html?context=cdpaas&locale=en#ibm) + * [Third\-party services](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html?context=cdpaas&locale=en#third) + + + + + + * [Supported connectors by tool](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html?context=cdpaas&locale=en#st) + + + +## IBM services ## + + + + * [IBM Cloud Data Engine](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sqlquery.html)\. *Supports source connections only*\. + * [IBM Cloud Databases for DataStax](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-datastax.html) + * [IBM Cloud Databases for MongoDB](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mongodb.html)\. *Supports source connections only*\. + * [IBM Cloud Databases for MySQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-compose-mysql.html) + * [IBM Cloud Databases for PostgreSQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-dbase-postgresql.html) + * [IBM Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html) + * [IBM Cloud Object Storage (infrastructure)](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos-infra.html) + * [IBM Cloudant](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cloudant.html) + * [IBM Cognos Analytics](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cognos.html)\. *Supports source connections only*\. + * [IBM Data Virtualization Manager for z/OS](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-datavirt-z.html) + * [IBM Db2](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2.html) + * [IBM Db2 Big SQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-bigsql.html) + * [IBM Db2 for i](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2i.html) + * [IBM Db2 for z/OS](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2zos.html) + * [IBM Db2 on Cloud](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-cloud.html) + * [IBM Db2 Warehouse](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-wh.html) + * [IBM Informix](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-informix.html) + * [IBM Netezza Performance Server](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-puredata.html) + * [IBM Planning Analytics](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-plananalytics.html) + * [IBM Watson Query](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-data-virtual.html)\. *Supports source connections only*\. + + + +## Third\-party services ## + + + + * [Amazon RDS for MySQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azrds-mysql.html) + * [Amazon RDS for Oracle](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azrds-oracle.html) + * [Amazon RDS for PostgreSQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azrds-postresql.html) + * [Amazon Redshift](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-redshift.html) + * [Amazon S3](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-amazon-s3.html) + * [Apache Cassandra](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cassandra.html) + * [Apache Derby](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-derby.html) + * [Apache HDFS](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-hdfs.html) + * [Apache Hive](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-hive.html)\. *Supports source connections only*\. + * [Box](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-box.html) + * [Cloudera Impala](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cloudera.html)\. *Supports source connections only*\. + * [Dremio](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-dremio.html)\. *Supports source connections only*\. + * [Dropbox](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-dropbox.html) + * [Elasticsearch](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-elastic.html) + * [FTP](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-ftp.html) + * [Generic S3](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-generics3.html) + * [Google BigQuery](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-bigquery.html) + * [Google Cloud Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cloud-storage.html) + * [Greenplum](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-greenplum.html) + * [HTTP](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-http.html)\. *Supports source connections only*\. + * [Looker](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-looker.html)\. *Supports source connections only*\. + * [MariaDB](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mariadb.html) + * [Microsoft Azure Blob Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azureblob.html) + * [Microsoft Azure Cosmos DB](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cosmosdb.html) + * [Microsoft Azure Data Lake Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azuredls.html) + * [Microsoft Azure File Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azurefs.html) + * [Microsoft Azure SQL Database](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azure-sql.html) + * [Microsoft SQL Server](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sql-server.html) + * [MongoDB](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mongo.html)\. *Supports source connections only*\. + * [MySQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mysql.html) + * [OData](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-odata.html) + * [Oracle](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-oracle.html) + * [PostgreSQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-postgresql.html) + * [Presto](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-presto.html)\. *Supports source connections only*\. + * [Salesforce\.com](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-salesforce.html)\. *Supports source connections only*\. + * [SAP ASE](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sap-ase.html) + * [SAP IQ](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sap-iq.html)\. *Supports source connections only*\. + * [SAP OData](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sapodata.html) + * [SingleStoreDB](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-singlestore.html) + * [Snowflake](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-snowflake.html) + * [Tableau](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-tableau.html)\. *Supports source connections only*\. + * [Teradata](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-teradata.html) + *Teradata JDBC Driver 17.00.00.03 Copyright (C) 2023 by Teradata. All rights reserved. IBM provides embedded usage of the Teradata JDBC Driver under license from Teradata solely for use as part of the IBM Watson service offering.*. + + + +## Supported connectors by tool ## + +The following tools support connections: + + + + * [AutoAI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) + * [Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refinery-datasources.html) + * [Decision Optimization](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/DOconnections.html) + * [Notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-load-support.html) + * [SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsd/spss-connections.html) + * [Synthetic Data Generator](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/import_data_sd.html) + + + +## Learn more ## + + + + * [Asset previews](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/previews.html) + * [Profiles of assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/profile.html) + * [Troubleshooting connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/troubleshoot-conn.html) + + + +**Parent topic**: [Preparing data](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/get-data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/54029dd42bae3a23d68d928ac3b6c04d0c735dec.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/54029dd42bae3a23d68d928ac3b6c04d0c735dec.md new file mode 100644 index 0000000..1e959b3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/54029dd42bae3a23d68d928ac3b6c04d0c735dec.md @@ -0,0 +1,74 @@ +# Compute resource options for SPSS Modeler in projects + +# Compute resource options for SPSS Modeler in projects # + +When you run an SPSS Modeler flow in a project, you choose an environment template for the runtime environment\. The environment template specifies the type, size, and power of the hardware configuration, plus the software template\. + + + + * [Types of environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spss-envs.html?context=cdpaas&locale=en#types_spss) + * [Default environment templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spss-envs.html?context=cdpaas&locale=en#default_spss) + * [Compute usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spss-envs.html?context=cdpaas&locale=en#compute_spss) + * [Changing the runtime](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spss-envs.html?context=cdpaas&locale=en#change-env_spss) + + + +## Types of environments ## + +You can use this type of environment with SPSS Modeler: + + + + * Default SPSS Modeler CPU environments for standard workloads + + + +## Default environment templates ## + +You can select any of the following default environment templates for SPSS Modeler in a project\. The included environment templates are listed under **Templates** on the **Environments** page on the **Manage** tab of your project\. + + + +Default SPSS Modeler environment templates + +| Name | Hardware configuration | Local storage | CUH rate per hour | +| ------------------------ | ---------------------- | ------------- | ----------------- | +| `Default SPSS Modeler S` | 2 vCPU and 8 GB RAM | 128 GB | 1 | +| `Default SPSS Modeler M` | 4 vCPU and 16 GB RAM | 128 GB | 2 | +| `Default SPSS Modeler L` | 6 vCPU and 24 GB RAM | 128 GB | 3 | + + + +After selecting an environment, any other SPSS Modeler flows opened in that project will use the same runtime\. The hardware configuration of the available SPSS Modeler environments is preset and cannot be changed\. + +## Compute usage in projects ## + +SPSS Modeler consumes compute resources as CUH from the Watson Studio service in projects\. + +You can monitor the Watson Studio CUH consumption on the **Resource usage** page on the **Manage** tab of your project\. + +## Changing the SPSS Modeler runtime ## + +If you notice that processing is very slow, you can restart SPSS Modeler and select a larger environment runtime\. + +To change the SPSS Modeler environment runtime: + + + +1. Save any data from your current session before switching to another environment\. +2. Stop the active SPSS Modeler runtime under **Tool runtimes** on the **Environments** page on the **Manage** tab of your project\. +3. Restart SPSS Modeler and select another environment with the compute power and memory capacity that better meets your requirements\. + + + +## Learn more ## + + + + * [SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsd/spss-modeler.html) + + + +**Parent topic:**[Choosing compute resources for tools](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/542f90ca456dccc3d79dbf6dc9e8a6755b3ba69e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/542f90ca456dccc3d79dbf6dc9e8a6755b3ba69e.md new file mode 100644 index 0000000..b492bba --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/542f90ca456dccc3d79dbf6dc9e8a6755b3ba69e.md @@ -0,0 +1,16 @@ +# Running a flow + +# Running a flow # + +The following example runs all executable nodes in the flow, and is the simplest type of flow script: + + modeler.script.stream().runAll(None) + +The following example also runs all executable nodes in the flow: + + stream = modeler.script.stream() + stream.runAll(None) + +In this example, the flow is stored in a variable called `stream`\. Storing the flow in a variable is useful because a script is typically used to modify either the flow or the nodes within a flow\. Creating a variable that stores the flow results in a more concise script\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5466d9a71e87bb01000dc957683e9cd3c10ad8bc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5466d9a71e87bb01000dc957683e9cd3c10ad8bc.md new file mode 100644 index 0000000..29453a8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5466d9a71e87bb01000dc957683e9cd3c10ad8bc.md @@ -0,0 +1,6 @@ +# Bubble charts + +# Bubble charts # + +Bubble charts display categories in your groups as nonhierarchical packed circles\. The size of each circle (bubble) is proportional to its value\. Bubble charts are useful for comparing relationships in your data\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/54ee0bb6fbd2e35c46c41d0065c299408f5ab0a5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/54ee0bb6fbd2e35c46c41d0065c299408f5ab0a5.md new file mode 100644 index 0000000..03b8229 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/54ee0bb6fbd2e35c46c41d0065c299408f5ab0a5.md @@ -0,0 +1,14 @@ +# Characters (SPSS Modeler) + +# Characters # + +Characters (usually shown as `CHAR`) are typically used within a CLEM expression to perform tests on strings\. + +For example, you can use the function `isuppercode` to determine whether the first character of a string is uppercase\. The following CLEM expression uses a character to indicate that the test should be performed on the first character of the string: + + isuppercode(subscrs(1, "MyString")) + +To express the code (in contrast to the location) of a particular character in a CLEM expression, use single backquotes of the form `` ` ``<*character*>`` ` ``\. For example, `` `A` ``, `` `Z` ``\. + +Note: There is no `CHAR` storage type for a field, so if a field is derived or filled with an expression that results in a `CHAR`, then that result will be converted to a string\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/56dc9cabda3980a4d5d41aa5b3e5612e727b289a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/56dc9cabda3980a4d5d41aa5b3e5612e727b289a.md new file mode 100644 index 0000000..e45123d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/56dc9cabda3980a4d5d41aa5b3e5612e727b289a.md @@ -0,0 +1,23 @@ +# reordernode properties + +# reordernode properties # + +![Field Reorder node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/fieldreordernodeicon.png)The Field Reorder node defines the natural order used to display fields downstream\. This order affects the display of fields in a variety of places, such as tables, lists, and when selecting fields\. This operation is useful when working with wide datasets to make fields of interest more visible\. + + + +reordernode properties + +Table 1\. reordernode properties + +| `reordernode` properties | Data type | Property description | +| ------------------------ | ---------------------------- | ------------------------------------------------------------- | +| `mode` | `Custom``Auto` | You can sort values automatically or specify a custom order\. | +| `sort_by` | `Name``Type``Storage` | | +| `ascending` | *flag* | | +| `start_fields` | *\[field1 field2 … fieldn\]* | New fields are inserted after these fields\. | +| `end_fields` | *\[field1 field2 … fieldn\]* | New fields are inserted before these fields\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/56ea4620b049a9e291bf198e71d0c58c2018686d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/56ea4620b049a9e291bf198e71d0c58c2018686d.md new file mode 100644 index 0000000..8ceec38 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/56ea4620b049a9e291bf198e71d0c58c2018686d.md @@ -0,0 +1,24 @@ +# Checking CLEM expressions (SPSS Modeler) + +# Checking CLEM expressions # + +Click Validate in the Expression Builder to validate an expression\. + +Expressions that haven't been checked are displayed in red\. If errors are found, a message indicating the cause is displayed\. + +The following items are checked: + + + + * Correct quoting of values and field names + * Correct usage of parameters and global variables + * Valid usage of operators + * Existence of referenced fields + * Existence and definition of referenced globals + + + +If you encounter errors in syntax, try creating the expression using the lists and operator buttons rather than typing the expression manually\. This method automatically adds the proper quotes for fields and values\. + +Note: Field names that contain separators must be surrounded by single quotes\. To automatically add quotes, you can create expressions using the lists and operator buttons rather than typing expressions manually\. The following characters in field names may cause errors: `• ! "# $% & '() = ~ |-^ ¥ @" "+ *" "<>? . ,/ :; →`(arrow mark), `□ △` (graphic mark, etc\.) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/570af2aaf268a3df1d959d54a5be1790dc43ead5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/570af2aaf268a3df1d959d54a5be1790dc43ead5.md new file mode 100644 index 0000000..9827573 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/570af2aaf268a3df1d959d54a5be1790dc43ead5.md @@ -0,0 +1,8 @@ +# Distribution node (SPSS Modeler) + +# Distribution node # + +A distribution graph or table shows the occurrence of symbolic (non\-numeric) values, such as mortgage type or gender, in a dataset\. A typical use of the Distribution node is to show imbalances in the data that you can rectify by using a Balance node before creating a model\. You can automatically generate a Balance node using the Generate menu in the distribution graph or table window\. + +Note: To show the occurrence of numeric values, you should use a Histogram node\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/577964b0c132f5ea793054c3ff67417dda6511d3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/577964b0c132f5ea793054c3ff67417dda6511d3.md new file mode 100644 index 0000000..bf72d4c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/577964b0c132f5ea793054c3ff67417dda6511d3.md @@ -0,0 +1,88 @@ +# Watson Machine Learning Python client samples and examples + +# Watson Machine Learning Python client samples and examples # + +Review and use sample Jupyter Notebooks that use Watson Machine Learning Python library to demonstrate machine learning features and techniques\. Each notebook lists learning goals so you can find the one that best meets your goals\. + +## Training and deploying models from notebooks ## + +If you choose to build a machine learning model in a notebook, you must be comfortable with coding in a Jupyter Notebook\. A Jupyter Notebook is a web\-based environment for interactive computing\. You can run small pieces of code that process your data, and then immediately view the results of your computation\. Using this tool, you can assemble, test, and run all of the building blocks you need to work with data, save the data to Watson Machine Learning, and deploy the model\. + +## Learn from sample notebooks ## + +Many ways exist to build and train models and then deploy them\. Therefore, the best way to learn is to look at annotated samples that step you through the process by using different frameworks\. Review representative samples that demonstrate key features\. + +The samples are built by using the V4 version of the Watson Machine Learning [Python client library](https://ibm.github.io/watson-machine-learning-sdk/)\. + +Video disclaimer: Some minor steps and graphical elements in the videos might differ from your deployment\. + +Watch this video to learn how to train, deploy, and test a machine learning model in a Jupyter Notebook\. This video mirrors the **Use scikit\-learn to recognize hand\-written digits** found in the *Deployment samples* table\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +Watch this video to learn how to test a model that was created with AutoAI by using the Watson Machine Learning APIs in Jupyter Notebook\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +### Helpful variables ### + +Use the pre\-defined `PROJECT_ID` environment variable to call the Watson Machine Learning Python client APIs\. `PROJECT_ID` is the guide of the project where your environment is running\. + +## Deployment samples ## + +View or run these Jupyter Notebooks to see how techniques are implemented by using various frameworks\. Some of the samples rely on trained models, which are also available for you to download from the public repository\. + + + +| Sample name | Framework | Techniques demonstrated | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Use scikit\-learn and custom library to predict temperature](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/9365d34eeacef267026a2b75b92bfa2f) | Scikit\-learn | Train a model with custom defined transformer
Persist the custom\-defined transformer and the model in Watson Machine Learning repository
Deploy the model by using Watson Machine Learning Service
Perform predictions that use the deployed model | +| [Use PMML to predict iris species](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/8bddf7f7e5d004a009c643750b16f5b4) | PMML | Deploy and score a PMML model | +| [Use Python function to recognize hand\-written digits](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/1eddc77b3a4340d68f762625d40b64f9) | Python | Use a function to store a sample model, then deploy the sample model\. | +| [Use scikit\-learn to recognize hand\-written digits](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/e20607d75c8473daaade1e77c21717d4) | Scikit\-learn | Train sklearn model
Persist trained model in Watson Machine Learning repository
Deploy model for online scoring by using client library
Score sample records by using client library | +| [Use Spark and batch deployment to predict customer churn](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/e20607d75c8473daaade1e77c21719c1) | Spark | Load a CSV file into an Apache Spark DataFrame
Explore data
Prepare data for training and evaluation
Create an Apache Spark machine learning pipeline
Train and evaluate a model
Persist a pipeline and model in Watson Machine Learning repository
Explore and visualize prediction result by using the plotly package
Deploy a model for batch scoring by using Watson Machine Learning API | +| [Use Spark and Python to predict Credit Risk](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/e20607d75c8473daaade1e77c2173364) | Spark | Load a CSV file into an Apache® Spark DataFrame
Explore data
Prepare data for training and evaluation
Persist a pipeline and model in Watson Machine Learning repository from tar\.gz files
Deploy a model for online scoring by using Watson Machine Learning API
Score sample data by using the Watson Machine Learning API
Explore and visualize prediction results by using the plotly package | +| [Use SPSS to predict customer churn](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/e20607d75c8473daaade1e77c2175eb9) | SPSS | Work with the instance
Perform an online deployment of the SPSS model
Score data by using deployed model | +| [Use XGBoost to classify tumors](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/ac820b22cc976f5cf6487260f4c8d9c8) | XGBoost | Load a CSV file into numpy array
Explore data
Prepare data for training and evaluation
Create an XGBoost machine learning model
Train and evaluate a model
Use cross\-validation to optimize the model's hyperparameters
Persist a model in Watson Machine Learning repository
Deploy a model for online scoring
Score sample data | +| [Predict business for cars](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/61a8b600f1bb183e2c471e7a64299f0e) | Spark | Download an externally trained Keras model with dataset\.
Persist an external model in the Watson Machine Learning repository\.
Deploy a model for online scoring by using client library\.
Score sample records by using client library\. | +| [Deploy Python function for software specification](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/56825df5322b91daffd39426038808e9) | Core | Create a Python function
Create a web service
Score the model | +| [Machine Learning artifact management](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/55ef73c276cd1bf2bae266613d08c0f3) | Core | Export and import artifacts
Load, deploy, and score externally created models | +| [Use Decision Optimization to plan your diet](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/5502accad754a3c5dcb3a08f531cea5a) | Core | Create a diet planning model by using Decision Optimization | +| [Use SPSS and batch deployment with Db2 to predict customer churn](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/e5e78be14e2260ccb4bcf8181d0955ef) | SPSS | Load a CSV file into an Apache Spark DataFrame
Explore data
Prepare data for training and evaluation
Persist a pipeline and model in Watson Machine Learning repository from tar\.gz files
Deploy a model for online scoring by using Watson Machine Learning API
Score sample data by using the Watson Machine Learning API
Explore and visualize prediction results by using the plotly package | +| [Use scikit\-learn and AI lifecycle capabilities to predict Boston house prices](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/8bddf7f7e5d004a009c643750b1c7b47) | Scikit\-learn | Load a sample data set from scikit\-learn
Explore data
Prepare data for training and evaluation
Create a scikit\-learn pipeline
Train and evaluate a model
Store a model in the Watson Machine Learning repository
Deploy a model with AutoAI lifecycle capabilities | +| [German credit risk prediction with Scikit\-learn for model monitoring](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/f63c83c7368d2487c943c91a9a28ad67) | Scikit\-learn | Train, create, and deploy a credit risk prediction model with monitoring | +| [Monitor German credit risk model](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/48e9f342365736c7bb7a8dfc481bca6e) | Scikit\-learn | Train, create, and deploy a credit risk prediction model with IBM Watson OpenScale capabilities | + + + +## AutoAI samples ## + +View or run these Jupyter Notebooks to see how AutoAI model techniques are implemented\. + + + +| Sample name | Framework | Techniques demonstrated | +| ---------------------------------------------- | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Use AutoAI and Lale to predict credit risk](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/8bddf7f7e5d004a009c643750b16d0c0) | Hybrid (AutoAI) with Lale | Work with Watson Machine Learning experiments to train AutoAI models
Compare trained models quality and select the best one for further refinement
Refine the best model and test new variations
Deploy and score the trained model | +| [Use AutoAI to predict credit risk](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/029d77a73d72a4134c81383d6f103330) | Hybrid (AutoAI) | Work with Watson Machine Learning experiments to train AutoAI models
Compare trained models quality and select the best one for further refinement
Refine the best model and test new variations
Deploy and score the trained model | + + + +## Next steps ## + + + + * To learn more about using notebook editors, see [Notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebooks-and-scripts.html)\. + * To learn more about working with notebooks, see [Coding and running notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/code-run-notebooks.html)\. + + + + + + * To learn more about authenticating in a notebook, see [Authentication](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-authentication.html)\. + + + +**Parent topic:**[Managing predictive deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5788d38721aeae446cfad7d9288b6bab33fa1ef9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5788d38721aeae446cfad7d9288b6bab33fa1ef9.md new file mode 100644 index 0000000..ff60485 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5788d38721aeae446cfad7d9288b6bab33fa1ef9.md @@ -0,0 +1,18 @@ +# Decision Optimization sample models and notebooks + +# Sample models and notebooks for Decision Optimization # + +Several examples are presented in this documentation as tutorials\. You can also use many other examples that are provided in the Decision Optimization GitHub, and in the Samples\. + +Quick links: + + + + * [Examples used in this documentation](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/docExamples.html?context=cdpaas&locale=en#Examples__docexamples) + * [Decision Optimization experiment samples (Modeling Assistant, Python, OPL)](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/docExamples.html?context=cdpaas&locale=en#Examples__section_modelbuildersamples) + * [Jupyter notebook samples](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/docExamples.html?context=cdpaas&locale=en#Examples__section_xrg_fdj_cgb) + * [Python notebooks in the Samples](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/docExamples.html?context=cdpaas&locale=en#Examples__section_pythoncommunity) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/57ab3726fa10435d26878c626f61988f7305b9e8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/57ab3726fa10435d26878c626f61988f7305b9e8.md new file mode 100644 index 0000000..f99243f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/57ab3726fa10435d26878c626f61988f7305b9e8.md @@ -0,0 +1,23 @@ +# Building a chart from the chart type gallery + +# Building a chart from the chart type gallery # + +Use chart type gallery for building charts\. Following are general steps for building a chart from the gallery\. + + + +1. In the Chart Type section, select a chart category\. A preview version of the selected chart type is shown on the chart canvas\. +2. If the canvas already displays a chart, the new chart replaces the chart's axis set and graphic elements\. + + + + 1. Depending on the selected chart type, the available variables are presented under a number of different headings in the Details pane (for example, Category for bar charts, X-axis and Y-axis for line charts). Select the appropriate variables for the selected chart type. + + + +3. Click the Save visualization to project control to save the visualization to the project\. You can select to also Create a new asset from the visualization, provide a visualization asset name, description, and chart name\. +4. Click Apply to save the visualization to the project\. The new visualization asset is now available under the Assets tab\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/57d441ef305442bcdbbe48b980b87d47b825fff9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/57d441ef305442bcdbbe48b980b87d47b825fff9.md new file mode 100644 index 0000000..101d641 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/57d441ef305442bcdbbe48b980b87d47b825fff9.md @@ -0,0 +1,7 @@ +# applykmeansnode properties + +# applykmeansnode properties # + +You can use K\-Means modeling nodes to generate a K\-Means model nugget\. The scripting name of this model nugget is *applykmeansnode*\. No other properties exist for this model nugget\. For more information on scripting the modeling node itself, see [kmeansnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/kmeansnodeslots.html#kmeansnodeslots)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/57ed2f2e8eaa8dab5b26c3759fd1bd102d03b975.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/57ed2f2e8eaa8dab5b26c3759fd1bd102d03b975.md new file mode 100644 index 0000000..9879654 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/57ed2f2e8eaa8dab5b26c3759fd1bd102d03b975.md @@ -0,0 +1,28 @@ +# reportnode properties + +# reportnode properties # + +![Report node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/reportnodeicon.png)The Report node creates formatted reports containing fixed text as well as data and other expressions derived from the data\. You specify the format of the report using text templates to define the fixed text and data output constructions\. You can provide custom text formatting by using HTML tags in the template and by setting output options\. You can include data values and other conditional output by using CLEM expressions in the template\. + + + +reportnode properties + +Table 1\. reportnode properties + +| `reportnode` properties | Data type | Property description | +| ----------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `output_mode` | `Screen``File` | Used to specify target location for output generated from the output node\. | +| `output_format` | `HTML` (\.*html*) `Text` (\.*txt*) `Output` (\.*cou*) | Used to specify the type of file output\. | +| `format` | `Auto``Custom` | Used to choose whether output is automatically formatted or formatted using HTML included in the template\. To use HTML formatting in the template, specify `Custom`\. | +| `use_output_name` | *flag* | Specifies whether a custom output name is used\. | +| `output_name` | *string* | If `use_output_name` is true, specifies the name to use\. | +| `text` | *string* | | +| `full_filename` | *string* | | +| `highlights` | *flag* | | +| `title` | *string* | | +| `lines_per_page` | *number* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/581f43aa02d6c6861d2fdf220617cf3fbb903ae5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/581f43aa02d6c6861d2fdf220617cf3fbb903ae5.md new file mode 100644 index 0000000..e755b88 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/581f43aa02d6c6861d2fdf220617cf3fbb903ae5.md @@ -0,0 +1,131 @@ +# Keeping your data secure and compliant + +# Keeping your data secure and compliant # + +Customer data security is paramount\. The following information outlines some of the ways that customer data is protected when using IBM watsonx and what you are expected to do to help in these efforts\. + + + + * [Customer responsibility](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security.html?context=cdpaas&locale=en#customer-responsibility) + * [HIPAA readiness](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security.html?context=cdpaas&locale=en#hipaa) + * [IBM's commitment to GDPR](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security.html?context=cdpaas&locale=en#gdpr) + * [Content and Data Protection](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security.html?context=cdpaas&locale=en#content-and-data-protection) + * [GDPR statement that applies to IBM Watson Machine Learning log files](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security.html?context=cdpaas&locale=en#logfiles) + * [Secure deletion from the IBM Watson Machine Learning service](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security.html?context=cdpaas&locale=en#secure-deletion) + + + +## Customer responsibility ## + +Clients are responsible for ensuring their own compliance with various laws and regulations, including the European Union General Data Protection Regulation (GDPR)\. Clients are solely responsible for obtaining advice of competent legal counsel as to the identification and interpretation of any relevant laws and regulations that may affect the clients’ business and any actions the clients may need to take to comply with such laws and regulations\. The products, services, and other capabilities described herein are not suitable for all customer situations and may have restricted availability\. IBM does not provide legal, accounting, or auditing advice or represent or warrant that its services or products will ensure that clients are in compliance with any law or regulation\. + +## HIPAA readiness ## + +Watson Studio and Watson Machine Learning meet the required IBM controls that are commensurate with the Health Insurance Portability and Accountability Act of 1996 (HIPAA) Security and Privacy Rule requirements\. + +These requirements include the appropriate administrative, physical, and technical safeguards required of Business Associates in 45 CFR Part 160 and Subparts A and C of Part 164\. HIPAA readiness applies to the following plans: + + + + * The Watson Studio Professional plan in the Dallas (US South) region + * The Watson Machine Learning Standard plan in the Dallas (US South) region + + + +For other services, you must check the plan page in IBM Cloud for each to determine if it is HIPAA ready and whether you need to reprovision the service after you enable HIPAA support\. + +HIPAA support from IBM requires that you agree to the terms of the [Business Associate Addendum (BAA) agreement](https://www.ibm.com/support/customer/csol/terms/?ref=i126-7356-04-12-2019-zz-en) with IBM for your IBM Cloud account\. The BAA outlines IBM responsibilities, but also your responsibilities to maintain HIPAA compliance\. After you enable HIPAA support in your IBM Cloud account, you cannot disable it\. See [IBM Cloud Docs: Enabling the HIPAA Supported setting](https://cloud.ibm.com/docs/account?topic=account-eu-hipaa-supported)\. + +To enable HIPAA support for your IBM Cloud account: + + + +1. Log in to your IBM Cloud account\. +2. Click **Manage > Account** and then **Account settings**\. +3. In the **HIPAA Supported** section, click **On**\. +4. Read the BAA and then select **Accept** and click **Submit**\. + + + +## IBM's commitment to GDPR ## + +Learn more about IBM’s own [GDPR readiness journey and our GDPR capabilities](https://www.ibm.com/data-responsibility/gdpr/) and offerings to support your compliance journey\. + +## Content and Data Protection ## + +The Data Processing and Protection data sheet (Data Sheet) provides information specific to the IBM Cloud Service regarding the type of Content enabled to be processed, the processing activities involved, the data protection features, and specifics on retention and return of Content\. Any details or clarifications and terms, including customer responsibilities, around use of the Cloud Service and data protection features, if any, are set forth in this section\. There may be more than one Data Sheet applicable to a customer's use of the IBM Cloud Service based upon options selected by customer\. The Data Sheet may only be available in English and not available in local languages\. Despite any practices of local law or custom, the parties agree that they understand English and it is an appropriate language regarding acquisition and use of the IBM Cloud Services\. The following Data Sheets apply to the IBM Cloud Service and its available options\. Customer acknowledges that i) IBM may modify Data Sheets from time to time at IBM's sole discretion and ii) such modifications will supersede prior versions\. The intent of any modification to Data Sheet(s) will be to + + + +1. improve or clarify existing commitments, +2. maintain alignment to current adopted standards and applicable laws, or +3. provide additional commitments\. No modification to Data Sheets will materially degrade the data protection of a IBM Cloud Service\. + + + +See the [Learn more](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security.html?context=cdpaas&locale=en#learn-more) section for links to some of the data sheets that you can view\. + +You, the customer, are responsible to take necessary actions to order, enable, or use available data protection features for a IBM Cloud Service and accept responsibility for use of the IBM Cloud Services if you fail to take such actions, including meeting any data protection or other legal requirements regarding Content\. [IBM's Data Processing Addendum](http://ibm.com/dpa) (DPA) and DPA Exhibits apply and are referenced in as part of the Agreement, if and to the extent the European General Data Protection Regulation (EU/2016/679) (GDPR) applies to personal data contained in Content\. The applicable Data Sheets for this IBM Cloud Service will serve as the DPA Exhibits\. If the DPA applies, IBM's obligation to provide notice of changes to Subprocessors and Customer's right to object to such changes will apply as set out in DPA\. + +## GDPR statement that applies to IBM Watson Machine Learning log files ## + +Disclaimer: Client’s use of the deep learning training process includes the ability to write to the training log files\. Personal data must not be written to these training log files as they are accessible to other users within Client’s Enterprise as well as to IBM as necessary to support the Cloud Service\. + +Please pay close attention to data privacy principals when selecting a dataset for training data\. Processing of PI is governed by vigorous legal requirements and is only allowed if it is based on an explicit legal basis\. These regulations mandate that PI is processed only for the purpose it was collected for\. No other processing in a manner that is incompatible with this initial purpose is permissible\. For these and other constrains these regulations place on your use of PI, we highly recommend that you do not use "real" PI in your training dataset unless it is allowed or permissible\. You may substitute real PI using test data that is available on the public sphere\. + +## Secure deletion from the IBM Watson Machine Learning service ## + +Anyone that has personally identifiable information and data (PII) stored as part of using the IBM Watson Machine Learning service, has the right to obtain from the controller the erasure of that data without undue delay\. The controller has the obligation to erase personal data without undue delay where one of the following conditions exist: + + + + * There is PII data stored in the IBM Watson Machine Learning service + * User email address and full name are stored as metadata related to the Machine Learning repository assets\. + * User provided service credentials\. + * Repository asset content, which is usually out of Machine Learning service control and potentially can contain any type of PII data in it\. In this case, when users want to track PII data stored in assets, such as a model, they must: + + + + * Get training data reference from the model metadata. + * Scan training data for occurrence of PII data of particular user. + * If such data can be found in the training data set, the model should be considered as potentially holding this data in its content. + + + + + +Repository asset content, such as models, can be securely deleted by performing one of the methods [for permanently deleting personal data](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security.html?context=cdpaas&locale=en#options-for-permanently-deleting-personal-data)\. + +### Options for permanently deleting personal data ### + +There are several options that users can choose to delete their personal data permanently: + + + + * Remove the entire IBM Watson Machine Learning service instance from IBM Cloud\. This is possible by sending an un\-provisioning request via different channels, such as the IBM Cloud UI, CLI, or REST API\. + * Use the [Watson Machine Learning REST ](https://cloud.ibm.com/apidocs/machine-learning-cp) to delete models or model deployments\. + + + +For the IBM Watson Machine Learning service, personally identifiable information and data is removed completely from all data sources, including backups, after 30 days\. + +## Learn more ## + + + + * [watsonx terms](https://www.ibm.com/support/customer/csol/terms/?id=i126-9640&lc=en#detail-document) + * [IBM Watson Machine Learning terms](http://www.ibm.com/support/customer/csol/terms/?id=i126-6883) + * [IBM Watson Studio terms](https://www.ibm.com/support/customer/csol/terms/?id=i126-7747) + * [IBM Cloud Object Storage terms](https://www.ibm.com/software/sla/sladb.nsf/sla/bm-7857-03) + * [How do I know that my data is safe?](https://cloud.ibm.com/docs/overview?topic=overview-security) + * [Data Security and Privacy Principles for IBM Cloud Services](https://www-03.ibm.com/software/sla/sladb.nsf/pdf/7745WW2/$file/Z126-7745-WW-2_05-2017_en_US.pdf) + * [IBM and GDPR](https://www.ibm.com/data-responsibility/gdpr/) + * [Software Product Compatibility Reports: IBM Watson Studio](https://www.ibm.com/software/reports/compatibility/clarity-reports/report/html/softwareReqsForProduct?deliverableId=95E9BEA0B35711E7A9EB066095601ABB) + * [Software Product Compatibility Reports: IBM Watson Machine Learning](https://www.ibm.com/software/reports/compatibility/clarity-reports/report/html/softwareReqsForProduct?deliverableId=6B5148E0537F11E6865BC3F213DB63F7) + * [Software Product Compatibility Reports: IBM Watson Machine Learning Service](https://www.ibm.com/software/reports/compatibility/clarity-reports/report/html/softwareReqsForProduct?deliverableId=850D9360405711E5B2E4A36A7B0C4479) + + + +**Parent topic:**[Security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5890d52d3dde4c249ad06c5a4dfe25542723f1c1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5890d52d3dde4c249ad06c5a4dfe25542723f1c1.md new file mode 100644 index 0000000..39a4629 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5890d52d3dde4c249ad06c5a4dfe25542723f1c1.md @@ -0,0 +1,20 @@ +# applylsvmnode properties + +# applylsvmnode properties # + +You can use LSVM modeling nodes to generate an LSVM model nugget\. The scripting name of this model nugget is *applylsvmnode*\. For more information on scripting the modeling node itself, see [lsvmnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/lsvmnodeslots.html)\. + + + +applylsvmnode properties + +Table 1\. applylsvmnode properties + +| `applylsvmnode` Properties | Values | Property description | +| ---------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `calculate_raw_propensities` | *flag* | Specifies whether to calculate raw propensity scores\. | +| `enable_sql_generation` | `false``native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/589d9b0a7150af5485e6f7452eb39d15addb35f9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/589d9b0a7150af5485e6f7452eb39d15addb35f9.md new file mode 100644 index 0000000..5f9d8ed --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/589d9b0a7150af5485e6f7452eb39d15addb35f9.md @@ -0,0 +1,47 @@ +# {{ document.title.text }} + +# Nonconsensual use # + +![icon for misuse risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-misuse.svg)Risks associated with outputMisuseAmplified + +### Description ### + +The possibility that a model could be misused to imitate others through video (deepfakes), images, audio, or other modalities without their consent is the risk of nonconsensual use\. + +### Why is nonconsensual use a concern for foundation models? ### + +Intentionally imitating others for the purposes of deception without their consent is unethical and might be illegal\. A model that has this potential must be properly governed\. Otherwise, business entities could face fines, reputational harms, and other legal consequences\. + +Example + +#### FBI Warning on Deepfakes #### + +The FBI recently warned the public of malicious actors creating synthetic, explicit content “for the purposes of harassing victims or sextortion schemes”\. They noted that advancements in AI have made this content higher quality, more customizable, and more accessible than ever\. + +Sources: + +[FBI, June 2023](https://www.ic3.gov/Media/Y2023/PSA230605) + +Example + +#### Deepfakes #### + +A deepfake is the creation of an audio or video where the people speaking are created by AI not the actual person\. + +Sources: + +[CNN, January 2019](https://www.cnn.com/interactive/2019/01/business/pentagons-race-against-deepfakes/) + +Example + +#### Misleading Voicebot Interaction #### + +The article cited a case where a deepfake voice was used to scam a CEO out of $243,000\. The CEO believed he was on the phone with his boss, the chief executive of his firm’s parent company, when he followed the orders to transfer €220,000 (approximately $243,000) to the bank account of a Hungarian supplier\. + +Sources: + +[Forbes, September 2019](https://www.forbes.com/sites/jessedamiani/2019/09/03/a-voice-deepfake-was-used-to-scam-a-ceo-out-of-243000/?sh=10432a7d2241) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/58b70fac914f72c4ae9116de6e26880e1cedcff4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/58b70fac914f72c4ae9116de6e26880e1cedcff4.md new file mode 100644 index 0000000..8d7dae1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/58b70fac914f72c4ae9116de6e26880e1cedcff4.md @@ -0,0 +1,112 @@ +# Stop using services or IBM watsonx + +# Stop using services or IBM watsonx # + +You can stop using any services or IBM watsonx at any time, whether you are accessing the services from your own or someone else's IBM Cloud account\. + +The method you choose to stop using IBM watsonx depends on your goal: + + + + * To remove your access to IBM watsonx in all IBM Cloud accounts that you belong to, [leave IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/stopapps.html?context=cdpaas&locale=en#deactivate)\. + * To stop the use of a service in your IBM Cloud account, [delete your service](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/stopapps.html?context=cdpaas&locale=en#deleteapps) in your IBM Cloud account\. + * To stop all use of all IBM Cloud services in your account, [delete your IBM Cloud account](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/stopapps.html?context=cdpaas&locale=en#deletecloud)\. + + + +When other users in your account stop using IBM watsonx, they are cleaned up appropriately\. + +### Leave IBM watsonx ### + +If you want to leave IBM watsonx: + + + +1. Log in to IBM watsonx\. +2. Click your avatar and then **Profile**\. +3. On the **Profile** page, click **Leave watsonx**\. If you change your mind about leaving, you can [sign up to re\-activate your profile](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/signup-wx.html)\. + + + +Use this process when you want to stop using IBM watsonx, you are not the account owner, and you want to keep your IBM Cloud account\. + +These are the results when you leave IBM watsonx: + + + + * Your profile is deleted and you can't log in to IBM watsonx\. + * Your projects and deployment spaces remain until you delete your services\. + * Your IBM Cloud account remains active\. + * Your IBM Cloud services are not affected\. + + + +## Delete a service ## + +To remove any of your services: + + + +1. Log in to IBM watsonx\. +2. Click **Administration > Services > Service instances**\. +3. Click the menu next to the service you want to remove and choose **Delete**\. + + + +This action is the same as deleting the service in IBM Cloud\. If you change your mind within 30 days, you can get your services and data back by reprovisioning the service\. + +These are the results when you delete the Watson Studio service: + + + + * Your IBM watsonx profile remains\. + * You can no longer access that service from that IBM Cloud account\. + * You can still access your services from other accounts\. + * Your billing for that service stops\. + * Your data in IBM Cloud Object Storage remains\. + * Your projects remain\. + * You remain a collaborator in all your projects in other IBM Cloud accounts\. + + + +## Closing a IBM Cloud account ## + +If you want to stop using IBM Cloud services altogether and delete all your data, you can deactivate your IBM Cloud account\. Follow these steps to close your Lite account: + + + +1. Sign in to your IBM Cloud account\. +2. In the IBM Cloud console, go to the **Manage > Account > Account settings** page\. +3. Click **Close Account**\. After an account is closed for 30 days, all data is deleted and all services are removed\. + + + +If you are not the owner of the account, you do not see a **Close Account** button\. + +These are the results when your IBM Cloud account is in the Canceled state: + + + + * All your data in IBM Cloud is permanently deleted in 30 days\. + * The projects and catalogs in your account are deleted\. + * Your IBM watsonx profile and your IBM Cloud profile are deleted\. + * All the IBM Cloud services in you account are deleted in 30 days\. + * You are removed as a collaborator from projects and catalogs in other accounts within 30 days\. + + + +If you want to close a Pay\-As\-You\-Go or Subscription account, contact [Support](https://cloud.ibm.com/unifiedsupport/supportcenter)\. + +## Learn more ## + + + + * [Removing users from the account or from the workspace](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-removeusers.html) + * [IBM Cloud docs: Leaving an account](https://cloud.ibm.com/docs/account?topic=account-account-membership) + * [IBM Cloud docs: Managing your account settings](https://cloud.ibm.com/docs/account?topic=account-account_settings) + + + +**Parent topic:**[Managing IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_console.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/58c6d0a1c6dad01e3f0f1748dc472c3ddcc07e43.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/58c6d0a1c6dad01e3f0f1748dc472c3ddcc07e43.md new file mode 100644 index 0000000..4f6737b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/58c6d0a1c6dad01e3f0f1748dc472c3ddcc07e43.md @@ -0,0 +1,50 @@ +# Foundation models + +# Foundation models # + +Build generative AI solutions with foundation models in IBM watsonx\.ai\. + +Foundation models are large AI models that have billions of parameters and are trained on terabytes of data\. Foundation models can do various tasks, including text, code, or image generation, classification, conversation, and more\. Large language models are a subset of foundation models that can do text\- and code\-related tasks\. Watsonx\.ai has a range of deployed large language models for you to try\. For details, see [Supported foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html)\. + +## Foundation model architecture ## + +Foundation models represent a fundamentally different model architecture and purpose for AI systems\. The following diagram illustrates the difference between traditional AI models and foundation models\. + +![Comparison of traditional AI models to foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fm-overview-diagram.png) + +As shown in the diagram, traditional AI models specialize in specific tasks\. Most traditional AI models are built by using machine learning, which requires a large, structured, well\-labeled data set that encompasses a specific task that you want to tackle\. Often these data sets must be sourced, curated, and labeled by hand, a job that requires people with domain knowledge and takes time\. After it is trained, a traditional AI model can do a single task well\. The traditional AI model uses what it learns from patterns in the training data to predict outcomes in unknown data\. You can create machine learning models for your specific use cases with tools like AutoAI and Jupyter notebooks, and then deploy them\. + +In contrast, foundation models are trained on large, diverse, unlabeled data sets and can be used for many different tasks\. Foundation models were first used to generate text by calculating the most\-probable next word in natural language translation tasks\. However, model providers are learning that, when prompted with the right input, foundation models can do various other tasks well\. Instead of creating your own foundation models, you use existing deployed models and engineer prompts to generate the results that you need\. + +## Methods of working with foundation models ## + +The possibilities and applications of foundation models are just starting to be discovered\. Explore and validate use cases with foundation models in watsonx\.ai to automate, simplify, and speed up existing processes or provide value in a new way\. + +You can interact with foundation models in the following ways: + + + + * Engineer prompts and inference deployed foundation models directly by using the Prompt Lab + * Inference deployed foundation models programmatically by using the Python library + * Tune foundation models to return output in a certain style or format by using the Tuning Studio + + + +## Learn more ## + + + + * [Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) + * [Python library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-python-lib.html) + * [Tuning Studio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-studio.html) + * [Security and privacy](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-security.html) + * [Model terms of use](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-disclaimer.html) + * [Tokens](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tokens.html) + * [Retrieval\-augmented generation](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-rag.html) + * [AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + + +**Parent topic:**[Analyzing data and working with models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-science.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/595bb1738027c777c1eb5a69631587923690abc4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/595bb1738027c777c1eb5a69631587923690abc4.md new file mode 100644 index 0000000..25fede6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/595bb1738027c777c1eb5a69631587923690abc4.md @@ -0,0 +1,31 @@ +# Working with strings (SPSS Modeler) + +# Working with strings # + +There are a number of operations available for strings\. + + + + * Converting a string to uppercase or lowercase—`uppertolower(CHAR)`\. + * Removing specified characters, such as `` `ID_` `` or `` `$` ``, from a string variable—`stripchar(CHAR,STRING)`\. + * Determining the length (number of characters) for a string variable—`length(STRING).` + * Checking the alphabetical ordering of string values—`alphabefore(STRING1, STRING2)`\. + * Removing leading or trailing white space from values—`trim(STRING)`, `trim_start(STRING)`, or `trimend(STRING)`\. + * Extract the first or last *n* characters from a string—`startstring(LENGTH, STRING)` or `endstring(LENGTH, STRING)`\. For example, suppose you have a field named *item* that combines a product name with a four\-digit ID code (`ACME CAMERA-D109`)\. To create a new field that contains only the four\-digit code, specify the following formula in a Derive node: + + endstring(4, item) + * Matching a specific pattern—`STRING matches PATTERN`\. For example, to select persons with "market" anywhere in their job title, you could specify the following in a Select node: + + job_title matches "*market*" + * Replacing all instances of a substring within a string—`replace(SUBSTRING, NEWSUBSTRING, STRING)`\. For example, to replace all instances of an unsupported character, such as a vertical pipe ( `|` ), with a semicolon prior to text mining, use the `replace` function in a Filler node\. Under Fill in fields in the node properties, select all fields where the character may occur\. For the Replace condition, select Always, and specify the following condition under Replace with\. + + replace('|',';',@FIELD) + * Deriving a flag field based on the presence of a specific substring\. For example, you could use a string function in a Derive node to generate a separate flag field for each response with an expression such as: + + + + hassubstring(museums,"museum_of_design") + +See [String functions](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_string.html#clem_function_ref_string) for more information\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/59cdbabc75e7ec8987a3c464f3277923f444a724.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/59cdbabc75e7ec8987a3c464f3277923f444a724.md new file mode 100644 index 0000000..193b75e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/59cdbabc75e7ec8987a3c464f3277923f444a724.md @@ -0,0 +1,17 @@ +# Defining the targets (SPSS Modeler) + +# Defining the targets # + + + +1. Add a Type node after the Filler node, then double\-click the Type node to open its properties\. +2. Set the role to None for the `DATE_` field\. Set the role to Target for all other fields (the `Market_n` fields plus the `Total` field)\. +3. Click Read Values to populate the Values column\. + + Figure 1. Setting the role for fields + + ![Setting the role for fields](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_bandwidth_forecast_targets.png) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/59df73d502b5f62e3837464e81ac6bc9fdf07014.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/59df73d502b5f62e3837464e81ac6bc9fdf07014.md new file mode 100644 index 0000000..a917d43 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/59df73d502b5f62e3837464e81ac6bc9fdf07014.md @@ -0,0 +1,39 @@ +# IBM Cloud services in the IBM watsonx services catalog + +# IBM Cloud services in the IBM watsonx services catalog # + +You can provision IBM® Cloud service instances for the watsonx platform\. + +The IBM watsonx\.ai component provides the following services that provide key functionality, including tools and compute resources: + + + + * [Watson™ Studio](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/wsl.html) + * [Watson Machine Learning](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/wml.html) + + + +If you signed up for watsonx\.ai, you already have these services\. Otherwise, you can create instances of these services from the Services catalog\. + +If you signed up for watsonx\.governance, you already have this service\. Otherwise, you can create an instance of this service from the Services catalog\. + +The [IBM Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/cloud-object-storage.html) provides storage for projects and deployment spaces on the IBM watsonx platform\. + +The [Secure Gateway](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/secure-gateway.html) service provides secure connections to on\-premises date sources\. + +These services provide databases that you can access in IBM watsonx by creating connections: + + + + * [IBM Analytics Engine](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/spark.html) + * [Cloudant](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/cloudant.html) + * [Databases for Elasticsearch](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/elasticsearch.html) + * [Databases for EDB](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/edb.html) + * [Databases for MongoDB](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/mongodb.html) + * [Databases for PostgreSQL](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/postgresql.html) + * [Db2®](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/db2oltp.html) + * [Db2 Warehouse](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/db2wh.html) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5a328cf6319859f041c48974e44046bcfcea3b87.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5a328cf6319859f041c48974e44046bcfcea3b87.md new file mode 100644 index 0000000..f9edeb3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5a328cf6319859f041c48974e44046bcfcea3b87.md @@ -0,0 +1,31 @@ +# Building the flow (SPSS Modeler) + +# Building the flow # + +Figure 1\. Feature Selection example flow + +![Feature Selection example flow](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_screening.png) + + + +1. Add a Data Asset node that points to customer\_dbase\.csv\. +2. Add a Type node after the Data Asset node\. +3. Double\-click the Type node to open its properties, and change the role for `response_01` to Target\. Change the role to None for the other response fields (`response_02` and `response_03`) and for the customer ID (`custid`) field\. Leave the role set to Input for all other fields\. + + Figure 2. Adding a Type node + + ![Adding a Type node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_screening_target.png) +4. Click Read Values and then click Save\. +5. Add a Feature Selection modeling node after the Type node\. In the node properties, the rules and criteria used for screening or disqualifying fields are defined\. + + Figure 3. Adding a Feature Selection node + + ![Adding a Feature Selection node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_screening_criteria.png) +6. Run the flow to generate the Feature Selection model nugget\. +7. To look at the results, right\-click the model nugget and choose View Model\. The results show the fields found to be useful in the prediction, ranked by importance\. By examining these fields, you can decide which ones to use in subsequent modeling sessions\. +8. To compare results without feature selection, you must add two CHAID modeling nodes to the flow: one that uses feature selection and one that doesn't\. Add two CHAID nodes, one connected to the Type node and the other connected to the Feature Selection model nugget, as shown in the example flow at the beginning of this section\. +9. Double\-click each CHAID node to open its properties\. Under Objectives, make sure that Build new model and Create a standard model are selected\. Under , select Custom and set it to 5\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5a6081124d93acd0a12843f64984257a02bb3871.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5a6081124d93acd0a12843f64984257a02bb3871.md new file mode 100644 index 0000000..9fc3b5e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5a6081124d93acd0a12843f64984257a02bb3871.md @@ -0,0 +1,19 @@ +# Troubleshooting connections + +# Troubleshooting connections # + +Use these solutions to resolve problems that you might encounter with connections\. + +## IBM Db2 for z/OS: Error retrieving the schema list when you try to connect to a Db2 for z/OS server ## + +When you test the connection to a Db2 for z/OS server and the connection cannot retrieve the schema list, you might receive the following error: + + CDICC7002E: The assets request failed: CDICO2064E: The metadata for the column TABLE_SCHEM could not + be obtained: Sql error: [jcc] [10300] Invalid parameter: Unknown column name + TABLE_SCHEM. ERRORCODE=-4460, SQLSTATE=null + +**Workaround:** On the Db2 for z/OS server, set the **DESCSTAT** subsystem parameter to `No`\. For more information, see [DESCRIBE FOR STATIC field (DESCSTAT subsystem parameter)](https://www.ibm.com/docs/SSEPEK_13.0.0/inst/src/tpc/db2z_ipf_descstat.html)\. + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5a812008b8370853f0c151fde4dfeda4a39193cb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5a812008b8370853f0c151fde4dfeda4a39193cb.md new file mode 100644 index 0000000..813f6f9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5a812008b8370853f0c151fde4dfeda4a39193cb.md @@ -0,0 +1,6 @@ +# Relationship charts + +# Relationship charts # + +A relationship chart is useful for determining how variables relate to each other\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5a8aa187972ba8a711ac91447f668b233e580c8c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5a8aa187972ba8a711ac91447f668b233e580c8c.md new file mode 100644 index 0000000..6b828d2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5a8aa187972ba8a711ac91447f668b233e580c8c.md @@ -0,0 +1,17 @@ +# Cox node (SPSS Modeler) + +# Cox node # + +Cox Regression builds a predictive model for time\-to\-event data\. The model produces a survival function that predicts the probability that the event of interest has occurred at a given time `t` for given values of the predictor variables\. The shape of the survival function and the regression coefficients for the predictors are estimated from observed subjects; the model can then be applied to new cases that have measurements for the predictor variables\. + +Note that information from censored subjects, that is, those that do not experience the event of interest during the time of observation, contributes usefully to the estimation of the model\. + +Example\. As part of its efforts to reduce customer churn, a telecommunications company is interested in modeling the time to churn in order to determine the factors that are associated with customers who are quick to switch to another service\. To this end, a random sample of customers is selected, and their time spent as customers (whether or not they are still active customers) and various demographic fields are pulled from the database\. + +Requirements\. You need one or more input fields, exactly one target field, and you must specify a survival time field within the Cox node\. The target field should be coded so that the "false" value indicates survival and the "true" value indicates that the event of interest has occurred; it must have a measurement level of `Flag`, with string or integer storage\. (Storage can be converted using a Filler or Derive node if necessary\. ) Fields set to `Both` or `None` are ignored\. Fields used in the model must have their types fully instantiated\. The survival time can be any numeric field\. Note: On scoring a Cox Regression model, an error is reported if empty strings in categorical variables are used as input to model building\. Avoid using empty strings as input\. + +Dates & Times\. Date & Time fields cannot be used to directly define the survival time; if you have Date & Time fields, you should use them to create a field containing survival times, based upon the difference between the date of entry into the study and the observation date\. + +Kaplan\-Meier Analysis\. Cox regression can be performed with no input fields\. This is equivalent to a Kaplan\-Meier analysis\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5ae2f0d8bd974c7393bc5ffa773b90fd0a2229b0.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5ae2f0d8bd974c7393bc5ffa773b90fd0a2229b0.md new file mode 100644 index 0000000..1caaf7c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5ae2f0d8bd974c7393bc5ffa773b90fd0a2229b0.md @@ -0,0 +1,9 @@ +# Summary (SPSS Modeler) + +# Summary # + +You've successfully modeled a complex time series, incorporating not only an upward trend but also seasonal and other variations\. You've also seen how, through trial and error, you can get closer and closer to an accurate model, which you can then use to forecast future sales\. + +In practice, you would need to reapply the model as your actual sales data are updated—for example, every month or every quarter—and produce updated forecasts\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b0b25c87c4c2d91e8376d2aff3726e4ca355f36.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b0b25c87c4c2d91e8376d2aff3726e4ca355f36.md new file mode 100644 index 0000000..592d9f5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b0b25c87c4c2d91e8376d2aff3726e4ca355f36.md @@ -0,0 +1,345 @@ +# Interactive code templates in Data Refinery + +# Interactive code templates in Data Refinery # + +Data Refinery provides interactive templates for you to code operations, functions, and logical operators\. Access the templates from the command\-line text box at the top of the page\. The templates include interactive assistance to help you with the syntax options\. + +Important: Support is for the operations and functions in the user interface\. If you insert other operations or functions from an open source library, the Data Refinery flow might fail\. See the command\-line help and be sure to use the list of operations or functions from the templates\. Use the examples in the templates to further customize the syntax as needed\. + + + + * [Operations](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/code_operations.html?context=cdpaas&locale=en#operations) + * [Functions](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/code_operations.html?context=cdpaas&locale=en#functions) + * [Logical operators](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/code_operations.html?context=cdpaas&locale=en#logical_operators) + + + +## Operations ## + +### arrange ### + +arrange(\```\`) +Sort rows, in ascending order, by the specified columns\. + +arrange(desc(\```\`)) +Sort rows, in descending order, by the specified column\. + +arrange(\```\`, \```\`) +Sort rows, in ascending order, by each specified, successive column, keeping the order from the prior sort intact\. + +### count ### + +count() +Total the data by group\. + +count(\```\`) +Group the data by the specified column and return the number of rows with unique values (for string values) or return the total for each group (for numeric values)\. + +count(\```\`, wt=\```\`) +Group the data by the specified column and return the number of rows with unique values (for string values) or return the total for each group (for numeric values) in the specified weight column\. + +count(\```\`, wt=``(\```\`)) +Group the data by the specified column and return the result of the function applied to the specified weight column\. + +count(\```\`, wt=``(\```\`), sort = ``) +Group the data by the specified column and return the result of the function applied to the specified weight column, sorted or not\. + +### distinct ### + +distinct() +Keep distinct, unique rows based on all columns or on specified columns\. + +### filter ### + +filter(\```\` `` provide\_value) +Keep rows that meet the specified condition and filter out all other rows\. +For the Boolean column type, provide\_value should be uppercase TRUE or FALSE\. + +filter(\```\`== ``) +Keep rows that meet the specified filter conditions based on logical value TRUE or FALSE\. + +filter(``(\```\`) `` provide\_value) +Keep rows that meet the specified condition and filter out all other rows\. The condition can apply a function to a column on the left side of the operator\. + +filter(\```\` ````) +Keep rows that meet the specified condition and filter out all other rows\. The condition can apply a function to a column on the right side of the operator\. + +filter(``) +Keep rows that meet the specified condition and filter out all other rows\. The condition can apply a logical function to a column\. + +filter(\```\` `` provide\_value `` \```\` `` provide\_value ) +Keep rows that meet the specified conditions and filter out all other rows\. + +### group\_by ### + +group\_by(\```\`) +Group the data based on the specified column\. + +group\_by(desc(\```\`)) +Group the data, in descending order, based on the specified column\. + +### mutate ### + +mutate(provide\_new\_column = \```\`) +Add a new column and keep existing columns\. + +mutate(provide\_new\_column = ``) +Add a new column by using the specified expression, which applies a function to a column\. Keep existing columns\. + +mutate(provide\_new\_column = case\_when(\```\` `` provide\_value\_or\_column\_to\_compare ~ provide\_value\_or\_column\_to\_replace, \```\` `` provide\_value\_or\_column\_to\_compare ~ provide\_value\_or\_column\_to\_replace, TRUE ~ provide\_default\_value\_or\_column)) +Add a new column by using the specified conditional expression\. + +mutate(provide\_new\_column = \```\` `` \```\`) +Add a new column by using the specified expression, which performs a calculation with existing columns\. Keep existing columns\. + +mutate(provide\_new\_column = coalesce(\```\`, \```\`)) +Add a new column by using the specified expression, which replaces missing values in the new column with values from another, specified column\. As an alternative to specifying another column, you can specify a value, a function on a column, or a function on a value\. Keep existing columns\. + +mutate(provide\_new\_column = if\_else(\```\` `` provide\_value, provide\_value\_for\_true, provide\_value\_for\_false)) +Add a new column by using the specified conditional expression\. Keep existing columns\. + +mutate(provide\_new\_column = \```\`, provide\_new\_column = \```\`) +Add multiple new columns and keep existing columns\. + +mutate(provide\_new\_column = n()) +Count the values in the groups\. Ensure grouping is done already using group\_by\. Keep existing columns\. + +### mutate\_all ### + +mutate\_all(funs(``)) +Apply the specified function to all of the columns and overwrite the existing values in those columns\. Specify whether to remove missing values\. + +mutate\_all(funs(\. `` provide\_value)) +Apply the specified operator to all of the columns and overwrite the existing values in those columns\. + +mutate\_all(funs("provide\_value" = \. `` provide\_value)) +Apply the specified operator to all of the columns and create new columns to hold the results\. Give the new columns names that end with the specified value\. + +### mutate\_at ### + +mutate\_at(vars(\```\`), funs(``)) +Apply functions to the specified columns\. + +### mutate\_if ### + +mutate\_if(``, ``) +Apply functions to the columns that meet the specified condition\. + +mutate\_if(``, funs( \. `` provide\_value)) +Apply the specified operator to the columns that meet the specified condition\. + +mutate\_if(``, funs(``)) +Apply functions to the columns that meet the specified condition\. Specify whether to remove missing values\. + +### rename ### + +rename(provide\_new\_column = \```\`) +Rename the specified column\. + +### sample\_frac ### + +sample\_frac(provide\_number\_between\_0\_and\_1, weight=\```\`,replace=``) +Generate a random sample based on a percentage of the data\. weight is optional and is the ratio of probability the row will be chosen\. Provide a numeric column\. replace is optional and its Default is FALSE\. + +### sample\_n ### + +sample\_n(provide\_number\_of\_rows,weight=\```\`,replace=``) +Generate a random sample of data based on a number of rows\. weight is optional and is the ratio of probability the row will be chosen\. Provide a numeric column\. replace is optional and its default is FALSE\. + +### select ### + +select(\```\`) +Keep the specified column\. + +select(\-\```\`) +Remove the specified column\. + +select(starts\_with("provide\_text\_value")) +Keep columns with names that start with the specified value\. + +select(ends\_with("provide\_text\_value")) +Keep columns with names that end with the specified value\. + +select(contains("provide\_text\_value")) +Keep columns with names that contain the specified value\. + +select(matches ("provide\_text\_value")) +Keep columns with names that match the specified value\. The specified value can be text or a regular expression\. + +select(\```\`:\```\`) +Keep the columns in the specified range\. Specify the range as from one column to another column\. + +select(\```\`, everything()) +Keep all of the columns, but make the specified column the first column\. + +select(\```\`, \```\`) +Keep the specified columns\. + +### select\_if ### + +select\_if(``) Keep columns that meet the specified condition\. Supported functions include: + + + + * contains + * ends\_with + * matches + * num\_range + * starts\_with + + + +### summarize ### + +summarize(provide\_new\_column = ``(\```\`)) +Apply aggregate functions to the specified columns to reduce multiple column values to a single value\. Be sure to group the column data first by using the group\_by operation\. + +### summarize\_all ### + +summarize\_all(``) +Apply an aggregate function to all of the columns to reduce multiple column values to a single value\. Specify whether to remove missing values\. Be sure to group the column data first by using the group\_by operation\. + +summarize\_all(funs(``)) +Apply multiple aggregate functions to all of the columns to reduce multiple column values to a single value\. Create new columns to hold the results\. Specify whether to remove missing values\. Be sure to group the column data first by using the group\_by operation\. + +### summarize\_if ### + +summarize\_if(``,\.\.\.) +Apply aggregate functions to columns that meet the specified conditions to reduce multiple column values to a single value\. Specify whether to remove missing values\. Be sure to group the column data first by using the group\_by operation\. Supported functions include: + + + + * count + * max + * mean + * min + * standard deviation + * sum + + + +### tally ### + +tally() +Counts the number of rows (for string columns) or totals the data (for numeric values) by group\. Be sure to group the column data first by using the group\_by operation\. + +tally(wt=\```\`) +Counts the number of rows (for string columns) or totals the data (for numeric columns) by group for the weighted column\. + +tally( wt=``(\```\`), sort = ``) +Applies a function to the specified weighted column and returns the result, by group, sorted or not\. + +### top\_n ### + +top\_n(provide\_value) +Select the top or bottom N rows (by value) in each group\. Specify a positive integer to select the top N rows; specify a negative integer to select the bottom N rows\. + +top\_n(provide\_value, \```\`) +Select the top or bottom N rows (by value) in each group, based on the specified column\. Specify a positive integer to select the top N rows; specify a negative integer to select the bottom N rows\. + +If duplicate rows affect the count, use the **Remove duplicates** GUI operation prior to using the top\_n() operation\. + +### transmute ### + +transmute(`` = \```\`) +Add a new column or overwrite an existing one by using the specified expression\. Keep only columns that are mentioned in the expression\. + +transmute(`` = ``) +Add a new column or overwrite an existing one by applying a function to the specified column\. Keep only columns that are mentioned in the expression\. + +transmute(`` = \```\` `` \```\`) +Add a new column or overwrite an existing one by applying an operator to the specified column\. Keep only columns that are mentioned in the expression\. + +transmute(`` = \```\`, `` = \```\`) +Add multiple new columns\. Keep only columns that are mentioned in the expression\. + +transmute(`` = if\_else( provide\_value, provide\_value\_for\_true, provide\_value\_for\_false)) +Add a new column or overwrite an existing one by using the specified conditional expressions\. Keep only columns that are mentioned in the expressions\. + +### ungroup ### + +ungroup() +Ungroup the data\. + +## Functions ## + +### Aggregate ### + + + + * mean + * min + * n + * sd + * sum + + + +### Logical ### + + + + * is\.na + + + +### Numerical ### + + + + * abs + * coalesce + * cut + * exp + * floor + + + +### Text ### + + + + * c + * coalesce + * paste + * tolower + * toupper + + + +### Type ### + + + + * as\.character + * as\.double + * as\.integer + * as\.logical + + + +## Logical operators ## + + + + * < + + * <= + + * >= + + * > + + * between + + * \!= + + * == + + * %in% + + + +**Parent topic:**[Refining data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b37710fe7bbd6efb842feb7b49b036302e18f81.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b37710fe7bbd6efb842feb7b49b036302e18f81.md new file mode 100644 index 0000000..b04cb6b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b37710fe7bbd6efb842feb7b49b036302e18f81.md @@ -0,0 +1,415 @@ +# Supported foundation models available with watsonx.ai + +# Supported foundation models available with watsonx\.ai # + +A collection of open source and IBM foundation models are deployed in IBM watsonx\.ai\. + +The following models are available in watsonx\.ai: + + + + * flan\-t5\-xl\-3b + * flan\-t5\-xxl\-11b + * flan\-ul2\-20b + * gpt\-neox\-20b + * granite\-13b\-chat\-v2 + * granite\-13b\-chat\-v1 + * granite\-13b\-instruct\-v2 + * granite\-13b\-instruct\-v1 + * llama\-2\-13b\-chat + * llama\-2\-70b\-chat + * mpt\-7b\-instruct2 + * mt0\-xxl\-13b + * starcoder\-15\.5b + + + +You can prompt these models in the Prompt Lab or programmatically by using the Python library\. + +## Summary of models ## + +To understand how the model provider, instruction tuning, token limits, and other factors can affect which model you choose, see [Choosing a model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-model-choose.html)\. + +The following table lists the supported foundation models that IBM provides\. + + + +Table 1\. IBM foundation models in watsonx\.ai + +| Model name | Provider | Instruction\-tuned | Billing class | Maximum tokens
Context (input \+ output) | More information | +| -------------------------------------------------------- | -------- | ------------------ | ------------- | --------------------------------------------- | ------------------------------------------------------------------------- | +| [granite\-13b\-chat\-v2](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=cdpaas&locale=en#granite-13b-chat) | IBM | Yes | Class 2 | 8192 | • [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/ibm/granite-13b-chat-v2?context=wx)
• [Website](https://www.ibm.com/blog/watsonx-tailored-generative-ai/)
• [Research paper](https://www.ibm.com/downloads/cas/X9W4O6BM) | +| [granite\-13b\-chat\-v1](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=cdpaas&locale=en#granite-13b-chat-v1) | IBM | Yes | Class 2 | 8192 | • [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/ibm/granite-13b-chat-v1?context=wx)
• [Website](https://www.ibm.com/blog/watsonx-tailored-generative-ai/)
• [Research paper](https://www.ibm.com/downloads/cas/X9W4O6BM) | +| [granite\-13b\-instruct\-v2](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=cdpaas&locale=en#granite-13b-instruct) | IBM | Yes | Class 2 | 8192 | • [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/ibm/granite-13b-instruct-v2?context=wx)
• [Website](https://www.ibm.com/blog/watsonx-tailored-generative-ai/)
• [Research paper](https://www.ibm.com/downloads/cas/X9W4O6BM) | +| [granite\-13b\-instruct\-v1](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=cdpaas&locale=en#granite-13b-instruct-v1) | IBM | Yes | Class 2 | 8192 | • [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/ibm/granite-13b-instruct-v1?context=wx)
• [Website](https://www.ibm.com/blog/watsonx-tailored-generative-ai/)
• [Research paper](https://www.ibm.com/downloads/cas/X9W4O6BM) | + + + +The following table lists the supported foundation models that third parties provide through Hugging Face\. + + + +Table 2\. Supported third party foundation models in watsonx\.ai + +| Model name | Provider | Instruction\-tuned | Billing class | Maximum tokens
Context (input \+ output) | More information | +| ------------------------------------------ | ---------- | ------------------ | ------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------- | +| [flan\-t5\-xl\-3b](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=cdpaas&locale=en#flan-t5-xl-3b) | Google | Yes | Class 1 | 4096 | • [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/google/flan-t5-xl?context=wx)
• [Research paper](https://arxiv.org/abs/2210.11416) | +| [flan\-t5\-xxl\-11b](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=cdpaas&locale=en#flan-t5-xxl-11b) | Google | Yes | Class 2 | 4096 | • [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/google/flan-t5-xxl?context=wx)
• [Research paper](https://arxiv.org/abs/2210.11416) | +| [flan\-ul2\-20b](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=cdpaas&locale=en#flan-ul2-20b) | Google | Yes | Class 3 | 4096 | • [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/google/flan-ul2?context=wx)
• [UL2 research paper](https://arxiv.org/abs/2205.05131v1)
• [Flan research paper](https://arxiv.org/abs/2210.11416) | +| [gpt\-neox\-20b](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=cdpaas&locale=en#gpt-neox-20b) | EleutherAI | No | Class 3 | 8192 | • [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/eleutherai/gpt-neox-20b?context=wx)
• [Research paper](https://arxiv.org/abs/2204.06745) | +| [llama\-2\-13b\-chat](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=cdpaas&locale=en#llama-2) | Meta | Yes | Class 1 | 4096 | • [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/meta-llama/llama-2-13b-chat?context=wx)
• [Research paper](https://arxiv.org/abs/2307.09288) | +| [llama\-2\-70b\-chat](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=cdpaas&locale=en#llama-2) | Meta | Yes | Class 2 | 4096 | • [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/meta-llama/llama-2-70b-chat?context=wx)
• [Research paper](https://arxiv.org/abs/2307.09288) | +| [mpt\-7b\-instruct2](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=cdpaas&locale=en#mpt-7b-instruct2) | Mosaic ML | Yes | Class 1 | 2048 | • [Model card](https://huggingface.co/ibm/mpt-7b-instruct2)
• [Website](https://www.mosaicml.com/blog/mpt-7b) | +| [mt0\-xxl\-13b](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=cdpaas&locale=en#mt0-xxl-13b) | BigScience | Yes | Class 2 | 4096 | • [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/bigscience/mt0-xxl?context=wx)
• [Research paper](https://arxiv.org/abs/2211.01786) | +| [starcoder\-15\.5b](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=cdpaas&locale=en#starcoder-15.5b) | BigCode | No | Class 2 | 8192 | • [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/bigcode/starcoder?context=wx)
• [Research paper](https://arxiv.org/abs/2305.06161) | + + + + + + * For a list of which models are provided in each regional data center, see [Regional availability of foundation model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/regional-datactr.html#data-centers)\. + * For information about the billing classes and rate limiting, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html#ru-metering)\. + + + +## Foundation model details ## + +The available foundation models support a range of use cases for both natural languages and programming languages\. To see the types of tasks that these models can do, review and try the [sample prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html)\. + +### flan\-t5\-xl\-3b ### + +The flan\-t5\-xl\-3b model is provided by Google on Hugging Face\. This model is based on the pretrained text\-to\-text transfer transformer (T5) model and uses instruction fine\-tuning methods to achieve better zero\- and few\-shot performance\. The model is also fine\-tuned with chain\-of\-thought data to improve its ability to perform reasoning tasks\. + +**Note**: This foundation model can be tuned by using the Tuning Studio\. + +**Usage** : General use with zero\- or few\-shot prompts\. + +**Cost** : Class 1\. For pricing details, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +**Try it out** : [Sample prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html) + +**Size** : 3 billion parameters + +**Token limits** : Context window length (input \+ output): 4096 + +: **Note**: Lite plan output is limited to 700 + +**Supported natural languages** : English, German, French + +**Instruction tuning information** : The model was fine\-tuned on tasks that involve multiple\-step reasoning from chain\-of\-thought data in addition to traditional natural language processing tasks\. + + Details about the training data sets used are published. + +**Model architecture** : Encoder\-decoder + +**License** : [Apache 2\.0 license](https://www.apache.org/licenses/LICENSE-2.0.txt) + +**Learn more** : [Research paper](https://arxiv.org/abs/2210.11416) : [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/google/flan-t5-xl?context=wx) : [Sample notebook: Tune a model to classify CFPB documents in watsonx](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/bf57e8896f3e50c638b5a378780f7502) + +### flan\-t5\-xxl\-11b ### + +The flan\-t5\-xxl\-11b model is provided by Google on Hugging Face\. This model is based on the pretrained text\-to\-text transfer transformer (T5) model and uses instruction fine\-tuning methods to achieve better zero\- and few\-shot performance\. The model is also fine\-tuned with chain\-of\-thought data to improve its ability to perform reasoning tasks\. + +**Usage** : General use with zero\- or few\-shot prompts\. + +**Cost** : Class 2\. For pricing details, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +**Try it out** : [Sample prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html) : [Sample notebook: Use watsonx and Google flan\-t5\-xxl to generate advertising copy](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/73243d67b49a6e05f4cdf351b4b35e21?context=wx) : [Sample notebook: Use watsonx and LangChain to make a series of calls to a language model](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/c3dbf23a-9a56-4c4b-8ce5-5707828fc981?context=wx) + +**Size** : 11 billion parameters + +**Token limits** : Context window length (input \+ output): 4096 + +: **Note**: Lite plan output is limited to 700 + +**Supported natural languages** : English, German, French + +**Instruction tuning information** : The model was fine\-tuned on tasks that involve multiple\-step reasoning from chain\-of\-thought data in addition to traditional natural language processing tasks\. Details about the training data sets used are published\. + +**Model architecture** : Encoder\-decoder + +**License** : [Apache 2\.0 license](https://www.apache.org/licenses/LICENSE-2.0.txt) + +**Learn more** : [Research paper](https://arxiv.org/abs/2210.11416) : [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/google/flan-t5-xxl?context=wx) + +### flan\-ul2\-20b ### + +The flan\-ul2\-20b model is provided by Google on Hugging Face\. This model was trained by using the Unifying Language Learning Paradigms (UL2)\. The model is optimized for language generation, language understanding, text classification, question answering, common sense reasoning, long text reasoning, structured\-knowledge grounding, and information retrieval, in\-context learning, zero\-shot prompting, and one\-shot prompting\. + +**Usage** : General use with zero\- or few\-shot prompts\. + +**Cost** : Class 3\. For pricing details, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +**Try it out** : [Sample prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html) : [Sample notebook: Use watsonx to summarize cybersecurity documents](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/1cb62d6a5847b8ed5cdb6531a08e9104?context=wx) : [Sample notebook: Use watsonx and LangChain to answer questions by using retrieval\-augmented generation (RAG)](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/d3a5f957-a93b-46cd-82c1-c8d37d4f62c6?context=wx&audience=wdp) : [Sample notebook: Use watsonx, Elasticsearch, and LangChain to answer questions (RAG)](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/ebeb9fc0-9844-4838-aff8-1fa1997d0c13?context=wx&audience=wdp) : [Sample notebook: Use watsonx, and Elasticsearch Python SDK to answer questions (RAG)](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/bdbc8ad4-9c1f-460f-99ee-5c3a1f374fa7?context=wx&audience=wdp) + +**Size** : 20 billion parameters + +**Token limits** : Context window length (input \+ output): 4096 + +: **Note**: Lite plan output is limited to 700 + +**Supported natural languages** : English + +**Instruction tuning information** : The flan\-ul2\-20b model is pretrained on the colossal, cleaned version of Common Crawl's web crawl corpus\. The model is fine\-tuned with multiple pretraining objectives to optimize it for various natural language processing tasks\. Details about the training data sets used are published\. + +**Model architecture** : Encoder\-decoder + +**License** : [Apache 2\.0 license](https://www.apache.org/licenses/LICENSE-2.0.txt) + +**Learn more** : [Unifying Language Learning (UL2) research paper](https://arxiv.org/abs/2205.05131v1) : [Fine\-tuned Language Model (Flan) research paper](https://arxiv.org/abs/2210.11416) + +: [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/google/flan-ul2?context=wx) + +### gpt\-neox\-20b ### + +The gpt\-neox\-20b model is provided by EleutherAI on Hugging Face\. This model is an autoregressive language model that is trained on diverse English\-language texts to support general\-purpose use cases\. GPT\-NeoX\-20B has not been fine\-tuned for downstream tasks\. + +**Usage** : Works best with few\-shot prompts\. Accepts special characters, which can be used for generating structured output\. : The data set used for training contains profanity and offensive text\. Be sure to curate any output from the model before using it in an application\. + +**Cost** : Class 3\. For pricing details, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +**Try it out** : [Sample prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html) + +**Size** : 20 billion parameters + +**Token limits** : Context window length (input \+ output): 8192 + +: **Note**: Lite plan output is limited to 700 + +**Supported natural languages** : English + +**Data used during training** : The gpt\-neox\-20b model was trained on the Pile\. For more information about the Pile, see [The Pile: An 800GB Dataset of Diverse Text for Language Modeling](https://arxiv.org/abs/2101.00027)\. The Pile was not deduplicated before being used for training\. + +**Model architecture** : Decoder + +**License** : [Apache 2\.0 license](https://www.apache.org/licenses/LICENSE-2.0.txt) + +**Learn more** : [Research paper](https://arxiv.org/abs/2204.06745) + +: [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/eleutherai/gpt-neox-20b?context=wx) + +### granite\-13b\-chat\-v2 ### + +The granite\-13b\-chat\-v2 model is provided by IBM\. This model is optimized for dialogue use cases and works well with virtual agent and chat applications\. + +**Usage** : Generates dialogue output like a chatbot\. Uses a model\-specific prompt format\. Includes a keyword in its output that can be used as a stop sequence to produce succinct answers\. + +**Cost** : Class 2\. For pricing details, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +**Try it out** : [Sample prompt](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#sample7a) + +**Size** : 13 billion parameters + +**Token limits** : Context window length (input \+ output): 8192 + +**Supported natural languages** : English + +**Instruction tuning information** : The Granite family of models is trained on enterprise\-relevant data sets from five domains: internet, academic, code, legal, and finance\. Data used to train the models first undergoes IBM data governance reviews and is filtered of text that is flagged for hate, abuse, or profanity by the IBM\-developed HAP filter\. IBM shares information about the training methods and data sets used\. + +**Model architecture** : Decoder + +**License** : [Terms of use](https://www.ibm.com/support/customer/csol/terms/?id=i126-6883) : For more information about contractual protections related to IBM watsonx\.ai, see the [IBM watsonx\.ai service description](https://www.ibm.com/support/customer/csol/terms/?id=i126-7747)\. + +**Learn more** : [Model information](https://www.ibm.com/blog/watsonx-tailored-generative-ai/) : [Research paper](https://www.ibm.com/downloads/cas/X9W4O6BM) + +: [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/ibm/granite-13b-chat-v2?context=wx) + +### granite\-13b\-chat\-v1 ### + +The granite\-13b\-chat\-v1 model is provided by IBM\. This model is optimized for dialogue use cases and works well with virtual agent and chat applications\. + +**Usage** : Generates dialogue output like a chatbot\. Uses a model\-specific prompt format\. Includes a keyword in its output that can be used as a stop sequence to produce succinct answers\. + +**Cost** : Class 2\. For pricing details, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +**Try it out** : [Sample prompt](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#sample7a) + +**Size** : 13 billion parameters + +**Token limits** : Context window length (input \+ output): 8192 + +**Supported natural languages** : English + +**Instruction tuning information** : The Granite family of models is trained on enterprise\-relevant data sets from five domains: internet, academic, code, legal, and finance\. Data used to train the models first undergoes IBM data governance reviews and is filtered of text that is flagged for hate, abuse, or profanity by the IBM\-developed HAP filter\. IBM shares information about the training methods and data sets used\. + +**Model architecture** : Decoder + +**License** : [Terms of use](https://www.ibm.com/support/customer/csol/terms/?id=i126-6883) : For more information about contractual protections related to IBM watsonx\.ai, see the [IBM watsonx\.ai service description](https://www.ibm.com/support/customer/csol/terms/?id=i126-7747)\. + +**Learn more** : [Model information](https://www.ibm.com/blog/watsonx-tailored-generative-ai/) : [Research paper](https://www.ibm.com/downloads/cas/X9W4O6BM) + +: [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/ibm/granite-13b-chat-v1?context=wx) + +### granite\-13b\-instruct\-v2 ### + +The granite\-13b\-instruct\-v2 model is provided by IBM\. This model was trained with high\-quality finance data, and is a top\-performing model on finance tasks\. Financial tasks evaluated include: providing sentiment scores for stock and earnings call transcripts, classifying news headlines, extracting credit risk assessments, summarizing financial long\-form text, and answering financial or insurance\-related questions\. + +**Usage** : Supports extraction, summarization, and classification tasks\. Generates useful output for finance\-related tasks\. Uses a model\-specific prompt format\. Accepts special characters, which can be used for generating structured output\. + +**Cost** : Class 2\. For pricing details, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +**Try it out** : [Sample 3b: Generate a numbered list on a particular theme](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#sample3b) : [Sample 4c: Answer a question based on a document](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#sample4c) : [Sample 4d: Answer general knowledge questions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#sample4d) + +: [Sample notebook: Use watsonx and ibm/granite\-13b\-instruct to analyze car rental customer satisfaction from text](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/61c1e967-8d10-44bb-a846-cc1f27e9e69a?context=wx) + +**Size** : 13 billion parameters + +**Token limits** : Context window length (input \+ output): 8192 + +**Supported natural languages** : English + +**Instruction tuning information** : The Granite family of models is trained on enterprise\-relevant data sets from five domains: internet, academic, code, legal, and finance\. Data used to train the models first undergoes IBM data governance reviews and is filtered of text that is flagged for hate, abuse, or profanity by the IBM\-developed HAP filter\. IBM shares information about the training methods and data sets used\. + +**Model architecture** : Decoder + +**License** : [Terms of use](https://www.ibm.com/support/customer/csol/terms/?id=i126-6883) : For more information about contractual protections related to IBM watsonx\.ai, see the [IBM watsonx\.ai service description](https://www.ibm.com/support/customer/csol/terms/?id=i126-7747)\. + +**Learn more** : [Model information](https://www.ibm.com/blog/watsonx-tailored-generative-ai/) : [Research paper](https://www.ibm.com/downloads/cas/X9W4O6BM) + +: [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/ibm/granite-13b-instruct-v2?context=wx) + +### granite\-13b\-instruct\-v1 ### + +The granite\-13b\-instruct\-v1 model is provided by IBM\. This model was trained with high\-quality finance data, and is a top\-performing model on finance tasks\. Financial tasks evaluated include: providing sentiment scores for stock and earnings call transcripts, classifying news headlines, extracting credit risk assessments, summarizing financial long\-form text, and answering financial or insurance\-related questions\. + +**Usage** : Supports extraction, summarization, and classification tasks\. Generates useful output for finance\-related tasks\. Uses a model\-specific prompt format\. Accepts special characters, which can be used for generating structured output\. + +**Cost** : Class 2\. For pricing details, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +**Try it out** : [Sample 3b: Generate a numbered list on a particular theme](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#sample3b) : [Sample 4d: Answer general knowledge questions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#sample4d) + +: [Sample notebook: Use watsonx and ibm/granite\-13b\-instruct to analyze car rental customer satisfaction from text](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/61c1e967-8d10-44bb-a846-cc1f27e9e69a?context=wx) + +**Size** : 13 billion parameters + +**Token limits** : Context window length (input \+ output): 8192 + +**Supported natural languages** : English + +**Instruction tuning information** : The Granite family of models is trained on enterprise\-relevant data sets from five domains: internet, academic, code, legal, and finance\. Data used to train the models first undergoes IBM data governance reviews and is filtered of text that is flagged for hate, abuse, or profanity by the IBM\-developed HAP filter\. IBM shares information about the training methods and data sets used\. + +**Model architecture** : Decoder + +**License** : [Terms of use](https://www.ibm.com/support/customer/csol/terms/?id=i126-6883) : For more information about contractual protections related to IBM watsonx\.ai, see the [IBM watsonx\.ai service description](https://www.ibm.com/support/customer/csol/terms/?id=i126-7747)\. + +**Learn more** : [Model information](https://www.ibm.com/blog/watsonx-tailored-generative-ai/) : [Research paper](https://www.ibm.com/downloads/cas/X9W4O6BM) + +: [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/ibm/granite-13b-instruct-v1?context=wx) + +### Llama\-2 Chat ### + +The Llama\-2 Chat model is provided by Meta on Hugging Face\. The fine\-tuned model is useful for chat generation\. The model is pretrained with publicly available online data and fine\-tuned using reinforcement learning from human feedback\. + +You can choose to use the 13 billion parameter or 70 billion parameter version of the model\. + +**Usage** : Generates dialogue output like a chatbot\. Uses a model\-specific prompt format\. + +**Cost** : 13b: Class 1 : 70b: Class 2 : For pricing details, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +**Try it out** : [Sample prompt](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#sample7b) : [Sample notebook: Use watsonx and Meta llama\-2\-70b\-chat to answer questions about an article](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/b59922d8-678f-44e4-b5ef-18138890b444?context=wx) : [Sample notebook: Use watsonx and Meta llama\-2\-70b\-chat to answer questions about an article](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/b59922d8-678f-44e4-b5ef-18138890b444?context=wx) + +**Available sizes** : 13 billion parameters : 70 billion parameters + +**Token limits** : Context window length (input \+ output): 4096 + +: Lite plan output is limited as follows: : \- 70b version: 900 : \- 13b version: 2048 + +**Supported natural languages** : English + +**Instruction tuning information** : Llama 2 was pretrained on 2 trillion tokens of data from publicly available sources\. The fine\-tuning data includes publicly available instruction data sets and more than one million new examples that were annotated by humans\. + +**Model architecture** : Llama 2 is an auto\-regressive decoder\-only language model that uses an optimized transformer architecture\. The tuned versions use supervised fine\-tuning and reinforcement learning with human feedback\. + +**License** : [License](https://ai.meta.com/llama/license/) + +**Learn more** : [Research paper](https://arxiv.org/abs/2307.09288) + +: [13b Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/meta-llama/llama-2-13b-chat?context=wx) : [70b Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/meta-llama/llama-2-70b-chat?context=wx) + +### mpt\-7b\-instruct2 ### + +The mpt\-7b\-instruct2 model is provided by MosaicML on Hugging Face\. This model is a fine\-tuned version of the base MosaicML Pretrained Transformer (MPT) model that was trained to handle long inputs\. This version of the model was optimized by IBM for following short\-form instructions\. + +**Usage** : General use with zero\- or few\-shot prompts\. + +**Cost** : Class 1\. For pricing details, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +**Try it out** : [Sample prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html) + +**Size** : 7 billion parameters + +**Token limits** : Context window length (input \+ output): 2048 + +: **Note**: Lite plan output is limited to 500 + +**Supported natural languages** : English + +**Instruction tuning information** : The dataset that was used to train this model is a combination of the Dolly dataset from Databrick and a filtered subset of the Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback training data from Anthropic\. + + During filtering, parts of dialog exchanges that contain instruction-following steps were extracted to be used as samples. + +**Model architecture** : Encoder\-decoder + +**License** : [Apache 2\.0 license](https://www.apache.org/licenses/LICENSE-2.0.txt) + +**Learn more** : [Model card](https://huggingface.co/ibm/mpt-7b-instruct2) : [Blog](https://www.mosaicml.com/blog/mpt-7b) + +### mt0\-xxl\-13b ### + +The mt0\-xxl\-13b model is provided by BigScience on Hugging Face\. The model is optimized to support language generation and translation tasks with English, languages other than English, and multilingual prompts\. + +**Usage** : General use with zero\- or few\-shot prompts\. For translation tasks, include a period to indicate the end of the text you want translated or the model might continue the sentence rather than translate it\. + +**Cost** : Class 2\. For pricing details, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +**Try it out** : [Sample prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html) + +: [Sample notebook: Simple introduction to retrieval\-augmented generation with watsonx\.ai](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/fed7cf6b-1c48-4d71-8c04-0fce0e000d43?context=wx) + +**Size** : 13 billion parameters + +**Token limits** : Context window length (input \+ output): 4096 + +: **Note**: Lite plan output is limited to 700 + +**Supported natural languages** : The model is pretrained on multilingual data in 108 languages and fine\-tuned with multilingual data in 46 languages to perform multilingual tasks\. + +**Instruction tuning information** : BigScience publishes details about its code and data sets\. + +**Model architecture** : Encoder\-decoder + +**License** : [Apache 2\.0 license](https://www.apache.org/licenses/LICENSE-2.0.txt) + +**Learn more** : [Research paper](https://arxiv.org/abs/2211.01786) + +: [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/bigscience/mt0-xxl?context=wx) + +### starcoder\-15\.5b ### + +The starcoder\-15\.5b model is provided by BigCode on Hugging Face\. This model can generate code and convert code from one programming language to another\. The model is meant to be used by developers to boost their productivity\. + +**Usage** : Code generation and code conversion : Note: The model output might include code that is taken directly from its training data, which can be licensed code that requires attribution\. + +**Cost** : Class 2\. For pricing details, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +**Try it out** : [Sample prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#code) : [Sample notebook: Use watsonx and BigCode starcoder\-15\.5b to generate code based on instruction](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/b5792ad4-555b-4b68-8b6f-ce368093fac6?context=wx) + +**Size** : 15\.5 billion parameters + +**Token limits** : Context window length (input \+ output): 8192 + +**Supported programming languages** : Over 80 programming languages, with an emphasis on Python\. + +**Data used during training** : This model was trained on over 80 programming languages from GitHub\. A filter was applied to exclude from the training data any licensed code or code that is marked with opt\-out requests\. Nevertheless, the model's output might include code from its training data that requires attribution\. The model was not instruction\-tuned\. Submitting input with only an instruction and no examples might result in poor model output\. + +**Model architecture** : Decoder + +**License** : [License](https://huggingface.co/spaces/bigcode/bigcode-model-license-agreement) + +**Learn more** : [Research paper](https://arxiv.org/abs/2305.06161) + +: [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/bigcode/starcoder?context=wx) + +**Parent topic:**[Foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b3fb712903b0d1044610c93e6fcde6a41be1cf6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b3fb712903b0d1044610c93e6fcde6a41be1cf6.md new file mode 100644 index 0000000..277140c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b3fb712903b0d1044610c93e6fcde6a41be1cf6.md @@ -0,0 +1,10 @@ +# Web node (SPSS Modeler) + +# Web node # + +Web nodes show the strength of relationships between values of two or more symbolic fields\. The graph displays connections using varying types of lines to indicate connection strength\. You can use a Web node, for example, to explore the relationship between the purchase of various items at an e\-commerce site or a traditional retail outlet\. + +Figure 1\. Web graph showing relationships between the purchase of grocery items + +![Web graph showing relationships between the purchase of grocery items](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/graphs_web_generated.jpg) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b66f4f408827fe62b0584882d7f25fb9c6ca839.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b66f4f408827fe62b0584882d7f25fb9c6ca839.md new file mode 100644 index 0000000..568d93b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b66f4f408827fe62b0584882d7f25fb9c6ca839.md @@ -0,0 +1,50 @@ +# Compute resource options for Decision Optimization + +# Compute resource options for Decision Optimization # + +When you run a Decision Optimization model, you use the Watson Machine Learning instance that is linked to the deployment space associated with your experiment\. + + + + * [Default hardware configurations](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-decisionopt.html?context=cdpaas&locale=en#default) + * [Compute usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-decisionopt.html?context=cdpaas&locale=en#compute) + + + +## Default hardware configuration ## + +The following hardware configuration is used by default when running models in an experiment: + + + +| Capacity type | Capacity units per hour (CUH) | +| ------------------- | ----------------------------- | +| 2 vCPU and 8 GB RAM | 6 | + + + +The CUH is consumed only when the model is running and not when you are adding data or editing your model\. + +You can also switch to any other experiment environment as required\. See the [Decision Optimization plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html#do) for a list of environments for Decision Optimization experiments\. + +For more information on how to configure Decision Optimization experiment environments, see [Configuring environments](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/configureEnvironments.html)\. + +## Compute usage in projects ## + +Decision Optimization experiments consume compute resources as CUH from the Watson Machine Learning service\. + +You can monitor the total monthly amount of CUH consumption for the Watson Machine Learning service on the **Resource usage** page on the **Manage** tab of your project\. + +## Learn more ## + + + + * [Decision Optimization](https://dataplatform.cloud.ibm.com/docs/content/DO/DOWS-Cloud_home.html) + * [Watson Machine Learning plans and compute usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html) + * [Monitoring account resource usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html) + + + +**Parent topic:**[Choosing compute resources for tools](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b85770138782723e09d9ed65f8655484d03be44.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b85770138782723e09d9ed65f8655484d03be44.md new file mode 100644 index 0000000..fcec423 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5b85770138782723e09d9ed65f8655484d03be44.md @@ -0,0 +1,31 @@ +# derive_stbnode properties + +# derive\_stbnode properties # + +![Space\-Time\-Boxes node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/stbnodeicon.png) The Space\-Time\-Boxes node derives Space\-Time\-Boxes from latitude, longitude, and timestamp fields\. You can also identify frequent Space\-Time\-Boxes as hangouts\. + + + +Space-Time-Boxes node properties + +Table 1\. Space\-Time\-Boxes node properties + +| `derive_stbnode` properties | Data type | Property description | +| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `mode` | `IndividualRecords`
`Hangouts` | | +| `latitude_field` | *field* | | +| `longitude_field` | *field* | | +| `timestamp_field` | *field* | | +| `hangout_density` | *density* | A single density\. See `densities` for valid density values\. | +| `densities` | \[*density*,*density*,\.\.\., *density*\] | Each density is a string (for example, `STB_GH8_1DAY`)\. Note that there are limits to which densities are valid\. For the geohash, you can use values from `GH1` to `GH15`\. For the temporal part, you can use the following values:
`EVER`
`1YEAR`
`1MONTH`
`1DAY`
`12HOURS`
`8HOURS`
`6HOURS`
`4HOURS`
`3HOURS`
`2HOURS`
`1HOUR`
`30MIN`
`15MIN`
`10MIN`
`5MIN`
`2MIN`
`1MIN`
`30SECS`
`15SECS`
`10SECS`
`5SECS`
`2SECS`
`1SEC` | +| `id_field` | *field* | | +| `qualifying_duration` | `1DAY`
`12HOURS`
`8HOURS`
`6HOURS`
`4HOURS`
`3HOURS`
`2HOURS`
`1HOUR`
`30MIN`
`15MIN`
`10MIN`
`5MIN`
`2MIN`
`1MIN`
`30SECS`
`15SECS`
`10SECS`
`5SECS`
`2SECS`
`1SECS` | Must be a string\. | +| `min_events` | *integer* | Minimum valid integer value is 2\. | +| `qualifying_pct` | *integer* | Must be in the range of 1 and 100\. | +| `add_extension_as` | `Prefix`
`Suffix` | | +| `name_extension` | *string* | | +| `span_stb_boundaries` | *boolean* | Allow hangouts to span STB boundaries\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5bc1631d896899d03e7d8dd2296c21656dd169ff.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5bc1631d896899d03e7d8dd2296c21656dd169ff.md new file mode 100644 index 0000000..56ae2a4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5bc1631d896899d03e7d8dd2296c21656dd169ff.md @@ -0,0 +1,583 @@ +# What's new + +# What's new # + +Check back each week to learn about new features and updates for IBM watsonx\.ai\. + +Tip: Occasionally, you must take a specific action after an update\. To see all required actions, search this page for “Action required”\. + +## Week ending 15 December 2023 ## + +### Create user API keys for jobs and other operations ### + +15 Dec 2023 + +Certain runtime operations in IBM watsonx, such as jobs and model training, require an API key as a credential for secure authorization\. With user API keys, you can now generate and rotate an API key directly in IBM watsonx as needed to help ensure your operations run smoothly\. The API keys are managed in IBM Cloud, but you can conveniently create and rotate them in IBM watsonx\. + +The user API key is account\-specific and is created from **Profile and settings** under your account profile\. + +For more information, see [Managing the user API key](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-apikeys.html)\. + +### New watsonx tutorials and videos ### + +15 Dec 2023 + +Try the new watsonx\.governance and watsonx\.ai tutorials to help you learn how to tune a foundation model, and evaluate and track a prompt template\. + + + +New tutorials + +| Tutorial | Description | Expertise for tutorial | +| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | +| [Tune a foundation model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html) | Tune a foundation model to enhance model performance\. | Use the Tuning Studio to tune a model without coding\.

Intermediate

No code | +| [Evaluate and track a prompt template](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html) | Evaluate a prompt template to measure the performance of foundation model and track the prompt template through its lifecycle\. | Use the evaluation tool and an AI use case to track the prompt template\.

Beginner

No code | + + + +![Watch a video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) Find more watsonx\.governance and watsonx\.ai videos in the [Video library](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html)\. + +### New login session expiration and sign out due to inactivity ### + +15 Dec 2023 + +You are now signed out of IBM Cloud due to session expiration\. Your session can expire due to login session expiration (24 hours by default) or inactivity (2 hours by default)\. You can change the default durations in the Access (IAM) settings in IBM Cloud\. For more information, see [Set the login session expiration](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/account-settings.html#set-expiration)\. + +### IBM Cloud Databases for DataStax connector is deprecated ### + +15 Dec 2023 + +The IBM Cloud Databases for DataStax connector is deprecated and will be discontinued in a future release\. + +## Week ending 08 December 2023 ## + +### The Tuning Studio is available ### + +7 Dec 2023 + +The Tuning Studio helps you to guide a foundation model to return useful output\. With the Tuning Studio, you can prompt tune the flan\-t5\-xl\-3b foundation model to improve its performance on natural language processing tasks such as classification, summarization, and generation\. Prompt tuning helps smaller, more computationally\-efficient foundation models achieve results comparable to larger models in the same model family\. By tuning and deploying a tuned version of a smaller model, you can reduce long\-term inference costs\. The Tuning Studio is available to users of paid plans in the Dallas region\. + + + + * For more information, see [Tuning Studio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-studio.html)\. + * To get started, see [Quick start: Tune a foundation model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html)\. + * To run a sample notebook, go to [Tune a model to classify CFPB documents in watsonx](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/bf57e8896f3e50c638b5a378780f7502)\. + + + +### New client properties in Db2 connections for workload management ### + +08 Dec 2023 + +You can now specify properties in the following fields for monitoring purposes: **Application name**, **Client accounting information**, **Client hostname**, and **Client user**\. These fields are optional and are available for the following connections: + + + + * [IBM Db2](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2.html) + * [IBM Db2 for z/OS](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2zos.html) + * [IBM Db2 Warehouse](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-wh.html) + * [IBM Watson Query](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-data-virtual.html) + + + +## Week ending 1 December 2023 ## + +### Watsonx\.governance is available\! ### + +1 Dec 2023 + +Watsonx\.governance extends the governance capabilities of Watson OpenScale to evaluate foundation model assets as well as machine learning assets\. For example, evaluate foundation model prompt templates for dimensions such as accuracy or to detect the presence of hateful and abusive speech\. You can also define AI use cases to address business problems, then track prompt templates or model data in factsheets to support compliance and governance goals\. Watsonx\.governance plans and features are available only in the Dallas region\. + + + + * To view plan details, see [watsonx\.governance](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-plan-options.html) plans\. + * For details on governance features, see [watsonx\.governance](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-overview.html)\. + * To get started, see [Provisioning and launching watsonx\.governance](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-provision-launch.html)\. + + + +### Explore with the AI risk atlas ### + +1 Dec 2023 + +You can now explore some of the risks of working with generative AI, foundation models, and machine learning models\. Read about risks for privacy, fairness, explainability, value alignment, and other areas\. See [AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html)\. + +### New versions of the IBM Granite models are available ### + +30 Nov 2023 + +The latest versions of the Granite models include these changes: + +**granite\-13b\-chat\-v2**: Tuned to be better at question\-answering, summarization, and generative tasks\. With sufficient context, generates responses with the following improvements over the previous version: + + + + * Generates longer, higher\-quality responses with a professional tone + * Supports chain\-of\-thought responses + * Recognizes mentions of people and can detect tone and sentiment better + * Handles white spaces in input more gracefully + + + +Due to extensive changes, test and revise any prompts that were engineered for v1 before you switch to the latest version\. + +**granite\-13b\-instruct\-v2**: Tuned specifically for classification, extraction, and summarization tasks\. The latest version differs from the previous version in the following ways: + + + + * Returns more coherent answers of varied lengths and with a diverse vocabulary + * Recognizes mentions of people and can summarize longer inputs + * Handles white spaces in input more gracefully + + + +Engineered prompts that work well with v1 are likely to work well with v2 also, but be sure to test before you switch models\. + +The latest versions of the Granite models are categorized as Class 2 models\. + +### Some foundation models are now available at lower cost ### + +30 Nov 2023 + +Some popular foundation models were recategorized into lower\-cost billing classes\. + +The following foundation models changed from Class 3 to Class 2: + + + + * granite\-13b\-chat\-v1 + * granite\-13b\-instruct\-v1 + * llama\-2\-70b + + + +The following foundation model changed from Class 2 to Class 1: + + + + * llama\-2\-13b + + + +For more information about the billing classes, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +### A new sample notebook is available: Introduction to RAG with Discovery ### + +30 Nov 2023 + +Use the *Introduction to RAG with Discovery* notebook to learn how to apply the retrieval\-augmented generation pattern in IBM watsonx\.ai with IBM Watson Discovery as the search component\. For more information, see [Introduction to RAG with Discovery](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/ba4a9e35-2091-49d3-9364-a1284afab7ec)\. + +### Understand feature differences between watsonx as a service and software deployments ### + +30 Nov 2023 + +You can now compare the features and implementation of IBM watsonx as a Service and watsonx on Cloud Pak for Data software, version 4\.8\. See [Feature differences between watsonx deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/feature-matrix.html)\. + +### Change to how stop sequences are handled ### + +30 Nov 2023 + +When a stop sequence, such as a newline character, is specified in the Prompt Lab, the model output text ends after the first occurrence of the stop sequence\. The model output stops even if the occurrence comes at the beginning of the output\. Previously, the stop sequence was ignored if it was specified at the start of the model output\. + +## Week ending 10 November 2023 ## + +### A smaller version of the Llama\-2 Chat model is available ### + +9 Nov 2023 + +You can now choose between using the 13b or 70b versions of the Llama\-2 Chat model\. Consider these factors when you make your choice: + + + + * Cost + * Performance + + + +The 13b version is a Class 2 model, which means it is cheaper to use than the 70b version\. To compare benchmarks and other factors, such as carbon emissions for each model size, see the [Model card](https://dataplatform.cloud.ibm.com/wx/samples/models/meta-llama/llama-2-13b-chat?context=wx)\. + +### Use prompt variables to build reusable prompts ### + +Add flexibility to your prompts with *prompt variables*\. Prompt variables function as placeholders in the static text of your prompt input that you can replace with text dynamically at inference time\. You can save prompt variable names and default values in a prompt template asset to reuse yourself or share with collaborators in your project\. For more information, see [Building reusable prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-variables.html)\. + +### Announcing support for Python 3\.10 and R4\.2 frameworks and software specifications on runtime 23\.1 ### + +9 Nov 2023 + +Action required + + You can now use IBM Runtime 23\.1, which includes the latest data science frameworks based on Python 3\.10 and R 4\.2, to run Watson Studio Jupyter notebooks and R scripts, train models, and run Watson Machine Learning deployments\. Update your assets and deployments to use IBM Runtime 23\.1 frameworks and software specifications\. + + + + * For information on the IBM Runtime 23\.1 release and the included environments for Python 3\.10 and R 4\.2, see [Changing notebook environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html#change-env)\. + * For details on deployment frameworks, see [Managing frameworks and software specifications](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-frame-and-specs.html)\. + + + +### Use Apache Spark 3\.4 to run notebooks and scripts ### + +Spark 3\.4 with Python 3\.10 and R 4\.2 is now supported as a runtime for notebooks and RStudio scripts in projects\. For details on available notebook environments, see [Compute resource options for the notebook editor in projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html) and [Compute resource options for RStudio in projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-envs.html)\. + +## Week ending 27 October 2023 ## + +### Use a Satellite Connector to connect to an on\-prem database ### + +26 Oct 2023 + +Use the new Satellite Connector to connect to a database that is not accessible via the internet (for example, behind a firewall)\. Satellite Connector uses a lightweight Docker\-based communication that creates secure and auditable communications from your on\-prem environment back to IBM Cloud\. For instructions, see [Connecting to data behind a firewall](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Secure Gateway is deprecated ### + +26 Oct 2023 + +IBM Cloud announced the deprecation of Secure Gateway\. For information, see the [Overview and timeline](https://cloud.ibm.com/docs/SecureGateway?topic=SecureGateway-dep-overview)\. + +Action required + + If you currently have connections that are set up with Secure Gateway, plan to use an alternative communication method\. In IBM watsonx, you can use the Satellite Connector as a replacement for Secure Gateway\. See [Connecting to data behind a firewall](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +## Week ending 20 October 2023 ## + +### Maximum token sizes increased ### + +16 Oct 2023 + +Limits that were previously applied to the maximum number of tokens allowed in the output from foundation models are removed from paid plans\. You can use larger maximum token values during prompt engineering from both the Prompt Lab and the Python library\. The exact number of tokens allowed differs by model\. For more information about token limits for paid and Lite plans, see [Supported foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html)\. + +## Week ending 13 October 2023 ## + +### New notebooks in Samples ### + +12 Oct 2023 + +Two new notebooks are available that use a vector database from Elasticsearch in the retrieval phase of the retrieval\-augmented generation pattern\. The notebooks demonstrate how to find matches based on the semantic similarity between the indexed documents and the query text that is submitted from a user\. + + + + * [Sample notebook: Use watsonx, Elasticsearch, and LangChain to answer questions (RAG)](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/ebeb9fc0-9844-4838-aff8-1fa1997d0c13?context=wx&audience=wdp) + * [Sample notebook: Use watsonx, and Elasticsearch Python SDK to answer questions (RAG)](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/bdbc8ad4-9c1f-460f-99ee-5c3a1f374fa7?context=wx&audience=wdp) + + + +### Intermediate solutions in Decision Optimization ### + +12 Oct 2023 + +You can now choose to see a sample of intermediate solutions while a Decision Optimization experiment is running\. This can be useful for debugging or to see how the solver is progressing\. For large models that take longer to solve, with intermediate solutions you can now quickly and easily identify any potential problems with the solve, without having to wait for the solve to complete\. ![Graphical display showing run statistics with intermediate solutions\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/do-rundisplay.png) You can configure the Intermediate solution delivery parameter in the Run configuration and select a frequency for these solutions\. For more information, see [Run models](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface__runmodel) and [Run configuration parameters](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_RunParameters/runparams.html#RunConfig__section_runconfig) + +### New Decision Optimization saved model dialog ### + +When you save a model for deployment from the Decision Optimization user interface, you can now review the input and output schema, and more easily select the tables that you want to include\. You can also add, modify or delete run configuration parameters, review the environment, and the model files used\. All these items are displayed in the same **Save as model for deployment** dialog\. For more information, see [Deploying a Decision Optimization model by using the user interface](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployModelUI-WML.html)\. + +## Week ending 6 October 2023 ## + +### Additional foundation models in Frankfurt ### + +5 Oct 2023 + +All foundation models that are available in the Dallas data center are now also available in the Frankfurt data center\. The watsonx\.ai Prompt Lab and foundation model inferencing are now supported in the Frankfurt region for these models: + + + + * granite\-13b\-chat\-v1 + * granite\-13b\-instruct\-v1 + * llama\-2\-70b\-chat + * gpt\-neox\-20b + * mt0\-xxl\-13b + * starcoder\-15\.5b + + + +For more information on these models, see [Supported foundation models available with watsonx\.ai](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html)\. + +For pricing details, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +### Control the placement of a new column in the Concatenate operation (Data Refinery) ### + +6 Oct 2023 + +You now have two options to specify the position of the new column that results from the **Concatenate** operation: As the right\-most column in the data set or next to the original column\. + +![Concatenate operation column position](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/dr-concat-position.png) + +Previously, the new column was placed at the beginning of the data set\. + +Important: + +Action required + + Edit the **Concatenate** operation in any of your existing Data Refinery flows to specify the new column position\. Otherwise, the flow might fail\. + +For information about Data Refinery operations, see [GUI operations in Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/gui_operations.html)\. + +## Week ending 29 September 2023 ## + +### IBM Granite foundation models for natural language generation ### + +28 Sept 2023 + +The first two models from the Granite family of IBM foundation models are now available in the Dallas region: + + + + * **granite\-13b\-chat\-v1**: General use model that is optimized for dialogue use cases + * **granite\-13b\-instruct\-v1**: General use model that is optimized for question answering + + + +Both models are 13B\-parameter decoder models that can efficiently predict and generate language in English\. They, like all models in the Granite family, are designed for business\. Granite models are pretrained on multiple terabytes of data from both general\-language sources, such as the public internet, and industry\-specific data sources from the academic, scientific, legal, and financial fields\. + +Try them out today in the Prompt Lab or run a [sample notebook](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/61c1e967-8d10-44bb-a846-cc1f27e9e69a) that uses the granite\-13b\-instruct\-v1 model for sentiment analysis\. + +Read the [Building AI for business: IBM’s Granite foundation models](https://www.ibm.com/blog/building-ai-for-business-ibms-granite-foundation-models/) blog post to learn more\. + + + + * For more information on these models, see [Supported foundation models available with watsonx\.ai](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html)\. + * For a description of sample prompts, see [Sample foundation model prompts for common tasks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html)\. + * For pricing details, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + + + +## Week ending 22 September 2023 ## + +### Decision Optimization Java models ### + +20 Sept 2023 + +Decision Optimization Java models can now be deployed in Watson Machine Learning\. By using the Java worker API, you can create optimization models with OPL, CPLEX, and CP Optimizer Java APIs\. You can now easily create your models locally, package them and deploy them on Watson Machine Learning by using the boilerplate that is provided in the public [Java worker GitHub](https://github.com/IBMDecisionOptimization/cplex-java-worker/blob/master/README.md)\. For more information, see [Deploying Java models for Decision Optimization](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployJava.html)\. + +### New notebooks in Samples ### + +21 Sept 2023 + +You can use the following new notebooks in Samples: + + + + * [Use watsonx and LangChain to answer questions using RAG](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/d3a5f957-a93b-46cd-82c1-c8d37d4f62c6) + * [Use watsonx and BigCode `starcoder-15.5b` to generate code](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/b5792ad4-555b-4b68-8b6f-ce368093fac6) + + + +## Week ending 15 September 2023 ## + +### Prompt engineering and synthetic data quick start tutorials ### + +14 Sept 2023 + +Try the new tutorials to help you learn how to: + + + + * Prompt foundation models: There are usually multiple ways to prompt a foundation model for a successful result\. In the Prompt Lab, you can experiment with prompting different foundation models, explore sample prompts, as well as save and share your best prompts\. One way to improve the accuracy of generated output is to provide the needed facts as context in your prompt text using the retrieval\-augmented generation pattern\. + * Generate synthetic data: You can generate synthetic tabular data in watsonx\.ai\. The benefit to synthetic data is that you can procure the data on\-demand, then customize to fit your use case, and produce it in large quantities\. + + + + + +| Tutorial | Description | Expertise for tutorial | +| -------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| [Prompt a foundation model using Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html) | Experiment with prompting different foundation models, explore sample prompts, and save and share your best prompts\. | Prompt a model using Prompt Lab without coding\.

Beginner

No code | +| [Prompt a foundation model with the retrieval\-augmented generation pattern](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html) | Prompt a foundation model by leveraging information in a knowledge base\. | Use the retrieval\-augmented generation pattern in a Jupyter notebook that uses Python code\.

Intermediate

All code | +| [Generate synthetic tabular data](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-generate-data.html) | Generate synthetic tabular data using a graphical flow editor\. | Select operations to generate data\.

Beginner

No code | + + + +### Watsonx\.ai Community ### + +14 Sept 2023 + +You can now join the [watsonx\.ai Community](https://community.ibm.com/community/user/watsonx/communities/community-home?communitykey=81927b7e-9a92-4236-a0e0-018a27c4ad6e) for AI architects and builders to learn, share ideas, and connect with others\. + +## Week ending 8 September 2023 ## + +### Generate synthetic tabular data with Synthetic Data Generator ### + +7 Sept 2023 + +Now available in the Dallas and Frankfurt regions, Synthetic Data Generator is a new graphical editor tool on watsonx\.ai that you can use to generate tabular data to use for training models\. Using visual flows and a statistical model, you can create synthetic data based on your existing data or a custom data schema\. You can choose to mask your original data and export your synthetic data to a database or as a file\. + +To get started, see [Synthetic data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/synthetic_data_overview_sd.html)\. + +### Llama\-2 Foundation Model for natural language generation and chat ### + +7 Sept 2023 + +The Llama\-2 Foundation Model from Meta is now available in the Dallas region\. Llama\-2 Chat model is an auto\-regressive language model that uses an optimized transformer architecture\. The model is pretrained with publicly available online data, and then fine\-tuned using reinforcement learning from human feedback\. The model is intended for commercial and research use in English\-language assistant\-like chat scenarios\. + + + + * For more information on the Llama\-2 model, see [Supported foundation models available with watsonx\.ai](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html)\. + * For a description of sample prompts, see [Sample foundation model prompts for common tasks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html)\. + * For pricing details for Llama\-2, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + + + +### LangChain extension for the foundation models Python library ### + +7 Sept 2023 + +You can now use the LangChain framework with foundation models in watsonx\.ai with the new LangChain extension for the foundation models Python library\. + +This sample notebook demonstrates how to use the new extension: [Sample notebook](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/c3dbf23a-9a56-4c4b-8ce5-5707828fc981?context=wx) + +### Introductory sample for the retrieval\-augmented generation pattern ### + +7 Sept 2023 + +Retrieval\-augmented generation is a simple, powerful technique for leveraging a knowledge base to get factually accurate output from foundation models\. + +See: [Introduction to retrieval\-augmented generation](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-rag.html) + +## Week ending 1 September 2023 ## + +31 Aug 2023 + +As of today it is not possible to add comments to a notebook from the notebook action bar\. Any existing comments were removed\. + +![Comments icon in the notebook action bar](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook-comments.png) + +### StarCoder Foundation Model for code generation and code translation ### + +31 Aug 2023 + +The StarCoder model from Hugging Face is now available in the Dallas region\. Use StarCoder to create prompts for generating code or for transforming code from one programming language to another\. One sample prompt demonstrates how to use StarCoder to generate Python code from a set of instruction\. A second sample prompt demonstrates how to use StarCoder to transform code written in C\+\+ to Python code\. + + + + * For more information on the StarCoder model, see [Supported foundation models available with watsonx\.ai](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html)\. + * For a description of the sample prompts, see [Sample foundation model prompts for common tasks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html)\. + + + +### IBM watsonx\.ai is available in the Frankfurt region ### + +31 Aug 2023 + +Watsonx\.ai is now generally available in the Frankfurt data center and can be selected as the preferred region when signing\-up\. The Prompt Lab and foundation model inferencing are supported in the Frankfurt region for these models: + + + + * mpt\-7b\-instruct2 + * flan\-t5\-xxl\-11b + * flan\-ul2\-20b + * For more information on the supported models, see [Supported foundation models available with watsonx\.ai](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html)\. + + + +## Week ending 25 August 2023 ## + +### Additional cache enhancements available for Watson Pipelines ### + +21 August 2023 + +More options are available for customizing your pipeline flow settings\. You can now exercise greater control over when the cache is used for pipeline runs\. For details, see [Managing default settings](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-global-settings.html)\. + +## Week ending 18 August 2023 ## + +### Plan name updates for Watson Machine Learning service ### + +18 August 2023 + +Starting immediately, plan names are updated for the IBM Watson Machine Learning service, as follows: + + + + * The v2 Standard plan is now the **Essentials** plan\. The plan is designed to give your organization the resources required to get started working with foundation models and machine learning assets\. + * The v2 Professional plan is now the **Standard** plan\. This plan provides resources designed to support most organizations through asset creation to productive use\. + + + +Changes to the plan names do not change your terms of service\. That is, if you are registered to use the v2 Standard plan, it will now be named **Essentials**, but all of the plan details will remain the same\. Similarly, if you are registered to use the v2 Professional plan, there are no changes other than the plan name change to **Standard**\. + +For details on what is included with each plan, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. For pricing information, find your plan on the [Watson Machine Learning plan page](https://cloud.ibm.com/catalog/services/watson-machine-learning) in the IBM Cloud catalog\. + +## Week ending 11 August 2023 ## + +7 August 2023 + +On 31 August 2023, you will no longer be able to add comments to a notebook from the notebook action bar\. Any existing comments that were added that way will be removed\. + +![Comments icon in the notebook action bar](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook-comments.png) + +## Week ending 4 August 2023 ## + +### Increased token limit for Lite plan ### + +4 August 2023 + +If you are using the Lite plan to test foundation models, the token limit for prompt input and output is now increased from 25,000 to 50,000 per account per month\. This gives you more flexibility for exploring foundation models and experimenting with prompts\. + + + + * For details on watsonx\.ai plans, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + * For details on working with prompts, see [Engineer prompts with the Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html)\. + + + +### Custom text analytics template (SPSS Modeler) ### + +4 August 2023 + +For SPSS Modeler, you can now upload a custom text analytics template to a project\. This provides you with more flexibility to capture and extract key concepts in a way that is unique to your context\. + +## Week ending 28 July 2023 ## + +### Foundation models Python library available ### + +27 July 2023 + +You can now prompt foundation models in watsonx\.ai programmatically using a Python library\. + +See: [Foundation models Python library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-python-lib.html) + +## Week ending 14 July 2023 ## + +### Control AI guardrails ### + +14 July 2023 + +You can now control whether AI guardrails are on or off in the Prompt Lab\. AI guardrails remove potentially harmful text from both the input and output fields\. Harmful text can include hate speech, abuse, and profanity\. To prevent the removal of potentially harmful text, set the **AI guardrails** switch to off\. See [Hate speech, abuse, and profanity](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-hallucinations.html#hap)\. + +![The Prompt Lab with AI guardrails set on](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/guardrails.png) + +### Microsoft Azure SQL Database connection supports Azure Active Directory authentication (Azure AD) ### + +14 July 2023 + +You can now select Active Directory for the Microsoft Azure SQL Database connection\. Active Directory authentication is an alternative to SQL Server authentication\. With this enhancement, administrators can centrally manage user permissions to Azure\. For more information, see [Microsoft Azure SQL Database connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-azure-sql.html)\. + +## Week ending 7 July 2023 ## + +### Welcome to IBM watsonx\.ai\! ### + +7 July 2023 + +IBM watsonx\.ai delivers all the tools that you need to work with machine learning and foundation models\. + +Get started: + + + + * [Learn about watsonx\.ai](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/overview-wx.html) + * [Learn about foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-overview.html) + * [Engineer prompts with the Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) + * [Take quick start tutorials](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html) + * [Watson Natural Language Processing](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp.html) + + + +### Try generative AI search and answer in this documentation ### + +7 July 2023 + +You can see generative AI in action by trying the new generative AI search and answer option in the watsonx\.ai documentation\. The answers are generated by a large language model running in watsonx\.ai and based on the documentation content\. This feature is only available when you are viewing the documentation while logged in to watsonx\.ai\. + +Enter a question in the documentation search field and click the **Try generative AI search and answer** icon (![Try generative AI search and answer icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/bee.png))\. The **Generative AI search and answer** pane opens and answers your question\. + +![Shows the generative AI search and answer pane](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/gen-ai-search.png) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5bc48ab9a35e2e8baea5204c4406835154e2b836.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5bc48ab9a35e2e8baea5204c4406835154e2b836.md new file mode 100644 index 0000000..d8054c1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5bc48ab9a35e2e8baea5204c4406835154e2b836.md @@ -0,0 +1,9 @@ +# Decision Optimization deployment steps + +# Deployment steps # + +With IBM Watson Machine Learning you can deploy your Decision Optimization prescriptive model and associated common data once and then submit job requests to this deployment with only the related transactional data\. This deployment can be achieved by using the Watson Machine Learning REST API or by using the Watson Machine Learning Python client\. + +See [REST API example](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployModelRest.html#task_deploymodelREST) for a full code example\. See [Python client examples](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployPythonClient.html#topic_wmlpythonclient) for a link to a Python notebook available from the Samples\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5c2296329a2d24b1a22a3848731708d78949e74c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5c2296329a2d24b1a22a3848731708d78949e74c.md new file mode 100644 index 0000000..fc53528 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5c2296329a2d24b1a22a3848731708d78949e74c.md @@ -0,0 +1,33 @@ +# anomalydetectionnode properties + +# anomalydetectionnode properties # + +![Anomaly node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/anomalydetectionnodeicon.png)The Anomaly node identifies unusual cases, or outliers, that don't conform to patterns of "normal" data\. With this node, it's possible to identify outliers even if they don't fit any previously known patterns and even if you're not exactly sure what you're looking for\. + + + +anomalydetectionnode properties + +Table 1\. anomalydetectionnode properties + +| `anomalydetectionnode` Properties | Values | Property description | +| --------------------------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `inputs` | *\[field1 \.\.\. fieldN\]* | Anomaly Detection models screen records based on the specified input fields\. They don't use a target field\. Weight and frequency fields are also not used\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `mode` | `Expert``Simple` | | +| `anomaly_method` | `IndexLevel``PerRecords``NumRecords` | Specifies the method used to determine the cutoff value for flagging records as anomalous\. | +| `index_level` | *number* | Specifies the minimum cutoff value for flagging anomalies\. | +| `percent_records` | *number* | Sets the threshold for flagging records based on the percentage of records in the training data\. | +| `num_records` | *number* | Sets the threshold for flagging records based on the number of records in the training data\. | +| `num_fields` | *integer* | The number of fields to report for each anomalous record\. | +| `impute_missing_values` | *flag* | | +| `adjustment_coeff` | *number* | Value used to balance the relative weight given to continuous and categorical fields in calculating the distance\. | +| `peer_group_num_auto` | *flag* | Automatically calculates the number of peer groups\. | +| `min_num_peer_groups` | *integer* | Specifies the minimum number of peer groups used when `peer_group_num_auto` is set to `True`\. | +| `max_num_per_groups` | *integer* | Specifies the maximum number of peer groups\. | +| `num_peer_groups` | *integer* | Specifies the number of peer groups used when `peer_group_num_auto` is set to `False`\. | +| `noise_level` | *number* | Determines how outliers are treated during clustering\. Specify a value between 0 and 0\.5\. | +| `noise_ratio` | *number* | Specifies the portion of memory allocated for the component that should be used for noise buffering\. Specify a value between 0 and 0\.5\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5c2f280e5c4326883f7b3623ef1b64fe4dde7c05.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5c2f280e5c4326883f7b3623ef1b64fe4dde7c05.md new file mode 100644 index 0000000..8cf5714 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5c2f280e5c4326883f7b3623ef1b64fe4dde7c05.md @@ -0,0 +1,32 @@ +# Select node (SPSS Modeler) + +# Select node # + +You can use Select nodes to select or discard a subset of records from the data stream based on a specific condition, such as BP (blood pressure) = "HIGH"\. + +Mode\. Specifies whether records that meet the condition will be included or excluded from the data stream\. + + + + * Include\. Select to include records that meet the selection condition\. + * Discard\. Select to exclude records that meet the selection condition\. + + + +Condition\. Displays the selection condition that will be used to test each record, which you specify using a CLEM expression\. Either enter an expression in the window or use the Expression Builder by clicking the calculator (Expression Builder) button\. + +If you choose to discard records based on a condition, such as the following: + + (var1='value1' and var2='value2') + +the Select node by default also discards records having null values for all selection fields\. To avoid this, append the following condition to the original one: + + and not(@NULL(var1) and @NULL(var2)) + +Select nodes are also used to choose a proportion of records\. Typically, you would use a different node, the Sample node, for this operation\. However, if the condition you want to specify is more complex than the parameters provided, you can create your own condition using the Select node\. For example, you can create a condition such as: + + BP = "HIGH" and random(10) <= 4 + +This will select approximately 40% of the records showing high blood pressure and pass those records downstream for further analysis\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5c597f82ec8484220a6fb3193dc78b878e8698f6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5c597f82ec8484220a6fb3193dc78b878e8698f6.md new file mode 100644 index 0000000..0a61c9b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5c597f82ec8484220a6fb3193dc78b878e8698f6.md @@ -0,0 +1,46 @@ +# Distinct node (SPSS Modeler) + +# Distinct node # + +Duplicate records in a data set must be removed before data mining can begin\. For example, in a marketing database, individuals may appear multiple times with different address or company information\. You can use the Distinct node to find or remove duplicate records in your data, or to create a single, composite record from a group of duplicate records\. + +To use the Distinct node, you must first define a set of key fields that determine when two records are considered to be duplicates\. + +If you do not pick all your fields as key fields, then two "duplicate" records may not be truly identical because they can still differ in the values of the remaining fields\. In this case, you can also define a sort order that is applied within each group of duplicate records\. This sort order gives you fine control over which record is treated as the first within a group\. Otherwise, all duplicates are considered to be interchangeable and any record might be selected\. The incoming order of the records is not taken into account, so it doesn't help to use an upstream Sort node (see "Sorting records within the Distinct node" on this page)\. + +Mode\. Specify whether to create a composite record, or to either include or exclude (discard) the first record\. + + + + * Create a composite record for each group\. Provides a way for you to aggregate non\-numeric fields\. Selecting this option makes the Composite tab available where you specify how to create the composite records\. + * Include only the first record in each group\. Selects the first record from each group of duplicate records and discards the rest\. The first record is determined by the sort order defined under the setting Within groups, sort records by, and not by the incoming order of the records\. + * Discard only the first record in each group\. Discards the first record from each group of duplicate records and selects the remainder instead\. The first record is determined by the sort order defined under the setting Within groups, sort records by, and not by the incoming order of the records\. This option is useful for finding duplicates in your data so that you can examine them later in the flow\. + + + +Key fields for grouping\. Lists the field or fields used to determine whether records are identical\. You can: + + + + * Add fields to this list using the field picker button\. + * Delete fields from the list by using the red X (remove) button\. + + + +Within groups, sort records by\. Lists the fields used to determine how records are sorted within each group of duplicates, and whether they are sorted in ascending or descending order\. You can: + + + + * Add fields to this list using the field picker button\. + * Delete fields from the list by using the red X (remove) button\. + * Move fields using the up or down buttons, if you are sorting by more than one field\. + + + +You must specify a sort order if you have chosen to include or exclude the first record in each group, and it matters to you which record is treated as the first\. + +You may also want to specify a sort order if you have chosen to create a composite record, for certain options on the Composite tab\. + +Specify whether, by default, records are sorted in Ascending or Descending order of the sort key values\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5c95f2d19465dda8969d0498d1b96d870bd02a1f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5c95f2d19465dda8969d0498d1b96d870bd02a1f.md new file mode 100644 index 0000000..73aeb47 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5c95f2d19465dda8969d0498d1b96d870bd02a1f.md @@ -0,0 +1,38 @@ +# c50node properties + +# c50node properties # + +![C5\.0 node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/c50nodeicon.png)The C5\.0 node builds either a decision tree or a rule set\. The model works by splitting the sample based on the field that provides the maximum information gain at each level\. The target field must be categorical\. Multiple splits into more than two subgroups are allowed\. + + + +c50node properties + +Table 1\. c50node properties + +| `c50node` Properties | Values | Property description | +| --------------------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `target` | *field* | C50 models use a single target field and one or more input fields\. You can also specify a weight field\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `output_type` | `DecisionTree``RuleSet` | | +| `group_symbolics` | *flag* | | +| `use_boost` | *flag* | | +| `boost_num_trials` | *number* | | +| `use_xval` | *flag* | | +| `xval_num_folds` | *number* | | +| `mode` | `Simple``Expert` | | +| `favor` | `Accuracy``Generality` | Favor accuracy or generality\. | +| `expected_noise` | *number* | | +| `min_child_records` | *number* | | +| `pruning_severity` | *number* | | +| `use_costs` | *flag* | | +| `costs` | *structured* | This is a structured property\. See the example for usage\. | +| `use_winnowing` | *flag* | | +| `use_global_pruning` | *flag* | On (`True`) by default\. | +| `calculate_variable_importance` | *flag* | | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `adjusted_propensity_partition` | `Test``Validation` | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5cc48263b0c282ca1d65accb46d73d7ea3c8a665.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5cc48263b0c282ca1d65accb46d73d7ea3c8a665.md new file mode 100644 index 0000000..d4402b7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5cc48263b0c282ca1d65accb46d73d7ea3c8a665.md @@ -0,0 +1,9 @@ +# Set to Flag node (SPSS Modeler) + +# Set to Flag node # + +Use the Set to Flag node to derive flag fields based on the categorical values defined for one or more nominal fields\. + +For example, your dataset might contain a nominal field, `BP` (blood pressure), with the values `High`, `Normal`, and `Low`\. For easier data manipulation, you might create a flag field for high blood pressure, which indicates whether or not the patient has high blood pressure\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5cf2fe478862fcaa1745d5b0770ce6486b3b71f8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5cf2fe478862fcaa1745d5b0770ce6486b3b71f8.md new file mode 100644 index 0000000..954185e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5cf2fe478862fcaa1745d5b0770ce6486b3b71f8.md @@ -0,0 +1,6 @@ +# Sunburst charts + +# Sunburst charts # + +A sunburst chart is useful for visualizing hierarchical data structures\. A sunburst chart consists of an inner circle that is surrounded by rings of deeper hierarchy levels\. The angle of each segment proportional to either a value or divided equally under its inner segment\. The chart segments are colored based on the category or hierarchical level to which they belong\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5d043091b2f2398611a819743fc83688d7658b22.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5d043091b2f2398611a819743fc83688d7658b22.md new file mode 100644 index 0000000..9c55677 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5d043091b2f2398611a819743fc83688d7658b22.md @@ -0,0 +1,20 @@ +# Visualizations layout and terms + +# Visualizations layout and terms # + +Canvas +: The canvas is the area of the Visualizations dialog where you build the chart\. + +Chart type +: Lists the available chart types\. The graphic elements are the items in the chart that represent data (bars, points, lines, and so on)\. + +Details pane +: The Details pane provides the basic chart building blocks\. + + Chart settings + : Provides options for selecting which variables are used to build the chart, distribution method, title and subtitle fields, and so on. Depending on the selected chart type, the Details pane options might vary. For more information, see [Chart types](https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_charttypes.html). + +Actions +: Provides options for downloading chart configuration files, downloading charts as image files, resetting charts, and setting the global chart preferences\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5d193c88d3e3235ea441bb82cceeaae20bb3efcc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5d193c88d3e3235ea441bb82cceeaae20bb3efcc.md new file mode 100644 index 0000000..452ef8e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5d193c88d3e3235ea441bb82cceeaae20bb3efcc.md @@ -0,0 +1,18 @@ +# Flow scripts + +# Flow scripts # + +You can use scripts to customize operations within a particular flow, and they're saved with that flow\. You can specify a particular execution order for the terminal nodes within a flow\. You use the flow script settings to edit the script that's saved with the current flow\. + +To access the flow script settings: + + + +1. Click the Flow Properties icon on the toolbar\. +2. Open the Scripting section to work with scripts for the current flow\. You can also launch the Expression Builder from here by clicking the calculator icon\. ![Expression Builder icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/expressionbuilder.png) + + + +You can specify whether a script does or doesn't run when the flow runs\. To run the script each time the flow runs, respecting the execution order of the script, select Run the script\. This setting provides automation at the flow level for quicker model building\. However, the default setting is to ignore this script during flow execution ( Run all terminal nodes\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5d1bca52e974c3f4de54366a242df751e73acbd2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5d1bca52e974c3f4de54366a242df751e73acbd2.md new file mode 100644 index 0000000..a8a4182 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5d1bca52e974c3f4de54366a242df751e73acbd2.md @@ -0,0 +1,111 @@ +# Troubleshooting Cloud Object Storage for projects + +# Troubleshooting Cloud Object Storage for projects # + +Use these solutions to resolve issues you might experience when using Cloud Object Storage with projects in IBM watsonx\. Many errors that occur when creating projects can be resolved by correctly configuring Cloud Object Storage\. For instructions, see [Setting up Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html)\. + +Possible error messages: + + + + * [Error retrieving Administrator API key token for your Cloud Object Storage instance](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/troubleshoot-cos.html?context=cdpaas&locale=en#key-token) + * [Unable to configure credentials for your project in the selected Cloud Object Storage instance](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/troubleshoot-cos.html?context=cdpaas&locale=en#credentials) + * [User login from given IP address is not permitted](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/troubleshoot-cos.html?context=cdpaas&locale=en#restricted-ip) + * [Project cannot be created](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/troubleshoot-cos.html?context=cdpaas&locale=en#project-failed) + + + +## Cannot retrieve API key ## + +### Symptoms ### + +When you create a project, the following error occurs: + + Error retrieving Administrator API key token for your Cloud Object Storage instance + +### Possible Causes ### + + + + * You have not been assigned the **Editor** role in the IBM Cloud account\. + + + +### Possible Resolutions ### + +The account administrator must complete the following tasks: + + + + * Invite users to the IBM Cloud account and assign the **Editor** role\. See [Add non\-administrative users to your IBM Cloud account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-addl-users.html#users)\. + + + +## Unable to configure credentials ## + +### Symptoms ### + +When you create a project and associate it to a Cloud Object Storage instance, the following error occurs: + + Unable to configure credentials for your project in the selected Cloud Object Storage instance. + +### Possible Causes ### + + + + * You have exceeded the access policy limit for the account\. + * For a Lite account, you have exceeded the 25 GB limit for the Cloud Object Storage instance\. + + + +### Possible Resolutions ### + +**For exceeding access policies:** + + + +1. Verify that you are the owner of the Cloud Object Storage instance or that the owner has granted you **Administrator** and **Manager** roles for this service instance\. Otherwise, ask your IBM Cloud administrator to fix this problem\. +2. Check the total number of access policies to determine whether you have reached a limit\. See [IBM Cloud IAM limits](https://cloud.ibm.com/docs/account?topic=account-known-issues#iam_limits) for the limit information\. +3. Delete at least 4 or more unused access policies for the service ID\. + + + +See [Reducing time and effort managing access](https://cloud.ibm.com/docs/account?topic=account-account_setup#limit-policies) for strategies that you can use to ensure that you don't reach the limit\. + +**For exceeding 25 GB limit for a Lite account:** + +For a Lite account, you have exceeded the 25 GB limit for the Cloud Object Storage instance\. Possible resolutions are to upgrade to a billable account, delete stored assets for the current account, or wait until the first of the month when the limit resets\. See [Set up a billable account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-account.html#paid-account)\. + +## Login not permitted from IP address ## + +### Symptoms ### + +When you create or work with a project, the following error occurs: + + User login from given IP address is not permitted. The user has configured IP address restriction for login. The given IP address 'XX.XXX.XXX.XX' is not contained in the list of allowed IP addresses. + +### Possible Causes ### + +**Restrict IP address access** has been configured to allow specific IP addresses access to Watson Studio\. The IP address of the computer you are using is not allowed\. + +### Possible Resolutions ### + +Add the IP address to the allowed IP addresses, if your security qualifications allow it\. See [Allow specific IP addresses](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html#allow-specific-ip-addresses)\. + +## Project cannot be created ## + +### Symptoms ### + +When you create a project, the following error occurs: + + Project cannot be created. + +### Possible Causes ### + +The Cloud Object Storage instance is not available, due to the **Global** location is not enabled for your services\. Cloud Object Storage requires the **Global** location\. + +### Possible Resolutions ### + +Enable the **Global** location in your account profile\. From your account, click your avatar and select **Profile and settings** to open your IBM watsonx profile\. Under **Service Filters > Locations**, check the **Global** location as well as other locations where services are present\. See [Manage your profile](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/personal-settings.html#profile)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5d9039607c167566ced9a4d7cc9f30f2b0c58554.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5d9039607c167566ced9a4d7cc9f30f2b0c58554.md new file mode 100644 index 0000000..a03aecf --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5d9039607c167566ced9a4d7cc9f30f2b0c58554.md @@ -0,0 +1,30 @@ +# restructurenode properties + +# restructurenode properties # + +![Restructure node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/restructurenodeicon.png)The Restructure node converts a nominal or flag field into a group of fields that can be populated with the values of yet another field\. For example, given a field named `payment type`, with values of `credit`, `cash`, and `debit`, three new fields would be created (`credit`, `cash`, `debit`), each of which might contain the value of the actual payment made\. + +Example + + node = stream.create("restructure", "My node") + node.setKeyedPropertyValue("fields_from", "Drug", ["drugA", "drugX"]) + node.setPropertyValue("include_field_name", True) + node.setPropertyValue("value_mode", "OtherFields") + node.setPropertyValue("value_fields", ["Age", "BP"]) + + + +restructurenode properties + +Table 1\. restructurenode properties + +| `restructurenode` properties | Data type | Property description | +| ---------------------------- | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `fields_from` | \[*category category category*\] `all` | | +| `include_field_name` | *flag* | Indicates whether to use the field name in the restructured field name\. | +| `value_mode` | `OtherFields``Flags` | Indicates the mode for specifying the values for the restructured fields\. With `OtherFields`, you must specify which fields to use\. With `Flags`, the values are numeric flags\. | +| `value_fields` | *list* | Required if `value_mode` is `OtherFields`\. Specifies which fields to use as value fields\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5dcc543a106ec708ff97817aa0cfdef8cb89894d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5dcc543a106ec708ff97817aa0cfdef8cb89894d.md new file mode 100644 index 0000000..fda5d18 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5dcc543a106ec708ff97817aa0cfdef8cb89894d.md @@ -0,0 +1,25 @@ +# ensemblenode properties + +# ensemblenode properties # + +![Ensemble node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/ensemblenodeicon.png)The Ensemble node combines two or more model nuggets to obtain more accurate predictions than can be gained from any one model\. + + + +ensemblenode properties + +Table 1\. ensemblenode properties + +| `ensemblenode` properties | Data type | Property description | +| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ensemble_target_field` | *field* | Specifies the target field for all models used in the ensemble\. | +| `filter_individual_model_output` | *flag* | Specifies whether scoring results from individual models should be suppressed\. | +| `flag_ensemble_method` | `Voting``ConfidenceWeightedVoting``RawPropensityWeightedVoting``AdjustedPropensityWeightedVoting``HighestConfidence``AverageRawPropensity``AverageAdjustedPropensity` | Specifies the method used to determine the ensemble score\. This setting applies only if the selected target is a flag field\. | +| `set_ensemble_method` | `Voting``ConfidenceWeightedVoting``HighestConfidence` | Specifies the method used to determine the ensemble score\. This setting applies only if the selected target is a nominal field\. | +| `flag_voting_tie_selection` | `Random``HighestConfidence``RawPropensity``AdjustedPropensity` | If a voting method is selected, specifies how ties are resolved\. This setting applies only if the selected target is a flag field\. | +| `set_voting_tie_selection` | `Random``HighestConfidence` | If a voting method is selected, specifies how ties are resolved\. This setting applies only if the selected target is a nominal field\. | +| `calculate_standard_error` | *flag* | If the target field is continuous, a standard error calculation is run by default to calculate the difference between the measured or estimated values and the true values; and to show how close those estimates matched\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5e1ce04d915b9a758f234f859dffefab46484c97.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5e1ce04d915b9a758f234f859dffefab46484c97.md new file mode 100644 index 0000000..c2ce925 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5e1ce04d915b9a758f234f859dffefab46484c97.md @@ -0,0 +1,31 @@ +# multilayerperceptronnode properties + +# multilayerperceptronnode properties # + +![MultiLayerPerceptron\-AS node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/sparkmultilayerperceptronnodeicon.png)Multilayer perceptron is a classifier based on the feedforward artificial neural network and consists of multiple layers\. Each layer is fully connected to the next layer in the network\. The MultiLayerPerceptron\-AS node in SPSS Modeler is implemented in Spark\. For details about the multilayer perceptron classifier (MLPC), see + +[https://spark\.apache\.org/docs/latest/ml\-classification\-regression\.html\#multilayer\-perceptron\-classifier](https://spark.apache.org/docs/latest/ml-classification-regression.html#multilayer-perceptron-classifier)\. + + + +multilayerperceptronnode properties + +Table 1\. multilayerperceptronnode properties + +| `multilayerperceptronnode` properties | Data type | Property description | +| ------------------------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `custom_fields` | *boolean* | This option tells the node to use field information specified here instead of that given in any upstream Type node(s)\. After selecting this option, specify the following fields as required\. | +| `target` | *field* | One field name for target\. | +| `inputs` | *field* | List of the field names for input\. | +| `num_hidden_layers` | *string* | Specify the number of hidden layers\. Use a comma between multiple hidden layers\. | +| `num_output_number` | *string* | Specify the number of output layers\. | +| `random_seed` | *integer* | Generate the seed used by the random number generator\. | +| `maxiter` | *integer* | Specify the maximum number of iterations to perform\. | +| `set_expert` | *boolean* | Select the Expert Mode option in the Model Building section if you want to specify the block size for stacking input data in matrices\. | +| `block_size` | *integer* | This option can speed up the computation\. | +| `use_model_name` | *boolean* | Specify a custom name for the model or use `auto`, which sets the label as the target field\. | +| `model_name` | *string* | Renamed model name\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5e2a4b92c4f5f84b3dde2ead6827c7fa89eb0565.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5e2a4b92c4f5f84b3dde2ead6827c7fa89eb0565.md new file mode 100644 index 0000000..7b79644 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5e2a4b92c4f5f84b3dde2ead6827c7fa89eb0565.md @@ -0,0 +1,18 @@ +# QUEST node (SPSS Modeler) + +# QUEST node # + +QUEST—or Quick, Unbiased, Efficient Statistical Tree—is a binary classification method for building decision trees\. A major motivation in its development was to reduce the processing time required for large C&R Tree analyses with either many variables or many cases\. A second goal of QUEST was to reduce the tendency found in classification tree methods to favor inputs that allow more splits, that is, continuous (numeric range) input fields or those with many categories\. + + + + * QUEST uses a sequence of rules, based on significance tests, to evaluate the input fields at a node\. For selection purposes, as little as a single test may need to be performed on each input at a node\. Unlike C&R Tree, all splits are not examined, and unlike C&R Tree and CHAID, category combinations are not tested when evaluating an input field for selection\. This speeds the analysis\. + * Splits are determined by running quadratic discriminant analysis using the selected input on groups formed by the target categories\. This method again results in a speed improvement over exhaustive search (C&R Tree) to determine the optimal split\. + + + +Requirements\. Input fields can be continuous (numeric ranges), but the target field must be categorical\. All splits are binary\. Weight fields cannot be used\. Any ordinal (ordered set) fields used in the model must have numeric storage (not string)\. If necessary, the Reclassify node can be used to convert them\. + +Strengths\. Like CHAID, but unlike C&R Tree, QUEST uses statistical tests to decide whether or not an input field is used\. It also separates the issues of input selection and splitting, applying different criteria to each\. This contrasts with CHAID, in which the statistical test result that determines variable selection also produces the split\. Similarly, C&R Tree employs the impurity\-change measure to both select the input field and to determine the split\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5e4d2166bb8c2b95e515591e014e7ca00b87bca2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5e4d2166bb8c2b95e515591e014e7ca00b87bca2.md new file mode 100644 index 0000000..95cd71e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5e4d2166bb8c2b95e515591e014e7ca00b87bca2.md @@ -0,0 +1,7 @@ +# Using the Text Analytics Workbench (SPSS Modeler) + +# Using the Text Analytics Workbench # + +The Text Analytics Workbench contains the extraction results and the category model contained in the text analytics package\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5ed78e19c7780c6856e1fa05d4b8a3f671fc878b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5ed78e19c7780c6856e1fa05d4b8a3f671fc878b.md new file mode 100644 index 0000000..15bc24f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5ed78e19c7780c6856e1fa05d4b8a3f671fc878b.md @@ -0,0 +1,7 @@ +# Diagrams + +# Diagrams # + +The term diagram covers the functions that are supported by both normal flows and SuperNode flows, such as adding and removing nodes and modifying connections between the nodes\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5edda143971ce5735307fede23fb0cd7e963264c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5edda143971ce5735307fede23fb0cd7e963264c.md new file mode 100644 index 0000000..8ecbbfa --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5edda143971ce5735307fede23fb0cd7e963264c.md @@ -0,0 +1,33 @@ +# factornode properties + +# factornode properties # + +![PCA/Factor node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/pcafactornodeicon.png)The PCA/Factor node provides powerful data\-reduction techniques to reduce the complexity of your data\. Principal components analysis (PCA) finds linear combinations of the input fields that do the best job of capturing the variance in the entire set of fields, where the components are orthogonal (perpendicular) to each other\. Factor analysis attempts to identify underlying factors that explain the pattern of correlations within a set of observed fields\. For both approaches, the goal is to find a small number of derived fields that effectively summarizes the information in the original set of fields\. + + + +factornode properties + +Table 1\. factornode properties + +| `factornode` Properties | Values | Property description | +| ----------------------- | ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `inputs` | \[*field1 \.\.\. fieldN*\] | PCA/Factor models use a list of input fields, but no target\. Weight and frequency fields are not used\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `method` | `PC``ULS``GLS``ML``PAF``Alpha``Image` | | +| `mode` | `Simple``Expert` | | +| `max_iterations` | *number* | | +| `complete_records` | *flag* | | +| `matrix` | `Correlation``Covariance` | | +| `extract_factors` | `ByEigenvalues``ByFactors` | | +| `min_eigenvalue` | *number* | | +| `max_factor` | *number* | | +| `rotation` | `None``Varimax``DirectOblimin``Equamax``Quartimax``Promax` | | +| `delta` | *number* | If you select `DirectOblimin` as your rotation data type, you can specify a value for `delta`\. If you don't specify a value, the default value for `delta` is used\. | +| `kappa` | *number* | If you select `Promax` as your rotation data type, you can specify a value for `kappa`\. If you don't specify a value, the default value for `kappa` is used\. | +| `sort_values` | *flag* | | +| `hide_values` | *flag* | | +| `hide_below` | *number* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5ee63fcc911ba90930d413b58e1310efe0e24243.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5ee63fcc911ba90930d413b58e1310efe0e24243.md new file mode 100644 index 0000000..97ccc4a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5ee63fcc911ba90930d413b58e1310efe0e24243.md @@ -0,0 +1,25 @@ +# Traversing through nodes in a flow + +# Traversing through nodes in a flow # + +A common requirement is to identify nodes that are either upstream or downstream of a particular node\. The flow provides a number of methods that can be used to identify these nodes\. These methods are summarized in the following table\. + + + +Methods to identify upstream and downstream nodes + +Table 1\. Methods to identify upstream and downstream nodes + +| Method | Return type | Description | +| ------------------------------ | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `s.iterator()` | Iterator | Returns an iterator over the node objects that are contained in the specified flow\. If the flow is modified between calls of the `next()` function, the behavior of the iterator is undefined\. | +| `s.predecessorAt(node, index)` | Node | Returns the specified immediate predecessor of the supplied node or `None` if the index is out of bounds\. | +| `s.predecessorCount(node)` | *int* | Returns the number of immediate predecessors of the supplied node\. | +| `s.predecessors(node)` | List | Returns the immediate predecessors of the supplied node\. | +| `s.successorAt(node, index)` | Node | Returns the specified immediate successor of the supplied node or `None` if the index is out of bounds\. | +| `s.successorCount(node)` | *int* | Returns the number of immediate successors of the supplied node\. | +| `s.successors(node)` | List | Returns the immediate successors of the supplied node\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5f0fc43f57ab9af130dea6a795e1e81a6aa95acc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5f0fc43f57ab9af130dea6a795e1e81a6aa95acc.md new file mode 100644 index 0000000..a9693b0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5f0fc43f57ab9af130dea6a795e1e81a6aa95acc.md @@ -0,0 +1,7 @@ +# Multiplot node (SPSS Modeler) + +# Multiplot node # + +A multiplot is a special type of plot that displays multiple `Y` fields over a single `X` field\. The `Y` fields are plotted as colored lines and each is equivalent to a Plot node with Style set to Line and X Mode set to Sort\. Multiplots are useful when you have time sequence data and want to explore the fluctuation of several variables over time\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5f398f2a5f6a2e75b9376b755c3ecf4b7f18b149.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5f398f2a5f6a2e75b9376b755c3ecf4b7f18b149.md new file mode 100644 index 0000000..3c573a4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5f398f2a5f6a2e75b9376b755c3ecf4b7f18b149.md @@ -0,0 +1,52 @@ +# Adding a connected folder asset to a project + +# Adding a connected folder asset to a project # + +You can create a connected folder asset based on a path within an IBM Cloud Object Storage system that is accessed through a connection\. You can view the files and subfolders that share the path with the connected folder asset\. The files that you can view within the connected folder asset are not themselves data assets\. For example, you can create a connected folder asset for a path that contains news feeds that are continuously updated\. + +**Required permissions** : You must have the **Admin** or **Editor** role in the project to add a connected folder asset\. + +Watch this video to see how to add a connected folder asset in a project, then follow the steps below the video\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +To add a connected folder asset from a connection to a project: + + + +1. If necessary, [create a connection asset](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. Include an Access Key and a Secret Key to your IBM Cloud Object Storage connection to enable the downloading of files within the connected folder asset\. If you're using an existing IBM Cloud Object Storage connection asset that doesn't have an Access Key and Secret Key, edit the connection asset and add them\. +2. Click **Import assets > Connected data**\. +3. Select an existing connection asset as the source of the data\. +4. Select the folder you want and click **Import**\. +5. Type a name and description\. +6. Click **Create**\. The connected folder asset appears on the project **Assets** page in the **Data assets** category\. + + + +Click the connected folder asset name to view the contents of the connected folder asset\. Click the eye (![eye icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/visibility-on.svg)) icon next to a file name to view the contents of the files within the folder that have these formats: + + + + * CSV + * JSON + * Parquet + + + +You can refine the files *within* a connected folder asset and then save the result as a data asset\. While viewing the connected folder asset, select a file and then click **Prepare data**\. + +You can view the files within the connected folder asset if the IBM Cloud Object Storage connection asset that's associated with the connected folder asset has an Access Key and a Secret Key (also known as HMAC credentials)\. For more information about HMAC credentials, see [IBM Cloud Object Storage Service credentials](https://console.bluemix.net/docs/services/cloud-object-storage/iam/service-credentials.html#service-credentials)\. + +## Next steps ## + + + + * [Refining a file within the folder](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + + + +**Parent topic:**[Adding data to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5f584aeed890d6efb4c9faf133a26bd9f9e4f219.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5f584aeed890d6efb4c9faf133a26bd9f9e4f219.md new file mode 100644 index 0000000..8a9c903 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5f584aeed890d6efb4c9faf133a26bd9f9e4f219.md @@ -0,0 +1,33 @@ +# Checking type values (SPSS Modeler) + +# Checking type values # + +Turning on the Check option for each field examines all values in that field to determine whether they comply with the current type settings or the values that you've specified\. This is useful for cleaning up datasets and reducing the size of a dataset within a single operation\. + +The Check column in the Type node determines what happens when a value outside of the type limits is discovered\. To change the check settings for a field, use the drop\-down list for that field in the Check column\. To set the check settings for all fields, select the check box for the top\-level Field column heading\. Then use the top\-level drop\-down above the Check column\. + +The following check options are available: + +None\. Values will be passed through without checking\. This is the default setting\. + +Nullify\. Change values outside of the limits to the system null (`$null$`)\. + +Coerce\. Fields whose measurement levels are fully instantiated will be checked for values that fall outside the specified ranges\. Unspecified values will be converted to a legal value for that measurement level using the following rules: + + + + * For flags, any value other than the true and false value is converted to the false value + * For sets (nominal or ordinal), any unknown value is converted to the first member of the set's values + * Numbers greater than the upper limit of a range are replaced by the upper limit + * Numbers less than the lower limit of a range are replaced by the lower limit + * Null values in a range are given the midpoint value for that range + + + +Discard\. When illegal values are found, the entire record is discarded\. + +Warn\. The number of illegal items is counted and reported in the flow properties dialog when all of the data has been read\. + +Abort\. The first illegal value encountered terminates the running of the flow\. The error is reported in the flow properties dialog\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5fe3de32efb5dea4094dca22cbc77e24d23ef67a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5fe3de32efb5dea4094dca22cbc77e24d23ef67a.md new file mode 100644 index 0000000..c3c96b1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/5fe3de32efb5dea4094dca22cbc77e24d23ef67a.md @@ -0,0 +1,26 @@ +# Functions handling blanks and null values (SPSS Modeler) + +# Functions handling blanks and null values # + +Using CLEM, you can specify that certain values in a field are to be regarded as "blanks," or missing values\. + +The following functions work with blanks\. + + + +CLEM blank and null value functions + +Table 1\. CLEM blank and null value functions + +| Function | Result | Description | +| ------------------------ | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `@BLANK(FIELD)` | *Boolean* | Returns true for all records whose values are blank according to the blank\-handling rules set in an upstream Type node or Import node (Types tab)\. | +| `@LAST_NON_BLANK(FIELD)` | *Any* | Returns the last value for *FIELD* that was not blank, as defined in an upstream Import or Type node\. If there are no nonblank values for *FIELD* in the records read so far, `$null$` is returned\. Note that blank values, also called user\-missing values, can be defined separately for each field\. | +| `@NULL(FIELD)` | *Boolean* | Returns true if the value of *FIELD* is the system\-missing `$null$.` Returns false for all other values, including user\-defined blanks\. If you want to check for both, use `@BLANK(FIELD)` and`@NULL(FIELD)`\. | +| `undef` | *Any* | Used generally in CLEM to enter a `$null$` value—for example, to fill blank values with nulls in the Filler node\. | + + + +Blank fields may be "filled in" with the Filler node\. In both Filler and Derive nodes (multiple mode only), the special CLEM function `@FIELD` refers to the current field(s) being examined\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6008cee94719e6b3caabfba9bff1973b9125e02f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6008cee94719e6b3caabfba9bff1973b9125e02f.md new file mode 100644 index 0000000..010b4d1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6008cee94719e6b3caabfba9bff1973b9125e02f.md @@ -0,0 +1,29 @@ +# Abbreviations + +# Abbreviations # + +Standard abbreviations are used throughout the syntax for node properties\. Learning the abbreviations is helpful in constructing scripts\. + + + +Standard abbreviations used throughout the syntax + +Table 1\. Standard abbreviations used throughout the syntax + +| Abbreviation | Meaning | +| ------------ | -------------------------------------- | +| abs | Absolute value | +| len | Length | +| min | Minimum | +| max | Maximum | +| correl | Correlation | +| covar | Covariance | +| num | Number or numeric | +| pct | Percent or percentage | +| transp | Transparency | +| xval | Cross\-validation | +| var | Variance or variable (in source nodes) | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6049d5aa5de41309e6281534a464abd6898a758c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6049d5aa5de41309e6281534a464abd6898a758c.md new file mode 100644 index 0000000..30c2ecb --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6049d5aa5de41309e6281534a464abd6898a758c.md @@ -0,0 +1,207 @@ +# Building reusable prompts + +# Building reusable prompts # + +Prompt engineering to find effective prompts for a model takes time and effort\. Stretch the benefits of your work by building prompts that you can reuse and share with others\. + +A great way to add flexibility to a prompt is to add *prompt variables*\. A prompt variable is a placeholder keyword that you include in the static text of your prompt at creation time and replace with text dynamically at run time\. + +## Using variables to change prompt text dynamically ## + +Variables help you to generalize a prompt so that it can be reused more easily\. + +For example, a prompt for a generative task might contain the following static text: + +`Write a story about a dog.` + +If you replace the text *dog* with a variable that is named `{animal}`, you add support for dynamic content to the prompt\. + +`Write a story about a {animal}.` + +With the variable `{animal}`, the text can still be used to prompt the model for a story about a dog\. But now it can be reused to ask for a story about a cat, a mouse, or another animal, simply by swapping the value that is specified for the `{animal}` variable\. + +## Creating prompt variables ## + +To create a prompt variable, complete the following steps: + + + +1. From the Prompt Lab, review the text in your prompt for words or phrases that, when converted to a variable, will make the prompt easier to reuse\. +2. Click the **Prompt variables** icon (![\{\#\}\}](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/parameter.svg)) at the start of the page\. + + The *Prompt variables* panel is displayed where you can add variable name-and-value pairs. +3. Click **New variable**\. +4. Click to add a variable name, tab to the next field, and then add a default value\. + + The variable name can contain alphanumeric characters or an underscore (\_), but cannot begin with a number. + + The default value for the variable is a fallback value; it is used every time that the prompt is submitted, unless someone overwrites the default value by specifying a new value for the variable. +5. Repeat the previous step to add more variables\. + + The following table shows some examples of the types of variables that you might want to add. + + \| Variable name \| Default value \| \|---------------\|---------------\| \| country \| Ireland \| \| city \| Boston \| \| project \| Project X \| \| company \| IBM \| +6. Replace static text in the prompt with your variables\. + + Select the word or phrase in the prompt that you want to replace, and then click the **Prompt variables** icon (![\{\#\}\}](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/parameter.svg)) within the text box to see a list of available variables. Click the variable that you want to use from the list. + + The variable replaces the selected text. It is formatted with the syntax `{variable name}`, where the variable name is surrounded by braces. + + If your static text already contains variables that are formatted with braces, they are ignored unless prompt variables of the same name exist. +7. To specify a value for a variable at run time, open the *Prompt variables* panel, click **Preview**, and then add a value for the variable\. + + You can also change the variable value from the edit view of the *Prompt variables* panel, but the value you specify will become the new default value. + + + +When you find a set of prompt static text, prompt variables, and prompt engineering parameters that generates the results you want from a model, save the prompt as a prompt template asset\. After you save the prompt template asset, you can reuse the prompt or share it with collaborators in the current project\. For more information, see [Saving prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-save.html)\. + +## Examples of reusing prompts ## + +The following examples help illustrate ways that using prompt variables can add versatility to your prompts\. + + + + * [Thank you note example](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-variables.html?context=cdpaas&locale=en#thank-you-example) + * [Devil's advocate example](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-variables.html?context=cdpaas&locale=en#devil-example) + + + +### Thank you note example ### + +Replace static text in the *Thank you note generation* built\-in sample prompt with variables to make the prompt reusable\. + +To add versatility to a built\-in prompt, complete the following steps: + + + +1. From the Prompt Lab, click **Sample prompts** to list the built\-in sample prompts\. From the *Generation* section, click **Thank you note generation**\. + + The input for the built-in sample prompt is added to the prompt editor and the flan-ul2-20b model is selected. + + Write a thank you note for attending a workshop. + + Attendees: interns + Topic: codefest, AI + Tone: energetic +2. Review the text for words or phrases that make good variable candidates\. + + In this example, if the following words are replaced, the prompt meaning will change: + + + + * workshop + * interns + * codefest + * AI + * energetic + + + +3. Create a variable to represent each word in the list\. Add the current value as the default value for the variable\. + + \| Variable name \| Value \| \|---------------\|---------------\| \| event \| workshop \| \| attendees \| interns \| \| topic1 \| codefest \| \| topic2 \| AI \| \| tone \| energetic \| +4. Click **Preview** to review the variables that you added\. +5. Update the static prompt text to use variables in place of words\. + + Write a thank you note for attending a {event}. + + Attendees: {attendees} + Topic: {topic1}, {topic2} + Tone: {tone} + + ![Screenshot that shows static text in the prompt editor being replaced with variables.](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fm-prompt-var-replacement.png) + + The original meaning of the prompt is maintained. +6. Now, change the values of the variables to change the meaning of the prompt\. + + From the *Fill in prompt variables* view of the prompt variables panel, add values for the variables. + + \| Variable name \| Value \| \|---------------\|---------------\| \| event \| human resources presentation \| \| attendees \| expecting parents \| \| topic1 \| resources for new parents \| \| topic2 \| parental leave \| \| tone \| supportive \| + + You effectively converted the original prompt into the following prompt: + + Write a thank you note for attending a human resources presentation. + + Attendees: expecting parents + Topic: resources for new parents, parental leave + Tone: supportive + + Click **Generate** to see how the model responds. +7. Swap the values for the variables to reuse the same prompt again to generate thank you notes for usability test attendees\. + + \| Variable name \| Value \| \|---------------\|-------\| \| event \| usability test \| \| attendees \| user volunteers \| \| topic1 \| testing out new features \| \| topic2 \| sharing early feedback \| \| tone \| appreciative \| + + Click **Generate** to see how the model responds. + + + +### Devil's advocate example ### + +Use prompt variables to reuse effective examples that you devise for a prompt\. + +You can guide a foundation model to answer in an expected way by adding a few examples that establish a pattern for the model to follow\. This kind of prompt is called a *few\-shot prompt*\. Inventing good examples for a prompt requires imagination and testing and can be time\-consuming\. If you successfully create a few\-shot prompt that proves to be effective, you can make it reusable by adding prompt variables\. + +Maybe you want to use the granite\-13b\-instruct\-v1 model to help you consider risks or problems that might arise from an action or plan under consideration\. + +For example, the prompt might have the following instruction and examples: + + You are playing the role of devil's advocate. Argue against the proposed plans. List 3 detailed, unique, compelling reasons why moving forward with the plan would be a bad choice. Consider all types of risks. + + Plan we are considering: + Extend our store hours. + Three problems with this plan are: + 1. We'll have to pay more for staffing. + 2. Risk of theft increases late at night. + 3. Clerks might not want to work later hours. + + Plan we are considering: + Open a second location for our business. + Three problems with this plan are: + 1. Managing two locations will be more than twice as time-consuming than managed just one. + 2. Creating a new location doesn't guarantee twice as many customers. + 3. A new location means added real estate, utility, and personnel expenses. + + Plan we are considering: + Refreshing our brand image by creating a new logo. + Three problems with this plan are: + +You can reuse the prompt by completing the following steps: + + + +1. Replace the text that describes the action that you are considering with a variable\. + + For example, you can add the following variable: + + \| Variable name \| Default value \| \|---------------\|---------------\| \| plan \| Refreshing our brand image by creating a new logo. \| +2. Replace the static text that defines the plan with the `{plan}` variable\. + + You are playing the role of devil's advocate. Argue against the proposed plans. List 3 detailed, unique, compelling reasons why moving forward with the plan would be a bad choice. Consider all types of risks. + + Plan we are considering: + Extend our store hours. + Three problems with this plan are: + 1. We'll have to pay more for staffing. + 2. Risk of theft increases late at night. + 3. Clerks might not want to work later hours. + + Plan we are considering: + Open a second location for our business. + Three problems with this plan are: + 1. Managing two locations will be more than twice as time-consuming than managed just one. + 2. Creating a new location doesn't guarantee twice as many customers. + 3. A new location means added real estate, utility, and personnel expenses. + + Plan we are considering: + {plan} + Three problems with this plan are: + + Now you can use the same prompt to prompt the model to brainstorm about other actions. +3. Change the text in the `{plan}` variable to describe a different plan, and then click **Generate** to send the new input to the model\. + + + +**Parent topic:**[Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6068b2555e5014d386397335d0ed56b430082ff7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6068b2555e5014d386397335d0ed56b430082ff7.md new file mode 100644 index 0000000..aea2884 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6068b2555e5014d386397335d0ed56b430082ff7.md @@ -0,0 +1,12 @@ +# The Resource editor tab (SPSS Modeler) + +# The Resource editor tab # + +Text Analytics rapidly and accurately captures key concepts from text data by using an extraction process\. This process relies on linguistic resources to dictate how large amounts of unstructured, textual data should be analyzed and interpreted\. + +You can use the Resource editor tab to view the linguistic resources used in the extraction process\. These resources are stored in the form of templates and libraries, which are used to extract concepts, group them under types, discover patterns in the text data, and other processes\. Text Analytics offers several preconfigured resource templates, and in some languages, you can also use the resources in text analysis packages\. + +Figure 1\. Resource editor tab + +![Resource editor tab in the Text Analytics Workbench](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tmwb_resourceeditor.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/606ef22cf35af0edc961776fb893b07a880f11d4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/606ef22cf35af0edc961776fb893b07a880f11d4.md new file mode 100644 index 0000000..e239687 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/606ef22cf35af0edc961776fb893b07a880f11d4.md @@ -0,0 +1,27 @@ +# IBM Watson Pipelines + +# IBM Watson Pipelines # + +The Watson Pipelines editor provides a graphical interface for orchestrating an end\-to\-end flow of assets from creation through deployment\. Assemble and configure a pipeline to create, train, deploy, and update machine learning models and Python scripts\. + +To design a pipeline that you drag nodes onto the canvas, specify objects and parameters, then run and monitor the pipeline\. + +## Automating the path to production ## + +Putting a model into a product is a multi\-step process\. Data must be loaded and processed, models must be trained and tuned before they are deployed and tested\. Machine learning models require more observation, evaluation, and updating over time to avoid bias or drift\. + +![Automating the AI lifecycle](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/oflow-cycle-3.svg) + +Automating the pipeline makes it simpler to build, run, and evaluate a model in a cohesive way, to shorten the time from conception to production\. You can assemble the pipeline, then rapidly update and test modifications\. The Pipelines canvas provides tools to visualize the pipeline, customize it at run time with pipeline parameter variables, and then run it as a trial job or on a schedule\. + +The Pipelines editor also allows for more cohesive collaboration between a data scientist and a ModelOps engineer\. A data scientist can create and train a model\. A ModelOps engineer can then automate the process of training, deploying, and evaluating the model after it is published to a production environment\. + +## Next steps ## + +[Add a pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-get-started.html) to your project and get to know the canvas tools\. + +## Additional resources ## + +For more information, see this blog post about [automating the AI lifecycle with a pipeline flow](https://yairschiff.medium.com/automating-the-ai-lifecycle-with-ibm-watson-studio-orchestration-flow-4450f1d725d6)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/60cc59b176b08462143ea591dac074060ad988c7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/60cc59b176b08462143ea591dac074060ad988c7.md new file mode 100644 index 0000000..3501af2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/60cc59b176b08462143ea591dac074060ad988c7.md @@ -0,0 +1,31 @@ +# Sending model transactions in watsonx.governance + +# Sending model transactions in watsonx\.governance # + +You must send model transactions from your deployment to watsonx\.governance to enable model evaluations\. + +To generate accurate results for your model evaluations constantly, watsonx\.governance must continue to receive new data from your deployment\. watsonx\.governance provides different methods that you can use to send transactions for model evaluations\. + +## Importing data ## + +When you review evaluation results in watsonx\.governance, you can import data by selecting **Evaluate now** in the **Actions** menu to import payload and feedback data for your model evaluations\. + +![Analyze prompt template evaluation results](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-eval-results-prod-spaces.png) + +For pre\-production models, you must upload a CSV file that contains examples of input and output data\. To run evaluations with imported data, you must map prompt variables to the associated columns in your CSV file and select **Upload and evaluate** as shown in the following example: + +![Upload CSV file](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-map-prompt-variables-preprod.png) + +For production models, you can select **Upload payload data** or **Upload feedback data** in the **Import test data** window to upload a CSV file as shown in the following example: + +![Import test data](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-import-test-data-prod-space.png) + +The CSV file must contain labeled columns that match the columns in your payload and feedback schemas\. When your upload completes successfully, you can select **Evaluate now** to run your evaluations with your imported data\. + +## Using endpoints ## + +For production models, Watson OpenScale supports endpoints that you can use to provide data in formats that enable evaluations\. You can use the payload logging endpoint to send scoring requests for drift evaluations and use the feedback logging endpoint to provide feedback data for quality evaluations\. For more information about the data formats, see [Managing data for model evaluations](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-manage-data.html#it-dbo-active)\. + +**Parent topic:**[Managing data for model evaluations in Watson OpenScale](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-manage-data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6153f9f311cd2bb2df31c6a4a1cb76d64e36bfe6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6153f9f311cd2bb2df31c6a4a1cb76d64e36bfe6.md new file mode 100644 index 0000000..b1d6831 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6153f9f311cd2bb2df31c6a4a1cb76d64e36bfe6.md @@ -0,0 +1,25 @@ +# Mining for text links (SPSS Modeler) + +# Mining for text links # + +The Text Link Analysis (TLA) node adds pattern\-matching technology to text mining's concept extraction in order to identify relationships between the concepts in the text data based on known patterns\. These relationships can describe how a customer feels about a product, which companies are doing business together, or even the relationships between genes or pharmaceutical agents\. + +![Text Link Analysis node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/ta_tla.png) + +For example, extracting your competitor’s product name may not be interesting enough to you\. Using this node, you could also learn how people feel about this product, if such opinions exist in the data\. The relationships and associations are identified and extracted by matching known patterns to your text data\. + +You can use the TLA pattern rules inside certain resource templates shipped with Text Analytics or create/edit your own\. Pattern rules are made up of macros, word lists, and word gaps to form a Boolean query, or rule, that is compared to your input text\. Whenever a TLA pattern rule matches text, this text can be extracted as a TLA result and restructured as output data\. + +The Text Link Analysis node offers a more direct way to identify and extract TLA pattern results from your text and then add the results to the dataset in the flow\. But the Text Link Analysis node is not the only way in which you can perform text link analysis\. You can also use a Text Analytics Workbench session in the Text Mining modeling node\. + +In the Text Analytics Workbench, you can explore the TLA pattern results and use them as category descriptors and/or to learn more about the results using drill\-down and graphs\. In fact, using the Text Mining node to extract TLA results is a great way to explore and fine\-tune templates to your data for later use directly in the TLA node\. + +The output can be represented in up to 6 slots, or parts\. + +You can find this node under the Text Analytics section of the node palette\. + +Requirements\. The Text Link Analysis node accepts text data read into a field using an Import node\. + +Strengths\. The Text Link Analysis node goes beyond basic concept extraction to provide information about the relationships *between* concepts, as well as related opinions or qualifiers that may be revealed in the data\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6199bbb097894542ea31c726d8ef4a3357eed1e2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6199bbb097894542ea31c726d8ef4a3357eed1e2.md new file mode 100644 index 0000000..2eb5e96 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6199bbb097894542ea31c726d8ef4a3357eed1e2.md @@ -0,0 +1,79 @@ +# Provisioning and launching watsonx.governance + +# Provisioning and launching watsonx\.governance # + +You can provision and launch your watsonx\.governance service instance to start monitoring your model assets\. + +**Prerequisite** : You must be [signed up for watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/signup-wx.html)\. + +**Required permissions** : To provision and launch a watsonx\.governance service instance, you must have *Administrator* or *Editor* platform access roles in the IBM Cloud account for IBM watsonx\. If you signed up for IBM watsonx with your own IBM Cloud account, you are the owner of the account\. Otherwise, you can [check your IBM Cloud account roles and permissions](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/your-roles.html#iamroles)\. + +## Launching a watsonx\.governance service instance ## + +Before you launch watsonx\.governance, you must [create a service instance](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/create-services.html) from your watsonx account\. + +To launch watsonx\.governance from IBM watsonx: + + + +1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg), choose **Administration > Services > Service instances**\. +2. Click your *watsonx\.governance* service instance\. +3. From the *Service Details* page, click **Launch watsonx\.governance**\. + + + +## Managing watsonx\.governance ## + +You can manage your Watson OpenScale service instance by upgrading it or deleting it\. + +You can upgrade watsonx\.governance from a free Lite plan to a paid plan by using the IBM Cloud dashboard: + +Note:Upgrade to a paid plan if you are getting error messages, such as `403 Errors.AIQFM0011: 'Lite plan has exceeded the 50,000 rows limitation for Debias` or `Deployment creation failed. Error: 402`\. + + + +1. From the watsonx\.governance dashboard, click your profile\. +2. Click **View upgrade options**\. +3. Select the **Essential** plan and click **Upgrade**\. + + + +You can also delete the watsonx\.governance service instance and related data\. After 30 days of inactivity, the data mart is automatically deleted for a Lite plan\. + +When the data mart is deleted, it includes the service configuration settings and tables: + + + + * All configuration tables are deleted including the following configuration tables and files: + + + + * Bindings + * Subscriptions + * Settings + + + + * All the tables that are created for model evaluation are deleted, including, but not limited to, the following tables: + + + + * Payload + * Feedback + * Manual labeling + * monitors + * Performance + * Explanation + * Annotation tables + + + + + +Lite plan services are deleted after 30 days of inactivity\. Even if you don't delete your instance from IBM Cloud, your data mart is deleted after 30 days of inactivity\. + +As a user of the Essential plan, your data mart is not automatically deleted\. You can delete your watsonx\.governance service instance from IBM Cloud and use the command\-line interface to delete the data mart\. + +**Parent topic:**[Evaluating AI models with Watson OpenScale](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/getting-started.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/61e8df28e1a79b4bba03cda39f350be5e55dac7b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/61e8df28e1a79b4bba03cda39f350be5e55dac7b.md new file mode 100644 index 0000000..479c3c8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/61e8df28e1a79b4bba03cda39f350be5e55dac7b.md @@ -0,0 +1,7 @@ +# Functions available for missing values (SPSS Modeler) + +# Functions available for missing values # + +Different methods are available for dealing with missing values in your data\. You may choose to use functionality available in Data Refinery or in nodes\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/61f714f5629ad260b0d9776fc53cda2eaa10df24.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/61f714f5629ad260b0d9776fc53cda2eaa10df24.md new file mode 100644 index 0000000..5a1daf5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/61f714f5629ad260b0d9776fc53cda2eaa10df24.md @@ -0,0 +1,6 @@ +# Radar charts + +# Radar charts # + +Radar charts compare multiple quantitative variables and are useful for visualizing which variables have similar values, or if outliers exist among the variables\. Radar charts consists of a sequence of spokes, with each spoke representing a single variable\. Radar Charts are also useful for determining which variables are scoring high or low within a data set\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/621083eb36cf3896b77d22edbcc23fd2716f6b4a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/621083eb36cf3896b77d22edbcc23fd2716f6b4a.md new file mode 100644 index 0000000..d3b27e4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/621083eb36cf3896b77d22edbcc23fd2716f6b4a.md @@ -0,0 +1,21 @@ +# Converting date and time values (SPSS Modeler) + +# Converting date and time values # + +Note that conversion functions (and any other functions that require a specific type of input, such as a date or time value) depend on the current formats specified in the flow properties\. + +For example, if you have a field named *DATE* that's stored as a string with values *Jan 2021*, *Feb 2021*, and so on, you could convert it to date storage as follows: + + to_date(DATE) + +For this conversion to work, select the matching date format MON YYYY as the default date format for the flow\. + +Dates stored as numbers\. Note that `DATE` in the previous example is the name of a field, while `to_date` is a CLEM function\. If you have dates stored as numbers, you can convert them using the `datetime_date` function, where the number is interpreted as a number of seconds since the base date (or epoch)\. + + datetime_date(DATE) + +By converting a date to a number of seconds (and back), you can perform calculations such as computing the current date plus or minus a fixed number of days\. For example: + + datetime_date((date_in_days(DATE)-7)*60*60*24) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/622526f6c171ced140394f3dd707b612778b661e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/622526f6c171ced140394f3dd707b612778b661e.md new file mode 100644 index 0000000..75d4676 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/622526f6c171ced140394f3dd707b612778b661e.md @@ -0,0 +1,29 @@ +# Passing arguments to a script + +# Passing arguments to a script # + +Passing arguments to a script is useful because a script can be used repeatedly without modification\. + +The arguments you pass on the command line are passed as values in the list `sys.argv`\. You can use the `len(sys.argv)` command to obtain the number of values passed\. For example: + + import sys + print "test1" + print sys.argv[0] + print sys.argv[1] + print len(sys.argv) + +In this example, the `import` command imports the entire `sys` class so that you can use the existing methods for this class, such as `argv`\. + +The script in this example can be invoked using the following line: + + /u/mjloos/test1 mike don + +The result is the following output: + + /u/mjloos/test1 mike don + test1 + mike + don + 3 + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/628354b3f2fa792b938756225315e3b4024dcc0e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/628354b3f2fa792b938756225315e3b4024dcc0e.md new file mode 100644 index 0000000..e8d2eea --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/628354b3f2fa792b938756225315e3b4024dcc0e.md @@ -0,0 +1,35 @@ +# Functions reference (SPSS Modeler) + +# Functions reference # + +This section lists CLEM functions for working with data in SPSS Modeler\. You can enter these functions as code in various areas of the user interface, such as Derive and Set To Flag nodes, or you can use the Expression Builder to create valid CLEM expressions without memorizing function lists or field names\. + + + +CLEM functions for use with SPSS Modeler data + +Table 1\. CLEM functions for use with SPSS Modeler data + +| Function Type | Description | +| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Information](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_information.html#clem_function_ref_information) | Used to gain insight into field values\. For example, the function `is_string` returns true for all records whose type is a string\. | +| [Conversion](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_conversion.html#clem_function_ref_conversion) | Used to construct new fields or convert storage type\. For example, the function `to_timestamp` converts the selected field to a timestamp\. | +| [Comparison](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_comparison.html#clem_function_ref_comparison) | Used to compare field values to each other or to a specified string\. For example, `<=`is used to compare whether the values of two fields are lesser or equal\. | +| [Logical](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_logical.html#clem_function_ref_logical) | Used to perform logical operations, such as `if`, `then`, `else` operations\. | +| [Numeric](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_numeric.html#clem_function_ref_numeric) | Used to perform numeric calculations, such as the natural log of field values\. | +| [Trigonometric](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_trigonometric.html#clem_function_ref_trigonometric) | Used to perform trigonometric calculations, such as the arccosine of a specified angle\. | +| [Probability](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_probability.html#clem_function_ref_probability) | Returns probabilities that are based on various distributions, such as probability that a value from Student's t distribution is less than a specific value\. | +| [Spatial](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_spatial.html#clem_function_ref_spatial) | Used to perform spatial calculations on geospatial data\. | +| [Bitwise](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_bitwise.html#clem_function_ref_bitwise) | Used to manipulate integers as bit patterns\. | +| [Random](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_random.html#clem_function_ref_random) | Used to randomly select items or generate numbers\. | +| [String](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_string.html#clem_function_ref_string) | Used to perform various operations on strings, such as `stripchar`, which allows you to remove a specified character\. | +| [SoundEx](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_soundex.html#clem_function_ref_soundex) | Used to find strings when the precise spelling is not known; based on phonetic assumptions about how certain letters are pronounced\. | +| [Date and time](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_datetime.html#clem_function_ref_datetime) | Used to perform various operations on date, time, and timestamp fields\. | +| [Sequence](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_sequence.html#clem_function_ref_sequence) | Used to gain insight into the record sequence of a data set or perform operations that are based on that sequence\. | +| [Global](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_global.html#clem_function_ref_global) | Used to access global values that are created by a Set Globals node\. For example, `@MEAN` is used to refer to the mean average of all values for a field across the entire data set\. | +| [Blanks and null](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_blanksnulls.html#clem_function_ref_blanksnulls) | Used to access, flag, and frequently fill user\-specified blanks or system\-missing values\. For example, `@BLANK(FIELD)` is used to raise a true flag for records where blanks are present\. | +| [Special fields](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_specialfields.html#clem_function_ref_specialfields) | Used to denote the specific fields under examination\. For example, `@FIELD` is used when deriving multiple fields\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/62bf74e391cfe1696e5218b3df0926b735a4788f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/62bf74e391cfe1696e5218b3df0926b735a4788f.md new file mode 100644 index 0000000..54acfbc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/62bf74e391cfe1696e5218b3df0926b735a4788f.md @@ -0,0 +1,198 @@ +# Batch deployment input details for SPSS models + +# Batch deployment input details for SPSS models # + +Follow these rules when you are specifying input details for batch deployments of SPSS models\. + +Data type summary table: + + + +| Data | Description | +| ------------ | ----------------------- | +| Type | inline, data references | +| File formats | CSV | + + + +## Data sources ## + +Input or output data references: + + + + * Local or managed assets from the space + * Connected (remote) assets from these sources: + + + + * [Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html) + * [Db2 Warehouse](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-wh.html) + * [Db2](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2.html) + * [Google Big-Query (googlebq)](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-bigquery.html) + * [MySQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mysql.html) + * [Microsoft SQL Server](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-sql-server.html) + * [Teradata (teradata)](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-teradata.html) + * [PostgreSQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-postgresql.html) + * [Oracle](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-oracle.html) + * [Snowflake](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-snowflake.html) + * [Informix](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-informix.html) + * [Netezza Performance Server](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-puredata.html) + + + + + +**Notes:** + + + + * For connections of type [Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html) or [Cloud Object Storage (infrastructure)](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos-infra.html), you must configure **Access key** and **Secret key**, also known as [HMAC credentials](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-uhc-hmac-credentials-main)\. + * For SPSS deployments, these data sources are not compliant with Federal Information Processing Standard (FIPS): + + + + * Cloud Object Storage + * Cloud Object Storage (infrastructure) + * Storage volumes + + + + + +If you are specifying input/output data references programmatically: + + + + * Data source reference `type` depends on the asset type\. Refer to the **Data source reference types** section in [Adding data assets to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + * SPSS jobs support multiple data source inputs and a single output\. If the schema is not provided in the model metadata at the time of saving the model, you must enter `id` manually and select a data asset for each connection\. If the schema is provided in model metadata, `id` names are populated automatically by using metadata\. You select the data asset for the corresponding `id`s in Watson Studio\. For more information, see [Using multiple data sources for an SPSS job](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-SPSS-multiple-input.html)\. + * To create a local or managed asset as an output data reference, the `name` field must be specified for `output_data_reference` so that a data asset is created with the specified name\. Specifying an `href` that refers to an existing local data asset is not supported\. Note: + + + +Connected data assets that refer to supported databases can be created in the `output_data_references` only when the `input_data_references` also refers to one of these sources\. + + + + * Table names that are provided in input and output data references are ignored\. Table names that are referred in the SPSS model stream are used during the batch deployment\. + * Use SQL PushBack to generate SQL statements for IBM SPSS Modeler operations that can be “pushed back” to or run in the database to improve performance\. SQL Pushback is only supported by: + + + + * Db2 + * SQL Server + * Netezza Performance Server + + + + * If you are creating a job by using the Python client, you must provide the connection name that is referred in the data nodes of the SPSS model stream in the `id` field, and the data asset href in `location.href` for input/output data references of the deployment jobs payload\. For example, you can construct the job payload like this: + + job_payload_ref = { + client.deployments.ScoringMetaNames.INPUT_DATA_REFERENCES: [{ + "id": "DB2Connection", + "name": "drug_ref_input1", + "type": "data_asset", + "connection": {}, + "location": { + "href": + } + },{ + "id": "Db2 WarehouseConn", + "name": "drug_ref_input2", + "type": "data_asset", + "connection": {}, + "location": { + "href": + } + }], + client.deployments.ScoringMetaNames.OUTPUT_DATA_REFERENCE: { + "type": "data_asset", + "connection": {}, + "location": { + "href": + } + } + } + + + +#### Using connected data for an SPSS Modeler flow job #### + +An SPSS Modeler flow can have a number of input and output data nodes\. When you connect to a supported database as an input and output data source, the connection details are selected from the input and output data reference, but the input and output table names are selected from the SPSS model stream file\. + +For batch deployment of an SPSS model that uses a database connection, make sure that the modeler stream Input and Output nodes are Data Asset nodes\. In SPSS Modeler, the Data Asset nodes must be configured with the table names that are used later for job predictions\. Set the nodes and table names before you save the model to Watson Machine Learning\. When you are configuring the Data Asset nodes, choose the table name from the Connections; choosing a Data Asset that is created in your project is not supported\. + +When you are creating the deployment job for an SPSS model, make sure that the types of data sources are the same for input and output\. The configured table names from the model stream are passed to the batch deployment and the input/output table names that are provided in the connected data are ignored\. + +For batch deployment of an SPSS model that uses a Cloud Object Storage connection, make sure that the SPSS model stream has single input and output data asset nodes\. + +#### Supported combinations of input and output sources #### + +You must specify compatible sources for the SPSS Modeler flow input, the batch job input, and the output\. If you specify an incompatible combination of types of data sources, you get an error when you try to run the batch job\. + +These combinations are supported for batch jobs: + + + +| SPSS model stream input/output | Batch deployment job input | Batch deployment job output | +| ------------------------------ | ------------------------------------------------------------------- | ---------------------------------------------------- | +| File | Local, managed, or referenced data asset or connection asset (file) | Remote data asset or connection asset (file) or name | +| Database | Remote data asset or connection asset (database) | Remote data asset or connection asset (database) | + + + +#### Specifying multiple inputs #### + +If you are specifying multiple inputs for an SPSS model stream deployment with no schema, specify an ID for each element in `input_data_references`\. + +For more information, see [Using multiple data sources for an SPSS job](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-SPSS-multiple-input.html)\. + +In this example, when you create the job, provide three input entries with IDs: `sample_db2_conn`, `sample_teradata_conn`, and `sample_googlequery_conn` and select the required connected data for each input\. + + { + "deployment": { + "href": "/v4/deployments/" + }, + "scoring": { + "input_data_references": [{ + "id": "sample_db2_conn", + "name": "DB2 connection", + "type": "data_asset", + "connection": {}, + "location": { + "href": "/v2/assets/?space_id=" + }, + }, + { + "id": "sample_teradata_conn", + "name": "Teradata connection", + "type": "data_asset", + "connection": {}, + "location": { + "href": "/v2/assets/?space_id=" + }, + }, + { + "id": "sample_googlequery_conn", + "name": "Google bigquery connection", + "type": "data_asset", + "connection": {}, + "location": { + "href": "/v2/assets/?space_id=" + }, + }], + "output_data_references": { + "id": "sample_db2_conn", + "type": "data_asset", + "connection": {}, + "location": { + "href": "/v2/assets/?space_id=" + }, + } + } + +Note: The environment variables parameter of deployment jobs is not applicable\. + +**Parent topic:**[Batch deployment input details by framework](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-by-framework.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/631559e8401c52c3aac6d64e1f9da0f765fc4846.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/631559e8401c52c3aac6d64e1f9da0f765fc4846.md new file mode 100644 index 0000000..af251fd --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/631559e8401c52c3aac6d64e1f9da0f765fc4846.md @@ -0,0 +1,75 @@ +# Generic S3 connection + +# Generic S3 connection # + +To access your data from a storage service that is compatible with the Amazon S3 API, create a connection asset for it\. + +## Create a Generic S3 connection ## + +To create the connection asset, you need these connection details: + + + + * **Endpoint URL**: The endpoint URL to access to S3 + * **Bucket**(optional): The name of the bucket that contains the files + * **Region** (optional): S3 region\. Specify a region that matches the regional endpoint\. + * **Access key**: The access key (username) that authorizes access to S3 + * **Secret key**: The password associated with the Access key ID that authorizes access to S3 + * The SSL certificate of the trusted host\. The certificate is required when the host certificate is not signed by a known certificate authority\. + * **Disable chunked encoding**: Select if the storage does not support chunked encoding\. + * **Enable global bucket access**: Consult the documentation for your S3 data source for whether to select this property\. + * **Enable path style access**: Consult the documentation for your S3 data source for whether to select this property\. + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** +Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** +Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use the Generic S3 connection in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Generic S3 connection setup ## + +For setup information, consult the documentation of the S3\-compatible data source that you are connecting to\. + +## Supported file types ## + +The Generic S3 connection supports these file types: Avro, CSV, delimited text, Excel, JSON, ORC, Parquet, SAS, SAV, SHP, and XML\. + +**Related connection**: [Amazon S3 connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-amazon-s3.html) + +**Parent topic**: [Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6349e43ea9b4ac5775db122e0f6c365d5db810bf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6349e43ea9b4ac5775db122e0f6c365d5db810bf.md new file mode 100644 index 0000000..f88dda9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6349e43ea9b4ac5775db122e0f6c365d5db810bf.md @@ -0,0 +1,23 @@ +# Managing the lifecycle of notebooks and scripts + +# Managing the lifecycle of notebooks and scripts # + +After you have created and tested your notebooks, you can add them to pipelines, publish them to a catalog so that other catalog members can use the notebook in their projects, or share read\-only copies outside of Watson Studio so that people who aren't collaborators in your Watson Studio projects can see and use them\. R scripts and Shiny apps can't be published or shared using functionality in a project at this time\. + +You can use any of these methods for notebooks: + + + + * [Add notebooks to a pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-config.html) + * [Share a URL on social media](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/share-notebooks.html) + * [Publish on GitHub](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/github-integration.html) + * [Publish as a gist](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-gist.html) + * [Publish your notebook to a catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/catalog/publish-asset-project.html) + + + +Make sure that before you share or publish a notebook, you hide any sensitive code, like credentials, that you don't want others to see\! See [Hide sensitive cells in a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/hide_code.html)\. + +**Parent topic:**[Notebooks and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebooks-and-scripts.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/63c0dfb695860e1da7981d86959d998bebc2dd03.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/63c0dfb695860e1da7981d86959d998bebc2dd03.md new file mode 100644 index 0000000..c58fc8d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/63c0dfb695860e1da7981d86959d998bebc2dd03.md @@ -0,0 +1,18 @@ +# Python for Spark scripts (SPSS Modeler) + +# Python for Spark scripts # + +SPSS Modeler supports Python scripts for Apache Spark\. + +Note: + + + + * Python nodes depend on the Spark environment\. + * Python scripts must use the Spark API because data is presented in the form of a Spark DataFrame\. + * When installing Python, make sure all users have permission to access the Python installation\. + * If you want to use the Machine Learning Library (MLlib), you must install a version of Python that includes NumPy\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6402316febfad11a582d9c567811003f4bee596a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6402316febfad11a582d9c567811003f4bee596a.md new file mode 100644 index 0000000..9c53e1a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6402316febfad11a582d9c567811003f4bee596a.md @@ -0,0 +1,7 @@ +# Extension Export node (SPSS Modeler) + +# Extension Export node # + +You can use the Extension Export node to run R scripts or Python for Spark scripts to export data\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/64057aa641f9259654e5f08d996209ef8027a3af.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/64057aa641f9259654e5f08d996209ef8027a3af.md new file mode 100644 index 0000000..771f057 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/64057aa641f9259654e5f08d996209ef8027a3af.md @@ -0,0 +1,50 @@ +# Switching between the IBM watsonx as a Service and Cloud Pak for Data as a Service platforms + +# Switching between the IBM watsonx as a Service and Cloud Pak for Data as a Service platforms # + +If you are a Cloud Pak for Data as a Service user, you have access to IBM watsonx as a Service and you can switch between the two platforms\. + +Important:Foundation model inferencing and the Prompt Lab tool to work with foundation models are available only in the Dallas and Frankfurt regions\. Your Watson Studio and Watson Machine Learning service instances are shared between watsonx and Cloud Pak for Data as a Service\. If your Watson Studio and Watson Machine Learning service instances are provisioned in another region, you can't use foundation model inferencing or the Prompt Lab\. + +If you signed up for watsonx only, you can't switch to Cloud Pak for Data as a Service and you don't have a **Switch platform** option\. To switch to Cloud Pak for Data as a Service, you must sign up for it\. + +To switch between platforms: + + + +1. Log in to either IBM watsonx as a Service or Cloud Pak for Data as a Service\. Your region must be Dallas\. +2. On the platform home page, click the **Switch platform** icon (![switch platform icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/Platform-switcher-icon.svg)) next to your avatar, and select the platform\. + + + +## Service instances and resource consumption ## + +When you switch platforms, you continue using the same Watson Studio and Watson Machine Learning service instances\. + +The resources that you consume for each of these service instances is cumulative\. For example, suppose you use 3 CUH for Watson Studio on Cloud Pak for Data as a Service in the first half of July\. Then, you switch to watsonx and use 3 CUH for Watson Studio in the second half of July\. Your total CUH for the Watson Studio service for July is 6 CUH\. + +## Switch projects and deployment spaces between platforms ## + +You can switch a project or a deployment space from one platform to the other if that project or space meets the requirements and restrictions\. See [Switching the platform for a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/switch-platform.html) and [Switching the platform for a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/switch-platform-space.html)\. + +## Platform assets catalog ## + +You share a single Platform assets catalog between the two platforms and any previously or newly added connection assets in your Platform assets catalog are available on both platforms\. However, if you add other types of assets to the Platform assets catalog on Cloud Pak for Data as a Service, you can't access those types of assets on watsonx\. + +## Notifications ## + +Your notifications are specific to each platform\. + +## Learn more ## + + + + * [Switching the platform for a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/switch-platform.html) + * [Switching the platform for a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/switch-platform-space.html) + * [Comparison of IBM watsonx as a Service and Cloud Pak for Data as a Service](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/compare-platforms.html) + + + +**Parent topic:**[Getting started with IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-wdp.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6406a3bcb4e9210a9fb00af248f11f392af5c205.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6406a3bcb4e9210a9fb00af248f11f392af5c205.md new file mode 100644 index 0000000..2396634 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6406a3bcb4e9210a9fb00af248f11f392af5c205.md @@ -0,0 +1,20 @@ +# Promoting an environment template to a space + +# Promoting an environment template to a space # + +If you created an environment template and associated it with an asset that you promoted to a deployment space, you can also promote the environment template to the same space\. Promoting the environment template to the same space enables running the asset in the same environment that was used in the project\. + +You can only promote environment templates that you created\. + +To promote an environment template associated with an asset that you promoted to a deployment space: + + + +1. From the **Manage** tab of your project on the **Environments** page under **Templates**, select the custom environment template and click **Actions > Promote**\. +2. Select the space that you promoted your asset to as the target deployment space and optionally provide a description and tags\. + + + +**Parent topic:**[Environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/640f57e8262f846da7884e43f6f2f6c04cd15667.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/640f57e8262f846da7884e43f6f2f6c04cd15667.md new file mode 100644 index 0000000..aa54c3f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/640f57e8262f846da7884e43f6f2f6c04cd15667.md @@ -0,0 +1,42 @@ +# Global values + +# Global values # + +Global values are used to compute various summary statistics for specified fields\. These summary values can be accessed anywhere within the flow\. Global values are similar to flow parameters in that they are accessed by name through the flow\. They're different from flow parameters in that the associated values are updated automatically when a Set Globals node is run, rather than being assigned by scripting\. The global values for a flow are accessed by calling the flow's `getGlobalValues()` method\. + +The `GlobalValues` object defines the functions that are shown in the following table\. + + + +Functions that are defined by the GlobalValues object + +Table 1\. Functions that are defined by the GlobalValues object + +| Method | Return type | Description | +| ----------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `g.fieldNameIterator()` | Iterator | Returns an iterator for each field name with at least one global value\. | +| `g.getValue(type, fieldName)` | Object | Returns the global value for the specified type and field name, or `None` if no value can be located\. The returned value is generally expected to be a number, although future functionality may return different value types\. | +| `g.getValues(fieldName)` | Map | Returns a map containing the known entries for the specified field name, or `None` if there are no existing entries for the field\. | + + + +`GlobalValues.Type` defines the type of summary statistics that are available\. The following summary statistics are available: + + + + * `MAX`: the maximum value of the field\. + * `MEAN`: the mean value of the field\. + * `MIN`: the minimum value of the field\. + * `STDDEV`: the standard deviation of the field\. + * `SUM`: the sum of the values in the field\. + + + +For example, the following script accesses the mean value of the "income" field, which is computed by a Set Globals node: + + import modeler.api + + globals = modeler.script.stream().getGlobalValues() + mean_income = globals.getValue(modeler.api.GlobalValues.Type.MEAN, "income") + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/641b0015a5a634bfc40f10ae59873ca784232f14.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/641b0015a5a634bfc40f10ae59873ca784232f14.md new file mode 100644 index 0000000..8739553 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/641b0015a5a634bfc40f10ae59873ca784232f14.md @@ -0,0 +1,37 @@ +# sequencenode properties + +# sequencenode properties # + +![Sequence node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/sequencenodeicon.png)The Sequence node discovers association rules in sequential or time\-oriented data\. A sequence is a list of item sets that tends to occur in a predictable order\. For example, a customer who purchases a razor and aftershave lotion may purchase shaving cream the next time he shops\. The Sequence node is based on the CARMA association rules algorithm, which uses an efficient two\-pass method for finding sequences\. + + + +sequencenode properties + +Table 1\. sequencenode properties + +| `sequencenode` Properties | Values | Property description | +| ------------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id_field` | *field* | To create a Sequence model, you need to specify an ID field, an optional time field, and one or more content fields\. Weight and frequency fields are not used\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `time_field` | *field* | | +| `use_time_field` | *flag* | | +| `content_fields` | \[*field1 \.\.\. fieldn*\] | | +| `contiguous` | *flag* | | +| `min_supp` | *number* | | +| `min_conf` | *number* | | +| `max_size` | *number* | | +| `max_predictions` | *number* | | +| `mode` | `Simple``Expert` | | +| `use_max_duration` | *flag* | | +| `max_duration` | *number* | | +| `use_gaps` | *flag* | | +| `min_item_gap` | *number* | | +| `max_item_gap` | *number* | | +| `use_pruning` | *flag* | | +| `pruning_value` | *number* | | +| `set_mem_sequences` | *flag* | | +| `mem_sequences` | *integer* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/648122bed05213950c23287cb4845fa56660232b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/648122bed05213950c23287cb4845fa56660232b.md new file mode 100644 index 0000000..2606c68 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/648122bed05213950c23287cb4845fa56660232b.md @@ -0,0 +1,19 @@ +# Firewall access for Spark + +# Firewall access for Spark # + +To allow Spark to access data that is located behind a firewall, you add the appropriate IP addresses for your region to the inbound rules for your firewall\. + +## Dallas (us\-south) ## + + + + * dal12 \- 169\.61\.173\.96/27, 169\.63\.15\.128/26, 150\.239\.143\.0/25, 169\.61\.133\.240/28, 169\.63\.56\.0/24 + * dal13 \- 169\.61\.57\.48/28, 169\.62\.200\.96/27, 169\.62\.235\.64/26 + * dal10 \- 169\.60\.246\.160/27, 169\.61\.194\.0/26, 169\.46\.22\.128/26, 52\.118\.59\.0/25 + + + +**Parent topic:**[Configuring firewall access](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall_ovrvw.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/649119a6ef3f5aa2b1b0c63e0973532d4c950f48.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/649119a6ef3f5aa2b1b0c63e0973532d4c950f48.md new file mode 100644 index 0000000..11ec727 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/649119a6ef3f5aa2b1b0c63e0973532d4c950f48.md @@ -0,0 +1,5 @@ +# Databases for PostgreSQL on IBM watsonx + +# Databases for PostgreSQL on IBM® watsonx # + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6524dfdeabf32bae384acb9bb21637ade3b4ac4f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6524dfdeabf32bae384acb9bb21637ade3b4ac4f.md new file mode 100644 index 0000000..39b9721 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6524dfdeabf32bae384acb9bb21637ade3b4ac4f.md @@ -0,0 +1,7 @@ +# Flows, SuperNode streams, and diagrams + +# Flows, SuperNode streams, and diagrams # + +Most of the time, the term flow means the same thing, regardless of whether it's a flow that's loaded from a file or used within a SuperNode\. It generally means a collection of nodes that are connected together and can be executed\. In scripting, however, not all operations are supported in all places\. So as a script author, you should be aware of which flow variant they're using\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/653f494ee7f3d688fcaeb05aff303354d718eab5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/653f494ee7f3d688fcaeb05aff303354d718eab5.md new file mode 100644 index 0000000..08b6699 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/653f494ee7f3d688fcaeb05aff303354d718eab5.md @@ -0,0 +1,211 @@ +# Refining data + +# Refining data # + +To refine data, you take it from one location, cleanse and shape it, and then load the result into a different location\. You can cleanse and shape tabular data with a graphical flow editor tool called Data Refinery\. + +When you *cleanse data*, you fix or remove data that is incorrect, incomplete, improperly formatted, or duplicated\. When you *shape data*, you customize it by filtering, sorting, combining or removing columns\. + +You create a *Data Refinery flow* as a set of ordered operations on data\. Data Refinery includes a graphical interface to profile your data to validate it and over 20 customizable charts that give you insights into your data\. + +**Data format** \{: \#dr\-format\} : Avro, CSV, JSON, Microsoft Excel (xls and xlsx formats\. First sheet only, except for connections and connected data assets\.), Parquet, SAS with the "sas7bdat" extension (read only), TSV (read only), or delimited text data asset : Tables in relational data sources + +**Data size** : Any\. Data Refinery operates on a sample subset of rows in the data set\. The sample size is 1 MB or 10,000 rows, whichever comes first\. However, when you run a job for the Data Refinery flow, the entire data set is processed\. If the Data Refinery flow fails with a large data asset, see workarounds in [Troubleshooting Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/ts_index.html)\. + + + + * [Prerequisites](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html?context=cdpaas&locale=en#prereqs) + * [Source file limitations](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html?context=cdpaas&locale=en#limitsource) + * [Target file limitations](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html?context=cdpaas&locale=en#limittarget) + * [Data set previews](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html?context=cdpaas&locale=en#previews) + * [Refine your data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html?context=cdpaas&locale=en#refine) + + + +## Prerequisites ## + +Before you can refine data, you need [a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html) that uses Cloud Object Storage\. You can use the sandbox project or create a new project\. + + + + * Watch this video to see how to create a project + + + +If you have data in cloud or on\-premises data sources, you'll need to [add connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) to those sources and you'll need to [add data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html) from each connection\. If you want to be able to save refined data to cloud or on\-premises data sources, create connections for this purpose as well\. Source connections can be used only to read data; target connections can be used only to load (save) data\. When you create a target connection, be sure to use credentials that have Write permission or you won't be able to save your Data Refinery flow output to the target\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + + + + * Watch this video to see how to create a connection and add connected data to a project + + + +## Source file limitations ## + +### CSV files ### + +Be sure that CSV files are correctly formatted and conform to the following rules: + + + + * Two consecutive commas in a row indicate an empty column\. + * If a row ends with a comma, an additional column is created\. + + + +### White\-space characters are considered as part of the data ### + +If your data includes columns that contain white space (blank) characters, Data Refinery considers those white\-space characters as part of the data, even though you can't see them in the grid\. Some database tools might pad character strings with white\-space characters to make all the data in a column the same length and this change affects the results of Data Refinery operations that compare data\. + +### Column names ### + +Be sure that column names conform to the following rules: + + + + * Duplicate column names are not allowed\. Column names must be unique within the data set\. Column names are not case\-sensitive\. A data set that includes a column name "Sales" and another column name "sales" will not work\. + * The column names are not reserved words in the R programming language\. + * The column names are not numbers\. A workaround is to enclose the column names in double quotation marks ("")\. + + + +### Data sets with columns with the "Other" data type are not supported in Data Refinery flows ### + +If your data set contains columns that have data types that are identified as "Other" in the Watson Studio preview, the columns will show as the String data type in Data Refinery\. However, if you try to use the data in a Data Refinery flow, the job for the Data Refinery flow will fail\. An example of a data type that shows as "Other" in the preview is the Db2 DECFLOAT data type\. + +## Target file limitations ## + +The following limitation applies if you save Data Refinery flow output (the target data set) to a file: + + + + * You can't change the file format if the file is an existing data asset\. + + + +## Data set previews ## + +Data Refinery provides support for large data sets, which can be time\-consuming and unwieldy to refine\. To enable you to work quickly and efficiently, it operates on a subset of rows in the data set while you interactively refine the data\. When you run a job for the Data Refinery flow, it operates on the entire data set\. + +## Refine your data ## + +The following video shows you how to refine data\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + + + + * Transcript + + Synchronize transcript with video + + + + | Time | Transcript | + | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | 00:00 | This video shows you how to shape raw data using Data Refinery. | + | 00:05 | To get started refining data from a project, view the data asset and open it in Data Refinery. | + | 00:14 | The "Information" pane contains the name for the data flow and for the data flow output, once you've finished refining the data. | + | 00:23 | The "Data" tab shows you a sample set of the rows and columns in the data set. | + | 00:29 | To improve performance, you won't see all the rows in the shaper. | + | 00:33 | But rest assured that when you are done refining the data, the data flow will be run on the full data set. | + | 00:41 | The "Profile" tab shows you frequency and summary statistics for each of your columns. | + | 00:49 | The "Visualizations" tab provides data visualizations for the columns you are interested in. | + | 00:57 | Suggested charts have a blue dot next to their icons. | + | 01:03 | Use the different perspectives available in the charts to identify patterns, connections, and relationships within the data. | + | 01:12 | Now, let's do some data wrangling. | + | 01:17 | Start with a simple operation, like sorting on the specified column - in this case, the "Year" column. | + | 01:27 | Say you want to focus on delays just for a specific airline so you can filter the data to show only those rows where the unique carrier is "United Airlines". | + | 01:47 | It would be helpful to see the total delay. | + | 01:50 | You can do that by creating a new column to combine the arrival and departure delays. | + | 01:56 | Notice that the column type is inferred to be integer. | + | 02:00 | Select the departure delay column and use the "Calculate" operation. | + | 02:09 | In this case, you'll add the arrive delay column to the selected column and create a new column, called "TotalDelay". | + | 02:23 | You can position the new column at the end of the list of columns or next to the original column. | + | 02:31 | When you apply the operation, the new column displays next to the departure delay column. | + | 02:38 | If you make a mistake, or just decide to make a change, just access the "Steps" panel and delete that step. | + | 02:46 | This will undo that particular operation. | + | 02:50 | You can also use the redo and undo buttons. | + | 02:56 | Next, you'd like to focus on the "TotalDelay" column so you can use the "select" operation to move the column to the beginning. | + | 03:09 | This command arranges the "TotalDelay" column as the first in the list, and everything else comes after that. | + | 03:21 | Next, use the "group\_by" operation to divide the data into groups by year, month, and day. | + | 03:32 | So, when you select the "TotalDelay" column, you'll see the "Year", "Month", "DayofMonth", and "TotalDelay" columns. | + | 03:44 | Lastly, you want to find the mean of the "TotalDelay" column. | + | 03:48 | When you expand the "Operations" menu, in the "Organize" section, you'll find the "Aggregate" operation, which includes the "Mean" function. | + | 04:08 | Now you have a new column, called "AverageDelay", that represents the average for the total delay. | + | 04:17 | Now to run the data flow and save and create the job. | + | 04:24 | Provide a name for the job and continue to the next screen. | + | 04:28 | The "Configure" step allows you to review what the input and output of your job run will be. | + | 04:36 | And select the environment used to run the job. | + | 04:41 | Scheduling a job is optional, but you can set a date and repeat the job, if you'd like. | + | 04:51 | And you can choose to receive notifications for this job. | + | 04:56 | Everything looks good, so create and run the job. | + | 05:00 | This could take several minutes, because remember that the data flow will be run on the full data set. | + | 05:06 | In the mean time, you can view the status. | + | 05:12 | When the run is compete, you can go back to the "Assets" tab in the project. | + | 05:20 | And open the Data Refinery flow to further refine the data. | + | 05:28 | For example, you could sort the "AverageDelay" column in descending order. | + | 05:36 | Now, edit the flow settings. | + | 05:39 | On the "General" panel, you can change the Data Refinery flow name. | + | 05:46 | On the "Source data sets" panel, you can edit the sample or format for the source data set or replace the data source. | + | 05:56 | And on the "Target data set" panel, you can specify an alternate location, such as an external data source. | + | 06:06 | You can also edit the properties for the target, such as the write mode, the file format, and change the data set asset name. | + | 06:21 | Now, run the data flow again; but this time, save and view the jobs. | + | 06:28 | Select the job that you want to view from the list and run the job. | + | 06:41 | When the run completes, go back to the project. | + | 06:46 | And on the "Assets" tab, you'll see all three files: | + | 06:51 | The original. | + | 06:54 | The first refined data set, showing the "AverageDelay" unsorted. | + | 07:02 | And the second data set, showing the "AverageDelay" column sorted in descending order. | + | 07:11 | And back on the "Assets" tab, there's the Data Refinery flow. | + | 07:19 | Find more videos in the Cloud Pak for Data as a Service documentation. | + + + + + +1\. Access Data Refinery from within a project\. Click **New asset > Prepare and visualize data**\. Then select the data that you want to work with\. Alternatively, from the **Assets** tab of a project, open a file ([supported formats](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html?context=cdpaas&locale=en#dr-format)) to preview it, and then click **Prepare data**\. + +2\. Use steps to apply operations that cleanse, shape, and enrich your data\. Browse [operation categories or search for a specific operation](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/gui_operations.html), then let the UI guide you\. You can [enter R code](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/code_operations.html) in the command line and let autocomplete assist you in getting the correct syntax\. As you apply operations to a data set, Data Refinery keeps track of them and builds a Data Refinery flow\. For each operation that you apply, Data Refinery adds a step\. + +Data tab +![Data tab](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/dr-data-tab.png) + +If your data contains non\-string data types, the **Convert column type** GUI operation is automatically applied as the first step in the Data Refinery flow when you open a file in Data Refinery\. Data types are automatically converted to inferred data types, such as Integer, Date, or Boolean\. You can undo or edit this step\. + +3\. Click the **Profile** tab to [validate your data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/metrics.html) throughout the data refinement process\. + +Profile tab +![Profile tab](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/dr-profile-tab.png) + +4\. Click the **Visualizations** tab to [visualize the data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/visualizations.html) in charts\. Uncover patterns, trends, and correlations within your data\. + +Visualizations tab +![Visualizations tab](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/dr-viz-tab.png) + +5\. Refine the sample data set to suit your needs\. + +6\. Click **Save and create a job** or **Save and view jobs** in the toolbar to run the Data Refinery flow on the entire data set\. Select the runtime and add a one\-time or repeating schedule\. For information about jobs, see [Creating jobs in Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-dr.html)\. + +For the actions that you can do as you refine your data, see [Managing Data Refinery flows](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html)\. + +## Next step ## + +[Analyze your data and build models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-science.html) + +## Learn more ## + + + + * [Manage Data Refinery flows](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/data_flows.html) + * [Quick start: Refine data](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html) + + + +**Parent topic**: [Preparing data](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/get-data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/653ffedfac00f360750f776a3a60f6aad38ed954.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/653ffedfac00f360750f776a3a60f6aad38ed954.md new file mode 100644 index 0000000..073a208 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/653ffedfac00f360750f776a3a60f6aad38ed954.md @@ -0,0 +1,107 @@ +# Creating batch deployments in Watson Machine Learning + +# Creating batch deployments in Watson Machine Learning # + +A batch deployment processes input data from a file, data connection, or connected data in a storage bucket, and writes the output to a selected destination\. + +## Before you begin ## + + + +1. Save a model to a deployment space\. +2. Promote or add the input file for the batch deployment to the space\. For more information, see [Deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html)\. + + + +## Supported frameworks ## + +Batch deployment is supported for these frameworks and asset types: + + + + * Decision Optimization + * PMML + * Python functions + * PyTorch\-Onnx + * Tensorflow + * Scikit\-learn + * Python scripts + * Spark MLlib + * SPSS + * XGBoost + + + +**Notes:** + + + + * You can create batch deployments only of Python functions and models based on the PMML framework programmatically\. + * Your list of deployment jobs can contain two types of jobs: `WML deployment job` and `WML batch deployment`\. + * When you create a batch deployment (through the UI or programmatically), an extra `default` deployment job is created of the type `WML deployment job`\. The extra job is a parent job that stores all deployment runs generated for that batch deployment that were triggered by the Watson Machine Learning API\. + * The standard `WML batch deployment` type job is created only when you create a deployment from the UI\. You cannot create a `WML batch deployment` type job by using the API\. + * The limitations of `WML deployment job` are as follows: + + + + * The job cannot be edited. + * The job cannot be deleted unless the associated batch deployment is deleted. + * The job doesn't allow scheduling. + * The job doesn't allow notifications. + * The job doesn't allow changing retention settings. + + + + + +For more information, see [Data sources for scoring batch deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-data-sources.html)\. For more information, see [Batch deployment input details by framework](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-by-framework.html) + +## Creating a batch deployment ## + +To create a batch deployment: + + + +1. From the deployment space, click the name of the saved model that you want to deploy\. The model detail page opens\. +2. Click **New deployment**\. +3. Choose **Batch** as the deployment type\. +4. Enter a name and an optional description for your deployment\. +5. Select a [hardware specification](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-hardware-configs.html)\. +6. Click **Create**\. When status changes to **Deployed**, your deployment is created\. + + + +Note: Additionally, you can create a batch deployment by using any of these interfaces: + + + + * Watson Studio user interface, from an Analytics deployment space + * Watson Machine Learning Python Client + * Watson Machine Learning REST APIs + + + +## Creating batch deployments programmatically ## + +See [Machine learning samples and examples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-samples-overview.html) for sample notebooks that demonstrate creating batch deployments that use the Watson Machine Learning [REST API](https://cloud.ibm.com/apidocs/machine-learning) and Watson Machine Learning [Python client library](https://ibm.github.io/watson-machine-learning-sdk/)\. + +## Viewing deployment details ## + +Click the name of a deployment to view the details\. + +![View deployment details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/batch-details.png) + +You can view the configuration details such as hardware and software specifications\. You can also get the deployment ID, which you can use in API calls from an endpoint\. For more information, see [Looking up a deployment endpoint](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-online.html)\. + +## Learn more ## + + + + * For more information, see [Creating jobs in deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-jobs.html)\. + * Refer to [Machine Learning samples and examples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-samples-overview.html) for links to sample notebooks that demonstrate creating batch deployments that use the Watson Machine Learning [REST API](https://cloud.ibm.com/apidocs/machine-learning-cp) and Watson Machine Learning [Python client library](https://ibm.github.io/watson-machine-learning-sdk/)\. + + + +**Parent topic:**[Managing predictive deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6576530ec5d705b8bf323f6c459c32a87ae3f9a4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6576530ec5d705b8bf323f6c459c32a87ae3f9a4.md new file mode 100644 index 0000000..61ee8d8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6576530ec5d705b8bf323f6c459c32a87ae3f9a4.md @@ -0,0 +1,13 @@ +# MultiLayerPerceptron-AS node (SPSS Modeler) + +# MultiLayerPerceptron\-AS node # + +Multilayer perceptron is a classifier based on the feedforward artificial neural network and consists of multiple layers\. + +Each layer is fully connected to the next layer in the network\. See [Multilayer Perceptron Classifier (MLPC)](https://spark.apache.org/docs/latest/ml-classification-regression.html#multilayer-perceptron-classifier) for details\.^1^ + +The MultiLayerPerceptron\-AS node in watsonx\.ai is implemented in Spark\. To use a this node, you must set up an upstream Type node\. The MultiLayerPerceptron\-AS node will read input values from the Type node (or from the Types of an upstream import node)\. + +^1^ "Multilayer perceptron classifier\." *Apache Spark*\. MLlib: Main Guide\. Web\. 5 Oct 2018\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/658967520625fac8039485004a1e80c32992077e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/658967520625fac8039485004a1e80c32992077e.md new file mode 100644 index 0000000..5eb0ea2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/658967520625fac8039485004a1e80c32992077e.md @@ -0,0 +1,27 @@ +# {{ document.title.text }} + +# Harmful code generation # + +![icon for harmful code generation risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-harmful-code-generation.svg)Risks associated with outputHarmful code generationNew + +### Description ### + +Models might generate code that causes harm or unintentionally affects other systems\. + +### Why is harmful code generation a concern for foundation models? ### + +Without human review and testing of generated code, its use might cause unintentional behavior and open new system vulnerabilities\. Business entities could face fines, reputational harms, and other legal consequences\. + +Example + +#### Undisclosed AI Interaction #### + +According to their paper, researchers at Stanford University have investigated the impact of code\-generation tools on code quality and found that programmers tend to include *more* bugs in their final code when using AI assistants\. These bugs could increase the code's security vulnerabilities, yet the programmers believed their code to be *more* secure\. + +Sources: + +[Neil Perry, Megha Srivastava, Deepak Kumar, and Dan Boneh\. 2023\. Do Users Write More Insecure Code with AI Assistants?\. In Proceedings of the 2023 ACM SIGSAC Conference on Computer and Communications Security (CCS '23), November 26\-30, 2023, Copenhagen, Denmark\. ACM, New York, NY, USA, 15 pages\.](https://dl.acm.org/doi/10.1145/3576915.3623157) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/65998cb8747b70477477179e023332fd410e72d6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/65998cb8747b70477477179e023332fd410e72d6.md new file mode 100644 index 0000000..bd18d27 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/65998cb8747b70477477179e023332fd410e72d6.md @@ -0,0 +1,5 @@ +# Scripting in SPSS Modeler + +# Scripting in SPSS Modeler # + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/659e43ba12550aa1e885baec945b7b1b25fd18e2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/659e43ba12550aa1e885baec945b7b1b25fd18e2.md new file mode 100644 index 0000000..3f3be33 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/659e43ba12550aa1e885baec945b7b1b25fd18e2.md @@ -0,0 +1,7 @@ +# Lists + +# Lists # + +Lists are sequences of elements\. A list can contain any number of elements, and the elements of the list can be any type of object\. Lists can also be thought of as arrays\. The number of elements in a list can increase or decrease as elements are added, removed, or replaced\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/65ffb2e27eacd57bcadc6c1646eb280212d3b2c2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/65ffb2e27eacd57bcadc6c1646eb280212d3b2c2.md new file mode 100644 index 0000000..fdf0766 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/65ffb2e27eacd57bcadc6c1646eb280212d3b2c2.md @@ -0,0 +1,26 @@ +# anonymizenode properties + +# anonymizenode properties # + +![Anonymize node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/anonymizenodeicon.png)The Anonymize node transforms the way field names and values are represented downstream, thus disguising the original data\. This can be useful if you want to allow other users to build models using sensitive data, such as customer names or other details\. + + + +anonymizenode properties + +Table 1\. anonymizenode properties + +| `anonymizenode` properties | Data type | Property description | +| -------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `enable_anonymize` | *flag* | When set to `True`, activates anonymization of field values (equivalent to selecting Yes for that field in the Anonymize Values column)\. | +| `use_prefix` | *flag* | When set to `True`, a custom prefix will be used if one has been specified\. Applies to fields that will be anonymized by the Hash method and is equivalent to choosing the Custom option in the Replace Values settings for that field\. | +| `prefix` | *string* | Equivalent to typing a prefix into the text box in the Replace Values settings\. The default prefix is the default value if nothing else has been specified\. | +| `transformation` | `Random``Fixed` | Determines whether the transformation parameters for a field anonymized by the Transform method will be random or fixed\. | +| `set_random_seed` | *flag* | When set to `True`, the specified seed value will be used (if `transformation` is also set to `Random`)\. | +| `random_seed` | *integer* | When `set_random_seed` is set to `True`, this is the seed for the random number\. | +| `scale` | *number* | When `transformation` is set to `Fixed`, this value is used for "scale by\." The maximum scale value is normally 10 but may be reduced to avoid overflow\. | +| `translate` | *number* | When `transformation` is set to `Fixed`, this value is used for "translate\." The maximum translate value is normally 1000 but may be reduced to avoid overflow\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6601b619d597c89f715bc2fafd703452d64f21cd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6601b619d597c89f715bc2fafd703452d64f21cd.md new file mode 100644 index 0000000..8276c64 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6601b619d597c89f715bc2fafd703452d64f21cd.md @@ -0,0 +1,29 @@ +# Syntax for properties + +# Syntax for properties # + +You can set properties using the following syntax: + + OBJECT.setPropertyValue(PROPERTY, VALUE) + +or: + + OBJECT.setKeyedPropertyValue(PROPERTY, KEY, VALUE) + +You can retrieve the value of properties using the following syntax: + + VARIABLE = OBJECT.getPropertyValue(PROPERTY) + +or: + + VARIABLE = OBJECT.getKeyedPropertyValue(PROPERTY, KEY) + +where `OBJECT` is a node or output, `PROPERTY` is the name of the node property that your expression refers to, and `KEY` is the key value for keyed properties\. For example, the following syntax finds the Filter node and then sets the default to include all fields and filter the `Age` field from downstream data: + + filternode = modeler.script.stream().findByType("filter", None) + filternode.setPropertyValue("default_include", True) + filternode.setKeyedPropertyValue("include", "Age", False) + +All nodes used in SPSS Modeler can be located using the flow function `findByType(TYPE, LABEL)`\. At least one of `TYPE` or `LABEL` must be specified\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6638b9f61f15821f7a92d9c30fc6c24c029b78dc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6638b9f61f15821f7a92d9c30fc6c24c029b78dc.md new file mode 100644 index 0000000..a900bc0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6638b9f61f15821f7a92d9c30fc6c24c029b78dc.md @@ -0,0 +1,82 @@ +# Column Statistics content model and Pairwise Statistics content model + +# Column Statistics content model and Pairwise Statistics content model # + +The Column Statistics content model provides access to statistics that can be computed for each field (univariate statistics)\. The Pairwise Statistics content model provides access to statistics that can be computed between pairs of fields or values in a field\. + +Any of these statistics measures are possible: + + + + * `Count` + * `UniqueCount` + * `ValidCount` + * `Mean` + * `Sum` + * `Min` + * `Max` + * `Range` + * `Variance` + * `StandardDeviation` + * `StandardErrorOfMean` + * `Skewness` + * `SkewnessStandardError` + * `Kurtosis` + * `KurtosisStandardError` + * `Median` + * `Mode` + * `Pearson` + * `Covariance` + * `TTest` + * `FTest` + + + +Some values are only appropriate from single column statistics while others are only appropriate for pairwise statistics\. + +Nodes that produce these are: + + + + * Statistics node produces column statistics and can produce pairwise statistics when correlation fields are specified + * Data Audit node produces column and can produce pairwise statistics when an overlay field is specified\. + * Means node produces pairwise statistics when comparing pairs of fields or comparing a field's values with other field summaries\. + + + +Which content models and statistics are available depends on both the particular node's capabilities and the settings within the node\. + + + +Methods for the Column Statistics content model + +Table 1\. Methods for the Column Statistics content model + +| Method | Return types | Description | +| ------------------------------------------------------ | --------------------------- | ------------------------------------------------------------------------------------------------------------ | +| `getAvailableStatistics()` | `List` | Returns the available statistics in this model\. Not all fields necessarily have values for all statistics\. | +| `getAvailableColumns()` | `List` | Returns the column names for which statistics were computed\. | +| `getStatistic(String column, StatisticType statistic)` | `Number` | Returns the statistic values associated with the column\. | +| `reset()` | `void` | Flushes any internal storage associated with this content model\. | + + + + + +Methods for the Pairwise Statistics content model + +Table 2\. Methods for the Pairwise Statistics content model + +| Method | Return types | Description | +| ---------------------------------------------------------------------------------------------------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------ | +| `getAvailableStatistics()` | `List` | Returns the available statistics in this model\. Not all fields necessarily have values for all statistics\. | +| `getAvailablePrimaryColumns()` | `List` | Returns the primary column names for which statistics were computed\. | +| `getAvailablePrimaryValues()` | `List` | Returns the values of the primary column for which statistics were computed\. | +| `getAvailableSecondaryColumns()` | `List` | Returns the secondary column names for which statistics were computed\. | +| `getStatistic(String primaryColumn, String secondaryColumn, StatisticType statistic)` | `Number` | Returns the statistic values associated with the columns\. | +| `getStatistic(String primaryColumn, Object primaryValue, String secondaryColumn, StatisticType statistic)` | `Number` | Returns the statistic values associated with the primary column value and the secondary column\. | +| `reset()` | `void` | Flushes any internal storage associated with this content model\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6644eaa4a383f7ed21c0ca1adae80a634867870a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6644eaa4a383f7ed21c0ca1adae80a634867870a.md new file mode 100644 index 0000000..df16e73 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6644eaa4a383f7ed21c0ca1adae80a634867870a.md @@ -0,0 +1,23 @@ +# applychaidnode properties + +# applychaidnode properties # + +You can use CHAID modeling nodes to generate a CHAID model nugget\. The scripting name of this model nugget is *applychaidnode*\. For more information on scripting the modeling node itself, see [chaidnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/chaidnodeslots.html#chaidnodeslots)\. + + + +applychaidnode properties + +Table 1\. applychaidnode properties + +| `applychaidnode` Properties | Values | Property description | +| --------------------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `calculate_conf` | *flag* | | +| `display_rule_id` | *flag* | Adds a field in the scoring output that indicates the ID for the terminal node to which each record is assigned\. | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `sql_generate` | `Never``NoMissingValues``MissingValues``native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6647035446fc3a28586ebabc619d10db5fe3f4fd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6647035446fc3a28586ebabc619d10db5fe3f4fd.md new file mode 100644 index 0000000..339fa26 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6647035446fc3a28586ebabc619d10db5fe3f4fd.md @@ -0,0 +1,18 @@ +# Merge node (SPSS Modeler) + +# Merge node # + +The function of a Merge node is to take multiple input records and create a single output record containing all or some of the input fields\. This is a useful operation when you want to merge data from different sources, such as internal customer data and purchased demographic data\. + +You can merge data in the following ways\. + + + + * Merge by Order concatenates corresponding records from all sources in the order of input until the smallest data source is exhausted\. It is important if using this option that you have sorted your data using a Sort node\. + * Merge using a Key field, such as `Customer ID`, to specify how to match records from one data source with records from the other(s)\. Several types of joins are possible, including inner join, full outer join, partial outer join, and anti\-join\. + * Merge by Condition means that you can specify a condition to be satisfied for the merge to take place\. You can specify the condition directly in the node, or build the condition using the Expression Builder\. + * Merge by Ranked Condition is a left sided outer join in which you specify a condition to be satisfied for the merge to take place and a ranking expression which sorts into order from low to high\. Most often used to merge geospatial data, you can specify the condition directly in the node, or build the condition using the Expression Builder\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/665b81fcf30212ba535dedffc35e22901ed3e3b6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/665b81fcf30212ba535dedffc35e22901ed3e3b6.md new file mode 100644 index 0000000..f17025c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/665b81fcf30212ba535dedffc35e22901ed3e3b6.md @@ -0,0 +1,7 @@ +# applyocsvmnode properties + +# applyocsvmnode properties # + +You can use One\-Class SVM nodes to generate a One\-Class SVM model nugget\. The scripting name of this model nugget is *applyocsvmnode*\. No other properties exist for this model nugget\. For more information on scripting the modeling node itself, see [ocsvmnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/oneclasssvmnodeslots.html#oneclasssvmnodeslots)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/66e7b1f986535fce165f0cb5c553a6305339204e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/66e7b1f986535fce165f0cb5c553a6305339204e.md new file mode 100644 index 0000000..685af9b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/66e7b1f986535fce165f0cb5c553a6305339204e.md @@ -0,0 +1,6 @@ +# Scatter matrix charts + +# Scatter matrix charts # + +Scatter plot matrices are a good way to determine whether linear correlations exist between multiple variables\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/67241853fc2471c6c0719f1b98e40625358b2e19.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/67241853fc2471c6c0719f1b98e40625358b2e19.md new file mode 100644 index 0000000..d9de646 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/67241853fc2471c6c0719f1b98e40625358b2e19.md @@ -0,0 +1,18 @@ +# Reading in source text (SPSS Modeler) + +# Reading in source text # + +You can use the Language Identifier node to identify the natural language of a text field within your source data\. The output of this node is a derived field that contains the detected language code\. + +![Language Identifier node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/ta_languageidentifier.png) + +Data for text mining can be in any of the standard formats that are used by SPSS Modeler flows, including databases or other "rectangular" formats that represent data in rows and columns\. + + + + * To read in text from any of the standard data formats used by SPSS Modeler flows, such as a database with one or more text fields for customer comments, you can use an Import node\. + * When you're processing large amounts of data, which might include text in several different languages, use the Language Identifier node to identify the language used in a specific field\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/679f2f7a79672580b5fb797d9c5280b1a83806ef.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/679f2f7a79672580b5fb797d9c5280b1a83806ef.md new file mode 100644 index 0000000..06c97e6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/679f2f7a79672580b5fb797d9c5280b1a83806ef.md @@ -0,0 +1,16 @@ +# Scripting overview + +# Scripting overview # + +This section provides high\-level descriptions and examples of flow\-level scripts and standalone scripts in the SPSS Modeler interface\. More information on scripting language, syntax, and commands is provided in the sections that follow\. + +Notes: + + + + * Some of the properties and features described in this scripting and automation guide aren't available in Watsonx\.ai\. + * You can't import and run scripts created in SPSS Statistics\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/67b99e436854f015a9db19c775639ba4bb4d5f9b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/67b99e436854f015a9db19c775639ba4bb4d5f9b.md new file mode 100644 index 0000000..0290360 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/67b99e436854f015a9db19c775639ba4bb4d5f9b.md @@ -0,0 +1,19 @@ +# CPLEX Optimization node (SPSS Modeler) + +# CPLEX Optimization node # + +With the CPLEX Optimization node, you can use complex mathematical (CPLEX) based optimization via an Optimization Programming Language (OPL) model file\. + +For more information about CPLEX optimization and OPL, see the [IBM ILOG CPLEX Optimization Studio documentation](https://www.ibm.com/support/knowledgecenter/SSSA5P)\. + +When outputting the data generated by the CPLEX Optimization node, you can output the original data from the data sources together as single indexes, or as multiple dimensional indexes of the result\. + +Note: + + + + * When running a flow containing a CPLEX Optimization node, the CPLEX library has a limitation of 1000 variables and 1000 constraints\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/67c56aac7da2232e4da2b8aedec41b9d8755e22a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/67c56aac7da2232e4da2b8aedec41b9d8755e22a.md new file mode 100644 index 0000000..7d3c093 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/67c56aac7da2232e4da2b8aedec41b9d8755e22a.md @@ -0,0 +1,19 @@ +# Scatter plots and dot plots + +# Scatter plots and dot plots # + +Several broad categories of charts are created with the point graphic element\. + +Scatter plots +: Scatter plots are useful for plotting multivariate data\. They can help you determine potential relationships among scale variables\. A simple scatter plot uses a 2\-D coordinate system to plot two variables\. A 3\-D scatter plot uses a 3\-D coordinate system to plot three variables\. When you need to plot more variables, you can try overlay scatter plots and scatter plot matrices (SPLOMs)\. An overlay scatter plot displays overlaid pairs of X\-Y variables, with each pair distinguished by color or shape\. A SPLOM creates a matrix of 2\-D scatter plots, with each variable plotted against every other variable in the SPLOM\. + +Dot plots +: Like histograms, dot plots are useful for showing the distribution of a single scale variable\. The data are binned, but, instead of one value for each bin (like a count), all of the points in each bin are displayed and stacked\. These graphs are sometimes called density plots\. + +Summary point plots +: Summary point plots are similar to bar charts, except that points are drawn in place of the top of the bars\. For more information, see [Bar charts](https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_barcharts.html#chart_creation_barcharts)\. + +Drop\-line charts +: Drop\-line charts are a special type of summary point plot\. The points are grouped and a line is drawn through the points in each category\. The drop\-line chart is useful for comparing a statistic across categorical variables\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/67fbc6967ed56285cc4eb1ff12d0e2e23b2f7bd5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/67fbc6967ed56285cc4eb1ff12d0e2e23b2f7bd5.md new file mode 100644 index 0000000..b8088f0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/67fbc6967ed56285cc4eb1ff12d0e2e23b2f7bd5.md @@ -0,0 +1,77 @@ +# Managing the Watson Machine Learning service endpoint + +# Managing the Watson Machine Learning service endpoint # + +You can use IBM Cloud connectivity options for accessing cloud services securely by using service endpoints\. When you provision a Watson Machine Learning service instance, you can choose if you want to access your service through the public internet, which is the default setting, or over the IBM Cloud private network\. + +For more information, refer to [IBM Cloud service endpoints](https://cloud.ibm.com/docs/account?topic=account-vrf-service-endpoint)\.\{: new\_window\} + +You can use the Service provisioning page to choose a default endpoint from the following options: + + + + * [Public network](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-service-endpoint.html?context=cdpaas&locale=en#public_net) + * [Private network](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-service-endpoint.html?context=cdpaas&locale=en#private_net) + * Both, public and private networks + + + +## Public network ## + +You can use public network endpoints to connect to Watson Machine Learning service instance on the public network\. Your environment needs to have internet access to connect\. + +## Private network ## + +You can use private network endpoints to connect to your IBM Watson Machine Learning service instance over the IBM Cloud Private network\. After you configure your Watson Machine Learning service to use private endpoints, the service is not accessible from the public internet\. + +### Private URLs for Watson Machine Learning ### + +Private URLs for Watson Machine Learning for each region are as follows: + + + + * Dallas \- [https://private\.us\-south\.ml\.cloud\.ibm\.com](https://private.us-south.ml.cloud.ibm.com) + * London \- [https://private\.eu\-gb\.ml\.cloud\.ibm\.com](https://private.eu-gb.ml.cloud.ibm.com) + * Frankfurt \- [https://private\.eu\-de\.ml\.cloud\.ibm\.com](https://private.eu-de.ml.cloud.ibm.com) + * Tokyo \- [https://private\.jp\-tok\.ml\.cloud\.ibm\.com](https://private.jp-tok.ml.cloud.ibm.com) + + + +## Using IBM Cloud service endpoints ## + +Follow these steps to enable private network endpoints on your clusters: + + + +1. Use [IBM Cloud CLI](https://cloud.ibm.com/docs/cli?topic=cli-getting-started) to enable your account to use IBM Cloud service endpoints\. +2. Provision a Watson Machine Learning service instance with private endpoints\. + + + +## Provisioning with service endpoints ## + +You can provision a Watson Machine Learning service instance with service endpoint by using IBM Cloud UI or IBM Cloud CLI\. + +### Provisioning a service endpoint with IBM Cloud UI ### + +To configure the endpoints of your IBM Watson Machine Learning service instance, you can use the **Endpoints** field on the IBM Cloud catalog page\. You can configure a public, private, or a mixed network\. + +![Configure endpoint from the service catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/ml-endpoints.png) + +### IBM Cloud CLI ### + +If you provision an IBM Watson Machine Learning service instance by using the IBM Cloud CLI, use the command\-line option service\-endpoints to configure the Watson Machine Learning endpoints\. You can specify the value `public` (the default value), `private`, or `public-and-private`: + + ibmcloud resource service-instance-create pm-20 --service-endpoints + +For example: + + ibmcloud resource service-instance-create wml-instance pm-20 standard us-south -p --service-endpoints private + +or + + ibmcloud resource service-instance-create wml-instance pm-20 standard us-south --service-endpoints public-and-private + +**Parent topic:**[First steps](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/68061cdeda9e9e83180ca7513620b5988266cebf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/68061cdeda9e9e83180ca7513620b5988266cebf.md new file mode 100644 index 0000000..76299d6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/68061cdeda9e9e83180ca7513620b5988266cebf.md @@ -0,0 +1,10 @@ +# SPSS Modeler algorithms guide + +# SPSS algorithms # + +Many of the nodes available in SPSS Modeler are based on statistical algorithms\. + +If you're interested in learning more about the underlying algorithms used in your flows, you can read the SPSS Modeler Algorithms Guide available in PDF format\. The guide is for advanced users, and the information is provided by a team of SPSS statisticians\. + +[Download the SPSS Modeler Algorithms Guide

![SPSS Modeler Algorithms Guide](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/spss_algorithms.png)](https://public.dhe.ibm.com/software/analytics/spss/documentation/modeler/new/AlgorithmsGuide.pdf) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6903d3dd91aaa7af3f53d389677d92632e24aef1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6903d3dd91aaa7af3f53d389677d92632e24aef1.md new file mode 100644 index 0000000..82bfe74 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6903d3dd91aaa7af3f53d389677d92632e24aef1.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Untraceable attribution # + +![icon for explainability risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-explainability.svg)Risks associated with outputExplainabilityAmplified + +### Description ### + +The original entity from which training data comes from might not be known, limiting the utility and success of source attribution techniques\. + +### Why is untraceable attribution a concern for foundation models? ### + +The inability to provide the provenance for an explanation makes it difficult for users, model validators, and auditors to understand and trust the model\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6922b4d2cb89eb1ef4aa112af8b7922327062b95.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6922b4d2cb89eb1ef4aa112af8b7922327062b95.md new file mode 100644 index 0000000..ee10d7d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6922b4d2cb89eb1ef4aa112af8b7922327062b95.md @@ -0,0 +1,28 @@ +# Adding task credentials + +# Adding task credentials # + +A task credential is a form of user authentication that is required by some services to perform operations in projects and spaces, for example to run certain tasks in a service or to enable the execution of long operations such as scheduled jobs without interruption\. + +In IBM watsonx, IBM Cloud API keys are used as task credentials\. You can either provide an existing IBM Cloud API key, or you can generate a new key\. Only one task credential can be stored per user, per IBM Cloud account, and is stored securely in a vault\. + +You can generate and rotate API keys in **Profile and settings > User API key**\. + +Any user with an IBM Cloud account can create an API key\. The API key can be seen as a type of user name and password, enabling access to resources in your IBM Cloud account and should never be shared\. + +If your service requires a task credential to perform an operation, you are prompted to provide it in the form of an existing or newly generated API key\. + +Note that service administrators are responsible for defining a strategy to revoke task credentials when these are no longer required\. + +## Learn more ## + + + + * [Managing the user API key](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-apikeys.html) + * [Understanding API keys](https://cloud.ibm.com/docs/account?topic=account-manapikey&interface=ui) + + + +**Parent topic:**[Administering projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/693bc91eaadeae664982aa88a372590a6758f294.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/693bc91eaadeae664982aa88a372590a6758f294.md new file mode 100644 index 0000000..f78f7b7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/693bc91eaadeae664982aa88a372590a6758f294.md @@ -0,0 +1,43 @@ +# Decision Optimization running jobs + +# Running jobs # + +Decision Optimization uses Watson Machine Learning asynchronous APIs to enable jobs to be run in parallel\. + +To solve a problem, you can create a new job from the model deployment and associate data to it\. See [Deployment steps](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployIntro.html#topic_wmldeployintro) and the [REST API example](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployModelRest.html#task_deploymodelREST)\. You are not charged for deploying a model\. Only the solving of a model with some data is charged, based on the running time\. + +To solve **more than one job** at a time, specify more than one node when you create your deployment\. For example in this [REST API example](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployModelRest.html#task_deploymodelREST__createdeploy), increment the **number of the nodes** by changing the value of the nodes property: `"nodes" : 1`\. + + + +1. The new job is sent to the queue\. +2. If a POD is started but idle (not running a job), it immediately begins processing this job\. +3. Otherwise, if the maximum number of nodes is not reached, a new POD is started\. (Starting a POD can take a few seconds)\. The job is then assigned to this new POD for processing\. +4. Otherwise, the job waits in the queue until one of the running PODs has finished and can pick up the waiting job\. + + + +The configuration of PODs of each size is as follows: + + + +Table 1\. T\-shirt sizes for Decision Optimization + +| Definition | Name | Description | +| ----------------- | ---- | ----------- | +| 2 vCPU and 8 GB | S | Small | +| 4 vCPU and 16 GB | M | Medium | +| 8 vCPU and 32 GB | L | Large | +| 16 vCPU and 64 GB | XL | Extra Large | + + + +For all configurations, 1 vCPU and 512 MB are reserved for internal use\. + +In addition to the solve time, the pricing depends on the selected size through a multiplier\. + +In the deployment configuration, you can also set the maximal number of nodes to be used\. + +Idle PODs are automatically stopped after some timeout\. If a new job is submitted when no PODs are up, it takes some time (approximately 30 seconds) for the POD to restart\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/69eaabe17802ed870302f2d2789b3b476dfdd11f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/69eaabe17802ed870302f2d2789b3b476dfdd11f.md new file mode 100644 index 0000000..80236f6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/69eaabe17802ed870302f2d2789b3b476dfdd11f.md @@ -0,0 +1,63 @@ +# Configuring a classification or regression experiment + +# Configuring a classification or regression experiment # + +AutoAI offers experiment settings that you can use to configure and customize your classification or regression experiments\. + +## Experiment settings overview ## + +After you upload the experiment data and select your experiment type and what to predict, AutoAI establishes default configurations and metrics for your experiment\. You can accept these defaults and proceed with the experiment or click **Experiment settings** to customize configurations\. By customizing configurations, you can precisely control how the experiment builds the candidate model pipelines\. + +Use the following tables as a guide to experiment settings for classification and regression experiments\. For details on configuring a time series experiment, see [Building a time series experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries.html)\. + +## Prediction settings ## + +Most of the prediction settings are on the main **General** page\. Review or update the following settings\. + + + +| Setting | Description | +| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Prediction type | You can change or override the prediction type\. For example, if AutoAI only detects two data classes and configures a binary classification experiment but you know that there are three data classes, you can change the type to *multiclass*\. | +| Positive class | For binary classification experiments optimized for *Precision*, *Average Precision*, *Recall*, or *F1*, a positive class is required\. Confirm that the Positive Class is correct or the experiment might generate inaccurate results\. | +| Optimized metric | Change the metric for optimizing and ranking the model candidate pipelines\. | +| Optimized algorithm selection | Choose how AutoAI selects the algorithms to use for generating the model candidate pipelines\. You can optimize for the alorithms with the best score, or optimize for the algorithms with the highest score in the shortest run time\. | +| Algorithms to include | Select which of the available algorithms to evaluate when the experiment is run\. The list of algorithms are based on the selected prediction type\. | +| Algorithms to use | AutoAI tests the specified algorithms and use the best performers to create model pipelines\. Choose how many of the best algorithms to apply\. Each algorithm generates 4\-5 pipelines, which means that if you select 3 algorithms to use, your experiment results will include 12 \- 15 ranked pipelines\. More algorithms increase the runtime for the experiment\. | + + + +### Data fairness settings ### + +Click the *Fairness* tab to evaluate your experiment for fairness in predicted outcomes\. For details on configuring fairness detection, see [Applying fairness testing to AutoAI experiments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-fairness.html)\. + +## Data source settings ## + +The *General* tab of data source settings provides options for configuring how the experiment consumes and processes the data for training and evaluating the experiment\. + + + +| Setting | Description | +| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Duplicate rows | To accelerate training, you can opt to skip duplicate rows in your training data\. | +| Pipeline selection subsample method | For a large data set, use a subset of data to train the experiment\. This option speeds up results but might affect accuracy\. | +| Data imputation | Interpolate missing values in your data source\. For details on managing data imputation, see [Data imputation in AutoAI experiments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-imputation.html)\. | +| Text feature engineering | When enabled, columns that are detected as text are transformed into vectors to better analyze semantic similarity between strings\. Enabling this setting might increase run time\. For details, see [Creating a text analysis experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-text-analysis.html)\. | +| Final training data set | Select what data to use for training the final pipelines\. If you choose to include training data only, the generated notebooks include a cell for retrieving the holdout data that is used to evaluate each pipeline\. | +| Outlier handling | Choose whether AutoAI excludes outlier values from the target column to improve training accuracy\. If enabled, AutoAI uses the interquartile range (IQR) method to detect and exclude outliers from the final training data, whether that is training data only or training plus holdout data\. | +| Training and holdout method | Training data is used to train the model, and holdout data is withheld from training the model and used to measure the performance of the model\. You can either split a singe data source into training and testing (holdout) data, or you can use a second data file specifically for the testing data\. If you split your training data, specify the percentages to use for training data and holdout data\. You can also specify the number of folds, from the default of three folds to a maximum of 10\. Cross validation divides training data into folds, or groups, for testing model performance\. | +| Select features to include | Select columns from your data source that contain data that supports the prediction column\. Excluding extraneous columns can improve run time\. | + + + +## Runtime settings ## + +Review experiment settings or change the compute resources that are allocated for running the experiment\. + +## Next steps ## + +[Configure a text analysis experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-text-analysis.html) + +**Parent topic:**[Building an AutoAI model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-build.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/69ed00abb6b920d1fe4f5b5675afda422f04e8d8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/69ed00abb6b920d1fe4f5b5675afda422f04e8d8.md new file mode 100644 index 0000000..92c0954 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/69ed00abb6b920d1fe4f5b5675afda422f04e8d8.md @@ -0,0 +1,9 @@ +# Summary (SPSS Modeler) + +# Summary # + +With this example Automated Modeling for a Flag Target flow, you used the Auto Numeric node to compare a number of different models, selected the three most accurate models, and added them to the flow within an ensembled Auto Numeric model nugget\. + +The ensembled model showed performance that was better than two of the individual models and may perform better when applied to other datasets\. If your goal is to automate the process as much as possible, this approach allows you to obtain a robust model under most circumstances without having to dig deeply into the specifics of any one model\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6a186d2c83108a0288bdfe3d4cea201ac0837503.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6a186d2c83108a0288bdfe3d4cea201ac0837503.md new file mode 100644 index 0000000..cdb1b36 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6a186d2c83108a0288bdfe3d4cea201ac0837503.md @@ -0,0 +1,40 @@ +# Managing attachments for AI use cases + +# Managing attachments for AI use cases # + +Create attachment groups and define attachment slots for an AI use case or factsheet\. + +## Adding attachment groups ## + +If you have admin access to an inventory, you can define attachment groups and manage attachment definitions for the AI use cases or factsheets in the inventory\. Use an attachment group to organize a set of related attachment facts and render them together\. Attachments can provide supporting information and extra details for a use case\. Data scientists might want to attach visualizations from their model\. Model requesters might want to attach a file of requirements to describe a business need\. + +### Creating an attachment group ### + + + +1. Open the AI uses cases settings and click the **Attachments** tab\. If you do not see this tab, you might have insufficient access\. +2. Choose whether to add an attachment group to an AI use case or to the factsheet template\. +3. Click **Add group**\. +4. Enter a name and an optional description\. +5. When you define the attachment group, an identifier is created from the name of the group\. The identifier can be used for programmatic access to the group\. Click **Show identifier** to view and edit the ID\. +6. Save your changes to create the attachment group\. + + + +### Adding attachment facts to a group ### + +From an attachment group, add attachment fact definitions that specify how a user can add an attachment to a factsheet\. Attachment definitions display as available slots in the attachment section for a use case or factsheet\. + +Use the up and down arrow keys to reorder attachments in the list\. + +In this example, an attachment group for approvals defines attachment facts for approvals from risk and compliance and from the model validator\. + +![Defining an attachment group and attachment facts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-attach-group.png) + +When you save your attachment fact definitions, an attachment slot and description display on the use case or factsheet for attaching a file\. A pin icon indicates an available attachment slot\. Any user with at least edit access to the use case or factsheet can upload attachments\. + +![Defining an attachment group and attachment facts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-attach-group2.png) + +**Parent topic:**[Creating and managing inventories](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-inventory-manage.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6a32659df809f04f9a670634129fc75cc9140729.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6a32659df809f04f9a670634129fc75cc9140729.md new file mode 100644 index 0000000..59e4714 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6a32659df809f04f9a670634129fc75cc9140729.md @@ -0,0 +1,11 @@ +# Setting properties for SPSS Modeler flows + +# Setting properties for flows # + +You can specify properties to apply to the current flow\. + +To set flow properties, click the Flow Properties icon:![Flow properties icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/flow_properties.png) + +The following properties are available\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6ac4a29febf419002bdba62d99d997cf55e9fcf2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6ac4a29febf419002bdba62d99d997cf55e9fcf2.md new file mode 100644 index 0000000..80f8227 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6ac4a29febf419002bdba62d99d997cf55e9fcf2.md @@ -0,0 +1,5 @@ +# IBM Analytics Engine on IBM watsonx + +# IBM Analytics Engine on IBM® watsonx # + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6ace7c519d2c4fca9fc0498bce82f75ffa05cffd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6ace7c519d2c4fca9fc0498bce82f75ffa05cffd.md new file mode 100644 index 0000000..48db125 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6ace7c519d2c4fca9fc0498bce82f75ffa05cffd.md @@ -0,0 +1,162 @@ +# Detecting entities with regular expressions + +# Detecting entities with regular expressions # + +Similar to detecting entities with dictionaries, you can use regex pattern matches to detect entities\. + +Regular expressions are not provided in files like dictionaries but in\-memory within a regex configuration\. You can use multiple regex configurations during the same extraction\. + +Regexes that you define with Watson Natural Language Processing can use token boundaries\. This way, you can ensure that your regular expression matches within one or more tokens\. This is a clear advantage over simpler regular expression engines, especially when you work with a language that is not separated by whitespace, such as Chinese\. + +Regular expressions are processed by a dedicated component called Rule\-Based Runtime, or RBR for short\. + +## Creating regex configurations ## + +Begin by creating a module directory inside your notebook\. This is a directory inside the notebook file system that is used temporarily to store the files created by the RBR training\. This module directory can be the same directory that you created and used for dictionary\-based entity extraction\. Dictionaries and regular expressions can be used in the same training run\. + +To create the module directory in your notebook, enter the following in a code cell\. Note that the module directory can't contain a dash (\-)\. + + import os + import watson_nlp + module_folder = "NLP_RBR_Module_2" + os.makedirs(module_folder, exist_ok=True) + +A regex configuration is a Python dictionary, with the following attributes: + + + +Available attributes in regex configurations with their values, descriptions of use and indication if required or not + +| Attribute | Value | Description | Required | +| -------------------- | ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| `name` | string | The name of the regular expression\. Matches of the regular expression in the input text are tagged with this name in the output\. | Yes | +| `regexes` | list (string of perl based regex patterns) | Should be non\-empty\. Multiple regexes can be provided\. | Yes | +| `flags` | Delimited string of valid flags | Flags such as UNICODE or CASE\_INSENSITIVE control the matching\. Can also be a combination of flags\. For the supported flags, see [Pattern (Java Platform SE 8)](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html)\. | No (defaults to DOTALL) | +| `token_boundary.min` | int | `token_boundary` indicates whether to match the regular expression only on token boundaries\. Specified as a dict object with `min` and `max` attributes\. | No (returns the longest non\-overlapping match at each character position in the input text) | +| `token_boundary.max` | int | `max` is an optional attribute for `token_boundary` and needed when the boundary needs to extend for a range (between `min` and `max` tokens)\. `token_boundary.max` needs to be `>= token_boundary.min` | No (if `token_boundary` is specified, the `min` attribute can be specified alone) | +| `groups` | list (string labels for matching groups) | String index in list corresponds to matched group in pattern starting with 1 where 0 index corresponds to entire match\. For example: `regex: (a)(b)` on `ab` with `group: ['full', 'first', 'second']` will yield `full: ab, first: a, second: b` | No (defaults to label match on full match) | + + + +The regex configurations can be loaded using the following helper methods: + + + + * To load a single regex configuration, use `watson_nlp.toolkit.RegexConfig.load()` + * To load multiple regex configurations, use `watson_nlp.toolkit.RegexConfig.load_all([)])` + + + +**Code sample** + +This sample shows you how to load two different regex configurations\. The first configuration detects person names\. It uses the groups attribute to allow easy access to the full, first and last name at a later stage\. + +The second configuration detects acronyms as a sequence of all\-uppercase characters\. By using the token\_boundary attribute, it prevents matches in words that contain both uppercase and lowercase characters\. + + from watson_nlp.toolkit.rule_utils import RegexConfig + + # Load some regex configs, for instance to match First names or acronyms + regexes = RegexConfig.load_all([ + { + 'name': 'full names', + 'regexes': '(A-Z]a-z]*) (A-Z]a-z]*)'], + 'groups': 'full name', 'first name', 'last name'] + }, + { + 'name': 'acronyms', + 'regexes': '(A-Z]+)'], + 'groups': 'acronym'], + 'token_boundary': { + 'min': 1, + 'max': 1 + } + } + ]) + +## Training a model that contains regular expressions ## + +After you have loaded the regex configurations, create an RBR model using the `RBR.train()` method\. In the method, specify: + + + + * The module directory + * The language of the text + * The regex configurations to use + + + +This is the same method that is used to train RBR with dictionary\-based extraction\. You can pass the dictionary configuration in the same method call\. + +**Code sample** + + # Train the RBR model + custom_regex_block = watson_nlp.resources.feature_extractor.RBR.train(module_path=module_folder, language='en', regexes=regexes) + +## Applying the model on new data ## + +After you have trained the dictionaries, apply the model on new data using the `run()` method, as you would use on any of the existing pre\-trained blocks\. + +**Code sample** + + custom_regex_block.run('Bruce Wayne works for NASA') + +Output of the code sample: + + {(0, 11): ['regex::full names'], (0, 5): ['regex::full names'], (6, 11): ['regex::full names'], (22, 26): ['regex::acronyms']} + +To show the matching subgroups or the matched text: + + import json + # Get the raw response including matching groups + full_regex_result = custom_regex_block.executor.get_raw_response('Bruce Wayne works for NASA‘, language='en') + print(json.dumps(full_regex_result, indent=2)) + +Output of the code sample: + + { + "annotations": { + "View_full names": [ + { + "label": "regex::full names", + "fullname": { + "location": { + "begin": 0, + "end": 11 + }, + "text": "Bruce Wayne" + }, + "firstname": { + "location": { + "begin": 0, + "end": 5 + }, + "text": "Bruce" + }, + "lastname": { + "location": { + "begin": 6, + "end": 11 + }, + "text": "Wayne" + } + } + ], + "View_acronyms": [ + { + "label": "regex::acronyms", + "acronym": { + "location": { + "begin": 22, + "end": 26 + }, + "text": "NASA" + } + } + ] + }, + ... + } + +**Parent topic:**[Creating your own models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-create-model.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6b4213fc5352021865e77592ebc27242e746b5aa.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6b4213fc5352021865e77592ebc27242e746b5aa.md new file mode 100644 index 0000000..bab5c7a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6b4213fc5352021865e77592ebc27242e746b5aa.md @@ -0,0 +1,6 @@ +# Pareto charts + +# Pareto charts # + +Pareto charts contain both bars and a line graph\. The bars represent individual variable categories and the line graph represents the cumulative total\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6b6d315ffd086296183de20086ee752a6a2b88c8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6b6d315ffd086296183de20086ee752a6a2b88c8.md new file mode 100644 index 0000000..89bfae3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6b6d315ffd086296183de20086ee752a6a2b88c8.md @@ -0,0 +1,16 @@ +# TCM node (SPSS Modeler) + +# TCM node # + +Use this node to create a temporal causal model (TCM)\. + +Temporal causal modeling attempts to discover key causal relationships in time series data\. In temporal causal modeling, you specify a set of target series and a set of candidate inputs to those targets\. The procedure then builds an autoregressive time series model for each target and includes only those inputs that have a causal relationship with the target\. This approach differs from traditional time series modeling where you must explicitly specify the predictors for a target series\. Since temporal causal modeling typically involves building models for multiple related time series, the result is referred to as a model system\. + +In the context of temporal causal modeling, the term causal refers to Granger causality\. A time series X is said to "Granger cause" another time series Y if regressing for Y in terms of past values of both X and Y results in a better model for Y than regressing only on past values of Y\. + +Note: To build a temporal causal model, you need enough data points\. The product uses the constraint: + + m>(L + KL + 1) + +where `m` is the number of data points, `L` is the number of lags, and `K` is the number of predictors\. Make sure your data set is big enough so that the number of data points (`m`) satisfies the condition\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6b6f04aa6bbd6be14b11ea62aa0d844979bdfcdf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6b6f04aa6bbd6be14b11ea62aa0d844979bdfcdf.md new file mode 100644 index 0000000..b2decab --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6b6f04aa6bbd6be14b11ea62aa0d844979bdfcdf.md @@ -0,0 +1,27 @@ +# {{ document.title.text }} + +# Explaining output # + +![icon for explainability risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-explainability.svg)Risks associated with outputExplainabilityAmplified + +### Description ### + +Explanations for model output decisions might be difficult, imprecise, or not possible to obtain\. + +### Why is explaining output a concern for foundation models? ### + +Foundation models are based on complex deep learning architectures, making explanations for their outputs difficult\. Without clear explanations for model output, it is difficult for users, model validators, and auditors to understand and trust the model\. Lack of transparency might carry legal consequences in highly regulated domains\. Wrong explanations might lead to over\-trust\. + +Example + +#### Unexplainable accuracy in race prediction #### + +According to the source article, researchers analyzing multiple machine learning models using patient medical images were able to confirm the models’ ability to predict race with high accuracy from images\. They were stumped as to what exactly is enabling the systems to consistently guess correctly\. The researchers found that even factors like disease and physical build were not strong predictors of race—in other words, the algorithmic systems don’t seem to be using any particular aspect of the images to make their determinations\. + +Sources: + +[Banerjee et al\., July 2021](https://arxiv.org/abs/2107.10356) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6b81f2288b810e3ffdd2de5ace4e13e3a90e1e10.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6b81f2288b810e3ffdd2de5ace4e13e3a90e1e10.md new file mode 100644 index 0000000..6ab8697 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6b81f2288b810e3ffdd2de5ace4e13e3a90e1e10.md @@ -0,0 +1,135 @@ +# Tutorial: Create a time series anomaly prediction experiment + +# Tutorial: Create a time series anomaly prediction experiment # + +This tutorial guides you through using AutoAI and sample data to train a time series experiment to detect if daily electricity usage values are normal or anomalies (outliers)\. + +When you set up the sample experiment, you load data that analyzes daily electricity usage from Industry A to determine whether a value is *normal* or an *anomaly*\. Then, the experiment generates pipelines that use algorithms to label these predicted values as normal or an anomaly\. After generating the pipelines, AutoAI chooses the best performers, and presents them in a leaderboard for you to review\. + +Tech preview This is a technology preview and is not yet supported for use in production environments\. + +## Data set overview ## + +This tutorial uses the *Electricity usage anomalies sample data* set from the Watson Studio Gallery\. This data set describes the annual electricity usages for Industry A\. The first column indicates the electricity usages and the second column indicates the date, which is in a day\-by\-day format\. + +![A preview of the Electricity usage anomalies sample data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-ts-ad-dataset-preview.png) + +## Tasks overview ## + +In this tutorial, follow these steps to create an anomaly prediction experiment: + + + +1. [Create an AutoAI experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-ap-tutorial.html?context=cdpaas&locale=en#step1) +2. [View the experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-ap-tutorial.html?context=cdpaas&locale=en#step2) +3. [Review experiment results](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-ap-tutorial.html?context=cdpaas&locale=en#step3) +4. [Deploy the trained model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-ap-tutorial.html?context=cdpaas&locale=en#step4) +5. [Test the deployed model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-ap-tutorial.html?context=cdpaas&locale=en#step5) + + + +## Create an AutoAI experiment ## + +Create an AutoAI experiment and add sample data to your experiment\. + + + +1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg), click **Projects > View all projects**\. +2. Open an existing project or [create a new project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html) to store the anomaly prediction experiment\. +3. On the *Assets* tab from within your project, click **New asset > Build machine learning models automatically**\. +4. Click **Samples > Electricity usage anomalies sample data**, then select **Next**\. The AutoAI *experiment name* and *description* are pre\-populated by the sample data\. +5. If prompted, associate a Watson Machine Learning instance with your AutoAI experiment\. + + + + 1. Click **Associate a Machine Learning service instance** and select an instance of Watson Machine Learning. + 2. Click **Reload** to confirm your configuration. + + + +6. Click **Create**\. + + + +## View the experiment details ## + +AutoAI pre\-populates the details fields for the sample experiment: + +![Anomaly prediction pre\-populated detail fields](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-ts-ad-details.png) + + + + * Type series analysis type: *Anomaly prediction* predicts whether future values in a series are anomalies (outliers)\. A prediction of 1 indicates a *normal* value and a prediction of \-1 indicates an *anomaly*\. + * Feature column: *industry\_a\_usage* is the predicted value and indicates how much electricity *Industry A* consumes\. + * Date/Time column: *date* indicates the time increments for the experiment\. For this experiment, there is one prediction value per day\. + + * This experiment is optimized for the model performance metric: *Average Precision*\. Average precision evaluates the performance of object detection and segmentation systems\. + + + +Click **Run experiment** to train the model\. The experiment takes several minutes to complete\. + +## Review the experiment results ## + +The relationship map shows the transformations that are used to create pipelines\. Follow these steps to review experiment results and save the pipeline with the best performance\. ![Anomaly prediction relationship map and pipeline leaderboard](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-ts-ad-pipeline-map.png) + + + +1. The leaderboard lists and saves the three best performing pipelines\. Click the pipeline name with Rank 1 to review the details of the pipeline\. For details on anomaly prediction metrics, see [Creating a time series anomaly prediction experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-ap.html)\. +2. Select the pipeline with Rank 1 and **Save** the pipeline as a *model*\. The *model name* is pre\-populated with the default name\. +3. Click **Create** to confirm your pipeline selection\. + + + +## Deploy the trained model ## + +Before the trained model can make predictions on external values, you must deploy the model\. Follow these steps to promote your trained model to a deployment space\. + + + +1. Deploy the model from the *Model details* page\. To access the *Model details* page, choose one of these options: + + + + * From the notification displayed when you save the model, click **View in project**. + * From the project's *Assets*, select the model’s name in *Models*. + + + +2. From the *Model details* page, click **Promote to Deployment Space**\. Then, select or create a deployment space to deploy the model\. +3. Select **Go to the model in the space after promoting it** and click **Promote** to promote the model\. + + + +## Testing the model ## + +After promoting the model to the deployment space, you are ready to test your trained model with new data values\. + + + +1. Select **New Deployment** and create a new deployment with the following fields: + + + + 1. Deployment type: `Online` + 2. Name: `Electricity usage online deployment` + + + +2. Click **Create** and wait for the status to update to *Deployed*\. +3. After the deployment initializes, click the deployment\. Use *Test input* to manually enter and evaluate values or use JSON input to attach a data set\. + + ![Anomaly prediction sample input data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-ts-ad-sample-cases.png) +4. Click **Predict** to see whether there are any anomalies in the values\. + + Note:-1 indicates an *anomaly*; 1 indicates a *normal* value. + + + +![Anomaly prediction results table and chart](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-ts-ad-predicted-results.png) + +## Next steps ## + +[Building a time series forecast experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6bc478053fefd091742c6775dfac9eb5b8c4923f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6bc478053fefd091742c6775dfac9eb5b8c4923f.md new file mode 100644 index 0000000..9568d89 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6bc478053fefd091742c6775dfac9eb5b8c4923f.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Data curation # + +![icon for value alignment risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-value-alignment.svg)Risks associated with inputTraining and tuning phaseValue alignmentAmplified + +### Description ### + +When training or tuning data is improperly collected or prepared, the result can be a misalignment of a model's desired values or intent and the actual outcome\. + +### Why is data curation a concern for foundation models? ### + +Improper data curation can adversely affect how a model is trained, resulting in a model that does not behave in accordance with the intended values\. Correcting problems after the model is trained and deployed might be insufficient for guaranteeing proper behavior\. Improper model behavior can result in business entities facing legal consequences or reputational harms\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6bff9c4db2bb43376a2a2cd681714ed3273e991e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6bff9c4db2bb43376a2a2cd681714ed3273e991e.md new file mode 100644 index 0000000..0edd6a9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6bff9c4db2bb43376a2a2cd681714ed3273e991e.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Dangerous use # + +![icon for misuse risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-misuse.svg)Risks associated with outputMisuseNew + +### Description ### + +The possibility that a model could be misused for dangerous purposes such as creating plans to develop weapons, malware, or causing harm to others is the risk of dangerous use\. + +### Why is dangerous use a concern for foundation models? ### + +Enabling people to harm others is unethical and can be illegal\. A model that has this potential must be properly governed\. Otherwise, business entities could face fines, reputational harms, and other legal consequences\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6cb2797ab2ef876f05a39f4cee08eee4249716d8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6cb2797ab2ef876f05a39f4cee08eee4249716d8.md new file mode 100644 index 0000000..89dceb8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6cb2797ab2ef876f05a39f4cee08eee4249716d8.md @@ -0,0 +1,37 @@ +# Flow script example: Training a neural net + +# Flow script example: Training a neural net # + +You can use a flow to train a neural network model when executed\. Normally, to test the model, you might run the modeling node to add the model to the flow, make the appropriate connections, and run an Analysis node\. + +Using an SPSS Modeler script, you can automate the process of testing the model nugget after you create it\. Following is an example: + + stream = modeler.script.stream() + neuralnetnode = stream.findByType("neuralnetwork", None) + results = [] + neuralnetnode.run(results) + appliernode = stream.createModelApplierAt(results[0], "Drug", 594, 187) + analysisnode = stream.createAt("analysis", "Drug", 688, 187) + typenode = stream.findByType("type", None) + stream.linkBetween(appliernode, typenode, analysisnode) + analysisnode.run([]) + +The following bullets describe each line in this script example\. + + + + * The first line defines a variable that points to the current flow + * In line 2, the script finds the Neural Net builder node + * In line 3, the script creates a list where the execution results can be stored + * In line 4, the Neural Net model nugget is created\. This is stored in the list defined on line 3\. + * In line 5, a model apply node is created for the model nugget and placed on the flow canvas + * In line 6, an analysis node called `Drug` is created + * In line 7, the script finds the Type node + * In line 8, the script connects the model apply node created in line 5 between the Type node and the Analysis node + * Finally, the Analysis node runs to produce the Analysis report + + + +It's possible to use a script to build and run a flow from scratch, starting with a blank canvas\. To learn more about the scripting language in general, see [Scripting overview](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/using_scripting.html)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6cd7b46e0c35165bfe21be4967b68481e9be840f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6cd7b46e0c35165bfe21be4967b68481e9be840f.md new file mode 100644 index 0000000..c680c27 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6cd7b46e0c35165bfe21be4967b68481e9be840f.md @@ -0,0 +1,85 @@ +# SAP OData connection + +# SAP OData connection # + +To access your data in SAP OData, create a connection asset for it\. + +Use the SAP OData connection to extract data from a SAP system through its exposed OData services\. + +## Supported SAP OData products ## + +The SAP OData connection is supported on SAP products that support the OData protocol version 2\. Example products are S4/HANA (on premises or cloud), ERP, and CRM\. + +## Create a connection to SAP OData ## + +To create the connection asset, you need these connection details: + +Credentials type: + + + + * API Key + * Basic + * None + + + +Encryption: +SSL certificate (if required by the database server) + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use the SAP OData connection in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## SAP OData setup ## + +See [Prerequisites for using the SAP ODATA Connector](https://www.ibm.com/support/pages/node/886655) for the SAP Gateway setup instructions\. + +## Restrictions ## + + + + * For Data Refinery, you can use this connection only as a source\. You cannot use this connection as a target connection or as a target connected data asset\. + * For SPSS Modeler, you cannot create new entity sets\. + + + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6d7b948346f167b5390a0e56e1b6de83ae31a19a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6d7b948346f167b5390a0e56e1b6de83ae31a19a.md new file mode 100644 index 0000000..b5248d6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6d7b948346f167b5390a0e56e1b6de83ae31a19a.md @@ -0,0 +1,10 @@ +# Analysis node (SPSS Modeler) + +# Analysis node # + +With the Analysis node, you can evaluate the ability of a model to generate accurate predictions\. Analysis nodes perform various comparisons between predicted values and actual values (your target field) for one or more model nuggets\. You can also use Analysis nodes to compare predictive models to other predictive models\. + +When you execute an Analysis node, a summary of the analysis results is automatically added to the Analysis section on the Summary tab for each model nugget in the executed flow\. The detailed analysis results appear on the Outputs tab of the manager window or can be written directly to a file\. + +Note: Because Analysis nodes compare predicted values to actual values, they are only useful with supervised models (those that require a target field)\. For unsupervised models such as clustering algorithms, there are no actual results available to use as a basis for comparison\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6dbd14399b24f78cafec6225b77dafae357ddee5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6dbd14399b24f78cafec6225b77dafae357ddee5.md new file mode 100644 index 0000000..ebfc360 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6dbd14399b24f78cafec6225b77dafae357ddee5.md @@ -0,0 +1,40 @@ +# Decision Optimization notebooks + +# Decision Optimization notebooks # + +You can create and run Decision Optimization models in Python notebooks by using DOcplex, a native Python API for Decision Optimization\. Several Decision Optimization notebooks are already available for you to use\. + +The Decision Optimization environment currently supports `Python 3.10`\. The following Python environments give you access to the Community Edition of the CPLEX engines\. The Community Edition is limited to solving problems with up to 1000 constraints and 1000 variables, or with a search space of 1000 X 1000 for Constraint Programming problems\. + + + + * `Runtime 23.1 on Python 3.10 S/XS/XXS` + * `Runtime 22.2 on Python 3.10 S/XS/XXS` + + + +To run larger problems, select a runtime that includes the full CPLEX commercial edition\. The Decision Optimization environment ( DOcplex) is available in the following runtimes (full CPLEX commercial edition): + + + + * `NLP + DO runtime 23.1 on Python 3.10` with `CPLEX 22.1.1.0` + * `DO + NLP runtime 22.2 on Python 3.10` with `CPLEX 20.1.0.1` + + + +You can easily change environments (runtimes and Python version) inside a notebook by using the Environment tab (see [Changing the environment of a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html#change-env))\. Thus, you can formulate optimization models and test them with small data sets in one environment\. Then, to solve models with bigger data sets, you can switch to a different environment, without having to rewrite or copy the notebook code\. + +Multiple examples of Decision Optimization notebooks are available in the Samples, including: + + + + * The Sudoku example, a Constraint Programming example in which the objective is to solve a 9x9 Sudoku grid\. + * The Pasta Production Problem example, a Linear Programming example in which the objective is to minimize the production cost for some pasta products and to ensure that the customers' demand for the products is satisfied\. + + + +These and more examples are also available in the **jupyter** folder of the **[DO\-samples](https://github.com/IBMDecisionOptimization/DO-Samples)** + +All Decision Optimization notebooks use DOcplex\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6e25d98279484e1d63cdeefdd1d6a9f1917f1ba8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6e25d98279484e1d63cdeefdd1d6a9f1917f1ba8.md new file mode 100644 index 0000000..aae8a26 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6e25d98279484e1d63cdeefdd1d6a9f1917f1ba8.md @@ -0,0 +1,406 @@ +# Activity Tracker events + +# Activity Tracker events # + +You can see the events for actions for your provisioned services in the IBM Cloud Activity Tracker\. You can use the information that is registered through the IBM Cloud Activity Tracker service to identify security incidents, detect unauthorized access, and comply with regulatory and internal auditing requirements\. + +To get started, provision an instance of the IBM Cloud Activity Tracker service\. See [IBM Cloud Activity Tracker](https://cloud.ibm.com/docs/activity-tracker?topic=activity-tracker-getting-started)\. + +View events in the Activity Tracker in the same IBM Cloud region where you provisioned your services\. To view the account and user management events and other global platform events, you must provision an instance of the IBM Cloud Activity Tracker service in the **Frankfurt (eu\-de)** region\. See [Platform services](https://cloud.ibm.com/docs/activity-tracker?topic=activity-tracker-cloud_services_locations#cloud_services_locations_core_integrated)\. + + + + * [Events for account and user management](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/at-events.html?context=cdpaas&locale=en#acct) + * [Events for Watson Studio](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/at-events.html?context=cdpaas&locale=en#ws) + * [Events for Watson Machine Learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/at-events.html?context=cdpaas&locale=en#wml) + * [Events for model evaluation (Watson OpenScale)](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/at-events.html?context=cdpaas&locale=en#wos) + + + +## Events for account and user management ## + +You can audit account and user management events in Activity Tracker, including: + + + + * Billing events + * Global catalog events + * IAM and user management events + + + +For the complete list of account and user management events, see [IBM Cloud docs: Auditing events for account management](https://cloud.ibm.com/docs/activity-tracker?topic=activity-tracker-at_events_acc_mgt)\. + +## Events for Watson Studio ## + + + +Events in Activity Tracker for Watson Studio + +| Action | Description | +| ------------------------------------------- | ------------------------------------------------------------------- | +| data\-science\-experience\.project\.create | Create a project\. | +| data\-science\-experience\.project\.delete | Delete a project\. | +| data\-science\-experience\.notebook\.create | Create a Notebook\. | +| data\-science\-experience\.notebook\.delete | Delete a Notebook\. | +| data\-science\-experience\.notebook\.update | Change the runtime service of a Notebook by selecting another one\. | +| data\-science\-experience\.rstudio\.start | Open RStudio\. | +| data\-science\-experience\.rstudio\.stop | RStudio session timed out\. | + + + +### Events for Decision Optimization ### + + + +Events in Activity Tracker for Decision Optimization + +| Action | Description | +| -------------------------- | ------------------------------------------------------- | +| domodel\.decision\.create | Create experiments | +| domodel\.decision\.update | Update experiments | +| domodel\.decision\.delete | Delete experiments | +| domodel\.container\.create | Create scenarios | +| domodel\.container\.update | Update scenarios | +| domodel\.container\.delete | Delete scenarios | +| domodel\.notebook\.import | Update a scenario from a notebook | +| domodel\.notebook\.export | Generate a model notebook from a scenario | +| domodel\.wml\.export | Generate Watson Machine Learning models from a scenario | +| domodel\.solve\.start | Solve a scenario | +| domodel\.solve\.stop | Cancel a solve | + + + +### Events for feature groups ### + + + +Events in Activity Tracker for feature groups (Watson Studio) + +| Action | Description | +| --------------------------------------------------- | ------------------------ | +| data\_science\_experience\.feature\-group\.retrieve | Retrieve a feature group | +| data\_science\_experience\.feature\-group\.create | Create a feature group | +| data\_science\_experience\.feature\-group\.update | Update a feature group | +| data\_science\_experience\.feature\-group\.delete | Delete a feature group | + + + +### Events for asset management ### + + + +Events in Activity Tracker for asset management in Watson Studio + +| Action | Description | +| ------------------------------------ | ------------------------------------------------ | +| datacatalog\.asset\.clone | Copy an asset\. | +| datacatalog\.asset\.create | Create an asset\. | +| datacatalog\.data\-asset\.create | Create a data asset\. | +| datacatalog\.folder\-asset\.create | Create a folder asset\. | +| datacatalog\.type\.create | Create an asset type\. | +| datacatalog\.asset\.purge | Delete an asset from the trash\. | +| datacatalog\.asset\.restore | Restore an asset from the trash\. | +| datacatalog\.asset\.trash | Send an asset to the trash\. | +| datacatalog\.asset\.update | Update an asset\. | +| datacatalog\.promoted\-asset\.create | Create a project asset in a space\. | +| datacatalog\.promoted\-asset\.update | Update a space asset that started in a project\. | +| datacatalog\.asset\.promote | Promote an asset from project to space\. | + + + +### Events for asset attachments ### + + + +Events in Activity Tracker for attachments + +| Action | Description | +| -------------------------------------------- | ----------------------------------------- | +| datacatalog\.attachment\.create | Create an attachment\. | +| datacatalog\.attachment\.delete | Delete an attachment\. | +| datacatalog\.attachment\-resources\.increase | Increase resources for an attachment\. | +| datacatalog\.complete\.transfer | Mark an attachment as transfer complete\. | +| datacatalog\.attachment\.update | Update attachment metadata\. | + + + +### Events for asset attributes ### + + + +Events in Activity Tracker for attributes + +| Action | Description | +| ------------------------------ | --------------------- | +| datacatalog\.attribute\.create | Create an attribute\. | +| datacatalog\.attribute\.delete | Delete an attribute\. | +| datacatalog\.attribute\.update | Update an attribute\. | + + + +### Events for connections ### + + + +Events in Activity Tracker for connections + +| Action | Description | +| ----------------------------------------------- | --------------------------- | +| wdp\-connect\-connection\.connection\.read | Read a connection\. | +| wdp\-connect\-connection\.connection\.get | Retrieve a connection\. | +| wdp\-connect\-connection\.connection\.get\.list | Get a list of connections\. | +| wdp\-connect\-connection\.connection\.create | Create a connection\. | +| wdp\-connect\-connection\.connection\.delete | Delete a connection\. | + + + +### Events for scheduling ### + + + +Events in Activity Tracker for scheduling + +| Action | Description | +| ------------------------------------------- | ----------------------------------- | +| wdp\.scheduling\.schedule\.update\.failed | An update to a schedule failed\. | +| wdp\.scheduling\.schedule\.create\.failed | The creation of a schedule failed\. | +| wdp\.scheduling\.schedule\.read | Read a schedule\. | +| wdp\.scheduling\.schedule\.update | Update a schedule\. | +| wdp\.scheduling\.schedule\.delete\.multiple | Delete multiple schedules\. | +| wdp\.scheduling\.schedule\.list | List all schedules\. | +| wdp\.scheduling\.schedule\.create | Create a schedule\. | + + + +### Events for Data Refinery flows ### + + + +Events in Activity Tracker for Data Refinery flows + +| Action | Description | +| ------------------------------------------------------------------ | -------------------------------------- | +| data\-science\-experience\.datarefinery\-flow\.read | Read a Data Refinery flow | +| data\-science\-experience\.datarefinery\-flow\.create | Create a Data Refinery flow | +| data\-science\-experience\.datarefinery\-flow\.delete | Delete a Data Refinery flow | +| data\-science\-experience\.datarefinery\-flow\.update | Update (save) a Data Refinery flow | +| data\-science\-experience\.datarefinery\-flow\.backup | Clone (duplicate) a Data Refinery flow | +| data\-science\-experience\.datarefinery\-flowrun\.create | Create a Data Refinery flow job run | +| data\-science\-experience\.datarefinery\-flowrun\-complete\.update | Complete a Data Refinery flow job run | +| data\-science\-experience\.datarefinery\-flowrun\-cancel\.update | Cancel a Data Refinery flow job run | + + + +### Events for profiling ### + + + +Events in Activity Tracker for profiling + +| Action | Description | +| --------------------------------------------------------------- | ----------------------------------------------------------- | +| wdp\-profiling\.profile\.start | Initiate profiling\. | +| wdp\-profiling\.profile\.create | Create a profile\. | +| wdp\-profiling\.profile\.delete | Delete a profile\. | +| wdp\-profiling\.profile\.read | Read a profile\. | +| wdp\-profiling\.profile\.list | List the profiles of a data asset\. | +| wdp\-profiling\.profile\.update | Update a profile\. | +| wdp\-profiling\.profile\.asset\-classification\.update | Update the asset classification of a profile\. | +| wdp\-profiling\.profile\.column\-classification\.update | Update the column classification of a profile\. | +| wdp\-profiling\.profile\.create\.failed | Profile could not be created\. | +| wdp\-profiling\.profile\.delete\.failed | Profile could not be deleted\. | +| wdp\-profiling\.profile\.read\.failed | Profile could not be read\. | +| wdp\-profiling\.profile\.list\.failed | Profiles could not be listed\. | +| wdp\-profiling\.profile\.update\.failed | Profile could not be updated\. | +| wdp\-profiling\.profile\.asset\-classification\.update\.failed | Asset classification of the profile could not be updated\. | +| wdp\-profiling\.profile\.column\-classification\.update\.failed | Column classification of the profile could not be updated\. | + + + +### Events for profiling options ### + + + +Events in Activity Tracker for profiling options + +| Action | Description | +| ------------------------------------------------ | ---------------------------------------- | +| wdp\-profiling\.profile\_options\.create | Create profiling options\. | +| wdp\-profiling\.profile\_options\.read | Read profiling options\. | +| wdp\-profiling\.profile\_options\.update | Update profiling options\. | +| wdp\-profiling\.profile\_options\.delete | Delete profiling options | +| wdp\-profiling\.profile\_options\.create\.failed | Profiling options could not be created\. | +| wdp\-profiling\.profile\_options\.read\.failed | Profiling options could not be read\. | +| wdp\-profiling\.profile\_options\.update\.failed | Profiling options could not be updated\. | +| wdp\-profiling\.profile\_options\.delete\.failed | Profiling options could not be deleted\. | + + + +### Events for feature groups ### + + + +Events in Activity Tracker for feature groups (IBM Knowledge Catalog) + +| Action | Description | +| --------------------------------------- | ------------------------ | +| data\_catalog\.feature\-group\.retrieve | Retrieve a feature group | +| data\_catalog\.feature\-group\.create | Create a feature group | +| data\_catalog\.feature\-group\.update | Update a feature group | +| data\_catalog\.feature\-group\.delete | Delete a feature group | + + + +## Events for Watson Machine Learning ## + +### Event for Prompt Lab ### + + + +Event in Activity Tracker for Prompt Lab + +| Action | Description | +| ------------------------------- | ------------------------------------------------------------------------------- | +| pm\-20\.foundation\-model\.send | Send a prompt to a foundation model or tuned foundation model for inferencing\. | + + + +### Events for Watson Machine Learning deployments ### + + + +Events in Activity Tracker for Watson Machine Learning deployments + +| Action | Description | +| ------------------------------- | ------------------------------------------------- | +| pm\-20\.deployment\.create | Create a Watson Machine Learning deployment\. | +| pm\-20\.deployment\.read | Get a Watson Machine Learning deployment\. | +| pm\-20\.deployment\.update | Update a Watson Machine Learning deployment\. | +| pm\-20\.deployment\.delete | Delete a Watson Machine Learning deployment\. | +| pm\-20\.deployment\_job\.create | Create a Watson Machine Learning deployment job\. | +| pm\-20\.deployment\_job\.read | Get a Watson Machine Learning deployment job\. | +| pm\-20\.deployment\_job\.delete | Delete a Watson Machine Learning deployment job\. | + + + +### Events for SPSS Modeler flows ### + + + +Events in Activity Tracker for SPSS Modeler flows + +| Action | Description | +| --------------------------------------------------------- | --------------------------------------------------------- | +| data\-science\-experience\.modeler\-session\.create | Create a new SPSS Modeler session\. | +| data\-science\-experience\.modeler\-flow\.send | Store the current SPSS Modeler flow\. | +| data\-science\-experience\.modeler\-flows\-user\.receive | Get the current user information\. | +| data\-science\-experience\.modeler\-flow\-preview\.create | Preview a node in an SPSS Modeler flow\. | +| data\-science\-experience\.modeler\-examples\.receive | Get the list of example SPSS Modeler flows\. | +| data\-science\-experience\.modeler\-runtimes\.receive | Get the list of available SPSS Modeler runtimes\. | +| data\-science\-experience\.lock\-modeler\-flow\.enable | Allocate the lock for the SPSS Modeler flow to the user\. | +| data\-science\-experience\.project\-name\.receive | Get the name of the project\. | + + + +### Event for model visualizations ### + + + +Event in Activity Tracker for modeler visualizations + +| Action | Description | +| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| pm\-20\.model\.visualize | Visualize model output\. The model output can have a single model, ensemble models, or a time\-series model\. The visualization type can be single, auto, or time\-series\. This visualization type is in requestedData section\. | + + + +### Events for Watson Machine Learning training assets ### + + + +Event in Activity Tracker for Watson Machine Learning training assets + +| Action | Description | +| ------------------------------ | ---------------------- | +| pm\-20\.training\.authenticate | Authenticate user\. | +| pm\-20\.training\.authorize | Authorize user\. | +| pm\-20\.training\.list | List all of training\. | +| pm\-20\.training\.get | Get one training\. | +| pm\-20\.training\.create | Start a training\. | +| pm\-20\.training\.delete | Stop a training\. | + + + +### Events for Watson Machine Learning repository assets ### + +The deployment events are tracked for these Watson Machine Learning repository assets: + + + +Event in Activity Tracker for Watson Machine Learning repository assets + +| Asset type | Description | +| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| wml\_model | Represents a machine learning model asset\. | +| wml\_model\_definition | Represents the code that is used to train one or more models\. | +| wml\_pipeline | Represents a hybrid\-pipeline, a SparkML pipeline or a sklearn pipeline that is represented as a JSON document that is used to train one or more models\. | +| wml\_experiment | Represents the assets that capture a set of wml\_pipeline or wml\_model\_definition assets that are trained at the same time on the same data set\. | +| wml\_function | Represents a Python function (code is packaged in a compressed file) that will be deployed as online deployment in Watson Machine Learning\. This code needs to contain a score(\.\.\.) python function\. | +| wml\_training\_definition | Represents the training metadata necessary to start a training job\. | +| wml\_deployment\_job\_definition | Represents the deployment metadata information to create a batch job in WML\. This asset type contains the same metadata that is used by the /ml/v4/deployment\_jobs endpoint\. When you submit batch deployment jobs, you can either provide the job definition inline or reference a job definition in a query parameter\. | + + + +These activities are tracked for each asset type: + + + +Event in Activity Tracker for Watson Machine Learning repository assets + +| Action | Description | +| ------------------------------------ | ----------------------------------------- | +| pm\-20\.``\.list | List all of the specified asset type\. | +| pm\-20\.``\.create | Create one of the specified asset types\. | +| pm\-20\.``\.delete | Delete one of the specified asset types\. | +| pm\-20\.``\.update | Update a specified asset type\. | +| pm\-20\.``\.read | View a specified asset type\. | +| pm\-20\.``\.add | Add a specified asset type\. | + + + +## Events for model evaluation (Watson OpenScale) ## + +### Events for public APIs ### + + + +Events in Activity Tracker for Watson OpenScale public APIs + +| Action | Description | +| ---------------------------- | --------------------------------------------- | +| aiopenscale\.metrics\.create | Store metric in the Watson OpenScale instance | +| aiopenscale\.payload\.create | Log payload in the Watson OpenScale instance | + + + +### Events for private APIs ### + + + +Events in Activity Tracker for Watson OpenScale private APIs + +| Action | Description | +| --------------------------------- | --------------------------------------------------------- | +| aiopenscale\.datamart\.configure | Configure the Watson OpenScale instance | +| aiopenscale\.datamart\.delete | Delete the Watson OpenScale instance | +| aiopenscale\.binding\.create | Add service binding to the Watson OpenScale instance | +| aiopenscale\.binding\.delete | Delete service binding from the Watson OpenScale instance | +| aiopenscale\.subscription\.create | Add subscription to the Watson OpenScale instance | +| aiopenscale\.subscription\.delete | Delete subscription from the Watson OpenScale instance | + + + +**Parent topic:**[Administration](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/administer-accounts.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6e50438308b85e969b79ded22cc5e15f6872ee85.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6e50438308b85e969b79ded22cc5e15f6872ee85.md new file mode 100644 index 0000000..c61e2e5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6e50438308b85e969b79ded22cc5e15f6872ee85.md @@ -0,0 +1,7 @@ +# Automated modeling for a continuous target (SPSS Modeler) + +# Automated modeling for a continuous target # + +You can use the Auto Numeric node to automatically create and compare different models for continuous (numeric range) outcomes, such as predicting the taxable value of a property\. With a single node, you can estimate and compare a set of candidate models and generate a subset of models for further analysis\. The node works in the same manner as the Auto Classifier node, but for continuous rather than flag or nominal targets\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f2cb7c072a05f7be0c6ce2eca39fc9a1ba5e107.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f2cb7c072a05f7be0c6ce2eca39fc9a1ba5e107.md new file mode 100644 index 0000000..2c61c64 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f2cb7c072a05f7be0c6ce2eca39fc9a1ba5e107.md @@ -0,0 +1,9 @@ +# Model nugget node properties + +# Model nugget node properties # + +Refer to this section for a list of available properties for Model nuggets\. + +Model nugget nodes share the same common properties as other nodes\. See [Common node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/slot_parameters_common.html#slot_parameters_common) for more information\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f35b89192b6c9a233b859cf66fcc435f3f9e650.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f35b89192b6c9a233b859cf66fcc435f3f9e650.md new file mode 100644 index 0000000..338efd8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f35b89192b6c9a233b859cf66fcc435f3f9e650.md @@ -0,0 +1,29 @@ +# kmeansnode properties + +# kmeansnode properties # + +![K\-Means node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/kmeansnodeicon.png)The K\-Means node clusters the data set into distinct groups (or clusters)\. The method defines a fixed number of clusters, iteratively assigns records to clusters, and adjusts the cluster centers until further refinement can no longer improve the model\. Instead of trying to predict an outcome, *k*\-means uses a process known as unsupervised learning to uncover patterns in the set of input fields\. + + + +kmeansnode properties + +Table 1\. kmeansnode properties + +| `kmeansnode` Properties | Values | Property description | +| ----------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `inputs` | \[*field1 \.\.\. fieldN*\] | K\-means models perform cluster analysis on a set of input fields but do not use a target field\. Weight and frequency fields are not used\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `num_clusters` | *number* | | +| `gen_distance` | *flag* | | +| `cluster_label` | `String``Number` | | +| `label_prefix` | *string* | | +| `mode` | `Simple``Expert` | | +| `stop_on` | `Default``Custom` | | +| `max_iterations` | *number* | | +| `tolerance` | *number* | | +| `encoding_value` | *number* | | +| `optimize` | `Speed``Memory` | Specifies whether model building should be optimized for speed or for memory\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f51a9033343574aee2d292cb23f09d542456389.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f51a9033343574aee2d292cb23f09d542456389.md new file mode 100644 index 0000000..64f2015 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f51a9033343574aee2d292cb23f09d542456389.md @@ -0,0 +1,22 @@ +# Enabling model tracking with AI factsheets + +# Enabling model tracking with AI factsheets # + +If your organization is using AI Factsheets as part of an AI governance strategy, you can track models after adding them to a space\. + +Tracking a model populates a factsheet in an associated model use case\. The model use cases are maintained in a model inventory in a catalog, providing a way for all stakeholders to view the lifecyle details for a machine learning model\. From the inventory, collaborators can view the details for a model as it moves through the model lifecycle, including the request, development, deployment, and evaluation of the model\. + +To enable model tracking by using AI Factsheets: + + + +1. From the asset list in your space, click a model name and then click the **Model details** tab\. +2. Click **Track this model**\. +3. Associate the model with an existing model use case in the inventory or create a new use case\. +4. Specify the details for the new use case, including specifying a catalog if you have access to more than one, and save to register the model\. A link to the model inventory is added to the model details page\. +5. Click the link to open the model use case in the inventory\. +6. Optional: update the model use case\. For example, add tags, supporting documentation, or other details\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f544922de2638796837398f7ec15a4afe6b0781.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f544922de2638796837398f7ec15a4afe6b0781.md new file mode 100644 index 0000000..54f4bf5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f544922de2638796837398f7ec15a4afe6b0781.md @@ -0,0 +1,22 @@ +# SPSS predictive analytics algorithms + +# SPSS predictive analytics algorithms # + +You can use the following SPSS predictive analytics algorithms in your notebooks\. Code samples are provided for Python notebooks\. + +Notebooks must run in a Spark with Python environment runtime\. To run the algorithms described in this section, you don't need the SPSS Modeler service\. + + + + * [Data preparation](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/datapreparation-guides.html) + * [Classification and regression](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/classificationandregression-guides.html) + * [Clustering](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/clustering-guides.html) + * [Forecasting](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/forecasting-guides.html) + * [Survival analysis](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/survivalanalysis-guides.html) + * [Score](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/score-guides.html) + + + +**Parent topic:**[Notebooks and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebooks-and-scripts.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f55360d336a77a06f2c4235b286a869cff0986c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f55360d336a77a06f2c4235b286a869cff0986c.md new file mode 100644 index 0000000..e5f04b7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f55360d336a77a06f2c4235b286a869cff0986c.md @@ -0,0 +1,31 @@ +# Examining the data (SPSS Modeler) + +# Examining the data # + +Each record contains: + + + + * `Class`\. Product type\. + * `Cost`\. Unit price\. + * `Promotion`\. Index of amount spent on a particular promotion\. + * `Before`\. Revenue before promotion\. + * `After`\. Revenue after promotion\. + + + +The flow is simple\. It displays the data in a table\. The two revenue fields (`Before` and `After`) are expressed in absolute terms\. However, it seems likely that the increase in revenue after the promotion (and presumably as a result of it) would be a more useful figure\. + +Figure 1\. Effects of promotion on product sales + +![Effects of promotion on product sales](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_retail_data_effects.png) + +The flow also contains a node to derive this value, expressed as a percentage of the revenue before the promotion, in a field called `Increase`\. A table shows this field\. + +Figure 2\. Increase in revenue after promotion + +![Increase in revenue after promotion](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_retail_data_increase.png) + +For each class of product, and almost linear relationship exists between the increase in revenue and the cost of the promotion\. Therefore, it seems likely that a decision tree or neural network could predict, with reasonable accuracy, the increase in revenue from the other available fields\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f900078fd88e14400807e571e1f3a24c633c2dc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f900078fd88e14400807e571e1f3a24c633c2dc.md new file mode 100644 index 0000000..8b30b11 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6f900078fd88e14400807e571e1f3a24c633c2dc.md @@ -0,0 +1,9 @@ +# CLEM examples (SPSS Modeler) + +# CLEM examples # + +The example expressions in this section illustrate correct syntax and the types of expressions possible with CLEM\. + +Additional examples are discussed throughout this CLEM documentation\. See [CLEM (legacy) language reference](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_language_reference.html#clem_language_reference) for more information\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6fc8a7d53d6951306e0fd23667a802538a81d6ff.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6fc8a7d53d6951306e0fd23667a802538a81d6ff.md new file mode 100644 index 0000000..6871338 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6fc8a7d53d6951306e0fd23667a802538a81d6ff.md @@ -0,0 +1,23 @@ +# JSON content model + +# JSON content model # + +The JSON content model is used to access content stored in JSON format\. It provides a basic API to allow callers to extract values on the assumption that they know which values are to be accessed\. + + + +Methods for the JSON content model + +Table 1\. Methods for the JSON content model + +| Method | Return types | Description | +| ----------------------------------------------------------------------------------------- | ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `getJSONAsString()` | `String` | Returns the JSON content as a string\. | +| `getObjectAt( path, JSONArtifact artifact) throws Exception` | `Object` | Returns the object at the specified path\. The supplied root artifact might be null, in which case the root of the content is used\. The returned value can be a literal string, integer, real or boolean, or a JSON artifact (either a JSON object or a JSON array)\. | +| `getChildValuesAt( path, JSONArtifact artifact) throws Exception` | `Hash table (key:object, value:object>` | Returns the child values of the specified path if the path leads to a JSON object or null otherwise\. The keys in the table are strings while the associated value can be a literal string, integer, real or boolean, or a JSON artifact (either a JSON object or a JSON array)\. | +| `getChildrenAt( path path, JSONArtifact artifact) throws Exception` | `List of objects` | Returns the list of objects at the specified path if the path leads to a JSON array or null otherwise\. The returned values can be a literal string, integer, real or boolean, or a JSON artifact (either a JSON object or a JSON array)\. | +| `reset()` | `void` | Flushes any internal storage associated with this content model (for example, a cached DOM object)\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6fd8a950f1ebe6b021ea9d4c775a5ca8660a1101.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6fd8a950f1ebe6b021ea9d4c775a5ca8660a1101.md new file mode 100644 index 0000000..fa71505 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/6fd8a950f1ebe6b021ea9d4c775a5ca8660a1101.md @@ -0,0 +1,7 @@ +# Creating expressions (SPSS Modeler) + +# Creating expressions # + +The Expression Builder provides not only complete lists of fields, functions, and operators but also access to data values if your data is instantiated\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/71479786e864b942786028481e30dfb35e422ba8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/71479786e864b942786028481e30dfb35e422ba8.md new file mode 100644 index 0000000..350d0c8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/71479786e864b942786028481e30dfb35e422ba8.md @@ -0,0 +1,49 @@ +# Tracking a machine learning model + +# Tracking a machine learning model # + +Track machine learning models in an AI use case to meet governance and compliance goals\. + +## Tracking machine learning models in an AI use case ## + +Track machine learning models that are trained in a project and saved as a model asset\. You can add a machine learning model to an AI use case from a project or space\. + + + +1. Open the project or space that contains the model asset that you want to govern\. +2. From the action menu for the asset, click **Track in AI use case**\. +3. Select an existing AI use case or follow the prompts to create a new one\. +4. Choose an existing approach or create a new approach\. An approach creates a version set for all assets in the same approach\. +5. Choose a version numbering scheme\. All of the assets in an approach share a common version\. Choose from: + + + + * *Experimental* if you plan to update frequently. + * *Stable* if the assets are not changing rapidly. + * *Custom* if you want to start a new version number. Version numbering must follow a schema of major.minor.patch. + + + + + +![Tracking a model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-track-model1.png) + +Watch this video to see how to track a machine learning model in an AI use case\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +Once tracking is enabled, all collaborators for the use case can review details for the asset\. + +![Viewing a tracked model in an AI use case](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-track-model2.png) + +For a machine learning model, facts include creation details, training data used, and information from evaluation metrics\. + +![Viewing a factsheet for a tracked model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-track-model2.png) + +For details on tracking a machine learning model that is created in a Jupyter Notebook or trained with a third\-party machine learning provider, see [Tracking external models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-external-models.html)\. + +## Learn more ## + +**Parent topic:**[Tracking assets in use cases](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-tracking-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/715abfb108ed8f6361d07762656dbd0443c57904.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/715abfb108ed8f6361d07762656dbd0443c57904.md new file mode 100644 index 0000000..19a638e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/715abfb108ed8f6361d07762656dbd0443c57904.md @@ -0,0 +1,133 @@ +# Extracting targets sentiment with a custom transformer model + +# Extracting targets sentiment with a custom transformer model # + +You can train your own models for targets sentiment extraction based on the Slate IBM Foundation model\. This pretrained model can be find\-tuned for your use case by training it on your specific input data\. + +The Slate IBM Foundation model is available only in Runtime 23\.1\. + +Note: Training transformer models is CPU and memory intensive\. Depending on the size of your training data, the environment might not be large enough to complete the training\. If you run into issues with the notebook kernel during training, create a custom notebook environment with a larger amount of CPU and memory, and use that to run your notebook\. Use a GPU\-based environment for training and also inference time, if it is available to you\. See [Creating your own environment template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-customize-env-definition.html)\. + + + + * [Input data format for training](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-target-sentiment.html?context=cdpaas&locale=en#input) + * [Loading the pretrained model resources](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-target-sentiment.html?context=cdpaas&locale=en#load) + * [Training the model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-target-sentiment.html?context=cdpaas&locale=en#train) + * [Applying the model on new data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-target-sentiment.html?context=cdpaas&locale=en#apply) + * [Storing and loading the model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-target-sentiment.html?context=cdpaas&locale=en#store) + + + +## Input data format for training ## + +You must provide a training and development data set to the training function\. The development data is usually around 10% of the training data\. Each training or development sample is represented as a JSON object\. It must have a **text** and a **target\_mentions** field\. The **text** represents the training example text, and the **target\_mentions** field is an array, which contains an entry for each target mention with its **text**, **location**, and **sentiment**\. + +Consider using Watson Knowledge Studio to enable your domain subject matter experts to easily annotate text and create training data\. + +The following is an example of an array with sample training data: + + [ + { + "text": "Those waiters stare at you your entire meal, just waiting for you to put your fork down and they snatch the plate away in a second.", + "target_mentions": + { + "text": "waiters", + "location": { + "begin": 6, + "end": 13 + }, + "sentiment": "negative" + } + ] + } + ] + +The training and development data sets are created as data streams from arrays of JSON objects\. To create the data streams, you may use the utility method `read_json_to_stream`\. It requires the syntax analysis model for the language of your input data\. + +Sample code: + + import watson_nlp + from watson_nlp.toolkit.targeted_sentiment.training_data_reader import read_json_to_stream + + training_data_file = 'train_data.json' + dev_data_file = 'dev_data.json' + + # Load the syntax analysis model for the language of your input data + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + + # Prepare train and dev data streams + train_stream = read_json_to_stream(json_path=training_data_file, syntax_model=syntax_model) + dev_stream = read_json_to_stream(json_path=dev_data_file, syntax_model=syntax_model) + +## Loading the pretrained model resources ## + +The pretrained Slate IBM Foundation model needs to be loaded before passing it to the training algorithm\. + +To load the model: + + # Load the pretrained Slate IBM Foundation model + pretrained_model_resource = watson_nlp.load('pretrained-model_slate.153m.distilled_many_transformer_multilingual_uncased') + +## Training the model ## + +For all options that are available for configuring sentiment transformer training, enter: + + help(watson_nlp.blocks.targeted_sentiment.SequenceTransformerTSA.train) + +The `train` method will create a new targets sentiment block model\. + +The following is a sample call that uses the input data and pretrained model from the previous section (Training the model): + + # Train the model + custom_tsa_model = watson_nlp.blocks.targeted_sentiment.SequenceTransformerTSA.train( + train_stream, + dev_stream, + pretrained_model_resource, + num_train_epochs=5 + ) + +## Applying the model on new data ## + +After you train the model on a data set, apply the model on new data by using the `run()` method, as you would use on any of the existing pre\-trained blocks\. Because the created custom model is a block model, you need to run syntax analysis on the input text and pass the results to the `run()` methods\. + +Sample code: + + input_text = 'new input text' + + # Run syntax analysis first + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + syntax_analysis = syntax_model.run(input_text, parsers=('token',)) + + # Apply the new model on top of the syntax predictions + tsa_predictions = custom_tsa_model.run(syntax_analysis) + +## Storing and loading the model ## + +The custom targets sentiment model can be stored as any other model as described in "Loading and storing models", using `ibm_watson_studio_lib`\. + +To load the custom targets sentiment model, additional steps are required: + + + +1. Ensure that you have an access token on the **Access control** page on the **Manage** tab of your project\. Only project admins can create access tokens\. The access token can have **Viewer** or **Editor** access permissions\. Only editors can inject the token into a notebook\. +2. Add the project token to the notebook by clicking **More > Insert project token** from the notebook action bar\. Then run the cell\. + + By running the inserted hidden code cell, a `wslib` object is created that you can use for functions in the `ibm-watson-studio-lib` library. For information on the available `ibm-watson-studio-lib` functions, see [Using ibm-watson-studio-lib for Python](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html). +3. Download and extract the model to your local runtime environment: + + import zipfile + model_zip = 'custom_TSA_model_file' + model_folder = 'custom_TSA' + wslib.download_file('custom_TSA_model', file_name=model_zip) + + with zipfile.ZipFile(model_zip, 'r') as zip_ref: + zip_ref.extractall(model_folder) +4. Load the model from the extracted folder: + + custom_TSA_model = watson_nlp.load(model_folder) + + + +**Parent topic:**[Creating your own models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-create-model_cloud.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/717b697e0045b5d7dff6acc93ad5dec98e27ebdc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/717b697e0045b5d7dff6acc93ad5dec98e27ebdc.md new file mode 100644 index 0000000..b51ee31 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/717b697e0045b5d7dff6acc93ad5dec98e27ebdc.md @@ -0,0 +1,14 @@ +# Flow and SuperNode parameters + +# Flow and SuperNode parameters # + +You can define parameters for use in CLEM expressions and in scripting\. They are, in effect, user\-defined variables that are saved and persisted with the current flow or SuperNode and can be accessed from the user interface as well as through scripting\. + +If you save a flow, for example, any parameters you set for that flow are also saved\. (This distinguishes them from local script variables, which can be used only in the script in which they are declared\.) Parameters are often used in scripting to control the behavior of the script, by providing information about fields and values that don't need to be hard coded in the script\. + +You can set flow parameters in a flow script or in a flow's properties (right\-click the canvas in your flow and select Flow properties), and they're available to all nodes in the flow\. They're displayed in the Parameters list in the Expression Builder\. + +You can also set parameters for SuperNodes, in which case they're visible only to nodes encapsulated within that SuperNode\. + +Tip: For complete details about scripting, see the [Scripting and automation](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/scripting_overview.html) guide\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/718cd1a731e0f4e5abfd77519ed254b5ccc670fb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/718cd1a731e0f4e5abfd77519ed254b5ccc670fb.md new file mode 100644 index 0000000..f8ab8df --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/718cd1a731e0f4e5abfd77519ed254b5ccc670fb.md @@ -0,0 +1,20 @@ +# Forecasting with the Time Series node (SPSS Modeler) + +# Forecasting with the Time Series node # + +This example uses the flow Forecasting Bandwidth Utilization, available in the example project \. The data file is broadband\_1\.csv\. + +In SPSS Modeler, you can produce multiple time series models in a single operation\. The broadband\_1\.csv data file has monthly usage data for each of 85 local markets\. For the purposes of this example, only the first five series will be used; a separate model will be created for each of these five series, plus a total\. + +The file also includes a date field that indicates the month and year for each record\. This field will be used to label records\. The date field reads into SPSS Modeler as a string, but to use the field in SPSS Modeler you will convert the storage type to numeric Date format using a Filler node\. + +Figure 1\. Example flow to show Time Series modeling + +![Example flow to show Time Series modeling](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_bandwidth_forecast.png) + +The Time Series node requires that each series be in a separate column, with a row for each interval\. Watson Studio provides methods for transforming data to match this format if necessary\. + +Figure 2\. Monthly subscription data for broadband local markets + +![Monthly subscription data for broadband local markets](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_bandwidth_forecast_table.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/71a4244c07321f32f283e49cfd6d6afa19639744.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/71a4244c07321f32f283e49cfd6d6afa19639744.md new file mode 100644 index 0000000..9783b01 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/71a4244c07321f32f283e49cfd6d6afa19639744.md @@ -0,0 +1,94 @@ +# Teradata connection + +# Teradata connection # + +To access your data in Teradata, you must create a connection asset for it\. + +Teradata provides database and analytics\-related services and products\. + +## Supported versions ## + +Teradata databases 15\.10, 16\.10, 17\.00, 17\.10, and 17\.20 + +## Create a connection to Teradata ## + +To create the connection asset, you need the following connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Client character set: **IMPORTANT**: Do not enter a value unless you are instructed by IBM support\. The character set value overrides the Teradata JDBC drivers normal mapping of the Teradata session character sets\. Data corruption can occur if you specify the wrong character set\. If no value is specified, UTF16 is used\. + * Authentication method: Select the security mechanism to use to authenticate the user: + + + + * **TD2 (Teradata Method 2)**: Use the Teradata security mechanism. + * **LDAP**: Use an LDAP security mechanism for external authentication. + + + + * Username and password + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Teradata connections in the following workspaces and tools: + +**Projects** + + + + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [Teradata SQL documentation](https://docs.teradata.com/reader/eWpPpcMoLGQcZEoyt5AjEg/9iudpbZXGZ_rAb7c6PL54g) for the correct syntax\. + +## Learn more ## + + + + * [Teradata documentation](https://docs.teradata.com/) + * [Teradata Community](https://support.teradata.com/community) + + + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + +*Teradata JDBC Driver 17\.00\.00\.03 Copyright (C) 2023 by Teradata\. All rights reserved\. IBM provides embedded usage of the Teradata JDBC Driver under license from Teradata solely for use as part of the IBM Watson service offering\.* + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/71c98b1ae9bb65177c030cf1de6760d41b7d7df5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/71c98b1ae9bb65177c030cf1de6760d41b7d7df5.md new file mode 100644 index 0000000..69cd46b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/71c98b1ae9bb65177c030cf1de6760d41b7d7df5.md @@ -0,0 +1,30 @@ +# Firewall access for Cloud Object Storage + +# Firewall access for Cloud Object Storage # + +Private IP addresses are required when IBM watsonx and Cloud Object Storage are located on the same network\. When creating a connection to a Cloud Object Storage bucket that is protected by a firewall on the same network as IBM watsonx, the connector automatically maps to private IP addresses for IBM watsonx\. The private IP addresses must be added to a **Bucket access policy** to allow inbound connections from IBM watsonx\. + +Follow these steps to search the private IP addresses for the IBM watsonx cluster and add them to the **Bucket access policy**: + + + +1. Go to the **Administration > Cloud integrations** page\. +2. Click the **Firewall configuration** link to view the list of IP ranges used by IBM watsonx\. +3. Choose **Include private IPs** to view the private IP addresses for the IBM watsonx cluster\. ![A list of private IP addresses for the IBM watsonx cluster](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/images/ip-ranges-private.png) +4. From your IBM Cloud Object Storage instance on IBM Cloud, open the **Buckets** list and choose the Bucket for the connection\. +5. Copy each of the private IP ranges listed and paste them into the **Buckets > Permissions > IP address** field on IBM Cloud\. ![A list of permitted private IP addresses for the IBM watsonx cluster](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/images/bucket-ips.png) + + + +## Learn more ## + + + + * [IBM Cloud Object Storage connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html) + * [IBM Cloud docs: Setting a firewall](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-setting-a-firewall#firewall) + + + +**Parent topic:**[Configuring firewall access](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall_ovrvw.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/720712d40bfdef5974c7c025a6ac0d0649124b79.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/720712d40bfdef5974c7c025a6ac0d0649124b79.md new file mode 100644 index 0000000..0d6bfdd --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/720712d40bfdef5974c7c025a6ac0d0649124b79.md @@ -0,0 +1,31 @@ +# kmeansasnode properties + +# kmeansasnode properties # + +![K\-Means\-AS node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/sparkkmeansasnodeicon.png)K\-Means is one of the most commonly used clustering algorithms\. It clusters data points into a predefined number of clusters\. The K\-Means\-AS node in SPSS Modeler is implemented in Spark\. For details about K\-Means algorithms, see [https://spark\.apache\.org/docs/2\.2\.0/ml\-clustering\.html](https://spark.apache.org/docs/2.2.0/ml-clustering.html)\. Note that the K\-Means\-AS node performs one\-hot encoding automatically for categorical variables\. + + + +kmeansasnode properties + +Table 1\. kmeansasnode properties + +| `kmeansasnode` Properties | Values | Property description | +| ------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | +| `roleUse` | *string* | Specify `predefined` to use predefined roles, or `custom` to use custom field assignments\. Default is `predefined`\. | +| `autoModel` | *Boolean* | Specify `true` to use the default name (`$S-prediction`) for the new generated scoring field, or `false` to use a custom name\. Default is `true`\. | +| `features` | *field* | List of the field names for input when the `roleUse` property is set to `custom`\. | +| `name` | *string* | The name of the new generated scoring field when the `autoModel` property is set to `false`\. | +| `clustersNum` | *integer* | The number of clusters to create\. Default is `5`\. | +| `initMode` | *string* | The initialization algorithm\. Possible values are `k-means||` or `random`\. Default is `k-means||`\. | +| `initSteps` | *integer* | The number of initialization steps when `initMode` is set to `k-means||`\. Default is `2`\. | +| `advancedSettings` | *Boolean* | Specify `true` to make the following four properties available\. Default is `false`\. | +| `maxIteration` | *integer* | Maximum number of iterations for clustering\. Default is `20`\. | +| `tolerance` | *string* | The tolerance to stop the iterations\. Possible settings are `1.0E-1`, `1.0E-2`, \.\.\., `1.0E-6`\. Default is `1.0E-4`\. | +| `setSeed` | *Boolean* | Specify `true` to use a custom random seed\. Default is `false`\. | +| `randomSeed` | *integer* | The custom random seed when the `setSeed` property is `true`\. | +| `displayGraph` | *Boolean* | Select this option if you want a graph to be included in the output\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/722d44681192f1766a0b1bacc328e719526e8de2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/722d44681192f1766a0b1bacc328e719526e8de2.md new file mode 100644 index 0000000..87f3a02 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/722d44681192f1766a0b1bacc328e719526e8de2.md @@ -0,0 +1,71 @@ +# Batch deployment input details for Decision Optimization models + +# Batch deployment input details for Decision Optimization models # + +Follow these rules when you are specifying input details for batch deployments of Decision Optimization models\. + +Data type summary table: + + + +| Data | Description | +| ------------ | ------------------------------------------------------- | +| Type | inline and data references | +| File formats | Refer to [Model input and output data file formats](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/ModelIODataDefn.html)\. | + + + +## Data sources ## + +Input/output inline data: + + + + * Inline input data is converted to CSV files and used by the engine\. + * CSV output data is converted to output inline data\. + * Base64\-encoded raw data is supported as input and output\. + + + +Input/output data references: + + + + * Tabular data is loaded from CSV, XLS, XLSX, JSON files or database data sources supported by the WDP connection library, converted to CSV files, and used by the engine\. + * CSV output data is converted to tabular data and saved to CSV, XLS, XLSX, JSON files, or database data sources supported by the WDP connection library\. + * Raw data can be loaded and saved from or to any file data sources that are supported by the WDP connection library\. + * No support for compressed files\. + * The environment variables parameter of deployment jobs is not applicable\. + + + +If you are specifying input/output data references programmatically: + + + + * Data source reference `type` depends on the asset type\. Refer to the **Data source reference types** section in [Adding data assets to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + * For S3 or Db2, connection details must be specified in the `input_data_references.connection` parameter, in the deployment job’s payload\. + * For S3 or Db2, location details such as table name, bucket name, or path must be specified in the `input_data_references.location.path` parameter, in the deployment job’s payload\. + * For `data_asset`, a managed asset can be updated or created\. For creation, you can set the name and description for the created asset\. + * You can use a pattern in ID or connection properties\. For example, see the following code snippet: + + + + * To collect all output CSV as inline data: + + "output_data": [ { "id":".*\.csv"}] + * To collect job output in a particular S3 folder: + + "output_data_references": [ {"id":".*", "type": "s3", "connection": {...}, "location": { "bucket": "do-wml", "path": "${job_id}/${attachment_name}" }}] + + + + + +Note:Support for `s3` and `db2` values for `scoring.input_data_references.type` and `scoring.output_data_references.type` is deprecated and will be removed in the future\. Use `connection_asset` or `data_asset` instead\. See the documentation for the Watson Machine Learning [REST API](https://cloud.ibm.com/apidocs/machine-learning) or Watson Machine Learning [Python client library](https://ibm.github.io/watson-machine-learning-sdk/)\{: new\_window\} for details and examples\. + +For more information, see [Model input and output data adaptation](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/ModelIODataDefn.html)\. + +**Parent topic:**[Batch deployment input details by framework](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-by-framework.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/723fd865c01f3ac097e03b74f7d81d574a1a13d4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/723fd865c01f3ac097e03b74f7d81d574a1a13d4.md new file mode 100644 index 0000000..32e49ec --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/723fd865c01f3ac097e03b74f7d81d574a1a13d4.md @@ -0,0 +1,25 @@ +# simfitnode properties + +# simfitnode properties # + +![Sim Fit node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/simfitnodeicon.png)The Simulation Fitting (Sim Fit) node examines the statistical distribution of the data in each field and generates (or updates) a Simulation Generate node, with the best fitting distribution assigned to each field\. The Simulation Generate node can then be used to generate simulated data\. + + + +simfitnode properties + +Table 1\. simfitnode properties + +| `simfitnode` properties | Data type | Property description | +| ------------------------ | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `custom_gen_node_name` | *boolean* | You can generate the name of the generated (or updated) Simulation Generate node automatically by selecting Auto\. | +| `gen_node_name` | *string* | Specify a custom name for the generated (or updated) node\. | +| `used_cases_type` | *string* | Specifies the number of cases to use when fitting distributions to the fields in the data set\. Use `AllCases` or `FirstNCases`\. | +| `used_cases` | *integer* | The number of cases | +| `good_fit_type` | *string* | For continuous fields, specify either the `AnderDarling` test or the `KolmogSmirn` test of goodness of fit to rank distributions when fitting distributions to the fields\. | +| `bins` | *integer* | For continuous fields, the Empirical distribution is the cumulative distribution function of the historical data\. | +| `frequency_weight_field` | *field* | Specify the weight field if your data set contains one\. The weight field is then excluded from the distribution fitting process\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/726175290d457b10a02c27f08eca1f6546e64680.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/726175290d457b10a02c27f08eca1f6546e64680.md new file mode 100644 index 0000000..535c611 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/726175290d457b10a02c27f08eca1f6546e64680.md @@ -0,0 +1,25 @@ +# Python DOcplex models + +# Python DOcplex models # + +You can solve Python DOcplex models in a Decision Optimization experiment\. + +The Decision Optimization environment currently supports Python 3\.10\. The default version is Python 3\.10\. You can modify this default version on the Environment tab of the [Run configuration pane](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface__section_runconfig) or from the [Overview](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface__section_overview) information pane\. + +The basic workflow to create a Python DOcplex model in Decision Optimization, and examine it under different scenarios, is as follows: + + + +1. Create a project\. +2. Add data to the project\. +3. Add a Decision Optimization experiment (a scenario is created by default in the experiment UI)\. +4. Select and import your data into the scenario\. +5. Create or import your Python model\. +6. Run the model to solve it and explore the solution\. +7. Copy the scenario and edit the data in the context of the new scenario\. +8. Solve the new scenario to see the impact of the changes to data\. + + + +![Workflow showing previously mentioned steps](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/images/new_overviewcognitive-3.jpg) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7292de7c0036b9064a85d1da77a860bd989ea638.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7292de7c0036b9064a85d1da77a860bd989ea638.md new file mode 100644 index 0000000..404098c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7292de7c0036b9064a85d1da77a860bd989ea638.md @@ -0,0 +1,27 @@ +# Setting the field role (SPSS Modeler) + +# Setting the field role # + +A field's role controls how it's used in model building—for example, whether a field is an input or target (the thing being predicted)\. + +Note: The Partition, Frequency, and Record ID roles can each be applied to a single field only\. + +The following roles are available: + +Input\. The field is used as an input to machine learning (a predictor field)\. + +Target\. The field is used as an output or target for machine learning (one of the fields that the model will try to predict)\. + +Both\. The field is used as both an input and an output by the Apriori node\. All other modeling nodes will ignore the field\. + +None\. The field is ignored by machine learning\. Fields whose measurement level is set to Typeless are automatically set to None in the Role column\. + +Partition\. Indicates a field used to partition the data into separate samples for training, testing, and (optional) validation purposes\. The field must be an instantiated set type with two or three possible values (as defined in the advanced settings by clicking the gear icon)\. The first value represents the training sample, the second represents the testing sample, and the third (if present) represents the validation sample\. Any additional values are ignored, and flag fields can't be used\. Note that to use the partition in an analysis, partitioning must be enabled in the node settings of the appropriate model\-building or analysis node\. Records with null values for the partition field are excluded from the analysis when partitioning is enabled\. If you defined multiple partition fields in the flow, you must specify a single partition field in the node settings for each applicable modeling node\. If a suitable field doesn't already exist in your data, you can create one using a Partition node or Derive node\. See [Partition node](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/partition.html) for more information\. + +Split\. (Nominal, ordinal, and flag fields only\.) Specifies that a model is built for each possible value of the field\. + +Frequency\. (Numeric fields only\.) Setting this role enables the field value to be used as a frequency weighting factor for the record\. This feature is supported by C&R Tree, CHAID, QUEST, and Linear nodes only; all other nodes ignore this role\. Frequency weighting is enabled by means of the Use frequency weight option in the node settings of those modeling nodes that support the feature\. + +Record ID\. The field is used as the unique record identifier\. This feature is ignored by most nodes; however, it's supported by Linear models\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/72b9ec702c95ac86de08e0fb8f8c3404b1228b5f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/72b9ec702c95ac86de08e0fb8f8c3404b1228b5f.md new file mode 100644 index 0000000..05ad01f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/72b9ec702c95ac86de08e0fb8f8c3404b1228b5f.md @@ -0,0 +1,32 @@ +# Integrations with other cloud platforms + +# Integrations with other cloud platforms # + +You can integrate IBM watsonx with other cloud platforms to configure access to the data source services on that platform\. Then, users can easily create connections to those data source services and access the data in those data sources\. + +You need to be the Account Owner or Administrator for the IBM Cloud account to configure integrations with other cloud platforms\. + +You must have the proper permissions in your cloud platform subscription before you can configure an integration\. If you are using Amazon Web Services (AWS) Redshift (or other AWS data sources) or Microsoft Azure, you must also configure firewall access to allow IBM watsonx to access data\. + +After you configure integration and firewall access with another cloud platform, you can access and connect to the services on that platform: + + + + * The service instances for that platform are shown on the **Service instances** page\. From the main menu, choose **Administration > Services > Services instances**\. Each cloud platform that you integrate with has its own page\. + * The data source services in that platform are shown when you create a connection\. Start adding a connection in a project, catalog, or other workspace\. When the **Add connection** page appears, click the **To service** tab\. The services are listed by cloud platform\. + + + +You can configure integrations with these cloud platforms: + + + + * [Amazon Web Services (AWS)](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/int-aws.html) + * [Microsoft Azure](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/int-azure.html) + * [Google Cloud Platform (GCP)](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/int-google.html) + + + +**Parent topic:**[Services and integrations](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/svc-int.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/731b218e6e141e88f850b673227ab3c4df19392e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/731b218e6e141e88f850b673227ab3c4df19392e.md new file mode 100644 index 0000000..f2bc61b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/731b218e6e141e88f850b673227ab3c4df19392e.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Prompt injection # + +![icon for robustness risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-robustness.svg)Risks associated with inputInferenceRobustnessNew + +### Description ### + +A prompt injection attack forces a model to produce unexpected output due to the structure or information contained in prompts\. + +### Why is prompt injection a concern for foundation models? ### + +Injection attacks can be used to alter model behavior and benefit the attacker\. If not properly controlled, business entities could face fines, reputational harm, and other legal consequences\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7394b97da7b0846274940f439675051521a7dd7c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7394b97da7b0846274940f439675051521a7dd7c.md new file mode 100644 index 0000000..b9b3601 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7394b97da7b0846274940f439675051521a7dd7c.md @@ -0,0 +1,70 @@ +# Exponential smoothing (SPSS Modeler) + +# Exponential smoothing # + +Building a best\-fit exponential smoothing model involves determining the model type (whether the model needs to include trend, seasonality, or both) and then obtaining the best\-fit parameters for the chosen model\. + +The plot of men's clothing sales over time suggested a model with both a linear trend component and a multiplicative seasonality component\. This implies a Winters' model\. First, however, we will explore a simple model (no trend and no seasonality) and then a Holt's model (incorporates linear trend but no seasonality)\. This will give you practice in identifying when a model is not a good fit to the data, an essential skill in successful model building\. + +We'll start with a simple exponential smoothing model\. + + + +1. Add a Time Series node and attach it to the Type node\. Double\-click the node to edit its properties\. +2. Under OBSERVATIONS AND TIME INTERVAL, select `date` as the time/date field\. +3. Select Months as the time interval\. + + Figure 1. Setting the time interval + + ![Setting the time interval](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_forecast_timedate.png) +4. Under BUILD OPTIONS \- GENERAL, select Exponential Smoothing for the Method\. +5. Set Model Type to Simple\. Click Save\. + + Figure 2. Setting the method + + ![Setting the method](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_forecast_smoothing.png) +6. Run the flow to create the model nugget\. +7. Attach a Time Plot node to the model nugget\. +8. Under Plot, add the fields `men` and `$TS-men` to the Series list\. +9. Select the option Use custom x axis field label and select the `date` field\. +10. Deselect the Display series in separate panel and Normalize options\. Click Save\. + + Figure 3. Setting the plot options + + ![Setting the plot options](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_forecast_smoothing_plot.png) +11. Run the flow and then open the output\.The men plot represents the actual data, while $TS\-men denotes the time series model\. + + Figure 4. Simple exponential smoothing model + + ![Simple exponential smoothing model](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_forecast_smoothing_chart.png) + + Although the simple model does, in fact, exhibit gradual (and rather ponderous) upward trend, it takes no account of seasonality. You can safely reject this model. + + Now let's try a Holt's linear model. This should at least model the trend better than the simple model, although it too is unlikely to capture the seasonality. +12. Double\-click the Time Series node\. Under BUILD OPTIONS \- GENERAL, with Exponential Smoothing still selected as the method, select HoltsLinearTrend as the model type\. +13. Click Save and run the flow again to regenerate the model nugget\. Open the output\. + + Figure 5. Holt's linear trend model + + ![Holt's linear trend model](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_forecast_smoothing_holtchart.png) + + Holt's model displays a smoother upward trend than the simple model, but it still takes no account of the seasonality, so you can disregard this one too. + + You may recall that the initial plot of men's clothing sales over time suggested a model incorporating a linear trend and multiplicative seasonality. A more suitable candidate, therefore, might be Winters' model. +14. Double\-click the Time Series node again to edit its properties\. +15. Under BUILD OPTIONS \- GENERAL, with Exponential Smoothing still selected as the method, select WintersMultiplicative as the model type\. +16. Run the flow\. + + Figure 6. Winters' multiplicative model + + ![Winters' multiplicative model](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_forecast_smoothing_winterschart.png) + + This looks better. The model reflects both the trend and the seasonality of the data. The dataset covers a period of 10 years and includes 10 seasonal peaks occurring in December of each year. The 10 peaks present in the predicted results match up well with the 10 annual peaks in the real data. + + However, the results also underscore the limitations of the Exponential Smoothing procedure. Looking at both the upward and downward spikes, there is significant structure that's not accounted for. + + If you're primarily interested in modeling a long-term trend with seasonal variation, then exponential smoothing may be a good choice. To model a more complex structure such as this one, we need to consider using the ARIMA procedure. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/73defa42948bbe878834ca4b7c9b0395f44b9b90.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/73defa42948bbe878834ca4b7c9b0395f44b9b90.md new file mode 100644 index 0000000..3b0368e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/73defa42948bbe878834ca4b7c9b0395f44b9b90.md @@ -0,0 +1,101 @@ +# Decision Optimization REST API changing Python version in deployed model + +# Changing Python version for an existing deployed model with the REST API # + +You can update an existing Decision Optimization model using the Watson Machine Learning REST API\. This can be useful, for example, if in your model you have explicitly specified a Python version that has now become deprecated\. + +## Procedure ## + +To change Python version for an existing deployed model: + + + +1. Create a **revision to your Decision Optimization model** + + All API requests require a version parameter that takes a date in the format `version=YYYY-MM-DD`. This code example posts a model that uses the file `update_model.json`. The URL will vary according to the chosen region/location for your machine learning service. + + curl --location --request POST \ + "https://us-south.ml.cloud.ibm.com/ml/v4/models/MODEL-ID-HERE/revisions?version=2021-12-01" \ + -H "Authorization: bearer TOKEN-HERE" \ + -H "Content-Type: application/json" \ + -d @revise_model.json + + The revise\_model.json file contains the following code: + + { + "commit_message": "Save current model", + "space_id": "SPACE-ID-HERE" + } + + Note the model revision number "`rev`" that is provided in the output for use in the next step. +2. Update an existing deployment so that current jobs will not be impacted: + + curl --location --request PATCH \ + "https://us-south.ml.cloud.ibm.com/ml/v4/deployments/DEPLOYMENT-ID-HERE?version=2021-12-01&space_id=SPACE-ID-HERE" \ + -H "Authorization: bearer TOKEN-HERE" \ + -H "Content-Type: application/json" \ + -d @revise_deploy.json + + The revise\_deploy.json file contains the following code: + + [ + { + "op": "add", + "path": "/asset", + "value": { + "id":"MODEL-ID-HERE", + "rev":"MODEL-REVISION-NUMBER-HERE" + } + } + ] +3. Patch an existing model to explicitly specify Python version 3\.10 + + curl --location --request PATCH \ + "https://us-south.ml.cloud.ibm.com/ml/v4/models/MODEL-ID-HERE?rev=MODEL-REVISION-NUMBER-HERE&version=2021-12-01&space_id=SPACE-ID-HERE" \ + -H "Authorization: bearer TOKEN-HERE" \ + -H "Content-Type: application/json" \ + -d @update_model.json + + The update\_model.json file, with the default *Python version* stated explicitly, contains the following code: + + [ + { + "op": "add", + "path": "/custom", + "value": { + "decision_optimization":{ + "oaas.docplex.python": "3.10" + } + } + } + ] + + Alternatively, to remove any explicit mention of a Python version so that the default version will always be used: + + [ + { + "op": "remove", + "path": "/custom/decision_optimization" + } + ] +4. Patch the deployment to use the model that was created for Python to use version 3\.10 + + curl --location --request PATCH \ + "https://us-south.ml.cloud.ibm.com/ml/v4/deployments/DEPLOYMENT-ID-HERE?version=2021-12-01&space_id=SPACE-ID-HERE" \ + -H "Authorization: bearer TOKEN-HERE" \ + -H "Content-Type: application/json" \ + -d @update_deploy.json + + The update\_deploy.json file contains the following code: + + [ + { + "op": "add", + "path": "/asset", + "value": { "id":"MODEL-ID-HERE"} + } + ] + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/73f96a06142ee17a6c55e5700580f33250552a00.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/73f96a06142ee17a6c55e5700580f33250552a00.md new file mode 100644 index 0000000..4ed212f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/73f96a06142ee17a6c55e5700580f33250552a00.md @@ -0,0 +1,71 @@ +# Data imputation in AutoAI experiments + +# Data imputation in AutoAI experiments # + +Data imputation is the means of replacing missing values in your data set with substituted values\. If you enable imputation, you can specify how missing values are interpolated in your data\. + +## Imputation by experiment type ## + +Imputation methods depend on the type of experiment that you build\. + + + + * For classification and regression you can configure categorical and numerical imputation methods\. + * For timeseries problems, you can choose from a set of imputation methods to apply to numerical columns\. When the experiment runs, the best performing method from the set is applied automatically\. You can also specify a specific value as a replacement value\. + + + +## Enabling imputation ## + +To view and set imputation options: + + + +1. Click **Experiment settings** when you configure your experiment\. +2. Click the **Data source** option\. +3. Click **Enable data imputation**\. Note that if you do not explicitly enable data imputation but your data source has missing values, AutoAI warns you and applies default imputation methods\. See [imputation details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-data-imp-details.html)\. +4. Select options in the Imputation section\. +5. Optionally set a threshold for the percentage of imputation acceptable for a column of data\. If the percentage of missing values exceeds the specified threshold, the experiment fails\. To resolve, update the data source or adjust the threshold\. + + + +## Configuring imputation for classification and regression experiments ## + +Choose one of these methods for imputing missing data in binary classification, multiclass classification, or regression experiments\. Note that you can have one method for completing values for text\-based (categorical) data and another for numerical data\. + + + +| Method | Description | +| ------------- | --------------------------------------------------------------------------------- | +| Most frequent | Replace missing value with the value that appears most frequently in the column\. | +| Median | Replace missing value with the value in the middle of the sorted column\. | +| Mean | Replace missing value with the average value for the column\. | + + + +## Configuring imputation for timeseries experiments ## + +Choose some or all of these methods\. When multiple methods are selected, the best\-performing method is automatically applied for the experiment\. + +Note: Imputation is not supported for date or time values\. + + + +| Method | Description | +| ----------------- | -------------------------------------------------------------------------------------------------------- | +| Cubic | Uses cubic interpolation by using pandas/scipy method to fill missing values\. | +| Fill | Choose *value* as the type to replace the missing values with a numeric value you specify\. | +| Flatten iterative | Data is first flattened and then the Scikit\-learn iterative imputer is applied to find missing values\. | +| Linear | Use linear interpolation by using pandas/scipy method to fill missing values\. | +| Next | Replace missing value with the next value\. | +| Previous | Replace missing value with the previous value\. | + + + +## Next steps ## + +[Data imputation implementation details for time series experiments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-data-imp-details.html) + +**Parent topic:**[AutoAI overview](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7434988303bf295c1586c5ee42100e8af244859c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7434988303bf295c1586c5ee42100e8af244859c.md new file mode 100644 index 0000000..d494d06 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7434988303bf295c1586c5ee42100e8af244859c.md @@ -0,0 +1,44 @@ +# Reusing category sets in Text Analytics Workbench (SPSS Modeler) + +# Reusing custom category sets # + +You can customize a category set in Text Analytics Workbench and then download it to use in other SPSS Modeler flows\. + +## Procedure ## + + + +1. Optional: Customize the category set\. + + + + 1. Select a category to customize. + 2. To add descriptors, click the Descriptors tab and then drag-and-drop from the Descriptors tab into categories to add them. + + + +2. Download the customized category set\. + + + + 1. From the Text Analytics Workbench, go to the Categories tab. + 2. Click the Options icon and select Download category set. + 3. Give the category set a name and click Download. + + + +3. Add the category set to another Text Mining node\. + + + + 1. In a different flow session, go to the Categories tab in the Text Analytics Workbench. + 2. Click the Options icon and select Add category set. + 3. Browse to or drag-and-drop your category set. + 4. Choose whether to replace the existing category set in the Text Mining node or to append your category set to the existing one. You can preview the final category set based on your choices. + 5. Click Create. + + + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7436f8933ca1dd44e05cd59f8e2cb13052763643.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7436f8933ca1dd44e05cd59f8e2cb13052763643.md new file mode 100644 index 0000000..8d2bded --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7436f8933ca1dd44e05cd59f8e2cb13052763643.md @@ -0,0 +1,13 @@ +# Date, time, timestamp (SPSS Modeler) + +# Date, time, timestamp # + +For operations that use **date**, **time**, or **timestamp** type data, the value is converted to the real value based on the value `1970-01-01:00:00:00` (using Coordinated Universal Time)\. + +For the **date**, the value represents the number of days, based on the value `1970-01-01` (using Coordinated Universal Time)\. + +For the **time**, the value represents the number of seconds at 24 hours\. + +For the **timestamp**, the value represents the number of seconds based on the value `1970-01-01:00:00:00` (using Coordinated Universal Time)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/74706148818bd2ace30029492dd8ad7d47283edc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/74706148818bd2ace30029492dd8ad7d47283edc.md new file mode 100644 index 0000000..8f02348 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/74706148818bd2ace30029492dd8ad7d47283edc.md @@ -0,0 +1,7 @@ +# User Input node (SPSS Modeler) + +# User Input node # + +The User Input node provides an easy way for you to create synthetic data\-\-either from scratch or by altering existing data\. This is useful, for example, when you want to create a test dataset for modeling\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/751abcab00f67c93c253ec74d686e2cfcc0062ad.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/751abcab00f67c93c253ec74d686e2cfcc0062ad.md new file mode 100644 index 0000000..253dc1a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/751abcab00f67c93c253ec74d686e2cfcc0062ad.md @@ -0,0 +1,29 @@ +# Troubleshooting Data Refinery + +# Troubleshooting Data Refinery # + +Use this information to resolve questions about using Data Refinery\. + + + + * [Cannot refine data from an Excel data asset](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/ts_index.html?context=cdpaas&locale=en#dr-excel) + * [Data Refinery flow job fails with a large data asset](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/ts_index.html?context=cdpaas&locale=en#bigdata-dr) + + + +## Cannot refine data from an Excel data asset ## + +The Data Refinery flow might fail if it cannot read the data\. Confirm the format of the Excel file\. By default, the first line of the file is treated as the header\. You can change this setting in the Flow settings ![settings icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/settings.png)\. Go to the **Source data sets** tab and click the overflow menu (![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png)) next to the data source, and select **Edit format**\. You can also specify the first line property, which designates which row is the first row in the data set to be read\. Changing these properties affects how the data is displayed in Data Refinery as well as the Data Refinery job run and flow output\. + +## Data Refinery flow job fails with a large data asset ## + +If your Data Refinery flow job fails with a large data asset, try these troubleshooting tips to fix the problem: + + + + * Instead of using a project data asset as the target of the Data Refinery flow (default), use Cloud storage\. For example, IBM Cloud Object Storage, Amazon S3, or Google Cloud Storage\. + * Select a **Spark & R** environment for the Data Refinery flow job or create a new **Spark & R** environment template\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/752d982c2f694ffee2a312cea6adf22c2384d4b2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/752d982c2f694ffee2a312cea6adf22c2384d4b2.md new file mode 100644 index 0000000..95c8ab8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/752d982c2f694ffee2a312cea6adf22c2384d4b2.md @@ -0,0 +1,129 @@ +# Retrieval-augmented generation + +# Retrieval\-augmented generation # + +You can use foundation models in IBM watsonx\.ai to generate factually accurate output that is grounded in information in a knowledge base by applying the retrieval\-augmented generation pattern\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +**Video chapters** +\[ 0:08 \] Scenario description +\[ 0:27 \] Overview of pattern +\[ 1:03 \] Knowledge base +\[ 1:22 \] Search component +\[ 1:41 \] Prompt augmented with context +\[ 2:13 \] Generating output +\[ 2:31 \] Full solution +\[ 2:55 \] Considerations for search +\[ 3:58 \] Considerations for prompt text +\[ 5:01 \] Considerations for explainability + +## Providing context in your prompt improves accuracy ## + +Foundation models can generate output that is factually inaccurate for various reasons\. One way to improve the accuracy of generated output is to provide the needed facts as context in your prompt text\. + +### Example ### + +The following prompt includes context to establish some facts: + + Aisha recently painted the kitchen yellow, which is her favorite color. + + Aisha's favorite color is + +Unless Aisha is a famous person whose favorite color was mentioned in many online articles that are included in common pretraining data sets, without the context at the beginning of the prompt, no foundation model could reliably generate the correct completion of the sentence at the end of the prompt\. + +If you prompt a model with text that includes fact\-filled context, then the output the model generates is more likely to be accurate\. For more details, see [Generating factually accurate output](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-factual-accuracy.html)\. + +## The retrieval\-augmented generation pattern ## + +You can scale out the technique of including context in your prompts by using information in a knowledge base\. + +The following diagram illustrates the retrieval\-augmented generation pattern\. Although the diagram shows a question\-answering example, the same workflow supports other use cases\. + +![Diagram that shows adding search results to the input for retrieval\-augmented generation](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fm-rag.png) + +The retrieval\-augmented generation pattern involves the following steps: + + + +1. Search in your knowledge base for content that is related to the user's input\. +2. Pull the most relevant search results into your prompt as context and add an instruction, such as “Answer the following question by using only information from the following passages\.” +3. *Only if the foundation model that you're using is not instruction\-tuned*: Add a few examples that demonstrate the expected input and output format\. +4. Send the combined prompt text to the model to generate output\. + + + +### The origin of retrieval\-augmented generation ### + +The term *retrieval\-augmented generation* (RAG) was introduced in this paper: [Retrieval\-augmented generation for knowledge\-intensive NLP tasks](https://arxiv.org/abs/2005.11401)\. + +> We build RAG models where the parametric memory is a pre\-trained seq2seq transformer, and the non\-parametric memory is a dense vector index of Wikipedia, accessed with a pre\-trained neural retriever\. + +In that paper, the term "RAG models" refers to a specific implementation of a *retriever* (a specific query encoder and vector\-based document search index) and a *generator* (a specific pre\-trained, generative language model)\. However, the basic search\-and\-generate approach can be generalized to use different retriever components and foundation models\. + +### Knowledge base ### + +The knowledge base can be any collection of information\-containing artifacts, such as: + + + + * Process information in internal company wiki pages + * Files in GitHub (in any format: Markdown, plain text, JSON, code) + * Messages in a collaboration tool + * Topics in product documentation + * Text passages in a database like Db2 + * A collection of legal contracts in PDF files + * Customer support tickets in a content management system + + + +### Retriever ### + +The retriever can be any combination of search and content tools that reliably returns relevant content from the knowledge base: + + + + * Search tools like IBM Watson Discovery + * Search and content APIs (GitHub has APIs like this, for example) + * Vector databases (such as chromadb) + + + +### Generator ### + +The generator component can use any model in watsonx\.ai, whichever one suits your use case, prompt format, and content you are pulling in for context\. + +## Examples ## + +The following examples demonstrate how to apply the retrieval\-augmented generation pattern\. + + + +Retrieval\-augmented generation examples + +| Example | Description | Link | +| ----------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Simple introduction | Uses a small knowledge base and a simple search component to demonstrate the basic pattern\. | [Introduction to retrieval\-augmented generation](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/fed7cf6b-1c48-4d71-8c04-0fce0e000d43) | +| Introduction to RAG with Discovery | Contains the steps and code to demonstrate the retrieval\-augmented generation pattern in IBM watsonx\.ai by using IBM Watson Discovery as the search component\. | [Simple introduction to retrieval\-augmented generation with watsonx\.ai and Discovery](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/ba4a9e35-2091-49d3-9364-a1284afab7ec) | +| Real\-world example | The watsonx\.ai documentation has a search\-and\-answer feature that can answer basic what\-is questions by using the topics in the documentation as a knowledge base\. | [Answering watsonx\.ai questions using a foundation model](https://ibm.biz/watsonx-llm-search) | +| Example with LangChain | Contains the steps and code to demonstrate support of retrieval\-augumented generation with LangChain in watsonx\.ai\. It introduces commands for data retrieval, knowledge base building and querying, and model testing\. | [Use watsonx and LangChain to answer questions by using RAG](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/d3a5f957-a93b-46cd-82c1-c8d37d4f62c6) | +| Example with LangChain and an Elasticsearch vector database | Demonstrates how to use LangChain to apply an embedding model to documents in an Elasticsearch vector database\. The notebook then indexes and uses the data store to generate answers to incoming questions\. | [Use watsonx, Elasticsearch, and LangChain to answer questions (RAG)](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/ebeb9fc0-9844-4838-aff8-1fa1997d0c13?context=wx&audience=wdp) | +| Example with the Elasticsearch Python SDK | Demonstrates how to use the Elasticsearch Python SDK to apply an embedding model to documents in an Elasticsearch vector database\. The notebook then indexes and uses the data store to generate answers to incoming questions\. | [Use watsonx, and Elasticsearch Python SDK to answer questions (RAG)](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/bdbc8ad4-9c1f-460f-99ee-5c3a1f374fa7?context=wx&audience=wdp) | +| Example with LangChain and a SingleStore database | Shows you how to apply retrieval\-augmented generation to large language models in watsonx by using the SingleStore database\. | [RAG with SingleStore and watsonx](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/daf645b2-281d-4969-9292-5012f3b18215) | + + + +## Learn more ## + +Try these tutorials: + + + + * [Prompt a foundation model by using Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html) + * [Prompt a foundation model with the retrieval\-augmented generation pattern](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html) + + + +**Parent topic:**[Foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7551cb2bcd77b26ae0e05154a3e8cc51c070d707.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7551cb2bcd77b26ae0e05154a3e8cc51c070d707.md new file mode 100644 index 0000000..e419cab --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7551cb2bcd77b26ae0e05154a3e8cc51c070d707.md @@ -0,0 +1,77 @@ +# Apache Derby connection + +# Apache Derby connection # + +To access your data in Apache Derby, create a connection asset for it\. + +Apache Derby is a relational database management system developed by the Apache Software Foundation\. + +## Create a connection to Apache Derby ## + +To create the connection asset, you need these connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Username and password + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Apache Derby connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Apache Derby setup ## + +[Apache Derby installation](https://db.apache.org/derby/papers/DerbyTut/install_software.html#derby_download) + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [Apache Derby documentation](https://db.apache.org/derby/docs/10.8/ref/index.html) for the correct syntax\. + +## Learn more ## + +[Apache Derby documentation](https://db.apache.org/derby/papers/DerbyTut/install_software.html#derby) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7566f3896a5ac6f89f4e7e18dc21b4a6a63864b4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7566f3896a5ac6f89f4e7e18dc21b4a6a63864b4.md new file mode 100644 index 0000000..8f45f35 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7566f3896a5ac6f89f4e7e18dc21b4a6a63864b4.md @@ -0,0 +1,29 @@ +# cplexoptnode properties + +# cplexoptnode properties # + +![CPLEX Optimization node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/cplexnodeicon.png) The CPLEX Optimization node provides the ability to use complex mathematical (CPLEX) based optimization via an Optimization Programming Language (OPL) model file\. + + + +cplexoptnode properties + +Table 1\. cplexoptnode properties + +| `cplexoptnode` properties | Data type | Property description | +| ------------------------------------ | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `opl_model_text` | *string* | The OPL (Optimization Programming Language) script program that the CPLEX Optimization node will run and then generate the optimization result\. | +| `opl_tuple_set_name` | *string* | The tuple set name in the OPL model that corresponds to the incoming data\. This isn't required and is normally not set via script\. It should only be used for editing field mappings of a selected data source\. | +| `data_input_map` | *List of structured properties* | The input field mappings for a data source\. This isn't required and is normally not set via script\. It should only be used for editing field mappings of a selected data source\. | +| `md_data_input_map` | *List of structured properties* | The field mappings between each tuple defined in the OPL, with each corresponding field data source (incoming data)\. Users can edit them each individually per data source\. With this script, you can set the property directly to set all mappings at once\. This setting isn't shown in the user interface\.

Each entity in the list is structured data:

Data Source Tag\. The tag of the data source\. For example, for `0_Products_Type` the tag is `0`\.

Data Source Index\. The physical sequence (index) of the data source\. This is determined by the connection order\.

Source Node\. The source node (annotation) of the data source\. For example, for `0_Products_Type` the source node is `Products`\.

Connected Node\. The prior node (annotation) that connects the current CPLEX optimization node\. For example, for `0_Products_Type` the connected node is `Type`\.

Tuple Set Name\. The tuple set name of the data source\. It must match what's defined in the OPL\.

Tuple Field Name\. The tuple set field name of the data source\. It must match what's defined in the OPL tuple set definition\.

Storage Type\. The field storage type\. Possible values are `int`, `float`, or `string`\. | +| | | Data Field Name\. The field name of the data source\.

Example:

`[0,0,'Product','Type','Products','prod_id_tup','int','prod_id'], 0,0,'Product','Type','Products','prod_name_tup','string', 'prod_name'],1,1,'Components','Type','Components', 'comp_id_tup','int','comp_id'],1,1,'Components','Type', 'Components','comp_name_tup','string','comp_name']]` | +| `opl_data_text` | *string* | The definition of some variables or data used for the OPL\. | +| `output_value_mode` | *string* | Possible values are `raw` or `dvar`\. If `dvar` is specified, on the Output tab the user must specify the object function variable name in OPL for the output\. If `raw` is specified, the objective function will be output directly, regardless of name\. | +| `decision_variable_name` | *string* | The objective function variable name in defined in the OPL\. This is enabled only when the `output_value_mode` property is set to `dvar`\. | +| `objective_function_value_fieldname` | *string* | The field name for the objective function value to use in the output\. Default is `_OBJECTIVE`\. | +| `output_tuple_set_names` | *string* | The name of the predefined tuples from the incoming data\. This acts as the indexes of the decision variable and is expected to be output with the Variable Outputs\. The Output Tuple must be consistent with the decision variable definition in the OPL\. If there are multiple indexes, the tuple names must be joined by a comma (`,`)\.

An example for a single tuple is `Products`, with the corresponding OPL definition being `dvar float+ Production[Products];`

An example for multiple tuples is `Products,Components`, with the corresponding OPL definition being `dvar float+ Production[Products];` | +| `decision_output_map` | *List of structured properties* | The field mapping between variables defined in the OPL that will be output and the output fields\. Each entity in the list is structured data:

Variable Name\. The variable name in the OPL to output\.

Storage Type\. Possible values are `int`, `float`, or `string`\.

Output Field Name\. The expected field name in the results (output or export)\.

Example:

`['Production','int','res'],'Remark','string','res_1']'Cost', 'float','res_2']]` | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/75891659ab1df929d219741c3f2d69384a01835c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/75891659ab1df929d219741c3f2d69384a01835c.md new file mode 100644 index 0000000..d7bf223 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/75891659ab1df929d219741c3f2d69384a01835c.md @@ -0,0 +1,18 @@ +# Retail sales promotion (SPSS Modeler) + +# Retail sales promotion # + +This example deals with fictitious data that describes retail product lines and the effects of promotion on sales\. + +Your goal in this example is to predict the effects of future sales promotions\. Similar to the [condition monitoring example](https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_condition.html), the data mining process consists of the exploration, data preparation, training, and test phases\. + +This example uses the flow named Retail Sales Promotion, available in the example project \. The data files are goods1n\.csv and goods2n\.csv\. + + + +1. Open the Example Project\. +2. Scroll down to the Modeler flows section, click View all, and select the Retail Sales Promotion flow\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/759b6927189fea6be3124bf79fa527873cb84ea6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/759b6927189fea6be3124bf79fa527873cb84ea6.md new file mode 100644 index 0000000..0fee688 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/759b6927189fea6be3124bf79fa527873cb84ea6.md @@ -0,0 +1,15 @@ +# One-Class SVM node (SPSS Modeler) + +# One\-Class SVM node # + +The One\-Class SVM© node uses an unsupervised learning algorithm\. The node can be used for novelty detection\. It will detect the soft boundary of a given set of samples, to then classify new points as belonging to that set or not\. This One\-Class SVM modeling node is implemented in Python and requires the scikit\-learn© Python library\. + +For details about the scikit\-learn library, see [Support Vector Machines](http://scikit-learn.org/stable/modules/svm.html#svm-outlier-detection)^1^\. + +The Modeling tab on the palette contains the One\-Class SVM node and other Python nodes\. + +Note: One\-Class SVM is used for usupervised outlier and novelty detection\. In most cases, we recommend using a known, "normal" dataset to build the model so the algorithm can set a correct boundary for the given samples\. Parameters for the model – such as nu, gamma, and kernel – impact the result significantly\. So you may need to experiment with these options until you find the optimal settings for your situation\. + +^1^Smola, Schölkopf\. "A Tutorial on Support Vector Regression\." *Statistics and Computing Archive*, vol\. 14, no\. 3, August 2004, pp\. 199\-222\. (http://citeseerx\.ist\.psu\.edu/viewdoc/summary?doi=10\.1\.1\.114\.4288) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7623f4fa0f93db33077a8b64f7a7b27fbc84e9e4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7623f4fa0f93db33077a8b64f7a7b27fbc84e9e4.md new file mode 100644 index 0000000..2a9e26a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7623f4fa0f93db33077a8b64f7a7b27fbc84e9e4.md @@ -0,0 +1,48 @@ +# Jupyter kernels and notebook environments + +# Jupyter kernels and notebook environments # + +Jupyter notebooks run in kernels in Jupyter notebook environments or, if the notebooks use Spark APIs, those kernels run in a Spark environment\. + +The number of notebook Juypter kernels started in an environment depends on the environment type: + + + + * CPU or GPU environments + + When you open a notebook in edit mode, exactly one interactive session connects to a Jupyter kernel for the notebook language and the environment runtime that you select. The runtime is started per user and not per notebook. This means that if you open a second notebook with the same environment template, a second kernel is started in that runtime. Resources are shared. If you want to avoid sharing runtime resources, you must associate each notebook with its own environment template. + + Important: Stopping a notebook kernel doesn't stop the environment runtime in which the kernel is started because other notebook kernels could still be active in that runtime. Only stop an environment runtime if you are sure that no kernels are active. + * Spark environments + + When you open a notebook in edit mode in a Spark environment, a dedicated Spark cluster is started, even if another notebook was opened in the same Spark environment template. Each notebook kernel has its own Spark driver and set of Spark executors. No resources are shared. + + + +If necessary, you can restart or reconnect to a kernel\. When you restart a kernel, the kernel is stopped and then started in the same session, but all execution results are lost\. When you reconnect to a kernel after losing a connection, the notebook is connected to the same kernel session, and all previous execution results which were saved are available\. + +The kernel remains active even if you leave the notebook or close the web browser window\. When you reopen the same notebook, the notebook is connected to the same kernel\. Only the output cells that were saved (auto\-save happens every 2 minutes) before you left the notebook or closed the web browser window will be visible\. You will not see the output for any cells which ran in the background after you left the notebook or closed the window\. To see all of the output cells, you need to rerun the notebook\. + +## Learn more ## + + + + * [Notebook environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html) + + + + + + * [Associated Spark services](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assoc-services.html) + + + + + + * [Runtime scope in notebook environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html#runtime-scope) + + + +**Parent topic:**[Creating notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/creating-notebooks.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/76910487c819d14f9fefcbc6252f25652af1e65b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/76910487c819d14f9fefcbc6252f25652af1e65b.md new file mode 100644 index 0000000..f24e4d2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/76910487c819d14f9fefcbc6252f25652af1e65b.md @@ -0,0 +1,30 @@ +# fillernode properties + +# fillernode properties # + +![Filler node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/fillernodeicon.png)The Filler node replaces field values and changes storage\. You can choose to replace values based on a CLEM condition, such as `@BLANK(@FIELD)`\. Alternatively, you can choose to replace all blanks or null values with a specific value\. A Filler node is often used together with a Type node to replace missing values\. + +Example + + node = stream.create("filler", "My node") + node.setPropertyValue("fields", ["Age"]) + node.setPropertyValue("replace_mode", "Always") + node.setPropertyValue("condition", "(\"Age\" > 60) and (\"Sex\" = \"M\"") + node.setPropertyValue("replace_with", "\"old man\"") + + + +fillernode properties + +Table 1\. fillernode properties + +| `fillernode` properties | Data type | Property description | +| ----------------------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------- | +| `fields` | *list* | Fields from the dataset whose values will be examined and replaced\. | +| `replace_mode` | `Always``Conditional``Blank``Null``BlankAndNull` | You can replace all values, blank values, or null values, or replace based on a specified condition\. | +| `condition` | *string* | | +| `replace_with` | *string* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/76b3f98c842554781d96b8dde05a74d4d78b4e7a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/76b3f98c842554781d96b8dde05a74d4d78b4e7a.md new file mode 100644 index 0000000..5ee6444 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/76b3f98c842554781d96b8dde05a74d4d78b4e7a.md @@ -0,0 +1,102 @@ +# ts properties + +# ts properties # + +![Time Series node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/timeseriesnodeicon.png)The Time Series node estimates exponential smoothing, univariate Autoregressive Integrated Moving Average (ARIMA), and multivariate ARIMA (or transfer function) models for time series data and produces forecasts of future performance\. + + + +ts properties + +Table 1\. ts properties + +| `ts` Properties | Values | Property description | +| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `targets` | *field* | The Time Series node forecasts one or more targets, optionally using one or more input fields as predictors\. Frequency and weight fields are not used\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `candidate_inputs` | \[*field1 \.\.\. fieldN*\] | Input or predictor fields used by the model\. | +| `use_period` | *flag* | | +| `date_time_field` | *field* | | +| `input_interval` | `None`
`Unknown`
`Year`
`Quarter`
`Month`
`Week`
`Day`
`Hour`
`Hour_nonperiod`
`Minute`
`Minute_nonperiod`
`Second`
`Second_nonperiod` | | +| `period_field` | *field* | | +| `period_start_value` | *integer* | | +| `num_days_per_week` | *integer* | | +| `start_day_of_week` | `Sunday`
`Monday`
`Tuesday`
`Wednesday`
`Thursday`
`Friday`
`Saturday` | | +| `num_hours_per_day` | *integer* | | +| `start_hour_of_day` | *integer* | | +| `timestamp_increments` | *integer* | | +| `cyclic_increments` | *integer* | | +| `cyclic_periods` | *list* | | +| `output_interval` | `None`
`Year`
`Quarter`
`Month`
`Week`
`Day`
`Hour`
`Minute`
`Second` | | +| `is_same_interval` | *flag* | | +| `cross_hour` | *flag* | | +| `aggregate_and_distribute` | *list* | | +| `aggregate_default` | `Mean`
`Sum`
`Mode`
`Min`
`Max` | | +| `distribute_default` | `Mean`
`Sum` | | +| `group_default` | `Mean`
`Sum`
`Mode`
`Min`
`Max` | | +| `missing_imput` | `Linear_interp`
`Series_mean`
`K_mean`
`K_median`
`Linear_trend` | | +| `k_span_points` | *integer* | | +| `use_estimation_period` | *flag* | | +| `estimation_period` | `Observations`
`Times` | | +| `date_estimation` | *list* | Only available if you use `date_time_field` | +| `period_estimation` | *list* | Only available if you use `use_period` | +| `observations_type` | `Latest`
`Earliest` | | +| `observations_num` | *integer* | | +| `observations_exclude` | *integer* | | +| `method` | `ExpertModeler`
`Exsmooth`
`Arima` | | +| `expert_modeler_method` | `ExpertModeler`
`Exsmooth`
`Arima` | | +| `consider_seasonal` | *flag* | | +| `detect_outliers` | *flag* | | +| `expert_outlier_additive` | *flag* | | +| `expert_outlier_level_shift` | *flag* | | +| `expert_outlier_innovational` | *flag* | | +| `expert_outlier_level_shift` | *flag* | | +| `expert_outlier_transient` | *flag* | | +| `expert_outlier_seasonal_additive` | *flag* | | +| `expert_outlier_local_trend` | *flag* | | +| `expert_outlier_additive_patch` | *flag* | | +| `consider_newesmodels` | *flag* | | +| `exsmooth_model_type` | `Simple`
`HoltsLinearTrend`
`BrownsLinearTrend`
`DampedTrend`
`SimpleSeasonal`
`WintersAdditive`
`WintersMultiplicative`
`DampedTrendAdditive`
`DampedTrendMultiplicative`
`MultiplicativeTrendAdditive`
`MultiplicativeSeasonal`
`MultiplicativeTrendMultiplicative`
`MultiplicativeTrend` | Specifies the Exponential Smoothing method\. Default is `Simple`\. | +| `futureValue_type_method` | `Compute`
`specify` | If `Compute` is used, the system computes the Future Values for the forecast period for each predictor\.

For each predictor, you can choose from a list of functions (blank, mean of recent points, most recent value) or use `specify` to enter values manually\. To specify individual fields and properties, use the `extend_metric_values` property\. For example:

`set :ts.futureValue_type_method="specify" set :ts.extend_metric_values=[{'Market_1','USER_SPECIFY', 1,2,3]}, {'Market_2','MOST_RECENT_VALUE', ''},{'Market_3','RECENT_POINTS_MEAN', ''}]` | +| `exsmooth_transformation_type` | `None`
`SquareRoot`
`NaturalLog` | | +| `arima.p` | *integer* | | +| `arima.d` | *integer* | | +| `arima.q` | *integer* | | +| `arima.sp` | *integer* | | +| `arima.sd` | *integer* | | +| `arima.sq` | *integer* | | +| `arima_transformation_type` | `None`
`SquareRoot`
`NaturalLog` | | +| `arima_include_constant` | *flag* | | +| `tf_arima.p.`*fieldname* | *integer* | For transfer functions\. | +| `tf_arima.d.`*fieldname* | *integer* | For transfer functions\. | +| `tf_arima.q.`*fieldname* | *integer* | For transfer functions\. | +| `tf_arima.sp.`*fieldname* | *integer* | For transfer functions\. | +| `tf_arima.sd.`*fieldname* | *integer* | For transfer functions\. | +| `tf_arima.sq.`*fieldname* | *integer* | For transfer functions\. | +| `tf_arima.delay.`*fieldname* | *integer* | For transfer functions\. | +| `tf_arima.transformation_type.`*fieldname* | `None`
`SquareRoot`
`NaturalLog` | For transfer functions\. | +| `arima_detect_outliers` | *flag* | | +| `arima_outlier_additive` | *flag* | | +| `arima_outlier_level_shift` | *flag* | | +| `arima_outlier_innovational` | *flag* | | +| `arima_outlier_transient` | *flag* | | +| `arima_outlier_seasonal_additive` | *flag* | | +| `arima_outlier_local_trend` | *flag* | | +| `arima_outlier_additive_patch` | *flag* | | +| `max_lags` | *integer* | | +| `cal_PI` | *flag* | | +| `conf_limit_pct` | *real* | | +| `events` | *fields* | | +| `continue` | *flag* | | +| `scoring_model_only` | *flag* | Use for models with very large numbers (tens of thousands) of time series\. | +| `forecastperiods` | *integer* | | +| `extend_records_into_future` | *flag* | | +| `extend_metric_values` | *fields* | Allows you to provide future values for predictors\. | +| `conf_limits` | *flag* | | +| `noise_res` | *flag* | | +| `max_models_output` | *integer* | Controls how many models are shown in output\. Default is `10`\. Models are not shown in output if the total number of models built exceeds this value\. Models are still available for scoring\. | +| `missing_value_threshold` | *double* | Computes data quality measures for the time variable and for input data corresponding to each time series\. If the data quality score is lower than this threshold, the corresponding time series will be discarded\. | +| `compute_future_values_input` | *boolean* | `False`: Compute future values of inputs\.
`True`: Select fields whose values you wish to add to the data\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/76ec742bc2d093c10c6a5b85456bfbb6571c416d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/76ec742bc2d093c10c6a5b85456bfbb6571c416d.md new file mode 100644 index 0000000..396a3f9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/76ec742bc2d093c10c6a5b85456bfbb6571c416d.md @@ -0,0 +1,34 @@ +# apriorinode properties + +# apriorinode properties # + +![Apriori node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/apriorinodeicon.png)The Apriori node extracts a set of rules from the data, pulling out the rules with the highest information content\. Apriori offers five different methods of selecting rules and uses a sophisticated indexing scheme to process large data sets efficiently\. For large problems, Apriori is generally faster to train; it has no arbitrary limit on the number of rules that can be retained, and it can handle rules with up to 32 preconditions\. Apriori requires that input and output fields all be categorical but delivers better performance because it'ss optimized for this type of data\. + + + +apriorinode properties + +Table 1\. apriorinode properties + +| `apriorinode` Properties | Values | Property description | +| --------------------------- | ------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `consequents` | *field* | Apriori models use Consequents and Antecedents in place of the standard target and input fields\. Weight and frequency fields are not used\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `antecedents` | \[*field1 \.\.\. fieldN*\] | | +| `min_supp` | *number* | | +| `min_conf` | *number* | | +| `max_antecedents` | *number* | | +| `true_flags` | *flag* | | +| `optimize` | `Speed`
`Memory` | | +| `use_transactional_data` | *flag* | | +| `contiguous` | *flag* | | +| `id_field` | *string* | | +| `content_field` | *string* | | +| `mode` | `Simple``Expert` | | +| `evaluation` | `RuleConfidence`
`DifferenceToPrior`
`ConfidenceRatio`
`InformationDifference`
`NormalizedChiSquare` | | +| `lower_bound` | *number* | | +| `optimize` | `Speed`
`Memory` | Use to specify whether model building should be optimized for speed or for memory\. | +| `rules_without_antececents` | *boolean* | Select to allow rules that include only the consequent (item or item set)\. This is useful when you are interested in determining common items or item sets\. For example, `cannedveg` is a single\-item rule without an antecedent that indicates purchasing `cannedveg` is a common occurrence in the data\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/77393f760a3a3f834809aca1078bdf229331c2fd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/77393f760a3a3f834809aca1078bdf229331c2fd.md new file mode 100644 index 0000000..8fdef32 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/77393f760a3a3f834809aca1078bdf229331c2fd.md @@ -0,0 +1,59 @@ +# Overview for setting up IBM Cloud App ID (beta) + +# Overview for setting up IBM Cloud App ID (beta) # + +IBM watsonx supports IBM Cloud App ID to integrate customer's registries for user authentication\. You configure App ID on IBM Cloud to communicate with an identiry provider\. You then provide an alias to the people in your organization to log in to IBM watsonx\. + +**Required roles** : To configure identity providers for App ID, you must have one of the following roles in the IBM Cloud account: + +: \- **Account owner** : \- **Operator** or higher on the App ID instance : \- **Operator** or **Administrator** role on the IAM Identity Service + +App ID is configured entirely on IBM Cloud\. An identity provider, for example, Active Directory, must also be configured separately to communicate with App ID\. + +For more information on configuring App ID to work with an identity provider, see [Configuring App ID with your identity provider](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-appid-tips.html)\. + +## Configuring the log on alias ## + +The App ID instance is configured as the default identity provider for the account\. For instructions on configuring an identity provider, refer to [IBM Cloud docs: Enabling authentication from an external identity provider](https://cloud.ibm.com/docs/account?topic=account-idp-integration)\. + +Each App ID instance requires a unique alias\. There is one alias per account\. All users in an account log in with the same alias\. When the identity provider is configured, the alias is initially set to the account ID\. You can [change the initial alias](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-appid-tips.html#cfg_alias) to be easier to type and remember\. + +## Logging in with App ID (beta) ## + +Users choose **App ID (beta)** as the login method on the IBM watsonx login page and enter the alias\. Then, they are redirected to their company's login page to enter their company credentials\. Upon logging in successfully to their company, they are redirected to IBM watsonx\. + +To verify that the alias is correctly configured, go to the **User profile and settings** page\. Verify that the username in the profile is the email from your company’s registry\. The alias is correct if the correct email is shown in the profile, as it indicates that the mapping was successful\. + +You cannot switch accounts when logging in through App ID\. + +## Limitations ## + +The following limitations apply to this beta release: + + + + * You must map the **name/username/sub** SAML profile properties to the email property in the user registry\. If the mapping is absent or incorrect, a default opaque user ID is used, which is not supported in this beta release\. + * The IBM Cloud login page does not support an App ID alias\. Users log in into IBM Cloud with a custom URL, following this form: `https://cloud.ibm.com/authorize/{app_id_alias}`\. + + + + + + * If you are using the Cloud Directory included with App ID as your user registry, you must select **Username and password** as the option for **Manage authentication > Cloud Directory > Settings > Allow users to sign\-up and sign\-in using**\. + + + +## Learn more ## + + + + * [Logging in to watsonx\.ai through IBM App ID (beta)](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/signup-wx.html##appid) + * [Configuring App ID with your identity provider](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-appid-tips.html) + * [IBM Cloud docs: Getting started with App ID](https://cloud.ibm.com/docs/appid?topic=appid-getting-started) + * [IBM Cloud docs: Enabling authentication from an external identity provider](https://cloud.ibm.com/docs/account?topic=account-idp-integration) + + + +**Parent topic:**[Managing IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_console.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/773f81dd69d3adbbe1998ff5974ca83347effc76.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/773f81dd69d3adbbe1998ff5974ca83347effc76.md new file mode 100644 index 0000000..91c1287 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/773f81dd69d3adbbe1998ff5974ca83347effc76.md @@ -0,0 +1,39 @@ +# {{ document.title.text }} + +# Data privacy rights # + +![icon for privacy risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-privacy.svg)Risks associated with inputTraining and tuning phasePrivacyAmplified + +### Description ### + +In some countries, privacy laws give individuals the right to access, correct, verify, or remove certain types of information that companies hold or process about them\. Tracking the usage of an individual’s personal information in training a model and providing appropriate rights to comply with such laws can be a complex endeavor\. + +### Why is data privacy rights a concern for foundation models? ### + +The identification or improper usage of data could lead to violation of privacy laws\. Improper usage or a request for data removal could force organizations to retrain the model, which is expensive\. In addition, business entities could face fines, reputational harms, and other legal consequences if they fail to comply with data privacy rules and regulations\. + +Example + +#### Right to Be Forgotten (RTBF) #### + +As stated in the article, laws in multiple locales, including Europe (GDPR); Canada (CPPA); and Japan (APPI), grant users’ rights for their personal data to be “forgotten” by technology (Right To Be Forgotten)\. However, the emerging and increasingly popular AI (LLMs) services present new challenges for the right to be forgotten (RTBF)\. According to Data61’s research, the only way for users to identify usage of their personal information in an LLM is “by either inspecting the original training dataset or perhaps prompting the model\.” However, training data is either not public or companies do not disclose it, citing safety and other concerns, and guardrails may prevent users from accessing the information via prompting\. Due to these barriers, users cannot initiate RTBF procedures and companies deploying LLMs may be unable to meet RTBF laws\. + +Sources: + +[Zhang et al\., Sept 2023](https://arxiv.org/pdf/2307.03941.pdf) + +Example + +#### Lawsuit About LLM Unlearning #### + +According to the report, a lawsuit was filed against Google that alleges the use of copyright material and personal information as training data for its AI systems, which includes its Bard chatbot\. Opt\-out and deletion rights are guaranteed rights for California residents under the CCPA and children in the United States below 13 under the COPPA\. The plaintiffs allege that because there is no way for Bard to “unlearn” or fully remove all the scraped PI it has been fed\. The plaintiffs note that Bard’s privacy notice states that Bard conversations cannot be deleted by the user once they have been reviewed and annotated by the company and may be kept up to 3 years, which plaintiffs allege further contributes to non\-compliance with these laws\. + +Sources: + +[Reuters, July 2023](https://www.reuters.com/legal/litigation/google-hit-with-class-action-lawsuit-over-ai-data-scraping-2023-07-11/) + +[J\.L\. v\. Alphabet Inc\., July 2023](https://fingfx.thomsonreuters.com/gfx/legaldocs/myvmodloqvr/GOOGLE%20AI%20LAWSUIT%20complaint.pdf) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/773fa6558f9fd3115f36af9e4b11f67c1f501432.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/773fa6558f9fd3115f36af9e4b11f67c1f501432.md new file mode 100644 index 0000000..c332118 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/773fa6558f9fd3115f36af9e4b11f67c1f501432.md @@ -0,0 +1,117 @@ +# Loading and accessing data in a notebook + +# Loading and accessing data in a notebook # + +You can integrate data into notebooks by accessing the data from a local file, from free data sets, or from a data source connection\. You load that data into a data structure or container in the notebook, for example, a pandas\.DataFrame, numpy\.array, Spark RDD, or Spark DataFrame\. + +To work with data in a notebook, you can choose between the following options: + + + +Recommended methods for adding data to your notebook + +| Option | Recommended method | Requirements | Details | +| ---------------------------------------------------------------- | ------------------------------------------- | ---------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Add data from a file on your local system | Add a **Code snippet** that loads your data | The file must exist as an asset in your project | [Add a file from your local system](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html?context=cdpaas&locale=en#add-file-local) and then [Use a code snippet to load the data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html?context=cdpaas&locale=en#files) | +| Add data from a free data set from the Samples | Add a **Code snippet** that loads your data | The data set (file) must exist as an asset in your project | [Add a free data set from the Samples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html?context=cdpaas&locale=en#loadcomm) and then [Use a code snippet to load the data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html?context=cdpaas&locale=en#files) | +| Load data from data source connections | Add a **Code snippet** that loads your data | The connection must exist as an asset in your project | [Add a connection to your project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) and then [Add a code snippet that loads the data from your data source connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html?context=cdpaas&locale=en#conns) | +| Access project assets and metadata programmatically | Use `ibm-watson-studio-lib` | The data asset must exist in your project | [Use the `ibm-watson-studio-lib` library to interact with data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/using-ibm-ws-lib.html) | +| Create and use feature store data | Use `assetframe-lib` library functions | The data asset must exist in your project | [Use the `assetframe-lib` library for Python to create and use feature store data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/py_assetframe.html) | +| Access data using an API function or an operating system command | For example, use `wget` | N/A | [Access data using an API function or an operating system command](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html?context=cdpaas&locale=en#api-function) | + + + +Important: Make sure that the environment in which the notebook is started has enough memory to store the data that you load to the notebook\. The environment must have significantly more memory than the total size of the data that is loaded to the notebook\. Some data frameworks, like pandas, can hold multiple copies of the data in memory\. + +## Adding a file from your local system ## + +To add a file from your local system to your project by using the Jupyterlab notebook editor: + + + +1. Open your notebook in edit mode\. +2. From the toolbar, click the **Upload asset to project** icon (![Shows the Upload asset to project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/find_data_icon.png)) and add your file\. + + + +Tip: You can also drag the file into your notebook sidebar\. + +## Load data sets from the Samples ## + +The data sets on the Samples contain open data\. Watch this short video to see how to work with public data sets in the Samples\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +To add a data set from the Samples to your project: + + + +1. From the IBM watsonx navigation menu, select Samples\. +2. Find the card for the data set that you want to add\. ![A view of data sets](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/datasets.png) +3. Click **Add to project**, select the project, and click **Add**\. Clicking **View project** takes you to the project Overview page\. The data asset is added to the list of data assets on the project's Assets page\. + + + +## Loading data from files ## + +**Prerequisites** The file must exist as an asset in your project\. For details, see [Adding a file from your local system](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html?context=cdpaas&locale=en#add-file-local) or [Loading a data set from the Samples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html?context=cdpaas&locale=en#loadcomm)\. + +To load data from a project file to your notebook: + + + +1. Open your notebook in edit mode\. +2. Click the **Code snippets** icon (![the Code snippets icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/code-snippets-icon.png)), click **Read data**, and then select the data file from your project\. If you want to change your selection, use **Edit** icon\. +3. From the **Load as** drop\-down list, select the load option that you prefer\. If you select **Credentials**, only file access credentials will be generated\. For details, see [Adding credentials](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html?context=cdpaas&locale=en#adding-creds)\. +4. Click in an empty code cell in your notebook and then click **Insert code to cell** to insert the generated code\. Alternatively, click to copy the generated code to the clipboard and then paste the code into your notebook\. + + + +The generated code serves as a quick start to begin working with a data set\. For production systems, carefully review the inserted code to determine whether to write your own code that better meets your needs\. + +To learn which data structures are generated for which notebook language and data format, see [Data load support](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-load-support.html#file-types)\. + +## Loading data from data source connections ## + +**Prerequisites** Before you can load data from an IBM data service or from an external data source, you must create or add a connection to your project\. See [Adding connections to projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +To load data from an existing data source connection into a data structure in your notebook: + + + +1. Open your notebook in edit mode\. +2. Click the **Code snippets** icon (![the Code snippets icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/code-snippets-icon.png)), click **Read data**, and then select the data source connection from your project\. +3. Select the schema and choose a table\. If you want to change your selection, use **Edit** icon\. +4. Select the load option\. If you select **Credentials**, only metadata will be generated\. For details, see [Adding credentials](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html?context=cdpaas&locale=en#adding-creds)\. +5. Click in an empty code cell in your notebook and then insert code to the cell\. Alternatively, click to copy the generated code to the clipboard and then paste the code into your notebook\. +6. If necessary, enter your personal credentials for locked data connections that are marked with a key icon (![the key symbol for connections with personal credentials](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/privatekey.png))\. This is a one\-time step that permanently unlocks the connection for you\. After you unlock the connection, the key icon is no longer displayed\. For more information, see [Adding connections to projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + + + +The generated code serves as a quick start to begin working with a connection\. For production systems, carefully review the inserted code to determine whether to write your own code that better meets your needs\. + +To learn which data structures are generated for which notebook language and data format, see [Data load support](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-load-support.html#file-types)\. + +## Adding credentials ## + +You can generate your own code to access the file located in your IBM Cloud Object Storage or a file accessible through a connection\. This is useful when, for example, your file format is not supported by the snippet generation tool\. With the credentials, you can write your own code to load the data into a data structure in a notebook cell\. + +To add the credentials: + + + +1. Click the **Code snippets** icon (![the Code snippets icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/code-snippets-icon.png)) and then click **Read data**\. +2. Click in an empty code cell in your notebook, select **Credentials** as the load option, and then load the credentials to the cell\. You can also click to copy the credentials to the clipboard and then paste them into your notebook\. +3. Insert your credentials into the code in your notebook to access the data\. For example, see this code in a [blog for Python](https://medium.com/ibm-data-science-experience/working-with-ibm-cloud-object-storage-in-python-fe0ba8667d5f)\. + + + +## Use an API function or an operating system command to access the data ## + +You can use API functions or operating system commands in your notebook to access data, for example, the `wget` command to access data by using the HTTP, HTTPS or FTP protocols\. When you use these types of API functions and commands, you must include code that sets the project access token\. See [Manually add the project access token](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/token.html)\. + +For reference information about the API, see [Watson Data API](https://cloud.ibm.com/apidocs/watson-data-api)\. + +**Parent topic:**[Notebooks and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebooks-and-scripts.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/774fd49c617dac62f48eb31e08757e0aec3d1282.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/774fd49c617dac62f48eb31e08757e0aec3d1282.md new file mode 100644 index 0000000..5cf07fa --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/774fd49c617dac62f48eb31e08757e0aec3d1282.md @@ -0,0 +1,7 @@ +# Matrix node (SPSS Modeler) + +# Matrix node # + +Use the Matrix to create a table that shows relationships between fields\. It is most commonly used to show the relationship between two categorical fields (flag, nominal, or ordinal), but it can also be used to show relationships between continuous (numeric range) fields\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/777f72f32fd20e96c4a5f0cca461fe9a79334e96.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/777f72f32fd20e96c4a5f0cca461fe9a79334e96.md new file mode 100644 index 0000000..383f8b4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/777f72f32fd20e96c4a5f0cca461fe9a79334e96.md @@ -0,0 +1,58 @@ +# Evaluating AI models with Watson OpenScale + +# Evaluating AI models with Watson OpenScale # + +IBM Watson OpenScale tracks and measures outcomes from your AI models, and helps ensure that they remain fair, explainable, and compliant no matter where your models were built or are running\. Watson OpenScale also detects and helps correct the drift in accuracy when an AI model is in production\. + +**Required service** : Watson Machine Learning + +**Training data format** : Relational: Tables in relational data sources : Tabular: Excel files (\.xls or \.xlsx), CSV files : Textual: In the supported relational tables or files + +**Connected data** : Cloud Object Storage (infrastructure) : Db2 + +**Data size** : Any + +Enterprises use model evaluation as part of an AI governance strategy to make sure that models in development and production meet established compliance standards\. This approach ensures that AI models are free from bias, can be easily explained and understood by business users, and are auditable in business transactions\. You can evaluate models regardless of the tools and frameworks that you use to build and run models\. + +Watch this short video to learn more about Watson OpenScale: + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +### Trustworthy AI in action ### + +To learn more about model evaluation in action, see [How AI picks the highlights from Wimbledon fairly and fast](https://www.ibm.com/blog/how-ai-picks-the-highlights-from-wimbledon-fairly-and-fast/)\. + +## Components of Watson OpenScale ## + +Watson OpenScale has four main areas: + + + + * **Insights:** The Insights page displays the models that you are monitoring and provides status on the results of model evaluations\. + * **Explain a transaction:** The Explanations page describes how the model determined a prediction\. You can understand and be confident in the model by viewing some of the most important factors that led to its predictions\. + * **Configuration:** The Configuration page can be used to select a database, set up a machine learning provider, and optionally add integrated services\. + * **Support:** The Support page provides you with resources to get the help you need with Watson OpenScale\. Access product documentation or connect with IBM Community on Stack Overflow\. To create a service ticket with the IBM Support team, click **Manage tickets**\. + + + +### Evaluations ### + +Evaluations validate your deployments against specified metrics\. Configure alerts that indicate when a threshold is crossed for a metric\. Watson OpenScale evaluates your deployments based on three default monitors: + + + + * **Quality** describes the model’s ability to provide correct outcomes based on labeled test data called Feedback data\. + * **Fairness** describes how evenly the model delivers favorable outcomes between groups\. The Fairness monitor looks for biased outcomes in your model\. + * **Drift** warns you of a drop in accuracy or data consistency\. + + + +Note:You can also create **Custom** evaluations for your deployment\. + +## Next steps ## + +## Learn more ## + +**Parent topic:**[Managing predictive deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/wmls/wmls-deploy-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/784686da695f28f867bc35c4416cb8d767d58b7a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/784686da695f28f867bc35c4416cb8d767d58b7a.md new file mode 100644 index 0000000..2d93dd0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/784686da695f28f867bc35c4416cb8d767d58b7a.md @@ -0,0 +1,61 @@ +# Managing assets in projects + +# Managing assets in projects # + +You can manage assets in a project by adding them, editing them, or deleting them\. + + + + * [Add data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html) + * You can add other types of assets by clicking **New asset** or **Import assets** on the project's *Assets* page\. + * [Edit assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-assets.html?context=cdpaas&locale=en#editassets) + * [Download assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/download.html) + * [Delete assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-assets.html?context=cdpaas&locale=en#remove-asset) + * [Search for assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/search-assets.html) + + + +## Edit assets ## + +You can edit the properties of all types of assets, such as the asset name, description, and tags\. See [Asset types and properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html)\. + +The role you need to edit an asset depends on the asset type\. See [Project collaborator roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborator-permissions.html)\. + +**Data assets from files, connected data assets, or imported data assets** : \- Click the data asset name to open the asset\. For some types of data, you can see an [asset preview](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/previews.html)\. : \- To edit the data asset properties, such as its name, tags, and description, click the corresponding edit icon (![edit icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/edit.svg)) on the information pane\. : \- To create or update a [profile](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/profile.html) of relational data, click the **Profile** tab\. : \- To cleanse and shape relational data, click **Prepare data** to open the data asset in Data Refinery\. + +: When you change the name of data assets with file attachments that you uploaded into the project, the file attachments are also renamed\. You must update any references to the data asset in code\-based assets, like notebooks, to the new data asset name, otherwise, the code\-based asset won't run\. + +**Connection assets** : Click the connection asset name to edit the connection properties, such as the name, description, and connection details\. + +**Assets that you create with tools** : Click the name of the asset on the **Assets** page to open it in its tool\. + +On the **Assets** page of a project, the lock icon (![Lock icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/lockicon-new.png)) indicates that another collaborator is editing the asset or locked the asset to prevent editing by other users\. + + + + * Enabled lock: You can unlock the asset if you locked it or if you have the **Admin** role in the project\. + * Disabled lock: You can't unlock a locked asset if you didn't lock it and you have the **Editor** or **Viewer** role in the project\. + + + +When you unlock an asset that another collaborator is editing, you take control of the asset\. The other collaborator is not notified and any changes made by that collaborator are overwritten by your edits\. + +## Delete an asset from a project ## + +**Required permissions** : You must have the **Admin** or **Editor** role to delete assets from the project\. + +To delete an asset from a project, choose the **Delete** or the **Remove** option from the action menu next to the asset on the project **Assets** page\. When you delete an asset, its associated file, if it has one, is also deleted\. However, when you delete a connected data asset, the data in the associated data source is not affected\. + +Depending on the type of asset, other related assets might also be deleted\. + +## Learn more ## + + + + * [Asset types and properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html) + + + +**Parent topic:**[Projects ](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/78488a77cb39bdd413dbb7682f1dbe2675b3e3a0.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/78488a77cb39bdd413dbb7682f1dbe2675b3e3a0.md new file mode 100644 index 0000000..71ded34 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/78488a77cb39bdd413dbb7682f1dbe2675b3e3a0.md @@ -0,0 +1,25 @@ +# Defining a class + +# Defining a class # + +Within a Python class, you can define both variables and methods\. Unlike in Java, in Python you can define any number of public classes per source file (or module)\. Therefore, you can think of a module in Python as similar to a package in Java\. + +In Python, classes are defined using the `class` statement\. The `class` statement has the following form: + + class name (superclasses): statement + +or + + class name (superclasses): + assignment + . + . + function + . + . + +When you define a class, you have the option to provide zero or more assignment statements\. These create class attributes that are shared by all instances of the class\. You can also provide zero or more function definitions\. These function definitions create methods\. The `superclasses` list is optional\. + +The class name should be unique in the same scope, that is within a module, function, or class\. You can define multiple variables to reference the same class\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/78a4d6515faa2766feb3a03ca6a378846cf33d83.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/78a4d6515faa2766feb3a03ca6a378846cf33d83.md new file mode 100644 index 0000000..6129783 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/78a4d6515faa2766feb3a03ca6a378846cf33d83.md @@ -0,0 +1,59 @@ +# Managing all projects in the account + +# Managing all projects in the account # + +If you have the required permission, you can view and manage all projects in your IBM Cloud account\. You can add yourself to a project so that you can delete it or change its collaborators\. + +## Requirements ## + +To manage all projects in the account, you must: + + + + * Restrict resources to the current account\. See steps to [set the scope for resources](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/account-settings.html#set-the-scope-for-resources)\. + * Have the **Manage projects** permission that is provided by the IAM **Manager** role for the IBM Cloud Pak for Data service\. + + + +## Assigning the Manage projects permission ## + +To grant the **Manage projects** permission to a user who is already in your IBM Cloud account: + + + +1. From the navigation menu, choose **Administration > Access (IAM)** to open the **Manage access and users** page in your IBM Cloud account\. +2. Select the user on the **Users** page\. +3. Click the **Access** tab and then choose **Assign access\+**\. +4. Select **Access policy**\. +5. For **Service**, choose **IBM Cloud Pak for Data**\. +6. For **Service access**, select the **Manager** role\. +7. For **Platform access**, assign the **Editor** role\. +8. Click **Add** and **Assign** to assign the policy to the user\. + + + +## Managing projects ## + +You can add yourself to a project when you need to delete the project, delete collaborators, or assign the **Admin** role to a collaborator in the project\. To manage projects: + + + + * View all active projects on the **Projects** page in IBM watsonx by clicking the drop\-down menu next to the search field and selecting **All active projects**\. + * Join any project as **Admin** by clicking **Join as admin** in the **Your role** column\. + * Filter projects to identify which projects you are not a collaborator in, by clicking the filter icon ![Filter icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/filter.svg) and selecting **Your role > No membership**\. + + + +For more details on managing projects, see [Administering projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/admin-project.html)\. + +## Learn more ## + + + + * [Administering projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/admin-project.html) + + + +**Parent topic:**[Managing IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_console.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/78a8c07b83df1b01276353d098e84f12304636e2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/78a8c07b83df1b01276353d098e84f12304636e2.md new file mode 100644 index 0000000..dcc4a46 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/78a8c07b83df1b01276353d098e84f12304636e2.md @@ -0,0 +1,147 @@ +# Prompt Lab + +# Prompt Lab # + +In the Prompt Lab in IBM watsonx\.ai, you can experiment with prompting different foundation models, explore sample prompts, and save and share your best prompts\. + +You use the Prompt Lab to engineer effective prompts that you submit to deployed foundation models for inferencing\. You do not use the Prompt Lab to create new foundation models\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Requirements ## + +If you signed up for watsonx\.ai and you have a sandbox project, all requirements are met and you're ready to use the Prompt Lab\. + +You must meet these requirements to use the Prompt Lab: + + + + * You must have a project\. + * You must have the **Editor** or **Admin** role in the project\. + * The project must have an associated Watson Machine Learning service instance\. Otherwise, you are prompted to associate the service when you open the Prompt Lab\. + + + +## Creating and running a prompt ## + +To create and run a new prompt, complete the following steps: + + + +1. From the [watsonx\.ai home page](https://dataplatform.cloud.ibm.com/wx/home?context=wx), choose a project, and then click **Experiment with foundation models and build prompts**\. + + + + + +1. Select a model\. +2. Enter a prompt\. +3. If necessary, update model parameters or add prompt variables\. +4. Click **Generate**\. +5. To preserve your work, so you can reuse or share a prompt with collaborators in the current project, save your work as a project asset\. For more information, see [Saving prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-save.html)\. + + + +To run a sample prompt, complete the following steps: + + + +1. From the *Sample prompts* menu in the Prompt Lab, select a sample prompt\. + + The prompt is opened in the editor and an appropriate model is selected. +2. Click **Generate**\. + + + +## Prompt editing options ## + +You type your prompt in the prompt editor\. The prompt editor has the following modes: + +**Freeform** : You add your prompt in plain text\. Your prompt text is sent to the model exactly as you typed it\. : Quotation marks in your text are escaped with a backslash (`\"`)\. Newline characters are represented by `\n`\. Apostrophes are escaped (`it'\''s`) so that they can be handled properly in the cURL command\. + +**Structured** : You add parts of your prompt into the appropriate fields: : \- **Instruction**: Add an instruction if it makes sense for your use case\. An instruction is an imperative statement, such as *Summarize the following article*\. : \- **Examples**: Add one or more pairs of examples that contain the input and the corresponding output that you want\. Providing a few example input\-and\-output pairs in your prompt is called *few\-shot prompting*\. If you need a specific prefix to the input or the output, you can replace the default labels, "Input:" or "Output:", with the labels you want to use\. A space is added between the example label and the example text\. : \- **Test your input**: In the *Try* area, enter the final input of your prompt\. : Structured mode is designed to help new users create effective prompts\. Text from the fields is sent to the model in a template format\. + +## Model and prompt configuration options ## + +You must specify which model to prompt and can optionally set parameters that control the generated result\. + +### Model choices ### + +In the Prompt Lab, you can submit your prompt to any of the models that are supported by watsonx\.ai\. You can choose recently\-used models from the drop\-down list\. Or you can click **View all foundation models** to view all the supported models, filter them by task, and read high\-level information about the models\. + +If you tuned a foundation model by using the Tuning Studio and deployed the tuned model, your tuned model is also available for prompting from the Prompt Lab\. + +### Model parameters ### + +To control how the model generates output in response to your prompt, you can specify decoding parameters and stopping criteria\. For more information, see [Model parameters for prompting](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-model-parameters.html)\. + +### Prompt variables ### + +To add flexibility to your prompts, you can define prompt variables\. A prompt variable is a placeholder keyword that you include in the static text of your prompt at creation time and replace with text dynamically at run time\. For more information, see [Building reusable prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-variables.html)\. + +### AI guardrails ### + +When you set the **AI guardrails** switcher to **On**, harmful language is automatically removed from the input prompt text and from the output that is generated by the model\. Specifically, any sentence in the input or output that contains harmful language is replaced with a message that says that potentially harmful text was removed\. + +## Prompt code ## + +If you want to run the prompt programmatically, you can view and copy the prompt code or use the Python library\. + +### View code ### + +When you click the **View code** icon (![](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/code.svg)), a cURL command is displayed that you can call from outside the Prompt Lab to submit the current prompt and parameters to the selected model and get a generated response\. + +In the command, there is a placeholder for an IBM Cloud IAM token\. For information about generating the access token, see [Generating an IBM Cloud IAM token](https://cloud.ibm.com/docs/account?topic=account-iamtoken_from_apikey)\. + +### Programmatic alternative to the Prompt Lab ### + +The Prompt Lab graphical interface is a great place to experiment and iterate with your prompts\. However, you can also prompt foundation models in watsonx\.ai programmatically by using the Python library\. For details, see [Foundation models Python library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-python-lib.html)\. + +## Available prompts ## + +In the side panel, you can access sample prompts, your session history, and saved prompts\. + +### Samples ### + +A collection of sample prompts are available in the Prompt Lab\. The samples demonstrate effective prompt text and model parameters for different tasks, including classification, extraction, content generation, question answering, and summarization\. + +When you click a sample, the prompt text loads in the editor, an appropriate model is selected, and optimal parameters are configured automatically\. + +### History ### + +As you experiment with different prompt text, model choices, and parameters, the details are captured in the session history each time you submit your prompt\. To load a previous prompt, click the entry in the history and then click **Restore**\. + +### Saved ### + +From the *Saved prompt templates* menu, you can load any prompts that you saved to the current project as a prompt template asset\. + +## Learn more ## + + + + * [Security and privacy for foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-security.html) + * [Building reusable prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-variables.html) + * [Saving prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-save.html) + * [Model parameters for prompting](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-model-parameters.html) + * [Sample prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html) + * [Prompt tips](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-tips.html) + * Try these tutorials: + + + + * [Prompt a foundation model using Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html) + * [Prompt a foundation model with the retrieval-augmented generation pattern](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html) + + + + + + + + * Watch these other prompt lab videos + + + +**Parent topic:**[Foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7935b285f3e7dbbdcda940a70cf92dc0e2ed6512.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7935b285f3e7dbbdcda940a70cf92dc0e2ed6512.md new file mode 100644 index 0000000..533d938 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7935b285f3e7dbbdcda940a70cf92dc0e2ed6512.md @@ -0,0 +1,144 @@ +# Working in projects + +# Working in projects # + +A project is a collaborative workspace where you work with data and other assets to accomplish a particular goal\. + +By default, your [sandbox project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/sandbox.html) is created automatically when you sign up for watsonx\.ai\. + +Your project can include these types of resources: + + + + * [Collaborators](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html?context=cdpaas&locale=en#collaboration) are the people who you work with in your project\. + * [Data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html?context=cdpaas&locale=en#data) are what you work with\. Data assets often consist of raw data that you work with to refine\. + * [Tools and their associated assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html?context=cdpaas&locale=en#tools) are how you work with data\. + * [Environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html?context=cdpaas&locale=en#env) are how you configure compute resources for running assets in tools\. + * [Jobs](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html?context=cdpaas&locale=en#jobs) are how you manage and schedule the running of assets in tools\. + * [Project documentation](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html?context=cdpaas&locale=en#docs) and notifications are how you stay informed about what's happening in the project\. + * [Asset storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html?context=cdpaas&locale=en#storage) is where project information and files are stored\. + * [Integrations](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html?context=cdpaas&locale=en#integ) are how you incorporate external tools\. + + + +You can customize projects to suit your goals\. You can change the contents of your project and almost all of its properties at any time\. However, you must make these choices when you create the project because you can't change them later: + + + + * The instance of IBM Cloud Object Storage to use for project storage\. + + + +You can view projects that you create and collaborate in by selecting **Projects > View all projects** in the navigation menu, or by viewing the **Projects** pane on the main page\. + +## Collaboration in projects ## + +As a project creator, you can add other collaborators and assign them roles that control which actions they can take\. You automatically have the **Admin** role in the project, and if you give other collaborators the **Admin** role, they can add collaborators too\. See [Adding collaborators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html) and [Project collaborator roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborator-permissions.html)\. + +Tip: If appropriate, add at least one other user as a project administrator to ensure that someone is able to manage the project if you are unavailable\. + +### Collaboration on assets ### + +All collaborators work with the same copy of each asset\. Only one collaborator can edit an asset at a time\. While a collaborator is editing an asset in a tool, that asset is locked\. Other collaborators can view a locked asset, but not edit it\. See [Managing assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-assets.html)\. + +## Data assets ## + +You can add these types of data assets to projects: + + + + * Data assets from local files or the Samples + * Connections to cloud and on\-premises data sources + * Connected data assets from an existing connection asset that provide read\-only access to a table or file in an external data source + * Folder data assets to view the files within a folder in a file system + + + +Learn more about data assets: + + + + * [Connectors](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + * [Adding data to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html) + * [Data asset types and their properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html#data) + * [Searching for assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/search-assets.html) + + + +## Tools and their associated assets ## + +When you run a tool, you create an asset that contains the information for a specific goal\. For example, when you run the Data Refinery tool, you create a Data Refinery flow asset that defines the set of ordered operations to run on a specific data asset\. Each tool has one or more types of associated assets that run in the tool\. + +For a mapping of assets to the tools that you use to create them, see [Asset types and properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html)\. + +## Environments ## + +Environments control your compute resources\. An environment template specifies hardware and software resources to instantiate the environment runtimes that run your assets in tools\. + +Some tools have an automatically selected environment template\. However, for other tools, you can choose between multiple environments\. When you create an asset in a tool, you assign an environment to it\. You can change the environment for an asset when you run it\. + +Watson Studio includes a set of default environment templates that vary by coding language, tool, and compute engine type\. You can also create custom environment templates or add services that provide environment templates\. + +The compute resources that you consume in a project are tracked\. Depending on your offering plan, you have a limit to your monthly compute resources or you pay for all compute resources\. + +See [Environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html)\. + +## Jobs ## + +A job is a single run of an asset in a tool with a specified environment runtime\. You can schedule one or repeating jobs, monitor, edit, stop, or cancel jobs\. See [Jobs](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html)\. + +## Asset storage ## + +Each project has a dedicated, secure storage bucket that contains: + + + + * Data assets that you upload to the project as files\. + * Data assets from files that you copy from another workspace\. + * Files that you save to the project with a tool\. + * Files for assets that run in tools, such as notebooks\. + * Saved models\. + * The project readme file and internal project files\. + + + +When you create a project, you must select an instance of IBM Cloud Object Storage or create a new instance\. You cannot change the IBM Cloud Object Storage instance after you create the workspace\. See [Object storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/storage-options.html)\. + +When you delete a project, its storage bucket is also deleted\. + +## Integrations with external tools ## + +Integrations provide a method to interact with tools that are external to the project\. + +You can integrate with a Git repository to [publish notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/github-integration.html)\. + +## Project documentation and notifications ## + +While you create a project, you can add a short description to document the purpose or goal of the project\. You can edit the description later, on the project's **Settings** page\. + +You can mark the project as sensitive\. When users open a project that is marked as sensitive, a notification is displayed stating that no data assets can be downloaded or exported from the project\. + +The **Overview** page of a project contains a readme file where you can document the status or results of the project\. The readme file uses standard [Markdown formatting](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/markd-jupyter.html)\. Collaborators with the **Admin** or **Editor** role can edit the readme file\. + +You can view recent asset activity in the **Assets** pane on the **Overview** page, and filter the assets by selecting **By you** or **By all** using the dropdown\. **By you** lists assets that you edited, ordered by most recent\. **By all** lists assets that are edited by others and also by you, ordered by most recent\. + +All collaborators in a project are notified when a collaborator changes an asset\. + +## Learn more ## + + + + * [Your sandbox project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/sandbox.html) + * [Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html) + * [Administering a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/admin-project.html) + * [Adding collaborators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html) + * [Managing assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-assets.html) + * [Downloading data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/download.html) + * [Environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html) + * [Jobs](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html) + * [Adding data](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html) + * [Marking a project as sensitive](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/mark-sensitive.html) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7946dcf2f69a7420490a7b5ca677c2273de5764b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7946dcf2f69a7420490a7b5ca677c2273de5764b.md new file mode 100644 index 0000000..81c7027 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7946dcf2f69a7420490a7b5ca677c2273de5764b.md @@ -0,0 +1,94 @@ +# Microsoft SQL Server connection + +# Microsoft SQL Server connection # + +You can create a connection asset for Microsoft SQL Server\. + +Microsoft SQL Server is a relational database management system\. + +## Supported versions ## + + + + * Microsoft SQL Server 2000\+ + * Microsoft SQL Server 2000 Desktop Engine (MSDE 2000) + * Microsoft SQL Server 7\.0 + + + +## Create a connection to Microsoft SQL Server ## + +To create the connection asset, you need the following connection details: + + + + * Database name + * Hostname or IP address + * Either the Port number or the Instance name\. If the server is configured for dynamic ports, use the Instance name\. + * Username and password + * Select **Use Active Directory** if the Microsoft SQL Server has been set up in a domain that uses NTLM (New Technology LAN Manager) authentication\. Then enter the name of the domain that is associated with the username and password + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Microsoft SQL Server connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Decision Optimization + * Notebooks\. Click **Read data** on the **Code snippets** pane to get the connection credentials and load the data into a data structure\. See [Load data from data source connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html#conns)\. + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Microsoft SQL Server setup ## + +[Microsoft SQL Server installation](https://docs.microsoft.com/en-us/sql/database-engine/install-windows/install-sql-server?view=sql-server-ver15) + +## Restriction ## + +Except for NTLM authentication, Windows Authentication is not supported\. + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [Transact\-SQL Reference](https://docs.microsoft.com/en-us/sql/t-sql/language-reference?view=sql-server-ver15) for the correct syntax\. + +## Learn more ## + +[Microsoft SQL Server documentation](https://docs.microsoft.com/en-us/sql/sql-server/?view=sql-server-ver15) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7985570f01d50d057ebd4fafcf8c8a1bcacb3006.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7985570f01d50d057ebd4fafcf8c8a1bcacb3006.md new file mode 100644 index 0000000..aa1b2cd --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7985570f01d50d057ebd4fafcf8c8a1bcacb3006.md @@ -0,0 +1,31 @@ +# extensionmodelnode properties + +# extensionmodelnode properties # + +![Extension Model node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/extensionmodelnode.png)With the Extension Model node, you can run R or Python for Spark scripts to build and score results\. + +Note that many of the properties and much of the information on this page is only applicable to SPSS Modeler Desktop streams\. + + + +extensionmodelnode properties + +Table 1\. extensionmodelnode properties + +| `extensionmodelnode` Properties | Values | Property description | +| ------------------------------- | ---------------------------------------- | ----------------------------------------------------------------------------------------- | +| `syntax_type` | *R**Python* | Specify which script runs: R or Python (R is the default)\. | +| `r_build_syntax` | *string* | The R scripting syntax for model building\. | +| `r_score_syntax` | *string* | The R scripting syntax for model scoring\. | +| `python_build_syntax` | *string* | The Python scripting syntax for model building\. | +| `python_score_syntax` | *string* | The Python scripting syntax for model scoring\. | +| `convert_flags` | `StringsAndDoubles`
`LogicalValues` | Option to convert flag fields\. | +| `convert_missing` | *flag* | Option to convert missing values to R NA value\. | +| `convert_datetime` | *flag* | Option to convert variables with date or datetime formats to R date/time formats\. | +| `convert_datetime_class` | `POSIXct`

`POSIXlt`
| Options to specify to what format variables with date or datetime formats are converted\. | +| `output_html` | *flag* | Option to display graphs in the R model nugget\. | +| `output_text` | *flag* | Option to write R console text output to the R model nugget\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/799ce322c90ecad9cc4bacad45f9749ec21e912e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/799ce322c90ecad9cc4bacad45f9749ec21e912e.md new file mode 100644 index 0000000..64369ae --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/799ce322c90ecad9cc4bacad45f9749ec21e912e.md @@ -0,0 +1,16 @@ +# The Text links tab (SPSS Modeler) + +# The Text links tab # + +On the Text links tab, you can build and explore text link analysis patterns found in your text data\. Text link analysis (TLA) is a pattern\-matching technology that enables you to define TLA rules and compare them to actual extracted concepts and relationships found in your text\. + +Patterns are most useful when you are attempting to discover relationships between concepts or opinions about a particular subject\. Some examples include wanting to extract opinions on products from survey data, genomic relationships from within medical research papers, or relationships between people or places from intelligence data\. + +After you've extracted some TLA patterns, you can explore them and even add them to categories\. To extract TLA results, there must be some TLA rules defined in the resource template or libraries you're using\. + +With no type patterns selected, you can click the Settings icon to change the extraction settings\. For details, see [Setting options](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/tmwb_intro_options.html)\. You can also click the Filter icon to filter the type patterns that are displayed + +Figure 1\. Text links view + +![Text links view](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tmwb_tlaview.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7a9f4cdf362d1f06c3644edbd634b2a77ddc6005.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7a9f4cdf362d1f06c3644edbd634b2a77ddc6005.md new file mode 100644 index 0000000..e94dd40 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7a9f4cdf362d1f06c3644edbd634b2a77ddc6005.md @@ -0,0 +1,25 @@ +# balancenode properties + +# balancenode properties # + +![Balance node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/balancenodeicon.png) The Balance node corrects imbalances in a dataset, so it conforms to a specified condition\. The balancing directive adjusts the proportion of records where a condition is true by the factor specified\. + + + +balancenode properties + +Table 1\. balancenode properties + +| `balancenode` properties | Data type | Property description | +| ------------------------ | --------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `directives` | | Structured property to balance proportion of field values based on number specified\. | +| `training_data_only` | *flag* | Specifies that only training data should be balanced\. If no partition field is present in the stream, then this option is ignored\. | + + + +This node property uses the format: + +\[\[ *number, string* \] \\ \[ *number, string*\] \\ \.\.\. \[*number, string* \]\]\. + +Note: If strings (using double quotation marks) are embedded in the expression, they must be preceded by the escape character `" \ "`\. The `" \ "` character is also the line continuation character, which you can use to align the arguments for clarity\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7b3616d29e7ac720b73ef3e24c9c807da05c4da3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7b3616d29e7ac720b73ef3e24c9c807da05c4da3.md new file mode 100644 index 0000000..494a7bb --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7b3616d29e7ac720b73ef3e24c9c807da05c4da3.md @@ -0,0 +1,6 @@ +# Series array charts + +# Series array charts # + +Series array charts include individual sub charts and display the Y\-axis for all sub charts in the legend\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7b586e10794f26ea2654a7f7c34ec9ea48c8bfd4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7b586e10794f26ea2654a7f7c34ec9ea48c8bfd4.md new file mode 100644 index 0000000..5ee969f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7b586e10794f26ea2654a7f7c34ec9ea48c8bfd4.md @@ -0,0 +1,16 @@ +# Means node (SPSS Modeler) + +# Means node # + +The Means node compares the means between independent groups or between pairs of related fields to test whether a significant difference exists\. For example, you can compare mean revenues before and after running a promotion or compare revenues from customers who didn't receive the promotion with those who did\. + +You can compare means in two different ways, depending on your data: + + + + * Between groups within a field\. To compare independent groups, select a test field and a grouping field\. For example, you could exclude a sample of "holdout" customers when sending a promotion and compare mean revenues for the holdout group with all of the others\. In this case, you would specify a single test field that indicates the revenue for each customer, with a flag or nominal field that indicates whether they received the offer\. The samples are independent in the sense that each record is assigned to one group or another, and there is no way to link a specific member of one group to a specific member of another\. You can also specify a nominal field with more than two values to compare the means for multiple groups\. When executed, the node calculates a one\-way ANOVA test on the selected fields\. In cases where there are only two field groups, the one\-way ANOVA results are essentially the same as an independent\-samples `t` test\. + * Between pairs of fields\. When comparing means for two related fields, the groups must be paired in some way for the results to be meaningful\. For example, you could compare the mean revenues from the same group of customers before and after running a promotion or compare usage rates for a service between husband\-wife pairs to see if they are different\. Each record contains two separate but related measures that can be compared meaningfully\. When executed, the node calculates a paired\-samples `t` test on each field pair selected\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7b8b04b66e56fa847f1aca3218eb99f3e568eec7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7b8b04b66e56fa847f1aca3218eb99f3e568eec7.md new file mode 100644 index 0000000..1c371fb --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7b8b04b66e56fa847f1aca3218eb99f3e568eec7.md @@ -0,0 +1,222 @@ +# Building a time series experiment + +# Building a time series experiment # + +Use AutoAI to create a time series experiment to predict future activity, such as stock prices or temperatures, over a specified date or time range\. + +## Time series overview ## + +A time series experiment is a method of forecasting that uses historical observations to predict future values\. The experiment automatically builds many pipelines using machine learning models, such as random forest regression and Support Vector Machines (SVMs), as well as statistical time series models, such as ARIMA and Holt\-Winters\. Then, the experiment recommends the best pipeline according to the pipeline performance evaluated on a holdout data set or backtest data sets\. + +Unlike a standard AutoAI experiment, which builds a set of pipelines to completion then ranks them\. A time series experiment evaluates pipelines earlier in the process and only completes and test the best\-performing pipelines\. + +![AutoAI time series pipeline generation process](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/ts-pipelines.png) + +For details on the various stages of training and testing a time series experiment, see [Time series implementation details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries-details.html)\. + +## Predicting anomalies in a time series experiment ## + +You can configure your time series experiment to predict anomalies (outliers) in your data or predictions\. To configure anomaly prediction for your experiment, follow the steps in [Creating a time series anomaly prediction model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-ap.html)\. + +## Using supporting features to improve predictions ## + +When you configure your time series experiment, you can choose to specify *supporting features*, also known as *exogenous features*\. Supporting features are features that influence or add context to the prediction target\. For example, if you are forecasting ice cream sales, daily temperature would be a logical supporting feature that would make the forecast more accurate\. + +### Leveraging future values for supporting features ### + +If you know the future values for the supporting features, you can leverage those future values when you deploy the model\. For example, if you are training a model to forecast future t\-shirt sales, you can include promotional discounts as a supporting feature to enhance the prediction\. Inputting the *future value* of the promotion then makes the forecast more accurate\. + +## Data requirements ## + +These are the current data requirements for training a time series experiment: + + + + * The training data must be a single file in CSV format\. + * The file must contain one or more time series columns and optionally contain a timestamp column\. For a list of supported date/time formats, see [AutoAI time series implementation details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries-details.html)\. + * If the data source contains a timestamp column, ensure that the data is sampled at uniform frequency\. That is, the difference in timestamps of adjacent rows is the same\. For example, data can be in increments of 1 minute, 1 hour, or one day\. The specified timestamp is used to determine the lookback window to improve the model accuracy\. + + Note:If the file size is larger than 1 GB, sort the data in *descending* order by the timestamp, and only the first 1 GB is used to train the experiment. + * If the data source does not contain a timestamp column, ensure that the data is sampled at regular intervals and sorted in *ascending* order according to the sample date/time\. That is, the value in the first row is the oldest, and the value in the last row is the most recent\. + + Note: If the file size is larger than 1 GB, truncate the file so it is smaller than 1 GB. + * Select what data to use when training the final pipelines\. If you choose to include training data only, the generated notebooks will include a cell for retrieving the holdout data used to evaluate each pipeline\. + + + +Choose data from your project or upload it from your file system or from the asset browser, then click **Continue**\. Click the preview icon ![AutoAI preview data set icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-preview-icon.png), after the data source name to review your data\. Optionally, you can add a second file as holdout data for testing the trained pipelines\. + +## Configuring a time series experiment ## + +When you configure the details for an experiment, click **Yes** to *Enable time series* and complete the experiment details\. + + + +| Field | Description | +| ------------------ | -------------------------------------------------------------------------------------------------------------------------------- | +| Prediction columns | The time series columns that you want to predict based on the previous values\. You can specify one or more columns to predict\. | +| Date/time column | The column that indicates the date/time at which the time series values occur\. | +| Lookback window | A parameter that indicates how many previous time series values are used to predict the current time point\. | +| Forecast window | The range that you want to predict based on the data in the lookback window\. | + + + +The prediction summary shows you the experiment type and the metric that is selected for optimizing the experiment\. + +## Configuring experiment settings ## + +To configure more details for your time series experiment, click **Experiment settings**\. + +### General prediction settings ### + +On the *General* panel for prediction settings, you can optionally change the metric used to optimize the experiment or specify the algorithms to consider or the number of pipelines to generate\. + + + +| Field | Description | +| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Prediction type | View or change the prediction type based on prediction column for your experiment\. For time series experiments, *Time series forecast* is selected by default\.
**Note:** If you change the prediction type, other prediction settings for your experiment are automatically changed\. | +| Optimized metric | View or change the recommended optimized metric for your experiment\. | +| Optimized algorithm selection | Not supported for time series experiments\. | +| Algorithms to include | Select algorithms based on which you want your experiment to create pipelines\. Algorithms and pipelines that support the use of supporting features, are indicated by a checkmark\. | +| Pipelines to complete | View or change the number of pipelines to generate for your experiment\. | + + + +### Time series configuration details ### + +On the Time series pane for prediction settings, configure the details for how to train the experiment and generate predictions\. + + + +| Field | Description | +| ---------------- | ------------------------------------------------------------------------------------------------- | +| Date/time column | View or change the date/time column for the experiment\. | +| Lookback window | View or update the number of previous time series values used to predict the current time point\. | +| Forecast window | View or update the range that you want to predict based\. | + + + +## Configuring data source settings ## + +To configure details for your input data, click **Experiment settings** and select **Data source**\. + +### General data source settings ### + +On the *General* panel for data source settings, you can modify your dataset to interpolate missing values, split your dataset into training and holdout data, and input supporting features\. + + + +| Field | Description | +| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Duplicate rows | Not supported for time series experiments\. | +| Subsample data | Not supported for time series experiments\. | +| Text feature engineering | Not supported for time series experiments\. | +| Final training data set | Select what data to use when training the final pipelines: just the training data or the training and holdout data\. If you choose to include training data only, generated notebooks for this experiment will include a cell for retrieving the holdout data used to evaluate each pipeline\. | +| Supporting features | Choose additional columns from your data set as Supporting features to support predictions and increase your model’s accuracy\. You can also use future values for Supporting features by enabling **Leverage future values of supporting features**\.
**Note:** You can only use supporting features with selected algorithms and pipelines\. For more information on algorithms and pipelines that support the use of supporting features, see [Time series implementation details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries-details.html)\. | +| Data imputation | Use data imputation to replace missing values in your dataset with substituted values\. By enabling this option, you can specify how missing values should be interpolated in your data\. To learn more about data imputation, see Data imputation in AutoAI experiments\. | +| Training and holdout data | Choose to reserve some data from your training data set to test the experiment\. Alternatively, upload a separate file of holdout data\. The holdout data file must match the schema of the training data\. | + + + +## Configuring time series data ## + +To configure the time series data, you can adjust the settings for the time series data that is related to *backtesting* the experiment\. Backtesting provides a means of validating a time\-series model by using historical data\. + +In a typical machine learning experiment, you can hold back part of the data randomly to test the resulting model for accuracy\. To validate a time series model, you must preserve the time order relationship between the training data and testing data\. + +The following steps describe the backtest method: + + + +1. The training data length is determined based on the number of backtests, gap length, and holdout size\. To learn more about these parameters, see [Building a time series experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries.html?context=cdpaas&locale=en)\. +2. Starting from the oldest data, the experiment is trained using the training data\. +3. The experiment is evaluated on the first validation data set\. If the gap length is non\-zero, any data in the gap is skipped over\. +4. The training data window is advanced by increasing the holdout size and gap length to form a new training set\. +5. A fresh experiment is trained with this new data and evaluated with the next validation data set\. +6. The prior two steps are repeated for the remaining backtesting periods\. + + + +To adjust the backtesting configuration: + + + +1. Open **Experiment settings**\. +2. From *Data sources*, click the **Time series**\. +3. (Optional): Adjust the settings as shown in the table\. + + + + + +| Field | Description | +| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Number of backtests | Backtesting is similar to cross\-validation for date/time periods\. Optionally customize the number of backtests for your experiment\. | +| Holdout | The size of the holdout set and each validation set for backtesting\. The validation length can be adjusted by changing the holdout length\. | +| Gap length | The number of time points between the training data set and validation data set for each backtest\. When the parameter value is non\-zero, the time series values in the gap will not be used to train the experiment or evaluate the current backtest\. | + + + +![Experiment settings on Data Source page](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_uni_exp_settings.png) + +The visualization for the configuration settings illustrates the backtesting flow\. The graphic is interactive, so you can manipulate the settings from the graphic or from the configuration fields\. For example, by adjusting the gap length, you can see model validation results on earlier time periods of the data without increasing the number of backtests\. + +## Interpreting the experiment results ## + +After you run your time series experiment, you can examine the resulting pipelines to get insights into the experiment details\. Pipelines that use Supporting features are indicated by SUP enhancement tag to distinguish them from pipelines that don’t use these features\. To view details: + + + + * Hover over nodes on the visualization to get details about the pipelines as they are being generated\. + * Toggle to the Progress Map view to see a different view of the training process\. You can hover over each node in the process for details\. + * After the final pipelines are completed and written to the leaderboard, you can click a pipeline to see the performance details\. + * Click **View discarded pipelines** to view the algorithms that are used for the pipelines that are not selected as top performers\. + * Save the experiment code as notebook that you can review\. + * Save a particular pipeline as a notebook that you can review\. + + + +Watch this video to see how to run a time series experiment and create a model in a Jupyter notebook using training and holdout data\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Next steps ## + + + + * Follow a step\-by\-step tutorial to [train a univariate time series model to predict minimum temperatures by using sample data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-uni-tutorial.html)\. + * Follow a step\-by\-step tutorial to [train a time series experiment with supporting features](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-tut-sup.html)\. + * Learn about [scoring a deployed time series model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-score.html)\. + * Learn about using the [API for AutoAI time series experiments](https://lukasz-cmielowski.medium.com/predicting-covid19-cases-with-autoai-time-series-api-f6793acee48d)\. + + + +## Additional resources ## + + + + * For an introduction to forecasting with AutoAI time series experiments, see the blog post [Right on time(series): Introducing Watson Studio’s AutoAI Time Series](https://medium.com/ibm-data-ai/right-on-time-series-introducing-watson-studios-autoai-time-series-5175dbe66154)\. + * For more information about creating a time series experiment, see this blog post about [creating a new time series experiment](https://medium.com/ibm-data-ai/right-on-time-series-introducing-watson-studios-autoai-time-series-5175dbe66154)\. + * Read a blog post about [adding supporting features to a time series experiment](https://medium.com/ibm-data-ai/improve-autoai-time-series-forecasts-with-supporting-features-using-ibm-cloud-pak-for-data-as-a-ff24cc85f6b8)\. + * Review a [sample notebook](https://github.com/IBM/watson-machine-learning-samples/blob/master/cloud/notebooks/python_sdk/experiments/autoai/Use%20AutoAI%20and%20timeseries%20data%20with%20supporting%20features%20to%20predict%20PM2.5.ipynb) for a time series experiment with supporting features\. + * Read a blog post about [adding supporting features to a time series experiment using the API](https://medium.com/ibm-data-ai/forecasting-pm2-5-using-autoai-time-series-api-with-supporting-features-12bbad18cb36)\. + + + +## Next steps ## + + + + * [Tutorial: AutoAI univariate time series experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-uni-tutorial.html) + * [Tutorial: AutoAI supporting features time series experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-tut-sup.html) + * [Time series experiment implementation details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries-details.html) + * [Scoring a time series model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-score.html) + + + +**Parent topic:**[AutoAI overview](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7b9348596e2f005f89842d1b997fa09bdcbe8f06.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7b9348596e2f005f89842d1b997fa09bdcbe8f06.md new file mode 100644 index 0000000..e8437ca --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7b9348596e2f005f89842d1b997fa09bdcbe8f06.md @@ -0,0 +1,44 @@ +# Conventions and function descriptions (SPSS Modeler) + +# Conventions in function descriptions # + +This page describes the conventions used throughout this guide when referring to items in a function\. + + + +Conventions in function descriptions + +Table 1\. Conventions in function descriptions + +| Convention | Description | +| ------------------------ | ---------------------------------------------------------------------------------------- | +| *BOOL* | A Boolean, or flag, such as true or false\. | +| *NUM*, *NUM1*, *NUM2* | Any number\. | +| *REAL*, *REAL1*, *REAL2* | Any real number, such as `1.234` or `–77.01`\. | +| *INT*, *INT1*, *INT2* | Any integer, such as `1` or `–77`\. | +| *CHAR* | A character code, such as `` `A` ``\. | +| *STRING* | A string, such as `"referrerID"`\. | +| *LIST* | A list of items, such as `["abc" "def"]` or `[A1, A2, A3]` or `[1 2 4 16]`\. | +| *ITEM* | A field, such as `Customer` or `extract_concept`\. | +| *DATE* | A date field, such as `start_date`, where values are in a format such as `DD-MON-YYYY`\. | +| *TIME* | A time field, such as `power_flux`, where values are in a format such as `HHMMSS`\. | + + + +Functions in this guide are listed with the function in one column, the result type (integer, string, and so on) in another, and a description (where available) in a third column\. For example, following is a description of the `rem` function\. + + + +rem function description + +Table 2\. rem function description + +| Function | Result | Description | +| --------------- | -------- | -------------------------------------------------------------------------------------------------- | +| `INT1 rem INT2` | *Number* | Returns the remainder of *INT1* divided by *INT2*\. For example, `INT1 – (INT1 div INT2)* INT2`\. | + + + +Details on usage conventions, such as how to list items or specify characters in a function, are described elsewhere\. See [CLEM datatypes](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_datatypes.html#clem_datatypes) for more information\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7bab40e15d18920009e4168c32265a950a8afe38.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7bab40e15d18920009e4168c32265a950a8afe38.md new file mode 100644 index 0000000..ca45559 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7bab40e15d18920009e4168c32265a950a8afe38.md @@ -0,0 +1,84 @@ +# Managing compute resources + +## Managing compute resources ## + +If you have the **Admin** role or **Editor** in a project, you can perform management tasks for environments\. + + + + * [Create an environment template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-customize-env-definition.html) + * [Customize an environment template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/customize-envs.html) + * [Stop active runtimes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html?context=cdpaas&locale=en#stop-active-runtimes) + * [Promote an environment template to a space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/promote-envs.html) + * [Track capacity unit consumption of runtimes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/track-runtime-usage.html) + + + +## Stop active runtimes ## + +You should stop all active runtimes when you no longer need them to prevent consuming extra capacity unit hours (CUHs)\. + +Jupyter notebook runtimes are started per user and not per notebook\. Stopping a notebook kernel doesn't stop the environment runtime in which the kernel is started because you could have started other notebooks in the same environment\. You should only stop a notebook runtime if you are sure that no other notebook kernels are active\. + +Only runtimes that are started for jobs are automatically shut down after the scheduled job has completed\. For example, if you schedule to run a notebook once a day for 2 months, the runtime instance will be activated every day for the duration of the scheduled job and deactivated again after the job has finished\. + +Project users with **Admin** role can stop all runtimes in the project\. Users added to the project with **Editor** role can stop the runtimes they started, but can't stop other project users' runtimes\. Users added to the project with the viewer role can't see the runtimes in the project\. + +You can stop runtimes from: + + + + * The **Environment Runtimes** page, which lists all active runtimes across all projects for your account, by clicking **Administration > Environment runtimes** from the Watson Studio navigation menu\. + * Under **Tool runtimes** on the **Environments** page on the **Manage** tab of your project, which lists the active runtimes for a specific project\. + * The **Environments** page when you click the Notebook Info icon (![Notebook Info icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/get-information_32.png)) from the notebook toolbar in the notebook editor\. You can stop the runtime under **Runtime status**\. + + + +Idle timeouts for: + + + + * [Jupyter notebook runtimes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html?context=cdpaas&locale=en#cpu) + * [Spark runtimes for notebooks and Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html?context=cdpaas&locale=en#spark) + * [Notebook with GPU runtimes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html?context=cdpaas&locale=en#gpu) + * [RStudio runtimes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html?context=cdpaas&locale=en#rstudio) + + + +### Jupyter notebook idle timeout ### + +Runtime idle times differ for the Jupyter notebook runtimes depending on your Watson Studio plan\. + + + +Idle timeout for default CPU runtimes + +| Plan | Idle timeout | +| --------------------------- | ------------------------------------------------------------ | +| Lite | \- Idle stop time: 1 hour
\- CUH limit: 10 CUHs | +| Professional | \- Idle stop time: 1 hour
\- CUH limit: no limit | +| Standard (Legacy) | \- Idle stop time: 1 hour
\- CUH limit: no limit | +| Enterprise (Legacy) | \- Idle stop time: 3 hours
\- CUH limit: no limit | +| All plans
Free runtime | \- Idle stop time: 1 hour
\- Maximum lifetime: 12 hours | + + + +Important: A runtime is started per user and not per notebook\. Stopping a notebook kernel doesn't stop the environment runtime in which the kernel is started because you could have started other notebooks in the same environment\. Only stop a runtime if you are sure that no kernels are active\. + +### Spark idle timeout ### + +All Spark runtimes, for example for notebook and Data Refinery, are stopped after 3 hours of inactivity\. The `Default Data Refinery XS runtime` that is used when you refine data in Data Refinery is stopped after an idle time of 1 hour\. + +Spark runtimes that are started when a job is started, for example to run a Data Refinery flow or a notebook, are stopped when the job finishes\. + +### GPU idle timeout ### + +All GPU runtimes are automatically stopped after 3 hours of inactivity for Enterprise plan users and after 1 hour of inactivity for other paid plan users\. + +### RStudio idle timeout ### + +An RStudio is stopped for you after an idle time of 2 hour\. During this idle time, you will continue to consume CUHs for which you are billed\. Long compute\-intensive jobs are hard stopped after 24 hours\. + +**Parent topic:**[Projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7bf4b8f1f49406eec43be3b7350092f9165b0757.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7bf4b8f1f49406eec43be3b7350092f9165b0757.md new file mode 100644 index 0000000..8b671b0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7bf4b8f1f49406eec43be3b7350092f9165b0757.md @@ -0,0 +1,197 @@ +# SPSS predictive analytics classification and regression algorithms in notebooks + +# SPSS predictive analytics classification and regression algorithms in notebooks # + +You can use generalized linear model, linear regression, linear support vector machine, random trees, or CHAID SPSS predictive analytics algorithms in notebooks\. + +## Generalized Linear Model ## + +The Generalized Linear Model (GLE) is a commonly used analytical algorithm for different types of data\. It covers not only widely used statistical models, such as linear regression for normally distributed targets, logistic models for binary or multinomial targets, and log linear models for count data, but also covers many useful statistical models via its very general model formulation\. In addition to building the model, Generalized Linear Model provides other useful features such as variable selection, automatic selection of distribution and link function, and model evaluation statistics\. This model has options for regularization, such as LASSO, ridge regression, elastic net, etc\., and is also capable of handling very wide data\. + +For more details about how to choose distribution and link function, see Distribution and Link Function Combination\. + +**Example code 1:** + +This example shows a GLE setting with specified distribution and link function, specified effects, intercept, conducting ROC curve, and printing correlation matrix\. This scenario builds a model, then scores the model\. + +Python example: + + from spss.ml.classificationandregression.generalizedlinear import GeneralizedLinear + from spss.ml.classificationandregression.params.effect import Effect + + gle1 = GeneralizedLinear(). \ + setTargetField("Work_experience"). \ + setInputFieldList(["Beginning_salary", "Sex_of_employee", "Educational_level", "Minority_classification", "Current_salary"]). \ + setEffects([ + Effect(fields="Beginning_salary"], nestingLevels=0]), + Effect(fields="Sex_of_employee"], nestingLevels=0]), + Effect(fields="Educational_level"], nestingLevels=0]), + Effect(fields="Current_salary"], nestingLevels=0]), + Effect(fields="Sex_of_employee", "Educational_level"], nestingLevels=0, 0])]). \ + setIntercept(True). \ + setDistribution("NORMAL"). \ + setLinkFunction("LOG"). \ + setAnalysisType("BOTH"). \ + setConductRocCurve(True) + + gleModel1 = gle1.fit(data) + PMML = gleModel1.toPMML() + statXML = gleModel1.statXML() + predictions1 = gleModel1.transform(data) + predictions1.show() + +**Example code 2:** + +This example shows a GLE setting with unspecified distribution and link function, and variable selection using the forward stepwise method\. This scenario uses the forward stepwise method to select distribution, link function and effects, then builds and scores the model\. + +Python example: + + from spss.ml.classificationandregression.generalizedlinear import GeneralizedLinear + from spss.ml.classificationandregression.params.effect import Effect + + gle2 = GeneralizedLinear(). \ + setTargetField("Work_experience"). \ + setInputFieldList(["Beginning_salary", "Sex_of_employee", "Educational_level", "Minority_classification", "Current_salary"]). \ + setEffects([ + Effect(fields="Beginning_salary"], nestingLevels=0]), + Effect(fields="Sex_of_employee"], nestingLevels=0]), + Effect(fields="Educational_level"], nestingLevels=0]), + Effect(fields="Current_salary"], nestingLevels=0])]). \ + setIntercept(True). \ + setDistribution("UNKNOWN"). \ + setLinkFunction("UNKNOWN"). \ + setAnalysisType("BOTH"). \ + setUseVariableSelection(True). \ + setVariableSelectionMethod("FORWARD_STEPWISE") + + gleModel2 = gle2.fit(data) + PMML = gleModel2.toPMML() + statXML = gleModel2.statXML() + predictions2 = gleModel2.transform(data) + predictions2.show() + +**Example code 3:** + +This example shows a GLE setting with unspecified distribution, specified link function, and variable selection using the LASSO method, with two\-way interaction detection and automatic penalty parameter selection\. This scenario detects two\-way interaction for effects, then uses the LASSO method to select distribution and effects using automatic penalty parameter selection, then builds and scores the model\. + +Python example: + + from spss.ml.classificationandregression.generalizedlinear import GeneralizedLinear + from spss.ml.classificationandregression.params.effect import Effect + + gle3 = GeneralizedLinear(). \ + setTargetField("Work_experience"). \ + setInputFieldList(["Beginning_salary", "Sex_of_employee", "Educational_level", "Minority_classification", "Current_salary"]). \ + setEffects([ + Effect(fields="Beginning_salary"], nestingLevels=0]), + Effect(fields="Sex_of_employee"], nestingLevels=0]), + Effect(fields="Educational_level"], nestingLevels=0]), + Effect(fields="Current_salary"], nestingLevels=0])]). \ + setIntercept(True). \ + setDistribution("UNKNOWN"). \ + setLinkFunction("LOG"). \ + setAnalysisType("BOTH"). \ + setDetectTwoWayInteraction(True). \ + setUseVariableSelection(True). \ + setVariableSelectionMethod("LASSO"). \ + setUserSpecPenaltyParams(False) + + gleModel3 = gle3.fit(data) + PMML = gleModel3.toPMML() + statXML = gleModel3.statXML() + predictions3 = gleModel3.transform(data) + predictions3.show() + +## Linear Regression ## + +The linear regression model analyzes the predictive relationship between a continuous target and one or more predictors which can be continuous or categorical\. + +Features of the linear regression model include automatic interaction effect detection, forward stepwise model selection, diagnostic checking, and unusual category detection based on Estimated Marginal Means (EMMEANS)\. + +**Example code:** + +Python example: + + from spss.ml.classificationandregression.linearregression import LinearRegression + + le = LinearRegression(). \ + setTargetField("target"). \ + setInputFieldList(["predictor1", "predictor2", "predictorn"]). \ + setDetectTwoWayInteraction(True). \ + setVarSelectionMethod("forwardStepwise") + + leModel = le.fit(data) + predictions = leModel.transform(data) + predictions.show() + +## Linear Support Vector Machine ## + +The Linear Support Vector Machine (LSVM) provides a supervised learning method that generates input\-output mapping functions from a set of labeled training data\. The mapping function can be either a classification function or a regression function\. LSVM is designed to resolve large\-scale problems in terms of the number of records and the number of variables (parameters)\. Its feature space is the same as the input space of the problem, and it can handle sparse data where the average number of non\-zero elements in one record is small\. + +**Example code:** + +Python example: + + from spss.ml.classificationandregression.linearsupportvectormachine import LinearSupportVectorMachine + + lsvm = LinearSupportVectorMachine().\ + setTargetField("BareNuc").\ + setInputFieldList(["Clump", "UnifSize", "UnifShape", "MargAdh", "SingEpiSize", "BlandChrom", "NormNucl", "Mit", "Class"]).\ + setPenaltyFunction("L2") + + lsvmModel = lsvm.fit(df) + predictions = lsvmModel.transform(data) + predictions.show() + +## Random Trees ## + +Random Trees is a powerful approach for generating strong (accurate) predictive models\. It's comparable and sometimes better than other state\-of\-the\-art methods for classification or regression problems\. + +Random Trees is an ensemble model consisting of multiple CART\-like trees\. Each tree grows on a bootstrap sample which is obtained by sampling the original data cases with replacement\. Moreover, during the tree growth, for each node the best split variable is selected from a specified smaller number of variables that are drawn randomly from the full set of variables\. Each tree grows to the largest extent possible, and there is no pruning\. In scoring, Random Trees combines individual tree scores by majority voting (for classification) or average (for regression)\. + +**Example code:** + +Python example: + + from spss.ml.classificationandregression.ensemble.randomtrees import RandomTrees + + # Random trees required a "target" field and some input fields. If "target" is continuous, then regression trees will be generate else classification . + # You can use the SPSS Attribute or Spark ML Attribute to indicate the field to categorical or continuous. + randomTrees = RandomTrees(). \ + setTargetField("target"). \ + setInputFieldList(["feature1", "feature2", "feature3"]). \ + numTrees(10). \ + setMaxTreeDepth(5) + + randomTreesModel = randomTrees.fit(df) + predictions = randomTreesModel.transform(scoreDF) + predictions.show() + +## CHAID ## + +CHAID, or Chi\-squared Automatic Interaction Detection, is a classification method for building decision trees by using chi\-square statistics to identify optimal splits\. An extension applicable to regression problems is also available\. + +CHAID first examines the crosstabulations between each of the input fields and the target, and tests for significance using a chi\-square independence test\. If more than one of these relations is statistically significant, CHAID will select the input field that's the most significant (smallest p value)\. If an input has more than two categories, these are compared, and categories that show no differences in the outcome are collapsed together\. This is done by successively joining the pair of categories showing the least significant difference\. This category\-merging process stops when all remaining categories differ at the specified testing level\. For nominal input fields, any categories can be merged; for an ordinal set, only contiguous categories can be merged\. Continuous input fields other than the target can't be used directly; they must be binned into ordinal fields first\. + +Exhaustive CHAID is a modification of CHAID that does a more thorough job of examining all possible splits for each predictor but takes longer to compute\. + +**Example code:** + +Python example: + + from spss.ml.classificationandregression.tree.chaid import CHAID + + chaid = CHAID(). \ + setTargetField("salary"). \ + setInputFieldList(["educ", "jobcat", "gender"]) + + chaidModel = chaid.fit(data) + pmmlStr = chaidModel.toPMML() + statxmlStr = chaidModel.statXML() + + predictions = chaidModel.transform(data) + predictions.show() + +**Parent topic:**[SPSS predictive analytics algorithms](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spss-algorithms.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7c4f082004dba0b946d64aa6c0127041f4622c7b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7c4f082004dba0b946d64aa6c0127041f4622c7b.md new file mode 100644 index 0000000..1149b4b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7c4f082004dba0b946d64aa6c0127041f4622c7b.md @@ -0,0 +1,25 @@ +# lsvmnode properties + +# lsvmnode properties # + +![LSVM node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/lsvm_icon.png)With the Linear Support Vector Machine (LSVM) node, you can classify data into one of two groups without overfitting\. LSVM is linear and works well with wide data sets, such as those with a very large number of records\. + + + +lsvmnode properties + +Table 1\. lsvmnode properties + +| `lsvmnode` Properties | Values | Property description | +| ------------------------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `intercept` | *flag* | Includes the intercept in the model\. Default value is `True`\. | +| `target_order` | `Ascending``Descending` | Specifies the sorting order for the categorical target\. Ignored for continuous targets\. Default is `Ascending`\. | +| `precision` | *number* | Used only if measurement level of target field is `Continuous`\. Specifies the parameter related to the sensitiveness of the loss for regression\. Minimum is `0` and there is no maximum\. Default value is `0.1`\. | +| `exclude_missing_values` | *flag* | When `True`, a record is excluded if any single value is missing\. The default value is `False`\. | +| `penalty_function` | `L1``L2` | Specifies the type of penalty function used\. The default value is `L2`\. | +| `lambda` | *number* | Penalty (regularization) parameter\. | +| `calculate_variable_importance` | *flag* | For models that produce an appropriate measure of importance, this option displays a chart that indicates the relative importance of each predictor in estimating the model\. Note that variable importance may take longer to calculate for some models, particularly when working with large datasets, and is off by default for some models as a result\. Variable importance is not available for decision list models\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7c8bcafbd032e30dcc7c39e28a2b5de1e340da6b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7c8bcafbd032e30dcc7c39e28a2b5de1e340da6b.md new file mode 100644 index 0000000..e2042c9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7c8bcafbd032e30dcc7c39e28a2b5de1e340da6b.md @@ -0,0 +1,21 @@ +# applylogregnode properties + +# applylogregnode properties # + +You can use Logistic modeling nodes to generate a Logistic model nugget\. The scripting name of this model nugget is *applylogregnode*\. For more information on scripting the modeling node itself, [logregnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/logregnodeslots.html#logregnodeslots)\. + + + +applylogregnode properties + +Table 1\. applylogregnode properties + +| `applylogregnode` Properties | Values | Property description | +| ---------------------------- | ------ | -------------------- | +| `calculate_raw_propensities` | *flag* | | +| `calculate_conf` | *flag* | | +| `enable_sql_generation` | *flag* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7cef749c4ed4703d00346fcdef795d0431bc7c26.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7cef749c4ed4703d00346fcdef795d0431bc7c26.md new file mode 100644 index 0000000..e0ecdfe --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7cef749c4ed4703d00346fcdef795d0431bc7c26.md @@ -0,0 +1,60 @@ +# Browsing the flow (SPSS Modeler) + +# Building the flow # + + + +1. Add a Data Asset node that points to pm\_customer\_train1\.csv\. + + Figure 1. SLRM example flow + + ![SLRM example flow](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_selflearn_slrm.png) +2. Attach a Filler node to the Data Asset node\. Double\-click the node to open its properties and, under Fill in fields, select `campaign`\. +3. Select a Replace type of Always\. +4. In the Replace with text box, enter to\_string(campaign) and click Save\. + + Figure 2. Derive a campaign field + + ![Derive a campaign field](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_selflearn_derive.png) +5. Add a Type node and set the Role to `None` for the following fields: + + + + * `customer_id` + * `response_date` + * `purchase_date` + * `product_id` + * `Rowid` + * `X_random` + + + +6. Set the Role to `Target` for the `campaign` and `response` fields\. These are the fields on which you want to base your predictions\. Set the Measurement to `Flag` for the `response` field\. +7. Click Read Values then click Save\. Because the campaign field data shows as a list of numbers (1, 2, 3, and 4), you can reclassify the fields to have more meaningful titles\. +8. Add a Reclassify node after the Type node and open its properties\. +9. Under Reclassify Into, select Existing field\. +10. Under Reclassify Field, select `campaign`\. +11. Click Get values\. The campaign values are added to the `ORIGINAL VALUE` column\. +12. In the `NEW VALUE` column, enter the following campaign names in the first four rows: + + + + * Mortgage + * Car loan + * Savings + * Pension + + + +13. Click Save\. + + Figure 3. Reclassify the campaign names + + ![Reclassify the campaign names](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_selflearn_reclassify.png) +14. Attach an SLRM modeling node to the Reclassify node\. Select `campaign` for the Target field, and `response` for the Target response field\. +15. Under MODEL OPTIONS, for Maximum number of predictions per record, reduce the number to 2\. This means that for each customer there will be two offers identified that have the highest probability of being accepted\. +16. Make sure Take account of model reliability is selected, then click Save and run the flow\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7d1e61ef82bc5dc1029d55c8f5c2ebb56082cdac.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7d1e61ef82bc5dc1029d55c8f5c2ebb56082cdac.md new file mode 100644 index 0000000..2caff32 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7d1e61ef82bc5dc1029d55c8f5c2ebb56082cdac.md @@ -0,0 +1,38 @@ +# Creating SPSS Modeler flows + +# Creating SPSS Modeler flows # + +With SPSS Modeler flows, you can quickly develop predictive models using business expertise and deploy them into business operations to improve decision making\. Designed around the long\-established SPSS Modeler client software and the industry\-standard CRISP\-DM model it uses, the flows interface supports the entire data mining process, from data to better business results\. + +SPSS Modeler offers a variety of modeling methods taken from machine learning, artificial intelligence, and statistics\. The methods available on the node palette allow you to derive new information from your data and to develop predictive models\. Each method has certain strengths and is best suited for particular types of problems\. + +Data format +: Relational: Tables in relational data sources +: Tabular: \.xls, \.xlsx, \.csv, \.sav, \.json, \.xml, or \.sas\. For Excel files, only the first sheet is read\. +: Textual: In the supported relational tables or files + +Data size +: Any + +How can I prepare data? +: Use automatic data preparation functions +: Write SQL statements to manipulate data +: Cleanse, shape, sample, sort, and derive data + +How can I analyze data? +: Visualize data with many chart options +: Identify the natural language of a text field + +How can I build models? +: Build predictive models +: Choose from over 40 modeling algorithms, and many other nodes +: Use automatic modeling functions +: Model time series or geospatial data +: Classify textual data +: Identify relationships between the concepts in textual data + +Getting started +: To create an SPSS Modeler flow from the project's Assets tab, click \. + +Note: Watsonx\.ai doesn't include SPSS functionality in Peru, Ecuador, Colombia, or Venezuela\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7d385692a31e1e88e675af0b91f98f55797bc02d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7d385692a31e1e88e675af0b91f98f55797bc02d.md new file mode 100644 index 0000000..b228eea --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7d385692a31e1e88e675af0b91f98f55797bc02d.md @@ -0,0 +1,48 @@ +# Batch deployment input details for Tensorflow models + +# Batch deployment input details for Tensorflow models # + +Follow these rules when you are specifying input details for batch deployments of Tensorflow models\. + +Data type summary table: + + + +| Data | Description | +| ------------ | -------------------------------------- | +| Type | Inline or data references | +| File formats | \.zip archive that contains JSON files | + + + +## Data sources ## + +Input or output data references: + + + + * Local or managed assets from the space + * Connected (remote) assets: Cloud Object Storage + + + +If you are specifying input/output data references programmatically: + + + + * Data source reference `type` depends on the asset type\. Refer to the **Data source reference types** section in [Adding data assets to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + + + +**Notes:** + + + + * The environment variables parameter of deployment jobs is not applicable\. + * For connections of type [Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html) or [Cloud Object Storage (infrastructure)](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos-infra.html), you must configure **Access key** and **Secret key**, also known as [HMAC credentials](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-uhc-hmac-credentials-main)\. + + + +**Parent topic:**[Batch deployment input details by framework](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-by-framework.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7e30541b3a12f403adcb02f90bc96134ce6b6386.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7e30541b3a12f403adcb02f90bc96134ce6b6386.md new file mode 100644 index 0000000..1e59ae7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7e30541b3a12f403adcb02f90bc96134ce6b6386.md @@ -0,0 +1,9 @@ +# Modeling nodes (SPSS Modeler) + +# Modeling # + +Watsonx\.ai offers a variety of modeling methods taken from machine learning, artificial intelligence, and statistics\. + +The methods available on the palette allow you to derive new information from your data and to develop predictive models\. Each method has certain strengths and is best suited for particular types of problems\. For more information about modeling, see [Creating SPSS Modeler flows](https://dataplatform.cloud.ibm.com/docs/content/wsd/spss-modeler.html#spss-modeler)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7e8d1f67fd96a81ff6d9459c1310919908000cbf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7e8d1f67fd96a81ff6d9459c1310919908000cbf.md new file mode 100644 index 0000000..b5015b3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7e8d1f67fd96a81ff6d9459c1310919908000cbf.md @@ -0,0 +1,21 @@ +# Exporting synthetic data + +# Exporting synthetic data # + +Using *Synthetic Data Generator*, you can export synthetic data to remote data sources using connections or write data to a project (**Delimited** or **SAV**)\. + +Double\-click the node to open its properties\. Various options are available, described as follows\. After running the node, you can find the data at the export location you specified\. + +## Exporting to a project ## + +Under **Export to**, select **This project** and then select the project path\. For **File type**, select either **Delimited** or **SAV**\. + +## Exporting to a connection ## + +Under **Export to**, select **Save to a connection** to open the Asset Browser and then select the connection to export to\. For a list of supported data sources, see [Creating synthetic data from imported data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/import_data_sd.html)\. + +## Setting the field delimiter, quote character, and decimal symbol ## + +Different countries use different symbols to separate the integer part from the fractional part of a number and to separate fields in data\. For example, you might use a comma instead of a period to separate the integer part from the fractional part of numbers\. And, rather than using commas to separate fields in your data, you might use colons or tabs\. With a Data Asset import or export node, you can specify these symbols and other options\. Double\-click the node to open its properties and specify data formats as desired\. ![Export data field delimiters](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/sd-export-data-field-delimiters.png) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7e9a5f54713ce7cb98ea4bcb223a40c4952f0083.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7e9a5f54713ce7cb98ea4bcb223a40c4952f0083.md new file mode 100644 index 0000000..b73afff --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7e9a5f54713ce7cb98ea4bcb223a40c4952f0083.md @@ -0,0 +1,13 @@ +# Telecommunications churn (SPSS Modeler) + +# Telecommunications churn # + +Logistic regression is a statistical technique for classifying records based on values of input fields\. It is analogous to linear regression, but takes a categorical target field instead of a numeric one\. + +For example, suppose a telecommunications provider is concerned about the number of customers it's losing to competitors\. If service usage data can be used to predict which customers are liable to transfer to another provider, offers can be customized to retain as many customers as possible\. + +This example uses the flow named Telecommunications Churn, available in the example project \. The data file is telco\.csv\. + +This example focuses on using usage data to predict customer loss (churn)\. Because the target has two distinct categories, a binomial model is used\. In the case of a target with multiple categories, a multinomial model could be created instead\. See [Classifying telecommunications customers](https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_classify.html#tut_classify) for more information\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7ec3f9527921fb3f713dd6ae1d8035e6c81753c4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7ec3f9527921fb3f713dd6ae1d8035e6c81753c4.md new file mode 100644 index 0000000..b7b2c32 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7ec3f9527921fb3f713dd6ae1d8035e6c81753c4.md @@ -0,0 +1,64 @@ +# typenode properties + +# typenode properties # + +![Type node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/typenodeicon.png)The Type node specifies field metadata and properties\. For example, you can specify a measurement level (continuous, nominal, ordinal, or flag) for each field, set options for handling missing values and system nulls, set the role of a field for modeling purposes, specify field and value labels, and specify values for a field\. + +Note that in some cases you may need to fully instantiate the Type node for other nodes to work correctly, such as the `fields from` property of the SetToFlag node\. You can simply connect a Table node and run it to instantiate the fields: + + tablenode = stream.createAt("table", "Table node", 150, 50) + stream.link(node, tablenode) + tablenode.run(None) + stream.delete(tablenode) + + + +typenode properties + +Table 1\. typenode properties + +| `typenode` properties | Data type | Property description | +| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `direction` | `Input`
`Target`
`Both`
`None`
`Partition`
`Split`
`Frequency`
`RecordID` | Keyed property for field roles\. | +| `type` | `Range`
`Flag`
`Set`
`Typeless`
`Discrete`
`OrderedSet`
`Default` | Measurement level of the field (previously
called the "type" of field)\. Setting `type` to
`Default` will clear any `values` parameter
setting, and if `value_mode` has the value
`Specify`, it will be reset to `Read`\.
If `value_mode` is set to `Pass` or `Read`,
setting `type` will not affect `value_mode`\.

The data types used internally differ from those visible in the type node\. The correspondence is as follows: Range \-> Continuous Set \- > Nominal OrderedSet \-> Ordinal Discrete\- > Categorical\. | +| `storage` | `Unknown`
`String`
`Integer`
`Real`
`Time`
`Date`
`Timestamp` | Read\-only keyed property for field storage type\. | +| `check` | `None`
`Nullify`
`Coerce`
`Discard`
`Warn`
`Abort` | Keyed property for field type and range checking\. | +| `values` | \[*value value*\] | For continuous fields, the first value is the minimum, and the last value is the maximum\. For nominal fields, specify all values\. For flag fields, the first value represents *false*, and the last value represents *true*\. Setting this property automatically sets the `value_mode` property to `Specify`\. | +| `value_mode` | `Read`
`Pass`
`Read+`
`Current`
`Specify` | Determines how values are set\. Note that you cannot set this property to `Specify` directly; to use specific values, set the `values` property\. | +| `extend_values` | *flag* | Applies when `value_mode` is set to `Read`\. Set to `T` to add newly read values to any existing values for the field\. Set to `F` to discard existing values in favor of the newly read values\. | +| `enable_missing` | *flag* | When set to `T`, activates tracking of missing values for the field\. | +| `missing_values` | \[*value value \.\.\.*\] | Specifies data values that denote missing data\. | +| `range_missing` | *flag* | Specifies whether a missing\-value (blank) range is defined for a field\. | +| `missing_lower` | *string* | When `range_missing` is true, specifies the lower bound of the missing\-value range\. | +| `missing_upper` | *string* | When `range_missing` is true, specifies the upper bound of the missing\-value range\. | +| `null_missing` | *flag* | When set to `T`, *nulls* (undefined values that are displayed as `$null$` in the software) are considered missing values\. | +| `whitespace_ missing` | *flag* | When set to `T`, values containing only white space (spaces, tabs, and new lines) are considered missing values\. | +| `description` | *string* | Specifies the description for a field\. | +| `value_labels` | *\[\[Value LabelString\] \[ Value LabelString\] \.\.\.\]* | Used to specify labels for value pairs\. | +| `display_places` | *integer* | Sets the number of decimal places for the field when displayed (applies only to fields with `REAL` storage)\. A value of `–1` will use the stream default\. | +| `export_places` | *integer* | Sets the number of decimal places for the field when exported (applies only to fields with `REAL` storage)\. A value of `–1` will use the stream default\. | +| `decimal_separator` | `DEFAULT`
`PERIOD`
`COMMA` | Sets the decimal separator for the field (applies only to fields with `REAL` storage)\. | +| `date_format` | `"DDMMYY" "MMDDYY" "YYMMDD" "YYYYMMDD" "YYYYDDD" DAY MONTH "DD-MM-YY" "DD-MM-YYYY" "MM-DD-YY" "MM-DD-YYYY" "DD-MON-YY" "DD-MON-YYYY" "YYYY-MM-DD" "DD.MM.YY" "DD.MM.YYYY" "MM.DD.YYYY" "DD.MON.YY" "DD.MON.YYYY" "DD/MM/YY" "DD/MM/YYYY" "MM/DD/YY" "MM/DD/YYYY" "DD/MON/YY" "DD/MON/YYYY" MON YYYY q Q YYYY ww WK YYYY` | Sets the date format for the field (applies only to fields with `DATE` or `TIMESTAMP` storage)\. | +| `time_format` | `"HHMMSS" "HHMM" "MMSS" "HH:MM:SS" "HH:MM" "MM:SS" "(H)H:(M)M:(S)S" "(H)H:(M)M" "(M)M:(S)S" "HH.MM.SS" "HH.MM" "MM.SS" "(H)H.(M)M.(S)S" "(H)H.(M)M" "(M)M.(S)S"` | Sets the time format for the field (applies only to fields with `TIME` or `TIMESTAMP` storage)\. | +| `number_format` | `DEFAULT`
`STANDARD`
`SCIENTIFIC`
`CURRENCY` | Sets the number display format for the field\. | +| `standard_places` | *integer* | Sets the number of decimal places for the field when displayed in standard format\. A value of `–1` will use the stream default\. | +| `scientific_places` | *integer* | Sets the number of decimal places for the field when displayed in scientific format\. A value of `–1` will use the stream default\. | +| `currency_places` | *integer* | Sets the number of decimal places for the field when displayed in currency format\. A value of `–1` will use the stream default\. | +| `grouping_symbol` | `DEFAULT`
`NONE`
`LOCALE`
`PERIOD`
`COMMA`
`SPACE` | Sets the grouping symbol for the field\. | +| `column_width` | *integer* | Sets the column width for the field\. A value of `–1` will set column width to `Auto`\. | +| `justify` | `AUTO`
`CENTER`
`LEFT`
`RIGHT` | Sets the column justification for the field\. | +| `measure_type` | `Range / MeasureType.RANGE`
`Discrete / MeasureType.DISCRETE`
`Flag / MeasureType.FLAG`
`Set / MeasureType.SET`
`OrderedSet / MeasureType.ORDERED_SET`
`Typeless / MeasureType.TYPELESS`
`Collection / MeasureType.COLLECTION`
`Geospatial / MeasureType.GEOSPATIAL` | This keyed property is similar to `type` in that it can be used to define the measurement associated with the field\. What is different is that in Python scripting, the setter function can also be passed one of the `MeasureType` values while the getter will always return on the `MeasureType` values\. | +| `collection_ measure` | `Range / MeasureType.RANGE`
`Flag / MeasureType.FLAG`
`Set / MeasureType.SET`
`OrderedSet / MeasureType.ORDERED_SET`
`Typeless / MeasureType.TYPELESS` | For collection fields (lists with a depth of 0), this keyed property defines the measurement type associated with the underlying values\. | +| `geo_type` | `Point`
`MultiPoint`
`LineString`
`MultiLineString`
`Polygon`
`MultiPolygon` | For geospatial fields, this keyed property defines the type of geospatial object represented by this field\. This should be consistent with the list depth of the values\. | +| `has_coordinate_ system` | *boolean* | For geospatial fields, this property defines whether this field has a coordinate system | +| `coordinate_system` | *string* | For geospatial fields, this keyed property defines the coordinate system for this field\. | +| `custom_storage_ type` | `Unknown / MeasureType.UNKNOWN`
`String / MeasureType.STRING`
`Integer / MeasureType.INTEGER`
`Real / MeasureType.REAL`
`Time / MeasureType.TIME`
`Date / MeasureType.DATE`
`Timestamp / MeasureType.TIMESTAMP`
`List / MeasureType.LIST` | This keyed property is similar to `custom_storage` in that it can be used to define the override storage for the field\. What is different is that in Python scripting, the setter function can also be passed one of the `StorageType` values while the getter will always return on the `StorageType` values\. | +| `custom_list_ storage_type` | `String / MeasureType.STRING`
`Integer / MeasureType.INTEGER`
`Real / MeasureType.REAL`
`Time / MeasureType.TIME`
`Date / MeasureType.DATE`
`Timestamp / MeasureType.TIMESTAMP` | For list fields, this keyed property specifies the storage type of the underlying values\. | +| `custom_list_depth` | *integer* | For list fields, this keyed property specifies the depth of the field | +| `max_list_length` | *integer* | Only available for data with a measurement level of either Geospatial or Collection\. Set the maximum length of the list by specifying the number of elements the list can contain\. | +| `max_string_length` | *integer* | Only available for typeless data and used when you are generating SQL to create a table\. Enter the value of the largest string in your data; this generates a column in the table that is big enough to contain the string\. | +| `default_value_mode` | `Read`
`Pass` | Set the default mode for all fields to `Read` or `Pass`\. The import node passes fields by default, while the Type node reads values by default\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7f2731c1ebb3f492687a336e1369cd6232512118.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7f2731c1ebb3f492687a336e1369cd6232512118.md new file mode 100644 index 0000000..85da8b8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7f2731c1ebb3f492687a336e1369cd6232512118.md @@ -0,0 +1,99 @@ +# Creating a custom component for use in the pipeline + +# Creating a custom component for use in the pipeline # + +A custom pipeline component runs a script that you write\. You can use custom components to share reusable scripts between pipelines\. + +You create custom components as project assets\. You can then use the components in pipelines you create in that project\. You can create as many custom components for pipelines as needed\. Currently, to create a custom component you must create one programmatically, using a Python function\. + +## Creating a component as a project asset ## + +To create a custom component, use the Python client to authenticate with IBM Watson Pipelines, code the component, then publish the component to the specified project\. After it is available in the project, you can assign it to a node in a pipeline and run it as part of a pipeline flow\. + +This example demonstrates the process of publishing a component that adds two numbers together, then assigning the component to a pipeline node\. + + + +1. Publish a function as a component with the latest Python client\. Run the following code in a Jupyter Notebook in a project of IBM watsonx\. + + # Install libraries + ! pip install ibm-watson-pipelines + + # Authentication + from ibm_watson_pipelines import WatsonPipelines + + apikey = '' + project_id = 'your_project_id' + + client = WatsonPipelines.from_apikey(apikey) + + # Define the function of the component + + # If you define the input parameters, users are required to + # input them in the UI + + def add_two_numbers(a: int, b: int) -> int: + print('Adding numbers: {} + {}.'.format(a, b)) + return a + b + 10 + + # Other possible functions might be sending a Slack message, + # or listing directories in a storage volume, and so on. + + # Publish the component + client.publish_component( + name='Add numbers', # Appears in UI as component name + func=add_two_numbers, + description='Custom component adding numbers', # Appears in UI as component description + project_id=project_id, + overwrite=True, # Overwrites an existing component with the same name + ) + + To generate a new API key: + + + + 1. Go to the [IBM Cloud home page](https://cloud.ibm.com/) + 2. Click Manage > Access (IAM) + 3. Click API keys + 4. Click Create + + + + + + + +1. Drag the node called *Run Pipelines component* under **Run** to the canvas\. + ![Retrieving the custom component node](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/ml-orch-custom-comp-1.png) +2. Choose the name of the component that you want to use\. + ![Choosing the actual component function](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/ml-orch-custom-comp-2.png) +3. Connect and run the node as part of a pipeline job\. + ![Connecting the component](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/ml-orch-custom-comp-3.png) + + + +## Manage pipeline components ## + +To manage your components, use the Python client to manage them\. + + + +Table 1\. Manage pipeline components + +| Method | Function | +| --------------------------------------------------------------------------- | ------------------------------ | +| `client.get_components(project_id=project_id)` | List components from a project | +| `client.get_component(project_id=project_id, component_id=component_id)` | Get a component by ID | +| `client.get_component(project_id=project_id, name=component_name)` | Get a component by name | +| `client.publish_component(component name)` | Publish a new component | +| `client.delete_component(project_id=project_id, component_id=component_id)` | Delete a component by ID | + + + +### Import and export ### + +IBM Watson Pipelines can be imported and exported with pipelines only\. + +**Parent topic:**[Creating a pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-create.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7f4648fd3e7f8564c98cf142e0e09e23e8097a9e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7f4648fd3e7f8564c98cf142e0e09e23e8097a9e.md new file mode 100644 index 0000000..3c45ac4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7f4648fd3e7f8564c98cf142e0e09e23e8097a9e.md @@ -0,0 +1,35 @@ +# Data Audit node (SPSS Modeler) + +# Data Audit node # + +The Data Audit node provides a comprehensive first look at the data you bring to SPSS Modeler, presented in an interactive, easy\-to\-read matrix that can be sorted and used to generate full\-size graphs\. + +When you run a Data Audit node, interactive output is generated that includes: + + + + * Information such as summary statistics, histograms, box plots, bar charts, pie charts, and more that may be useful in gaining a preliminary understanding of the data\. + * Information about outliers, extremes, and missing values\. + + + +Figure 1\. Data Audit node output example + +![Data Audit node output example](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/spss_data_audit_1.png) + +Figure 2\. Data Audit node output example + +![Data Audit node output example](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/spss_data_audit_2.png) + +Figure 3\. Data Audit node output example + +![Data Audit node output example](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/spss_data_audit_3.png) + +Figure 4\. Data Audit node output example + +![Data Audit node output example](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/spss_data_audit_4.png) + +Figure 5\. Data Audit node output example + +![Data Audit node output example](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/spss_data_audit_5.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7f4719a688d4c15d72918ebbe43b908300138d2c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7f4719a688d4c15d72918ebbe43b908300138d2c.md new file mode 100644 index 0000000..b565204 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7f4719a688d4c15d72918ebbe43b908300138d2c.md @@ -0,0 +1,53 @@ +# neuralnetworknode properties + +# neuralnetworknode properties # + +![Neural Net node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/neuralnetnodeicon.png)The Neural Net node uses a simplified model of the way the human brain processes information\. It works by simulating a large number of interconnected simple processing units that resemble abstract versions of neurons\. Neural networks are powerful general function estimators and require minimal statistical or mathematical knowledge to train or apply\. + + + +neuralnetworknode properties + +Table 1\. neuralnetworknode properties + +| `neuralnetworknode` Properties | Values | Property description | +| ------------------------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `targets` | \[*field1 \.\.\. fieldN*\] | Specifies target fields\. | +| `inputs` | \[*field1 \.\.\. fieldN*\] | Predictor fields used by the model\. | +| `splits` | *\[field1 \.\.\. fieldN* | Specifies the field or fields to use for split modeling\. | +| `use_partition` | *flag* | If a partition field is defined, this option ensures that only data from the training partition is used to build the model\. | +| `continue` | *flag* | Continue training existing model\. | +| `objective` | `Standard`
`Bagging`
`Boosting`
`psm` | `psm` is used for very large datasets, and requires a server connection\. | +| `method` | `MultilayerPerceptron`
`RadialBasisFunction` | | +| `use_custom_layers` | *flag* | | +| `first_layer_units` | *number* | | +| `second_layer_units` | *number* | | +| `use_max_time` | *flag* | | +| `max_time` | *number* | | +| `use_max_cycles` | *flag* | | +| `max_cycles` | *number* | | +| `use_min_accuracy` | *flag* | | +| `min_accuracy` | *number* | | +| `combining_rule_categorical` | `Voting`
`HighestProbability`
`HighestMeanProbability` | | +| `combining_rule_continuous` | `Mean``Median` | | +| `component_models_n` | *number* | | +| `overfit_prevention_pct` | *number* | | +| `use_random_seed` | *flag* | | +| `random_seed` | *number* | | +| `missing_values` | `listwiseDeletion`
`missingValueImputation` | | +| `use_model_name` | *boolean* | | +| `model_name` | *string* | | +| `confidence` | `onProbability`
`onIncrease` | | +| `score_category_probabilities` | *flag* | | +| `max_categories` | *number* | | +| `score_propensity` | *flag* | | +| `use_custom_name` | *flag* | | +| `custom_name` | *string* | | +| `tooltip` | *string* | | +| `keywords` | *string* | | +| `annotation` | *string* | | +| `calculate_variable_importance` | *boolean* | For models that produce an appropriate measure of importance, you can display a chart that indicates the relative importance of each predictor in estimating the model\. Typically, you'll want to focus your modeling efforts on the predictors that matter most, and consider dropping or ignoring those that matter least\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7f755b81ab25cbd0950d528a240b12262fe6ca08.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7f755b81ab25cbd0950d528a240b12262fe6ca08.md new file mode 100644 index 0000000..da3b1d0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7f755b81ab25cbd0950d528a240b12262fe6ca08.md @@ -0,0 +1,62 @@ +# Batch deployment input details for AutoAI models + +# Batch deployment input details for AutoAI models # + +Follow these rules when you are specifying input details for batch deployments of AutoAI models\. + +Data type summary table: + + + +| Data | Description | +| ------------ | ----------------------- | +| Type | inline, data references | +| File formats | CSV | + + + +## Data Sources ## + +Input/output data references: + + + + * Local/managed assets from the space + * Connected (remote) assets: Cloud Object Storage + + + +**Notes:** + + + + * For connections of type [Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html) , you must configure **Access key** and **Secret key**, also known as [HMAC credentials](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-uhc-hmac-credentials-main)\.\{: new\_window\} + * Your training data source can differ from your deployment data source, but the schema of the data must match or the deployment will fail\. For example, you can train an experiment by using data from a Snowflake database and deploy by using input data from a Db2 database if the schema is an exact match\. + * The environment variables parameter of deployment jobs is not applicable\. + + + +If you are specifying input/output data references programmatically: + + + + * Data source reference `type` depends on the asset type\. Refer to the **Data source reference types** section in [Adding data assets to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + * For AutoAI assets, if the input or output data reference is of type `connection_asset` and the remote data source is a database then `location.table_name` and `location.schema_name` are required parameters\. For example: + + + + "input_data_references": [{ + "type": "connection_asset", + "connection": { + "id": + }, + "location": { + "table_name": , + "schema_name": + + } + }] + +**Parent topic:**[Batch deployment input details by framework](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-by-framework.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7fe671db2b6972a1cfb04e0902f8d82dc979d42a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7fe671db2b6972a1cfb04e0902f8d82dc979d42a.md new file mode 100644 index 0000000..cbb23c5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7fe671db2b6972a1cfb04e0902f8d82dc979d42a.md @@ -0,0 +1,24 @@ +# Text Analytics Workbench (SPSS Modeler) + +# Text Analytics Workbench # + +From a Text Mining modeling node, you can choose to launch an interactive Text Analytics Workbench session when your flow runs\. In this workbench, you can extract key concepts from your text data, build categories, explore patterns in text link analysis, and generate category models\. + +You can use the Text Analytics Workbench to explore the results and tune the configuration for the node\. + +Concepts +: Concepts are the key words and phrases identified and extracted from your text data, also referred to as extraction results\. These concepts are grouped into types\. You can use these concepts to explore your data and create your categories\. You can manage the concepts on the Concepts tab\. + +Text links +: If you have text link analysis (TLA) pattern rules in your linguistic resources or are using a resource template that already has some TLA rules, you can extract patterns from your text data\. These patterns can help you uncover interesting relationships between concepts in your data\. You can also use these patterns as descriptors in your categories\. You can manage these on the Text links tab\. + +Categories +: Using descriptors (such as extraction results, patterns, and rules) as a definition, you can manually or automatically create a set of categories\. Documents and records are assigned to these categories based on whether or not they contain a part of the category definition\. You can manage categories on the Categories tab\. + +Resources +: The extraction process relies on a set of parameters and definitions from linguistic resources to govern how text is extracted and handled\. These are managed in the form of templates and libraries on the Resource editor tab\. + +Figure 1\. Text Analytics Workbench + +![Text Analytics Workbench](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/ta_taw.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7feb0313c4aa5133f215a847f2abaa025e83bb38.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7feb0313c4aa5133f215a847f2abaa025e83bb38.md new file mode 100644 index 0000000..fe999f6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/7feb0313c4aa5133f215a847f2abaa025e83bb38.md @@ -0,0 +1,180 @@ +# Quick start: Evaluate and track a prompt template + +# Quick start: Evaluate and track a prompt template # + +Take this tutorial to learn how to evaluate and track a prompt template\. You can evaluate prompt templates in projects or deployment spaces to measure the performance of foundation model tasks and understand how your model generates responses\. Then, you can track the prompt template in an AI use case to capture and share facts about the asset to help you meet governance and compliance goals\. + +**Required services** : watsonx\.governance + +Your basic workflow includes these tasks: + + + +1. Open a project that contains the prompt template to evaluate\. Projects are where you can collaborate with others to work with assets\. +2. Evaluate a prompt template using test data\. +3. Review the results on the AI Factsheet\. +4. Track the evaluated prompt template in an AI use case\. +5. Deploy and test your evaluated prompt template\. + + + +## Read about prompt templates ## + +With watsonx\.governance, you can evaluate prompt templates in projects to measure how effectively your foundation models generate responses for the following task types: + + + + * Classification + * Summarization + * Generation + * Question answering + * Entity extraction + + + +[Read more about evaluating prompt templates in projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-eval-prompt.html) + +[Read more about evaluating prompt templates in deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-eval-prompt-spaces.html) + +## Watch a video about evaluating and tracking a prompt template ## + +![Watch Video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) Watch this video to preview the steps in this tutorial\. There might be slight differences in the user interface shown in the video\. The video is intended to be a companion to the written tutorial\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Try a tutorial to evaluating and tracking a prompt template ## + +In this tutorial, you will complete these tasks: + + + + * [Task 1: Create a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#step01) + * [Task 2: Evaluate the sample prompt template](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#step02) + * [Task 3: Create a model inventory and AI use case](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#step03) + * [Task 4: Start tracking the prompt template](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#step04) + * [Task 5: Create a new project for validation](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#step05) + * [Task 6: Validate the prompt template](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#step06) + * [Task 7: Deploy the prompt template](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#step07) + + + +Expand all sections + + + + * Tips for completing this tutorial + + \#\#\# Use the video picture-in-picture Tip: Start the video, then as you scroll through the tutorial, the video moves to picture-in-picture mode. Close the video table of contents for the best experience with picture-in-picture. You can use picture-in-picture mode so you can follow the video as you complete the tasks in this tutorial. Click the timestamps for each task to follow along.The following animated image shows how to use the video picture-in-picture and table of contents features: ![How to use picture-in-picture and chapters](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/pip-and-chapters.gif)\{: width="560px" height="315px" data-tearsheet="this"\} \#\#\# Get help in the community If you need help with this tutorial, you can ask a question or find an answer in the [Cloud Pak for Data Community discussion forum](https://community.ibm.com/community/user/cloudpakfordata/communities/community-home/digestviewer?communitykey=c0c16ff2-10ef-4b50-ae4c-57d769937235)\{: new\_window\}. \#\#\# Set up your browser windows For the optimal experience completing this tutorial, open Cloud Pak for Data in one browser window, and keep this tutorial page open in another browser window to switch easily between the two applications. Consider arranging the two browser windows side-by-side to make it easier to follow along. ![Side-by-side tutorial and UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/tutorial-side-by-side.png)\{: width="560px" height="315px" data-tearsheet="this"\} Tip: If you encounter a guided tour while completing this tutorial in the user interface, click **Maybe later**. + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 1: Create a project + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:08. You need a project store the prompt template and the evaluation. Follow these steps to create a project based on a sample: 1. Access the [Getting started with watsonx governance](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/1b6c8d6e-a45c-4bf1-84ee-8fe9a6daa56d)\{: external\} project in the Samples. 1. Click **Create project**. 1. Accept the default values for the project name, and click **Create**. 1. Click **View new project** when the project is successfully created. 1. Associate a Watson Machine Learning service with the project: 1. When the project opens, click the **Manage** tab, and select the **Services and integrations** page. 1. On the *IBM services* tab, click **Associate service**. 1. Select your Watson Machine Learning instance. If you don't have a Watson Machine Learning service instance provisioned yet, follow these steps: 1. Click **New service**. 1. Select **Watson Machine Learning**. 1. Click **Create**. 1. Select the new service instance from the list. 1. Click **Associate service**. 1. If necessary, click **Cancel** to return to the *Services & Integrations* page. 1. Click the **Assets** tab in the project to see the sample assets. For more information or to watch a video, see [Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html)\{: new\_window\}.For more information on associated services, see [Adding associated services](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assoc-services.html)\{: new\_window\}. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the project Assets tab. You are now ready to evaluate the sample prompt template in the project. + + ![Sample project assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-gov-sample-project.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 2: Evaluate the sample prompt template + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:36. The sample project contains a few prompt templates and CSV files used as test data. Follow these steps to download the test data and evaluate one of the sample prompt templates: 1. On the project's *Assets* tab, click the **Overflow** menu ![Overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/overflow-menu--vertical.svg)\{: iih\} next to the *Insurance claim summarization test data.csv* file. 1. Click **Insurance claim summarization** to open the prompt template in Prompt Lab. 1. Click the **Prompt variables** icon ![Prompt variables](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/parameter.svg)\{: iih\}. Note: To run evaluations, you must create at least one prompt variable.1. Scroll to the *Try* section. Notice the `{input}` variable in the *Input* field. You must include the prompt variable as input for testing your prompt. 1. Click **Evaluate**. 1. Expand the **Generative AI Quality** section to see a list of dimensions. The available metrics depend on the task type of the prompt. For example, summarization has different metrics than classification. 1. Click **Next**. 1. Select the test data: 1. Click **Browse**. 1. Select the **Insurance claim summarization test data.csv** file. 1. Click **Open**. 1. For the *Input column*, select **Insurance \_Claim**. 1. For the *Reference output column*, select **Summary**. 1. Click **Next**. 1. Click **Evaluate**. When the evaluation completes, you see the test results on the *Evaluate* tab. 1. Click the **AI Factsheet** tab. 1. View the information on each of the sections on the tab. 1. Click **Evaluation > Develop > Test** to see the test results again. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the results of the evaluation. Now you can start tracking the prompt template in an AI use case. + + ![Prompt template evaluation test results](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-gov-evaluate-prompt-template.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 3: Create a model inventory and AI use case + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 01:54. You use a model inventory for storing and reviewing AI use cases. AI use cases collect governance facts for AI assets that your organization tracks. You can view all the AI use cases in an inventory. Follow these steps to create a model inventory and AI use case: \#\#\# Create a model inventory 1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg)\{: iih\}, choose **AI governance > AI use cases**. 1. Manage your inventories: - If you have existing inventory, then you skip to [Create a new AI use case](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#new-ai-use-case) can use that inventory. - If you don't have any inventories, then click **Manage inventories**. 1. Click **New inventory**. 1. For the name, copy and paste the following text: `txt Golden Bank Insurance Inventory` 1. For the description, copy and paste the following text: `txt Model inventory for insurance related processing` 1. Clear the **Add collaborators after creation** option. 1. Select your Cloud Object Storage instance from the list. 1. Click **Create**. 1. Close the *Manage inventories* page. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the model inventory. You are now ready to create an AI use case. + + ![Model inventory](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-gov-model-inventory.png)\{: width="100%" \} \#\#\# Create an AI use case 1. Click **New AI use case**. 1. For the *Name*, copy and paste the following text: `txt Insurance claims processing AI use case` 1. Select an existing model inventory. 1. Click **Create** to accept the default values for the rest of the fields. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the AI use case. You are now ready to track the prompt template. + + ![AI use case](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-gov-new-ai-use-case.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 4: Start tracking the prompt template + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 02:33. You can track your prompt template in an AI use case to report the development and test process to your peers. Follow these steps to start tracking the prompt template: 1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg)\{: iih\}, choose **Projects > View all projects**. 1. Select the **Getting started with watsonx governance** project. 1. Click the **Assets** tab. 1. From the **Overflow** menu ![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/overflow-menu--vertical.svg)\{: iih\} for the *Claims processing summarization* prompt template, select **View AI Factsheet**. 1. On the *AI Factsheet* tab, click the **Governance** page. 1. Click **Track an AI use case**. 1. Select the **Insurance claims processing** AI use case. 1. Select **LLM Prompt Engineering** for the approach. 1. Click **Next**. 1. For the model version, select **Experimental**. 1. Accept the default value for the version number. 1. Click **Next**. 1. Click **Track asset**. 1. Click the **View details** icon ![View details icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/arrow-up-right.svg)\{: iih\} to open the AI use case. 1. Click the **Lifecycle** tab to see the prompt template in the *Develop* phase. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the Lifecycle tab in the AI use case with the prompt temmplate in the Develop phase. You are now ready to continue to the Validate phase + + ![The Lifecycle tab in the AI use case](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-gov-ai-factsheet-governance-page.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 5: Create a new project for validation + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 03:22. Typically, the prompt engineer evaluates the prompt with test data, and the validation engineer validates the prompt. The validation engineer has access to the validation data that prompt engineers might not have. In this case, validation data occurs in a different project. Follow these steps to export the development project and import it as a new validation project to move the asset into the validation phase of the AI lifecycle: 1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg)\{: iih\}, choose **Projects > View all projects**. 1. Select the **Getting started with watsonx governance** project. 1. Click the **Import/Export** icon ![Import/Export icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/import-export.svg)\{: iih\} > **Export project**. 1. Check the box to select all assets. 1. Click **Export**. 1. For the project name, copy and paste the following text, and then click **Save**. `txt validation project.zip` 1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg)\{: iih\}, choose **Projects > View all projects**. 1. Click **New project**. 1. Select **Create a project from a sample of file**. 1. Click **Browse**. 1. Select the **validation project.zip**, and click **Open**. 1. For the project name, copy and paste the following text: `txt Validation project` 1. Click **Create**. 1. When the project is created, click **View new project**. 1. Follow the same steps as in [Step 1](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#step01) to associate your Watson Machine Learning service with this project. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the validation project Assets tab. You are now ready to evaluate the sample prompt template in the validation project. + + ![Validation project assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-gov-vaildation-project.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 6: Validate the prompt template + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 04:18. Now you are ready to evaluate the prompt template in this validation project using the same evaluation process as before. Use the same test data set for evaluation. And select the same Input and Output columns as before. Follow these steps to validate the prompt template: 1. Click the **Assets** tab in the *Validation project*. 1. Repeat the steps in [Task 2](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#step02) to evaluate the *Claims processing summarization* prompt template. 1. Click the **AI Factsheet** tab when the evaluation is complete. 1. View both sets of test results: 1. Click **Evaluation > Develop > Test**. 1. Click **Evaluation > Validate > Test**. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the validation test results. You are now ready to promote the prompt template to a deployment space, and then deploy the prompt template. + + ![Prompt template evaluation test results](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-gov-evaluate-prompt-template-validation.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 7: Deploy the prompt template + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 05:00. \#\#\# Promote the prompt template to a deployment space You promote the prompt template to a deployment space in preparation for deploying it. Follow these steps to prompte the prompt template: 1. Click **Validation project** in the projects navigation trail. 1. From the **Overflow** menu ![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/overflow-menu--vertical.svg)\{: iih\} for the *Claims processing summarization* prompt template, select **Promote to space**. 1. For the *Target space*, select **Create a new deployment space**. 1. For the *Space name*, copy and paste the following text: `txt Insurance claims deployment space` 1. For the *Deployment stage*, select **Production**. 1. Select your machine learning service from the list. 1. Click **Create**. 1. Click **Close**. 1. Select the **Insurance claims deployment space** deployment space from the list. 1. Check the option to **Go to the space after promoting the prompt template**. 1. Click **Promote**. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the prompt template in the deployment space. You are now ready to create a deployment. + + ![Prompt template in deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-gov-deployment-space.png)\{: width="100%" \} \#\#\# Deploy the prompt template Now you can deploy the prompt template from inside the deployment space. Follow these steps to create a deployment: 1. From the **Overflow** menu ![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/overflow-menu--vertical.svg)\{: iih\} for the *Insurance claims summarization* prompt template, select **Deploy**. 1. For the deployment name, copy and paste the following text: `txt Insurance claims summarization deployment` 1. Click **Create**. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the deployed prompt template. + + ![Deployed prompt template](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-gov-deployment.png)\{: width="100%" \} \#\#\# View the deployed prompt template Follow these steps to view the deployed prompt template in its current phase of the lifecycle: 1. View the deployment when it is ready. The *API reference* tab provides information for you to use the prompt template deployment in your application. 1. Click the **Test** tab. The *Test* tab allows you to submit an instruction and Input to test the deployment. 1. Click **Generate**. 1. Click the **AI Factsheet** tab. The *AI Factsheet* shows that the prompt template is now in the operate phase. 1. Scroll down, and click the arrow for more details. 1. Select the Evaluation > Operate > Deployment 1 page. 1. Click the **View details** icon ![View details icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/arrow-up-right.svg)\{: iih\} to open the AI use case. 1. Click the **Lifecycle** tab. 1. Click the **Insurance claim summarization** prompt template in the *Operate* phase. When you are done, click **Close**. 1. Click the **Insurance claims summarization deployment** prompt template deployment in the *Operate* phase. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the prompt template prompt template in the Operate phase of the lifecycle. + + ![Prompt template in the Operate phase](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-gov-operate-prompt-template.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html?context=cdpaas&locale=en#video-preview) + + + +## Next steps ## + +You are now ready to try the [Prompt a foundation model with the retrieval\-augmented generation pattern tutorial](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html)\. + +## Additional resources ## + + + + * View more [videos](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html)\. + * Find sample data sets, projects, models, prompts, and notebooks in the Samples to gain hands\-on experience: + + ![Notebook icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook.svg)[Notebooks](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=notebook) that you can add to your project to get started analyzing data and building models. + + ![Project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/ibm-cloud--projects.svg)[Projects](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=project-template) that you can import containing notebooks, data sets, prompts, and other assets. + + ![Data set icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/data--set.svg)[Data sets](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=dataset) that you can add to your project to refine, analyze, and build models. + + ![Prompt icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/prompt.svg)[Prompts](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=example-prompt) that you can use in the Prompt Lab to prompt a foundation model. + + ![Model icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/model.svg)[Foundation models](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=foundation-model) that you can use in the Prompt Lab. + + + +**Parent topic:**[Quick start tutorials](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8023ac0a48264db31f3c9da92fd84f947bfd4047.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8023ac0a48264db31f3c9da92fd84f947bfd4047.md new file mode 100644 index 0000000..1be2909 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8023ac0a48264db31f3c9da92fd84f947bfd4047.md @@ -0,0 +1,44 @@ +# regressionnode properties + +# regressionnode properties # + +![Regression node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/regressionnodeicon.png)Linear regression is a common statistical technique for summarizing data and making predictions by fitting a straight line or surface that minimizes the discrepancies between predicted and actual output values\. + + + +regressionnode properties + +Table 1\. regressionnode properties + +| `regressionnode` Properties | Values | Property description | +| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `target` | *field* | Regression models require a single target field and one or more input fields\. A weight field can also be specified\. See the topic [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `method` | `Enter`
`Stepwise`
`Backwards`
`Forwards` | | +| `include_constant` | *flag* | | +| `use_weight` | *flag* | | +| `weight_field` | *field* | | +| `mode` | `Simple`
`Expert` | | +| `complete_records` | *flag* | | +| `tolerance` | `1.0E-1`
`1.0E-2`
`1.0E-3`
`1.0E-4`
`1.0E-5`
`1.0E-6`
`1.0E-7`
`1.0E-8`
`1.0E-9`
`1.0E-10`
`1.0E-11`
`1.0E-12` | Use double quotes for arguments\. | +| `stepping_method` | `useP`
`useF` | `useP`: use probability of F `useF`: use F value | +| `probability_entry` | *number* | | +| `probability_removal` | *number* | | +| `F_value_entry` | *number* | | +| `F_value_removal` | *number* | | +| `selection_criteria` | *flag* | | +| `confidence_interval` | *flag* | | +| `covariance_matrix` | *flag* | | +| `collinearity_diagnostics` | *flag* | | +| `regression_coefficients` | *flag* | | +| `exclude_fields` | *flag* | | +| `durbin_watson` | *flag* | | +| `model_fit` | *flag* | | +| `r_squared_change` | *flag* | | +| `p_correlations` | *flag* | | +| `descriptives` | *flag* | | +| `calculate_variable_importance` | *flag* | | +| `residuals` | *boolean* | Statistics for the residuals (or the differences between predicted values and actual values)\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/807d82c6eeebd0513a794637ebd90caa19f318e7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/807d82c6eeebd0513a794637ebd90caa19f318e7.md new file mode 100644 index 0000000..609597d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/807d82c6eeebd0513a794637ebd90caa19f318e7.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Membership inference attack # + +![icon for privacy risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-privacy.svg)Risks associated with inputInferencePrivacyTraditional + +### Description ### + +Given a trained model and a data sample, an attacker appropriately samples the input space, observing outputs to deduce whether that sample was part of the model's training\. This is known as a membership inference attack\. + +### Why is membership inference attack a concern for foundation models? ### + +Identifying whether a data sample was used for training data can reveal what data was used to train a model, possibly giving competitors insight into how a model was trained and the opportunity to replicate the model or tamper with it\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/80ae02dc6e3e4ff10c8fd97e1c3f5a5e87270d57.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/80ae02dc6e3e4ff10c8fd97e1c3f5a5e87270d57.md new file mode 100644 index 0000000..8bdbe3b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/80ae02dc6e3e4ff10c8fd97e1c3f5a5e87270d57.md @@ -0,0 +1,107 @@ +# Assets in deployment spaces + +# Assets in deployment spaces # + +Learn about various ways of adding and promoting assets to a space\. Find the list of asset types that you can add to a space\. + +Note these considerations for importing assets into a space: + + + + * Upon import, some assets are automatically assigned a version number, starting with version 1\. This version numbering prevents overwriting existing assets if you import their updated versions later\. + * Assets or references that are required to run jobs in the space must be part of the import package, or must be added separately\. If you don't add these supporting assets or references, jobs fail\. + + + +The way to add an asset to a space depends on the asset type\. You can add some assets directly to a space (for example a model that was created outside of watsonx)\. Other asset types originate in a project and must be transferred from a project to a space\. The third class includes asset types that you can add to a space only as a dependency of another asset\. These asset types do not display in the **Assets** tab in the UI\. + +For more information, see: + + + + * [Asset types that you can directly add to a space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets-all.html?context=cdpaas&locale=en#add_directly) + * [Asset types that are created in projects and can be transferred into a space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets-all.html?context=cdpaas&locale=en#add_transfer) + * [Asset types that can be added to a space only as a dependency](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets-all.html?context=cdpaas&locale=en#add_dependency) + + + +For more information about working with space assets, see: + + + + * [Accessing asset details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-access-detailed-info.html) + + + +## Asset types that you can directly add to a space ## + + + + * Connection + * Data asset (from a connection or an uploaded file) + * Model + + + +For more information, see: + + + + * For data assets and connections: [Adding data assets to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html) + * For models: [Importing models into a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html) + + + +## Assets types that are created in projects and can be transferred into a space ## + + + + * Connection + * Data Refinery flow + * Environment + * Function + * Job + * Model + * Script + + + +If your asset is located in a standard Watson Studio project, you can transfer the asset to the deployment space by promoting it\. + +For more information, see [Promoting assets to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-promote-assets.html)\. + +Alternatively, you can export the project and then import it into the deployment space\. For more information, see: + + + + * [Exporting a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/export-project.html) + * [Importing spaces and projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-import-to-space.html) + + + +If you export the whole project, any matching custom environments are exported as well\. + +## Asset types that can be added to a space only as a dependency ## + + + + * Hardware Specification + * Package Extension + * Software Specification + * Watson Machine Learning Experiment + * Watson Machine Learning Model Definition + + + +## Learn more ## + + + + * [Deploying assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html) + * [Training and deploying machine learning models in notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-samples-overview.html) + + + +**Parent topic:**[Deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/80ccb2cf7a994d218d5c47bbf7f8bbb0d479e399.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/80ccb2cf7a994d218d5c47bbf7f8bbb0d479e399.md new file mode 100644 index 0000000..848a9a8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/80ccb2cf7a994d218d5c47bbf7f8bbb0d479e399.md @@ -0,0 +1,28 @@ +# xgboostlinearnode properties + +# xgboostlinearnode properties # + +![XGBoost Linear node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/pythonxgboostlinearnodeicon.png)XGBoost Linear© is an advanced implementation of a gradient boosting algorithm with a linear model as the base model\. Boosting algorithms iteratively learn weak classifiers and then add them to a final strong classifier\. The XGBoost Linear node in SPSS Modeler is implemented in Python\. + + + +xgboostlinearnode properties + +Table 1\. xgboostlinearnode properties + +| `xgboostlinearnode` properties | Data type | Property description | +| ------------------------------ | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `custom_fields` | *boolean* | This option tells the node to use field information specified here instead of that given in any upstream Type node(s)\. After selecting this option, specify fields as required\. | +| `target` | *field* | | +| `inputs` | *field* | | +| `alpha` | *Double* | The alpha linear booster parameter\. Specify any number `0` or greater\. Default is `0`\. | +| `lambda` | *Double* | The lambda linear booster parameter\. Specify any number `0` or greater\. Default is `1`\. | +| `lambdaBias` | *Double* | The lambda bias linear booster parameter\. Specify any number\. Default is `0`\. | +| `num_boost_round` | *integer* | The num boost round value for model building\. Specify a value between `1` and `1000`\. Default is `10`\. | +| `objectiveType` | *string* | The objective type for the learning task\. Possible values are `reg:linear`, `reg:logistic`, `reg:gamma`, `reg:tweedie`, `count:poisson`, `rank:pairwise`, `binary:logistic`, or `multi`\. Note that for flag targets, only `binary:logistic` or `multi` can be used\. If `multi` is used, the score result will show the `multi:softmax` and `multi:softprob` XGBoost objective types\. | +| `random_seed` | *integer* | The random number seed\. Any number between `0` and `9999999`\. Default is `0`\. | +| `useHPO` | *Boolean* | Specify `true` or `false` to enable or disable the HPO options\. If set to `true`, Rbfopt will be applied to find out the "best" One\-Class SVM model automatically, which reaches the target objective value defined by the user with the `target_objval` parameter\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/81045ed1b34827b3bd74d2546185c3bd3163b37e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/81045ed1b34827b3bd74d2546185c3bd3163b37e.md new file mode 100644 index 0000000..b853766 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/81045ed1b34827b3bd74d2546185c3bd3163b37e.md @@ -0,0 +1,40 @@ +# Flow scripting (SPSS Modeler) + +# Flow scripting # + +You can use scripts to customize operations within a particular flow, and they're saved with that flow\. For example, you might use a script to specify a particular run order for terminal nodes\. You use the flow properties page to edit the script that's saved with the current flow\. + +To access scripting in a flow's properties: + + + +1. Right\-click your flow's canvas and select Flow properties\. +2. Open the Scripting section to work with scripts for the current flow\. + + + +Tips: + + + + * By default, the Python scripting language is used\. If you'd rather use a scripting language unique to old versions of SPSS Modeler desktop, select Legacy\. + * For complete details about scripting, see the [Scripting and automation](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/scripting_overview.html) guide\. + + + +You can specify whether or not the script runs when the flow runs\. To run the script each time the flow runs, respecting the run order of the script, select Run the script\. This setting provides automation at the flow level for quicker model building\. Or, to ignore the script, you can select the option to only Run all terminal nodes when the flow runs\. + +The script editor includes the following features that help with script authoring: + + + + * Syntax highlighting; keywords, literal values (such as strings and numbers), and comments are highlighted + * Line numbering + * Block matching; when the cursor is placed by the start of a program block, the corresponding end block is also highlighted + * Suggested auto\-completion + + + +A list of suggested syntax completions can be accessed by selecting Auto\-Suggest from the context menu, or pressing Ctrl \+ Space\. Use the cursor keys to move up and down the list, then press Enter to insert the selected text\. To exit from auto\-suggest mode without modifying the existing text, press Esc\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8109b6380043ce464115025dd32a7a821fd56db7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8109b6380043ce464115025dd32a7a821fd56db7.md new file mode 100644 index 0000000..31fdf2a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8109b6380043ce464115025dd32a7a821fd56db7.md @@ -0,0 +1,180 @@ +# Quick start: Tune a foundation model + +# Quick start: Tune a foundation model # + +There are a couple of reasons to tune your foundation model\. By tuning a model on many labeled examples, you can enhance the model performance compared to prompt engineering alone\. By tuning a base model to perform similarly to a bigger model in the same model family, you can reduce costs by deploying that smaller model\. + +**Required services** : Watson Studio : Watson Machine Learning + +Your basic workflow includes these tasks: + + + +1. Open a project\. Projects are where you can collaborate with others to work with data\. +2. Add your data to the project\. You can upload data files, or add data from a remote data source through a connection\. +3. Create a Tuning experiment in the project\. The tuning experiment uses the Tuning Studio experiment builder\. +4. Review the results of the experiment and the tuned model\. The results include a Loss Function chart and the details of the tuned model\. +5. Deploy and test your tuned model\. Test your model in the Prompt Lab\. + + + +## Read about tuning a foundation model ## + +Prompt tuning adjusts the content of the prompt that is passed to the model\. The underlying foundation model and its parameters are not edited\. Only the prompt input is altered\. You tune a model with the Tuning Studio to guide an AI foundation model to return the output you want\. + +[Read more about Tuning Studio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-studio.html) + +## Watch a video about tuning a foundation model ## + +![Watch Video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) Watch this video to preview the steps in this tutorial\. There might be slight differences in the user interface that is shown in the video\. The video is intended to be a companion to the written tutorial\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Try a tutorial to tune a foundation model ## + +In this tutorial, you will complete these tasks: + + + + * [Task 1: Open a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en#step01) + * [Task 2: Test your base model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en#step02) + * [Task 3: Add your data to the project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en#step03) + * [Task 4: Create a Tuning experiment in the project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en#step04) + * [Task 5: Configure the Tuning experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en#step05) + * [Task 6: Deploy your tuned model to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en#step06) + * [Task 7: Test your tuned model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en#step07) + + + +Expand all sections + + + + * Tips for completing this tutorial + + \#\#\# Use the video picture-in-picture Tip: Start the video, then as you scroll through the tutorial, the video moves to picture-in-picture mode. Close the video table of contents for the best experience with picture-in-picture. You can use picture-in-picture mode so you can follow the video as you complete the tasks in this tutorial. Click the timestamps for each task to follow along.The following animated image shows how to use the video picture-in-picture and table of contents features: ![How to use picture-in-picture and chapters](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/pip-and-chapters.gif)\{: width="560px" height="315px" data-tearsheet="this"\} \#\#\# Get help in the community If you need help with this tutorial, you can ask a question or find an answer in the [Cloud Pak for Data Community discussion forum](https://community.ibm.com/community/user/cloudpakfordata/communities/community-home/digestviewer?communitykey=c0c16ff2-10ef-4b50-ae4c-57d769937235)\{: new\_window\}. \#\#\# Set up your browser windows For the optimal experience completing this tutorial, open Cloud Pak for Data in one browser window, and keep this tutorial page open in another browser window to switch easily between the two applications. Consider arranging the two browser windows side-by-side to make it easier to follow along. ![Side-by-side tutorial and UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/tutorial-side-by-side.png)\{: width="560px" height="315px" data-tearsheet="this"\} Tip: If you encounter a guided tour while completing this tutorial in the user interface, click **Maybe later**. + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 1: Open a project + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:04. You need a project to store the tuning experiment. Watch a video to see how to create a sandbox project and associate a service. Then follow the steps to verify that you have an existing project or create a sandbox project. + + This video provides a visual method to learn the concepts and tasks in this documentation. + + \#\#\# Verify a existing project or create a new project 1. From the watsonx home screen, scroll to the *Projects* section. If you see any projects that are listed, then skip to [Associate the Watson Machine Learning service](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en#associate). If you don't see any projects, then follow these steps to create a project. 1. Click **Create a sandbox project**. When the project is created, you see the sandbox in the *Projects* section. 1. Open an existing project or the new sandbox project. \#\#\# Associate the Watson Machine Learning service with the project You use Watson Machine Learning to tune the foundation model, so follow these steps to associate your Watson Machine Learning service instance with your project. 1. In the project, click the **Manage** tab. 1. Click the **Services & Integrations** page. 1. Check whether this project has an associated Watson Machine Learning service. If there is no associated service, then follow these steps: 1. Click **Associate service**. 1. Check the box next to your **Watson Machine Learning** service instance. 1. Click **Associate**. 1. If necessary, click **Cancel** to return to the *Services & Integrations* page. For more information or to watch a video, see [Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html)\{: new\_window\} and [Adding associated services to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assoc-services.html). \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the *Manage* tab with the associated service. You are now ready to add the sample notebook to your project. + + ![Manage tab in the project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-fm-associated-service.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 2: Test your base model + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:19. You can test your tuned model in the Prompt Lab. Follow these steps to test your tuned model: 1. Return to the watsonx home screen. 1. Verify that your sandbox project is selected. ![Select the sandbox project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-select-sandbox.png)\{: biw\} 1. Click the **Experiment with foundation models and build prompts** tile. 1. Select your tuned model. 1. Click the model drop-down list, and select **View all foundation models**. 1. Select the **flan-t5-xl-3b** model. 1. Click **Select model**. 1. On the *Structured mode* page, type the *Instruction*: `txt Summarize customer complaints` 1. Provide the examples and test input. \| Example input \| Example output \| \| ----- \| ----- \| \| I forgot in my initial date I was using Capital One and this debt was in their hands and never was done. \| Debt collection, sub-product: credit card debt, issue: took or threatened to take negative or legal action sub-issue \| \| I am a victim of identity theft and this debt does not belong to me. Please see the identity theft report and legal affidavit. \| Debt collection, dub-product, I do not know, issue. attempts to collect debt not owed. sub-issue debt was a result of identity theft \| + 1. In the *Try* text field, copy and paste the following prompt: `txt After I reviewed my credit report, I am still seeing information that is reporting on my credit file that is not mine. please help me in getting these items removed from my credit file.` 1. Click **Generate**, and review the results. 1. Click **Save work > Save as**. 1. Select **Prompt template**. 1. For the name, type `Base model prompt`\{: .cp\}. 1. Click **Save**. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows results in the Prompt Lab. + + ![The following image shows results in the Prompt Lab.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-ts-base-prompt-lab.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 3: Add your data to the project + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 01:12. You need to add the training data to your project. On the Samples page, you can find the customer complaints data set. This data set includes fictitious data of typical customer complaints regarding credit reports. Follow these steps to add the data set from the Samples to the project: 1. Access the [Customer complaints data set](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/725afa8c-0f58-47ac-b88c-26961c4f20a0)\{: new\_window\} on the Samples page. 1. Click **Add to project**. 1. Select your sandbox project. 1. Click **Add**. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the Samples asset added to the project. The next step is to create the Tuning experiment. + + ![The following image shows the Samples asset added to the project. The next step is to create the Tuning experiment.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-ts-sample-data.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 4: Create a Tuning experiment in the project + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 01:32. Now you are ready to create a tuning experiment in your sandbox project that uses the data set you just added to the project. Follow these steps to create a Tuning experiment: 1. Return to the watsonx home screen. 1. Verify that your sandbox project is selected. ![Select the sandbox project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-select-sandbox.png)\{: biw\} 1. Click **Tune a foundation model with labeled data**. 1. For the name, type: `txt Summarize customer complaints tuned model` 1. For the description, type: `txt Tuning Studio experiment to tune a foundation model to handle customer complaints.` 1. Click **Create**. The Tuning Studio displays. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the Tuning experiment open in Tuning Studio. Now you are ready to configure the tuning experiment. + + ![The following image shows the Tuning experiment open in Tuning Studio. Now you are ready to configure the tuning experiment.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-ts-new-exp.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 5: Configure the Tuning experiment + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 01:47. In the Tuning Studio, you can configure the tuning experiment. The foundation model to tune is completed for you. Follow these steps to configure the tuning experiment: 1. For the foundation model to tune, select **flan-t5-xl-3b**. 1. Select **Text** for the method to initialize the prompt. There are two options: - Text: Uses text that you specify. - Random: Uses values that are generated for you as part of the tuning experiment. 1. For the *Text* field, type: `txt Summarize the complaint provided into one sentence.` The following table shows example text for each task type: \| Task type \| Example \| \| ----- \| ----- \| \| Classification \| Classify whether the sentiment of each comment is Positive or Negative \| \| Generation \| Make the case for allowing employees to work from home a few days a week \| \| Summarization \| Summarize the main points from a meeting transcript \| + 1. Select **Summarization** for the task type that most closely matches what you want the model to do. There are three task types: - *Summarization* generates text that describes the main ideas that are expressed in a body of text. - *Generation* generates text such as a promotional email. - *Classification* predicts categorical labels from features. For example, given a set of customer comments, you might want to label each statement as a question or a problem. When you use the classification task, you need to list the class labels that you want the model to use. Specify the same labels that are used in your tuning training data. 1. Select your training data from the project. 1. Click **Select from project**. 1. Click **Data asset**. 1. Select the **customer complaints training data.json** file. 1. Click **Select asset**. 1. Click **Start tuning**. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the configured tuning experiment. Next, you review the results and deploy the tuned model. + + ![The following image shows the configured tuning experiment.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-ts-configured-exp.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 6: Deploy your tuned model to a deployment space + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 03:17. When the experiment run is complete, you see the tuned model and the Loss function chart. Loss function measures the difference between predicted and actual results with each training run. Follow these steps to view the loss function chart and the tuned model: 1. Review the Loss function chart. A downward sloping curve means that the model is getting better at generating the expected output. ![Completed tuning experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-ts-exp-complete.png)\{: biw\} 1. Below the chart, click the **Summarize customer complaints** tuned model. 1. Scroll through the model details. 1. Click **Deploy**. 1. For the name, type: `txt Summarize customer complaints tuned model` 1. For the *Target deployment space*, select an existing deployment space. If you don't have an existing deployment space, follow these steps: 1. For the *Target deployment space*, select **Create a new deployment space**. 1. For the deployment space name, type: `txt Foundation models deployment space` 1. Select a storage service from the list. 1. Select your provisioned machine learning service from the list. 1. Click **Create**. 1. Click **Close**. 1. For the *Target deployment space*, verify that **Foundation models deployment space** is selected. 1. Check the **View deployment in deployment space after creating** option. 1. Click **Create**. 1. On the *Deployments* page, click the **Summarize customer complaints tuned mode** deployment to view the details. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the deployment in the deployment space. You are now ready to test the deployed model. + + ![The following image shows the deployment in the deployment space.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-ts-deployment.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 7: Test your tuned model + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 04:04. You can test your tuned model in the Prompt Lab. Follow these steps to test your tuned model: 1. From the model deployment page, click **Open in prompt lab**, and then select your sandbox project. The Prompt Lab displays. 1. Select your tuned model. 1. Click the model drop-down list, and select **View all foundation models**. 1. Select the **Summarize customer complaints tuned model** model. 1. Click **Select model**. 1. On the *Structured mode* page, type the *Instruction*: `Summarize customer complaints`\{: .cp\} 1. On the *Structured mode* page, provide the examples and test input. \| Example input \| Example output \| \| ----- \| ----- \| \| I forgot in my initial date I was using Capital One and this debt was in their hands and never was done. \| Debt collection, sub-product: credit card debt, issue: took or threatened to take negative or legal action sub-issue \| \| I am a victim of identity theft and this debt does not belong to me. Please see the identity theft report and legal affidavit. \| Debt collection, dub-product, I do not know, issue. attempts to collect debt not owed. sub-issue debt was a result of identity theft \| + 1. In the *Try* text field, copy and paste the following prompt: `txt After I reviewed my credit report, I am still seeing information that is reporting on my credit file that is not mine. please help me in getting these items removed from my credit file.` 1. Click **Generate**, and review the results. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows results in the Prompt Lab. + + ![The following image shows results in the Prompt Lab.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-ts-prompt-lab.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html?context=cdpaas&locale=en#video-preview) + + + +## Next steps ## + +Try these other tutorials: + + + + * [Prompt a foundation model in the Prompt Lab tutorial](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html) + * [Prompt a foundation model with retrieval\-augmented generation pattern](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html) + + + +## Additional resources ## + + + + * [Foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html) + * [Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) + * [Python library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-python-lib.html) + * [Security and privacy for foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-security.html) + * View more [videos](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html)\. + * Find sample data sets, projects, models, prompts, and notebooks in the Samples to gain hands\-on experience: + + ![Notebook icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook.svg)[Notebooks](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=notebook) that you can add to your project to get started analyzing data and building models. + + ![Project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/ibm-cloud--projects.svg)[Projects](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=project-template) that you can import containing notebooks, data sets, prompts, and other assets. + + ![Data set icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/data--set.svg)[Data sets](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=dataset) that you can add to your project to refine, analyze, and build models. + + ![Prompt icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/prompt.svg)[Prompts](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=example-prompt) that you can use in the Prompt Lab to prompt a foundation model. + + ![Model icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/model.svg)[Foundation models](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=foundation-model) that you can use in the Prompt Lab. + + + +**Parent topic:**[Quick start tutorials](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/812c39cf410f9fe3f0d0e7c62ed1bc015370c849.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/812c39cf410f9fe3f0d0e7c62ed1bc015370c849.md new file mode 100644 index 0000000..5f16dbb --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/812c39cf410f9fe3f0d0e7c62ed1bc015370c849.md @@ -0,0 +1,415 @@ +# Frequently asked questions + +# Frequently asked questions # + +Find answers to frequently asked questions about watsonx\.ai\. + +## Account and setup questions ## + + + + * [How do I sign up for watsonx?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#sign-up-wxai) + * [Can I try watsonx for free?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#free) + * [How do I upgrade watsonx\.ai and watsonx\.governance?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#upgrade) + * [Which regions can I provision watsonx\.ai and watsonx\.governance in?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/regional-datactr.html) + * [Which web browsers are supported for watsonx?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/browser-support.html) + * [How can I get the most runtime from my Watson Studio Lite plan?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#ws-lite) + * [How do I change languages for the product and the documentation?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/localization.html) + * [How do I find my IBM Cloud account owner or administrator?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#accountadmin) + * [Can I provide feedback?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#feedback) + + + +## Foundation model questions ## + + + + * [What foundation models are available and where do they come from?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#fm-available) + * [What data was used to train foundation models?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#fm-data) + * [Do I need to check generated output for biased, inappropriate, or incorrect content?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#fm-check) + * [Is there a limit to how much text generation I can do?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#fm-token-limit) + * [Does prompt engineering train the foundation model?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#fm-train) + * [Does IBM have access to or use my data in any way?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#fm-privacy) + * [What APIs are available?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#fm-apis) + + + +## Project questions ## + + + + * [How do I load very large files to my project?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#verylarge) + + + +## IBM Cloud Object Storage questions ## + + + + * [What is saved in IBM Cloud Object Storage for workspaces?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#saved-in-cos) + * [Do I need to upgrade IBM Cloud Object Storage when I upgrade other services?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#upgrade-cos) + * [Why am I unable to add storage to an existing project or to see the IBM Cloud Object Storage selection in the New Project dialog?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#cosstep) + + + +## Notebook questions ## + + + + * [Can I install libraries or packages to use in my notebooks?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#install-libraries) + * [Can I call functions that are defined in one notebook from another notebook?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#functions-defined) + * [Can I add arbitrary notebook extensions?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#arbitrary) + * [How do I access the data from a CSV file in a notebook?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#csv-file) + * [How do I access the data from a compressed file in a notebook?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#compressed-file) + + + +## Security and reliability questions ## + + + + * [How secure is IBM watsonx?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#security) + * [Is my data and notebook protected from sharing outside of my collaborators?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#protected-notebooks) + * [Do I need to back up my notebooks?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#backup-notebooks) + + + +## Sharing and collaboration questions ## + + + + * [What are the implications of sharing a notebook?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#sharing-notebooks) + * [How can I share my work outside of RStudio?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#how-share) + * [How do I share my SPSS Modeler flow with another project?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#share-spss) + + + +## Machine learning questions ## + + + + * [How do I run an AutoAI experiment?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#run-autoai) + * [What is available for automated model building?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#wml-autoai) + * [What frameworks and libraries are available for my machine learning models?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#wml-frameworks) + * [What is an API Key?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#wml-api-key) + + + +## Watson OpenScale questions ## + + + + * [What is Watson OpenScale?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#faq-whatsa) + * [How do I convert a prediction column from an integer data type to a categorical data type?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#wos-faqs-convert-data-types) + * [Why does Watson OpenScale need access to training data?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#trainingdata) + * [What does it mean if the fairness score is greater than 100 percent?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#fairness-score-over100) + * [How is model bias mitigated by using Watson OpenScale?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#wos-001-bias) + * [Is it possible to check for model bias on sensitive attributes, such as race and sex, even when the model is not trained on them?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#wos-002-attrib) + * [Is it possible to mitigate bias for regression\-based models?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#wos-003-regress) + * [What are the different methods of debiasing in Watson OpenScale?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#wos-004-methods-bias) + * [Configuring a model requires information about the location of the training data and the options are Cloud Object Storage and Db2\. If the data is in Netezza, can Watson OpenScale use Netezza?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#configmodel) + * [Why doesn't Watson OpenScale see the updates that were made to the model?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#new-model-missing) + * [What are the various kinds of risks associated in using a machine learning model? ](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#wos-risk) + * [Must I keep monitoring the Watson OpenScale dashboard to make sure that my models behave as expected?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#wos-dashboard-email) + * [In Watson OpenScale, what data is used for Quality metrics computation?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#wos-quality-data) + * [In Watson OpenScale, can the threshold be set for a metric other than 'Area under ROC' during configuration?](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html?context=cdpaas&locale=en#wos-thresholds) + + + +## IBM watsonx\.ai questions ## + +### How do I sign up for watsonx? ### + +Go to [Try IBM watsonx\.ai](https://dataplatform.cloud.ibm.com/registration/stepone?context=wx&apps=data_science_experience,watson_data_platform,cos&uucid=0b526de8c1c419db&utm_content=WXAWW) or [Try watsonx\.governance](https://dataplatform.cloud.ibm.com/registration/stepone?context=wx&apps=data_science_experience,watson_machine_learning,cos,aiopenscale&uucid=0cf8ca3f38ace12f&utm_content=WXGWW®ions=us-south)\. If you sign up for watsonx\.governance, you automatically provision watsonx\.ai as well\. + +### Can I try watsonx for free? ### + +Yes, when you sign up for IBM watsonx\.ai, you automatically provision the free version of the underlying services: Watson Studio, Watson Machine Learning, and IBM Cloud Object Storage\. When you sign up for IBM watsonx\.governance, you automatically provision the free version of Watson OpenScale and the free versions of the services for IBM watsonx\.ai\. + +### How do I upgrade watsonx\.ai and watsonx\.governance? ### + +When you're ready to upgrade any of the underlying services for watsonx\.ai or watsonx\.governance, you can upgrade in place without losing any of your work or data\. + +You must be the owner or administrator of the IBM Cloud account for a service to upgrade it\. See [Upgrading services on watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/upgrade.html)\. + +### How can I get the most runtime from my Watson Studio Lite plan? ### + +The Watson Studio Lite plan allows for 10 CUH per month\. You can maximize your available CUH by setting your assets to use environments with lower CUH rates\. For example, you can [change your notebook environment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html#change-env)\. To see the available environments and the required CUH, go to the [Services catalog page for Watson Studio](https://dataplatform.cloud.ibm.com/data/catalog/data-science-experience?context=wx&target=wx)\. + +### How do I find my IBM Cloud account owner? ### + +If you have an enterprise account or work in an IBM Cloud that you don't own, you might need to ask an account owner to give you access to a workspace or another role\. + +To find your IBM Cloud account owner: + + + +1. From the navigation menu, choose **Administration > Access (IAM)**\. +2. From the avatar menu, make sure you're in the right account, or switch accounts, if necessary\. +3. Click **Users**, and find the username with the word `owner` next to it\. + + + +To understand roles, see [Roles for IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/roles.html)\. To determine your roles, see [Determine your roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/your-roles.html)\. + +### Can I provide feedback? ### + +Yes, we encourage feedback as we continue to develop this platform\. From the navigation menu, select **Support > Share an idea**\. + +## Foundation models ## + +### What foundation models are available and where do they come from? ### + +See the complete list of [supported foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html)\. + +### What data was used to train foundation models? ### + +Links to details about each model, including pretraining data and fine\-tuning, are available here: [Supported foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html)\. + +### Do I need to check generated output for biased, inappropriate, or incorrect content? ### + +Yes, you must review the generated output of foundation models\. Third Party models have been trained with data that might contain biases and inaccuracies and can generate outputs containing misinformation, obscene or offensive language, or discriminatory content\. + +In the Prompt Lab, when you toggle **AI guardrails** on, any sentence in the prompt text or model output that contains harmful language will be replaced with a message saying potentially harmful text has been removed\. + +See [Avoiding undesirable output](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-hallucinations.html)\. + +### Is there a limit to how much text generation I can do? ### + +With the free trial of watsonx\.ai, you can use up to 25,000 tokens per month\. Your token usage is the sum of your input and output tokens\. + +With a paid service plan, there is no token limit, but you are charged for the tokens that you submit as input plus the tokens that you receive in the generated output\. + +See [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +### Does prompt engineering train the foundation model? ### + +No, submitting prompts to a foundation model does not train the model\. The models available in watsonx\.ai are pretrained, so you do not need to train the models before you use them\. + +See [Prompt tips](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-tips.html)\. + +### Does IBM have access to or use my data in any way? ### + +No, IBM does not have access to your data\. + +Your work on watsonx\.ai, including your data and the models that you create, are private to your account: + + + + * Your data is accessible only by you\. Your data is used to train only your models\. Your data will never be accessible or used by IBM or any other person or organization\. Your data is stored in dedicated storage buckets and is encrypted at rest and in motion\. + * Your models are accessible only by you\. Your models will never be accessible or used by IBM or any other person or organization\. Your models are secured in the same way as your data\. + + + +Learn more about security and your options: + + + + * [Security and privacy of foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-security.html) + * [Security for IBM watsonx\.ai](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html) + * [Data security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-data.html) + + + +### What APIs are available? ### + +You can prompt foundation models in watsonx\.ai programmatically using the Python library\. + +See [Foundation models Python library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-python-lib.html)\. + +## Projects ## + +### How do I load very large files to my project? ### + +You can't load data files larger than 5 GB to your project\. If your files are larger, you must use the Cloud Object Storage API and load the data in multiple parts\. See the [curl commands](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/store-large-objs-in-cos.html) for working with Cloud Object Storage directly on IBM Cloud\. + +See [Adding very large objects to a project's Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/store-large-objs-in-cos.html)\. + +## IBM Cloud Object Storage ## + +### What is saved in IBM Cloud Object Storage for workspaces? ### + +When you create a project or deployment space, you specify a IBM Cloud Object Storage and create a bucket that is dedicated to that workspace\. These types of objects are stored in the IBM Cloud Object Storage bucket for the workspace: + + + + * Files for data assets that you uploaded into the workspace\. + * Files associated with assets that run in tools, such as, notebooks and models\. + * Metadata about assets, such as the asset type, format, and tags\. + + + +### Do I need to upgrade IBM Cloud Object Storage when I upgrade other services? ### + +You must upgrade your IBM Cloud Object Storage instance only when you run out of storage space\. Other services can use any IBM Cloud Object Storage plan and you can upgrade any service or your IBM Cloud Object Storage service independently\. + +### Why am I unable to add storage to an existing project or to see the IBM Cloud Object Storage selection in the New Project dialog? ### + +IBM Cloud Object Storage requires an extra step for users who do not have administrative privileges for it\. The account administrator must [enable nonadministrative users to create projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html#cos-delegation)\. + +If you have administrator privileges and do not see the latest IBM Cloud Object Storage, try again later because server\-side caching might cause a delay in rendering the latest values\. + +## Notebooks ## + +### Can I install libraries or packages to use in my notebooks? ### + +You can install Python libraries and R packages through a notebook, and those libraries and packages will be available to all your notebooks that use the same environment template\. For instructions, see [Import custom or third\-party libraries](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/install-cust-lib.html)\. If you get an error about missing operating system dependencies when you install a library or package, notify IBM Support\. To see the preinstalled libraries and packages and the libraries and packages that you installed, from within a notebook, run the appropriate command: + + + + * **Python**: `!pip list` + * **R**: `installed.packages()` + + + +### Can I call functions that are defined in one notebook from another notebook? ### + +There is no way to call one notebook from another notebook on the platform\. However, you can put your common code into a library outside of the platform and then install it\. + +### Can I add arbitrary notebook extensions? ### + +No, you can't extend your notebook capabilities by adding arbitrary extensions as a customization because all notebook extensions must be preinstalled\. + +### How do I access the data from a CSV file in a notebook? ### + +After you load a CSV file into object storage, load the data by clicking the **Code snippets** icon (![the Code snippets icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/code-snippets-icon.png)) in an opened notebook, clicking **Read data** and selecting the CSV file from the project\. Then, click in an empty code cell in your notebook and insert the generated code\. + +### How do I access the data from a compressed file in a notebook? ### + +After you load the compressed file to object storage, get the file credentials by clicking the **Code snippets** icon (![the Code snippets icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/code-snippets-icon.png)) in an opened notebook, clicking **Read data** and selecting the compressed file from the project\. Then, click in an empty code cell in your notebook and load the credentials to the cell\. Alternatively, click to copy the credentials to the clipboard and paste them into your notebook\. + +## Security and reliability ## + +### How secure is IBM watsonx? ### + +The IBM watsonx platform is very secure and resilient\. See [Security of IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html)\. + +### Is my data and notebook protected from sharing outside of my collaborators? ### + +The data that is loaded into your project and notebooks is secure\. Only the collaborators in your project can access your data or notebooks\. Each platform account acts as a separate tenant of the Spark and IBM Cloud Object Storage services\. Tenants cannot access other tenant's data\. + +If you want to share your notebook with the public, then hide your data service credentials in your notebook\. For the Python and R languages, enter the following syntax: `# @hidden_cell` + +Be sure to save your notebook immediately after you enter the syntax to hide cells with sensitive data\. + +Only then should you share your work\. + +### Do I need to back up my notebooks? ### + +No\. Your notebooks are stored in IBM Cloud Object Storage, which provides resiliency against outages\. + +## Sharing and collaboration ## + +### What are the implications of sharing a notebook? ### + +When you share a notebook, the permalink never changes\. Any person with the link can view your notebook\. You can stop sharing the notebook by clearing the checkbox to share it\. Updates are not automatically shared\. When you update your notebook, you can sync the shared notebook by reselecting the checkbox to share it\. + +### How can I share my work outside of RStudio? ### + +One way of sharing your work outside of RStudio is connecting it to a shared GitHub repository that you and your collaborators can work from\. Read this [blog post](https://www.r-bloggers.com/rstudio-and-github/) for more information\. + +However, the best method to share your work with the members of a project is to use notebooks in the project that uses the R kernel\. + +RStudio is a great environment to work in for prototyping and working individually on R projects, but it is not yet integrated with projects\. + +### How do I share my SPSS Modeler flow with another project? ### + +By design, modeler flows can be used only in the project where the flow is created or imported\. If you need to use a modeler flow in a different project, you must download the flow from current project (source project) to your local environment and then import the flow to another project (target project)\. + +## IBM Watson Machine Learning ## + +### How do I run an AutoAI experiment? ### + +Go to [Creating an AutoAI experiment from sample data](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html) to watch a short video to see how to create and run an AutoAI experiment and then follow a tutorial to set up your own sample\. + +### What is available for automated model building? ### + +The AutoAI graphical tool automatically analyzes your data and generates candidate model pipelines that are customized for your predictive modeling problem\. These model pipelines are created iteratively as AutoAI analyzes your data set and discovers data transformations, algorithms, and parameter settings that work best for your problem setting\. Results are displayed on a leaderboard, showing the automatically generated model pipelines ranked according to your problem optimization objective\. For details, see [AutoAI overview](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html)\. + +### What frameworks and libraries are supported for my machine learning models? ### + +You can use popular tools, libraries, and frameworks to train and deploy machine learning models by using IBM Watson Machine Learning\. The [supported frameworks topic](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/pm_service_supported_frameworks.html) lists supported versions and features, as well as deprecated versions scheduled to be discontinued\. + +### What is an API Key? ### + +API keys allow you to easily authenticate when using the CLI or APIs that can be used across multiple services\. API Keys are considered confidential since they are used to grant access\. Treat all API keys as you would a password since anyone with your API key can impersonate your service\. + +## Watson OpenScale ## + +### What is Watson OpenScale ### + +IBM Watson OpenScale tracks and measures outcomes from your AI models, and helps ensure they remain fair, explainable, and compliant wherever your models were built or are running\. Watson OpenScale also detects and helps correct the drift in accuracy when an AI model is in production + +### How do I convert a prediction column from an integer data type to a categorical data type? ### + +For fairness monitoring, the prediction column allows only an integer numerical value even though the prediction label is categorical\. How do I configure a categorical feature that is not an integer? Is a manual conversion required? + +The training data might have class labels such as “Loan Denied”, “Loan Granted”\. The prediction value that is returned by IBM Watson Machine Learning scoring end point has values such as “0\.0”, “1\.0"\. The scoring end point also has an optional column that contains the text representation of prediction\. For example, if prediction=1\.0, the predictionLabel column might have a value “Loan Granted”\. If such a column is available, when you configure the favorable and unfavorable outcome for the model, specify the string values “Loan Granted” and “Loan Denied”\. If such a column is not available, then you need to specify the integer and double values of 1\.0, 0\.0 for the favorable, and unfavorable classes\. + +IBM Watson Machine Learning has a concept of output schema that defines the schema of the output of IBM Watson Machine Learning scoring end point and the role for the different columns\. The roles are used to identify which column contains the prediction value, which column contains the prediction probability, and the class label value, and so on\. The output schema is automatically set for models that are created by using model builder\. It can also be set by using the IBM Watson Machine Learning Python client\. Users can use the output schema to define a column that contains the string representation of the prediction\. Set the `modeling_role` for the column to ‘decoded\-target’\. Read the [documentation for the IBM Watson Machine Learning Python client](https://ibm.github.io/watson-machine-learning-sdk/)\. Search for “OUTPUT\_DATA\_SCHEMA” to understand the output schema and the API to use is to store\_model API that accepts the OUTPUT\_DATA\_SCHEMA as a parameter\. + +### Why does Watson OpenScale need access to training data? ### + +You must either provide Watson OpenScale access to training data that is stored in Db2 or IBM Cloud Object Storage, or you must run a Notebook to access the training data\. + +Watson OpenScale needs access to your training data for the following reasons: + + + + * To generate contrastive explanations: To create explanations, access to statistics, such as median value, standard deviation, and distinct values from the training data is required\. + * To display training data statistics: To populate the bias details page, Watson OpenScale must have training data from which to generate statistics\. + * To build a drift detection model: The Drift monitor uses training data to create and calibrate drift detection\. + + + +In the Notebook\-based approach, you are expected to upload the statistics and other information when you configure a deployment in Watson OpenScale\. Watson OpenScale no longer has access to the training data outside of the Notebook, which is run in your environment\. It has access only to the information uploaded during the configuration\. + +### What does it mean if the fairness score is greater than 100 percent? ### + +Depending on your fairness configuration, your fairness score can exceed 100 percent\. It means that your monitored group is getting relatively more “fair” outcomes as compared to the reference group\. Technically, it means that the model is unfair in the opposite direction\. + +### How is model bias mitigated by using Watson OpenScale? ### + +The debiasing capability in Watson OpenScale is enterprise grade\. It is robust, scalable and can handle a wide variety of models\. Debiasing in Watson OpenScale consists of a two\-step process: Learning Phase: Learning customer model behavior to understand when it acts in a biased manner\. + +Application Phase: Identifying whether the customer’s model acts in a biased manner on a specific data point and, if needed, fixing the bias\. For more information, see [Understanding how debiasing works](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-debias-ovr.html) and [Debiasing options](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-insight-debias.html)\. + +### Is it possible to check for model bias on sensitive attributes, such as race and sex, even when the model is not trained on them? ### + +Yes\. Recently, Watson OpenScale delivered a ground\-breaking feature called “Indirect Bias detection\.” Use it to detect whether the model is exhibiting bias indirectly for sensitive attributes, even though the model is not trained on these attributes\. For more information, see [Understanding how debiasing works](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-debias-ovr.html#mf-debias-indirect)\. + +### Is it possible to mitigate bias for regression\-based models? ### + +Yes\. You can use Watson OpenScale to mitigate bias on regression\-based models\. No additional configuration is needed from you to use this feature\. Bias mitigation for regression models is done out\-of\-box when the model exhibits bias\. + +### What are the different methods of debiasing in Watson OpenScale? ### + +You can use both Active Debiasing and Passive Debiasing for debiasing\. For more information, see [Debiasing options](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-insight-debias.html#it-dbo-active)\. + +### Configuring a model requires information about the location of the training data and the options are Cloud Object Storage and Db2\. If the data is in Netezza, can Watson OpenScale use Netezza? ### + +Use this [Watson OpenScale Notebook](https://github.com/IBM/watson-openscale-samples/blob/main/Cloud%20Pak%20for%20Data/Batch%20Support/Configuration%20generation%20for%20OpenScale%20batch%20subscription.ipynb) to read the data from Netezza and generate the training statistics and also the drift detection model\. + +### Why doesn't Watson OpenScale see the updates that were made to the model? ### + +Watson OpenScale works on a deployment of a model, not on the model itself\. You must create a new deployment and then configure this new deployment as a new subscription in Watson OpenScale\. With this arrangement, you are able to compare the two versions of the model\. + +### What are the various kinds of risks associated in using a machine learning model? ### + +Multiple kinds of risks that are associated with machine learning models, such as any change in input data that is also known as Drift can cause the model to make inaccurate decisions, impacting business predictions\. Training data can be cleaned to be free from bias but runtime data might induce biased behavior of model\. + +Traditional statistical models are simpler to interpret and explain, but unable to explain the outcome of the machine learning model can pose a serious threat to the usage of the model\. + +### Must I keep monitoring the Watson OpenScale dashboard to make sure that my models behave as expected? ### + +No, you can set up email alerts for your production model deployments in Watson OpenScale\. You receive email alerts whenever a risk evaluation test fails, and then you can come and check the issues and address them\. + +### In Watson OpenScale, what data is used for Quality metrics computation? ### + +Quality metrics are calculated that use manually labeled feedback data and monitored deployment responses for this data\. + +### In Watson OpenScale, can the threshold be set for a metric other than 'Area under ROC' during configuration? ### + +No, currently, the threshold can be set only for the 'Area under ROC' metric\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/81d740cef3967c20721612b7866072ef240484e9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/81d740cef3967c20721612b7866072ef240484e9.md new file mode 100644 index 0000000..767f861 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/81d740cef3967c20721612b7866072ef240484e9.md @@ -0,0 +1,21 @@ +# Decision Optimization Java models + +# Decision Optimization Java models # + +You can create and run Decision Optimization models in Java by using the Watson Machine Learning REST API\. + +You can build your Decision Optimization models in Java or you can use Java worker to package CPLEX, CPO, and OPL models\. + +For more information about these models, see the following reference manuals\. + + + + * [Java CPLEX reference documentation](https://www.ibm.com/docs/en/SSSA5P_22.1.1/ilog.odms.cplex.help/refjavacplex/html/overview-summary.html) + * [Java CPO reference documentation](https://www.ibm.com/docs/en/SSSA5P_22.1.1/ilog.odms.cpo.help/refjavacpoptimizer/html/overview-summary.html) + * [Java OPL reference documentation](https://www.ibm.com/docs/en/SSSA5P_22.1.1/ilog.odms.ide.help/refjavaopl/html/overview-summary.html) + + + +To package and deploy Java models in Watson Machine Learning, see [Deploying Java models for Decision Optimization](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployJava.html) and the boilerplate provided in the [Java worker GitHub](https://github.com/IBMDecisionOptimization/cplex-java-worker/blob/master/README.md)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/81f297b28d1978eb0d0b1985d6f44b45dfe53542.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/81f297b28d1978eb0d0b1985d6f44b45dfe53542.md new file mode 100644 index 0000000..2b322fc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/81f297b28d1978eb0d0b1985d6f44b45dfe53542.md @@ -0,0 +1,6 @@ +# Population pyramid charts + +# Population pyramid charts # + +Population pyramid charts (also known as "age\-sex pyramids") are commonly used to present and analyze population information based on age and gender\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/82199291da8dbb7656b03232f5be43ba4d343654.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/82199291da8dbb7656b03232f5be43ba4d343654.md new file mode 100644 index 0000000..a3b70b8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/82199291da8dbb7656b03232f5be43ba4d343654.md @@ -0,0 +1,87 @@ +# Amazon RDS for Oracle connection + +# Amazon RDS for Oracle connection # + +To access your data in Amazon RDS for Oracle, create a connection asset for it\. + +Amazon RDS for Oracle is an Oracle relational database that runs on the Amazon Relational Database Service (RDS)\. + +## Supported Oracle versions and editions ## + + + + * Oracle Database 19c (19\.0\.0\.0) + * Oracle Database 12c Release 2 (12\.2\.0\.1) + * Oracle Database 12c Release 1 (12\.1\.0\.2) + + + +## Create a connection to Amazon RDS for Oracle ## + +To create the connection asset, you'll need these connection details: + + + + * Either the Oracle Service name or the Oracle System ID (SID) for the database\. + * Hostname or IP address of the database + * Port number of the database\. (Default is `1521`) + * SSL certificate (if required by the database server) + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +**Projects** + +You can use Amazon RDS for Oracle connections in the following workspaces and tools: + + + + * Data Refinery + * Decision Optimization + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Amazon RDS for Oracle setup ## + +To set up the Oracle database on Amazon, see these topics: + + + + * [Creating an Amazon RDS DB Instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html) + * [Creating an Oracle DB instance and connecting to a database on an Oracle DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.Oracle.html) + * [Connecting to your Oracle DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ConnectToOracleInstance.html) + + + +## Learn more ## + +[Amazon RDS for Oracle](https://aws.amazon.com/rds/oracle/) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/823d9660b5b41b7c85904d0eb88a8d40ac57383f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/823d9660b5b41b7c85904d0eb88a8d40ac57383f.md new file mode 100644 index 0000000..cda5a1d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/823d9660b5b41b7c85904d0eb88a8d40ac57383f.md @@ -0,0 +1,14 @@ +# Summary (SPSS Modeler) + +# Summary # + +With this example Automated Modeling for a Flag Target flow, you used the Auto Classifier node to compare a number of different models, used the three most accurate models, and added them to the flow within an ensembled Auto Classifier model nugget\. + + + + * Based on overall accuracy, the XGBoost Tree, C5\.0, and C&R Tree models performed best on the training data\. + * The ensembled model performed nearly as well as the best of the individual models and may perform better when applied to other datasets\. If your goal is to automate the process as much as possible, this approach allows you to obtain a robust model under most circumstances without having to dig deeply into the specifics of any one model\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/823eb607207dfd62d80671af48451cce1c44153f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/823eb607207dfd62d80671af48451cce1c44153f.md new file mode 100644 index 0000000..ad08270 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/823eb607207dfd62d80671af48451cce1c44153f.md @@ -0,0 +1,6 @@ +# Bar charts + +# Bar charts # + +Bar charts are useful for summarizing categorical variables\. For example, you can use a bar chart to show the number of men and the number of women who participated in a survey\. You can also use a bar chart to show the mean salary for men and the mean salary for women\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/82512a3915bf43df08d9106027a67d5e059b2719.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/82512a3915bf43df08d9106027a67d5e059b2719.md new file mode 100644 index 0000000..0b71b02 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/82512a3915bf43df08d9106027a67d5e059b2719.md @@ -0,0 +1,151 @@ +# Creating an SPSS Modeler batch job with multiple data sources + +# Creating an SPSS Modeler batch job with multiple data sources # + +In an SPSS Modeler flow, it's common to have multiple import and export nodes, where multiple import nodes can be fetching data from one or more relational databases\. Learn how to use Watson Machine Learning to create an SPSS Modeler batch job with multiple data sources from relational databases\. + +Note:The examples use IBM Db2 and IBM Db2 Warehouse, referred to in examples as *dashdb*\. + +## Connecting to multiple relational databases as input to a batch job ## + +The number of import nodes in an SPSS Modeler flow can vary\. You might use as many as 60 or 70\. However, the number of distinct connections to databases in these cases are just a few, though the table names that are accessed through the connections vary\. Rather than specifying the details for every table connection, the approach that is described here focuses on the database connections\. Therefore, the batch jobs accept a list of data connections or references by *node name* that are mapped to connection names in the SPSS Modeler flow's import nodes\. + +For example, assume that if a flow has 30 nodes, only three database connections are used to connect to 30 different tables\. In this case, you submit three connections (C1, C2, and C3) to the batch job\. C1, C2, and C3 are connection names in the import node of the flow and the *node name* in the input of the batch job\. + +When a batch job runs, the data reference for a node is provided by mapping the *node name* with the *connection name* in the import node\. This example illustrates the steps for creating the mapping\. + +The following diagram shows the flow from model creation to job submission: + +![SPSS Modeler job with multiple inputs](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/word_SPSS-multiple-input-job.svg) + +**Limitation:** The connection reference for a node in a flow is overridden by the reference that is received from the batch job\. However, the table name in the import or export node is not overridden\. + +## Deployment scenario with example ## + +In this example, an SPSS model is built by using 40 import nodes and a single output\. The model has the following configuration: + + + + * Connections to three databases: 1 Db2 Warehouse (dashDB) and 2 Db2\. + * The import nodes are read from 40 tables (30 from Db2 Warehouse and 5 each from the Db2 databases)\. + * A single output table is written to a Db2 database\. + + + +![SPSS Modeler flow with multiple inputs](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/word_SPSS-multiple-input-job2.svg) + +### Example ### + +These steps demonstrate how to create the connections and identify the tables\. + + + +1. Create a connection in your project\. + + To run the SPSS Modeler flow, you start in your project and create a connection for each of the three databases your model connects to. You then configure each import node in the flow to point to a table in one of the connected databases. + + For this example, the database connections in the project are named `dashdb_conn`, `db2_conn1`, and `db2_conn2`. +2. Configure Data Asset to import nodes in your SPSS Modeler flow with connections\. + + Configure each node in the flow to reference one of the three connections you created (`dashdb_conn`, `db2_conn1`, and `db2_conn2`), then specify a table for each node. + + Note: You can change the name of the connection at the time of the job run. The table names that you select in the flow are referenced when the job runs. You can't overwrite or change them. +3. Save the SPSS model to the Watson Machine Learning repository\. + + For this example, it's helpful to provide the input and output schema when you are saving the model. It simplifies the process of identifying each input when you create and submit the batch job in the Watson Studio user interface. Connections that are referenced in the Data Asset nodes of the SPSS Modeler flow must be provided in the *node name* field of the input schema. To find the *node name*, double-click the Data Asset import node in your flow to open its properties: + + ![Data Asset import node name](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/spss-node-name.png) + + Note:SPSS models that are saved without schemas are still supported for jobs, but you must enter *node name* fields manually and provide the data asset when you submit the job. + + This code sample shows how to save the input schema when you save the model (Endpoint: `POST /v4/models`). + + { + "name": "SPSS Drug Model", + "label_column": "label", + "type": "spss-modeler_18.1", + "runtime": { + "href": "/v4/runtimes/spss-modeler_18.1" + }, + "space": { + "href": "/v4/spaces/" + }, + "schemas": { + "input": [ { "id": "dashdb_conn", "fields": ] }, + { "id": "db2_conn1 ", "fields": ] } , + { "id": "db2_conn2", "fields": ] } ], + "output": [{ "id": "db2_conn2 ","fields": ] }] + } + } + + Note: The number of fields in each of these connections doesn't matter. They’re not validated or used. What's important is the number of connections that are used. +4. Create the batch deployment for the SPSS model\. + + For SPSS models, the creation process of the batch deployment job is the same. You can submit the deployment request with the model that was created in the previous step. +5. Submit SPSS batch jobs\. + + You can submit a batch job from the Watson Studio user interface or by using the REST API. If the schema is saved with the model, the Watson Studio user interface makes it simple to accept input from the connections specified in the schema. Because you already created the data connections, you can select a connected data asset for each *node name* field that displays in the Watson Studio user interface as you define the job. + + The name of the connection that is created at the time of job submission can be different from the one used at the time of model creation. However, it must be assigned to the *node name* field. + + + +### Submitting a job when schema is not provided ### + +If the schema isn't provided in the model metadata at the time the model is saved, you must enter the *import node name* manually\. Further, you must select the data asset in the Watson Studio user interface for each connection\. Connections that are referenced in the Data Asset import nodes of the SPSS Modeler flow must be provided in the *node name* field of the import/export data references\. + +#### Specifying the connections for a job with data asset #### + +This code sample demonstrates how to specify the connections for a job that is submitted by using the REST API (Endpoint: `/v4/deployment_jobs`)\. + + { + "deployment": { + "href": "/v4/deployments/" + }, + "scoring": { + "input_data_references": [ + { + "id": "dashdb_conn", + "name": "dashdb_conn", + "type": "data_asset", + "connection": {}, + "location": { + "href": "/v2/assets/?space_id=" + }, + "schema": {} + }, + { + "id": "db2_conn1 ", + "name": "db2_conn1 ", + "type": "data_asset", + "connection": {}, + "location": { + "href": "/v2/assets/?space_id=" + }, + "schema": {} + }, + { + "id": "db2_conn2 ", + "name": "db2_conn2", + "type": "data_asset", + "connection": {}, + "location": { + "href": "/v2/assets/?space_id=" + }, + "schema": {} + }], + "output_data_reference": { + "id": "db2_conn2" + "name": "db2_conn2", + "type": "data_asset ", + "connection": {}, + "location": { + "href": "/v2/assets/?space_id=" + }, + "schema": {} + } + } + +**Parent topic:**[Creating a batch deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-details.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/82546b72edbfb76f571cfd06a7009e01615fa054.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/82546b72edbfb76f571cfd06a7009e01615fa054.md new file mode 100644 index 0000000..472c3a5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/82546b72edbfb76f571cfd06a7009e01615fa054.md @@ -0,0 +1,12 @@ +# Sim Eval node (SPSS Modeler) + +# Sim Eval node # + +The Simulation Evaluation (Sim Eval) node is a terminal node that evaluates a specified field, provides a distribution of the field, and produces charts of distributions and correlations\. + +This node is primarily used to evaluate continuous fields\. It therefore compliments the evaluation chart, which is generated by an Evaluation node and is useful for evaluating discrete fields\. Another difference is that the Sim Eval node evaluates a single prediction across several iterations, whereas the Evaluation node evaluates multiple predictions each with a single iteration\. Iterations are generated when more than one value is specified for a distribution parameter in the Sim Gen node\. + +The Sim Eval node is designed to be used with data that was obtained from the Sim Fit and Sim Gen nodes\. The node can, however, be used with any other node\. Any number of processing steps can be placed between the Sim Gen node and the Sim Eval node\. + +Important: The Sim Eval node requires a minimum of 1000 records with valid values for the target field\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8279c6c73a8db1a593945e5ea339f9efde96a61e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8279c6c73a8db1a593945e5ea339f9efde96a61e.md new file mode 100644 index 0000000..be2fa82 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8279c6c73a8db1a593945e5ea339f9efde96a61e.md @@ -0,0 +1,52 @@ +# Scaling a deployment + +# Scaling a deployment # + +When you create an online deployment for a model or function from a deployment space or programmatically, a single copy of the asset is deployed by default\. To increase scalability and availability, you can increase the number of copies (replicas) by editing the configuration of the deployment\. More copies allow for a larger volume of scoring requests\. + +Deployments can be scaled in the following ways: + + + + * Update the configuration for a deployment in a deployment space\. + * Programmatically, using the Watson Machine Learning Python client library, or the Watson Machine Learning REST APIs\. + + + +## Changing the number of copies of an online deployment from a space ## + + + +1. Click the **Deployment** tab of your deployment space\. +2. From the action menu for your deployment name, click **Edit**\. +3. In the **Edit deployment** dialog box, change the number of copies and click **Save**\. + + + +## Increasing the number of replicas of a deployment programmatically ## + +To view or run a working sample of scaling a deployment programmatically, you can increase the number of replicas in the metadata for a deployment\. + +### Python example ### + +This example uses the Python client to set the number of replicas to 3\. + + change_meta = { + client.deployments.ConfigurationMetaNames.HARDWARE_SPEC: { + "name":"S", + "num_nodes":3} + } + + client.deployments.update(, change_meta) + +The HARDWARE\_SPEC value includes a name because the API requires a name or an ID to be provided\. + +### REST API example ### + + curl -k -X PATCH -d '[ { "op": "replace", "path": "/hardware_spec", "value": { "name": "S", "num_nodes": 2 } } ]' + +You must specify a name for the `hardware_spec` value, but the argument is not applied for scaling\. + +**Parent topic:**[Managing predictive deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/82b2c3e8a59998daa1bc70938a0155ec8c9ed3a1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/82b2c3e8a59998daa1bc70938a0155ec8c9ed3a1.md new file mode 100644 index 0000000..9492b13 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/82b2c3e8a59998daa1bc70938a0155ec8c9ed3a1.md @@ -0,0 +1,33 @@ +# Validating your data in Data Refinery + +# Validating your data in Data Refinery # + +At any time after you've added data to Data Refinery, you can validate your data\. Typically, you'll want to do this at multiple points in the refinement process\. + +To validate your data: + + + +1. From Data Refinery, click the **Profile** tab\. +2. Review the metrics for each column\. +3. Take appropriate actions, as described in the following sections, depending on what you learn\. + + + +## Frequency ## + +Frequency is the number of times that a value, or a value in a specified range, occurs\. Each frequency distribution (bar) shows the count of unique values in a column\. + +Review the frequency distribution to find anomalies in your data\. If you want to cleanse your data of those anomalies, simply remove the values\. + +For Integer and Date/Time columns, you can customize the number of bins (groupings) that you want to see\. In the default multi\-column view, the maximum is 20\. If you expand the frequency chart row, the maximum is 50\. + +## Statistics ## + +Statistics are a collection of quantitative data\. The statistics for each column show the minimum, maximum, mean, and number of unique values in that column\. + +Depending on a column's data type, the statistics for each column will vary slightly\. For example, statistics for a column of data type integer have minimum, maximum, and mean values while statistics for a column of data type string have minimum length, maximum length, and mean length values\. + +**Parent topic:**[Refining data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/83198577cac405ad1a9bf68be7a5caeb020d57d4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/83198577cac405ad1a9bf68be7a5caeb020d57d4.md new file mode 100644 index 0000000..753c9fe --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/83198577cac405ad1a9bf68be7a5caeb020d57d4.md @@ -0,0 +1,39 @@ +# Leaving a project + +# Leaving a project # + +You can leave a project from within the project or from the **Projects** page\. + +## Restrictions ## + +If you are the only collaborator in the project with the **Admin** role, you must [assign the Admin role](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html) to another collaborator before you can leave the project\. + +## Leaving a project from within the project ## + +To leave a project from within the project: + + + +1. Open the project\. +2. On the **Manage** tab, go to the **General** page\. +3. In the **Danger zone** section, click **Leave project**\. +4. Click **Leave**\. + + + +## Leaving multiple projects ## + +To leave one or more projects from the **Projects** page: + + + +1. Select **View all projects** from the navigation menu\. +2. Select one or more projects to leave\. +3. Click **Leave**\. +4. Click **Leave** to confirm\. + + + +**Parent topic:**[Projects ](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8322c981206a5c7eeec48c32c9ddcec9fce98aee.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8322c981206a5c7eeec48c32c9ddcec9fce98aee.md new file mode 100644 index 0000000..75ce414 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8322c981206a5c7eeec48c32c9ddcec9fce98aee.md @@ -0,0 +1,9 @@ +# Field Reorder node (SPSS Modeler) + +# Field Reorder node # + +With the Field Reorder node, you can define the natural order used to display fields downstream\. This order affects the display of fields in a variety of places, such as tables, lists, and the Field Chooser\. + +This operation is useful, for example, when working with wide datasets to make fields of interest more visible\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/83579304f7f59126fe983b1ed44bbbb1ac8bfcb2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/83579304f7f59126fe983b1ed44bbbb1ac8bfcb2.md new file mode 100644 index 0000000..7cd885a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/83579304f7f59126fe983b1ed44bbbb1ac8bfcb2.md @@ -0,0 +1,22 @@ +# Setting the time intervals (SPSS Modeler) + +# Setting the time intervals # + + + +1. Add a Time Series node and attach it to the Type node\. Double\-click the node to edit its properties\. +2. Under OBSERVATIONS AND TIME INTERVAL, select `DATE_` as the Time/Date field\. +3. Select Months as the time interval\. + + Figure 1. Setting the time interval + + ![Setting the time interval](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_bandwidth_forecast_interval.png) +4. Under MODEL OPTIONS, select the Extend records into the future option and set the value to 3\. + + Figure 2. Setting the forecast period + + ![Setting the forecast period](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_bandwidth_forecast_period.png) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/835b998310e6e268f648d4aa28528190ebbb48ca.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/835b998310e6e268f648d4aa28528190ebbb48ca.md new file mode 100644 index 0000000..715d86a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/835b998310e6e268f648d4aa28528190ebbb48ca.md @@ -0,0 +1,7 @@ +# Examples (SPSS Modeler) + +# Examples # + +This section provides Python for Spark scripting examples\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/839b16ac73c000ece7bac7d50baf6f7e37f2cad9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/839b16ac73c000ece7bac7d50baf6f7e37f2cad9.md new file mode 100644 index 0000000..15c25f8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/839b16ac73c000ece7bac7d50baf6f7e37f2cad9.md @@ -0,0 +1,33 @@ +# Time (SPSS Modeler) + +# Time # + +The CLEM language supports the time formats listed in this section\. + + + +CLEM language time formats + +Table 1\. CLEM language time formats + +| Format | Examples | +| ---------------- | ------------------------------ | +| `HHMMSS` | `120112, 010101, 221212` | +| `HHMM` | `1223, 0745, 2207` | +| `MMSS` | `5558, 0100` | +| `HH:MM:SS` | `12:01:12, 01:01:01, 22:12:12` | +| `HH:MM` | `12:23, 07:45, 22:07` | +| `MM:SS` | `55:58, 01:00` | +| `(H)H:(M)M:(S)S` | `12:1:12, 1:1:1, 22:12:12` | +| `(H)H:(M)M` | `12:23, 7:45, 22:7` | +| `(M)M:(S)S` | `55:58, 1:0` | +| `HH.MM.SS` | `12.01.12, 01.01.01, 22.12.12` | +| `HH.MM` | `12.23, 07.45, 22.07` | +| `MM.SS` | `55.58, 01.00` | +| `(H)H.(M)M.(S)S` | `12.1.12, 1.1.1, 22.12.12` | +| `(H)H.(M)M` | `12.23, 7.45, 22.7` | +| `(M)M.(S)S` | `55.58, 1.0` | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/83a5fc83aa65717942a3437217f2114454552144.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/83a5fc83aa65717942a3437217f2114454552144.md new file mode 100644 index 0000000..0e01604 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/83a5fc83aa65717942a3437217f2114454552144.md @@ -0,0 +1,27 @@ +# Creating nodes + +# Creating nodes # + +Flows provide a number of ways to create nodes\. These methods are summarized in the following table\. + + + +Methods for creating nodes + +Table 1\. Methods for creating nodes + +| Method | Return type | Description | +| ----------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `s.create(nodeType, name)` | Node | Creates a node of the specified type and adds it to the specified flow\. | +| `s.createAt(nodeType, name, x, y)` | Node | Creates a node of the specified type and adds it to the specified flow at the specified location\. If either x < 0 or y < 0, the location is not set\. | +| `s.createModelApplier(modelOutput, name)` | Node | Creates a model applier node that's derived from the supplied model output object\. | + + + +For example, you can use the following script to create a new Type node in a flow: + + stream = modeler.script.stream() + # Create a new Type node + node = stream.create("type", "My Type") + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/83cd92cdb99db6263492fad998e932f50f0f8e99.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/83cd92cdb99db6263492fad998e932f50f0f8e99.md new file mode 100644 index 0000000..5da5c34 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/83cd92cdb99db6263492fad998e932f50f0f8e99.md @@ -0,0 +1,426 @@ +# AutoAI libraries for Python + +# AutoAI libraries for Python # + +The `autoai-lib` library for Python contains a set of functions that help you to interact with IBM Watson Machine Learning AutoAI experiments\. Using the `autoai-lib` library, you can review and edit the data transformations that take place in the creation of the pipeline\. Similarly, you can use the `autoai-ts-libs` library to interact with pipeline notebooks for time series experiments\. + +## Installing autoai\-lib or autoai\-ts\-libs for Python ## + +Follow the instructions in [Installing custom libraries](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/install-cust-lib.html) to install `autoai-lib` or `autoai-ts-libs`\. + +### Using autoai\-lib and autoai\-ts\-libs for Python ### + +The `autoai-lib` and `autoai-ts-libs` library for Python contain functions that help you to interact with IBM Watson Machine Learning AutoAI experiments\. Using the `autoai-lib` library, you can review and edit the data transformations that take place in the creation of classification and regression pipelines\. Using the `autoai-ts-libs` library, you can review the data transformations that take place in the creation of time series (forecast) pipelines\. + +### Installing autoai\-lib and autoai\-ts\-libs for Python ### + +Follow the instructions in [Installing custom libraries](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/install-cust-lib.html) to install [autoai\-lib](https://pypi.org/project/autoai-libs/) and [autoai\-ts\-libs](https://pypi.org/project/autoai-ts-libs/)\. + +## The autoai\-lib functions ## + +The instantiated project object that is created after you import the `autoai-lib` library exposes these functions: + +#### autoai\_libs\.transformers\.exportable\.NumpyColumnSelector() #### + +Selects a subset of columns of a numpy array + +Usage: + + autoai_libs.transformers.exportable.NumpyColumnSelector(columns=None) + + + +| Option | Description | +| ------- | -------------------------------- | +| columns | list of column indexes to select | + + + +#### autoai\_libs\.transformers\.exportable\.CompressStrings() #### + +Removes spaces and special characters from string columns of an input numpy array X\. + +Usage: + + autoai_libs.transformers.exportable.CompressStrings(compress_type='string', dtypes_list=None, misslist_list=None, missing_values_reference_list=None, activate_flag=True) + + + +| Option | Description | +| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `compress_type` | type of string compression\. 'string' for removing spaces from a string and 'hash' for creating an int hash\. Default is 'string'\. 'hash' is used for columns with strings and cat\_imp\_strategy='most\_frequent' | +| `dtypes_list` | list containing strings that denote the type of each column of the input numpy array X (strings are among 'char\_str','int\_str','float\_str','float\_num', 'float\_int\_num','int\_num','Boolean','Unknown')\. If None, the column types are discovered\. Default is None\. | +| `misslist_list` | list contains lists of missing values of each column of the input numpy array X\. If None, the missing values of each column are discovered\. Default is None\. | +| `missing_values_reference_list` | reference list of missing values in the input numpy array X | +| `activate_flag` | flag that indicates that this transformer is active\. If False, transform(X) outputs the input numpy array X unmodified\. | + + + +#### autoai\_libs\.transformers\.exportable\.NumpyReplaceMissingValues() #### + +Given a numpy array and a reference list of missing values for it, replaces missing values with a special value (typically a special missing value such as np\.nan)\. + +Usage: + + autoai_libs.transformers.exportable.NumpyReplaceMissingValues(missing_values, filling_values=np.nan) + + + +| Option | Description | +| ---------------- | ------------------------------------------------ | +| `missing_values` | reference list of missing values | +| `filling_values` | special value that is assigned to unknown values | + + + +#### autoai\_libs\.transformers\.exportable\.NumpyReplaceUnknownValues() #### + +Given a numpy array and a reference list of known values for each column, replaces values that are not part of a reference list with a special value (typically np\.nan)\. This method is typically used to remove labels for columns in a test data set that has not been seen in the corresponding columns of the training data set\. + +Usage: + + autoai_libs.transformers.exportable.NumpyReplaceUnknownValues(known_values_list=None, filling_values=None, missing_values_reference_list=None) + + + +| Option | Description | +| ------------------------------- | ------------------------------------------------------- | +| `known_values_list` | reference list of lists of known values for each column | +| `filling_values` | special value that is assigned to unknown values | +| `missing_values_reference_list` | reference list of missing values | + + + +#### autoai\_libs\.transformers\.exportable\.boolean2float() #### + +Converts a 1\-D numpy array of strings that represent booleans to floats and replaces missing values with np\.nan\. Also changes type of array from 'object' to 'float'\. + +Usage: + + autoai_libs.transformers.exportable.boolean2float(activate_flag=True) + + + +| Option | Description | +| --------------- | ------------------------------------------------------------------------------------------------------------------------- | +| `activate_flag` | flag that indicates that this transformer is active\. If False, transform(X) outputs the input numpy array X unmodified\. | + + + +#### autoai\_libs\.transformers\.exportable\.CatImputer() #### + +This transformer is a wrapper for categorical imputer\. Internally it currently uses sklearn SimpleImputer\]([https://scikit\-learn\.org/stable/modules/generated/sklearn\.impute\.SimpleImputer\.html](https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html)) + +Usage: + + autoai_libs.transformers.exportable.CatImputer(strategy, missing_values, sklearn_version_family=global_sklearn_version_family, activate_flag=True) + + + +| Option | Description | +| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `strategy` | string, optional, default=”mean”\. The imputation strategy for missing values\.
\-`mean`: replace by using the mean along each column\. Can be used only with numeric data\.
\- `median`:replace by using the median along each column\. Can only be used with numeric data\.
\- `most_frequent`:replace by using most frequent value each column\. Used with strings or numeric data\.
\- `constant`:replace with fill\_value\. Can be used with strings or numeric data\. | +| `missing_values` | number, string, np\.nan (default) or None\. The placeholder for the missing values\. All occurrences of missing\_values are imputed\. | +| `sklearn_version_family` | str indicating the sklearn version for backward compatibiity with versions 019, and 020dev\. Currently unused\. Default is None\. | +| `activate_flag` | flag that indicates that this transformer is active\. If False, transform(X) outputs the input numpy array X unmodified\. | + + + +#### autoai\_libs\.transformers\.exportable\.CatEncoder() #### + +This method is a wrapper for categorical encoder\. If encoding parameter is 'ordinal', internally it currently uses sklearn [OrdinalEncoder](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OrdinalEncoder.html?highlight=ordinalencoder)\. If encoding parameter is 'onehot', or 'onehot\-dense' internally it uses sklearn [OneHotEncoder](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html#sklearn.preprocessing.OneHotEncoder) + +Usage: + + autoai_libs.transformers.exportable.CatEncoder(encoding, categories, dtype, handle_unknown, sklearn_version_family=global_sklearn_version_family, activate_flag=True) + + + +| Option | Description | +| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `encoding` | str, 'onehot', 'onehot\-dense' or 'ordinal'\. The type of encoding to use (default is 'ordinal')
'onehot': encode the features by using a one\-hot aka one\-of\-K scheme (or also called 'dummy' encoding)\. This encoding creates a binary column for each category and returns a sparse matrix\.
'onehot\-dense': the same as 'onehot' but returns a dense array instead of a sparse matrix\.
'ordinal': encode the features as ordinal integers\. The result is a single column of integers (0 to n\_categories \- 1) per feature\. | +| `categories` | 'auto' or a list of lists/arrays of values\. Categories (unique values) per feature:
'auto' : Determine categories automatically from the training data\.
`list` : `categories[i]` holds the categories that are expected in the ith column\. The passed categories must be sorted and can not mix strings and numeric values\. The used categories can be found in the `encoder.categories_` attribute\. | +| `dtype` | number type, default np\.float64 Desired dtype of output\. | +| `handle_unknown` | 'error' (default) or 'ignore'\. Whether to raise an error or ignore if a unknown categorical feature is present during transform (default is to raise)\. When this parameter is set to 'ignore' and an unknown category is encountered during transform, the resulting one\-hot encoded columns for this feature are all zeros\. In the inverse transform, an unknown category are denoted as None\. Ignoring unknown categories is not supported for `encoding='ordinal'`\. | +| `sklearn_version_family` | str indicating the sklearn version for backward compatibiity with versions 019, and 020dev\. Currently unused\. Default is None\. | +| `activate_flag` | flag that indicates that this transformer are active\. If False, transform(X) outputs the input numpy array X unmodified\. | + + + +#### autoai\_libs\.transformers\.exportable\.float32\_transform() #### + +Transforms a float64 numpy array to float32\. + +Usage: + + autoai_libs.transformers.exportable.float32_transform(activate_flag=True) + + + +| Option | Description | +| --------------- | ------------------------------------------------------------------------------------------------------------------------- | +| `activate_flag` | flag that indicates that this transformer is active\. If False, transform(X) outputs the input numpy array X unmodified\. | + + + +#### autoai\_libs\.transformers\.exportable\.FloatStr2Float() #### + +Given numpy array X and dtypes\_list that denotes the types of its columns, it replaces columns of strings that represent floats (type 'float\_str' in dtypes\_list) to columns of floats and replaces their missing values with np\.nan\. + +Usage: + + autoai_libs.transformers.exportable.FloatStr2Float(dtypes_list, missing_values_reference_list=None, activate_flag=True) + + + +| Option | Description | +| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `dtypes_list` | list contains strings that denote the type of each column of the input numpy array X (strings are among 'char\_str','int\_str','float\_str','float\_num', 'float\_int\_num','int\_num','Boolean','Unknown')\. | +| `missing_values_reference_list` | reference list of missing values | +| `activate_flag` | flag that indicates that this transformer is active\. If False, transform(X) outputs the input numpy array X unmodified\. | + + + +#### autoai\_libs\.transformers\.exportable\.NumImputer() #### + +This method is a wrapper for numerical imputer\. + +Usage: + + autoai_libs.transformers.exportable.NumImputer(strategy, missing_values, activate_flag=True) + + + +| Option | Description | +| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `strategy` | num\_imp\_strategy: string, optional (default=”mean”)\. The imputation strategy:
\- If “mean”, then replace missing values by using the mean along the axis\.
\- If “median”, then replace missing values by using the median along the axis\.
\- If “most\_frequent”, then replace missing by using the most frequent value along the axis\. | +| `missing_values` | integer or “NaN”, optional (default=”NaN”)\. The placeholder for the missing values\. All occurrences of missing\_values are imputed:
\- For missing values encoded as np\.nan, use the string value “NaN”\.
\- `activate_flag`: flag that indicates that this transformer is active\. If False, transform(X) outputs the input numpy array X unmodified\. | + + + +#### autoai\_libs\.transformers\.exportable\.OptStandardScaler() #### + +This parameter is a wrapper for scaling of numerical variables\. It currently uses sklearn [StandardScaler](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html) internally\. + +Usage: + + autoai_libs.transformers.exportable.OptStandardScaler(use_scaler_flag=True, num_scaler_copy=True, num_scaler_with_mean=True, num_scaler_with_std=True) + + + +| Option | Description | +| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `num_scaler_copy` | Boolean, optional, default True\. If False, try to avoid a copy and do in\-place scaling instead\. This action is not guaranteed to always work\. With in\-place, for example, if the data is not a NumPy array or scipy\.sparse CSR matrix, a copy might still be returned\. | +| `num_scaler_with_mean` | Boolean, True by default\. If True, center the data before scaling\. An exception is raised when attempted on sparse matrices because centering them entails building a dense matrix, which in common use cases is likely to be too large to fit in memory\. | +| `num_scaler_with_std` | Boolean, True by default\. If True, scale the data to unit variance (or equivalently, unit standard deviation)\. | +| `use_scaler_flag` | Boolean, flag that indicates that this transformer is active\. If False, transform(X) outputs the input numpy array X unmodified\. Default is True\. | + + + +#### autoai\_libs\.transformers\.exportable\.NumpyPermuteArray() #### + +Rearranges columns or rows of a numpy array based on a list of indexes\. + +Usage: + + autoai_libs.transformers.exportable.NumpyPermuteArray(permutation_indices=None, axis=None) + + + +| Option | Description | +| --------------------- | ----------------------------------------------------- | +| `permutation_indices` | list of indexes based on which columns are rearranged | +| `axis` | 0 permute along columns\. 1 permute along rows\. | + + + +### Feature transformation ### + +These methods apply to the feature transformations described in [AutoAI implementation details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html)\. + +#### autoai\_libs\.cognito\.transforms\.transform\_utils\.TA1(fun, name=None, datatypes=None, feat\_constraints=None, tgraph=None, apply\_all=True, col\_names=None, col\_dtypes=None) #### + +For unary stateless functions, such as square or log, use TA1\. + +Usage: + + autoai_libs.cognito.transforms.transform_utils.TA1(fun, name=None, datatypes=None, feat_constraints=None, tgraph=None, apply_all=True, col_names=None, col_dtypes=None) + + + +| Option | Description | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `fun` | the function pointer | +| `name` | a string name that uniquely identifies this transformer from others | +| `datatypes` | a list of datatypes either of which are valid input to the transformer function (numeric, float, int, and so on) | +| `feat_constraints` | all constraints, which must be satisfied by a column to be considered a valid input to this transform | +| `tgraph` | tgraph object must be the starting TGraph( ) object\. This parameter is optional and you can pass None, but that can result in some failure to detect some inefficiencies due to lack of caching | +| `apply_all` | only use applyAll = True\. It means that the transformer enumerates all features (or feature sets) that match the specified criteria and apply the provided function to each\. | +| `col_names` | names of the feature columns in a list | +| `col_dtypes` | list of the datatypes of the feature columns | + + + +#### autoai\_libs\.cognito\.transforms\.transform\_utils\.TA2() #### + +For binary stateless functions, such as sum, product, use TA2\. + +Usage: + + autoai_libs.cognito.transforms.transform_utils.TA2(fun, name, datatypes1, feat_constraints1, datatypes2, feat_constraints2, tgraph=None, apply_all=True, col_names=None, col_dtypes=None) + + + +| Option | Description | +| --------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `fun` | the function pointer | +| `name`: a string name that uniquely identifies this transformer from others | +| `datatypes1` | a list of datatypes either of which are valid inputs (first parameter) to the transformer function (numeric, float, int, and so on) | +| `feat_constraints1` | all constraints, which must be satisfied by a column to be considered a valid input (first parameter) to this transform | +| `datatypes2` | a list of data types either of which are valid inputs (second parameter) to the transformer function (numeric, float, int, and so on) | +| `feat_constraints2` | all constraints, which must be satisfied by a column to be considered a valid input (second parameter) to this transform | +| `tgraph` | tgraph object must be the invoking TGraph( ) object\. Note this parameter is optional and you can pass None, but that results in some missing inefficiencies due to lack of caching | +| `apply_all` | only use applyAll = True\. It means that the transformer enumerates all features (or feature sets) that match the specified criteria and apply the provided function to each\. | +| `col_names` | names of the feature columns in a list | +| `col_dtypes` | list of the data types of the feature columns | + + + +#### autoai\_libs\.cognito\.transforms\.transform\_utils\.TB1() #### + +For unary state\-based transformations (with fit/transform) use, such as frequent count\. + +Usage: + + autoai_libs.cognito.transforms.transform_utils.TB1(tans_class, name, datatypes, feat_constraints, tgraph=None, apply_all=True, col_names=None, col_dtypes=None) + + + +| Option | Description | +| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `tans_class` | a class that implements `fit( )` and `transform( )` in accordance with the transformation function definition | +| `name` | a string name that uniquely identifies this transformer from others | +| `datatypes` | list of datatypes either of which are valid input to the transformer function (numeric, float, int, and so on) | +| `feat_constraints` | all constraints, which must be satisfied by a column to be considered a valid input to this transform | +| `tgraph` | tgraph object must be the invoking TGraph( ) object\. Note that this is optional and you might pass None, but that results in some missing inefficiencies due to lack of caching | +| `apply_all` | only use applyAll = True\. It means that the transformer enumerates all features (or feature sets) that match the specified criteria and apply the provided function to each\. | +| `col_names` | names of the feature columns in a list\. | +| `col_dtypes` | list of the data types of the feature columns\. | + + + +#### autoai\_libs\.cognito\.transforms\.transform\_utils\.TB2() #### + +For binary state\-based transformations (with fit/transform) use, such as group\-by\. + +Usage: + + autoai_libs.cognito.transforms.transform_utils.TB2(tans_class, name, datatypes1, feat_constraints1, datatypes2, feat_constraints2, tgraph=None, apply_all=True) + + + +| Option | Description | +| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `tans_class` | a class that implements fit( ) and transform( ) in accordance with the transformation function definition | +| `name` | a string name that uniquely identifies this transformer from others | +| `datatypes1` | a list of data types either of which are valid inputs (first parameter) to the transformer function (numeric, float, int, and so on) | +| `feat_constraints1` | all constraints, which must be satisfied by a column to be considered a valid input (first parameter) to this transform | +| `datatypes2` | a list of data types either of which are valid inputs (second parameter) to the transformer function (numeric, float, int, and so on) | +| `feat_constraints2` | all constraints, which must be satisfied by a column to be considered a valid input (second parameter) to this transform | +| `tgraph` | tgraph object must be the invoking TGraph( ) object\. This parameter is optional and you might pass None, but that results in some missing inefficiencies due to lack of caching | +| `apply_all` | only use applyAll = True\. It means that the transformer enumerates all features (or feature sets) that match the specified criteria and apply the provided function to each\. | + + + +#### autoai\_libs\.cognito\.transforms\.transform\_utils\.TAM() #### + +For a transform that applies at the data level, such as PCA, use TAM\. + +Usage: + + autoai_libs.cognito.transforms.transform_utils.TAM(tans_class, name, tgraph=None, apply_all=True, col_names=None, col_dtypes=None) + + + +| Option | Description | +| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `tans_class` | a class that implements `fit( )` and `transform( )` in accordance with the transformation function definition | +| `name` | a string name that uniquely identifies this transformer from others | +| `tgraph` | tgraph object must be the invoking TGraph( ) object\. This parameter is optional and you can pass None, but that results in some missing inefficiencies due to lack of caching | +| `apply_all` | only use applyAll = True\. It means that the transformer enumerates all features (or feature sets) that match the specified criteria and apply the provided function to each\. | +| `col_names` | names of the feature columns in a list | +| `col_dtypes` | list of the datatypes of the feature columns | + + + +#### autoai\_libs\.cognito\.transforms\.transform\_utils\.TGen() #### + +TGen is a general wrapper and can be used for most functions (might not be most efficient though)\. + +Usage: + + autoai_libs.cognito.transforms.transform_utils.TGen(fun, name, arg_count, datatypes_list, feat_constraints_list, tgraph=None, apply_all=True, col_names=None, col_dtypes=None) + + + +| Option | Description | +| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `fun` | the function pointer | +| `name` | a string name that uniquely identifies this transformer from others | +| `arg_count` | number of inputs to the function, in this example it is 1, for binary, it is 2, and so on | +| `datatypes_list` | a list of arg\_count lists that correspond to the acceptable input data types for each parameter\. In the previous example, since \`arg\_count=1\`\`, the result is one list within the outer list, and it contains a single type called 'numeric'\. In another case, it might be a specific case 'int' or even more specific 'int64'\. | +| `feat_constraints_list` | a list of arg\_count lists that correspond to some constraints that can be imposed on selection of the input features | +| `tgraph` | tgraph object must be the invoking TGraph( ) object\. Note this parameter is optional and you can pass None, but that results in some missing inefficiencies due to lack of caching | +| `apply_all` | only use applyAll = True\. It means that the transformer enumerates all features (or feature sets) that match the specified criteria and apply the provided function to each\. | +| `col_names` | names of the feature columns in a list | +| `col_dtypes` | list of the data types of the feature columns | + + + +#### autoai\_libs\.cognito\.transforms\.transform\_utils\.FS1() #### + +Feature selection, type 1 (using pairwise correlation between each feature and target\.) + +Usage: + + autoai_libs.cognito.transforms.transform_utils.FS1(cols_ids_must_keep, additional_col_count_to_keep, ptype) + + + +| Option | Description | +| ------------------------------ | ---------------------------------------------------------------------------------------- | +| `cols_ids_must_keep` | serial numbers of the columns that must be kept irrespective of their feature importance | +| `additional_col_count_to_keep` | how many columns need to be retained | +| `ptype` | classification or regression | + + + +#### autoai\_libs\.cognito\.transforms\.transform\_utils\.FS2() #### + +Feature selection, type 2\. + +Usage: + + autoai_libs.cognito.transforms.transform_utils.FS2(cols_ids_must_keep, additional_col_count_to_keep, ptype, eval_algo) + + + +| Option | Description | +| ------------------------------ | ---------------------------------------------------------------------------------------- | +| `cols_ids_must_keep` | serial numbers of the columns that must be kept irrespective of their feature importance | +| `additional_col_count_to_keep` | how many columns need to be retained | +| `ptype` | classification or regression | + + + +## The autoai\-ts\-libs functions ## + +The combination of transformers and estimators are designed and chosen for each pipeline by the AutoAI Time Series system\. Changing the transformers or the estimators in the generated pipeline notebook can cause unexpected results or even failure\. We do not recommend you change the notebook for generated pipelines, thus we do not currently offer the specification of the functions for the `autoai-ts-libs` library\. + +## Learn more ## + +[Selecting an AutoAI model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-view-results.html) + +**Parent topic:**[Saving an AutoAI generated notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-notebook.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/841465ad74b0afdbec9eaff7b038afc4c000e96c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/841465ad74b0afdbec9eaff7b038afc4c000e96c.md new file mode 100644 index 0000000..feac399 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/841465ad74b0afdbec9eaff7b038afc4c000e96c.md @@ -0,0 +1,9 @@ +# Selecting fields (SPSS Modeler) + +# Selecting fields # + +The field list displays all fields available at this point in the data stream\. Double\-click a field from the list to add it to your expression\. + +After selecting a field, you can also select an associated value from the value list\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8435d88b7dc8317b982e1eaa57fa55b8391d00cf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8435d88b7dc8317b982e1eaa57fa55b8391d00cf.md new file mode 100644 index 0000000..3962857 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8435d88b7dc8317b982e1eaa57fa55b8391d00cf.md @@ -0,0 +1,51 @@ +# Aggregate node (SPSS Modeler) + +# Aggregate node # + +Aggregation is a data preparation task frequently used to reduce the size of a dataset\. Before proceeding with aggregation, you should take time to clean the data, concentrating especially on missing values\. A aggregation, potentially useful information regarding missing values may be lost\. + +You can use an Aggregate node to replace a sequence of input records with summary, aggregated output records\. For example, you might have a set of input sales records such as those shown in the following table\. + + + +Sales record input example + +Table 1\. Sales record input example + +| Age | Sex | Region | Branch | Sales | +| --- | --- | ------ | ------ | ----- | +| 23 | M | S | 8 | 4 | +| 45 | M | S | 16 | 4 | +| 37 | M | S | 8 | 5 | +| 30 | M | S | 5 | 7 | +| 44 | M | N | 4 | 9 | +| 25 | M | N | 2 | 11 | +| 29 | F | S | 16 | 6 | +| 41 | F | N | 4 | 8 | +| 23 | F | N | 6 | 2 | +| 45 | F | N | 4 | 5 | +| 33 | F | N | 6 | 10 | + + + +You can aggregate these records with `Sex` and `Region` as key fields\. Then choose to aggregate `Age` with the mode Mean and `Sales` with the mode Sum\. Select the Include record count in field aggregate node option and your aggregated output will be similar to the following table\. + + + +Aggregated record example + +Table 2\. Aggregated record example + +| Age (mean) | Sex | Region | Sales (sum) | Record Count | +| ---------- | --- | ------ | ----------- | ------------ | +| 35\.5 | F | N | 25 | 4 | +| 29 | F | S | 6 | 1 | +| 34\.5 | M | N | 20 | 2 | +| 33\.75 | M | S | 20 | 4 | + + + +From this you learn, for example, that the average age of the four female sales staff in the North region is 35\.5, and the sum total of their sales was 25 units\. + +Note: Fields such as `Branch` are automatically discarded when no aggregate mode is specified\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/84573d3fda739326819c7303ea21db6ddf2acc21.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/84573d3fda739326819c7303ea21db6ddf2acc21.md new file mode 100644 index 0000000..2d51734 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/84573d3fda739326819c7303ea21db6ddf2acc21.md @@ -0,0 +1,47 @@ +# derivenode properties + +# derivenode properties # + +![Derive node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/derive_node_icon.png)The Derive node modifies data values or creates new fields from one or more existing fields\. It creates fields of type formula, flag, nominal, state, count, and conditional\. + + + +derivenode properties + +Table 1\. derivenode properties + +| `derivenode` properties | Data type | Property description | +| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `new_name` | *string* | Name of new field\. | +| `mode` | `Single``Multiple` | Specifies single or multiple fields\. | +| `fields` | *list* | Used in Multiple mode only to select multiple fields\. | +| `name_extension` | *string* | Specifies the extension for the new field name(s)\. | +| `add_as` | `Suffix``Prefix` | Adds the extension as a prefix (at the beginning) or as a suffix (at the end) of the field name\. | +| `result_type` | `Formula``Flag``Set``State``Count``Conditional` | The six types of new fields that you can create\. | +| `formula_expr` | *string* | Expression for calculating a new field value in a Derive node\. | +| `flag_expr` | *string* | | +| `flag_true` | *string* | | +| `flag_false` | *string* | | +| `set_default` | *string* | | +| `set_value_cond` | *string* | Structured to supply the condition associated with a given value\. | +| `state_on_val` | *string* | Specifies the value for the new field when the On condition is met\. | +| `state_off_val` | *string* | Specifies the value for the new field when the Off condition is met\. | +| `state_on_expression` | *string* | | +| `state_off_expression` | *string* | | +| `state_initial` | `On``Off` | Assigns each record of the new field an initial value of `On` or `Off`\. This value can change as each condition is met\. | +| `count_initial_val` | *string* | | +| `count_inc_condition` | *string* | | +| `count_inc_expression` | *string* | | +| `count_reset_condition` | *string* | | +| `cond_if_cond` | *string* | | +| `cond_then_expr` | *string* | | +| `cond_else_expr` | *string* | | +| `formula_measure_type` | `Range / MeasureType.RANGE``Discrete / MeasureType.DISCRETE``Flag / MeasureType.FLAG``Set / MeasureType.SET``OrderedSet / MeasureType.ORDERED_SET``Typeless / MeasureType.TYPELESS``Collection / MeasureType.COLLECTION``Geospatial / MeasureType.GEOSPATIAL` | This property can be used to define the measurement associated with the derived field\. The setter function can be passed either a string or one of the `MeasureType` values\. The getter will always return on the `MeasureType` values\. | +| `collection_measure` | `Range / MeasureType.RANGE``Flag / MeasureType.FLAG``Set / MeasureType.SET``OrderedSet / MeasureType.ORDERED_SET``Typeless / MeasureType.TYPELESS` | For collection fields (lists with a depth of 0), this property defines the measurement type associated with the underlying values\. | +| `geo_type` | `Point``MultiPoint``LineString``MultiLineString``Polygon``MultiPolygon` | For geospatial fields, this property defines the type of geospatial object represented by this field\. This should be consistent with the list depth of the values | +| `has_coordinate_system` | *boolean* | For geospatial fields, this property defines whether this field has a coordinate system | +| `coordinate_system` | *string* | For geospatial fields, this property defines the coordinate system for this field | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/84d42e162fefc977ae807af123cedfdf400e403a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/84d42e162fefc977ae807af123cedfdf400e403a.md new file mode 100644 index 0000000..c20d786 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/84d42e162fefc977ae807af123cedfdf400e403a.md @@ -0,0 +1,36 @@ +# SuperNodes (SPSS Modeler) + +# SuperNodes # + +One of the reasons the SPSS Modeler visual interface is so easy to learn is that each node has a clearly defined function\. However, for complex processing, a long sequence of nodes may be necessary\. Eventually, this may clutter your flow canvas and make it difficult to follow flow diagrams\. + +There are two ways to avoid the clutter of a long and complex flow: + + + + * You can split a processing sequence into several flows\. The first flow, for example, creates a data file that the second uses as input\. The second creates a file that the third uses as input, and so on\. However, this requires you to manage multiple flows\. + * You can create a **SuperNode** as a more streamlined alternative when working with complex flow processes\. SuperNodes group multiple nodes into a single node by encapsulating sections of flow\. This provides benefits to the data miner: + + + + * Grouping nodes results in a neater and more manageable flow. + * Nodes can be combined into a business-specific SuperNode. + + + + + +To group nodes into a SuperNode: + + + +1. *Ctrl \+ click* to select the nodes you want to group\. +2. Right\-click and select Create supernode\. The nodes are grouped into a single SuperNode with a special star icon\. + + Figure 1. SuperNode icon + + ![SuperNode icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/supernodes.png) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/84e8928d464d412b225638bcc41f2837f98aef43.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/84e8928d464d412b225638bcc41f2837f98aef43.md new file mode 100644 index 0000000..f79cfe5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/84e8928d464d412b225638bcc41f2837f98aef43.md @@ -0,0 +1,104 @@ +# autodataprepnode properties + +# autodataprepnode properties # + +![Auto Data Prep node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/adp_node_icon.png)The Auto Data Prep (ADP) node can analyze your data and identify fixes, screen out fields that are problematic or not likely to be useful, derive new attributes when appropriate, and improve performance through intelligent screening and sampling techniques\. You can use the node in fully automated fashion, allowing the node to choose and apply fixes, or you can preview the changes before they are made and accept, reject, or amend them as desired\. + + + +autodataprepnode properties + +Table 1\. autodataprepnode properties + +| `autodataprepnode` properties | Data type | Property description | +| ----------------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `objective` | `Balanced`
`Speed`
`Accuracy`
`Custom` | | +| `custom_fields` | *flag* | If true, allows you to specify target, input, and other fields for the current node\. If false, the current settings from an upstream Type node are used\. | +| `target` | *field* | Specifies a single target field\. | +| `inputs` | \[*field1 \.\.\. fieldN*\] | Input or predictor fields used by the model\. | +| `use_frequency` | *flag* | | +| `frequency_field` | *field* | | +| `use_weight` | *flag* | | +| `weight_field` | *field* | | +| `excluded_fields` | `Filter`
`None` | | +| `if_fields_do_not_match` | `StopExecution`
`ClearAnalysis` | | +| `prepare_dates_and_times` | *flag* | Control access to all the date and time fields | +| `compute_time_until_date` | *flag* | | +| `reference_date` | `Today`
`Fixed` | | +| `fixed_date` | *date* | | +| `units_for_date_durations` | `Automatic`
`Fixed` | | +| `fixed_date_units` | `Years`
`Months`
`Days` | | +| `compute_time_until_time` | *flag* | | +| `reference_time` | `CurrentTime`
`Fixed` | | +| `fixed_time` | *time* | | +| `units_for_time_durations` | `Automatic`
`Fixed` | | +| `fixed_time_units` | `Hours`
`Minutes`
`Seconds` | | +| `extract_year_from_date` | *flag* | | +| `extract_month_from_date` | *flag* | | +| `extract_day_from_date` | *flag* | | +| `extract_hour_from_time` | *flag* | | +| `extract_minute_from_time` | *flag* | | +| `extract_second_from_time` | *flag* | | +| `exclude_low_quality_inputs` | *flag* | | +| `exclude_too_many_missing` | *flag* | | +| `maximum_percentage_missing` | *number* | | +| `exclude_too_many_categories` | *flag* | | +| `maximum_number_categories` | *number* | | +| `exclude_if_large_category` | *flag* | | +| `maximum_percentage_category` | *number* | | +| `prepare_inputs_and_target` | *flag* | | +| `adjust_type_inputs` | *flag* | | +| `adjust_type_target` | *flag* | | +| `reorder_nominal_inputs` | *flag* | | +| `reorder_nominal_target` | *flag* | | +| `replace_outliers_inputs` | *flag* | | +| `replace_outliers_target` | *flag* | | +| `replace_missing_continuous_inputs` | *flag* | | +| `replace_missing_continuous_target` | *flag* | | +| `replace_missing_nominal_inputs` | *flag* | | +| `replace_missing_nominal_target` | *flag* | | +| `replace_missing_ordinal_inputs` | *flag* | | +| `replace_missing_ordinal_target` | *flag* | | +| `maximum_values_for_ordinal` | *number* | | +| `minimum_values_for_continuous` | *number* | | +| `outlier_cutoff_value` | *number* | | +| `outlier_method` | `Replace`
`Delete` | | +| `rescale_continuous_inputs` | *flag* | | +| `rescaling_method` | `MinMax`
`ZScore` | | +| `min_max_minimum` | *number* | | +| `min_max_maximum` | *number* | | +| `z_score_final_mean` | *number* | | +| `z_score_final_sd` | *number* | | +| `rescale_continuous_target` | *flag* | | +| `target_final_mean` | *number* | | +| `target_final_sd` | *number* | | +| `transform_select_input_fields` | *flag* | | +| `maximize_association_with_target` | *flag* | | +| `p_value_for_merging` | *number* | | +| `merge_ordinal_features` | *flag* | | +| `merge_nominal_features` | *flag* | | +| `minimum_cases_in_category` | *number* | | +| `bin_continuous_fields` | *flag* | | +| `p_value_for_binning` | *number* | | +| `perform_feature_selection` | *flag* | | +| `p_value_for_selection` | *number* | | +| `perform_feature_construction` | *flag* | | +| `transformed_target_name_extension` | *string* | | +| `transformed_inputs_name_extension` | *string* | | +| `constructed_features_root_name` | *string* | | +| `years_duration_ name_extension` | *string* | | +| `months_duration_ name_extension` | *string* | | +| `days_duration_ name_extension` | *string* | | +| `hours_duration_ name_extension` | *string* | | +| `minutes_duration_ name_extension` | *string* | | +| `seconds_duration_ name_extension` | *string* | | +| `year_cyclical_name_extension` | *string* | | +| `month_cyclical_name_extension` | *string* | | +| `day_cyclical_name_extension` | *string* | | +| `hour_cyclical_name_extension` | *string* | | +| `minute_cyclical_name_extension` | *string* | | +| `second_cyclical_name_extension` | *string* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85381b4df6f42b35ca5097709523038abdcdc555.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85381b4df6f42b35ca5097709523038abdcdc555.md new file mode 100644 index 0000000..e36b7f8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85381b4df6f42b35ca5097709523038abdcdc555.md @@ -0,0 +1,51 @@ +# Reclassifying the data (SPSS Modeler) + +# Reclassifying the data # + +Figure 1\. Example flow showing string reclassification for binomial logistic regression + +![Example flow showing string reclassification for binomial logistic regression](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_reducing.png) + + + +1. Add a Data Asset node that points to drug\_long\_name\.csv\. +2. Add a Type node after the Data Asset node\. Double\-click the Type node to open its properties, and select `Cholesterol_long` as the target\. +3. Add a Logistic Regression node after the Type node\. Double\-click the node and select the Binomial procedure (instead of the default Multinomial procedure)\. +4. Right\-click the Logistic Regression node and run it\. An error message warns you that the `Cholesterol_long` string values are too long\. When you encounter this type of message, follow the procedure described in the rest of this example to modify your data\. + + Figure 2. Error message displayed when running the binomial logistic regression node + + ![Error message displayed when running the binomial logistic regression node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_reducing_error.png) +5. Add a Reclassify node after the Type node and double\-click it to open its properties\. +6. For the Reclassify Field, select `Cholesterol_long` and type Cholesterol for the new field name\. +7. Click Get values to add the `Cholesterol_long` values to the original value column\. +8. In the new value column, type High next to the original value of `High level of cholesterol` and Normal next to the original value of `Normal level of cholesterol`\. + + Figure 3. Reclassifying long strings + + ![Reclassifying long strings](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_reducing_reclassify.png) +9. Add a Filter node after the Reclassify node\. Double\-click the node, choose Filter the selected fields, and select the `Cholesterol_long` field\. + + Figure 4. Filtering the "Cholesterol\_long" field from the data + + ![Filtering the "Cholesterol\_long" field from the data](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_reducing_filter.png) +10. Add a Type node after the Filter node\. Double\-click the node and select `Cholesterol` as the target\. + + Figure 5. Short string details in the "Cholesterol" field + + ![Short string details in the "Cholesterol" field](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_reducing_type.png) +11. Add a Logistic node after the Type node\. Double\-click the node and select the Binomial procedure\. + + + +You can now run the binomial Logistic node and generate a model without encountering the error as you did before\. + +This example only shows part of a flow\. For more information about the types of flows in which you might need to reclassify long strings, see the following example: + + + + * Auto Classifier node\. See [Automated modeling for a flag target](https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_autoflag.html)\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/857c8c3489ac9b2891ed1ae9c81ea881cf1ced80.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/857c8c3489ac9b2891ed1ae9c81ea881cf1ced80.md new file mode 100644 index 0000000..c24e249 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/857c8c3489ac9b2891ed1ae9c81ea881cf1ced80.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Benign advice # + +![icon for value alignment risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-value-alignment.svg)Risks associated with outputValue alignmentNew + +### Description ### + +When a model generates information that is factually correct but not specific enough for the current context, the benign advice can be potentially harmful\. For example, a model might provide medical, financial, and legal advice or recommendations for a specific problem that the end user may act on even when they should not\. + +### Why is benign advice a concern for foundation models? ### + +A person might act on incomplete advice or worry about a situation that is not applicable to them due to the overgeneralized nature of the content generated\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85a8f36d819b12b355508090e787f4a182686394.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85a8f36d819b12b355508090e787f4a182686394.md new file mode 100644 index 0000000..98c796f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85a8f36d819b12b355508090e787f4a182686394.md @@ -0,0 +1,68 @@ +# Batch deployment input details for Python scripts + +# Batch deployment input details for Python scripts # + +Follow these rules when you specify input details for batch deployments of Python scripts\. + +Data type summary table: + + + +| Data | Description | +| ------------ | --------------- | +| Type | Data references | +| File formats | Any | + + + +## Data sources ## + +Input or output data references: + + + + * Local or managed assets from the space + * Connected (remote) assets: Cloud Object Storage + + + +**Notes:** + + + + * For connections of type [Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html) or [Cloud Object Storage(infrastructure)](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos-infra.html), you must configure **Access key** and **Secret key**, also known as [HMAC credentials](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-uhc-hmac-credentials-main)\. + + + +If you are specifying input/output data references programmatically: + + + + * Data source reference `type` depends on the asset type\. For more information, see **Data source reference types** section in [Adding data assets to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + * You can specify the environment variables that are required for running the Python Script as `'key': 'value'` pairs in `scoring.environment_variables`\. The `key` must be the name of an environment variable and the `value` must be the corresponding value of the environment variable\. + * The deployment job's payload is saved as a JSON file in the deployment container where you run the Python script\. The Python script can access the full path file name of the JSON file that uses the `JOBS_PAYLOAD_FILE` environment variable\. + * If input data is referenced as a local or managed data asset, deployment service downloads the input data and places it in the deployment container where you run the Python script\. You can access the location (path) of the downloaded input data through the `BATCH_INPUT_DIR` environment variable\. + * For input data references (data asset or connection asset), downloading of the data must be handled by the Python script\. If a connected data asset or a connection asset is present in the deployment jobs payload, you can access it using the `JOBS_PAYLOAD_FILE` environment variable that contains the full path to the deployment job's payload that is saved as a JSON file\. + * If output data must be persisted as a local or managed data asset in a space, you can specify the name of the asset to be created in `scoring.output_data_reference.location.name`\. As part of a Python script, output data can be placed in the path that is specified by the `BATCH_OUTPUT_DIR` environment variable\. The deployment service compresses the data to compressed file format and upload it in the location that is specified in `BATCH_OUTPUT_DIR`\. + * These environment variables are set internally\. If you try to set them manually, your values are overridden: + + + + * `BATCH_INPUT_DIR` + * `BATCH_OUTPUT_DIR` + * `JOBS_PAYLOAD_FILE` + + + + * If output data must be saved in a remote data store, you must specify the reference of the output data reference (for example, a data asset or a connected data asset) in `output_data_reference.location.href`\. The Python script must take care of uploading the output data to the remote data source\. If a connected data asset or a connection asset reference is present in the deployment jobs payload, you can access it using the `JOBS_PAYLOAD_FILE` environment variable, which contains the full path to the deployment job's payload that is saved as a JSON file\. + * If the Python script does not require any input or output data references to be specified in the deployment job payload, then do not provide the `scoring.input_data_references` and `scoring.output_data_references` objects in the payload\. + + + +## Learn more ## + +[Deploying scripts in Watson Machine Learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-script.html)\. + +**Parent topic:**[Batch deployment input details by framework](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-by-framework.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85c99b52bbbc96007bd819861e675c61d7b742ca.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85c99b52bbbc96007bd819861e675c61d7b742ca.md new file mode 100644 index 0000000..0116466 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85c99b52bbbc96007bd819861e675c61d7b742ca.md @@ -0,0 +1,107 @@ +# tcmnode properties + +# tcmnode properties # + +![TCM node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/tcmnodeicon.png)Temporal causal modeling attempts to discover key causal relationships in time series data\. In temporal causal modeling, you specify a set of target series and a set of candidate inputs to those targets\. The procedure then builds an autoregressive time series model for each target and includes only those inputs that have the most significant causal relationship with the target\. + + + +tcmnode properties + +Table 1\. tcmnode properties + +| `tcmnode` Properties | Values | Property description | +| --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `custom_fields` | *Boolean* | | +| `dimensionlist` | \[*dimension1 \.\.\. dimensionN*\] | | +| `data_struct` | `Multiple`
`Single` | | +| `metric_fields` | *fields* | | +| `both_target_and_input` | \[*f1 \.\.\. fN*\] | | +| `targets` | \[*f1 \.\.\. fN*\] | | +| `candidate_inputs` | \[*f1 \.\.\. fN*\] | | +| `forced_inputs` | \[*f1 \.\.\. fN*\] | | +| `use_timestamp` | `Timestamp`
`Period` | | +| `input_interval` | `None`
`Unknown`
`Year`
`Quarter`
`Month`
`Week`
`Day`
`Hour`
`Hour_nonperiod`
`Minute`
`Minute_nonperiod`
`Second`
`Second_nonperiod` | | +| `period_field` | *string* | | +| `period_start_value` | *integer* | | +| `num_days_per_week` | *integer* | | +| `start_day_of_week` | `Sunday`
`Monday`
`Tuesday`
`Wednesday`
`Thursday`
`Friday`
`Saturday` | | +| `num_hours_per_day` | *integer* | | +| `start_hour_of_day` | *integer* | | +| `timestamp_increments` | *integer* | | +| `cyclic_increments` | *integer* | | +| `cyclic_periods` | *list* | | +| `output_interval` | `None`
`Year`
`Quarter`
`Month`
`Week`
`Day`
`Hour`
`Minute`
`Second` | | +| `is_same_interval` | `Same`
`Notsame` | | +| `cross_hour` | *Boolean* | | +| `aggregate_and_distribute` | *list* | | +| `aggregate_default` | `Mean`
`Sum`
`Mode`
`Min`
`Max` | | +| `distribute_default` | `Mean`
`Sum` | | +| `group_default` | `Mean`
`Sum`
`Mode`
`Min`
`Max` | | +| `missing_imput` | `Linear_interp`
`Series_mean`
`K_mean`
`K_meridian`
`Linear_trend`
`None` | | +| `k_mean_param` | *integer* | | +| `k_median_param` | *integer* | | +| `missing_value_threshold` | *integer* | | +| `conf_level` | *integer* | | +| `max_num_predictor` | *integer* | | +| `max_lag` | *integer* | | +| `epsilon` | *number* | | +| `threshold` | *integer* | | +| `is_re_est` | *Boolean* | | +| `num_targets` | *integer* | | +| `percent_targets` | *integer* | | +| `fields_display` | *list* | | +| `series_dispaly` | *list* | | +| `network_graph_for_target` | *Boolean* | | +| `sign_level_for_target` | *number* | | +| `fit_and_outlier_for_target` | *Boolean* | | +| `sum_and_para_for_target` | *Boolean* | | +| `impact_diag_for_target` | *Boolean* | | +| `impact_diag_type_for_target` | `Effect`
`Cause`
`Both` | | +| `impact_diag_level_for_target` | *integer* | | +| `series_plot_for_target` | *Boolean* | | +| `res_plot_for_target` | *Boolean* | | +| `top_input_for_target` | *Boolean* | | +| `forecast_table_for_target` | *Boolean* | | +| `same_as_for_target` | *Boolean* | | +| `network_graph_for_series` | *Boolean* | | +| `sign_level_for_series` | *number* | | +| `fit_and_outlier_for_series` | *Boolean* | | +| `sum_and_para_for_series` | *Boolean* | | +| `impact_diagram_for_series` | *Boolean* | | +| `impact_diagram_type_for_series` | `Effect`
`Cause`
`Both` | | +| `impact_diagram_level_for_series` | *integer* | | +| `series_plot_for_series` | *Boolean* | | +| `residual_plot_for_series` | *Boolean* | | +| `forecast_table_for_series` | *Boolean* | | +| `outlier_root_cause_analysis` | *Boolean* | | +| `causal_levels` | *integer* | | +| `outlier_table` | `Interactive`
`Pivot`
`Both` | | +| `rmsp_error` | *Boolean* | | +| `bic` | *Boolean* | | +| `r_square` | *Boolean* | | +| `outliers_over_time` | *Boolean* | | +| `series_transormation` | *Boolean* | | +| `use_estimation_period` | *Boolean* | | +| `estimation_period` | `Times`
`Observation` | | +| `observations` | *list* | | +| `observations_type` | `Latest`
`Earliest` | | +| `observations_num` | *integer* | | +| `observations_exclude` | *integer* | | +| `extend_records_into_future` | *Boolean* | | +| `forecastperiods` | *integer* | | +| `max_num_distinct_values` | *integer* | | +| `display_targets` | `FIXEDNUMBER`
`PERCENTAGE` | | +| `goodness_fit_measure` | `ROOTMEAN`
`BIC`
`RSQUARE` | | +| `top_input_for_series` | *Boolean* | | +| `aic` | *Boolean* | | +| `rmse` | *Boolean* | | +| `date_time_field` | *field* | Time/Date field | +| `auto_detect_lag` | *Boolean* | This setting specifies the number of lag terms for each input in the model for each target\. | +| `numoflags` | *Integer* | By default, the number of lag terms is automatically determined from the time interval that is used for the analysis\. | +| `re_estimate` | *Boolean* | If you already generated a temporal causal model, select this option to reuse the criteria settings that are specified for that model, rather than building a new model\. | +| `display_targets` | `"FIXEDNUMBER"`
`"PERCENTAGE"` | By default, output is displayed for the targets that are associated with the 10 best\-fitting models, as determined by the R square value\. You can specify a different fixed number of best\-fitting models or you can specify a percentage of best\-fitting models\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85dfc4b40da36a5d66892b5b231c9743c67d7e71.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85dfc4b40da36a5d66892b5b231c9743c67d7e71.md new file mode 100644 index 0000000..b8da6d4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85dfc4b40da36a5d66892b5b231c9743c67d7e71.md @@ -0,0 +1,75 @@ +# Amazon Redshift connection + +# Amazon Redshift connection # + +To access your data in Amazon Redshift, create a connection asset for it\. + +Amazon Redshift is a data warehouse product that forms part of the larger cloud\-computing platform Amazon Web Services (AWS)\. + +## Create a connection to Amazon Redshift ## + +To create the connection asset, you need these connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Username and password + * SSL certificate (if required by the database server) + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Amazon Redshift connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Amazon Redshift setup ## + +See [Amazon Redshift setup prerequisites](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-prereq.html) for setup information\. + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [ Amazon Redshift documentation](https://docs.aws.amazon.com/redshift/latest/dg/cm_chap_SQLCommandRef.html) for the correct syntax\. + +## Learn more ## + +[Amazon Redshift documentation](https://docs.aws.amazon.com/redshift/index.html) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85e9cac1f581e61092cff1f6be38570ee734c115.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85e9cac1f581e61092cff1f6be38570ee734c115.md new file mode 100644 index 0000000..e8e52ba --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85e9cac1f581e61092cff1f6be38570ee734c115.md @@ -0,0 +1,38 @@ +# Exporting space assets from deployment spaces + +# Exporting space assets from deployment spaces # + +You can export assets from a deployment space so that you can share the space with others or reuse the assets in another space\. + +For a list of assets that you can export from space, refer to [Assets in a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets-all.html)\. + +## Exporting space assets from the UI ## + +Important:To avoid problems with importing the space, export all dependencies together with the space\. For more information, see [Exporting a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/export-project.html)\. + +To export space assets from the UI: + + + +1. From your deployment space, click the import and export space (![Import or Export space icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/import-export-icon.png)) icon\. From the list, select **Export space**\. +2. Click **New export file**\. Specify a file name and an optional description\. + **Tip:** To encrypt sensitive data in the exported archive, type the password in the **Password** field. +3. Select the assets that you want to export with the space\. +4. Click **Create** to create the export file\. +5. After the space is exported, click the download (![Download icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/download-icon.png)) to save the file\. + + + +You can reuse this space by choosing **Create a space from a file** when you create a new space\. + +## Learn more ## + + + + * [Importing spaces and projects into existing deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-import-to-space.html)\. + + + +**Parent topic:**[Deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85f8b4292483c5747ab2436a2d5d5377f1f6cab9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85f8b4292483c5747ab2436a2d5d5377f1f6cab9.md new file mode 100644 index 0000000..44241e9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/85f8b4292483c5747ab2436a2d5d5377f1f6cab9.md @@ -0,0 +1,11 @@ +# Viewing or selecting values (SPSS Modeler) + +# Viewing or selecting values # + +You can view field values from the Expression Builder\. Note that data must be fully instantiated in an Import or Type node to use this feature, so that storage, types, and values are known\. + +To view values for a field from the Expression Builder, select the required field and then use the Value list or perform a search with the Find in column Value field to find values for the selected field\. You can then double\-click a value to insert it into the current expression or list\. + +For flag and nominal fields, all defined values are listed\. For continuous (numeric range) fields, the minimum and maximum values are displayed\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/863fd4eee7625cf4012bc9e37b5b66cd25554b8a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/863fd4eee7625cf4012bc9e37b5b66cd25554b8a.md new file mode 100644 index 0000000..3e10f4e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/863fd4eee7625cf4012bc9e37b5b66cd25554b8a.md @@ -0,0 +1,19 @@ +# applygle properties + +# applygle properties # + +You can use the GLE modeling node to generate a GLE model nugget\. The scripting name of this model nugget is *applygle*\. For more information on scripting the modeling node itself, see [gle properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/glenodeslots.html#glenodeslots)\. + + + +applygle properties + +Table 1\. applygle properties + +| `applygle` Properties | Values | Property description | +| ----------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `enable_sql_generation` | `false``native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8654d0cbb99ee82483f99972ef5247401eb8e8d9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8654d0cbb99ee82483f99972ef5247401eb8e8d9.md new file mode 100644 index 0000000..91bf796 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8654d0cbb99ee82483f99972ef5247401eb8e8d9.md @@ -0,0 +1,8 @@ +# Table (SPSS Modeler) + +# Table node # + +The Table node creates a table that lists the values in your data\. All fields and all values in the stream are included, making this an easy way to inspect your data values or export them in an easily readable form\. Optionally, you can highlight records that meet a certain condition\. + +Note: Unless you are working with small datasets, we recommend that you select a subset of the data to pass into the Table node\. The Table node cannot display properly when the number of records surpasses a size that can be contained in the display structure (for example, 100 million rows)\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/866bbcabef2c6e3eddf66300dc2639c938d815f4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/866bbcabef2c6e3eddf66300dc2639c938d815f4.md new file mode 100644 index 0000000..55088c8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/866bbcabef2c6e3eddf66300dc2639c938d815f4.md @@ -0,0 +1,36 @@ +# Troubleshooting Federated Learning experiments + +# Troubleshooting Federated Learning experiments # + +The following are some of the limitations and troubleshoot methods that apply to Federated learning experiments\. + +## Limitations ## + + + + * If you choose to enable homomorphic encryption, intermediate models can no longer be saved\. However, the final model of the training experiment can be saved and used normally\. The aggregator will not be able to decrypt the model updates and the intermediate global models\. The aggregator can see only the final global model\. + + + +## Troubleshooting ## + + + + * If a quorum error occurs during homomorphic keys distribution, restart the experiment\. + * Changing the name of a Federated Learning experiment causes it to lose its current name, including earlier runs\. If this is not intended, create a new experiment with the new name\. + * The default software spec is used by every run\. If your model type becomes outdated and not compatible with future software specs, re\-running an older experiment might run into issues\. + * As Remote Training Systems are meant to run on different servers, you might encounter unexpected behavior when you run with multiple parties that are based in the same server\. + + + +## Federated Learning known issues ## + + + + * [Known issues for Federated Learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/known-issues.html#wml) + + + +**Parent topic:**[IBM Federated Learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fed-lea.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8672a0aef022cd97d9e834ab2fd3a607fbdaed4d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8672a0aef022cd97d9e834ab2fd3a607fbdaed4d.md new file mode 100644 index 0000000..7c25b49 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8672a0aef022cd97d9e834ab2fd3a607fbdaed4d.md @@ -0,0 +1,7 @@ +# applyxgboostlinearnode properties + +# applyxgboostlinearnode properties # + +XGBoost Linear nodes can be used to generate an XGBoost Linear model nugget\. The scripting name of this model nugget is *applyxgboostlinearnode*\. No other properties exist for this model nugget\. For more information on scripting the modeling node itself, see [xgboostlinearnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/xgboostlinearnodeslots.html#xboostlinearnodeslots)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/868801ec73691d31b90c8611e934aa5dd3b17ea7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/868801ec73691d31b90c8611e934aa5dd3b17ea7.md new file mode 100644 index 0000000..8c51bde --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/868801ec73691d31b90c8611e934aa5dd3b17ea7.md @@ -0,0 +1,5 @@ +# Databases for Elasticsearch on IBM watsonx + +# Databases for Elasticsearch on IBM® watsonx # + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/870bf64e17feb1bbdae7b35e9941db781f26ad6b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/870bf64e17feb1bbdae7b35e9941db781f26ad6b.md new file mode 100644 index 0000000..de281b8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/870bf64e17feb1bbdae7b35e9941db781f26ad6b.md @@ -0,0 +1,179 @@ +# Quick start: Automate the lifecycle for a model with pipelines + +# Quick start: Automate the lifecycle for a model with pipelines # + +You can create an end\-to\-end pipeline to deliver concise, pre\-processed, and up\-to\-date data stored in an external data source\. Read about Watson Pipelines, then watch a video and take a tutorial\. + +**Required services** : Watson Studio : Watson Machine Learning + +Your basic workflow includes these tasks: + + + +1. Open your sandbox project\. Projects are where you can collaborate with others to work with data\. +2. Add connections and data to the project\. You can add CSV files or data from a remote data source through a connection\. +3. Create a pipeline in the project\. +4. Add nodes to the pipeline to perform tasks\. +5. Run the pipeline and view the results\. + + + +## Read about pipelines ## + +The Watson Pipelines editor provides a graphical interface for orchestrating an end\-to\-end flow of assets from creation through deployment\. Assemble and configure a pipeline to create, train, deploy, and update machine learning models and Python scripts\. Putting a model into production is a multi\-step process\. Data must be loaded and processed, models must be trained and tuned before they are deployed and tested\. Machine learning models require more observation, evaluation, and updating over time to avoid bias or drift\. + +[Read more about pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-overview.html) + +[Learn about other ways to build models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-science.html) + +## Watch a video about pipelines ## + +![Watch Video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) Watch this video to preview the steps in this tutorial\. You might notice slight differences in the user interface that is shown in the video\. The video is intended to be a companion to the written tutorial\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Try a tutorial to create a model with Pipelines ## + +This tutorial guides you through exploring and running an AI pipeline to build and deploy a model\. The model predicts if a customer is likely subscribe to a term deposit based on a marketing campaign\. + +In this tutorial, you will complete these tasks: + + + + * [Task 1: Open a project\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en#step01) + * [Task 2: Create a deployment space\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en#step02) + * [Task 3: Create the sample pipeline\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en#step03) + * [Task 4: Explore an existing pipeline\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en#step04) + * [Task 5: Run the pipeline\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en#step05) + * [Task 6: View the assets, deployed model, and online deployment\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en#step06) + + + +This tutorial takes approximately 30 minutes to complete\. + +### Sample data ### + +The sample data that is used in the guided experience is UCI: Bank marketing data used to predict whether a customer enrolls in a marketing promotion\. + +![Spreadsheet of the Bank marketing data set](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_bank_sample_description.png) + +Expand all sections + + + + * Tips for completing this tutorial + + \#\#\# Use the video picture-in-picture Tip: Start the video, then as you scroll through the tutorial, the video moves to picture-in-picture mode. Close the video table of contents for the best experience with picture-in-picture. You can use picture-in-picture mode so you can follow the video as you complete the tasks in this tutorial. Click the timestamps for each task to follow along.The following animated image shows how to use the video picture-in-picture and table of contents features: ![How to use picture-in-picture and chapters](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/pip-and-chapters.gif)\{: width="560px" height="315px" data-tearsheet="this"\} \#\#\# Get help in the community If you need help with this tutorial, you can ask a question or find an answer in the [Cloud Pak for Data Community discussion forum](https://community.ibm.com/community/user/cloudpakfordata/communities/community-home/digestviewer?communitykey=c0c16ff2-10ef-4b50-ae4c-57d769937235)\{: new\_window\}. \#\#\# Set up your browser windows For the optimal experience completing this tutorial, open Cloud Pak for Data in one browser window, and keep this tutorial page open in another browser window to switch easily between the two applications. Consider arranging the two browser windows side-by-side to make it easier to follow along. ![Side-by-side tutorial and UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/tutorial-side-by-side.png)\{: width="560px" height="315px" data-tearsheet="this"\} Tip: If you encounter a guided tour while completing this tutorial in the user interface, click **Maybe later**. + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 1: Open a project + + You need a project to store Prompt Lab assets. Watch a video to see how to create a sandbox project and associate a service. Then follow the steps to verify that you have an existing project or create a sandbox project. + + This video provides a visual method to learn the concepts and tasks in this documentation. + + 1. From the watsonx home screen, scroll to the *Projects* section. If you see any projects listed, then skip to [Task 2](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en#step02). If you don't see any projects, then follow these steps to create a project. 1. Click **Create a sandbox project**. When the project is created, you will see the sandbox project in the *Projects* section. For more information or to watch a video, see [Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html)\{: new\_window\}. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the home screen with the sandbox listed in the Projects section. You are now ready to open the Prompt Lab. + + ![Home screen with sandbox project listed.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-home-screen.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 2: Create a deployment space + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:16. Deployment spaces help you to organize supporting resources such as input data and environments; deploy models or functions to generate predictions or solutions; and view or edit deployment details. Follow these steps to create a deployment space. 1. From the watsonx navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg)\{: iih\}, choose **Deployments**. If you have an existing deployment space, you can skip to [Task 2](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en#step02). 1. Click **New deployment space**. 1. Type a name for your deployment space. 1. Select a storage service from the list. 1. Select your provisioned machine learning service from the list. 1. Click **Create**. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the empty deployment space: + + ![The following image shows the empty deployment space.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-pipeline-deployment-space.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 3: Create the sample pipeline + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:08. You create and run pipelines in a project. Follow these steps to create a pipeline based on a sample in a project: 1. On the watsonx home page, select your sandbox or a different existing project from the drop down list. ![Project list drop down](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-project-dropdown.png)\{: biw\} 1. Click **Customize my journey**, and then select **View all tasks**. 1. Select **Automate model lifecycle**. 1. Click **Samples**. 1. Select **Orchestrate an AutoAI experiment**, and click **Next**. 1. Optional: Change the name for the pipeline. 1. Click **Create**. The sample pipeline gets training data, trains a machine learning model by using the AutoAI tool, and selects the best pipeline to save as a model. The model is deployed to a space. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the sample pipeline. + + ![The following image shows the sample pipeline.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-pipeline-start.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 4: Explore the existing pipeline + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:30. The sample pipeline includes several nodes to create assets and use those assets to build a model. Follow these steps to view the nodes: 1. Click the **Global objects**![Global objects icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/settings-adjust.svg)\{: iih\} icon to view the pipeline parameters. Expand the **deployment\_space** parameter. This pipeline includes a parameter to specify a deployment space where the best model from the AutoAI experiment is stored and deployed. Click the **X** to close the window. 1. Double-click the **Create data file** node to see that it is configured to access the data set for the experiment. Click **Cancel** to close the properties pane. 1. Double-click the **Create AutoAI experiment** node. View the experiment name, the scope, which is where the experiment is stored, the prediction type (binary classification, multiclass classification, or regression), the prediction column, and positive class. The rest of the parameters are all optional. Click **Cancel** to close the properties pane. 1. Double-click the **Run AutoAI experiment** node. This node runs the AutoAI experiment onboarding-bank-marketing-prediction, trains the pipelines, then saves the best model. The first two parameters are required. The first parameter takes the output from the *Create AutoAI experiment* node as the input to run the experiment. The second parameter takes the output from the *Create data file* node as the training data input for the experiment. The rest of the parameters are all optional. Click **Cancel** to close the properties pane. 1. Double-click the **Create Web service** node. This node creates a deployment with the name `onboarding-bank-marketing-prediction-deployment`. The first parameter takes the best model output from the Run AutoAI experiment node as the input to create the deployment with the specified name. The rest of the parameters are all optional. Click **Cancel** to close the properties pane. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the properties for the Create web service node. You are now ready to run the sample pipeline. + + ![The following image the properties for the Create web service node.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-pipeline-properties.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 5: Run the pipeline + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 03:43. Now that the pipeline is complete, follow these steps to run the pipeline: 1. From the toolbar, click **Run pipeline > Trial run**. 1. In the *Values for pipeline parameters* section, select your deployment space: 1. Click **Select Space**. 1. Click **Spaces**. 1. Select your deployment space from [Task 1](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en#step01). 1. Click **Choose**. 1. Provide an API key if this occasion is your first time running a pipeline. Pipeline assets use your personal IBM Cloud API key to run operations securely without disruption. - If you have an existing API key, click **Use existing API key**, paste the API key, and click **Save**. - If you don't have an existing API key, click **Generate new API key**, provide a name, and click **Save**. Copy the API key, and then save the API key for future use. When you're done, click **Close**. 1. Click **Run** to start running the pipeline. 1. Monitor the pipeline progress. 1. Scroll through consolidated logs while the pipeline is running. The trial run might take up to 10 minutes to complete. 1. As each operation completes, select the node for that operation on the canvas. 1. On the **Node Inspector** tab, view the details of the operation. 1. Click the **Node output** tab to see a summary of the output for each node operation. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the pipeline after it completed the trial run. You are now ready to review the assets that the pipeline created. + + ![Completed run of pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-pipeline-completed-run.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 6: View the assets, deployed model, and online deployment + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 04:27. The pipeline created several assets in the deployment space. Follow these steps to view the assets: 1. From the watsonx navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg)\{: iih\}, choose **Deployments**. 1. Click the name for your deployment space. 1. On the *Assets* tab, view **All assets**. 1. Click the **bank-marketing-data.csv** data asset. The *Create data file* node created this asset. 1. Click the model beginning with the name **onboarding-bank-marketing-prediction**. The *Run AutoAI experiment* node generated several model candidates, and chose this as the best model. 1. Click the **Model details** tab, and scroll through the model and training information. 1. Click the **Deployments** tab, and open the **onboarding-bank-marketing-prediction-deployment**. 1. Click the **Test** tab. 1. Click the **JSON input** tab. 1. Replace the sample text with the following JSON text, and click **Predict**.`JSON { "input_data": [ { "fields": "age", "job", "marital", "education", "default", "balance", "housing", "loan", "contact", "day", "month", "duration", "campaign", "pdays", "previous", "poutcome" ], "values": 35, "management", "married", "tertiary", "no", 0, "yes", "no", "cellular", 1, "jun", 850, 10, -1, 4, "unknown" ] ] } ] }`\#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the results of the test; the prediction is to approve the applicant. The confidence scores for your test might be different from the scores that are shown in the image. + + ![Test results predictions](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-pipeline-results.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html?context=cdpaas&locale=en#video-preview) + + + + + + * Try these other methods to build models: + + + + * [Build and deploy a model with AutoAI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html) + * [Build and deploy a model in a Jupyter notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html) + * [Build and deploy a model with SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html) + * [Build and deploy a Decision Optimization model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html) + + + + * View more [videos](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html)\. + * Find sample data sets, projects, models, prompts, and notebooks in the Samples to gain hands\-on experience: + + ![Notebook icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook.svg)[Notebooks](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=notebook) that you can add to your project to get started analyzing data and building models. + + ![Project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/ibm-cloud--projects.svg)[Projects](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=project-template) that you can import containing notebooks, data sets, prompts, and other assets. + + ![Data set icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/data--set.svg)[Data sets](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=dataset) that you can add to your project to refine, analyze, and build models. + + ![Prompt icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/prompt.svg)[Prompts](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=example-prompt) that you can use in the Prompt Lab to prompt a foundation model. + + ![Model icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/model.svg)[Foundation models](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=foundation-model) that you can use in the Prompt Lab. + + + +## Learn more ## + + + + * [Watson Pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-overview.html) + + + +**Parent topic:**[Quick start tutorials](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8745fb7bf19f0e2b0a78c3cd43aa4bf79a25dbce.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8745fb7bf19f0e2b0a78c3cd43aa4bf79a25dbce.md new file mode 100644 index 0000000..effd358 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8745fb7bf19f0e2b0a78c3cd43aa4bf79a25dbce.md @@ -0,0 +1,89 @@ +# Tuning Studio + +# Tuning Studio # + +Tune a foundation model with the Tuning Studio to guide an AI foundation model to return useful output\. + +**Required permissions** : To run training experiments, you must have the **Admin** or **Editor** role in a project\. + +: The Tuning Studio is not available with all plans or in all data centers\. See [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html) and [Regional availability for services and features](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/regional-datactr.html)\. + +**Data format** : Tabular: JSON, JSONL\. For details, see [Data formats](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-data.html)\. + +Note: You can use the same training data file with one or more tuning experiments\. + +**Data size** : 50 to 10,000 input and output example pairs\. The maximum file size is 200 MB\. + +You use the Tuning Studio to create a tuned version of an existing foundation model\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +Foundation models are AI models that are pretrained on terabytes of data from across the internet and other public resources\. They are unrivaled in their ability to predict the next best word and generate language\. While language\-generation can be useful for brainstorming and spurring creativity, it is less useful for achieving concrete tasks\. Model tuning, and other techniques, such as retrieval\-augmented generation, help you to use foundation models in meaningful ways for your business\. + +With the Tuning Studio, you can tune a smaller foundation model to improve its performance on natural language processing tasks such as classification, summarization, and generation\. Tuning can help a smaller foundation model achieve results comparable to larger models in the same model family\. By tuning and deploying the smaller model, you can reduce long\-term inference costs\. + +Much like prompt engineering, tuning a foundation model helps you to influence the content and format of the foundation model output\. Knowing what to expect from a foundation model is essential if you want to plug the step of inferencing a foundation model into a business workflow\. + +The following diagram illustrates how tuning a foundation model can help you guide the model to generate useful output\. You provide labeled data that illustrates the format and type of output that you want the model to return, which helps the foundation model to follow the established pattern\. + +![How a tuned model relates to a foundation model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fm-tune-overview.png) + +You can tune a foundation model to optimize the model's ability to do many things, including: + + + + * Generate new text in a specific style + * Generate text that summarizes or extracts information in a certain way + * Classify text + + + +To learn more about when tuning a model is the right approach, see [When to tune a foundation model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-when.html)\. + +## Workflow ## + +Tuning a model involves the following tasks: + + + +1. Engineer prompts that work well with the model you want to use\. + + + + * Find the largest foundation model that works best for the task. + * Experiment until you understand which prompt formats show the most potential for getting good results from the model. + + + + Tuning doesn't mean you can skip prompt engineering altogether. Experimentation is necessary to find the right foundation model for your use case. Tuning means you can do the work of prompt engineering once and benefit from it again and again. + + You can use the Prompt Lab to experiment with prompt engineering. For help, see [Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html). +2. Create training data to use for model tuning\. +3. Create a tuning experiment to tune the model\. +4. Evaluate the tuned model\. + + If necessary, change the training data or the experiment parameters and run more experiments until you're satisfied with the results. +5. Deploy the tuned model\. + + + +## Learn more ## + + + + * [When to tune](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-when.html) + * [Methods for tuning](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-methods.html) + * [Tuning a model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-tune.html) + + + + + + * [Quick start: Tune a foundation model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html) + * [Sample notebook: Tune a model to classify CFPB documents in watsonx](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/bf57e8896f3e50c638b5a378780f7502) + + + +**Parent topic:**[Foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/87d2ff4289edcbf7fcfa7fc7fd460deb02ecc71b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/87d2ff4289edcbf7fcfa7fc7fd460deb02ecc71b.md new file mode 100644 index 0000000..8244855 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/87d2ff4289edcbf7fcfa7fc7fd460deb02ecc71b.md @@ -0,0 +1,76 @@ +# logregnode properties + +# logregnode properties # + +![Logistic node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/logisticnodeicon.png)Logistic regression is a statistical technique for classifying records based on values of input fields\. It is analogous to linear regression but takes a categorical target field instead of a numeric range\. + + + +logregnode properties + +Table 1\. logregnode properties + +| `logregnode` Properties | Values | Property description | +| -------------------------------- | ------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `target` | *field* | Logistic regression models require a single target field and one or more input fields\. Frequency and weight fields are not used\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `logistic_procedure` | `Binomial``Multinomial` | | +| `include_constant` | *flag* | | +| `mode` | `Simple``Expert` | | +| `method` | `Enter``Stepwise``Forwards``Backwards``BackwardsStepwise` | | +| `binomial_method` | `Enter``Forwards``Backwards` | | +| `model_type` | `MainEffects``FullFactorial``Custom` | When `FullFactorial` is specified as the model type, stepping methods will not run, even if specified\. Instead, `Enter` will be the method used\. If the model type is set to `Custom` but no custom fields are specified, a main\-effects model will be built\. | +| `custom_terms` | \[*\[BP Sex\]\[BP\]\[Age\]*\] | | +| `multinomial_base_category` | *string* | Specifies how the reference category is determined\. | +| `binomial_categorical_input` | *string* | | +| `binomial_input_contrast` | `Indicator``Simple``Difference``Helmert``Repeated``Polynomial``Deviation` | Keyed property for categorical input that specifies how the contrast is determined\. *See the example for usage\.* | +| `binomial_input_category` | `First``Last` | Keyed property for categorical input that specifies how the reference category is determined\. *See the example for usage\.* | +| `scale` | `None``UserDefined``Pearson``Deviance` | | +| `scale_value` | *number* | | +| `all_probabilities` | *flag* | | +| `tolerance` | `1.0E-5``1.0E-6``1.0E-7``1.0E-8``1.0E-9``1.0E-10` | | +| `min_terms` | *number* | | +| `use_max_terms` | *flag* | | +| `max_terms` | *number* | | +| `entry_criterion` | `Score``LR` | | +| `removal_criterion` | `LR``Wald` | | +| `probability_entry` | *number* | | +| `probability_removal` | *number* | | +| `binomial_probability_entry` | *number* | | +| `binomial_probability_removal` | *number* | | +| `requirements` | `HierarchyDiscrete``HierarchyAll``Containment``None` | | +| `max_iterations` | *number* | | +| `max_steps` | *number* | | +| `p_converge` | `1.0E-4``1.0E-5``1.0E-6``1.0E-7``1.0E-8``0` | | +| `l_converge` | `1.0E-1``1.0E-2``1.0E-3``1.0E-4``1.0E-5``0` | | +| `delta` | *number* | | +| `iteration_history` | *flag* | | +| `history_steps` | *number* | | +| `summary` | *flag* | | +| `likelihood_ratio` | *flag* | | +| `asymptotic_correlation` | *flag* | | +| `goodness_fit` | *flag* | | +| `parameters` | *flag* | | +| `confidence_interval` | *number* | | +| `asymptotic_covariance` | *flag* | | +| `classification_table` | *flag* | | +| `stepwise_summary` | *flag* | | +| `info_criteria` | *flag* | | +| `monotonicity_measures` | *flag* | | +| `binomial_output_display` | `at_each_step``at_last_step` | | +| `binomial_goodness_of_fit` | *flag* | | +| `binomial_parameters` | *flag* | | +| `binomial_iteration_history` | *flag* | | +| `binomial_classification_plots` | *flag* | | +| `binomial_ci_enable` | *flag* | | +| `binomial_ci` | *number* | | +| `binomial_residual` | `outliers``all` | | +| `binomial_residual_enable` | *flag* | | +| `binomial_outlier_threshold` | *number* | | +| `binomial_classification_cutoff` | *number* | | +| `binomial_removal_criterion` | `LR``Wald``Conditional` | | +| `calculate_variable_importance` | *flag* | | +| `calculate_raw_propensities` | *flag* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/883359c27f09c3368292819b64149182441721e1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/883359c27f09c3368292819b64149182441721e1.md new file mode 100644 index 0000000..17ce63c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/883359c27f09c3368292819b64149182441721e1.md @@ -0,0 +1,82 @@ +# Noun phrase extraction + +# Noun phrase extraction # + +The Watson Natural Language Processing Noun phrase extraction block extracts noun phrases from input text\. + +**Block name** + +`noun-phrases_rbr__stock` + +Note: The "rbr" abbreviation in model name means rule\-based reasoning\. RBR models handle syntactically regular entity types such as number, email and phone\. + +**Supported languages** + +Noun phrase extraction is available for the following languages\. For a list of the language codes and the corresponding language, see [Language codes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html#lang-codes)\. + +ar, cs, da, de, es, en, fi, fr, he, hi, it, ja, ko, nb, nl, nn, pt, ro, ru, sk, sv, tr, zh\_cn, zh\_tw + +**Capabilities** + +The Noun phrase extraction block extracts non\-overlapping noun phrases from the input text\. + + + +Capabilities of noun phrase extraction based on an example + +| Capabilities | Examples | +| ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| Extraction of non\-overlapping noun phrases | "Anna went to school at University of California Santa Cruz" \-> Anna, school, University of California Santa Cruz | + + + +**Dependencies on other blocks** + +None + +**Code sample** + + import watson_nlp + + # Load the model for English + noun_phrases_model = watson_nlp.load('noun-phrases_rbr_en_stock') + + # Run the model on the input text + noun_phrases = noun_phrases_model.run('Anna went to school at University of California Santa Cruz') + print(noun_phrases) + +Output of the code sample: + + { + "noun_phrases": [ + { + "span": { + "begin": 0, + "end": 4, + "text": "Anna" + } + }, + { + "span": { + "begin": 13, + "end": 19, + "text": "school" + } + }, + { + "span": { + "begin": 23, + "end": 58, + "text": "University of California Santa Cruz" + } + } + ], + "producer_id": { + "name": "RBR Noun phrases", + "version": "0.0.1" + } + } + +**Parent topic:**[Watson Natural Language Processing task catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/88467827811ed045a648a3c215f5b91d43eb49cd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/88467827811ed045a648a3c215f5b91d43eb49cd.md new file mode 100644 index 0000000..7a10447 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/88467827811ed045a648a3c215f5b91d43eb49cd.md @@ -0,0 +1,45 @@ +# Working with multiple-response data (SPSS Modeler) + +# Working with multiple\-response data # + +You can analyze multiple\-response data using a number of comparison functions\. + +Available comparison functions include: + + + + * `value_at` + * `first_index / last_index` + * `first_non_null / last_non_null` + * `first_non_null_index / last_non_null_index` + * `min_index / max_index` + + + +For example, suppose a multiple\-response question asked for the first, second, and third most important reasons for deciding on a particular purchase (for example, price, personal recommendation, review, local supplier, other)\. In this case, you might determine the importance of price by deriving the index of the field in which it was first included: + + first_index("price", [Reason1 Reason2 Reason3]) + +Similarly, suppose you asked customers to rank three cars in order of likelihood to purchase and coded the responses in three separate fields, as follows: + + + +Car ranking example + +Table 1\. Car ranking example + +| customer id | car1 | car2 | car3 | +| ----------- | ---- | ---- | ---- | +| 101 | 1 | 3 | 2 | +| 102 | 3 | 2 | 1 | +| 103 | 2 | 3 | 1 | + + + +In this case, you could determine the index of the field for the car they like most (ranked \#1, or the lowest rank) using the `min_index` function: + + min_index(['car1' 'car2' 'car3']) + +See [Comparison functions](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_comparison.html#clem_function_ref_comparison) for more information\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8892a757ecb2c4a02806a7b262712ff2e30ce044.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8892a757ecb2c4a02806a7b262712ff2e30ce044.md new file mode 100644 index 0000000..56649a6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8892a757ecb2c4a02806a7b262712ff2e30ce044.md @@ -0,0 +1,29 @@ +# OPL models + +# OPL models # + +You can build OPL models in the Decision Optimization experiment UI in watsonx\.ai\. + +In this section: + + + + * [Inputs and Outputs](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/OPLmodels.html?context=cdpaas&locale=en#topic_oplmodels__section_oplIO) + * [Engine settings](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/OPLmodels.html?context=cdpaas&locale=en#topic_oplmodels__engsettings) + + + +To create an OPL model in the experiment UI, select in the model selection window\. You can also import OPL models from a file or import a scenario \.zip file that contains the OPL model and the data\. If you import from a file or scenario \.zip file, the data must be in \.csv format\. However, you can import other file formats that you have as project assets into the experiment UI\. You can also import data sets including connected data into your project from the model builder in the [Prepare data view](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface__section_preparedata)\. + +For more information about the OPL language and engine parameters, see: + + + + * [OPL language reference manual](https://www.ibm.com/docs/en/SSSA5P_22.1.1/ilog.odms.ide.help/OPL_Studio/opllangref/topics/opl_langref_modeling_language.html) + * [OPL Keywords](https://www.ibm.com/docs/en/SSSA5P_22.1.1/ilog.odms.ide.help/OPL_Studio/opllang_quickref/topics/opl_keywords_top.html) + * [A list of CPLEX parameters](https://www.ibm.com/docs/en/SSSA5P_22.1.1/ilog.odms.cplex.help/CPLEX/Parameters/topics/introListTopical.html) + * [A list of CPO parameters](https://www.ibm.com/docs/en/SSSA5P_22.1.1/ilog.odms.cpo.help/CP_Optimizer/Parameters/topics/paramcpoptimizer.html) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/88a9f08917918d1d74c1c2ca702e999747eeb422.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/88a9f08917918d1d74c1c2ca702e999747eeb422.md new file mode 100644 index 0000000..7be552e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/88a9f08917918d1d74c1c2ca702e999747eeb422.md @@ -0,0 +1,27 @@ +# Jupyter Notebook editor + +# Jupyter Notebook editor # + +The Jupyter Notebook editor is largely used for interactive, exploratory data analysis programming and data visualization\. Only one person can edit a notebook at a time\. All other users can access opened notebooks in view mode only, while they are locked\. + +You can use the preinstalled open source libraries that come with the notebook runtime environments, add your own libraries, and benefit from the IBM libraries provided at no extra cost\. + +When your notebooks are ready, you can create jobs to run the notebooks directly from the Jupyter Notebook editor\. Your job configurations can use environment variables that are passed to the notebooks with different values when the notebooks run\. + +## Learn more ## + + + + * [Quick start: Analyze data in a Jupyter notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html) + * [Create notebooks in the Jupyter Notebook editor](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/creating-notebooks.html) + * [Runtime environments for notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html) + * [Libraries and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/libraries.html) + * [Code and run notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/code-run-notebooks.html) + * [Schedule a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-nb-editor.html) + * [Share and publish notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/share-notebooks.html) + + + +**Parent topic:**[Notebooks and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebooks-and-scripts.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/88bac0da2ccb09c93c0013a209147cc5a5dcee68.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/88bac0da2ccb09c93c0013a209147cc5a5dcee68.md new file mode 100644 index 0000000..bc124b0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/88bac0da2ccb09c93c0013a209147cc5a5dcee68.md @@ -0,0 +1,78 @@ +# Managing the user API key + +# Managing the user API key # + +Certain operations in IBM watsonx require an API key for secure authorization\. You can generate and rotate a user API key as needed to help ensure your operations run smoothly\. + +## User API key overview ## + +Operations running within services in IBM watsonx require credentials for secure authorization\. These operations use an API key for authorization\. A valid API key is required for many long\-running tasks, including the following: + + + + * Model training in Watson Machine Learning + * Problem solving with Decision Optimization + * Data transformation with DataStage flows + * Other runtime services (for example, Data Refinery and Pipelines) that accept API key references + + + +Both scheduled and ad hoc jobs require an API key for authorization\. An API key is used for jobs when: + + + + * Creating a job schedule with a predefined key + * Updating the API key for a scheduled job + * Providing an API key for an ad hoc job + + + +User API keys give control to the account owner to secure and renew credentials, thus helping to ensure operations run without interruption\. Keys are unique to the IBMid and account\. If you change the account you are working in, you must generate a new key\. + +### Active and Phased out keys ### + +When you create an API key, it is placed in **Active** state\. The **Active key** is used for authorization for operations in IBM watsonx\. + +When you rotate a key, a new key is created in **Active** state and the existing key is changed to **Phased out** state\. A Phased out key is not used for authorization and can be deleted\. + +## Viewing the current API key ## + +Click your avatar and select **Profile and settings** to open your account profile\. Select **User API key** to view the **Active** and **Phased out** keys\. + +## Creating an API key ## + +If you do not have an API key, you can create a key by clicking **Create a key**\. + +A new key is created in **Active** state\. The key automatically authorizes operations that require a secure credential\. The key is stored in both IBM Cloud and IBM watsonx\. You can view the API keys for your IBM Cloud account at [API keys](https://cloud.ibm.com/iam/apikeys)\. + +User API Keys take the form **cpd\-apikey\-\{username\}\-\{timeStamp\}**, where username is the IBMid of the account owner and timestamp indicates when the key was created\. + +## Rotating an API key ## + +If the API key becomes stale or invalid, you can generate a new **Active** key for use by all operations\. + +To rotate a key, click **Rotate**\. + +A new key is created to replace the current key\. The rotated key is placed in **Phased out** status\. A **Phased out** key is not available for use\. + +## Deleting a phased out API key ## + +When you are certain the phased out key is no longer needed for operations, click the minus sign to delete it\. Deleting keys might cause running operations to fail\. + +## Deleting all API keys ## + +Delete all keys (both **Active** and **Phased out**) by clicking the trash can\. Deleting keys might cause running operations to fail\. + +## Learn more ## + + + + * [Creating and managing jobs in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html) + * [Adding task credentials](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/task-credentials.html) + * [Understanding API keys](https://cloud.ibm.com/docs/account?topic=account-manapikey&interface=ui) + + + +**Parent topic:**[Administering your accounts and services](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/administer-accounts.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/88e4e066b89d0a6993f31ea337930d962b76d6d1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/88e4e066b89d0a6993f31ea337930d962b76d6d1.md new file mode 100644 index 0000000..d095a13 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/88e4e066b89d0a6993f31ea337930d962b76d6d1.md @@ -0,0 +1,22 @@ +# SoundEx functions (SPSS Modeler) + +# SoundEx functions # + +SoundEx is a method used to find strings when the sound is known but the precise spelling isn't known\. + +Developed in 1918, the method searches out words with similar sounds based on phonetic assumptions about how certain letters are pronounced\. SoundEx can be used to search names in a database (for example, where spellings and pronunciations for similar names may vary)\. The basic SoundEx algorithm is documented in a number of sources and, despite known limitations (for example, leading letter combinations such as `ph` and `f` won't match even though they sound the same), is supported in some form by most databases\. + + + +CLEM soundex functions + +Table 1\. CLEM soundex functions + +| Function | Result | Description | +| -------------------------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `soundex(STRING)` | *Integer* | Returns the four\-character SoundEx code for the specified *STRING*\. | +| `soundex_difference(STRING1, STRING2)` | *Integer* | Returns an integer between 0 and 4 that indicates the number of characters that are the same in the SoundEx encoding for the two strings, where 0 indicates no similarity and 4 indicates strong similarity or identical strings\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8937db13972e4dedbcc542303ef3a783287fd10b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8937db13972e4dedbcc542303ef3a783287fd10b.md new file mode 100644 index 0000000..85f3d53 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8937db13972e4dedbcc542303ef3a783287fd10b.md @@ -0,0 +1,13 @@ +# XGBoost Linear (SPSS Modeler) + +# XGBoost Linear node # + +XGBoost Linear© is an advanced implementation of a gradient boosting algorithm with a linear model as the base model\. Boosting algorithms iteratively learn weak classifiers and then add them to a final strong classifier\. The XGBoost Linear node in watsonx\.ai is implemented in Python\. + +For more information about boosting algorithms, see the [XGBoost Tutorials](http://xgboost.readthedocs.io/en/latest/tutorials/index.html)\. ^1^ + +Note that the XGBoost cross\-validation function is not supported in watsonx\.ai\. You can use the Partition node for this functionality\. Also note that XGBoost in watsonx\.ai performs one\-hot encoding automatically for categorical variables\. + +^1^ "XGBoost Tutorials\." *Scalable and Flexible Gradient Boosting*\. Web\. © 2015\-2016 DMLC\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/895cd261c9f06f272286bcca3555846fb1ed8aa3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/895cd261c9f06f272286bcca3555846fb1ed8aa3.md new file mode 100644 index 0000000..7e0de2a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/895cd261c9f06f272286bcca3555846fb1ed8aa3.md @@ -0,0 +1,34 @@ +# Building the flow (SPSS Modeler) + +# Building the flow # + + + +1. Add a Data Asset node that points to telco\.csv\. + + Figure 1. Auto Data Prep example flow + + ![Auto Data Prep example flow](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autodata.png) +2. Attach a Type node to the Data Asset node\. Set the measure for the `churn` field to Flag, and set the role to Target\. Make sure the role for all other fields is set to Input\. + + Figure 2. Setting the measurement level and role + + ![Setting the measurement level and role](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autodata_build_target.png) +3. Attach a Logistic node to the Type node\. +4. In the Logistic node's properties, under MODEL SETTINGS, select the Binomial procedure\. For Model Name, select Custom and enter No ADP \- churn\. + + Figure 3. Choosing model options + + ![Choosing model options](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autodata_binomial_default.png) +5. Attach an Auto Data Prep node to the Type node\. Under OBJECTIVES, leave the default settings in place to analyze and prepare your data by balancing both speed and accuracy\. +6. Run the flow to analyze and process your data\. Other Auto Data Prep node properties allow you to specify that you want to concentrate more on accuracy, more on the speed of processing, or to fine tune many of the data preparation processing steps\. Note: If you want to adjust the node properties and run the flow again in the future, since the model already exists, you must first click Clear Analysis, under OBJECTIVES before running the flow again\. + + Figure 4. Auto Data Prep default objectives + + ![Auto Data Prep default objectives](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autodata_objectives.png) +7. Attach a Logistic node to the Auto Data Prep node\. +8. In the Logistic node's properties, under MODEL SETTINGS, select the Binomial procedure\. For Model Name, select Custom and enter After ADP \- churn\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/89f9e0463d14ded51b14392a4fd7a69bb53fa1bf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/89f9e0463d14ded51b14392a4fd7a69bb53fa1bf.md new file mode 100644 index 0000000..0bfb54e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/89f9e0463d14ded51b14392a4fd7a69bb53fa1bf.md @@ -0,0 +1,322 @@ +# Data skipping for Spark SQL + +# Data skipping for Spark SQL # + +Data skipping can significantly boost the performance of SQL queries by skipping over irrelevant data objects or files based on a summary metadata associated with each object\. + +Data skipping uses the open source Xskipper library for creating, managing and deploying data skipping indexes with Apache Spark\. See [Xskipper \- An Extensible Data Skipping Framework](https://xskipper.io)\. + +For more details on how to work with Xskipper see: + + + + * [Quick Start Guide](https://xskipper.io/getting-started/quick-start-guide/) + * [Demo Notebooks](https://xskipper.io/getting-started/sample-notebooks/) + + + +In addition to the open source features in Xskipper, the following features are also available: + + + + * [Geospatial data skipping](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-skipping-spark-sql.html?context=cdpaas&locale=en#geospatial-skipping) + * [Encrypting indexes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-skipping-spark-sql.html?context=cdpaas&locale=en#encrypting-indexes) + * [Data skipping with joins (for Spark 3 only)](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-skipping-spark-sql.html?context=cdpaas&locale=en#skipping-with-joins) + * [Samples showing these features](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-skipping-spark-sql.html?context=cdpaas&locale=en#samples) + + + +## Geospatial data skipping ## + +You can also use data skipping when querying geospatial data sets using [geospatial functions](https://www.ibm.com/support/knowledgecenter/en/SSCJDQ/com.ibm.swg.im.dashdb.analytics.doc/doc/geo_functions.html) from the [spatio\-temporal library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/geo-spatial-lib.html)\. + + + + * To benefit from data skipping in data sets with latitude and longitude columns, you can collect the min/max indexes on the latitude and longitude columns\. + * Data skipping can be used in data sets with a geometry column (a UDT column) by using a built\-in [Xskipper plugin](https://xskipper.io/api/indexing/#plugins)\. + + + +The next sections show you to work with the geospatial plugin\. + +### Setting up the geospatial plugin ### + +To use the plugin, load the relevant implementations using the Registration module\. Note that you can only use Scala in applications in IBM Analytics Engine powered by Apache Spark, not in Watson Studio\. + + + + * For Scala: + + import com.ibm.xskipper.stmetaindex.filter.STMetaDataFilterFactory + import com.ibm.xskipper.stmetaindex.index.STIndexFactory + import com.ibm.xskipper.stmetaindex.translation.parquet.{STParquetMetaDataTranslator, STParquetMetadatastoreClauseTranslator} + import io.xskipper._ + + Registration.addIndexFactory(STIndexFactory) + Registration.addMetadataFilterFactory(STMetaDataFilterFactory) + Registration.addClauseTranslator(STParquetMetadatastoreClauseTranslator) + Registration.addMetaDataTranslator(STParquetMetaDataTranslator) + * For Python: + + from xskipper import Xskipper + from xskipper import Registration + + Registration.addMetadataFilterFactory(spark, 'com.ibm.xskipper.stmetaindex.filter.STMetaDataFilterFactory') + Registration.addIndexFactory(spark, 'com.ibm.xskipper.stmetaindex.index.STIndexFactory') + Registration.addMetaDataTranslator(spark, 'com.ibm.xskipper.stmetaindex.translation.parquet.STParquetMetaDataTranslator') + Registration.addClauseTranslator(spark, 'com.ibm.xskipper.stmetaindex.translation.parquet.STParquetMetadatastoreClauseTranslator') + + + +### Index building ### + +To build an index, you can use the `addCustomIndex` API\. Note that you can only use Scala in applications in IBM Analytics Engine powered by Apache Spark, not in Watson Studio\. + + + + * For Scala: + + import com.ibm.xskipper.stmetaindex.implicits._ + + // index the dataset + val xskipper = new Xskipper(spark, dataset_path) + + xskipper + .indexBuilder() + // using the implicit method defined in the plugin implicits + .addSTBoundingBoxLocationIndex("location") + // equivalent + //.addCustomIndex(STBoundingBoxLocationIndex("location")) + .build(reader).show(false) + * For Python: + + xskipper = Xskipper(spark, dataset_path) + + # adding the index using the custom index API + xskipper.indexBuilder() \ + .addCustomIndex("com.ibm.xskipper.stmetaindex.index.STBoundingBoxLocationIndex", ['location'], dict()) \ + .build(reader) \ + .show(10, False) + + + +### Supported functions ### + +The list of supported geospatial functions includes the following: + + + + * ST\_Distance + * ST\_Intersects + * ST\_Contains + * ST\_Equals + * ST\_Crosses + * ST\_Touches + * ST\_Within + * ST\_Overlaps + * ST\_EnvelopesIntersect + * ST\_IntersectsInterior + + + +## Encrypting indexes ## + +If you use a Parquet metadata store, the metadata can optionally be encrypted using Parquet Modular Encryption (PME)\. This is achieved by storing the metadata itself as a Parquet data set, and thus PME can be used to encrypt it\. This feature applies to all input formats, for example, a data set stored in CSV format can have its metadata encrypted using PME\. + +In the following section, unless specified otherwise, when referring to footers, columns, and so on, these are with respect to metadata objects, and not to objects in the indexed data set\. + +Index encryption is modular and granular in the following way: + + + + * Each index can either be encrypted (with a per\-index key granularity) or left in plain text + * Footer \+ object name column: + + + + * Footer column of the metadata object which in itself is a Parquet file contains, among other things: + + + + * Schema of the metadata object, which reveals the types, parameters and column names for all indexes collected. For example, you can learn that a `BloomFilter` is defined on column `city` with a false-positive probability of `0.1`. + * Full path to the original data set or a table name in case of a Hive metastore table. + + + + * Object name column stores the names of all indexed objects. + + + + * Footer \+ metadata column can either be: + + + + * Both encrypted using the same key. This is the default. In this case, the plain text footer configuration for the Parquet objects comprising the metadata in encrypted footer mode, and the object name column is encrypted using the selected key. + * Both in plain text. In this case, the Parquet objects comprising the metadata are in plain text footer mode, and the object name column is not encrypted. + + If at least one index is marked as encrypted, then a footer key must be configured regardless of whether plain text footer mode is enabled or not. If plain text footer is set then the footer key is used only for tamper-proofing. Note that in that case the object name column is not tamper proofed. + + If a footer key is configured, then at least one index must be encrypted. + + + + + +Before using index encryption, you should check the documentation on [PME](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/parquet-encryption.html) and make sure you are familiar with the concepts\. + +Important: When using index encryption, whenever a `key` is configured in any Xskipper API, it's always the label `NEVER the key itself`\. + +To use index encryption: + + + +1. Follow all the steps to make sure PME is enabled\. See [PME](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/parquet-encryption.html)\. +2. Perform all *regular* PME configurations, including Key Management configurations\. +3. Create encrypted metadata for a data set: + + + + 1. Follow the regular flow for creating metadata. + 2. Configure a footer key. If you wish to set a plain text footer \+ object name column, set `io.xskipper.parquet.encryption.plaintext.footer` to `true` (See samples below). + 3. In `IndexBuilder`, for each index you want to encrypt, add the label of the key to use for that index. + + To use metadata during query time or to refresh existing metadata, no setup is necessary other than the *regular* PME setup required to make sure the keys are accessible (literally the same configuration needed to read an encrypted data set). + + + + + +## Samples ## + +The following samples show metadata creation using a key named `k1` as a footer \+ object name key, and a key named `k2` as a key to encrypt a `MinMax` for `temp`, while also creating a `ValueList` for `city`, which is left in plain text\. Note that you can only use Scala in applications in IBM Analytics Engine powered by Apache Spark, not in Watson Studio\. + + + + * For Scala: + + // index the dataset + val xskipper = new Xskipper(spark, dataset_path) + // Configuring the JVM wide parameters + val jvmComf = Map( + "io.xskipper.parquet.mdlocation" -> md_base_location, + "io.xskipper.parquet.mdlocation.type" -> "EXPLICIT_BASE_PATH_LOCATION") + Xskipper.setConf(jvmConf) + // set the footer key + val conf = Map( + "io.xskipper.parquet.encryption.footer.key" -> "k1") + xskipper.setConf(conf) + xskipper + .indexBuilder() + // Add an encrypted MinMax index for temp + .addMinMaxIndex("temp", "k2") + // Add a plaintext ValueList index for city + .addValueListIndex("city") + .build(reader).show(false) + * For Python + + xskipper = Xskipper(spark, dataset_path) + # Add JVM Wide configuration + jvmConf = dict([ + ("io.xskipper.parquet.mdlocation", md_base_location), + ("io.xskipper.parquet.mdlocation.type", "EXPLICIT_BASE_PATH_LOCATION")]) + Xskipper.setConf(spark, jvmConf) + # configure footer key + conf = dict([("io.xskipper.parquet.encryption.footer.key", "k1")]) + xskipper.setConf(conf) + # adding the indexes + xskipper.indexBuilder() \ + .addMinMaxIndex("temp", "k1") \ + .addValueListIndex("city") \ + .build(reader) \ + .show(10, False) + + + +If you want the footer \+ object name to be left in plain text mode (as mentioned above), you need to add the configuration parameter: + + + + * For Scala: + + // index the dataset + val xskipper = new Xskipper(spark, dataset_path) + // Configuring the JVM wide parameters + val jvmComf = Map( + "io.xskipper.parquet.mdlocation" -> md_base_location, + "io.xskipper.parquet.mdlocation.type" -> "EXPLICIT_BASE_PATH_LOCATION") + Xskipper.setConf(jvmConf) + // set the footer key + val conf = Map( + "io.xskipper.parquet.encryption.footer.key" -> "k1", + "io.xskipper.parquet.encryption.plaintext.footer" -> "true") + xskipper.setConf(conf) + xskipper + .indexBuilder() + // Add an encrypted MinMax index for temp + .addMinMaxIndex("temp", "k2") + // Add a plaintext ValueList index for city + .addValueListIndex("city") + .build(reader).show(false) + * For Python + + xskipper = Xskipper(spark, dataset_path) + # Add JVM Wide configuration + jvmConf = dict([ + ("io.xskipper.parquet.mdlocation", md_base_location), + ("io.xskipper.parquet.mdlocation.type", "EXPLICIT_BASE_PATH_LOCATION")]) + Xskipper.setConf(spark, jvmConf) + # configure footer key + conf = dict([("io.xskipper.parquet.encryption.footer.key", "k1"), + ("io.xskipper.parquet.encryption.plaintext.footer", "true")]) + xskipper.setConf(conf) + # adding the indexes + xskipper.indexBuilder() \ + .addMinMaxIndex("temp", "k1") \ + .addValueListIndex("city") \ + .build(reader) \ + .show(10, False) + + + +## Data skipping with joins (for Spark 3 only) ## + +With Spark 3, you can use data skipping in join queries such as: + + SELECT * + FROM orders, lineitem + WHERE l_orderkey = o_orderkey and o_custkey = 800 + +This example shows a star schema based on the TPC\-H benchmark schema (see [TPC\-H](http://www.tpc.org/tpch/)) where lineitem is a fact table and contains many records, while the orders table is a dimension table which has a relatively small number of records compared to the fact tables\. + +The above query has a predicate on the orders tables which contains a small number of records which means using min/max will not benefit much from data skipping\. + +*Dynamic data skipping* is a feature which enables queries such as the above to benefit from data skipping by first extracting the relevant `l_orderkey` values based on the condition on the `orders` table and then using it to push down a predicate on `l_orderkey` that uses data skipping indexes to filter irrelevant objects\. + +To use this feature, enable the following optimization rule\. Note that you can only use Scala in applications in IBM Analytics Engine powered by Apache Spark, not in Watson Studio\. + + + + * For Scala: + + import com.ibm.spark.implicits. + + spark.enableDynamicDataSkipping() + * For Python: + + from sparkextensions import SparkExtensions + + SparkExtensions.enableDynamicDataSkipping(spark) + + + +Then use the Xskipper API as usual and your queries will benefit from using data skipping\. + +For example, in the above query, indexing `l_orderkey` using min/max will enable skipping over the `lineitem` table and will improve query performance\. + +## Support for older metadata ## + +Xskipper supports older metadata created by the MetaIndexManager seamlessly\. Older metadata can be used for skipping as updates to the Xskipper metadata are carried out automatically by the next refresh operation\. + +If you see `DEPRECATED_SUPPORTED` in front of an index when listing indexes or running a `describeIndex` operation, the metadata version is deprecated but is still supported and skipping will work\. The next refresh operation will update the metadata automatically\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8a411252b81f0e159c1f63ee64f63a987d1bef9f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8a411252b81f0e159c1f63ee64f63a987d1bef9f.md new file mode 100644 index 0000000..e60f9da --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8a411252b81f0e159c1f63ee64f63a987d1bef9f.md @@ -0,0 +1,32 @@ +# Manually adding the project access token + +# Manually adding the project access token # + +All projects have an authorization token that is used to access data assets, for example files and connections, and is used by platform APIs\. This token is called the project access token, or simply access token in the project user interface\. This project access token must be set in notebooks so that project and platform functions can access the project resources\. + +When you load data to your notebook by clicking **Read data** on the Code snippets pane, selecting the asset and the load option, the project access token is added for you, if the generated code that is inserted uses project functions\. + +However, when you use API functions in your notebook that require the project token, for example, if you're using `Wget` to access data by using the HTTP, HTTPS or FTP protocols, or the `ibm-watson-studio-lib` library, you must add the project access token to the notebook yourself\. + +To add a project access token to a notebook if you are not using the generated code: + + + +1. From the **Manage** tab, select **Access Control** and click **New access token** under **Access tokens**\. Only project administrators can create project access tokens\. + + Enter a name and select the access role. To enable using API functions in a notebook, the access token must have the Editor access role. An access token with Viewer access role enables read access only to a notebook. +2. Add the project access token to a notebook by clicking **More > Insert project token** from the notebook action bar\. + + By running the inserted hidden code cell, a project object is created that you can use for functions in the `ibm-watson-studio-lib` library. For example to get the name of the current project run: + + project.get_name() + + For details on the available `ibm-watson-studio-lib` functions, see [Accessing project assets with ibm-watson-studio-lib](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/using-ibm-ws-lib.html). + + Note that a project administrator can revoke a project access token at any time. An access token has no expiration date and is valid until it is revoked. + + + +**Parent topic:**[Loading and accessing data in a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8a69dd7bead4adb82c87a200309cd63ecbd625d8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8a69dd7bead4adb82c87a200309cd63ecbd625d8.md new file mode 100644 index 0000000..e5c0989 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8a69dd7bead4adb82c87a200309cd63ecbd625d8.md @@ -0,0 +1,95 @@ +# FTP (remote file system) connection + +# FTP (remote file system) connection # + +To access your data with the FTP protocol, create a connection asset for it\. + +FTP is a standard communication protocol that is used to transfer files from a server to a client on a computer network\. + +## Create an FTP connection ## + +To create the connection asset, you need these connection details: + + + + * Connection mode: The connection method configured on the FTP server: + + + + * Anonymous + * Basic authentication (with username and password) + * SFTP Tectia: Transfer data sets that are in Multiple Virtual Storage (MVS) format to or from an IBM z/OS mainframe computer. MVS data sets use a period (`.`) to separate the qualifiers in the data set names. To write to an MVS data set, select **Access MVS Dataset** and enter the file transfer advice (FTADV) strings in key-value pairs separated by commas. For information, see the [Tectia documentation](https://info.ssh.com/hubfs/2021%20Support%20manuals%20documents/TectiaServer_zOS_UserManual.pdf). + * SSH: File transfer over a secure channel that uses the Secure Shell protocol. Also requires username and password. + * SSL: File transfer that uses File Transport Protocol (FTP), which supports secure transmission via SSL (sslTLSv2) protocol. Also requires username and password. + + + + * Hostname or IP address + * Port number of the FTP server + * SSH mode: Private key and Key passphrase + + + + + + * Authentication method: + + + + * Username and password + * Username, password, private key. If you use an encrypted private key, you will need a key passphrase. + * Username and private key. If you use an encrypted private key, you will need a key passphrase. + + + + + +If you use a private key, make sure that the key is an RSA private key that is generated by the **ssh\-keygen** tool\. The private key must be in the PEM format\. + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. This selection is available for the SSH connection mode only\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use FTP connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Supported file types ## + +The FTP connection supports these file types: Avro, CSV, Delimited text, Excel, JSON, ORC, Parquet, SAS, SAV, SHP, and XML\. + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8b32eb4742d88b5cec2e1c9616958bd7f8986785.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8b32eb4742d88b5cec2e1c9616958bd7f8986785.md new file mode 100644 index 0000000..fcbfb91 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8b32eb4742d88b5cec2e1c9616958bd7f8986785.md @@ -0,0 +1,21 @@ +# applyknnnode properties + +# applyknnnode properties # + +You can use KNN modeling nodes to generate a KNN model nugget\. The scripting name of this model nugget is *applyknnnode*\. For more information on scripting the modeling node itself, see [knnnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/knnnodeslots.html#knnnodeslots)\. + + + +applyknnnode properties + +Table 1\. applyknnnode properties + +| `applyknnnode` Properties | Values | Property description | +| ------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `all_probabilities` | *flag* | | +| `save_distances` | *flag* | | +| `enable_sql_generation` | `false``native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8b34ded3493e5181b1d19f6d14a9598cfeaa5997.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8b34ded3493e5181b1d19f6d14a9598cfeaa5997.md new file mode 100644 index 0000000..ab5b499 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8b34ded3493e5181b1d19f6d14a9598cfeaa5997.md @@ -0,0 +1,99 @@ +# {{ document.title.text }} + +# AI risk atlas # + +Explore this atlas to understand some of the risks of working with generative AI, foundation models, and machine learning models\. + +### Risks associated with input ### + +#### Training and tuning phase #### + +![icon for fairness risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-fairness.svg) + +#### Fairness #### + +[Data bias](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/bias.html)Amplified![icon for robustness risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-robustness.svg) + +#### Robustness #### + +[Data poisoning](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-poisoning.html)Traditional![icon for value alignment risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-value-alignment.svg) + +#### Value alignment #### + +[Data curation](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-curation.html)Amplified +[Downstream retraining](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/downstream-retraining.html)New![icon for data laws risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-data-laws.svg) + +#### Data laws #### + +[Data transfer](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-transfer.html)Traditional +[Data usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-usage.html)Traditional +[Data aquisition](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-aquisition.html)Traditional![icon for intellectual property risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-intellectual-property.svg) + +#### Intellectual property #### + +[Data usage rights](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-usage-rights.html)Amplified +[Confidential data disclosure](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/confidential-data-disclosure.html)Traditional![icon for transparency risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-transparency.svg) + +#### Transparency #### + +[Data transparency](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-transparency.html)Amplified +[Data provenance](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-provenance.html)Amplified![icon for privacy risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-privacy.svg) + +#### Privacy #### + +[Personal information in data](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/personal-information-in-data.html)Traditional +[Reidentification](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/reidentification.html)Traditional +[Data privacy rights](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/data-privacy-rights.html)Amplified + +#### Inference phase #### + +![icon for privacy risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-privacy.svg) + +#### Privacy #### + +[Personal information in prompt](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/personal-information-in-prompt.html)New[Membership inference attack](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/membership-inference-attack.html)Traditional[Attribute inference attack](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/attribute-inference-attack.html)Amplified![icon for intellectual property risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-intellectual-property.svg) + +#### Intellectual property #### + +[Confidential data in prompt](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/confidential-data-in-prompt.html)New![icon for robustness risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-robustness.svg) + +#### Robustness #### + +[Evasion attack](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/evasion-attack.html)Amplified[Extraction attack](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/extraction-attack.html)Amplified[Prompt injection](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/prompt-injection.html)New[Prompt leaking](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/prompt-leaking.html)Amplified![icon for multi\-category risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-multi-category.svg) + +#### Multi\-category #### + +[Prompt priming](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/prompt-priming.html)Amplified[Jailbreaking](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/jailbreaking.html)Amplified + +### Risks associated with output ### + +![icon for fairness risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-fairness.svg) + +#### Fairness #### + +[Output bias](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/output-bias.html)New[Decision bias](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/decision-bias.html)New![icon for intellectual property risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-intellectual-property.svg) + +#### Intellectual property #### + +[Copyright infringement](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/copyright-infringement.html)New![icon for value alignment risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-value-alignment.svg) + +#### Value alignment #### + +[Hallucination](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/hallucination.html)New[Toxic output](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/toxic-output.html)New[Trust calibration](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/trust-calibration.html)New[Physical harm](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/physical-harm.html)New[Benign advice](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/benign-advice.html)New[Improper usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/improper-usage.html)New![icon for misuse risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-misuse.svg) + +#### Misuse #### + +[Spreading disinformation](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/spreading-disinformation.html)Amplified[Toxicity](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/toxicity.html)New[Nonconsensual use](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/nonconsensual-use.html)Amplified[Dangerous use](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/dangerous-use.html)New[Non\-disclosure](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/non-disclosure.html)New![icon for harmful code generation risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-harmful-code-generation.svg) + +#### Harmful code generation #### + +[Harmful code generation](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/harmful-code-generation.html)New![icon for privacy risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-privacy.svg) + +#### Privacy #### + +[Personal information in output](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/personal-information-in-output.html)New![icon for explainability risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-explainability.svg) + +#### Explainability #### + +[Explaining output](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/explaining-output.html)Amplified[Unreliable source attribution](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/unreliable-source-attribution.html)Amplified[Inaccessible training data](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/inaccessible-training-data.html)Amplified[Untraceable attribution](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/untraceable-attribution.html)Amplified + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8b5211bc5ac76b26c8c102e576f0af560dfbcbc2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8b5211bc5ac76b26c8c102e576f0af560dfbcbc2.md new file mode 100644 index 0000000..ca52114 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8b5211bc5ac76b26c8c102e576f0af560dfbcbc2.md @@ -0,0 +1,19 @@ +# Binning node (SPSS Modeler) + +# Binning node # + +The Binning node enables you to automatically create new nominal fields based on the values of one or more existing continuous (numeric range) fields\. For example, you can transform a continuous income field into a new categorical field containing income groups of equal width, or as deviations from the mean\. Alternatively, you can select a categorical "supervisor" field in order to preserve the strength of the original association between the two fields\. + +Binning can be useful for a number of reasons, including: + + + + * Algorithm requirements\. Certain algorithms, such as Naive Bayes and Logistic Regression, require categorical inputs\. + * Performance\. Algorithms such as multinomial logistic may perform better if the number of distinct values of input fields is reduced\. For example, use the median or mean value for each bin rather than using the original values\. + * Data Privacy\. Sensitive personal information, such as salaries, may be reported in ranges rather than actual salary figures in order to protect privacy\. + + + +A number of binning methods are available\. After you create bins for the new field, you can generate a Derive node based on the cut points\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8b9532adfc4fe3d9213bbe56da3323c759426287.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8b9532adfc4fe3d9213bbe56da3323c759426287.md new file mode 100644 index 0000000..2665305 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8b9532adfc4fe3d9213bbe56da3323c759426287.md @@ -0,0 +1,84 @@ +# SingleStoreDB connection + +# SingleStoreDB connection # + +To access your data in SingleStoreDB, create a connection asset for it\. + +SingleStoreDB is a fast, distributed, and highly scalable cloud\-based SQL database\. You can use SingleStoreDB to power real\-time and data\-intensive applications\. + +Use SingleStoreDB and watsonx\.ai for generative AI applications\. Benefits include semantic search, fast ingest, and low\-latency response times for foundation models and traditional machine learning\. + +## Create a connection to SingleStoreDB ## + +To create the connection asset, you need these connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Username and password + * SSL certificate (if required by the database server) + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** +Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** +Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use the SingleStoreDB connection in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Decision Optimization + * SPSS Modeler + + + +**Catalogs** + + + + * Platform assets catalog + + + +## SingleStoreDB setup ## + +To set up SingleStoreDB, see [Getting Started with SingleStoreDB Cloud](https://docs.singlestore.com/cloud/getting-started-with-singlestoredb-cloud/)\. + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the SingleStore Docs [SQL Reference](https://docs.singlestore.com/db/v8.1/reference/sql-reference/) for the correct syntax\. + +## Learn more ## + + + + * [SingleStoreDB Cloud](https://docs.singlestore.com/) + * [SingleStoreDB with IBM](https://www.ibm.com/products/singlestore) for information about the IBM partnership with SingleStoreDB that provides a single source of procurement, support, and security\. + + + +**Parent topic**: [Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8bad741cd92f2db6ab2ce3a3c2d35d000235bfe9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8bad741cd92f2db6ab2ce3a3c2d35d000235bfe9.md new file mode 100644 index 0000000..311e2af --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8bad741cd92f2db6ab2ce3a3c2d35d000235bfe9.md @@ -0,0 +1,19 @@ +# applylinearasnode properties + +# applylinearasnode properties # + +You can use Linear\-AS modeling nodes to generate a Linear\-AS model nugget\. The scripting name of this model nugget is *applylinearasnode*\. For more information on scripting the modeling node itself, see [linearasnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties/linearASslots.html#linearASslots)\. + + + +applylinearasnode Properties + +Table 1\. applylinearasnode Properties + +| `applylinearasnode` Property | Values | Property description | +| ---------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `enable_sql_generation` | `false``native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8bc347015fd7ce2af13b17de4d287471cb994f38.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8bc347015fd7ce2af13b17de4d287471cb994f38.md new file mode 100644 index 0000000..cd63608 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8bc347015fd7ce2af13b17de4d287471cb994f38.md @@ -0,0 +1,11 @@ +# The scripting API + +# The scripting API # + +The Scripting API provides access to a wide range of SPSS Modeler functionality\. All the methods described so far are part of the API and can be accessed implicitly within the script without further imports\. However, if you want to reference the API classes, you must import the API explicitly with the following statement: + + import modeler.api + +This import statement is required by many of the scripting API examples\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8be1a39cdbaaa858051954548474dd3e307b20cb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8be1a39cdbaaa858051954548474dd3e307b20cb.md new file mode 100644 index 0000000..54075ac --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8be1a39cdbaaa858051954548474dd3e307b20cb.md @@ -0,0 +1,139 @@ +# Setting up an AI use case + +# Setting up an AI use case # + +Create an AI use case to define a business problem and track the related AI assets through their lifecycle\. View details about governed assets or generate reports to help meet governance and compliance goals\. + +## Creating AI use cases in an inventory ## + +An inventory presents a view of all the AI use cases that you can access that are assigned to that inventory\. Use multiple inventories to manage groups of AI use cases\. For example, you might create an inventory for governing prompt templates and another for governing machine learning assets\. Add collaborators to inventories so they can view or contribute to AI uses cases\. + +### Before you begin ### + + + + * Enable watsonx\.governance and provision Watson OpenScale\. + * You must have access to an existing inventory or have sufficient access to [create a new inventory](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-inventory-manage.html)\. + + + +For details on watsonx\.governance roles and managing access for governance, see [Collaboration roles for governance](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-collab-roles.html)\. If you do not have sufficient access to create or contribute to an inventory, contact your administrator\. + +## Viewing AI use cases ## + + + +1. Click **AI use cases** from the navigation menu to view all existing AI use cases you can access, or click **Request a model with an AI use case** from the home page\. From the primary view, you can search for a specific use case or filter the view to focus on certain use cases\. For example, filter the view by *Inventory* to view all the AI use cases in a particular inventory\. + + ![Viewing AI use cases in an inventory](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-inv-use-cases.png) +2. Click the name of an AI use case to open it and view the details on these tabs: + + + + * **Overview** shows the essential details for the use case. + * **Lifecycle** shows the assets that are tracked in the use case, which is organized by the phases of the AI lifecycle. + * **Access** lists collaborators for the use case and assigned roles. + + + +3. Click the name of an asset to view the associated factsheet\. + + + +## Generating a report from a use case ## + +You can generate reports from use cases or factsheets to share or preserve records\. By default, the reports generate these default reports: + + + + * **Basic report** contains the set of facts visible on the Overview and Lifecycle tabs\. + * **Full report** contains all facts about the use case and the models, prompt templates, and deployments it contains\. + + + +The inventory admin can customize reports to include custom branding or to change the fields included in reports\. For details, see [Customizing report templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-manage-reports.html)\. To create a report: + + + +1. Open a use case in an inventory\. +2. Click the **Export report** icon to generate a PDF record of the use case\. +3. Choose a format option and export the report\. + + + +## Creating an AI use case ## + + + +1. Click **AI use cases** from the navigation menu\. +2. Click **New AI use case**\. +3. Enter a name and choose an inventory for the use case\. If you do not have access to an inventory, you must create one before you can define a use case\. See [Managing an inventory for AI use cases](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-inventory-manage.html) for details\. +4. Complete optional fields as needed: + + + + + +| Option | Notes | +| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Description | Define the business problem and provide any details about the proposed solution\. | +| Risk level | Assign a risk level that reflects the nature of the business problem and the anticipated solution according to your governance policies\. For example, assign a risk level of *High* for a model that processes sensitive personal data\. | +| Supporting data | Enter links to supporting documents that support or clarify the purpose of the use case | +| Owner | For a use case with multiple owners, you can edit ownership | +| Status | By default, a new AI use case is assigned a status of default, as it is typically waiting for assets to be added for tracking\. You can manually change the status\. For example, change to *Awaiting development* if you do not require any additional review or approval for a requested model\. Change to *Developed* if you already have a model to add to governance\. Review the complete list of status options in the following section\. | +| Tags | Assign or create tags to make your AI use cases easier to find or group\. | + + + +### Use case status details ### + +Update the status field to provide users of the use case an immediate reflection of the current state\. + + + +| Status | Description | +| ----------------------------- | ------------------------------------------------------- | +| Ready for use case approval | Use case is defined and ready for review | +| Use case approved | Use case ready for model or prompt template development | +| Use case rejected | Use case not ready for model or prompt development | +| Awaiting development | Awaiting delivery of AI asset (model or prompt) | +| Development in progress | AI asset (model or prompt) in development | +| Developed | Trained model or prompt template added to use case | +| Ready for AI asset validation | AI asset ready for testing or evaluation | +| Validation complete | AI asset is tested or evaluated | +| Ready for AI asset approval | Waiting for approval to move AI asset to production | +| Promote to production space | AI asset is promoted to a production environment | +| Deployed for operation | AI asset deployed for production | +| In operation | AI asset is live in a production environment | +| Under revision | AI asset requires updating | +| Decommissioned | AI asset removed from production environment | + + + +## Adding collaborators to an AI use case ## + +Add collaborators so they can view or contribute to the AI use case\. + + + +1. From the **Access** tab of the AI use case, click **Add members**\. +2. Search for a member by name or email address\. +3. Assign an access level and click **Add\.** For details on permissions, see [Collaboration roles for governance](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-collab-roles.html)\. + + + +## Next steps ## + +After you create an AI use case, use it to track assets\. Depending on your governance strategy, your next step might be to: + + + + * Send a link to the use case to a reviewer for approval\. + * Send a link to a data scientist to create the requested asset\. + * [Add an asset](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-tracking-overview.html) for tracking in the use case\. + + + +**Parent topic:**[Governing assets in AI use cases](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-use-cases.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8c53bd47030c9bf4e7dbf1ea482cded9cc8abad4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8c53bd47030c9bf4e7dbf1ea482cded9cc8abad4.md new file mode 100644 index 0000000..2122d83 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8c53bd47030c9bf4e7dbf1ea482cded9cc8abad4.md @@ -0,0 +1,11 @@ +# Ensemble node (SPSS Modeler) + +# Ensemble node # + +The Ensemble node combines two or more model nuggets to obtain more accurate predictions than can be gained from any of the individual models\. By combining predictions from multiple models, limitations in individual models may be avoided, resulting in a higher overall accuracy\. Models combined in this manner typically perform at least as well as the best of the individual models and often better\. + +This combining of nodes happens automatically in the Auto Classifier and Auto Numeric automated modeling nodes\. + +After using an Ensemble node, you can use an Analysis node or Evaluation node to compare the accuracy of the combined results with each of the input models\. To do this, make sure the Filter out fields generated by ensembled models option is not selected in the Ensemble node settings\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8c953b2300b547ad82edd9697cab8a5985f5ead3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8c953b2300b547ad82edd9697cab8a5985f5ead3.md new file mode 100644 index 0000000..e98e8c6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8c953b2300b547ad82edd9697cab8a5985f5ead3.md @@ -0,0 +1,83 @@ +# IBM Db2 on Cloud connection + +# IBM Db2 on Cloud connection # + +To access your data in IBM Db2 on Cloud, you must create a connection asset for it\. + +Db2 on Cloud is an SQL database that is managed by IBM Cloud and is provisioned for you in the cloud\. + +## Create a connection to Db2 on Cloud ## + +To create the connection asset, you need the following connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Username and password + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Db2 on Cloud connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Decision Optimization + * Notebooks\. Click **Read data** on the **Code snippets** pane to get the connection credentials and load the data into a data structure\. See [Load data from data source connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html#conns)\. + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Db2 on Cloud setup ## + +[Getting started with Db2 on Cloud](https://cloud.ibm.com/docs/Db2onCloud?topic=Db2onCloud-getting-started) + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [ Structured Query Language (SQL)](https://www.ibm.com/docs/SSFMBX/com.ibm.swg.im.dashdb.sql.ref.doc/doc/c0004100.html) topic in the Db2 on Cloud documentation for the correct syntax\. + +## Learn more ## + + + + * [Db2 on Cloud documentation](https://cloud.ibm.com/docs/Db2onCloud?topic=Db2onCloud-about) + * [SSL connectivity](https://cloud.ibm.com/docs/Db2onCloud?topic=Db2onCloud-ssl_support) + + + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ccc5cd4a9c103249435fc0a7fb18874b447de3d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ccc5cd4a9c103249435fc0a7fb18874b447de3d.md new file mode 100644 index 0000000..4e9c0a8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ccc5cd4a9c103249435fc0a7fb18874b447de3d.md @@ -0,0 +1,7 @@ +# Summary (SPSS Modeler) + +# Summary # + +You've learned how to use the Expert Modeler to produce forecasts for multiple time series\. In a real\-world scenario, you could now transform nonstandard time series data into a format suitable for input to a Time Series node\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8cd81c0f5f84dfe58834aeb8b71e6d7780b8dead.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8cd81c0f5f84dfe58834aeb8b71e6d7780b8dead.md new file mode 100644 index 0000000..b401f7c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8cd81c0f5f84dfe58834aeb8b71e6d7780b8dead.md @@ -0,0 +1,29 @@ +# aggregatenode properties + +# aggregatenode properties # + +![Aggregate node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/aggregatenodeicon.png) The Aggregate node replaces a sequence of input records with summarized, aggregated output records\. + + + +aggregatenode properties + +Table 1\. aggregatenode properties + +| `aggregatenode` properties | Data type | Property description | +| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `keys` | *list* | Lists fields that can be used as keys for aggregation\. For example, if `Sex` and `Region` are your key fields, each unique combination of `M` and `F` with regions `N` and `S` (four unique combinations) will have an aggregated record\. | +| `contiguous` | *flag* | Select this option if you know that all records with the same key values are grouped together in the input (for example, if the input is sorted on the key fields)\. Doing so can improve performance\. | +| `aggregates` | | Structured property listing the numeric fields whose values will be aggregated, as well as the selected modes of aggregation\. | +| `aggregate_exprs` | | Keyed property which keys the derived field name with the aggregate expression used to compute it\. For example:

`aggregatenode.setKeyedPropertyValue ("aggregate_exprs", "Na_MAX", "MAX('Na')")` | +| `extension` | *string* | Specify a prefix or suffix for duplicate aggregated fields\. | +| `add_as` | `Suffix`
`Prefix` | | +| `inc_record_count` | *flag* | Creates an extra field that specifies how many input records were aggregated to form each aggregate record\. | +| `count_field` | *string* | Specifies the name of the record count field\. | +| `allow_approximation` | *Boolean* | Allows approximation of order statistics when aggregation is performed in SPSS Analytic Server\. | +| `bin_count` | *integer* | Specifies the number of bins to use in approximation | +| `aggregate_defaults` | `Mean`
`Sum`
`Min`
`Max`
`SDev`
`Median`
`Count`
`Variance`
`FirstQuartile`
`ThirdQuartile` | Specify the field aggregation mode to use for newly added fields\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ce325d8afc27359968a8799d58ef4bf0c57d68e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ce325d8afc27359968a8799d58ef4bf0c57d68e.md new file mode 100644 index 0000000..85388b3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ce325d8afc27359968a8799d58ef4bf0c57d68e.md @@ -0,0 +1,35 @@ +# Conversion functions (SPSS Modeler) + +# Conversion functions # + +With conversion functions, you can construct new fields and convert the storage type of existing files\. + +For example, you can form new strings by joining strings together or by taking strings apart\. To join two strings, use the operator `><`\. For example, if the field`Site` has the value`"BRAMLEY"`, then `"xx" >< Site` returns `"xxBRAMLEY"`\. The result of`><` is always a string, even if the arguments aren't strings\. Thus, if field `V1` is `3` and field `V2` is `5`, then `V1 >< V2` returns `"35"` (a string, not a number)\. + +Conversion functions (and any other functions that require a specific type of input, such as a date or time value) depend on the current formats specified in the flow properties\. For example, if you want to convert a string field with values *Jan 2021*, *Feb 2021*, and so on, select the matching date format MON YYYY as the default date format for the flow\. + + + +CLEM conversion functions + +Table 1\. CLEM conversion functions + +| Function | Result | Description | +| ------------------------------ | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ITEM1` >< `ITEM2` | *String* | Concatenates values for two fields and returns the resulting string as *ITEM1ITEM2*\. | +| `to_integer(ITEM)` | *Integer* | Converts the storage of the specified field to an integer\. | +| `to_real(ITEM)` | *Real* | Converts the storage of the specified field to a real\. | +| `to_number(ITEM)` | *Number* | Converts the storage of the specified field to a number\. | +| `to_string(ITEM)` | *String* | Converts the storage of the specified field to a string\. When a real is converted to string using this function, it returns a value with 6 digits after the radix point\. | +| `to_time(ITEM)` | *Time* | Converts the storage of the specified field to a time\. | +| `to_date(ITEM)` | *Date* | Converts the storage of the specified field to a date\. | +| `to_timestamp(ITEM)` | *Timestamp* | Converts the storage of the specified field to a timestamp\. | +| `to_datetime(ITEM)` | *Datetime* | Converts the storage of the specified field to a date, time, or timestamp value\. | +| `datetime_date(ITEM)` | *Date* | Returns the date value for a *number*, *string*, or *timestamp*\. Note this is the only function that allows you to convert a number (in seconds) back to a date\. If `ITEM` is a string, creates a date by parsing a string in the current date format\. The date format specified in the flow properties must be correct for this function to be successful\. If `ITEM` is a number, it's interpreted as a number of seconds since the base date (or epoch)\. Fractions of a day are truncated\. If `ITEM` is a timestamp, the date part of the timestamp is returned\. If `ITEM` is a date, it's returned unchanged\. | +| `stb_centroid_latitude(ITEM)` | *Integer* | Returns an integer value for latitude corresponding to centroid of the geohash argument\. | +| `stb_centroid_longitude(ITEM)` | *Integer* | Returns an integer value for longitude corresponding to centroid of the geohash argument\. | +| `to_geohash(ITEM)` | *String* | Returns the geohashed string corresponding to the latitude and longitude using the specified number of bits for the density\. A geohash is a code used to identify a set of geographic coordinates based on the latitude and longitude details\. The three parameters for `to_geohash` are:



* latitude: Range (\-180, 180), and units are degrees in the WGS84 coordinate system
* longitude: Range (\-90, 90), and units are degrees in the WGS84 coordinate system
* bits: The number of bits to use to store the hash\. Range \[1,75\]\. This affects both the length of the returned string (1 character is used for every 5 bits), and the accuracy of the hash\. For example, 5 bits (1 character) represents approximately 2500 kilometers, or 45 bits (9 characters), represents approximately 2\.3 meters\.


| + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ce361c94fab69503049ea703fd6d5a53cd81057.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ce361c94fab69503049ea703fd6d5a53cd81057.md new file mode 100644 index 0000000..f919cd7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ce361c94fab69503049ea703fd6d5a53cd81057.md @@ -0,0 +1,7 @@ +# Record Operations node properties + +# Record Operations node properties # + +Refer to this section for a list of available properties for Record Operations nodes\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8cf8260d0474ad73d9878ccd361c83102b724733.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8cf8260d0474ad73d9878ccd361c83102b724733.md new file mode 100644 index 0000000..ef9cc57 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8cf8260d0474ad73d9878ccd361c83102b724733.md @@ -0,0 +1,296 @@ +# Configuring pipeline nodes + +# Configuring pipeline nodes # + +Configure the nodes of your pipeline to specify inputs and to create outputs as part of your pipeline\. + +## Specifying the workspace scope ## + +By default, the scope for a pipeline is the project that contains the pipeline\. You can explicitly specify a scope other than the default, to locate an asset used in the pipeline\. The scope is the project, catalog, or space that contains the asset\. From the user interface, you can browse for the scope\. + +## Changing the input mode ## + +When you are configuring a node, you can specify any resources that include data and notebooks in various ways\. Such as directly entering a name or ID, browsing for an asset, or by using the output from a prior node in the pipeline to populate a field\. To see what options are available for a field, click the input icon for the field\. Depending on the context, options can include: + + + + * Select resource: use the asset browser to find an asset such as a data file\. + * Assign pipeline parameter: assign a value by using a variable configured with a pipeline parameter\. For more information, see [Configuring global objects](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-flow-param.html)\. + * Select from another node: use the output from a node earlier in the pipeline as the value for this field\. + * Enter the expression: enter code to assign values or identify resources\. For more information, see [Coding elements](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-expr-builder.html)\. + + + +## Pipeline nodes and parameters ## + +Configure the following types of pipeline nodes: + +## Copy nodes ## + +Use Copy nodes to add assets to your pipeline or to export pipeline assets\. + + + + * Copy assets + + Copy selected assets from a project or space to a nonempty space. You can copy these assets to a space: - AutoAI experiment - Code package job - Connection - Data Refinery flow - Data Refinery job - Data asset - Deployment job - Environment - Function - Job - Model - Notebook - Notebook job - Pipelines job - Script - Script job - SPSS Modeler job \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|Source assets \|Browse or search for the source asset to add to the list. You can also specify an asset with a pipeline parameter, with the output of another node, or by entering the asset ID\| \|Target\|Browse or search for the target space\| \|Copy mode\|Choose how to handle a case where the flow tries to copy an asset and one of the same name exists. One of: `ignore`, `fail`, `overwrite`\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|Output assets \|List of copied assets\| + + + + + + * Export assets + + Export selected assets from the scope, for example, a project or deployment space. The operation exports all the assets by default. You can limit asset selection by building a list of resources to export. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|Assets \|Choose **Scope** to export all exportable items or choose **List** to create a list of specific items to export\| \|Source project or space \|Name of project or space that contains the assets to export\| \|Exported file \|File location for storing the export file\| \|Creation mode (optional)\|Choose how to handle a case where the flow tries to create an asset and one of the same name exists. One of: `ignore`, `fail`, `overwrite`\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|Exported file\|Path to exported file\| **Notes:** - If you export a project that contains a notebook, the latest version of the notebook is included in the export file. If the Pipeline with the **Run notebook job** node was configured to use a different notebook version other than the latest version, the exported Pipeline is automatically reconfigured to use the latest version when imported. This might produce unexpected results or require some reconfiguration after the import. - If assets are self-contained in the exported project, they are retained when you import a new project. Otherwise, some configuration might be required following an import of exported assets. + + + + + + * Import assets + + Import assets from a ZIP file that contains exported assets. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|Path to import target \|Browse or search for the assets to import\| \|Archive file to import \|Specify the path to a ZIP file or archive\| **Notes:** After you import a file, paths and references to the imported assets are updated, following these rules: - References to assets from the exported project or space are updated in the new project or space after the import. - If assets from the exported project refer to external assets (included in a different project), the reference to the external asset will persist after the import. - If the external asset no longer exists, the parameter is replaced with an empty value and you must reconfigure the field to point to a valid asset. + + + +## Create nodes ## + +Configure the nodes for creating assets in your pipeline\. + + + + * Create AutoAI experiment + + Use this node to train an [AutoAI classification or regression experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) and generate model-candidate pipelines. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|AutoAI experiment name\|Name of the new experiment\| \|Scope\|A project or a space, where the experiment is going to be created\| \|Prediction type\|The type of model for the following data: binary, classification, or regression\| \|Prediction column (label)\|The prediction column name\| \|Positive class (optional)\|Specify a positive class for a binary classification experiment\| \|Training data split ratio (optional)\|The percentage of data to hold back from training and use to test the pipelines(float: 0.0 - 1.0)\| \|Algorithms to include (optional)\|Limit the list of estimators to be used (the list depends on the learning type)\| \|Algorithms to use\|Specify the list of estimators to be used (the list depends on the learning type)\| \|Optimize metric (optional)\| The metric used for model ranking\| \|Hardware specification (optional)\|Specify a hardware specification for the experiment\| \|AutoAI experiment description\|Description of the experiment\| \|AutoAI experiment tags (optional)\|Tags to identify the experiment\| \|Creation mode (optional)\|Choose how to handle a case where the pipeline tries to create an experiment and one of the same name exists. One of: `ignore`, `fail`, `overwrite`\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|AutoAI experiment\|Path to the saved model\| + + + + + + * Create AutoAI time series experiment + + Use this node to train an [AutoAI time series experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) and generate model-candidate pipelines. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|AutoAI time series experiment name\|Name of the new experiment\| \|Scope\|A project or a space, where the pipeline is going to be created\| \|Prediction columns (label)\|The name of one or more prediction columns\| \|Date/time column (optional)\|Name of date/time column\| \|Leverage future values of supporting features\|Choose "True" to enable the consideration for supporting (exogenous) features to improve the prediction. For example, include a temperature feature for predicting ice cream sales.\| \|Supporting features (optional)\|Choose supporting features and add to list\| \|Imputation method (optional)\|Choose a technique for imputing missing values in a data set\| \|Imputation threshold (optional)\|Specify an higher threshold for percentage of missing values to supply with the specified imputation method. If the threshold is exceeded, the experiment fails. For example, if you specify that 10% of values can be imputed, and the data set is missing 15% of values, the experiment fails.\| \|Fill type\|Specify how the specified imputation method fill null values. Choose to supply a mean of all values, and median of all values, or specify a fill value.\| \|Fill value (optional)\|If you selected to sepcify a value for replacing null values, enter the value in this field.\| \|Final training data set\|Choose whether to train final pipelines with just the training data or with training data and holdout data. If you choose training data, the generated notebook includes a cell for retrieving holdout data\| \|Holdout size (optional)\|If you are splitting training data into training and holdout data, specify a percentage of the training data to reserve as holdout data for validating the pipelines. Holdout data does not exceed a third of the data.\| \|Number of backtests (optional)\|Customize the backtests to cross-validate your time series experiment\| \|Gap length (optional)\|Adjust the number of time points between the training data set and validation data set for each backtest. When the parameter value is non-zero, the time series values in the gap is not used to train the experiment or evaluate the current backtest.\| \|Lookback window (optional)\|A parameter that indicates how many previous time series values are used to predict the current time point.\| \|Forecast window (optional)\|The range that you want to predict based on the data in the lookback window.\| \|Algorithms to include (optional)\|Limit the list of estimators to be used (the list depends on the learning type)\| \|Pipelines to complete\|Optionally adjust the number of pipelines to create. More pipelines increase training time and resources.\| \|Hardware specification (optional)\|Specify a hardware specification for the experiment\| \|AutoAI time series experiment description (optional)\|Description of the experiment\| \|AutoAI experiment tags (optional)\|Tags to identify the experiment\| \|Creation mode (optional)\|Choose how to handle a case where the pipeline tries to create an experiment and one of the same name exists. One of: `ignore`, `fail`, `overwrite`\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|AutoAI time series experiment\|Path to the saved model\| + + + + + + * Create batch deployment + + Use this node to create a batch deployment for a machine learning model. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|ML asset\|Name or ID of the machine learning asset to deploy\| \|New deployment name (optional)\|Name of the new job, with optional description and tags\| \|Creation mode (optional)\|How to handle a case where the pipeline tries to create a job and one of the same name exists. One of: `ignore`, `fail`, `overwrite`\| \|New deployment description (optional)\| Description of the deployment\| \|New deployment tags (optional)\| Tags to identify the deployment\| \|Hardware specification (optional)\|Specify a hardware specification for the job\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|New deployment\| Path of the newly created deployment\| + + + + + + * Create data asset + + Use this node to create a data asset. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|File \|Path to file in a file storage\| \|Target scope\| Path to the target space or project\| \|Name (optional)\|Name of the data source with optional description, country of origin, and tags\| \|Description (optional)\| Description for the asset\| \|Origin country (optional)\|Origin country for data regulations\| \|Tags (optional)\| Tags to identify assets\| \|Creation mode\|How to handle a case where the pipeline tries to create a job and one of the same name exists. One of: `ignore`, `fail`, `overwrite`\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|Data asset\|The newly created data asset\| + + + + + + * Create deployment space + + Use this node to create and configure a space that you can use to organize and create deployments. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|New space name\|Name of the new space with optional description and tags\| \|New space tags (optional)\| Tags to identify the space\| \|New space COS instance CRN \|CRN of the COS service instance\| \|New space WML instance CRN (optional)\|CRN of the Watson Machine Learning service instance\| \|Creation mode (optional)\|How to handle a case where the pipeline tries to create a space and one of the same name exists. One of: `ignore`, `fail`, `overwrite`\| \|Space description (optional)\|Description of the space\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|Space\|Path of the newly created space\| + + + + + + * Create online deployment + + Use this node to create an online deployment where you can submit test data directly to a web service REST API endpoint. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|ML asset\|Name or ID of the machine learning asset to deploy\| \|New deployment name (optional)\|Name of the new job, with optional description and tags\| \|Creation mode (optional)\|How to handle a case where the pipeline tries to create a job and one of the same name exists. One of: `ignore`, `fail`, `overwrite`\| \|New deployment description (optional)\| Description of the deployment\| \|New deployment tags (optional)\| Tags to identify the deployment\| \|Hardware specification (optional)\|Specify a hardware specification for the job\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|New deployment\| Path of the newly created deployment\| + + + +## Wait ## + +Use nodes to pause a pipeline until an asset is available in the location that is specified in the path\. + + + + * Wait for all results + + Use this node to wait until all results from the previous nodes in the pipeline are available so the pipeline can continue. This node takes no inputs and produces no output. When the results are all available, the pipeline continues automatically. + + + + + + * Wait for any result + + Use this node to wait until any result from the previous nodes in the pipeline is available so the pipeline can continue. Run the downstream nodes as soon as any of the upstream conditions are met. This node takes no inputs and produces no output. When any results are available, the pipeline continues automatically. + + + + + + * Wait for file + + Wait for an asset to be created or updated in the location that is specified in the path from a job or process earlier in the pipeline. Specify a timeout length to wait for the condition to be met. If 00:00:00 is the specified timeout length, the flow waits indefinitely. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|File location\|Specify the location in the asset browser where the asset resides. Use the format `data_asset/filename` where the path is relative to the root. The file must exist and be in the location you specify or the node fails with an error. \| \|Wait mode\| By default the mode is for the file to appear. You can change to waiting for the file to disappear\| \|Timeout length (optional)\|Specify the length of time to wait before you proceed with the pipeline. Use the format `hh:mm:ss`\| \|Error policy (optional)\| See [Handling errors](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-errors.html)\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|Return value\|Return value from the node\| \|Execution status\| Returns a value of: Completed, Completed with warnings, Completed with errors, Failed, or Canceled\| \|Status message\| Message associated with the status\| + + + +## Control nodes ## + +Control the pipeline by adding error handling and logic\. + + + + * Loops + + Loops are a node in a Pipeline that operates like a coded loop. The two types of loops are parallel and sequential. You can use loops when the number of iterations for an operation is dynamic. For example, if you don't know the number of notebooks to process, or you want to choose the number of notebooks at run time, you can use a loop to iterate through the list of notebooks. You can also use a loop to iterate through the output of a node or through elements in a data array. \#\#\# Loops in parallel Add a parallel looping construct to the pipeline. A parallel loop runs the iterating nodes independently and possibly simultaneously. For example, to train a machine learning model with a set of hyperparameters to find the best performer, you can use a loop to iterate over a list of hyperparameters to train the notebook variations in parallel. The results can be compared later in the flow to find the best notebook. To see limits on the number of loops you can run simultaneously, see [Limitations](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/known-issues.html#pipeline-issues). \#\#\#\# Input parameters when iterating List types \|Parameter\|Description\| \|---\|---\| \|List input\| The *List input* parameter contains two fields, the data type of the list and the list content that the loop iterates over or a standard link to pipeline input or pipeline output.\| \|Parallelism \|Maximum number of tasks to be run simultaneously. Must be greater than zero\| \#\#\#\# Input parameters when iterating String types \|Parameter\|Description\| \|---\|---\| \|Text input\| Text data that the loop reads from\| \|Separator\| A char used to split the text \| \|Parallelism (optional)\| Maximum number of tasks to be run simultaneously. Must be greater than zero\| If the input array element type is JSON or any type that is represented as such, this field might decompose it as dictionary. Keys are the original element keys and values are the aliases for output names. \#\#\# Loops in sequence Add a sequential loop construct to the pipeline. Loops can iterate over a numeric range, a list, or text with a delimiter. A use case for sequential loops is if you want to try an operation 3 time before you determine whether an operation failed. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|List input\| The *List input* parameter contains two fields, the data type of the list and the list content that the loop iterates over or a standard link to pipeline input or pipeline output.\| \|Text input\| Text data that the loop reads from. Specify a character to split the text.\| \|Range\| Specify the start, end, and optional step for a range to iterate over. The default step is 1.\| After you configure the loop iterative range, define a subpipeline flow inside the loop to run until the loop is complete. For example, it can invoke notebook, script, or other flow per iteration. \#\#\# Terminate loop In a parallel or sequential loop process flow, you can add a **Terminate pipeline** node to end the loop process anytime. You must customize the conditions for terminating. Attention: If you use the Terminate loop node, your loop cancels any ongoing tasks and terminates without completing its iteration. + + + + + + * Set user variables + + Configure a user variable with a key/value pair, then add the list of dynamic variables for this node. For more information on how to create a user variable, see [Configuring global objects](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-flow-param.html). \#\#\#\# Input parameters x \|Parameter\|Description\| \|---\|---\| \|Name\| Enter the name, or key, for the variable\| \|Input type\|Choose Expression or Pipeline parameter as the input type. - For expressions, use the built-in Expression Builder to create a variable that results from a custom expression. - For pipeline parameters, assign a pipeline parameter and use the parameter value as input for the user variable. + + + + + + * Terminate pipeline + + You can initiate and control the termination of a pipeline with a Terminate pipeline node from the Control category. When the error flow runs, you can optionally specify how to handle notebook or training jobs that were initiated by nodes in the pipeline. You must specify whether to wait for jobs to finish, cancel the jobs then stop the pipeline, or stop everything without canceling. Specify the options for the Terminate pipeline node. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|Terminator mode (optional)\| Choose the behavior for the error flow\| Terminator mode can be: - **Terminate pipeline run and all running jobs** stops all jobs and stops the pipeline. - **Cancel all running jobs then terminate pipeline** cancels any running jobs before stopping the pipeline. - **Terminate pipeline run after running jobs finish** waits for running jobs to finish, then stops the pipeline. - **Terminate pipeline that is run without stopping jobs** stops the pipeline but allows running jobs to continue. + + + +## Update nodes ## + +Use update nodes to replace or update assets to improve performance\. For example, if you want to standardize your tags, you can update to replace a tag with a new tag\. + + + + * Update AutoAI experiment + + Update the training details for an [AutoAI experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html). \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|AutoAI experiment\|Path to a project or a space, where the experiment resides\| \|AutoAI experiment name (optional)\| Name of the experiment to be updated, with optional description and tags\| \|AutoAI experiment description (optional)\|Description of the experiment\| \|AutoAI experiment tags (optional)\|Tags to identify the experiment\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|AutoAI experiment\|Path of the updated experiment\| + + + + + + * Update batch deployment + + Use these parameters to update a batch deployment. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|Deployment\| Path to the deployment to be updated\| \|New name for the deployment (optional)\|Name or ID of the deployment to be updated \| \|New description for the deployment (optional)\|Description of the deployment\| \|New tags for the deployment (optional)\| Tags to identify the deployment\| \|ML asset\|Name or ID of the machine learning asset to deploy\| \|Hardware specification\|Update the hardware specification for the job\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|Deployment\|Path of the updated deployment\| + + + + + + * Update deployment space + + Update the details for a space. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|Space\|Path of the existing space\| \|Space name (optional)\|Update the space name\| \|Space description (optional)\|Description of the space\| \|Space tags (optional)\|Tags to identify the space\| \|WML Instance (optional)\| Specify a new Machine Learning instance\| \|WML instance\| Specify a new Machine Learning instance. **Note:** Even if you assign a different name for an instance in the UI, the system name is **Machine Learning instance**. Differentiate between different instances by using the instance CRN\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|Space\|Path of the updated space\| + + + + + + * Update online deployment + + Use these parameters to update an online deployment (web service). \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|Deployment\|Path of the existing deployment\| \|Deployment name (optional)\|Update the deployment name\| \|Deployment description (optional)\|Description of the deployment\| \|Deployment tags (optional)\|Tags to identify the deployment\| \|Asset (optional)\|Machine learning asset (or version) to be redeployed\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|Deployment\|Path of the updated deployment\| + + + +## Delete nodes ## + +Configure parameters for delete operations\. + + + + * Delete + + You can delete: - AutoAI experiment - Batch deployment - Deployment space - Online deployment For each item, choose the asset for deletion. + + + +## Run nodes ## + +Use these nodes to train an experiment, execute a script, or run a data flow\. + + + + * Run AutoAI experiment + + Trains and stores [AutoAI experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) pipelines and models. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|AutoAI experiment\|Browse for the ML Pipeline asset or get the experiment from a pipeline parameter or the output from a previous node. \| \|Training data asset\|Browse or search for the data to train the experiment. Note that you can supply data at runtime by using a pipeline parameter\| \|Holdout data asset (optional)\|Optionally choose a separate file to use for holdout data for testingmodel performance\| \|Models count (optional)\| Specify how many models to save from best performing pipelines. The limit is 3 models\| \|Run name (optional)\|Name of the experiment and optional description and tags\| \|Model name prefix (optional)\| Prefix used to name trained models. Defaults to <(experiment name)> \| \|Run description (optional)\| Description of the new training run\| \|Run tags (optional)\| Tags for new training run\| \|Creation mode (optional)\| Choose how to handle a case where the pipeline flow tries to create an asset and one of the same name exists. One of: `ignore`, `fail`, `overwrite`\| \|Error policy (optional)\| Optionally, override the default error policy for the node\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|Models \| List of paths of highest *N* trained and persisted model (ordered by selected evaluation metric)\| \|Best model \| path of the winning model (based on selected evaluation metric)\| \|Model metrics \| a list of trained model metrics (each item is a nested object with metrics like: holdout\_accuracy, holdout\_average\_precision, ...)\| \|Winning model metric \|elected evaluation metric of the winning model\| \|Optimized metric\| Metric used to tune the model\| \|Execution status\| Information on the state of the job: pending, starting, running, completed, canceled, or failed with errors\| \|Status message\|Information about the state of the job\| + + + + + + * Run Bash script + + Run an inline Bash script to automate a function or process for the pipeline. You can enter the Bash script code manually, or you can import the bash script from a resource, pipeline parameter, or the output of another node. You can also use a Bash script to process large output files. For example, you can generate a large, comma-separated list that you can then iterate over using a loop. In the following example, the user entered the inline script code manually. The script uses the `cpdctl` tool to search all notebooks with a set variable tag and aggregates the results in a JSON list. The list can then be used in another node, such as running the notebooks returned from the search. ![Example of a bash script node](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/pipeline-config-4.png)\{: height="50%" width="50%"\} \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|Inline script code\|Enter a Bash script in the inline code editor. *Optional:* Alternatively, you can select a resource, assign a pipeline parameter, or select from another node. \| \|Environment variables (optional)\| Specify a variable name (the key) and a data type and add to the list of variables to use in the script.\| \|Runtime type (optional)\| Select either use standalone runtime (default) or a shared runtime. Use a shared runtime for tasks that require running in shared pods. \| \|Error policy (optional)\| Optionally, override the default error policy for the node\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|Output variables \|Configure a key/value pair for each custom variable, then click the Add button to populate the list of dynamic variables for the node\| \|Return value\|Return value from the node\| \|Standard output\|Standard output from the script\| \|Execution status\|Information on the state of the job: pending, starting, running, completed, canceled, or failed with errors\| \|Status message\| Message associated with the status\| \#\#\#\# Rules for Bash script output The output for a Bash script is often the result of a computed expression and can be large. When you are reviewing the properties for a script with valid large output, you can preview or download the output in a viewer. These rules govern what type of large output is valid. - The output of a `list_expression` is a calculated expression, so it is valid a large output. - String output is treated as a literal value rather than a calculated expression, so it must follow the size limits that govern inline expressions. For example, you are warned when a literal value exceeds 1 KB and values of 2 KB and higher result in an error. \#\#\#\# Referencing a variable in a Bash script The way that you reference a variable in a script depends on whether the variable was created as an input variable or as an output variable. Output variables are created as a file and require a file path in the reference. Specifically: - Input variables are available using the assigned name - Output variable names require that `_PATH` be appended to the variable name to indicate that values have to be written to the output file pointed by the `{output_name}_PATH` variable. \#\#\#\# Using SSH in Bash scripts + The following steps describe how to use `ssh` to run your remote Bash script. 1. Create a private key and public key. + `bash ssh-keygen -t rsa -C "XXX"` 2. Copy the public key to the remote host. + `bash ssh-copy-id USER@REMOTE_HOST` 3. On the remote host, check whether the public key contents are added into `/root/.ssh/authorized_keys`. + 4. Copy the public and private keys to a new directory in the **Run Bash script** node. `bash mkdir -p $HOME/.ssh #copy private key content echo "-----BEGIN OPENSSH PRIVATE KEY----- ... ... -----END OPENSSH PRIVATE KEY-----" > $HOME/.ssh/id_rsa #copy public key content echo "ssh-rsa ...... " > $HOME/.ssh/id_rsa.pub chmod 400 $HOME/.ssh/id_rsa.pub chmod 400 $HOME/.ssh/id_rsa ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o GlobalKnownHostsFile=/dev/null -i $HOME/.ssh/id_rsa USER@REMOTE_HOST "cd /opt/scripts; ls -l; sh 1.sh"` \#\#\#\# Using SSH utilities in Bash scripts + The following steps describe how to use `sshpass` to run your remote Bash script. 1. Put your SSH password file in your system path, such as the mounted storage volume path. 2. Use the SSH password directly in the **Run Bash script** node: `bash cd /mnts/orchestration ls -l sshpass chmod 777 sshpass ./sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no USER@REMOTE_HOST "cd /opt/scripts; ls -l; sh 1.sh"` + + + + + + * Run batch deployment + + Configure this node to run selected deployment jobs. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|Deployment\|Browse or search for the deployment job \| \|Input data assets\|Specify the data used for the batch job + Restriction: Input for batch deployment jobs is limited to data assets. Deployments that require JSON input or multiple files as input, are not supported. For example, SPSS models and Decision Optimization solutions that require multiple files as input are not supported.\| \|Output asset\|Name of the output file for the results of the batch job. You can either select *Filename* and enter a custom file name, or *Data asset* and select an existing asset in a space.\| \|Hardware specification (optional)\|Browse for a hardware specification to apply for the job\| \|Error policy (optional)\| Optionally, override the default error policy for the node\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|Job\|Path to the file with results from the deployment job\| \|Job run\|ID for the job\| \|Execution status\|Information on the state of the job: pending, starting, running, completed, canceled, or failed with errors\| \|Status message\| Information about the state of the job\| + + + + + + * Run DataStage job + + + + + + * Run Data Refinery job + + This node runs a specified Data Refinery job. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|Data Refinery job \|Path to the Data Refinery job.\| \|Environment \| Path of the environment used to run the job Attention: Leave the environments field as is to use the default runtime. If you choose to override, specify an alternate environment for running the job. Be sure any environment that you specify is compatible with the component language and hardware configuration to avoid a runtime error.\| \|Error policy (optional)\| Optionally, override the default error policy for the node\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|Job \|Path to the results from the Data Refinery job\| \|Job run\|Information about the job run\| \|Job name \|Name of the job \| \|Execution status\|Information on the state of the flow: pending, starting, running, completed, canceled, or failed with errors\| \|Status message\| Information about the state of the flow\| + + + + + + * Run notebook job + + Use these configuration options to specify how to run a Jupyter Notebook in a pipeline. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|Notebook job\|Path to the notebook job. \| \|Environment \|Path of the environment used to run the notebook. Attention: Leave the environments field as is to use the default environment. If you choose to override, specify an alternate environment for running the job. Be sure any environment that you specify is compatible with the notebook language and hardware configuration to avoid a runtime error.\| \|Environment variables (optional)\|List of environment variables used to run the notebook job\| \|Error policy (optional)\| Optionally, override the default error policy for the node\| **Notes:** - Environment variables that you define in a pipeline cannot be used for notebook jobs you run outside of Watson Pipelines. - You can run a notebook from a code package in a regular package. \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|Job \|Path to the results from the notebook job\| \|Job run\|Information about the job run\| \|Job name \|Name of the job \| \|Output variables \|Configure a key/value pair for each custom variable, then click **Add** to populate the list of dynamic variables for the node\| \|Execution status\|Information on the state of the run: pending, starting, running, completed, canceled, or failed with errors\| \|Status message\|Information about the state of the notebook run\| + + + + + + * Run Pipelines component + + Run a reusable pipeline component that is created by using a Python script. For more information, see [Creating a custom component](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-custom-comp.html). - If a pipeline component is available, configuring the node presents a list of available components. - The component that you choose specifies the input and output for the node. - Once you assign a component to a node, you cannot delete or change the component. You must delete the node and create a new one. + + + + + + * Run Pipelines job + + Add a pipeline to run a nested pipeline job as part of a containing pipeline. This is a way of adding reusable processes to multiple pipelines. You can use the output from a nested pipeline that is run as input for a node in the containing pipeline. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|Pipelines job\|Select or enter a path to an existing Pipelines job.\| \|Environment (optional)\| Select the environment to run the Pipelines job in, and assign environment resources. Attention: Leave the environments field as is to use the default runtime. If you choose to override, specify an alternate environment for running the job. Be sure any environment that you specify is compatible with the component language and hardware configuration to avoid a runtime error.\| \|Job Run Name (optional) \|A default job name is used unless you override it by specifying a custom job name. You can see the job name in the **Job Details** dashboard.\| \|Values for local parameters (optional) \| Edit the default job parameters. This option is available only if you have local parameters in the job. \| \|Values from parameter sets (optional) \|Edit the parameter sets used by this job. You can choose to use the parameters as defined by default, or use value sets from other pipelines' parameters. \| \|Error policy (optional)\| Optionally, override the default error policy for the node\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|Job \|Path to the results from the pipeline job\| \|Job run\|Information about the job run\| \|Job name \|Name of the job \| \|Execution status\| Returns a value of: Completed, Completed with warnings, Completed with errors, Failed, or Canceled\| \|Status message\| Message associated with the status\| \#\#\#\# Notes for running nested pipeline jobs If you create a pipeline with nested pipelines and run a pipeline job from the top-level, the pipelines are named and saved as project assets that use this convention: - The top-level pipeline job is named "Trial job - *pipeline guid*". - All subsequent jobs are named "pipeline\_ *pipeline guid*". + + + + + + * Run SPSS Modeler job + + Use these configuration options to specify how to run an SPSS Modeler in a pipeline. \#\#\#\# Input parameters \|Parameter\|Description\| \|---\|---\| \|SPSS Modeler job\|Select or enter a path to an existing SPSS Modeler job.\| \|Environment (optional)\| Select the environment to run the SPSS Modeler job in, and assign environment resources. Attention: Leave the environments field as is to use the default SPSS Modeler runtime. If you choose to override, specify an alternate environment for running the job. Be sure any environment that you specify is compatible with the hardware configuration to avoid a runtime error.\| \|Values for local parameters \| Edit the default job parameters. This option is available only if you have local parameters in the job. \| \|Error policy (optional)\| Optionally, override the default error policy for the node\| \#\#\#\# Output parameters \|Parameter\|Description\| \|---\|---\| \|Job \|Path to the results from the pipeline job\| \|Job run\|Information about the job run\| \|Job name \|Name of the job \| \|Execution status\| Returns a value of: Completed, Completed with warnings, Completed with errors, Failed, or Canceled\| \|Status message\| Message associated with the status\| + + + +## Learn more ## + +**Parent topic:**[Creating a pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-create.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8d2b29253c00ae6a20730d0c9ad3284dc0fcabf5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8d2b29253c00ae6a20730d0c9ad3284dc0fcabf5.md new file mode 100644 index 0000000..7a625d3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8d2b29253c00ae6a20730d0c9ad3284dc0fcabf5.md @@ -0,0 +1,85 @@ +# Regional availability for services and features + +# Regional availability for services and features # + +IBM watsonx is deployed on the IBM Cloud multi\-zone region network\. The availability of services and features can vary across regional data centers\. + +You can view the regional availability for every service in the [Services catalog](https://dataplatform.cloud.ibm.com/data/catalog?target=services&context=wx)\. + +## Regional availability of the Watson Studio and Watson Machine Learning services ## + +Watsonx\.ai includes the Watson Studio and Watson Machine Learning services to provide foundation and machine learning model tools\. + +The Watson Studio and Watson Machine Learning services are available in the following regional data centers: + + + + * Dallas (us\-south), in Texas US + * Frankfurt (eu\-de), in Germany + + + +### Regional availability of foundation models ### + +The following table shows the IBM Cloud data centers where each foundation model is available\. A checkmark indicates that the model is hosted in the region\. + + + +Table 1\. IBM Cloud data center support + +| Model name | Dallas | Frankfurt | +| -------------------------- | ------ | --------- | +| flan\-t5\-xl\-3b | ✓ | | +| flan\-t5\-xxl\-11b | ✓ | ✓ | +| flan\-ul2\-20b | ✓ | ✓ | +| gpt\-neox\-20b | ✓ | ✓ | +| granite\-13b\-chat\-v2 | ✓ | ✓ | +| granite\-13b\-chat\-v1 | ✓ | ✓ | +| granite\-13b\-instruct\-v2 | ✓ | ✓ | +| granite\-13b\-instruct\-v1 | ✓ | ✓ | +| llama\-2\-13b\-chat | ✓ | ✓ | +| llama\-2\-70b\-chat | ✓ | ✓ | +| mpt\-7b\-instruct2 | ✓ | ✓ | +| mt0\-xxl\-13b | ✓ | ✓ | +| starcoder\-15\.5b | ✓ | ✓ | + + + +### Tool and environment limitations for the Frankfurt region ### + + + +Table 2\. Frankfurt regional limitations + +| Service | Limitation | +| ------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| Watson Studio | If you need a Spark runtime, you must use the [Spark environment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/jupyter-spark.html) in Watson Studio for the SPSS Modeler and notebook editor tools\. | +| Watson Studio | [Synthetic Data Generator](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/synthetic_data_overview_sd.html) is not supported\. | +| Watson Studio | [Tuning Studio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-studio.html) is not supported\. | + + + +## Regional availability of watsonx\.governance ## + +Watsonx\.governance Lite and Essentials plans are available only in the Dallas region\. + +## Regional availability of Watson OpenScale ## + +Watson OpenScale legacy plans are available only in the Frankfurt region\. + +## Regional availability of the Cloud Object Storage service ## + +The region for the Cloud Object Storage service is **Global**\. Cloud Object Storage buckets for workspaces are Regional buckets\. For more information, see [IBM Cloud docs: Cloud Object Storage endpoints and storage locations](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-endpoints)\. + +## Learn more ## + + + + * [IBM Cloud docs: IBM Cloud global data centers](https://www.ibm.com/cloud/data-centers) + * [Services in the IBM watsonx catalog](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/cloud-services.html) + + + +**Parent topic:**[Services and integrations](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/svc-int.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8d328fc36822024d739f83a36fef66e5abe61128.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8d328fc36822024d739f83a36fef66e5abe61128.md new file mode 100644 index 0000000..e9ed176 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8d328fc36822024d739f83a36fef66e5abe61128.md @@ -0,0 +1,23 @@ +# appendnode properties + +# appendnode properties # + +![Append node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/appendnodeicon.png) The Append node concatenates sets of records\. It's useful for combining datasets with similar structures but different data\. + + + +appendnode properties + +Table 1\. appendnode properties + +| `appendnode` properties | Data type | Property description | +| ----------------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------- | +| `match_by` | `Position``Name` | You can append datasets based on the position of fields in the main data source or the name of fields in the input datasets\. | +| `match_case` | *flag* | Enables case sensitivity when matching field names\. | +| `include_fields_from` | `Main``All` | | +| `create_tag_field` | *flag* | | +| `tag_field_name` | *string* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8daa2c34d27a7e09c0ab837c191e87f320790f75.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8daa2c34d27a7e09c0ab837c191e87f320790f75.md new file mode 100644 index 0000000..3f77487 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8daa2c34d27a7e09c0ab837c191e87f320790f75.md @@ -0,0 +1,38 @@ +# histogramnode properties + +# histogramnode properties # + +![Histogram node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/histogramnodeicon.png)The Histogram node shows the occurrence of values for numeric fields\. It's often used to explore the data before manipulations and model building\. Similar to the Distribution node, the Histogram node frequently reveals imbalances in the data\. + + + +histogramnode properties + +Table 1\. histogramnode properties + +| `histogramnode` properties | Data type | Property description | +| -------------------------- | ------------------------ | ------------------------------------------------------------------------------- | +| `field` | *field* | | +| `color_field` | *field* | | +| `panel_field` | *field* | | +| `animation_field` | *field* | | +| `range_mode` | `Automatic``UserDefined` | | +| `range_min` | *number* | | +| `range_max` | *number* | | +| `bins` | `ByNumber``ByWidth` | | +| `num_bins` | *number* | | +| `bin_width` | *number* | | +| `normalize` | *flag* | | +| `separate_bands` | *flag* | | +| `x_label_auto` | *flag* | | +| `x_label` | *string* | | +| `y_label_auto` | *flag* | | +| `y_label` | *string* | | +| `use_grid` | *flag* | | +| `graph_background` | *color* | Standard graph colors are described at the beginning of this section\. | +| `page_background` | *color* | Standard graph colors are described at the beginning of this section\. | +| `normal_curve` | *flag* | Indicates whether the normal distribution curve should be shown on the output\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8e56f0efd08ff4a97e439ea3b8de2b7af1a302c9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8e56f0efd08ff4a97e439ea3b8de2b7af1a302c9.md new file mode 100644 index 0000000..66beb26 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8e56f0efd08ff4a97e439ea3b8de2b7af1a302c9.md @@ -0,0 +1,76 @@ +# Decision Optimization Visualization view + +# Visualization view # + +With the Decision Optimization experiment Visualization view, you can configure the graphical representation of input data and solutions for one or several scenarios\. + +Quick links: + + + + * [Visualization view](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/Visualization.html?context=cdpaas&locale=en#topic_visualization__section-dashboard) + * [Table search and filtering](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/Visualization.html?context=cdpaas&locale=en#topic_visualization__section_tablefilter) + * [Visualization widgets syntax](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/Visualization.html?context=cdpaas&locale=en#topic_visualization__section_widgetssyntax) + * [Visualization Editor](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/Visualization.html?context=cdpaas&locale=en#topic_visualization__viseditor) + * [Visualization pages](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/Visualization.html?context=cdpaas&locale=en#topic_visualization__vispages) + + + +The Visualization view is common to all scenarios in a Decision Optimization experiment\. + +For example, the following image shows the default bar chart that appears in the solution tab for the example that is used in the tutorial [Solving and analyzing a model: the diet problem](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Notebooks/solveModel.html#task_mtg_n3q_m1b)\. + +![Visualization panel showing solution in table and bar chart](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/images/Cloudvisualization.jpg) + +The Visualization view helps you compare different scenarios to validate models and business decisions\. + +For example, to show the two scenarios solved in this diet example tutorial, you can add another bar chart as follows: + + + +1. Click the chart widget and configure it by clicking the pencil icon\. +2. In the Chart widget editor, select Add scenario and choose scenario 1 (assuming that your current scenario is scenario 2) so that you have both scenario 1 and scenario 2 listed\. +3. In the Table field, select the Solution data option and select solution from the drop\-down list\. +4. In the bar chart pane, select Descending for the Category order, Y\-axis for the Bar type and click OK to close the Chart widget editor\. A second bar chart is then displayed showing you the solution results for scenario 2\. +5. Re\-edit the chart and select @Scenario in the Split by field of the Bar chart pane\. You then obtain both scenarios in the same bar chart: + + + +![Chart with two scenarios displayed in one chart\.](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/images/ChartVisu2Scen.png)\. + +You can select many different types of charts in the Chart widget editor\. + +Alternatively using the Vega Chart widget, you can similarly choose Solution data>solution to display the same data, select value and name in both the x and y fields in the Chart section of the Vega Chart widget editor\. Then, in the Mark section, select @Scenario for the color field\. This selection gives you the following bar chart with the two scenarios on the same y\-axis, distinguished by different colors\. + +![Vega chart showing 2 scenarios](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/images/VegaChart2Scen.jpg)\. + +If you re\-edit the chart and select @Scenario for the column facet, you obtain the two scenarios in separate charts side\-by\-side as follows: + +![Vega charts showing 2 scenarios side by side\.](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/images/VegaChart2Scen2.jpg) + +You can use many different types of charts that are available in the Mark field of the Vega Chart widget editor\. + +You can also select the JSON tab in all the widget editors and configure your charts by using the JSON code\. A more advanced example of JSON code is provided in the [Vega Chart widget specifications](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/Visualization.html?context=cdpaas&locale=en#topic_visualization__section_hdc_5mm_33b) section\. + +The following widgets are available: + + + + * [**Notes widget**](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/Visualization.html?context=cdpaas&locale=en#topic_visualization__section_edc_5mm_33b) + + Add simple text notes to the Visualization view. + * [**Table widget**](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/Visualization.html?context=cdpaas&locale=en#topic_visualization__section_fdc_5mm_33b) + + Present input data and solution in tables, with a search and filtering feature. See [Table search and filtering](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/Visualization.html?context=cdpaas&locale=en#topic_visualization__section_tablefilter). + * **[Charts widgets](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/Visualization.html?context=cdpaas&locale=en#topic_visualization__section_alh_lfn_l2b)** + + Present input data and solution in charts. + * [**Gantt chart widget**](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/Visualization.html?context=cdpaas&locale=en#topic_visualization__section_idc_5mm_33b) + + Display the solution to a scheduling problem (or any other type of suitable problem) in a Gantt chart. + + This widget is used automatically for scheduling problems that are modeled with the Modeling Assistant. You can edit this Gantt chart or create and configure new Gantt charts for any problem even for those models that don't use the Modeling Assistant. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ea57ca1ae730686e86fc3b2aabd71c9f8ea9823.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ea57ca1ae730686e86fc3b2aabd71c9f8ea9823.md new file mode 100644 index 0000000..059ebe0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ea57ca1ae730686e86fc3b2aabd71c9f8ea9823.md @@ -0,0 +1,21 @@ +# applytreeas properties + +# applytreeas properties # + +You can use Tree\-AS modeling nodes to generate a Tree\-AS model nugget\. The scripting name of this model nugget is *applytreenas*\. For more information on scripting the modeling node itself, see [treeas properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/treeASnodeslots.html#treeASnodeslots)\. + + + +applytreeas properties + +Table 1\. applytreeas properties + +| `applytreeas` Properties | Values | Property description | +| ------------------------ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `calculate_conf` | *flag* | This property includes confidence calculations in the generated tree\. | +| `display_rule_id` | *flag* | Adds a field in the scoring output that indicates the ID for the terminal node to which each record is assigned\. | +| `enable_sql_generation` | `false``native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ed36d5e1ccdfb0139d9d3db3aea2b90ae1b405e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ed36d5e1ccdfb0139d9d3db3aea2b90ae1b405e.md new file mode 100644 index 0000000..13b6557 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ed36d5e1ccdfb0139d9d3db3aea2b90ae1b405e.md @@ -0,0 +1,18 @@ +# SVM node (SPSS Modeler) + +# SVM node # + +The SVM node uses a support vector machine to classify data\. SVM is particularly suited for use with wide datasets, that is, those with a large number of predictor fields\. You can use the default settings on the node to produce a basic model relatively quickly, or you can use the Expert settings to experiment with different types of SVM models\. + +After the model is built, you can: + + + + * Browse the model nugget to display the relative importance of the input fields in building the model\. + * Append a Table node to the model nugget to view the model output\. + + + +Example\. A medical researcher has obtained a dataset containing characteristics of a number of human cell samples extracted from patients who were believed to be at risk of developing cancer\. Analysis of the original data showed that many of the characteristics differed significantly between benign and malignant samples\. The researcher wants to develop an SVM model that can use the values of similar cell characteristics in samples from other patients to give an early indication of whether their samples might be benign or malignant\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8f42bd98be9767332ce949506a9e193393da73fa.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8f42bd98be9767332ce949506a9e193393da73fa.md new file mode 100644 index 0000000..6cd0bac --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8f42bd98be9767332ce949506a9e193393da73fa.md @@ -0,0 +1,35 @@ +# statisticsnode properties + +# statisticsnode properties # + +![Statistics node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/statisticsnodeicon.png)The Statistics node provides basic summary information about numeric fields\. It calculates summary statistics for individual fields and correlations between fields\. + + + +statisticsnode properties + +Table 1\. statisticsnode properties + +| `statisticsnode` properties | Data type | Property description | +| --------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `use_output_name` | *flag* | Specifies whether a custom output name is used\. | +| `output_name` | *string* | If `use_output_name` is true, specifies the name to use\. | +| `output_mode` | `Screen``File` | Used to specify target location for output generated from the output node\. | +| `output_format` | `Text` (\.*txt*) `HTML` (\.*html*) `Output` (\.*cou*) | Used to specify the type of output\. | +| `full_filename` | *string* | | +| `examine` | *list* | | +| `correlate` | *list* | | +| `statistics` | `[count mean sum min max range variance sdev semean median mode]` | | +| `correlation_mode` | `Probability``Absolute` | Specifies whether to label correlations by probability or absolute value\. | +| `label_correlations` | *flag* | | +| `weak_label` | *string* | | +| `medium_label` | *string* | | +| `strong_label` | *string* | | +| `weak_below_probability` | *number* | When `correlation_mode` is set to `Probability`, specifies the cutoff value for weak correlations\. This must be a value between 0 and 1—for example, 0\.90\. | +| `strong_above_probability` | *number* | Cutoff value for strong correlations\. | +| `weak_below_absolute` | *number* | When `correlation_mode` is set to `Absolute`, specifies the cutoff value for weak correlations\. This must be a value between 0 and 1—for example, 0\.90\. | +| `strong_above_absolute` | *number* | Cutoff value for strong correlations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8f5ea4dc23caee3b6887b07ae9d319bfe5e39ca8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8f5ea4dc23caee3b6887b07ae9d319bfe5e39ca8.md new file mode 100644 index 0000000..06d8422 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8f5ea4dc23caee3b6887b07ae9d319bfe5e39ca8.md @@ -0,0 +1,27 @@ +# Setting field format options (SPSS Modeler) + +# Setting field format options # + +With the FORMAT settings in the Type and Table nodes you can specify formatting options for current or unused fields\. + +Under each formatting type, click Add Columns and add one or more fields\. The field name and format setting will be displayed for each field you select\. Then click the gear icon to specify formatting options\. + +The following formatting options are available on a per\-field basis: + +Date format\. Select a date format to use for date storage fields or when strings are interpreted as dates by CLEM date functions\. + +Time format\. Select a time format to use for time storage fields or when strings are interpreted as times by CLEM time functions\. + +Number format\. You can choose from standard (`####.###`), scientific (`#.###E+##`), or currency display formats (`$###.##`)\. + +Decimal symbol\. Select either a comma (`,`) or period (`.`) as the decimal separator\. + +Number grouping symbol\. For number display formats, select the symbol used to group values (for example, the comma in `3,000.00`)\. Options include none, period, comma, space, and locale\-defined (in which case the default for the current locale is used)\. + +Decimal places (standard, scientific, currency, export)\. For number display formats, specify the number of decimal places to use when displaying real numbers\. This option is specified separately for each display format\. Note that the Export decimal places setting only applies to flat file exports\. The number of decimal places exported by the XML Export node is always 6\. + +Justify\. Specifies how the values should be justified within the column\. The default setting is Auto, which left\-justifies symbolic values and right\-justifies numeric values\. You can override the default by selecting left, right, or center\. + +Column width\. By default, column widths are automatically calculated based on the values of the field\. You can specify a custom width, if needed\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8f64225936d78b691574900d641c0cb7c3ce78ef.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8f64225936d78b691574900d641c0cb7c3ce78ef.md new file mode 100644 index 0000000..cc9cd1b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8f64225936d78b691574900d641c0cb7c3ce78ef.md @@ -0,0 +1,23 @@ +# Sort node (SPSS Modeler) + +# Sort node # + +You can use Sort nodes to sort records into ascending or descending order based on the values of one or more fields\. For example, Sort nodes are frequently used to view and select records with the most common data values\. Typically, you would first aggregate the data using the Aggregate node and then use the Sort node to sort the aggregated data into descending order of record counts\. Displaying these results in a table will allow you to explore the data and to make decisions, such as selecting the records of the 10 best customers\. + +The following settings are available for the Sort node + +Sort by\. All fields selected to use as sort keys are displayed in a table\. A key field works best for sorting when it is numeric\. + + + + * Add fields to this list using the Field Chooser button\. + * Select an order by clicking the Ascending or Descending arrow in the table's *Order* column\. + * Delete fields using the red delete button\. + * Sort directives using the arrow buttons\. + + + +Default sort order\. Select either Ascending or Descending to use as the default sort order when new fields are added\. + +Note: The Sort node is not applied if there is a Distinct node down the model flow\. For information about the Distinct node, see [Distinct node](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/distinct.html#distinct)\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8fddca5b0d9d19db5b349ab7f72625b8c6d5744c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8fddca5b0d9d19db5b349ab7f72625b8c6d5744c.md new file mode 100644 index 0000000..0099595 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8fddca5b0d9d19db5b349ab7f72625b8c6d5744c.md @@ -0,0 +1,7 @@ +# Table content model + +# Table content model # + +The table content model provides a simple model for accessing simple row and column data\. The values in a particular column must all have the same type of storage (for example, strings or integers)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ffe1fb9caf854ded9ca52190d4874d8280d26b0.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ffe1fb9caf854ded9ca52190d4874d8280d26b0.md new file mode 100644 index 0000000..a0caca0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/8ffe1fb9caf854ded9ca52190d4874d8280d26b0.md @@ -0,0 +1,28 @@ +# Terminology + +# Terminology # + +Terminology that is used in IBM Federated Learning training processes\. + +## Terminology ## + + + +Federated Learning terminology + +| Term | Definition | +| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Party | Users that contribute different sources of data to train a model collaboratively\. Federated Learning ensures that the training occurs with no data exposure risk across the different parties\.
A party must have at least *Viewer* permission in the Watson Studio Federated Learning project\. | +| Admin | A party member that configures the Federated Learning experiment to specify how many parties are allowed, which frameworks to use, and sets up the Remote Training Systems (RTS)\. They start the Federated Learning experiment and see it to the end\.
An admin must have at least *Editor* permission in the Watson Studio Federated Learning project\. | +| Remote Training System | An asset that is used to authenticate a party to the aggregator\. Project members register in the Remote Training System (RTS) before training\. Only one of the members can use one RTS to participate in an experiment as a party\. Multiple contributing parties must each authenticate with one RTS for an experiment\. | +| Aggregator | The aggregator fuses the model results between the parties to build one model\. | +| Fusion method | The algorithm that is used to combine the results that the parties return to the aggregator\. | +| Data handler | In IBM Federated Learning, data handler is a class that is used to load and pre\-process data\. It also helps to ensure that data that is collected from multiple sources are formatted uniformly to be trained\. More details about the data handler can be found in [Data Handler](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-handler.html)\. | +| Global model | The resulting model that is fused between different parties\. | +| Training round | A training round is the process of local data training, global model fusion, and update\. Training is iterative\. The admin can choose the number of training rounds\. | + + + +**Parent topic:**[Get started](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-get-started.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/908121c9993cbedb4916c19d84605a9728fd27e5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/908121c9993cbedb4916c19d84605a9728fd27e5.md new file mode 100644 index 0000000..adbb378 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/908121c9993cbedb4916c19d84605a9728fd27e5.md @@ -0,0 +1,80 @@ +# Greenplum connection + +# Greenplum connection # + +To access your data in Greenplum, you must create a connection asset for it\. + +Greenplum is a massively parallel processing (MPP) database server that supports next generation data warehousing and large\-scale analytics processing\. + +## Supported versions ## + +Greenplum 3\.2\+ + +## Create a connection to Greenplum ## + +To create the connection asset, you need the following connection details: + + + + * Username and password + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Greenplum connections in the following workspaces and tools: + + + + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Greenplum setup ## + +[Greenplum Database Installation Guide](https://docs.vmware.com/en/VMware-Greenplum/5/greenplum-database/install_guide-install_guide.html) + +## Restriction ## + +For SPSS Modeler, you can use this connection only to import data\. You cannot export data to this connection or to a Greenplum connected data asset\. + +## Learn more ## + + + + * [Greenplum database](https://greenplum.org/) + * [Greenplum documentation](https://docs.Greenplum.org/6-8/common/gpdb-features.html) + + + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9087b2b5302fd4b7c8343c568c7c8a925544bb40.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9087b2b5302fd4b7c8343c568c7c8a925544bb40.md new file mode 100644 index 0000000..4e45dbb --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9087b2b5302fd4b7c8343c568c7c8a925544bb40.md @@ -0,0 +1,27 @@ +# applyts properties + +# applyts properties # + +You can use the Time Series modeling node to generate a Time Series model nugget\. The scripting name of this model nugget is *applyts*\. For more information on scripting the modeling node itself, see [ts properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/timeser_as_nodeslots.html#timeser_as_nodeslots)\. + + + +applyts properties + +Table 1\. applyts properties + +| `applyts` Properties | Values | Property description | +| ----------------------------- | --------- | -------------------- | +| `extend_records_into_future` | *Boolean* | | +| `ext_future_num` | *integer* | | +| `compute_future_values_input` | *Boolean* | | +| `forecastperiods` | *integer* | | +| `noise_res` | *boolean* | | +| `conf_limits` | *boolean* | | +| `target_fields` | *list* | | +| `target_series` | *list* | | +| `includeTargets` | *field* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/909b04011f4c2211d6d945ec82217e3f89a79bd7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/909b04011f4c2211d6d945ec82217e3f89a79bd7.md new file mode 100644 index 0000000..0a2864d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/909b04011f4c2211d6d945ec82217e3f89a79bd7.md @@ -0,0 +1,11 @@ +# Disabling nodes in a flow (SPSS Modeler) + +# Disabling nodes in a flow # + +You can disable process nodes that have a single input so that they're ignored when the flow runs\. This saves you from having to remove or bypass the node and means you can leave it connected to the remaining nodes\. + +You can still open and edit the node settings; however, any changes will not take effect until you enable the node again\. + +For example, you might use a Filter node to filter several fields, and then build models based on the reduced data set\. If you want to also build the same models *without* fields being filtered, to see if they improve the model results, you can disable the Filter node\. When you disable the Filter node, the connections to the modeling nodes pass directly through from the Derive node to the Type node\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/90fafe76840267470228854a202752832d54a787.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/90fafe76840267470228854a202752832d54a787.md new file mode 100644 index 0000000..997ac31 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/90fafe76840267470228854a202752832d54a787.md @@ -0,0 +1,35 @@ +# linearasnode properties + +# linearasnode properties # + +![Linear\-AS node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/almas_nodeicon.png)Linear regression models predict a continuous target based on linear relationships between the target and one or more predictors\. + + + +linearasnode properties + +Table 1\. linearasnode properties + +| `linearasnode` Properties | Values | Property description | +| ------------------------------- | ----------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `target` | *field* | Specifies a single target field\. | +| `inputs` | \[*field1 \.\.\. fieldN*\] | Predictor fields used by the model\. | +| `weight_field` | *field* | Analysis field used by the model\. | +| `custom_fields` | *flag* | The default value is `TRUE`\. | +| `intercept` | *flag* | The default value is `TRUE`\. | +| `detect_2way_interaction` | *flag* | Whether or not to consider two way interaction\. The default value is `TRUE`\. | +| `cin` | *number* | The interval of confidence used to compute estimates of the model coefficients\. Specify a value greater than 0 and less than 100\. The default value is `95`\. | +| `factor_order` | `ascending``descending` | The sort order for categorical predictors\. The default value is `ascending`\. | +| `var_select_method` | `ForwardStepwise``BestSubsets``none` | The model selection method to use\. The default value is `ForwardStepwise`\. | +| `criteria_for_forward_stepwise` | `AICC``Fstatistics``AdjustedRSquare``ASE` | The statistic used to determine whether an effect should be added to or removed from the model\. The default value is `AdjustedRSquare`\. | +| `pin` | *number* | The effect that has the smallest p\-value less than this specified `pin` threshold is added to the model\. The default value is `0.05`\. | +| `pout` | *number* | Any effects in the model with a p\-value greater than this specified `pout` threshold are removed\. The default value is `0.10`\. | +| `use_custom_max_effects` | *flag* | Whether to use max number of effects in the final model\. The default value is `FALSE`\. | +| `max_effects` | *number* | Maximum number of effects to use in the final model\. The default value is `1`\. | +| `use_custom_max_steps` | *flag* | Whether to use the maximum number of steps\. The default value is `FALSE`\. | +| `max_steps` | *number* | The maximum number of steps before the stepwise algorithm stops\. The default value is `1`\. | +| `criteria_for_best_subsets` | `AICC``AdjustedRSquare``ASE` | The mode of criteria to use\. The default value is `AdjustedRSquare`\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/916c197a1a18fbe44382a30782b1ff7c13dbfeec.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/916c197a1a18fbe44382a30782b1ff7c13dbfeec.md new file mode 100644 index 0000000..506bb3d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/916c197a1a18fbe44382a30782b1ff7c13dbfeec.md @@ -0,0 +1,16 @@ +# Converting continuous data (SPSS Modeler) + +# Converting continuous data # + +Treating categorical data as continuous can have a serious impact on the quality of a model, especially if it's the target field (for example, producing a regression model rather than a binary model)\. To prevent this, you can convert integer ranges to categorical types such as `Ordinal` or `Flag`\. + + + +1. Double\-click a Type node to open its properties\. Expand the Type Operations section\. +2. Specify a value for Set continuous integer field to ordinal if range less than or equal to\. +3. Click Apply to convert the affected ranges\. +4. If desired, you can also specify a value for Set categorical fields to None if they exceed this many values to automatically ignore large sets with many members\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/916f0a90d0b8383f2353b3320628e23e38b380b5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/916f0a90d0b8383f2353b3320628e23e38b380b5.md new file mode 100644 index 0000000..ef41b14 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/916f0a90d0b8383f2353b3320628e23e38b380b5.md @@ -0,0 +1,82 @@ +# genlinnode properties + +# genlinnode properties # + +![GenLin node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/genlinnodeicon.png)The Generalized Linear (GenLin) model expands the general linear model so that the dependent variable is linearly related to the factors and covariates through a specified link function\. Moreover, the model allows for the dependent variable to have a non\-normal distribution\. It covers the functionality of a wide number of statistical models, including linear regression, logistic regression, loglinear models for count data, and interval\-censored survival models\. + + + +genlinnode properties + +Table 1\. genlinnode properties + +| `genlinnode` Properties | Values | Property description | +| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `target` | *field* | GenLin models require a single target field which must be a nominal or flag field, and one or more input fields\. A weight field can also be specified\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `use_weight` | *flag* | | +| `weight_field` | *field* | Field type is only continuous\. | +| `target_represents_trials` | *flag* | | +| `trials_type` | `Variable``FixedValue` | | +| `trials_field` | *field* | Field type is continuous, flag, or ordinal\. | +| `trials_number` | *number* | Default value is 10\. | +| `model_type` | `MainEffects``MainAndAllTwoWayEffects` | | +| `offset_type` | `Variable``FixedValue` | | +| `offset_field` | *field* | Field type is only continuous\. | +| `offset_value` | *number* | Must be a real number\. | +| `base_category` | `Last``First` | | +| `include_intercept` | *flag* | | +| `mode` | `Simple``Expert` | | +| `distribution` | `BINOMIAL``GAMMA``IGAUSS``NEGBIN``NORMAL``POISSON``TWEEDIE``MULTINOMIAL` | `IGAUSS`: Inverse Gaussian\. `NEGBIN`: Negative binomial\. | +| `negbin_para_type` | `Specify``Estimate` | | +| `negbin_parameter` | *number* | Default value is 1\. Must contain a non\-negative real number\. | +| `tweedie_parameter` | *number* | | +| `link_function` | `IDENTITY``CLOGLOG``LOG``LOGC``LOGIT``NEGBIN``NLOGLOG``ODDSPOWER``PROBIT``POWER``CUMCAUCHIT``CUMCLOGLOG``CUMLOGIT``CUMNLOGLOG``CUMPROBIT` | `CLOGLOG`: Complementary log\-log\. `LOGC`: log complement\. `NEGBIN`: Negative binomial\. `NLOGLOG`: Negative log\-log\. `CUMCAUCHIT`: Cumulative cauchit\. `CUMCLOGLOG`: Cumulative complementary log\-log\. `CUMLOGIT`: Cumulative logit\. `CUMNLOGLOG`: Cumulative negative log\-log\. `CUMPROBIT`: Cumulative probit\. | +| `power` | *number* | Value must be real, nonzero number\. | +| `method` | `Hybrid``Fisher``NewtonRaphson` | | +| `max_fisher_iterations` | *number* | Default value is 1; only positive integers allowed\. | +| `scale_method` | `MaxLikelihoodEstimate``Deviance``PearsonChiSquare``FixedValue` | | +| `scale_value` | *number* | Default value is 1; must be greater than 0\. | +| `covariance_matrix` | `ModelEstimator``RobustEstimator` | | +| `max_iterations` | *number* | Default value is 100; non\-negative integers only\. | +| `max_step_halving` | *number* | Default value is 5; positive integers only\. | +| `check_separation` | *flag* | | +| `start_iteration` | *number* | Default value is 20; only positive integers allowed\. | +| `estimates_change` | *flag* | | +| `estimates_change_min` | *number* | Default value is 1E\-006; only positive numbers allowed\. | +| `estimates_change_type` | `Absolute``Relative` | | +| `loglikelihood_change` | *flag* | | +| `loglikelihood_change_min` | *number* | Only positive numbers allowed\. | +| `loglikelihood_change_type` | `Absolute``Relative` | | +| `hessian_convergence` | *flag* | | +| `hessian_convergence_min` | *number* | Only positive numbers allowed\. | +| `hessian_convergence_type` | `Absolute``Relative` | | +| `case_summary` | *flag* | | +| `contrast_matrices` | *flag* | | +| `descriptive_statistics` | *flag* | | +| `estimable_functions` | *flag* | | +| `model_info` | *flag* | | +| `iteration_history` | *flag* | | +| `goodness_of_fit` | *flag* | | +| `print_interval` | *number* | Default value is 1; must be positive integer\. | +| `model_summary` | *flag* | | +| `lagrange_multiplier` | *flag* | | +| `parameter_estimates` | *flag* | | +| `include_exponential` | *flag* | | +| `covariance_estimates` | *flag* | | +| `correlation_estimates` | *flag* | | +| `analysis_type` | `TypeI``TypeIII``TypeIAndTypeIII` | | +| `statistics` | `Wald``LR` | | +| `citype` | `Wald``Profile` | | +| `tolerancelevel` | *number* | Default value is 0\.0001\. | +| `confidence_interval` | *number* | Default value is 95\. | +| `loglikelihood_function` | `Full``Kernel` | | +| `singularity_tolerance` | `1E-007``1E-008``1E-009``1E-010``1E-011``1E-012` | | +| `value_order` | `Ascending``Descending``DataOrder` | | +| `calculate_variable_importance` | *flag* | | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `adjusted_propensity_partition` | `Test``Validation` | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/91838636de3442e218fd7beccde866113d10ddf3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/91838636de3442e218fd7beccde866113d10ddf3.md new file mode 100644 index 0000000..1f70613 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/91838636de3442e218fd7beccde866113d10ddf3.md @@ -0,0 +1,32 @@ +# Managing users and access + +# Managing users and access # + +As the account owner or administrator, you add the people in your organization to the IBM Cloud account and then assign them access permissions using roles that provide access to the services that they need\. + +## User management on IBM Cloud ## + +People who work in IBM watsonx must have a valid IBMid and be a member of the IBM Cloud account\. Alternately, they must have a valid ID in a supported user registry\. User management includes adding users to the account and then assigning appropriate roles to provide access to the services and actions that they need\. See [Adding users to the account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-addl-users.html)\. + +## Access management using IBM Cloud Identity and Access Management (IAM) ## + +You control the actions that a user can perform for a specific service by assigning permissions with IBM Cloud IAM\. You create user access groups containing roles to provide permissions for users\. You can also assign roles and permissions to individual users\. If necessary, you can create custom roles to satisfy your business requirements\. + +## Learn more ## + + + + * [Signing up for your organization's watsonx account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/signup-wx.html#orgacct) + * [Logging in to watsonx\.ai through IBM Cloud App ID (beta)](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/signup-wx.html#appid) + * [IBM Cloud docs: Assigning access to resources by using access groups](https://cloud.ibm.com/docs/account?topic=account-access-getstarted) + * [IBM Cloud docs: Creating custom roles](https://cloud.ibm.com/docs/account?topic=account-custom-roles) + * [IBM Cloud docs: IAM access](https://cloud.ibm.com/docs/account?topic=account-userroles) + * [IBM Cloud docs: What is IBM Cloud Identity and Access Management](https://cloud.ibm.com/docs/account?topic=account-iamoverview) + * [IBM Cloud docs: Setting up access groups](https://cloud.ibm.com/docs/account?topic=account-groups) + * [IBM Cloud docs: Best practices for organizing resources and assigning access](https://cloud.ibm.com/docs/account?topic=account-account_setup&interface=ui) + + + +**Parent topic:**[Setting up the platform](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-platform.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/91b834e69c2153740973c59cf6b4d66260640342.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/91b834e69c2153740973c59cf6b4d66260640342.md new file mode 100644 index 0000000..7c90b41 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/91b834e69c2153740973c59cf6b4d66260640342.md @@ -0,0 +1,6 @@ +# Dendrogram charts + +# Dendrogram charts # + +Dendrogram charts are similar to tree charts and are typically used to illustrate a network structure (for example, a hierarchical structure)\. Dendrogram charts consist of a root node that is connected to subordinate nodes through edges or branches\. The last nodes in the hierarchy are called leaves\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/91eeb0303c78ec7eaa6dab7921e7173c68ff7769.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/91eeb0303c78ec7eaa6dab7921e7173c68ff7769.md new file mode 100644 index 0000000..43a6513 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/91eeb0303c78ec7eaa6dab7921e7173c68ff7769.md @@ -0,0 +1,86 @@ +# AutoAI Overview + +# AutoAI Overview # + +The AutoAI graphical tool analyzes your data and uses data algorithms, transformations, and parameter settings to create the best predictive model\. AutoAI displays various potential models as model candidate pipelines and rank them on a leaderboard for you to choose from\. + +**Data format** : Tabular: CSV files, with comma (,) delimiter for all types of AutoAI experiments\. : Connected data from [IBM Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html)\. + +Note:You can use a data asset that is saved as a *Feature Group (beta)* but the metadata is not used to populate the AutoAI experiment settings\. + +**Data size** : Up to 1 GB or up to 20 GB\. For details, refer to [AutoAI data use](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html?context=cdpaas&locale=en#autoai-data-use)\. + +## AutoAI data use ## + +These limits are based on the default compute configuration of 8 CPU and 32 GB\. + +AutoAI classification and regression experiments: + + + + * You can upload a file up to 1 GB for AutoAI experiments\. + * If you connect to a data source that exceeds 1 GB, only the first 1 GB of records is used\. + + + +AutoAI time series experiments: + + + + * If the data source contains a timestamp column, AutoAI samples the data at a uniform frequency\. For example, data can be in increments of one minute, one hour, or one day\. The specified timestamp is used to determine the lookback window to improve the model accuracy\. + + Note:If the file size is larger than 1 GB, AutoAi sorts the data in *descending* time order and only the first 1 GB is used to train the experiment. + * If the data source does not contain a timestamp column, ensure AutoAI samples the data at uniform intervals and sorts the data in *ascending* time order\. An ascending sort order means that the value in the first row is the oldest, and the value in the last row is the most recent\. + + Note: If the file size is larger than 1 GB, truncate the file size so it is smaller than 1 GB. + + + +## AutoAI process ## + +Using AutoAI, you can build and deploy a machine learning model with sophisticated training features and no coding\. The tool does most of the work for you\. + +To view the code that created a particular experiment, or interact with the experiment programmatically, you can [save an experiment as a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-notebook.html)\. + +![The AutoAI process takes data from a structured file, prepares the data, selects the model type, and generates and ranks pipelines so you can save and deploy a model\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_overview.svg) + +AutoAI automatically runs the following tasks to build and evaluate candidate model pipelines: + + + + * [Data pre\-processing](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html?context=cdpaas&locale=en#preprocess) + * [Automated model selection](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html?context=cdpaas&locale=en#model_selection) + * [Automated feature engineering](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html?context=cdpaas&locale=en#feature_engineering) + * [Hyperparameter optimization](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html?context=cdpaas&locale=en#hpo_optimization) + + + +#### Understanding the AutoAI process #### + +For additional detail on each of these phases, including links to associated research papers and descriptions of the algorithms applied to create the model pipelines, see [AutoAI implementation details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html)\. + +### Data pre\-processing ### + +Most data sets contain different data formats and missing values, but standard machine learning algorithms work only with numbers and no missing values\. Therefore, AutoAI applies various algorithms or estimators to analyze, clean, and prepare your raw data for machine learning\. This technique automatically detects and categorizes values based on features, such as data type: categorical or numerical\. Depending on the categorization, AutoAI uses [hyper\-parameter optimization](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html?context=cdpaas&locale=en#hpo_optimization) to determine the best combination of strategies for missing value imputation, feature encoding, and feature scaling for your data\. + +### Automated model selection ### + +AutoAI uses automated model selection to identify the best model for your data\. This novel approach tests potential models against small subsets of the data and ranks them based on accuracy\. AutoAI then selects the most promising models and increases the size of the data subset until it identifies the best match\. This approach saves time and improves performance by gradually narrowing down the potential models based on accuracy\. + +For information on how to handle automatically\-generated pipelines to select the best model, refer to [Selecting an AutoAI model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-view-results.html)\. + +### Automated feature engineering ### + +Feature engineering identifies the most accurate model by transforming raw data into a combination of features that best represent the problem\. This unique approach explores various feature construction choices in a structured, nonexhaustive manner, while progressively maximizing model accuracy by using reinforcement learning\. This technique results in an optimized sequence of transformations for the data that best match the algorithms of the model selection step\. + +### Hyperparameter optimization ### + +Hyperparameter optimization refines the best performing models\. AutoAI uses a novel hyperparameter optimization algorithm for certain function evaluations, such as model training and scoring, that are typical in machine learning\. This approach quickly identifies the best model despite long evaluation times at each iteration\. + +## Next steps ## + +[AutoAI tutorial: Build a Binary Classification Model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai_example_binary_classifier.html) + +**Parent topic:**[Analyzing data and building models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-science.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92442d67350644bfcaec2b2a47b98f4ede943dc3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92442d67350644bfcaec2b2a47b98f4ede943dc3.md new file mode 100644 index 0000000..bcafad3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92442d67350644bfcaec2b2a47b98f4ede943dc3.md @@ -0,0 +1,7 @@ +# applyfactornode properties + +# applyfactornode properties # + +You can use PCA/Factor modeling nodes to generate a PCA/Factor model nugget\. The scripting name of this model nugget is *applyfactornode*\. No other properties exist for this model nugget\. For more information on scripting the modeling node itself, see [factornode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/factornodeslots.html#factornodeslots)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/924550083a3a6acd177024df788c02d236874893.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/924550083a3a6acd177024df788c02d236874893.md new file mode 100644 index 0000000..2213e0c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/924550083a3a6acd177024df788c02d236874893.md @@ -0,0 +1,142 @@ +# Connecting to the aggregator (Party) + +# Connecting to the aggregator (Party) # + +Each party follows these steps to connect to a started aggregator\. + + + +1. Open the project and click the Federated Learning experiment\. +2. Click **View setup information** and click the download icon to download the party connector script\. ![Screen capture of View Setup Information](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl-view-setup-info.png) +3. Each party must configure the party connector script and provide valid credentials to run the script\. This is what a sample completed party connector script looks like: + + from ibm_watson_machine_learning import APIClient + + wml_credentials = { + "url": "https://us-south.ml.cloud.ibm.com", + "apikey": "" + } + + wml_client = APIClient(wml_credentials) + + wml_client.set.default_project("XXX-XXX-XXX-XXX-XXX") + + party_metadata = { + + wml_client.remote_training_systems.ConfigurationMetaNames.DATA_HANDLER: { + + "name": "MnistSklearnDataHandler", + + "path": "example.mnist_sklearn_data_handler", + + "info": { + + "npz_file":"./example_data/example_data.npz" + + } + + party = wml_client.remote_training_systems.create_party("XXX-XXX-XXX-XXX-XXX", party_metadata) + + party.monitor_logs() + party.run(aggregator_id="XXX-XXX-XXX-XXX-XXX", asynchronous=False) + + **Parameters**: + + + + * *`api_key`:* + Your IAM API key. To create a new API key, go to the [IBM Cloud website](https://cloud.ibm.com/), and click **Create an IBM Cloud Pak for Data API key** under **Manage > Access(IAM) > API keys**. + + *Optional:* If you're reusing a script from a different project, you can copy the updated `project_id`, `aggregator_id` and `experiment_id` from the setup information window and copy them into the script. + + + +4. Install Watson Machine Learning with the latest Federated Learning package if you have not yet done so: + + + + * If you are using M-series on a Mac, install the latest package with the following script: + + # ----------------------------------------------------------------------------------------- + # (C) Copyright IBM Corp. 2023. + # https://opensource.org/licenses/BSD-3-Clause + # ----------------------------------------------------------------------------------------- + # + # + # Script to create a conda environment and install ibm-watson-machine-learning with + # the dependencies required for Federated Learning on MacOS. + # The name of the conda environment to be created is passed as the first argument. + # + # Note: This script requires miniforge to be installed for conda. + # + + usage=". install_fl_rt22.2_macos.sh conda_env_name" + + arch=$(uname -m) + os=$(uname -s) + + if (($# < 1)) + then + echo $usage + exit + fi + + ENAME=$1 + + conda create -y -n ${ENAME} python=3.10 + conda activate ${ENAME} + pip install ibm-watson-machine-learning + + if [ "$os" == "Darwin" -a "$arch" == "arm64" ] + then + conda install -y -c apple tensorflow-deps + fi + + python - < --> + + + + + +1. When your configuration is complete and you save the party connector script, enter this command in a command line to run the script: + + python3 rts__.py + + + +## More resources ## + +[Federated Learning library functions](https://ibm.github.io/watson-machine-learning-sdk/) + +**Parent topic:**[Creating a Federated Learning experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-start.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/925108d09cfc6f2b5193d0d7414bfc83748111a9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/925108d09cfc6f2b5193d0d7414bfc83748111a9.md new file mode 100644 index 0000000..cf7b386 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/925108d09cfc6f2b5193d0d7414bfc83748111a9.md @@ -0,0 +1,9 @@ +# Setting options (SPSS Modeler) + +# Setting options # + +You can access settings in various panes of the Text Analytics Workbench, such as extraction settings for concepts\. + +On the Concepts, Text links, and Categories tabs, categories are built from descriptors derived from either types or type patterns\. In the table, you can select the individual types or patterns to include in the category building process\. A description of all settings on each tab follows\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9288d1e76019a9d1f08873e515b9798906cc1c4b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9288d1e76019a9d1f08873e515b9798906cc1c4b.md new file mode 100644 index 0000000..6e73f09 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9288d1e76019a9d1f08873e515b9798906cc1c4b.md @@ -0,0 +1,80 @@ +# SAP ASE connection + +# SAP ASE connection # + +To access your data in SAP ASE, create a connection asset for it\. + +SAP ASE is a relational model database server\. SAP ASE was formerly Sybase\. + +## Supported versions ## + +SAP Sybase ASE 11\.5\+, 16\.0\+ + +## Create a connection to SAP ASE ## + +To create the connection asset, you need these connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Username and password + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use SAP ASE connections in the following workspaces and tools: + +**Projects** + + + + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## SAP ASE setup ## + +[Get Started with SAP ASE](https://www.sap.com/canada/products/sybase-ase/get-started.html) + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [SAP ASE documentation](https://help.sap.com/viewer/product/SAP_ASE/16.0.4.1/en-US?task=whats_new_task) for the correct syntax\. + +## Learn more ## + +[SAP ASE technical information](https://www.sap.com/canada/products/sybase-ase/technical-information.html) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92b00bee2e48f01962bbbbac49cf87587710f35f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92b00bee2e48f01962bbbbac49cf87587710f35f.md new file mode 100644 index 0000000..7a5abb7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92b00bee2e48f01962bbbbac49cf87587710f35f.md @@ -0,0 +1,167 @@ +# Workload identity federation examples + +# Workload identity federation examples # + +Workload identity federation for the Google BigQuery connection is supported by any identity provider that supports OpenID Connect (OIDC) or SAML 2\.0\. + +These examples are for [AWS with Amazon Cognito](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/wif-examples.html?context=cdpaas&locale=en#aws) and for [Microsoft Azure](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/wif-examples.html?context=cdpaas&locale=en#azure)\. + +## AWS ## + +### Configure workload identity federation in Amazon Cognito ### + + + +1. Create an OIDC identity provider (IdP) with Cognito by following the instructions in the Amazon documentation: + + + + * [Step 1. Create a user pool](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html) + * [Step 2. Add an app client and set up the hosted UI](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-configuring-app-integration.html) + + + + For more information, see [Getting started with Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-getting-started.html). +2. Create a group and user in the IdP with the AWS console\. Or you can use AWS CLI: + + CLIENT_ID=YourClientId + ISSUER_URL=https://cognito-idp.YourRegion.amazonaws.com/YourPoolId + POOL_ID=YourPoolId + USERNAME=YourUsername + PASSWORD=YourPassword + GROUPNAME=YourGroupName + + aws cognito-idp admin-create-user --user-pool-id $POOL_ID --username $USERNAME --temporary-password Temp-Pass1 + aws cognito-idp admin-set-user-password --user-pool-id $POOL_ID --username $USERNAME --password $PASSWORD --permanent + aws cognito-idp create-group --group-name $GROUPNAME --user-pool-id $POOL_ID + aws cognito-idp admin-add-user-to-group --user-pool-id $POOL_ID --username $USERNAME --group-name $GROUPNAME +3. From the AWS console, click **View Hosted UI** and log in to the IDP UI in a browser to ensure that any new password challenge is resolved\. +4. Get an IdToken with the AWS CLI: + + aws cognito-idp admin-initiate-auth --auth-flow ADMIN_USER_PASSWORD_AUTH --client-id $CLIENT_ID --auth-parameters USERNAME=$USERNAME,PASSWORD=$PASSWORD --user-pool-id $POOL_ID + + For more information on the Amazon Cognito User Pools authentication flow, see [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html). + + + +### Configure Google Cloud for Amazon Cognito ### + +When you create the provider in Google Cloud, use these settings: + + + + * Set **Issuer (URL)** to `https://cognito-idp.YourRegion.amazonaws.com/YourPoolId`\. + * Set **Allowed Audience** to your client ID\. + * Under **Attribute Mapping**, map `google.subject` to `assertion.sub`\. + + + +### Create the Google BigQuery connection with Amazon Cognito workload identity federation ### + + + +1. Choose the **Workload Identity Federation with access token** authentication method\. +2. For the **Security Token Service audience** field, use this format: + + //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID +3. For the **Service account e\-mail**, enter the email address of the Google service account to be impersonated\. For more information, see [Create a service account for the external workload](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds#create_a_service_account_for_the_external_workload)\. +4. (Optional) Specify a value for the **Service account token lifetime** in seconds\. The default lifetime of a service account access token is one hour\. For more information, see [URL\-sourced credentials](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-providers#url-sourced-credentials)\. +5. Set **Token format** to `Text` +6. Set **Token type** to `ID token` + + + +## Azure ## + +### Configure workload identity federation in Azure ### + + + +1. [Create an Azure AD application and service principal](https://learn.microsoft.com/en-au/azure/active-directory/develop/howto-create-service-principal-portal#register-an-application-with-azure-ad-and-create-a-service-principal)\. +2. Set an **Application ID URI** for the application\. You can use the default Application ID URI (`api://APPID`) or specify a custom URI\. + + You can skip the instructions on creating a managed identity. +3. Follow the instructions to [create a new application secret](https://learn.microsoft.com/en-au/azure/active-directory/develop/howto-create-service-principal-portal#option-2-create-a-new-application-secret) to get an access token with the REST API\. + + For more information, see [Configure workload identity federation with Azure](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds#azure). + + + +### Configure Google Cloud for Azure ### + + + +1. Follow the instructions: [Configure workload identity federation](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds#configure)\. +2. Follow the instructions: [Create the workload identity pool and provider](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds#create_the_workload_identity_pool_and_provider)\. When you configure the provider, use these settings: + + + + * Set **Issuer (URL)** to `https://sts.windows.net/TENANTID/`, where `TENANTID` is the tenant ID that you received when you set up Azure Active Directory. + * Set the **Allowed audience** to the client ID that you received when you set up the app registration. Or specify another **Application ID URI** that you used when you set up the application identity in Azure. + * Under **Attribute Mapping**, map `google.subject` to `assertion.sub`. + + + + + +### Create the Google BigQuery connection with Azure workload identity federation ### + + + +1. Choose one of these authentication methods: + + + + * **Workload Identity Federation with access token** + * **Workload Identity Federation with token URL** + + + +2. For the **Security Token Service audience** field, use the format that is described in [Authenticate a workload that uses the REST API](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds#azure_7)\. For example: + + //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID +3. For the **Service account e\-mail**, enter the email address of the Google service account to be impersonated\. For more information, see [Create a service account for the external workload](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds#create_a_service_account_for_the_external_workload)\. +4. (Optional) Specify a value for the **Service account token lifetime** in seconds\. The default lifetime of a service account access token is one hour\. For more information, see [URL\-sourced credentials](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-providers#url-sourced-credentials)\. +5. If you specified **Workload Identity Federation with token URL**, use these values: + + + + * **Token URL**: `https://login.microsoftonline.com/TENANT_ID/oauth2/v2.0/token`. This URL will fetch a token from Azure. + * **HTTP method**: `POST` + * **HTTP headers**: `"Content-Type"="application/x-www-form-urlencoded;charset=UTF-8","Accept"="application/json"` + * **Request body**: `grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&scope=APPLICATION_ID_URI/.default` + + + +6. For **Token type**, select **ID token** for an identity provider that complies with the OpenID Connect (OIDC) specification\. For information, see [Token types](https://cloud.google.com/docs/authentication/token-types)\. +7. The **Token format** option depends on that authentication selection: + + + + * **Workload Identity Federation with access token**: Select **Text** if you supplied the raw token value in the **Access token** field. + * **Workload Identity Federation with token URL**: For a response from the token URL in JSON format with the access token that is returned in a field named `access_token`, use these settings: + + + + * **Token format**: `JSON` + * **Token field name**: `access_token` + + + + + + + +## Learn more ## + + + + * [Workload identity federation (Google Cloud)](https://cloud.google.com/iam/docs/workload-identity-federation) + * [Configure workload identity federation on the identity provider (Google Cloud)](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds) + * [Generate a credentials configuration file (Google Cloud)](https://github.com/googleapis/google-auth-library-java#workforce-identity-federation) + + + +**Parent topic:**[Google BigQuery connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-bigquery.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92bd6d892feb4829f9c49afcf79cdc323be66cc4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92bd6d892feb4829f9c49afcf79cdc323be66cc4.md new file mode 100644 index 0000000..5080ffa --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92bd6d892feb4829f9c49afcf79cdc323be66cc4.md @@ -0,0 +1,29 @@ +# {{ document.title.text }} + +# Spreading disinformation # + +![icon for misuse risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-misuse.svg)Risks associated with outputMisuseAmplified + +### Description ### + +The possibility that a model could be used to create misleading information to deceive or mislead a targeted audience\. + +### Why is spreading disinformation a concern for foundation models? ### + +Intentionally misleading people is unethical and can be illegal\. A model that has this potential must be properly governed\. Otherwise, business entities could face fines, reputational harms, and other legal consequences\. + +Example + +#### Generation of False Information #### + +As per the news articles, generative AI poses a threat to democratic elections by making it easier for malicious actors to create and spread false content to sway election outcomes\. The examples cited include robocall messages generated in a candidate’s voice instructing voters to cast ballots on the wrong date, synthesized audio recordings of a candidate confessing to a crime or expressing racist views, AI generated video footage showing a candidate giving a speech or interview they never gave, and fake images designed to look like local news reports, falsely claiming a candidate dropped out of the race\. + +Sources: + +[AP News, May 2023](https://apnews.com/article/artificial-intelligence-misinformation-deepfakes-2024-election-trump-59fb51002661ac5290089060b3ae39a0) + +[The Guardian, July 2023](https://www.theguardian.com/us-news/2023/jul/19/ai-generated-disinformation-us-elections) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92c74e7245dfe20bf93f1d73039ed4df95375c6f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92c74e7245dfe20bf93f1d73039ed4df95375c6f.md new file mode 100644 index 0000000..e91ad00 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92c74e7245dfe20bf93f1d73039ed4df95375c6f.md @@ -0,0 +1,81 @@ +# IBM Cloud Databases for PostgreSQL connection + +# IBM Cloud Databases for PostgreSQL connection # + +To access your data in IBM Cloud Databases for PostgreSQL, you must create a connection asset for it\. + +IBM Cloud Databases for PostgreSQL is an open source object\-relational database that is highly customizable\. It’s a feature\-rich enterprise database with JSON support\. + +## Create a connection to IBM Cloud Databases for PostgreSQL ## + +To create the connection asset, you need the following connection details: + + + + * Database name + * Hostname or IP address of the database + * Port number + * Username and password + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use IBM Cloud Databases for PostgreSQL connections in the following workspaces and tools: + +**Projects** + + + + * Notebooks\. Click **Read data** on the **Code snippets** pane to get the connection credentials and load the data into a data structure\. See [Load data from data source connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html#conns)\. + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## IBM Cloud Databases for PostgreSQL setup ## + +[IBM Cloud Databases for PostgreSQL setup](https://cloud.ibm.com/catalog/services/databases-for-postgresql) + +## Restriction ## + +For SPSS Modeler, you can use this connection only to import data\. You cannot export data to this connection or to an IBM Cloud Databases for PostgreSQL connected data asset\. + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [IBM Cloud Databases for PostgreSQL documentation](https://www.postgresql.org/docs/9.1/ecpg-commands.html) for the correct syntax\. + +## Learn more ## + +[ IBM Cloud Databases for PostgreSQL documentation](https://cloud.ibm.com/catalog/services/databases-for-postgresql) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92fe6b199a3b4773c5b57ededba80500e6c66faf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92fe6b199a3b4773c5b57ededba80500e6c66faf.md new file mode 100644 index 0000000..eaed020 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/92fe6b199a3b4773c5b57ededba80500e6c66faf.md @@ -0,0 +1,20 @@ +# selectnode properties + +# selectnode properties # + +![Select node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/select_node_icon.png) The Select node selects or discards a subset of records from the data stream based on a specific condition\. For example, you might select the records that pertain to a particular sales region\. + + + +selectnode properties + +Table 1\. selectnode properties + +| `selectnode` properties | Data type | Property description | +| ----------------------- | ------------------ | ---------------------------------------------------------- | +| `mode` | `Include``Discard` | Specifies whether to include or discard selected records\. | +| `condition` | *string* | Condition for including or discarding records\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9346a72cfcd74dfda05213a2a321bf9cfb823358.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9346a72cfcd74dfda05213a2a321bf9cfb823358.md new file mode 100644 index 0000000..15b9127 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9346a72cfcd74dfda05213a2a321bf9cfb823358.md @@ -0,0 +1,17 @@ +# Apriori node (SPSS Modeler) + +# Apriori node # + +The Apriori node discovers association rules in your data\. + +Association rules are statements of the form: + + if antecedent(s) then consequent(s) + +For example, if a customer purchases a razor and after shave, then that customer will purchase shaving cream with 80% confidence\. Apriori extracts a set of rules from the data, pulling out the rules with the highest information content\. The Apriori node also discovers association rules in the data\. Apriori offers five different methods of selecting rules and uses a sophisticated indexing scheme to efficiently process large data sets\. + +Requirements\. To create an Apriori rule set, you need one or more `Input` fields and one or more `Target` fields\. Input and output fields (those with the role `Input`, `Target`, or `Both`) must be symbolic\. Fields with the role `None` are ignored\. Fields types must be fully instantiated before executing the node\. Data can be in tabular or transactional format\. + +Strengths\. For large problems, Apriori is generally faster to train\. It also has no arbitrary limit on the number of rules that can be retained and can handle rules with up to 32 preconditions\. Apriori offers five different training methods, allowing more flexibility in matching the data mining method to the problem at hand\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9370eeef3d5414148efc5cc390b4efbe3020f23d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9370eeef3d5414148efc5cc390b4efbe3020f23d.md new file mode 100644 index 0000000..63406e4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9370eeef3d5414148efc5cc390b4efbe3020f23d.md @@ -0,0 +1,42 @@ +# Downloading data assets from a project + +# Downloading data assets from a project # + +You can download data assets from a project to your local system\. + +Important: Take care when you download assets\. Collaborators can upload any type of file into a project, including files that have malware or other types of malicious code\. + +**Required permissions** : You must have the **Editor** or **Admin** role in the project to download an asset\. + +## Download a data asset ## + +To download a data asset that is in the project's storage, select **Download** from the ACTION menu next to the asset name\. + +For an alternate method of downloading data assets for a project, select **Files** in the Data side panel\. Checkmark the data asset and select **Download** from the ACTION menu in the side panel\. + +## Download a connected data asset ## + +To download a *connected data asset*, use Data Refinery to run a job that saves the file as the output of a Data Refinery flow\. The output of the Data Refinery flow is a new CSV file in the project’s storage\. + + + +1. Click the asset name to open it\. +2. Click **Prepare data**\. +3. From the **Jobs** menu, click **Save and create a job**\. Enter a job name and click **Create and Run**\. +4. Go back to the **Assets** page\. Refresh the page\. By default, the downloadable asset is named *table\-name*\_shaped\.csv\. +5. Choose **Download** from the ACTION menu next to the asset name\. + + + +## Learn more ## + + + + * [Download a data asset from a catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/catalog/download.html) + * [Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + + + +**Parent topic:**[Projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/939233f807850ae8d28246ade7fdccda66e9df03.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/939233f807850ae8d28246ade7fdccda66e9df03.md new file mode 100644 index 0000000..73950be --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/939233f807850ae8d28246ade7fdccda66e9df03.md @@ -0,0 +1,68 @@ +# Decision Optimization model deployment + +# Model deployment # + +To deploy a Decision Optimization model, create a model ready for deployment in your deployment space and then upload your model as an archive\. When deployed, you can submit jobs to your model and monitor job states\. + +## Procedure ## + +To deploy a Decision Optimization model: + + + +1. Package your Decision Optimization model formulation with your common data (optional) ready for deployment as a `tar.gz`, `.zip`, or `.jar` file\. Your archive can include the following optional files: + + + + 1. Your model files + 2. Settings (For more information, see [ Solve parameters](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeploySolveParams.html#topic_deploysolveparams) ) + 3. Common data + + + + Note: For Python models with multiple .py files, put all files in the same folder in your archive. The same folder must contain a main file called main.py. Do not use subfolders. +2. Create a model ready for deployment in Watson Machine Learning providing the following information: + + + + * **Machine Learning** service instance + * **Deployment space** instance + * **Software specification** ( Decision Optimization**runtime version**): + + + + * do\_ 22.1 runtime is based on CPLEX 22.1.1.0 + * do\_ 20.1 runtime is based on CPLEX 20.1.0.1 + + + + You can extend the software specification provided by Watson Machine Learning. See the [ExtendWMLSoftwareSpec](https://github.com/IBMDecisionOptimization/DO-Samples/blob/watson_studio_cloud/jupyter/watsonx.ai%20and%20Cloud%20Pak%20for%20Data%20as%20a%20Service/ExtendWMLSoftwareSpec.ipynb) notebook in the **jupyter** folder of the **[DO-samples](https://github.com/IBMDecisionOptimization/DO-Samples)**. + + Updating CPLEX runtimes: + + If you previously deployed your model with a CPLEX runtime that is no longer supported, you can update your existing deployed model by using either the [ REST API](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html#update-soft-specs-api) or the [UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html#discont-soft-spec). + * The **model type**: + + + + * opl (do-opl\_<*runtime version*>) + * cplex (do-cplex\_<*runtime version*>) + * cpo (do-cpo\_<*runtime version*>) + * docplex (do-docplex\_<*runtime version*>) using Python 3.10 + + + + (The *Runtime version* can be one of the available runtimes so, for example, an opl model with runtime 22.1 would have the model type *do-opl\_ 22.1*.) + + + + You obtain a *MODEL-ID*. Your Watson Machine Learning model can then be used in one or multiple deployments. +3. Upload your model archive (`tar.gz`, `.zip`, or `.jar` file) on Watson Machine Learning\. See [Model input and output data file formats](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/ModelIOFileFormats.html#topic_modelIOFileFormats) for information about input file types\. +4. Deploy your model by using the *MODEL\-ID*, *SPACE\-ID*, and the **hardware specification** for the available configuration sizes (small S, medium M, large L, extra large XL)\. See [configurations](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/Paralleljobs.html#topic_paralleljobs__34c6)\.You obtain a *DEPLOYMENT\-ID*\. +5. Monitor the deployment by using the *DEPLOYMENT\-ID*\. **Deployment states** can be: `initializing`, `updating`, `ready`, or `failed`\. +6. Submit jobs to your deployment\.You obtain a *JOB\-ID*\. +7. Monitor your jobs by using the JOB\-ID\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/93a3a5e1a633eb2ab616759dfb76dc433abd4d38.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/93a3a5e1a633eb2ab616759dfb76dc433abd4d38.md new file mode 100644 index 0000000..0bebc6e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/93a3a5e1a633eb2ab616759dfb76dc433abd4d38.md @@ -0,0 +1,50 @@ +# Troubleshooting Watson Studio on IBM Cloud + +# Troubleshooting Watson Studio on IBM Cloud # + +You can use the following techniques to work around problems you might encounter with Watson Studio on IBM Cloud\. + +## Project limit exceeded ## + +### Symptoms ### + +When you create a project, the following error occurs: + + The number of projects created by the authenticated user exceeds the designated limit. + +### Possible Causes ### + +The number of projects an authenticated user can create per data center (region) is 100\. The limit applies only to projects that a user creates\. Projects for which the user is listed as a collaborator are not included in this limit\. + +### Possible Resolutions ### + +Although most customers do not reach this limit, possible resolutions include: + + + + * Delete projects\. + * Any authenticated user can request a project limit increase by contacting [IBM Cloud Support](https://www.ibm.com/cloud/support), provided that an adequate justification is specified\. + + + +## Blank screen when loading ## + +### Symptoms ### + +A blank screen appears when you open Watson Studio\. + +### Possible Causes ### + +A cached version is loading\. + +### Possible Resolutions ### + + + +1. Clear the browser cache and cookies and re\-open Watson Studio\. +2. Try a different type of browser\. For example, switch from Firefox to Chrome\. +3. If the blank screen still occurs, [open a support case](https://cloud.ibm.com/unifiedsupport/supportcenter), generate a \.har file, compress it, and upload the compressed har file to the support case\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9455a31e5d6c749f3028f9f5e5f758f713c09973.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9455a31e5d6c749f3028f9f5e5f758f713c09973.md new file mode 100644 index 0000000..5644dab --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9455a31e5d6c749f3028f9f5e5f758f713c09973.md @@ -0,0 +1,45 @@ +# CLEM operators (SPSS Modeler) + +# CLEM operators # + +This page lists the available CLEM language operators\. + + + +CLEM language operators + +Table 1\. CLEM language operators + +| Operation | Comments | Precedence (see next section) | +| ----------------- | -------------------------------------------------------------------------------------------------------- | ----------------------------- | +| `or` | Used between two CLEM expressions\. Returns a value of true if either is true or if both are true\. | 10 | +| `and` | Used between two CLEM expressions\. Returns a value of true if both are true\. | 9 | +| `=` | Used between any two comparable items\. Returns true if ITEM1 is equal to ITEM2\. | 7 | +| `==` | Identical to `=`\. | 7 | +| `/=` | Used between any two comparable items\. Returns true if ITEM1 is *not* equal to ITEM2\. | 7 | +| `/==` | Identical to `/=`\. | 7 | +| `>` | Used between any two comparable items\. Returns true if ITEM1 is strictly greater than ITEM2\. | 6 | +| `>=` | Used between any two comparable items\. Returns true if ITEM1 is greater than or equal to ITEM2\. | 6 | +| `<` | Used between any two comparable items\. Returns true if ITEM1 is strictly less than ITEM2 | 6 | +| `<=` | Used between any two comparable items\. Returns true if ITEM1 is less than or equal to ITEM2\. | 6 | +| `&&=_0` | Used between two integers\. Equivalent to the Boolean expression INT1 && INT2 = 0\. | 6 | +| `&&/=_0` | Used between two integers\. Equivalent to the Boolean expression INT1 && INT2 /= 0\. | 6 | +| `+` | Adds two numbers: NUM1 \+ NUM2\. | 5 | +| `><` | Concatenates two strings; for example, `STRING1 >< STRING2`\. | 5 | +| `-` | Subtracts one number from another: NUM1 \- NUM2\. Can also be used in front of a number: \- NUM\. | 5 | +| `*` | Used to multiply two numbers: NUM1 \* NUM2\. | 4 | +| `&&` | Used between two integers\. The result is the bitwise 'and' of the integers INT1 and INT2\. | 4 | +| `&&~~` | Used between two integers\. The result is the bitwise 'and' of INT1 and the bitwise complement of INT2\. | 4 | +| `||` | Used between two integers\. The result is the bitwise 'inclusive or' of INT1 and INT2\. | 4 | +| `~~` | Used in front of an integer\. Produces the bitwise complement of INT\. | 4 | +| `||/&` | Used between two integers\. The result is the bitwise 'exclusive or' of INT1 and INT2\. | 4 | +| `INT1 << N` | Used between two integers\. Produces the bit pattern of INT shifted left by N positions\. | 4 | +| `INT1 >> N` | Used between two integers\. Produces the bit pattern of INT shifted right by N positions\. | 4 | +| `/` | Used to divide one number by another: NUM1 / NUM2\. | 4 | +| `**` | Used between two numbers: BASE \*\* POWER\. Returns BASE raised to the power POWER\. | 3 | +| `rem` | Used between two integers: INT1 rem INT2\. Returns the remainder, INT1 \- (INT1 div INT2) \* INT2\. | 2 | +| `div` | Used between two integers: INT1 div INT2\. Performs integer division\. | 2 | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/949025c4deea46fd131c7b8d89978d75fcc440c4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/949025c4deea46fd131c7b8d89978d75fcc440c4.md new file mode 100644 index 0000000..5734993 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/949025c4deea46fd131c7b8d89978d75fcc440c4.md @@ -0,0 +1,68 @@ +# samplenode properties + +# samplenode properties # + +![Sample node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/samplenodeicon.png) The Sample node selects a subset of records\. A variety of sample types are supported, including stratified, clustered, and nonrandom (structured) samples\. Sampling can be useful for improving performance, and for selecting groups of related records or transactions for analysis\. + +Example + + /* Create two Sample nodes to extract + different samples from the same data */ + + node = stream.create("sample", "My node") + node.setPropertyValue("method", "Simple") + node.setPropertyValue("mode", "Include") + node.setPropertyValue("sample_type", "First") + node.setPropertyValue("first_n", 500) + + node = stream.create("sample", "My node") + node.setPropertyValue("method", "Complex") + node.setPropertyValue("stratify_by", ["Sex", "Cholesterol"]) + node.setPropertyValue("sample_units", "Proportions") + node.setPropertyValue("sample_size_proportions", "Custom") + node.setPropertyValue("sizes_proportions", ["M", "High", "Default"], "M", "Normal", "Default"], + "F", "High", 0.3], "F", "Normal", 0.3]]) + + + +samplenode properties + +Table 1\. samplenode properties + +| `samplenode` properties | Data type | Property description | +| ------------------------- | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `method` | Simple Complex | | +| `mode` | `Include``Discard` | Include or discard records that meet the specified condition\. | +| `sample_type` | `First``OneInN``RandomPct` | Specifies the sampling method\. | +| `first_n` | *integer* | Records up to the specified cutoff point will be included or discarded\. | +| `one_in_n` | *number* | Include or discard every *n*th record\. | +| `rand_pct` | *number* | Specify the percentage of records to include or discard\. | +| `use_max_size` | *flag* | Enable use of the `maximum_size` setting\. | +| `maximum_size` | *integer* | Specify the largest sample to be included or discarded from the data stream\. This option is redundant and therefore disabled when `First` and `Include` are specified\. | +| `set_random_seed` | *flag* | Enables use of the random seed setting\. | +| `random_seed` | *integer* | Specify the value used as a random seed\. | +| `complex_sample_type` | `Random``Systematic` | | +| `sample_units` | `Proportions``Counts` | | +| `sample_size_proportions` | `Fixed``Custom``Variable` | | +| `sample_size_counts` | `Fixed``Custom``Variable` | | +| `fixed_proportions` | *number* | | +| `fixed_counts` | *integer* | | +| `variable_proportions` | *field* | | +| `variable_counts` | *field* | | +| `use_min_stratum_size` | *flag* | | +| `minimum_stratum_size` | *integer* | This option only applies when a Complex sample is taken with `Sample units=Proportions`\. | +| `use_max_stratum_size` | *flag* | | +| `maximum_stratum_size` | *integer* | This option only applies when a Complex sample is taken with `Sample units=Proportions`\. | +| `clusters` | *field* | | +| `stratify_by` | *\[field1 \.\.\. fieldN\]* | | +| `specify_input_weight` | *flag* | | +| `input_weight` | *field* | | +| `new_output_weight` | *string* | | +| `sizes_proportions` | \[\[`string`*string value*\]\[`string`*string value*\]…\] | If `sample_units=proportions` and `sample_size_proportions=Custom`, specifies a value for each possible combination of values of stratification fields\. | +| `default_proportion` | *number* | | +| `sizes_counts` | \[\[`string`*string value*\]\[`string`*string value*\]…\] | Specifies a value for each possible combination of values of stratification fields\. Usage is similar to `sizes_proportions` but specifying an integer rather than a proportion\. | +| `default_count` | *number* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/94fe9993a8201bdbd9d383cc4cc4ca4f2dddb47d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/94fe9993a8201bdbd9d383cc4cc4ca4f2dddb47d.md new file mode 100644 index 0000000..3a25f2d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/94fe9993a8201bdbd9d383cc4cc4ca4f2dddb47d.md @@ -0,0 +1,15 @@ +# TwoStep cluster node (SPSS Modeler) + +# TwoStep cluster node # + +The TwoStep Cluster node provides a form of cluster analysis\. It can be used to cluster the dataset into distinct groups when you don't know what those groups are at the beginning\. As with Kohonen nodes and K\-Means nodes, TwoStep Cluster models do *not* use a target field\. Instead of trying to predict an outcome, TwoStep Cluster tries to uncover patterns in the set of input fields\. Records are grouped so that records within a group or cluster tend to be similar to each other, but records in different groups are dissimilar\. + +TwoStep Cluster is a two\-step clustering method\. The first step makes a single pass through the data, during which it compresses the raw input data into a manageable set of subclusters\. The second step uses a hierarchical clustering method to progressively merge the subclusters into larger and larger clusters, without requiring another pass through the data\. Hierarchical clustering has the advantage of not requiring the number of clusters to be selected ahead of time\. Many hierarchical clustering methods start with individual records as starting clusters and merge them recursively to produce ever larger clusters\. Though such approaches often break down with large amounts of data, TwoStep's initial preclustering makes hierarchical clustering fast even for large datasets\. + +Note: The resulting model depends to a certain extent on the order of the training data\. Reordering the data and rebuilding the model may lead to a different final cluster model\. + +Requirements\. To train a TwoStep Cluster model, you need one or more fields with the role set to `Input`\. Fields with the role set to `Target`, `Both`, or `None` are ignored\. The TwoStep Cluster algorithm does not handle missing values\. Records with blanks for any of the input fields will be ignored when building the model\. + +Strengths\. TwoStep Cluster can handle mixed field types and is able to handle large datasets efficiently\. It also has the ability to test several cluster solutions and choose the best, so you don't need to know how many clusters to ask for at the outset\. TwoStep Cluster can be set to automatically exclude outliers, or extremely unusual cases that can contaminate your results\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9555087b12b80060fb337f8974fea9261174115e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9555087b12b80060fb337f8974fea9261174115e.md new file mode 100644 index 0000000..f975144 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9555087b12b80060fb337f8974fea9261174115e.md @@ -0,0 +1,63 @@ +# Condition monitoring (SPSS Modeler) + +# Condition monitoring # + +This example concerns monitoring status information from a machine and the problem of recognizing and predicting fault states\. + +The data is created from a fictitious simulation and consists of a number of concatenated series measured over time\. Each record is a snapshot report on the machine in terms of the following: + + + + * `Time`\. An integer\. + * `Power`\. An integer\. + * `Temperature`\. An integer\. + * `Pressure`\. `0` if normal, `1` for a momentary pressure warning\. + * `Uptime`\. Time since last serviced\. + * `Status`\. Normally `0`, changes to an error code if an error occurs (`101`, `202`, or `303`)\. + * `Outcome`\. The error code that appears in this time series, or `0` if no error occurs\. (These codes are available only with the benefit of hindsight\.) + + + +This example uses the flow named Condition Monitoring, available in the example project \. The data files are cond1n\.csv and cond2n\.csv\. + +For each time series, there's a series of records from a period of normal operation followed by a period leading to the fault, as shown in the following table: + + + +| Time | Power | Temperature | Pressure | Uptime | Status | Outcome | +| ---- | ----- | ----------- | -------- | ------ | ------ | ------- | +| 0 | 1059 | 259 | 0 | 404 | 0 | 0 | +| 1 | 1059 | 259 | 0 | 404 | 0 | 0 | +| | | | \.\.\. | | | | +| 51 | 1059 | 259 | 0 | 404 | 0 | 0 | +| 52 | 1059 | 259 | 0 | 404 | 0 | 0 | +| 53 | 1007 | 259 | 0 | 404 | 0 | 303 | +| 54 | 998 | 259 | 0 | 404 | 0 | 303 | +| | | | \.\.\. | | | | +| 89 | 839 | 259 | 0 | 404 | 0 | 303 | +| 90 | 834 | 259 | 0 | 404 | 303 | 303 | +| 0 | 965 | 251 | 0 | 209 | 0 | 0 | +| 1 | 965 | 251 | 0 | 209 | 0 | 0 | +| | | | \.\.\. | | | | +| 51 | 965 | 251 | 0 | 209 | 0 | 0 | +| 52 | 965 | 251 | 0 | 209 | 0 | 0 | +| 53 | 938 | 251 | 0 | 209 | 0 | 101 | +| 54 | 936 | 251 | 0 | 209 | 0 | 101 | +| | | | \.\.\. | | | | +| 208 | 644 | 251 | 0 | 209 | 0 | 101 | +| 209 | 640 | 251 | 0 | 209 | 101 | 101 | + + + +The following process is common to most data mining projects: + + + + * Examine the data to determine which attributes may be relevant to the prediction or recognition of the states of interest\. + * Retain those attributes (if already present), or derive and add them to the data, if necessary\. + * Use the resultant data to train rules and neural nets\. + * Test the trained systems using independent test data\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/95689297b729a4186914e81a59ffb3a09289f8d8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/95689297b729a4186914e81a59ffb3a09289f8d8.md new file mode 100644 index 0000000..49f970b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/95689297b729a4186914e81a59ffb3a09289f8d8.md @@ -0,0 +1,29 @@ +# Decision Optimization Python client examples + +# Python client examples # + +You can deploy a Decision Optimization model, create and monitor jobs, and get solutions by using the Watson Machine Learning Python client\. + +To deploy your model, see [Model deployment](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/ModelDeploymentTaskCloud.html)\. + +For more information, see [Watson Machine Learning Python client documentation](https://ibm.github.io/watson-machine-learning-sdk/core_api.html#deployments)\. + +See also the following sample notebooks located in the jupyter folder of the **[DO\-samples](https://github.com/IBMDecisionOptimization/DO-Samples)**\. Select the relevant product and version subfolder\.\. + + + + * Deploying a DO model with WML + * RunDeployedModel + * ExtendWMLSoftwareSpec + + + +The Deploying a DO model with WML sample shows you how to deploy a Decision Optimization model, create and monitor jobs, and get solutions by using the Watson Machine Learning Python client\. This notebook uses the diet sample for the Decision Optimization model and takes you through the whole procedure without using the Decision Optimization experiment UI\. + +The RunDeployedModel shows you how to run jobs and get solutions from an existing deployed model\. This notebook uses a model that is saved for deployment from a Decision Optimization experiment UI scenario\. + +The ExtendWMLSoftwareSpec notebook shows you how to extend the Decision Optimization software specification within Watson Machine Learning\. By extending the software specification, you can use your own pip package to add custom code and deploy it in your model and send jobs to it\. + +You can also find in the samples several notebooks for deploying various models, for example CPLEX, DOcplex and OPL models with different types of data\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/95c10fdc6d0c3b142da650044e1a0581d04ef8e4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/95c10fdc6d0c3b142da650044e1a0581d04ef8e4.md new file mode 100644 index 0000000..2b75cd6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/95c10fdc6d0c3b142da650044e1a0581d04ef8e4.md @@ -0,0 +1,26 @@ +# Creating a web chart (SPSS Modeler) + +# Creating a web chart # + +Since many of the data fields are categorical, you can also try plotting a web chart, which maps associations between different categories\. + +Figure 1\. Web node + +![Web node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_drug_web_flow.png) + + + +1. Place a Web node on the canvas and connect it to the drug1n\.csv Data Asset node\. Then double\-click the Web node to edit its properties\. +2. Select the fields `BP` (for blood pressure) and `Drug`\. Click Save, then right\-click the Web node and select Run\. A web chart is added to the Outputs pane\. + + Figure 2. Web graph of drugs vs. blood pressure + + ![Web graph of drugs vs. blood pressure](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_drug_web.png) + + + +From the plot, it appears that drug `Y` is associated with all three levels of blood pressure\. This is no surprise; you have already determined the situation in which drug `Y` is best\. + +But if you ignore drug `Y` and focus on the other drugs, you can see that drugs `A` and `B` are also associated with high blood pressure\. And drugs `C` and `X` are associated with low blood pressure\. And normal blood pressure is associated with drug `X`\. At this point, though, you still don't know how to choose between drugs `A` and `B` or between drugs `C` and `X`, for a given patient\. This is where modeling can help\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/96597f608c26e68bfc4bdca45061400d63793523.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/96597f608c26e68bfc4bdca45061400d63793523.md new file mode 100644 index 0000000..7f75504 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/96597f608c26e68bfc4bdca45061400d63793523.md @@ -0,0 +1,113 @@ +# Data formats for tuning foundation models + +# Data formats for tuning foundation models # + +Prepare a set of prompt examples to use to tune the model\. The examples must contain the type of input that the model will need to process at run time and the appropriate output for the model to generate in response\. + +You can add one file as training data\. The maximum file size that is allowed is 200 MB\. + +Prompt input\-and\-output example pairs are sometimes also referred to as *samples* or *records*\. + +Follow these guidelines when you create your training data: + + + + * Add 100 to 1,000 labeled prompt examples to a file\. Between 50 to 10,000 examples are allowed\. + * Use one of the following formats: + + + + * JavaScript Object Notation (JSON) + * JSON Lines (JSONL) format + + + + * Each example must include one `input` and `output` pair\. + * The language of the training data must be English\. + * If the input or output text includes quotation marks, escape each quotation mark with a backslash(`\`)\. For example, `He said, \"Yes.\"`\. + * To represent a carriage return or line break, you can use a backslash followed by `n` (`\n`) to represent the new line\. For example, `...end of paragraph.\nStart of new paragraph`\. + + + +You can control the number of tokens from the input and output that are used during training\. If an input or output example from the training data is longer than the specified limit, it will be truncated\. Only the allowed maximum number of tokens will be used by the experiment\. For more information, see [Controlling the number of tokens used](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-tune.html#tuning-tokens)\. + +How tokens are counted differs by model, which makes the number of tokens difficult to estimate\. For language\-based foundation models, you can think of 256 tokens as about 130—170 words and 128 tokens as about 65—85 words\. To learn more about tokens, see [Tokens and tokenization](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tokens.html)\. + +If you are using the model to classify data, follow these extra guidelines: + + + + * Try to limit the number of class labels to 10 or fewer\. + * Include an equal number of examples of each class type\. + + + +You can use the Prompt Lab to craft examples for the training data\. For more information, see [Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html)\. + +## JSON example ## + +The following example shows an excerpt from a training data file with labeled prompts for a classification task in JSON format\. + + { + [ + { + "input":"Message: When I try to log in, I get an error.", + "output":"Class name: Problem" + } + { + "input":"Message: Where can I find the plan prices?", + "output":"Class name: Question" + } + { + "input":"Message: What is the difference between trial and paygo?", + "output":"Class name: Question" + } + { + "input":"Message: The registration page crashed, and now I can't create a new account.", + "output":"Class name: Problem" + } + { + "input":"Message: What regions are supported?", + "output":"Class name: Question" + } + { + "input":"Message: I can't remember my password.", + "output":"Class name: Problem" + } + { + "input":"Message: I'm having trouble registering for a new account.", + "output":"Classname: Problem" + } + { + "input":"Message: A teammate shared a service instance with me, but I can't access it. What's wrong?", + "output":"Class name: Problem" + } + { + "input":"Message: What extra privileges does an administrator have?", + "output":"Class name: Question" + } + { + "input":"Message: Can I create a service instance for data in a language other than English?", + "output":"Class name: Question" + } + ] + } + +## JSONL example ## + +The following example shows an excerpt from a training data file with labeled prompts for a classification task in JSONL format\. + + {"input":"Message: When I try to log in, I get an error.","output":"Class name: Problem"} + {"input":"Message: Where can I find the plan prices?","output":"Class name: Question"} + {"input":"Message: What is the difference between trial and paygo?","output":"Class name: Question"} + {"input":"Message: The registration page crashed, and now I can't create a new account.","output":"Class name: Problem"} + {"input":"Message: What regions are supported?","output":"Class name: Question"} + {"input":"Message: I can't remember my password.","output":"Class name: Problem"} + {"input":"Message: I'm having trouble registering for a new account.","output":"Classname: Problem"} + {"input":"Message: A teammate shared a service instance with me, but I can't access it. What's wrong?","output":"Class name: Problem"} + {"input":"Message: What extra privileges does an administrator have?","output":"Class name: Question"} + {"input":"Message: Can I create a service instance for data in a language other than English?","output":"Class name: Question"} + +**Parent topic:**[Tuning a model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-tune.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/96b0df7161ff334810f77fe93235bd4d548164a7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/96b0df7161ff334810f77fe93235bd4d548164a7.md new file mode 100644 index 0000000..26d47c2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/96b0df7161ff334810f77fe93235bd4d548164a7.md @@ -0,0 +1,93 @@ +# Oracle connection + +# Oracle connection # + +To access your data in Oracle, you must create a connection asset for it\. + +Oracle is a multi\-model database management system\. + +## Supported versions ## + + + + * Oracle 19c and 21c + + + +## Create a connection to Oracle ## + +To create the connection asset, you need the following connection details: + + + + * Service name or Database (SID) + * Hostname or IP address + * Port number + * SSL certificate (if required by the database server) + * Alternate servers: A list of alternate database servers to use for failover for new or lost connections\. + Syntax: `(servername1[:port1]]]]...)` + + The server name (`servername1`, `servername2`, and so on) is required for each alternate server entry. The port number (`port1`, `port2`, and so on) and the connection properties (`property=value`) are optional for each alternate server entry. If the port is unspecified, the port number of the primary server is used. + + If the port number of the primary server is not specified, the default port number `1521` is used. + + The optional connection properties are the `ServiceName` and `SID`. + * Metadata discovery: The setting determines whether comments on columns (remarks) and aliases for schema objects such as tables or views (synonyms) are retrieved when assets are added by using this connection\. + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. For more information, see [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Oracle connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Oracle setup ## + +[Oracle installation](https://docs.oracle.com/cd/E11882_01/server.112/e10897/install.htm#ADMQS002) + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [Oracle Supported SQL Syntax and Functions](https://docs.oracle.com/en/database/oracle/oracle-database/21/gmswn/database-gateway-sqlserver-supported-sql-syntax-functions.html) for the correct syntax\. + +## Learn more ## + +[Oracle product documentation](https://docs.oracle.com/en/database/) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/96c0566da4eb3450616c3f358c32837bfd4de6c8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/96c0566da4eb3450616c3f358c32837bfd4de6c8.md new file mode 100644 index 0000000..c1a8533 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/96c0566da4eb3450616c3f358c32837bfd4de6c8.md @@ -0,0 +1,51 @@ +# Removing users from the account or from the workspace + +# Removing users from the account or from the workspace # + +The IBM Cloud account administrator or owner can remove users from the IBM Cloud account\. Any use with the **Admin** role can remove users from a workspace\. + +## Removing users from the IBM Cloud account ## + +You can remove a user from an IBM Cloud account, so that the user can no longer log in to the console, switch to your account, or access account resources\. + +### Required roles ### + +: To remove a user from an IBM Cloud account, you must have one of the following roles for your IBM Cloud account: : \- **Owner** : \- **Administrator** : \- **Editor** + +To remove a user from the IBM Cloud account: + + + +1. From the IBM watsonx navigation menu, click **Administration > Access (IAM)**\. +2. Click **Users** and find the name of the user that you want to remove\. +3. Choose **Remove user** from the action menu and confirm the removal\. + + + +Removing a user from an account doesn't delete the IBMid for the user\. Any resources such as projects or catalogs that were created by the user remain in the account, but the user no longer has access to work with those resources\. The account owner, or an administrator for the service instance, can assign other users to work with the projects and catalogs or delete them entirely\. + +For more information, see [IBM Cloud docs: Removing users from an account](https://cloud.ibm.com/docs/account?topic=account-remove)\. + +## Removing users from a workspace ## + +You can remove collaborators from a workspace, such as a project or space, so that the user can no longer access the workspace or any of its contents\. + +**Required role** : To remove a user from a workspace, you must have the **Admin** collaborator role for the workspace that you are editing\. + +To remove a collaborator, select one or more users (or user groups) on the **Access control** page of the workspace and click **Remove**\. + +The user is still a member of the IBM Cloud account and can be added as a collaborator to other workspaces as needed\. + +## Learn more ## + + + + * [Stop using IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/stopapps.html) + * [Project collaborators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html) + * [IBM Cloud docs: Removing users from an account](https://cloud.ibm.com/docs/account?topic=account-remove) + + + +**Parent topic:**[Managing the platform](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_console.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97050c74e0c144e4f16aa808d275a9a472489efb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97050c74e0c144e4f16aa808d275a9a472489efb.md new file mode 100644 index 0000000..d17626e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97050c74e0c144e4f16aa808d275a9a472489efb.md @@ -0,0 +1,20 @@ +# The scripting language + +# The scripting language # + +With the scripting facility for SPSS Modeler, you can create scripts that operate on the SPSS Modeler user interface, manipulate output objects, and run command syntax\. You can also run scripts directly from within SPSS Modeler\. + +Scripts in SPSS Modeler are written in the Python scripting language\. The Java\-based implementation of Python that's used by SPSS Modeler is called Jython\. The scripting language consists of the following features: + + + + * A format for referencing nodes, flows, projects, output, and other SPSS Modeler objects + * A set of scripting statements or commands you can use to manipulate these objects + * A scripting expression language for setting the values of variables, parameters, and other objects + * Support for comments, continuations, and blocks of literal text + + + +The following sections of this documentation describe the Python scripting language, the Jython implementation of Python, and the basic syntax for getting started with scripting in SPSS Modeler\. Information about specific properties and commands is provided in the sections that follow\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/971ae69d7d2a527c25f31a6c8d8d64ee68b48519.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/971ae69d7d2a527c25f31a6c8d8d64ee68b48519.md new file mode 100644 index 0000000..6857e57 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/971ae69d7d2a527c25f31a6c8d8d64ee68b48519.md @@ -0,0 +1,23 @@ +# Creating synthetic data from production data + +# Creating synthetic data from production data # + +Using the *Synthetic Data Generator* graphical editor flow tool, you can generate a structured synthetic data set based on your production data\. You can import data, *anonymize*, *mimic* (to generate synthetic data), export, and review your data\. + +Before you can use *mimic* and *mask* to create synthetic data, you need [to create a task](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/synthetic_data_overview_sd.html#create-synthetic)\. + +1\. The **Generate synthetic tabular data flow** window opens\. Select use case **Leverage your existing data**\. Click **Next**\. ![Generate synthetic tabular data flow window](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/sd-mimic-mask-flow.png) + +2\. Select **Import data**\. You can also drag\-and\-drop a data file into your project\. You can also select data from a project\. For more information, see [Importing data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/import_data_sd.html)\. ![Import data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/sd-import-data.png) + +3\. Once you have imported your data, you can use the *Synthetic Data Generator* graphical flow editor tool to *anonymize* your production data, masking the data\. You can disguise column names, column values, or both, when working with data that is to be included in a model downstream of the node\. For example, you can use bank customer data and hide marital status\. ![Anonymize data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/sd-anonymize.png) + +4\. You can then use the *Synthetic Data Generator* tool to *mimic* your production data\. This will generate synthetic data, based on your production data, using a set of candidate statistical distributions to modify each column in your data\. ![Mimic data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/sd-mimic-options.png) + +5\. You can export your synthetic data and review it\. For more information, see [Exporting synthetic data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/export_data_sd.html)\. ![Export data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/sd-export.png) + +## Learn more ## + +[Creating synthetic data from a custom data schema](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/generate_data_sd.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97492a97f355a95d56bcf768a62ca7fd75718086.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97492a97f355a95d56bcf768a62ca7fd75718086.md new file mode 100644 index 0000000..3978776 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97492a97f355a95d56bcf768a62ca7fd75718086.md @@ -0,0 +1,6 @@ +# Error bar charts + +# Error bar charts # + +Error bar charts represent the variability of data and indicate the error (or uncertainty) in a reported measurement\. Error bars help determine whether differences are statistically significant\. Error bars can also suggest goodness of fit for a specific function\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/977988398efbdcd10db4aced047d8d864883614a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/977988398efbdcd10db4aced047d8d864883614a.md new file mode 100644 index 0000000..4fe1cff --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/977988398efbdcd10db4aced047d8d864883614a.md @@ -0,0 +1,32 @@ +# Decision Optimization model input and output data file formats + +# Model input and output data file formats # + +With your Decision Optimization model, you can use the following input and output data identifiers and extension combinations\. + +This table shows the supported file type combinations for Decision Optimization in Watson Machine Learning: + + + +| Model type | Input file type | Output file type | Comments | +| ------------- | -------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`cplex`** | `.lp`
`.mps`
`.sav`
`.feasibility`
`.prm`

`.jar` for Java™
models | `.xml`
`.json`

The name of the output file must be **solution** | The output format can be specified by using the API\.

Files of type `.lp`, `.mps`, and `.sav` can be compressed by using `gzip` or `bzip2`, and uploaded as, for example, `.lp.gz` or `.sav.bz2`\.

The schemas for the CPLEX formats for solutions, conflicts, and feasibility files are available for you to download in the cplex\_xsds\.zip archive from the [Decision Optimization github](https://github.com/IBMDecisionOptimization/DO-Samples/blob/watson_studio_cloud/resources/cplex_xsds.zip)\. | +| **`cpo`** | `.cpo`

`.jar` for Java
models | `.xml`
`.json`

The name of the output file must be **solution** | The output format can be specified by using the solve parameter\.

For the native file format for CPO models, see: [CP Optimizer file format syntax](https://www.ibm.com/docs/en/icos/20.1.0?topic=manual-cp-optimizer-file-format-syntax)\. | +| **`opl`** | `.mod`
`.dat`
`.oplproject`
`.xls`
`.json`
`.csv`

`.jar` for Java
models | `.xml`
`.json`
`.txt`
`.csv`
`.xls` | The output format is consistent with the input type but can be specified by using the solve parameter if needed\. To take advantage of data connectors, use the `.csv` format\.

Only models that are defined with tuple sets can be deployed; other OPL structures are not supported\.

To read and write input and output in OPL, see [OPL models](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/OPLmodels.html#topic_oplmodels)\. | +| **`docplex`** | `.py`
`*.*` (input data) | Any output file type that is specified in the model\. | Any format can be used in your Python code, but to take advantage of data connectors, use the `.csv` format\.

To read and write input and output in Python, use the commands `get_input_stream("filename")` and `get_output_stream("filename")`\. See [DOcplex API sum example](https://ibmdecisionoptimization.github.io/docplex-doc/2.23.222/mp/docplex.util.environment.html) | + + + +Data identifier restrictions +: A file name has the following restrictions: + + + + * Is limited to 255 characters + * Can include only ASCII characters + * Cannot include the characters `/\?%*:|"<>`, the space character, or the null character + * Cannot include \_ as the first character + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/977c81385f7825613f1edbd3c0dbf44c259ba8d7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/977c81385f7825613f1edbd3c0dbf44c259ba8d7.md new file mode 100644 index 0000000..f8dfdf2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/977c81385f7825613f1edbd3c0dbf44c259ba8d7.md @@ -0,0 +1,166 @@ +# Searching for assets and artifacts across the platform + +# Searching for assets and artifacts across the platform # + +# Searching for assets across the platform # + +You can use the global search bar to search for assets across all the projects and deployment spaces to which you have access\. + + + + * [Requirements and restrictions](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/search-assets.html?context=cdpaas&locale=en#restrictions) + * [Searching for assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/search-assets.html?context=cdpaas&locale=en#search) + * [Selecting results](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/search-assets.html?context=cdpaas&locale=en#result) + + + +## Requirements and restrictions ## + +You can find assets and artifacts under the following circumstances\. + + + + * **Required permissions** + You can have any role in projects or deployment spaces to find assets. + + + + + + * **Workspaces** + + + + * You can search for assets that are in these workspaces: + + + + * Projects + * Deployment spaces + + + + + + * **Types of assets** + You can search for all types of assets. + * **Restrictions** + + + + * Your search results include only assets in workspaces that you belong to. + + + + + +## Searching for assets ## + +To search for an asset, you can enter one or more words in the global search field\. The search results are matches from these properties of assets: + + + + * Name + * Description + * Tags + * Table name + + + +You can customize your searches with these techniques: + + + + * [Searching for the start of a word](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/search-assets.html?context=cdpaas&locale=en#start) + * [Searching for a part of a word](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/search-assets.html?context=cdpaas&locale=en#part) + * [Searching for a phrase](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/search-assets.html?context=cdpaas&locale=en#phrase) + * [Searching for multiple alternative words](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/search-assets.html?context=cdpaas&locale=en#multiple) + + + +### Searching for the start of a word ### + +To search for words starting with a letter or letters, enter the first 1\-3 letters of the word\. If you enter only one letter, words starting with that letter are returned\. If you enter two or three letters, words starting with those letters will be prioritized over the words containing those letters\. For example, if you search for `i` , you will get results like `initial` and `infinite` , but not `definite`\. If you search for `in` you will additionally get results containing `definite` ranked lower in the results list\. + +### Searching for a part of a word ### + +To search for partial word matches, include more than 3 letters\. For example, if you search for `conn`, you might get results like `connection` and `disconnect`\. + +Only the first 12 characters in a word are used in the search\. Any search terms that you enter that are longer than 12 characters are truncated to the first 12 characters\. + +Searches for partial words don't work in the description fields\. + +### Searching for a phrase ### + +To search for a specific phrase, surround the phrase with double quotation marks\. For example, if you search for `"payment plan prediction"`, your results contain exactly that phrase\. + +You can include a quoted phrase within a longer search string\. For example, if you search for `credit card "payment plan prediction"`, you might get results that contain `credit card`, `credit`, `card`, and `payment plan prediction`\. + +When you search for a phrase in English, natural language analysis optimizes the search results in the following ways: + + + + * Words that are not important to the search intent are removed from the search query\. + * Phrases in the search string that are common in English are automatically ranked higher than results for individual words\. + + + +For example, if you search for `find credit card interest in United States`, you might get the following results: + + + + * Matches for `credit card interest` and `United States` are prioritized\. + * Matches for `credit`, `card`, `interest`, `United`, and `States` are returned\. + * Matches for `in` are not returned\. + + + +### Searching for multiple alternative words ### + +To find results that contain *any* of your search terms, enter multiple words\. For example, if you search for `machine learning`, the results contain the word `machine`, the word `learning`, or both words\. + +## Selecting results ## + +To select the best result, look at which property of the asset or artifact matches your search string\. The matching text is highlighted\. + +The highest scoring results are for matches to the name of the asset\. Multiple assets can have the same name\. However, the name of the project, deployment or space, is shown underneath the asset name so you can determine which result is the one you want\. + +Click an asset name to view it in its project or deployment space\. + +Results are prioritized in this order: + + + +1. Matches of quoted phrases or common phrases (for English only) +2. Exact matches of complete words +3. Partial matches of complete words +4. Fuzzy matches + + + +From the search results, you can click **Preview** to view more information in the side panel\. + +### Filtering and sorting results ### + +You can filter search results by these properties: + + + + * Type of asset + * Tags + * Owners (for some types of assets) + * The user who modified the asset + * The time period when the asset was last modified + * Projects (assets only) + * Workspaces + * Schema + * Table + * Contains: Feature group + + + +You can sort results by the most relevant or the last modified date\. + +**Parent topic:**[Asset types and properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9789f3a8936ad06c653c1c7aeb421c70ffd7c3e1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9789f3a8936ad06c653c1c7aeb421c70ffd7c3e1.md new file mode 100644 index 0000000..2299da2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9789f3a8936ad06c653c1c7aeb421c70ffd7c3e1.md @@ -0,0 +1,21 @@ +# Random functions (SPSS Modeler) + +# Random functions # + +The functions listed on this page can be used to randomly select items or randomly generate numbers\. + + + +CLEM random functions + +Table 1\. CLEM random functions + +| Function | Result | Description | +| -------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `oneof(LIST)` | *Any* | Returns a randomly chosen element of *LIST*\. List items should be entered as `[ITEM1,ITEM2,...,ITEM_N]`\. Note that a list of field names can also be specified\. | +| `random(NUM)` | *Number* | Returns a uniformly distributed random number of the same type (*INT* or *REAL*), starting from 1 to *NUM*\. If you use an integer, then only integers are returned\. If you use a real (decimal) number, then real numbers are returned (decimal precision determined by the stream options)\. The largest random number returned by the function could equal *NUM*\. | +| `random0(NUM)` | *Number* | This has the same properties as `random(NUM)`, but starting from 0\. The largest random number returned by the function will never equal *NUM*\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97b722619afc616f13beb20cd7a8fbc29cff50d1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97b722619afc616f13beb20cd7a8fbc29cff50d1.md new file mode 100644 index 0000000..551c3c2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97b722619afc616f13beb20cd7a8fbc29cff50d1.md @@ -0,0 +1,29 @@ +# Viewing jobs across projects + +# Viewing jobs across projects # + +You can view the jobs that exist across projects for assets that run in tools, such as notebooks, Data Refinery flows, and SPSS Modeler flows\. + +To view the status of jobs or job runs in projects: + + + +1. From the navigation menu, select **Projects > Jobs**\. +2. Select a view scope: + + + + * **Jobs with finished runs**: all jobs that contain finished runs + * **Finished runs**: all job runs that have finished + * **Jobs with active runs**: all jobs that contain that contain active runs + * **Active runs**: all job runs that are still active + + + +3. Click ![the Filters icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/edit-filters.png) from the table toolbar to further narrow down the returned search results for the view scope you selected\. The filter options vary depending the view scope selection, for example, for jobs with active runs, you can filter by run state, job type and project, whereas for finished runs by time, run state, whether the runs were started manually or by a schedule, job type, run duration and project\. + + + +**Parent topic:**[Jobs](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97c26f347fd5a13fbc5b24fc567fcf7adf8ce0c3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97c26f347fd5a13fbc5b24fc567fcf7adf8ce0c3.md new file mode 100644 index 0000000..6c52cf7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97c26f347fd5a13fbc5b24fc567fcf7adf8ce0c3.md @@ -0,0 +1,96 @@ +# Creating your own models + +# Creating your own models # + +Certain algorithms in Watson Natural Language Processing can be trained with your own data, for example you can create custom models based on your own data for entity extraction, to classify data, to extract sentiments, and to extract target sentiments\. + +Starting with Runtime 23\.1 you can use the new built\-in transformer\-based IBM foundation model called Slate to create your own models\. The Slate model has been trained on a very large data set that was preprocessed to filter hate, bias, and profanity\. + +To create your own classification, entity extraction model, or sentiment model you can fine\-tune the Slate model on your own data\. To train the model in reasonable time, it's recommended to use GPU\-based environments\. + + + + * [Detecting entities with a custom dictionary](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-entities-dict.html) + * [Detecting entities with regular expressions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-entities-regex.html) + * [Detecting entities with a custom transformer model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-entities-transformer.html) + * [Classifying text with a custom classification model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-classify-text.html) + * [Extracting sentiment with a custom transformer model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-extract-sentiment.html) + * [Extracting targets sentiment with a custom transformer model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-target-sentiment.html) + + + +## Language support for custom models ## + +You can create custom models and use the following pretrained dictionary and classification models for the shown languages\. For a list of the language codes and the corresponding languages, see [Language codes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html#lang-codes)\. + + + +Supported languages for out\-of\-the\-box custom models + +| Custom model | Supported language codes | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Dictionary models | af, ar, bs, ca, cs, da, de, el, en, es, fi, fr, he, hi, hr, it, ja, ko, nb, nl, nn, pl, pt, ro, ru, sk, sr, sv, tr, zh\_cn, zh\_tw (all languages supported in the Syntax part of speech tagging) | +| Regexes | af, ar, bs, ca, cs, da, de, el, en, es, fi, fr, he, hi, hr, it, ja, ko, nb, nl, nn, pl, pt, ro, ru, sk, sr, sv, tr, zh\_cn, zh\_tw (all languages supported in the Syntax part of speech tagging) | +| SVM classification with TFIDF | af, ar, ca, cs, da, de, el, en, es, fi, fr, he, hi, hr, it, ja, ko, nb, nl, nn, pl, pt, ro, ru, sk, sr, sv, tr, zh\_cn, zh\_tw | +| SVM classification with USE | ar, de, en, es, fr, it, ja, ko, nl, pl, pt, ru, tr, zh\_cn, zh\_tw | +| CNN classification with GloVe | ar, de, en, es, fr, it, ja, ko, nl, pt, zh\_cn | +| BERT Multilingual classification | af, ar, ca, cs, da, de, el, en, es, fi, fr, he, hi, hr, it, ja, ko, nb, nl, nn, pl, pt, ro, ru, sk, sr, sv, tr, zh\_cn, zh\_tw | +| Transformer model | af, ar, bs, ca, cs, da, de, el, en, es, fi, fr, he, hi, hr, it, ja, ko, nb, nl, nn, pl, pt, ro, ru, sk, sr, sv, tr, zh\_cn, zh\_tw | +| Stopword lists | ar, de, en, es, fr, it, ja, ko | + + + +## Saving and loading custom models ## + +If you want to use your custom model in another notebook, save it as a Data Asset to your project\. This way, you can export the model as part of a project export\. + +Use the `ibm-watson-studio-lib` library to save and load custom models\. + +To save a custom model in your notebook as a data asset to export and use in another project: + + + +1. Ensure that you have an access token on the **Access control** page on the **Manage** tab of your project\. Only project admins can create access tokens\. The access token can have viewer or editor access permissions\. Only editors can inject the token into a notebook\. +2. Add the project token to a notebook by clicking **More > Insert project token** from the notebook action bar and then run the cell\. When you run the inserted hidden code cell, a `wslib` object is created that you can use for functions in the `ibm-waton-studio-lib` library\. For details on the available `ibm-watson-studio-lib` functions, see [Using `ibm-watson-studio-lib` for Python](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html)\. +3. Run the `train()` method to create a custom dictionary, regular expression, or classification model and assign this custom model to a variable\. For example: + + custom_block = CNN.train(train_stream, embedding_model.embedding, verbose=2) +4. If you want to save a custom dictionary or regular expression model, convert it to a RBRGeneric block\. Converting a custom dictionary or regular expression model to a RBRGeneric block is useful if you want to load and execute the model using the [API for Watson Natural Language Processing for Embed](https://www.ibm.com/docs/en/watson-libraries?topic=home-api-reference)\. To date, Watson Natural Language Processing for Embed supports running dictionary and regular expression models only as RBRGeneric blocks\. To convert a model to a RBRGeneric block, run the following commands: + + # Create the custom regular expression model + custom_regex_block = watson_nlp.resources.feature_extractor.RBR.train(module_folder, language='en', regexes=regexes) + + # Save the model to the local file system + custom_regex_model_path = 'some/path' + custom_regex_block.save(custom_regex_model_path) + + # The model was saved in a file "executor.zip" in the provided path, in this case "some/path/executor.zip" + model_path = os.path.join(custom_regex_model_path, 'executor.zip') + + # Re-load the model as a RBRGeneric block + custom_block = watson_nlp.blocks.rules.RBRGeneric(watson_nlp.toolkit.rule_utils.RBRExecutor.load(model_path), language='en') +5. Save the model as a Data Asset to your project using `ibm-watson-studio-lib`: + + wslib.save_data("", custom_block.as_bytes(), overwrite=True) + + When saving transformer models, you have the option to save the model in CPU format. If you plan to use the model only in CPU environments, using this format will make your custom model run more efficiently. To do that, set the CPU format option as follows: + + wslib.save_data('', data=custom_model.as_bytes(cpu_format=True), overwrite=True) + + + +To load a custom model to a notebook that was imported from another project: + + + +1. Ensure that you have an access token on the **Access control** page on the **Manage** tab of your project\. Only project admins can create access tokens\. The access token can have viewer or editor access permissions\. Only editors can inject the token into a notebook\. +2. Add the project token to a notebook by clicking **More > Insert project token** from the notebook action bar and then run the cell\. When you run the the inserted hidden code cell, a `wslib` object is created that you can use for functions in the `ibm-watson-studio-lib` library\. For details on the available `ibm-watson-studio-lib` functions, see [Using `ibm-watson-studio-lib` for Python](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html)\. +3. Load the model using `ibm-watson-studio-lib` and `watson-nlp`: + + custom_block = watson_nlp.load(wslib.load_data("")) + + + +**Parent topic:**[Watson Natural Language Processing library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97fa49d526786021cf325ff9aff15646a8270b48.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97fa49d526786021cf325ff9aff15646a8270b48.md new file mode 100644 index 0000000..634d24a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/97fa49d526786021cf325ff9aff15646a8270b48.md @@ -0,0 +1,11 @@ +# Native Python APIs (SPSS Modeler) + +# Native Python APIs # + +You can invoke native Python APIs from your scripts to interact with SPSS Modeler\. + +The following APIs are supported\. + +To see an example, you can download the sample stream [python\-extension\-str\.zip](https://github.com/IBMDataScience/ModelerFlowsExamples/blob/main/samples) and import it into SPSS Modeler (from your project, click New asset, select SPSS Modeler, then select Local file)\. Then open the Extension node properties in the flow to see example syntax\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/981bcfc7f5817524cb8e0c9fe04e3f267a268926.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/981bcfc7f5817524cb8e0c9fe04e3f267a268926.md new file mode 100644 index 0000000..e203b4a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/981bcfc7f5817524cb8e0c9fe04e3f267a268926.md @@ -0,0 +1,97 @@ +# IBM Cognos Analytics connection + +# IBM Cognos Analytics connection # + +To access your data in Cognos Analytics, create a connection asset for it\. + +Cognos Analytics is an AI\-fueled business intelligence platform that supports the entire analytics cycle, from discovery to operationalization\. + +## Supported versions ## + +IBM Cognos Analytics 11 + +## Supported content types ## + + + + * Report (except Reports that require prompts) + * Query + + + +## Create a connection to Cognos Analytics ## + +To create the connection asset, you need these connection details: + + + + * Gateway URL + * SSL certificate (if required by the database server) + + + +### Credentials ### + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Cognos Analytics connections in the following workspaces and tools: + + + + * Data Refinery + * Notebooks\. Click **Read data** on the **Code snippets** pane to get the connection credentials and load the data into a data structure\. See [Load data from data source connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html#conns)\. + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Cognos Analytics setup ## + +Instructions for setting up Cognos Analytics: [Getting started in Cognos Analytics](https://www.ibm.com/support/knowledgecenter/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ca_gtstd.doc/c_gtstd_ica_overview.html)\. + +## Restrictions ## + + + + * You can use this connection only for source data\. You cannot write to data or export data with this connection\. + * Notebooks: Self\-signed certificates are not supported for notebooks\. The SSL certificate that is imported into the Cognos Analytics server must be signed by a trusted root authority\. To confirm that the certificate is signed by a trusted root authority, enter the Cognos Analytics URL into a browser and verify that there is a padlock to the left of the URL\. If the certificate is self\-signed, the Cognos Analytics server administrator must replace it with a trusted TLS certificate\. + + + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to [Working with Queries in SQL](https://www.ibm.com/docs/SSEP7J_11.2.0/com.ibm.swg.ba.cognos.ug_cr_rptstd.doc/c_cr_rptstd_wrkdat_working_with_sql_mdx_rel.html) in the Cognos Analytics documentation for the correct syntax\. + +## Learn more ## + +[Cognos Analytics documentation](https://www.ibm.com/docs/cognos-analytics/11.0.0) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/984b203b8a0054a07f5be3eb99438c7fbcb6ce85.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/984b203b8a0054a07f5be3eb99438c7fbcb6ce85.md new file mode 100644 index 0000000..d93325f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/984b203b8a0054a07f5be3eb99438c7fbcb6ce85.md @@ -0,0 +1,28 @@ +# Node and flow property examples + +# Node and flow property examples # + +You can use node and flow properties in a variety of ways with SPSS Modeler\. They're most commonly used as part of a script: either a standalone script, used to automate multiple flows or operations, or a flow script, used to automate processes within a single flow\. You can also specify node parameters by using the node properties within the SuperNode\. At the most basic level, properties can also be used as a command line option for starting SPSS Modeler\. Using the `-p` argument as part of command line invocation, you can use a flow property to change a setting in the flow\. + + + +Node and flow property examples + +Table 1\. Node and flow property examples + +| Property | Meaning | +| ----------------------- | --------------------------------------------------------------------------------------------------------------- | +| `s.max_size` | Refers to the property `max_size` of the node named `s`\. | +| `s:samplenode.max_size` | Refers to the property `max_size` of the node named `s`, which must be a Sample node\. | +| `:samplenode.max_size` | Refers to the property `max_size` of the Sample node in the current flow (there must be only one Sample node)\. | +| `s:sample.max_size` | Refers to the property `max_size` of the node named `s`, which must be a Sample node\. | +| `t.direction.Age` | Refers to the role of the field `Age` in the Type node `t`\. | +| `:.max_size` | \*\*\* NOT LEGAL \*\*\* You must specify either the node name or the node type\. | + + + +The example `s:sample.max_size` illustrates that you don't need to spell out node types in full\. + +The example `t.direction.Age` illustrates that some slot names can themselves be structured—in cases where the attributes of a node are more complex than simply individual slots with individual values\. Such slots are called structured or complex properties\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/98aa3e34d14723232d266a85cbb9e2b1816b1aa5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/98aa3e34d14723232d266a85cbb9e2b1816b1aa5.md new file mode 100644 index 0000000..9561e6a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/98aa3e34d14723232d266a85cbb9e2b1816b1aa5.md @@ -0,0 +1,182 @@ +# Quick start: Refine data + +# Quick start: Refine data # + +You can save data preparation time by quickly transforming large amounts of raw data into consumable, high\-quality information that is ready for analytics\. Read about the Data Refinery tool, then watch a video and take a tutorial that’s suitable for beginners and does not require coding\. + +Your basic workflow includes these tasks: + + + +1. Open your sandbox project\. Projects are where you can collaborate with others to work with data\. +2. Add your data to the project\. You can add CSV files or data from a remote data source through a connection\. +3. Open the data in Data Refinery\. +4. Perform steps using operations to refine the data\. +5. Create and run a job to transform the data\. + + + +## Read about Data Refinery ## + +Use Data Refinery to cleanse and shape tabular data with a graphical flow editor\. You can also use interactive templates to code operations, functions, and logical operators\. When you *cleanse data*, you fix or remove data that is incorrect, incomplete, improperly formatted, or duplicated\. When you *shape data*, you customize it by filtering, sorting, combining or removing columns, and performing operations\. + +You create a Data Refinery flow as a set of ordered operations on data\. Data Refinery includes a graphical interface to profile your data to validate it and over 20 customizable charts that give you perspective and insights into your data\. When you save the refined data set, you typically load it to a different location than where you read it from\. In this way, your source data remains untouched by the refinement process\. + +[Read more about refining data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + +## Watch a video about refining data ## + +![Watch Video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) Watch this video to see how to refine data\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Try a tutorial to refine data ## + +In this tutorial, you will complete these tasks: + + + + * [Task 1: Open a project\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html?context=cdpaas&locale=en#step01) + * [Task 2: Open the data set in Data Refinery\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html?context=cdpaas&locale=en#step02) + * [Task 3: Review the data with Profile and Visualizations\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html?context=cdpaas&locale=en#step03) + * [Task 4: Refine the data\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html?context=cdpaas&locale=en#step04) + * [Task 5: Run a job for the Data Refinery flow\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html?context=cdpaas&locale=en#step05) + * [Task 6: Create another data asset from the Data Refinery flow\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html?context=cdpaas&locale=en#step06) + * [Task 7: View the data assets and your Data Refinery flow in your project\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html?context=cdpaas&locale=en#step07) + + + +This tutorial will take approximately 30 minutes to complete\. + +Expand all sections + + + + * Tips for completing this tutorial + + \#\#\# Use the video picture-in-picture Tip: Start the video, then as you scroll through the tutorial, the video moves to picture-in-picture mode. Close the video table of contents for the best experience with picture-in-picture. You can use picture-in-picture mode so you can follow the video as you complete the tasks in this tutorial. Click the timestamps for each task to follow along.The following animated image shows how to use the video picture-in-picture and table of contents features: ![How to use picture-in-picture and chapters](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/pip-and-chapters.gif)\{: width="560px" height="315px" data-tearsheet="this"\} \#\#\# Get help in the community If you need help with this tutorial, you can ask a question or find an answer in the [Cloud Pak for Data Community discussion forum](https://community.ibm.com/community/user/cloudpakfordata/communities/community-home/digestviewer?communitykey=c0c16ff2-10ef-4b50-ae4c-57d769937235)\{: new\_window\}. \#\#\# Set up your browser windows For the optimal experience completing this tutorial, open Cloud Pak for Data in one browser window, and keep this tutorial page open in another browser window to switch easily between the two applications. Consider arranging the two browser windows side-by-side to make it easier to follow along. ![Side-by-side tutorial and UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/tutorial-side-by-side.png)\{: width="560px" height="315px" data-tearsheet="this"\} Tip: If you encounter a guided tour while completing this tutorial in the user interface, click **Maybe later**. + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 1: Open a project + + You need a project to store the data and the Data Refinery flow. You can use your sandbox project or create a project. 1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg)\{: iih\}, choose **Projects > View all projects** 1. Open your sandbox project. If you want to use a new project: 1. Click **New project**. 1. Select **Create an empty project**. 1. Enter a name and optional description for the project. 1. Choose an existing [object storage service instance](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/storage-options.html)\{: new\_window\} or create a new one. 1. Click **Create**. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows a new, empty project. + + ![The following image shows a new, empty project.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/dr-new-project.png)\{: width="100%" \} For more information or to watch a video, see [Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html)\{: new\_window\}. + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 2: Open the data set in Data Refinery + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:05. Follow these steps to add a data asset to your project and create a Data Refinery flow. The data set you will use in this tutorial is available in the Samples. 1. Access the [Airline data](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/8fa07e57e69f7d0cb970c86c6ae52d41)\{: new\_window\} in the Samples. 1. Click **Add to project**. 1. Select your project from the list, and click **Add**. 1. After the data set is added, click **View Project**. For more information on adding a data asset from the Samples to a project, see [Loading and accessing data in a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html). 1. On the *Assets* tab, click the **airline-data.csv** data asset to preview its content. 1. Click **Prepare data** to open a sample of the file in Data Refinery, and wait until Data Refinery reads and processes a sample of the data. 1. Close the **Information** and **Steps** panels. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the airline data asset open in Data Refinery. + + ![The following image shows the airline data asset open in Data Refinery.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/dr-asset-open-in-dr.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 3: Review the data with Profile and Visualizations + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:47. IBM Knowledge Catalog automatically profiles and classifies the content of an asset based on the values in those columns. Follow these steps to use the Profile and Visualizations tabs to explore the data. Tip: Use the Profile and Visualizations pages to view changes in the data as you refine it.1. Click the **Profile** tab to review the [frequency distribution](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/metrics.html)\{: new\_window\} of the data so that you can find the outliers. 1. Scroll through the columns to the see the statistics for each column. The statistics show the interquartile range, minimum, maximum, median and standard deviation in each column. 1. Hover over a bar to see additional details. The following image shows the Profile tab: + ![Profile tab](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/airline-profile-integer.png) 1. Click the **Visualizations** tab. 1. Select the **UniqueCarrier** column to visualize. Suggested [charts](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/visualizations.html)\{: new\_window\} have a blue dot next to their icons. 1. Click the **Pie** chart. Use the different perspectives available in the charts to identify patterns, connections, and relationships within the data. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the Visualizations tab. You are now ready to refine the data. + + ![Visualizations tab](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/airline-viz.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 4: Refine the data + + \#\#\# Data Refinery operations Data Refinery uses two kinds of operations to refine data, *GUI operations* and *coding operations*. You will use both kinds of operations in this tutorial. - [GUI operations](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/gui_operations.html)\{: new\_window\} can consist of multiple steps. Select an operation from **New step**. A subset of the GUI operations is also available from each column's overflow menu (![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/overflow-menu--vertical.svg)\{: iih\}). When you open a file in Data Refinery, the **Convert column type** operation is automatically applied as the first step to convert any non-string data types to inferred data types (for example, to Integer, Date, Boolean, etc.). You can undo or edit this step. - [Coding operations](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/code_operations.html)\{: new\_window\} are interactive templates for coding operations, functions, and logical operators. Most of the operations have interactive help. Click the operation name in the command-line text box to see the coding operations and their syntax options. ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 01:16. Refining data is a series of steps to build a *Data Refinery flow*. As you go through this task, view the **Steps** panel to follow your progress. You can select a step to delete or edit it. If you make a mistake, you can also click the Undo icon ![Undo icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/undo.png)\{: iih\}. Follow these steps to refine the data: 1. Go back to the **Data** tab. 1. Select the *Year* column. Click the **Overflow** menu (![Overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/overflow-menu--vertical.svg)\{: iih\}) and choose **Sort descending**. 1. Click **Steps** to see the new step in the *Steps* panel. 1. Focus on the delays for a specific airline. This tutorial uses United Airlines (UA), but you can choose any airline. 1. Click **New step**, and then choose the GUI operation **Filter**. 1. Choose the **UniqueCarrier** column. 1. For *Operator*, choose **Is equal to**. 1. For *Value*, type the string for the airline for which you want to see delay information. For example, `UA`\{: .cp\}. + ![Filter operation](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/filter.png) 1. Click **Apply**. Scroll to the *UniqueCarrier* column to see the results. 1. Create a new column that adds the arrival and departure delay times together. 1. Select the **DepDelay** column. 1. Notice that the *Convert column type* operation was automatically applied as the first step to convert the String data types in all the columns whose values are numbers to Integer data types. 1. Click **New step**, and then choose the GUI operation **Calculate**. 1. For *Operator*, choose **Addition**. 1. Select **Column**, and then choose the **ArrDelay** column. 1. Select **Create new column for results**. 1. For *New column name*, type `TotalDelay`\{: .cp\}. + ![Calculate operation](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/calculate.png) 1. You can position the new column at the end of the list of columns or next to the original column. In this case, select **Next to original column**. 1. Click **Apply**. The new column, *TotalDelay*, is added. 1. Move the new *TotalDelay* column to the beginning of the data set: 1. In the command-line text box, choose the **select** operation. 1. Click the word **select**, and then choose **select(\```\`, everything())**. 1. Click **`` `` ``**, and then choose the **TotalDelay** column. When you finish, the command should look like this: ``select(`TotalDelay`, everything())`` 1. Click **Apply**. The *TotalDelay* column is now the first column. 1. Reduce the data to four columns: *Year*, *Month*, *DayofMonth*, and *TotalDelay*. Use the **group\_by** coding operation to divide the columns into groups of year, month, and day. 1. In the command-line text box, choose the **group\_by** operation. 1. Click **``**, and then choose the **Year** column. 1. Before the closing parenthesis, type: `,Month,DayofMonth`\{: .cp\}. When you finish, the command should look like this: ``group_by(`Year`,Month,DayofMonth)`` 1. Click **Apply**. 1. Use the **select** coding operation for the *TotalDelay* column. In the command-line text box, select the **select** operation. + Click **``**, and choose the **TotalDelay** column. The command should look like this: ``select(`TotalDelay`)`` 1. Click **Apply**. The shaped data now consists of the *Year*, *Month*, *DayofMonth*, and *TotalDelay* columns. The following screen image shows the first four rows of the data. + ![The first four rows of the Data Refinery flow with the Year, Month, DayofMonth, and TotalDelay columns](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/four_columns_with_totaldelay.png) 1. Show the mean of the values of the *TotalDelay* column, and create a new *AverageDelay* column: 1. Click **New step**, and then choose the GUI operation **Aggregate**. 1. For the *Column*, select **TotalDelay**. 1. For *Operator*, select **Mean**. 1. For *Name of the aggregated column*, type `AverageDelay`\{: .cp\}. + ![Aggregate operation](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/aggregate.png)\{: height="500px"\} 1. Click **Apply**. The new column *AverageDelay* is the average of all the delay times. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the first four rows of the data. + + ![The following screen image shows the first four rows of the data.](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/four_columns_with_delay.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 5: Run a job for the Data Refinery flow + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 04:16. When you run a job for the Data Refinery flow, the steps are run on the entire data set. You select the runtime and add a one-time or repeating schedule. The output of the Data Refinery flow is added to the data assets in the project. Follow these steps to run a job to create the refined data set. 1. From the Data Refinery toolbar, click the **Jobs** icon, and select **Save and create a job**. + ![Save and create a job](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/save-create-job.png) 1. Type a name and description for the job, and click **Next**. 1. Select a runtime environment, and click **Next**. 1. (Optional) Click the toggle button to schedule a run. Specify the date, time and if you would like the job to repeat, and click **Next**. 1. (Optional) Turn on notifications for this job, and click **Next**. 1. Review the details, and click **Create and run** to run the job immediately. + ![create job](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/create-run.png) 1. When the job is created, click the **job details** link in the notification to view the job in your project. Alternatively, you can navigate to the **Jobs** tab in the project, and click the job name to open it. 1. When the *Status* for the job is **Completed**, use the project navigation trail to navigate back to the *Assets* tab in the project. 1. Click the **Data > Data assets** section to see the output of the Data Refinery flow, *airline-data\_shaped.csv*. 1. Click the **Flows > Data Refinery flows** section to see the Data Refinery flow, *airline-data.csv\_flow*. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the Assets tab with the Data Refinery flow and shaped asset. + + ![The following image shows the Assets tab with the Data Refinery flow and shaped asset.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/dr-project-shaped-data.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 6: Create another data asset from the Data Refinery flow + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 05:26. Follow these steps to further refine the data set by editing the Data Refinery flow: 1. Click **airline-data.csv\_flow** to open the flow in Data Refinery. 1. Sort the *AverageDelay* column in descending order. 1. Select the **AverageDelay** column. 1. Click the column **Overflow** menu (![Overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/overflow-menu--vertical.svg)\{: iih\}), and then select **Sort descending**. 1. Click the **Flow settings** icon ![Flow settings icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/settings.png)\{: iih\}. 1. Click the **Target data set** panel. 1. Click **Edit properties**. 1. In the *Format target properties* dialog, change the data asset name to `airline-data_sorted_shaped.csv`\{: .cp\}. + ![changed output file name](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/output_changed-new.png) 1. Click **Save** to return to the Flow settings. 1. Click **Apply** to save the settings. 1. From the Data Refinery toolbar, click the **Jobs** icon and select **Save and view jobs**. + ![Save and view jobs](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/save-view-jobs.png) 1. Select the job for the airline data, and then click **View**. 1. From the *Job window* toolbar, click the **Run job** icon. + ![Run jobs icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/run-job.png) \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the completed job details. + + ![The following image shows the completed job details.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/dr-completed-job.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 7: View the data assets and your Data Refinery flow in your project + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 06:40. Now follow these steps to view the three data assets, the original, the first refined data set, and the second refined data set: 1. When the job completes, go to the project page. 1. Click the **Assets tab**. 1. In the *Data assets* section, you will see the original data set that you uploaded and the output of the two Data Refinery flows. *`airline-data_sorted_shaped.csv`*`airline-data_csv_shaped`*`airline-data.csv` 1. Click the **airline-data\_csv\_shaped** data asset to see the mean delay unsorted. Navigate back to the* Assets *tab. 1. Click **airline-data\_sorted\_shaped.csv** data asset to see the mean delay sorted in descending order. Navigate back to the* Assets *tab. 1. Click the \*Flows > Data Refinery flows* section shows the Data Refinery flow: `airline-data.csv_flow`. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the Assets tab with all of the assets displayed. + + ![The following image shows the Assets tab with all of the assets displayed.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/dr-final-assets-tab.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html?context=cdpaas&locale=en#video-preview) + + + +## Next steps ## + +Now the data is ready to be used\. For example, you or other users can do any of these tasks: + + + + * [Analyze the data in a Jupyter notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html) + * [Build and train a model with the data asset](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html) + + + +## Additional resources ## + + + + * View more [videos](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html)\. + * Find sample data sets, projects, models, prompts, and notebooks in the Samples to gain hands\-on experience: + + ![Notebook icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook.svg)[Notebooks](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=notebook) that you can add to your project to get started analyzing data and building models. + + ![Project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/ibm-cloud--projects.svg)[Projects](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=project-template) that you can import containing notebooks, data sets, prompts, and other assets. + + ![Data set icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/data--set.svg)[Data sets](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=dataset) that you can add to your project to refine, analyze, and build models. + + ![Prompt icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/prompt.svg)[Prompts](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=example-prompt) that you can use in the Prompt Lab to prompt a foundation model. + + ![Model icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/model.svg)[Foundation models](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=foundation-model) that you can use in the Prompt Lab. + + + +**Parent topic:**[Quick start tutorials](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/98ac4398e3ea902007d99e5bdb0686aef04a4daa.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/98ac4398e3ea902007d99e5bdb0686aef04a4daa.md new file mode 100644 index 0000000..22f851d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/98ac4398e3ea902007d99e5bdb0686aef04a4daa.md @@ -0,0 +1,19 @@ +# Specifying values for collection data (SPSS Modeler) + +# Specifying values for collection data # + +Collection fields display non\-geospatial data that's in a list\. + +The only item you can set for the Collection measurement level is the List measure\. By default, this measure is set to Typeless, but you can select another value to set the measurement level of the elements within the list\. You can choose one of the following options: + + + + * Typeless + * Continuous + * Nominal + * Ordinal + * Flag + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/98b447b5af1cd17524e2ba82fed83b8966ddfefb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/98b447b5af1cd17524e2ba82fed83b8966ddfefb.md new file mode 100644 index 0000000..2f3764c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/98b447b5af1cd17524e2ba82fed83b8966ddfefb.md @@ -0,0 +1,53 @@ +# evaluationnode properties + +# evaluationnode properties # + +![Evaluation node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/evaluationnodeicon.png)The Evaluation node helps to evaluate and compare predictive models\. The evaluation chart shows how well models predict particular outcomes\. It sorts records based on the predicted value and confidence of the prediction\. It splits the records into groups of equal size (quantiles) and then plots the value of the business criterion for each quantile from highest to lowest\. Multiple models are shown as separate lines in the plot\. + + + +evaluationnode properties + +Table 1\. evaluationnode properties + +| `evaluationnode` properties | Data type | Property description | +| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `chart_type` | `Gains`
`Response`
`Lift`
`Profit`
`ROI`
`ROC` | | +| `inc_baseline` | *flag* | | +| `field_detection_method` | `Metadata`
`Name` | | +| `use_fixed_cost` | *flag* | | +| `cost_value` | *number* | | +| `cost_field` | *string* | | +| `use_fixed_revenue` | *flag* | | +| `revenue_value` | *number* | | +| `revenue_field` | *string* | | +| `use_fixed_weight` | *flag* | | +| `weight_value` | *number* | | +| `weight_field` | *field* | | +| `n_tile` | `Quartiles`
`Quintles`
`Deciles`
`Vingtiles`
`Percentiles`
`1000-tiles` | | +| `cumulative` | *flag* | | +| `style` | `Line`
`Point` | | +| `point_type` | `Rectangle`
`Dot`
`Triangle`
`Hexagon`
`Plus`
`Pentagon`
`Star`
`BowTie`
`HorizontalDash`
`VerticalDash`
`IronCross`
`Factory`
`House`
`Cathedral`
`OnionDome`
`ConcaveTriangle``OblateGlobe`
`CatEye`
`FourSidedPillow`
`RoundRectangle`
`Fan` | | +| `export_data` | *flag* | | +| `data_filename` | *string* | | +| `delimiter` | *string* | | +| `new_line` | *flag* | | +| `inc_field_names` | *flag* | | +| `inc_best_line` | *flag* | | +| `inc_business_rule` | *flag* | | +| `business_rule_condition` | *string* | | +| `plot_score_fields` | *flag* | | +| `score_fields` | *\[field1 \.\.\. fieldN\]* | | +| `target_field` | *field* | | +| `use_hit_condition` | *flag* | | +| `hit_condition` | *string* | | +| `use_score_expression` | *flag* | | +| `score_expression` | *string* | | +| `caption_auto` | *flag* | | +| `split_by_partition` | *boolean* | If a partition field is used to split records into training, test, and validation samples, use this option to display a separate evaluation chart for each partition\. | +| `use_profit_criteria` | *boolean* | Enables profit criteria\. | +| `use_grid` | *boolean* | Displays grid lines\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/98fc8e9a3380e4593d9bf08b78ce6a7797c0204b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/98fc8e9a3380e4593d9bf08b78ce6a7797c0204b.md new file mode 100644 index 0000000..ede88f7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/98fc8e9a3380e4593d9bf08b78ce6a7797c0204b.md @@ -0,0 +1,15 @@ +# Partition node (SPSS Modeler) + +# Partition node # + +Partition nodes are used to generate a partition field that splits the data into separate subsets or samples for the training, testing, and validation stages of model building\. By using one sample to generate the model and a separate sample to test it, you can get a good indication of how well the model will generalize to larger datasets that are similar to the current data\. + +The Partition node generates a nominal field with the role set to Partition\. Alternatively, if an appropriate field already exists in your data, it can be designated as a partition using a Type node\. In this case, no separate Partition node is required\. Any instantiated nominal field with two or three values can be used as a partition, but flag fields cannot be used\. + +Multiple partition fields can be defined in a flow, but if so, a single partition field must be selected in each modeling node that uses partitioning\. (If only one partition is present, it is automatically used whenever partitioning is enabled\.) + +To create a partition field based on some other criterion such as a date range or location, you can also use a Derive node\. See [Derive node](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/derive.html#derive) for more information\. + +Example\. When building an RFM flow to identify recent customers who have positively responded to previous marketing campaigns, the marketing department of a sales company uses a Partition node to split the data into training and test partitions\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9933646421686556c9ae8459ee2e51ed9dab1c33.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9933646421686556c9ae8459ee2e51ed9dab1c33.md new file mode 100644 index 0000000..1df4fc8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9933646421686556c9ae8459ee2e51ed9dab1c33.md @@ -0,0 +1,7 @@ +# Disabling or caching nodes in a flow (SPSS Modeler) + +# Disabling or caching nodes in a flow # + +You can disable a node so it's ignored when the flow runs\. And you can set up a cache on a node\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/99675d0ddd35d743f2f0becf008d9cbed68c0534.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/99675d0ddd35d743f2f0becf008d9cbed68c0534.md new file mode 100644 index 0000000..dba1549 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/99675d0ddd35d743f2f0becf008d9cbed68c0534.md @@ -0,0 +1,10 @@ +# Time Plot node (SPSS Modeler) + +# Time Plot node # + +Time Plot nodes allow you to view one or more time series plotted over time\. The series you plot must contain numeric values and are assumed to occur over a range of time in which the periods are uniform\. + +Figure 1\. Plotting sales of men's and women's clothing and jewelry over time + +![Plotting sales of men's and women's clothing and jewelry over time](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/graphs_timeseries_jewelry_sales.jpg) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/99843122c08d0d70ed3694a57482595e35fb0d8b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/99843122c08d0d70ed3694a57482595e35fb0d8b.md new file mode 100644 index 0000000..4cc7e53 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/99843122c08d0d70ed3694a57482595e35fb0d8b.md @@ -0,0 +1,199 @@ +# Tutorial: AutoAI multivariate time series experiment with Supporting features + +# Tutorial: AutoAI multivariate time series experiment with Supporting features # + +Use sample data to train a multivariate time series experiment that predicts pollution rate and temperature with the help of supporting features that influence the prediction fields\. + +When you set up the experiment, you load sample data that tracks weather conditions in Beijing from 2010 to 2014\. The experiment generates a set of pipelines that use algorithms to predict future pollution and temperature with supporting features, including dew, pressure, snow, and rain\. After generating the pipelines, AutoAI compares and tests them, chooses the best performers, and presents them in a leaderboard for you to review\. + +## Data set overview ## + +For this tutorial, you use the [Beijing PM 2\.5](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/56e40ca77f9a72b0ab65b2c7938a99e2) data set from the Samples\. This data set describes the weather conditions in Beijing from 2010 to 2014, which are measured in 1\-day steps, or increments\. You use this data set to configure your AutoAI experiment and select Supporting features\. Details about the data set are described here: + + + + * Each column, other than the date column, represents a weather condition that impacts pollution index\. + * The Samples entry shows the origin of the data\. You can preview the file before you download the file\. + * The sample data is structured in rows and columns and saved as a \.csv file\. + + + +![Data set preview](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-sup-dataset-preview.png) + +## Tasks overview ## + +In this tutorial, you follow steps to create a multivariate time series experiment that uses Supporting features: + + + +1. [Create a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-tut-sup.html?context=cdpaas&locale=en#step1) +2. [Create an AutoAI experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-tut-sup.html?context=cdpaas&locale=en#step2) +3. [Configure the experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-tut-sup.html?context=cdpaas&locale=en#step3) +4. [Review experiment results](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-tut-sup.html?context=cdpaas&locale=en#step4) +5. [Deploy the trained model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-tut-sup.html?context=cdpaas&locale=en#step5) +6. [Test the deployed model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-tut-sup.html?context=cdpaas&locale=en#step6) + + + +## Create a project ## + +Follow these steps to create an empty project and download the [Beijing PM 2\.5](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/56e40ca77f9a72b0ab65b2c7938a99e2) data set from the IBM watsonx Samples: + + + +1. From the main navigation pane, click **Projects** > **View all projects**, then click **New Project**\. + a. Click **Create an empty project**. + b. Enter a name and optional description for your project. + c. Click **Create**. +2. From the main navigation panel, click **Samples** and download a local copy of the [Beijing PM 2\.5](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/56e40ca77f9a72b0ab65b2c7938a99e2) data set\. + + + +## Create an AutoAI experiment ## + +Follow these steps to create an AutoAI experiment and add sample data to your experiment: + + + +1. On the *Assets* tab from within your project, click **New asset > Build machine learning models automatically**\. +2. Specify a name and optional description for your experiment\. +3. Associate a machine learning service instance with your experiment\. +4. Choose an environment definition of 8 vCPU and 32 GB RAM\. +5. Click **Create**\. +6. To add sample data, choose one of the these methods: + + + + * If you downloaded your file locally, upload the training data file, *PM25.csv* by clicking **Browse** and then following the prompts. + * If you already uploaded your file to your project, click **Select from project**, then select the **Data asset** tab and choose *Beijing PM 25.csv*. + + + + + +## Configure the experiment ## + +Follow these steps to configure your multivariate AutoAI time series experiment: + + + +1. Click **Yes** for the option to create a Time Series Forecast\. +2. Choose as prediction columns: `pollution`, `temp`\. +3. Choose as the date/time column: `date`\. + + ![Configuring experiment settings. Yes, to time series forecast and pollution and temp as the prediction columns with date as the date/time column.](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-sup-run-config.png) +4. Click **Experiment settings** to configure the experiment: + a. In the **Prediction** page, accept the default selection for Algorithms to include. Algorithms that allow you to use Supporting features are indicated by a checkmark in the column *Allows supporting features*. + ![Configuring experiment settings. Algorithms that support the use of Supporting features](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-sup-predict-general.JPG) + + b. Go to the **Data Source** page. For this tutorial, you will supply future values of Supporting features while testing. Future values are helpful when values for the supporting features are knowable for the prediction horizon. Accept the default enablement for **Leverage future values of supporting features**. Additionally, accept the default selection for columns that will be used as Supporting features. + ![Supporting features](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-sup-features.JPG) + c. Click **Cancel** to exit from Experiment settings. +5. Click **Run experiment** to begin the training\. + + + +## Review experiment results ## + +The experiment takes several minutes to complete\. As the experiment trains, the relationship map shows the transformations that are used to create pipelines\. Follow these steps to review experiment results and save the pipeline with the best performance\. + + + +1. Optional: Hover over any node in the relationship map to get details on the transformation for a particular pipeline\. + + ![Relationship map](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-sup-rel-map.png) +2. Optional: After the pipelines are listed on the leaderboard, click **Pipeline comparison** to see how they differ\. For example: + + ![Pipeline comparison](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-sup-pipeline-comparison.JPG) +3. When the training completes, the top three best performing pipelines are saved to the leaderboard\. Click any pipeline name to review details\. + + Note: Pipelines that use Supporting features are indicated by **SUP** enhancement. + + ![Pipeline leaderboard](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-sup-pipeline-leaderboard.png) +4. Select the pipeline with Rank 1 and click **Save as** to create your model\. Then, click **Create**\. This action saves the pipeline under the *Models* section in the *Assets* tab\. + + + +## Deploy the trained model ## + +Before you can use your trained model to make predictions on new data, you must deploy the model\. Follow these steps to promote your trained model to a deployment space: + + + +1. You can deploy the model from the *model details* page\. To access the *model details* page, choose one of these options: + + + + * Click the model’s name in the notification that is displayed when you save the model. + * Open the *Assets* page for the project that contains the model and click the model’s name in the *Machine Learning Model* section. + + + +2. Select **Promote to Deployment Space**, then select or create a deployment space where the model will be deployed\. + **Optional**: Follow these steps to create a deployment space: + a. From the Target space list, select **Create a new deployment space**. + b. Enter a name for your deployment space. + c. To associate a machine learning instance, go to **Select machine learning service (optional)** and select a machine learning instance from the list. + d. Click **Create**. + +3. Once you select or create your space, click **Promote**\. +4. Click the deployment space link from the notification\. +5. From the **Assets** tab of the deployment space: + a. Hover over the model’s name and click the **deployment** icon ![Deploy icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/deploy-icon.png). + b. In the page that opens, complete the fields: + + + + * Select **Online** as the Deployment type. + + * Specify a name for the deployment. + + * Click **Create**. + + + + + +After the deployment is complete, click the **Deployments** tab and select the deployment name to view the details page\. + +## Test the deployed model ## + +Follow these steps to test the deployed model from the deployment details page: + + + +1. On the **Test** tab of the deployment details page, go to **New observations (optional)** spreadsheet and enter the following values: + pollution (double): `80.417` + temp (double): `-5.5` + dew (double): `-7.083` + press (double): `1020.667` + wnd\_spd (double): `9.518` + snow (double): `0` + rain (double): `0` + + ![New observations](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-sup-new-obs.JPG) + +2. To add future values of Supporting features, go to **Future exogenous features (optional)** spreadsheet and enter the following values: + dew (double): `-12.667` + press (double): `1023.708` + wnd\_spd (double): `9.518` + snow (double): `0` + rain (double): `0.042` + + Note: You must provide the same number of values for future exogenous features as the prediction horizon that you set during experiment configuration stage. + + ![Future exogenous values](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-sup-future-exogenous.JPG) + +3. Click **Predict**\. The resulting prediction indicates values for pollution and temperature\. + + Note: Prediction values that are shown in the output might differ when you test your deployment. + + ![Resulting prediction](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-sup-output.JPG) + + + +## Learn more ## + +**Parent topic:**[Building a time series experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/99b0c1c962e0642e5b877747ed37e9bb27238664.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/99b0c1c962e0642e5b877747ed37e9bb27238664.md new file mode 100644 index 0000000..d24a789 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/99b0c1c962e0642e5b877747ed37e9bb27238664.md @@ -0,0 +1,6 @@ +# t-SNE charts + +# t\-SNE charts # + +T\-distributed Stochastic Neighbor Embedding (t\-SNE) is a machine learning algorithm for visualization\. t\-SNE charts model each high\-dimensional object by a two\-or\-three dimensional point in such a way that similar objects are modeled by nearby points and dissimilar objects are modeled by distant points with high probability\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9a1025416cda5ea57e6b2d9525bdfc7f1ae58692.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9a1025416cda5ea57e6b2d9525bdfc7f1ae58692.md new file mode 100644 index 0000000..9b1d202 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9a1025416cda5ea57e6b2d9525bdfc7f1ae58692.md @@ -0,0 +1,7 @@ +# Graph node properties + +# Graph node properties # + +Refer to this section for a list of available properties for Graph nodes\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9a5011652c8fad610ef217b82b7f28c8256dce8b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9a5011652c8fad610ef217b82b7f28c8256dce8b.md new file mode 100644 index 0000000..6d69a0e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9a5011652c8fad610ef217b82b7f28c8256dce8b.md @@ -0,0 +1,20 @@ +# applyfeatureselectionnode properties + +# applyfeatureselectionnode properties # + +You can use Feature Selection modeling nodes to generate a Feature Selection model nugget\. The scripting name of this model nugget is *applyfeatureselectionnode*\. For more information on scripting the modeling node itself, see [featureselectionnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/featureselectionnodeslots.html#featureselectionnodeslots)\. + + + +applyfeatureselectionnode properties + +Table 1\. applyfeatureselectionnode properties + +| `applyfeatureselectionnode` Properties | Values | Property description | +| -------------------------------------- | ------ | ------------------------------------------------------------------ | +| `ranked_values` | | Specifies which ranked fields are checked in the model browser\. | +| `screened_values` | | Specifies which screened fields are checked in the model browser\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9a83a33abb4c6a12a7457d3711c2511eb3982b2c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9a83a33abb4c6a12a7457d3711c2511eb3982b2c.md new file mode 100644 index 0000000..9dd9e29 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9a83a33abb4c6a12a7457d3711c2511eb3982b2c.md @@ -0,0 +1,66 @@ +# String functions (SPSS Modeler) + +# String functions # + +With CLEM, you can run operations to compare strings, create strings, or access characters\. + +In CLEM, a string is any sequence of characters between matching double quotation marks (`"string quotes"`)\. Characters (`CHAR`) can be any single alphanumeric character\. They're declared in CLEM expressions using single back quotes in the form of `` `` ``, such as `` `z` ``, `` `A` ``, or `` `2` ``\. Characters that are out\-of\-bounds or negative indices to a string will result in undefined behavior\. + +Note: Comparisons between strings that do and do not use SQL pushback may generate different results where trailing spaces exist\. + + + +CLEM string functions + +Table 1\. CLEM string functions + +| Function | Result | Description | +| --------------------------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `allbutfirst(N, STRING)` | *String* | Returns a string, which is `STRING` with the first `N` characters removed\. | +| `allbutlast(N, STRING)` | *String* | Returns a string, which is `STRING` with the last characters removed\. | +| `alphabefore(STRING1, STRING2)` | *Boolean* | Used to check the alphabetical ordering of strings\. Returns true if `STRING1` precedes `STRING2`\. | +| `count_substring(STRING, SUBSTRING)` | *Integer* | Returns the number of times the specified substring occurs within the string\. For example, `count_substring("foooo.txt", "oo")` returns `3`\. | +| `endstring(LENGTH, STRING)` | *String* | Extracts the last `N` characters from the specified string\. If the string length is less than or equal to the specified length, then it is unchanged\. | +| `hasendstring(STRING, SUBSTRING)` | *Integer* | This function is the same as `isendstring(SUBSTRING, STRING)`\. | +| `hasmidstring(STRING, SUBSTRING)` | *Integer* | This function is the same as `ismidstring(SUBSTRING, STRING)` (embedded substring)\. | +| `hasstartstring(STRING, SUBSTRING)` | *Integer* | This function is the same as `isstartstring(SUBSTRING, STRING)`\. | +| `hassubstring(STRING, N, SUBSTRING)` | *Integer* | This function is the same as `issubstring(SUBSTRING, N, STRING)`, where `N` defaults to `1`\. | +| `hassubstring(STRING, SUBSTRING)` | *Integer* | This function is the same as `issubstring(SUBSTRING, 1, STRING)`, where `N` defaults to `1`\. | +| `isalphacode(CHAR)` | *Boolean* | Returns a value of true if `CHAR` is a character in the specified string (often a field name) whose character code is a letter\. Otherwise, this function returns a value of `0`\. For example, `isalphacode(produce_num(1))`\. | +| `isendstring(SUBSTRING, STRING)` | *Integer* | If the string `STRING` ends with the substring `SUBSTRING`, then this function returns the integer subscript of `SUBSTRING` in `STRING`\. Otherwise, this function returns a value of `0`\. | +| `islowercode(CHAR)` | *Boolean* | Returns a value of `true` if `CHAR` is a lowercase letter character for the specified string (often a field name)\. Otherwise, this function returns a value of `0`\. For example, both ```islowercode(``)``` and `islowercode(country_name(2))` are valid expressions\. | +| `ismidstring(SUBSTRING, STRING)` | *Integer* | If `SUBSTRING` is a substring of `STRING` but does not start on the first character of `STRING` or end on the last, then this function returns the subscript at which the substring starts\. Otherwise, this function returns a value of `0`\. | +| `isnumbercode(CHAR)` | *Boolean* | Returns a value of true if `CHAR` for the specified string (often a field name) is a character whose character code is a digit\. Otherwise, this function returns a value of `0`\. For example, `isnumbercode(product_id(2))`\. | +| `isstartstring(SUBSTRING, STRING)` | *Integer* | If the string `STRING` starts with the substring `SUBSTRING`, then this function returns the subscript `1`\. Otherwise, this function returns a value of `0`\. | +| `issubstring(SUBSTRING, N, STRING)` | *Integer* | Searches the string `STRING`, starting from its `Nth` character, for a substring equal to the string `SUBSTRING`\. If found, this function returns the integer subscript at which the matching substring begins\. Otherwise, this function returns a value of `0`\. If `N` is not given, this function defaults to `1`\. | +| `issubstring(SUBSTRING, STRING)` | *Integer* | Searches the string `STRING`\. If found, this function returns the integer subscript at which the matching substring begins\. Otherwise, this function returns a value of `0`\. | +| `issubstring_count(SUBSTRING, N, STRING)` | *Integer* | Returns the index of the `Nth` occurrence of `SUBSTRING` within the specified `STRING`\. If there are fewer than `N` occurrences of `SUBSTRING`, `0` is returned\. | +| `issubstring_lim(SUBSTRING, N, STARTLIM, ENDLIM, STRING)` | *Integer* | This function is the same as `issubstring`, but the match is constrained to start on `STARTLIM` and to end on `ENDLIM`\. The `STARTLIM` or `ENDLIM` constraints may be disabled by supplying a value of false for either argument—for example, `issubstring_lim(SUBSTRING, N, false, false, STRING)` is the same as `issubstring`\. | +| `isuppercode(CHAR)` | *Boolean* | Returns a value of true if `CHAR` is an uppercase letter character\. Otherwise, this function returns a value of `0`\. For example, both ```isuppercode(``)``` and `isuppercode(country_name(2))` are valid expressions\. | +| `last(STRING)` | *String* | Returns the last character `CHAR` of `STRING` (which must be at least one character long)\. | +| `length(STRING)` | *Integer* | Returns the length of the string `STRING` (that is, the number of characters in it)\. | +| `locchar(CHAR, N, STRING)` | *Integer* | Used to identify the location of characters in symbolic fields\. The function searches the string `STRING` for the character `CHAR`, starting the search at the `Nth` character of `STRING`\. This function returns a value indicating the location (starting at `N`) where the character is found\. If the character is not found, this function returns a value of 0\. If the function has an invalid offset `(N)` (for example, an offset that is beyond the length of the string), this function returns `$null$`\.
For example, ``locchar(`n`, 2, web_page)`` searches the field called `web_page` for the `` `n` `` character beginning at the second character in the field value\.
Be sure to use single back quotes to encapsulate the specified character\. | +| `locchar_back(CHAR, N, STRING)` | *Integer* | Similar to `locchar`, except that the search is performed backward starting from the `Nth` character\. For example, ``locchar_back(`n`, 9, web_page)`` searches the field `web_page` starting from the ninth character and moving backward toward the start of the string\. If the function has an invalid offset (for example, an offset that is beyond the length of the string), this function returns `$null$`\. Ideally, you should use `locchar_back` in conjunction with the function `length()` to dynamically use the length of the current value of the field\. For example, ``locchar_back(`n`, (length(web_page)), web_page)``\. | +| `lowertoupper(CHAR)``lowertoupper (STRING)` | *CHAR* or *String* | Input can be either a string or character, which is used in this function to return a new item of the same type, with any lowercase characters converted to their uppercase equivalents\. For example, ``lowertoupper(`a`)``, `lowertoupper(“My string”)`, and `lowertoupper(field_name(2))` are all valid expressions\. | +| `matches` | *Boolean* | Returns `true` if a string matches a specified pattern\. The pattern must be a string literal; it can't be a field name containing a pattern\. You can include a question mark (`?`) in the pattern to match exactly one character; an asterisk (`*`) matches zero or more characters\. To match a literal question mark or asterisk (rather than using these as wildcards), use a backslash (`\`) as an escape character\. | +| `replace(SUBSTRING, NEWSUBSTRING, STRING)` | *String* | Within the specified `STRING`, replace all instances of `SUBSTRING` with `NEWSUBSTRING`\. | +| `replicate(COUNT, STRING)` | *String* | Returns a string that consists of the original string copied the specified number of times\. | +| `stripchar(CHAR,STRING)` | *String* | Enables you to remove specified characters from a string or field\. You can use this function, for example, to remove extra symbols, such as currency notations, from data to achieve a simple number or name\. For example, using the syntax ``stripchar(`$`, 'Cost')`` returns a new field with the dollar sign removed from all values\.
Be sure to use single back quotes to encapsulate the specified character\. | +| `skipchar(CHAR, N, STRING)` | *Integer* | Searches the string `STRING` for any character other than `CHAR`, starting at the `Nth` character\. This function returns an integer substring indicating the point at which one is found or `0` if every character from the `Nth` onward is a `CHAR`\. If the function has an invalid offset (for example, an offset that is beyond the length of the string), this function returns `$null$`\.
`locchar` is often used in conjunction with the `skipchar` functions to determine the value of `N` (the point at which to start searching the string)\. For example, ``skipchar(`s`, (locchar(`s`, 1, "MyString")), "MyString")``\. | +| `skipchar_back(CHAR, N, STRING)` | *Integer* | Similar to `skipchar`, except that the search is performed backward, starting from the `Nth` character\. | +| `startstring(N, STRING)` | *String* | Extracts the first `N` characters from the specified string\. If the string length is less than or equal to the specified length, then it is unchanged\. | +| `strmember(CHAR, STRING)` | *Integer* | Equivalent to `locchar(CHAR, 1, STRING)`\. It returns an integer substring indicating the point at which `CHAR` first occurs, or `0`\. If the function has an invalid offset (for example, an offset that is beyond the length of the string), this function returns `$null$`\. | +| `subscrs(N, STRING)` | *CHAR* | Returns the `Nth` character `CHAR` of the input string `STRING`\. This function can also be written in a shorthand form as `STRING(N)`\. For example, `lowertoupper(“name”(1))` is a valid expression\. | +| `substring(N, LEN, STRING)` | *String* | Returns a string `SUBSTRING`, which consists of the `LEN` characters of the string `STRING`, starting from the character at subscript *N*\. | +| `substring_between(N1, N2, STRING)` | *String* | Returns the substring of `STRING`, which begins at subscript `N1` and ends at subscript `N2`\. | +| `textsplit(STRING, N, CHAR)` | *String* | `textsplit(STRING,N,CHAR)` returns the substring between the `Nth-1` and `Nth` occurrence of `CHAR`\. If `N` is `1`, then it will return the substring from the beginning of `STRING` up to but not including `CHAR`\. If `N-1` is the last occurrence of `CHAR`, then it will return the substring from the `Nth-1` occurrence of `CHAR` to the end of the string\. | +| `trim(STRING)` | *String* | Removes leading and trailing white space characters from the specified string\. | +| `trimstart(STRING)` | *String* | Removes leading white space characters from the specified string\. | +| `trimend(STRING)` | *String* | Removes trailing white space characters from the specified string\. | +| `unicode_char(NUM)` | *CHAR* | Input must be decimal, not hexadecimal values\. Returns the character with Unicode value `NUM`\. | +| `unicode_value(CHAR)` | *NUM* | Returns the Unicode value of `CHAR`\. | +| `uppertolower(CHAR)``uppertolower (STRING)` | *CHAR* or *String* | Input can be either a string or character and is used in this function to return a new item of the same type with any uppercase characters converted to their lowercase equivalents\.
Remember to specify strings with double quotes and characters with single back quotes\. Simple field names should be specified without quotes\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9aa00a347bd6f7725014c840f3d39bc0ddf26599.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9aa00a347bd6f7725014c840f3d39bc0ddf26599.md new file mode 100644 index 0000000..7edbec7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9aa00a347bd6f7725014c840f3d39bc0ddf26599.md @@ -0,0 +1,21 @@ +# extensionimportnode properties + +# extensionimportnode properties # + +![Extension Import node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/extensionimportnode.png) With the Extension Import node, you can run R or Python for Spark scripts to import data\. + + + +extensionimportnode properties + +Table 1\. extensionimportnode properties + +| `extensionimportnode` properties | Data type | Property description | +| -------------------------------- | ----------- | ------------------------------------------------------------ | +| `syntax_type` | *R**Python* | Specify which script runs – R or Python (R is the default)\. | +| `r_syntax` | *string* | The R scripting syntax to run\. | +| `python_syntax` | *string* | The Python scripting syntax to run\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9b120ff1f8482eb617e16738d5160c966c6edf3d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9b120ff1f8482eb617e16738d5160c966c6edf3d.md new file mode 100644 index 0000000..c758fc5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9b120ff1f8482eb617e16738d5160c966c6edf3d.md @@ -0,0 +1,21 @@ +# Building the models (SPSS Modeler) + +# Building the models # + + + +1. Run the CHAID node that uses all the predictors in the dataset (the one connected to the Type node)\. As it runs, notice how long it takes to finish\. +2. Right\-click the generated model nugget, select View Model, and look at the tree diagram\. +3. Now run the other CHAID model, which uses less predictors\. Again, look at its tree diagram\. + + It might be hard to tell, but the second model ran faster than the first one. Because this dataset is relatively small, the difference in run times is probably only a few seconds; but for larger real-world datasets, the difference might be very noticeable—minutes or even hours. Using feature selection may speed up your processing times dramatically. + + The second tree also contains fewer tree nodes than the first. It's easier to comprehend. Using fewer predictors is less expensive. It means that you have less data to collect, process, and feed into your models. Computing time is improved. In this example, even with the extra feature selection step, model building was faster with the smaller set of predictors. With a larger real-world dataset, the time savings should be greatly amplified. + + Using fewer predictors results in simpler scoring. For example, you might identify only four profiles of customers who are likely to respond to the promotion. Note that with larger numbers of predictors, you run the risk of overfitting your model. The simpler model may generalize better to other datasets (although you would need to test this to be sure). + + You could instead use a tree-building algorithm to do the feature selection work, allowing the tree to identify the most important predictors for you. In fact, the CHAID algorithm is often used for this purpose, and it's even possible to grow the tree level-by-level to control its depth and complexity. However, the Feature Selection node is faster and easier to use. It ranks all of the predictors in one fast step, allowing you to identify the most important fields quickly. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9b6386c6c291665aca0892481681a94a70185e9d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9b6386c6c291665aca0892481681a94a70185e9d.md new file mode 100644 index 0000000..9132a6b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9b6386c6c291665aca0892481681a94a70185e9d.md @@ -0,0 +1,6 @@ +# Treemap charts + +# Treemap charts # + +Treemap charts are an alternative method for visualizing the hierarchical structure of tree diagrams while also displaying quantities for each category\. Treemap charts are useful for identifying patterns in data\. Tree branches are represented by rectangles, with each sub branch represented by smaller rectangles\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9b89a3b2d7e1868f15a28eacf6d5c6214f7f12b7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9b89a3b2d7e1868f15a28eacf6d5c6214f7f12b7.md new file mode 100644 index 0000000..e128ed0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9b89a3b2d7e1868f15a28eacf6d5c6214f7f12b7.md @@ -0,0 +1,88 @@ +# IBM Db2 connection + +# IBM Db2 connection # + +To access your data in an IBM Db2 database, you must create a connection asset for it\. + +IBM Db2 is a database that contains relational data\. + +## Supported versions ## + +IBM Db2 10\.1 and later + +## Create a connection to Db2 ## + +To create the connection asset, you need the following connection details: + + + + * **Database** + * **Hostname or IP address** + * **Username and password** See [Credentials](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2.html?context=cdpaas&locale=en#creds)\. + * **Port** + * **Application name** (optional): The name of the application that is currently using the connection\. For information, see [Client info properties support by the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/Javadocs/src/tpc/imjcc_r0052001.html)\. + * **Client accounting information** (optional): The value of the accounting string from the client information that is specified for the connection\. For information, see [Client info properties support by the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/Javadocs/src/tpc/imjcc_r0052001.html)\. + * **Client hostname** (optional): The hostname of the machine on which the application that is using the connection is running\. For information, see [Client info properties support by the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/Javadocs/src/tpc/imjcc_r0052001.html)\. + * **Client user** (optional): The name of the user on whose behalf the application that is using the connection is running\. For information, see [Client info properties support by the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/Javadocs/src/tpc/imjcc_r0052001.html)\. + + + + + + * **SSL certificate** (if required by your database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Db2 connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Decision Optimization + * Notebooks\. Click **Read data** on the **Code snippets** pane to get the connection credentials and load the data into a data structure\. See [Load data from data source connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html#conns)\. + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [Structured Query Language (SQL)](https://www.ibm.com/docs/SSEPGG_11.5.0/com.ibm.db2.luw.sql.ref.doc/doc/c0004100.html) topic in the IBM Db2 product documentation for the correct syntax\. + +## Learn more ## + +[IBM Db2 product documentation](https://www.ibm.com/docs/db2) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9bea57d80c215d963cb0c54046136fb3e88c7d5c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9bea57d80c215d963cb0c54046136fb3e88c7d5c.md new file mode 100644 index 0000000..5396219 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9bea57d80c215d963cb0c54046136fb3e88c7d5c.md @@ -0,0 +1,19 @@ +# kdeapply properties + +# kdeapply properties # + +You can use the KDE Modeling node to generate a KDE model nugget\. The scripting name of this model nugget is `kdeapply`\. For information on scripting the modeling node itself, see [kdemodel properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/kdemodelnodeslots.html#kdemodelnodeslots)\. + + + +kdeapply properties + +Table 1\. kdeapply properties + +| `kdeapply` properties | Data type | Property description | +| --------------------- | --------- | ---------------------------------------------------------------------------------------------------------- | +| `out_log_density` | *boolean* | Specify `True` or `False` to include or exclude the log density value in the output\. Default is `False`\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9c03418999e6b01345837d9dd0f8e0410ed5cb7d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9c03418999e6b01345837d9dd0f8e0410ed5cb7d.md new file mode 100644 index 0000000..b8e8aca --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9c03418999e6b01345837d9dd0f8e0410ed5cb7d.md @@ -0,0 +1,704 @@ +# CLEANSE + +## CLEANSE ## + +**Convert column type** +When you open a file in Data Refinery, the **Convert column type** operation is automatically applied as the first step if it detects any nonstring data types in the data\. Data types are automatically converted to inferred data types\. To change the automatic conversion for a selected column, click the overflow menu (![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png)) for the step and select **Edit**\. As with any other operation, you can undo the step\. The **Convert column type** operation is reapplied every time that you open the file in Data Refinery\. Automatic conversion is applied as needed for file\-based data sources only\. (It does not apply to a data source from a database connection\.) + +To confirm what data type each column's data was converted to, click **Edit** from the overflow menu (![overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png)) to view the data types\. The information includes the format for date or timestamp data\. + +If the data is converted to an Integer or to a Decimal data type, you can specify the decimal symbol and the thousands grouping symbol for all applicable columns\. Strings that are converted to the Decimal data type use a dot for the decimal symbol and a comma for the thousands grouping symbol\. Alternatively, you can select comma for the decimal symbol and dot or a custom symbol for the thousands grouping symbol\. The decimal symbol and the thousands grouping symbol cannot be the same\. + +The source data is read from left to right until a terminator or an unrecognized character is encountered\. For example, if you are converting string data `12,834` to Decimal and you do not specify what to do with the comma (,), the data will be truncated to `12`\. Similarly, if the source data has multiple dots (\.), and you select dot for the decimal symbol, the first dot is used as the decimal separator and the digits following the second dot are truncated\. A source string of `1.834.230,000` is converted to a value of `1.834`\. + +The **Convert column type** operation automatically converts these date and timestamp formats: + + + + * Date: `ymd`, `ydm` + * Timestamp: `ymdHMS`, `ymdHM`, `ydmHMS`, `ydmHM` + + + +Date and Timestamp strings must use four digits for the year\. + +You can manually apply the **Convert column type** operation to change the data type of a column at any point in the Data Refinery flow\. You can create a new column to hold the result of this operation or you can overwrite the existing column\. + +Tip: A column's data type determines the operations that you can use\. Changing the data type can affect which operations are relevant for that column\. + +**Video transcript** + + + +1. The Convert column type operation automatically converted the first column from String to Integer\. Let's change the data types of the other three columns\. +2. To change the data type of european column from string to decimal, select the column and then edit the Convert column type operation step\. +3. To change the data type of european column from string to decimal, select the column and then edit the Convert column type operation step\. +4. Select Decimal\. +5. The column uses the comma delimiter so select Comma (,) for the decimal symbol\. +6. Select the next column, DATETIME\. Select Timestamp and a format\. +7. Click Apply\. +8. The columns are now Integer, Decimal, Date, and Timestamp data types The Convert column type step in the Steps panel is updated\. + + + +**Convert column value to missing** +Convert values in the selected column to missing values if they match values in the specified column or they match a specified value\. + +**Video transcript** + + + +1. The Convert column value to missing operation converts the values in a selected column to missing values if they match the values in a specified column or if they match a specified value\. +2. A missing value is equivalent to an SQL NULL, which is a field with no value\. It is different from a zero value or a value that contains spaces\. +3. You can use the Convert column value to missing operation when you think that the data would be better represented as missing values\. For example, when you want to use missing values in a Replace missing values operation or in a Filter operation\. +4. Let's use the Convert column value to missing operation to change values to missing based on a matched value\. +5. Notice that the DESC column has many rows with the value CANCELLED ORDER\. Let's convert the CANCELLED ORDER strings to missing values\. +6. The Convert column value to missing operation is under the CLEANSE category\. +7. Type the string to replace with missing values\. +8. The values that were formerly CANCELLED ORDER are now missing values\. + + + +**Extract date or time value** +Extract a selected portion of a date or time value from a column with a date or timestamp data type\. + +**Video transcript** + + + +1. The Extract date or time value operation extracts a selected portion of a date or time value from a column that is a date or timestamp data type\. +2. The DATE column is a String data type\. First, let's use the Convert column type operation to convert it to the Date data type\. +3. Select the Convert column type operation from the DATE column's menu\. Select Date\. +4. Select a Date format\. +5. The DATE column is now a date data type\. +6. The ISO Date format is used when the String data type was converted to the Date data type\. For example, the string 01/08/2018 was converted to the date 2018\-01\-08\. +7. Now we can extract the year portion of the date into a new column\. +8. The Extract date or time value operation is under the CLEANSE category\. +9. Select Year for the portion of the date to extract, and type YEAR for the new column name\. +10. The year portion of the DATE column is in the new column, YEAR\. +11. The Steps panel displays the Extract date or time value operation\. + + + +**Filter** +Filter rows by the selected columns\. Keep rows with the selected column values; filter out all other rows\. + +For these string **Filter** operators, do not enclose the value in quotation marks\. If the value contains quotation marks, escape them with a slash character\. For example: `\"text\"`: + + + + * Contains + * Does not contain + * Starts with + * Does not start with + * End with + * Does not end with + + + +Folowing are the operators for numeric, string, and Boolean (logical), and date and timestamp columns: + + + +| Operator | Numeric | String | Boolean | Date and timestamp | +| --------------------------- | ------- | ------ | ------- | ------------------ | +| Contains | | ✓ | | | +| Does not contain | | ✓ | | | +| Does not end with | | ✓ | | | +| Does not start with | | ✓ | | | +| Ends with | | ✓ | | | +| Is between two numbers | ✓ | | | | +| Is empty | | ✓ | ✓ | ✓ | +| Is equal to | ✓ | ✓ | | ✓ | +| Is false | | | ✓ | | +| Is greater than | ✓ | | | ✓ | +| Is greater than or equal to | ✓ | | | ✓ | +| Is in | ✓ | ✓ | | | +| Is less than | ✓ | | | ✓ | +| Is less than or equal to | ✓ | | | ✓ | +| Is not empty | | ✓ | ✓ | ✓ | +| Is not equal to | ✓ | ✓ | | ✓ | +| Is not in | ✓ | ✓ | | | +| Is not null | | ✓ | | | +| Is null | ✓ | ✓ | | | +| Is true | | | ✓ | | +| Starts with | | ✓ | | + + + +**Video transcript** + + + +1. Use the Filter operation to filter rows by the selected columns\. You can apply multiple conditions in one Filter operation\. +2. Use a regular expression to filter out all the rows except those where the string in the Emp ID column starts with 8\. +3. Filter the rows by two states abbreviations\. +4. Click Apply\. Only the rows where Emp ID starts with 8 and State is AR or TX are in the table\. +5. The rows are now filtered by AR and PA\. The Filter step in the Steps panel is updated\. + + + +**Remove column** +Remove the selected column\. + +**Video transcript** + + + +1. Use the Remove column operation to quickly remove a column from a data asset\. +2. The quickest way to remove a column is from the column's menu\. +3. The name of the removed column is in the Steps panel\. +4. Remove another column\. +5. The name of the removed column is in the Steps panel\. + + + +**Remove duplicates** +Remove rows with duplicate column values\. + +**Video transcript** + + + +1. The Remove duplicates operation removes rows that have duplicate column values\. +2. The data set has 43 rows\. Many of the rows in the APPLYCODE column have duplicate values\. We want to reduce the data set to the rows where each value in the APPLYCODE column occurs only once\. +3. Select the Remove duplicates operation from the APPLYCODE column's menu\. +4. The Remove duplicates operation removed each occurrence of a duplicate value starting from the top row\. The data set is now 4 rows\. + + + +**Remove empty rows** +Remove rows that have a blank or missing value for the selected column\. + +**Video transcript** + + + +1. The Remove empty rows operation removes rows that have a blank or missing value for the selected column\. +2. A missing value is equivalent to an SQL NULL, which is a field with no value\. It is different from a zero value or a value that contains spaces\. +3. The data set has 43 rows\. Many of the rows in the TRACK column have missing values\. We want to reduce the data set to the rows that have a value in the TRACK column\. +4. Select the Remove empty rows operation from the TRACK column's menu\. +5. The Remove empty rows operation removed each row that had a blank or missing value in the TRACK column\. The data set is now 21 rows\. + + + +**Replace missing values** +Replace missing values in the column with a specified value or with the value from a specified column in the same row\. + +**Video transcript** + + + +1. The Replace missing values operation replaces missing values in a column with a specified value or with the value from a specified column in the same row\. +2. The STATE column has many rows with empty values\. We want to replace those empty values with a string\. +3. The Replace missing values operation is under the CLEANSE category\. +4. For the State column, replace the missing values with the string Incomplete\. +5. The missing values now have the value Incomplete\. +6. The Steps panel displays the Replace missing values operation\. + + + +**Replace substring** +Replace the specified substring with the specified text\. + +**Video transcript** + + + +1. The Replace substring operation replaces a substring with text that you specify\. +2. The DECLINE column has many rows that include the string BANC\. We want to replace this string with BANK\. +3. The Replace substring operation is under the CLEANSE category\. +4. Type the string to replace and the replacement string\. +5. All occurrences of the string BANC have been replaced with BANK\. +6. The Steps panel displays the Replace substring operation\. + + + +**Substitute** +Obscure sensitive information from view by substituting a random string of characters for the actual data in the selected column\. + +**Video transcript** + + + +1. The Substitute operation obscures sensitive information by substituting a random string of characters for the data in the selected column\. +2. The quickest way to substitute the data in a column is to select Substitute from the column's menu\. +3. The Substitute operation shows in the Steps panel\. +4. Substitute values in another column\. +5. The second Substitute operation shows in the Steps panel\. + + + +### Text ### + +You can apply text operations only to string columns\. You can create a new column to hold the result of an operation or you can overwrite the existing column\. + +**Text > Collapse spaces** +Collapse multiple, consecutive spaces in the text to a single space\. + +**Text > Concatenate string** +Link together any string to the text\. You can prepend the string to the text, append the string to the text, or both\. + +**Text > Lowercase** +Convert the text to lowercase\. + +**Text > Number of characters** +Return the number of characters in the text\. + +**Text > Pad characters** +Pad the text with the specified string\. Specify whether to pad the text on the left, right, or both the left and right\. + +**Text > Substring** +Create substrings from the text that start at the specified position and have the specified length\. + +**Text > Title case** +Convert the text to title case\. + +**Text > Trim quotes** +Remove single or double quotation marks from the text\. + +**Text > Trim spaces** +Remove leading, trailing, and extra spaces from the text\. + +**Text > Uppercase** +Convert the text to uppercase\. + +**Video transcript** + + + +1. You can apply a Text operation to string columns\. Create a new column for the result or overwrite the existing column\. +2. First, concatenate a string to the values in the WORD column\. +3. Available Text operations\. +4. Concatenate the string to the right side, append with a space, and type up\. +5. The values in the WORD column are appended with a space and the word up\. +6. The Text operation displays in the Steps panel\. +7. Next, pad the values in the ANIMAL column with a string\. +8. Pad the values in the ANIMAL column with ampersand (&) symbols to the right for a minimum of 7 characters\. +9. The values in the ANIMAL column are padded with the & symbol so that each string is at least seven characters\. +10. Notice that the opossum, pangolin, platypus, and hedgehog values do not have a padding character because those strings were already seven or more characters long\. +11. Next, use Substring to remove the t character from the ID column\. +12. Select Position 2 to start the new string at that position\. Select Length 4 for a four\-character length string\. +13. The initial t character in the ID column is removed in the NEW\-ID column\. + + + +## COMPUTE ## + +**Calculate** +Perform a calculation with another column or with a specified value\. The operators are: + + + + * Addition + * Division + * Exponentiation + * Is between two numbers + * Is equal to + * Is greater than + * Is greater than or equal to + * Is less than + * Is less than or equal to + * Is not equal to + * Modulus + * Multiplication + * Subtraction + + + +**Video transcript** + + + +1. The Calculate operation performs a calculation, such as addition or subtraction, with another column or with a specified value\. +2. Select the column to begin\. +3. Available calculations +4. Now select the second column for the Addition calculation\. +5. And apply the change\. +6. The id column is updated, and the Steps panel shows the completed operation\. +7. You can also access the operations from the column's menu\. +8. This time, select Is between two numbers\. Specify the range, and create a new column for the results\. +9. The new column displays in the table and the new calculate operation displays in the Steps panel\. +10. This time, select Is equal to to compare two columns, and create a new column for the results\. +11. The new column displays in the table and the new calculate operation displays in the Steps panel\. + + + +### Math ### + +You can apply math operations only to numeric columns\. You can create a new column to hold the result of an operation or you can overwrite the existing column\. + +**Math > Absolute value** +Get the absolute value of a number\. +Example: The absolute value of both 4 and \-4 is 4\. + +**Math > Arc cosine** +Get the arc cosine of an angle\. + +**Math > Ceiling** +Get the nearest integer of greater value, also known as the ceiling of the number\. +Examples: The ceiling of 2\.31 is 3\. The ceiling of \-2\.31 is \-2\. + +**Math > Exponent** +Get a number raised to the power of the column value\. + +**Math > Floor** +Get the nearest integer of lesser value, also known as the floor of the number\. +Example: The floor of 2\.31 is 2\. The floor of \-2\.31 is \-3\. + +**Math > Round** +Get the whole number nearest to the column value\. If the column value is a whole number, return it\. + +**Math > Square root** +Get the square root of the column value\. + +**Video transcript** + + + +1. Apply a Math operation to the values in a column\. Create a new column for the results or overwrite the existing column\. +2. Available Math operations +3. Apply Absolute value to the column's values\. +4. Create new column for results\. +5. The new column is added to the table, and the Math operation displays in the Steps panel\. +6. You can also access the operation from the column's menu\. +7. Apply Round to the ANGLE column's values\. +8. Create a new column for results\. +9. The new column is added to the table, and the new Math operation displays in the Steps panel\. + + + +## ORGANIZE ## + +**Aggregate** +Apply summary calculations to the values of one or more columns\. Each aggregation creates a new column\. Optionally, select **Group by columns** to group the new column by another column that defines a characteristic of the group, for example, a department or an ID\. You can group by multiple columns\. You can combine multiple aggregations in a single operation\. + +The available aggregate operations depend on the data type\. + +Numeric data: + + + + * Count unique values + * Minimum + * Maximum + * Sum + * Standard deviation + * Mean + + + +String data: + + + + * Combine row values + * Count unique values + + + +**Video transcript** + + + +1. The Aggregate operation applies summary calculations to the values of one or more columns\. Each aggregation creates a new column\. +2. Available aggregations depend on whether the data is numeric or string data\. +3. The available operators depend on the column's data type\. Available operators for numeric data\. +4. With the UniqueCarrier text column selected, you can see the available operators for string data\. +5. We will count how many unique values are in the UniqueCarrier column\. This aggregation will show how many airlines are in the data set\. +6. We have 22 airlines in the new Airlines column\. The other columns are deleted\. +7. The Aggregate operation displays in the Steps panel\. +8. Let's start over to show an aggregation on numeric data\. +9. Show the average (mean value) of the arrival delays\. +10. The average value of all the arrival delays is in the new MeanArrDelay column\. The other columns are deleted\. +11. You can also group the aggregated column by another column that defines a characteristic of the group\. +12. Let's edit the Aggregate step by adding a Group by selection so we can see the average of arrival delays by airline\. +13. Group the results by the UniqueCarrier column\. +14. The average arrival delays are now grouped by airline\. +15. The Steps panel displays the Aggregate operation\. + + + +**Concatenate** +Concatenate the values of two or more columns\. + +**Video transcript** + + + +1. The Concatenate operation concatenates the values of two or more columns\. +2. The Concatenate operation is under the ORGANIZE category\. +3. Select the columns to concatenate\. +4. Select a separator to use between the concatenated values\. +5. Type a name for the column for the concatenated values\. +6. The new column can display as the right\-most column in the data set, or next to the original column\. +7. Keep the original columns, and apply the changes\. +8. The new DATE column shows the concatenated values from the other three columns with a semicolon separator\. +9. The Concatenate operation displays in the Steps panel\. +10. The DATE column is a String data type\. Let's use the Convert column type operation to convert it to the Date data type\. +11. Select the Convert column type operation from the DATE column's menu\. Select Date\. +12. Select a date format and create a new column for the result\. +13. Place the new column next to the original column, and apply the changes\. +14. The new column displays with the converted date format\. +15. The Convert column type operation displays in the Steps panel\. +16. The ISO Date format is used when the String data type was converted to the Date data type\. For example, the string 2004;2;3 was converted to the date 2004\-02\-03\. + + + +**Conditional replace** +Replace the values in a column based on conditions\. + +**Video transcript** + + + +1. Use the Conditional replace operation to replace the values in a column based on conditions\. +2. First, let's specify conditions to replace data in the CODE string column and create a new column for the results\. +3. Available condition operators for string data\. +4. Add the first condition \- CONDITION 1: CODE Is equal to value C replace with COMPLETE\. +5. Add a second condition \- CONDITION 2: CODE Is equal to value I replace with INCOMPLETE\. +6. Specify what to do with any values that do not meet the conditions\. Here we will enter two double quotation marks to indicate an empty string\. +7. Create a new column for the results\. +8. The new column, STATUS, shows the conditional replacements from the CODE column\. +9. The Conditional replace operation shows in the Steps panel\. +10. Next, let's specify conditions to replace data in the INPUT integer column and create a new column for the results\. +11. Available condition operators for numeric data\. +12. Add the first condition \- CONDITION 1: INPUT Is less than or equal to value 3 replace with value LOW\. +13. Add a second condition \- CONDITION 2: INPUT Is in values 4,5,6 replace with value MED\. +14. Add a third condition \- CONDITION 3: INPUT Is greater than or equal to value 7 replace with value HIGH\. +15. Specify what to do with any values that do not meet the conditions\. +16. Create a new column for the results\. +17. The new column, RATING, shows the conditional replacements from the INPUT column\. +18. The Conditional replace operation shows in the Steps panel\. + + + +**Join** +Combine data from two data sets based on a comparison of the values in specified key columns\. Specify the type of join to perform, select the columns (join keys) in both data sets that you want to compare, and select the columns that you want in the resulting data set\. + +The join key columns in both data sets need to be compatible data types\. If the **Join** operation is the first step that you add, check whether the **Convert column type** operation automatically converted the data type of the join key columns in the first data set when you opened the file in Data Refinery\. Also, depending where the **Join** operation is in the Data Refinery flow, you can use the **Convert column type** operation to ensure that the join key columns' data types match\. Click a previous step in **Steps** panel to see the snapshot view of the step\. + +The join types include: + + + +| Join type | Description | +| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Left join | Returns all rows in the original data set and return only matching rows in the joining data set\. Returns one row in the original data set for each matching row in the joining data set\. | +| Right join | Returns all rows in the joining data set and return only matching rows in the original data set\. Returns one row in the joining data set for each matching row in the original data set\. | +| Inner join | Returns only the rows in each data set that match rows in the other data set\. Returns one row in the original data set for each matching row in the joining data set\. | +| Full join | Returns all rows in both data sets\. Blends rows in the original data set with matching rows in the joining data set\. | +| Semi join | Returns only the rows in the original data set that match rows in the joining data set\. Returns one row in the original data set for all matching rows in the joining data set\. | +| Anti join | Returns only the rows in the original data set that do not match rows in the joining data set\. | + + + +**Video transcript** + + + +1. The customers\.csv data set contains information about your company's customers, and the sales\.csv data set contains information about your company's sales representatives\. +2. The data sets share the SALESREP\_ID column\. +3. The customers\.csv data set is open in Data Refinery\. +4. The Join operation can combine the data from these two data sets based on a comparison of the values in the SALESREP\_ID column\. +5. You want to do an inner join to return only the rows in each data set that match in the other data set\. +6. You can add a custom suffix to append to columns that exist in both data sets to see the source data set for that column\. +7. Select the sales\.csv data set to join with the customers\.csv data set\. +8. For the join key, begin typing the column name to see a filtered list\. The SALESREP\_ID column links the two data sets\. +9. Next, select the columns to include\. Duplicate columns will display the suffix appended\. +10. Now apply the changes\. +11. The Join operation displays in the Steps panel\. +12. Now, the data set is enriched with the columns from the customers\.csv and sales\.csv data sets\. + + + +**Rename column** +Rename the selected column\. + +**Video transcript** + + + +1. Use the Rename column operation to quickly rename a column\. +2. The fastest way to rename a column is to edit the column's name in the table\. +3. Edit the name and press Enter on your keyboard\. +4. The Rename column step shows the old name and the new name\. +5. Now rename another column\. +6. The Steps panel shows the BANKS column was renamed to DOGS\. +7. Now rename the last column\. +8. The Steps panel shows the RATIOS column was renamed to BIRDS\. + + + +**Sample** +Generate a subset of your data by using one of the following methods\. Sampling steps from UI operations apply only when the flow is run\. + + + + * Random sample: Each data record of the subset has an equal probability of being chosen\. + * Stratified sample: Divide the data into one or more subgroups called *strata*\. Then generate one random sample that contains data from each subgroup\. + + + +**Video transcript** + + + +1. The Sample operation generates a subset of your data\. +2. Use the Sample operation when you have a large amount of data and you want to work on a representative sample for faster prototyping\. +3. The Sample operation is in the ORGANIZE category\. +4. Choose one of two methods to create a sample\. +5. With a random sample, each row has an equal probability to be included in the sample data\. +6. You can choose a random sample by number of rows or by percentage of data\. +7. A stratified sample builds on a random sample\. As with a random sample, you specify the amount of data in the sample (rows or percentage)\. +8. With a stratified sample, you divide the data into one or more subgroups called strata\. Then you generate one random sample that contains customized data from each subgroup\. +9. For Method, if you choose Auto, you select one column for the strata\. +10. If you choose Manual, you specify one or more strata and for each strata you specify filter conditions that define the rows in each strata\. +11. In this airline data example, we'll create two strata\. One strata defines 50% of the output to have New York City destination airports and the second the strata defines the remaining 50% to have a specified flight distance\. +12. In Specify details for this strata box, enter the percentage of the sample that will represent the conditions that you will specify in this first strata\. The strata percentages must total 100%\. +13. Available operators for string data\. +14. 50% of the sample will have New York City area destination airports\. +15. Click Save to save the first strata\. +16. The first strata, identified as Strata0, has one condition\. In this strata, 50% of sample must meet the condition\. +17. In Specify details for this strata box, enter the percentage of the sample that will represent the conditions that you will specify in the second strata\. +18. Available operators for numeric data\. +19. 50% of the sample will be for flights with a distance greater than 500\. +20. Click Save to save the second strata\. +21. The second strata, identified as Strata1, has one condition\. In this strata, 50% of the sample must meet the condition\. +22. If you use multiple strata, the Sample operation internally applies a Filter operation with an OR condition on the strata\. Depending on the data, the conditions, and the size of the sample, the results of using one strata with multiple conditions might differ from using multiple strata\. +23. Unlike the other Data Refinery operations, the Sample operation changes the data set only after you create and run a job for the Data Refinery flow\. +24. The Sample step shows in the Steps panel\. +25. The data set is over 10000 rows\. +26. Save and create a job for the Data Refinery flow\. +27. The new asset file is added to the project for the output of the Data Refinery flow\. +28. View the output file\. +29. There are 10 rows (50% of the sample) with New York City airports in the Dest column, but 17 rows in the Distance column with values greater than 500\. +30. These results are because the strata were applied with an OR condition and there was overlapping data for the conditions specified in first strata where the rows that were filtered by Dest containing New York City airports had Distance values greater than 500\. +31. The output file in Data Refinery shows the reduced size\. + + + +**Sort ascending** +Sort all the rows in the table by the selected column in ascending order\. + +**Sort descending** +Sort all the rows in the table by the selected column in descending order\. + +**Video transcript** + + + +1. Quickly sort all the rows in a data set by sorting the rows in a selected column\. +2. The fastest way to sort columns is from the column's menu\. +3. You can sort the rows in ascending or descending order\. +4. Sort ascending\. +5. The order of all the rows in the table is updated by the Sort operation of the first column\. +6. The Sort operation shows in the Steps panel\. +7. Sort descending\. +8. The order of all the rows in the table is changed by the Sort operation of the second column\. +9. The second Sort operation shows in the Steps panel\. +10. Sort ascending\. +11. The order of all the rows in the table is changed by the Sort operation of the third column\. +12. The third Sort operation shows in the Steps panel\. + + + +**Split column** +Split the column by non\-alphanumeric characters, position, pattern, or text\. + +**Video transcript** + + + +1. The Split column operation splits one column into two or more columns based on non\-alphanumeric characters, text, pattern, or position\. +2. To begin, let's split the YMD column into YEAR, MONTH, and DAY columns\. +3. The Split column operation is in the ORGANIZE category\. +4. First, select the YMD column to split\. +5. The tabs offer four choices for ways to split the column\. +6. DEFAULT uses any non\-alphanumeric character that's in the column values to split the column\. +7. In TEXT, you select a character or enter text to split the column\. +8. In PATTERN, you enter a regular expression based on R syntax to determine where to split the column\. +9. In POSITION, you specify at what position to split the column\. +10. We want to split the YMD column by the asterisk (\*), which is a non\-alphanumeric character, so we'll select the DEFAULT tab\. +11. Split the YMD column into three new columns \- YEAR, MONTH, and DAY\. +12. The three new columns, YEAR, MONTH, and DAY, are added to the data set\. +13. The Split column operation shows in the Steps panel\. +14. Next split the FLIGHT column into two columns \- One for the airline code and one for the flight number\. Because airline codes are two characters, we can split the column by position\. +15. Click the POSITION tab, and then type 2 in the Positions box\. +16. Split the FLIGHT column into two new columns \- AIRLINE and FLTNMBR\. +17. The two new columns, AIRLINE and FLIGHTNBR, are added to the data set\. +18. The Split column operation shows in the Steps panel\. + + + +**Union** +Combine the rows from two data sets that share the same schema and filter out the duplicates\. If you select **Allow a different number of columns and allow duplicate values**, the operation is a `UNION ALL` command\. + +**Video transcript** + + + +1. The Union operation combines the rows from two data sets that share the same schema\. +2. This data set has four columns and six rows\. The data types from left to right are String, String, Decimal, String\. +3. When the data set was loaded into Data Refinery, the AUTOMATIC Convert column type operation automatically converted the PRICE column to the Decimal data type\. +4. The columns in the second data set must be compatible to the data types in this data set\. +5. Select the data set to combine with the current data set\. +6. When you preview the new data set, you see that it also has four columns\. However, the PRICE column is a String data type\. +7. Before you apply the Union operation, you need to delete the AUTOMATIC Convert column type step so that the PRICE column is the same data type as the PRICE column in the new data set (String)\. +8. The PRICE column is now string data\. +9. Now repeat the union operation\. +10. The new data set is added to the current data set\. The data set is increased to 12 rows\. +11. The Union operation shows in the Steps panel\. +12. Now add a data set that has a different number of columns\. The matching columns must still be compatible data types\. +13. Select the data set to combine with the current data set\. +14. When you preview the new data set, you see that it has one more column than the original data set\. The fifth column is TYPE\. +15. Select Allow a different number of columns and allow duplicate values\. +16. Apply the Union operation\. +17. The new data set is added to the current data set\. The data set is increased to 18 rows\. +18. The additional column, TYPE, is added to the data set\. +19. The Union operation shows in the Steps panel\. + + + +Tip for the **Union** operation: If you receive an error about incompatible schemas, check if the automatic **Convert column type** operation changed the data types of the first data set\. Delete the **Convert column type** step and try again\. + +## NATURAL LANGUAGE ## + +**Remove stop words** Remove common words of the English language, such as “the” or “and\.” Stop words usually have little semantic value for text analytics algorithms and models\. Remove the stop words to reduce the data volume and to improve the quality of the data that you use to train machine learning models\. + +Optional: To confirm which words were removed, apply the **Tokenize** operation (by words) on the selected column, and then view the statistics for the words in the **Profile** tab\. You can undo the **Tokenize** step later in the Data Refinery flow\. + +**Video transcript** + + + +1. The Remove stop words operation removes common words of the English language from the data set\. Stop words usually have little semantic value for text analytics algorithms and models\. Remove the stop words to reduce the data volume and to improve the data quality\. +2. The Remove stop words operation removes these words: a, an, and, are, as, at, be, but, by, for, from, if, in, into, is, it, no, not, of, on, or, such, that, the, their, then, there, these, they, this, to, was, will, with\. +3. The Remove stop words operation is under the NATURAL LANGUAGE category\. +4. Select the STRING column\. +5. Click Apply to remove the stop words\. +6. The stop words are removed from the STRING column\. +7. The Remove stop words operation shows in the Steps panel\. + + + +**Tokenize** +Break up English text into words, sentences, paragraphs, lines, characters, or by regular expression\. + +**Video transcript** + + + +1. The Tokenize operation breaks up English text into words, sentences, paragraphs, lines, characters, or by regular expression\. +2. The Tokenize operation is under the NATURAL LANGUAGE category\. +3. Select the STRING column\. +4. Available tokenize options\. +5. Create a new column with the name WORDS\. +6. The Tokenize operation has taken the words from the STRING column and created a new column, WORDS, with a row for each word\. +7. The Tokenize operation shows in the Steps panel\. + + + +**Parent topic:**[Refining data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9cad0018634ff820d32f3fe714194d4bd42c5386.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9cad0018634ff820d32f3fe714194d4bd42c5386.md new file mode 100644 index 0000000..170456f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9cad0018634ff820d32f3fe714194d4bd42c5386.md @@ -0,0 +1,29 @@ +# {{ document.title.text }} + +# Personal information in data # + +![icon for privacy risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-privacy.svg)Risks associated with inputTraining and tuning phasePrivacyTraditional + +### Description ### + +Inclusion or presence of personal identifiable information (PII) and sensitive personal information (SPI) in the data used for training or fine tuning the model might result in unwanted disclosure of that information\. + +### Why is personal information in data a concern for foundation models? ### + +If not properly developed to protect sensitive data, the model might expose personal information in the generated output\. Additionally, personal or sensitive data must be reviewed and handled with respect to privacy laws and regulations, as business entities could face fines, reputational harms, and other legal consequences if found in violation\. + +Example + +#### Training on Private Information #### + +According to the article, Google and its parent company Alphabet were accused in a class\-action lawsuit of misusing vast amount of personal information and copyrighted material taken from what is described as hundreds of millions of internet users to train its commercial AI products, which includes Bard, its conversational generative artificial intelligence chatbot\. This follows similar lawsuits filed against Meta Platforms, Microsoft, and OpenAI over their alleged misuse of personal data\. + +Sources: + +[Reuters, July 2023](https://www.reuters.com/legal/litigation/google-hit-with-class-action-lawsuit-over-ai-data-scraping-2023-07-11/) + +[J\.L\. v\. Alphabet Inc\., July 2023](https://fingfx.thomsonreuters.com/gfx/legaldocs/myvmodloqvr/GOOGLE%20AI%20LAWSUIT%20complaint.pdf) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9cfb0a5fa276072e73c152485022c9a3eafcc233.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9cfb0a5fa276072e73c152485022c9a3eafcc233.md new file mode 100644 index 0000000..059ea52 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9cfb0a5fa276072e73c152485022c9a3eafcc233.md @@ -0,0 +1,106 @@ +# Data imputation implementation details for time series experiments + +# Data imputation implementation details for time series experiments # + +The experiment settings used for data imputation in time series experiments\. + +## Data imputation methods ## + +Apply one of these data imputation methods in experiment settings to supply missing values in a data set\. + + + +Data imputation methods for classification and regression experiments + +| Imputation method | Description | +| ----------------- | --------------------------------------------------------------------------------------------------------------- | +| FlattenIterative | Time series data is first flattened, then missing values are imputed with the Scikit\-learn iterative imputer\. | +| Linear | Linear interpolation method is used to impute the missing value\. | +| Cubic | Cubic interpolation method is used to impute the missing value\. | +| Previous | Missing value is imputed with the previous value\. | +| Next | Missing value is imputed with the next value\. | +| Fill | Missing value is imputed by using user\-specified value, or sample mean, or sample median\. | + + + +## Input Settings ## + +These commands are used to support data imputation for time series experiments in a notebook\. + + + +Data imputation methods for time series experiments + +| Name | Description | Value | DefaultValue | +| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- | ----------------------------------------------- | +| use\_imputation | Flag for switching imputation on or off\. | True or False | True | +| imputer\_list | List of imputer names (strings) to search\. If a list is not specified, all the default imputers are searched\. If an empty list is passed, all imputers are searched\. | FlattenIterative", "Linear", "Cubic", "Previous", "Fill", "Next | FlattenIterative", "Linear", "Cubic", "Previous | +| imputer\_fill\_type | Categories of "Fill" imputer | mean"/"median"/"value | value | +| imputer\_fill\_value | A single numeric value to be filled for all missing values\. Only applies when "imputer\_fill\_type" is specified as "value"\. Ignored if "mean" or "median" is specified for "imputer\_fill\_type\. | (Negative Infinity, Positive Infinity) | 0 | +| imputation\_threshold | Threshold for imputation\. The missing value ratio must not be greater than the threshold in one column\. Otherwise, results in an error\. | (0,1) | 0\.25 | + + + +### Notes for use\_imputation usage ### + + + + * If the `use_imputation` method is specified as `True` and the input data has missing values: + + + + * `imputation_threshold` takes effect. + * imputer candidates in `imputer_list` would be used to search for the best imputer. + * If the best imputer is `Fill`, `imputer_fill_type` and `imputer_fill_value` are applied; otherwise, they are ignored. + + + + * If the `use_imputation` method is specified as `True` and the input data has no missing values: + + + + * `imputation_threshold` is ignored. + * imputer candidates in `imputer_list` are used to search for the best imputer. If the best imputer is `Fill`, `imputer_fill_type` and `imputer_fill_value` are applied; otherwise, they are ignored. + + + + * If the `use_imputation` method is specified as `False` but the input data has missing values: + + + + * `use_imputation` is turned on with a warning, then the method follows the behavior for the first scenario. + + + + * If the `use_imputation` method is specified as `False` and the input data has no missing values, then no further processing is required\. + + + +For example: + + "pipelines": [ + { + "id": "automl", + "runtime_ref": "hybrid", + "nodes": + { + "id": "automl-ts", + "type": "execution_node", + "op": "kube", + "runtime_ref": "automl", + "parameters": { + "del_on_close": true, + "optimization": { + "target_columns": 2,3,4], + "timestamp_column": 1, + "use_imputation": true + } + } + } + ] + } + ] + +**Parent topic:**[Data imputation in AutoAI experiments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-imputation.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9d9188e6383db5f7038b98a688cb2dc9cf5a336c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9d9188e6383db5f7038b98a688cb2dc9cf5a336c.md new file mode 100644 index 0000000..5d08778 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9d9188e6383db5f7038b98a688cb2dc9cf5a336c.md @@ -0,0 +1,5 @@ +# watsonx.governance on IBM watsonx + +# watsonx\.governance on IBM® watsonx # + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9d9c67189be5d6db22575cf01a75bd5826b92074.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9d9c67189be5d6db22575cf01a75bd5826b92074.md new file mode 100644 index 0000000..1edf418 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9d9c67189be5d6db22575cf01a75bd5826b92074.md @@ -0,0 +1,22 @@ +# Auto Numeric node (SPSS Modeler) + +# Auto Numeric node # + +The Auto Numeric node estimates and compares models for continuous numeric range outcomes using a number of different methods, enabling you to try out a variety of approaches in a single modeling run\. You can select the algorithms to use, and experiment with multiple combinations of options\. For example, you could predict housing values using neural net, linear regression, C&RT, and CHAID models to see which performs best, and you could try out different combinations of stepwise, forward, and backward regression methods\. The node explores every possible combination of options, ranks each candidate model based on the measure you specify, and saves the best for use in scoring or further analysis\. + +Example +: A municipality wants to more accurately estimate real estate taxes and to adjust values for specific properties as needed without having to inspect every property\. Using the Auto Numeric node, the analyst can generate and compare a number of models that predict property values based on building type, neighborhood, size, and other known factors\. + +Requirements +: A single target field (with the role set to Target), and at least one input field (with the role set to Input)\. The target must be a continuous (numeric range) field, such as *age* or *income*\. Input fields can be continuous or categorical, with the limitation that some inputs may not be appropriate for some model types\. For example, C&R Tree models can use categorical string fields as inputs, while linear regression models cannot use these fields and will ignore them if specified\. The requirements are the same as when using the individual modeling nodes\. For example, a CHAID model works the same whether generated from the CHAID node or the Auto Numeric node\. + +Frequency and weight fields +: Frequency and weight are used to give extra importance to some records over others because, for example, the user knows that the build dataset under\-represents a section of the parent population (Weight) or because one record represents a number of identical cases (Frequency)\. If specified, a frequency field can be used by C&R Tree and CHAID algorithms\. A weight field can be used by C&RT, CHAID, Regression, and GenLin algorithms\. Other model types will ignore these fields and build the models anyway\. Frequency and weight fields are used only for model building and are not considered when evaluating or scoring models\. + +Prefixes +: If you attach a table node to the nugget for the Auto Numeric Node, there are several new variables in the table with names that begin with a $ prefix\. +: The names of the fields that are generated during scoring are based on the target field, but with a standard prefix\. Different model types use different sets of prefixes\. +: For example, the prefixes $G, $R, $C are used as the prefix for predictions that are generated by the Generalized Linear model, CHAID model, and C5\.0 model, respectively\. $X is typically generated by using an ensemble, and $XR, $XS, and $XF are used as prefixes in cases where the target field is a Continuous, Categorical, or Flag field, respectively\. +: $\.\.E prefixes are used for the prediction confidence of a Continuous target; for example, $XRE is used as a prefix for ensemble Continuous prediction confidence\. $GE is the prefix for a single prediction of confidence for a Generalized Linear model\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9da0d100a88228ab463cb9b1b6cf1c051253911a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9da0d100a88228ab463cb9b1b6cf1c051253911a.md new file mode 100644 index 0000000..933bae4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9da0d100a88228ab463cb9b1b6cf1c051253911a.md @@ -0,0 +1,37 @@ +# Selecting functions (SPSS Modeler) + +# Selecting functions # + +The function list displays all available CLEM functions and operators\. Scroll to select a function from the list, or, for easier searching, use the drop\-down list to display a subset of functions or operators\. + +The following categories of functions are available: + + + +Table 1\. CLEM functions for use with your data + +| Function type | Description | +| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Operators | Lists all the operators you can use when building expressions\. Operators are also available from the buttons\. | +| Information | Used to gain insight into field values\. For example, the function `is_string` returns `true` for all records whose type is a string\. | +| Conversion | Used to construct new fields or convert storage type\. For example, the function `to_timestamp` converts the selected field to a timestamp\. | +| Comparison | Used to compare field values to each other or to a specified string\. For example, `<=` is used to compare whether the values of two fields are lesser or equal\. | +| Logical | Used to perform logical operations, such as `if, then, else` operations\. | +| Numeric | Used to perform numeric calculations, such as the natural log of field values\. | +| Trigonometric | Used to perform trigonometric calculations, such as the arccosine of a specified angle\. | +| Probability | Returns probabilities that are based on various distributions, such as probability that a value from Student's t distribution is less than a specific value\. | +| Spatial Functions | Used to perform spatial calculations on geospatial data\. | +| Bitwise | Used to manipulate integers as bit patterns\. | +| Random | Used to randomly select items or generate numbers\. | +| String | Used to perform various operations on strings, such as `stripchar`, which allows you to remove a specified character\. | +| Date and time | Used to perform various operations on date, time, and timestamp fields\. | +| Sequence | Used to gain insight into the record sequence of a data set or perform operations that are based on that sequence\. | +| Global | Used to access global values that are created by a Set Globals node\. For example, `@MEAN` is used to refer to the mean average of all values for a field across the entire data set\. | +| Blanks and Null | Used to access, flag, and frequently fill user\-specified blanks or system\-missing values\. For example, `@BLANK(FIELD)` is used to raise a true flag for records where blanks are present\. | +| Special Fields | Used to denote the specific fields under examination\. For example, `@FIELD` is used when deriving multiple fields\. | + + + +After you select a group of functions, double\-click to insert the functions into the Expression box at the point indicated by the position of the cursor\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9da9a2809d484a6caa70a66a3548cf4a537950fc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9da9a2809d484a6caa70a66a3548cf4a537950fc.md new file mode 100644 index 0000000..35d41aa --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9da9a2809d484a6caa70a66a3548cf4a537950fc.md @@ -0,0 +1,22 @@ +# applyassociationrulesnode properties + +# applyassociationrulesnode properties # + +You can use the Association Rules modeling node to generate an association rules model nugget\. The scripting name of this model nugget is *applyassociationrulesnode*\. For more information on scripting the modeling node itself, see [associationrulesnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/gsarnodeslots.html#gsarnodeslots)\. + + + +applyassociationrulesnode properties + +Table 1\. applyassociationrulesnode properties + +| `applyassociationrulesnode` properties | Data type | Property description | +| -------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------------------- | +| `max_predictions` | *integer* | The maximum number of rules that can be applied to each input to the score\. | +| `criterion` | `Confidence``Rulesupport``Lift``Conditionsupport``Deployability` | Select the measure used to determine the strength of rules\. | +| `allow_repeats` | *Boolean* | Determine whether rules with the same prediction are included in the score\. | +| `check_input` | `NoPredictions``Predictions``NoCheck` | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9dae797269714235c8d9287b5d358bcf72e2c9f5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9dae797269714235c8d9287b5d358bcf72e2c9f5.md new file mode 100644 index 0000000..230cbcf --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9dae797269714235c8d9287b5d358bcf72e2c9f5.md @@ -0,0 +1,51 @@ +# SPSS predictive analytics algorithms for scoring + +# SPSS predictive analytics algorithms for scoring # + +A PMML\-compliant scoring engine supports: + + + + * PMML\-compliant models (4\.2 and earlier versions) produced by various vendors, except for Baseline Model, ScoreCard Model, Sequence Model, and Text Model\. Refer to the [Data Mining Group (DMG) web site](http://www.dmg.org/) for a list of supported models\. + * Non\-PMML models produced by IBM SPSS products: Discriminant and Bayesian networks + * PMML 4\.2 transformations completely + + + +Different kinds of models can produce various scoring results\. For example: + + + + * Classification models (those with a categorical target: Bayes Net, General Regression, Mining, Naive Bayes, k\-Nearest Neighbor, Neural Network, Regression, Ruleset, Support Vector Machine, and Tree) produce: + + + + * Predicted values + * Probabilities + * Confidence values + + + + * Regression models (those with a continuous target: General Regression, Mining, k\-Nearest Neighbor, Neural Network, Regression, and Tree) produce predicted values; some also produce standard errors\. + * Cox regression (in General Regression) produces predicted survival probability and cumulative hazard values\. + * Tree models also produce Node ID\. + * Clustering models produce Cluster ID and Cluster affinity\. + * Anomaly Detection (represented as Clustering) produces anomaly index and top reasons\. + * Association models produce Consequent, Rule ID, and confidence for top matching rules\. + + + +**Python example code:** + + from spss.ml.score import Score + + with open("linear.pmml") as reader: + pmmlString = reader.read() + + score = Score().fromPMML(pmmlString) + scoredDf = score.transform(data) + scoredDf.show() + +**Parent topic:**[SPSS predictive analytics algorithms](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spss-algorithms.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9deac0e5b403baedeabe9c76a295651289e6416c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9deac0e5b403baedeabe9c76a295651289e6416c.md new file mode 100644 index 0000000..09c6693 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9deac0e5b403baedeabe9c76a295651289e6416c.md @@ -0,0 +1,47 @@ +# Evaluating the model (SPSS Modeler) + +# Evaluating the model # + +We've been browsing the model to understand how scoring works\. But to evaluate how accurately it works, we need to score some records and compare the responses predicted by the model to the actual results\. We're going to score the same records that were used to estimate the model, allowing us to compare the observed and predicted responses\. + +Figure 1\. Attaching the model nugget to output nodes for model evaluation + +![Attaching the model nugget to output nodes for model evaluation](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_intro_attach.png) + + + +1. To see the scores or predictions, attach the Table node to the model nugget and then right\-click the Table node and select Run\. A table will be generated and added to the Outputs panel\. Double\-click it to open it\. + + The table displays the predicted scores in a field named `$R-Credit rating`, which was created by the model. We can compare these values to the original `Credit rating` field that contains the actual responses. + + By convention, the names of the fields generated during scoring are based on the target field, but with a standard prefix. Prefixes `$G` and `$GE` are generated by the Generalized Linear Model, `$R` is the prefix used for the prediction generated by the CHAID model in this case, `$RC` is for confidence values, `$X` is typically generated by using an ensemble, and `$XR`, `$XS`, and `$XF` are used as prefixes in cases where the target field is a Continuous, Categorical, Set, or Flag field, respectively. Different model types use different sets of prefixes. A confidence value is the model's own estimation, on a scale from 0.0 to 1.0, of how accurate each predicted value is. + + Figure 2. Table showing generated scores and confidence values + + ![Table showing generated scores and confidence values](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/spss-eval-table.png) + + As expected, the predicted value matches the actual responses for many records but not all. The reason for this is that each CHAID terminal node has a mix of responses. The prediction matches the most common one, but will be wrong for all the others in that node. (Recall the 18% minority of low-income customers who did not default.) + + To avoid this, we could continue splitting the tree into smaller and smaller branches, until every node was 100% pure—all Good or Bad with no mixed responses. But such a model would be extremely complicated and would probably not generalize well to other datasets. + + To find out exactly how many predictions are correct, we could read through the table and tally the number of records where the value of the predicted field `$R-Credit rating` matches the value of `Credit rating`. Fortunately, there's a much easier way; we can use an Analysis node, which does this automatically. +2. Connect the model nugget to the Analysis node\. +3. Right\-click the Analysis node and select Run\. An Analysis entry will be added to the Outputs panel\. Double\-click it to open it\. + + + +Figure 3\. Attaching an Analysis node + +![Attaching an Analysis node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_intro_attach.png) + +The analysis shows that for 1960 out of 2464 records—over 79%—the value predicted by the model matched the actual response\. + +Figure 4\. Analysis results comparing observed and predicted responses + +![Analysis results comparing observed and predicted responses](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_intro_analysis.png) + +This result is limited by the fact that the records being scored are the same ones used to estimate the model\. In a real situation, you could use a Partition node to split the data into separate samples for training and evaluation\. By using one sample partition to generate the model and another sample to test it, you can get a much better indication of how well it will generalize to other datasets\. + +The Analysis node allows us to test the model against records for which we already know the actual result\. The next stage illustrates how we can use the model to score records for which we don't know the outcome\. For example, this might include people who are not currently customers of the bank, but who are prospective targets for a promotional mailing\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9df72c2325ce5baca0cc7d2a884695d115557c40.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9df72c2325ce5baca0cc7d2a884695d115557c40.md new file mode 100644 index 0000000..33e1a7b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9df72c2325ce5baca0cc7d2a884695d115557c40.md @@ -0,0 +1,6 @@ +# Line charts + +# Line charts # + +A line chart plots a series of data points on a graph and connects them with lines\. A line chart is useful for showing trend lines with subtle differences, or with data lines that cross one another\. You can use a line chart to summarize categorical variables, in which case it is similar to a bar chart (see [Bar charts](https://dataplatform.cloud.ibm.com/docs/content/dataview/chart_creation_barcharts.html#chart_creation_barcharts) )\. Line charts are also useful for time\-series data\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9dff39b0fb5fe6195aa75e50040b6d669fce2bb6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9dff39b0fb5fe6195aa75e50040b6d669fce2bb6.md new file mode 100644 index 0000000..ffdd86e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9dff39b0fb5fe6195aa75e50040b6d669fce2bb6.md @@ -0,0 +1,54 @@ +# Requirements for using custom components in ML models + +# Requirements for using custom components in ML models # + +You can define your own transformers, estimators, functions, classes, and tensor operations in models that you deploy in IBM Watson Machine Learning as online deployments\. + +## Defining and using custom components ## + +To use custom components in your models, you need to package your custom components in a [Python distribution package](https://packaging.python.org/glossary/#term-distribution-package)\. + +### Package requirements ### + + + + * The package type must be: [source distribution](https://packaging.python.org/glossary/#term-source-distribution-or-sdis) (distributions of type Wheel and Egg are not supported) + * The package file format must be: `.zip` + * Any third\-party dependencies for your custom components must be installable by `pip` and must be passed to the `install_requires` argument of the `setup` function of the `setuptools` library\. + + + +Refer to: [Creating a source distribution](https://docs.python.org/2/distutils/sourcedist.html) + +### Storing your custom package ### + +You must take extra steps when you store your trained model in the Watson Machine Learning repository: + + + + * Store your custom package in the [Watson Machine Learning repository](https://ibm.github.io/watson-machine-learning-sdk/core_api.html#ibm_watson_machine_learning.runtimes.Runtimes.store_library) (use the `runtimes.store_library` function from the Watson Machine Learning Python client, or the `store libraries` Watson Machine Learning CLI command\.) + * Create a runtime resource object that references your stored custom package, and then [store the runtime resource object](https://ibm.github.io/watson-machine-learning-sdk/core_api.html#ibm_watson_machine_learning.runtimes.Runtimes.store) in the Watson Machine Learning repository (use the `runtimes.store` function, or the `store runtimes` command\.) + * When you store your trained model in the Watson Machine Learning repository, reference your stored runtime resource in the [metadata](https://ibm.github.io/watson-machine-learning-sdk/core_api.html#client.Repository.store_model) that is passed to the `store_model` function (or the `store` command\.) + + + +## Supported frameworks ## + +These frameworks support custom components: + + + + * Scikit\-learn + * XGBoost + * Tensorflow + * Python Functions + * Python Scripts + * Decision Optimization + + + +For more information, see [Supported frameworks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/pm_service_supported_frameworks.html) + +**Parent topic:**[Customizing deployment runtimes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-customize.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e15d946edfb82ef911d36032c073cf1736b39da.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e15d946edfb82ef911d36032c073cf1736b39da.md new file mode 100644 index 0000000..5451e3a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e15d946edfb82ef911d36032c073cf1736b39da.md @@ -0,0 +1,15 @@ +# RFM Analysis node (SPSS Modeler) + +# RFM Analysis node # + +You can use the Recency, Frequency, Monetary (RFM) Analysis node to determine quantitatively which customers are likely to be the best ones by examining how recently they last purchased from you (recency), how often they purchased (frequency), and how much they spent over all transactions (monetary)\. + +The reasoning behind RFM analysis is that customers who purchase a product or service once are more likely to purchase again\. The categorized customer data is separated into a number of bins, with the binning criteria adjusted as you require\. In each of the bins, customers are assigned a score; these scores are then combined to provide an overall RFM score\. This score is a representation of the customer's membership in the bins created for each of the RFM parameters\. This binned data may be sufficient for your needs, for example, by identifying the most frequent, high\-value customers; alternatively, it can be passed on in a flow for further modeling and analysis\. + +Note, however, that although the ability to analyze and rank RFM scores is a useful tool, you must be aware of certain factors when using it\. There may be a temptation to target customers with the highest rankings; however, over\-solicitation of these customers could lead to resentment and an actual fall in repeat business\. It is also worth remembering that customers with low scores should not be neglected but instead may be cultivated to become better customers\. Conversely, high scores alone do not necessarily reflect a good sales prospect, depending on the market\. For example, a customer in bin 5 for recency, meaning that they have purchased very recently, may not actually be the best target customer for someone selling expensive, longer\-life products such as cars or televisions\. + +Note: Depending on how your data is stored, you may need to precede the RFM Analysis node with an RFM Aggregate node to transform the data into a usable format\. For example, input data must be in customer format, with one row per customer; if the customers' data is in transactional form, use an RFM Aggregate node upstream to derive the recency, frequency, and monetary fields\. + +The RFM Aggregate and RFM Analysis nodes in are set up to use independent binning; that is, they rank and bin data on each measure of recency, frequency, and monetary value, without regard to their values or the other two measures\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e1cdb994e758d43d9d8cdc5d88e2b5c7e0088d7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e1cdb994e758d43d9d8cdc5d88e2b5c7e0088d7.md new file mode 100644 index 0000000..d96d79b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e1cdb994e758d43d9d8cdc5d88e2b5c7e0088d7.md @@ -0,0 +1,23 @@ +# Feature Selection node (SPSS Modeler) + +# Feature Selection node # + +Data mining problems may involve hundreds, or even thousands, of fields that can potentially be used as inputs\. As a result, a great deal of time and effort may be spent examining which fields or variables to include in the model\. To narrow down the choices, the Feature Selection algorithm can be used to identify the fields that are most important for a given analysis\. For example, if you are trying to predict patient outcomes based on a number of factors, which factors are the most likely to be important? + +Feature selection consists of three steps: + + + + * Screening\. Removes unimportant and problematic inputs and records, or cases such as input fields with too many missing values or with too much or too little variation to be useful\. + * Ranking\. Sorts remaining inputs and assigns ranks based on importance\. + * Selecting\. Identifies the subset of features to use in subsequent models—for example, by preserving only the most important inputs and filtering or excluding all others\. + + + +In an age where many organizations are overloaded with too much data, the benefits of feature selection in simplifying and speeding the modeling process can be substantial\. By focusing attention quickly on the fields that matter most, you can reduce the amount of computation required; more easily locate small but important relationships that might otherwise be overlooked; and, ultimately, obtain simpler, more accurate, and more easily explainable models\. By reducing the number of fields used in the model, you may find that you can reduce scoring times as well as the amount of data collected in future iterations\. + +Example\. A telephone company has a data warehouse containing information about responses to a special promotion by 5,000 of the company's customers\. The data includes a large number of fields containing customers' ages, employment, income, and telephone usage statistics\. Three target fields show whether or not the customer responded to each of three offers\. The company wants to use this data to help predict which customers are most likely to respond to similar offers in the future\. + +Requirements\. A single target field (one with its role set to `Target`), along with multiple input fields that you want to screen or rank relative to the target\. Both target and input fields can have a measurement level of `Continuous` (numeric range) or `Categorical`\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e2277ec0ed75ec2871c8bccb4b9af3f78350c9b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e2277ec0ed75ec2871c8bccb4b9af3f78350c9b.md new file mode 100644 index 0000000..1d063b3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e2277ec0ed75ec2871c8bccb4b9af3f78350c9b.md @@ -0,0 +1,526 @@ +# Classifying text with a custom classification model + +# Classifying text with a custom classification model # + +You can train your own models for text classification using strong classification algorithms from three different families: + + + + * Classic machine learning using SVM (Support Vector Machines) + * Deep learning using CNN (Convolutional Neural Networks) + * A transformer\-based algorithm using a pre\-trained transformer model: + + + + * Runtime 23.1: Slate IBM Foundation model + * Runtime 22.x: Google BERT Multilingual model + + + + + +The Watson Natural Language Processing library also offers an easy to use Ensemble classifier that combines different classification algorithms and majority voting\. + +The algorithms support multi\-label and multi\-class tasks and special cases, like if the document belongs to one class only (single\-label task), or binary classification tasks\. + +Note:Training classification models is CPU and memory intensive\. Depending on the size of your training data, the environment might not be large enough to complete the training\. If you run into issues with the notebook kernel during training, create a custom notebook environment with a larger amount of CPU and memory, and use that to run your notebook\. Especially for transformer\-based algorithms, you should use a GPU\-based environment, if it is available to you\. See [Creating your own environment template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-customize-env-definition.html)\. + +Topic sections: + + + + * [Input data format for training](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-classify-text.html?context=cdpaas&locale=en#input-data) + * [Input data requirements](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-classify-text.html?context=cdpaas&locale=en#input-data-reqs) + * [Stopwords](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-classify-text.html?context=cdpaas&locale=en#stopwords) + * [Training SVM algorithms](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-classify-text.html?context=cdpaas&locale=en#train-svm) + * [Training the CNN algorithm](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-classify-text.html?context=cdpaas&locale=en#train-cnn) + * [Training the transformer algorithm by using the Slate IBM Foundation model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-classify-text.html?context=cdpaas&locale=en#train-slate) + * [Training a custom transformer model by using a model provided by Hugging Face](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-classify-text.html?context=cdpaas&locale=en#train-huface) + * [Training the multilingual BERT algorithm](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-classify-text.html?context=cdpaas&locale=en#train-bert) + * [Training an ensemble model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-classify-text.html?context=cdpaas&locale=en#train-ensemble) + * [Training best practices](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-classify-text.html?context=cdpaas&locale=en#best-practices) + * [Applying the model on new data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-classify-text.html?context=cdpaas&locale=en#apply-model) + * [Choosing the right algorithm for your use case](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-classify-text.html?context=cdpaas&locale=en#choose-algorithm) + + + +## Input data format for training ## + +Classification blocks accept training data in CSV and JSON formats\. + + + + * The CSV Format + + The CSV file should contain no header. Each row in the CSV file represents an example record. Each record has one or more columns, where the first column represents the text and the subsequent columns represent the labels associated with that text. + + Note: + + + + * The SVM and CNN algorithms do not support training data where an instance has no labels. So, if you are using the SVM algorithm, or the CNN algorithm, or an Ensemble including one of these algorithms, each CSV row must have at least one label, i.e., 2 columns. + * The BERT-based and Slate-based Transformer algorithms support training data where each instance has 0, 1 or more than one label. + + Example 1,label 1 + Example 2,label 1,label 2 + + + + * The JSON Format + + The training data is represented as an array with multiple JSON objects. Each JSON object represents one training instance, and must have a text and a labels field. The text represents the training example, and labels stores the labels associated with the example (0, 1, or more than one label). + + [ + { + "text": "Example 1", + "labels": "label 1"] + }, + { + "text": "Example 2", + "labels": "label 1", "label 2"] + }, + { + "text": "Example 3", + "labels": ] + } + ] + + Note: + + + + * `"labels": []` denotes an example with no labels. The SVM and CNN algorithms do not support training data where an instance has no labels. So, if you are using the SVM algorithm, or the CNN algorithm, or an Ensemble including one of these algorithms, each JSON object must have at least one label. + * The BERT-based and Slate-based Transformer algorithms support training data where each instance has 0, 1 or more than one label. + + + + + +## Input data requirements ## + +For SVM and CNN algorithms: + + + + * Minimum number of unique labels required: 2 + * Minimum number of text examples required per label: 5 + + + +For the BERT\-based and Slate\-based Transformer algorithms: + + + + * Minimum number of unique labels required: 1 + * Minimum number of text examples required per label: 5 + + + +Note that the training data in CSV or JSON format is converted to a DataStream before training\. Instead of training data files, you can also pass data streams directly to the training functions of classification blocks\. + +## Stopwords ## + +You can provide your own stopwords that will be removed during preprocessing\. Stopwords file inputs are expected in a standard format: a single text file with one phrase per line\. Stopwords can be provided as a list or as a file in a standard format\. + +Stopwords can be used only with the Ensemble classifier\. + +## Training SVM algorithms ## + +SVM is a support vector machine classifier that can be trained using predictions on any kind of input provided by the embedding or vectorization blocks as feature vectors, for example, by `USE` (Universal Sentence Encoder) embeddings and `TF-IDF` vectorizers\. It supports multi\-class and multi\-label text classification and produces confidence scores via Platt Scaling\. + +For all options that are available for configuring SVM training, enter: + + help(watson_nlp.blocks.classification.svm.SVM.train) + +To train SVM algorithms: + + + +1. Begin with these preprocessing steps: + + import watson_nlp + from watson_core.data_model.streams.resolver import DataStreamResolver + from watson_nlp.blocks.classification.svm import SVM + + training_data_file = "" + + # Create datastream from training data + data_stream_resolver = DataStreamResolver(target_stream_type=list, expected_keys={'text': str, 'labels': list}) + training_data = data_stream_resolver.as_data_stream(training_data_file) + + # Load a Syntax model + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + + # Create Syntax stream + text_stream, labels_stream = training_data[0], training_data[1] + syntax_stream = syntax_model.stream(text_stream) + + + + + +1. Train the classification model using USE embeddings\. See [Pretrained USE embeddings available out\-of\-the\-box](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-classify-text.html?context=cdpaas&locale=en#use-embeddings) for a list of the pretrained blocks that are available\. + + # download embedding + use_embedding_model = watson_nlp.load('embedding_use_en_stock') + + use_train_stream = use_embedding_model.stream(syntax_stream, doc_embed_style='raw_text') + # NOTE: doc_embed_style can be changed to `avg_sent` as well. For more information check the documentation for Embeddings + # Or the USE run function API docs + use_svm_train_stream = watson_nlp.data_model.DataStream.zip(use_train_stream, labels_stream) + + # Train SVM using Universal Sentence Encoder (USE) training stream + classification_model = SVM.train(use_svm_train_stream) + + + +### Pretrained USE embeddings available out\-of\-the\-box ### + +USE embeddings are wrappers around Google Universal Sentence Encoder embeddings available in TFHub\. These embeddings are used in the document classification SVM algorithm\. + +The following table lists the pretrained blocks for USE embeddings that are available and the languages that are supported\. For a list of the language codes and the corresponding language, see [Language codes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html#lang-codes)\. + + + +List of pretrained USE embeddings with their supported languages + +| Block name | Model name | Supported languages | +| ---------- | --------------------------- | ------------------------------------------------------------------ | +| `use` | `embedding_use_en_stock` | English only | +| `use` | `embedding_use_multi_small` | ar, de, en, es, fr, it, ja, ko, nl, pl, pt, ru, tr, zh\-cn, zh\-tw | +| `use` | `embedding_use_multi_large` | ar, de, en, es, fr, it, ja, ko, nl, pl, pt, ru, tr, zh\-cn, zh\-tw | + + + +When using USE embeddings, consider the following: + + + + * Choose `embedding_use_en_stock` if your task involves English text\. + * Choose one of the multilingual USE embeddings if your task involves text in a non\-English language, or you want to train multilingual models\. + * The USE embeddings exhibit different trade\-offs between quality of the trained model and throughput at inference time, as described below\. Try different embeddings to decide the trade\-off between quality of result and inference throughput that is appropriate for your use case\. + + + + * `embedding_use_multi_small` has reasonable quality, but it is fast at inference time + * `embedding_use_en_stock` is a English-only version of `embedding_embedding_use_multi_small`, hence it is smaller and exhibits higher inference throughput + * `embedding_use_multi_large` is based on Transformer architecture, and therefore it provides higher quality of result, with lower throughput at inference time + + + + + +## Training the CNN algorithm ## + +CNN is a simple convolutional network architecture, built for multi\-class and multi\-label text classification on short texts\. It utilizes GloVe embeddings\. GloVe embeddings encode word\-level semantics into a vector space\. The GloVe embeddings for each language are trained on the Wikipedia corpus in that language\. For information on using GloVe embeddings, see the open source GloVe embeddings documentation\. + +For all the options that are available for configuring CNN training, enter: + + help(watson_nlp.blocks.classification.cnn.CNN.train) + +To train CNN algorithms: + + import watson_nlp + from watson_core.data_model.streams.resolver import DataStreamResolver + from watson_nlp.blocks.classification.cnn import CNN + + training_data_file = "" + + # Create datastream from training data + data_stream_resolver = DataStreamResolver(target_stream_type=list, expected_keys={'text': str, 'labels': list}) + training_data = data_stream_resolver.as_data_stream(training_data_file) + + # Load a Syntax model + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + + # Create Syntax stream + text_stream, labels_stream = training_data[0], training_data[1] + syntax_stream = syntax_model.stream(text_stream) + + # Download GloVe embeddings + glove_embedding_model = watson_nlp.load('embedding_glove_en_stock') + + # Train CNN + classification_model = CNN.train(watson_nlp.data_model.DataStream.zip(syntax_stream, labels_stream), embedding=glove_embedding_model.embedding) + +## Training the transformer algorithm by using the IBM Slate model ## + +The transformer algorithm using the pretrained Slate IBM Foundation model can be used for multi\-class and multi\-label text classification on short texts\. + +The pretrained Slate IBM Foundation model is only available in Runtime 23\.1\. + +For all the options available for configuring Transformer training, enter: + + help(watson_nlp.blocks.classification.transformer.Transformer.train) + +To train Transformer algorithms: + + import watson_nlp + from watson_nlp.blocks.classification.transformer import Transformer + from watson_core.data_model.streams.resolver import DataStreamResolver + training_data_file = "train_data.json" + + # create datastream from training data + data_stream_resolver = DataStreamResolver(target_stream_type=list, expected_keys={'text': str, 'labels': list}) + train_stream = data_stream_resolver.as_data_stream(training_data_file) + + # Load pre-trained Slate model + pretrained_model_resource = watson_nlp.load('pretrained-model_slate.153m.distilled_many_transformer_multilingual_uncased ') + + # Train model + classification_model = Transformer.train(train_stream, pretrained_model_resource) + +## Training a custom transformer model by using a model provided by Hugging Face ## + +Note: This training method is only available in Runtime 23\.1\. + +You can train your custom transformer\-based model by using a pretrained model from Hugging Face\. + +To use a Hugging Face model, specify the model name as the `pretrained_model_resource` parameter in the `train` method of `watson_nlp.blocks.classification.transformer.Transformer`\. Go to [https://huggingface\.co/models](https://huggingface.co/models) to copy the model name\. + +To get a list of all the options available for configuring a transformer training, type this code: + + help(watson_nlp.blocks.classification.transformer.Transformer.train) + +For information on how to train transformer algorithms, refer to this code example: + + import watson_nlp + from watson_nlp.blocks.classification.transformer import Transformer + from watson_core.data_model.streams.resolver import DataStreamResolver + training_data_file = "train_data.json" + + # create datastream from training data + data_stream_resolver = DataStreamResolver(target_stream_type=list, expected_keys={'text': str, 'labels': list}) + train_stream = data_stream_resolver.as_data_stream(training_data_file) + + # Specify the name of the Hugging Face model + huggingface_model_name = 'xml-roberta-base' + + # Train model + classification_model = Transformer.train(train_stream, pretrained_model_resource=huggingface_model_name) + +## Training the multilingual BERT algorithm ## + +BERT is a transformer\-based architecture, built for multi\-class and multi\-label text classification on short texts\. + +Note: The Google BERT Multilingual model is available in 22\.2 runtimes only\. + +For all the options available for configuring BERT training, enter: + + help(watson_nlp.blocks.classification.bert.BERT.train) + +To train BERT algorithms: + + import watson_nlp + from watson_nlp.blocks.classification.bert import BERT + from watson_core.data_model.streams.resolver import DataStreamResolver + training_data_file = "" + + # create datastream from training data + data_stream_resolver = DataStreamResolver(target_stream_type=list, expected_keys={'text': str, 'labels': list}) + train_stream = data_stream_resolver.as_data_stream(training_data_file) + + # Load pre-trained BERT model + pretrained_model_resource = watson_nlp.load('pretrained-model_bert_multi_bert_multi_uncased') + + # Train model + classification_model = BERT.train(train_stream, pretrained_model_resource) + +## Training an ensemble model ## + +The Ensemble model is a weighted ensemble of these three algorithms: CNN, SVM with TF\-IDF and SVM with USE\. It computes the weighted mean of a set of classification predictions using confidence scores\. The ensemble model is very easy to use\. + +### Using the `Runtime 22.2` and `Runtime 23.1` environments ### + +The GenericEnsemble classifier allows more flexibility for the user to choose from the three base classifiers TFIDF\-SVM, USE\-SVM and CNN\. For texts ranging from 50 to 1000 characters, using the combination of TFIDF\-SVM and USE\-SVM classifiers often yields a good balance of quality and performance\. On some medium or long documents (500\-1000\+ characters), adding the CNN to the Ensemble could help increase quality, but it usually comes with a significant runtime performance impact (lower throughput and increased model loading time)\. + +For all of the options available for configuring Ensemble training, enter: + + help(watson_nlp.workflows.classification.GenericEnsemble) + +To train Ensemble algorithms: + + import watson_nlp + from watson_nlp.workflows.classification import GenericEnsemble + from watson_nlp.workflows.classification.base_classifier import GloveCNN + from watson_nlp.workflows.classification.base_classifier import TFidfSvm + from watson_nlp.workflows.classification.base_classifier import UseSvm + + training_data_file = "" + + # Create datastream from training data + data_stream_resolver = DataStreamResolver(target_stream_type=list, expected_keys={'text': str, 'labels': list}) + training_data = data_stream_resolver.as_data_stream(training_data_file) + + # Syntax Model + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + # USE Embedding Model + use_model = watson_nlp.load('embedding_use_en_stock') + # GloVE Embedding model + glove_model = watson_nlp.load('embedding_glove_en_stock') + + ensemble_model = GenericEnsemble.train(training_data, syntax_model, + base_classifiers_params=[ + TFidfSvm.TrainParams(syntax_model=syntax_model), + GloveCNN.TrainParams(syntax_model=syntax_model, glove_embedding_model=glove_model, cnn_epochs=5), + UseSvm.TrainParams(syntax_model=syntax_model, use_embedding_model=use_model, doc_embed_style='raw_text')], + use_ewl=True) + +### Pretrained stopword models available out\-of\-the\-box ### + +The text model for identifying stopwords is used in training the document classification ensemble model\. + +The following table lists the pretrained stopword models and the language codes that are supported (`xx` stands for the language code)\. For a list of the language codes and the corresponding language, see [Language codes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html#lang-codes)\. + + + +List of pretrained stopword models with their supported languages + +| Resource class | Model name | Supported languages | +| -------------- | ------------------------------------------------- | ------------------------------ | +| `text` | `text_stopwords_classification_ensemble_xx_stock` | ar, de, es, en, fr, it, ja, ko | + + + +## Training best practices ## + +There are certain constraints on the quality and quantity of data to ensure that the classifications model training can complete in a reasonable amount of time and also meets various performance criteria\. These are listed below\. Note that none are hard restrictions\. However, the further one deviates from these guidelines, the greater the chance that the model fails to train or the model will not be satisfactory\. + + + + * Data quantity + + + + * The highest number of classes classification model has been tested on is ~1200. + * The best suited text size for training and testing data for classification is around 3000 code points. However, larger texts can also be processed, but the runtime performance might be slower. + * Training time will increase based on the number of examples and number of labels. + * Inference time will increased based on the number of labels. + + + + * Data quality + + + + * Size of each sample (for example, number of phrases in each training sample) can affect quality. + * Class separation is important. In other words, classes among the training (and test) data should be semantically distinguishable from each another in order to avoid misclassifications. Since the classifier algorithms in Watson Natural Language Processing rely on word embeddings, training classes that contain text examples with too much semantic overlap may make high-quality classification computationally intractable. While more sophisticated heuristics may exist for assessing the semantic similarity between classes, you should start with a simple "eye test" of a few examples from each class to discern whether or not they seem adequately separated. + * It is recommended to use balanced data for training. Ideally there should be roughly equal numbers of examples from each class in the training data, otherwise the classifiers may be biased towards classes with larger representation in the training data. + * It is best to avoid circumstances where some classes in the training data are highly under-represented as compared to other classes. + + + + + +Limitations and caveats: + + + + * The BERT classification block has a predefined sequence length of 128 code points\. However, this can be configured at train time by changing the parameter `max_seq_length`\. The maximum value allowed for this parameter is 512\. This means that the BERT classification block can only be used to classify short text\. Text longer than `max_seq_length` is trimmed and discarded during classification training and inference\. + * The CNN classification block has a predefined sequence length of 1000 code points\. This limit can be configured at train time by changing the parameter `max_phrase_len`\. There is no maximum limit for this parameter, but increasing the maximum phrase length will affect CPU and memory consumption\. + * SVM blocks do not have such limit on sequence length and can be used with longer texts\. + + + +## Applying the model on new data ## + +After you have trained the model on a data set, apply the model on new data using the `run()` method, as you would use on any of the existing pre\-trained blocks\. + +**Sample code** + + + + * For the Ensemble and BERT models, for example for Ensemble: + + # run Ensemble model on new text + ensemble_prediction = ensemble_classification_model.run("new input text") + * For SVM and CNN models, for example for CNN: + + # run Syntax model first + syntax_result = syntax_model.run("new input text") + # run CNN model on top of syntax result + cnn_prediction = cnn_classification_model.run(syntax_result) + + + +## Choosing the right algorithm for your use case ## + +You need to choose the model algorithm that best suits your use case\. + +When choosing between SVM, CNN, and Transformers, consider the following: + + + + * BERT and Transformer\-based Slate + + + + * Choose when high quality is required and higher computing resources are available. + + + + * CNN + + + + * Choose when decent size data is available + * Choose if GloVe embedding is available for the required language + * Choose if you have the option between single label versus multi-label + * CNN fine tunes embeddings, so it could give better performance for unknown terms or newer domains. + + + + * SVM + + + + * Choose if an easier and simpler model is required + * SVM has the fastest training and inference time + * Choose if your data set size is small + + + + + +If you select SVM, you need to consider the following when choosing between the various implementations of SVM: + + + + * SVMs train multi\-label classifiers\. + * The larger the number of classes, the longer the training time\. + * TF\-IDF: + + + + * Choose TF-IDF vectorization with SVM if the data set is small, i.e. has a small number of classes, a small number of examples and shorter text size, for example, sentences containing fewer phrases. + * TF-IDF with SVM can be faster than other algorithms in the classification block. + * Choose TF-IDF if embeddings for the required language are not available. + + + + * USE: + + + + * Choose Universal Sentence Encoder (USE) with SVM if the data set has one or more sentences in input text. + * USE can perform better on data sets where understanding the context of words or sentences is important. + + + + + +The Ensemble model combines multiple individual (diverse) models together to deliver superior prediction power\. Consider the following key data for this model type: + + + + * The ensemble model combines CNN, SVM with TF\-IDF and SVM with USE\. + * It is the easiest model to use\. + * It can give better performance than the individual algorithms\. + * It works for all kinds of data sets\. However, training time for large datasets (more than 20000 examples) can be high\. + * An ensemble model allows you to set weights\. These weights decides how the ensemble model combines the results of individual classifiers\. Currently, the selection of weights is a heuristics and needs to be set by trial and error\. The default weights that are provided in the function itself are a good starting point for the exploration\. + + + +**Parent topic:**[Creating your own models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-create-model.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e71f112f9af39e61a59914d87689b4b8db13f50.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e71f112f9af39e61a59914d87689b4b8db13f50.md new file mode 100644 index 0000000..b6cd6d9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e71f112f9af39e61a59914d87689b4b8db13f50.md @@ -0,0 +1,38 @@ +# Integrating with AWS + +# Integrating with AWS # + +You can configure an integration with the Amazon Web Services (AWS) platform to allow IBM watsonx users access to data sources from AWS\. Before proceeding, make sure you have proper permissions\. For example, you'll need to be able to create services and credentials in the AWS account\. + +After you configure an integration, you'll see it under **Service instances**\. You'll see a new **AWS** tab that lists your instances of Redshift and S3\. + +To configure an integration with AWS: + + + +1. Log on to the [AWS Console](https://aws.amazon.com/console/)\. +2. From the account drop\-down at the upper right, select **My Security Credentials**\. +3. Under **Access keys (access key ID and secret access key)**, click **Create New Access Key**\. +4. Copy the key ID and secret\. + + Important: Write down your key ID and secret and store them in a safe place. +5. In IBM watsonx, under **Administration > Cloud integrations**, go to the **AWS** tab, enable integration, and then paste the access key ID and access key secret into the appropriate fields\. +6. If you need to access Redshift, [configure firewall access](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall-redshift.html)\. +7. Confirm that you can see your AWS services\. From the main menu, choose **Administration > Services > Services instances**\. Click the **AWS** tab to see those services\. + + + +Now users who have credentials to your AWS services can [create connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) to them by selecting them on the **Add connection** page\. Then they can access data from those connections by [creating connected data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + +## Next steps ## + + + + * [Set up a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html) + * [Create connections in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) + + + +**Parent topic:**[Integrations with other cloud platforms](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/int-cloud.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e77548af396e9e9474371705bcfff55684c5760.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e77548af396e9e9474371705bcfff55684c5760.md new file mode 100644 index 0000000..8c8e6b8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9e77548af396e9e9474371705bcfff55684c5760.md @@ -0,0 +1,25 @@ +# Object-oriented programming + +# Object\-oriented programming # + +Object\-oriented programming is based on the notion of creating a model of the target problem in your programs\. Object\-oriented programming reduces programming errors and promotes the reuse of code\. Python is an object\-oriented language\. Objects defined in Python have the following features: + + + + * Identity\. Each object must be distinct, and this must be testable\. The `is` and `is not` tests exist for this purpose\. + * State\. Each object must be able to store state\. Attributes, such as fields and instance variables, exist for this purpose\. + * Behavior\. Each object must be able to manipulate its state\. Methods exist for this purpose\. + + + +Python includes the following features for supporting object\-oriented programming: + + + + * Class\-based object creation\. Classes are templates for the creation of objects\. Objects are data structures with associated behavior\. + * Inheritance with polymorphism\. Python supports single and multiple inheritance\. All Python instance methods are polymorphic and can be overridden by subclasses\. + * Encapsulation with data hiding\. Python allows attributes to be hidden\. When hidden, you can access attributes from outside the class only through methods of the class\. Classes implement methods to modify the data\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9ee303cb0d99042537564dcdfc134b592bf0a3fe.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9ee303cb0d99042537564dcdfc134b592bf0a3fe.md new file mode 100644 index 0000000..5dcee7b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9ee303cb0d99042537564dcdfc134b592bf0a3fe.md @@ -0,0 +1,11 @@ +# Inheritance + +# Inheritance # + +The ability to inherit from classes is fundamental to object\-oriented programming\. Python supports both single and multiple inheritance\. Single inheritance means that there can be only one superclass\. Multiple inheritance means that there can be more than one superclass\. + +Inheritance is implemented by subclassing other classes\. Any number of Python classes can be superclasses\. In the Jython implementation of Python, only one Java class can be directly or indirectly inherited from\. It's not required for a superclass to be supplied\. + +Any attribute or method in a superclass is also in any subclass and can be used by the class itself, or by any client as long as the attribute or method isn't hidden\. Any instance of a subclass can be used wherever an instance of a superclass can be used; this is an example of polymorphism\. These features enable reuse and ease of extension\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f06df311976f336cb3164b08d5da7d6f93419e2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f06df311976f336cb3164b08d5da7d6f93419e2.md new file mode 100644 index 0000000..ad2e0af --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f06df311976f336cb3164b08d5da7d6f93419e2.md @@ -0,0 +1,13 @@ +# Neural Net node (SPSS Modeler) + +# Neural Net node # + +A neural network can approximate a wide range of predictive models with minimal demands on model structure and assumption\. The form of the relationships is determined during the learning process\. If a linear relationship between the target and predictors is appropriate, the results of the neural network should closely approximate those of a traditional linear model\. If a nonlinear relationship is more appropriate, the neural network will automatically approximate the "correct" model structure\. + +The trade\-off for this flexibility is that the neural network is not easily interpretable\. If you are trying to explain an underlying process that produces the relationships between the target and predictors, it would be better to use a more traditional statistical model\. However, if model interpretability is not important, you can obtain good predictions using a neural network\. + +Field requirements\. There must be at least one Target and one Input\. Fields set to Both or None are ignored\. There are no measurement level restrictions on targets or predictors (inputs)\. + +The initial weights assigned to neural networks during model building, and therefore the final models produced, depend on the order of the fields in the data\. Watsonx\.ai automatically sorts data by field name before presenting it to the neural network for training\. This means that explicitly changing the order of the fields in the data upstream will not affect the generated neural net models when a random seed is set in the model builder\. However, changing the input field names in a way that changes their sort order will produce different neural network models, even with a random seed set in the model builder\. The model quality will not be affected significantly given different sort order of field names\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f27a4650b0b0bf36223937d0cf60e460b66a723.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f27a4650b0b0bf36223937d0cf60e460b66a723.md new file mode 100644 index 0000000..c46ba84 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f27a4650b0b0bf36223937d0cf60e460b66a723.md @@ -0,0 +1,19 @@ +# Statement syntax + +# Statement syntax # + +The statement syntax for Python is very simple\. + +In general, each source line is a single statement\. Except for `expression` and `assignment` statements, each statement is introduced by a keyword name, such as `if` or `for`\. Blank lines or remark lines can be inserted anywhere between any statements in the code\. If there's more than one statement on a line, each statement must be separated by a semicolon (`;`)\. + +Very long statements can continue on more than one line\. In this case, the statement that is to continue on to the next line must end with a backslash (`\`)\. For example: + + x = "A loooooooooooooooooooong string" + \ + "another looooooooooooooooooong string" + +When you enclose a structure by parentheses (`()`), brackets (`[]`), or curly braces (`{}`), the statement can be continued on a new line after any comma, without having to insert a backslash\. For example: + + x = (1, 2, 3, "hello", + "goodbye", 4, 5, 6) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f5d44b3a96f8418be317ad258e4932e468551be.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f5d44b3a96f8418be317ad258e4932e468551be.md new file mode 100644 index 0000000..678da38 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f5d44b3a96f8418be317ad258e4932e468551be.md @@ -0,0 +1,6 @@ +# 3D charts + +# 3D charts # + +3D charts are commonly used to represent multiple\-variable functions and include a z\-axis variable that is a function of both the x and y\-axis variables\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f78eec8e37db19f2c3220f8e43029b2c5370b5d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f78eec8e37db19f2c3220f8e43029b2c5370b5d.md new file mode 100644 index 0000000..5b73831 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f78eec8e37db19f2c3220f8e43029b2c5370b5d.md @@ -0,0 +1,7 @@ +# Modeling node properties + +# Modeling node properties # + +Refer to this section for a list of available properties for Modeling nodes\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f878a46b28c19b951157a5f31bb7a1a9920a89e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f878a46b28c19b951157a5f31bb7a1a9920a89e.md new file mode 100644 index 0000000..0933e16 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9f878a46b28c19b951157a5f31bb7a1a9920a89e.md @@ -0,0 +1,17 @@ +# What is instantiation? (SPSS Modeler) + +# What is instantiation? # + +Instantiation is the process of reading or specifying information, such as storage type and values for a data field\. To optimize system resources, instantiating is a user\-directed process—you tell the software to read values by running data through a Type node\. + + + + * Data with unknown types is also referred to as uninstantiated\. Data whose storage type and values are unknown is displayed in the Measure column of the Type node settings as Typeless\. + * When you have some information about a field's storage, such as string or numeric, the data is called partially instantiated\. Categorical or Continuous are partially instantiated measurement levels\. For example, Categorical specifies that the field is symbolic, but you don't know whether it's nominal, ordinal, or flag\. + * When all of the details about a type are known, including the values, a fully instantiated measurement level—nominal, ordinal, flag, or continuous—is displayed in this column\. Note that the continuous type is used for both partially instantiated and fully instantiated data fields\. Continuous data can be either integers or real numbers\. + + + +When a data flow with a Type node runs, uninstantiated types immediately become partially instantiated, based on the initial data values\. After all of the data passes through the node, all data becomes fully instantiated unless values were set to Pass\. If the flow run is interrupted, the data will remain partially instantiated\. After the Types settings are instantiated, the values of a field are static at that point in the flow\. This means that any upstream changes will not affect the values of a particular field, even if you rerun the flow\. To change or update the values based on new data or added manipulations, you need to edit them in the Types settings or set the value for a field to Read or Extend\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9fa71067981e4fc0d6f68a14c91c694dc4c2af25.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9fa71067981e4fc0d6f68a14c91c694dc4c2af25.md new file mode 100644 index 0000000..72551ea --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9fa71067981e4fc0d6f68a14c91c694dc4c2af25.md @@ -0,0 +1,11 @@ +# Data Asset Export node (SPSS Modeler) + +# Data Asset Export node # + +You can use the Data Asset Export node to write to remote data sources using connections or write data to a project (delimited or \. sav)\. + +Double\-click the node to open its properties\. Various options are available, described as follows\. + +After running the node, you can find the data at the export location you specified\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9fd50170823ef108e2cf4ebf083b0085845fc3be.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9fd50170823ef108e2cf4ebf083b0085845fc3be.md new file mode 100644 index 0000000..239ed97 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/9fd50170823ef108e2cf4ebf083b0085845fc3be.md @@ -0,0 +1,119 @@ +# Setting up the IBM Cloud account + +# Setting up the IBM Cloud account # + +As an IBM Cloud account owner or administrator, you sign up for IBM watsonx\.ai and set up payment for services in the IBM Cloud account\. + +These steps describe the typical tasks for an IBM Cloud account owner to set up the account for an organization: + + + +1. [Sign up for watsonx\.ai](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-account.html?context=cdpaas&locale=en#sign-up)\. +2. [Update your IBM Cloud account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-account.html?context=cdpaas&locale=en#paid-account) to add or update billing information\. +3. [(Optional) Configure restrictions for the account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-account.html?context=cdpaas&locale=en#restrict)\. + + + +## Step 1: Sign up for watsonx ## + +To sign up for watsonx\.ai: + + + +1. Go to [Try IBM watsonx\.ai](https://dataplatform.cloud.ibm.com/registration/stepone?context=wx) or [Try watsonx\.governance](https://dataplatform.cloud.ibm.com/registration/stepone?context=wx&apps=data_science_experience,watson_machine_learning,cos,aiopenscale&uucid=0cf8ca3f38ace12f&utm_content=WXGWW®ions=us-south)\. +2. Select the service region\. +3. Agree to the terms, Data Use Policy, and Cookie Use\. +4. Log in with your IBMid (usually an email address) if you have an existing IBM Cloud account\. If you don't have an IBM Cloud account, click **Create an IBM Cloud account** to create a new account\. You must enter a credit card to create a Pay\-As\-You\-Go IBM Cloud account\. However, you are not charged until you buy paid service plans\. + + + +Lite plans for Watson Studio and Watson Machine Learning are automatically provisioned for you\. + +## Step 2: Update your IBM Cloud account ## + +You can skip this step if your IBM Cloud account has billing information with a Pay\-As\-You\-Go or a subscription plan\. + +You must update your IBM Cloud account in the following circumstances: + + + + * You have a Trial account from signing up for watsonx\. + * You have a Trial account that you [registered through an academic institution](https://ibm.biz/academic)\. + * You have a [Lite account](https://cloud.ibm.com/docs/account?topic=account-accounts#liteaccount) that you created before 25 October 2021\. + * You want to change a Pay\-As\-You\-Go plan to a subscription plan\. + + + +### Setting up a Pay\-As\-You\-Go account ### + +You set up a Pay\-As\-You\-Go by adding a credit card number and billing information\. You pay only for billable services that you use, with no long\-term contracts or commitments\. You can provision paid plans for all services in the IBM Cloud services catalog, including plans in the watsonx services catalog\. + +To set up a Pay\-As\-You\-Go account: + + + +1. From the watsonx navigation menu, select **Administration > Account and billing > Account**\. +2. Click **Manage in IBM Cloud**\. +3. Log in to IBM Cloud\. +4. Select **Account settings**\. +5. Click **Add credit card** and enter your credit card and billing information\. +6. Click **Create account** to submit your information\. + + + +After your payment information is processed, your account is upgraded and you receive a monthly invoice for billable resource usage or instance fees\. + +### Setting up a subscription account ### + +With subscriptions, you commit to a minimum spending amount for a certain period and receive a discount on the overall cost\. Subscriptions are limited to service plans in the watsonx catalog\. + +Subscription credits are activated using a unique code that you receive by email\. To activate the subscription, you apply the subscription code to an account\. Be careful when selecting the account, because after you apply the subscription to an account, you can't undo it\. + +To set up a watsonx subscription: + + + +1. From the watsonx navigation menu, select **Administration > Account and billing > Upgrade service plans**\. +2. On the **Upgrade service plans** page, click **Contact sales**\. + + + +Complete and submit the form to communicate with IBM Sales that you want to set up a subscription account for watsonx\. An associate from IBM Sales will contact you to set up a subscription\. When your subscription is ready, you receive an email from IBM containing a unique subscription code\. + +To apply the subscription code to your account: + + + +1. Locate the unique code from the email that you received from IBM\. +2. Log in to your IBM Cloud account, and select **Manage > Account** from the header\. Be sure to select the correct account\. +3. Select **Account settings** and locate the **Subscription and feature codes** section on the page\. +4. Click **Apply code**\. +5. Copy and paste the code from the email into the **Apply a code** field and click **Apply**\. + + + +Your subscription account is active and you can upgrade your watsonx\.ai services\. + +## Step 3: (Optional) Configure restrictions for the account ## + +Complete these optional tasks to secure your account: + + + + * Restrict the scope of resources that are available in IBM watsonx to the current account\. See [Set the scope of resources](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/account-settings.html#set-the-scope-for-resources)\. + * Restrict access to specific IP addresses to protect the IBM Cloud account from unwanted access from unknown IP addresses\. See [Allow specific IP addresses](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html#allow-specific-ip-addresses)\. + + + +## Next steps ## + + + + * [Add users to the account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-addl-users.html) + * [Add more security constraints](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-account.html) + + + +**Parent topic:**[Setting up the platform for administrators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-platform.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a10de0e026ba0cf397108621d5927e16436acf58.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a10de0e026ba0cf397108621d5927e16436acf58.md new file mode 100644 index 0000000..5b9d284 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a10de0e026ba0cf397108621d5927e16436acf58.md @@ -0,0 +1,128 @@ +# Configuring App ID with your identity provider + +# Configuring App ID with your identity provider # + +To use App ID for user authentication for IBM watsonx, you configure App ID as a service on IBM Cloud\. You configure an identity provider (IdP) such as Azure Active Directory\. You then configure App ID and the identity provider to communicate with each other to grant access to authorized users\. + +To configure App ID and your identity provider to work together, follow these steps: + + + + * [Configure your identity provider to communicate with IBM Cloud](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-appid-tips.html?context=cdpaas&locale=en#cfg_idp) + * [Configure App ID to communicate with your identify provider](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-appid-tips.html?context=cdpaas&locale=en#cfg_appid) + * [Configure IAM to enable login through your identity provider](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-appid-tips.html?context=cdpaas&locale=en#cfg_iam) + + + +## Configuring your identity provider ## + +To configure your identity provider to communicate with IBM Cloud, you enter the **entityID** and **Location** into your SAML configuration for your identity provider\. An overview of the steps for configuring Azure Active Directory is provided as an example\. Refer to the documentation for your identity provider for detailed instructions for its platform\. + +The prerequisites for configuring App ID with an identity provider are: + + + + * An IBM Cloud account + * An App ID instance + * An identity provider, for example, Azure Active Directory + + + +To configure your identity provider for SAML\-based single sign\-on: + +1\. Download the SAML metadata file from App ID to find the values for **entityID** and **Location**\. These values are entered into the identity provider configuration screen to establish communication with App ID on IBM Cloud\. (The corresponding values from the identity provider, plus the primary certificate, are entered in App ID\. See [Configuring App ID](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-appid-tips.html?context=cdpaas&locale=en#cfg_appid))\. + + + + * In App ID, choose **Identity providers > SAML 2\.0 federation**\. + * Download the **appid\-metadata\.xml** file\. + * Find the values for **entityID** and **Location**\. + + + +2\. Copy the values for **entityID** and **Location** from the SAML metadata file and paste them into the corresponding fields on your identity provider\. For Azure Active Directory, the fields are located in **Section 1: Basic SAML Configuration** in the Enterprise applications configuration screen\. + + + +| App ID value | Active Directory field | Example | +| ------------ | ------------------------------------------ | --------------------------------------------------------------- | +| entityID | Identifier (Entity ID) | urn:ibm:cloud:services:appid:value | +| Location | Reply URL (Assertion Consumer Service URL) | `https://us-south.appid.cloud.ibm.com/saml2/v1/value/login-acs` | + + + +3\. In **Section 2: Attributes & Claims** for Azure Active Directory, you map the username parameter to **user\.mail** to identify the users by their unique email address\. IBM watsonx requires that you set username to the **user\.mail** attribute\. For other identity providers, a similar field that uniquely identifies users must be mapped to **user\.mail**\. + +## Configuring App ID ## + +You establish communication between App ID and your identity provider by entering the SAML values from the identity provider into the corresponding App ID fields\. An example is provided for configuring App ID to communicate with an Active Directory Enterprise Application\. + +1\. Choose **Identity providers > SAML 2\.0 federation** and complete the **Provide metadata from SAML IdP** section\. + +2\. Download the Base64 certificate from **Section 3: SAML Certificates** in Active Directory (or your identity provider) and paste it into the **Primary certificate** field\. + +3\. Copy the values from **Section 4: Set up your\-enterprise\-application** in Active Directory into the corresponding fields in **Provide metadata from SAML IdP** in IBM App ID\. + + + +| App ID field | Value from Active Directory | +| ------------------- | --------------------------- | +| Entity ID | Azure AD Identifier | +| Sign in URL | Login URL | +| Primary certificate | Certificate (Base64) | + + + +4\. Click **Test** on the App ID page to test that App ID can connect to the identity provider\. The happy face response indicates that App ID can communicate with the identity provider\. + +![Successful test](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/images/appid_good_job.png) + +## Configuring IAM ## + +You must assign the appropriate role to the users in IBM Cloud IAM and also configure your identity provider in IAM\. Users require at least the **Viewer** role for **All Identity and IAM enabled services**\. + +### Create an identity provider reference in IBM Cloud IAM ### + +Create an identity provider reference to connect your external repository to your IBM Cloud account\. + + + +1. Navigate to **Manage > Access(IAM) > Identity providers**\. +2. For the type, choose **IBM Cloud App ID**\. +3. Click **Create**\. +4. Enter a name for the identity provider\. +5. Select the App ID service instance\. +6. Select how to on board users\. Static adds users when they log in for the first time\. +7. Enable the identity provider for logging in by checking the **Enable for account login?** box\. +8. If you have more than one identity providers, set the identity provider as the default by checking the box\. +9. Click **Create**\. + + + +### Change the App ID login alias ### + +A login alias is generated for App ID\. Users enter the alias when logging on to IBM Cloud\. You can change the default alias string to be easier to remember\. + + + +1. Navigate to **Manage > Access(IAM) > Identity providers**\. +2. Select **IBM Cloud App ID** as the type\. +3. Edit the **Default IdP URL** to make it simpler\. For example, **`https://cloud.ibm.com/authorize/540f5scc241a24a70513961`** can be changed to **`https://cloud.ibm.com/authorize/my-company`**\. Users log in with the alias **my\-company** instead of **540f5scc241a24a70513961**\. + + + +## Learn more ## + + + + * [IBM Cloud docs: Managing authentication](https://cloud.ibm.com/docs/appid?topic=appid-managing-idp) + * [IBM Cloud docs: Configuring federated identity providers: SAML](https://cloud.ibm.com/docs/appid?topic=appid-enterprise#enterprise) + * [IBM Cloud SAML Federation Guide](https://www.ibm.com/cloud/blog/ibm-cloud-saml-federation-guide) + * [Setting up IBM Cloud App ID with your Azure Active Directory](https://www.ibm.com/cloud/blog/setting-ibm-cloud-app-id-azure-active-directory) + * [Reusing Existing Red Hat SSO and Keycloak for Applications That Run on IBM Cloud with App ID](https://www.ibm.com/cloud/blog/reusing-existing-red-hat-sso-and-keycloak-for-applications-that-run-on-ibm-cloud-with-app-id) + + + +**Parent topic:**[Setting up IBM Cloud App ID (beta)](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-appid.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a11374b50b49477362fa00bbb32a277776f7e8e2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a11374b50b49477362fa00bbb32a277776f7e8e2.md new file mode 100644 index 0000000..da41a55 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a11374b50b49477362fa00bbb32a277776f7e8e2.md @@ -0,0 +1,88 @@ +# Importing space and project assets into deployment spaces + +# Importing space and project assets into deployment spaces # + +You can import assets that you export from a deployment space or a project (either a project export or a Git archive) into a new or existing deployment space\. This way, you can add assets or update existing assets (for example, replacing a model with its newer version) to use for your deployments\. + +You can import a space or a project export file to [a new deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-import-to-space.html?context=cdpaas&locale=en#import-to-new) or an [existing deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-import-to-space.html?context=cdpaas&locale=en#import-to-existing) to populate the space with assets\. + +Tip: The export file can come from a Git\-enabled project and a Watson Studio project\. To create the file to export, create a compressed file for the project that contains the assets to import\. Then, follow the steps for importing the compressed file into a new or existing space\. + +## Importing a space or a project to a new deployment space ## + +To import a space or a project when you are creating a new deployment space: + + + +1. Click **New deployment space**\. +2. Enter the details for the space\. For more information, see [Creating deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-create.html)\. +3. In the *Upload space assets* section, upload the exported compressed file that contains data assets and click **Create**\. + + + +The assets from the exported file is added as space assets\. + +## Importing a space or a project to an existing deployment space ## + +To import a space or a project into an existing space: + + + +1. From your deployment space, click the import and export space (![Import or Export space icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/import-export-icon.png)) icon\. From the list, select **Import space**\. +2. Add your compressed file that contains assets from a Watson Studio project or deployment space\. + **Tip:** If the space that you are importing is encrypted, enter the password in the **Password** field. +3. After your asset is imported, click **Done**\. + + + +The assets from the exported file is added as space assets\. + +## Resolving issues with asset duplication ## + +The importing mechanism compares assets that exist in your space with the assets that are being imported\. If it encounters an asset with the same name and of the same type: + + + + * If the asset type supports revisions, the importing mechanism creates a new revision of the existing asset and fixes the new revision\. + * If the asset type does not support revisions, the importing mechanism fixes the existing asset\. + + + +This table describes how import works to resolve cases where assets are duplicated between the import file and the existing space\. + + + +Scenarios for importing duplicated assets + +| Your space | File being imported | Result | +| ------------------------------------------ | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No assets with matching name or type | One or more assets with matching name or type | All assets are imported\. If multiple assets in the import file have the same name, they are imported as duplicate assets in the target space\. | +| One asset with matching name or type | One asset with matching name or type | Matching asset is updated with new version\. Other assets are imported normally\. | +| One asset with matching name or type | More than one asset with matching name or type | The first matching asset that is processed is imported as a new version for the existing asset in the space, extra assets with matching name are created as duplicates in the space\. Other assets are imported normally\. | +| Multiple assets with matching name or type | One or more assets with matching name or type | Assets with matching names fail to import\. Other assets are imported normally\. | + + + +Warning: Multiple assets of the same name in an existing space or multiple assets of the same name in an import file are not fully supported scenarios\. The import works as described for the scenarios in the table, but you cannot use versioning capabilities specific to the import\. + +Existing deployments get updated differently, depending on deployment type: + + + + * If a batch deployment was created by using the previous version of the asset, the next invocation of the batch deployment job will refer to the updated state of the asset\. + * If an online deployment was created by using the previous version of the asset, the next "restart" of the deployment refers to the updated state of the asset\. + + + +## Learn more ## + + + + * To learn about adding other types of assets to a space, refer to [Assets in deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets-all.html)\. + * To learn about exporting assets from a deployment space, refer to [Exporting space assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-export.html)\. + + + +**Parent topic:**[Deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a1365cd1e2acbee6e9bf025dd493feb17a0d428f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a1365cd1e2acbee6e9bf025dd493feb17a0d428f.md new file mode 100644 index 0000000..9a3a8b3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a1365cd1e2acbee6e9bf025dd493feb17a0d428f.md @@ -0,0 +1,11 @@ +# Advanced linguistic settings (SPSS Modeler) + +# Advanced linguistic settings # + +When you build categories, you can select from a number of advanced linguistic category building techniques such as concept inclusion and semantic networks (English text only)\. These techniques can be used individually or in combination with each other to create categories\. + +Keep in mind that because every dataset is unique, the number of methods and the order in which you apply them may change over time\. Since your text mining goals may be different from one set of data to the next, you may need to experiment with the different techniques to see which one produces the best results for the given text data\. None of the automatic techniques will perfectly categorize your data; therefore we recommend finding and applying one or more automatic techniques that work well with your data\. + +The following advanced settings are available for the Use linguistic techniques to build categories option in the category settings\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a148122da72ad9ff05b3483d6f50975c50b4ab33.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a148122da72ad9ff05b3483d6f50975c50b4ab33.md new file mode 100644 index 0000000..d61c59f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a148122da72ad9ff05b3483d6f50975c50b4ab33.md @@ -0,0 +1,34 @@ +# mergenode properties + +# mergenode properties # + +![Merge node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/mergenodeicon.png) The Merge node takes multiple input records and creates a single output record containing some or all of the input fields\. It's useful for merging data from different sources, such as internal customer data and purchased demographic data\. + + + +mergenode properties + +Table 1\. mergenode properties + +| `mergenode` properties | Data type | Property description | +| ------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `method` | `Order`
`Keys`
`Condition`
`Rankedcondition` | Specify whether records are merged in the order they are listed in the data files, if one or more key fields will be used to merge records with the same value in the key fields, if records will be merged if a specified condition is satisfied, or if each row pairing in the primary and all secondary data sets are to be merged; using the ranking expression to sort any multiple matches into order from low to high\. | +| `condition` | *string* | If `method` is set to `Condition`, specifies the condition for including or discarding records\. | +| `key_fields` | *list* | | +| `common_keys` | *flag* | | +| `join` | `Inner`
`FullOuter`
`PartialOuter`
`Anti` | | +| `outer_join_tag.n` | *flag* | In this property, *n* is the tag name as displayed in the node properties\. Note that multiple tag names may be specified, as any number of datasets could contribute incomplete records\. | +| `single_large_input` | *flag* | Specifies whether optimization for having one input relatively large compared to the other inputs will be used\. | +| `single_large_input_tag` | *string* | Specifies the tag name as displayed in the note properties\. Note that the usage of this property differs slightly from the `outer_join_tag` property (flag versus string) because only one input dataset can be specified\. | +| `use_existing_sort_keys` | *flag* | Specifies whether the inputs are already sorted by one or more key fields\. | +| `existing_sort_keys` | \[\[*'string',*`'Ascending'`\] \\ \[*'string'',*`'Descending'`\]\] | Specifies the fields that are already sorted and the direction in which they are sorted\. | +| `primary_dataset` | *string* | If `method` is `Rankedcondition`, select the primary data set in the merge\. This can be considered as the left side of an outer join merge\. | +| `rename_duplicate_fields` | *boolean* | If `method` is `Rankedcondition`, and this is set to `Y`, if the resulting merged data set contains multiple fields with the same name from different data sources the respective tags from the data sources are added at the start of the field column headers\. | +| `merge_condition` | *string* | | +| `ranking_expression` | *string* | | +| `Num_matches` | *integer* | The number of matches to be returned, based on the `merge_condition` and `ranking_expression`\. Minimum 1, maximum 100\. | +| `default_sort_order` | `Ascending`
`Descending` | Specify whether, by default, records are sorted in ascending or descending order of the sort key values\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a152f3047c3b41f06773051ea4b5b6b14dde709e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a152f3047c3b41f06773051ea4b5b6b14dde709e.md new file mode 100644 index 0000000..371ff99 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a152f3047c3b41f06773051ea4b5b6b14dde709e.md @@ -0,0 +1,370 @@ +# Sentiment classification + +# Sentiment classification # + +The Watson Natural Language Processing Sentiment classification models classify the sentiment of the input text\. + +**Supported languages** + +Sentiment classification is available for the following languages\. For a list of the language codes and the corresponding language, see [Language codes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html#lang-codes)\. + +ar, cs, da, de, en, es, fi, fr, he, hi, it, ja, ko, nb, nl, nn, pl, pt, ro, ru, sk, sv, tr, zh\-cn + +## Sentiment ## + +The sentiment of text can be positive, negative or neutral\. + +The sentiment model computes the sentiment for each sentence in the input document\. The aggregated sentiment for the entire document is also calculated using the sentiment transformer workflow in Runtime 23\.1\. If you are using the sentiment models in Runtime 22\.2 the overall document sentiment can be computed by the helper method called `predict_document_sentiment`\. + +The classifications returned contain a probability\. The sentiment score varies from \-1 to 1\. A score greater than 0 denotes a positive sentiment, a score less than 0 a negative sentiment, and a score of 0 a neutral sentiment\. + +### Sentence sentiment workflows in runtime 23\.1 ### + +**Workflow names** + + + + * `sentiment-aggregated_transformer-workflow_multilingual_slate.153m.distilled` + * `sentiment-aggregated_transformer-workflow_multilingual_slate.153m.distilled-cpu` + + + +The `sentiment-aggregated_transformer-workflow_multilingual_slate.153m.distilled` workflow can be used on both CPUs and GPUs\. + +The `sentiment-aggregated_transformer-workflow_multilingual_slate.153m.distilled-cpu` workflow is optimized for CPU\-based runtimes\. + +**Code sample using the `sentiment-aggregated_transformer-workflow_multilingual_slate.153m.distilled` workflow** + + # Load the Sentiment workflow + sentiment_model = watson_nlp.load('sentiment-aggregated_transformer-workflow_multilingual_slate.153m.distilled-cpu') + + # Run the sentiment model on the result of the syntax results + sentiment_result = sentiment_model.run('The rooms are nice. But the beds are not very comfortable.') + + # Print the sentence sentiment results + print(sentiment_result) + +**Output of the code sample** + + { + "document_sentiment": { + "score": -0.339735, + "label": "SENT_NEGATIVE", + "mixed": true, + "sentiment_mentions": [ + { + "span": { + "begin": 0, + "end": 19, + "text": "The rooms are nice." + }, + "sentimentprob": { + "positive": 0.9720447063446045, + "neutral": 0.011838269419968128, + "negative": 0.016117043793201447 + } + }, + { + "span": { + "begin": 20, + "end": 58, + "text": "But the beds are not very comfortable." + }, + "sentimentprob": { + "positive": 0.0011594508541747928, + "neutral": 0.006315878126770258, + "negative": 0.9925248026847839 + } + } + ] + }, + "targeted_sentiments": { + "targeted_sentiments": {}, + "producer_id": { + "name": "Aggregated Sentiment Workflow", + "version": "0.0.1" + } + }, + "producer_id": { + "name": "Aggregated Sentiment Workflow", + "version": "0.0.1" + } + } + +### Sentence sentiment blocks in 22\.2 runtimes ### + +**Block name** + +`sentiment_sentence-bert_multi_stock` + +**Dependencies on other blocks** + +The following block must run before you can run the Sentence sentiment block: + + + + * `syntax_izumo__stock` + + + +**Code sample using the `sentiment_sentence-bert_multi_stock` block** + + import watson_nlp + from watson_nlp.toolkit.sentiment_analysis_utils import predict_document_sentiment + # Load Syntax and a Sentiment model for English + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + sentiment_model = watson_nlp.load('sentiment_sentence-bert_multi_stock') + + # Run the syntax model on the input text + syntax_result = syntax_model.run('The rooms are nice. But the beds are not very comfortable.') + + # Run the sentiment model on the result of the syntax results + sentiment_result = sentiment_model.run_batch(syntax_result.get_sentence_texts(), syntax_result.sentences) + + # Print the sentence sentiment results + print(sentiment_result) + + # Get the aggregated document sentiment + document_sentiment = predict_document_sentiment(sentiment_result, sentiment_model.class_idxs) + print(document_sentiment) + +Output of the code sample: + + [{ + "score": 0.9540348989256836, + "label": "SENT_POSITIVE", + "sentiment_mention": { + "span": { + "begin": 0, + "end": 19, + "text": "The rooms are nice." + }, + "sentimentprob": { + "positive": 0.919123649597168, + "neutral": 0.05862388014793396, + "negative": 0.022252488881349564 + } + }, + "producer_id": { + "name": "Sentence Sentiment Bert Processing", + "version": "0.1.0" + } + }, { + "score": -0.9772116371114815, + "label": "SENT_NEGATIVE", + "sentiment_mention": { + "span": { + "begin": 20, + "end": 58, + "text": "But the beds are not very comfortable." + }, + "sentimentprob": { + "positive": 0.015949789434671402, + "neutral": 0.025898978114128113, + "negative": 0.9581512808799744 + } + }, + "producer_id": { + "name": "Sentence Sentiment Bert Processing", + "version": "0.1.0" + } + }] + { + "score": -0.335185, + "label": "SENT_NEGATIVE", + "mixed": true, + "sentiment_mentions": [ + { + "span": { + "begin": 0, + "end": 19, + "text": "The rooms are nice." + }, + "sentimentprob": { + "positive": 0.919123649597168, + "neutral": 0.05862388014793396, + "negative": 0.022252488881349564 + } + }, + { + "span": { + "begin": 20, + "end": 58, + "text": "But the beds are not very comfortable." + }, + "sentimentprob": { + "positive": 0.015949789434671402, + "neutral": 0.025898978114128113, + "negative": 0.9581512808799744 + } + } + ] + } + +## Targets sentiment extraction ## + +Targets sentiment extraction extracts sentiments expressed in text and identifies the targets of those sentiments\. + +It can handle multiple targets with different sentiment in one sentence as opposed to the sentiment block described above\. + +For example, given the input sentence *The served food was delicious, yet the service was slow\.*, the Targets sentiment block identifies that there is a positive sentiment expressed in the target "food", and a negative sentiment expressed in "service"\. + +The model has been fine\-tuned on English data only\. Although you can use the model on the other languages listed under Supported languages, the results might vary\. + +### Targets sentiment workflows in Runtime 23\.1 ### + +**Workflow names** + + + + * `targets-sentiment_transformer-workflow_multilingual_slate.153m.distilled` + * `targets-sentiment_transformer-workflow_multilingual_slate.153m.distilled-cpu` + + + +The `targets-sentiment_transformer-workflow_multilingual_slate.153m.distilled` workflow can be used on both CPUs and GPUs\. + +The `targets-sentiment_transformer-workflow_multilingual_slate.153m.distilled-cpu` workflow is optimized for CPU\-based runtimes\. + +**Code sample for the `targets-sentiment_transformer-workflow_multilingual_slate.153m.distilled` workflow** + + import watson_nlp + # Load Targets Sentiment model for English + targets_sentiment_model = watson_nlp.load('targets-sentiment_transformer-workflow_multilingual_slate.153m.distilled') + # Run the targets sentiment model on the input text + targets_sentiments = targets_sentiment_model.run('The rooms are nice, but the bed was not very comfortable.') + # Print the targets with the associated sentiment + print(targets_sentiments) + +**Output of the code sample:** + + { + "targeted_sentiments": { + "rooms": { + "score": 0.990798830986023, + "label": "SENT_POSITIVE", + "mixed": false, + "sentiment_mentions": [ + { + "span": { + "begin": 4, + "end": 9, + "text": "rooms" + }, + "sentimentprob": { + "positive": 0.990798830986023, + "neutral": 0.0, + "negative": 0.00920116901397705 + } + } + ] + }, + "bed": { + "score": -0.9920912981033325, + "label": "SENT_NEGATIVE", + "mixed": false, + "sentiment_mentions": [ + { + "span": { + "begin": 28, + "end": 31, + "text": "bed" + }, + "sentimentprob": { + "positive": 0.00790870189666748, + "neutral": 0.0, + "negative": 0.9920912981033325 + } + } + ] + } + }, + "producer_id": { + "name": "Transformer-based Targets Sentiment Extraction Workflow", + "version": "0.0.1" + } + } + +### Targets sentiment blocks in 22\.2 runtimes ### + +**Block name**`targets-sentiment_sequence-bert_multi_stock` + +**Dependencies on other blocks** + +The following block must run before you can run the Targets sentiment extraction block: + + + + * `syntax_izumo__stock` + + + +**Code sample using the `sentiment-targeted_bert_multi_stock` block** + + import watson_nlp + + # Load Syntax and the Targets Sentiment model for English + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + targets_sentiment_model = watson_nlp.load('targets-sentiment_sequence-bert_multi_stock') + + # Run the syntax model on the input text + syntax_result = syntax_model.run('The rooms are nice, but the bed was not very comfortable.') + + # Run the targets sentiment model on the syntax results + targets_sentiments = targets_sentiment_model.run(syntax_result) + + # Print the targets with the associated sentiment + print(targets_sentiments) + +Output of the code sample: + + { + "targeted_sentiments": { + "rooms": { + "score": 0.9989274144172668, + "label": "SENT_POSITIVE", + "mixed": false, + "sentiment_mentions": [ + { + "span": { + "begin": 4, + "end": 9, + "text": "rooms" + }, + "sentimentprob": { + "positive": 0.9989274144172668, + "neutral": 0.0, + "negative": 0.0010725855827331543 + } + } + ] + }, + "bed": { + "score": -0.9977545142173767, + "label": "SENT_NEGATIVE", + "mixed": false, + "sentiment_mentions": [ + { + "span": { + "begin": 28, + "end": 31, + "text": "bed" + }, + "sentimentprob": { + "positive": 0.002245485782623291, + "neutral": 0.0, + "negative": 0.9977545142173767 + } + } + ] + } + }, + "producer_id": { + "name": "BERT TSA", + "version": "0.0.1" + } + } + +**Parent topic:**[Watson Natural Language Processing task catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a187344eb767bac8e4d674651bedafa33f70bfa1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a187344eb767bac8e4d674651bedafa33f70bfa1.md new file mode 100644 index 0000000..df6e90f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a187344eb767bac8e4d674651bedafa33f70bfa1.md @@ -0,0 +1,20 @@ +# Testing (SPSS Modeler) + +# Testing # + +Both of the generated model nuggets are connected to the Type node\. + + + +1. Reposition the nuggets as shown, so the Type node connects to the neural net nugget, which connects to the C5\.0 nugget\. +2. Attach an Analysis node to the C5\.0 nugget\. +3. Edit the Data Asset node to use the file cond2n\.csv (instead of cond1n\.csv), which contains unseen test data\. +4. Right\-click the Analysis node and select Run\. Doing so yields figures reflecting the accuracy of the trained network and rule\. + + Figure 1. Testing the trained network + + ![Testing the trained network](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_condition_analysis.png) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a1fe4b06db60f8a9c916fbeaf5c7482155bd62e3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a1fe4b06db60f8a9c916fbeaf5c7482155bd62e3.md new file mode 100644 index 0000000..4f99288 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a1fe4b06db60f8a9c916fbeaf5c7482155bd62e3.md @@ -0,0 +1,15 @@ +# HDBSCAN node (SPSS Modeler) + +# HDBSCAN node # + +Hierarchical Density\-Based Spatial Clustering (HDBSCAN)© uses unsupervised learning to find clusters, or dense regions, of a data set\. + +The HDBSCAN node in watsonx\.ai exposes the core features and commonly used parameters of the HDBSCAN library\. The node is implemented in Python, and you can use it to cluster your dataset into distinct groups when you don't know what those groups are at first\. Unlike most learning methods in watsonx\.ai, HDBSCAN models do *not* use a target field\. This type of learning, with no target field, is called unsupervised learning\. Rather than trying to predict an outcome, HDBSCAN tries to uncover patterns in the set of input fields\. Records are grouped so that records within a group or cluster tend to be similar to each other, but records in different groups are dissimilar\. The HDBSCAN algorithm views clusters as areas of high density separated by areas of low density\. Due to this rather generic view, clusters found by HDBSCAN can be any shape, as opposed to k\-means which assumes that clusters are convex shaped\. Outlier points that lie alone in low\-density regions are also marked\. HDBSCAN also supports scoring of new samples\.^1^ + +To use the HDBSCAN node, you must set up an upstream Type node\. The HDBSCAN node will read input values from the Type node (or from the Types of an upstream import node)\. + +For more information about HDBSCAN clustering algorithms, see the [HDBSCAN documentation](http://hdbscan.readthedocs.io/en/latest/)\. ^1^ + +^1^ "User Guide / Tutorial\." *The hdbscan Clustering Library*\. Web\. © 2016, Leland McInnes, John Healy, Steve Astels\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a20fcf106ba3053c247daf57a4a396f073d1e4e2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a20fcf106ba3053c247daf57a4a396f073d1e4e2.md new file mode 100644 index 0000000..67bcb7e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a20fcf106ba3053c247daf57a4a396f073d1e4e2.md @@ -0,0 +1,35 @@ +# transposenode properties + +# transposenode properties # + +![Transpose node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/transposenodeicon.png)The Transpose node swaps the data in rows and columns so that records become fields and fields become records\. + + + +transposenode properties + +Table 1\. transposenode properties + +| `transposenode` properties | Data type | Property description | +| --------------------------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `transpose_method` | *enum* | Specifies the transpose method: Normal (`normal`), CASE to VAR (`casetovar`), or VAR to CASE (`vartocase`)\. | +| `transposed_names` | `Prefix``Read` | Property for the Normal transpose method\. New field names can be generated automatically based on a specified prefix, or they can be read from an existing field in the data\. | +| `prefix` | *string* | Property for the Normal transpose method\. | +| `num_new_fields` | *integer* | Property for the Normal transpose method\. When using a prefix, specifies the maximum number of new fields to create\. | +| `read_from_field` | *field* | Property for the Normal transpose method\. Field from which names are read\. This must be an instantiated field or an error will occur when the node is executed\. | +| `max_num_fields` | *integer* | Property for the Normal transpose method\. When reading names from a field, specifies an upper limit to avoid creating an inordinately large number of fields\. | +| `transpose_type` | `Numeric``String``Custom` | Property for the Normal transpose method\. By default, only continuous (numeric range) fields are transposed, but you can choose a custom subset of numeric fields or transpose all string fields instead\. | +| `transpose_fields` | *list* | Property for the Normal transpose method\. Specifies the fields to transpose when the `Custom` option is used\. | +| `id_field_name` | *field* | Property for the Normal transpose method\. | +| `transpose_casetovar_idfields` | *field* | Property for the CASE to VAR (`casetovar`) transpose method\. Accepts multiple fields to be used as index fields\. `field1 ... fieldN` | +| `transpose_casetovar_columnfields` | *field* | Property for the CASE to VAR (`casetovar`) transpose method\. Accepts multiple fields to be used as column fields\. `field1 ... fieldN` | +| `transpose_casetovar_valuefields` | *field* | Property for the CASE to VAR (`casetovar`) transpose method\. Accepts multiple fields to be used as value fields\. `field1 ... fieldN` | +| `transpose_vartocase_idfields` | *field* | Property for the VAR to CASE (`vartocase`) transpose method\. Accepts multiple fields to be used as ID variable fields\. `field1 ... fieldN` | +| `transpose_vartocase_valfields` | *field* | Property for the VAR to CASE (`vartocase`) transpose method\. Accepts multiple fields to be used as value variable fields\. `field1 ... fieldN` | +| `transpose_new_field_names` | *array* | New field names\. | +| `transpose_casetovar_aggregatefunction` | `mean`
`sum`
`min`
`max`
`median`
`count` | When there's more than one record for an index, you must aggregate the records into one\. Use the Aggregate Function drop\-down to specify how to aggregate the records using one of the aggregation functions\. | +| `default_value_mode` | `Read`
`Pass` | Set the default mode for all fields to `Read` or `Pass`\. The import node passes fields by default, while the Type node reads values by default\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a255bb890ca287c5a91765b71832daa45ba4132b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a255bb890ca287c5a91765b71832daa45ba4132b.md new file mode 100644 index 0000000..5acb309 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a255bb890ca287c5a91765b71832daa45ba4132b.md @@ -0,0 +1,97 @@ +# Global visualization preferences + +# Global visualization preferences # + +You can override the default settings for titles, range slider, grid lines, and mouse tracking\. You can also specify a different color scheme template\. + + + +1. In Visualizations, click the Global visualization preferences control in the Actions section\. + + The Global visualization preferences dialog provides the following settings. + + Titles + : Provides global chart title settings. + + Global titles + : Enables or disables the global titles for all charts. + + Global primary title + : Enables or disables the display of global, primary chart titles. When enabled, the top-level chart title that you enter here is applied to all chart's, effectively overriding each chart's individual Primary title setting. + + Global subtitle + : Enables or disables the display of global chart subtitles. When enabled, the chart subtitle that you enter here is applied to all chart's, effectively overriding each chart's individual Subtitle setting. + + Default titles + : Enables or disables the default titles for all charts. + + Title alignment + : Provides the title alignment options Left, Center (the default setting), and Right. + + Tools + : Provides options that control chart behavior. + + Range slider + : Enables or disables the range slider for each chart. When enabled, you can control the amount of chart data that displays with a range slider that is provided for each chart. + + Grid lines + : Controls the display of X axis (vertical) and Y axis (horizontal) grid lines. + + Mouse tracker + : When enabled, the mouse cursor location, in relation to the chart data, is tracked and displayed when placed anywhere over the chart. + + Toolbox + : Enables or disables the toolbox for each chart. Depending on the chart type, the toolbox on the right of the screen provides tools such as zoom, save as image, restore, select data, and clear selection. + + ARIA + : When enabled, web content and web applications are more accessible to users with disabilities. + + Filter out null + : Enables or disables the filtering of null chart data. + + X axis on zero + : When enabled, the X axis lies on the other's origin position. When not enabled, the X axis always starts at 0. + + Y axis on zero + : When enabled, the Y axis lies on the other's origin position. When not enabled, the Y axis always starts at 0. + + Show xAxis Label + : Enables or disables the xAxis label. + + Show yAxis Label + : Enables or disables the yAxis label. + + Show xAxis Line + : Enables or disables the xAxis line. + + Show yAxis Line + : Enables or disables the yAxis line. + + Show xAxis Name + : Enables or disables the xAxis name. + + Show yAxis Name + : Enables or disables the yAxis name. + + yAxis Name Location + : The drop-down list provides options for specifying the yAxis name location. Options include Start, Middle, and End. + + Truncation length + : The specified value sets the string length. Strings that are longer than the specified length are truncated. The default value is 10. When 0 is specified, truncation is turned off. + + xAxis tick label decimal + : Sets the tick label decimal value for the xAxis. The default value is 3. + + yAxis tick label decimal + : Sets the tick label decimal value for the yAxis. The default value is 3. + + xAxis tick label rotate + : Sets the xAxis tick label rotation value. The default value is 0 (no rotation). You can specify value in the range -90 to 90 degrees. + + Theme + : Select a template to change the colors that are used in charts that have a grouping or stacking variable. Any element attributes defined in the selected template file override the default template settings for those element attributes. +2. Click Apply to save your settings or Cancel to disregard the changes\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a2b0db014389285d9abca9fe0d4035f85de6d102.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a2b0db014389285d9abca9fe0d4035f85de6d102.md new file mode 100644 index 0000000..fa61833 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a2b0db014389285d9abca9fe0d4035f85de6d102.md @@ -0,0 +1,6 @@ +# Pie charts + +# Pie charts # + +A pie chart is useful for comparing proportions\. For example, you can use a pie chart to demonstrate that a greater proportion of Europeans is enrolled in a certain class\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a3022ff9db2732f0ab3091884b428763d3879fd2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a3022ff9db2732f0ab3091884b428763d3879fd2.md new file mode 100644 index 0000000..c315b39 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a3022ff9db2732f0ab3091884b428763d3879fd2.md @@ -0,0 +1,72 @@ +# Building the flow (SPSS Modeler) + +# Building the flow # + +Figure 1\. Modeling flow + +![Modeling flow](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_intro_build_flow.png) + +To build a flow that will create a model, we need at least three elements: + + + + * A Data Asset node that reads in data from an external source, in this case a \.csv data file + * An Import or Type node that specifies field properties, such as measurement level (the type of data that the field contains), and the role of each field as a target or input in modeling + * A modeling node that generates a model nugget when the flow runs + + + +In this example, we're using a CHAID modeling node\. CHAID, or Chi\-squared Automatic Interaction Detection, is a classification method that builds decision trees by using a particular type of statistics known as chi\-square statistics to work out the best places to make the splits in the decision tree\. + +If measurement levels are specified in the source node, the separate Type node can be eliminated\. Functionally, the result is the same\. + +This flow also has Table and Analysis nodes that will be used to view the scoring results after the model nugget has been created and added to the flow\. + +The Data Asset import node reads data in from the sample tree\_credit\.csv data file\. + +The Type node specifies the measurement level for each field\. The measurement level is a category that indicates the type of data in the field\. Our source data file uses three different measurement levels: + +A Continuous field (such as the `Age` field) contains continuous numeric values, while a Nominal field (such as the `Credit rating` field) has two or more distinct values, for example `Bad`, `Good`, or `No credit history`\. An Ordinal field (such as the `Income level` field) describes data with multiple distinct values that have an inherent order—in this case `Low`, `Medium` and `High`\. + +Figure 2\. Setting the target and input fields with the Type node + +![Setting the target and input fields with the Type node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/intro-build.jpg) + +For each field, the Type node also specifies a role to indicate the part that each field plays in modeling\. The role is set to `Target` for the field `Credit rating`, which is the field that indicates whether or not a given customer defaulted on the loan\. This is the `target`, or the field for which we want to predict the value\. + +Role is set to `Input` for the other fields\. Input fields are sometimes known as `predictors`, or fields whose values are used by the modeling algorithm to predict the value of the target field\. + +The CHAID modeling node generates the model\. In the node's properties, under FIELDS, the option Use custom field roles is available\. We could select this option and change the field roles, but for this example we'll use the default targets and inputs as specified in the Type node\. + + + +1. Double\-click the CHAID node (named Creditrating)\. The node properties are displayed\. + + Figure 3. CHAID modeling node properties + + ![CHAID modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/spss-fields.png) + + Here there are several options where we could specify the kind of model we want to build. + + We want a brand-new model, so under OBJECTIVES we'll use the default option Build new model. + + We also just want a single, standard decision tree model without any enhancements, so we'll also use the default objective option Create a standard model. + + Figure 4. CHAID modeling node objectives + + ![CHAID modeling node objectives](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/spss-objectives.png) + + For this example, we want to keep the tree fairly simple, so we'll limit the tree growth by raising the minimum number of cases for parent and child nodes. +2. Under STOPPING RULES, select Use absolute value\. +3. Set Minimum records in parent branch to 400\. +4. Set Minimum records in child branch to 200\. + + + +Figure 5\. Setting the stopping criteria for decision tree building + +![Setting the stopping criteria for decision tree building](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_intro_stopping.png) + +We can use all the other default options for this example, so click Save and then click the Run button on the toolbar to create the model\. (Alternatively, right\-click the CHAID node and choose Run from the context menu\.) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a304b9e82543c150236ecad30f1594e1b832b8b1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a304b9e82543c150236ecad30f1594e1b832b8b1.md new file mode 100644 index 0000000..2bb3ad8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a304b9e82543c150236ecad30f1594e1b832b8b1.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Attribute inference attack # + +![icon for privacy risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-privacy.svg)Risks associated with inputInferencePrivacyAmplified + +### Description ### + +An attribute inference attack is used to detect whether certain sensitive features can be inferred about individuals who participated in training a model\. These attacks occur when an adversary has some prior knowledge about the training data and uses that knowledge to infer the sensitive data\. + +### Why is attribute inference attack a concern for foundation models? ### + +With a successful attack, the attacker can gain valuable information such as sensitive personal information or intellectual property\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a392bddead4f42155dc83fba8512775db313fc53.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a392bddead4f42155dc83fba8512775db313fc53.md new file mode 100644 index 0000000..0fc9497 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a392bddead4f42155dc83fba8512775db313fc53.md @@ -0,0 +1,30 @@ +# Securing connections to services with private service endpoints + +# Securing connections to services with private service endpoints # + +You can configure isolated connectivity to your cloud\-based services for production workloads with IBM Cloud service endpoints\. When you enable IBM Cloud service endpoints in your account, you can expose a private network endpoint when you create a resource\. You then connect directly to this endpoint over the IBM Cloud private network rather than the public network\. Because resources that use private network endpoints don't have an internet\-routable IP address, connections to these resources are more secure\. + +To use service endpoints: + + + +1. Enable virtual routing and forwarding (VRF) in your account, if necessary, and enable the use of service endpoints\. +2. Create services that support VRF and service endpoints\. + + + +See [Enabling VRF and service endpoints](https://cloud.ibm.com/docs/account?topic=account-vrf-service-endpoint)\. + +## Learn more ## + + + + * [Secure access to services using service endpoints](https://cloud.ibm.com/docs/account?topic=account-service-endpoints-overview) + * [Enabling VRF and service endpoints](https://cloud.ibm.com/docs/account?topic=account-vrf-service-endpoint) + * [List of services that support service endpoints](https://cloud.ibm.com/docs/account?topic=account-vrf-service-endpoint#use-service-endpoint) + + + +**Parent topic:**[Security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a3ae0828d8e261dbc23b466d22ab46c1dd65b710.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a3ae0828d8e261dbc23b466d22ab46c1dd65b710.md new file mode 100644 index 0000000..95b9d65 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a3ae0828d8e261dbc23b466d22ab46c1dd65b710.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Reidentification # + +![icon for privacy risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-privacy.svg)Risks associated with inputTraining and tuning phasePrivacyTraditional + +### Description ### + +Even with the removal or personal identifiable information (PII) and sensitive personal information (SPI) from data, it might still be possible to identify persons due to other features available in the data\. + +### Why is reidentification a concern for foundation models? ### + +Data that can reveal personal or sensitive data must be reviewed with respect to privacy laws and regulations, as business entities could face fines, reputational harms, and other legal consequences if found in violation\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a447ec7366d2eb328bce8e44a73b3a825a9b757b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a447ec7366d2eb328bce8e44a73b3a825a9b757b.md new file mode 100644 index 0000000..bfcae29 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a447ec7366d2eb328bce8e44a73b3a825a9b757b.md @@ -0,0 +1,9 @@ +# Set Globals node (SPSS Modeler) + +# Set Globals node # + +The Set Globals node scans the data and computes summary values that can be used in CLEM expressions\. + +For example, you can use a Set Globals node to compute statistics for a field called `age` and then use the overall mean of `age` in CLEM expressions by inserting the function `@GLOBAL_MEAN(age)`\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a4799f6bdea1b1508528fc647dad5d1b2ef777aa.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a4799f6bdea1b1508528fc647dad5d1b2ef777aa.md new file mode 100644 index 0000000..a9897b8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a4799f6bdea1b1508528fc647dad5d1b2ef777aa.md @@ -0,0 +1,14 @@ +# SuperNode flows + +# SuperNode flows # + +A SuperNode flow is the type of flow used within a SuperNode\. Like a normal flow, it contains nodes that are linked together\. SuperNode flows differ from normal flows in various ways: + + + + * Parameters and any scripts are associated with the SuperNode that owns the SuperNode flow, rather than with the SuperNode flow itself\. + * SuperNode flows have additional input and output connector nodes, depending on the type of SuperNode\. These connector nodes are used to push information into and out of the SuperNode flow, and are created automatically when the SuperNode is created\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a4cea84825e512a73c509437103b89b6ef363d5b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a4cea84825e512a73c509437103b89b6ef363d5b.md new file mode 100644 index 0000000..5ba556e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a4cea84825e512a73c509437103b89b6ef363d5b.md @@ -0,0 +1,45 @@ +# Importing a project + +# Importing a project # + +You can create a project that is preloaded with assets by importing the project\. + +## Requirements ## + +**A local file of a previously exported project** : Importing a project from a local file is a method of copying a project\. You can import a project from a file on your local system only if the ZIP file that you select was exported from a IBM watsonx project as a compressed file\. You can import only projects that you exported from watsonx\.ai\. You cannot import a compressed file that was exported from a Cloud Pak for Data as a Service project\. + +: If the exported file that you select to import was encrypted, you must enter the password that was used for encryption to enable decrypting sensitive connection properties\. + +**A sample project from Samples** : You can create a project [from a project sample](https://dataplatform.cloud.ibm.com/samples?context=wx) to learn how to work with data in tools, such as notebooks to prepare data, analyze data, build and train models, and visualize analysis results\. + +: The sample projects show how to accomplish goals, for example, to load and explore data, to create and train machine learning models for predictive analysis\. Each project includes the required assets, such as notebooks, and all the data sets that you need to complete the example use case\. + +## Importing a project from a local file or sample ## + +To import a project: + + + +1. Click **New project** on the home page or on your **Projects** page\. +2. Choose whether to create a project based on an exported project file or a sample project\. +3. Upload a project file or select a sample project\. +4. On the **New project** screen, add a name and optional description for the project\. +5. If the project file that you select to import is encrypted, you must enter the password that was used for encryption to enable decrypting sensitive connection properties\. If you enter an incorrect password, the project file imports successfully, but sensitive connection properties are falsely decrypted\. +6. Select the **Restrict who can be a collaborator** checkbox to restrict collaborators to members of your organization\. You can't change this setting after you create the project\. +7. Choose an existing [object storage service instance](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/storage-options.html) or create a new one\. +8. Click **Create**\. You can start adding resources if your project is empty, or begin working with the resources you imported\. + + + +## Learn more ## + + + + * [Administering a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/admin-project.html) + * [Exporting project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/export-project.html) + + + +**Parent topic:**[Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a4e9fae09be2f3c0191cbc14a56085b0773a2585.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a4e9fae09be2f3c0191cbc14a56085b0773a2585.md new file mode 100644 index 0000000..37f3664 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a4e9fae09be2f3c0191cbc14a56085b0773a2585.md @@ -0,0 +1,49 @@ +# Accessing data in AWS through access points from a notebook + +# Accessing data in AWS through access points from a notebook # + +In IBM watsonx you can access data stored in AWS S3 buckets through access points from a notebook\. + +Run the notebook in an environment in IBM watsonx\. Create an internet\-enabled access point to connect to the S3 bucket\. + +## Connecting to AWS S3 data through an internet\-enabled access point ## + +You can access data in an AWS S3 bucket through an internet\-enabled access point in any AWS region\. + +To access S3 data through an internet\-enabled access point: + + + +1. Create an access point for your S3 bucket\. See [Creating access points](https://docs.aws.amazon.com/AmazonS3/latest/dev/creating-access-points.html)\. + + Set the network origin to `Internet`. +2. After the access point is created, make a note of the Amazon resource name (ARN) for the access point\. Example: `ARN: arn:aws:s3:us-east-1:675068711478:accesspoint/cust-data-bucket-internet-ap`\. You will need to enter the ARN in your notebook\. + + + +## Accessing AWS S3 data from your notebook ## + +The following sample code snippet shows you how to access AWS data from your notebook by using an access point: + + import boto3 + import pandas as pd + + # use an access key and a secret that has access to the bucket + access_key="..." + secret="..." + + s3_client = boto3.client('s3', aws_access_key_id=access_key, aws_secret_access_key=secret) + + #the Amazon resource name (ARN) of the access point + arn = "..." + # the file you want to retrieve + fileName="customers.csv" + + response = s3_client.get_object(Bucket=arn, Key=fileName) + s3FileStream = response["Body"] + #for other file types, change the line below to use the appropriate read_() method from pandas + customerDF = pd.read_csv(s3FileStream) + +**Parent topic:**[Loading and accessing data in a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a56686454e771e5fdda0315dd38313f9fcb31aac.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a56686454e771e5fdda0315dd38313f9fcb31aac.md new file mode 100644 index 0000000..64ab6d8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a56686454e771e5fdda0315dd38313f9fcb31aac.md @@ -0,0 +1,5 @@ +# Cloudant on IBM watsonx + +# Cloudant on IBM® watsonx # + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a56c821c7ee483d01e4338397f62ddd6cb6d5e9f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a56c821c7ee483d01e4338397f62ddd6cb6d5e9f.md new file mode 100644 index 0000000..238d7bd --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a56c821c7ee483d01e4338397f62ddd6cb6d5e9f.md @@ -0,0 +1,7 @@ +# Output nodes (SPSS Modeler) + +# Outputs # + +Output nodes provide the means to obtain information about your data and models\. They also provide a mechanism for exporting data in various formats to interface with your other software tools\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a5c7cf086b303923d48f8ad63cf85a6bccbbe3f5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a5c7cf086b303923d48f8ad63cf85a6bccbbe3f5.md new file mode 100644 index 0000000..fa0fd7b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a5c7cf086b303923d48f8ad63cf85a6bccbbe3f5.md @@ -0,0 +1,132 @@ +# Managing feature groups (beta) + +# Managing feature groups (beta) # + +Create a feature group to preserve a set of columns of a data asset along with associated metadata for use with Machine Learning models\. + +**Required service** : You must have these services\. + + - Watson Studio (for projects) + +**Required permissions** : To view this page, you can have any role in a project\. : To edit or update information on this page, you must have the **Editor** or **Admin** role in the project\. + +**Workspaces** : You can view the asset feature group in these workspaces: : Projects + +**Types of assets** : These types of assets can have a feature group: : Tabular: CSV, TSV, Parquet, xls, xslx, avro, text, json files : [Connected data types](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) that are structured and supported in Watson Studio\. + +**Data size** : No limit + +## Feature groups (beta) ## + +Create a **feature group** to preserve a set of columns of a particular data asset along with the metadata used for Machine Learning\. For example, if you have a set of features for a credit approval model, you can preserve the features used to train the model, as well as some metadata, including which column is used as the prediction target, and which columns are used for bias detection\. Feature groups make it simple to preserve the metadata for the features used to train a machine learning model so other data scientists can use the same features\. You can see the feature group tab when you preview a particular asset\. + + + + * [Creating a feature group](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/feature-group.html?context=cdpaas&locale=en#create-featuregrp) + * [Editing a feature group](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/feature-group.html?context=cdpaas&locale=en#edit-featuregrp) + * [Removing features or a feature group](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/feature-group.html?context=cdpaas&locale=en#remove-featuregrp) + * [Using the Python API for feature groups](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/feature-group.html?context=cdpaas&locale=en#api-featuregrp) + + + +### Creating a feature group in a project ### + +#### Before you begin #### + +If you create a [profile](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/profile.html) for the data asset before creating a feature group you can select profile metadata to add values to the feature\. + +#### Create a feature group #### + +You can select particular columns of data assets to form a feature group\. + + + +1. In the project **Assets** tab, click the name of the relevant asset to open the preview and select the **Feature group** tab\. Here you can create a feature group or view and edit an existing one\. An asset can have only one feature group\. Click **New feature group**\. + + ![Create a feature group](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/create-feature-group3.png) +2. Select the columns that you want to be used in the feature group\. Select the **Name** checkbox to include all the columns as features\. + + ![Select the feature group columns](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/create-feature-group-columns1.png) + + + +### Editing a feature group ### + +When you have selected the columns of the data asset to be used in the feature group, you can then view each feature and edit it to specify the role it will have in Machine Learning models\. + +![View feature group](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/feature-group-example3.png) + + + +1. Click a feature name and click **Edit this feature**\. A window opens displaying the following tabs: + + + + * **Details** - provide the following information about the feature. + + ![Details](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/feature-group-details.png) + + Select a **Role** to be assigned to the feature: + + + + * `Input`: the feature can be used as input for training a Machine Learning model. + * `Target`: the feature to be used as the prediction target when the data is used to train a Machine Learning model. + * `Identifier`: the primary key, such as customer ID, used to identify the input data. + + Enter a **Description**, **Recipe** (any method or formula used to create values for the feature) and any **Tags**. + + + + * **Value descriptions** + + ![Value descriptions](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/feature-group-values.png) + + Value descriptions allow you to clarify the meaning of specific values. For example, consider a column "credit evaluation" with the values *-1*, *0* and *1*. You can use value descriptions to provide meaning for these values. For example, *-1* might mean "evaluation rejected". You can enter descriptions for particular values. For numerical values, you can also specify a range. To specify a range of numerical values, enter the following text *\[n,m\]* where *n* is the start and *m* is the end of the range, surrounded by brackets, and click **Add**. For example, to describe all age values between 18 and 24 as "millenials", enter *\[18,24\]* as the value and *millenials* as the description. If you have a [profile](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/profile.html) defined, the profile values are displayed in the value descriptions list. From here you can select one value or multiple values. + * **Fairness information** + + ![Fairness information](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/feature-group-fairness.png) + + You can define `Monitor` or `Reference` groups of values for monitoring bias. The values that are more at risk of biased outcomes can be placed in the Monitor group. These values are then compared to values in the Reference group. To specify a range of numerical values, enter the following text *\[n,m\]* where *n* is the start and *m* is the end of the range, surrounded by brackets. For example, to monitor all age values between 18 and 35, enter *\[18,35\]*. Then select Monitor or Reference and click **Add**. You can also specify **Favorable outcomes**. See [Fairness in AutoAI experiments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-fairness.html) for more information about fairness. + + + +2. When you have edited the feature, click **Save**\. You can now see your changes in the **Feature Details** window\. Close this window to return to the feature group\. + + + +### Removing features from a group ### + +To remove a feature from a group: + + + +1. Preview the asset in the project and select the **Feature group** tab\. +2. In the **Features** table that is displayed, select the feature (or features) that you want to remove\. +3. In the toolbar that appears, select **Remove from group**\. + + ![Removing features](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/feature-group-remove3.png) + + + +The feature, or feature group if you selected all the features, is removed\. + +### Searching for a feature group ### + +You can [search for assets or columns across all projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/search-assets.html#filter)\. To filter your search results to find assets with a feature group, select **Data** to see the filter options, and select **Feature group**\. Assets containing a feature group will then be listed in the search results\. + +### Using the Python API to create and use feature groups ### + +You can also use the [assetframe\-lib Python library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/py_assetframe.html) in notebooks to create and edit feature groups\. This library also allows you use feature metadata like fairness information when creating machine learning models\. + +## Learn more ## + +For examples on how to create and use feature groups in notebooks: + + + + * [Creating and using feature store data](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/e756adfa2855bdfc20f588f9c1986382) sample project in the Samples + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a5d736b45ec8ec0b906e183de5daa8bfa4c1f2d6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a5d736b45ec8ec0b906e183de5daa8bfa4c1f2d6.md new file mode 100644 index 0000000..24af844 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a5d736b45ec8ec0b906e183de5daa8bfa4c1f2d6.md @@ -0,0 +1,21 @@ +# Streaming Time Series node (SPSS Modeler) + +# Streaming Time Series node # + +You use the Streaming Time Series node to build and score time series models in one step\. A separate time series model is built for each target field, however model nuggets are not added to the generated models palette and the model information cannot be browsed\. + +Methods for modeling time series data require a uniform interval between each measurement, with any missing values indicated by empty rows\. If your data does not already meet this requirement, you need to transform values as needed\. + +Other points of interest regarding Time Series nodes: + + + + * Fields must be numeric\. + * Date fields cannot be used as inputs\. + * Partitions are ignored\. + + + +The Streaming Time Series node estimates exponential smoothing, univariate Autoregressive Integrated Moving Average (ARIMA), and multivariate ARIMA (or transfer function) models for time series and produces forecasts based on the time series data\. Also available is an Expert Modeler, which attempts to automatically identify and estimate the best\-fitting ARIMA or exponential smoothing model for one or more target fields\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a62a258bb486fbe7e7fc91c611dc2bc400e32308.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a62a258bb486fbe7e7fc91c611dc2bc400e32308.md new file mode 100644 index 0000000..f5daa3b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a62a258bb486fbe7e7fc91c611dc2bc400e32308.md @@ -0,0 +1,51 @@ +# Browsing the model (SPSS Modeler) + +# Browsing the model # + +After running a flow, an orange model nugget is added to the canvas with a link to the modeling node from which it was created\. To view the model details, right\-click the model nugget and choose View Model\. + +Figure 1\. Model nugget + +![Model nugget](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_intro_nugget.png) + +In the case of the CHAID nugget, the CHAID Tree Model screen includes pages for Model Information, Feature Importance, Top Decision Rules, Tree Diagram, Build Settings, and Training Summary\. For example, you can see details in the form of a rule set—essentially a series of rules that can be used to assign individual records to child nodes based on the values of different input fields\. + +Figure 2\. CHAID model nugget, rule set + +![CHAID model nugget, rule set](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_intro_rules.png) + +For each decision tree terminal node – meaning those tree nodes that are not split further—a prediction of Good or Bad is returned\. In each case, the prediction is determined by the mode, or most common response, for records that fall within that node\. + +The Feature Importance chart shows the relative importance of each predictor in estimating the model\. From this, we can see that Income level is easily the most significant in this case, with Number of credit cards being the next most significant factor\. + +Figure 3\. Feature Importance chart + +![Feature Importance chart](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/feature-importance.jpg) + +The Tree Diagram page displays the same model in the form of a tree, with a node at each decision point\. Hover over branches and nodes to explore details\. + +Figure 4\. Tree diagram in the model nugget + +![Tree diagram in the model nugget](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tree-diagram.jpg) + +Looking at the start of the tree, the first node (node 0) gives us a summary for all the records in the data set\. Just over 40% of the cases in the data set are classified as a bad risk\. This is quite a high proportion, so let's see if the tree can give us any clues as to what factors might be responsible\. + +We can see that the first split is by Income level\. Records where the income level is in the Low category are assigned to node 2, and it's no surprise to see that this category contains the highest percentage of loan defaulters\. Clearly, lending to customers in this category carries a high risk\. However, almost 18% of the customers in this category actually didn’t default, so the prediction won't always be correct\. No model can feasibly predict every response, but a good model should allow us to predict the most likely response for each record based on the available data\. + +In the same way, if we look at the high income customers (node 1), we see that the vast majority (over 88%) are a good risk\. But more than 1 in 10 of these customers has also defaulted\. Can we refine our lending criteria to minimize the risk here? + +Notice how the model has divided these customers into two sub\-categories (nodes 4 and 5), based on the number of credit cards held\. For high\-income customers, if we lend only to those with fewer than five credit cards, we can increase our success rate from 88% to almost 97%—an even more satisfactory outcome\. + +Figure 5\. High\-income customers with fewer than five credit cards + +![High\-income customers with fewer than five credit cards](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_intro_node5.png) + +But what about those customers in the Medium income category (node 3)? They’re much more evenly divided between Good and Bad ratings\. Again, the sub\-categories (nodes 6 and 7 in this case) can help us\. This time, lending only to those medium\-income customers with fewer than five credit cards increases the percentage of Good ratings from 58% to 86%, a significant improvement\. + +Figure 6\. Tree view of medium\-income customers + +![Tree view of medium\-income customers](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_intro_node7.png) + +So, we’ve learned that every record that is input to this model will be assigned to a specific node, and assigned a prediction of Good or Bad based on the most common response for that node\. This process of assigning predictions to individual records is known as scoring\. By scoring the same records used to estimate the model, we can evaluate how accurately it performs on the training data—the data for which we know the outcome\. Let's examine how to do this\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a6587cbe69b6227ce1d087cc141ccf13669f2060.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a6587cbe69b6227ce1d087cc141ccf13669f2060.md new file mode 100644 index 0000000..45d2d80 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a6587cbe69b6227ce1d087cc141ccf13669f2060.md @@ -0,0 +1,99 @@ +# Time series key functionality + +# Time series key functionality # + +The time series library provides various functions on univariate, multivariate, multi\-key time series as well as numeric and categorical types\. + +The functionality provided by the library can be broadly categorized into: + + + + * Time series I/O, for creating and saving time series data + * Time series functions, transforms, windowing or segmentation, and reducers + * Time series SQL and SQL extensions to Spark to enable executing scalable time series functions + + + +Some of the key functionality is shown in the following sections using examples\. + +## Time series I/O ## + +The primary input and output (I/O) functionality for a time series is through a pandas DataFrame or a Python list\. The following code sample shows constructing a time series from a DataFrame: + + >>> import numpy as np + >>> import pandas as pd + >>> data = np.array(['', 'key', 'timestamp', "value"],'', "a", 1, 27], '', "b", 3, 4], '', "a", 5, 17], '', "a", 3, 7], '', "b", 2, 45]]) + >>> df = pd.DataFrame(data=data[1:, 1:], index=data[1:, 0], columns=data[0, 1:]).astype(dtype={'key': 'object', 'timestamp': 'int64', 'value': 'float64'}) + >>> df + key timestamp value + a 1 27.0 + b 3 4.0 + a 5 17.0 + a 3 7.0 + b 2 45.0 + + #Create a timeseries from a dataframe, providing a timestamp and a value column + >>> ts = tspy.time_series(df, ts_column="timestamp", value_column="value") + >>> ts + TimeStamp: 1 Value: 27.0 + TimeStamp: 2 Value: 45.0 + TimeStamp: 3 Value: 4.0 + TimeStamp: 3 Value: 7.0 + TimeStamp: 5 Value: 17.0 + +To revert from a time series back to a pandas DataFrame, use the `to_df` function: + + >>> import tspy + >>> ts_orig = tspy.time_series([1.0, 2.0, 3.0]) + >>> ts_orig + TimeStamp: 0 Value: 1 + TimeStamp: 1 Value: 2 + TimeStamp: 2 Value: 3 + + >>> df = ts_orig.to_df() + >>> df + timestamp value + 0 0 1 + 1 1 2 + 2 2 3 + +## Data model ## + +Time series data does not have any standards for the model and data types, unlike some data types such as spatial, which are governed by a standard such as Open Geospatial Consortium (OGC)\. The challenge with time series data is the wide variety of functions that need to be supported, similar to that of Spark Resilient Distributed Datasets (RDD)\. + +The data model allows for a wide variety of operations ranging across different forms of segmentation or windowing of time series, transformations or conversions of one time series to another, reducers that compute a static value from a time series, joins that join multiple time series, and collectors of time series from different time zones\. The time series library enables the plug\-and\-play of new functions while keeping the core data structure unchangeable\. The library also support numeric and categorical typed timeseries\. + +With time zones and various human readable time formats, a key aspect of the data model is support for Time Reference System (TRS)\. Every time series is associated with a TRS (system default), which can be remapped to any specific choice of the user at any time, enabling easy transformation of a specific time series or a segment of a time series\. See [Using time reference system](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-reference-system.html)\. + +Further, with the need for handling large scale time series, the library offers a lazy evaluation construct by providing a mechanism for identifying the maximal narrow temporal dependency\. This construct is very similar to that of a Spark computation graph, which also loads data into memory on as needed basis and realizes the computations only when needed\. + +## Time series data types ## + +You can use multiple data types as an element of a time series, spanning numeric, categorical, array, and dictionary data structures\. + +The following data types are supported in a time series: + + + +| Data type | Description | +| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| numeric | Time series with univariate observations of numeric type including double and integer\. For example:`[(1, 7.2), (3, 4.5), (5, 4.5), (5, 4.6), (5, 7.1), (7, 3.9), (9, 1.1)]` | +| numeric array | Time series with multivariate observations of numeric type, including double array and integer array\. For example: `[(1, 7.2, 8.74]), (3, 4.5, 9.44]), (5, 4.5, 10.12]), (5, 4.6, 12.91]), (5, 7.1, 9.90]), (7, 3.9, 3.76])]` | +| string | Time series with univariate observations of type string, for example: `[(1, "a"), (3, "b"), (5, "c"), (5, "d"), (5, "e"), (7, "f"), (9, "g")]` | +| string array | Time series with multivariate observations of type string array, for example: `[(1, "a", "xq"]), (3, "b", "zr"]), (5, "c", "ms"]), (5, "d", "rt"]), (5, "e", "wu"]), (7, "f", "vv"]), (9, "g", "zw"])]` | +| segment | Time series of segments\. The output of the `segmentBy` function, can be any type, including numeric, string, numeric array, and string array\. For example: `[(1,(1, 7.2), (3, 4.5)]), (5,(5, 4.5), (5, 4.6), (5, 7.1)]), (7,(7, 3.9), (9, 1.1)])]` | +| dictionary | Time series of dictionaries\. A dictionary can have arbitrary types inside it | + + + +## Time series functions ## + +You can use different functions in the provided time series packages to analyze time series data to extract meaningful information with which to create models that can be used to predict new values based on previously observed values\. See [Time series functions](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-functions.html)\. + +## Learn more ## + +To use the `tspy` Python SDK, see the [`tspy` Python SDK documentation](https://ibm-cloud.github.io/tspy-docs/)\. + +**Parent topic:**[Time series analysis](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-lib.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a67ea42903bf8be22aeb379891b7e1ca3eb2e4d1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a67ea42903bf8be22aeb379891b7e1ca3eb2e4d1.md new file mode 100644 index 0000000..f876020 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a67ea42903bf8be22aeb379891b7e1ca3eb2e4d1.md @@ -0,0 +1,23 @@ +# Logical functions (SPSS Modeler) + +# Logical functions # + +CLEM expressions can be used to perform logical operations\. + + + +CLEM logical functions + +Table 1\. CLEM logical functions + +| Function | Result | Description | +| --------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `COND1 and COND2` | *Boolean* | This operation is a logical conjunction and returns a true value if both *COND1* and *COND2* are true\. If *COND1* is false, then *COND2* is not evaluated; this makes it possible to have conjunctions where *COND1* first tests that an operation in *COND2* is legal\. For example, `length(Label) >=6` and `Label(6) = 'x'`\. | +| `COND1 or COND2` | *Boolean* | This operation is a logical (inclusive) disjunction and returns a true value if either *COND1* or *COND2* is true or if both are true\. If *COND1* is true, *COND2* is not evaluated\. | +| `not(COND)` | *Boolean* | This operation is a logical negation and returns a true value if *COND* is false\. Otherwise, this operation returns a value of 0\. | +| `if COND then EXPR1 else EXPR2 endif` | *Any* | This operation is a conditional evaluation\. If *COND* is true, this operation returns the result of *EXPR1*\. Otherwise, the result of evaluating *EXPR2* is returned\. | +| `if COND1 then EXPR1 elseif COND2 then EXPR2 else EXPR_N endif` | *Any* | This operation is a multibranch conditional evaluation\. If *COND1* is true, this operation returns the result of *EXPR1*\. Otherwise, if *COND2* is true, this operation returns the result of evaluating *EXPR2*\. Otherwise, the result of evaluating *EXPR\_N* is returned\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a69da07f8ee0529080646a4b1eab45c1074ab683.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a69da07f8ee0529080646a4b1eab45c1074ab683.md new file mode 100644 index 0000000..f85fb53 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a69da07f8ee0529080646a4b1eab45c1074ab683.md @@ -0,0 +1,42 @@ +# Creating the model (SPSS Modeler) + +# Creating the model # + + + +1. Double\-click the Time Series node to open its properties\. +2. Under FIELDS, add all 5 of the markets to the Candidate Inputs lists\. Also add the `Total` field to the Targets list\. +3. Under BUILD OPTIONS \- GENERAL, make sure the Expert Modeler method is selected using all default settings\. Doing so enables the Expert Modeler to decide the most appropriate model to use for each time series\. + + Figure 1. Choosing the Expert Modeler method for Time Series + + ![Choosing the Expert Modeler method for Time Series](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_bandwidth_forecast_expert.png) +4. Save the settings and then run the flow\. A Time Series model nugget is generated\. Attach it to the Time Series node\. +5. Attach a Table node to the Time Series model nugget and run the flow again\. + + Figure 2. Example flow showing Time Series modeling + + ![Example flow showing Time Series modeling](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_bandwidth_forecast_flow.png) + + + +There are now three new rows appended to the end of the original data\. These are the rows for the forecast period, in this case January to March 2004\. + +Several new columns are also present now\. The `$TS-` columns are added by the Time Series node\. The columns indicate the following for each row (that is, for each interval in the time series data): + + + +| Column | Description | +| ----------------- | --------------------------------------------------------------------------------- | +| $TS\-*colname* | The generated model data for each column of the original data\. | +| $TSLCI\-*colname* | The lower confidence interval value for each column of the generated model data\. | +| $TSUCI\-*colname* | The upper confidence interval value for each column of the generated model data\. | +| $TS\-Total | The total of the $TS\-*colname* values for this row\. | +| $TSLCI\-Total | The total of the $TSLCI\-*colname* values for this row\. | +| $TSUCI\-Total | The total of the $TSUCI\-*colname* values for this row\. | + + + +The most significant columns for the forecast operation are the `$TS-Market_n`, `$TSLCI-Market_n`, and `$TSUCI-Market_n` columns\. In particular, these columns in the last three rows contain the user subscription forecast data and confidence intervals for each of the local markets\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a6d3281cf9382fa606cf60727452a304a5ccdfa5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a6d3281cf9382fa606cf60727452a304a5ccdfa5.md new file mode 100644 index 0000000..3d8091e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a6d3281cf9382fa606cf60727452a304a5ccdfa5.md @@ -0,0 +1,88 @@ +# Adding platform connections + +# Adding platform connections # + +You can add connections to the Platform assets catalog to share them across your organization\. All collaborators in the Platform assets catalog can see the connections in the catalog\. However, only users with the credentials for the data source can use a platform connection in a project to create a connected data asset\. + +**Required permissions** : To create a platform connection, you must be a collaborator in the Platform assets catalog with one of these roles: + + + + * **Editor** + * **Admin** + + + +If you're not a collaborator in the Platform assets catalog, ask someone who is a collaborator to add you or tell you who has the **Admin** role in the catalog\. + +You create connections to these types of data sources: + + + + * IBM Cloud services + * Other cloud services + * On\-premises databases + + + +See [Connectors](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) for a full list of data sources\. Watch this video to see how to add platform connections\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +To create a platform connection: + + + +1. From the main menu, choose **Data > Platform connections**\. +2. Click **New connection**\. +3. Choose a data source\. +4. If necessary, enter the connection information required for your data source\. Typically, you need to provide information like the host, port number, username, and password\. +5. If prompted, specify whether you want to use personal or shared credentials\. You cannot change this option after you create the connection\. The credentials type for the connection, either Personal or Shared, is set by the account owner on the [Account page](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/account-settings.html)\. The default setting is **Shared**\. + + + + * **Personal**: With personal credentials, each user must specify their own credentials to access the connection. Each user's credentials are saved but are not shared with any other users. Use personal credentials instead of shared credentials to protect credentials. For example, if you use personal credentials and another user changes the connection properties (such as the hostname or port number), the credentials are invalidated to prevent malicious redirection. + * **Shared**: With shared credentials, all users access the connection with the credentials that you provide. + + + +6. To connect to a database that is not externalized to the internet (for example, behind a firewall), see [Connecting to data behind a firewall](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. +7. Click **Create\.** The connection appears on the **Connections** page\. You can edit the connection by clicking the connection name\. + + + +Alternatively, you can create a connection in a project and then publish it to the Platform assets catalog\. + +To publish a connection from a project to the Platform assets catalog: + + + +1. Locate the connection in the project's **Assets** tab in the **Data assets** section\. +2. From the Actions menu (![Actions icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/actions.png)), select **Publish to catalog**\. +3. Select **Platform assets catalog** and click **Publish**\. + + + +## Next step ## + + + + * [Add a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) + + + +## Learn more ## + + + + * [Connectors](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + * [Creating the Platform assets catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/catalog/platform-assets.html) + * [Set the credentials for connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/account-settings.html#set-the-credentials-for-connections) + + + +**Parent topic:**[Preparing data](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/get-data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a6ff5c1e6cf7c4ba30f191df892dc3296f9b8ce3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a6ff5c1e6cf7c4ba30f191df892dc3296f9b8ce3.md new file mode 100644 index 0000000..b03efb0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a6ff5c1e6cf7c4ba30f191df892dc3296f9b8ce3.md @@ -0,0 +1,27 @@ +# {{ document.title.text }} + +# Non\-disclosure # + +![icon for misuse risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-misuse.svg)Risks associated with outputMisuseNew + +### Description ### + +Not disclosing that content is generated by an AI model is the risk of non\-disclosure\. + +### Why is non\-disclosure a concern for foundation models? ### + +Not disclosing the AI\-authored content reduces trust and is deceptive\. Intention deception might result in fines, reputational harms, and other legal consequences\. + +Example + +#### Undisclosed AI Interaction #### + +As per the source, an online emotional support chat service ran a study to augment or write responses to around 4,000 users using GPT\-3 without informing users\. The co\-founder faced immense public backlash about the potential for harm caused by AI generated chats to the already vulnerable users\. He claimed that the study was "exempt" from informed consent law\. + +Sources: + +[Business Insider, Jan 2023](https://www.businessinsider.com/company-using-chatgpt-mental-health-support-ethical-issues-2023-1) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a724f6e91162b52c519f6887f06df40626c0f698.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a724f6e91162b52c519f6887f06df40626c0f698.md new file mode 100644 index 0000000..34b4686 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a724f6e91162b52c519f6887f06df40626c0f698.md @@ -0,0 +1,24 @@ +# Using Python functions to work with Cloud Object Storage + +# Using Python functions to work with Cloud Object Storage # + +To access and work with data that is in IBM Cloud Object Storage, you can use Python functions from a notebook\. + +With your IBM Cloud Object Storage credentials, you can access and load data from IBM Cloud Object Storage to use in a notebook\. This data can be any object of type file\-like\-object, for example, byte buffers or string buffers\. The data that you upload can reside in a different IBM Cloud Object Storage bucket than the project's bucket\. + +You can also upload data from a local system into IBM Cloud Object Storage from within a notebook\. This data can be a compressed file or Pickle object\. + +See [Working With IBM Cloud Object Storage In Python](https://medium.com/ibm-data-science-experience/working-with-ibm-cloud-object-storage-in-python-fe0ba8667d5f) for more information\. + +## Learn more ## + + + + * Use [ibm\-watson\-studio\-lib for Python](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html) to interact with Watson Studio projects and project assets\. The library also contains functions that simplify fetching files from IBM Cloud Object Storage\. + * [Control access to COS buckets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/cos_buckets.html) + + + +**Parent topic:**[Loading and accessing data in a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a73ca4f67523dbb58fd3521ae9bff83aee634607.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a73ca4f67523dbb58fd3521ae9bff83aee634607.md new file mode 100644 index 0000000..66d12e3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a73ca4f67523dbb58fd3521ae9bff83aee634607.md @@ -0,0 +1,22 @@ +# Creating a distribution chart (SPSS Modeler) + +# Creating a distribution chart # + +During data mining, it is often useful to explore the data by creating visual summaries\. Watson Studio offers many different types of charts to choose from, depending on the kind of data you want to summarize\. For example, to find out what proportion of the patients responded to each drug, use a Distribution node\. + +Figure 1\. Distribution node + +![Distribution node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_drug_distribution.png) + + + +1. Under Graphs on the Palette, add a Distribution node to the flow and connect it to the drug1n\.csv Data Asset node\. Then double\-click the node to edit its options\. +2. Select Drug as the target field whose distribution you want to show\. Then click Save, right\-click the Distribution node, and select Run\. A distribution chart is added to the Outputs panel\. + + + +The chart helps you see the shape of the data\. It shows that patients responded to drug `Y` most often and to drugs `B` and `C` least often\. + +Alternatively, you can attach and run a Data Audit node for a quick glance at distributions and histograms for all fields at once\. The Data Audit node is available under Outputs on the Palette\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a7845d8c3e419cedd06e8c447adf41e6e3d860c8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a7845d8c3e419cedd06e8c447adf41e6e3d860c8.md new file mode 100644 index 0000000..d651d6d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a7845d8c3e419cedd06e8c447adf41e6e3d860c8.md @@ -0,0 +1,87 @@ +# IBM Federated Learning + +# IBM Federated Learning # + +Federated Learning provides the tools for multiple remote parties to collaboratively train a single machine learning model without sharing data\. Each party trains a local model with a private data set\. Only the local model is sent to the aggregator to improve the quality of the global model that benefits all parties\. + +**Data format** +Any data format including but not limited to CSV files, JSON files, and databases for PostgreSQL\. + +## How Federated Learning works ## + +Watch this overview video to learn the basic concepts and elements of a Federated Learning experiment\. Learn how you can apply the tools for your company's analytics enhancements\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +An example for using Federated Learning is when an aviation alliance wants to model how a global pandemic impacts airline delays\. Each participating party in the federation can use their data to train a common model without ever moving or sharing their data\. They can do so either in application silos or any other scenario where regulatory or pragmatic considerations prevent users from sharing data\. The resulting model benefits each member of the alliance with improved business insights while lowering risk from data migration and privacy issues\. + +As the following graphic illustrates, parties can be geographically distributed and run on different platforms\. + +![Diagram of a global Federated Learning experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl-overview.svg) + +## Why use IBM Federated Learning ## + +IBM Federated Learning has a wide range of applications across many enterprise industries\. Federated Learning: + + + + * Enables sites with large volumes of data to be collected, cleaned, and trained on an enterprise scale without migration\. + * Accommodates for the differences in data format, quality, and constraints\. + * Complies with data privacy and security while training models with different data sources\. + + + +## Learn more ## + + + + * [Federated Learning tutorials and samples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-demo.html) + + + + * [Federated Learning Tensorflow tutorial for UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-tf2-tutorial.html) + * [Federated Learning Tensorflow samples for API](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-tf2-samples.html) + * [Federated Learning XGBoost tutorial for UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-xg-tutorial.html) + * [Federated Learning XGBoost sample for API](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-xg-samples.html) + * [Federated Learning homomorphic encryption sample for API](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-fhe-sample.html) + + + + * [Getting started](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-get-started.html) + + + + * [Terminology](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-term.html) + * [Federated Learning architecture](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-arch.html) + + + + * [Frameworks, fusion methods, and Python versions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-frames.html) + + + + * [Hyperparameter definitions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-param.html) + + + + * [Creating a Federated Learning experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-start.html) + + + + * [Set up your system](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-setup.html) + * [Creating the initial model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-models.html) + * [Create the data handler](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-handler.html) + * [Starting the aggregator (Admin)](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-agg.html) + * [Connecting to the aggregator (Party)](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-conn.html) + * [Monitoring and saving the model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-mon.html) + + + + * [Applying encryption](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-homo.html) + * [Limitations and troubleshooting](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-troubleshoot.html) + + + +**Parent topic:**[Analyzing data and building models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-science.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a7f2612ad7178c8afa4c8b7c2f210a10dd7ee5cc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a7f2612ad7178c8afa4c8b7c2f210a10dd7ee5cc.md new file mode 100644 index 0000000..74e0905 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a7f2612ad7178c8afa4c8b7c2f210a10dd7ee5cc.md @@ -0,0 +1,108 @@ +# Adding connections to projects + +# Adding connections to projects # + +You need to create a connection asset for a data source before you can access or load data to or from it\. A connection asset contains the information necessary to establish a connection to a data source\. + +Create connections to multiple types of data sources, including IBM Cloud services, other cloud services, on\-prem databases, and more\. + +See [Connectors](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) for the list of data sources\. + +To create a new connection in a project: + + + +1. Go to the project page, and click the **Assets** tab\. +2. Click **New asset > Connect to a data source**\. +3. Choose the kind of connection: + + + + * Select **New connection** (the default) to create a new connection in the project. + * Select **Platform connections** to select a connection that has already been created at the platform level. + * Select **Deployed services** to connect to a data source from a cloud service this is integrated with IBM watsonx. + + + +4. Choose a data source\. +5. Enter the connection information that is required for the data source\. Typically, you need to provide information like the hostname, port number, username, and password\. +6. If prompted, specify whether you want to use personal or shared credentials\. You cannot change this option after you create the connection\. The credentials type for the connection, either Personal or Shared, is set by the account owner on the [Account page](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/account-settings.html)\. The default setting is **Shared**\. + + + + * **Personal**: With personal credentials, each user must specify their own credentials to access the connection. Each user's credentials are saved but are not shared with any other users. Use personal credentials instead of shared credentials to protect credentials. For example, if you use personal credentials and another user changes the connection properties (such as the hostname or port number), the credentials are invalidated to prevent malicious redirection. + * **Shared**: With shared credentials, all users access the connection with the credentials that you provide. Shared credentials can potentially be retrieved by a user who has access to the connection asset. Because the credentials are shared, it is difficult to audit access to the connection, to identify the source of data loss, or identify the source of a security breach. + + + + + + + +1. For **Private connectivity**: To connect to a database that is not externalized to the internet (for example, behind a firewall), see [Securing connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. +2. If available, click **Test connection**\. +3. Click **Create**\. The connection appears on the **Assets** page\. You can edit the connection by clicking the connection name on the **Assets** page\. +4. Add tables, files, or other types of data from the connection by [creating a connected data asset](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +Connections with personal credentials are marked with a key icon (![the key symbol for private connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/privatekey.png)) on the **Assets** page and are locked\. If you are authorized to access the connection, you can unlock it by entering your credentials the first time you select it\. This is a one\-time step that permanently unlocks the connection for you\. After you unlock the connection, the key icon is no longer displayed\. Connections with personal credentials are already unlocked if you created the connections yourself\. + +Watch this video to see how to create a connection and add connected data to a project\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + + + + * Transcript + + Synchronize transcript with video + + + + | Time | Transcript | + | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | 00:00 | This video shows you how to set up a connection to a data source and add connected data to a Watson Studio project. | + | 00:08 | If you have data stored in a data source, you can set up a connection to that data source from any project. | + | 00:16 | From here, you can add different elements to the project. | + | 00:20 | In this case, you want to add a connection. | + | 00:24 | You can create a new connection to an IBM service, such as IBM Db2 and Cloud Object Storage, or to a service from third parties, such as Amazon, Microsoft or Apache. | + | 00:39 | And you can filter the list based on compatible services. | + | 00:45 | You can also add a connection that was created at the platform level, which can be used across projects and catalogs. | + | 00:54 | Or you can create a connection to one of your provisioned IBM Cloud services. | + | 00:59 | In this case, select the provisioned IBM Cloud service for Db2 Warehouse on Cloud. | + | 01:08 | If the credentials are not prepopulated, you can get the credentials for the instance from the IBM Cloud service launch page. | + | 01:17 | First, test the connection and then create the connection. | + | 01:25 | The new connection now displays in the list of data assets. | + | 01:30 | Next, add connected data assets to this project. | + | 01:37 | Select the source - in this case, it's the Db2 Warehouse on Cloud connection just created. | + | 01:43 | Then select the schema and table. | + | 01:50 | You can see that this will add a reference to the data within this connection and include it in the target project. | + | 01:58 | Provide a name and a description and click "Create". | + | 02:06 | The data now displays in the list of data assets. | + | 02:09 | Open the data set to get a preview; and from here you can move directly into refining the data. | + | 02:17 | Find more videos in the Cloud Pak for Data as a Service documentation. | + + + + + +## Next step ## + +Go to [Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/asset_browser.html), and select the connection\. Drill down to a schema, and table or view\. + +## Learn more ## + + + + * [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html) + * [Integrations with other cloud platforms](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/int-cloud.html) + * [Controlling access to Cloud Object Storage buckets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/cos_buckets.html) + + + +**Parent topic**: [Adding data to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a82cb1ababcf08e9fd361f13050d47850af8768a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a82cb1ababcf08e9fd361f13050d47850af8768a.md new file mode 100644 index 0000000..36729fe --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a82cb1ababcf08e9fd361f13050d47850af8768a.md @@ -0,0 +1,19 @@ +# Specifying values and labels for continuous data (SPSS Modeler) + +# Specifying values and labels for continuous data # + +The Continuous measurement level is for numeric fields\. + +There are three storage types for continuous data: + + + + * Real + * Integer + * Date/Time + + + +The same settings are used to edit all continuous fields\. The storage type is displayed for reference only\. Select the desired field in the Type node settings and then click the gear icon at the end of its row\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a85e898f28ac27daa8961337a9b468004c1b8b21.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a85e898f28ac27daa8961337a9b468004c1b8b21.md new file mode 100644 index 0000000..56d0490 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a85e898f28ac27daa8961337a9b468004c1b8b21.md @@ -0,0 +1,155 @@ +# Planning for AI governance + +# Planning for AI governance # + +Plan how to use watsonx\.governance to accelerate responsible, transparent, and explainable AI workflows with an AI governance solution that provides end\-to\-end monitoring for machine learning and generative AI models\. + +## Governance capabilities ## + +Note:To govern metadata from foundation models, you must have watsonx\.ai provisioned\. + +Consider these watsonx\.governance capabilities as you plan your governance strategy: + + + + * Collect metadata in factsheets about machine learning models and prompt templates for large language models\. + * Customize the metadata facts that are captured in factsheets for machine learning and foundation models\. + * Monitor machine learning deployments for fairness, drift, and quality to ensure that your models are meeting specified standards\. + * Monitor foundation models for breaches of toxic language thresholds or detection of personal identifiable information\. + * Evaluate prompt templates with metrics designed to measure performance and to test for the presence of prohibited content, such as hateful speech\. + * Collect model health data including data size, latency, and throughput to help you assess performance issues and manage resource consumption\. + * Assign a single risk score to tracked models to indicate the relative impact of the associated model\. For example, a model that predicts sensitive information such as a credit score might be assigned a higher risk score than a model that projects ice cream sales\. + * Use the automated transaction analysis tools to improve transparency and explainability for your AI assets\. For example, see how a feature contributes to a prediction and test what\-if scenarios to explore different outcomes\. + + + +## Planning for governance ## + +Consider these governance strategies: + + + + * [Build your governance team](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-plan.html?context=cdpaas&locale=en#people) + * [Set up your governance structures](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-plan.html?context=cdpaas&locale=en#structure) + * [Manage collaboration with roles and access control](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-plan.html?context=cdpaas&locale=en#collab) + * [Develop a communication plan](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-plan.html?context=cdpaas&locale=en#communicate)\. + * [Implement a simple solution](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-plan.html?context=cdpaas&locale=en#simple) + * [Plan for more complex solutions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-plan.html?context=cdpaas&locale=en#complex) + + + +### Build a governance team ### + +Consider the expertise that you need on your governance team\. A typical governance plan might include the following roles\. In some cases, the same person might fill multiple roles\. In other cases, a role might represent a team of people\. + + + + * **Model owner**: The owner creates an AI use case to track a solution to a business need\. The owner requests the model or prompt template, manages the approval process, and tracks the solution through the AI Lifecycle\. + * **Model developer/Data scientist**: The developer works with the data in a data set or a large language model (LLM) and creates the machine learning model or LLM prompt template\. + * **Model validator**: the validator tests the solution to determine whether it meets the goals that are stated in the AI use case\. + * **Risk and compliance manager**: The risk manager determines the policies and compliance thresholds for the AI use case\. For example, the risk manager might determine the rules to apply for testing a solution for fairness or for screening output for hateful and abusive speech\. + * **MLOps engineer**: The MLOps engineer moves a solution from a pre\-production (test) environment, to a production environment when a solution is deemed ready to be fully deployed\. + * **App developer**: Following deployment, and app developer runs evaluations against the deployment to monitor how the solution performs against the metric threshold set by the risk and compliance owner\. If performance drops below specified thresholds, the app developer works with the other stakeholders to address problems and update the model or prompt template\. + + + +### Set up a governance structure ### + +After identifying roles and assembling a team, plan your governance structure\. + + + +1. Create an inventory for storing AI use cases\. An inventory is where you store and view AI use cases and the factsheets that are associated with the assets being governed\. Depending on your governance requirements, store all use cases in a single inventory, or create multiple inventories for your governance efforts\. +2. Create projects for collaboration\. If you are using IBM tools, create a Watson Studio project\. The project can hold the data that is required to train or test the AI solution and the model or prompt template being governed\. Use the access control to restrict access to the approved collaborators\. +3. Create a pre\-production deployment space\. Use the space to test your model or prompt template by using test data\. Like a project, a space provides access control features so you can include the required collaborators\. +4. Configure test and validation evaluations\. Provide the model or prompt template details and configure a set of evaluations to test the performance of your solution\. For example, you might test a machine learning model for dimensions such as fairness, quality, and drift, and test a prompt template against metrics such as perplexity (how accurate the output is), or toxicity (whether the output contains hateful or abusive speech\.) By testing on known (labeled) data, you can evaluate the performance before moving a solution to production\. +5. Configure a production space\. When the model or prompt template is ready to be deployed to a production environment, move the solution and all dependencies to a production space\. A production space typically has a tighter access control list\. +6. Configure evaluations for the deployed model\. Provide the model details and configure evaluations for the solution\. You now test against live data rather than test data\. It is important to monitor your solution so that you are alerted if thresholds are crossed, indicating a potential problem with the deployed solution\. + + + +### Manage collaboration for governance ### + +Watsonx\.governance is built on a collaborative platform to allow for all approved team members to contribute to the goals of solving business problems\. + +To plan for collaboration, consider how to manage access to the inventories, projects, and spaces you use for governance\. + +Use roles along with access control features to ensure that your team has appropriate access to meet goals\. + +### Develop a communication plan ### + +Some of the workflow around defining an AI use case and moving assets through the lifecycle rely on effective communication\. Decide how your team will communicate and establish the details\. For example,: + + + + * Will you use email for decision\-making or a messaging tool such as Slack? + * Is there a formal process for adding comments to an asset as it moves through a workflow? + + + +Create your communication plan and share it with your team\. + +### Implement a simple governance solution ### + +As you roll out your governance strategy, start with a simple implementation, then consider how to build incrementally to a more comprehensive solution\. The simplest implementation requires an AI use case in an inventory, with an asset moving from request to production\. + +For the most straightforward implementation of AI governance, you can use a IBM Knowledge Catalog to track and inventory models\. An AI use case in an inventory consists of a set of factsheets containing lineage, history, and other relevant information about a model's lifecycle\. A watsonx administrator must create an inventory and add data scientists, data engineers, and other users as collaborators\. + +![Inventories store factsheets with metadata about governed assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-simple.svg) + +AI use case owners can request and track assets: + + + + * Business users create AI use cases in the inventory to request machine\-learning models or LLM prompt templates\. + * Data scientists associate the trained asset with an AI use case to create AI factsheets\. + + + +AI factsheets accumulate information about the model or prompt templates in the following ways: + + + + * All actions that are associated with the tracked asset are automatically saved, including deployments and evaluations\. + * All changes to input data assets are automatically saved\. + * Data scientists can add tags, business terms, supporting documentation, and other information\. + * Data scientists can associate challenger models with the AI use cases to compare model performance\. + + + +Validators and other stakeholders review AI factsheets to ensure compliance and certify asset progress from development to production\. They can also generate reports from the factsheets to print, share, or archive details\. + +### Plan for more complex solutions ### + +You can extend your AI governance implementation at any time\. Consider these options to extend governance: + + + + * MLOps engineers can extend model tracking to include external models that are created with third\-party machine learning models\. + * MLOps engineers can add custom properties to factsheets to track more information\. + * Compliance analysts can customize the default report templates to generate tailored reports for the organization\. + * Record the results of IBM Watson OpenScale evaluations for fairness and other metrics as part of model tracking\. + + + +## Governing assets that are created locally or externally ## + +Watsonx\.governance provides the tools for you to govern assets you created using IBM tools, such as machine learning models created by using AutoAI or foundation model prompt templates created in a watsonx project\. You can also govern machine learning models that are created by using non\-IBM tools, such as Microsoft Azure or Amazon Web Services\. As you develop your governance plan, consider these differences: + + + + * IBM assets developed with tools such as Watson Studio are available for governance earlier in the lifecycle\. You can track the factsheet for a local asset from the Development phase, and have visibility into details such as the training data and creation details from an earlier stage\. + * An inventory owner or administrator must enable governance for external models\. + * When governance is enabled for external models, they can be added to an AI use case explicitly, or automatically, when they are evaluated with Watson OpenScale\. + + + +For a list of supported machine learning model providers, see [Supported machine learning providers in Watson OpenScale](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-frameworks-ovr.html)\. + +## Next steps ## + +To begin governance, follow the steps in [Provisioning and launching IBM watsonx\.governance](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-provision-launch.html) to provision Watson OpenScale with AI Factsheets\. + +**Parent topic:**[Watsonx\.governance overview](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a8a2d53661eb9ef173f7cc4794096a134123daca.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a8a2d53661eb9ef173f7cc4794096a134123daca.md new file mode 100644 index 0000000..b6648fc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a8a2d53661eb9ef173f7cc4794096a134123daca.md @@ -0,0 +1,592 @@ +# Entity extraction + +# Entity extraction # + +The Watson Natural Language Processing Entity extraction models extract entities from input text\. + +For details, on available extraction types, refer to these sections: + + + + * [Machine\-learning\-based extraction for general entities](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-entity-enhanced.html?context=cdpaas&locale=en#machine-learning-general) + * [Machine\-learning\-based extraction for PII entities](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-entity-enhanced.html?context=cdpaas&locale=en#machine-learning-pii) + * [Rule\-based extraction for general entities](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-entity-enhanced.html?context=cdpaas&locale=en#rule-based-general) + * [Rule\-based extraction for PII entities](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-entity-enhanced.html?context=cdpaas&locale=en#rule-based-pii) + + + +## Machine\-learning\-based extraction for general entities ## + +The machine\-learning\-based extraction models are trained on labeled data for the more complex entity types such as person, organization and location\. + +**Capabilities** + +The entity models extract entities from the input text\. The following types of entities are recognized: + + + + * Date + * Duration + * Facility + * Geographic feature + * Job title + * Location + * Measure + * Money + * Ordinal + * Organization + * Person + * Time + + + + + +Capabilities of machine\-learning\-based extraction based on an example + +| Capabilities | Examples | +| --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| Extracts entities from the input text\. | `IBM\'s CEO Arvind Krishna is based in the US` \-> `IBM\Organization` , `CEO\JobTitle`, `Arvind Krishna\Person`, `US\Location` | + + + +Available workflows and blocks differ, depending on the runtime used\. + + + +Blocks and workflows for handling general entities with their corresponding runtimes + +| Block or workflow name | Available in runtime | +| ---------------------------------------------------------------------------- | ------------------------------ | +| `entity-mentions_transformer-workflow_multilingual_slate.153m.distilled` | [Runtime 23\.1](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-entity-enhanced.html?context=cdpaas&locale=en#runtime-231) | +| `entity-mentions_transformer-workflow_multilingual_slate.153m.distilled-cpu` | [Runtime 23\.1](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-entity-enhanced.html?context=cdpaas&locale=en#runtime-231) | +| `entity-mentions_bert_multi_stock` | [Runtime 22\.2](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-entity-enhanced.html?context=cdpaas&locale=en#runtime-222) | + + + +### Machine\-learning\-based workflows for general entities in Runtime 23\.1 ### + +**Workflow names** + + + + * `entity-mentions_transformer-workflow_multilingual_slate.153m.distilled`: this workflow can be used on both CPUs and GPUs\. + * `entity-mentions_transformer-workflow_multilingual_slate.153m.distilled-cpu`: this workflow is optimized for CPU\-based runtimes\. + + + +**Supported languages** + +Entity extraction is available for the following languages\. + +For a list of the language codes and the corresponding language, see [Language codes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html#lang-codes): + +ar, cs, da, de, en, es, fi, fr, he, hi, it, ja, ko, nb, nl, nn, pt, ro, ru, sk, sv, tr, zh\-cn + +**Code sample** + + import watson_nlp + # Load the workflow model + entities_workflow = watson_nlp.load('entity-mentions_transformer-workflow_multilingual_slate.153m.distilled') + # Run the entity extraction workflow on the input text + entities = entities_workflow.run('IBM\'s CEO Arvind Krishna is based in the US', language_code="en") + print(entities.get_mention_pairs()) + +**Output of the code sample:** + + [('IBM', 'Organization'), ('CEO', 'JobTitle'), ('Arvind Krishna', 'Person'), ('US', 'Location')] + +### Machine\-learning\-based blocks for general entities in Runtime 22\.2 ### + +**Block names**`entity-mentions_bert_multi_stock` + +**Supported languages** + +Entity extraction is available for the following languages\. For a list of the language codes and the corresponding language, see [Language codes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html#lang-codes)\. + +ar, cs, da, de, en, es, fi, fr, he, hi, it, ja, ko, nb, nl, nn, pt, ro, ru, sk, sv, tr, zh\-cn + +**Dependencies on other blocks** + +The following block must run before you can run the Entity extraction block: + + + + * `syntax_izumo__stock` + + + +**Code sample** + + import watson_nlp + + # Load Syntax Model for English, and the multilingual BERT Entity model + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + bert_entity_model = watson_nlp.load('entity-mentions_bert_multi_stock') + + # Run the syntax model on the input text + syntax_prediction = syntax_model.run('IBM\'s CEO Arvind Krishna is based in the US') + + # Run the entity mention model on the result of syntax model + bert_entity_mentions = bert_entity_model.run(syntax_prediction) + print(bert_entity_mentions.get_mention_pairs()) + +**Output of the code sample:** + + [('IBM', 'Organization'), ('CEO', 'JobTitle'), ('Arvind Krishna', 'Person'), ('US', 'Location')] + +## Machine\-learning\-based extraction for PII entities ## + +**Block names**`entity-mentions_bilstm_en_pii` + + + +Blocks for handling Personal Identifiable Information (PII) entities with their corresponding runtimes + +| Block name | Available in runtime | +| ------------------------------- | ---------------------------- | +| `entity-mentions_bilstm_en_pii` | Runtime 22\.2, Runtime 23\.1 | + + + +The `entity-mentions_bilstm_en_pii` machine\-learning based extraction model is trained on labeled data for types *person* and *location*\. + +**Capabilities** + +The `entity-mentions_bilstm_en_pii` block recognizes the following types of entities: + + + +Entities extracted by the entity\-mentions\_bilstm\_en\_pii block + +| Entity type name | Description | Supported languages | +| ---------------- | ------------------------------------------------------------------------------------------------------------------ | ------------------- | +| Location | All geo\-political regions, continents, countries, and street names, states, provinces, cities, towns or islands\. | en | +| Person | Any being; living, nonliving, fictional or real\. | en | + + + +**Dependencies on other blocks** + +The following block must run before you can run the `entity-mentions_bilstm_en_pii` block: + + + + * `syntax_izumo_en_stock` + + + +**Code sample** + + import os + + import watson_nlp + + # Load Syntax and a Entity Mention BiLSTM model for English + + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + + entity_model = watson_nlp.load('entity-mentions_bilstm_en_pii') + + text = 'Denver is the capital of Colorado. The total estimated government spending in Colorado in fiscal year 2016 was $36.0 billion. IBM office is located in downtown Denver. Michael Hancock is the mayor of Denver.' + + # Run the syntax model on the input text + + syntax_prediction = syntax_model.run(text) + + # Run the entity mention model on the result of the syntax analysis + + entity_mentions = entity_model.run(syntax_prediction) + + print(entity_mentions) + +**Output of the code sample:** + + { + "mentions": [ + { + "span": { + "begin": 0, + "end": 6, + "text": "Denver" + }, + "type": "Location", + "producer_id": { + "name": "BiLSTM Entity Mentions", + "version": "1.0.0" + }, + "confidence": 0.6885626912117004, + "mention_type": "MENTT_UNSET", + "mention_class": "MENTC_UNSET", + "role": "" + }, + { + "span": { + "begin": 25, + "end": 33, + "text": "Colorado" + }, + "type": "Location", + "producer_id": { + "name": "BiLSTM Entity Mentions", + "version": "1.0.0" + }, + "confidence": 0.8509215116500854, + "mention_type": "MENTT_UNSET", + "mention_class": "MENTC_UNSET", + "role": "" + }, + { + "span": { + "begin": 78, + "end": 86, + "text": "Colorado" + }, + "type": "Location", + "producer_id": { + "name": "BiLSTM Entity Mentions", + "version": "1.0.0" + }, + "confidence": 0.9928259253501892, + "mention_type": "MENTT_UNSET", + "mention_class": "MENTC_UNSET", + "role": "" + }, + { + "span": { + "begin": 151, + "end": 166, + "text": "downtown Denver" + }, + "type": "Location", + "producer_id": { + "name": "BiLSTM Entity Mentions", + "version": "1.0.0" + }, + "confidence": 0.48378944396972656, + "mention_type": "MENTT_UNSET", + "mention_class": "MENTC_UNSET", + "role": "" + }, + { + "span": { + "begin": 168, + "end": 183, + "text": "Michael Hancock" + }, + "type": "Person", + "producer_id": { + "name": "BiLSTM Entity Mentions", + "version": "1.0.0" + }, + "confidence": 0.9972871541976929, + "mention_type": "MENTT_UNSET", + "mention_class": "MENTC_UNSET", + "role": "" + } + ], + "producer_id": { + "name": "BiLSTM Entity Mentions", + "version": "1.0.0" + } + } + +## Rule\-based extraction for general entities ## + +The rule\-based model `entity-mentions_rbr_xx_stock` identifies syntactically regular entities\. + +**Block name**`entity-mentions_rbr_xx_stock` + +**Capabilities** + +Rule\-based extraction handles syntactically regular entity types\. The entity block extract entities from the input text\. The following types of entities are recognized: + + + + * PhoneNumber + * EmailAddress + * Number + * Percent + * IPAddress + * HashTag + * TwitterHandle + * URLDate + + + + + +Capabilities of rule\-based extraction based on an example + +| Capabilities | Examples | +| ----------------------------------------------------------------- | ------------------------------------------------------------------- | +| Extracts syntactically regular entity types from the input text\. | `My email is john@us.ibm.com` \-> `john@us.ibm.com\EmailAddress` | + + + +**Supported languages** + +Entity extraction is available for the following languages\. For a list of the language codes and the corresponding language, see [Language codes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html#lang-codes)\. + +ar, cs, da, de, en, es, fi, fr, he, hi, it, ja, ko, nb, nl, nn, pt, ro, ru, sk, sv, tr, zh\-cn, zh\-tw + +**Dependencies on other blocks** + +None + +**Code sample** + + import watson_nlp + + # Load a rule-based Entity Mention model for English + rbr_entity_model = watson_nlp.load('entity-mentions_rbr_en_stock') + + # Run the entity model on the input text + rbr_entity_mentions = rbr_entity_model.run('My email is john@us.ibm.com') + print(rbr_entity_mentions) + +Output of the code sample: + + { + "mentions": [ + { + "span": { + "begin": 12, + "end": 27, + "text": "john@us.ibm.com" + }, + "type": "EmailAddress", + "producer_id": { + "name": "RBR mentions", + "version": "0.0.1" + }, + "confidence": 0.8, + "mention_type": "MENTT_UNSET", + "mention_class": "MENTC_UNSET", + "role": "" + } + ], + "producer_id": { + "name": "RBR mentions", + "version": "0.0.1" + } + } + +## Rule\-based extraction for PII entities ## + +The rule\-based model `entity-mentions_rbr_multi_pii` handles the majority of the types by identifying common formats of PII entities and performing possible checksum or validations as appropriate for each entity type\. For example, credit card number candidates are validated using the Luhn algorithm\. + +**Block name**`entity-mentions_rbr_multi_pii` + +**Capabilities** + +The entity block `entity-mentions_rbr_multi_pii` recognizes the following types of entities: + + + +Entities extracted by the entity\-mentions\_rbr\_multi\_pii block + +| Entity type name | Description | Supported languages | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------- | +| BankAccountNumber\.CreditCardNumber\.Amex | Credit card number for card types AMEX (15 digits)\. Checked through the Luhn algorithm\. | All | +| BankAccountNumber\.CreditCardNumber\.Master | Credit card number for card types Master card (16 digits)\. Checked through the Luhn algorithm\. | All | +| BankAccountNumber\.CreditCardNumber\.Other | Credit card number for left\-over category of other types\. Checked through the Luhn algorithm\. | All | +| BankAccountNumber\.CreditCardNumber\.Visa | Credit card number for card types VISA (16 to 19 digits)\. Checked through the Luhn algorithm\. | All | +| EmailAddress | Email addresses, for example: john@gmail\.com | ar, cs, da, de, en, es, fi, fr, he, hi, it, ja, ko, nb, nl, nn, pl, pt, ro, ru, sk, sv, tr, zh\-cn | +| IPAddress | IPv4 and IPv6 addresses, for example, `10.142.250.123` | ar, cs, da, de, en, es, fi, fr, he, hi, it, ja, ko, nb, nl, nn, pl, pt, ro, ru, sk, sv, tr, zh\-cn | +| `PhoneNumber` | Any specific phone number, for example, 0511\-123\-456 | ar, cs, da, de, en, es, fi, fr, he, hi, it, ja, ko, nb, nl, nn, pl, pt, ro, ru, sk, sv, tr, zh\-cn | + + + +Some PII entity type names are country\-specific\. The `_` in the following entity types is a placeholder for a country code\. + + + + * `BankAccountNumber.BBAN._` : These are more variable national bank account numbers and the extraction is mostly language\-specific without a general checksum algorithm\. + * `BankAccountNumber.IBAN._` : Highly standardized IBANs are supported in a language\-independent way and with a checksum algorithm\. + * `NationalNumber.NationalID._`: These national IDs don’t have a (published) checksum algorithm, and are being extracted on a language\-specific basis\. + * `NationalNumber.Passport._` : Checksums are implemented only for the countries where a checksum algorithm exists\. These are specifically extracted language with additional context restrictions\. + * `NationalNumber.TaxID._` : These IDs don't have a (published) checksum algorithm, and are being extracted on a language\-specific basis\. + + + +Which entity types are available for which languages and which country code to use is listed in the following table\. + + + +Country\-specific PII entity types + +| Country | Entity Type Name | Description | Supported Languages | +| ---------------------------------------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | ------------------- | +| Austria | `BankAccountNumber.BBAN.AT` | Basic bank account number | de | +| | `BankAccountNumber.IBAN.AT` | International bank account number | all | +| | `NationalNumber.Passport.AT` | Passport number | de | +| | `NationalNumber.TaxID.AT` | Tax identification number | de | +| Belgium | `BankAccountNumber.BBAN.BE` | Basic bank account number | fr, nl | +| | `BankAccountNumber.IBAN.BE` | International bank account number | all | +| | `NationalNumber.NationalID.BE` | National identification number | fr, nl | +| | `NationalNumber.Passport.BE` | Passport number | fr, nl | +| Bulgaria | `BankAccountNumber.BBAN.BG` | Basic bank account number | bg | +| | `BankAccountNumber.IBAN.BG` | International bank account number | all | +| | `NationalNumber.NationalID.BG` | National identification number | bg | +| Canada | `NationalNumber.SocialInsuranceNumber.CA` | Social insurance number\. Checksum algorithm is implemented\. | en, fr | +| Croatia | `BankAccountNumber.BBAN.HR` | Basic bank account number | hr | +| | `BankAccountNumber.IBAN.HR` | International bank account number | all | +| | `NationalNumber.NationalID.HR` | National identification number | hr | +| | `NationalNumber.TaxID.HR` | Tax identification number | hr | +| Cyprus | `BankAccountNumber.BBAN.CY` | Basic bank account number | el | +| | `BankAccountNumber.IBAN.CY` | International bank account number | all | +| | `NationalNumber.TaxID.CY` | Tax identification number | el | +| Czechia | `BankAccountNumber.BBAN.CZ` | Basic bank account number | cs | +| | `BankAccountNumber.IBAN.CZ` | International bank account number | cs | +| | `NationalNumber.NationalID.CZ` | National identification number | cs | +| | `NationalNumber.TaxID.CZ` | Tax identification number | cs | +| Denmark | `BankAccountNumber.BBAN.DK` | Basic bank account number | da | +| | `BankAccountNumber.IBAN.DK` | International bank account number | all | +| | `NationalNumber.NationalID.DK` | National identification number | da | +| Estonia | `BankAccountNumber.BBAN.EE` | Basic bank account number | et | +| | `BankAccountNumber.IBAN.EE` | International bank account number | all | +| | `NationalNumber.NationalID.EE` | National identification number | et | +| Finland | `BankAccountNumber.BBAN.FI` | Basic bank account number | fi | +| | `BankAccountNumber.IBAN.FI` | International bank account number | all | +| | `NationalNumber.NationalID.FI` | National identification number | fi | +| | `NationalNumber.Passport.FI` | Passport number | fi | +| France | `BankAccountNumber.BBAN.FR` | Basic bank account number | fr | +| | `BankAccountNumber.IBAN.FR` | International bank account number | all | +| | `NationalNumber.Passport.FR` | Passport number | fr | +| | `NationalNumber.SocialInsuranceNumber.FR` | Social insurance number\. Checksum algorithm is implemented\. | fr | +| Germany | `BankAccountNumber.BBAN.DE` | Basic bank aAccount number | de | +| | `BankAccountNumber.IBAN.DE` | International bank account number | all | +| | `NationalNumber.Passport.DE` | Passport number | de | +| | `NationalNumber.SocialInsuranceNumber.DE` | Social insurance number\. Checksum algorithm is implemented\. | de | +| Greece | `BankAccountNumber.BBAN.GR` | Basic bank account number | el | +| | `BankAccountNumber.IBAN.GR` | International bank account number | all | +| | `NationalNumber.Passport.GR` | Passport number | el | +| | `NationalNumber.TaxID.GR` | Tax identification number | el | +| | `NationalNumber.NationalID.GR` | National ID number | el | +| Hungary | `BankAccountNumber.BBAN.HU` | Basic bank account number | hu | +| | `BankAccountNumber.IBAN.HU` | International bank account number | all | +| | `NationalNumber.NationalID.HU` | National identification number | hu | +| | `NationalNumber.TaxID.HU` | Tax identification number | hu | +| Iceland | `BankAccountNumber.BBAN.IS` | Basic bank account number | is | +| | `BankAccountNumber.IBAN.IS` | International bank account number | all | +| | `NationalNumber.NationalID.IS` | National identification number | is | +| Ireland | `BankAccountNumber.BBAN.IE` | Basic bank account number | en | +| | `BankAccountNumber.IBAN.IE` | International bank account number | all | +| | `NationalNumber.NationalID.IE` | National identification number | en | +| | `NationalNumber.Passport.IE` | Passport number | en | +| | `NationalNumber.TaxID.IE` | Tax identification number | en | +| Italy | `BankAccountNumber.BBAN.IT` | Basic bank account number | it | +| | `BankAccountNumber.IBAN.IT` | International bank account number | all | +| | `NationalNumber.NationalID.IT` | National identification number | it | +| | `NationalNumber.Passport.IT` | Passport number | it | +| Latvia | `BankAccountNumber.BBAN.LV` | Basic bank account number | lv | +| | `BankAccountNumber.IBAN.LV` | International bank account number | all | +| | `NationalNumber.NationalID.LV` | National identification number | lv | +| Liechtenstein | `BankAccountNumber.BBAN.LI` | Basic bank account number | de | +| | `BankAccountNumber.IBAN.LI` | International bank account number | all | +| Lithuania | `BankAccountNumber.BBAN.LT` | Basic bank account number | lt | +| | `BankAccountNumber.IBAN.LT` | International bank account number | all | +| | `NationalNumber.NationalID.LT` | National identification number | lt | +| Luxembourg | `BankAccountNumber.BBAN.LU` | Basic bank account number | de, fr | +| | `BankAccountNumber.IBAN.LU` | International bank account number | all | +| | `NationalNumber.TaxID.LU` | Tax identification number | de, fr | +| Malta | `BankAccountNumber.BBAN.MT` | Basic bank account number | mt | +| | `BankAccountNumber.IBAN.MT` | International bank account number | all | +| Netherlands | `BankAccountNumber.BBAN.NL` | Basic bank account number | nl | +| | `BankAccountNumber.IBAN.NL` | International bank account number | all | +| | `NationalNumber.NationalID.NL` | National identification number | nl | +| | `NationalNumber.Passport.NL` | Passport number | nl | +| Norway | `BankAccountNumber.BBAN.NO` | Basic bank account number | no | +| | `BankAccountNumber.IBAN.NO` | International bank account number | all | +| | `NationalNumber.NationalID.NO` | National identification number | no | +| | `NationalNumber.NationalID.NO.Old` | National identification number old | no | +| | `NationalNumber.Passport.NO` | Passport number | no | +| Poland | `BankAccountNumber.BBAN.PL` | Basic bank account number | pl | +| | `BankAccountNumber.IBAN.PL` | International bank account number | all | +| | `NationalNumber.NationalID.PL` | National identification number | pl | +| | `NationalNumber.Passport.PL` | Passport number | pl | +| | `NationalNumber.TaxID.PL` | Tax identification number | pl | +| Portugal | `BankAccountNumber.IBAN.PT` | International bank account number | all | +| | `BankAccountNumber.BBAN.PT` | Basic bank account number | pt | +| | `NationalNumber.NationalID.PT` | National identification number | pt | +| | `NationalNumber.NationalID.PT.Old` | National identification number, obsolete format | pt | +| | `NationalNumber.TaxID.PT` | Tax identification number | pt | +| Romania | `BankAccountNumber.BBAN.RO` | Basic bank account number | ro | +| | `BankAccountNumber.IBAN.RO` | International bank account number | all | +| | `NationalNumber.NationalID.RO` | National identification number | ro | +| | `NationalNumber.TaxID.RO` | Tax identification number | ro | +| Slovakia | `BankAccountNumber.IBAN.SK` | International bank account number | all | +| | `BankAccountNumber.BBAN.SK` | Basic bank account number | sk | +| | `NationalNumber.TaxID.SK` | Tax identification number | sk | +| | `NationalNumber.NationalID.SK` | National identification number | sk | +| Slovenia | `BankAccountNumber.IBAN.SI` | International bank account number | all | +| Spain | `BankAccountNumber.IBAN.ES` | International bank account number | all | +| | `BankAccountNumber.BBAN.ES` | Basic bank account number | es | +| | `NationalNumber.NationalID.ES` | National identification number | es | +| | `NationalNumber.Passport.ES` | Passport number | es | +| | `NationalNumber.TaxID.ES` | Tax identification number | es | +| Sweden | `BankAccountNumber.IBAN.SE` | International bank account number | all | +| | `BankAccountNumber.BBAN.SE` | Basic bank account number | sv | +| | `NationalNumber.NationalID.SE` | National identification number | sv | +| | `NationalNumber.Passport.SE` | Passport number | sv | +| Switzerland | `BankAccountNumber.IBAN.CH` | International bank account number | all | +| | `BankAccountNumber.BBAN.CH` | Basic bank account number | de, fr, it | +| | `NationalNumber.NationalID.CH` | National identification number | de, fr, it | +| | `NationalNumber.Passport.CH` | Passport number | de, fr, it | +| | `NationalNumber.NationalID.CH.Old` | National identification number, obsolete format | de, fr, it | +| United Kingdom of Great Britain and Northern Ireland | `BankAccountNumber.IBAN.GB` | International bank account number | all | +| | `NationalNumber.SocialSecurityNumber.GB.NHS` | National Health Service number | all | +| | `NationalNumber.SocialSecurityNumber.GB.NINO` | National Social Security Insurance number | all | +| | `NationalNumber.NationalID.GB.Old` | National ID number, obsolete format | all | +| | `NationalNumber.Passport.GB` | Passport Number\. Checksum algorithm is not implemented and hence come with additional context restrictions\. | all | +| United States | `NationalNumber.SocialSecurityNumber.US` | Social Security number\. Checksum algorithm is not implemented and hence come with additional context restrictions\. | en | +| | `NationalNumber.Passport.US` | Passport Number\. Checksum algorithm is not implemented and hence come with additional context restrictions\. | en | + + + +**Dependencies on other blocks** + +None + +**Code sample** + + import watson_nlp + + # Load the RBR PII model. Note that this is a multilingual model supporting multiple languages. + rbr_entity_model = watson_nlp.load('entity-mentions_rbr_multi_pii') + + # Run the RBR model. Note that language code of the input text is passed as a parameter to the run method. + rbr_entity_mentions = rbr_entity_model.run('Please find my credit card number here: 378282246310005. Thanks for the payment.', language_code='en') + print(rbr_entity_mentions) + +Output of the code sample: + + { + "mentions": [ + { + "span": { + "begin": 40, + "end": 55, + "text": "378282246310005" + }, + "type": "BankAccountNumber.CreditCardNumber.Amex", + "producer_id": { + "name": "RBR mentions", + "version": "0.0.1" + }, + "confidence": 0.8, + "mention_type": "MENTT_UNSET", + "mention_class": "MENTC_UNSET", + "role": "" + } + ], + "producer_id": { + "name": "RBR mentions", + "version": "0.0.1" + } + } + +**Parent topic:**[Watson Natural Language Processing task catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a957adc1e11b5dc6aa15dc17ef6293c40f89fc20.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a957adc1e11b5dc6aa15dc17ef6293c40f89fc20.md new file mode 100644 index 0000000..58e1249 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a957adc1e11b5dc6aa15dc17ef6293c40f89fc20.md @@ -0,0 +1,67 @@ +# Deployments dashboard + +# Deployments dashboard # + +The deployments dashboard provides an aggregate view of deployment activity available to you, across spaces\. You can get a broad view of deployment activity such as the status of job runs or a list of online deployments\. You can also use filters and views to focus on specific job runs or category of runs such as failed runs\. ModelOps or DevOps users can review and monitor the activity for an organization\. + +## Accessing the Deployments dashboard ## + +From the navigation menu, click **Deployments**\. If you don't have any deployment spaces, you are prompted to create a space\. This following illustration shows an example of the Deployments dashboard: + +![Deployments dashboard](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/deployment-dashboard.png) + +The dashboard view has two tabs: + + + + * [**Activity**](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/operator-view.html?context=cdpaas&locale=en#activity): Use the **Activity** tab to review all of the deployment activity across spaces\. You can sort and filter this view to focus on a particular type of activity, such as failed deployments, or jobs with active runs\. You can also review metrics such as the number of deployment spaces with active deployments\. + * [**Spaces**](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/operator-view.html?context=cdpaas&locale=en#spaces): Use the **Spaces** tab to list all the spaces that you can access\. You can read the overview information, such as the number of deployments and job runs in a space, or click a space name to view details and create deployments or jobs\. + + + +## Viewing activity ## + +View the overview information for finished runs, active runs, or online deployments, or drill down to view details\. + +### Finished runs ### + +The **Finished runs** section shows activity in jobs over a specified time interval\. The default is to view finished jobs for the last 8 hours\. It shows jobs that are completed, canceled, or failed across all of your deployment spaces within the specified time frame\. Click **View finished runs** to view a list of runs\. + +The view provides more detail on the finished runs and a visualization that shows run times\. + +![Viewing detail for finished jobs](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/operator-view3.png) + +Filter the view to focus on a particular type of activity: + +![Filtering job detail](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/operator-view4.png) + + + + * **Jobs with active runs** \- Shows jobs that have active runs (running, started, or queued) across all spaces you can access\. + * **Active runs** \- Shows runs that are in the running, started, or queued state across all jobs you can access\. + * **Jobs with finished runs** \- Shows jobs with runs that are completed, canceled, or failed\. + * **Finished runs** \- Shows runs that are completed, canceled, or failed\. + + + +### Active runs ### + +The **Active runs** section displays runs that are currently running or are in the starting or queued state\. Click **View active runs** to view a list of the runs\. + +### Online deployments ### + +The **Deployments** section shows all online and R\-Shiny deployments, which are sorted into categories for by status\. Click **View deployments** to view the list of deployments that you can access\. + +From any view, you can start from the overview and drill down to see the details for a particular job or run\. You can also filter the view to focus on a particular type of deployment\. + +## Viewing spaces ## + +View a list of spaces that you can access, with overview information such as number of deployments and collaborators\. Click the name of a space to view details or add assets, and to create new deployments or jobs\. Use *filters* to modify the view from the default list of all spaces to show **Active spaces**, with deployments or jobs, or **Inactive spaces**, with no deployments or jobs\. + +## Next steps ## + +[Use spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html) to organize your deployment activity\. + +**Parent topic:**[Deploying and managing models and functions](https://dataplatform.cloud.ibm.com/docs/content/wsj/wmls/wmls-deploy-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a967430da16338281405cf73a802c233911b6a13.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a967430da16338281405cf73a802c233911b6a13.md new file mode 100644 index 0000000..fcecf26 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a967430da16338281405cf73a802c233911b6a13.md @@ -0,0 +1,27 @@ +# Type node (SPSS Modeler) + +# Type node # + +You can specify field properties in a Type node\. + +The following main properties are available\. + + + + * Field\. Specify value and field labels for data in watsonx\.ai\. For example, field metadata imported from a data asset can be viewed or modified here\. Similarly, you can create new labels for fields and their values\. + * Measure\. This is the measurement level, used to describe characteristics of the data in a given field\. If all the details of a field are known, it's called fully instantiated\. Note: The measurement level of a field is different from its storage type, which indicates whether the data is stored as strings, integers, real numbers, dates, times, timestamps, or lists\. + * Role\. Used to tell modeling nodes whether fields will be Input (predictor fields) or Target (predicted fields) for a machine\-learning process\. Both and None are also available roles, along with Partition, which indicates a field used to partition records into separate samples for training, testing, and validation\. The value Split specifies that separate models will be built for each possible value of the field\. + * Value mode\. Use this column to specify options for reading data values from the dataset, or use the Specify option to specify measurement levels and values\. + * Values\. With this column, you can specify options for reading data values from the data set, or specify measurement levels and values separately\. You can also choose to pass fields without reading their values\. You can't amend the cell in this column if the corresponding Field entry contains a list\. + * Check\. With this column, you can set options to ensure that field values conform to the specified values or ranges\. You can't amend the cell in this column if the corresponding Field entry contains a list\. + + + +Click the Edit (gear) icon next to each row to open additional options\. + +Tip: Icons in the Type node properties quickly indicate the data type of each field, such as string, date, double integer, or hashtag\. + +Figure 1\. New Type node icons + +![New Type node icons](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/spss_typenode_icons.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a99d0a49cdc1c3c38eff43a6b1b51b0a177e5573.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a99d0a49cdc1c3c38eff43a6b1b51b0a177e5573.md new file mode 100644 index 0000000..42eeb49 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a99d0a49cdc1c3c38eff43a6b1b51b0a177e5573.md @@ -0,0 +1,87 @@ +# Libraries and scripts for notebooks + +# Libraries and scripts for notebooks # + +Watson Studio includes a large selection of preinstalled open source libraries for Python and R in its runtime environments\. You can also use preinstalled IBM libraries or install custom libraries\. + +Watson Studio includes the following libraries and the appropriate runtime environments with which you can expand your data analysis: + + + + * The Watson Natural Language Processing library in Python and Python with GPU runtime environments\. + * The gespatio\-temporal library in Spark with Python runtime environments + * The Xskipper library for data skipping uses the open source in Spark with Python runtime environments + * Parquet encryption in Spark with Python runtime environments + * The tspy library for time series analysis in Spark with Python runtime environments + + + +## Listing installed libraries ## + +Many of your favorite open source libraries are pre\-installed on runtime environments\. All you have to do is import them\. See [Import preinstalled libraries and packages](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/libraries.html?context=cdpaas&locale=en#import-lib)\. + +If a library is not preinstalled, you can add it: + + + + * Through the notebook + + Some libraries require a kernel restart after a version change. If you need to work with a library version that isn't pre-installed in the environment in which you start the notebook, and you install this library version through the notebook, the notebook only runs successfully after you restart the kernel. + + Note that when you run the notebook non-interactively, for example as a notebook job, it fails because the kernel can't be restarted. + * By adding a customization to the environment in which the notebook runs + + If you add a library with a particular version to the software customization, the library is preinstalled at the time the environment is started and no kernel restart is required. Also, if the notebook is run in a scheduled job, it won't fail. + + The advantage of adding an environment customization is that the library is preinstalled each time the environment runtime is started. Libraries that you add through a notebook are persisted for the lifetime of the runtime only. If the runtime is stopped and later restarted, those libraries are not installed. + + + +To see the list of installed libraries in your environment runtime: + + + +1. From the **Manage** tab, on the project's **Environments** page, select the environment template\. +2. From a notebook, run the appropriate command from a notebook cell: + + + + * Python: `!pip list --isolated` + * R: `installed.packages()` + + + +3. Optional: Add custom libraries and packages to the environment\. See [customizing an environment template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/customize-envs.html)\. + + + +## Importing an installed library ## + +To import an installed library into your notebook, run the appropriate command from a notebook cell with the library name: + + + + * Python: `import library_name` + * R: `library(library_name)` + + + +Alternatively, you can write a script that includes multiple classes and methods and then [import the script into your notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/add-script-to-notebook.html)\. + +## Learn more ## + + + + * [Installing custom libraries](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/install-cust-lib.html) + * [Importing scripts into a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/add-script-to-notebook.html) + * [Watson Natural Language Processing library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp.html) + * [gespatio\-temporal library for location analysis](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/geo-spatial-lib.html) + * [Xskipper library for data skipping](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-skipping-spark-sql.html) + * [Parquet encryption](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/parquet-encryption.html) + * [tspy library for time series analysis](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-lib.html) + + + +**Parent topic:**[Notebooks and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebooks-and-scripts.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a9e9d62e92156cebc0d4619cde322af48cace913.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a9e9d62e92156cebc0d4619cde322af48cace913.md new file mode 100644 index 0000000..3cbb6ea --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a9e9d62e92156cebc0d4619cde322af48cace913.md @@ -0,0 +1,20 @@ +# LSVM node (SPSS Modeler) + +# LSVM node # + +With the LSVM node, you can use a linear support vector machine to classify data\. LSVM is particularly suited for use with wide datasets\-\-that is, those with a large number of predictor fields\. You can use the default settings on the node to produce a basic model relatively quickly, or you can use the build options to experiment with different settings\. + +The LSVM node is similar to the SVM node, but it is linear and is better at handling a large number of records\. + +After the model is built, you can: + + + + * Browse the model nugget to display the relative importance of the input fields in building the model\. + * Append a Table node to the model nugget to view the model output\. + + + +Example\. A medical researcher has obtained a dataset containing characteristics of a number of human cell samples extracted from patients who were believed to be at risk of developing cancer\. Analysis of the original data showed that many of the characteristics differed significantly between benign and malignant samples\. The researcher wants to develop an LSVM model that can use the values of similar cell characteristics in samples from other patients to give an early indication of whether their samples might be benign or malignant\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a9fa1d31f4cc6018daf5b927908210846b082675.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a9fa1d31f4cc6018daf5b927908210846b082675.md new file mode 100644 index 0000000..1bbc6ee --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/a9fa1d31f4cc6018daf5b927908210846b082675.md @@ -0,0 +1,7 @@ +# Import nodes (SPSS Modeler) + +# Import # + +Use Import nodes to import data stored in various formats, or to generate your own synthetic data\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aa1c79d72d6a7d37ce1e72735b6dcfca2b546dce.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aa1c79d72d6a7d37ce1e72735b6dcfca2b546dce.md new file mode 100644 index 0000000..347d82e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aa1c79d72d6a7d37ce1e72735b6dcfca2b546dce.md @@ -0,0 +1,34 @@ +# Browsing the model (SPSS Modeler) + +# Browsing the model # + + + +1. Right\-click the model nugget and select View Model\. The initial view shows the estimated accuracy of the predictions for each offer\. You can also click Predictor Importance to see the relative importance of each predictor in estimating the model, or click Association With Response to show the correlation of each predictor with the target variable\. +2. To switch between each of the four offers for which there are prediction, use the View drop\-down\. + + Figure 1. SLRM model nugget + + ![SLRM model nugget](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_selflearn_nugget.png) +3. Return to the flow\. +4. Disconnect the Data Asset node that points to pm\_customer\_train1\.csv\. +5. Add a new Data Asset node that points to pm\_customer\_train2\.csv and connect it to the Filler node\. +6. Double\-click the SLRM node and select Continue training existing model (under BUILD OPTIONS)\. Click Save\. +7. Run the flow to regenerate the model nugget\. Then right\-click it and select View Model\. The model now shows the revised estimates of accuracy of the predictions for each offer\. +8. Add a new Data Asset node that points to pm\_customer\_train3\.csv and connect it to the Filler node +9. Run the flow again, then right\-click the model nugget and select View Model\. + + The model now shows the final estimated accuracy of the predictions for each offer. As you can see, the average accuracy fell slightly as you added the additional data sources. However, this fluctuation is a minimal amount and may be attributed to slight anomalies within the available data. +10. Attach a Table node to the generated model nugget, then right\-click the Table node and run it\. In the Outputs pane, open the table output that was just generated\.The predictions in the table show which offers a customer is most likely to accept and the confidence that they'll accept, depending on each customer's details\. For example, in the first row, there's only a 13\.2% confidence rating (denoted by the value `0.132` in the `$SC-campaign-1` column) that a customer who previously took out a car loan will accept a pension if offered one\. However, the second and third lines show two more customers who also took out a car loan; in their cases, there is a 95\.7% confidence that they, and other customers with similar histories, would open a savings account if offered one, and over 80% confidence that they would accept a pension\. + + Figure 2. Model output - predicted offers and confidences + + ![Model output - predicted offers and confidences](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_selflearn_table.png) + + Explanations of the mathematical foundations of the modeling methods used in SPSS Modeler are available in the [SPSS Modeler Algorithms Guide](http://public.dhe.ibm.com/software/analytics/spss/documentation/modeler/new/AlgorithmsGuide.pdf). + + Note that these results are based on the training data only. To assess how well the model generalizes to other data in the real world, you would use a Partition node to hold out a subset of records for purposes of testing and validation. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aa213d259727545c26401ad5cfb4916b6efbd18d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aa213d259727545c26401ad5cfb4916b6efbd18d.md new file mode 100644 index 0000000..cfd6f17 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aa213d259727545c26401ad5cfb4916b6efbd18d.md @@ -0,0 +1,87 @@ +# Profiles of data assets + +# Profiles of data assets # + +An asset profile includes generated information and statistics about the asset content\. You can see the profile on an asset's **Profile** page\. + + + + * [Requirements and restrictions](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/profile.html?context=cdpaas&locale=en#prereqs) + * [Creating a profile](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/profile.html?context=cdpaas&locale=en#create-profile) + * [Profile information](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/profile.html?context=cdpaas&locale=en#profile-results) + + + +## Requirements and restrictions ## + +You can view the profile of assets under the following circumstances\. + +**Required permissions** +: To view a data asset's **Profile** page, you can have any role in a project or catalog\. : To create or update a profile, you must have the **Admin** or **Editor** role in the project or catalog\. + +**Workspaces** +: You can view the asset profile in projects\. + +**Types of assets** +: These types of assets have a profile: + + + + * Data assets from relational or nonrelational databases from a connection to the data sources, except Cloudant + * Data assets from partitioned data sets, where a partitioned data set consists of multiple files and is represented by a single folder uploaded from the local file system or from file\-based connections to the data sources + * Data assets from files uploaded from the local file system or from file\-based connections to the data sources, with these formats: + + + + * CSV + * XLS, XLSM, XLSX (Only the first sheet in a workbook is profiled.) + * TSV + * Avro + * Parquet + + + + However, structured data files are not profiled when data assets do not explicitly reference them, such as in these circumstances: + + + + * The files are within a connected folder asset. Files that are accessible from a connected folder asset are not treated as assets and are not profiled. + * The files are within an archive file. The archive file is referenced by the data asset and the compressed files are not profiled. + + + + + +## Creating a profile ## + +In projects, you can create a profile for a data asset by clicking **Create profile**\. You can update an existing profile when the data changes\. + +## Profiling results ## + +When you create or update an asset profile, the columns in the data asset are analyzed\. By default, the profile is created based on the first 5,000 rows of data\. If the data asset has more than 250 columns, the profile is created based on the first 1,000 rows of data\. + +The profile of a data asset shows information about each column in the data set: + + + + * When was the profile created or last updated\. + * How many columns and rows were analyzed\. + * The data types for columns and data types distribution\. + * The data formats for columns and formats distribution\. + * The percentage of matching, mismatching, or missing data for each column\. + * The frequency distribution for all values identified in a column\. + * Statistics about the data for each column: + + + + * The number of *distinct* values indicates how many different values exist in the sampled data for the column. + * The percentage of *unique* values indicates the percentage of distinct values that appear only once in the column. + * The minimum, maximum, or mean, and sometimes the standard deviation in that column. Depending on a column’s data format, the statistics vary slightly. For example, statistics for a column of data type integer have minimum, maximum, and mean values and a standard deviation value while statistics for a column of data type string have minimum length, maximum length, and mean length values. + + + + + +**Parent topic:**[Asset types and properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aac63365f37f6b307ba343f45706e388d24245d4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aac63365f37f6b307ba343f45706e388d24245d4.md new file mode 100644 index 0000000..50abdf6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aac63365f37f6b307ba343f45706e388d24245d4.md @@ -0,0 +1,184 @@ +# Network security + +# Network security # + +IBM watsonx provides network security mechanisms to protect infrastructure, data, and applications from potential threats and unauthorized access\. Network security mechanisms provide secure connections to data sources and control traffic across both the public internet and internal networks\. + + + +Table 1\. Network security mechanisms for IBM watsonx + +| Mechanism | Purpose | Responsibility | Configured on | +| ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------------- | -------------------------- | +| [Private network service endpoints](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html?context=cdpaas&locale=en#private-network-service-endpoints) | Access services through secure private network endpoints | Customer | IBM Cloud | +| [Access to private data sources](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html?context=cdpaas&locale=en#access-to-private-data-sources) | Connect to data sources that are protected by a firewall | Customer | IBM watsonx | +| [Integrations](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html?context=cdpaas&locale=en#integrations) | Secure connections to Third\-party clouds through a firewall | Customer and Third\-party clouds | IBM watsonx | +| [Connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html?context=cdpaas&locale=en#connections) | Secure connections to data sources | Customer | IBM watsonx | +| [Connections to data behind a firewall](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html?context=cdpaas&locale=en#secure) | The Satellite Connector and Satellite location provide secure connections to data sources in a hybrid environment | Customer | IBM Cloud and IBM watsonx | +| [VPNs](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html?context=cdpaas&locale=en#vpns) | Share data securely across public networks | Customer | IBM Cloud | +| [Allow specific IP addresses](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html?context=cdpaas&locale=en#allow-specific-ip-addresses) | Protect from access by unknown IP addresses | Customer | IBM Cloud | +| [Allow third party URLs](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html?context=cdpaas&locale=en#thirdpartyurls) | Allow third party URLs on an internal network | Customer | Customer firewall | +| [Multi\-tenancy](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html?context=cdpaas&locale=en#multi-tenancy) | Provide isolation in a SaaS environment | IBM and Third\-party clouds | IBM Cloud, Cloud providers | + + + +## Private network service endpoints ## + +Use private network service endpoints to securely connect to endpoints over IBM private cloud, rather than connecting to resources over the public network\. With Private network service endpoints, services are no longer served on an internet routable IP address and thus are more secure\. Service endpoints require virtual routing and forwarding (VRF) to be enabled on your account\. VRF is automatically enabled for Virtual Private Clouds (VPCs)\. + +For more information about service endpoints, see: + + + + * [Securing connections to services with private service endpoints](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/endpoints-vrf.html?audience=wdp) + * [Blog: Introducing Private Service Endpoints in IBM Cloud Databases](https://www.ibm.com/cloud/blog/introducing-private-service-endpoints-in-ibm-cloud-databases?mhsrc=ibmsearch_a&mhq=private%20cloud%20endpoints) + * [IBM Cloud docs: Secure access to services using service endpoints](https://cloud.ibm.com/docs/account?topic=account-service-endpoints-overview) + * [IBM Cloud docs: Enabling VRF and service endpoints](https://cloud.ibm.com/docs/account?topic=account-vrf-service-endpoint) + * [IBM Cloud docs: Public and private network endpoints](https://cloud.ibm.com/docs/watson?topic=watson-public-private-endpoints&mhsrc=ibmsearch_a&mhq=public%20cloud%20endpoints) + + + +## Access to private data sources ## + +Private data sources are on\-premises data sources that are protected by a firewall\. IBM watsonx requires access through the firewall to reach the data sources\. To provide secure access, you create inbound firewall rules to allow access for the IP address ranges for IBM watsonx\. The inbound rules are created in the configuration tool for your firewall\. + +See [Configuring firewall access](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall_ovrvw.html) + +## Integrations ## + +You can configure integrations with third\-party cloud platforms to allow IBM watsonx users to access data sources hosted on those clouds\. The following security mechanisms apply to integrations with third\-party clouds: + + + +1. An authorized account on the third\-party cloud, with appropriate permissions to view account credentials +2. Permissions to allow secure connections through the firewall of the cloud provider (for specific IP ranges) + + + +For example, you have a data source on AWS that you are running notebooks on\. You need to integrate with AWS and then generate a connection to the database\. The integration and connection are secure\. After you configure firewall access, you can grant appropriate permissions to users and provide them with credentials to access data\. + +See [Integrations with other cloud platforms](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/int-cloud.html) + +## Connections ## + +Connections require valid credentials to access data\. The account owner or administrator configures the type of credentials that are required, either shared or personal, at the account level\. Shared credentials make the data source and its credentials accessible to all collaborators in the project\. Personal credentials require each collaborator to provide their own credentials to use the data source\. + +Connections require valid credentials to access data\. The account owner or administrator configures the type of credentials that are required at the account level\. The connection creator enters a valid credential\. The options are: + + + + * **Either shared or personal** allows users to specify personal or shared credentials when creating a new connection by selecting a radio button and entering the correct credential\. + * **Personal** credentials require each collaborator to provide their own credentials to use the data source\. + * **Shared** credentials make the data source and its credentials accessible to all collaborators in the project\. Users enter a common credential which was created by the creator of the connection\. + + + +For more information about connections, see: + + + + * [Adding connections to projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) + * [Adding data from a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) + * [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html) + * [Managing your account settings](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/account-settings.html#set-the-credentials-for-connections) + + + +## Connections to data behind a firewall ## + +Secure connections provide secure communication among resources in a hybrid cloud deployment, some of which might reside behind a firewall\. You have the following options for secure connections between your environment and the cloud: + + + + * [Satellite Connector](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html?context=cdpaas&locale=en#link) + * [Satellite location](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-network.html?context=cdpaas&locale=en#location) + + + +### Satellite Connector ### + +A Satellite Connector uses a lightweight Docker\-based communication that creates secure and auditable communications from your on\-prem, cloud, or Edge environment back to IBM Cloud\. Your infrastructure needs only a container host, such as Docker\. For more information, see [Satellite Connector overview](https://cloud.ibm.com/docs/satellite?topic=satellite-understand-connectors&interface=ui)\. + +See [Connecting to data behind a firewall](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html##satctr) for instructions on configuring a Satellite Connector\. + +Satellite Connector is the replacement for the deprecated Secure Gateway\. For the Secure Gateway deprecation announcement, see [IBM Cloud docs: Secure Gateway Deprecation Overview](https://cloud.ibm.com/docs/SecureGateway?topic=SecureGateway-dep-overview) + +### Satellite location ### + +A Satellite location provides the same secure communications to IBM Cloud as a Satellite Connector but adds high availability access by default plus the ability to communicate from IBM Cloud to your on\-prem location\. A Satellite location requires at least three x86 hosts in your infrastructure for the HA control plane\. A Satellite location is a superset of the capabilities of the Satellite Connector\. If you need only client data communication, set up a Satellite Connector\. + +See [Connecting to data behind a firewall](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html#sl) for instructions on configuring a Satellite location\. + +## VPNs ## + +Virtual Private Networks (VPNs) create virtual point\-to\-point connections by using tunneling protocols, and encryption and dedicated connections\. They provide a secure method for sharing data across public networks\. + +Following are the VPN technologies on IBM Cloud: + + + + * [IPSec VPN](https://cloud.ibm.com/catalog/infrastructure/ipsec-vpn): The VPN facilitates connectivity from your secure network to IBM IaaS platform’s private network\. Any user on the account can be given VPN access\. + * [VPN for VPC](https://cloud.ibm.com/vpc-ext/provision/vpngateway): With Virtual Private Cloud (VPC), you can provision generation 2 virtual server instances for VPC with high network performance\. + * The Secure Gateway deprecation announcement provides information and scenarios for using VPNs as an alternative\. See [IBM Cloud docs: Migration options](https://cloud.ibm.com/docs/SecureGateway?topic=SecureGateway-dep-migration-options#virtual-private-network)\. + + + +## Allow specific IP addresses ## + +Use this mechanism to control access to the IBM cloud console and to IBM watsonx\. Access is allowed from the specified IP addresses only; access from all other IP addresses is denied\. You can specify the allowed IP addresses for an individual user or for an account\. + +When allowing specific IP addresses for Watson Studio, you must include the CIDR ranges for the Watson Studio nodes in each region (as well as the individual client system IPs that are allowed)\. You can include the CIDR ranges in IBM watsonx by following these steps: + + + +1. From the main menu, choose **Administration > Cloud integrations**\. +2. Click **Firewall configuration** to display the IP addresses for the current region\. Use CIDR notation\. +3. Copy each CIDR range into the **IP address restrictions** for either a user or an account\. Be sure to enter the allowed individual client IP addresses as well\. Enter the IP addresses as a comma\-separated list\. Then, click **Apply**\. +4. Repeat for each region to allow access for Watson Studio\. + + + +For step\-by\-step instructions for both user and account restrictions, see [IBM Cloud docs: Allowing specific IP addresses](https://cloud.ibm.com/docs/account?topic=account-ips) + +## Allow third party URLs on an internal network ## + +If you are running IBM watsonx behind a firewall, you must allowlist third party URLs to provide outbound browser access\. The URLs include resources from IBM Cloud and other domains\. IBM watsonx requires access to these domains for outbound browser traffic through the firewall\. + +This list provides access only for core IBM watsonx functions\. Specific services might require additional URLs\. The list does not cover URLs required by the IBM Cloud console and its outbound requests\. + + + +Table 2\. Third party URLs allowlist for IBM watsonx + +| Domain | Description | +| -------------------------------------------- | --------------------------------------------------- | +| \*\.bluemix\.net | IBM legacy Cloud domain \- still used in some flows | +| \*\.appdomain\.cloud | IBM Cloud app domain | +| cloud\.ibm\.com | IBM Cloud global domain | +| \*\.cloud\.ibm\.com | Various IBM Cloud subdomains | +| dataplatform\.cloud\.ibm\.com | IBM watsonx Dallas region | +| \*\.dataplatform\.cloud\.ibm\.com | CIBM watsonx subdomains | +| eum\.instana\.io | Instana client side instrumentation | +| eum\-orange\-saas\.instana\.io | Instana client side instrumentation | +| cdnjs\.cloudflare\.com | Cloudflare CDN for some static resources | +| nebula\-cdn\.kampyle\.com | Medallia NPS | +| resources\.digital\-cloud\-ibm\.medallia\.eu | Medallia NPS | +| udc\-neb\.kampyle\.com | Medallia NPS | +| ubt\.digital\-cloud\-ibm\.medallia\.eu | Medallia NPS | +| cdn\.segment\.com | Segment JS | +| api\.segment\.io | Segment API | +| cdn\.walkme\.com | WalkMe static resources | +| papi\.walkme\.com | WalkMe API | +| ec\.walkme\.com | WalkMe API | +| playerserver\.walkme\.com | WalkMe player server | +| s3\.walkmeusercontent\.com | WalkMe static resources | + + + +## Multi\-tenancy ## + +IBM watsonx is hosted as a secure and compliant multi\-tenant solution on IBM Cloud\. See [Multi\-Tenant](https://www.ibm.com/cloud/learn/multi-tenant) + +**Parent topic:**[Security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aac6535cab0b4600a9683433fcab805b2c4eaa53.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aac6535cab0b4600a9683433fcab805b2c4eaa53.md new file mode 100644 index 0000000..f153f23 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aac6535cab0b4600a9683433fcab805b2c4eaa53.md @@ -0,0 +1,14 @@ +# Structured properties + +# Structured properties # + +There are two ways in which scripting uses structured properties for increased clarity when parsing: + + + + * To give structure to the names of properties for complex nodes, such as Type, Filter, or Balance nodes\. + * To provide a format for specifying multiple properties at once\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aae40f1cc335a650c1eb806e404394da596fb433.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aae40f1cc335a650c1eb806e404394da596fb433.md new file mode 100644 index 0000000..aba57ef --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aae40f1cc335a650c1eb806e404394da596fb433.md @@ -0,0 +1,259 @@ +# Known issues and limitations + +# Known issues and limitations # + +The following limitations and known issues apply to watsonx\. + + + + * [**Regional limitations**](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/region-lims.html) + * [Notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/known-issues.html?context=cdpaas&locale=en#notebooks) + * [Machine learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/known-issues.html?context=cdpaas&locale=en#wmlissues) + * [SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/known-issues.html?context=cdpaas&locale=en#spssissues) + * [Connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/known-issues.html?context=cdpaas&locale=en#connectissues) + * [Watson Pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/known-issues.html?context=cdpaas&locale=en#pipeline-issues) + * [watsonx\.governance](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/known-issues.html?context=cdpaas&locale=en#xgov-issues) + + + +## Notebook issues ## + +You might encounter some of these issues when getting started with and using notebooks\. + +### Manual installation of some tensor libraries is not supported ### + +Some tensor flow libraries are preinstalled, but if you try to install additional tensor flow libraries yourself, you get an error\. + +### Connection to notebook kernel is taking longer than expected after running a code cell ### + +If you try to reconnect to the kernel and immediately run a code cell (or if the kernel reconnection happened during code execution), the notebook doesn't reconnect to the kernel and no output is displayed for the code cell\. You need to manually reconnect to the kernel by clicking **Kernel** > **Reconnect**\. When the kernel is ready, you can try running the code cell again\. + +### Using the predefined sqlContext object in multiple notebooks causes an error ### + +You might receive an Apache Spark error if you use the predefined sqlContext object in multiple notebooks\. Create a new sqlContext object for each notebook\. See [this Stack Overflow explanation](http://stackoverflow.com/questions/38117849/you-must-build-spark-with-hive-export-spark-hive-true/38118112#38118112)\. + +### Connection failed message ### + +If your kernel stops, your notebook is no longer automatically saved\. To save it, click **File** > **Save** manually, and you should get a **Notebook saved** message in the kernel information area, which appears before the Spark version\. If you get a message that the kernel failed, to reconnect your notebook to the kernel click **Kernel** > **Reconnect**\. If nothing you do restarts the kernel and you can't save the notebook, you can download it to save your changes by clicking **File** > **Download as** > **Notebook (\.ipynb)**\. Then you need to create a new notebook based on your downloaded notebook file\. + +### Hyperlinks to notebook sections don't work in preview mode ### + +If your notebook contains sections that you link to from an introductory section at the top of the notebook for example, the links to these sections will not work if the notebook was opened in view\-only mode in Firefox\. However, if you open the notebook in edit mode, these links will work\. + +### Can't connect to notebook kernel ### + +If you try to run a notebook and you see the message `Connecting to Kernel`, followed by `Connection failed. Reconnecting` and finally by a connection failed error message, the reason might be that your firewall is blocking the notebook from running\. + +If Watson Studio is installed behind a firewall, you must add the WebSocket connection `wss://dataplatform.cloud.ibm.com` to the firewall settings\. Enabling this WebSocket connection is required when you're using notebooks and RStudio\. + +### Insufficient resources available error when opening or editing a notebook ### + +If you see the following message when opening or editing a notebook, the environment runtime associated with your notebook has resource issues: + + Insufficient resources available + A runtime instance with the requested configuration can't be started at this time because the required hardware resources aren't available. + Try again later or adjust the requested sizes. + +To find the cause, try checking the status page for IBM Cloud incidents affecting Watson Studio\. Additionally, you can open a support case at the IBM Cloud Support portal\. + +## Machine learning issues ## + +You might encounter some of these issues when working with machine learning tools\. + +### Region requirements ### + +You can only associate a Watson Machine Learning service instance with your project when the Watson Machine Learning service instance and the Watson Studio instance are located in the same region\. + +### Accessing links if you create a service instance while associating a service with a project ### + +While you are associating a Watson Machine Learning service to a project, you have the option of creating a new service instance\. If you choose to create a new service, the links on the service page might not work\. To access the service terms, APIs, and documentation, right click the links to open them in new windows\. + +### Federated Learning assets cannot be searched in All assets, search results, or filter results in the new projects UI ### + +You cannot search Federated Learning assets from the **All assets** view, the search results, or the filter results of your project\. + +**Workaround:** Click the Federated Learning asset to open the tool\. + +### Deployment issues ### + + + + * A deployment that is inactive (no scores) for a set time (24 hours for the free plan or 120 hours for a paid plan) is automatically hibernated\. When a new scoring request is submitted, the deployment is reactivated and the score request is served\. Expect a brief delay of 1 to 60 seconds for the first score request after activation, depending on the model framework\. + * For some frameworks, such as SPSS modeler, the first score request for a deployed model after hibernation might result in a 504 error\. If this happens, submit the request again; subsequent requests should succeed\. + + + +## Watson Machine Learning limitations ## + +### AutoAI known limitations ### + + + + * Currently, AutoAI experiments do not support double\-byte character sets\. AutoAI only supports CSV files with ASCII characters\. Users must convert any non\-ASCII characters in the file name or content, and provide input data as a CSV as defined in [this CSV standard](https://tools.ietf.org/html/rfc4180)\. + * To interact programmatically with an AutoAI model, use the REST API instead of the Python client\. The APIs for the Python client required to support AutoAI are not generally available at this time\. + + + +### Data module not found in IBM Federated Learning ### + +The data handler for IBM Federated Learning is trying to extract a data module from the FL library but is unable to find it\. You might see the following error message: + + ModuleNotFoundError: No module named 'ibmfl.util.datasets' + +The issue possibly results from using an outdated DataHandler\. Please review and update your DataHandler to conform to the latest spec\. Here is the link to the most recent [MNIST data handler](https://github.com/IBMDataScience/sample-notebooks/blob/master/Files/mnist_keras_data_handler.py) or ensure your sample versions are up\-to\-date\. + +## SPSS Modeler issues ## + +You might encounter some of these issues when working in SPSS Modeler\. + +### SPSS Modeler runtime restrictions ### + +Watson Studio does not include SPSS functionality in Peru, Ecuador, Colombia and Venezuela\. + +### Merge node and unicode characters ### + +The Merge node treats the following very similar Japanese characters as the same character\. +![Japanese characters](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/SPSSmergenode.png) + +## Connection issues ## + +You might encounter this issue when working with connections\. + +### Cloudera Impala connection does not work with LDAP authentication ### + +If you create a connection to a Cloudera Impala data source and the Cloudera Impala server is set up for LDAP authentication, the username and password authentication method in IBM watsonx will not work\. + +Workaround: Disable the **Enable LDAP Authentication** option on the Impala server\. See [Configuring LDAP Authentication](https://docs.cloudera.com/cdp-private-cloud-base/latest/impala-secure/topics/impala-ldap.html) in the Cloudera documentation\. + +## Watson Pipelines known issues ## + +The issues pertain to Watson Pipelines\. + +### Nesting loops more than 2 levels can result in pipeline error ### + +Nesting loops more than 2 levels can result in an error when you run the pipeline, such as Error retrieving the run\. Reviewing the logs can show an error such as `text in text not resolved: neither pipeline_input nor node_output`\. If you are looping with output from a Bash script, the log might list an error like this: `PipelineLoop can't be run; it has an invalid spec: non-existent variable in $(params.run-bash-script-standard-output)`\. To resolve the problem, do not nest loops more than 2 levels\. + +### Asset browser does not always reflect count for total numbers of asset type ### + +When selecting an asset from the asset browser, such as choosing a source for a Copy node, you see that some of the assets list the total number of that asset type available, but notebooks do not\. That is a current limitation\. + +### Cannot delete pipeline versions ### + +Currently, you cannot delete saved versions of pipelines that you no longer need\. + +### Deleting an AutoAI experiment fails under some conditions ### + +Using a *Delete AutoAI experiment* node to delete an AutoAI experiment that was created from the Projects UI does not delete the AutoAI asset\. However, the rest of the flow can complete successfully\. + +### Cache appears enabled but is not enabled ### + +If the *Copy assets* Pipelines node's *Copy mode* is set to `Overwrite`, cache is displayed as enabled but remains disabled\. + +## Watson Pipelines limitations ## + +These limitations apply to Watson Pipelines\. + + + + * [Single pipeline limits](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/known-issues.html?context=cdpaas&locale=en#pipeline-limits) + * [Limitations by configuration size](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/known-issues.html?context=cdpaas&locale=en#config-size) + * [Input and output size limits](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/known-issues.html?context=cdpaas&locale=en#input-limit) + * [Batch input limited to data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/known-issues.html?context=cdpaas&locale=en#batch-input) + + + +### Single pipeline limits ### + +These limitation apply to a single pipeline, regardless of configuration\. + + + + * Any single pipeline cannot contain more than 120 standard nodes + * Any pipeline with a loop cannot contain more than 600 nodes across all iterations (for example, 60 iterations \- 10 nodes each) + + + +### Limitations by configuration size ### + +#### Small configuration #### + +A SMALL configuration supports 600 standard nodes (across all active pipelines) or 300 nodes run in a loop\. For example: + + + + * 30 standard pipelines with 20 nodes run in parallel = 600 standard nodes + * 3 pipelines containing a loop with 10 iterations and 10 nodes in each iteration = 300 nodes in a loop + + + +#### Medium configuration #### + +A MEDIUM configuration supports 1200 standard nodes (across all active pipelines) or 600 nodes run in a loop\. For example: + + + + * 30 standard pipelines with 40 nodes run in parallel = 1200 standard nodes + * 6 pipelines containing a loop with 10 iterations and 10 nodes in each iteration = 600 nodes in a loop + + + +#### Large configuration #### + +A LARGE configuration supports 4800 standard nodes (across all active pipelines) or 2400 nodes run in a loop\. For example: + + + + * 80 standard pipelines with 60 nodes run in parallel = 4800 standard nodes + * 24 pipelines containing a loop with 10 iterations and 10 nodes in each iteration = 2400 nodes in a loop + + + +### Input and output size limits ### + +Input and output values, which include pipeline parameters, user variables, and generic node inputs and outputs, cannot exceed 10 KB of data\. + +### Batch input limited to data assets ### + +Currently, input for batch deployment jobs is limited to data assets\. This means that certain types of deployments, which require JSON input or multiple files as input, are not supported\. For example, SPSS models and Decision Optimization solutions that require multiple files as input are not supported\. + +## Issues with Cloud Object Storage ## + +These issue apply to working with Cloud Object Storage\. + +### Issues with Cloud Object Storage when Key Protect is enabled ### + +Key Protect in conjunction with Cloud Object Storage is not supported for working with Watson Machine Learning assets\. If you are using Key Protect, you might encounter these issues when you are working with assets in Watson Studio\. + + + + * Training or saving these Watson Machine Learning assets might fail: + + + + * Auto AI + * Federated Learning + * Watson Pipelines + + + + * You might be unable to save an SPSS model or a notebook model to a project + + + +## Issues with watsonx\.governance ## + +### Delay showing prompt template deployment data in a factsheet ### + +When a deployment is created for a prompt template, the facts for the deployment are not added to factsheet immediately\. You must first evaluate the deployment or view the lifecycle tracking page to add the facts to the factsheet\. + +### Display issues for existing Factsheet users ### + +If you previously used factsheets with IBM Knowledge Catalog and you create a new AI use case in watsonx\.governance, you might see some display issues, such as duplicate Risk level fields in the General information and Details section of the AI use case interface\. + +To resolve display problems, update the `model_entry_user` asset type definition\. For details on updating a use case programmatically, see [Customizing details for a use case or factsheet](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-customize-user-facts.html)\. + +### Redundant attachment links in factsheet ### + +A factsheet tracks all of the events for an asset over all phases of the lifecycle\. Attachments show up in each stage, creating some redundancy in the factsheet\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ab42ff6b754a2e29fcb56b0137eeddf17f8ee271.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ab42ff6b754a2e29fcb56b0137eeddf17f8ee271.md new file mode 100644 index 0000000..03a9a63 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ab42ff6b754a2e29fcb56b0137eeddf17f8ee271.md @@ -0,0 +1,48 @@ +# Linking and unlinking nodes + +# Linking and unlinking nodes # + +When you add a new node to a flow, you must connect it to a sequence of nodes before it can be used\. Flows provide a number of methods for linking and unlinking nodes\. These methods are summarized in the following table\. + + + +Methods for linking and unlinking nodes + +Table 1\. Methods for linking and unlinking nodes + +| Method | Return type | Description | +| ----------------------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `s.link(source, target)` | Not applicable | Creates a new link between the source and the target nodes\. | +| `s.link(source, targets)` | Not applicable | Creates new links between the source node and each target node in the supplied list\. | +| `s.linkBetween(inserted, source, target)` | Not applicable | Connects a node between two other node instances (the source and target nodes) and sets the position of the inserted node to be between them\. Any direct link between the source and target nodes is removed first\. | +| `s.linkPath(path)` | Not applicable | Creates a new path between node instances\. The first node is linked to the second, the second is linked to the third, and so on\. | +| `s.unlink(source, target)` | Not applicable | Removes any direct link between the source and the target nodes\. | +| `s.unlink(source, targets)` | Not applicable | Removes any direct links between the source node and each object in the targets list\. | +| `s.unlinkPath(path)` | Not applicable | Removes any path that exists between node instances\. | +| `s.disconnect(node)` | Not applicable | Removes any links between the supplied node and any other nodes in the specified flow\. | +| `s.isValidLink(source, target)` | *boolean* | Returns `True` if it would be valid to create a link between the specified source and target nodes\. This method checks that both objects belong to the specified flow, that the source node can supply a link and the target node can receive a link, and that creating such a link will not cause a circularity in the flow\. | + + + +The example script that follows performs these five tasks: + + + +1. Creates a Data Asset node, a Filter node, and a Table output node\. +2. Connects the nodes together\. +3. Filters the field "Drug" from the resulting output\. +4. Runs the Table node\. + + + + stream = modeler.script.stream() + sourcenode = stream.findByID("idGXVBG5FBZH") + filternode = stream.createAt("filter", "Filter", 192, 64) + tablenode = stream.createAt("table", "Table", 288, 64) + stream.link(sourcenode, filternode) + stream.link(filternode, tablenode) + filternode.setKeyedPropertyValue("include", "Drug", False) + results = [] + tablenode.run(results) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/abca967cd96ab805be518e8a52ef984499c62f6c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/abca967cd96ab805be518e8a52ef984499c62f6c.md new file mode 100644 index 0000000..cf9a3d1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/abca967cd96ab805be518e8a52ef984499c62f6c.md @@ -0,0 +1,105 @@ +# Tone classification + +# Tone classification # + +The Tone model in the Watson Natural Language Processing classification workflow classifies the tone in the input text\. + +**Workflow name** + +`ensemble_classification-workflow_en_tone-stock` + +**Supported languages** + + + + * English and French + + + +**Capabilities** + +The Tone classification model is a pre\-trained document classification model for the task of classifying the tone in the input document\. The model identifies the tone of the input document and classifies it as: + + + + * Excited + * Frustrated + * Impolite + * Polite + * Sad + * Satisfied + * Sympathetic + + + +Unlike the Sentiment model, which classifies each individual sentence, the Tone model classifies the entire input document\. As such, the Tone model works optimally when the input text to classify is no longer than 1000 characters\. If you would like to classify texts longer than 1000 characters, split the text into sentences or paragraphs for example and apply the Tone model on each sentence or paragraph\. + +A document may be classified into multiple categories or into no category\. + + + +Capabilities of tone classification + +| Capabilities | Example | +| --------------------------------------------------- | ------------------------------------------------------------------------------------- | +| Identifies the tone of a document and classifies it | "I'm really happy with how this was handled, thank you\!" \-\-> excited, satisfied | + + + +**Dependencies on other blocks** + +None + +**Code sample** + + import watson_nlp + + # Load the Tone workflow model for English + tone_model = watson_nlp.load('ensemble_classification-workflow_en_tone-stock') + + # Run the Tone model + tone_result = tone_model.run("I'm really happy with how this was handled, thank you!") + print(tone_result) + +Output of the code sample: + + { + "classes": [ + { + "class_name": "excited", + "confidence": 0.6896854620082722 + }, + { + "class_name": "satisfied", + "confidence": 0.6570277557333078 + }, + { + "class_name": "polite", + "confidence": 0.33628806679460566 + }, + { + "class_name": "sympathetic", + "confidence": 0.17089694967744093 + }, + { + "class_name": "sad", + "confidence": 0.06880583874412932 + }, + { + "class_name": "frustrated", + "confidence": 0.010365418217209686 + }, + { + "class_name": "impolite", + "confidence": 0.002470793624966174 + } + ], + "producer_id": { + "name": "Voting based Ensemble", + "version": "0.0.1" + } + } + +**Parent topic:**[Watson Natural Language Processing task catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/abd445ce46b0329348e6ad464735bdb1d525edaa.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/abd445ce46b0329348e6ad464735bdb1d525edaa.md new file mode 100644 index 0000000..b91364a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/abd445ce46b0329348e6ad464735bdb1d525edaa.md @@ -0,0 +1,20 @@ +# SuperNode properties + +# SuperNode properties # + +The tables in this section describe properties that are specific to SuperNodes\. Note that common node properties also apply to SuperNodes\. + + + +Terminal supernode properties + +Table 1\. Terminal supernode properties + +| Property name | Property type/List of values | Property description | +| ---------------- | ---------------------------- | -------------------- | +| `execute_method` | `Script``Normal` | | +| `script` | *string* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/abfaaf84948b090c8ea099ff44cc8cd878371073.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/abfaaf84948b090c8ea099ff44cc8cd878371073.md new file mode 100644 index 0000000..e331d93 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/abfaaf84948b090c8ea099ff44cc8cd878371073.md @@ -0,0 +1,90 @@ +# IBM Cloud account security + +# IBM Cloud account security # + +Account security mechanisms for IBM watsonx are provided by IBM Cloud\. These security mechanisms, including SSO and role\-based, group\-based, and service\-based access control, protect access to resources and provide user authentication\. + + + +| Mechanism | Purpose | Responsibility | Configured on | +| ------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | -------------- | ------------- | +| [Access (IAM) roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-account.html?context=cdpaas&locale=en#iam-access-roles) | Provide role\-based access control for services | Customer | IBM Cloud | +| [Access groups](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-account.html?context=cdpaas&locale=en#access-groups) | Configure access groups and policies | Customer | IBM Cloud | +| [Resource groups](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-account.html?context=cdpaas&locale=en#resource-groups) | Organize resources into groups and assign access | Customer | IBM Cloud | +| [Service IDs](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-account.html?context=cdpaas&locale=en#service-ids) | Enables an application outside of IBM Cloud access to your IBM Cloud services | Customer | IBM Cloud | +| [Service ID API keys](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-account.html?context=cdpaas&locale=en#service-id-api-keys) | Authenticates an application to a Service ID | Customer | IBM Cloud | +| [Activity Tracker](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-account.html?context=cdpaas&locale=en#activity-tracker) | Monitor events related to IBM watsonx | Customer | IBM Cloud | +| [Multifactor authentication (MFA)](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-account.html?context=cdpaas&locale=en#multifactor-authentication) | Require users to authenticate with a method beyond ID and password | Customer | IBM Cloud | +| [Single sign\-on authentication](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-account.html?context=cdpaas&locale=en#single-sign-on) | Connect with an identity provider (IdP) for single sign\-on (SSO) authentication by using SAML federation | Shared | IBM Cloud | + + + +## IAM access roles ## + +You can use IAM access roles to provide users access to all resources that belong to a resource group\. You can also give users access to manage resource groups and create new service instances that are assigned to a resource group\. + +For step\-by\-step instructions, see [IBM Cloud docs: Assigning access to resources](https://cloud.ibm.com/docs/account?topic=account-access-getstarted) + +## Access groups ## + +After you set up and organize resource groups in your account, you can streamline access management by using access groups\. Create access groups to organize a set of users and service IDs into a single entity\. You can then assign a policy to all group members by assigning it to the access group\. Thus you can assign a single policy to the access group instead of assigning the same policy multiple times per individual user or service ID\. + +By using access groups, you can minimally manage the number of assigned policies by giving the same access to all identities in an access group\. + +For more information see: + + + + * [IBM Cloud docs: Setting up access groups](https://cloud.ibm.com/docs/account?topic=account-groups&interface=ui)\. + + + +## Resource groups ## + +Use resource groups to organize your account's resources into logical groups that help with access control\. Rather than assigning access to individual resources, you assign access to the group\. Resources are any service that is managed by IAM, such as databases\. Whenever you create a service instance from the Cloud catalog, you must assign it to a resource group\. + +Resource groups work with access group policies to provide a way to manage access to resources by groups of users\. By including a user in an access group, and assigning the access group to a resource group, you provide access to the resources contained in the group\. Those resources are not available to nonmembers\. The Lite account comes with a single resource group, named "Default", so all resources are placed in the Default resource group\. With paid accounts, Administrators can create multiple resource groups to support your business and provide access to resources on an as\-needed basis\. + +For step\-by\-step instructions, see [IBM Cloud docs: Managing resource groups](https://cloud.ibm.com/docs/account?topic=account-rgs) + +For tips on configuring resource groups to provide secure access, see [IBM Cloud docs: Best practices for organizing resources and assigning access](https://cloud.ibm.com/docs/account?topic=account-account_setup) + +## Service IDs ## + +You can create service IDs in IBM Cloud to enable an application outside of IBM Cloud access to your IBM Cloud services\. Service IDs are not tied to a specific user\. If a user leaves an organization and is deleted from the account, the service ID remains intact to ensure that your service continues to work\. Access policies that are assigned to each service ID ensure that your application has the appropriate access for authenticating with your IBM Cloud services\. See [Project collaborators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html)\. + +One way in which Service IDs and access policies can be used is to manage access to the Cloud Object Storage buckets\. See [Controlling access to Cloud Object Storage buckets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/cos_buckets.html)\. + +For more information, see [IBM Cloud docs: Creating and working with service IDs](https://cloud.ibm.com/docs/account?topic=account-serviceids)\. + +## Service ID API keys ## + +For extra protection, Service IDs can be combined with unique API keys\. The API key that is associated with a Service ID can be set for one\-time use or unlimited use\. For more information, see [IBM Cloud docs: Managing service IDs API keys](https://cloud.ibm.com/docs/account?topic=account-serviceidapikeys)\. + +## Activity Tracker ## + +The Activity Tracker collects and stores audit records for API calls (events) made to resources that run in the IBM Cloud\. You can use Activity Tracker to monitor the activity of your IBM Cloud account to investigate abnormal activity and critical actions, and to comply with regulatory audit requirements\. The events that are collected comply with the Cloud Auditing Data Federation (CADF) standard\. IBM services that generate Activity Tracker events follow the IBM Cloud security policy\. + +For a list of events that apply to IBM watsonx, see [Activity Tracker events](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/at-events.html)\. + +For instructions on configuring Activity Tracker, see [IBM Cloud docs: Getting started with IBM Cloud Activity Tracker](https://cloud.ibm.com/docs/activity-tracker?topic=activity-tracker-getting-started)\. + +## Multifactor authentication ## + +Multifactor authentication (or MFA) adds an extra layer of security by requiring multiple types of authentication methods upon login\. After entering a valid username and password, users must also satisfy a second authentication method\. For example, a time\-sensitive passcode is sent to the user, either through text or email\. The correct passcode must be entered to complete the login process\. + +For more information, see [IBM Cloud docs: Types of multifactor authentication](https://cloud.ibm.com/docs/account?topic=account-types)\. + +## Single sign\-on authentication ## + +Single sign\-on (SSO) is an authentication method that enables users to log in to multiple, related applications that use one set of credentials\. + +IBM watsonx supports SSO using Security Assertion Markup Language (SAML) federated IDs\. SAML federation requires coordination with IBM to configure\. SAML connects IBMids with the user credentials that are provided by an identity provider (IdP)\. For companies that have configured SAML federation with IBM, users can log in to IBM watsonx with their company credentials\. SAML federation is the recommended method for SSO configuration with IBM watsonx\. + +The [IBMid Enterprise Federation Adoption Guide](https://ibm.ent.box.com/notes/78040808400?s=yqjnprek2rm99jgqhlm04xz0nsjda69a) describes the steps that are required to federate your identity provider (IdP)\. You need an IBM Sponsor, which is an IBM employee that works as the contact person between you and the IBMid team\. + +For an overview of SAML federation, see [IBM Cloud SAML Federation Guide](https://www.ibm.com/cloud/blog/ibm-cloud-saml-federation-guide)\. This blog discusses both SAML federation and IBM Cloud App ID\. IBM Cloud App ID is supported as a Beta version with IBM watsonx\. + +**Parent topic:**[Security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ac040f5709ab00ab3ed8275862fa2328d20842b2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ac040f5709ab00ab3ed8275862fa2328d20842b2.md new file mode 100644 index 0000000..65f601b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ac040f5709ab00ab3ed8275862fa2328d20842b2.md @@ -0,0 +1,35 @@ +# Expert options (SPSS Modeler) + +# Expert options # + +With the Text Link Analysis (TLA) node, the extraction of text link analysis pattern results is automatically enabled\. In the node's properties, the expert options include certain additional parameters that impact how text is extracted and handled\. The expert parameters control the basic behavior, as well as a few advanced behaviors, of the extraction process\. There are also a number of linguistic resources and options that also impact the extraction results, which are controlled by the resource template you select\. + +Limit extraction to concepts with a global frequency of at least \[n\]\. This option specifies the minimum number of times a word or phrase must occur in the text in order for it to be extracted\. In this way, a value of 5 limits the extraction to those words or phrases that occur at least five times in the entire set of records or documents\. + +In some cases, changing this limit can make a big difference in the resulting extraction results, and consequently, your categories\. Let's say that you're working with some restaurant data and you don't increase the limit beyond 1 for this option\. In this case, you might find `pizza (1), thin pizza (2), spinach pizza (2)`, and `favorite pizza (2)` in your extraction results\. However, if you were to limit the extraction to a global frequency of 5 or more and re\-extract, you would no longer get three of these concepts\. Instead you would get `pizza (7)`, since `pizza` is the simplest form and this word already existed as a possible candidate\. And depending on the rest of your text, you might actually have a frequency of more than seven, depending on whether there are still other phrases with pizza in the text\. Additionally, if `spinach pizza` was already a category descriptor, you might need to add `pizza` as a descriptor instead to capture all of the records\. For this reason, change this limit with care whenever categories have already been created\. + +Note that this is an extraction\-only feature; if your template contains terms (they usually do), and a term for the template is found in the text, then the term will be indexed regardless of its frequency\. + +For example, suppose you use a Basic Resources template that includes "los angeles" under the `` type in the Core library; if your document contains Los Angeles only once, then Los Angeles will be part of the list of concepts\. To prevent this, you'll need to set a filter to display concepts occurring at least the same number of times as the value entered in the Limit extraction to concepts with a global frequency of at least \[n\] field\. + +Accommodate punctuation errors\. This option temporarily normalizes text containing punctuation errors (for example, improper usage) during extraction to improve the extractability of concepts\. This option is extremely useful when text is short and of poor quality (as, for example, in open\-ended survey responses, e\-mail, and CRM data), or when the text contains many abbreviations\. + +Accommodate spelling for a minimum word character length of \[n\]\. This option applies a fuzzy grouping technique that helps group commonly misspelled words or closely spelled words under one concept\. The fuzzy grouping algorithm temporarily strips all vowels (except the first one) and strips double/triple consonants from extracted words and then compares them to see if they're the same so that `modeling` and `modelling` would be grouped together\. However, if each term is assigned to a different type, excluding the `` type, the fuzzy grouping technique won't be applied\. + +You can also define the minimum number of root characters required before fuzzy grouping is used\. The number of root characters in a term is calculated by totaling all of the characters and subtracting any characters that form inflection suffixes and, in the case of compound\-word terms, determiners and prepositions\. For example, the term `exercises` is counted as 8 root characters in the form "exercise," since the letter `s` at the end of the word is an inflection (plural form)\. Similarly, `apple sauce` counts as 10 root characters ("apple sauce") and `manufacturing of cars` counts as 16 root characters (“manufacturing car”)\. This method of counting is only used to check whether the fuzzy grouping should be applied but doesn't influence how the words are matched\. + +Note: If you find that certain words are later grouped incorrectly, you can exclude word pairs from this technique by explicitly declaring them in the Fuzzy Grouping: Exceptions section under the Advanced Resources properties\. + +Extract uniterms\. This option extracts single words (uniterms) as long as the word isn't already part of a compound word and if it's either a noun or an unrecognized part of speech\. + +Extract nonlinguistic entities\. This option extracts nonlinguistic entities, such as phone numbers, social security numbers, times, dates, currencies, digits, percentages, e\-mail addresses, and HTTP addresses\. You can include or exclude certain types of nonlinguistic entities in the Nonlinguistic Entities: Configuration section under the Advanced Resources properties\. By disabling any unnecessary entities, the extraction engine won't waste processing time\. + +Uppercase algorithm\. This option extracts simple and compound terms that aren't in the built\-in dictionaries as long as the first letter of the term is in uppercase\. This option offers a good way to extract most proper nouns\. + +Group partial and full person names together when possible\. This option groups names that appear differently in the text together\. This feature is helpful since names are often referred to in their full form at the beginning of the text and then only by a shorter version\. This option attempts to match any uniterm with the `` type to the last word of any of the compound terms that is typed as ``\. For example, if `doe` is found and initially typed as ``, the extraction engine checks to see if any compound terms in the `` type include `doe` as the last word, such as `john doe`\. This option doesn't apply to first names since most are never extracted as uniterms\. + +Maximum nonfunction word permutation\. This option specifies the maximum number of nonfunction words that can be present when applying the permutation technique\. This permutation technique groups similar phrases that differ from each other only by the nonfunction words (for example, `of` and `the`) contained, regardless of inflection\. For example, let's say that you set this value to—at most—two words, and both `company officials` and `officials of the company` were extracted\. In this case, both extracted terms would be grouped together in the final concept list since both terms are deemed to be the same when `of the` is ignored\. + +Use derivation when grouping multiterms\. When processing Big Data, select this option to group multiterms by using derivation rules\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ac97ce4d4df6402240f1a6a67dfb9462bc1fafac.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ac97ce4d4df6402240f1a6a67dfb9462bc1fafac.md new file mode 100644 index 0000000..022fb9d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ac97ce4d4df6402240f1a6a67dfb9462bc1fafac.md @@ -0,0 +1,154 @@ +# Configuring drift v2 evaluations in watsonx.governance + +# Configuring drift v2 evaluations in watsonx\.governance # + +You can configure drift v2 evaluations with watsonx\.governance to measure changes in your data over time to ensure consistent outcomes for your model\. Use drift v2 evaluations to identify changes in your model output, the accuracy of your predictions, and the distribution of your input data\. + +The following sections describe the steps that you must complete to configure drift v2 evaluations with watsonx\.governance: + +## Set sample size ## + +watsonx\.governance uses sample sizes to understand how to process the number of transactions that are evaluated during evaluations\. You must set a minimum sample size to indicate the lowest number of transactions that you want watsonx\.governance to evaluate\. You can also set a maximum sample size to indicate the maximum number of transactions that you want watsonx\.governance to evaluate\. + +## Configure baseline data ## + +watsonx\.governance uses payload records to establish the baseline for drift v2 calculations\. You must configure the number of records that you want to calculate as your baseline data\. + +## Set drift thresholds ## + +You must set threshold values for each metric to enable watsonx\.governance to understand how to identify issues with your evaluation results\. The values that you set create alerts on the evaluation summary page that appear when metric scores violate your thresholds\. You must set the values between the range of 0 to 1\. The metric scores must be lower than the threshold values to avoid violations\. + +## Supported drift v2 metrics ## + +When you enable drift v2 evaluations, you can view a summary of evaluation results with metrics for the type of model that you're evaluating\. + +The following drift v2 metrics are supported by watsonx\.governance: + + + + * Output drift + + watsonx.governance calculates output drift by measuring the change in the model confidence distribution. - **How it works**: + watsonx.governance measures how much your model output changes from the time that you train the model. + To evaluate prompt templates, watsonx.governance calculates output drift by measuring the change in distribution of prediction probabilities. The prediction probability is calculated by aggregating the log probabilities of the tokens from the model output. + When you upload payload data with CSV files, you must include `prediction_probability` values or output drift cannot be calculated. + For regression models, watsonx.governance calculates output drift by measuring the change in distribution of predictions on the training and payload data. + For classification models, watsonx.governance calculates output drift for each class probability by measuring the change in distribution for class probabilities on the training and payload data. + For multi-classification models, watsonx.governance also aggregates output drift for each class probability by measuring a weighted average. - **Do the math**: + watsonx.governance uses the following formulas to calculate output drift: - [Total variation distance](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-driftv2-config.html?context=cdpaas&locale=en#total-variation-distance) - [Overlap coefficient](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-driftv2-config.html?context=cdpaas&locale=en#overlap-coefficient) - **Applies to prompt template evaluations**: Yes - **Task types**: - Text summarization - Text classification - Content generation - Entity extraction - Question answering + + + + + + * Model quality drift + + watsonx.governance calculates model quality drift by comparing the estimated runtime accuracy to the training accuracy to measure the drop in accuracy. - **How it works**: + watsonx.governance builds its own drift detection model that processes your payload data when you configure drift v2 evaluations to predict whether your model generates accurate predictions without the ground truth. The drift detection model uses the input features and class probabilities from your model to create its own input features. - **Do the math**: + watsonx.governance uses the following formula to calculate model quality drift: ![model quality score](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-model-quality-score.svg) watsonx.governance calculates the accuracy of your model as the `base_accuracy` by measuring the fraction of correctly predicted transactions in your training data. During evaluations, your transactions are scored against the drift detection model to measure the amount of transactions that are likely predicted correctly by your model. These transactions are compared to the total number of transactions that watsonx.governance processes to calculate the `predicted_accuracy`. If the `predicted_accuracy` is less than the `base_accuracy`, watsonx.governance generates a model quality drift score. - **Applies to prompt template evaluations**: No + + + + + + * Feature drift + + watsonx.governance calculates feature drift by measuring the change in value distribution for important features. - **How it works**: + watsonx.governance calculates drift for categorical and numeric features by measuring the probability distribution of continuous and discrete values. To identify discrete values for numeric features, watsonx.governance uses a binary logarithm to compare the number of distinct values of each feature to the total number of values of each feature. watsonx.governance uses the following binary logarithm formula to identify discrete numeric features: ![Binary logarithm formula is displayed](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-feature-drift-equation.svg) If the `distinct_values_count` is less than the binary logarithm of the `total_count`, the feature is identified as discrete. - **Do the math**: + watsonx.governance uses the following formulas to calculate feature drift: + - [Jensen Shannon distance](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-driftv2-config.html?context=cdpaas&locale=en#jensen-shannon-distance) - [Total variation distance](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-driftv2-config.html?context=cdpaas&locale=en#total-variation-distance) - [Overlap coefficient](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-driftv2-config.html?context=cdpaas&locale=en#overlap-coefficient) - **Applies to prompt template evaluations**: No + + + + + + * Prediction drift + + Prediction drift measures the change in distribution of the LLM predicted classes. - **Do the math**: + watsonx.governance uses the [Jensen Shannon distance](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-driftv2-config.html?context=cdpaas&locale=en#jensen-shannon-distance) formula to calculate prediction drift. - **Applies to prompt template evaluations**: Yes - **Task types**: Text classification + + + + + + * Input metadata drift + + Input metadata drift measures the change in distribution of the LLM input text metadata. - **How it works**: + watsonx.governance calculates the following metadata with the LLM input text: + **Character count**: Total number of characters in the input text + **Word count**: Total number of words in the input text + **Sentence count**: Total number of sentences in the input text + **Average word length**: Average length of words in the input text + **Average sentence length**: Average length of the sentences in the input text + watsonx.governance calculates input metadata drift by measuring the change in distribution of the metadata columns. The input token count column, if present in the payload, is also used to compute the input metadata drift. You can also choose to specify any meta fields while adding records to the payload table. These meta fields are also used to compute the input metadata drift. To identify discrete numeric input metadata columns, watsonx.governance uses the following binary logarithm formula: ![Binary logarithm formula is displayed](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-feature-drift-equation.svg) If the `distinct_values_count` is less than the binary logarithm of the `total_count`, the feature is identified as discrete. For discrete input metadata columns, watsonx.governance uses the [Jensen Shannon distance](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-driftv2-config.html?context=cdpaas&locale=en#jensen-shannon-distance) formula to calculate input metadata drift. For continuous input metadata columns, watsonx.governance uses the [total variation distance](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-driftv2-config.html?context=cdpaas&locale=en#total-variation-distance) and [overlap coefficient](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-driftv2-config.html?context=cdpaas&locale=en#overlap-coefficient) formulas to calculate input metadata drift. - **Applies to prompt template evaluations**: Yes - **Task types**: - Text summarization - Text classification - Content generation - Entity extraction - Question answering + + + + + + * Output metadata drift + + Output metadata drift measures the change in distribution of the LLM output text metadata. - **How it works**: + watsonx.governance calculates the following metadata with the LLM output text: + **Character count**: Total number of characters in the output text + **Word count**: Total number of words in the output text + **Sentence count**: Total number of sentences in the output text + **Average word length**: Average length of words in the output text + **Average sentence length**: Average length of the sentences in the output text + watsonx.governance calculates output metadata drift by measuring the change in distribution of the metadata columns. The output token count column, if present in the payload, is also used to compute the output metadata drift. You can also choose to specify any meta fields while adding records to the payload table. These meta fields are also used to compute the output metadata drift. To identify discrete numeric output metadata columns, watsonx.governance uses the following binary logarithm formula: ![Binary logarithm formula is displayed](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-feature-drift-equation.svg) If the `distinct_values_count` is less than the binary logarithm of the `total_count`, the feature is identified as discrete. For discrete output metadata columns, watsonx.governance uses the [Jensen Shannon distance](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-driftv2-config.html?context=cdpaas&locale=en#jensen-shannon-distance) formula to calculate input metadata drift. For continuous output metadata columns, watsonx.governance uses the [total variation distance](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-driftv2-config.html?context=cdpaas&locale=en#total-variation-distance) and [overlap coefficient](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-driftv2-config.html?context=cdpaas&locale=en#overlap-coefficient) formulas to calculate output metadata drift: - **Applies to prompt template evaluations**: Yes - **Task types**: - Text summarization - Text classification - Content generation - Question answering + + + +watsonx\.governance uses the following formulas to calculate drift v2 evaluation metrics: + +### Total variation distance ### + +Total variation distance measures the maximum difference between the probabilities that two probability distributions, baseline (B) and production (P), assign to the same transaction as shown in the following formula: + +![Probability distribution formula is displayed](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-total-variation-distance-0.svg) + +If the two distributions are equal, the total variation distance between them becomes 0\. + +watsonx\.governance uses the following formula to calculate total variation distance: + +![Total variation distance formula is displayed](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-total-variation-distance.svg) + + + + * 푥 is a series of equidistant samples that span the domain of ![circumflex f is displayed](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-f-symbol.svg) that range from the combined miniumum of the baseline and production data to the combined maximum of the baseline and production data\. + * ![d(x) symbol is displayed](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-d-x.svg) is the difference between two consecutive 푥 samples\. + * ![explanation of formula](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-total-variation-formula-2.svg) is the value of the density function for production data at a 푥 sample\. + * ![explanation of formula](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-total-variation-formula-3.svg) is the value of the density function for baseline data for at a 푥 sample\. + + + +The ![explanation of formula](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-total-variation-formula-4.svg) denominator represents the total area under the density function plots for production and baseline data\. These summations are an approximation of the integrations over the domain space and both these terms should be 1 and total should be 2\. + +### Overlap coefficient ### + +watsonx\.governance calculates the overlap coefficient by measuring the total area of the intersection between two probability distributions\. To measure dissimilarity between distributions, the intersection or the overlap area is subtracted from 1 to calculate the amount of drift\. watsonx\.governance uses the following formula to calculate the overlap coefficient: + +![Overlap coefficient formula is displayed](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-total-variation-formula-5.svg) + + + + * 푥 is a series of equidistant samples that span the domain of ![circumflex f is displayed](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-f-symbol.svg) that range from the combined miniumum of the baseline and production data to the combined maximum of the baseline and production data\. + * ![d(x) symbol is displayed](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-d-x.svg) is the difference between two consecutive 푥 samples\. + * ![explanation of formula](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-total-variation-formula-2.svg) is the value of the density function for production data at a 푥 sample\. + * ![explanation of formula](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-total-variation-formula-3.svg) is the value of the density function for baseline data for at a 푥 sample\. + + + +### Jensen Shannon distance ### + +Jensen Shannon Distance is the normalized form of Kullback\-Liebler (KL) Divergence that measures how much one probability distribution differs from the second probabillity distribution\. Jensen Shannon Distance is a symmetrical score and always has a finite value\. + +watsonx\.governance uses the following formula to calculate the Jensen Shannon distance for two probability distributions, baseline (B) and production (P): + +![Jensen Shannon distance formula is displayed](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-jensen-shannon-distance.svg) + +![KL Divergence is displayed](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-KL-divergence.svg) is the KL Divergence\. + +**Parent topic:**[Configuring model evaluations](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-monitors-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ad5b9969c7557bfc4cfbb32cca67f40c52ff824b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ad5b9969c7557bfc4cfbb32cca67f40c52ff824b.md new file mode 100644 index 0000000..0901b2b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ad5b9969c7557bfc4cfbb32cca67f40c52ff824b.md @@ -0,0 +1,92 @@ +# Coding and running a notebook + +# Coding and running a notebook # + +After you created a notebook to use in the notebook editor, you need to add libraries, code, and data so you can do your analysis\. + +To develop analytic applications in a notebook, follow these general steps: + + + +1. Open the notebook in edit mode: click the edit icon (![Edit icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/pencil-icon.png))\. If the notebook is locked, you might be able to [unlock and edit](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-assets.html#editassets) it\. +2. If the notebook is marked as being *untrusted*, tell the Jupyter service to trust your notebook content and allow executing all cells by: + + + + 1. Clicking **Not Trusted** in the upper right corner of the notebook. + 2. Clicking **Trust** to execute all cells. + + + +3. Determine if the environment template that is associated with the notebook has the correct hardware size for the anticipated analysis processing throughput\. + + + + 1. Check the size of the environment by clicking the View notebook info icon (![Edit icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/info_panel.png)) from the notebook toolbar and selecting the **Environments** page. + 2. If you need to change the environment, select another one from the list or, if none fits your needs, create your own environment template. See [Creating emvironment template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-customize-env-definition.html). + + If you create an environment template, you can add your own libraries to the template that are preinstalled at the time the environment is started. See [Customize your environment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/customize-envs.html) for Python and R. + + + +4. Import preinstalled libraries\. See [Libraries and scripts for notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/libraries.html)\. +5. Load and access data\. You can access data from project assets by running code that is generated for you when you select the asset or programmatically by using preinstalled library functions\. See [Load and access data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html)\. +6. Prepare and analyze the data with the appropriate methods: + + + + * [Build Watson Machine Learning models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-overview.html) + * [Build Decision Optimization models](https://dataplatform.cloud.ibm.com/docs/content/DO/DOWS-Cloud_home.html) + * [Use Watson Natural Language Processing](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp.html) + * [Use SPSS predictive analytics algorithms](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spss-algorithms.html) + * [Use geospatial location analysis methods](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/geo-spatial-lib.html) + * [Use Data skipping for Spark SQL](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-skipping-spark-sql.html) + * [Apply Parquet encryption](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/parquet-encryption.html) + * [Use Time series analysis methods](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-lib.html) + + + +7. If necessary, schedule the notebook to run at a regular time\. See [Schedule a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-nb-editor.html)\. + + + + 1. Monitor the status of your job runs from the project's **Jobs** page. + 2. Click your job to open the job's details page to view the runs for your job and the status of each run. If a run failed, you can select the run and view the log tail or download the entire log file to troubleshoot the run. + + + +8. When you're not actively working on the notebook, click **File > Stop Kernel** to stop the notebook kernel and free up resources\. +9. Stop the active runtime (and unnecessary capacity unit consumption) if no other notebook kernels are active under **Tool runtimes** on the **Environments** page on the **Manage** tab of your project\. + + + +Video disclaimer: Some minor steps and graphical elements in these videos may differ from your deployment\. + +Watch this short video to see how to create a Jupyter notebook and custom environment\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +Watch this short video to see how to run basic SQL queries on Db2 Warehouse data in a Python notebook\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Learn more ## + + + + * [Markdown cheatsheet](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/markd-jupyter.html) + * [Notebook interface](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/parts-of-a-notebook.html) + + + + + + * [Stop active runtimes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html#stop-active-runtimes) + * [Load and access data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html) + * [Schedule a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-nb-editor.html) + + + +**Parent topic:**[Jupyter Notebook editor](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-editor.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ad61bc1b395a071d8850bc2405a8c311cfdc931f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ad61bc1b395a071d8850bc2405a8c311cfdc931f.md new file mode 100644 index 0000000..4247acb --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ad61bc1b395a071d8850bc2405a8c311cfdc931f.md @@ -0,0 +1,7 @@ +# Exceptions (SPSS Modeler) + +# Exceptions # + +This section describes possible exception instances\. They are all a subclass of python exception\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ad76780ea50a0fb37454a3a03ff08ca0ad39ef19.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ad76780ea50a0fb37454a3a03ff08ca0ad39ef19.md new file mode 100644 index 0000000..9c8c935 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ad76780ea50a0fb37454a3a03ff08ca0ad39ef19.md @@ -0,0 +1,242 @@ +# Scoring a time series model + +# Scoring a time series model # + +After you save an AutoAI time series pipeline as a model, you can deploy and score the model to forecast new values\. + +## Deploying a time series model ## + +After you save a model to a project, follow the steps to deploy the model: + + + +1. Find the model in the project asset list\. +2. Promote the model to a deployment space\. +3. Promote payload data to the deployment space\. +4. From the deployment space, create a deployment\. + + + +## Scoring considerations ## + +To this point, deploying a time series model follows the same steps as deploying a classification or regression model\. However, because of the way predictions are structured and generated in a time series model, your input must match your model structure\. For example, the way you structure your payload depends on whether you are predicting a single result (univariate) or multiple results (multivariate)\. + +Note these high\-level considerations: + + + + * To get the first forecast window row or rows after the last row in your data, send an empty payload\. + * To get the next value, send the result from the empty payload request as your next scoring request, and so on\. + * You can send multiple rows as input, to build trends and predict the next value after a trend\. + * If you have multiple prediction columns, you need to include a value for each of them in your scoring request + + + +## Scoring an online deployment ## + +If you create an online deployment, you can pass the payload data by using an input form or by submitting JSON code\. This example shows how to structure the JSON code to generate predictions\. + +### Predicting a single value ### + +In the simplest case, given this sample data, you are trying to forecast the next step of `value1` with a forecast window of 1, meaning each prediction will be a single step (row)\. + + + +| timestamp | value1 | +| ----------------- | ------ | +| 2015\-02026 21:42 | 2 | +| 2015\-02026 21:47 | 4 | +| 2015\-02026 21:52 | 6 | +| 2015\-02026 21:57 | 8 | +| 2015\-02026 22:02 | 10 | + + + +You must pass a blank entry as the input data to request the first prediction, which is structured like this: + + { + "input_data": [ + { + "fields": + "value1" + ], + "values": ] + } + ] + } + +The output that is returned predicts the next step in the model: + + { + "predictions": [ + { + "fields": + "prediction" + ], + "values": + + 12 + ] + ] + } + ] + } + +The next input passes the result of the previous output to predict the next step: + + { + "input_data": [ + { + "fields": + "value1" + ], + "values": + 12] + ] + } + ] + } + +### Predicting multiple values ### + +In this case, you are predicting two targets, `value1` and `value2`\. + + + +| timestamp | value1 | value2 | +| ----------------- | ------ | ------ | +| 2015\-02026 21:42 | 2 | 1 | +| 2015\-02026 21:47 | 4 | 3 | +| 2015\-02026 21:52 | 6 | 5 | +| 2015\-02026 21:57 | 8 | 7 | +| 2015\-02026 22:02 | 10 | 9 | + + + +The input data must still pass a blank entry to request the first prediction\. The next input would be structured like this: + + { + "input_data": [ + { + "fields": + "value1", + "value2" + ], + "values": + 2, 1], + ] + } + ] + } + +## Predicting based on new observations ## + +If instead of predicting the next row based on the prior step you want to enter new observations, enter the input data like this for a univariate model: + + { + "input_data": [ + { + "fields": + "value1" + ], + "values": + 2], + 4], + 6] + ] + } + ] + } + +Enter new observations like this for a multivariate model: + + { + "input_data": [ + { + "fields": + "value1", + "value2" + ], + "values": + 2, 1], + 4, 3], + 6, 5] + ] + } + ] + } + +Where 2, 4, and 6 are observations for `value1` and 1, 3, 5 are observations for `value2`\. + +## Scoring a time series model with Supporting features ## + +After you deploy your model, you can go to the page detailing your deployment to get prediction values\. Choose one of the following ways to test your deployment: + +### Using existing input values ### + +You can use existing input values in your data set to obtain prediction values\. Click **Predict** to obtain a set of prediction values\. The total number of prediction values in the output is defined by prediction horizon that you previously set during the experiment configuration stage\. + +### Using new input values ### + +You can choose to populate the spreadsheet with new input values or use JSON code to obtain a prediction\. + +#### Using spreadsheet to provide new input data for predicting values #### + +To add input data to the **New observations (optional)** spreadsheet, select the **Input** tab and do one of the following: + + + + * Add pre\-existing \.csv file containing new observations from your local directory by clicking **Browse local files**\. + * Download the input file template by clicking **Download CSV template**, enter values, and upload the file\. + * Use an existing data asset from your project by clicking **Search in space**\. + * Manually enter input observations in the spreadsheet\. + + + +You can also provide future values for Supporting features if you previously enabled your experiment to leverage these values during the experiment configuration stage\. Make sure to add these values to the *Future supporting features (optional)* spreadsheet\. + +#### Using JSON code to provide input data #### + +To add input data using JSON code, select the **Paste JSON** tab and do one of the following: + + + + * Add pre\-existing JSON file containing new observations from your local directory by clicking **Browse local files**\. + * Use an existing data asset from your project by clicking **Search in space**\. + * Manually enter or paste JSON code into the editor\. + + + +In this code sample, the prediction column is `pollution`, and the supporting features are `temp` and `press`\. + + { + "input_data": [ + { + "id": "observations", + "values": + + 96.125, + 3.958, + 1026.833 + ] + ] + }, + { + "id": "supporting_features", + "values": + + 3.208, + 1020.667 + ] + ] + } + ] + } + +## Next steps ## + +[Saving an AutoAI generated notebook (Watson Machine Learning)](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-notebook.html) + +**Parent topic:**[Building a time series experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adb2d2b53c7f2a464a38f7de5d7a74a39e697528.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adb2d2b53c7f2a464a38f7de5d7a74a39e697528.md new file mode 100644 index 0000000..822dc2c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adb2d2b53c7f2a464a38f7de5d7a74a39e697528.md @@ -0,0 +1,32 @@ +# Common modeling node properties + +# Common modeling node properties # + +The following properties are common to some or all modeling nodes\. Any exceptions are noted in the documentation for individual modeling nodes as appropriate\. + + + +Common modeling node properties + +Table 1\. Common modeling node properties + +| Property | Values | Property description | +| ---------------------- | ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `custom_fields` | *flag* | If true, allows you to specify target, input, and other fields for the current node\. If false, the current settings from an upstream Type node are used\. | +| `target` or `targets` | *field* or \[*field1 \.\.\. fieldN*\] | Specifies a single target field or multiple target fields depending on the model type\. | +| `inputs` | \[*field1 \.\.\. fieldN*\] | Input or predictor fields used by the model\. | +| `partition` | *field* | | +| `use_partitioned_data` | *flag* | If a partition field is defined, this option ensures that only data from the training partition is used to build the model\. | +| `use_split_data` | *flag* | | +| `splits` | *\[field1 \.\.\. fieldN\]* | Specifies the field or fields to use for split modeling\. Effective only if `use_split_data` is set to `True`\. | +| `use_frequency` | *flag* | Weight and frequency fields are used by specific models as noted for each model type\. | +| `frequency_field` | *field* | | +| `use_weight` | *flag* | | +| `weight_field` | *field* | | +| `use_model_name` | *flag* | | +| `model_name` | *string* | Custom name for new model\. | +| `mode` | `Simple``Expert` | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adbd308eeb761b4a1516d49f68c880eaf3f08d78.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adbd308eeb761b4a1516d49f68c880eaf3f08d78.md new file mode 100644 index 0000000..94e1423 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adbd308eeb761b4a1516d49f68c880eaf3f08d78.md @@ -0,0 +1,20 @@ +# Batch deployment input details for Spark models + +# Batch deployment input details for Spark models # + +Follow these rules when you are specifying input details for batch deployments of Spark models\. + +Data type summary table: + + + +| Data | Description | +| ------------ | ----------- | +| Type | Inline | +| File formats | N/A | + + + +**Parent topic:**[Batch deployment input details by framework](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-by-framework.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adbef9d5635eb271a8bd78b23064dcba1a1915a6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adbef9d5635eb271a8bd78b23064dcba1a1915a6.md new file mode 100644 index 0000000..acb9e2a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adbef9d5635eb271a8bd78b23064dcba1a1915a6.md @@ -0,0 +1,12 @@ +# CLEM language reference (SPSS Modeler) + +# CLEM (legacy) language reference # + +This section describes the Control Language for Expression Manipulation (CLEM), which is a powerful tool used to analyze and manipulate the data used in SPSS Modeler flows\. + +You can use CLEM within nodes to perform tasks ranging from evaluating conditions or deriving values to inserting data into reports\. CLEM expressions consist of values, field names, operators, and functions\. Using the correct syntax, you can create a wide variety of powerful data operations\. + +Figure 1\. Expression Builder + +![Expression Builder](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/expressionbuilder_full.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adeb3c4ba4949f2c87919d5493b71b67028b76ee.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adeb3c4ba4949f2c87919d5493b71b67028b76ee.md new file mode 100644 index 0000000..ca61e18 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adeb3c4ba4949f2c87919d5493b71b67028b76ee.md @@ -0,0 +1,29 @@ +# Get started + +# Get started # + +Federated Learning is appropriate for any situation where different entities from different geographical locations or Cloud providers want to train an analytical model without sharing their data\. + +To get started with Federated Learning, choose from these options: + + + + * Familiarize yourself with the key concepts and [Terminology](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-term.html)\. + * Review the [architecture](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-arch.html) for creating a Federated Learning experiment\. + * Follow a tutorial for step\-by\-step instructions for creating a [Federated Learning experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-demo.html) or review samples\. + + + +## Learn more ## + + + + * [Terminology](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-term.html) + + * [Federated Learning architecture](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-arch.html) + + + +**Parent topic:**[IBM Federated Learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fed-lea.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adf96f4dc435ccf7e702eeac6fcaa9f7decd1dcb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adf96f4dc435ccf7e702eeac6fcaa9f7decd1dcb.md new file mode 100644 index 0000000..227810e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/adf96f4dc435ccf7e702eeac6fcaa9f7decd1dcb.md @@ -0,0 +1,80 @@ +# gle properties + +# gle properties # + +![GLE node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/glenodeicon.png)A GLE extends the linear model so that the target can have a non\-normal distribution, is linearly related to the factors and covariates via a specified link function, and so that the observations can be correlated\. Generalized linear mixed models cover a wide variety of models, from simple linear regression to complex multilevel models for non\-normal longitudinal data\. + + + +gle properties + +Table 1\. gle properties + +| `gle` Properties | Values | Property description | +| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `custom_target` | *flag* | Indicates whether to use target defined in upstream node (`false`) or custom target specified by `target_field` (`true`)\. | +| `target_field` | *field* | Field to use as target if `custom_target` is `true`\. | +| `use_trials` | *flag* | Indicates whether additional field or value specifying number of trials is to be used when target response is a number of events occurring in a set of trials\. Default is `false`\. | +| `use_trials_field_or_value` | `Field`
`Value` | Indicates whether field (default) or value is used to specify number of trials\. | +| `trials_field` | *field* | Field to use to specify number of trials\. | +| `trials_value` | *integer* | Value to use to specify number of trials\. If specified, minimum value is 1\. | +| `use_custom_target_reference` | *flag* | Indicates whether custom reference category is to be used for a categorical target\. Default is `false`\. | +| `target_reference_value` | *string* | Reference category to use if `use_custom_target_reference` is `true`\. | +| `dist_link_combination` | `NormalIdentity`
`GammaLog`
`PoissonLog`
`NegbinLog`
`TweedieIdentity`
`NominalLogit`
`BinomialLogit`
`BinomialProbit`
`BinomialLogC`
`CUSTOM` | Common models for distribution of values for target\. Choose `CUSTOM` to specify a distribution from the list provided by `target_distribution`\. | +| `target_distribution` | `Normal`
`Binomial`
`Multinomial`
`Gamma`
`INVERSE_GAUSS`
`NEG_BINOMIAL`
`Poisson`
`TWEEDIE`
`UNKNOWN` | Distribution of values for target when `dist_link_combination` is `Custom`\. | +| `link_function_type` | `UNKNOWN`
`IDENTITY`
`LOG`
`LOGIT`
`PROBIT`
`COMPL_LOG_LOG`
`POWER`
`LOG_COMPL`
`NEG_LOG_LOG`
`ODDS_POWER`
`NEG_BINOMIAL`
`GEN_LOGIT`
`CUMUL_LOGIT`
`CUMUL_PROBIT`
`CUMUL_COMPL_LOG_LOG`
`CUMUL_NEG_LOG_LOG`
`CUMUL_CAUCHIT` | Link function to relate target values to predictors\. If `target_distribution` is `Binomial` you can use:

`UNKNOWN``IDENTITY``LOG``LOGIT``PROBIT``COMPL_LOG_LOG``POWER``LOG_COMPL``NEG_LOG_LOG``ODDS_POWER`

If `target_distribution` is `NEG_BINOMIAL` you can use:

`NEG_BINOMIAL`

If `target_distribution` is `UNKNOWN`, you can use:

`GEN_LOGIT``CUMUL_LOGIT``CUMUL_PROBIT``CUMUL_COMPL_LOG_LOG``CUMUL_NEG_LOG_LOG``CUMUL_CAUCHIT` | +| `link_function_param` | *number* | Tweedie parameter value to use\. Only applicable if `normal_link_function` or `link_function_type` is `POWER`\. | +| `tweedie_param` | *number* | Link function parameter value to use\. Only applicable if `dist_link_combination` is set to `TweedieIdentity`, or `link_function_type` is `TWEEDIE`\. | +| `use_predefined_inputs` | *flag* | Indicates whether model effect fields are to be those defined upstream as input fields (`true`) or those from `fixed_effects_list` (`false`)\. | +| `model_effects_list` | *structured* | If `use_predefined_inputs` is `false`, specifies the input fields to use as model effect fields\. | +| `use_intercept` | *flag* | If `true` (default), includes the intercept in the model\. | +| `regression_weight_field` | *field* | Field to use as analysis weight field\. | +| `use_offset` | `None`
`Value`
`Variable` | Indicates how offset is specified\. Value `None` means no offset is used\. | +| `offset_value` | *number* | Value to use for offset if `use_offset` is set to `offset_value`\. | +| `offset_field` | *field* | Field to use for offset value if `use_offset` is set to `offset_field`\. | +| `target_category_order` | `Ascending`
`Descending` | Sorting order for categorical targets\. Default is `Ascending`\. | +| `inputs_category_order` | `Ascending`
`Descending` | Sorting order for categorical predictors\. Default is `Ascending`\. | +| `max_iterations` | *integer* | Maximum number of iterations the algorithm will perform\. A non\-negative integer; default is 100\. | +| `confidence_level` | *number* | Confidence level used to compute interval estimates of the model coefficients\. A non\-negative integer; maximum is 100, default is 95\. | +| `test_fixed_effects_coeffecients` | `Model`
`Robust` | Method for computing the parameter estimates covariance matrix\. | +| `detect_outliers` | *flag* | When true the algorithm finds influential outliers for all distributions except multinomial distribution\. | +| `conduct_trend_analysis` | *flag* | When true the algorithm conducts trend analysis for the scatter plot\. | +| `estimation_method` | `FISHER_SCORING`
`NEWTON_RAPHSON`
`HYBRID` | Specify the maximum likelihood estimation algorithm\. | +| `max_fisher_iterations` | *integer* | If using the `FISHER_SCORING``estimation_method`, the maximum number of iterations\. Minimum 0, maximum 20\. | +| `scale_parameter_method` | `MLE`
`FIXED`
`DEVIANCE`
`PEARSON_CHISQUARE` | Specify the method to be used for the estimation of the scale parameter\. | +| `scale_value` | *number* | Only available if `scale_parameter_method` is set to `Fixed`\. | +| `negative_binomial_method` | `MLE`
`FIXED` | Specify the method to be for the estimation of the negative binomial ancillary parameter\. | +| `negative_binomial_value` | *number* | Only available if `negative_binomial_method` is set to `Fixed`\. | +| `use_p_converge` | *flag* | Option for parameter convergence\. | +| `p_converge` | *number* | Blank, or any positive value\. | +| `p_converge_type` | *flag* | True = Absolute, False = Relative | +| `use_l_converge` | *flag* | Option for log\-likelihood convergence\. | +| `l_converge` | *number* | Blank, or any positive value\. | +| `l_converge_type` | *flag* | True = Absolute, False = Relative | +| `use_h_converge` | *flag* | Option for Hessian convergence\. | +| `h_converge` | *number* | Blank, or any positive value\. | +| `h_converge_type` | *flag* | True = Absolute, False = Relative | +| `max_iterations` | *integer* | Maximum number of iterations the algorithm will perform\. A non\-negative integer; default is 100\. | +| `sing_tolerance` | *integer* | | +| `use_model_selection` | *flag* | Enables the parameter threshold and model selection method controls\.\. | +| `method` | `LASSO`

`ELASTIC_NET`

`FORWARD_STEPWISE`
`RIDGE` | Determines the model selection method, or if using `Ridge` the regularization method, used\. | +| `detect_two_way_interactions` | *flag* | When `True` the model will automatically detect two\-way interactions between input fields\. This control should only be enabled if the model is main effects only (that is, where the user has not created any higher order effects) and if the `method` selected is Forward Stepwise, Lasso, or Elastic Net\. | +| `automatic_penalty_params` | *flag* | Only available if model selection `method` is Lasso or Elastic Net\. Use this function to enter penalty parameters associated with either the Lasso or Elastic Net variable selection methods\. If `True`, default values are used\. If `False`, the penalty parameters are enabled custom values can be entered\. | +| `lasso_penalty_param` | *number* | Only available if model selection `method` is Lasso or Elastic Net and `automatic_penalty_params` is `False`\. Specify the penalty parameter value for Lasso\. | +| `elastic_net_penalty_param1` | *number* | Only available if model selection `method` is Lasso or Elastic Net and `automatic_penalty_params` is `False`\. Specify the penalty parameter value for Elastic Net parameter 1\. | +| `elastic_net_penalty_param2` | *number* | Only available if model selection `method` is Lasso or Elastic Net and `automatic_penalty_params` is `False`\. Specify the penalty parameter value for Elastic Net parameter 2\. | +| `probability_entry` | *number* | Only available if the `method` selected is Forward Stepwise\. Specify the significance level of the f statistic criterion for effect inclusion\. | +| `probability_removal` | *number* | Only available if the `method` selected is Forward Stepwise\. Specify the significance level of the f statistic criterion for effect removal\. | +| `use_max_effects` | *flag* | Only available if the `method` selected is Forward Stepwise\. Enables the `max_effects` control\. When `False` the default number of effects included should equal the total number of effects supplied to the model, minus the intercept\. | +| `max_effects` | *integer* | Specify the maximum number of effects when using the forward stepwise building method\. | +| `use_max_steps` | *flag* | Enables the `max_steps` control\. When `False` the default number of steps should equal three times the number of effects supplied to the model, excluding the intercept\. | +| `max_steps` | *integer* | Specify the maximum number of steps to be taken when using the Forward Stepwise building `method`\. | +| `use_model_name` | *flag* | Indicates whether to specify a custom name for the model (`true`) or to use the system\-generated name (`false`)\. Default is `false`\. | +| `model_name` | *string* | If `use_model_name` is `true`, specifies the model name to use\. | +| `usePI` | *flag* | If `true`, predictor importance is calculated\.\. | +| `perform_model_effect_tests` | *boolean* | Whether to perform model effect tests\. | +| `non_neg_least_squares` | *integer* | Whether to perform non\-negative least squares\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ae3f5b72354288cc106bb10263673ebc80b2d544.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ae3f5b72354288cc106bb10263673ebc80b2d544.md new file mode 100644 index 0000000..873c89b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ae3f5b72354288cc106bb10263673ebc80b2d544.md @@ -0,0 +1,7 @@ +# Scripting tips + +# Scripting tips # + +This section provides tips and techniques for using scripts, including modifying flow execution, and using an encoded password in a script\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ae57c56703b39c9097516d1466b70a3de57aa1c4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ae57c56703b39c9097516d1466b70a3de57aa1c4.md new file mode 100644 index 0000000..66fcab7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ae57c56703b39c9097516d1466b70a3de57aa1c4.md @@ -0,0 +1,101 @@ +# Running a pipeline + +## Running a pipeline ## + +You can run a pipeline in real time to test a flow as you work\. When you are satisfied with a pipeline, you can then define a job to run a pipeline with parameters or to run on a schedule\. + +To run a pipeline: + + + +1. Click **Run pipeline** on the toolbar\. +2. Choose an option: + + + + * **Trial run** runs the pipeline without creating a job. Use this to test a pipeline. + * **Create a job** presents you with an interface for configuring and scheduling a job to run the pipeline. You can save and reuse run details, such as pipeline parameters, for a version of your pipeline. + * **View history** compares all of your runs over time. + + + + + +You must make sure requirements are met when you run a pipeline\. For example, you might need a deployment space or an API key to run some of your nodes before you can begin\. + +### Using a job run name ### + +You can optionally specify a job run name when running a pipeline flow or a pipeline job and see the different jobs in the **Job details** dashboard\. Otherwise, you can also assign a local parameter `DSJobInvocationId` to either a **Run pipeline job** node or **Run DataStage job** node\. + +If both the parameter `DSJobInvocationId` and job name of the node are set, `DSJobInvocationId` will be used\. If neither are set, the default value "job run" is used\. + +### Notes on running a pipeline ### + + + + * When you run a pipeline from a trial run or a job, click the node output to view the results of a successful run\. If the run fails, error messages and logs are provided to help you correct issues\. + * Errors in the pipeline are flagged with an error badge\. Open the node or condition with an error to change or complete the configuration\. + * View the consolidated logs to review operations or identify issues with the pipeline\. + + + +## Creating a pipeline job ## + +The following are all the configuration options for defining a job to run the pipeline\. + + + +1. Name your pipeline job and choose a version\. +2. Input your IBM API key\. +3. **(Optional)** Schedule your job by toggling the **Schedule** button\. + + + + 1. Choose the start date and fine tune your schedule to repeat by any minute, hour, day, week, month. + 2. Add exception days to prevent the job from running on certain days. + 3. Add a time for terminating the job. + + + +4. **(Optional)** Enter the pipeline parameters needed for your job, for example assigning a space to a deployment node\. To see how to create a pipeline parameter, see **Defining pipeline parameters** in [Creating a pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-create.html)\. +5. **(Optional)** Choose if you want to be notified of pipeline job status after running\. + + + +## Saving a version of a pipeline ## + +You can save a version of a pipeline and revert to it at a later time\. For example, if you want to preserve a particular configuration before you make changes, save a version\. You can revert the pipeline to a previous version\. When you share a pipeline, the latest version is used\. + +To save a version: + + + +1. Click the Versions icon on the toolbar\. +2. In the Versions pane, click **Save version** to create a new version with a version number incremented by 1\. + + + +When you run the pipeline, you can choose from available saved versions\. + +Note: You cannot delete a saved version\. + +## Exporting pipeline assets ## + +When you export project or space assets to import them into a deployment space, you can include pipelines in the list of assets you export to a zip file and then import into a project or space\. + +Importing a pipeline into a space extends your MLOps capabilities to run jobs for various assets from a space, or to move all jobs from a pre\-production to a production space\. Note these considerations for working with pipelines in a space: + + + + * Pipelines in a space are read\-only\. You cannot edit the pipeline\. You must edit the pipeline from the project, then export the updated pipeline and import it into the space\. + * Although you cannot edit the pipeline in a space, you can create new jobs to run the pipeline\. You can also use parameters to assign values for jobs so you can have different values for each job you configure\. + * If there is already a pipeline in the space with the same name, the pipeline import will fail\. + * If there is no pipeline in the space with the same name, a pipeline with version 1 is created in the space\. + * Any supporting assets or references required to run a pipeline job must also be part of the import package or the job will fail\. + * If your pipeline contains assets or tools not supported in a space, such as an SPSS modeler job, the pipeline job will fail\. + + + +**Parent topic:**[IBM Watson Pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aee1a739f2ea11f815ec571163ba99c9b2a97245.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aee1a739f2ea11f815ec571163ba99c9b2a97245.md new file mode 100644 index 0000000..46f124f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/aee1a739f2ea11f815ec571163ba99c9b2a97245.md @@ -0,0 +1,24 @@ +# applyselflearningnode properties + +# applyselflearningnode properties # + +You can use Self\-Learning Response Model (SLRM) modeling nodes to generate a SLRM model nugget\. The scripting name of this model nugget is *applyselflearningnode*\. For more information on scripting the modeling node itself, see [slrmnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/selflearnnodeslots.html#selflearnnodeslots)\. + + + +applyselflearningnode properties + +Table 1\. applyselflearningnode properties + +| `applyselflearningnode` Properties | Values | Property description | +| ---------------------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `max_predictions` | *number* | | +| `randomization` | *number* | | +| `scoring_random_seed` | *number* | | +| `sort` | `ascending`
`descending` | Specifies whether the offers with the highest or lowest scores will be displayed first\. | +| `model_reliability` | *flag* | Takes account of the model reliability option in the node settings\. | +| `enable_sql_generation` | `false`
`native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/af0f7c335a10c372c36a0ccec76057c41b93731b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/af0f7c335a10c372c36a0ccec76057c41b93731b.md new file mode 100644 index 0000000..923f883 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/af0f7c335a10c372c36a0ccec76057c41b93731b.md @@ -0,0 +1,43 @@ +# SQL optimization (SPSS Modeler) + +# SQL optimization # + +You can push many data preparation and mining operations directly in your database to improve performance\. + +One of the most powerful capabilities of SPSS Modeler is the ability to perform many data preparation and mining operations directly in the database\. By generating SQL code that can be pushed back to the database for execution, many operations, such as sampling, sorting, deriving new fields, and certain types of graphing, can be performed in the database rather than on the client or server computer\. When you're working with large datasets, these pushbacks can dramatically enhance performance in several ways: + + + + * By reducing the size of the result set to be transferred from the DBMS to watsonx\.ai\. When large result sets are read through an ODBC driver, network I/O or driver inefficiencies may result\. For this reason, the operations that benefit most from SQL optimization are row and column selection and aggregation (Select, Sample, Aggregate nodes), which typically reduce the size of the dataset to be transferred\. Data can also be cached to a temporary table in the database at critical points in the flow (after a Merge or Select node, for example) to further improve performance\. + * By making use of the performance and scalability of the database\. Efficiency is increased because a DBMS can often take advantage of parallel processing, more powerful hardware, more sophisticated management of disk storage, and the presence of indexes\. + + + +Given these advantages, watsonx\.ai is designed to maximize the amount of SQL generated by each SPSS Modeler flow so that only those operations that can't be compiled to SQL are executed by watsonx\.ai\. Because of limitations in what can be expressed in standard SQL (SQL\-92), however, certain operations may not be supported\. + +For details about currently supported databases, see [Supported data sources for SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsd/spss-connections.html)\. + +Tips: + + + + * When running a flow, nodes that push back to your database are highlighted with a small SQL icon beside the node\. When you start making edits to a flow after running it, the icons will be removed until the next time you run the flow\. + + Figure 1. SQL pushback indicator + + ![SQL pushback indicator](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/sql_icon.png) + * If you want to see which nodes will push back *before* running a flow, click SQL preview\. This enables you to modify the flow before you run it to improve performance by moving the non\-pushback operations as far downstream as possible, for example\. + * If a node can't be pushed back, all subsequent nodes in the flow won't be pushed back either (pushback stops at that node)\. This may impact how you want to organize the order of nodes in your flow\. + + + +Notes: Keep the following information in mind regarding SQL: + + + + * Because of minor differences in SQL implementation, flows that run in a database may return slightly different results when executed in watsonx\.ai\. These differences may also vary depending on the database vendor, for similar reasons\. For example, depending on the database configuration for case sensitivity in string comparison and string collation, SPSS Modeler flows that run using SQL pushback may produce different results from those that run without SQL pushback\. Contact your database administrator for advice on configuring your database\. To maximize compatibility with watsonx\.ai, database string comparisons should be case sensitive\. + * When using watsonx\.ai to generate SQL, it's possible the result using SQL pushback is not consistent on some platforms (Linux, for example)\. This is because floating point is handled differently on different platforms\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/af19b6a59e167d486d94f4bbb3724ce1deae5feb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/af19b6a59e167d486d94f4bbb3724ce1deae5feb.md new file mode 100644 index 0000000..a9ab5df --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/af19b6a59e167d486d94f4bbb3724ce1deae5feb.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Prompt priming # + +![icon for multi\-category risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-multi-category.svg)Risks associated with inputInferenceMulti\-categoryAmplified + +### Description ### + +Because generative models tend to produce output like the input provided, the model can be prompted to reveal specific kinds of information\. For example, adding personal information in the prompt increases its likelihood of generating similar kinds of personal information in its output\. If personal data was included as part of the model’s training, there is a possibility it could be revealed\. + +### Why is prompt priming a concern for foundation models? ### + +Depending on the content revealed, business entities could face fines, reputational harm, and other legal consequences\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/af2ac67b66d3a2db0d4f2af2d6743f903f1385d7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/af2ac67b66d3a2db0d4f2af2d6743f903f1385d7.md new file mode 100644 index 0000000..072c11b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/af2ac67b66d3a2db0d4f2af2d6743f903f1385d7.md @@ -0,0 +1,50 @@ +# Installing custom libraries through notebooks + +# Installing custom libraries through notebooks # + +The prefered way of installing additional Python libraries to use in a notebook is to customize the software configuration of the environment runtime associated with the notebook\. You can add the conda or PyPi packages through a customization template when you customize the environment template\. + +See [Customizing environment templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/customize-envs.html)\. + +However, if you want to install packages from somewhere else or packages you created on your local machine, for example, you can install and import the packages through the notebook\. + +To install packages other than conda or PyPi packages through your notebook: + + + +1. Add the package to your project storage by clicking the **Upload asset to project** icon (![Shows the Upload asset to project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/find_data_icon.png)), and then browsing the package file or dragging it into your notebook sidebar\. +2. Add a project token to the notebook by clicking **More > Insert project token** from the notebook action bar\. The code that is generated by this action initializes the variable `project`, which is required to access the library you uploaded to object storage\. + + Example of an inserted project token: + + # @hidden_cell + # The project token is an authorization token that is used to access project resources like data sources, connections, and used by platform APIs. + from project_lib import Project + project = Project(project_id='7c7a9455-1916-4677-a2a9-a61a75942f58', project_access_token='p-9a4c487075063e610471d6816e286e8d0d222141') + pc = project.project_context + + If you don't have a token, you need to create one. See [Adding a project token](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/token.html). +3. Install the library: + + + + ```python + # Fetch the library file, for example the tar.gz or whatever installable distribution you created + with open("xxx-0.1.tar.gz","wb") as f: + f.write(project.get_file("xxx-0.1.tar.gz").read()) + + # Install the library + !pip install xxx-0.1.tar.gz + ``` + + + +1. Now you can import the library: + + import xxx + + + +**Parent topic:**[Libraries and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/libraries.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/af3da662099bd616b642f69925aec7c8afc84611.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/af3da662099bd616b642f69925aec7c8afc84611.md new file mode 100644 index 0000000..2b03db5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/af3da662099bd616b642f69925aec7c8afc84611.md @@ -0,0 +1,18 @@ +# Sample node (SPSS Modeler) + +# Sample node # + +You can use Sample nodes to select a subset of records for analysis, or to specify a proportion of records to discard\. A variety of sample types are supported, including stratified, clustered, and nonrandom (structured) samples\. + +Sampling can be used for several reasons: + + + + * To improve performance by estimating models on a subset of the data\. Models estimated from a sample are often as accurate as those derived from the full dataset, and may be more so if the improved performance allows you to experiment with different methods you might not otherwise have attempted\. + * To select groups of related records or transactions for analysis, such as selecting all the items in an online shopping cart (or market basket), or all the properties in a specific neighborhood\. + * To identify units or cases for random inspection in the interest of quality assurance, fraud prevention, or security\. + + + +Note: If you simply want to partition your data into training and test samples for purposes of validation, a Partition node can be used instead\. See [Partition node](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/partition.html#partition) for more information\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b00beb80e522d712dc9062f835ad10e787b8c5fc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b00beb80e522d712dc9062f835ad10e787b8c5fc.md new file mode 100644 index 0000000..b39e477 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b00beb80e522d712dc9062f835ad10e787b8c5fc.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Data usage # + +![icon for data laws risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-data-laws.svg)Risks associated with inputTraining and tuning phaseData lawsTraditional + +### Description ### + +Laws and other restrictions can limit or prohibit the use of some data for specific AI use cases\. + +### Why is data usage a concern for foundation models? ### + +Failing to comply with data usage laws might result in fines and other legal consequences\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b019692a5844a9a72292a35b8953aa67836f8201.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b019692a5844a9a72292a35b8953aa67836f8201.md new file mode 100644 index 0000000..a35bbdc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b019692a5844a9a72292a35b8953aa67836f8201.md @@ -0,0 +1,640 @@ +# ibm-watson-studio-lib for R + +# ibm\-watson\-studio\-lib for R # + +The `ibm-watson-studio-lib` library for R provides access to assets\. It can be used in notebooks that are created in the notebook editor or in RStudio in a project\. `ibm-watson-studio-lib` provides support for working with data assets and connections, as well as browsing functionality for all other asset types\. + +There are two kinds of data assets: + + + + * *Stored data assets* refer to files in the storage associated with the current project\. The library can load and save these files\. For data larger than one megabyte, this is not recommended\. The library requires that the data is kept in memory in its entirety, which might be inefficient when processing huge data sets\. + * *Connected data assets* represent data that must be accessed through a connection\. Using the library, you can retrieve the properties (metadata) of the connected data asset and its connection\. The functions do not return the data of a connected data asset\. You can either use the code that is generated for you when you click **Read data** on the Code snippets panel to access the data or you must write your own code\. + + + +Note: The `ibm-watson-studio-lib` functions do not encode or decode data when saving data to or getting data from a file\. Additionally, the `ibm-watson-studio-lib` functions can't be used to access connected folder assets (files on a path to the project storage)\. + +## Setting up the `ibm-watson-studio-lib` library ## + +The `ibm-watson-studio-lib` library for R is pre\-installed and can be imported directly in a notebook in the notebook editor\. To use the `ibm-watson-studio-lib` library in your notebook, you need the ID of the project and the project token\. + +To insert the project token to your notebook: + + + +1. Click the **More** icon on your notebook toolbar and then click **Insert project token**\. + + If a project token exists, a cell is added to your notebook with the following information: + + library(ibmWatsonStudioLib) + wslib <- access_project_or_space(list("token"="")) + + `` is the value of the project token. + + If you are told in a message that no project token exists, click the link in the message to be redirected to the project's **Access Control** page where you can create a project token. You must be eligible to create a project token. For details, see [Manually adding the project token](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/token.html). + + To create a project token: + + + + 1. From the **Manage** tab, select the **Access Control** page, and click **New access token** under **Access tokens**. + 2. Enter a name, select **Editor** role for the project, and create a token. + 3. Go back to your notebook, click the **More** icon on the notebook toolbar and then click **Insert project token**. + + + + + +## The `ibm-watson-studio-lib` functions ## + +The `ibm-watson-studio-lib` library exposes a set of functions that are grouped in the following way: + + + + * [Get project information](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-r.html?context=cdpaas&locale=en#get-infos) + * [Get authentication token](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-r.html?context=cdpaas&locale=en#get-auth-token) + * [Fetch data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-r.html?context=cdpaas&locale=en#fetch-data) + * [Save data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-r.html?context=cdpaas&locale=en#save-data) + * [Get connection information](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-r.html?context=cdpaas&locale=en#get-conn-info) + * [Get connected data information](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-r.html?context=cdpaas&locale=en#get-conn-data-info) + * [Access assets by ID instead of name](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-r.html?context=cdpaas&locale=en#access-by-id) + * [Access project storage directly](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-r.html?context=cdpaas&locale=en#direct-proj-storage) + * [Spark support](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-r.html?context=cdpaas&locale=en#spark-support) + * [Browse project assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-r.html?context=cdpaas&locale=en#browse-assets) + + + +### Get project information ### + +While developing code, you might not know the exact names of data assets or connections\. The following functions provide lists of assets, from which you can pick the relevant ones\. In all examples, you can use `wslib$show(assets)` to pretty\-print the list\. The index of each item is printed in front of the item\. + + + + * `list_connections()` + + This function returns a list of the connections. The list of returned connections is not sorted by any criterion and can change when you call the function again. You can pass a list item instead of a name to `get_connection function`. + + # Import the lib + library("ibmWatsonStudioLib") + wslib <- access_project_or_space(list("token"="")) + + assets <- wslib$list_connections() + wslib$show(assets) + connprops <- wslib$get_connection(assets[0]) + * `list_connected_data()` + + This function returns the connected data assets. The list of returned connected data assets is not sorted by any criterion and can change when you call the function again. You can pass a list item instead of a name to the `get_connected_data` function. + * `list_stored_data()` + + This function returns a list of the stored data assets (data files). The list of returned data assets is not sorted by any criterion and can change when you call the function again. You can pass a list item instead of a name to the `load_data` and `save_data` functions. + + Note: A heuristic is applied to distinguish between connected data assets and stored data assets. However, there may be cases where a data asset of the wrong kind appears in the returned lists. + * `wslib$here` By using this entry point, you can retrieve metadata about the project that the lib is working with\. The entry point `wslib$here` provides the following functions: + + + + * `get_name()` + + This function returns the name of the project. + * `get_description()` + + This function returns the description of the project. + * `get_ID()` + + This function returns the ID of the project. + * `get_storage()` + + This function returns storage information for the project. + + + + + +### Get authentication token ### + +Some tasks require an authentication token\. For example, if you want to run your own requests against the [Watson Data API](https://cloud.ibm.com/apidocs/watson-data-api-cpd), you need an authentication token\. + +You can use the following function to get the bearer token: + + + + * `get_current_token()` + + + +For example: + + library("ibmWatsonStudioLib") + wslib <- access_project_or_space(list("token"="")) + token <- wslib$auth$get_current_token() + +This function returns the bearer token that is currently used by the `ibm-watson-studio-lib` library\. + +### Fetch data ### + +You can use the following functions to fetch data from a stored data asset (a file) in your project\. + + + + * `load_data(asset_name_or_item, attachment_type_or_item = NULL)` + + This function loads the data of a stored data asset into a bytes buffer. The function is not recommended for very large files. + + The function takes the following parameters: + + + + * `asset_name_or_item`: (Required) Either a string with the name of a stored data asset or an item like those returned by `list_stored_data()`. + * `attachment_type_or_item`: (Optional) Attachment type to load. A data asset can have more than one attachment with data. Without this parameter, the default attachment type, namely `data_asset` is loaded. Specify this parameter if the attachment type is not `data_asset`. For example, if a plain text data asset has an attached profile from Natural Language Analysis, this can be loaded as attachment type `data_profile_nlu`. + + Here is an example that shows you how to load the data of a data asset: + + # Import the lib + library("ibmWatsonStudioLib") + wslib <- access_project_or_space(list("token"="")) + + # Fetch the data from a file + my_file <- wslib$load_data("MyFile.csv") + + # Read the CSV data file into a data frame + df <- read.csv(text = rawToChar(my_file)) + head(df) + + + + * `download_file(asset_name_or_item, file_name = NULL, attachment_type_or_item = NULL)` + + This function downloads the data of a stored data asset and stores it in the specified file in the file system of your runtime. The file is overwritten if it already exists. + + The function takes the following parameters: + + + + * `asset_name_or_item`: (Required) Either a string with the name of a stored data asset or an item like those returned by `list_stored_data()`. + * `file_name`: (Optional) The name of the file that the downloaded data is stored to. It defaults to the asset's attachment name. + * `attachment_type_or_item`: (Optional) The attachment type to download. A data asset can have more than one attachment with data. Without this parameter, the default attachment type, namely `data_asset` is downloaded. Specify this parameter if the attachment type is not `data_asset`. For example, if a plain text data asset has an attached profile from Natural Language Analysis, this can be downlaoded loaded as attachment type `data_profile_nlu`. + + Here is an example that shows you how to you can use `download_file` to make your custom R script available in your notebook: + + # Import the lib + library("ibmWatsonStudioLib") + wslib <- access_project_or_space(list("token"="")) + + # Let's assume you have a R script "helpers.R" with helper functions on your local machine. + # Upload the script to your project using the Data Panel on the right. + + # Download the script to the file system of your runtime + wslib$download_file("helpers.R") + + # Source the script to use the contained functions, e.g. ‘my_func’, in your notebook. + source("helpers.R") + my_func() + + + + + +### Save data ### + +The functions to store data in your project storage do multiple things: + + + + * Store the data in project storage + * Add the data as a data asset (by creating an asset or overwriting an existing asset) to your project so you can see the data in the data assets list in your project\. + * Associate the asset with the file in the storage\. + + + +You can use the following functions to save data: + + + + * `save_data(asset_name_or_item, data, overwrite = NULL, mime_type = NULL, file_name = NULL)` + + This function saves data in memory to the project storage. + + The function takes the following parameters: + + + + * `asset_name_or_item`: (Required) The name of the created asset or list item that is returned by `list_stored_data()`. You can use the item if you like to overwrite an existing file. + * `data`: (Required) The data to upload. The expected data type is `raw`. + * `overwrite`: (Optional) Overwrites the data of a stored data asset if it already exists. Defaults to FALSE. If an asset item is passed instead of a name, the behavior is to overwrite the asset. + * `mime_type`: (Optional) The MIME type for the created asset. By default the MIME type is determined from the asset name suffix. If you use asset names without a suffix, specify the MIME type here. For example `mime_type=application/text` for plain text data. This parameter is ignored when overwriting an asset. + * `file_name`: (Optional) The file name to be used in the project storage. The data is saved in the storage associated with the project. When creating a new asset, the file name is derived from the asset name, but might be different. If you want to access the file directly, you can specify a file name. This parameter is ignored when overwriting an asset. + + Here is an example that shows you how to save data to a file: + + # Import the lib + library("ibmWatsonStudioLib") + wslib <- access_project_or_space(list("token"="")) + + # let's assume you have a data frame df which contains the data + # you want to save as a csv file + csv <- capture.output(write.csv(df, row.names=FALSE), type="output") + csv_raw <- charToRaw(paste0(csv, collapse='\n')) + wslib$save_data("my_asset_name.csv", csv_raw) + + # the function returns a list which contains the asset_name, asset_id, file_name and additional information upon successful saving of the data + + + + * `upload_file(file_path, asset_name = NULL, file_name = NULL, overwrite = FALSE, mime_type = NULL)` + + This function saves data in the file system in the runtime to a file associated with your project. + + The function takes the following parameters: + + + + * `file_path`: (Required) The path to the file in the file system. + * `asset_name`: (Optional) The name of the data asset that is created. It defaults to the name of the file to be uploaded. + * `file_name`: (Optional) The name of the file that is created in the storage associated with the project. It defaults to the name of the file to be uploaded. + * `overwrite`: (Optional) Overwrites an existing file in storage. Defaults to FALSE. + * `mime_type`: (Optional) The MIME type for the created asset. By default the MIME type is determined from the asset name suffix. If you use asset names without a suffix, specify the MIME type here. For example `mime_type='application/text'` for plain text data. This parameter is ignored when overwriting an asset. + + Here is an example that shows you how you can upload a file to the project: + + # Import the lib + library("ibmWatsonStudioLib") + wslib <- access_project_or_space(list("token"="")) + + # Let's assume you have downloaded a file and want to save it + # in your project. + download.file("https://some/url/data_file.csv", "data_file.csv") + wslib$upload_file("data_file.csv") + + # The function returns a list which contains the asset_name, asset_id, file_name and additional information upon successful saving of the data. + + + + + +### Get connection information ### + +You can use the following function to access the connection metadata of a given connection\. + + + + * `get_connection(name_or_item)` + + This function returns the properties (metadata) of a connection which you can use to fetch data from the connection data source. Use `wslib$show(connprops)` to view the properties. The special key `"."` in the returned list item provides information about the connection asset. + + The function takes the following required parameter: + + + + * `name_or_item`: Either a string with the name of a connection or an item like those returned by `list_connections()`. + + Note that when you work with notebooks, you can click **Read data** on the Code snippets panel to generate code to load data from a connection into a pandas DataFrame for example. + + + + + +### Get connected data information ### + +You can use the following function to access the metadata of a connected data asset\. + + + + * `get_connected_data(name_or_item)` + + This function returns the properties of a connected data asset, including the properties of the underlying connection. Use `wslib$show()` to view the properties. The special key `"."` in the returned list provides information about the data and the connection assets. + + The function takes the following required parameter: + + + + * `name_or_item`: Either a string with the name of a connected data asset or an item like those returned by `list_connected_data()`. + + Note that when you work with notebooks, you can click **Read data** on the Code snippets panel to generate code to load data from a connected data asset into a pandas DataFrame for example. + + + + + +### Access asset by ID instead of name ### + +You should preferably always access data assets and connections by a unique name\. Asset names are not necessarily always unique and the `ibm-watson-studio-lib` functions will raise an exception when a name is ambiguous\. You can rename data assets in the UI to resolve the conflict\. + +Accessing assets by a unique ID is possible but is discouraged as IDs are valid only in the current project and will break code when transferred to a different project\. This can happen for example, when projects are exported and re\-imported\. You can get the ID of a connection, connected or stored data asset by using the corresponding list function, for example `list_connections()`\. + +The entry point `wslib$by_id` provides the following functions: + + + + * `get_connection(asset_id)` + + This function accesses a connection by the connection asset ID. + * `get_connected_data(asset_id)` + + This function accesses a connected data asset by the connected data asset ID. + * `load_data(asset_id, attachment_type_or_item = NULL)` + + This function loads the data of a stored data asset by passing the asset ID. See [`load_data()`](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-r.html?context=cdpaas&locale=en#fetch-data) for a decsription of the other parameters you can pass. + * `save_data(asset_id, data, overwrite = NULL, mime_type = NULL, file_name = NULL)` + + This function saves data to a stored data asset by passing the asset ID. This implies `overwrite=TRUE`. See [`save_data()`](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-r.html?context=cdpaas&locale=en#save-data) for a description of the other parameters you can pass. + * `download_file(asset_id, file_name = NULL, attachment_type_or_item = NULL)` + + This function downloads the data of a stored data asset by passing the asset ID. See [`download_file()`](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-r.html?context=cdpaas&locale=en#fetch-data) for a description of the other parameters you can pass. + + + +### Access project storage directly ### + +You can fetch data from project storage and store data in project storage without synchronizing the project assets using the entry point wslib$storage\. + +The entry point `wslib$storage` provides the following functions: + + + + * `fetch_data(filename)` + + This function returns the data in a file as a bytes buffer. The file does not need to be registered as data asset. + + The function takes the following required parameter: + + + + * `filename`: The name of the file in the project. + + + + * `store_data(filename, data, overwrite = FALSE)` + + This function saves data in memory to storage, but does not create a new data asset. The function returns a list which contains the file name, file path and additional information. Use `Use wslib$show()` to print the information. + + The function takes the following parameters: + + + + * `filename`: (Required) The name of the file in the project storage. + * `data`: (Required) The data to save as a raw object. + * `overwrite`: (Optional) Overwrites the data of a file in storage if it already exists. By default, this is set to false. + + + + * `download_file(storage_filename, local_filename = NULL)` + + This function downloads the data in a file in storage and stores it in the specified local file. The local file is overwritten if it already existed. + + The function takes the following parameters: + + + + * `storage_filename`: (Required) The name of the file in storage to download. + * `local_filename`: (Optional) The name of the file in the local file system of your runtime to downloaded the file to. Omit this parameter to use the storage file name. + + + + * `register_asset(storage_path, asset_name = NULL, mime_type = NULL)` + + This function registers the file in storage as a data asset in your project. This operation fails if a data asset with the same name already exists. You can use this function if you have very large files that you cannot upload via save\_data(). You can upload large files directly to the IBM Cloud Object Storage bucket of your project, for example via the UI, and then register them as data assets using `register_asset()`. + + The function takes the following parameters: + + + + * `storage_path`: (Required) The path of the file in storage. + * `asset_name`: (Optional) The name of the created asset. It defaults to the file name. + * `mime_type`: (Optional) The MIME type for the created asset. By default the MIME type is determined from the asset name suffix. Use this parameter to specify a MIME type if your file name does not have a file extension or if you want to set a different MIME type. + + Note: You can register a file several times as a different data asset. Deleting one of those assets in the project also deletes the file in storage, which means that other asset references to the file might be broken. + + + + + +### Spark support ### + +The entry point `wslib$spark` provides functions to access files in storage with Spark\. + +The entry point `wslib$spark` provides the following functions: + + + + * `provide_spark_context(sc)` + + Use this function to enable Spark support. + + The function takes the following required parameter: + + + + * sc: The SparkContext. It is provided in the notebook runtime. + + The following example shows you how to set up Spark support: + + library(ibmWatsonStudioLib) + wslib <- access_project_or_space(list("token"="")) + wslib$spark$provide_spark_context(sc) + + + + * `get_data_url(asset_name)` + + This function returns a URL to access a file in storage from Spark via Hadoop. + + The function takes the following required parameter: + + + + * `asset_name`: The name of the asset. + + + + * `storage.get_data_url(file_name)` + + This function returns a URL to access a file in storage from Spark via Hadoop. The function expects the file name and not the asset name. + + The function takes the following required parameter: + + + + * `file_name`: The name of a file in the project storage. + + + + + +### Browse project assets ### + +The entry point `wslib$assets` provides generic, read\-only access to assets of any type\. For selected asset types, there are dedicated functions that provide additional data\. + +The following naming conventions apply: + + + + * Functions named `list_` return a list of named lists\. Each contained list represents one asset and includes a small set of properties (metadata) that identifies the asset\. + * Functions named `get_` return a single named list with the properties for the asset\. + + + +To pretty\-print a list or list of named lists, use `wslib$show()`\. + +The functions expect either the name of an asset, or an item from a list as the parameter\. By default, the functions return only a subset of the available asset properties\. By setting the parameter `raw_info=TRUE`, you can get the full set of asset properties\. + +The entry point `wslib$assets` provides the following functions: + + + + * `list_assets(asset_type, name = NULL, query = NULL, selector = NULL, raw_info = FALSE)` + + This function lists all assets for the given type with respect to the given constraints. + + The function takes the following parameters: + + + + * `asset_type`: (Required) The type of the assets to list, for example `data_asset`. See `list_asset_types()` for a list of the available asset types. Use asset type `asset` for the list of all available assets in the project. + * `name`: (Optional) The name of the asset to list. Use this parameter if more than one asset with the same name exists. You can only specify either `name` and `query`. + * `query`: (Optional) A query string that is passed to the Watson Data API to search for assets. You can only specify either `name` and `query`. + * `selector`: (Optional) A custom filter function on the candidate asset list items. If the selector function returns `TRUE`, the asset is included in the returned asset list. + * `raw_info`: (Optional) Returns all of the available metadata. By default, the parameter is set to `FALSE` and only a subset of the properties is returned. + + Examples of using the `list_assets` function: + + # Import the lib + library("ibmWatsonStudioLib") + wslib <- access_project_or_space(list("token"="")) + + # List all assets in the project + all_assets <- wslib$assets$list_assets("asset") + wslib$show(all_assets) + + # List all data assets with name 'MyFile.csv' + assets_by_name <- wslib$assets$list_assets("data_asset", name = "MyFile.csv") + + # List all data assets whose name starts with "MyF" + assets_by_query <- wslib$assets$list_assets("data_asset", query = "asset.name:(MyF*)") + + # List all data assets which are larger than 1MB + sizeFilter <- function(asset) asset$metadata$size > 1000000 + large_assets <- wslib$assets$list_assets("data_asset", selector = sizeFilter, raw_info = TRUE) + wslib$show(large_assets) + + # List all notebooks + notebooks <- wslib$assets$list_assets("notebook") + + + + * `list_asset_types(raw_info = FALSE)` + + This function lists all available asset types. + + The function can take the following parameter: + + + + * `raw_info`: (Optional) Returns the full set of metadata. By default, the parameter is `FALSE` and only a subset of the properties is returned. + + + + * `list_datasource_types(raw_info = FALSE)` + + This function lists all available data source types. + + The function can take the following parameter: + + + + * `raw_info`: (Optional) Returns the full set of metadata. By default, the parameter is `FALSE` and only a subset of the properties is returned. + + + + * `get_asset(name_or_item, asset_type=None, raw_info = FALSE)` + + The function returns the metadata of an asset. + + The function takes the following parameters: + + + + * `name_or_item`: (Required) The name of the asset or an item like those returned by `list_assets()` + * `asset_type`: (Optional) The type of the asset. If the parameter `name_or_item` contains a string for the name of the asset, setting `asset_type` is required. + * `raw_info`: (Optional) Returns the full set of metadata. By default, the parameter is `FALSE` and only a subset of the properties is returned. + + Example of using the `list_assets` and `get_asset` functions: + + notebooks <- wslib$assets$list_assets("notebook") + wslib$show(notebooks) + + notebook <- wslib$assets$get_asset(notebooks[1]]) + wslib$show(notebook) + + + + * `get_connection(name_or_item, with_datasourcetype=False, raw_info = FALSE)` + + This function returns the metadata of a connection. + + The function takes the following parameters: + + + + * `name_or_item`: (Required) The name of the connection or an item like those returned by `list_connections()` + * `with_datasourcetype`: (Optional) Returns additional information about the data source type of the connection. + * `raw_info`: (Optional) Returns the full set of metadata. By default, the parameter is `FALSE` and only a subset of the properties is returned. + + + + * `get_connected_data(name_or_item, with_datasourcetype=False, raw_info = FALSE)` + + This function returns the metadata of a connected data asset. + + The function takes the following parameters: + + + + * `name_or_item`: (Required) The name of the connected data asset or an item like those returned by `list_connected_data()` + * `with_datasourcetype`: (Optional) Returns additional information about the data source type of the associated connected data asset. + * `raw_info`: (Optional) Returns the full set of metadata. By default, the parameter is `FALSE` and only a subset of the properties is returned. + + + + * `get_stored_data(name_or_item, raw_info = FALSE)` + + This function returns the metadata of a stored data asset. + + The function takes the following parameters: + + + + * `name_or_item`: (Required) The name of the stored data asset or an item like those returned by `list_stored_data()` + * `raw_info`: (Optional) Returns the full set of metadata. By default, the parameter is `FALSE` and only a subset of the properties is returned. + + + + * `list_attachments(name_or_item_or_asset, asset_type=None, raw_info = FALSE)` + + This function returns a list of the attachments of an asset. + + The function takes the following parameters: + + + + * `name_or_item_or_asset`: (Required) The name of the asset or an item like those returned by `list_stored_data()` or `get_asset()`. + * `asset_type`: (Optional) The type of the asset. It defaults to type `data_asset`. + * `raw_info`: (Optional) Returns the full set of metadata. By default, the parameter is `FALSE` and only a subset of the properties is returned. + + Example of using the `list_attachments` function to read an attachment of a stored data asset: + + assets <- wslib$list_stored_data() + wslib$show(assets) + + asset <- assets[1]] + attachments <- wslib$assets$list_attachments(asset) + wslib$show(attachments) + buffer <- wslib$load_data(asset, attachments[1]]) + + + + + +**Parent topic:**[Using ibm\-watson\-studio\-lib](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/using-ibm-ws-lib.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b08a6b7a0f11fd3ab62a14f44fd4e1a771174c61.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b08a6b7a0f11fd3ab62a14f44fd4e1a771174c61.md new file mode 100644 index 0000000..8f8608d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b08a6b7a0f11fd3ab62a14f44fd4e1a771174c61.md @@ -0,0 +1,89 @@ +# Compute options for model training and scoring + +# Compute options for model training and scoring # + +When you train or score a model or function, you choose the type, size, and power of the hardware configuration that matches your computing needs\. + + + + * [Default hardware configurations](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-cuh-deploy-spaces.html?context=cdpaas&locale=en#default) + * [Compute usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-cuh-deploy-spaces.html?context=cdpaas&locale=en#compute) + + + +## Default hardware configurations ## + +Choose the hardware configuration for your Watson Machine Learning asset when you train the asset or when you deploy it\. + + + +Hardware configurations available for training and deploying assets + +| Capacity type | Capacity units per hour | +| ------------------------------------------ | ----------------------- | +| Extra small: 1x4 = 1 vCPU and 4 GB RAM | 0\.5 | +| Small: 2x8 = 2 vCPU and 8 GB RAM | 1 | +| Medium: 4x16 = 4 vCPU and 16 GB RAM | 2 | +| Large: 8x32 = 8 vCPU and 32 GB RAM | 4 | +| Extra large: 16x64 = 16 vCPU and 64 GB RAM | 8 | + + + +## Compute usage for Watson Machine Learning assets ## + +Deployments and scoring consume compute resources as capacity unit hours (CUH) from the Watson Machine Learning service\. + +To check the total monthly CUH consumption for your Watson Machine Learning services, from the navigation menu, select **Administration** \-> **Environment runtimes**\. + +Additionally, you can monitor the monthly resource usage in each specific deployment space\. To do that, from your deployment space, go to the **Manage** tab and then select **Resource usage**\. The summary shows CUHs used by deployment type: separately for AutoAI deployments, Federated Learning deployments, batch deployments, and online deployments\. + +### Compute usage details ### + +The rate of consumed CUHs is determined by the computing requirements of your deployments\. It is based on such variables as: + + + + * type of deployment + * type of framework + * complexity of scoring Scaling a deployment to support more concurrent users and requests also increases CUH consumption\. As many variables affect resource consumption for a deployment, it is recommended that you run tests on your models and deployments to analyze CUH consumption\. + + + +The way that online deployments consume capacity units is based on framework\. For some frameworks, CUHs are charged for the number of hours that the deployment asset is active in a deployment space\. For example, SPSS models in online deployment mode that run for 24 hours a day, seven days a week, consume CUHs and are charged for that period\. An active online deployment has no idle time\. For other frameworks, CUHs are charged according to scoring duration\. Refer to the CUH consumption table for details on how CUH usage is calculated\. + +Compute time is calculated to the millisecond, with a 1\-minute minimum for each distinct operation\. For example: + + + + * A training run that takes 12 seconds is billed as 1 minute + * A training run that takes 83\.555 seconds is billed exactly as calculated + + + +### CUH consumption by deployment and framework type ### + +CUH consumption is calculated by using these formulas: + + + +| Deployment type | Framework | CUH calculation | +| --------------- | ----------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | +| Online | AutoAI, AI function, SPSS, Scikit\-Learn custom libraries, Tensorflow, RShiny | Deployment active duration `*` Number of nodes `*` CUH rate for capacity type framework | +| Online | Spark, PMML, Scikit\-Learn, Pytorch, XGBoost | Score duration in seconds `*` Number of nodes `*` CUH rate for capacity type framework | +| Batch | all frameworks | Job duration in seconds `*` Number of nodes `*` CUH rate for capacity type framework | + + + +## Learn more ## + + + + * [Deploying assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/wmls/wmls-deploy-overview.html) + * [Watson Machine Learning service](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html) + * [Monitoring account resource usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html) + + + +**Parent topic:**[Managing predictive deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b0b1665f022c9e781ce1ae94fa885266391fbcfe.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b0b1665f022c9e781ce1ae94fa885266391fbcfe.md new file mode 100644 index 0000000..0ce0f55 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b0b1665f022c9e781ce1ae94fa885266391fbcfe.md @@ -0,0 +1,53 @@ +# chaidnode properties + +# chaidnode properties # + +![CHAID node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/chaidnodeicon.png)The CHAID node generates decision trees using chi\-square statistics to identify optimal splits\. Unlike the C&R Tree and Quest nodes, CHAID can generate non\-binary trees, meaning that some splits have more than two branches\. Target and input fields can be numeric range (continuous) or categorical\. Exhaustive CHAID is a modification of CHAID that does a more thorough job of examining all possible splits but takes longer to compute\. + + + +chaidnode properties + +Table 1\. chaidnode properties + +| `chaidnode` Properties | Values | Property description | +| ---------------------------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `target` | *field* | CHAID models require a single target and one or more input fields\. You can also specify a frequency\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `continue_training_existing_model` | *flag* | | +| `objective` | `Standard`
`Boosting`
`Bagging`
`psm` | `psm` is used for very large datasets, and requires a server connection\. | +| `model_output_type` | `Single`
`InteractiveBuilder` | | +| `use_tree_directives` | *flag* | | +| `tree_directives` | *string* | | +| `method` | `Chaid`
`ExhaustiveChaid` | | +| `use_max_depth` | `Default`
`Custom` | | +| `max_depth` | *integer* | Maximum tree depth, from 0 to 1000\. Used only if `use_max_depth = Custom`\. | +| `use_percentage` | *flag* | | +| `min_parent_records_pc` | *number* | | +| `min_child_records_pc` | *number* | | +| `min_parent_records_abs` | *number* | | +| `min_child_records_abs` | *number* | | +| `use_costs` | *flag* | | +| `costs` | *structured* | Structured property\. | +| `trails` | *number* | Number of component models for boosting or bagging\. | +| `set_ensemble_method` | `Voting`
`HighestProbability`
`HighestMeanProbability` | Default combining rule for categorical targets\. | +| `range_ensemble_method` | `Mean`
`Median` | Default combining rule for continuous targets\. | +| `large_boost` | *flag* | Apply boosting to very large data sets\. | +| `split_alpha` | *number* | Significance level for splitting\. | +| `merge_alpha` | *number* | Significance level for merging\. | +| `bonferroni_adjustment` | *flag* | Adjust significance values using Bonferroni method\. | +| `split_merged_categories` | *flag* | Allow resplitting of merged categories\. | +| `chi_square` | `Pearson`
`LR` | Method used to calculate the chi\-square statistic: Pearson or Likelihood Ratio | +| `epsilon` | *number* | Minimum change in expected cell frequencies\.\. | +| `max_iterations` | *number* | Maximum iterations for convergence\. | +| `set_random_seed` | *integer* | | +| `seed` | *number* | | +| `calculate_variable_importance` | *flag* | | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `adjusted_propensity_partition` | `Test`
`Validation` | | +| `maximum_number_of_models` | *integer* | | +| `train_pct` | *double* | The algorithm internally separates records into a model building set and an overfit prevention set, which is an independent set of data records used to track errors during training in order to prevent the method from modeling chance variation in the data\. Specify a percentage of records\. The default is `30`\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b0b80eb59e769546eedf8ca32a493bf38c6a9707.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b0b80eb59e769546eedf8ca32a493bf38c6a9707.md new file mode 100644 index 0000000..35dba9e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b0b80eb59e769546eedf8ca32a493bf38c6a9707.md @@ -0,0 +1,7 @@ +# Export nodes (SPSS Modeler) + +# Export # + +Export nodes provide a mechanism for exporting data in various formats to interface with your other software tools\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b0da6cd45bfd0d3a91f0b3c4e7615de23fe4f350.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b0da6cd45bfd0d3a91f0b3c4e7615de23fe4f350.md new file mode 100644 index 0000000..7908dcd --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b0da6cd45bfd0d3a91f0b3c4e7615de23fe4f350.md @@ -0,0 +1,65 @@ +# Setting up the Watson Studio and Watson Machine Learning services + +# Setting up the Watson Studio and Watson Machine Learning services # + +The Watson Studio and Watson Machine Learning services are provisioned automatically with a Lite plan when you sign up for IBM watsonx\. To set up Watson Studio and Watson Machine Learning for an organization, you upgrade the service plans\. You allow the node IP addresses access through the firewall\. + +To set up the Watson Studio and Watson Machine Learning services, complete these tasks: + + + +1. [Upgrade the services](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/set-up-ws.html?context=cdpaas&locale=en#upgrade)\. +2. [Allow IP addresses](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/set-up-ws.html?context=cdpaas&locale=en#node-ips)\. + + + +## Step 1: Upgrade the services to the appropriate plans ## + +**Required roles** : You must be the IBM Cloud account **Owner** or **Administrator**\. + +To upgrade the services: + + + +1. Determine the Watson Studio service plan that you need\. The features and compute resources of Watson Studio vary across the service plans\. See [Watson Studio service plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/ws-plans.html)\. +2. While logged in to IBM watsonx, from the main menu, click **Administration > Services > Service instances**\. +3. Click the menu next to the Watson Studio service and choose **Upgrade service**\. +4. Choose the plan you want and click **Upgrade**\. +5. Repeat the steps for the Watson Machine Learning service\. The resources and number of deployment jobs vary across the Watson Machine Learning service plans\. See [Watson Machine Learning service plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + + + +Make sure that object storage is configured to allow these users to create catalogs and projects\. See [Setting up IBM Cloud Object Storage for use with IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html#cos-delegation)\. + +All users in your IBM Cloud account with the **Editor** IAM platform access role for all IAM enabled services can now create projects and use all the Watson Studio and Watson Machine Learning tools\. + +## Step 2: Allow IP addresses for Watson Studio for your region ## + +The IP addresses for the Watson Studio nodes in each region must be configured as allowed IP addresses for the IBM Cloud account\. When allowing specific IP addresses for Watson Studio, you include the CIDR ranges for the Watson Studio nodes in each region to allow a secure connection through the firewall\. + +**Required roles** : You must have the **Editor** or higher IBM Cloud IAM Platform role to allow IP addresses\. + +First look up the CIDR blocks in IBM watsonx, and then enter them into the **Access(IAM) > Settings** screen in IBM Cloud\. Follow these steps: + + + +1. From the IBM watsonx main menu, select **Administration > Cloud integrations**\. +2. Click **Firewall configuration** to display the IP addresses for the current region\. +3. Checkmark **Show IP ranges in CIDR notation**\. +4. Click the icon to copy a CIDR block to the clipboard\. +5. Enter the CIDR block of IP addresses into the **Access(IAM) > Settings > Restrict IP address access > Allowed IP addresses** for the IBM Cloud account\. +6. Then click **Save**\. +7. Repeat for each CIDR block until all are entered\. +8. Repeat for each region\. + + + +For step\-by\-step instructions, see [IBM Cloud docs: Allowing specific IP addresses](https://cloud.ibm.com/docs/account?topic=account-ips)\. + +## Next steps ## + +Finish the remaining steps for [setting up the platform](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-platform.html)\. + +**Parent topic:**[Setting up the platform for administrators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-platform.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b193a2795bdef17a5d204cdd18188a767e2fe7b7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b193a2795bdef17a5d204cdd18188a767e2fe7b7.md new file mode 100644 index 0000000..81f1e2c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b193a2795bdef17a5d204cdd18188a767e2fe7b7.md @@ -0,0 +1,56 @@ +# Tokens and tokenization + +# Tokens and tokenization # + +A *token* is a collection of characters that has semantic meaning for a model\. Tokenization is the process of converting the words in your prompt into tokens\. + +You can monitor foundation model token usage in a project on the **Environments** page on the **Resource usage** tab\. + +## Converting words to tokens and back again ## + +Prompt text is converted to tokens before being processed by foundation models\. + +The correlation between words and tokens is complex: + + + + * Sometimes a single word is broken into multiple tokens + * The same word might be broken into a different number of tokens, depending on context (such as: where the word appears, or surrounding words) + * Spaces, newline characters, and punctuation are sometimes included in tokens and sometimes not + * The way words are broken into tokens varies from language to language + * The way words are broken into tokens varies from model to model + + + +For a rough idea, a sentence that has 10 words could be 15 to 20 tokens\. + +The raw output from a model is also tokens\. In the Prompt Lab in IBM watsonx\.ai, the output tokens from the model are converted to words to be displayed in the prompt editor\. + +### Example ### + +The following image shows how this sample input might be tokenized: + +> Tomatoes are one of the most popular plants for vegetable gardens\. Tip for success: If you select varieties that are resistant to disease and pests, growing tomatoes can be quite easy\. For experienced gardeners looking for a challenge, there are endless heirloom and specialty varieties to cultivate\. Tomato plants come in a range of sizes\. + +![Visualization of tokenization](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fm-tokenization.png) + +Notice a few interesting points: + + + + * Some words are broken into multiple tokens and some are not + * The word "Tomatoes" is broken into multiple tokens at the beginning, but later "tomatoes" is all one token + * Spaces are sometimes included at the beginning of a word\-token and sometimes spaces are a token all by themselves + * Punctuation marks are tokens + + + +## Token limits ## + +Every model has an upper limit to the number of tokens in the input prompt plus the number of tokens in the generated output from the model (sometimes called *context window length*, *context window*, *context length*, or *maximum sequence length*\.) In the Prompt Lab, an informational message shows how many tokens are used in a given prompt submission and the resulting generated output\. + +In the Prompt Lab, you use the *Max tokens* parameter to specify an upper limit on the number of output tokens for the model to generate\. The maximum number of tokens that are allowed in the output differs by model\. For more information, see the *Maximum tokens* information in [Supported foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html)\. + +**Parent topic:**[Foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b1af301f18e6444da2842cc71f9ac38505ee5e1f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b1af301f18e6444da2842cc71f9ac38505ee5e1f.md new file mode 100644 index 0000000..ca8b2ab --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b1af301f18e6444da2842cc71f9ac38505ee5e1f.md @@ -0,0 +1,170 @@ +# Foundation models Python library + +# Foundation models Python library # + +You can prompt foundation models in IBM watsonx\.ai programmatically by using the Python library\. + +The Watson Machine Learning Python library is a publicly available library that you can use to work with Watson Machine Learning services\. The Watson Machine Learning service hosts the watsonx\.ai foundation models\. + +## Using the Python library ## + +After you create a prompt in the Prompt Lab, you can save the prompt as a notebook, and then edit the notebook\. Using the generated notebook as a starting point is useful because it handles the initial setup steps, such as getting credentials and the project ID information for you\. + +If you want to work with the models directly from a notebook, you can do so by using the Watson Machine Learning Python library\. + +The `ibm-watson-machine-learning` Python library is publicly available on PyPI from the url: [https://pypi\.org/project/ibm\-watson\-machine\-learning/](https://pypi.org/project/ibm-watson-machine-learning/)\. However, you can install it in your development environment by using the following command: + + pip install ibm-watson-machine-learning + +If you installed the library before, include the `-U` parameter to ensure that you have the latest version\. + + pip install -U ibm-watson-machine-learning + +For more information about the available methods for working with foundation models, see [Foundation models Python library](https://ibm.github.io/watson-machine-learning-sdk/foundation_models.html)\. + +You need to take some steps before you can use the Python library: + + + + * [Setting up credentials](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-credentials.html) + * [Looking up your project ID](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-python-lib.html?context=cdpaas&locale=en#project-id) + + + +### Looking up your project ID ### + +To prompt foundation models in IBM watsonx\.ai programmatically, you need to pass the identifier (ID) of a project that has an instance of IBM Watson Machine Learning associated with it\. + +To get the ID of a project, complete the following steps: + + + +1. Navigate to the project in the watsonx web console, open the project, and then click the **Manage** tab\. +2. Copy the project ID from the *Details* section of the *General* page\. + + + +## Examples ## + +The following examples show you how to use the library to perform a few basic tasks in a notebook\. + +### Example 1: List available foundation models ### + +You can view [`ModelTypes`](https://ibm.github.io/watson-machine-learning-sdk/foundation_models.html#ibm_watson_machine_learning.foundation_models.utils.enums.ModelTypes) to see available foundation models\. + +**Python code** + + from ibm_watson_machine_learning.foundation_models.utils.enums import ModelTypes + import json + + print( json.dumps( ModelTypes._member_names_, indent=2 ) ) + +**Sample output** + + [ + "FLAN_T5_XXL", + "FLAN_UL2", + "MT0_XXL", + ... + ] + +### Example: View details of a foundation model ### + +You can view details, such as a short description and foundation model limits, by using [`get_details()`](https://ibm.github.io/watson-machine-learning-sdk/foundation_models.html#ibm_watson_machine_learning.foundation_models.Model.get_details)\. + +**Python code** + + from ibm_watson_machine_learning.foundation_models.utils.enums import ModelTypes + from ibm_watson_machine_learning.foundation_models import Model + import json + + my_credentials = { + "url" : "https://us-south.ml.cloud.ibm.com", + "apikey" : {my-IBM-Cloud-API-key} + } + + model_id = ModelTypes.MPT_7B_INSTRUCT2 + gen_parms = None + project_id = {my-project-ID} + space_id = None + verify = False + + model = Model( model_id, my_credentials, gen_parms, project_id, space_id, verify ) + + model_details = model.get_details() + + print( json.dumps( model_details, indent=2 ) ) + +Note:Replace `{my-IBM-Cloud-API-key}` and `{my-project-ID}` with your API key and project ID\. + +**Sample output** + + { + "model_id": "ibm/mpt-7b-instruct2", + "label": "mpt-7b-instruct2", + "provider": "IBM", + "source": "Hugging Face", + "short_description": "MPT-7B is a decoder-style transformer pretrained from + scratch on 1T tokens of English text and code. This model was trained by IBM.", + ... + } + +### Example: Prompt a foundation model with default parameters ### + +Prompt a foundation model to generate a response\. + +**Python code** + + from ibm_watson_machine_learning.foundation_models.utils.enums import ModelTypes + from ibm_watson_machine_learning.foundation_models import Model + import json + + my_credentials = { + "url" : "https://us-south.ml.cloud.ibm.com", + "apikey" : {my-IBM-Cloud-API-key} + } + + model_id = ModelTypes.FLAN_T5_XXL + gen_parms = None + project_id = {my-project-ID} + space_id = None + verify = False + + model = Model( model_id, my_credentials, gen_parms, project_id, space_id, verify ) + + prompt_txt = "In today's sales meeting, we " + gen_parms_override = None + + generated_response = model.generate( prompt_txt, gen_parms_override ) + + print( json.dumps( generated_response, indent=2 ) ) + +Note:Replace `{my-IBM-Cloud-API-key}` and `{my-project-ID}` with your API key and project ID\. + +**Sample output** + + { + "model_id": "google/flan-t5-xxl", + "created_at": "2023-07-27T03:40:17.575Z", + "results": [ + { + "generated_text": "will discuss the new product line.", + "generated_token_count": 8, + "input_token_count": 10, + "stop_reason": "EOS_TOKEN" + } + ], + ... + } + +## Learn more ## + + + + * [Credentials for prompting foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-credentials.html) + + + +**Parent topic:**[Foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b2117b2cd0fea469149b23facb6a9f7f32905afd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b2117b2cd0fea469149b23facb6a9f7f32905afd.md new file mode 100644 index 0000000..062c86e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b2117b2cd0fea469149b23facb6a9f7f32905afd.md @@ -0,0 +1,87 @@ +# Deploying a prompt template + +# Deploying a prompt template # + +Deploy a prompt template so you can add it to a business workflow or so you can evaluate the prompt template to measure performance\. + +## Before you begin ## + +Save a prompt template that contains at least one variable as a project asset\. See [Building reusable prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-variables.html)\. + +## Promote a prompt template to a deployment space ## + +To deploy a prompt template, complete the following steps: + + + +1. Open the project containing the prompt template\. +2. Click **Promote to space** for the template\. + + ![Promoting a prompt template to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-deploy-prompt1.png) +3. In the *Target deployment space* field, choose a deployment space or create a new space\. Note the following: + + The deployment space must be associated with a machine learning instance that is in the same account as the project where the prompt template was created. + + If you don't have a deployment space, choose **Create a new deployment space**, and then follow the steps in [Creating deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-create.html). + + If you plan to evaluate the prompt template in the space, the recommended **Deployment stage** type for the space is *Production*. For more information on evaluating, see [Evaluating a prompt template in a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-eval-prompt-spaces.html). + + Note: The deployment space stage cannot be changed after the space is created. + + + + + +1. **Tip**: Select **View deployment in deployment space after creating**\. Otherwise, you need to take more steps to find your deployed asset\. +2. From the **Assets** tab of the deployment space, click **Deploy**\. You create an online deployment, which means you can send data to the endpoint and receive a response in real\-time\. + + ![Deploying a prompt template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-deploy-prompt2.png) +3. Optional: In the *Deployment serving name* field, add a unique label for the deployment\. + + The serving name is used in the URL for the API endpoint that identifies your deployment. Adding a name is helpful because the human-readable name that you add replaces a long, system-generated unique ID that is assigned otherwise. + + The serving name also abstracts the deployment from its service instance details. Applications refer to this name, which allows for the underlying service instance to be changed without impacting users. + + The name can have up to 36 characters. The supported characters are \[a-z,0-9,\_\]. + + The name must be unique across the IBM Cloud region. You might be prompted to change the serving name if the name you choose is already in use. + + + +## Testing the deployed prompt template ## + +After the deployment successfully completes, click the deployment name to view the deployment\. + +![Deploying a prompt template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-deploy-prompt3.png) + + + + * **API reference** tab includes the API endpoints and code snippets that you need to add this prompt template to an application\. + * **Test** tab supports testing the prompt template\. Enter test data as text, streamed text, or in a JSON file\. For details on testing a prompt template, see\. + + + +If the watsonx\.governance service is enabled, you also see these tabs: + + + + * **Evaluate** provides the tools for evaluating the prompt template in the space\. Click **Activate** to choose the dimensions to evaluate\. For details, see [Evaluating prompt templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-eval-prompt.html)\. + * **AI Factsheets** displays all of the metadata that is collected for the prompt template\. Use these details for tracking the prompt template for governance and compliance goals\. See [Tracking prompt templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-track-prompt-temp.html)\. + + + +For more information, see [Deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html)\. + +## Learn more ## + + + + * [Tracking prompt templates ](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-track-prompt-temp.html) + * [Evaluating a prompt template in a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-eval-prompt-spaces.html) + * [Security and privacy for foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-security.html) + + + +**Parent topic:**[Deploying and managing assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/wmls/wmls-deploy-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b2250c2a2e20f6f123c6d1091bfd635dc74ee4fe.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b2250c2a2e20f6f123c6d1091bfd635dc74ee4fe.md new file mode 100644 index 0000000..6fed085 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b2250c2a2e20f6f123c6d1091bfd635dc74ee4fe.md @@ -0,0 +1,22 @@ +# Linguistic resources used in Text Analytics (SPSS Modeler) + +# Linguistic resources # + +SPSS Modeler uses an extraction process that relies on linguistic resources\. These resources serve as the basis for how to process the text data and extract information to get the concepts, types, and sometimes patterns\. + +The linguistic resources can be divided into different types: + +Category sets +: Categories are a group of closely related ideas and patterns that the text data is assigned to through a scoring process\. + +Libraries +: Libraries are used as building blocks for both TAPs and templates\. Each library is made up of several dictionaries, which are used to define and manage terms, synonyms, and exclude lists\. While libraries are also delivered individually, they are prepackaged together in templates and TAPs\. + +Templates +: Templates are made up of a set of libraries and some advanced linguistic and nonlinguistic resources\. These resources form a specialized set that is adapted to a particular domain or context, such as product opinions\. + +Text analysis packages (TAP) +: A text analysis package is a predefined template that is bundled with one or more sets of predefined category sets\. TAPs bundle together these resources so that the categories and the resources that were used to generate them are both stored together and reusable\. + +Note: During extraction, some compiled internal resources are also used\. These compiled resources contain many definitions that complement the types in the Core library\. These compiled resources cannot be edited\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b23f48a4757500fea641245cffa69cb3b72ae0e8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b23f48a4757500fea641245cffa69cb3b72ae0e8.md new file mode 100644 index 0000000..f8b53fc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b23f48a4757500fea641245cffa69cb3b72ae0e8.md @@ -0,0 +1,259 @@ +# Creating a time series anomaly prediction (Beta) + +# Creating a time series anomaly prediction (Beta) # + +Create a time series anomaly prediction experiment to train a model that can detect anomalies, or unexpected results, when the model predicts results based on new data\. + +Tech preview This is a technology preview and is not yet supported for use in production environments\. + +## Detecting anomalies in predictions ## + +You can use anomaly prediction to find outliers in model predictions\. Consider the following scenarios for training a time series model with anomaly prediction\. For example, suppose you have operational metrics from monitoring devices that were collected in the date range of 2022\.1\.1 through 2022\.3\.31\. You are confident that no anomalies exist in the data for that period, even if the data is unlabeled\. You can use a time series anomaly prediction experiment to: + + + + * Train model candidate pipelines and auto\-select the top\-ranked model candidate + * Deploy a selected model to predict new observations if: + + + + * A new time point is an anomaly (for example, an online score predicts a time point 2022.4.1 that is outside of the expected range) + * A new time range has anomalies (for example, a batch score predicts values of 2022.4.1 to 2022.4.7, outside the expected range) + + + + + +## Working with a sample ## + +To create an AutoAI Time series experiment with anomaly prediction that uses a sample: + + + +1. Create an AutoAI experiment\. +2. Select *Samples*\. + + ![Select the Samples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-ts-ad1.png) +3. Click the tile for **Electricity usage anomalies sample data**\. +4. Follow the prompts to configure and run the experiment\. + + ![Samples output](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-ts-ad2.png) +5. Review the details about the pipelines and explore the visualizations\. + + + +## Configuring a time series experiment with anomaly prediction ## + + + +1. Load the data for your experiment\. + + Restriction: You can upload only a single data file for an anomaly prediction experiment. If you upload a second data file (for holdout data) the Anomaly prediction option is disabled, and only the Forecast option is available. By default, Anomaly prediction experiments use a subset of the training data for validation. +2. Click **Yes** to **Enable time series**\. +3. Select **Anomaly prediction** as the experiment type\. +4. Configure the feature columns from the data source that you want to predict based on the previous values\. You can specify one or more columns to predict\. +5. Select the date/time column\. + + + +The prediction summary shows you the experiment type and the metric that is selected for optimizing the experiment\. + +## Configuring experiment settings ## + +To configure more details for your time series experiment, open the **Experiment settings** pane\. Options that are not available for anomaly prediction experiments are unavailable\. + +### General prediction settings ### + +On the *General* panel for prediction settings, configure details for training the experiment\. + + + +| Field | Description | +| ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Prediction type | View or change the prediction type based on prediction column for your experiment\. For time series experiments, **Time series anomaly prediction** is selected by default\. **Note:** If you change the prediction type, other prediction settings for your experiment are automatically changed\. | +| Optimized metric | Choose a metric for optimizing and ranking the pipelines\. | +| Optimized algorithm selection | Not supported for time series experiments\. | +| Algorithms to include | Select [algorithms](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-ap.html?context=cdpaas&locale=en#implementation) based on which you want your experiment to create pipelines\. The algorithms support anomaly prediction\. | +| Pipelines to complete | View or change the number of pipelines to generate for your experiment\. | + + + +### Time series configuration details ### + +On the Time series pane for prediction settings, configure the details for how to train the experiment and generate predictions\. + + + +| Field | Description | +| ---------------- | -------------------------------------------------------- | +| Date/time column | View or change the date/time column for the experiment\. | +| Lookback window | Not supported for anomaly prediction\. | +| Forecast window | Not supported for anomaly prediction\. | + + + +## Configuring data source settings ## + +To configure details for your input data, open the **Experiment settings** panel and select the **Data source**\. + +### General data source settings ### + +On the *General* panel for data source settings, you can choose options for how to use your experiment data\. + + + +| Field | Description | +| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Duplicate rows | Not supported for time series anomaly prediction experiments\. | +| Subsample data | Not supported for time series anomaly prediction experiments\. | +| Text feature engineering | Not supported for time series anomaly prediction experiments\. | +| Final training data set | Anomaly prediction uses a single data source file, which is the final training data set\. | +| Supporting features | Not supported for time series anomaly prediction experiments\. | +| Data imputation | Not supported for time series anomaly prediction experiments\. | +| Training and holdout data | Anomaly prediction does not support a separate holdout file\. You can adjust how the data is split between training and holdout data\. **Note:** In some cases, AutoAI can overwrite your holdout settings to ensure the split is valid for the experiment\. In this case, you see a notification and the change is noted in the log file\. | + + + +## Reviewing the experiment results ## + +When you run the experiment, the progress indicator displays the pathways to pipeline creation\. Ranked pipelines are listed on the leaderboard\. Pipeline score represents how well the pipeline performed for the optimizing metric\. + +The **Experiment summary** tab displays a visualization of how metrics performed for the pipeline\. + + + + * Use the metric filter to focus on particular metrics\. + * Hover over the name of a metric to view details\. + + + +Click a pipeline name to view details\. On the **Model evaluation** page, you can review a table that summarizes details about the pipeline\. + +![Model evaluation details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai-ts-ad3.png) + + + + * The rows represent five evaluation metrics: Area under ROC, Precision, Recall, F1, Average precision\. + * The columns represent four synthesized anomaly types: Level shift, Trend, Localized extreme, Variance\. + * Each value in a cell is an average of the metric based on three iterations of evaluation on the synthesized anomaly type\. + + + +### Evaluation metrics: ### + +These metrics are used to evaluate a pipeline: + + + +| Metric | Description | +| ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Aggregate score (Recommended) | This score is calculated based on an aggregation of the optimized metric (for example, Average precision) values for the 4 anomaly types\. The scores for each pipeline are ranked, using the Borda count method, and then weighted for their contribution to the aggregate score\. Unlike a standard metric score, this value is not between 0 and 1\. A higher value indicates a stronger score\. | +| ROC AUC | Measure of how well a parameter can distinguish between two groups\. | +| F1 | Harmonic average of the precision and recall, with best value of 1 (perfect precision and recall) and worst at 0\. | +| Precision | Measures the accuracy of a prediction based on percent of positive predictions that are correct\. | +| Recall | Measures the percentage of identified positive predictions against possible positives in data set\. | + + + +### Anomaly types ### + +These are the anomaly types AutoAI detects\. + + + +| Anomaly type | Description | +| ------------------------- | ----------------------------------------------------------------------------------------------------- | +| Localized extreme anomaly | An unusual data point in a time series, which deviates significantly from the data points around it\. | +| Level shift anomaly | A segment in which the mean value of a time series is changed\. | +| Trend anomaly | A segment of time series, which has a trend change compared to the time series before the segment\. | +| Variance anomaly | A segment of time series in which the variance of a time series is changed\. | + + + +## Saving a pipeline as a model ## + +To save a model candidate pipeline as a machine learning model, select **Save as model** for the pipeline you prefer\. The model is saved as a project asset\. You can promote the model to a space and create a deployment for it\. + +## Saving a pipeline as a notebook ## + +To review the code for a pipeline, select **Save as notebook** for a pipeline\. An automatically generated notebook is saved as a project asset\. Review the code to explore how the pipeline was generated\. + +For details on the methods used in the pipeline code, see the documentation for the [autoai\-ts\-libs library](https://pypi.org/project/autoai-ts-libs/)\. + +## Scoring the model ## + +After you save a pipeline as a model, then promote the model to a space, you can score the model to generate predictions for input, or payload, data\. Scoring the model and interpreting the results is similar to scoring a binary classification model, as the score presents one of two possible values for each prediction: + + + + * 1 = no anomaly detected + * \-1 = anomaly detected + + + +### Deployment details ### + +Note these requirements for deploying an anomaly prediction model\. + + + + * The schema for the deplyment input data must match the schema for the training data except for the prediction, or target column\. + * The order of the fields for model scoring must be the same as the order of the fields in the training data schema\. + + + +### Deployment example ### + +The following is valid input for an anomaly prediction model: + + { + "input_data": [ + { + "id": "observations", + "values": + 12,34], + 22,23], + 35,45], + 46,34] + ] + } + ] + } + +The score for this input is `[1,1,-1,1]` where `-1` means the value is an anomaly and `1` means the prediction is in the normal range\. + +## Implementation details ## + +These algorithms support anomaly prediction in time series experiments\. + + + +| Algorithm | Type | Transformer | +| ----------------------------------- | -------------- | ----------- | +| Pipeline Name | Algorithm Type | Transformer | +| PointwiseBoundedHoltWintersAdditive | Forecasting | N/A | +| PointwiseBoundedBATS | Forecasting | N/A | +| PointwiseBoundedBATSForceUpdate | Forecasting | N/A | +| WindowNN | Window | Flatten | +| WindowPCA | Relationship | Flatten | +| WindowLOF | Window | Flatten | + + + +The algorithms are organized in these categories: + + + + * **Forecasting:** Algorithms for detecting anomalies using time series forecasting methods + * **Relationship:** Algorithms for detecting anomalies by analyzing the relationship among data points + * **Window:** Algorithms for detecting anomalies by applying transformations and ML techniques to rolling windows + + + +## Learn more ## + +[Saving an AutoAI generated notebook (Watson Machine Learning)](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-notebook.html) + +**Parent topic:**[Building a time series experiment ](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-timeseries.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b2593108fa446c4b4b0ef5adc2cd5d9585b0b63c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b2593108fa446c4b4b0ef5adc2cd5d9585b0b63c.md new file mode 100644 index 0000000..61d7a61 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b2593108fa446c4b4b0ef5adc2cd5d9585b0b63c.md @@ -0,0 +1,64 @@ +# Foundation models built by IBM + +# Foundation models built by IBM # + +In IBM watsonx\.ai, you can use IBM foundation models that are built with integrity and designed for business\. + +The Granite family of foundation models includes decoder\-only models that can efficiently predict and generate language in English\. + +The models were built with trusted data that has the following characteristics: + + + + * Sourced from quality data sets in domains such as finance (SEC Filings), law (Free Law), technology (Stack Exchange), science (arXiv, DeepMind Mathematics), literature (Project Gutenberg (PG\-19)), and more\. + * Compliant with rigorous IBM data clearance and governance standards\. + * Scrubbed of hate, abuse, and profanity, data duplication, and blocklisted URLs, among other things\. + + + +IBM is committed to building AI that is open, trusted, targeted, and empowering\. For more information about contractual protections related to the IBM Granite foundation models, see the [IBM watsonx\.ai service description](https://www.ibm.com/support/customer/csol/terms/?id=i126-7747) and [model license](https://www.ibm.com/support/customer/csol/terms/?id=i126-6883)\. + +The following Granite models are available in watsonx\.ai today: + +**granite\-13b\-chat\-v2** : General use model that is optimized for dialogue use cases\. This version of the model is able to generate longer, higher\-quality responses with a professional tone\. The model can recognize mentions of people and can detect tone and sentiment\. + +**granite\-13b\-chat\-v1** : General use model that is optimized for dialogue use cases\. Useful for virtual agent and chat applications that engage in conversation with users\. + +**granite\-13b\-instruct\-v2** : General use model\. This version of the model is optimized for classification, extraction, and summarization tasks\. The model can recognize mentions of people and can summarize longer inputs\. + +**granite\-13b\-instruct\-v1** : General use model\. The model was tuned on relevant business tasks, such as detecting sentiment from earnings calls transcripts, extracting credit risk assessments, summarizing financial long\-form text, and answering financial or insurance\-related questions\. + +To learn more about the models, read the following resources: + + + + * [Model information](https://www.ibm.com/blog/watsonx-tailored-generative-ai/) + * [Research paper](https://www.ibm.com/downloads/cas/X9W4O6BM) + * [granite\-13b\-instruct\-v2 model card](https://dataplatform.cloud.ibm.com/wx/samples/models/ibm/granite-13b-instruct-v2?context=wx) + * [granite\-13b\-instruct\-v1 model card](https://dataplatform.cloud.ibm.com/wx/samples/models/ibm/granite-13b-instruct-v1?context=wx) + * [granite\-13b\-chat\-v2 model card](https://dataplatform.cloud.ibm.com/wx/samples/models/ibm/granite-13b-chat-v2?context=wx) + * [granite\-13b\-chat\-v1 model card](https://dataplatform.cloud.ibm.com/wx/samples/models/ibm/granite-13b-chat-v1?context=wx) + + + +To get started with the models, try these samples: + + + + * [Prompt Lab sample: Extract details from a complaint](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#sample2a) + * [Prompt Lab sample: Generate a numbered list on a particular theme](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#sample3c) + * [prompt Lab sample: Answer a question based on a document](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#sample4c) + * [Prompt Lab sample: Answer general knowledge questions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#sample4d) + * [Prompt Lab sample: Converse in a dialogue](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#sample7a) + + + + + + * [Sample Python notebook: Use watsonx and a Granite model to analyze car rental customer satisfaction from text](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/61c1e967-8d10-44bb-a846-cc1f27e9e69a?context=wx) + + + +**Parent topic:**[Supported foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b2ca734ae719ba79ab4b5f877cf044f47090faec.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b2ca734ae719ba79ab4b5f877cf044f47090faec.md new file mode 100644 index 0000000..991c1f0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b2ca734ae719ba79ab4b5f877cf044f47090faec.md @@ -0,0 +1,9 @@ +# Forecasting bandwidth utilization (SPSS Modeler) + +# Forecasting bandwidth utilization # + +An analyst for a national broadband provider is required to produce forecasts of user subscriptions to predict utilization of bandwidth\. Forecasts are needed for each of the local markets that make up the national subscriber base\. + +You'll use time series modeling to produce forecasts for the next three months for a number of local markets\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b32394103127310af0f4bf240cfd0b26399b685d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b32394103127310af0f4bf240cfd0b26399b685d.md new file mode 100644 index 0000000..b1343d1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b32394103127310af0f4bf240cfd0b26399b685d.md @@ -0,0 +1,92 @@ +# Emotion classification + +# Emotion classification # + +The Emotion model in the Watson Natural Language Processing classification workflow classifies the emotion in the input text\. + +**Workflow name**`ensemble_classification-workflow_en_emotion-stock` + +**Supported languages** + + + + * English and French + + + +**Capabilities** + +The Emotion classification model is a pre\-trained document classification model for the task of classifying the emotion in the input document\. The model identifies the emotion of a document, and classifies it as: + + + + * Anger + * Disgust + * Fear + * Joy + * Sadness + + + +Unlike the Sentiment model, which classifies each individual sentence, the Emotion model classifies the entire input document\. As such, the Emotion model works optimally when the input text to classify is no longer than 1000 characters\. If you would like to classify texts longer than 1000 characters, split the text into sentences or paragraphs for example and apply the Emotion model on each sentence or paragraph\. + +A document may be classified into multiple categories or into no category\. + + + +Capabilities of emotion classification based on an example + +| Capabilities | Example | +| ------------------------------------------------------ | ---------------------------------------------------------------- | +| Identifies the emotion of a document and classifies it | "I'm so annoyed that this code won't run \-\-> anger, sadness | + + + +**Dependencies on other blocks** + +None + +**Code sample** + + import watson_nlp + + # Load the Emotion workflow model for English + emotion_model = watson_nlp.load('ensemble_classification-workflow_en_emotion-stock') + + # Run the Emotion model + emotion_result = emotion_model.run("I'm so annoyed that this code won't run") + print(emotion_result) + +Output of the code sample: + + { + "classes": [ + { + "class_name": "anger", + "confidence": 0.6074999913276445 + }, + { + "class_name": "sadness", + "confidence": 0.2913303280964709 + }, + { + "class_name": "fear", + "confidence": 0.10266377929247113 + }, + { + "class_name": "disgust", + "confidence": 0.018745421312542355 + }, + { + "class_name": "joy", + "confidence": 0.0020577122567564804 + } + ], + "producer_id": { + "name": "Voting based Ensemble", + "version": "0.0.1" + } + +**Parent topic:**[Watson Natural Language Processing task catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b3f8fb433fc6730284e636b068a5de98c002dabd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b3f8fb433fc6730284e636b068a5de98c002dabd.md new file mode 100644 index 0000000..8cdf8ac --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b3f8fb433fc6730284e636b068a5de98c002dabd.md @@ -0,0 +1,146 @@ +# Planning your notebooks and scripts experience + +# Planning your notebooks and scripts experience # + +To make a plan for using Jupyter notebooks and scripts, first understand the choices that you have, the implications of those choices, and how those choices affect the order of implementation tasks\. + +You can perform most notebook and script related tasks with Editor or Admin role in an analytics project\. + +Before you start working with notebooks and scripts, you should consider the following questions as most tasks need to be completed in a particular order: + + + + * Which programming language do you want to work in? + * What will your notebooks be doing? + * What libraries do you want to work with? + * How can you use the notebook or script in IBM watsonx? + + + +To create a plan for using Jupyter notebooks or scripts, determine which of the following tasks you must complete\. + + + +| Task | Mandatory? | Timing | +| ------------------------------------------------- | ---------- | ------------------------------------------- | +| [Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/planning-for-notebooks.html?context=cdpaas&locale=en#project) | Yes | This must be your very first task | +| [Adding data assets to the project](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/planning-for-notebooks.html?context=cdpaas&locale=en#data-assets) | Yes | Before you begin creating notebooks | +| [Picking a programming language](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/planning-for-notebooks.html?context=cdpaas&locale=en#programming-lang) | Yes | Before you select the tool | +| [Selecting a tool](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/planning-for-notebooks.html?context=cdpaas&locale=en#select-tool) | Yes | After you've picked the language | +| [Checking the library packages](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/planning-for-notebooks.html?context=cdpaas&locale=en#programming-libs) | Yes | Before you select a runtime environment | +| [Choosing an appropriate runtime environment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/planning-for-notebooks.html?context=cdpaas&locale=en#runtime-env) | Yes | Before you open the development environment | +| [Managing the notebooks and scripts lifecycle](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/planning-for-notebooks.html?context=cdpaas&locale=en#manage-lifecycle) | No | When the notebook or script is ready | +| [Uses for notebooks and scripts after creation](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/planning-for-notebooks.html?context=cdpaas&locale=en#use-options) | No | When the notebook is ready | + + + +## Creating a project ## + +You need to create a project before you can start working in notebooks\. + +**Projects** You can create an empty project, one from file, or from URL\. In this project: + + + + * You can use the Juypter Notebook and RStudio\. + * Notebooks are assets in the project\. + * Notebook collaboration is based on locking by user at the project level\. + * R scripts and Shiny apps are not assets in the project\. + * There is no collaboration on R scripts or Shiny apps\. + + + +## Picking a programming language ## + +You can choose to work in the following languages: + +**Notebooks** : Python and R + +**Scripts** : R scripts and R Shiny apps + +## Selecting a tool ## + +In IBM watsonx, you can work with notebook and scripts in the following tool: + +**Juypter Notebook editor** : In the Juypter Notebook editor, you can create Python or R notebooks\. Notebooks are assets in a project\. Collaboration is only at the project level\. The notebook is locked by a user when opened and can only be unlocked by the same user or a project admin\. + +**RStudio** : In RStudio, you can create R scripts and Shiny apps\. R scripts are not assets in a project, which means that there is no collaboration at the project level\. + +## Checking the library packages ## + +When you open a notebook in a runtime environment, you have access to a large selection of preinstalled data science library packages\. Many environments also include libraries provided by IBM at no extra charge, such as the Watson Natural Language Processing library in Python environments, libraries to help you access project assets, or libraries for time series or geo\-spatial analysis in Spark environments\. + +For a list of the library packages and the versions included in an environment template, select the template on the **Templates** page from the **Manage** tab on the project's **Environments** page\. + +If libraries are missing in a template, you can add them: + +**Through the notebook or script** : You can use familiar package install commands for your environment\. For example, in Python notebooks, you can use `mamba`, `conda` or `pip`\. + +**By creating a custom environment template** : When you create a custom template, you can create a software customization and add the libraries you want to include\. For details, see [Customizing environment templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/customize-envs.html)\. + +## Choosing a runtime environment ## + +Choosing the compute environment for your notebook depends on the amount of data you want to process and the complexity of the data analysis processes\. + +Watson Studio offers many default environment templates with different hardware sizes and software configurations to help you quickly get started, without having to create your own templates\. These included templates are listed on the **Templates** page from the **Manage** tab on the project's **Environments** page\. For more information about the included environments, see [Environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html)\. + +If the available templates don't suit your needs, you can create custom templates and determine the hardware size and software configuration\. For details, see [Customizing environment templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/customize-envs.html)\. + +Important: Make sure that the environment has enough memory to store the data that you load to the notebook\. Oftentimes this means that the environment must have significantly more memory than the total size of the data loaded to the notebook because some data frameworks, like pandas, can hold multiple copies of the data in memory\. + +## Working with data ## + +To work with data in a notebook, you need to: + + + + * Add the data to your project, which turns the data into a project asset\. See [Adding data to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj//manage-data/add-data-project.html) for the different methods for adding data to a project\. + * Use generated code that loads data from the asset to a data structure in your notebook\. For a list of the supported data types, see [Data load support](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-load-support.html)\. + * Write your own code to load data if the data source isn't added as a project asset or support for adding generated code isn't available for the project asset\. + + + +## Managing the notebooks and scripts lifecycle ## + +After you have created and tested a notebook in your tool, you can: + + + + * Publish it to a catalog so that other catalog members can use the notebook in their projects\. See [Publishing assets from a project into a catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/catalog/publish-asset-project.html)\. + * Share a read\-only copy outside of Watson Studio so that people who aren't collaborators in your projects can see and use it\. See [Sharing notebooks with a URL](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/share-notebooks.html)\. + * Publish it to a GitHub repository\. See [Publishing notebooks on GitHub](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/github-integration.html)\. + * Publish it as a gist\. See [Publishing a notebook as a gist](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-gist.html)\. + + + +R scripts and Shiny apps can't be published or shared using functionality in a project\. + +## Uses for notebooks and scripts after creation ## + +The options for a notebook that is created and ready to use in IBM watsonx include: + + + + * Running it as a job in a project\. See [Creating and managing jobs in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html)\. + * Running it as part of a Watson Pipeline\. See [Configuring pipeline nodes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-config.html)\. + + To ensure that a notebook can be run as a job or in a pipeline: + + + + * Ensure that no cells require interactive input by a user. + * Ensure that the notebook logs enough detailed information to enable understanding the progress and any failures by looking at the log. + * Use environment variables in the code to access configurations if a notebook or script requires them, for example the input data file or the number of training runs. + + + + * Using the Watson Machine Learning Python client to build, train and then deploy your models\. See [Watson Machine Learning Python client samples and examples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-samples-overview.html)\. + * Using the Watson Machine Learning REST API to build, train and then deploy your models\. + + + +R scripts and Shiny apps can only be created and used in the RStudio IDE in IBM watsonx\. You can't create jobs for R scripts or R Shiny deployments\. + +**Parent topic:**[Notebooks and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebooks-and-scripts.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b3ffe77064106ee619c664233b7b7a9aba75c30a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b3ffe77064106ee619c664233b7b7a9aba75c30a.md new file mode 100644 index 0000000..1417917 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b3ffe77064106ee619c664233b7b7a9aba75c30a.md @@ -0,0 +1,41 @@ +# webnode properties + +# webnode properties # + +![Time Plot node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/webnodeicon.png)The Web node illustrates the strength of the relationship between values of two or more symbolic (categorical) fields\. The graph uses lines of various widths to indicate connection strength\. You might use a Web node, for example, to explore the relationship between the purchase of a set of items at an e\-commerce site\. + + + +webnode properties + +Table 1\. webnode properties + +| `webnode` properties | Data type | Property description | +| ---------------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `use_directed_web` | *flag* | | +| `fields` | *list* | | +| `to_field` | *field* | | +| `from_fields` | *list* | | +| `true_flags_only` | *flag* | | +| `line_values` | `Absolute``OverallPct``PctLarger``PctSmaller` | | +| `strong_links_heavier` | *flag* | | +| `num_links` | `ShowMaximum``ShowLinksAbove``ShowAll` | | +| `max_num_links` | *number* | | +| `links_above` | *number* | | +| `discard_links_min` | *flag* | | +| `links_min_records` | *number* | | +| `discard_links_max` | *flag* | | +| `links_max_records` | *number* | | +| `weak_below` | *number* | | +| `strong_above` | *number* | | +| `link_size_continuous` | *flag* | | +| `web_display` | `Circular``Network``Directed``Grid` | | +| `graph_background` | *color* | Standard graph colors are described at the beginning of this section\. | +| `symbol_size` | *number* | Specifies a symbol size\. | +| `directed_line_values` | `Absolute``OverallPct``PctTo``PctFrom` | Specify a threshold type\. | +| `show_legend` | *boolean* | You can specify whether the legend is displayed\. For plots with a large number of fields, hiding the legend may improve the appearance of the plot\. | +| `labels_as_nodes` | *boolean* | You can include the label text within each node rather than displaying adjacent labels\. For plots with a small number of fields, this may result in a more readable chart\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b416f3605adf246170e1b462ee0f2cfcdf5e591b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b416f3605adf246170e1b462ee0f2cfcdf5e591b.md new file mode 100644 index 0000000..81e5819 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b416f3605adf246170e1b462ee0f2cfcdf5e591b.md @@ -0,0 +1,37 @@ +# Setting properties + +# Setting properties # + +Nodes, flows, models, and outputs all have properties that can be accessed and, in most cases, set\. Properties are typically used to modify the behavior or appearance of the object\. The methods that are available for accessing and setting object properties are summarized in the following table\. + + + +Methods for accessing and setting object properties + +Table 1\. Methods for accessing and setting object properties + +| Method | Return type | Description | +| -------------------------------------------------------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `p.getPropertyValue(propertyName)` | Object | Returns the value of the named property or `None` if no such property exists\. | +| `p.setPropertyValue(propertyName, value)` | Not applicable | Sets the value of the named property\. | +| `p.setPropertyValues(properties)` | Not applicable | Sets the values of the named properties\. Each entry in the properties map consists of a key that represents the property name and the value that should be assigned to that property\. | +| `p.getKeyedPropertyValue( propertyName, keyName)` | Object | Returns the value of the named property and associated key or `None` if no such property or key exists\. | +| `p.setKeyedPropertyValue( propertyName, keyName, value)` | Not applicable | Sets the value of the named property and key\. | + + + +For example, the following script sets the value of a Derive node for a flow: + + stream = modeler.script.stream() + node = stream.findByType("derive", None) + node.setPropertyValue("name_extension", "new_derive") + +Alternatively, you might want to filter a field from a Filter node\. In this case, the value is also keyed on the field name\. For example: + + stream = modeler.script.stream() + # Locate the filter node ... + node = stream.findByType("filter", None) + # ... and filter out the "Na" field + node.setKeyedPropertyValue("include", "Na", False) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b481bde61eeba2cc6b2a0c1d9c43d8dd56ab2a08.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b481bde61eeba2cc6b2a0c1d9c43d8dd56ab2a08.md new file mode 100644 index 0000000..0c8e259 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b481bde61eeba2cc6b2a0c1d9c43d8dd56ab2a08.md @@ -0,0 +1,142 @@ +# Box connection + +# Box connection # + +To access your data in Box, create a connection asset for it\. + +The Box platform is a cloud content management and file sharing service\. + +## Prerequisite: Create a custom app in Box ## + +Before you create a connection to Box, you create a custom app in the Box Developer Console\. You can create an app for application\-level access that users can use to share files, or you can create an app for enterprise\-wide access to all user accounts\. With enterprise\-wide access, users do not need to share files and folders with the application\. + + + +1. Go to the [Box Developer Console](https://app.box.com/developers/console), and follow the wizard to create a **Custom App**\. For the **Authentication Method**, select `OAuth 2.0 with JWT (Server Authentication)`\. +2. Make the following selections in the **Configuration** page\. Otherwise, keep the default settings\. + + + + 1. Select one of two choices for **App Access Level**: + + + + * Keep the default **App Access Only** selection to allow access where users share files. + + * Select **App \+ Enterprise Access** to create an app with enterprise-wide access to all user accounts. + + + + 2. Under **Add and Manage Public Keys**, click **Generate a Public/Private Keypair**. This selection requires that two-factor authentication is enabled on the Box account, but you can disable it afterward. The generated key pair produces a config (`*_config.json`) file for you to download. You will need the information in this file to create the connection in your project. + + + +3. If you selected an **App \+ Enterprise Access**, under **Advanced Features**, select both of these check boxes: + + + + * **Make API calls using the as-user header** + * **Generate user access tokens** + + + +4. Submit the app client ID to the Box enterprise administrator for authorization: Go to your application in the [Box Developer Console](https://app.box.com/developers/console) and select the **General** link from the left sidebar in your application\. Scroll down to the **App Authorization** section\. + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Create the Box connection ### + +Enter the values from the downloaded config file for these settings: + + + + * **Client ID** + * **Client Secret** + * **Enterprise ID** + * **Private Key** (Replace each `\n` with a newline) + * **Private Key Password** (The `passphrase` value in the config file) + * **Public Key** (The `publicKeyID` value in the config file) + + + +### Enterprise\-wide app ### + +If you configured an enterprise\-wide access app, enter the username of the Box user account in the **Username** field\. + +### Application\-level app ### + +Users must explicitly share their files with the app's email address in order for the app to access the files\. + + + +1. Make a REST call to the connection to find out the app email address\. For example: + + `PUT https://api.dataplatform.cloud.ibm.com/v2/connections/{connection_id}/actions/get_user_info?project_id={project_id}` + + Request body: + + {} + + Returns: + + { + "login_name": "AutomationUser_123467_aBcDEFg12h@boxdevedition.com" + } +2. Share the files and folders in Box that you want accessible from Watson Studio with the login name that was returned by the REST call\. + + + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use the Box connection in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Limitation ## + +If you have thousands of files in a Box folder, the connection might not be able to retrieve the files before a time\-out\. Jobs or profiling that use the Box files might not work\. + +**Workaround**: Reorganize the file hierarchy in Box so that there are fewer files in the same folder\. + +## Supported file types ## + +The Box connection supports these file types: Avro, CSV, Delimited text, Excel, JSON, ORC, Parquet, SAS, SAV, SHP, and XML\. + +## Learn more ## + +[Managing custom apps](https://support.box.com/hc/articles/360044196653-Managing-custom-apps) + +**Parent topic**: [Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b49f37bd511123a94fcad3c6e826e60fc61db446.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b49f37bd511123a94fcad3c6e826e60fc61db446.md new file mode 100644 index 0000000..6a3d715 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b49f37bd511123a94fcad3c6e826e60fc61db446.md @@ -0,0 +1,6 @@ +# Time plots + +# Time plots # + +Time plots illustrate data points at successive intervals of time\. The time series you plot must contain numeric values and are assumed to occur over a range of time in which the periods are uniform\. Time plots provide a preliminary analysis of the characteristics of time series data on basic statistics and test, and thus generate useful insights about your data before modeling\. Time plots include analysis methods such as decomposition, augmented Dickey\-Fuller test (ADF), correlations (ACF/PACF), and spectral analysis\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b4b2e864e1abd4ea20845750e9567225bb3f417e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b4b2e864e1abd4ea20845750e9567225bb3f417e.md new file mode 100644 index 0000000..704b680 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b4b2e864e1abd4ea20845750e9567225bb3f417e.md @@ -0,0 +1,133 @@ +# Relations extraction + +# Relations extraction # + +Watson Natural Language Processing Relations extraction encapsulates algorithms for extracting relations between two entity mentions\. For example, in the text *Lionel Messi plays for FC Barcelona\.* a relation extraction model may decide that the entities `Lionel Messi` and `F.C. Barcelona` are in a relationship with each other, and the relationship type is `works for`\. + +**Capabilities** + +Use this model to detect relations between discovered entities\. + +The following table lists common relations types that are available out\-of\-the\-box after you have run the entity models\. + + + +Table 1\. Available common relation types between entities + +| Relation | Description | +| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `affiliatedWith` | Exists between two entities that have an affiliation or are similarly connected\. | +| `basedIn` | Exists between an Organization and the place where it is mainly, only, or intrinsically located\. | +| `bornAt` | Exists between a Person and the place where they were born\. | +| `bornOn` | Exists between a Person and the Date or Time when they were born\. | +| `clientOf` | Exists between two entities when one is a direct business client of the other (that is, pays for certain services or products)\. | +| `colleague` | Exists between two Persons who are part of the same Organization\. | +| `competitor` | Exists between two Organizations that are engaged in economic competition\. | +| `contactOf` | Relates contact information with an entity\. | +| `diedAt` | Exists between a Person and the place at which he, she, or it died\. | +| `diedOn` | Exists between a Person and the Date or Time on which he, she, or it died\. | +| `dissolvedOn` | Exists between an Organization or URL and the Date or Time when it was dissolved\. | +| `educatedAt` | Exists between a Person and the Organization at which he or she is or was educated\. | +| `employedBy` | Exists between two entities when one pays the other for certain work or services; monetary reward must be involved\. In many circumstances, marking this relation requires world knowledge\. | +| `foundedOn` | Exists between an Organization or URL and the Date or Time on which it was founded\. | +| `founderOf` | Exists between a Person and a Facility, Organization, or URL that they founded\. | +| `locatedAt` | Exists between an entity and its location\. | +| `managerOf` | Exists between a Person and another entity such as a Person or Organization that he or she manages as his or her job\. | +| `memberOf` | Exists between an entity, such as a Person or Organization, and another entity to which he, she, or it belongs\. | +| `ownerOf` | Exists between an entity, such as a Person or Organization, and an entity that he, she, or it owns\. The owner does not need to have permanent ownership of the entity for the relation to exist\. | +| `parentOf` | Exists between a Person and their children or stepchildren\. | +| `partner` | Exists between two Organizations that are engaged in economic cooperation\. | +| `partOf` | Exists between a smaller and a larger entity of the same type or related types in which the second entity subsumes the first\. If the entities are both events, the first must occur within the time span of the second for the relation to be recognized\. | +| `partOfMany` | Exists between smaller and larger entities of the same type or related types in which the second entity, which must be plural, includes the first, which can be singular or plural\. | +| `populationOf` | Exists between a place and the number of people located there, or an organization and the number of members or employees it has\. | +| `measureOf` | This relation indicates the quantity of an entity or measure (height, weight, etc) of an entity\. | +| `relative` | Exists between two Persons who are relatives\. To identify parents, children, siblings, and spouses, use the `parentOf`, `siblingOf`, and `spouseOf` relations\. | +| `residesIn` | Exists between a Person and a place where they live or previously lived\. | +| `shareholdersOf` | Exists between a Person or Organization, and an Organization of which the first entity is a shareholder\. | +| `siblingOf` | Exists between a Person and their sibling or stepsibling\. | +| `spokespersonFor` | Exists between a Person and an Facility, Organization, or Person that he or she represents\. | +| `spouseOf` | Exists between two Persons that are spouses\. | +| `subsidiaryOf` | Exists between two Organizations when the first is a subsidiary of the second\. | + + + +In [Runtime 22\.2](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-relation-extraction.html?context=cdpaas&locale=en#runtime-222), relation extraction is provided as an analysis block, which depends on the Syntax analysis block and a entity mention extraction block\. Starting with [Runtime 23\.1](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-relation-extraction.html?context=cdpaas&locale=en#runtime-231), relation extraction is provided as a workflow, which is directly run on the input text\. + +### Relation extraction in Runtime 23\.1 ### + +**Workflow name** + +`relations_transformer-workflow_multilingual_slate.153m.distilled` + +**Supported languages** The Relations Workflow is available for the following languages\. For a list of the language codes and the corresponding language, see [Language codes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html#lang-codes)\. + +ar, de, en, es, fr, it, ja, ko, pt + +**Code sample** + + import watson_nlp + + # Load the workflow model + relations_workflow = watson_nlp.load('relations_transformer-workflow_multilingual_slate.153m.distilled') + + # Run the relation extraction workflow on the input text + relations = relations_workflow.run('Anna Smith is an engineer. Anna works at IBM.', language_code="en") + print(relations.get_relation_pairs_by_type()) + +**Output of the code sample** + + {'employedBy': [(('Anna', 'Person'), ('IBM', 'Organization'))]} + +### Relation extraction in Runtime 22\.2 ### + +**Block name** + +`relations_transformer_en_stock` + +**Supported languages** + +The Relations extraction block is available for English only\. + +**Dependencies on other blocks** + +The following block must run before you can run the `relations_transformer_en_stock` block: + + + + * `syntax_izumo_en_stock` + + + +This must be followed by one of the following entity models on which the relations extraction block can build its results: + + + + * entity\-mentions\_rbr\_en\_stock + * entity\-mentions\_bert\_multi\_stock + + + +**Code sample** + + import watson_nlp + + # Load the models for English + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + entity_mentions_model = watson_nlp.load('entity-mentions_bert_multi_stock') + relation_model = watson_nlp.load('relations_transformer_en_stock') + + # Run the prerequisite models + syntax_prediction = syntax_model.run('Anna Smith is an engineer. Anna works at IBM.') + entity_mentions = entity_mentions_model.run(syntax_prediction) + + # Run the relations model + relations_on_mentions = relation_model.run(syntax_prediction, mentions_prediction=entity_mentions) + print(relations_on_mentions.get_relation_pairs_by_type()) + +Output of the code sample: + + {'employedBy': [(('Anna', 'Person'), ('IBM', 'Organization'))]} + +**Parent topic:**[Watson Natural Language Processing task catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b508da024ee4722c3919c4d1118cf0410713a9c5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b508da024ee4722c3919c4d1118cf0410713a9c5.md new file mode 100644 index 0000000..d649b64 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b508da024ee4722c3919c4d1118cf0410713a9c5.md @@ -0,0 +1,114 @@ +# Adding data to a project + +# Adding data to a project # + +After you create a project, the next step is to add data assets to it so that you can work with data\. All the collaborators in the project are automatically authorized to access the data in the project\. + +Different asset types can have duplicate names\. However, you can't add an asset type with the same name multiple times\. + +You can use the following methods to add data assets to projects: + + + +| Method | When to use | +| ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | +| [Add local files](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html?context=cdpaas&locale=en#files) | You have data in CSV or similar files on your local system\. | +| [Add Samples data sets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html?context=cdpaas&locale=en#community) | You want to use sample data sets\. | +| [Add database connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) | You need to connect to a remote data source\. | +| [Add data from a connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html) | You need one or more tables or files from a remote data source\. | +| [Add connected folder assets from IBM Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/folder-asset.html) | You need a folder in IBM Cloud Object Storage that contains a dynamic set of files, such as a news feed\. | +| [Convert files in project storage to assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html?context=cdpaas&locale=en#os) | You want to convert files that you created in the project into data assets\. | + + + +## Add local files ## + +You can add a file from your local system as a data asset in a project\. + +**Required permissions** : You must have the **Editor** or **Admin** role in the project\. + +**Restrictions** : \- The file cannot be empty\. : \- The file name can't exceed 255 characters\. + +: \- The maximum size for files that you can load with the UI is 5 GB\. You can [load larger files to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/store-large-objs-in-cos.html) with APIs\. + +Important: You can't add executable files to a project\. All other types files that you add to a project are not checked for malicious code\. You must ensure that your files do not contain malware or other types of malicious software that other collaborators might download\. + +To add data files to a project: + + + +1. From your project's **Assets** page, click the **Upload asset to project** icon (![Shows the find data icon\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/find_data_icon.png))\. You can also click the same icon (![Shows the find data icon\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/find_data_icon.png)) from within a notebook or canvas\. +2. In the pane that opens, browse for the files or drag them onto the pane\. You must stay on the page until the load is complete\. + + + +The files are saved in the object storage that is associated with your project and are listed as data assets on the **Assets** page of your project\. + +When you click the data asset name, you can see this information about data assets from files: + + + + * The asset name and description + * The tags for the asset + * The name of the person who created the asset + * The size of the data + * The date when the asset was added to the project + * The date when the asset was last modified + * A [preview](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/previews.html) of the data, for CSV, Avro, Parquet, TSV, Microsoft Excel, PDF, text, JSON, and image files + * A [profile](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/profile.html) of the data, for CSV, Avro, Parquet, TSV, and Microsoft Excel files + + + +You can update the contents of a data asset from a file by adding a file with the same name and format to the project and then choosing to replace the existing data asset\. + +You can remove the data asset by choosing the **Delete** option from the action menu next to the asset name\. Choose the **Prepare data** option to refine the data with [Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html)\. + +## Add Samples data sets ## + +You can add data sets from Samples to your project: + + + +1. In Samples, find the card for the data set that you want to add\. +2. Click the **Add to Project** icon from the action bar, select the project, and click **Add**\. + + + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Convert files in project storage to assets ## + +The storage for the project contains the data assets that you uploaded to the project, but it can also contain other files\. For example, you can save a DataFrame in a notebook in the project environment storage\. You can convert files in project storage to assets\. + +To convert files in project storage to assets: + + + +1. From the **Assets** tab of your project, click **Import asset**\. +2. Select **Project files**\. +3. Select the **data\_asset** folder\. +4. Select the asset and click **Import**\. + + + +## Next steps ## + + + + * [Refine the data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + * [Analyze the data and work with models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-science.html) + + + +## Learn more ## + + + + * [Downloading data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/download.html) + * [Publishing data assets to a catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/catalog/publish-asset-project.html) + + + +**Parent topic:**[Preparing data](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/get-data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b518a7a2d4aa3b05564c965889116f6a6151a34b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b518a7a2d4aa3b05564c965889116f6a6151a34b.md new file mode 100644 index 0000000..0cfacc4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b518a7a2d4aa3b05564c965889116f6a6151a34b.md @@ -0,0 +1,142 @@ +# Authenticating for programmatic access + +# Authenticating for programmatic access # + +To use Watson Machine Learning with the Python client library or the REST API, you must authenticate to secure your work\. Learn about the different ways to authenticate and how to apply them to the service of your choosing\. + +You use IBM Cloud® Identity and Access Management (IAM) to make authenticated requests to public IBM Watson™ services\. With IAM access policies, you can assign access to more than one resource from a single key\. In addition, a user, service ID, and service instance can hold multiple API keys\. + +## Security overview ## + +Refer to the section that describes your security needs\. + + + + * [Authentication credentials](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-authentication.html?context=cdpaas&locale=en#terminology) + * [Python client](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-authentication.html?context=cdpaas&locale=en#python-client) + * [Rest API](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-authentication.html?context=cdpaas&locale=en#rest-api) + + + +## Authentication credentials ## + +These terms relate to the security requirements described in this topic\. + + + + * **API keys** allow you to easily authenticate when you are using the Python client or APIs and can be used across multiple services\. API Keys are considered confidential because they are used to grant access\. Treat all API keys as you would a password because anyone with your API key can access your service\. + * An **IAM token** is an authentication token that is required to access IBM Cloud services\. You can generate a token by using your API key in the token request\. For details on using IAM tokens, refer to [Authenticating to Watson Machine Learning API](https://cloud.ibm.com/apidocs/machine-learning#authentication)\. + + + +To authenticate to a service through its API, pass your credentials to the API\. You can pass either a bearer token in an authorization header or an API key\. + +### Generating an API key ### + +To generate an API key from your IBM Cloud user account, go to [Manage access and users \- API Keys](https://cloud.ibm.com/iam/apikeys) and create or select an API key for your user account\. + +You can also generate and rotate API keys from **Profile and settings > User API key**\. For more information, see [Managing the user API key](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-apikeys.html)\. + +### Authenticate with an IAM token ### + +IAM tokens are temporary security credentials that are valid for 60 minutes\. When a token expires, you generate a new one\. Tokens can be useful for temporary access to resources\. For more information, see [Generating an IBM Cloud IAM token by using an API key](https://cloud.ibm.com/docs/account?topic=account-iamtoken_from_apikey)\. + +### Getting a service\-level token ### + +You can also authenticate with a service\-level token\. To generate a service\-level token: + + + +1. Refer to the IBM Cloud instructions for [creating a Service ID](https://cloud.ibm.com/iam/serviceids)\. +2. Generate an API key for that Service ID\. +3. Open the space where you plan to keep your deployable assets\. +4. On the **Access control** tab, add the Service ID and assign an access role of **Admin** or **Editor**\. + + + +You can use the service\-level token with your API scoring requests\. + +## Interfaces ## + + + + * [Python client](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-authentication.html?context=cdpaas&locale=en#python) + * [REST API](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-authentication.html?context=cdpaas&locale=en#rest-api) + + + +### Python client ### + +Refer to: [Watson Machine Learning Python client ![external link](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/launch-glyph.png)](https://ibm.github.io/watson-machine-learning-sdk/) + +To create an instance of the Watson Machine Learning Python client object, you need to pass your credentials to Watson Machine Learning API client\. + + wml_credentials = { + "apikey":"123456789", + "url": " https://HIJKL" + } + from ibm_watson_machine_learning import APIClient + wml_client = APIClient(wml_credentials) + +Note:Even though you do not explicitly provide an `instance_id`, it will be picked up from the associated space or project for billing purposes\. For details on plans and billing for Watson Machine Learning services, refer to [Watson Machine Learning plans and runtime usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +Refer to [sample notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-samples-overview.html) for examples of how to authenticate and then score a model by using the Python client\. + +### REST API ### + +Refer to: [Watson Machine Learning REST API ![external link](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/launch-glyph.png)](https://cloud.ibm.com/apidocs/machine-learning) + +To use the Watson Machine Learning REST API, you must obtain an IBM Cloud Identity and Access Management (IAM) token\. In this example, you would supply your API key in place of the example key\. + +#### cURL example #### + + curl -k -X POST \ + --header "Content-Type: application/x-www-form-urlencoded" \ + --header "Accept: application/json" \ + --data-urlencode "grant_type=urn:ibm:params:oauth:grant-type:apikey" \ + --data-urlencode "apikey=123456789" \ + "https://iam.cloud.ibm.com/identity/token" + +The obtained IAM token needs to be prefixed with the word `Bearer`, and passed in the Authorization header for API calls\. + +#### Python example #### + + import requests + + # Paste your Watson Machine Learning service apikey here + + apikey = "123456789" + + # Get an IAM token from IBM Cloud + url = "https://iam.cloud.ibm.com/identity/token" + headers = { "Content-Type" : "application/x-www-form-urlencoded" } + data = "apikey=" + apikey + "&grant_type=urn:ibm:params:oauth:grant-type:apikey" + response = requests.post( url, headers=headers, data=data, auth=( apikey ) + iam_token = response.json()["access_token"] + +#### Node\.js example #### + + var btoa = require( "btoa" ); + var request = require( 'request' ); + + // Paste your Watson Machine Learning service apikey here + var apikey = "123456789"; + + // Use this code as written to get an access token from IBM Cloud REST API + // + var IBM_Cloud_IAM_uid = "bx"; + var IBM_Cloud_IAM_pwd = "bx"; + + var options = { url : "https://iam.cloud.ibm.com/identity/token", + headers : { "Content-Type" : "application/x-www-form-urlencoded", + "Authorization" : "Basic " + btoa( IBM_Cloud_IAM_uid + ":" + IBM_Cloud_IAM_pwd ) }, + body : "apikey=" + apikey + "&grant_type=urn:ibm:params:oauth:grant-type:apikey" }; + + request.post( options, function( error, response, body ) + { + var iam_token = JSON.parse( body )["access_token"]; + } ); + +**Parent topic:**[Managing predictive deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b51ff1fba515035a93290f353d20ad9d54bc043c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b51ff1fba515035a93290f353d20ad9d54bc043c.md new file mode 100644 index 0000000..36e9c87 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b51ff1fba515035a93290f353d20ad9d54bc043c.md @@ -0,0 +1,23 @@ +# applyanomalydetectionnode properties + +# applyanomalydetectionnode properties # + +You can use Anomaly Detection modeling nodes to generate an Anomaly Detection model nugget\. The scripting name of this model nugget is *applyanomalydetectionnode*\. For more information on scripting the modeling node itself, see [anomalydetectionnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/anomalydetectionnodeslots.html#anomalydetectionnodeslots)\. + + + +applyanomalydetectionnode properties + +Table 1\. applyanomalydetectionnode properties + +| `applyanomalydetectionnode` Properties | Values | Property description | +| -------------------------------------- | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `anomaly_score_method` | `FlagAndScore``FlagOnly``ScoreOnly` | Determines which outputs are created for scoring\. | +| `num_fields` | *integer* | Fields to report\. | +| `discard_records` | *flag* | Indicates whether records are discarded from the output or not\. | +| `discard_anomalous_records` | *flag* | Indicator of whether to discard the anomalous or *non*\-anomalous records\. The default is `off`, meaning that *non*\-anomalous records are discarded\. Otherwise, if `on`, anomalous records will be discarded\. This property is enabled only if the `discard_records` property is enabled\. | +| `enable_sql_generation` | `udf``native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b523ebe64275bee04d480b55ccaeac3017a36980.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b523ebe64275bee04d480b55ccaeac3017a36980.md new file mode 100644 index 0000000..cae1838 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b523ebe64275bee04d480b55ccaeac3017a36980.md @@ -0,0 +1,34 @@ +# Comparing the models (SPSS Modeler) + +# Comparing the models # + + + +1. Right\-click each Logistic node and run it to create the model nuggets, which are added to the flow\. Results are also added to the Outputs panel\. + + Figure 1. Attaching the model nuggets + + ![Attaching the model nuggets](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autodata_partial_flow.png) +2. Attach Analysis nodes to the model nuggets and run the Analysis nodes (using their default settings)\. + + Figure 2. Attaching the Analysis nodes + + ![Attaching the Analysis nodes](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autodata_partial_flow2.png)The Analysis of the non Auto Data Prep-derived model shows that just running the data through the Logistic Regression node with its default settings gives a model with low accuracy - just 10.6%. + + Figure 3. Non ADP-derived model results + + ![Non ADP-derived model results](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autodata_analysis_non_adp.png)The Analysis of the Auto-Data Prep-derived model shows that by running the data through the default Auto Data Prep settings, you have built a much more accurate model that's 78.3% correct. + + Figure 4. ADP-derived model results + + ![ADP-derived model results](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autodata_analysis_adp.png) + + + +In summary, by just running the Auto Data Prep node to fine tune the processing of your data, you were able to build a more accurate model with little direct data manipulation\. + +Obviously, if you're interested in proving or disproving a certain theory, or want to build specific models, you may find it beneficial to work directly with the model settings\. However, for those with a reduced amount of time, or with a large amount of data to prepare, the Auto Data Prep node may give you an advantage\. + +Note that the results in this example are based on the training data only\. To assess how well models generalize to other data in the real world, you would use a Partition node to hold out a subset of records for purposes of testing and validation\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b561f461842bb0d185f097e0adb8d3ac13266172.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b561f461842bb0d185f097e0adb8d3ac13266172.md new file mode 100644 index 0000000..56e9d20 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b561f461842bb0d185f097e0adb8d3ac13266172.md @@ -0,0 +1,60 @@ +# GLMM node (SPSS Modeler) + +# GLMM node # + +This node creates a generalized linear mixed model (GLMM)\. + +Generalized linear mixed models extend the linear model so that: + + + + * The target is linearly related to the factors and covariates via a specified link function + * The target can have a non\-normal distribution + * The observations can be correlated + + + +Generalized linear mixed models cover a wide variety of models, from simple linear regression to complex multilevel models for non\-normal longitudinal data\. + +Examples\. The district school board can use a generalized linear mixed model to determine whether an experimental teaching method is effective at improving math scores\. Students from the same classroom should be correlated since they are taught by the same teacher, and classrooms within the same school may also be correlated, so we can include random effects at school and class levels to account for different sources of variability\. + +Medical researchers can use a generalized linear mixed model to determine whether a new anticonvulsant drug can reduce a patient's rate of epileptic seizures\. Repeated measurements from the same patient are typically positively correlated so a mixed model with some random effects should be appropriate\. The target field – the number of seizures – takes positive integer values, so a generalized linear mixed model with a Poisson distribution and log link may be appropriate\. + +Executives at a cable provider of television, phone, and internet services can use a generalized linear mixed model to learn more about potential customers\. Since possible answers have nominal measurement levels, the company analyst uses a generalized logit mixed model with a random intercept to capture correlation between answers to the service usage questions across service types (tv, phone, internet) within a given survey responder's answers\. + +In the node properties, data structure options allow you to specify the structural relationships between records in your dataset when observations are correlated\. If the records in the dataset represent independent observations, you don't need to specify any data structure options\. + +Subjects\. The combination of values of the specified categorical fields should uniquely define subjects within the dataset\. For example, a single `Patient ID` field should be sufficient to define subjects in a single hospital, but the combination of `Hospital ID` and `Patient ID` may be necessary if patient identification numbers are not unique across hospitals\. In a repeated measures setting, multiple observations are recorded for each subject, so each subject may occupy multiple records in the dataset\. + +A subject is an observational unit that can be considered independent of other subjects\. For example, the blood pressure readings from a patient in a medical study can be considered independent of the readings from other patients\. Defining subjects becomes particularly important when there are repeated measurements per subject and you want to model the correlation between these observations\. For example, you might expect that blood pressure readings from a single patient during consecutive visits to the doctor are correlated\. + +All of the fields specified as subjects in the node properties are used to define subjects for the residual covariance structure, and provide the list of possible fields for defining subjects for random\-effects covariance structures on the Random Effect Block\. + +Repeated measures\. The fields specified here are used to identify repeated observations\. For example, a single variable `Week` might identify the 10 weeks of observations in a medical study, or `Month` and `Day` might be used together to identify daily observations over the course of a year\. + +Define covariance groups by\. The categorical fields specified here define independent sets of repeated effects covariance parameters; one for each category defined by the cross\-classification of the grouping fields\. All subjects have the same covariance type, and subjects within the same covariance grouping will have the same values for the parameters\. + +Spatial covariance coordinates\. The variables in this list specify the coordinates of the repeated observations when one of the spatial covariance types is selected for the repeated covariance type\. + +Repeated covariance type\. This specifies the covariance structure for the residuals\. The available structures are: + + + + * First\-order autoregressive (AR1) + * Autoregressive moving average (1,1) (ARMA11) + * Compound symmetry + * Diagonal + * Scaled identity + * Spatial: Power + * Spatial: Exponential + * Spatial: Gaussian + * Spatial: Linear + * Spatial: Linear\-log + * Spatial: Spherical + * Toeplitz + * Unstructured + * Variance components + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b57a4b94bfafdd0cd6edbdfa4aba1f708286e918.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b57a4b94bfafdd0cd6edbdfa4aba1f708286e918.md new file mode 100644 index 0000000..384e088 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b57a4b94bfafdd0cd6edbdfa4aba1f708286e918.md @@ -0,0 +1,15 @@ +# Historical data (SPSS Modeler) + +# Historical data # + +This example uses the data file pm\_customer\_train1\.csv, which contains historical data that tracks the offers made to specific customers in past campaigns, as indicated by the value of the `campaign` field\. The largest number of records fall under the `Premium account` campaign\. + +The values of the `campaign` field are actually coded as integers in the data (for example `2 = Premium account`)\. Later, you'll define labels for these values that you can use to give more meaningful output\. + +Figure 1\. Data about previous promotions + +![Data about previous promotions](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autoflag_historical.png) + +The file also includes a `response` field that indicates whether the offer was accepted (`0 = no`, and `1 = yes`)\. This will be the target field, or value, that you want to predict\. A number of fields containing demographic and financial information about each customer are also included\. These can be used to build or "train" a model that predicts response rates for individuals or groups based on characteristics such as income, age, or number of transactions per month\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b5873013457aaddcc20db880b3fc9d9bfb7bd348.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b5873013457aaddcc20db880b3fc9d9bfb7bd348.md new file mode 100644 index 0000000..cb1528b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b5873013457aaddcc20db880b3fc9d9bfb7bd348.md @@ -0,0 +1,56 @@ +# ARIMA (SPSS Modeler) + +# ARIMA # + +With the ARIMA procedure, you can create an autoregressive integrated moving\-average (ARIMA) model that is suitable for finely tuned modeling of time series\. + +ARIMA models provide more sophisticated methods for modeling trend and seasonal components than do exponential smoothing models, and they have the added benefit of being able to include predictor variables in the model\. + +Continuing the example of the catalog company that wants to develop a forecasting model, we have seen how the company has collected data on monthly sales of men's clothing along with several series that might be used to explain some of the variation in sales\. Possible predictors include the number of catalogs mailed and the number of pages in the catalog, the number of phone lines open for ordering, the amount spent on print advertising, and the number of customer service representatives\. + +Are any of these predictors useful for forecasting? Is a model with predictors really better than one without? Using the ARIMA procedure, we can create a forecasting model with predictors, and see if there's a significant difference in predictive ability over the exponential smoothing model with no predictors\. + +With the ARIMA method, you can fine\-tune the model by specifying orders of autoregression, differencing, and moving average, as well as seasonal counterparts to these components\. Determining the best values for these components manually can be a time\-consuming process involving a good deal of trial and error so, for this example, we'll let the Expert Modeler choose an ARIMA model for us\. + +We'll try to build a better model by treating some of the other variables in the dataset as predictor variables\. The ones that seem most useful to include as predictors are the number of catalogs mailed (`mail`), the number of pages in the catalog (`page`), the number of phone lines open for ordering (`phone`), the amount spent on print advertising (`print`), and the number of customer service representatives (`service`)\. + + + +1. Double\-click the Type node to open its properties\. +2. Set the role for `mail`, `page`, `phone`, `print`, and `service` to Input\. +3. Ensure that the role for `men` is set to Target and that all the remaining fields are set to None\. +4. Click Save\. +5. Double\-click the Time Series node\. +6. Under BUILD OPTIONS \- GENERAL, select Expert Modeler for the method\. +7. Select the options ARIMA models only and Expert Modeler considers seasonal models\. + + Figure 1. Choosing only ARIMA models + + ![Choosing only ARIMA models](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_forecast_arima.png) +8. Click Save and run the flow\. +9. Right\-click the model nugget and select View Model\. Click men and then click Model information\. Notice how the Expert Modeler has chosen only two of the five specified predictors as being significant to the model\. + + Figure 2. Expert Modeler chooses two predictors + + ![Expert Modeler chooses two predictors](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_forecast_arima_predictors.png) +10. Open the latest chart output\. + + Figure 3. ARIMA model with predictors specified + + ![ARIMA model with predictors specified](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_forecast_arima_chart.png) + + This model improves on the previous one by capturing the large downward spike as well, making it the best fit so far. + + We could try refining the model even further, but any improvements from this point on are likely to be minimal. We've established that the ARIMA model with predictors is preferable, so let's use the model we have just built. For the purposes of this example, we'll forecast sales for the coming year. +11. Double\-click the Time Series node\. +12. Under MODEL OPTIONS, select the option Extend records into the future and set its value to 12\. +13. Select the Compute future values of inputs option\. +14. Click Save and run the flow\.The forecast looks good\. As expected, there's a return to normal sales levels following the December peak, and a steady upward trend in the second half of the year, with sales in general better than those for the previous year\. + + Figure 4. Sales forecast extended by 12 months + + ![Sales forecast extended by 12 months](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_forecast_arima_finalchart.png) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b61649df5425dea0c1f16942bde0eec79b3e4f80.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b61649df5425dea0c1f16942bde0eec79b3e4f80.md new file mode 100644 index 0000000..37649ba --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b61649df5425dea0c1f16942bde0eec79b3e4f80.md @@ -0,0 +1,118 @@ +# Publishing notebooks on GitHub + +# Publishing notebooks on GitHub # + +To collaborate with stakeholders and other data scientists, you can publish your notebooks in GitHub repositories\. You can also use GitHub to back up notebooks for source code management\. + +Watch this video to see how to enable GitHub integration\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + + + + * Transcript + + Synchronize transcript with video + + + + | Time | Transcript | + | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | 00:00 | This video shows you how to publish notebooks from your Watson Studio project to your GitHub account. | + | 00:07 | Navigate to your profile and settings. | + | 00:11 | On the "Integrations" tab, visit the link to generate a GitHub personal access token. | + | 00:17 | Provide a descriptive name for the token and select the repo and gist scopes, then generate the token. | + | 00:29 | Copy the token, return to the GitHub integration settings, and paste the token. | + | 00:36 | The token is validated when you save it to your profile settings. | + | 00:42 | Now, navigate to your projects. | + | 00:44 | You enable GitHub integration at the project level on the "Settings" tab. | + | 00:50 | Simply scroll to the bottom and paste the existing GitHub repository URL. | + | 00:56 | You'll find that on the "Code" tab in the repo. | + | 01:01 | Click "Update" to make the connection. | + | 01:05 | Now, go to the "Assets" tab and open the notebook you want to publish. | + | 01:14 | Notice that this notebook has the credentials replaced with X's. | + | 01:19 | It's a best practice to remove or replace credentials before publishing to GitHub. | + | 01:24 | So, this notebook is ready for publishing. | + | 01:27 | You can provide the target path along with a commit message. | + | 01:31 | You also have the option to publish content without hidden code, which means that any cells in the notebook that began with the hidden cell comment will not be published. | + | 01:42 | When you're, ready click "Publish". | + | 01:45 | The message tells you that the notebook was published successfully and provides links to the notebook, the repository, and the commit. | + | 01:54 | Let's take a look at the commit. | + | 01:57 | So, there's the commit, and you can navigate to the repository to see the published notebook. | + | 02:04 | Lastly, you can publish as a gist. | + | 02:07 | Gists are another way to share your work on GitHub. | + | 02:10 | Every gist is a git repository, so it can be forked and cloned. | + | 02:15 | There are two types of gists: public and secret. | + | 02:19 | If you start out with a secret gist, you can convert it to a public gist later. | + | 02:24 | And again, you have the option to remove hidden cells. | + | 02:29 | Follow the link to see the published gist. | + | 02:32 | So that's the basics of Watson Studio's GitHub integration. | + | 02:37 | Find more videos in the Cloud Pak for Data as a Service documentation. | + + + + + +## Enabling access to GitHub from your account ## + +Before you can publish notebooks on GitHub, you must enable your IBM watsonx account to access GitHub\. You enable access by creating a personal access token with the required access scope in GitHub and linking the token to your IBM watsonx account\. + +Follow these steps to create a personal access token: + + + +1. Click your avatar in the header, and then click **Profile and settings**\. +2. Go to the **Integrations** tab and click the GitHub personal access tokens link on the dialog and generate a new token\. +3. On the New personal access token page, select repo scope and then click to generate a token\. +4. Copy the generated access token and paste it in the GitHub integration dialog window in IBM watsonx\. + + + +## Linking a project to a GitHub repository ## + +After you have saved the access token, your project must be connected to an existing GitHub repository\. You can only link to one existing GitHub repository from a project\. Private repositories are supported\. + +To link a project to an existing GitHub repository, you must have administrator permission to the project\. All project collaborators, who have adminstrator or editor permission, can publish files to this GitHub repository\. However, these users must have permission to access the repository\. Granting user permissions to repositories must be done in GitHub\. + +To connect a project to an existing GitHub repository: + + + +1. Select the **Manage** tab and go to the **Services and Integrations** page\. +2. Click the **Third\-party integrations** tab\. +3. Click **Connect integration**\. +4. Enter your generated access token from Github\. + + + +Now you can begin publishing notebooks on GitHub\. + +Note:For information on how to change your Git integration, refer to [Managing your integrations](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/personal-settings.html#integrations)\. + +## Publishing a notebook on GitHub ## + +To publish a notebook on GitHub: + + + +1. Open the notebook in edit mode\. +2. Click the GitHub integration icon (![Shows the upload icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/upload.png)) and select **Publish on GitHub** from the opened notebook's action bar\. + + + +When you enter the name of the file you want to publish on GitHub, you can specify a folder path in the GitHub repository\. Note that notebook files are always pushed to the master branch\. + +If you get this error: `An error occurred while publishing the notebook. Invalid access token permissions or repository does not exist.` make sure that: + + + + * You generated your personal access token, as described in [Enabling access to GitHub from your account](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/enabling-access.html) and the token was not deleted\. + * The repository that you want to publish your notebook to still exists\. + + + +**Parent topic:**[Managing the lifecycle of notebooks and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-nb-lifecycle.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b648a5dee55d7dbf258b7b088830f18c040c61d5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b648a5dee55d7dbf258b7b088830f18c040c61d5.md new file mode 100644 index 0000000..df4ed64 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b648a5dee55d7dbf258b7b088830f18c040c61d5.md @@ -0,0 +1,19 @@ +# Browsing the model (SPSS Modeler) + +# Browsing the model # + + + + * Right\-click the Logistic node and run it to generate its model nugget\. Right\-click the nugget and select View Model\.The Parameter Estimates page shows the target (churn) and inputs (predictor fields) used by the model\. These are the fields that were actually chosen based on the Forwards Stepwise method, not the complete list submitted for consideration\. + + Figure 1. Parameter estimates showing input fields + + ![Parameter estimates showing input fields](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_churn_estimates.png) + + To assess how well the model actually fits your data, a number of diagnostics are available in the expert node settings when you're building the flow. + + Note also that these results are based on the training data only. To assess how well the model generalizes to other data in the real world, you would use a Partition node to hold out a subset of records for purposes of testing and validation. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b69246113e589f088e8e1302b32b57720bd27720.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b69246113e589f088e8e1302b32b57720bd27720.md new file mode 100644 index 0000000..c627ca2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b69246113e589f088e8e1302b32b57720bd27720.md @@ -0,0 +1,10 @@ +# Fields (SPSS Modeler) + +# Fields # + +Names in CLEM expressions that aren’t names of functions are assumed to be field names\. + +You can write these simply as `Power`, `val27`, `state_flag`, and so on, but if the name begins with a digit or includes non\-alphabetic characters, such as spaces (with the exception of the underscore), place the name within single quotation marks (for example, `'Power Increase'`, `'2nd answer'`, `'#101'`, `'$P-NextField'`)\. + +Note: Fields that are quoted but undefined in the data set will be misread as strings\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b6dc074f83f9e8984b9cd3a3bf5b392bc4a61844.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b6dc074f83f9e8984b9cd3a3bf5b392bc4a61844.md new file mode 100644 index 0000000..a5c5c4b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b6dc074f83f9e8984b9cd3a3bf5b392bc4a61844.md @@ -0,0 +1,18 @@ +# Extension nodes (SPSS Modeler) + +# Extension nodes # + +SPSS Modeler supports the languages R and Apache Spark (via Python)\. + +To complement SPSS Modeler and its data mining abilities, several Extension nodes are available to enable expert users to input their own R scripts or Python for Spark scripts to carry out data processing, model building, and model scoring\. + + + + * The Extension Import node is available under Import on the Node Palette\. See [Extension Import node](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_importer.html)\. + * The Extension Model node is available under Modeling on the Node Palette\. See [Extension Model node](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_build.html)\. + * The Extension Output node is available under Outputs on the Node Palette\. See [Extension Output node](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_output.html)\. + * The Extension Export node is available under Export on the Node Palette\. See [Extension Export node](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/extension_export.html)\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b6dc15d9f3f199c8bab5f85eda67d50627bb3e08.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b6dc15d9f3f199c8bab5f85eda67d50627bb3e08.md new file mode 100644 index 0000000..f52696f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b6dc15d9f3f199c8bab5f85eda67d50627bb3e08.md @@ -0,0 +1,45 @@ +# ocsvmnode properties + +# ocsvmnode properties # + +![One\-Class SVM node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/pythononeclassnodeicon.png)The One\-Class SVM node uses an unsupervised learning algorithm\. The node can be used for novelty detection\. It will detect the soft boundary of a given set of samples, to then classify new points as belonging to that set or not\. This One\-Class SVM modeling node in SPSS Modeler is implemented in Python and requires the scikit\-learn© Python library\. + + + +ocsvmnode properties + +Table 1\. ocsvmnode properties + +| `ocsvmnode` properties | Data type | Property description | +| ---------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `custom_fields` | *boolean* | This option tells the node to use field information specified here instead of that given in any upstream Type node(s)\. After selecting this option, specify the following fields as required\. | +| `inputs` | *field* | List of the field names for input\. | +| `role_use` | *string* | Specify `predefined` to use predefined roles or `custom` to use custom field assignments\. Default is predefined\. | +| `splits` | *field* | List of the field names for split\. | +| `use_partition` | *Boolean* | Specify `true` or `false`\. Default is `true`\. If set to `true`, only training data will be used when building the model\. | +| `mode_type` | *string* | The mode\. Possible values are `simple` or `expert`\. All parameters on the Expert tab will be disabled if `simple` is specified\. | +| `stopping_criteria` | *string* | A string of scientific notation\. Possible values are `1.0E-1`, `1.0E-2`, `1.0E-3`, `1.0E-4`, `1.0E-5`, or `1.0E-6`\. Default is `1.0E-3`\. | +| `precision` | *float* | The regression precision (nu)\. Bound on the fraction of training errors and support vectors\. Specify a number greater than `0` and less than or equal to `1.0`\. Default is `0.1`\. | +| `kernel` | *string* | The kernel type to use in the algorithm\. Possible values are `linear`, `poly`, `rbf`, `sigmoid`, or `precomputed`\. Default is `rbf`\. | +| `enable_gamma` | *Boolean* | Enables the `gamma` parameter\. Specify `true` or `false`\. Default is `true`\. | +| `gamma` | *float* | This parameter is only enabled for the kernels `rbf`, `poly`, and `sigmoid`\. If the `enable_gamma` parameter is set to `false`, this parameter will be set to `auto`\. If set to `true`, the default is `0.1`\. | +| `coef0` | *float* | Independent term in the kernel function\. This parameter is only enabled for the `poly` kernel and the `sigmoid` kernel\. Default value is `0.0`\. | +| `degree` | *integer* | Degree of the polynomial kernel function\. This parameter is only enabled for the `poly` kernel\. Specify any integer\. Default is `3`\. | +| `shrinking` | *Boolean* | Specifies whether to use the shrinking heuristic option\. Specify `true` or `false`\. Default is `false`\. | +| `enable_cache_size` | *Boolean* | Enables the `cache_size` parameter\. Specify `true` or `false`\. Default is `false`\. | +| `cache_size` | *float* | The size of the kernel cache in MB\. Default is `200`\. | +| `enable_random_seed` | *Boolean* | Enables the `random_seed` parameter\. Specify `true` or `false`\. Default is `false`\. | +| `random_seed` | *integer* | The random number seed to use when shuffling data for probability estimation\. Specify any integer\. | +| `pc_type` | *string* | The type of the parallel coordinates graphic\. Possible options are `independent` or `general`\. | +| `lines_amount` | *integer* | Maximum number of lines to include on the graphic\. Specify an integer between `1` and `1000`\. | +| `lines_fields_custom` | *Boolean* | Enables the `lines_fields` parameter, which allows you to specify custom fields to show in the graph output\. If set to `false`, all fields will be shown\. If set to `true`, only the fields specified with the lines\_fields parameter will be shown\. For performance reasons, a maximum of 20 fields will be displayed\. | +| `lines_fields` | *field* | List of the field names to include on the graphic as vertical axes\. | +| `enable_graphic` | *Boolean* | Specify `true` or `false`\. Enables graphic output (disable this option if you want to save time and reduce stream file size)\. | +| `enable_hpo` | *Boolean* | Specify `true` or `false` to enable or disable the HPO options\. If set to `true`, Rbfopt will be applied to find out the "best" One\-Class SVM model automatically, which reaches the target objective value defined by the user with the following `target_objval` parameter\. | +| `target_objval` | *float* | The objective function value (error rate of the model on the samples) we want to reach (for example, the value of the unknown optimum)\. Set this parameter to the appropriate value if the optimum is unknown (for example, `0.01`)\. | +| `max_iterations` | *integer* | Maximum number of iterations for trying the model\. Default is `1000`\. | +| `max_evaluations` | *integer* | Maximum number of function evaluations for trying the model, where the focus is accuracy over speed\. Default is `300`\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b6ec6454711b4946dbc663324dc478953723b1dd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b6ec6454711b4946dbc663324dc478953723b1dd.md new file mode 100644 index 0000000..66caadc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b6ec6454711b4946dbc663324dc478953723b1dd.md @@ -0,0 +1,14 @@ +# Creating nodes and modifying flows + +# Creating nodes and modifying flows # + +In some situations, you might want to add new nodes to existing flows\. Adding nodes to existing flows typically involves the following tasks: + + + +1. Creating the nodes\. +2. Linking the nodes into the existing flow\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b741fe5cdd06d606f869b15deb2173c1f134d22d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b741fe5cdd06d606f869b15deb2173c1f134d22d.md new file mode 100644 index 0000000..4bb677e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b741fe5cdd06d606f869b15deb2173c1f134d22d.md @@ -0,0 +1,60 @@ +# binningnode properties + +# binningnode properties # + +![Binning node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/binningnodeicon.png)The Binning node automatically creates new nominal (set) fields based on the values of one or more existing continuous (numeric range) fields\. For example, you can transform a continuous income field into a new categorical field containing groups of income as deviations from the mean\. After you create bins for the new field, you can generate a Derive node based on the cut points\. + + + +binningnode properties + +Table 1\. binningnode properties + +| `binningnode` properties | Data type | Property description | +| ---------------------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `fields` | *\[field1 field2 \.\.\. fieldn\]* | Continuous (numeric range) fields pending transformation\. You can bin multiple fields simultaneously\. | +| `method` | `FixedWidth``EqualCount``Rank``SDev``Optimal` | Method used for determining cut points for new field bins (categories)\. | +| `recalculate_bins` | `Always``IfNecessary` | Specifies whether the bins are recalculated and the data placed in the relevant bin every time the node is executed, or that data is added only to existing bins and any new bins that have been added\. | +| `fixed_width_name_extension` | *string* | The default extension is *\_BIN*\. | +| `fixed_width_add_as` | `Suffix``Prefix` | Specifies whether the extension is added to the end (suffix) of the field name or to the start (prefix)\. The default extension is *income\_BIN*\. | +| `fixed_bin_method` | `Width``Count` | | +| `fixed_bin_count` | *integer* | Specifies an integer used to determine the number of fixed\-width bins (categories) for the new field(s)\. | +| `fixed_bin_width` | *real* | Value (integer or real) for calculating width of the bin\. | +| `equal_count_name_``extension` | *string* | The default extension is *\_TILE*\. | +| `equal_count_add_as` | `Suffix``Prefix` | Specifies an extension, either suffix or prefix, used for the field name generated by using standard p\-tiles\. The default extension is *\_TILE* plus *N*, where *N* is the tile number\. | +| `tile4` | *flag* | Generates four quantile bins, each containing 25% of cases\. | +| `tile5` | *flag* | Generates five quintile bins\. | +| `tile10` | *flag* | Generates 10 decile bins\. | +| `tile20` | *flag* | Generates 20 vingtile bins\. | +| `tile100` | *flag* | Generates 100 percentile bins\. | +| `use_custom_tile` | *flag* | | +| `custom_tile_name_extension` | *string* | The default extension is *\_TILEN*\. | +| `custom_tile_add_as` | `Suffix``Prefix` | | +| `custom_tile` | *integer* | | +| `equal_count_method` | `RecordCount``ValueSum` | The `RecordCount` method seeks to assign an equal number of records to each bin, while `ValueSum` assigns records so that the sum of the values in each bin is equal\. | +| `tied_values_method` | `Next``Current``Random` | Specifies which bin tied value data is to be put in\. | +| `rank_order` | `Ascending``Descending` | This property includes `Ascending` (lowest value is marked 1) or `Descending` (highest value is marked 1)\. | +| `rank_add_as` | `Suffix``Prefix` | This option applies to rank, fractional rank, and percentage rank\. | +| `rank` | *flag* | | +| `rank_name_extension` | *string* | The default extension is *\_RANK*\. | +| `rank_fractional` | *flag* | Ranks cases where the value of the new field equals rank divided by the sum of the weights of the nonmissing cases\. Fractional ranks fall in the range of 0–1\. | +| `rank_fractional_name_``extension` | *string* | The default extension is *\_F\_RANK*\. | +| `rank_pct` | *flag* | Each rank is divided by the number of records with valid values and multiplied by 100\. Percentage fractional ranks fall in the range of 1–100\. | +| `rank_pct_name_extension` | *string* | The default extension is *\_P\_RANK*\. | +| `sdev_name_extension` | *string* | | +| `sdev_add_as` | `Suffix``Prefix` | | +| `sdev_count` | `One``Two``Three` | | +| `optimal_name_extension` | *string* | The default extension is *\_OPTIMAL*\. | +| `optimal_add_as` | `Suffix``Prefix` | | +| `optimal_supervisor_field` | *field* | Field chosen as the supervisory field to which the fields selected for binning are related\. | +| `optimal_merge_bins` | *flag* | Specifies that any bins with small case counts will be added to a larger, neighboring bin\. | +| `optimal_small_bin_threshold` | *integer* | | +| `optimal_pre_bin` | *flag* | Indicates that prebinning of dataset is to take place\. | +| `optimal_max_bins` | *integer* | Specifies an upper limit to avoid creating an inordinately large number of bins\. | +| `optimal_lower_end_point` | `Inclusive``Exclusive` | | +| `optimal_first_bin` | `Unbounded``Bounded` | | +| `optimal_last_bin` | `Unbounded``Bounded` | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b7bafad14d0bf628c14fe0821af01aee98a0ae62.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b7bafad14d0bf628c14fe0821af01aee98a0ae62.md new file mode 100644 index 0000000..0567738 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b7bafad14d0bf628c14fe0821af01aee98a0ae62.md @@ -0,0 +1,71 @@ +# Creating a project + +# Creating a project # + +You create a project to collaborate with your team on working with data and other resources to achieve a particular goal, such as building a model\. + +Your [sandbox project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/sandbox.html) is created automatically when you sign up for watsonx\.ai\. + +You can create an empty project, start from a sample project that provides sample data and other assets, or import a previously exported project\. See [Importing a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/import-project.html)\. The number of projects you can create per data center is 100\. + +Your project resources can include data, collaborators, tools, assets that run code, like notebooks and models, and other types of assets\. + + + + * [Requirements](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html?context=cdpaas&locale=en#requirements) + * [Create a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html?context=cdpaas&locale=en#create-a-project) + + + +## Requirements and restrictions ## + +Before you create a project, understand the requirements for storage and the project name\. + +**Storage requirement** : You must associate an [IBM Cloud Object Storage instance](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/storage-options.html) with your project to store assets\. Each project has a separate bucket to hold the project's assets\. If you are not an administrator for the IBM Cloud Object Storage instance, it must be [configured to allow project creation](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html)\. When a new project is created, the Cloud Object Storage bucket defaults to Regional resiliency\. Regional buckets distribute data across several data centers that are within the same metropolitan area\. If one of these data centers suffers an outage or destruction, availability and performance are not affected\. + +**Project name requirements** : Your project name must follow these requirements: : \- Must be unique in the account\. : \- Must contain 1 \- 255 characters\. : \- Can't contain these characters: % \\ : \- Can't contain leading or trailing underscores (\_)\. : \- Can't contain leading or trailing spaces\. Leading or trailing spaces are automatically truncated\. + +## Creating a project ## + +To create a project: + + + +1. Choose **Projects > View all projects** from the navigation menu and click **New project**\. +2. Choose whether to create an empty project or to create a project based on an exported project file or a sample project\. +3. If you chose to create a project from a file or a sample, upload a project file or select a sample project\. See [Importing a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/import-project.html)\. +4. If you chose to create a new project, add a name on the **New project** screen\. +5. You can [mark the project as sensitive](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/mark-sensitive.html)\. The project has a sensitive tag and project collaborators can't move data assets out of the project\. You cannot change this setting after the project is created\. +6. Choose an existing [object storage service instance](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/storage-options.html) or create a new one\. +7. Click **Create**\. You can start adding resources to your project\. + + + +The object storage bucket name for the project is based on the project name without spaces or nonalphanumberic characters plus a unique identifier\. + +Watch this video to see how to create both an empty project, imported project, and a project from a sample\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Next steps ## + + + + * [Add collaborators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html) + * [Add data](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html) + + + +## Learn more ## + + + + * [Object storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/storage-options.html) + * [Importing a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/import-project.html) + * [Troubleshooting Cloud Object Storage for projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/troubleshoot-cos.html) + + + +**Parent topic:**[Projects ](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b7cac3027eb08d3e2cfbfab0f0af2acf4dd0f990.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b7cac3027eb08d3e2cfbfab0f0af2acf4dd0f990.md new file mode 100644 index 0000000..206e4e9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b7cac3027eb08d3e2cfbfab0f0af2acf4dd0f990.md @@ -0,0 +1,29 @@ +# reclassifynode properties + +# reclassifynode properties # + +![Reclassify node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/reclassifynodeicon.png)The Reclassify node transforms one set of categorical values to another\. Reclassification is useful for collapsing categories or regrouping data for analysis\. + + + +reclassifynode properties + +Table 1\. reclassifynode properties + +| `reclassifynode` properties | Data type | Property description | +| --------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `mode` | `Single``Multiple` | `Single` reclassifies the categories for one field\. `Multiple` activates options enabling the transformation of more than one field at a time\. | +| `replace_field` | *flag* | | +| `field` | *string* | Used only in Single mode\. | +| `new_name` | *string* | Used only in Single mode\. | +| `fields` | *\[field1 field2 \.\.\. fieldn\]* | Used only in Multiple mode\. | +| `name_extension` | *string* | Used only in Multiple mode\. | +| `add_as` | `Suffix``Prefix` | Used only in Multiple mode\. | +| `reclassify` | *string* | Structured property for field values\. | +| `use_default` | *flag* | Use the default value\. | +| `default` | *string* | Specify a default value\. | +| `pick_list` | *\[string string … string\]* | Allows a user to import a list of known new values to populate the drop\-down list in the table\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b7e56bebf29f9aa59a9abc9e299f19613e5859da.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b7e56bebf29f9aa59a9abc9e299f19613e5859da.md new file mode 100644 index 0000000..c06c7b2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b7e56bebf29f9aa59a9abc9e299f19613e5859da.md @@ -0,0 +1,17 @@ +# TwoStep-AS cluster node (SPSS Modeler) + +# TwoStep\-AS cluster node # + +TwoStep Cluster is an exploratory tool that is designed to reveal natural groupings (or clusters) within a data set that would otherwise not be apparent\. The algorithm that is employed by this procedure has several desirable features that differentiate it from traditional clustering techniques\. + + + + * Handling of categorical and continuous variables\. By assuming variables to be independent, a joint multinomial\-normal distribution can be placed on categorical and continuous variables\. + * Automatic selection of number of clusters\. By comparing the values of a model\-choice criterion across different clustering solutions, the procedure can automatically determine the optimal number of clusters\. + * Scalability\. By constructing a cluster feature (CF) tree that summarizes the records, the TwoStep algorithm can analyze large data files\. + + + +For example, retail and consumer product companies regularly apply clustering techniques to information that describes their customers' buying habits, gender, age, income level, and other attributes\. These companies tailor their marketing and product development strategies to each consumer group to increase sales and build brand loyalty\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8044b03933e3fcea5bcf6362199ed083ec2f20f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8044b03933e3fcea5bcf6362199ed083ec2f20f.md new file mode 100644 index 0000000..8e62366 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8044b03933e3fcea5bcf6362199ed083ec2f20f.md @@ -0,0 +1,9 @@ +# Database functions (SPSS Modeler) + +# Database functions # + +You can run an SPSS Modeler desktop stream file ( \.str) that contains database functions\. + +But database functions aren't available in the Expression Builder user interface, and you can't edit them\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b851271c134a1b282412bd7a667c1c9813b4e8b2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b851271c134a1b282412bd7a667c1c9813b4e8b2.md new file mode 100644 index 0000000..5858d38 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b851271c134a1b282412bd7a667c1c9813b4e8b2.md @@ -0,0 +1,7 @@ +# Text Mining model nuggets (SPSS Modeler) + +# Text Mining model nuggets # + +You can run a Text Mining node to automatically generate a concept model nugget using the Generate directly option in the node settings\. Or you can use a more hands\-on, exploratory approach using the Build interactively mode to generate category model nuggets from within the Text Analytics Workbench\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8522e9801281dd4118a5012acf885a7ec2354e4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8522e9801281dd4118a5012acf885a7ec2354e4.md new file mode 100644 index 0000000..1faaf76 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8522e9801281dd4118a5012acf885a7ec2354e4.md @@ -0,0 +1,19 @@ +# GenLin node (SPSS Modeler) + +# GenLin node # + +The generalized linear model expands the general linear model so that the dependent variable is linearly related to the factors and covariates via a specified link function\. Moreover, the model allows for the dependent variable to have a non\-normal distribution\. It covers widely used statistical models, such as linear regression for normally distributed responses, logistic models for binary data, loglinear models for count data, complementary log\-log models for interval\-censored survival data, plus many other statistical models through its very general model formulation\. + +Examples\. A shipping company can use generalized linear models to fit a Poisson regression to damage counts for several types of ships constructed in different time periods, and the resulting model can help determine which ship types are most prone to damage\. + +A car insurance company can use generalized linear models to fit a gamma regression to damage claims for cars, and the resulting model can help determine the factors that contribute the most to claim size\. + +Medical researchers can use generalized linear models to fit a complementary log\-log regression to interval\-censored survival data to predict the time to recurrence for a medical condition\. + +Generalized linear models work by building an equation that relates the input field values to the output field values\. After the model is generated, you can use it to estimate values for new data\. For each record, a probability of membership is computed for each possible output category\. The target category with the highest probability is assigned as the predicted output value for that record\. + +Requirements\. You need one or more input fields and exactly one target field (which can have a measurement level of `Continuous` or `Flag`) with two or more categories\. Fields used in the model must have their types fully instantiated\. + +Strengths\. The generalized linear model is extremely flexible, but the process of choosing the model structure is not automated and thus demands a level of familiarity with your data that is not required by "black box" algorithms\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8581c38346f1fe8900d18db8fcef8145f5965bc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8581c38346f1fe8900d18db8fcef8145f5965bc.md new file mode 100644 index 0000000..335c03d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8581c38346f1fe8900d18db8fcef8145f5965bc.md @@ -0,0 +1,88 @@ +# Evaluating prompt templates in projects + +# Evaluating prompt templates in projects # + +You can evaluate prompt templates in projects to measure the performance of foundation model tasks and understand how your model generates responses\. + +With watsonx\.governance, you can evaluate prompt templates in projects to measure how effectively your foundation models generate responses for the following task types: + + + + * [Classification](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#classification) + * [Summarization](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#summarization) + * [Generation](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#generation) + * [Question answering](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#qa) + * [Entity extraction](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#extraction) + + + +## Before you begin ## + +You must have access to a watsonx\.governance project to evaluate prompt templates\. For more information, see [Setting up Watson OpenScale](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-setup-wos.html)\. + +To run evaluations, you must log in and [switch](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/personal-settings.html#account) to a watsonx account that has watsonx\.governance and watsonx\.ai instances that are installed and open a project\. You must be assigned the **Admin** or **Editor** roles for the account to open projects\. + +In your project, you must use the watsonx\.ai [Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) to create and save a prompt template\. You must specify variables when you create prompt templates to enable evaluations\. The **Try** section in the Prompt Lab must contain at least one variable\. + +Watch this video to see how to evaluate a prompt template in a project\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +The following sections describe how to evaluate prompt templates in projects and review your evaluation results\. + +## Running evaluations ## + +To run prompt template evaluations, you can click **Evaluate** when you open a saved prompt template on the **Assets** tab in watsonx\.governance to open the **Evaluate prompt template** wizard\. You can run evaluations only if you are assigned the **Admin** or **Editor** roles for your project\. + +![Run prompt template evaluation](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-run-eval-prompt.png) + +### Select dimensions ### + +The **Evaluate prompt template** wizard displays the dimensions that are available to evaluate for the task type that is associated with your prompt\. You can expand the dimensions to view the list of metrics that are used to evaluate the dimensions that you select\. + +![Select dimensions to evaluate](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-select-dimension-preprod-spaces.png) + +watsonx\.governance automatically configures evaluations for each dimension with default settings\. To [configure evaluations](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-monitors-overview.html) with different settings, you can select **Advanced settings** to set minimum sample sizes and threshold values for each metric as shown in the following example: + +![Configure evaluations](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-config-eval-settings.png) + +### Select test data ### + +You must upload a CSV file that contains test data with reference columns and columns for each prompt variable\. When the upload completes, you must also map [prompt variables](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-variables.html#creating-prompt-variables) to the associated columns from your test data\. + +![Select test data to upload](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-select-test-data.png) + +### Review and evaluate ### + +Before you run your prompt template evaluation, you can review the selections for the prompt task type, the uploaded test data, and the type of evaluation that runs\. + +![Review and evaluate prompt template evaluation settings](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-review-prompt-eval-select.png) + +## Reviewing evaluation results ## + +When your evaluation completes, you can review a summary of your evaluation results on the **Evaluate** tab in watsonx\.governance to gain insights about your model performance\. The summary provides an overview of metric scores and violations of default score thresholds for your prompt template evaluations\. + +If you are assigned the **Viewer** role for your project, you can select **Evaluate** from the asset list on the **Assets** tab to view evaluation results\. + +![Run prompt template evaluation from asset list](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-run-eval-asset.png) + +To analyze results, you can click the arrow ![navigation arrow](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-nav-arrow.png) next to your prompt template evaluation to view data visualizations of your results over time\. You can also analyze results from the model health evaluation that is run by default during prompt template evaluations to understand how efficiently your model processes your data\. + +The **Actions** menu also provides the following options to help you analyze your results: + + + + * **Evaluate now**: Run evaluation with a different test data set + * **All evaluations**: Display a history of your evaluations to understand how your results change over time\. + * **Configure monitors**: Configure evaluation thresholds and sample sizes\. + * **View model information**: View details about your model to understand how your deployment environment is set up\. + + + +![Analyze prompt template evaluation results](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-analyze-prompt-eval-results.png) + +If you [track prompt templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-track-prompt-temp.html), you can review evaluation results to gain insights about your model performance throughout the AI lifecycle\. + +**Parent topic:**[Evaluating AI models with Watson OpenScale](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/getting-started.html)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8aa7399868c0ae8dd698c9048ebd50c3f17ef12.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8aa7399868c0ae8dd698c9048ebd50c3f17ef12.md new file mode 100644 index 0000000..92895b1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8aa7399868c0ae8dd698c9048ebd50c3f17ef12.md @@ -0,0 +1,110 @@ +# Visualizing your data in Data Refinery + +# Visualizing your data in Data Refinery # + +Visualizing information in graphical ways gives you insights into your data\. You can add steps to your Data Refinery flow while you visualize you data and see the changes\. By exploring data from different perspectives with visualizations, you can identify patterns, connections, and relationships within that data as well as quickly understand large amounts of information\. + +You can also visualize your data with these same charts in an SPSS Modeler flow\. Use the Charts node, which is available under the Graphs section on the node palette\. Double\-click the Charts node to open the properties pane\. Then click **Launch Chart Builder** to open the chart builder and create one or more chart definitions to associate with the node\. + +![Chart examples](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/images/viz_animated.gif) + +To visualize your data: + + + +1. From Data Refinery, click the **Visualizations** tab\. +2. Start with a chart or select columns: + + + + * Click any of the available charts. Then, add columns in the **DETAILS** pane that opens on the left side of the page. + * Select the columns that you want to work with. Suggested charts are indicated with a dot next to the chart name. Click a chart to visualize your data. + + + + + +Important: Available chart types are ordered from most relevant to least relevant, based on the selected columns\. If there are no columns in the data set with a data type that is supported for a chart type, that chart will not be available\. If a column's data type is not supported for a chart, that column is not available for selection for that chart\. Dots next to the charts' names suggest the best charts for your data\. + +## Charts ## + +The following charts are included: + + + + * 3D charts display data in a 3\-D coordinate system by drawing each column as a cuboid to create a 3D effect\. + * Bar charts are handy for displaying and comparing categories of data side by side\. The bars can be in any order\. You can also arrange them from high to low or from low to high\. + * Box plot charts compare distributions between many groups or data sets\. They display the variation in groups of data: the spread and skew of that data and the outliers\. + * Bubble charts display each category in the groups as a bubble\. + * Candlestick charts are a type of financial chart that displays price movements of a security, derivative, or currency\. + * Circle packing charts display hierarchical data as a set of nested areas\. + * Customized charts give you the ability to render charts based on JSON input\. + * Dual Y\-axes charts use two Y\-axis variables to show relationships between data\. + * Error bars indicate the error or uncertainty in a value\. They give a general idea of how precise a value is or conversely, how far a value might be from the true value\. + * Evaluation charts are combination charts that measure the quality of a binary classifier\. You need three columns for input: actual (target) value, predict value, and confidence (0 or 1)\. Move the slider in the Cutoff chart to dynamically update the other charts\. The ROC and other charts are standard measurements of the classifier\. + * Heat map charts display data as color to convey activity levels or density\. Typically low values are displayed as cooler colors and high values are displayed as warmer colors\. + * Histogram charts show the frequency distribution of data\. + * Line charts show trends in data over time by calculating a summary statistic for one column for each value of another column and then drawing a line that connects the values\. + * Map charts show geographic point data, so you can compare values and show categories across geographical regions\. + * Math curve charts display a group of curves based on equations that you enter\. You do not use a data set with this chart\. Instead, you use it to compare the results with the data set in another chart, like the scatter plot chart\. + * Multi\-charts display up to four combinations of Bar, Line, Pie, and Scatter plot charts\. You can show the same kind of chart more than once with different data\. For example, two pie charts with data from different columns\. + * Multi\-series charts display data from multiple data sets or multiple columns as a series of points that are connected by straight lines or bars\. + * Parallel coordinate charts display and compare rows of data (called profiles) to find similarities\. Each row is a line and the value in each column of the row is represented by a point on that line\. + * Pie charts show proportion\. Each value in a series is displayed as a proportional slice of the pie\. The pie represents the total sum of the values\. + * Population pyramid charts show the frequency distribution of a variable across categories\. They are typically used to show changes in demographic data\. + * Quantile\-quantile (Q\-Q) plot charts compare the expected distribution values with the observed values by plotting their quantiles\. + * Radar charts integrate three or more quantitative variables that are represented on axes (radii) into a single radial figure\. Data is plotted on each axis and joined to adjacent axes by connecting lines\. Radar charts are useful to show correlations and compare categorized data\. + * Relationship charts show how columns of data relate to one another and what the strength of that relationship is by using varying types of lines\. + * Scatter matrix charts map columns against each other and display their scatter plots and correlation\. Use to compare multiple columns and how strong their correlation is with one another\. + * Scatter plot charts show correlation (how much one variable is affected by another) by displaying and comparing the values in two columns\. + * Sunburst charts are similar to layered pie charts, in which different proportions of different categories are shown at once on multiple levels\. + * Theme river charts use a specialized flow graph that shows changes over time\. + * Time plot charts illustrate data points at successive intervals of time\. + * t\-SNE charts help you visualize high\-dimensional data sets\. They're useful for embedding high\-dimensional data into a space of two or three dimensions, which can then be visualized in a scatter plot\. + * Tree charts display hierarchical data, categorically splitting into different branches\. Use to sort different data sets under different categories\. The Tree chart consists of a root node, line connections called branches that represent the relationships and connections between the members, and leaf nodes that do not have child nodes\. + * Treemap charts display hierarchical data as a set of nested areas\. Use to compare sizes between groups and single elements that are nested in the groups\. + * Word cloud charts display how frequently words appear in text by making the size of each word proportional to its frequency\. + + + +## Actions ## + +You can take any of the following actions: + + + + * Start over: Clears the visualization and the **DETAILS** pane, and returns you to the starting page for visualizations + * Specify whether to display the field value or the field label\. This option applies only to SPSS Modeler when you define labels\. For example, if you have a "Gender" field and you have defined a label as female with the value 0, and then the label male for value 1\. If there is no label defined, the value is displayed\. + * Download visualization: + + + + * Download chart image: Download a PNG file that contains an image of the current chart. + * Download chart details: Download a JSON file that contains the details for the current chart. + + + + * Set global preferences that apply to all charts + + + +## Chart actions ## + +Available chart actions depend on the chart\. Chart actions include: + + + + * Zoom + * Restore: View the chart at normal scale + * Select data: Highlight data in the Data tab that you select in the chart + * Clear selection: Remove highlighting from the data in the Data tab + + + +## Learn more ## + +[Data Visualization – How to Pick the Right Chart Type?](https://eazybi.com/blog/data_visualization_and_chart_types/) + +**Parent topic:**[Refining data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8c3b95fc688c347d679f81711781b29578cfc19.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8c3b95fc688c347d679f81711781b29578cfc19.md new file mode 100644 index 0000000..0490b99 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b8c3b95fc688c347d679f81711781b29578cfc19.md @@ -0,0 +1,19 @@ +# Viewing and setting information about types (SPSS Modeler) + +# Viewing and setting information about types # + +From the Type node, you can specify field metadata and properties that are invaluable to modeling and other work\. + +These properties include: + + + + * Specifying a usage type, such as range, set, ordered set, or flag, for each field in your data + * Setting options for handling missing values and system nulls + * Setting the role of a field for modeling purposes + * Specifying values for a field and options used to automatically read values from your data + * Specifying value labels + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b924d359f00db1671f86aca7a3ee226206dfbed1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b924d359f00db1671f86aca7a3ee226206dfbed1.md new file mode 100644 index 0000000..51243aa --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b924d359f00db1671f86aca7a3ee226206dfbed1.md @@ -0,0 +1,24 @@ +# Configuring model evaluations in watsonx.governance + +# Configuring model evaluations in watsonx\.governance # + +Configure watsonx\.governance evaluations to generate insights about your model performance\. + +You can configure the following types of evaluations in watsonx\.governance: + + + + * [Quality](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-monitor-accuracy.html) + Evaluates how well your model predicts correct outcomes that match labeled test data. + * [Drift v2](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-driftv2-config.html) + Evaluates changes in your model output, the accuracy of your predictions, and the distribution of your input data + * [Generative AI quality](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-monitor-gen-quality.html) + Measures how well your foundation model performs tasks + + + +watsonx\.governance also enables [model health evaluations](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-model-health-metrics.html) by default to help you determine how efficiently your model deployment processes transactions\. + +**Parent topic:**[Evaluating AI models with Watson OpenScale](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/getting-started.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b92f42609b54b82bfe38a69b781052e876258c2c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b92f42609b54b82bfe38a69b781052e876258c2c.md new file mode 100644 index 0000000..aa40dc4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b92f42609b54b82bfe38a69b781052e876258c2c.md @@ -0,0 +1,515 @@ +# Decision Optimization REST API deployment + +# REST API example # + +You can deploy a Decision Optimization model, create and monitor jobs and get solutions using the Watson Machine Learning REST API\. + +## Procedure ## + + + +1. **Generate an IAM token** using your [IBM Cloud API key](https://cloud.ibm.com/iam/apikeys) as follows\. + + curl "https://iam.bluemix.net/identity/token" \ + -d "apikey=YOUR_API_KEY_HERE&grant_type=urn%3Aibm%3Aparams%3Aoauth%3Agrant-type%3Aapikey" \ + -H "Content-Type: application/x-www-form-urlencoded" \ + -H "Authorization: Basic Yng6Yng=" + + Output example: + + { + "access_token": "****** obtained IAM token ******************************", + "refresh_token": "**************************************", + "token_type": "Bearer", + "expires_in": 3600, + "expiration": 1554117649, + "scope": "ibm openid" + } + + Use the obtained token (access\_token value) prepended by the word `Bearer` in the `Authorization` header, and the `Machine Learning service GUID` in the `ML-Instance-ID` header, in all API calls. +2. **Optional:** If you have not obtained your **SPACE\-ID** from the user interface as described previously, you can create a space using the REST API as follows\. Use the previously obtained token prepended by the word `bearer` in the `Authorization` header in all API calls\. + + curl --location --request POST \ + "https://api.dataplatform.cloud.ibm.com/v2/spaces" \ + -H "Authorization: Bearer TOKEN-HERE" \ + -H "ML-Instance-ID: MACHINE-LEARNING-SERVICE-GUID-HERE" \ + -H "Content-Type: application/json" \ + --data-raw "{ + "name": "SPACE-NAME-HERE", + "description": "optional description here", + "storage": { + "resource_crn": "COS-CRN-ID-HERE" + }, + "compute": [{ + "name": "MACHINE-LEARNING-SERVICE-NAME-HERE", + "crn": "MACHINE-LEARNING-SERVICE-CRN-ID-HERE" + }] + }" + + For **Windows** users, put the `--data-raw` command on one line and replace all `"` with `\"` inside this command as follows: + + curl --location --request POST ^ + "https://api.dataplatform.cloud.ibm.com/v2/spaces" ^ + -H "Authorization: Bearer TOKEN-HERE" ^ + -H "ML-Instance-ID: MACHINE-LEARNING-SERVICE-GUID-HERE" ^ + -H "Content-Type: application/json" ^ + --data-raw "{\"name\": "SPACE-NAME-HERE",\"description\": \"optional description here\",\"storage\": {\"resource_crn\": \"COS-CRN-ID-HERE\" },\"compute\": [{\"name\": "MACHINE-LEARNING-SERVICE-NAME-HERE\",\"crn\": \"MACHINE-LEARNING-SERVICE-CRN-ID-HERE\" }]}" + + Alternatively put the data in a separate file.A **SPACE-ID** is returned in `id` field of the `metadata` section. + + Output example: + + { + "entity": { + "compute": [ + { + "crn": "MACHINE-LEARNING-SERVICE-CRN", + "guid": "MACHINE-LEARNING-SERVICE-GUID", + "name": "MACHINE-LEARNING-SERVICE-NAME", + "type": "machine_learning" + } + ], + "description": "string", + "members": [ + { + "id": "XXXXXXX", + "role": "admin", + "state": "active", + "type": "user" + } + ], + "name": "name", + "scope": { + "bss_account_id": "account_id" + }, + "status": { + "state": "active" + } + }, + "metadata": { + "created_at": "2020-07-17T08:36:57.611Z", + "creator_id": "XXXXXXX", + "id": "SPACE-ID", + "url": "/v2/spaces/SPACE-ID" + } + } + + You must wait until your deployment space status is `"active"` before continuing. You can poll to check for this as follows. + + curl --location --request GET "https://api.dataplatform.cloud.ibm.com/v2/spaces/SPACE-ID-HERE" \ + -H "Authorization: bearer TOKEN-HERE" \ + -H "Content-Type: application/json" +3. Create a **new Decision Optimization model** + + All API requests require a version parameter that takes a date in the format `version=YYYY-MM-DD`. This code example posts a model that uses the file `create_model.json`. The URL will vary according to the chosen region/location for your machine learning service. See [Endpoint URLs](https://cloud.ibm.com/apidocs/machine-learning#endpoint-url). + + curl --location --request POST \ + "https://us-south.ml.cloud.ibm.com/ml/v4/models?version=2020-08-01" \ + -H "Authorization: bearer TOKEN-HERE" \ + -H "Content-Type: application/json" \ + -d @create_model.json + + The create\_model.json file contains the following code: + + { + "name": "ModelName", + "description": "ModelDescription", + "type": "do-docplex_22.1", + "software_spec": { + "name": "do_22.1" + }, + "custom": { + "decision_optimization": { + "oaas.docplex.python": "3.10" + } + }, + "space_id": "SPACE-ID-HERE" + } + + The *Python version* is stated explicitly here in a `custom` block. This is optional. Without it your model will use the default version which is currently Python 3.10. As the default version will evolve over time, stating the Python version explicitly enables you to easily change it later or to keep using an older supported version when the default version is updated. Currently supported versions are 3.10. + + If you want to be able to run jobs for this model *from the user interface*, instead of only using the REST API , you must define the **schema** for the input and output data. If you do not define the schema when you create the model, you can only run jobs using the REST API and not from the user interface. + + You can also use the schema specified for input and output in your optimization model: + + { + "name": "Diet-Model-schema", + "description": "Diet", + "type": "do-docplex_22.1", + "schemas": { + "input": [ + { + "id": "diet_food_nutrients", + "fields": + { "name": "Food", "type": "string" }, + { "name": "Calories", "type": "double" }, + { "name": "Calcium", "type": "double" }, + { "name": "Iron", "type": "double" }, + { "name": "Vit_A", "type": "double" }, + { "name": "Dietary_Fiber", "type": "double" }, + { "name": "Carbohydrates", "type": "double" }, + { "name": "Protein", "type": "double" } + ] + }, + { + "id": "diet_food", + "fields": + { "name": "name", "type": "string" }, + { "name": "unit_cost", "type": "double" }, + { "name": "qmin", "type": "double" }, + { "name": "qmax", "type": "double" } + ] + }, + { + "id": "diet_nutrients", + "fields": + { "name": "name", "type": "string" }, + { "name": "qmin", "type": "double" }, + { "name": "qmax", "type": "double" } + ] + } + ], + "output": [ + { + "id": "solution", + "fields": + { "name": "name", "type": "string" }, + { "name": "value", "type": "double" } + ] + } + ] + }, + "software_spec": { + "name": "do_22.1" + }, + "space_id": "SPACE-ID-HERE" + } + + When you post a model you provide information about its **model type** and the **software specification** to be used.**Model types** can be, for example: + + + + * `do-opl_22.1` for OPL models + * `do-cplex_22.1` for CPLEX models + * `do-cpo_22.1` for CP models + * `do-docplex_22.1` for Python models + + + + Version 20.1 can also be used for these model types. + + For the **software specification**, you can use the default specifications using their names `do_22.1` or `do_20.1`. See also [Extend software specification notebook](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployPythonClient.html#topic_wmlpythonclient__extendWML) which shows you how to extend the Decision Optimization software specification (runtimes with additional Python libraries for docplex models). + + A **MODEL-ID** is returned in `id` field in the `metadata`. + + Output example: + + { + "entity": { + "software_spec": { + "id": "SOFTWARE-SPEC-ID" + }, + "type": "do-docplex_20.1" + }, + "metadata": { + "created_at": "2020-07-17T08:37:22.992Z", + "description": "ModelDescription", + "id": "MODEL-ID", + "modified_at": "2020-07-17T08:37:22.992Z", + "name": "ModelName", + "owner": "***********", + "space_id": "SPACE-ID" + } + } +4. **Upload a Decision Optimization model formulation** ready for deployment\.First **compress your model** into a (`tar.gz, .zip or .jar`) file and upload it to be deployed by the Watson Machine Learning service\.This code example uploads a model called diet\.zip that contains a Python model and no common data: + + curl --location --request PUT \ + "https://us-south.ml.cloud.ibm.com/ml/v4/models/MODEL-ID-HERE/content?version=2020-08-01&space_id=SPACE-ID-HERE&content_format=native" \ + -H "Authorization: bearer TOKEN-HERE" \ + -H "Content-Type: application/gzip" \ + --data-binary "@diet.zip" + + You can download this example and other models from the **[DO-samples](https://github.com/IBMDecisionOptimization/DO-Samples)**. Select the relevant product and version subfolder. +5. **Deploy your model**Create a reference to your model\. Use the **SPACE\-ID**, the **MODEL\-ID** obtained when you created your model ready for deployment and the **hardware specification**\. For example: + + curl --location --request POST "https://us-south.ml.cloud.ibm.com/ml/v4/deployments?version=2020-08-01" \ + -H "Authorization: bearer TOKEN-HERE" \ + -H "Content-Type: application/json" \ + -d @deploy_model.json + + `The deploy_model.json file contains the following code:` + + { + "name": "Test-Diet-deploy", + "space_id": "SPACE-ID-HERE", + "asset": { + "id": "MODEL-ID-HERE" + }, + "hardware_spec": { + "name": "S" + }, + "batch": {} + } + + The **DEPLOYMENT-ID** is returned in `id` field in the `metadata`. Output example: + + { + "entity": { + "asset": { + "id": "MODEL-ID" + }, + "custom": {}, + "description": "", + "hardware_spec": { + "id": "HARDWARE-SPEC-ID", + "name": "S", + "num_nodes": 1 + }, + "name": "Test-Diet-deploy", + "space_id": "SPACE-ID", + "status": { + "state": "ready" + } + }, + "metadata": { + "created_at": "2020-07-17T09:10:50.661Z", + "description": "", + "id": "DEPLOYMENT-ID", + "modified_at": "2020-07-17T09:10:50.661Z", + "name": "test-Diet-deploy", + "owner": "**************", + "space_id": "SPACE-ID" + } + } +6. Once deployed, you can **monitor your model's deployment state\.** Use the **DEPLOYMENT\-ID**\.For example: + + curl --location --request GET "https://us-south.ml.cloud.ibm.com/ml/v4/deployments/DEPLOYMENT-ID-HERE?version=2020-08-01&space_id=SPACE-ID-HERE" \ + -H "Authorization: bearer TOKEN-HERE" \ + -H "Content-Type: application/json" + + Output example: +7. You can then **Submit jobs** for your deployed model defining the input data and the output (results of the optimization solve) and the log file\.For example, the following shows the contents of a file called `myjob.json`\. It contains (**inline**) input data, some solve parameters, and specifies that the output will be a \.csv file\. For examples of other types of input data references, see [Model input and output data adaptation](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/ModelIODataDefn.html#topic_modelIOAdapt)\. + + { + "name":"test-job-diet", + "space_id": "SPACE-ID-HERE", + "deployment": { + "id": "DEPLOYMENT-ID-HERE" + }, + "decision_optimization" : { + "solve_parameters" : { + "oaas.logAttachmentName":"log.txt", + "oaas.logTailEnabled":"true" + }, + "input_data": [ + { + "id":"diet_food.csv", + "fields" : "name","unit_cost","qmin","qmax"], + "values" : + "Roasted Chicken", 0.84, 0, 10], + "Spaghetti W/ Sauce", 0.78, 0, 10], + "Tomato,Red,Ripe,Raw", 0.27, 0, 10], + "Apple,Raw,W/Skin", 0.24, 0, 10], + "Grapes", 0.32, 0, 10], + "Chocolate Chip Cookies", 0.03, 0, 10], + "Lowfat Milk", 0.23, 0, 10], + "Raisin Brn", 0.34, 0, 10], + "Hotdog", 0.31, 0, 10] + ] + }, + { + "id":"diet_food_nutrients.csv", + "fields" : "Food","Calories","Calcium","Iron","Vit_A","Dietary_Fiber","Carbohydrates","Protein"], + "values" : + "Spaghetti W/ Sauce", 358.2, 80.2, 2.3, 3055.2, 11.6, 58.3, 8.2], + "Roasted Chicken", 277.4, 21.9, 1.8, 77.4, 0, 0, 42.2], + "Tomato,Red,Ripe,Raw", 25.8, 6.2, 0.6, 766.3, 1.4, 5.7, 1], + "Apple,Raw,W/Skin", 81.4, 9.7, 0.2, 73.1, 3.7, 21, 0.3], + "Grapes", 15.1, 3.4, 0.1, 24, 0.2, 4.1, 0.2], + "Chocolate Chip Cookies", 78.1, 6.2, 0.4, 101.8, 0, 9.3, 0.9], + "Lowfat Milk", 121.2, 296.7, 0.1, 500.2, 0, 11.7, 8.1], + "Raisin Brn", 115.1, 12.9, 16.8, 1250.2, 4, 27.9, 4], + "Hotdog", 242.1, 23.5, 2.3, 0, 0, 18, 10.4] + ] + }, + { + "id":"diet_nutrients.csv", + "fields" : "name","qmin","qmax"], + "values" : + "Calories", 2000, 2500], + "Calcium", 800, 1600], + "Iron", 10, 30], + "Vit_A", 5000, 50000], + "Dietary_Fiber", 25, 100], + "Carbohydrates", 0, 300], + "Protein", 50, 100] + ] + } + ], + "output_data": [ + { + "id":".*\.csv" + } + ] + } + } + + This code example posts a job that uses this file `myjob.json`. + + curl --location --request POST "https://us-south.ml.cloud.ibm.com/ml/v4/deployment_jobs?version=2020-08-01&space_id=SPACE-ID-HERE" \ + -H "Authorization: bearer TOKEN-HERE" \ + -H "Content-Type: application/json" \ + -H "cache-control: no-cache" \ + -d @myjob.json + + A **JOB-ID** is returned. Output example: (the job is queued) + + { + "entity": { + "decision_optimization": { + "input_data": [{ + "id": "diet_food.csv", + "fields": "name", "unit_cost", "qmin", "qmax"], + "values": "Roasted Chicken", 0.84, 0, 10], "Spaghetti W/ Sauce", 0.78, 0, 10], "Tomato,Red,Ripe,Raw", 0.27, 0, 10], "Apple,Raw,W/Skin", 0.24, 0, 10], "Grapes", 0.32, 0, 10], "Chocolate Chip Cookies", 0.03, 0, 10], "Lowfat Milk", 0.23, 0, 10], "Raisin Brn", 0.34, 0, 10], "Hotdog", 0.31, 0, 10]] + }, { + "id": "diet_food_nutrients.csv", + "fields": "Food", "Calories", "Calcium", "Iron", "Vit_A", "Dietary_Fiber", "Carbohydrates", "Protein"], + "values": "Spaghetti W/ Sauce", 358.2, 80.2, 2.3, 3055.2, 11.6, 58.3, 8.2], "Roasted Chicken", 277.4, 21.9, 1.8, 77.4, 0, 0, 42.2], "Tomato,Red,Ripe,Raw", 25.8, 6.2, 0.6, 766.3, 1.4, 5.7, 1], "Apple,Raw,W/Skin", 81.4, 9.7, 0.2, 73.1, 3.7, 21, 0.3], "Grapes", 15.1, 3.4, 0.1, 24, 0.2, 4.1, 0.2], "Chocolate Chip Cookies", 78.1, 6.2, 0.4, 101.8, 0, 9.3, 0.9], "Lowfat Milk", 121.2, 296.7, 0.1, 500.2, 0, 11.7, 8.1], "Raisin Brn", 115.1, 12.9, 16.8, 1250.2, 4, 27.9, 4], "Hotdog", 242.1, 23.5, 2.3, 0, 0, 18, 10.4]] + }, { + "id": "diet_nutrients.csv", + "fields": "name", "qmin", "qmax"], + "values": "Calories", 2000, 2500], "Calcium", 800, 1600], "Iron", 10, 30], "Vit_A", 5000, 50000], "Dietary_Fiber", 25, 100], "Carbohydrates", 0, 300], "Protein", 50, 100]] + }], + "output_data": [ + { + "id": ".*\.csv" + } + ], + "solve_parameters": { + "oaas.logAttachmentName": "log.txt", + "oaas.logTailEnabled": "true" + }, + "status": { + "state": "queued" + } + }, + "deployment": { + "id": "DEPLOYMENT-ID" + }, + "platform_job": { + "job_id": "", + "run_id": "" + } + }, + "metadata": { + "created_at": "2020-07-17T10:42:42.783Z", + "id": "JOB-ID", + "name": "test-job-diet", + "space_id": "SPACE-ID" + } + } +8. You can also **monitor job states**\. Use the **JOB\-ID**For example: + + curl --location --request GET \ + "https://us-south.ml.cloud.ibm.com/ml/v4/deployment_jobs/JOB-ID-HERE?version=2020-08-01&space_id=SPACE-ID-HERE" \ + -H "Authorization: bearer TOKEN-HERE" \ + -H "Content-Type: application/json" + + Output example: (job has completed) + + { + "entity": { + "decision_optimization": { + "input_data": [{ + "id": "diet_food.csv", + "fields": "name", "unit_cost", "qmin", "qmax"], + "values": "Roasted Chicken", 0.84, 0, 10], "Spaghetti W/ Sauce", 0.78, 0, 10], "Tomato,Red,Ripe,Raw", 0.27, 0, 10], "Apple,Raw,W/Skin", 0.24, 0, 10], "Grapes", 0.32, 0, 10], "Chocolate Chip Cookies", 0.03, 0, 10], "Lowfat Milk", 0.23, 0, 10], "Raisin Brn", 0.34, 0, 10], "Hotdog", 0.31, 0, 10]] + }, { + "id": "diet_food_nutrients.csv", + "fields": "Food", "Calories", "Calcium", "Iron", "Vit_A", "Dietary_Fiber", "Carbohydrates", "Protein"], + "values": "Spaghetti W/ Sauce", 358.2, 80.2, 2.3, 3055.2, 11.6, 58.3, 8.2], "Roasted Chicken", 277.4, 21.9, 1.8, 77.4, 0, 0, 42.2], "Tomato,Red,Ripe,Raw", 25.8, 6.2, 0.6, 766.3, 1.4, 5.7, 1], "Apple,Raw,W/Skin", 81.4, 9.7, 0.2, 73.1, 3.7, 21, 0.3], "Grapes", 15.1, 3.4, 0.1, 24, 0.2, 4.1, 0.2], "Chocolate Chip Cookies", 78.1, 6.2, 0.4, 101.8, 0, 9.3, 0.9], "Lowfat Milk", 121.2, 296.7, 0.1, 500.2, 0, 11.7, 8.1], "Raisin Brn", 115.1, 12.9, 16.8, 1250.2, 4, 27.9, 4], "Hotdog", 242.1, 23.5, 2.3, 0, 0, 18, 10.4]] + }, { + "id": "diet_nutrients.csv", + "fields": "name", "qmin", "qmax"], + "values": "Calories", 2000, 2500], "Calcium", 800, 1600], "Iron", 10, 30], "Vit_A", 5000, 50000], "Dietary_Fiber", 25, 100], "Carbohydrates", 0, 300], "Protein", 50, 100]] + }], + "output_data": [{ + "fields": "Name", "Value"], + "id": "kpis.csv", + "values": "Total Calories", 2000], "Total Calcium", 800.0000000000001], "Total Iron", 11.278317739831891], "Total Vit_A", 8518.432542485823], "Total Dietary_Fiber", 25], "Total Carbohydrates", 256.80576358904455], "Total Protein", 51.17372234135308], "Minimal cost", 2.690409171696264]] + }, { + "fields": "name", "value"], + "id": "solution.csv", + "values": "Spaghetti W/ Sauce", 2.1551724137931036], "Chocolate Chip Cookies", 10], "Lowfat Milk", 1.8311671008899097], "Hotdog", 0.9296975991385925]] + }], + "output_data_references": [], + "solve_parameters": { + "oaas.logAttachmentName": "log.txt", + "oaas.logTailEnabled": "true" + }, + "solve_state": { + "details": { + "KPI.Minimal cost": "2.690409171696264", + "KPI.Total Calcium": "800.0000000000001", + "KPI.Total Calories": "2000.0", + "KPI.Total Carbohydrates": "256.80576358904455", + "KPI.Total Dietary_Fiber": "25.0", + "KPI.Total Iron": "11.278317739831891", + "KPI.Total Protein": "51.17372234135308", + "KPI.Total Vit_A": "8518.432542485823", + "MODEL_DETAIL_BOOLEAN_VARS": "0", + "MODEL_DETAIL_CONSTRAINTS": "7", + "MODEL_DETAIL_CONTINUOUS_VARS": "9", + "MODEL_DETAIL_INTEGER_VARS": "0", + "MODEL_DETAIL_KPIS": "[\"Total Calories\", \"Total Calcium\", \"Total Iron\", \"Total Vit_A\", \"Total Dietary_Fiber\", \"Total Carbohydrates\", \"Total Protein\", \"Minimal cost\"]", + "MODEL_DETAIL_NONZEROS": "57", + "MODEL_DETAIL_TYPE": "LP", + "PROGRESS_CURRENT_OBJECTIVE": "2.6904091716962637" + }, + "latest_engine_activity": [ + "2020-07-21T16:37:36Z, INFO] Model: diet", + "2020-07-21T16:37:36Z, INFO] - number of variables: 9", + "2020-07-21T16:37:36Z, INFO] - binary=0, integer=0, continuous=9", + "2020-07-21T16:37:36Z, INFO] - number of constraints: 7", + "2020-07-21T16:37:36Z, INFO] - linear=7", + "2020-07-21T16:37:36Z, INFO] - parameters: defaults", + "2020-07-21T16:37:36Z, INFO] - problem type is: LP", + "2020-07-21T16:37:36Z, INFO] Warning: Model: \"diet\" is not a MIP problem, progress listeners are disabled", + "2020-07-21T16:37:36Z, INFO] objective: 2.690", + "2020-07-21T16:37:36Z, INFO] \"Spaghetti W/ Sauce\"=2.155", + "2020-07-21T16:37:36Z, INFO] \"Chocolate Chip Cookies\"=10.000", + "2020-07-21T16:37:36Z, INFO] \"Lowfat Milk\"=1.831", + "2020-07-21T16:37:36Z, INFO] \"Hotdog\"=0.930", + "2020-07-21T16:37:36Z, INFO] solution.csv" + ], + "solve_status": "optimal_solution" + }, + "status": { + "completed_at": "2020-07-21T16:37:36.989Z", + "running_at": "2020-07-21T16:37:35.622Z", + "state": "completed" + } + }, + "deployment": { + "id": "DEPLOYMENT-ID" + } + }, + "metadata": { + "created_at": "2020-07-21T16:37:09.130Z", + "id": "JOB-ID", + "modified_at": "2020-07-21T16:37:37.268Z", + "name": "test-job-diet", + "space_id": "SPACE-ID" + } + } +9. Optional: You can **delete jobs** as follows: + + curl --location --request DELETE "https://us-south.ml.cloud.ibm.com/ml/v4/deployment_jobs/JOB-ID-HERE?version=2020-08-01&space_id=SPACE-ID-HERE&hard_delete=true" \ + -H "Authorization: bearer TOKEN-HERE" + + If you delete a job using the API, it will still be displayed in the user interface. +10. Optional: You can **delete deployments** as follows:If you delete a deployment that contains jobs using the API, the jobs will still be displayed in the deployment space in the user interface\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b93f8a3a1ced22cf84c45b552d5040a4a17fdb60.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b93f8a3a1ced22cf84c45b552d5040a4a17fdb60.md new file mode 100644 index 0000000..54b3351 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b93f8a3a1ced22cf84c45b552d5040a4a17fdb60.md @@ -0,0 +1,18 @@ +# Lists (SPSS Modeler) + +# Lists # + +A list is an ordered sequence of elements, which may be of mixed type\. Lists are enclosed in square brackets (\[ \])\. + +Examples of lists are `[1 2 4 16]` and `["abc" "def"]` and `[A1, A2, A3]`\. Lists are not used as the value of SPSS Modeler fields\. They are used to provide arguments to functions, such as `member` and `oneof`\. + +Notes: + + + + * Lists can be composed only of static objects (for example, a string, number, or field name) and not calls to functions\. + * Fields containing a list type aren't supported\. For example, the function `value_at(3, ['Gender' 'BP' 'Cholesterol'])` is supported, but the function `value_at(3, 'ListField')` isn't supported\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b98506eb96c587bdfd06cbf67617e25d9dae8e60.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b98506eb96c587bdfd06cbf67617e25d9dae8e60.md new file mode 100644 index 0000000..4ed5e40 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b98506eb96c587bdfd06cbf67617e25d9dae8e60.md @@ -0,0 +1,7 @@ +# R scripts (SPSS Modeler) + +# R scripts # + +SPSS Modeler supports R scripts\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b9d44bbcf205103bf01619d31cfebe31a725ba5a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b9d44bbcf205103bf01619d31cfebe31a725ba5a.md new file mode 100644 index 0000000..85802a1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/b9d44bbcf205103bf01619d31cfebe31a725ba5a.md @@ -0,0 +1,5 @@ +# Secure Gateway on IBM watsonx + +# Secure Gateway on IBM® watsonx # + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ba4ad6d42d951b1247e54e312c04749fd8ea2fd1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ba4ad6d42d951b1247e54e312c04749fd8ea2fd1.md new file mode 100644 index 0000000..09286ed --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ba4ad6d42d951b1247e54e312c04749fd8ea2fd1.md @@ -0,0 +1,27 @@ +# {{ document.title.text }} + +# Physical harm # + +![icon for value alignment risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-value-alignment.svg)Risks associated with outputValue alignmentNew + +### Description ### + +A model could generate language that might lead to physical harm The language might include overtly violent, covertly dangerous, or otherwise indirectly unsafe statements that could precipitate immediate physical harm or create prejudices that could lead to future harm\. + +### Why is physical harm a concern for foundation models? ### + +If people blindly follow the advice of a model, they might end up harming themselves\. Business entities could face fines, reputational harms, and other legal consequences\. + +Example + +#### Harmful Content Generation #### + +According to the source article, an AI chatbot app has been found to generate harmful content about suicide, including suicide methods, with minimal prompting\. A Belgian man died by suicide after turning to this chatbot to escape his anxiety\. The chatbot supplied increasingly harmful responses throughout their conversations, including aggressive outputs about his family\. + +Sources: + +[Vice, March 2023](https://www.vice.com/en/article/pkadgm/man-dies-by-suicide-after-talking-with-ai-chatbot-widow-says) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ba78048bad0ee0f455762254f562704769ea4149.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ba78048bad0ee0f455762254f562704769ea4149.md new file mode 100644 index 0000000..80f812e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ba78048bad0ee0f455762254f562704769ea4149.md @@ -0,0 +1,87 @@ +# MySQL connection + +# MySQL connection # + +To access your data in MySQL, create a connection asset for it\. + +MySQL is an open\-source relational database management system\. + +## Supported versions ## + + + + * MySQL Enterprise Edition 5\.0\+ + * MySQL Community Edition 4\.1, 5\.0, 5\.1, 5\.5, 5\.6, 5\.7 + + + +## Create a connection to MySQL ## + +To create the connection asset, you need these connection details: + + + + * Database name + * Hostname or IP Address + * Port number + * Character Encoding + * Username and password + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use MySQL connections in the following workspaces and tools: + +**Projects** + + + + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [MySQL documentation](https://dev.mysql.com/doc/) for the correct syntax\. + +## MySQL setup ## + +[MySQL Installation ](https://dev.mysql.com/doc/mysql-getting-started/en/) + +## Learn more ## + +[MySQL documentation](https://dev.mysql.com/doc/) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ba8a6820b3dbfaa703679b19be070f7bd0cca3d1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ba8a6820b3dbfaa703679b19be070f7bd0cca3d1.md new file mode 100644 index 0000000..bd7e104 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ba8a6820b3dbfaa703679b19be070f7bd0cca3d1.md @@ -0,0 +1,6 @@ +# Q-Q plots + +# Q\-Q plots # + +Q\-Q (quantile\-quantile) plots compare two probability distributions by plotting their quantiles against each other\. A Q–Q plot is used to compare the shapes of distributions, providing a graphical view of how properties such as location, scale, and skewness are similar or different in the two distributions\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bab82891ca84875b6eec64974558fc838197c99a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bab82891ca84875b6eec64974558fc838197c99a.md new file mode 100644 index 0000000..82748ef --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bab82891ca84875b6eec64974558fc838197c99a.md @@ -0,0 +1,19 @@ +# applytwostepnode properties + +# applytwostepnode properties # + +You can use TwoStep modeling nodes to generate a TwoStep model nugget\. The scripting name of this model nugget is *applytwostepnode*\. For more information on scripting the modeling node itself, see [twostepnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/twostepnodeslots.html#twostepnodeslots)\. + + + +applytwostepnode properties + +Table 1\. applytwostepnode properties + +| `applytwostepnode` Properties | Values | Property description | +| ----------------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `enable_sql_generation` | `udf`
`native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bacaf30043e33912e3d7f174b3f8cf858cb3093a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bacaf30043e33912e3d7f174b3f8cf858cb3093a.md new file mode 100644 index 0000000..ed30d49 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bacaf30043e33912e3d7f174b3f8cf858cb3093a.md @@ -0,0 +1,39 @@ +# Sequence functions (SPSS Modeler) + +# Sequence functions # + +For some operations, the sequence of events is important\. + +The application allows you to work with the following record sequences: + + + + * Sequences and time series + * Sequence functions + * Record indexing + * Averaging, summing, and comparing values + * Monitoring change—differentiation + * `@SINCE` + * Offset values + * Additional sequence facilities + + + +For many applications, each record passing through a stream can be considered as an individual case, independent of all others\. In such situations, the order of records is usually unimportant\. + +For some classes of problems, however, the record sequence is very important\. These are typically time series situations, in which the sequence of records represents an ordered sequence of events or occurrences\. Each record represents a snapshot at a particular instant in time; much of the richest information, however, might be contained not in instantaneous values but in the way in which such values are changing and behaving over time\. + +Of course, the relevant parameter may be something other than time\. For example, the records could represent analyses performed at distances along a line, but the same principles would apply\. + +Sequence and special functions are immediately recognizable by the following characteristics: + + + + * They are all prefixed by `@` + * Their names are given in uppercase + + + +Sequence functions can refer to the record currently being processed by a node, the records that have already passed through a node, and even, in one case, records that have yet to pass through a node\. Sequence functions can be mixed freely with other components of CLEM expressions, although some have restrictions on what can be used as their arguments\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bad5210d0f8114cd4e9b1db05eb92f0eabc6e233.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bad5210d0f8114cd4e9b1db05eb92f0eabc6e233.md new file mode 100644 index 0000000..0eb686c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bad5210d0f8114cd4e9b1db05eb92f0eabc6e233.md @@ -0,0 +1,38 @@ +# distinctnode properties + +# distinctnode properties # + +![Distinct node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/distinctnodeicon.png) The Distinct node removes duplicate records, either by passing the first distinct record to the data flow or by discarding the first record and passing any duplicates to the data flow instead\. + +Example + + node = stream.create("distinct", "My node") + node.setPropertyValue("mode", "Include") + node.setPropertyValue("fields", ["Age" "Sex"]) + node.setPropertyValue("keys_pre_sorted", True) + + + +distinctnode properties + +Table 1\. distinctnode properties + +| `distinctnode` properties | Data type | Property description | +| ------------------------- | ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `mode` | `Include`
`Discard` | You can include the first distinct record in the data stream, or discard the first distinct record and pass any duplicate records to the data stream instead\. | +| `composite_value` | Structured slot | See example below\. | +| `composite_values` | Structured slot | See example below\. | +| `inc_record_count` | *flag* | Creates an extra field that specifies how many input records were aggregated to form each aggregate record\. | +| `count_field` | *string* | Specifies the name of the record count field\. | +| `default_ascending` | *flag* | | +| `low_distinct_key_count` | *flag* | Specifies that you have only a small number of records and/or a small number of unique values of the key field(s)\. | +| `keys_pre_sorted` | *flag* | Specifies that all records with the same key values are grouped together in the input\. | +| `disable_sql_generation` | *flag* | | +| `grouping_fields` | *array* | Lists the field or fields used to determine whether records are identical\. | +| `sort_keys` | *array* | Lists the fields used to determine how records are sorted within each group of duplicates, and whether they're sorted in ascending or descending order\. You must specify a sort order if you've chosen to include or exclude the first record in each group, and if it matters to you which record is treated as the first\. | +| `default_sort_order` | `Ascending`
`Descending` | Specify whether, by default, records are sorted in ascending or descending order of the sort key values\. | +| `existing_sort_keys` | *array* | Specify the existing sort order\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bae3302fc87e1bbfa604baa2d003069e4233a517.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bae3302fc87e1bbfa604baa2d003069e4233a517.md new file mode 100644 index 0000000..34811b6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bae3302fc87e1bbfa604baa2d003069e4233a517.md @@ -0,0 +1,6 @@ +# Theme River charts + +# Theme River charts # + +A theme river is a specialized flow graph that shows changes over time\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bb659d7b00db3096c4082bb93c7fdb933738b013.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bb659d7b00db3096c4082bb93c7fdb933738b013.md new file mode 100644 index 0000000..2bbc7c0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bb659d7b00db3096c4082bb93c7fdb933738b013.md @@ -0,0 +1,24 @@ +# Creating a scatterplot (SPSS Modeler) + +# Creating a scatterplot # + +Now let's take a look at what factors might influence `Drug`, the target variable\. As a researcher, you know that the concentrations of sodium and potassium in the blood are important factors\. Since these are both numeric values, you can create a scatterplot of sodium versus potassium, using the drug categories as a color overlay\. + +Figure 1\. Plot node + +![Plot node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_drug_scatterplot_flow.png) + + + +1. Place a Plot node on the canvas and connect it to the drug1n\.csv Data Asset node\. Then double\-click the Plot node to edit its properties\. +2. Select `Na` as the X field, `K` as the Y field, and `Drug` as the Color (overlay) field\. Click Save, then right\-click the Plot node and select Run\. A plot chart is added to the Outputs pane\. + + The plot clearly shows a threshold above which the correct drug is always drug `Y` and below which the correct drug is never drug `Y`. This threshold is a ratio -- the ratio of sodium (`Na`) to potassium (`K`). + + Figure 2. Scatterplot of drug distribution + + ![Scatterplot of drug distribution](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_drug_scatterplot.png) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bb832bb5ce4b3e6e6272967d547d652b1daf2c4d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bb832bb5ce4b3e6e6272967d547d652b1daf2c4d.md new file mode 100644 index 0000000..7b7fd5e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bb832bb5ce4b3e6e6272967d547d652b1daf2c4d.md @@ -0,0 +1,199 @@ +# RStudio + +# RStudio # + +R is a popular statistical analysis and machine\-learning package that enables data management and includes tests, models, analyses and graphics\. RStudio, included in IBM Watson Studio, provides an integrated development environment for working with R scripts\. + +## Accessing RStudio ## + +RStudio is integrated in IBM Watson Studio projects and can be launched after you create a project\. With RStudio integration in projects, you can access and use the data files that are stored in the IBM Cloud Object Storage bucket associated with your project in RStudio\. + +To start RStudio in your project: + + + +1. Click **RStudio** from the **Launch IDE** menu on your project's action bar\. +2. Select an environment\. +3. Click **Launch**\. + + The environment runtime is initiated and the development environment opens. + + + +Sometimes, when you start an RStudio session, you might experience a corrupted RStudio state from a previous session and your session will not start\. If this happens, select to reset the workspace at the time you select the RStudio environment and then start the RStudio IDE again\. By resetting the workspace, RStudio is started using the default settings with a clean RStudio workspace\. + +## Working with data files ## + +In RStudio, you can work with data files from different sources: + + + + * *Files* in the RStudio server file structure, which you can view by clicking **Files** in the bottom right section of RStudio\. This is where you can create folders, upload files from your local system, and delete files\. + + To access these files in R, you need to set the working directory to the directory with the files. You can do this by navigating to the directory with the files and clicking **More > Set as Working Directory**. + + Be aware that files stored in the `Home` directory of your RStudio instance are persistent within your instance only and cannot be shared across environments nor within your project. + + + +Video disclaimer: Some minor steps and graphical elements in the videos on this page may differ from your deployment\. + +Watch this video to see how to load data to RStudio\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + + + + * *Project data assets* that are stored in the IBM Cloud Object Storage bucket associated with your project\. When RStudio is launched, the IBM Cloud Object Storage bucket content is mounted to the `project-objectstorage` directory in your RStudio `Home` directory\. + + If you want data files to appear in the `project-objectstorage` directory, you must add them as assets to your project. See [Adding files as project assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-overview.html?context=cdpaas&locale=en#adding-files). + + If new data assets are added to the project while you are in RStudio and you want to access them, you need to refresh the `project-objectstorage` folder. + + See how to [read and write data to and from Cloud Object Storage](https://medium.com/ibm-data-science-experience/read-and-write-data-to-and-from-bluemix-object-storage-in-rstudio-276282347ce1). + * *Data* stored in a database system\. + + Watch this video to see how to connect to external data sources in RStudio. + + This video provides a visual method to learn the concepts and tasks in this documentation. + * *Files stored in local storage* that are mounted to `/home/rstudio`\. The `home` directory has a storage limitation of 2 GB and is used to store the RStudio session workspace\. Note that you are allocated 2 GB for your `home` directory storage across all of your projects, irrespective of whether you use RStudio in each project\. As a consequence, you should only store R script files and small data files in the `home` directory\. It is not intended for large data files or large generated output\. All large data files should be uploaded as project assets, which are mounted to the `project-objectstorage` directory from where you can access them\. + + + +## Adding files as project assets ## + +If you worked with data files and want them appear in the `project-objectstorage` directory, you must add them to your project as data assets\. To add these files as data assets to the project: + + + +1. On the Assets page of the project, click the **Upload asset to project** icon (![Shows the Upload asset to project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/find_data_icon.png)) and select the **Files** tab\. +2. Select the files you want to add to the project as assets\. +3. From the Actions list, select **Add as data asset** and apply your changes\. + + + +## Capacity consumption and runtime scope ## + +An RStudio environment runtime is always scoped to an environment template and an RStudio session user\. Only one RStudio session can be active per Watson Studio user at one time\. If you started RStudio in another project, you are asked if you want to stop that session and start a new RStudio session in the context of the current project you're working in\. + +Runtime usage is calculated by the number of capacity unit hours (CUHs) consumed by the active environment runtime\. The CUHs consumed by an active RStudio runtime in a project are billed to the account of the project creator\. See [Capacity units per hour billing for RStudio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/track-runtime-usage.html#rstudio)\. + +You can see which RStudio environment runtimes are active on the project's **Environments** page\. You can stop your runtime from this page\. + +**Remember:** The CUH counter continues to increase while the runtime is active so stop the runtime if you aren't using RStudio\. If you don't explicitly stop the runtime, it is stopped for you after an idle time of 2 hour\. During this idle time, you will continue to consume CUHs for which you are billed\. Long compute\-intensive jobs are hard stopped after 24 hours\. + +Watch this video to see an overview of the RStudio IDE\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + + + + * Transcript + + Synchronize transcript with video + + + + | Time | Transcript | + | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | + | 00:00 | This video is a quick tour of the RStudio integrated development environment inside a Watson Studio project. | + | 00:07 | From any project, you can launch the RStudio IDE. | + | 00:12 | RStudio is a free and open-source integrated development environment for R, a programming language for statistical computing and graphics. | + | 00:22 | In RStudio, there are four panes: the source pane, the console pane, the environment pane, and the files pane. | + | 00:32 | The panes help you organize your work and separate the different tasks you'll do with R. | + | 00:39 | You can drag to resize the panes or use the icons to minimize and maximize a pane. | + | 00:47 | You can also rearrange the panes in global options. | + | 00:53 | The console pane is your interface to R. | + | 00:56 | It's exactly what you would see in terminal window or user interfaces bundled with R. | + | 01:01 | The console pane does have some added features that you'll find helpful. | + | 01:06 | To run code from the console, just type the command. | + | 01:11 | Start typing a command to see a list of commands that begin with the letters you started typing. | + | 01:17 | Highlight a command in the list and press "Enter" to insert it. | + | 01:24 | Use the up arrow to scroll through the commands you've previously entered. | + | 01:31 | As you issue more commands, you can scroll through the results. | + | 01:36 | Use the menu option to clear the console. | + | 01:39 | You can also use tab completion to see a list of the functions, objects, and data sets beginning with that text. | + | 01:47 | And use the arrows to highlight a command to see help for that command. | + | 01:51 | When you're ready, just press "Enter" to insert it. | + | 01:55 | Next, you'll see a list of the options for that command in the current context. | + | 01:59 | For example, the first argument for the read.csv function is the file. | + | 02:05 | RStudio will display a list of the folders and files in your working directory, so you can easily locate the file to include with the argument. | + | 02:16 | Lastly, if you use the tab completion with a function that expects a package name, such as a library, you'll see a list of all the installed packages. | + | 02:28 | Next, let's look at the source pane, which is simply a text editor for you to write your R code. | + | 02:34 | The text editor supports R command files and plain text, as well as several other languages, and includes language-specific highlighting in context. | + | 02:47 | And you'll notice the tab completion is also available in the text editor. | + | 02:53 | From the text editor, you can run a single line of code, or select several lines of code to run, and you'll see the results in the console pane. | + | 03:08 | You can save your code as an R script to share or run again later. | + | 03:15 | The view function opens a new tab that shows the dataframe in spreadsheet format. | + | 03:22 | Or you can display it in its own window. | + | 03:25 | Now, you can scroll through the data, sort the columns, search for specific values, or filter the rows using the sliders and drop-down menus. | + | 03:41 | The environment pane contains an "Environment" tab, a "History" tab, and a "Connections" tab, and keeps track of what's been happening in this R session. | + | 03:51 | The "Environment" tab contains the R objects that exist in your global environment, created during the session. | + | 03:58 | So, when you create a new object in the console pane, it automatically displays in the environment pane. | + | 04:04 | You can also view the objects related to a specific package, and even see the source code for a specific function. | + | 04:12 | You can also see a list of the data sets, expand a data set to inspect its individual elements, and view them in the source pane. | + | 04:22 | You can save the contents of an environment as an .RData file, so you can load that .RData file at a later date. | + | 04:29 | From here, you can also clear the objects from the workspace. | + | 04:33 | If you want to delete specific items, use the grid view. | + | 04:38 | For example, you can easily find large items to delete to free up memory in your R session. | + | 04:45 | The "Environment" tab also allows you to import a data set. | + | 04:50 | You can see a preview of the data set and change options before completing the import. | + | 04:55 | The imported data will display in the source pane. | + | 05:00 | The "History" tab displays a history of each of the commands that you run at the command line. | + | 05:05 | Just like the "Environment" tab, you can save the history as an .Rhistory file, so you can open it at a later date. | + | 05:11 | And this tab has the same options to clear all of the history and individual entries in the history. | + | 05:17 | Select a command and send it to the console to rerun the command. | + | 05:23 | You can also copy a command to the source pane to include it in a script. | + | 05:31 | On the "Connections" tab, you can create a new connection to a data source. | + | 05:36 | The choices in this dialog box are dependent upon which packages you have installed. | + | 05:41 | For example, a "BLUDB" connection allows you to connect to a Db2 Warehouse on Cloud service. | + | 05:49 | The files pane contains the "Files", "Plots", "Packages", "Help", and "Viewer" tabs. | + | 05:55 | The "Files" tab displays the contents of your working directory. | + | 05:59 | RStudio will load files from this directory and save files to this directory. | + | 06:04 | Navigate to a file and click the file to view it in the source pane. | + | 06:09 | From here, you can create new folders and upload files, either by selecting individual files to upload or selecting a .zip file containing all of the files to upload. | + | 06:25 | From here, you can also delete and rename files and folders. | + | 06:30 | In order to access the file in R, you need to set the data folder as a working directory. | + | 06:36 | You'll see that the setwd command was executed in the console. | + | 06:43 | You can access the data assets in your project by opening the project folder. | + | 06:50 | The "Plots" tab displays the results of R's plot functions, such as: plot, hist, ggplot, and xyplot | + | 07:00 | You can navigate through different plots using the arrows or zoom to see a graph full screen. | + | 07:09 | You can also delete individual plots or all plots from here. | + | 07:13 | Use the "Export" option to save the plot as a graphic or print file at the specified resolution. | + | 07:21 | The "Packages" tab displays the packages you currently have installed in your system library. | + | 07:26 | The search bar lets you quickly find a specific package. | + | 07:30 | The checked packages are the packages that were already loaded, using the library command, in the current session. | + | 07:38 | You can check additional packages from here to load them or uncheck packages to detach them from the current session. | + | 07:45 | The console pane displays the results. | + | 07:48 | Use the "X" next to a package name to remove it from the system library. | + | 07:54 | You can also find new packages to install or update to the latest version of any package. | + | 08:03 | Clicking any of the packages opens the "Help" tab with additional information for that package. | + | 08:09 | From here, you can search for functions to get more help. | + | 08:13 | And from the console, you can use the help command, or simply type a question mark followed by the function, to get help with that function. | + | 08:21 | The "Viewer" tab displays HTML output. | + | 08:25 | Some R functions generate HTML to display reports and interactive graphs. | + | 08:31 | The R Markdown package creates reports that you can view in the "Viewer" tab. | + | 08:38 | The Shiny package creates web apps that you can view in the "Viewer" tab. | + | 08:44 | And other packages build on the htmlwidgets framework and include Java-based, interactive visualizations. | + | 08:54 | You can also publish the visualization to the free site, called "RPubs.com". | + | 09:01 | This is been a brief overview of the RStudio IDE. | + | 09:05 | Find more videos on RStudio in the Cloud Pak for Data as a Service documentation. | + + + + + +## Learn more ## + + + + * [RStudio environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-envs.html) + * [Using Spark in RStudio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-spark.html) + + + +**Parent topic:**[Notebooks and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebooks-and-scripts.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bb961ab67f88b50475329fcd1ee2f64137480426.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bb961ab67f88b50475329fcd1ee2f64137480426.md new file mode 100644 index 0000000..00ad6f2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bb961ab67f88b50475329fcd1ee2f64137480426.md @@ -0,0 +1,143 @@ +# Run a sample pipeline to compare models + +# Run a sample pipeline to compare models # + +Download a pre\-populated project with the assets you need to run a sample pipeline\. The pipeline compares two AutoAI experiments and compares the output, selecting the best model and deploying it as a Web service\. + +The *Train AutoAI and reference model* sample creates a pre\-populated project with the assets you need to run a pre\-built pipeline that trains models using a sample data set\. After performing some set up and configuration tasks, you can run the sample pipeline to automate the following sequence: + + + + * Copy sample assets into a space\. + * Run a notebook and an AutoAI experiment simultaneously, on a common training data set\. + * Run another notebook to compare the results from the previous nodes and select the best model, ranked for accuracy\. + * Copy the winning model to a space and create a web service deployment for the selected model\. + + + +After the run completes, you can inspect the output in the pipeline editor and then switch to the associated deployment space to [view and test the resulting deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-sample2.html?context=cdpaas&locale=en#view-deploy)\. + +## Learning goals ## + +After running this sample you will know how to: + + + + * Configure a Watson Pipeline + * Run a Watson Pipeline + + + +## Downloading the sample ## + +Follow these steps to create the sample project from the Samples so you can test the capabilities of IBM Watson Pipelines: + + + +1. Open the [Train AutoAI and reference model sample](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/496c1220779cbe5cccc063534600789f) from the Samples\. +2. Click **Create project** to create the project\. +3. Open the project and follow the instructions on the Readme page to set up the pipeline assets\. + + + +## The sample pipeline components ## + +The sample project includes: + + + + * Pre\-built sample Watson Pipeline + * Data set called german\_credit\_data\_biased\_training\.csv used for training a model to predict credit risk + * Data set called german\_credit\_test\_data\.csv used to test the deployed model + * Notebook called reference\-model\-training\-notebook that trains an AutoAI experiment and saves the best pipeline as a model + * Notebook called select\-winning\-model that compares the models and chooses the best to save to the designated deployment space + + + +## Getting started with the sample ## + +To run the sample pipeline, you will need to perform some set\-up tasks: + + + +1. Create a deployment space, for example, *dev\-space* which you'll need when you run the notebooks\. From the navigation menu, select **Deployments > View All Spaces > New deployment space**\. Fill in the required fields\. + + Note:Make sure you associate a Watson Machine Learning instance with the space or the pipeline run will fail. +2. From the Assets page of the sample project, open the reference\-model\-training\-notebook and follow the steps in the *Set up the environment* section to acquire and insert an api\_key variable as your credentials\. +3. After inserting your credentials, click **File > Save as version** to save the updated notebook to your project\. +4. Do the same for the select\-winning\-model notebook to add credentials and save the updated version of the notebook\. + + + +## Exploring the pipeline ## + +After you complete the set up tasks, open the sample pipeline *On\-boarding \- Train AutoAI and reference model and select the best* from the Assets page of the sample project\. + +You will see the sample pipeline: + +![Sample pipeline from Samples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/pipeline-sample1.png) + +### Viewing node configuration ### + +As you explore the sample pipeline, double\-click on the various nodes to view their configuration\. For example, if you click on the first node for copying an asset, you will see this configuration: + +![Creating assets configuration](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/pipeline-sample1-config.png) + +Note that the node that will copy the data asset to a deployment space is configured using a pipeline parameter\. The pipeline parameter creates a placeholder for the space you created to use for this pipeline\. When you run the pipeline, you are prompted to choose the space\. + +### Running the pipeline ### + +When you are ready to run the pipeline, click the Run icon and choose **Trial job**\. You are prompted to choose the deployment space for the pipeline and create or supply an API key for the pipeline if one is not already available\. + +As the pipeline runs, you will see status notifications about the progress of the run\. Nodes that are processed successfully are marked with a checkmark\. + +![Running the pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/pipeline-sample1-run.png) + +### Viewing the output ### + +When the job completes, click **Pipeline output** for the run to see a summary of pipeline processes\. You can click to expand each section and view the details for each operation\. + +![Viewing the pipeline output](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/pipeline-sample1-output.png) + +## Viewing the deployment in your space ## + +After you are done exploring the pipeline and its output, you can view the assets that were created in the space you designated for the pipeline\. + +Open the space\. You can see that the models and training data were copied to the space\. The winning model is tagged as *selected\_model*\. + +![Viewing the associated space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/pipeline-sample1-space.png) + +### Viewing the deployment ### + +The last step of the pipeline created a web service deployment for the selected model\. Click the **Deployments** tab to view the deployment\. + +![Viewing the deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/pipeline-sample1-deploy1.png) + +### Testing the deployment ### + +You can test the deployment to see the predictions the model will generate\. + + + +1. Click the deployment name to view the details\. +2. Click the **Test** tab\. +3. Enter this JSON data into the Input form\. The payload (input) must match the schema for the model but should not include the prediction column\. + + + + {"input_data":[{ + "fields": "CheckingStatus","LoanDuration","CreditHistory","LoanPurpose","LoanAmount","ExistingSavings","EmploymentDuration","InstallmentPercent","Sex","OthersOnLoan","CurrentResidenceDuration","OwnsProperty","Age","InstallmentPlans","Housing","ExistingCreditsCount","Job","Dependents","Telephone","ForeignWorker"], + "values": "no_checking",28,"outstanding_credit","appliances",5990,"500_to_1000","greater_7",5,"male","co-applicant",3,"car_other",55,"none","free",2,"skilled",2,"yes","yes"]] + }]} + +Clicking **Predict** returns this prediction, indicating a low credit risk for this customer\. + +![Viewing the prediction](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/pipeline-sample1-predict.png) + +## Next steps ## + +[Create a pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-create.html) using your own assets\. + +**Parent topic:**[Watson Pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bbb6fc842a370135b8488d9a2e09fcf17341954b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bbb6fc842a370135b8488d9a2e09fcf17341954b.md new file mode 100644 index 0000000..a6b13b4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bbb6fc842a370135b8488d9a2e09fcf17341954b.md @@ -0,0 +1,34 @@ +# Hotel satisfaction example for Text Analytics (SPSS Modeler) + +# Hotel satisfaction example for Text Analytics # + +SPSS Modeler offers nodes that are specialized for handling text\. + +In this example, a hotel manager is interested in learning what customers think about the hotel\. + +Figure 1\. Chart of positive opinions + +![Chart of positive opinions](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_positive.png) + +Figure 2\. Chart of negative opinions + +![Chart of negative opinions](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_negative.png) + +This example uses the flow named Hotel Satisfaction, available in the example project \. The data files are hotelSatisfaction\.csv and hotelSatisfaction\.xlsx\. The flow uses Text Analytics nodes to analyze fictional text data about hotel personnel, comfort, cleanliness, price, etc\. + +This flow illustrates two ways of analyzing data with a Text Mining node and a Text Link Analysis node\. It also illustrates how you can deploy a text model and score current or new data\. + +Let's take a look at the flow\. + + + +1. Open the \. +2. Scroll down to the Modeler flows section and select the Hotel Satisfaction flow\. + + Figure 3. Completed flow + + ![Completed flow](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel.png) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bbd1f022a8393101199abb731534c10be99cf1e4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bbd1f022a8393101199abb731534c10be99cf1e4.md new file mode 100644 index 0000000..76c0af3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bbd1f022a8393101199abb731534c10be99cf1e4.md @@ -0,0 +1,27 @@ +# Mining for concepts and categories (SPSS Modeler) + +# Mining for concepts and categories # + +The Text Mining node uses linguistic and frequency techniques to extract key concepts from the text and create categories with these concepts and other data\. Use the node to explore the text data contents or to produce either a concept model nugget or category model nugget\. + +![Text Mining node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/ta_textmining.png)When you run this node, an internal linguistic extraction engine extracts and organizes the concepts, patterns, and categories by using natural language processing methods\. Two build modes are available in the Text Mining node's properties: + + + + * The Generate directly (concept model nugget) mode automatically produces a concept or category model nugget when you run the node\. + * The Build interactively (category model nugget) is a more hands\-on, exploratory approach\. You can use this mode to not only extract concepts, create categories, and refine your linguistic resources, but also run text link analysis and explore clusters\. This build mode launches the Text Analytics Workbench\. + + + +And you can use the Text Mining node to generate one of two text mining model nuggets: + + + + * Concept model nuggets uncover and extract important concepts from your structured or unstructured text data\. + * Category model nuggets score and assign documents and records to categories, which are made up of the extracted concepts (and patterns)\. + + + +The extracted concepts and patterns and the categories from your model nuggets can all be combined with existing structured data, such as demographics, to yield better and more\-focused decisions\. For example, if customers frequently list login issues as the primary impediment to completing online account management tasks, you might want to incorporate "login issues" into your models\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bbdeda771a051a9b1871f9bec9589d91421e7c0c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bbdeda771a051a9b1871f9bec9589d91421e7c0c.md new file mode 100644 index 0000000..beb07f1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bbdeda771a051a9b1871f9bec9589d91421e7c0c.md @@ -0,0 +1,12 @@ +# Refression (SPSS Modeler) + +# Regression node # + +Linear regression is a common statistical technique for classifying records based on the values of numeric input fields\. Linear regression fits a straight line or surface that minimizes the discrepancies between predicted and actual output values\. + +Requirements\. Only numeric fields can be used in a regression model\. You must have exactly one target field (with the role set to `Target`) and one or more predictors (with the role set to `Input`)\. Fields with a role of `Both` or `None` are ignored, as are non\-numeric fields\. (If necessary, non\-numeric fields can be recoded using a Derive node\. ) + +Strengths\. Regression models are relatively simple and give an easily interpreted mathematical formula for generating predictions\. Because regression modeling is a long\-established statistical procedure, the properties of these models are well understood\. Regression models are also typically very fast to train\. The Regression node provides methods for automatic field selection in order to eliminate nonsignificant input fields from the equation\. + +Note: In cases where the target field is categorical rather than a continuous range, such as `yes`/`no` or `churn`/`don't churn`, logistic regression can be used as an alternative\. Logistic regression also provides support for non\-numeric inputs, removing the need to recode these fields\. See [Logistic node](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/logreg.html#logreg) for more information\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc1ad7048032258f29e1d4081a2eec98b36d13cf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc1ad7048032258f29e1d4081a2eec98b36d13cf.md new file mode 100644 index 0000000..ef7f05a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc1ad7048032258f29e1d4081a2eec98b36d13cf.md @@ -0,0 +1,78 @@ +# SAP IQ connection + +# SAP IQ connection # + +To access your data in SAP IQ, create a connection asset for it\. + +SAP IQ is a column\-based, petabyte scale, relational database software system used for business intelligence, data warehousing, and data marts\. SAP IQ was formerly Sybase IQ\. + +## Create a connection to SAP IQ ## + +To create the connection asset, you need these connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Username and password + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use SAP IQ connections in the following workspaces and tools: **Projects** + + + + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## SAP IQ setup ## + +[Get Started with SAP IQ](https://www.sap.com/canada/products/sybase-iq-big-data-management/get-started.html) + +## Restriction ## + +You can use this connection only for source data\. You cannot write to data or export data with this connection\. + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [SAP IQ SQL Reference](https://help.sap.com/docs/SAP_IQ/a898e08b84f21015969fa437e89860c8/7b5bd4e8cdcb4593aba6f2895572b0a9.html) for the correct syntax\. + +## Learn more ## + +[SAP IQ technical information](https://www.sap.com/canada/products/sybase-iq-big-data-management/technical-information.html) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc314650433831859c400bffefe5f919ed8735ea.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc314650433831859c400bffefe5f919ed8735ea.md new file mode 100644 index 0000000..cc8aa32 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc314650433831859c400bffefe5f919ed8735ea.md @@ -0,0 +1,17 @@ +# Working with numbers (SPSS Modeler) + +# Working with numbers # + +Numerous standard operations on numeric values are available in SPSS Modeler\. + + + + * Calculating the sine of the specified angle—`sin(NUM)` + * Calculating the natural log of numeric fields—`log(NUM)` + * Calculating the sum of two numbers—`NUM1` \+ `NUM2` + + + +See [Numeric functions](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_function_ref_numeric.html#clem_function_ref_numeric) for more information\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc3d88e89001bb639e418ae5971b209535603a18.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc3d88e89001bb639e418ae5971b209535603a18.md new file mode 100644 index 0000000..2e42f5b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc3d88e89001bb639e418ae5971b209535603a18.md @@ -0,0 +1,21 @@ +# applygeneralizedlinearnode properties + +# applygeneralizedlinearnode properties # + +You can use Generalized Linear (GenLin) modeling nodes to generate a GenLin model nugget\. The scripting name of this model nugget is *applygeneralizedlinearnode*\. For more information on scripting the modeling node itself, see [genlinnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/genlinnodeslots.html#genlinnodeslots)\. + + + +applygeneralizedlinearnode properties + +Table 1\. applygeneralizedlinearnode properties + +| `applygeneralizedlinearnode` Properties | Values | Property description | +| --------------------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `enable_sql_generation` | `false``native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc75f4741f871360b8e3ce356754c329323306f7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc75f4741f871360b8e3ce356754c329323306f7.md new file mode 100644 index 0000000..720474f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc75f4741f871360b8e3ce356754c329323306f7.md @@ -0,0 +1,112 @@ +# Microsoft Azure Data Lake Storage connection + +# Microsoft Azure Data Lake Storage connection # + +To access your data in Microsoft Azure Data Lake Storage, create a connection asset for it\. + +Azure Data Lake Storage (ADLS) is a scalable data storage and analytics service that is hosted in Azure, Microsoft's public cloud\. The Microsoft Azure Data Lake Storage connection supports access to both Gen1 and Gen2 Azure Data Lake Storage repositories\. + +## Create a connection to Microsoft Azure Data Lake Storage ## + +To create the connection asset, you need these connection details: + + + + * WebHDFS URL: The WebHDFS URL for accessing HDFS\. + To connect to a Gen 2 ADLS, use the format, `https://.dfs.core.windows.net/` + Where `` is the name you used when you created the ADLS instance. + For ``, use the name of the container you created. For more information, see the [Microsoft Data Lake Storage Gen2 documentation](https://docs.microsoft.com/en-us/rest/api/storageservices/datalakestoragegen2/path/read). + + * Tenant ID: The Azure Active Directory tenant ID + * Client ID: The client ID for authorizing access to Microsoft Azure Data Lake Storage + * Client secret: The authentication key that is associated with the client ID for authorizing access to Microsoft Azure Data Lake Storage + + + +Select **Server proxy** to access the Azure Data Lake Storage data source through a proxy server\. Depending on its setup, a proxy server can provide load balancing, increased security, and privacy\. The proxy server settings are independent of the authentication credentials and the personal or shared credentials selection\. + + + + * **Proxy host**: The proxy URL\. For example, `https://proxy.example.com`\. + * **Proxy port number**: The port number to connect to the proxy server\. For example, `8080` or `8443`\. + * The **Proxy protocol** selection for HTTP or HTTPS is optional\. + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Microsoft Azure Data Lake Storage connections in the following workspaces and tools: + +**Projects** + + + + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Azure Data Lake Storage authentication setup ## + +To set up authentication, you need a tenant ID, client (or application) ID, and client secret\. + + + + * Gen1: + + + + 1. Create an Azure Active Directory (Azure AD) web application, get an application ID, authentication key, and a tenant ID. + 2. Then, you must assign the Azure AD application to the Azure Data Lake Storage account file or folder. Follow Steps 1, 2, and 3 at [Service-to-service authentication with Azure Data Lake Storage using Azure Active Directory](https://docs.microsoft.com/en-us/azure/data-lake-store/data-lake-store-service-to-service-authenticate-using-active-directory). + + + + * Gen2: + + + + 1. Follow instructions in [Acquire a token from Azure AD for authorizing requests from a client application](https://docs.microsoft.com/en-us/azure/storage/common/storage-auth-aad-app). These steps create a new identity. After you create the identity, set permissions to grant the application access to your ADLS. The Microsoft Azure Data Lake Storage connection will use the associated Client ID, Client secret, and Tenant ID for the application. + 2. Give the Azure App access to the storage container using Storage Explorer. For instructions, see [Use Azure Storage Explorer to manage directories and files in Azure Data Lake Storage Gen2](https://docs.microsoft.com/en-us/azure/storage/blobs/data-lake-storage-explorer#managing-access). + + + + + +## Supported file types ## + +The Microsoft Azure Data Lake Storage connection supports these file types: Avro, CSV, Delimited text, Excel, JSON, ORC, Parquet, SAS, SAV, SHP, and XML\. + +## Learn more ## + +[Azure Data Lake](https://azure.microsoft.com/en-us/solutions/data-lake) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc8e9394d23a5320bfce0ebe7f208ca18cb6b65c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc8e9394d23a5320bfce0ebe7f208ca18cb6b65c.md new file mode 100644 index 0000000..9cd47c8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bc8e9394d23a5320bfce0ebe7f208ca18cb6b65c.md @@ -0,0 +1,29 @@ +# {{ document.title.text }} + +# Data bias # + +![icon for fairness risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-fairness.svg)Risks associated with inputTraining and tuning phaseFairnessAmplified + +### Description ### + +Historical, representational, and societal biases present in the data used to train and fine tune the model can adversely affect model behavior\. + +### Why is data bias a concern for foundation models? ### + +Training an AI system on data with bias, such as historical or representational bias, could lead to biased or skewed outputs that may unfairly represent or otherwise discriminate against certain groups or individuals\. In addition to negative societal impacts, business entities could face legal consequences or reputational harms from biased model outcomes\. + +Example + +#### Healthcare Bias #### + +Research on reinforcing disparities in medicine highlights that using data and AI to transform how people receive healthcare is only as strong as the data behind it, meaning use of training data with poor minority representation can lead to growing health inequalities\. + +Sources: + +[Science, September 2022](https://www.science.org/doi/10.1126/science.abo2788) + +[Forbes, December 2022](https://www.forbes.com/sites/adigaskell/2022/12/02/minority-patients-often-left-behind-by-health-ai/?sh=31d28a225b41) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bca763bf5f62bdc635ac2e0e7c9c6a47b04745a4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bca763bf5f62bdc635ac2e0e7c9c6a47b04745a4.md new file mode 100644 index 0000000..f14463e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bca763bf5f62bdc635ac2e0e7c9c6a47b04745a4.md @@ -0,0 +1,68 @@ +# Keyword extraction and ranking + +# Keyword extraction and ranking # + +The Watson Natural Language Processing Keyword extraction with ranking block extracts noun phrases from input text based on their relevance\. + +**Block name** + +`keywords_text-rank__stock` + +**Supported language** + +Keyword extraction with text ranking is available for the following languages\. For a list of the language codes and the corresponding language, see [Language codes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html#lang-codes)\. + +ar, cs, da, de, en, es, fi, fr, he, hi, it, ja, ko, nb, nl, nn, pt, ro, ru, sk, sv, tr, zh\-cn + +**Capabilities** + +The keywords and text rank block ranks noun phrases extracted from an input document based on how relevant they are within the document\. + + + +Capabilities of keyword extraction and ranking based on an example + +| Capabilities | Examples | +| ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| Ranks extracted noun phrases based on relevance | "Anna went to school at University of California Santa Cruz\. Anna joined the university in 2015\." \-> Anna, University of California Santa Cruz | + + + +**Dependencies on other blocks** + +The following blocks must run before you can run the Keyword extraction with ranking block: + + + + * `syntax_izumo__stock` + * `noun-phrases_rbr__stock` + + + +**Code sample** + + import watson_nlp + text = "Anna went to school at University of California Santa Cruz. Anna joined the university in 2015." + + # Load Syntax, Noun Phrases and Keywords models for English + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + noun_phrases_model = watson_nlp.load('noun-phrases_rbr_en_stock') + keywords_model = watson_nlp.load('keywords_text-rank_en_stock') + + # Run the Syntax and Noun Phrases models + syntax_prediction = syntax_model.run(text, parsers=('token', 'lemma', 'part_of_speech')) + noun_phrases = noun_phrases_model.run(text) + + # Run the keywords model + keywords = keywords_model.run(syntax_prediction, noun_phrases, limit=2) + print(keywords) + +Output of the code sample: + + 'keywords': + [{'text': 'University of California Santa Cruz', 'relevance': 0.939524, 'count': 1}, + {'text': 'Anna', 'relevance': 0.891002, 'count': 2}] + +**Parent topic:**[Watson Natural Language Processing task catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bcae38614c57f1abb775c4c9372dc02531830659.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bcae38614c57f1abb775c4c9372dc02531830659.md new file mode 100644 index 0000000..f9c3b93 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bcae38614c57f1abb775c4c9372dc02531830659.md @@ -0,0 +1,22 @@ +# applysvmnode properties + +# applysvmnode properties # + +You can use SVM modeling nodes to generate an SVM model nugget\. The scripting name of this model nugget is *applysvmnode*\. For more information on scripting the modeling node itself, see [svmnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/svmnodeslots.html#svmnodeslots)\. + + + +applysvmnode properties + +Table 1\. applysvmnode properties + +| `applysvmnode` Properties | Values | Property description | +| --------------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `all_probabilities` | *flag* | | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `enable_sql_generation` | `false`
`native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bd995b62f35ec624da9e86f9a3383b73b54d9ed7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bd995b62f35ec624da9e86f9a3383b73b54d9ed7.md new file mode 100644 index 0000000..0c913f9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bd995b62f35ec624da9e86f9a3383b73b54d9ed7.md @@ -0,0 +1,137 @@ +# The parts of a notebook + +# The parts of a notebook # + +You can see some information about a notebook before you open it on the Assets page of a project\. When you open a notebook in edit mode, you can do much more with the notebook by using multiple menu options, toolbars, an information pane, and by editing and running the notebook cells\. + +You can view the following information about a notebook by clicking the **Notebooks** asset type in the **Assets** page of your project: + + + + * The name of the notebook + * The date when the notebook was last modified and the person who made the change + * The programming language of the notebook + * Whether the notebook is currently locked + + + +When you open a notebook in edit mode, the notebook editor includes the following features: + + + + * [Menu bar and toolbar](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/parts-of-a-notebook.html?context=cdpaas&locale=en#menu-bar-and-toolbar) + * [Notebook action bar](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/parts-of-a-notebook.html?context=cdpaas&locale=en#notebook-action-bar) + * [The cells in a Jupyter notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/parts-of-a-notebook.html?context=cdpaas&locale=en#the-cells-in-a-jupyter-notebook) + + + + * [Jupyter Code cells](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/parts-of-a-notebook.html?context=cdpaas&locale=en#jupyter-code-cells) + * [Jupyter markdown cells](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/parts-of-a-notebook.html?context=cdpaas&locale=en#jupyter-markdown-cells) + * [Raw Jupyter NBConvert cells](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/parts-of-a-notebook.html?context=cdpaas&locale=en#raw-jupyter-nbconvert-cells) + + + + * [Spark job progress bar](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/parts-of-a-notebook.html?context=cdpaas&locale=en#spark-job-progress-bar) + * [Project token for authorization](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/token.html) + + + +![menu and toolbar](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/toolbar.png) + +You can select notebook features that affect the way the notebook functions and perform the most\-used operations within the notebook by clicking an icon\. + +## Notebook action bar ## + +![Notebook action bar](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/action-bar-Blue.png) + +You can select features that enhance notebook collaboration\. From the action bar, you can: + + + + * Publish your notebook as a gist or on GitHub\. + * Create a permanent URL so that anyone with the link can view your notebook\. + * Create jobs in which to run your notebook\. See [Schedule a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-job-nb-editor.html)\. + * Download your notebook\. + * Add a project token so that code can access the project resources\. See [Add code to set the project token](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/token.html)\. + * Generate code snippets to add data from a data asset or a connection to a notebook cell\. + * View your notebook information\. You can: + + + + * Change the name of your notebook by editing it in the **Name** field. + * Edit the description of your notebook in the **Description** field. + * View the date when the notebook was created. + * View the environment details and runtime status; you can change the notebook runtime from here. See [Notebook environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html). + + + + * Save versions of your notebook\. + * Upload assets to the project\. + + + +## The cells in a Jupyter notebook ## + +A Jupyter notebook consists of a sequence of cells\. The flow of a notebook is sequential\. You enter code into an input cell, and when you run the cell, the notebook executes the code and prints the output of the computation to an output cell\. + +You can change the code in an input cell and re\-run the cell as often as you like\. In this way, the notebook follows a read\-evaluate\-print loop paradigm\. You can choose to use tags to describe cells in a notebook\. + +The behavior of a cell is determined by a cell’s type\. The different types of cells include: + +### Jupyter code cells ### + +Where you can edit and write new code\. + +![code cells](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/code_cells_notebook_bigger.png) + +### Jupyter markdown cells ### + +Where you can document the computational process\. You can input headings to structure your notebook hierarchically\. + +You can also add and edit image files as attachments to the notebook\. The markdown code and images are rendered when the cell is run\. + +![markdown cells](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/markdownCells_notebook.png) + +See [Markdown for Jupyter notebooks cheatsheet](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/markd-jupyter.html)\. + +### Raw Jupyter NBConvert cells ### + +Where you can write output directly or put code that you don’t want to run\. Raw cells are not evaluated by the notebook\. + +![raw convert cells](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/rawconvert_cells_notebook_bigger.png) + +## Spark job progress bar ## + +When you run code in a notebook that triggers Spark jobs, it is often challenging to determine why your code is not running efficiently\. + +To help you better understand what your code is doing and assist you in code debugging, you can monitor the execution of the Spark jobs for a code cell\. + +To enable Spark monitoring for a cell in a notebook: + + + + * Select the code cell you want to monitor\. + * Click the **Enable Spark Monitoring** icon (![Shows the enable Spark monitoring icon\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/ProgressBars-Active.png)) on the notebook toolbar\. + + + +The progress bars you see display the real time runtime progress of your jobs on the Spark cluster\. Each Spark job runs on the cluster in one or more stages, where each stage is a list of tasks that can be run in parallel\. The monitoring pane can become very large is the Spark job has many stages\. + +The job monitoring pane also displays the duration of each job and the status of the job stages\. A stage can have one of the following statuses: + + + + * `Running`: Stage active and started\. + * `Completed`: Stage completed\. + * `Skipped`: The results of this stage were cached from a earlier operation and so the task doesn't have to run again\. + * `Pending`: Stage hasn't started yet\. + + + +Click the icon again to disable monitoring in a cell\. + +Note: Spark monitoring is currently only supported in notebooks that run on Python\. + +**Parent topic:**[Creating notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/creating-notebooks.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bdb3689801d81676ae642f1ebff81d27c07f1f3c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bdb3689801d81676ae642f1ebff81d27c07f1f3c.md new file mode 100644 index 0000000..0ff730a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bdb3689801d81676ae642f1ebff81d27c07f1f3c.md @@ -0,0 +1,27 @@ +# SQL optimization (SPSS Modeler) + +# Generating SQL from model nuggets # + +When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. For some nodes, SQL for the model nugget can be generated, pushing back the model scoring stage to the database\. This allows flows containing these nuggets to have their full SQL pushed back\. + +For a generated model nugget that supports SQL pushback: + + + +1. Double\-click the model nugget to open its settings\. +2. Depending on the node type, one or more of the following options is available\. Choose one of these options to specify how SQL generation is performed\. + + Generate SQL for this model + + + + * Default: Score using Server Scoring Adapter (if installed) otherwise in process. This is the default option. If connected to a database with a scoring adapter installed, this option generates SQL using the scoring adapter and associated user defined functions (UDF) and scores your model within the database. When no scoring adapter is available, this option fetches your data back from the database and scores it in SPSS Modeler. + * Score by converting to native SQL without Missing Value Support. This option generates native SQL to score the model within the database, without the overhead of handling missing values. This option simply sets the prediction to null (`$null$`) when a missing value is encountered while scoring a case. + * Score by converting to native SQL with Missing Value Support. For CHAID, QUEST, and C&R Tree models, you can generate native SQL to score the model within the database with full missing value support. This means that SQL is generated so that missing values are handled as specified in the model. For example, C&R Trees use surrogate rules and biggest child fallback. + * Score outside of the Database. This option fetches your data back from the database and scores it in SPSS Modeler. + + + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bdc1b4283563848e2c775804fc0857dbde8843af.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bdc1b4283563848e2c775804fc0857dbde8843af.md new file mode 100644 index 0000000..2877f8d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bdc1b4283563848e2c775804fc0857dbde8843af.md @@ -0,0 +1,32 @@ +# historynode properties + +# historynode properties # + +![History node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/historynodeicon.png)The History node creates new fields containing data from fields in previous records\. History nodes are most often used for sequential data, such as time series data\. Before using a History node, you may want to sort the data using a Sort node\. + +Example + + node = stream.create("history", "My node") + node.setPropertyValue("fields", ["Drug"]) + node.setPropertyValue("offset", 1) + node.setPropertyValue("span", 3) + node.setPropertyValue("unavailable", "Discard") + node.setPropertyValue("fill_with", "undef") + + + +historynode properties + +Table 1\. historynode properties + +| `historynode` properties | Data type | Property description | +| ------------------------ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `fields` | *list* | Fields for which you want a history\. | +| `offset` | *number* | Specifies the latest record (prior to the current record) from which you want to extract historical field values\. | +| `span` | *number* | Specifies the number of prior records from which you want to extract values\. | +| `unavailable` | `Discard``Leave``Fill` | For handling records that have no history values, usually referring to the first several records (at the beginning of the dataset) for which there are no previous records to use as a history\. | +| `fill_with` | `String``Number` | Specifies a value or string to be used for records where no history value is available\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/be1c1c3648cb7f6f6c394334554b1ecedc3504dd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/be1c1c3648cb7f6f6c394334554b1ecedc3504dd.md new file mode 100644 index 0000000..caa27b0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/be1c1c3648cb7f6f6c394334554b1ecedc3504dd.md @@ -0,0 +1,88 @@ +# Amazon RDS for MySQL connection + +# Amazon RDS for MySQL connection # + +To access your data in Amazon RDS for MySQL, create a connection asset for it\. + +Amazon RDS for MySQL is a MySQL relational database that runs on the Amazon Relational Database Service (RDS)\. + +## Supported versions ## + +MySQL database versions 5\.6 through 8\.0 + +## Create a connection to Amazon RDS for MySQL ## + +To create the connection asset, you need these connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Username and password + * SSL certificate (if required by the database server) + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Amazon RDS for MySQL connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Notebooks\. Click **Read data** on the **Code snippets** pane to get the connection credentials and load the data into a data structure\. See [Load data from data source connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html#conns)\. + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Amazon RDS for MySQL setup ## + +For setup instructions, see these topics: + + + + * [Creating an Amazon RDS DB Instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html) + * [Connecting to a DB Instance Running the MySQL Database Engine](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ConnectToInstance.html) + + + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [ Amazon RDS for MySQL documentation](https://aws.amazon.com/rds/mysql) for the correct syntax\. + +## Learn more ## + +[Amazon RDS for MySQL](https://aws.amazon.com/rds/mysql) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/be6a4c0bb6bcc7166ff88d60fd433c220962730d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/be6a4c0bb6bcc7166ff88d60fd433c220962730d.md new file mode 100644 index 0000000..22e9327 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/be6a4c0bb6bcc7166ff88d60fd433c220962730d.md @@ -0,0 +1,11 @@ +# Transform node (SPSS Modeler) + +# Transform node # + +Normalizing input fields is an important step before using traditional scoring techniques such as regression, logistic regression, and discriminant analysis\. These techniques carry assumptions about normal distributions of data that may not be true for many raw data files\. One approach to dealing with real\-world data is to apply transformations that move a raw data element toward a more normal distribution\. In addition, normalized fields can easily be compared with each other—for example, income and age are on totally different scales in a raw data file but, when normalized, the relative impact of each can be easily interpreted\. + +The Transform node provides an output viewer that enables you to perform a rapid visual assessment of the best transformation to use\. You can see at a glance whether variables are normally distributed and, if necessary, choose the transformation you want and apply it\. You can pick multiple fields and perform one transformation per field\. + +After selecting the preferred transformations for the fields, you can generate Derive or Filler nodes that perform the transformations and attach these nodes to the flow\. The Derive node creates new fields, while the Filler node transforms the existing ones\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/be7f45c3e17998a50b8414d623007ed668b37c04.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/be7f45c3e17998a50b8414d623007ed668b37c04.md new file mode 100644 index 0000000..3b5b198 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/be7f45c3e17998a50b8414d623007ed668b37c04.md @@ -0,0 +1,129 @@ +# IBM Db2 for z/OS connection + +# IBM Db2 for z/OS connection # + +To access your data in IBM Db2 for z/OS, create a connection asset for it\. + +Db2 for z/OS is an enterprise data server for IBM Z\. It manages core business data across an enterprise and supports key business applications\. + +## Supported versions ## + +IBM Db2 for z/OS version 11 and later + +## Prerequisites ## + +### Obtain the certificate file ### + +A certificate file on the Db2 for z/OS server is required to use this connection\.**These steps must be done on the Db2 for z/OS server**: Obtain an IBM Db2 Connect Unlimited Edition license certificate file from [IBM Db2 Connect: Pricing](https://www.ibm.com/products/db2-connect/pricing) and [Installing the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/en/db2/11.5?topic=apis-installing-data-server-driver-jdbc-sqlj)\. For installation instructions, see [Activating the license certificate file for Db2 Connect Unlimited Edition](https://www.ibm.com/docs/en/db2/11.5?topic=li-activating-license-certificate-file-db2-connect-unlimited-edition)\. + +### Run the bind command ### + +Run the following commands from the Db2 client that is configured to access the Db2 for z/OS server\. +You need to run the bind command only once per remote database per Db2 client version\. + + db2 connect to DBALIAS user USERID using PASSWORD + db2 bind path@ddcsmvs.lst blocking all sqlerror continue messages ddcsmvs.msg grant public + db2 connect reset + +For information about bind commands, see [Binding applications and utilities (Db2 Connect Server)](https://www.ibm.com/docs/SSEPGG_11.5.0/com.ibm.db2.luw.qb.dbconn.doc/doc/c0005595.html?pos=2)\. + +### Run catalog commands ### + +Run the following catalog commands from the Db2 client that is configured to access the Db2 for z/OS server: + + + +1. db2 catalog tcpip node node_name remote hostname_or_address server port_no_or_service_name + + Example: + `db2 catalog tcpip node db2z123 remote 192.0.2.0 server 446` + +2. db2 catalog dcs database local_name as real_db_name + + Example: + `db2 catalog dcs database db2z123 as db2z123` + +3. db2 catalog database local_name as alias at node node_name authentication server + + Example: + `db2 catalog database db2z123 as db2z123 at node db2z123 authentication server` + + + +For information about catalog commands, see [CATALOG TCPIP NODE](https://www.ibm.com/docs/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001944.html) and [CATALOG DCS DATABASE](https://www.ibm.com/docs/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001937.html)\. + +## Create a connection to Db2 for z/OS ## + +To create the connection asset, you need these connection details: + + + + * **Hostname or IP address** + * **Port number** + * **Collection ID**: The ID of the collections of packages to use + * **Location:** The unique name of the Db2 location you want to access + * **Username** and **password** + * **Application name** (optional): The name of the application that is currently using the connection\. For information, see [Client info properties support by the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/Javadocs/src/tpc/imjcc_r0052001.html)\. + * **Client accounting information** (optional): The value of the accounting string from the client information that is specified for the connection\. For information, see [Client info properties support by the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/Javadocs/src/tpc/imjcc_r0052001.html)\. + * **Client hostname** (optional): The hostname of the machine on which the application that is using the connection is running\. For information, see [Client info properties support by the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/Javadocs/src/tpc/imjcc_r0052001.html)\. + * **Client user** (optional): The name of the user on whose behalf the application that is using the connection is running\. For information, see [Client info properties support by the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/Javadocs/src/tpc/imjcc_r0052001.html)\. + * **SSL certificate** (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Db2 for z/OS connections in the following workspaces and tools: + +**Projects** + + + + * Notebooks\. Click **Read data** on the **Code snippets** pane to get the connection credentials and load the data into a data structure\. See [Load data from data source connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html#conns)\. + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Restriction ## + +For SPSS Modeler, you can use this connection only to import data\. You cannot export data to this connection or to a Db2 for z/OS connected data asset\. + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [ Db2 for z/OS and SQL concepts](https://www.ibm.com/docs/db2-for-zos/12?topic=zos-db2-sql-concepts) for the correct syntax\. + +## Learn more ## + +[IBM Db2 for z/OS documentation](https://www.ibm.com/docs/db2-for-zos) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/becca4c839a0bcf01adcb6a5ce31a3b1168d3548.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/becca4c839a0bcf01adcb6a5ce31a3b1168d3548.md new file mode 100644 index 0000000..5fd83a2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/becca4c839a0bcf01adcb6a5ce31a3b1168d3548.md @@ -0,0 +1,6 @@ +# Box plots + +# Box plots # + +A box plot chart shows the five statistics (minimum, first quartile, median, third quartile, and maximum)\. It is useful for displaying the distribution of a scale variable and pinpointing outliers\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/beda84e76e7f8fa5594f63e640dc17b4f6cb3e5e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/beda84e76e7f8fa5594f63e640dc17b4f6cb3e5e.md new file mode 100644 index 0000000..3056c8d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/beda84e76e7f8fa5594f63e640dc17b4f6cb3e5e.md @@ -0,0 +1,110 @@ +# Monitoring account resource usage + +# Monitoring account resource usage # + +Some service plans charge for compute usage and other types of resource usage\. If you are the IBM Cloud account owner or administrator, you can monitor the resources usage to ensure the limits are not exceeded\. + +For Lite plans, you cannot exceed the limits of the plan\. You must wait until the start of your next billing month to use resources that are calculated monthly\. Alternatively, you can [upgrade to a paid plan](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/upgrade.html)\. + +For most paid plans, you pay for the resources that the tools and processes that are provided by the service consume each month\. + +To see the costs of your plan, log in to IBM Cloud, open your service instance from your IBM Cloud dashboard, and click **Plan**\. + + + + * [Capacity unit hours (CUH) for compute usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html?context=cdpaas&locale=en#compute) + * [Resource units for foundation model inferencing](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html?context=cdpaas&locale=en#rus) + * [Monitor monthly billing](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html?context=cdpaas&locale=en#billing) + + + +## Capacity unit hours (CUH) for compute usage ## + +Many tools consume compute usage that is measured in capacity unit hours (CUH)\. A capacity unit hour is a specific amount of compute capability with a set cost\. + +### How compute usage is calculated ### + +Different types of processes and different levels of compute power are billed at different rates of capacity units per hour\. For example, the hourly rate for a data profiling process is 6 capacity units\. + +Compute usage for Watson Studio is charged by the minute, with a minimum charge of 10 minutes (0\.16 hours)\. Compute usage for Watson Machine Learning is charged by the minute with a minimum charge of one minute\. + +Compute usage is calculated by adding the minimum number of minutes billed for each process plus the number of minutes the process runs beyond the minimum minutes, then multiplying the total by the capacity unit rate for the process\. + +The following table shows examples of how the billed CUH is calculated\. + + + +| Rate | Usage time | Calculation | Total CUH billed | +| ---------- | ---------- | ------------------------- | ---------------------------------------------------------- | +| 1 CUH/hour | 1 hour | 1 hour \* 1 CUH/hour | 1 CUH | +| 2 CUH/hour | 45 minutes | 0\.75 hours \* 2 CUH/hour | 1\.5 CUH | +| 6 CUH/hour | 5 minutes | 0\.16 hours \* 6 CUH/hour | 0\.96 CUH\. The minimum charge for Watson Studio applies\. | +| 6 CUH/hour | 30 minutes | 0\.5 hours \* 6 CUH/hour | 3 CUH | +| 6 CUH/hour | 1 hour | 1 hour \* 6 CUH/hour | 6 CUH | + + + +### Processes that consume capacity unit hours ### + +Some types of processes, such as AutoAI and Federated Learning, have a single compute rate for the runtime\. However, with many tools you have a choice of compute resources for the runtime\. The notebook editor, Data Refinery, SPSS Modeler, and other tools have different rates that reflect the memory and compute power for the environment\. Environments with more memory and compute power consume capacity unit hours at a higher rate\. + +This table shows each process that consumes CUH, where it runs, and against which service CUH is billed, and whether you can choose from more than one environment\. Follow the links to view the available CUH rates for each process\. + + + +| Tool or Process | Workspace | Service that provides CUH | Multiple CUH rates? | +| ----------------------------------------------------- | --------- | --------------------------------------- | ------------------- | +| [Notebook editor](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html) | Project | Watson Studio, Analytics Engine (Spark) | Multiple rates | +| [Invoking the machine learning API from a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html#wml) | Project | Watson Machine Learning | Multiple rates | +| [Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spark-dr-envs.html) | Project | Watson Studio | Multiple rates | +| [SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spss-envs.html) | Project | Watson Studio | Multiple rates | +| [RStudio IDE](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-envs.html) | Project | Watson Studio | Multiple rates | +| [AutoAI experiments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-autoai.html) | Project | Watson Machine Learning | Multiple rates | +| [Decision Optimization experiments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-decisionopt.html) | Spaces | Watson Machine Learning | Multiple rates | +| [Running deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-cuh-deploy-spaces.html) | Spaces | Watson Machine Learning | Multiple rates | +| [Profiling](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html#profiling) | Project | Watson Studio | One rate | +| [Synthetic Data Generator](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/synthetic-envs.html) | Project | Watson Studio | One rate | + + + +### Monitoring compute usage ### + +You can monitor compute usage for all services at the account level\. To view the monthly CUH usage for a service, open the service instance from your IBM Cloud dashboard and click **Plan**\. + +You can also monitor compute usage in a project on the **Environments** page on the **Manage** tab\. + +To see the total amount of capacity unit hours that are used and that are remaining for Watson Studio and Watson Machine Learning, look at the **Environment Runtimes** page\. From the navigation menu, select **Administration > Environment runtimes**\. The **Environment Runtimes** page shows details of the [CUH used by environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/track-runtime-usage.html#track-account)\. You can calculate the amount of CUH you use for data flows and profiling by subtracting the amount used by environments from the total amount used\. + +## Resource units for foundation model inferencing ## + +Calling a foundation model to generate output in response to a prompt is known as inferencing\. Foundation model inferencing is measure in resource units (RU)\. Each RU equals 1,000 tokens\. A token is a basic unit of text (typically 4 characters or 0\.75 words) used in the input or output for a foundation model prompt\. For details on tokens, see [Tokens](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tokens.html)\. + +Resource unit billing is based on the rate of the foundation model class multipled by the number of tokens\. Foundation models are classified into three classes\. See [Resource unit metering](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html#ru-metering)\. + +Note: You do not consume tokens when you use the generative AI search and answer app for this documentation site\. + +### Monitoring token usage for foundation model inferencing ### + +You can monitor foundation model token usage in a project on the **Environments** page on the **Manage** tab\. + +## Monitor monthly billing ## + +You must be an IBM Cloud account owner or administrator to see resource usage information\. + +To view a summary of your monthly billing, from the navigation menu, choose **Administration > Account and billing > Billing and usage**\. The IBM Cloud usage dashboard opens\. To view the usage for each service, in the **Usage summary** section, click **View usage**\. + +## Learn more ## + + + + * [Choosing compute resources for running tools in projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html) + * [Upgrade services](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/upgrade.html) + * [Environments compute usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/track-runtime-usage.html#track-account) + * [Watson Studio offering plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/ws-plans.html) + * [Watson Machine Learning plans and compute usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html) + + + +**Parent topic:**[Managing the platform](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_console.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bf6a65f061558b6aed8a438a887b6474a0fdffc3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bf6a65f061558b6aed8a438a887b6474a0fdffc3.md new file mode 100644 index 0000000..ba2ff03 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bf6a65f061558b6aed8a438a887b6474a0fdffc3.md @@ -0,0 +1,7 @@ +# Report node (SPSS Modeler) + +# Report node # + +You can use the Report node to create formatted reports containing fixed text, data, or other expressions derived from the data\. Specify the format of the report by using text templates to define the fixed text and the data output constructions\. You can provide custom text formatting using HTML tags in the template and by setting output options\. Data values and other conditional output are included in the report using CLEM expressions in the template\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bf75f233fdffdca8a25d191e1df4df7f51e30823.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bf75f233fdffdca8a25d191e1df4df7f51e30823.md new file mode 100644 index 0000000..a378348 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/bf75f233fdffdca8a25d191e1df4df7f51e30823.md @@ -0,0 +1,85 @@ +# Creating environment templates + +# Creating environment templates # + +You can create custom environment templates if you do not want to use the default environments provided by Watson Studio\. + +**Required permissions** : To create an environment template, you must have the **Admin** or **Editor** role within the project\. + +You can create environment templates for the following types of assets: + + + + * Notebooks in the Notebook editor + * Notebooks in RStudio + * Modeler flows in the SPSS Modeler + * Data Refinery flows + * Jobs that run operational assets, such as Data Refinery flows, or Notebooks in a project + + + +Note: + +To create an environment template: + + + +1. On the **Manage** tab of your project, select the **Environments** page and click **New template** under **Templates**\. +2. Enter a name and a description\. +3. Select one of the following engine types: + + + + * **Default**: Select for Python, R, and RStudio runtimes for Watson Studio. + * **Spark**: Select for Spark with Python or R runtimes for Watson Studio. + * **GPU**: Select for more computing power to improve model training performance for Watson Studio. + + + +4. Select the hardware configuration from the **Hardware configuration** drop\-down menu\. +5. Select the software version if you selected a runtime of "Default," "Spark," or "GPU\." + + + +### Where to find your custom environment template ### + +Your new environment template is listed under Templates on the **Environments** page in the **Manage** tab of your project\. From this page, you can: + + + + * Check which runtimes are active + * Update custom environment templates + * Track the number of capacity units per hour that your runtimes have consumed so far + * Stop active runtimes\. + + + +## Limitations ## + +The default environments provided by Watson Studio cannot be edited or modified\. + +**Notebook environments** (Anaconda Python or R distributions): + +: \- You can't add a software customization to the default Python and R environment templates included in Watson Studio\. You can only add a customization to an environment template that you create\. : \- If you add a software customization using conda, your environment must have at least 2 GB RAM\. : \- You can't customize an R environment for a notebook by installing R packages directly from CRAN or GitHub\. You can check if the CRAN package you want is available only from conda channels and, if the package is available, add that package name in the customization list as `r-`\. + + + + * After you have started a notebook in an Watson Studio environment, you can't create another conda environment from inside that notebook and use it\. Watson Studio environments do not behave like a Conda environment manager\. + + + +**Spark environments**: : \- You can't customize the software configuration of a Spark environment template\. + +## Next steps ## + + + + * [Customize environment templates for Python or R](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/customize-envs.html) + + + +## Learn more ## + +**Parent topic:**[Managing compute resources](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c038ba342a00562bcb7a569e4e2acb7349c9cef9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c038ba342a00562bcb7a569e4e2acb7349c9cef9.md new file mode 100644 index 0000000..a20f9d9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c038ba342a00562bcb7a569e4e2acb7349c9cef9.md @@ -0,0 +1,181 @@ +# Quick start: Prompt a foundation model using Prompt Lab + +# Quick start: Prompt a foundation model using Prompt Lab # + +Take this tutorial to learn how to use the Prompt Lab in watsonx\.ai\. There are usually multiple ways to prompt a foundation model for a successful result\. In the Prompt Lab, you can experiment with prompting different foundation models, explore sample prompts, as well as save and share your best prompts\. See [Prompt tips](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-tips.html) to help you successfully prompt most text\-generating foundation models\. + +**Required services** : Watson Studio : Watson Machine Learning + +Your basic workflow includes these tasks: + + + +1. Open a project\. Projects are where you can collaborate with others to work with data\. +2. Open the Prompt Lab\. The Prompt Lab lets you experiment with prompting different foundation models, explore sample prompts, as well as save and share your best prompts\. +3. Type your prompt in the prompt editor\. You can type prompts in either freeform and structured mode\. +4. Select the model to use\. You can submit your prompt to any of the models supported by watsonx\.ai\. +5. Save your work as a projet asset\. Saving your work as a project asset makes your work available to collaborators in the current project\. + + + +## Read about prompting a foundation model ## + +Foundation models are very large AI models\. They have billions of parameters and are trained on terabytes of data\. Foundation models can perform a variety of tasks, including text\-, code\-, or image generation, classification, conversation, and more\. Large language models are a subset of foundation models used for text\- and code\-related tasks\. In IBM watsonx\.ai, there is a collection of deployed large language models that you can use, as well as tools for experimenting with prompts\. + +[Read more about Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) + +## Watch a video about prompting a foundation model ## + +![Watch Video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) Watch this video to preview the steps in this tutorial\. There might be slight differences in the user interface shown in the video\. The video is intended to be a companion to the written tutorial\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Try a tutorial to prompt a foundation model ## + +In this tutorial, you will complete these tasks: + + + + * [Task 1: Open a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en#step01) + * [Task 2: Use the Prompt Lab in Freeform mode](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en#step02) + * [Task 3: Use the Prompt Lab in Structured mode](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en#step03) + * [Task 4: Use the sample prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en#step04) + * [Task 5: Choose a foundation model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en#step05) + * [Task 6: Adjust model parameters](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en#step06) + * [Task 7: Save your work](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en#step07) + + + +Expand all sections + + + + * Tips for completing this tutorial + + \#\#\# Use the video picture-in-picture Tip: Start the video, then as you scroll through the tutorial, the video moves to picture-in-picture mode. Close the video table of contents for the best experience with picture-in-picture. You can use picture-in-picture mode so you can follow the video as you complete the tasks in this tutorial. Click the timestamps for each task to follow along.The following animated image shows how to use the video picture-in-picture and table of contents features: ![How to use picture-in-picture and chapters](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/pip-and-chapters.gif)\{: width="560px" height="315px" data-tearsheet="this"\} \#\#\# Get help in the community If you need help with this tutorial, you can ask a question or find an answer in the [watsonx.ai Community discussion forum](https://community.ibm.com/community/user/watsonx/communities/community-home/digestviewer?communitykey=81927b7e-9a92-4236-a0e0-018a27c4ad6e)\{: new\_window\}. \#\#\# Set up your browser windows For the optimal experience completing this tutorial, open Cloud Pak for Data in one browser window, and keep this tutorial page open in another browser window to switch easily between the two applications. Consider arranging the two browser windows side-by-side to make it easier to follow along. ![Side-by-side tutorial and UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/tutorial-side-by-side-wx.png)\{: width="560px" height="315px" data-tearsheet="this"\} Tip: If you encounter a guided tour while completing this tutorial in the user interface, click **Maybe later**. + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 1: Open a project + + You need a project to store Prompt Lab assets. Watch a video to see how to create a sandbox project and associate a service. Then follow the steps to verify that you have an existing project or create a sandbox project. + + This video provides a visual method to learn the concepts and tasks in this documentation. + + 1. From the watsonx home screen, scroll to the *Projects* section. If you see any projects listed, then skip to [Task 2](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en#step02). If you don't see any projects, then follow these steps to create a project. 1. Click **Create a sandbox project**. When the project is created, you will see the sandbox project in the *Projects* section. For more information or to watch a video, see [Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html)\{: new\_window\}. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the home screen with the sandbox listed in the Projects section. You are now ready to open the Prompt Lab. + + ![Home screen with sandbox project listed.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-home-screen.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 2: Use the Prompt Lab in Freeform mode + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:03. You can type your prompt text in a freeform, plain text editor and then click **Generate** to send your prompt to the model. Follow these steps to use the Prompt Lab in Freeform mode: 1. From the home screen, click the **Experiment with foundation models and build prompts** tile. 1. Select each checkbox to accept the acknowledgements, and then click **Skip tour**. 1. Click the **Freeform** tab to prompt a foundation model in *Freeform* mode. 1. Click **Switch mode**. 1. Copy and paste the following text in the text field, and then click **Generate** to see the output for the *Class name: Problem*.`Classify this customer message into one of two classes: question, problem. Class name: Question Description: The customer is asking a technical question or a how-to question about our products or services. Class name: Problem Description: The customer is describing a problem they are having. They might say they are trying something, but it's not working. They might say they are getting an error or unexpected results. Message: I'm having trouble registering for a new account. Class name:` + \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following images shows the generated output for the prompt in Freeform mode. Now you are ready to prompt a foundation model in Structured mode. + + ![Generated output for the prompt in Freeform mode.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-prompt-freeform.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 3: Use the Prompt Lab in Structured mode + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:19. You can type your prompt in a structured format. The structured format is helpful for few-shot prompting, when your prompt has multiple examples. Follow these steps to use the Prompt Lab in Structured mode: 1. Click the **Structured** tab. 1. Click **Switch mode**. 1. In the *Instruction* field, copy and paste the following text: `Given a message submitted to a customer-support chatbot for a cloud software company, classify the customer's message as either a question or a problem description so the chat can be routed to the correct support team.`\{: .cp\} 1. In the *Setup* field, copy and paste the following text in each column: \| Input \| Output \| \| ----- \| ----- \| \| When I try to log in, I get an error. \| Problem \| \| Where can I find the plan prices? \| Question \| \| What is the difference between trial and paygo? \| Question \| \| The registration page crashed, and now I can't create a new account. \| Problem \| \| What regions are supported? \| Question \| \| I can't remember my password. \| Problem \| + 1. In the *Try* field, copy and paste the following text: `I'm having trouble registering for a new account.`\{: .cp\} 1. Click **Generate** to see the output *Problem*. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following images shows the generated output for the prompt in Structured mode. Now you are ready to try the sample prompts. + + ![Generated output for the prompt in Structured mode](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-prompt-structured.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 4: Use the sample prompts + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:33. If you’re not sure how to begin, sample prompts can get your started. Follow these steps to use the sample prompts: 1. Open the **Sample prompts** icon ![Sample prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/sample-prompts-icon.png)\{: iih\} to display the list. 1. Scroll through the list, and click the **Marketing email generation** sample prompt. 1. View the selected model. When you load a sample prompt, an appropriate model is selected for you. 1. Open the **Model Parameters**![Model parameters](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/settings-adjust.svg)\{: iih\} panel. The appropriate decoding and stopping criteria parameters are set automatically too. 1. Click **Generate** to submit the sample prompt to the model, and see the sample email output. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the generated output from a sample prompt. Now you are ready to customize the sample prompt output by selecting a different model and parameters. + + ![Generated output from a sample prompt](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-sample-prompt-output.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 5: Choose a foundation model + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 01:04. You can submit the same prompt to a different model. Follow these steps to choose a different foundation model: 1. Click **Model > View all foundation models**. 1. Click a model to learn more about a model, and see detail such as the model architecture, pretraining data, fine-tuning information, and performance against benchmarks. 1. Click **Back** to return to the list of models. 1. Select either the **flan-t5-xxl-11b** or **mt0-xxl-13b** foundation model, and click **Select model**. 1. Hover over the model output column and click the **X** icon to delete the previous output. 1. Click the same sample prompt, **Marketing email generation**, from the list. 1. Click **Generate** to generate output using the new model. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows generated output using a different model. You are now ready to adjust the model parameters. + + ![Generated output using a different model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-sample-prompt-output-new-model.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 6: Adjust model parameters + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 01:28. You can experiment with changing decoding or stopping criteria parameters. Follow these steps to adjust model parameters. Note: The model parameters vary based on the currently selected model.The following table defines the model parameters available for the *flan-t5-xxl-11b* foundation model. \| Model parameters \| Meaning \| \| ----- \| ----- \| \| Decoding \| Set decoding to *Greedy* to always select words with the highest probability. Set decoding to *Sampling* to customize the variability of word selection. \| \| Temperature \| Control the creativity of generated text. Higher values will lead to more randomly generated outputs. \| \| Top P (nucleus sampling) \| Set to `< 1.0` to use only the smallest set of most probable tokens with probabilities that add up to `top_p` or higher. \| \| Top K \| Set the number of highest probability vocabulary tokens to keep for top-k-filtering. Lower values make it less likely the model will go off topic. \| \| Random seed \| Control the random sampling of the generated tokens when sampling is enabled. Setting the random see to the same number for each generation ensures experimental repeatability. \| \| Repetition penalty \| Set a repetition penalty to counteract the model's tendency to repeat prompt text verbatim or get stuck in a loop. 1.00 indicates no penalty. \| \| Stop sequences \| Set stop sequences to one ore more strings to cause the text generation to stop if or when they are produced as part of the output. \| \| Min tokens \| Define the minimum number to tokens to generate. Stop sequences encountered prior to the minimum number of tokens being generated are ignored. \| \| Max tokens \| Define the maximum number to tokens to generate. \| + 1. Change the *Top K* parameter to `10` to make it less likely the model will go off topic. 1. Click **X** to delete the previous model output. 1. Click the same sample prompt from the list. 1. Click **Generate** to generate output using the new model parameters. 1. Click the **Session history** icon ![Session history icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-session-history-icon.png)\{: iih\} after submitting multiple prompts to view your session history. 1. Click any entry to work with a previous prompt, model specification, and parameter settings, and then click **Restore**. 1. Edit the prompt, change the model, or adjust decoding and stopping criteria parameters. 1. Click **Generate** to generate output using the updated information. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows generated output using different model parameters. You are now ready to save your work. + + ![Generated output using a different model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-session-history.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en#video-preview) + + + +> + + + + * Task 7: Save your work + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 02:15. You can save your work in three formats: \| Asset type \| Description \| \| ----- \| ----- \| \| Prompt template \| Save the current prompt only, without its history. \| \| Prompt session \| Save history and data from the current session. \| \| Notebook \| Save the current prompt as a notebook. \| + Follow these steps to save your work: 1. Click **Save work > Save as**. 1. Select **Prompt template**. 1. For the name, type `Sample prompts`\{: .cp\}. 1. Select the **View in project after saving** option. 1. Click **Save**. 1. On the project's *Assets* tab, click the **Sample prompts** asset to load that prompt in the Prompt Lab and get right back to work. 1. Click the **Saved prompts**![Saved prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/saved-prompts-icon.png)\{: iih\} to see saved prompt from your sandbox project. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the project's Assets tab with the prompt template asset: + + ![Project's Assets tab](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-saved-prompt-in-project.png)\{: width="100%" \} ![Checkmark icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} The following image shows saved prompt in the Prompt Lab: ![Saved prompt in Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-saved-prompt-in-prompt-lab.png)\{: biw\} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html?context=cdpaas&locale=en#video-preview) + + + +## Next steps ## + +You are now ready to: + + + + * Use the [Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) to prompt [foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html) and save your work to a project\. + * Try the [Prompt a foundation model with the retrieval\-augmented generation pattern tutorial](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html) + + + +## Additional resources ## + + + + * [Saving your work](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-save.html) + * [Python library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-python-lib.html) + * View more [videos](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html)\. + * Find sample data sets, projects, models, prompts, and notebooks in the Samples to gain hands\-on experience: + + ![Notebook icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook.svg)[Notebooks](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=notebook) that you can add to your project to get started analyzing data and building models. + + ![Project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/ibm-cloud--projects.svg)[Projects](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=project-template) that you can import containing notebooks, data sets, prompts, and other assets. + + ![Data set icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/data--set.svg)[Data sets](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=dataset) that you can add to your project to refine, analyze, and build models. + + ![Prompt icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/prompt.svg)[Prompts](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=example-prompt) that you can use in the Prompt Lab to prompt a foundation model. + + ![Model icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/model.svg)[Foundation models](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=foundation-model) that you can use in the Prompt Lab. + + + +**Parent topic:**[Quick start tutorials](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c07cd6df8c92edd0f2638573bfdce7bf18aa2eb0.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c07cd6df8c92edd0f2638573bfdce7bf18aa2eb0.md new file mode 100644 index 0000000..d8c7325 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c07cd6df8c92edd0f2638573bfdce7bf18aa2eb0.md @@ -0,0 +1,92 @@ +# Creating constraints and custom decisions with the Decision Optimization Modeling Assistant + +# Adding multi\-concept constraints and custom decisions: shift assignment # + +This Decision Optimization Modeling Assistant example shows you how to use multi\-concept iterations, the `associated` keyword in constraints, how to define your own custom decisions, and define logical constraints\. For illustration, a resource assignment problem, `ShiftAssignment`, is used and its completed model with data is provided in the **DO\-samples**\. + +## Procedure ## + +To download and open the sample: + + + +1. Download the ShiftAssignment\.zip file from the Model\_Builder subfolder in the **[DO\-samples](https://github.com/IBMDecisionOptimization/DO-Samples)**\. Select the relevant product and version subfolder\. +2. Open your project or create an empty project\. +3. On the Manage tab of your project, select the Services and integrations section and click Associate service\. Then select an existing Machine Learning service instance (or create a new one ) and click Associate\. When the service is associated, a success message is displayed, and you can then close the Associate service window\. +4. Select the Assets tab\. +5. Select New asset > Solve optimization problems in the Work with models section\. +6. Click Local file in the Solve optimization problems window that opens\. +7. Browse locally to find and choose the ShiftAssignment\.zip archive that you downloaded\. Click Open\. Alternatively use drag and drop\. +8. Associate a **Machine Learning service instance** with your project and reload the page\. +9. If you haven't already associated a Machine Learning service with your project, you must first select Add a Machine Learning service to select or create one before you choose a deployment space for your experiment\. +10. Click **Create**\.A Decision Optimization model is created with the same name as the sample\. +11. Open the scenario pane and select the `AssignmentWithOnCallDuties` scenario\. + + + + + +## Using multi\-concept iteration ## + +### Procedure ### + +To use multi\-concept iteration, follow these steps\. + + + +1. Click Build model in the sidebar to view your model formulation\.The model formulation shows the intent as being to assign employees to shifts, with its objectives and constraints\. +2. Expand the constraint `For each Employee-Day combination , number of associated Employee-Shift assignments is less than or equal to 1`\. + + + + + + + +## Defining custom decisions ## + +### Procedure ### + +To define custom decisions, follow these steps\. + + + +1. Click Build model to see the model formulation of the `AssignmentWithOnCallDuties` Scenario\.![Build model view showing Shift Assignment formulation](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/images/CloudStaffAssignRunModel.png) + + The custom decision `OnCallDuties` is used in the second objective. This objective ensures that the number of on-call duties are balanced over Employees. + + The constraint ![On call duty constraint](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/images/StaffAssignOncallDuty.jpg) ensures that the on-call duty requirements that are listed in the Day table are satisfied. + + The following steps show you how this custom decision `OnCallDuties` was defined. +2. Open the Settings pane and notice that the Visualize and edit decisions is set to `true` (or set it to true if it is set to the default false)\. + + This setting adds a Decisions tab to your Add to model window. + + ![Decisions tab of the Add to Model pane showing two intents](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/images/DecisionsTab.jpg) + + Here you can see `OnCallDuty` is specified as an assignment decision (to assign employees to on-call duties). Its two dimensions are defined with reference to the data tables `Day` and `Employee`. This means that your model will also assign on-call duties to employees. The Employee-Shift assignment decision is specified from the original intent. +3. Optional: Enter your own text to describe the `OnCallDuty` in the \[to be documented\] field\. +4. Optional: To create your own decision in the Decisions tab, click the enter name, type in a name and click enter\. A new decision (intent) is created with that name with some highlighted fields to be completed by using the drop\-down menus\. If you, for example, select assignment as the decision type, two dimensions are created\. As assignment involves assigning at least one thing to another, at least two dimensions must be defined\. Use select a table fields to define the dimensions\. + + + + + + + +## Using logical constraints ## + +### Procedure ### + +To use logical constraints: + + + +1. Look at the constraint ![Logical constraint suggestion](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/images/impliedconstraint.jpg)This constraint ensures that, for each employee and day combination, when no associated assignments exist (for example, the employee is on vacation on that day), that no on\-call duties are assigned to that employee on that day\. Note the use of the `if...then` keywords to define this logical constraint\. +2. Optional: Add other logical constraints to your model by searching in the suggestions\. + + + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c0cc7ae4029730b9846b6a05f4160643d3a8c393.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c0cc7ae4029730b9846b6a05f4160643d3a8c393.md new file mode 100644 index 0000000..e33a76a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c0cc7ae4029730b9846b6a05f4160643d3a8c393.md @@ -0,0 +1,9 @@ +# Adding comments and annotations to SPSS Modeler flows + + + +You may need to describe a flow to others in your organization\. To help you do this, you can attach explanatory comments to nodes, and model nuggets\. + +Others can then view these comments on\-screen, or you might even print out an image of the flow that includes the comments\. You can also add notes in the form of text annotations to nodes and model nuggets by means of the Annotations tab in a node's properties\. These annotations are visible only when the Annotations tab is open\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c0e0c248b3934e34883814b5f9ceb792d734042a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c0e0c248b3934e34883814b5f9ceb792d734042a.md new file mode 100644 index 0000000..0f71059 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c0e0c248b3934e34883814b5f9ceb792d734042a.md @@ -0,0 +1,92 @@ +# Compute resource options for Data Refinery in projects + +# Compute resource options for Data Refinery in projects # + +When you create or edit a Data Refinery flow in a project, you use the `Default Data Refinery XS` runtime environment\. However, when you run a Data Refinery flow in a job, you choose an environment template for the runtime environment\. The environment template specifies the type, size, and power of the hardware configuration, plus the software template\. + + + + * [Types of environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spark-dr-envs.html?context=cdpaas&locale=en#types) + * [Default environment templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spark-dr-envs.html?context=cdpaas&locale=en#default) + * [Compute usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spark-dr-envs.html?context=cdpaas&locale=en#compute) + * [Changing the runtime](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spark-dr-envs.html?context=cdpaas&locale=en#change-env) + * [Runtime logs for jobs](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spark-dr-envs.html?context=cdpaas&locale=en#logs) + + + +## Types of environments ## + +You can use these types of environments with Data Refinery: + + + + * `Default Data Refinery XS` runtime environment for running jobs on small data sets\. + * Spark environments for running jobs on larger data sets\. The Spark environments have [default environment templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spark-dr-envs.html?context=cdpaas&locale=en#default) so you can get started quickly\. Otherwise, you can [create custom environment templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-customize-env-definition.html) for Spark environments\. You should use a Spark & R environment only if you are working on a large data set\. If your data set is small, you should select the `Default Data Refinery XS` runtime\. The reason is that, although the SparkR cluster in a Spark & R environment is fast and powerful, it requires time to create, which is noticeable when you run a Data Refinery job on small data set\. + + + +## Default environment templates ## + +When you work in Data Refinery, the `Default Data Refinery XS` environment runtime is started and appears as an active runtime under **Tool runtimes** on the **Environments** page on the **Manage** tab of your project\. This runtime stops after an hour of inactivity in the Data Refinery interface\. However, you can stop it manually under **Tool runtimes** on the **Environments** page\. + +When you create a job to run a Data Refinery flow in a project, you select an environment template\. After a runtime for a job is started, it is listed as an active runtime under **Tool runtimes** on the **Environments** page on the **Manage** tab of your project\. The runtime for a job stops when the Data Refinery job stops running\. + +Compute usage is tracked by capacity unit hours (CUH)\. + + + +Preset environment templates available in projects for Data Refinery + +| Name | Hardware configuration | Capacity units per hour (CUH) | +| --------------------------- | ----------------------------------------------------------------------- | ----------------------------- | +| Default Data Refinery XS | 3 vCPU and 12 GB RAM | 1\.5 | +| Default Spark 3\.3 & R 4\.2 | 2 Executors each: 1 vCPU and 4 GB RAM;
Driver: 1 vCPU and 4 GB RAM | 1\.5 | + + + +All default environment templates for Data Refinery are HIPAA ready\. + +The Spark default environment templates are listed under **Templates** on the **Environments** page on the **Manage** tab of your project\. + +## Compute usage in projects ## + +You can monitor the Watson Studio CUH consumption on the **Resource usage** page on the **Manage** tab of your project\. + +## Changing the runtime ## + +You can't change the runtime for working in Data Refinery\. + +You can change the runtime for a Data Refinery flow job by editing the job template\. See [Creating jobs in Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html#create-jobs-in-dr)\. + +## Runtime logs for jobs ## + +To view the accumulated logs for a Data Refinery job: + + + +1. From the project's **Jobs** page, click the job that ran the Data Refinery flow for which you want to see logs\. +2. Click the job run\. You can view the log tail or download the complete log file\. + + + +## Next steps ## + + + + * [Creating your own environment template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-customize-env-definition.html) + * [Creating jobs in Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html#create-jobs-in-dr) + * [Stopping active runtimes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html#stop-active-runtimes) + + + +## Learn more ## + + + + * [Monitoring account resource usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html) + + + +**Parent topic:**[Choosing compute resources for tools](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c119b8d62c156451a8b8665e8969422803527df3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c119b8d62c156451a8b8665e8969422803527df3.md new file mode 100644 index 0000000..a7e8a7c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c119b8d62c156451a8b8665e8969422803527df3.md @@ -0,0 +1,73 @@ +# IBM Cloud Databases for MySQL connection + +# IBM Cloud Databases for MySQL connection # + +To access your data in IBM Cloud Databases for MySQL, create a connection asset for it\. + +IBM Cloud Databases for MySQL extends the capabilities of MySQL by offering an auto\-scaling deployment system managed on IBM Cloud that delivers high availability, redundancy, and automated backups\. IBM Cloud Databases for MySQL was formerly known as *IBM Cloud Compose for MySQL*\. + +## Create a connection to IBM Cloud Databases for MySQL ## + +To create the connection asset, you need these connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Username and password + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use IBM Cloud Databases for MySQL connections in the following workspaces and tools: + +**Projects** + + + + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## IBM Cloud Databases for MySQL setup ## + +[IBM Cloud Databases for MySQL](https://cloud.ibm.com/catalog/services/compose-for-mysql) + +## Restriction ## + +For SPSS Modeler, you can use this connection only to import data\. You cannot export data to this connection or to an IBM Cloud Databases for MySQL connected data asset\. + +## Learn more ## + +[IBM Cloud Databases for MySQL Help](https://help.compose.com/docs/mysql-compose-for-mysql#section-compose-for-mysql-for-all) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c11e8deedbabe64f4789061d10e55aea415fd51e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c11e8deedbabe64f4789061d10e55aea415fd51e.md new file mode 100644 index 0000000..b9fe486 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c11e8deedbabe64f4789061d10e55aea415fd51e.md @@ -0,0 +1,33 @@ +# Deleting deployment spaces + +# Deleting deployment spaces # + +Delete existing deployment spaces that you don't require anymore\. + +Important:Before you delete a deployment space, you must delete all the deployments that are associated with it\. Only a project admin can delete a deployment space\. For more information, see [Deployment space collaborator roles and permissions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/collaborator-permissions-wml.html)\. + +To remove a deployment space, follow these steps: + + + +1. From the navigation menu, click **Deployments**\. +2. In the deployments list, click the **Spaces** tab and find the deployment space that you want to delete\. +3. Hover over the deployment space, select the menu (![Menu icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/open-close-icon.png)) icon, and click **Delete**\. +4. In the confirmation dialog box, click **Delete**\. + + + +## Learn more ## + +To learn more about how to clean up a deployment space and delete it programmatically, refer to: + + + + * [Notebook on managing machine learning artifacts](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/e5e78be14e2260ccb4bcf8181d093d7b) + * [Notebook on managing spaces](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/e5e78be14e2260ccb4bcf8181d0967e3) + + + +**Parent topic:**[Deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c122739764b1ec75b64e1b740f493bad8616a9db.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c122739764b1ec75b64e1b740f493bad8616a9db.md new file mode 100644 index 0000000..6a1ac88 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c122739764b1ec75b64e1b740f493bad8616a9db.md @@ -0,0 +1,99 @@ +# Adding very large objects to a project's Cloud Object Storage + +# Adding very large objects to a project's Cloud Object Storage # + +The amount of data you can load to a project's Cloud Object Storage at any one time depends on where you load the data from\. If you are loading the data in the product UI, the limit is 5 GB\. To add larger objects to a project's Cloud Object Storage, you can use an API or an FTP client\. + + + + * [The Cloud Object Storage API](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/store-large-objs-in-cos.html?context=cdpaas&locale=en#api) + * An FTP client + * [The IBM Cloud Object Storage Python SDK](https://github.com/IBM/ibm-cos-sdk-python) (in case you can't use an FTP client) + + + +## Load data in multiple parts by using the Cloud Object Storage API ## + +With the Cloud Object Storage API, you can load data objects as large as 5 GB in a single PUT, and objects as large as 5 TB by loading the data into object storage as a set of parts which can be loaded independently in any order and in parallel\. After all of the parts have been loaded, they are presented as a single object in Cloud Object Storage\. + +You can load files with these formats and mime types in multiple parts: + + + + * application/xml + * application/pdf + * text/plain; charset=utf\-8 + + + +To load a data object in multiple parts: + + + +1. Initiate a [multipart load](https://cloud.ibm.com/docs/services/cloud-object-storage/basics?topic=cloud-object-storage-store-very-large-objects#initiate-a-multipart-upload): + + + + curl -X "POST" "https://(endpoint)/(bucket-name)/(object-name)?uploads" + -H "Authorization: bearer (token)" + +The values for `bucket-name` and `token` are on the project's **General** page on the **Manage** tab\. Click **Manage in IBM Cloud** on the Watson Studio for the endpoint value\. + + + +1. Load the parts by specifying arbitrary sequential part numbers and an UploadId for the object: + + + + curl -X "PUT" "https://(endpoint)/(bucket-name)/(object-name)?partNumber=(sequential-integer)&uploadId=(upload-id)" + -H "Authorization: bearer (token)" + -H "Content-Type: (content-type)" + +Replace`content-type` with `application/xml`, `application/pdf` or `text/plain; charset=utf-8`\. + + + +1. Complete the multipart load: + + + + curl -X "POST" "https://(endpoint)/(bucket-name)/(object-name)?uploadId=(upload-id)" + -H "Authorization: bearer (token)" + -H "Content-Type: text/plain; charset=utf-8" + -d \$' + + 1 + (etag) + + + 2 + (etag) + + + + +1. Add your file to the project as an asset\. From the **Assets** page of your project, click the **Upload asset to project** icon\. Then, from the **Files** pane, click the action menu and select **Add as data set**\. + + + +## Next steps ## + + + + * [Refining the data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + * [Analyzing the data and building models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-science.html) + + + +## Learn more ## + + + + * [Storing very large objects in Cloud Object Storage](https://cloud.ibm.com/docs/services/cloud-object-storage/basics?topic=cloud-object-storage-store-very-large-objects#store-very-large-objects) + * [Using curl to store very large objects](https://cloud.ibm.com/docs/services/cloud-object-storage/cli?topic=cloud-object-storage-using-curl-#using-curl-) + + + +**Parent topic:**[Adding connections to projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c1324a359a58b4d399c10bc59ae94e7e0723836d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c1324a359a58b4d399c10bc59ae94e7e0723836d.md new file mode 100644 index 0000000..561e770 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c1324a359a58b4d399c10bc59ae94e7e0723836d.md @@ -0,0 +1,11 @@ +# Integers (SPSS Modeler) + +# Integers # + +Integers are represented as a sequence of decimal digits\. + +Optionally, you can place a minus sign (−) before the integer to denote a negative number (for example, `1234`, `999`, −`77`)\. + +The CLEM language handles integers of arbitrary precision\. The maximum integer size depends on your platform\. If the values are too large to be displayed in an integer field, changing the field type to `Real` usually restores the value\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c143a9f5185d9303301630d3fc53b604d3dced2e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c143a9f5185d9303301630d3fc53b604d3dced2e.md new file mode 100644 index 0000000..0f52ee8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c143a9f5185d9303301630d3fc53b604d3dced2e.md @@ -0,0 +1,15 @@ +# Creating the flow (SPSS Modeler) + +# Creating the flow # + + + +1. Add a Data Asset node that points to broadband\_1\.csv\. +2. To simplify the model, use a Filter node to filter out the `Market_6` to `Market_85` fields and the `MONTH_` and `YEAR_` fields\. + + + +Figure 1\. Example flow to show Time Series modeling + +![Example flow to show Time Series modeling](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_bandwidth_forecast_build.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c1ca39ff2c12cc12697e62a37c7c52a256248af7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c1ca39ff2c12cc12697e62a37c7c52a256248af7.md new file mode 100644 index 0000000..0db708e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c1ca39ff2c12cc12697e62a37c7c52a256248af7.md @@ -0,0 +1,52 @@ +# questnode properties + +# questnode properties # + +![Quest node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/questnodeicon.png)The Quest node provides a binary classification method for building decision trees, designed to reduce the processing time required for large C&R Tree analyses while also reducing the tendency found in classification tree methods to favor inputs that allow more splits\. Input fields can be numeric ranges (continuous), but the target field must be categorical\. All splits are binary\. + + + +questnode properties + +Table 1\. questnode properties + +| `questnode` Properties | Values | Property description | +| ---------------------------------- | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `target` | *field* | Quest models require a single target and one or more input fields\. A frequency field can also be specified\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html) for more information\. | +| `continue_training_existing_model` | *flag* | | +| `objective` | `Standard``Boosting``Bagging``psm` | `psm` is used for very large datasets, and requires a server connection\. | +| `model_output_type` | `Single``InteractiveBuilder` | | +| `use_tree_directives` | *flag* | | +| `tree_directives` | *string* | | +| `use_max_depth` | `Default``Custom` | | +| `max_depth` | *integer* | Maximum tree depth, from 0 to 1000\. Used only if `use_max_depth = Custom`\. | +| `prune_tree` | *flag* | Prune tree to avoid overfitting\. | +| `use_std_err` | *flag* | Use maximum difference in risk (in Standard Errors)\. | +| `std_err_multiplier` | *number* | Maximum difference\. | +| `max_surrogates` | *number* | Maximum surrogates\. | +| `use_percentage` | *flag* | | +| `min_parent_records_pc` | *number* | | +| `min_child_records_pc` | *number* | | +| `min_parent_records_abs` | *number* | | +| `min_child_records_abs` | *number* | | +| `use_costs` | *flag* | | +| `costs` | *structured* | Structured property\. | +| `priors` | `Data``Equal``Custom` | | +| `custom_priors` | *structured* | Structured property\. | +| `adjust_priors` | *flag* | | +| `trails` | *number* | Number of component models for boosting or bagging\. | +| `set_ensemble_method` | `Voting``HighestProbability``HighestMeanProbability` | Default combining rule for categorical targets\. | +| `range_ensemble_method` | `Mean``Median` | Default combining rule for continuous targets\. | +| `large_boost` | *flag* | Apply boosting to very large data sets\. | +| `split_alpha` | *number* | Significance level for splitting\. | +| `train_pct` | *number* | Overfit prevention set\. | +| `set_random_seed` | *flag* | Replicate results option\. | +| `seed` | *number* | | +| `calculate_variable_importance` | *flag* | | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `adjusted_propensity_partition` | `Test``Validation` | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c2185a8c9156c6b38d76bd3fd29a833d96a5762b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c2185a8c9156c6b38d76bd3fd29a833d96a5762b.md new file mode 100644 index 0000000..1bbf8f8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c2185a8c9156c6b38d76bd3fd29a833d96a5762b.md @@ -0,0 +1,48 @@ +# Dates (SPSS Modeler) + +# Dates # + +Date calculations are based on a "baseline" date, which is specified in the flow properties\. The default baseline date is 1 January 1900\. + +The CLEM language supports the following date formats\. + + + +CLEM language date formats + +Table 1\. CLEM language date formats + +| Format | Examples | +| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DDMMYY` | `150163` | +| `MMDDYY` | `011563` | +| `YYMMDD` | `630115` | +| `YYYYMMDD` | `19630115` | +| `YYYYDDD` | Four\-digit year followed by a three\-digit number representing the day of the year—for example, `2000032` represents the 32nd day of 2000, or 1 February 2000\. | +| `DAY` | Day of the week in the current locale—for example, `Monday`, `Tuesday`, \.\.\., in English\. | +| `MONTH` | Month in the current locale—for example, `January`, `February`, …\. | +| `DD/MM/YY` | `15/01/63` | +| `DD/MM/YYYY` | `15/01/1963` | +| `MM/DD/YY` | `01/15/63` | +| `MM/DD/YYYY` | `01/15/1963` | +| `DD-MM-YY` | `15-01-63` | +| `DD-MM-YYYY` | `15-01-1963` | +| `MM-DD-YY` | `01-15-63` | +| `MM-DD-YYYY` | `01-15-1963` | +| `DD.MM.YY` | `15.01.63` | +| `DD.MM.YYYY` | `15.01.1963` | +| `MM.DD.YY` | `01.15.63` | +| `MM.DD.YYYY` | `01.15.1963` | +| `DD-MON-YY` | `15-JAN-63, 15-jan-63, 15-Jan-63` | +| `DD/MON/YY` | `15/JAN/63, 15/jan/63, 15/Jan/63` | +| `DD.MON.YY` | `15.JAN.63, 15.jan.63, 15.Jan.63` | +| `DD-MON-YYYY` | `15-JAN-1963, 15-jan-1963, 15-Jan-1963` | +| `DD/MON/YYYY` | `15/JAN/1963, 15/jan/1963, 15/Jan/1963` | +| `DD.MON.YYYY` | `15.JAN.1963, 15.jan.1963, 15.Jan.1963` | +| `MON YYYY` | `Jan 2004` | +| `q Q YYYY` | Date represented as a digit (1–4) representing the quarter followed by the letter *Q* and a four\-digit year—for example, 25 December 2004 would be represented as `4 Q 2004`\. | +| `ww WK YYYY` | Two\-digit number representing the week of the year followed by the letters *WK* and then a four\-digit year\. The week of the year is calculated assuming that the first day of the week is Monday and there is at least one day in the first week\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c24646ed4724e2a2d856392dda9c1b9b05145e11.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c24646ed4724e2a2d856392dda9c1b9b05145e11.md new file mode 100644 index 0000000..e743787 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c24646ed4724e2a2d856392dda9c1b9b05145e11.md @@ -0,0 +1,28 @@ +# simgennode properties + +# simgennode properties # + +![Sim Gen node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/simgennodeicon.png) The Simulation Generate (Sim Gen) node provides an easy way to generate simulated data—either from scratch using user specified statistical distributions or automatically using the distributions obtained from running a Simulation Fitting (Sim Fit) node on existing historical data\. This is useful when you want to evaluate the outcome of a predictive model in the presence of uncertainty in the model inputs\. + + + +simgennode properties + +Table 1\. simgennode properties + +| `simgennode` properties | Data type | Property description | +| ------------------------ | ------------------- | ----------------------------------------------------- | +| `fields` | Structured property | See example | +| `correlations` | Structured property | See example | +| `keep_min_max_setting` | *boolean* | | +| `refit_correlations` | *boolean* | | +| `max_cases` | *integer* | Minimum value is 1000, maximum value is 2,147,483,647 | +| `create_iteration_field` | *boolean* | | +| `iteration_field_name` | *string* | | +| `replicate_results` | *boolean* | | +| `random_seed` | *integer* | | +| `parameter_xml` | *string* | Returns the parameter Xml as a string | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c2da4bde14d0a2da1e0e2d795e7dc7469f422db9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c2da4bde14d0a2da1e0e2d795e7dc7469f422db9.md new file mode 100644 index 0000000..e71b896 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c2da4bde14d0a2da1e0e2d795e7dc7469f422db9.md @@ -0,0 +1,27 @@ +# {{ document.title.text }} + +# Output bias # + +![icon for fairness risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-fairness.svg)Risks associated with outputFairnessNew + +### Description ### + +Generated model content might unfairly represent certain groups or individuals\. For example, a large language model might unfairly stigmatize or stereotype specific persons or groups\. + +### Why is output bias a concern for foundation models? ### + +Bias can harm users of the AI models and magnify existing exclusive behaviors\. Business entities can face reputational harms and other consequences\. + +Example + +#### Biased Generated Images #### + +Lensa AI is a mobile app with generative features trained on Stable Diffusion that can generate “Magic Avatars” based on images users upload of themselves\. According to the source report, some users discovered that generated avatars are sexualized and racialized\. + +Sources: + +[Business Insider, January 2023](https://www.businessinsider.com/lensa-ai-raises-serious-concerns-sexualization-art-theft-data-2023-1) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c2f1ff7794524db18ee5fadfaa7232d0a94f8b4c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c2f1ff7794524db18ee5fadfaa7232d0a94f8b4c.md new file mode 100644 index 0000000..bb12669 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c2f1ff7794524db18ee5fadfaa7232d0a94f8b4c.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Data aquisition # + +![icon for data laws risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-data-laws.svg)Risks associated with inputTraining and tuning phaseData lawsTraditional + +### Description ### + +Laws and other regulations might limit the collection of certain types of data for specific AI use cases\. + +### Why is data aquisition a concern for foundation models? ### + +Failing to comply with data usage laws might result in fines and other legal consequences\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c324305e8f756140b7b96492d73d35bb32794119.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c324305e8f756140b7b96492d73d35bb32794119.md new file mode 100644 index 0000000..0bcebff --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c324305e8f756140b7b96492d73d35bb32794119.md @@ -0,0 +1,22 @@ +# Marking a project as sensitive + +# Marking a project as sensitive # + +When you create a project, you can mark the project as sensitive to prevent project collaborators from moving sensitive data out of the project\. + +Marking a project as sensitive prevents collaborators of a project, including administrators, from downloading or exporting data assets, connections, or connected data from a project\. These sensitive assets cannot be added to a catalog or promoted to a space either\. Project collaborators with **Admin** or **Editor** role can export assets like notebooks or models from the project\. + +When users open a project that is marked as sensitive, a notification is displayed stating that no data assets can be downloaded or exported from the project\. + +## Restrictions ## + + + + * You cannot mark a project as sensitive after the project is created\. + * You cannot mark projects that use Git integration as sensitive\. + + + +**Parent topic:**[Administering projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/admin-project.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c32fe380cf3083b6d85554063b5acb153fc1c8be.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c32fe380cf3083b6d85554063b5acb153fc1c8be.md new file mode 100644 index 0000000..b814d8f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c32fe380cf3083b6d85554063b5acb153fc1c8be.md @@ -0,0 +1,262 @@ +# Quick start tutorials + +# Quick start tutorials # + +Take quick start tutorials to learn how to perform specific tasks, such as refine data or build a model\. These tutorials help you quickly learn how to do a specific task or set of related tasks\. + +The quick start tutorials are categorized by task: + + + + * [Preparing data](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html?context=cdpaas&locale=en#prepare) + * [Analyzing and visualizing data](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html?context=cdpaas&locale=en#analyze) + * [Building, deploying, and trusting models](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html?context=cdpaas&locale=en#build) + * [Working with foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html?context=cdpaas&locale=en#prompt) + + + +Each tutorial requires one or more service instances\. Some services are included in multiple tutorials\. The tutorials are grouped by task\. You can start with any task\. Each of these tutorials provides a description of the tool, a video, the instructions, and additional learning resources\. + +The tags for each tutorial describe the level of expertise ( + +Beginner + +, + +Intermediate + +, or + +Advanced + +), and the amount of coding required ( + +No code + +, + +Low code + +, or + +All code + +)\. + +After completing these tutorials, see the [Other learning resources](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html?context=cdpaas&locale=en#resources) section to continue your learning\. + +## Preparing data ## + +To get started with preparing, transforming, and integrating data, understand the overall workflow, choose a tutorial, and check out other learning resources for working on the platform\. + +Your data preparation workflow has these basic steps: + + + +1. Create a project\. +2. If necessary, create the service instance that provides the tool you want to use and associate it with the project\. +3. Add data to your project\. You can add data files from your local system, data from a remote data source that you connect to, data from a catalog, or sample data\. +4. Choose a tool to analyze your data\. Each of the tutorials describes a tool\. +5. Run or schedule a job to prepare your data\. + + + +### Tutorials for preparing data ### + +Each of these tutorials provides a description of the tool, a video, the instructions, and additional learning resources: + + + +| Tutorial | Description | Expertise for tutorial | +| ------------------------------------------------ | ----------------------------------------------------------------- | ----------------------------------------------------------------------- | +| [Refine and visualize data with Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html) | Prepare and visualize tabular data with a graphical flow editor\. | Select operations to manipulate data\.

Beginner

No code | +| [Generate synthetic tabular data](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-generate-data.html) | Generate synthetic tabular data using a graphical flow editor\. | Select operations to generate data\.

Beginner

No code | + + + +## Analyzing and visualizing data ## + +To get started with analyzing and visualizing data, understand the overall workflow, choose a tutorial, and check out other learning resources for working with other tools\. + +Your analyzing and visualizing data workflow has these basic steps: + + + +1. Create a project\. +2. If necessary, create the service instance that provides the tool you want to use and associate it with the project\. +3. Add data to your project\. You can add data files from your local system, data from a remote data source that you connect to, data from a catalog, or sample data\. +4. Choose a tool to analyze your data\. Each of the tutorials describes a tool\. + + + +### Tutorials for analyzing and visualizing data ### + +Each of these tutorials provides a description of the tool, a video, the instructions, and additional learning resources: + + + +| Tutorial | Description | Expertise for tutorial | +| ------------------------------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------ | +| [Analyze data in a Jupyter notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html) | Load data, run, and share a notebook\. | Understand generated Python code\.

Intermediate

All code | +| [Refine and visualize data with Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html) | Prepare and visualize tabular data with a graphical flow editor\. | Select operations to manipulate data\.

Beginner

No code | + + + +## Building, deploying, and trusting models ## + +To get started with building, deploying, and trusting models, understand the overall workflow, choose a tutorial, and check out other learning resources for working on the platform\. + +The model workflow has three main steps: build a model asset, deploy the model, and build trust in the model\. + +![Overview of model workflow](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/ml-engineer-overview-wx.svg) + +### Tutorials for building, deploying, and trusting models ### + +Each tutorial provides a description of the tool, a video, the instructions, and additional learning resources: + + + +| Tutorial | Description | Expertise for tutorial | +| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | +| [Build and deploy a machine learning model with AutoAI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html) | Automatically build model candidates with the AutoAI tool\. | Build, deploy, and test a model without coding\.

Beginner

No code | +| [Build and deploy a machine learning model in a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html) | Build a model by updating and running a notebook that uses Python code and the Watson Machine Learning APIs\. | Build, deploy, and test a scikit\-learn model that uses Python code\.

Intermediate

All code | +| [Build and deploy a machine learning model with SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html) | Build a C5\.0 model that uses the SPSS Modeler tool\. | Drop data and operation nodes on a canvas and select properties\.

Beginner

No code | +| [Build and deploy a Decision Optimization model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html) | Automatically build scenarios with the Modeling Assistant\. | Solve and explore scenarios, then deploy and test a model without coding\.

Intermediate

No code | +| [Automate the lifecycle for a model with pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-pipeline.html) | Create and run a pipeline to automate building and deploying a machine learning model\. | Drop operation nodes on a canvas and select properties\.

Beginner

No code | + + + +## Prompting foundation models ## + +To get started with prompting foundation models, understand the overall workflow, choose a tutorial, and check out other learning resources for working on the platform\. + +Your prompt engineering workflow has these basic steps: + + + +1. Create a project\. +2. If necessary, create the service instance that provides the tool you want to use and associate it with the project\. +3. Choose a tool to prompt foundation models\. Each of the tutorials describes a tool\. +4. Save and share your best prompts\. + + + +### Tutorials for working with foundation models ### + +Each tutorial provides a description of the tool, a video, the instructions, and additional learning resources: + + + +| Tutorial | Description | Expertise for tutorial | +| -------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| [Prompt a foundation model using Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-prompt-lab.html) | Experiment with prompting different foundation models, explore sample prompts, and save and share your best prompts\. | Prompt a model using Prompt Lab without coding\.

Beginner

No code | +| [Prompt a foundation model with the retrieval\-augmented generation pattern](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-fm-notebook.html) | Prompt a foundation model by leveraging information in a knowledge base\. | Use the retrieval\-augmented generation pattern in a Jupyter notebook that uses Python code\.

Intermediate

All code | +| [Tune a foundation model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-tuning-studio.html) | Tune a foundation model to enhance model performance\. | Use the Tuning Studio to tune a model without coding\.

Intermediate

No code | +| [Evaluate and track a prompt template](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-evaluate-prompt.html) | Evaluate a prompt template to measure the performance of foundation model and track the prompt template through its lifecycle\. | Use the evaluation tool and an AI use case to track the prompt template\.

Beginner

No code | + + + +## Other learning resources ## + +### Guided tutorials ### + +Access the [Build an AI model sample project](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/c6008d167803ef95c1b37da931604cac) to follow a guided tutorial in the Samples\. After you create the sample project, the readme provides instructions: + + + + * Choose **Explore and prepare data** to remove anomalies in the data with Data Refinery\. + * Choose **Build a model in a notebook** to build a model with Python code\. + * Choose **Build and deploy a model** to automate building a model with the AutoAI tool\. + + + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + + + + * Watch a preview of the guided tutorial video series + + + +### Documentation ### + +#### General #### + + + + * [Projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html) + * [Adding data to your project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html) + + + +#### Preparing data #### + + + + * [Refining data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + + + +[Synthetic data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/synthetic_data_overview_sd.html) + +#### Analyzing and visualizing data #### + + + + * [Notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebooks-and-scripts.html) + + + +#### Building, deploying, and trusting models #### + + + + * [Analyzing data and building models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-science.html) + * [Deploying and managing models](https://dataplatform.cloud.ibm.com/docs/content/wsj/wmls/wmls-deploy-overview.html) + + + +### Prompting a foundation model ### + + + + * [Retrieval\-augmented generation pattern](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-rag.html) + * [Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) + * [Foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html) + + + +### Videos ### + + + + * [A comprehensive set of videos](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html) that show many common tasks in watsonx\. + + + +### Samples ### + +Find sample data sets, projects, models, prompts, and notebooks in the Samples area to gain hands\-on experience: + +![Notebook icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook.svg)[Notebooks](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=notebook) that you can add to your project to get started analyzing data and building models\. + +![Project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/ibm-cloud--projects.svg)[Projects](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=project-template) that you can import containing notebooks, data sets, prompts, and other assets\. + +![Data set icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/data--set.svg)[Data sets](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=dataset) that you can add to your project to refine, analyze, and build models\. + +![Prompt icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/prompt.svg)[Prompts](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=example-prompt) that you can use in the Prompt Lab to prompt a foundation model\. + +![Model icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/model.svg)[Foundation models](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=foundation-model) that you can use in the Prompt Lab\. + +### Training ### + + + + * [Watson Studio Methodology](https://www.ibm.com/training/course/W7067G) is an IBM Training e\-Learning course that provides an in\-depth look at Watson Studio\. + * [Take control of your data with Watson Studio](https://developer.ibm.com/learningpaths/get-started-watson-studio/) is a learning path that consists of step\-by\-step tutorials that explain the process of working with data using Watson Studio\. + + + +**Parent topic:**[Getting started](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-wdp.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c3552c5e0f334c8bc3557960821dc5ef931851a1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c3552c5e0f334c8bc3557960821dc5ef931851a1.md new file mode 100644 index 0000000..b1210fc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c3552c5e0f334c8bc3557960821dc5ef931851a1.md @@ -0,0 +1,126 @@ +# Activities for assets + +# Activities for assets # + +For some asset types, you can see the activities of each asset in projects\. The activities graph shows the history of the events that are performed on the asset for some tools\. An event is an action that changes or copies the asset\. For example, editing the asset description is an event, but viewing the asset is not an event\. + +## Requirements and restrictions ## + +You can view the activities of assets under the following circumstances\. + + + + * **Workspaces** + You can view the asset activities in projects. + + + + + + * **Limitations** + Activities have the following limitations: + + + + * Activities graphs are currently available only for Watson Machine Learning models and data assets. + * Activities graphs do not appear in Microsoft Internet Explorer 11 browsers. + + + + + +## Activities events ## + +To view activities for an asset in a project, click the asset name and click ![Activities icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/activities.svg)\. The activities panel shows a timeline of events\. Summary information about the asset shows where asset was created, what the last event for it was, and when the last event happened\. The first event for each asset is its creation\. + +Activities events can describe actions that are applicable to all asset types or actions that are specific to an asset type: + + + + * [General events](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/asset-activities.html?context=cdpaas&locale=en#general) + * [Events specific to Watson Machine Learning models](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/asset-activities.html?context=cdpaas&locale=en#wml) + * [Events specific to data assets from files and connected data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/asset-activities.html?context=cdpaas&locale=en#data) + + + +You can see this type of information about each event: + + + + * **Where:** In which catalog or project the event occurred\. + * **Who:** The name of the user who performed the action, unless the action was automated\. Automated actions generate events, but don't show usernames\. + * **What:** A description of the action\. Some events show details about the original and updated values\. + * **When:** The date and time of the event\. + + + +Activities also track relationships between assets\. In the activities panel, the creation of a new asset based on the original asset is shown at the top of the list\. Click **See details** to view asset details\. + +### General events ### + +You can see these general events: + + + + * Name updated + * Description updated + * Tags updated + + + +### Events specific to Watson Machine Learning models ### + +Activities tracking is available for all Watson Machine Learning service plans, however, you wouldn't see events for actions that are not available with your plan\. + +In addition to general events, you can see these events that are specific to models: + + + + * Model created + * Model deployed + * Model re\-evaluated + * Model retrained + * Set as active model + + + +A model asset shows this information in the **Created from** field, depending on how it was created: + + + + * The name of the associated data asset + * The name of the associated connection asset + * The project name where it was created + + + +### Events specific to data assets from files and connected data assets ### + +In addition to general events, you can see these events that are specific to data assets from files and connected data assets: + + + + * Added to project from a Data Refinery flow + * Added to a project from a file + * Data classes updated + * Schema updated by a Data Refinery flow + * Profile created + * Profile updated + * Profile deleted + * Downloaded + + + +A data asset shows this information in the **Created from** field, depending on how it was created: + + + + * The name of the Data Refinery flow that created it + * Its associated connection name + * The project name where it was created or came from + + + +**Parent topic:**[Finding and viewing an asset in a catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/catalog/view-asset.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c41c78f27bb2f48542141ea85eda7ad333e3fd0b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c41c78f27bb2f48542141ea85eda7ad333e3fd0b.md new file mode 100644 index 0000000..8507633 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c41c78f27bb2f48542141ea85eda7ad333e3fd0b.md @@ -0,0 +1,18 @@ +# Making the offers to customers (SPSS Modeler) + +# Making offers to customers (self\-learning) # + +The Self\-Learning Response Model (SLRM) node generates and enables the updating of a model that allows you to predict which offers are most appropriate for customers and the probability of the offers being accepted\. These sorts of models are most beneficial in customer relationship management, such as marketing applications or call centers\. + +This example is based on a fictional banking company\. The marketing department wants to achieve more profitable results in future campaigns by matching the appropriate offer of financial services to each customer\. Specifically, the example uses a Self\-Learning Response model to identify the characteristics of customers who are most likely to respond favorably based on previous offers and responses and to promote the best current offer based on the results\. + +This example uses the flow named Making Offers to Customers \- Self\-Learning, available in the example project \. The data files are pm\_customer\_train1\.csv, pm\_customer\_train2\.csv, and pm\_customer\_train3\.csv\. + + + +1. Open the Example Project\. +2. Scroll down to the Modeler flows section, click View all, and select the Making Offers to Customers \- Self\-Learning flow\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c471b8b14614c985391115ec1ed53e0b56d2e27e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c471b8b14614c985391115ec1ed53e0b56d2e27e.md new file mode 100644 index 0000000..097cc80 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c471b8b14614c985391115ec1ed53e0b56d2e27e.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Data poisoning # + +![icon for robustness risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-robustness.svg)Risks associated with inputTraining and tuning phaseRobustnessTraditional + +### Description ### + +Data poisoning is a type of adversarial attack where an adversary or malicious insider injects intentionally corrupted, false, misleading, or incorrect samples into the training or fine\-tuning dataset\. + +### Why is data poisoning a concern for foundation models? ### + +Poisoning data can make the model sensitive to a malicious data pattern and produce the adversary’s desired output\. It can create a security risk where adversaries can force model behavior for their own benefit\. In addition to producing unintended and potentially malicious results, a model misalignment from data poisoning can result in business entities facing legal consequences or reputational harms\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c4773ef8b0935e8de084c1a6285efe11e2a5f80a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c4773ef8b0935e8de084c1a6285efe11e2a5f80a.md new file mode 100644 index 0000000..96425a6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c4773ef8b0935e8de084c1a6285efe11e2a5f80a.md @@ -0,0 +1,56 @@ +# Generating and comparing models (SPSS Modeler) + +# Generating and comparing models # + + + +1. Attach an Auto Classifier node, open its BUILD OPTIONS properties, and select Overall accuracy as the metric used to rank models\. +2. Set the Number of models to use to 3\. This means that the three best models will be built when you run the node\. + + Figure 1. Auto Classifier node, build options + + ![Auto Classifier node, build options](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autoflag_models_props.png) + + Under the EXPERT options, you can choose from many different modeling algorithms. +3. Deselect the Discriminant and SVM model types\. (These models take longer to train on this data, so deselecting them will speed up the example\. If you don't mind waiting, feel free to leave them selected\.) + + Because you set Number of models to use to 3 under BUILD OPTIONS, the node will calculate the accuracy of the remaining algorithms and generate a single model nugget containing the three most accurate. + + Figure 2. Auto Classifier node, expert options + + ![Auto Classifier node, expert options](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autoflag_models_buildopts.png) +4. Under the ENSEMBLE options, select Confidence\-weighted voting for the ensemble method\. This determines how a single aggregated score is produced for each record\. + + With simple voting, if two out of three models predict *yes*, then *yes* wins by a vote of 2 to 1. In the case of confidence-weighted voting, the votes are weighted based on the confidence value for each prediction. Thus, if one model predicts *no* with a higher confidence than the two *yes* predictions combined, then *no* wins. + + Figure 3. Auto Classifier node, ensemble options + + ![Auto Classifier node, ensemble options](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autoflag_models_ensemble.png) +5. Run the flow\. After a few minutes, the generated model nugget is built and placed on the canvas, and results are added to the Outputs panel\. You can view the model nugget, or save or deploy it in a number of other ways\. +6. Right\-click the model nugget and select View Model\. You'll see details about each of the models created during the run\. (In a real situation, in which hundreds of models may be created on a large dataset, this could take many hours\.) + + If you want to explore any of the individual models further, you can click their links in the Estimator column to drill down and browse the individual model results. + + Figure 4. Auto Classifier results + + ![Auto Classifier results](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autoflag_models_view.png) + + By default, models are sorted based on overall accuracy, because this was the measure you selected in the Auto Classifier node properties. The XGBoost Tree model ranks best by this measure, but the C5.0 and C&RT models are nearly as accurate. + + Based on these results, you decide to use all three of these most accurate models. By combining predictions from multiple models, limitations in individual models may be avoided, resulting in a higher overall accuracy. +7. In the USE column, select the three models\. Return to the flow\. +8. Attach an Analysis output node after the model nugget\. Right\-click the Analysis node and choose Run to run the flow\. + + Figure 5. Auto Classifier example flow + + ![Auto Classifier example flow](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autoflag.png) + + The aggregated score generated by the ensembled model is shown in a field named `$XF-response`. When measured against the training data, the predicted value matches the actual response (as recorded in the original `response` field) with an overall accuracy of 92.77%. While not quite as accurate as the best of the three individual models in this case (92.82% for C5.0), the difference is too small to be meaningful. In general terms, an ensembled model will typically be more likely to perform well when applied to datasets other than the training data. + + Figure 6. Analysis of the three ensembled models + + ![Analysis of the three ensembled models](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autoflag_models_xf.png) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c48e63f001dfae875e1c82b5d163b7a2c9961ce2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c48e63f001dfae875e1c82b5d163b7a2c9961ce2.md new file mode 100644 index 0000000..753366f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c48e63f001dfae875e1c82b5d163b7a2c9961ce2.md @@ -0,0 +1,141 @@ +# Applying homomorphic encryption for security and privacy + +# Applying homomorphic encryption for security and privacy # + +Federated learning supports homomorphic encryption as an added measure of security for federated training data\. Homomorphic encryption is a form of public key cryptography that enables computations on the encrypted data without first decrypting it, meaning the data can be used in modeling without exposing it to the risk of discovery\. + +With homomorphic encryption, the results of the computations remain in encrypted form and when decrypted, result in an output that is the same as the output produced with computations performed on unencrypted data\. It uses a public key for encryption and a private key for decryption\. + +## How it works with Federated Learning ## + +Homomorphic encryption is an optional encryption method to add additional security and privacy to a Federated Learning experiment\. When homomorphic encryption is applied in a Federated Learning experiment, the parties send their homomorphically encrypted model updates to the aggregator\. The aggregator does not have the private key and can only see the homomorphically encrypted model updates\. For example, the aggregator cannot reverse engineer the model updates to discover information on the parties' training data\. The aggregator fuses the model updates in their encrypted form which results in an encrypted aggregated model\. Then the aggregator sends the encrypted aggregated model to the participating parties who can use their private key for decryption and continue with the next round of training\. Only the participating parties can decrypt model data\. + +## Supported frameworks and fusion methods ## + +Fully Homomorphic Encryption (FHE) supports the simple average fusion method for these model frameworks: + + + + * Tensorflow + * Pytorch + * Scikit\-learn classification + * Scikit\-learn regression + + + +## Before you begin ## + +To get started with using homomorphic encryption, ensure that your experiment meets the following requirements: + + + + * The hardware spec must be minimum *small*\. Depending on the level of encryption that you apply, you might need a larger hardware spec to accommodate the resource consumption caused by more powerful data encryption\. See the encryption level table in **Configuring the aggregator**\.\- The software spec is `fl-rt22.2-py3.10`\. + * FHE is supported in Python client version 1\.0\.263 or later\. All parties must use the same Python client version\. + + + +### Requirements for the parties ### + +Each party must: + + + + * Run on a Linux x86 system\. + * Configure with a root certificate that identifies a certificate authority that is uniform to all parties\. + * Configure an RSA public and private key pair with attributes described in the following table\. + * Configure with a certificate of the party issued by the certificate authority\. The RSA public key must be included in the party's certificate\. + + + +Note: You can also choose to use self\-signed certificates\. + +Homomorphic public and private encryption keys are generated and distributed automatically and securely among the parties for each experiment\. Only the parties participating in an experiment have access to the private key generated for the experiment\. To support the automatic generation and distribution mechanism, the parties must be configured with the certificates and RSA keys specified previously\. + +### RSA key requirements ### + + + +Table 1\. RSA Key Requirements + +| Attribute | Requirement | +| --------------- | ----------------------------------------------------- | +| Key size | 4096 bit | +| Public exponent | 65537 | +| Password | None | +| Hash algorithm | SHA256 | +| File format | The key and certificate files must be in "PEM" format | + + + +## Configuring the aggregator (admin) ## + +As you create a Federated Learning experiment, follow these steps: + + + +1. In the **Configure** tab, toggle "Enable homomorphic encryption"\. +2. Choose *small* or above for *Hardware specification*\. Depending on the level of encryption that you apply, you might need a larger hardware spec to accommodate the resource consumption for homomorphic encryption\. +3. Ensure that you upload an unencrypted initial model when selecting the model file for *Model specification*\. +4. Select "Simple average (encrypted)" for *Fusion method*\. Click **Next**\. +5. Check *Show advanced* in the **Define hyperparameters** tab\. +6. Select the level of encryption in *Encryption level*\. + Higher encryption levels increase security and precision, and require higher resource consumption (e.g. computation, memory, network bandwidth). The default is encryption level 1. + See the following table for description of the encryption levels: + + + + + +Increasing encryption level and security and precision + +| Level | Security | Precision | +| ----- | --------- | --------- | +| 1 | High | Good | +| 2 | High | High | +| 3 | Very high | Good | +| 4 | Very high | High | + + + +*Security* is the strength of the encryption, typically measured by the number of operations that an attacker must perform to break the encryption\. +*Precision* is the precision of the encryption system's outcomes\. Higher precision levels reduce loss of accuracy of the model due to the encryption\. + +## Connecting to the aggregator (party) ## + +The following steps only show the configuration needed for homomorphic encryption\. For a step\-by\-step tutorial of using homomorphic encryption in Federated Learning, see [FHE sample](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-fhe-sample.html)\. + +To see how to create a general end\-to\-end party connector script, see [Connect to the aggregator (party)](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-conn.html)\. + + + +1. Install the Python client with FHE with the following command: + `pip install 'ibm_watson_machine_learning[fl-rt23.1-py3.10,fl-crypto]'` +2. Configure the party as follows: + + party_config = { + "local_training": { + "info": { + "crypto": { + "key_manager": { + "key_mgr_info": { + "distribution": { + "ca_cert_file_path": "path of the root certificate file identifying the certificate authority", + "my_cert_file_path": "path of the certificate file of the party issued by the certificate authority", + "asym_key_file_path": "path of the RSA key file of the party" + } + } + } + } + } + } + } + } +3. Run the party connector script after configuration\. + + + +### Additional resources ### + +**Parent topic:**[Federated Learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fed-lea.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c4bb814768f5d91d2c6aa90b34fddd944aa1eb91.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c4bb814768f5d91d2c6aa90b34fddd944aa1eb91.md new file mode 100644 index 0000000..a63d8a0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c4bb814768f5d91d2c6aa90b34fddd944aa1eb91.md @@ -0,0 +1,5 @@ +# Watson Studio on IBM watsonx + +# Watson Studio on IBM watsonx # + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c4e83640891ea5d02eae76027d05fdefe2c4effe.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c4e83640891ea5d02eae76027d05fdefe2c4effe.md new file mode 100644 index 0000000..70d6364 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c4e83640891ea5d02eae76027d05fdefe2c4effe.md @@ -0,0 +1,86 @@ +# Managing your settings + +# Managing your settings # + +You can manage your profile, services, integrations, and notifications while logged in to IBM watsonx\. + + + + * [Manage your profile](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/personal-settings.html?context=cdpaas&locale=en#profile) + * [Manage user API keys](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-apikeys.html) + * [Switch accounts](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/personal-settings.html?context=cdpaas&locale=en#account) + * [Manage your services](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_console.html) + * [Manage your integrations](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/personal-settings.html?context=cdpaas&locale=en#integrations) + * [Manage your notification settings](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/personal-settings.html?context=cdpaas&locale=en#bell) + * [View and personalize your project summary](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/personal-settings.html?context=cdpaas&locale=en#project-summary) + + + +## Manage your profile ## + +You can manage your profile on the **Profile** page by clicking your avatar in the banner and then clicking **Profile and settings**\. + +You can make these changes to your profile: + + + + * Add or change your avatar photo\. + * Change your IBMid or password\. Do not change your IBMid (email address) after you register with the IBM watsonx platform\. The IBMid (email address) uniquely identifies users in the platform and also authorizes access to various IBM watsonx resources, including projects, spaces, models, and catalogs\. If you change your IBMid (email address) in your IBM Cloud profile after you have registered with IBM watsonx, you will lose access to the platform and associated resources\. + * Set your service locations filters by resource group and location\. The filters apply throughout the platform\. For example, the **Service instances** page that you access through the **Services** menu shows only the filtered services\. Ensure you have selected the region where Watson Studio is located, for example, **Dallas**, as well as the **Global** location\. **Global** is required to provide access to your IBM Cloud Object Storage instance\. + * Access your IBM Cloud account\. + * [Leave IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/stopapps.html#deactivate)\. + + + +## Switch accounts ## + +If you are added to a shared IBM Cloud account that is different from your individual account, you can switch your account by selecting a different account from the account list in the menu bar, next to your avatar\. + +## Manage your integrations ## + +To set up or modify an integration to GitHub: + + + +1. Click your avatar in the banner\. +2. Click **Profile and settings**\. +3. Click the **Git integrations** tab\. + + + +See [Publish notebooks on GitHub](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/github-integration.html)\. + +## Manage your notification settings ## + +To see your notification settings, click the notification bell icon and then click the settings icon\. + +You can make these changes to your notification settings: + + + + * Specify to receive push notifications that appear briefly on screen\. If you select **Do not disturb**, you continue to see notifications on the home page and the number of notifications on the bell\. + * Specify to receive notifications by email\. + * Specify for which projects or spaces you receive notifications\. + + + +## View and personalize your project summary ## + +Use the **Overview** page of a project to view a summary of what's happening in your project\. You can jump back into your most recent work and keep up to date with alerts, tasks, project history, and compute usage\. + +View recent asset activity in the **Assets** pane on the **Overview** page, and filter the assets by selecting **By you** or **By all** using the dropdown\. Selecting **By you** lists assets edited by you, ordered by most recent at the top\. Selecting **By all** lists assets edited by others and also by you, ordered by most recent at the top\. + +You can use the readme file on the **Overview** page to document the status or results of the project\. The readme file uses standard [Markdown formatting](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/markd-jupyter.html)\. Collaborators with the **Admin** or **Editor** role can edit the readme file\. + +## Learn more ## + + + + * [Managing your IBM Cloud account](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/manage-account.html) + * [Managing your services](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/create-services.html#manage) + + + +**Parent topic:**[Administration](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/administer-accounts.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c528d240892080aece146d29fb3496ddd0f1fd48.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c528d240892080aece146d29fb3496ddd0f1fd48.md new file mode 100644 index 0000000..bdaa722 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c528d240892080aece146d29fb3496ddd0f1fd48.md @@ -0,0 +1,90 @@ +# Find (SPSS Modeler) + +# Find # + +In the Expression Builder, you can search for fields, values, or functions\. + +For example, to search for a value, place your cursor in the Find in column Value field and enter the text you want to search for\. + +You can also search on special characters such as tabs or newline characters, classes or ranges of characters such as *a* through *d*, any digit or non\-digit, and boundaries such as the beginning or end of a line\. The following types of expressions are supported\. + + + +Character matches + +Table 1\. Character matches + +| Characters | Matches | +| ---------- | -------------------------------------------------------------------------- | +| x | The character x | +| \\\\ | The backslash character | +| \\0n | The character with octal value 0n (0 <= n <= 7) | +| \\0nn | The character with octal value 0nn (0 <= n <= 7) | +| \\0mnn | The character with octal value 0mnn (0 <= m <= 3, 0 <= n <= 7) | +| \\xhh | The character with hexadecimal value 0xhh | +| \\uhhhh | The character with hexadecimal value 0xhhhh | +| \\t | The tab character ('\\u0009') | +| \\n | The newline (line feed) character ('\\u000A') | +| \\r | The carriage\-return character ('\\u000D') | +| \\f | The form\-feed character ('\\u000C') | +| \\a | The alert (bell) character ('\\u0007') | +| \\e | The escape character ('\\u001B') | +| \\cx | The control character corresponding to x | + + + + + +Matching character classes + +Table 2\. Matching character classes + +| Character classes | Matches | +| ------------------- | ------------------------------------------------------------------------------------------------------ | +| \[abc\] | a, b, or c (simple class) | +| \[^abc\] | Any character except a, b, or c (subtraction) | +| \[a\-zA\-Z\] | a through z or A through Z, inclusive (range) | +| \[a\-d\[m\-p\]\] | a through d, or m through p (union)\. Alternatively this could be specified as \[a\-dm\-p\] | +| \[a\-z&&\[def\]\] | a through z, and d, e, or f (intersection) | +| \[a\-z&&\[^bc\]\] | a through z, except for b and c (subtraction)\. Alternatively this could be specified as \[ad\-z\] | +| \[a\-z&&\[^m\-p\]\] | a through z, and not m through p (subtraction)\. Alternatively this could be specified as \[a\-lq\-z\] | + + + + + +Predefined character classes + +Table 3\. Predefined character classes + +| Predefined character classes | Matches | +| ---------------------------- | ----------------------------------------------------- | +| \. | Any character (may or may not match line terminators) | +| \\d | Any digit: \[0\-9\] | +| \\D | A non\-digit: \[^0\-9\] | +| \\s | A white space character: \[ \\t\\n\\x0B\\f\\r\] | +| \\S | A non\-white space character: \[^\\s\] | +| \\w | A word character: \[a\-zA\-Z\_0\-9\] | +| \\W | A non\-word character: \[^\\w\] | + + + + + +Boundary matches + +Table 4\. Boundary matches + +| Boundary matchers | Matches | +| ----------------- | --------------------------------------------------------- | +| ^ | The beginning of a line | +| $ | The end of a line | +| \\b | A word boundary | +| \\B | A non\-word boundary | +| \\A | The beginning of the input | +| \\Z | The end of the input but for the final terminator, if any | +| \\z | The end of the input | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c52d7d525c33eb8fa5b5acc8b16243223d78ac68.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c52d7d525c33eb8fa5b5acc8b16243223d78ac68.md new file mode 100644 index 0000000..025b767 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c52d7d525c33eb8fa5b5acc8b16243223d78ac68.md @@ -0,0 +1,21 @@ +# Creating synthetic data from a custom data schema + +# Creating synthetic data from a custom data schema # + +Using the *Synthetic Data Generator* graphical editor flow tool, you can generate a structured synthetic data set based on meta data, automatically or with user\-specified statistical distributions\. You can define the data within each table column, their distributions, and any correlations\. You can then export and review your synthetic data\. + +Before you can use *generate* to create synthetic data, you need [to create a task](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/synthetic_data_overview_sd.html#create-synthetic)\. + +1\. The **Generate synthetic tabular data flow** window opens\. Select use case **Create from custom data schema**\. Click **Next**\. ![Generate synthetic tabular data flow window](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/sd-generate-flow.png) + +2\. Select **Generate options**\. You can use the *Synthetic Data Generator* graphical editor flow tool to specify the number of rows and add columns\. You can define properties and specify fields, storage types, statistical distributions, and distribution parameters\. Click **Next**\. ![Generate options](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/sd-generate-options.png) + +3\. Select **Export data** to select the export file name and type\. For more information, see [Exporting data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/export_data_sd.html)\. Click **Next**\. ![Export data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/sd-generate-export.png) + +4\. Select **Review** to check your selection and make any updates before generating your synthetic data\. Click **Save and run**\. ![Review data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/sd-generate-review.png) + +## Learn more ## + +[Creating synthetic data from production data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/mask_mimic_data_sd.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c535650c17cde010eacbf5b6bf85fd8e593b77d6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c535650c17cde010eacbf5b6bf85fd8e593b77d6.md new file mode 100644 index 0000000..4d55c2d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c535650c17cde010eacbf5b6bf85fd8e593b77d6.md @@ -0,0 +1,181 @@ +# Quick start: Build, run, and deploy a Decision Optimization model + +# Quick start: Build, run, and deploy a Decision Optimization model # + +You can build and run Decision Optimization models to help you make the best decisions to solve business problems based on your objectives\. Read about Decision Optimization, then watch a video and take a tutorial that’s suitable for users with some knowledge of prescriptive analytics, but does not require coding\. + +Your basic workflow includes these tasks: + + + +1. Open your sandbox project\. Projects are where you can collaborate with others to work with data\. +2. Add a Decision Optimization Experiment to the project\. You can add compressed files or data from sample files\. +3. Associate a Watson Machine Learning Service with the project\. +4. Create a deployment space to associate with the project's Watson Machine Learning Service\. +5. Review the data, model objectives, and constraints in the Modeling Assistant\. +6. Run one or more scenarios to test your model and review the results\. +7. Deploy your model\. + + + +## Read about Decision Optimization ## + +Decision Optimization can analyze data and create an optimization model (with the Modeling Assistant) based on a business problem\. First, an optimization model is derived by converting a business problem into a mathematical formulation that can be understood by the optimization engine\. The formulation consists of objectives and constraints that define the model that the final decision is based on\. The model, together with your input data, forms a scenario\. The optimization engine solves the scenario by applying the objectives and constraints to limit millions of possibilities and provides the best solution\. This solution satisfies the model formulation or relaxes certain constraints if the model is infeasible\. You can test scenarios using different data, or by modifying the objectives and constraints and re\-running them and viewing solutions\. Once satisfied you can deploy your model\. + +[Read more about Decision Optimization](https://dataplatform.cloud.ibm.com/docs/content/DO/DOWS-Cloud_home.html) + +## Watch a video about creating a Decision Optimization model ## + +![Watch Video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) Watch this video to see how to run a sample Decision Optimization experiment to create, solve, and deploy a Decision Optimization model with Watson Studio and Watson Machine Learning\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. The user interface is frequently improved\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Try a tutorial to create a model that uses Decision Optimization ## + +In this tutorial, you will complete these tasks: + + + + * [Task 1: Open a project\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html?context=cdpaas&locale=en#step01) + * [Task 2: Create a Decision Optimization experiment in the project\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html?context=cdpaas&locale=en#step02) + * [Task 3: Build a model and visualize a scenario result\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html?context=cdpaas&locale=en#step03) + * [Task 4: Change model objectives and constraints\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html?context=cdpaas&locale=en#step04) + * [Task 5: Deploy the model\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html?context=cdpaas&locale=en#step05) + * [Task 6: Test the model\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html?context=cdpaas&locale=en#step06) + + + +This tutorial will take approximately 30 minutes to complete\. + +Expand all sections + + + + * Tips for completing this tutorial + + \#\#\# Use the video picture-in-picture Tip: Start the video, then as you scroll through the tutorial, the video moves to picture-in-picture mode. Close the video table of contents for the best experience with picture-in-picture. You can use picture-in-picture mode so you can follow the video as you complete the tasks in this tutorial. Click the timestamps for each task to follow along.The following animated image shows how to use the video picture-in-picture and table of contents features: ![How to use picture-in-picture and chapters](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/pip-and-chapters.gif)\{: width="560px" height="315px" data-tearsheet="this"\} \#\#\# Get help in the community If you need help with this tutorial, you can ask a question or find an answer in the [Cloud Pak for Data Community discussion forum](https://community.ibm.com/community/user/cloudpakfordata/communities/community-home/digestviewer?communitykey=c0c16ff2-10ef-4b50-ae4c-57d769937235)\{: new\_window\}. \#\#\# Set up your browser windows For the optimal experience completing this tutorial, open Cloud Pak for Data in one browser window, and keep this tutorial page open in another browser window to switch easily between the two applications. Consider arranging the two browser windows side-by-side to make it easier to follow along. ![Side-by-side tutorial and UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/tutorial-side-by-side.png)\{: width="560px" height="315px" data-tearsheet="this"\} Tip: If you encounter a guided tour while completing this tutorial in the user interface, click **Maybe later**. + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 1: Open a project + + You need a project to store the data and the AutoAI experiment. You can use your sandbox project or create a project. 1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg)\{: iih\}, choose **Projects > View all projects** 1. Open your sandbox project. If you want to use a new project: 1. Click **New project**. 1. Select **Create an empty project**. 1. Enter a name and optional description for the project. 1. Choose an existing [object storage service instance](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/storage-options.html)\{: new\_window\} or create a new one. 1. Click **Create**. 1. When the project opens, click the **Manage** tab and select the **Services and integrations** page. 1. On the *IBM services* tab, click **Associate service**. 1. Select your Watson Machine Learning instance. If you don't have a Watson Machine Learning service instance provisioned yet, follow these steps: 1. Click **New service**. 1. Select **Watson Machine Learning**. 1. Click **Create**. 1. Select the new service instance from the list. 1. Click **Associate service**. 1. If necessary, click **Cancel** to return to the *Services & Integrations* page. For more information, see [Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html)\{: new\_window\}. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the new project. + + ![The following image shows the new project.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/do-new-project.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 2: Create a Decision Optimization experiment + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:20. Now, follow these steps to create the Decision Optimization experiment in your project: 1. From your new project, click **New asset > Solve optimization problems**. 1. Select **Local file**. 1. Click **Get sample files** to view the GitHub repository containing the sample files. 1. In the *DO-Samples* repository, open the **watsonx.ai and Cloud Pak for Data as a Service** folder. 1. Click the `HouseConstructionScheduling.zip` file containing the house construction sample files. 1. Click **Download** to save the zip file to your computer. 1. Return to the *Create a Decision Optimization experiment* page, and click **Browse**. 1. Select the `HouseConstructionScheduling.zip` file from your computer. 1. Click **Open**. 1. If you don't already have a Watson Machine Learning service associated with this project, click **Add a Machine Learning service**. 1. Review your Watson Machine Learning service instances. You can use an existing service, or create a new service instance from here: click **New service**, select **Machine Learning**, and click **Create**. 1. Select your **Watson Machine Learning** instance from the list, and click **Associate**. 1. If necessary, click **Cancel** to return to the *Services & integrations* page. For more information on associated services, see [Adding associated services](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assoc-services.html)\{: new\_window\}. 1. Choose a deployment space to associate with this experiment. If you do not have an existing deployment space, create one: 1. In the *Select deployment space* section, click **New deployment space**. 1. In the *Name* field, type `House sample`\{: .cp\} to provide a name for the deployment space. 1. Click **Create**. 1. When the space is ready, and click **Close** to return to the *Create a Decision Optimization experiment* page. Your new deployment space is selected. 1. Click **Create** to open the Decision Optimization experiment. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the experiment with the sample files. + + ![The following image shows the experiment with the sample files.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/do-exp-builder.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 3: Build a model and visualize a scenario result + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 01:47. Follow these steps to build a model and visualize the result using the Decision Optimization Modeling Assistant. 1. In the left pane, click **Build model** to open the Modeling Assistant. This model was built with the Modeling Assistant so you can see that the objectives and constraints are in natural language, but you can also formulate your model in Python, OPL or import CPLEX and CPO models. 1. Click **Run** to run the scenario to solve the model and wait for the run to complete. 1. When the run completes, the *Explore solution* view displays. Under the *Results* tab, click **Solution assets** to see the resulting (best) values for the decision variables. These solution tables are displayed in alphabetical order by default. 1. In the left pane, select **Visualization**. 1. Under the *Solutions* tab, select **Gantt** to view the scenario with the optimal schedule. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the Visualization page with a Gantt chart. + + ![The following image shows the Visualization page with a Gantt chart.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/do-gantt-chart.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 4: Change model objectives and constraints + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 03:01. Now, you want to make a change to your model formulation to consider an additional objective. Follow these steps to change the model objectives and constraints: 1. Click **Build model**. 1. In the left pane, click the **Overflow** menu ![Overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/overflow-menu--vertical.svg)\{: iih\} next to *Scenario 1*, and select **Duplicate**. 1. For the name, type `Scenario 2`\{: .cp\}, and click **Create**. 1. For *Scenario 2*, add an objective to the model to optimize the quality of work based on the expertise of each contractor. 1. Under *Add to model*, in the search field, type `overall quality`\{: .cp\}, and press `Enter`. 1. Expand the **Objective** section. 1. Click **Maximize overall quality of Subcontractor-Activity assignments according to table of assignment values** to add it as an objective. This new objective is now listed under the *Objectives* section along with the *Minimize time to complete all Activities* objective. 1. For the objective that you just added, click **table of assignment values**, and select **Expertise**. A list of *Expertise* parameters displays. 1. From this list, click **definition** to change the field that defines contractor expertise, and select **Skill Level**. 1. Click **Run** to run the scenario to build the model and wait for the run to complete. 1. Return to the *Explore solution* page to view the **Objectives** and **Solution assets**. 1. In the left pane, select **Visualization**. 1. Under the *Solutions* tab, select **Gantt** to view the scenario with the optimal schedule. 1. Click **Overview** in the left pane to compare statistics between *Scenario 1* and *Scenario 2*. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the Visualization page with the new Gantt chart. + + ![The following image shows the Visualization page with the new Gantt chart.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/do-gantt-chart-02.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 5: Deploy the model + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 04:07. Next, follow these steps to promote the model to a deployment space, and create a deployment: 1. Click the **Overflow** menu ![Overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/overflow-menu--vertical.svg)\{: iih\} next to *Scenario 1*, and select **Save for deployment**. 1. In the *Model name* field, type `House Construction`\{: .cp\}, and click **Next**. 1. Review the model information, and click **Save**. 1. After the model is successfully saved, a notification bar displays with a link to the model. Click **View in project**. 1. If you miss the notification, then click the project name in the navigation trail. 1. Click the **Assets** tab in the project. 1. Click the **House Construction** model. 1. Click **Promote to deployment space**. 1. For the *Target space*, select **House sample** (or your deployment space) from the list. 1. Check the option to Check **Go to the model in the space after deploying it**. 1. Click **Promote**. 1. After the model is successfully promoted, the *House Construction* model displays in the deployment space. 1. Click **New deployment**. 1. For the deployment name, type `House deployment`\{: .cp\}. 1. For the *Hardware definition*, select **2 CPU and 8 GB RAM** from the list. 1. Click **Create**. 1. Wait for the deployment status to change to *Deployed*. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the House deployment. + + ![The following image shows the Visualization page with the House deployment.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/do-house-deployment.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 6: Test a model + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 04:55. To test the model with a scenario, you must upload data files from your computer to the deployment space. Follow these steps to test the model by creating a job using the CSV files included with the sample zip file: 1. Click **House sample** (or your deployment space) in the navigation trail to return to the deployment space. 1. Click the **Assets** tab. 1. In the `HouseConstructionScheduling.zip` file on your computer, you will find several CSV files in the *.containers > Scenario 1* folder. 1. Click the **Upload asset** icon ![Upload asset to project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/data--set.svg)\{: iih\} to open the *Data* panel. 1. Drag the `Subcontractor.csv`, `Activity.csv`, and `Expertise.csv` files into the *Drop files here or browse for files to upload* area in the *Data* panel. 1. Click the **Deployments** tab. 1. Click **House deployment**. 1. Now to submit a job to score the model, click **New job**. 1. For the job name, type `House construction job`\{: .cp\}. 1. Click **Next**. 1. Select the default values on the *Configure* page, and click **Next**. 1. Select the default values on the *Schedule* page, and click **Next**. 1. Select the default values on the *Notify* page, and click **Next**. 1. On the *Choose data* page, in the *Input* section, select the corresponding data assets that you previously loaded into your space for each input ID. 1. In the *Output* section, you will provide the name for each solution table to be created. 1. For *Output ID ScheduledActivities.csv*, click **Select data source > Create new**, type `ScheduledActivities.csv`\{: .cp\} for the name, and click **Confirm**. 1. For *Output ID NotScheduledActivities.csv*, click **Select data source > Create new**, type `NotScheduledActivities.csv`\{: .cp\} for the name, and click **Confirm**. 1. For *Output ID stats.csv*, click **Select data source > Create new**, type `stats.csv`\{: .cp\} for the name, and click **Confirm**. 1. For *Output ID kpis.csv*, click **Select data source > Create new**, type `kpis.csv`\{: .cp\} for the name, and click **Confirm**. 1. For *Output ID solution.json*, click **Select data source > Create new**, type `solution.json`\{: .cp\} for the name, and click **Confirm**. 1. For *Output ID log.txt*, click **Select data source > Create new**, type `log.txt`\{: .cp\} for the name, and click **Confirm**. 1. Review the information on the *Choose data* page, and then click **Next**. 1. Review the information on the *Review and create* page, and then click **Create and run**. 1. From the *House deployment* model page, click the job that you created named *House construction job* to see its status. 1. After the job run completes, click **House sample** (or your deployment space) to return to the deployment space. 1. On the *Assets tab*, you will see the output files: - ScheduledActivities.csv - NotScheduledactivities.csv - stats.csv - kpis.csv - solution.json - log.txt 1. For each of these assets, click the **Download** icon, and then view each of these files. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the completed batch job. + + ![The following image shows the Visualization page with the completed batch job.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/do-completed-batch-job.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html?context=cdpaas&locale=en#video-preview) + + + +## Next steps ## + +Now you can use this data set for further analysis\. For example, you or other users can do any of these tasks: + + + + * [Learn to build this model from scratch with the Modeling Assistant](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/exhousebuild.html) + * [Leverage this deployed model in an end user application using the Watson Machine Learning Rest API](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployModelRest.html) + * [Deploy Decision Optimization models using the Watson Machine Learning Python Client](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployPythonClient.html) + + + +## Additional resources ## + + + + * Try these other methods to build models: + + + + * [Build and deploy a machine learning model with AutoAI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html) + * [Build and deploy a machine learning model with SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html) + * [Build and deploy a Decision Optimization model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html) + * [Submit jobs by using the Watson Machine Learning API](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/Paralleljobs.html) + + + + * [Building and running Decision Optimization Experiments](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/buildingmodels.html) + * [Deploying Decision Optimization models with UI](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/DeployModelUI-WML.html) + * View more [videos](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html)\. + * Find sample data sets, projects, models, prompts, and notebooks in the Samples to gain hands\-on experience: + + ![Notebook icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook.svg)[Notebooks](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=notebook) that you can add to your project to get started analyzing data and building models. + + ![Project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/ibm-cloud--projects.svg)[Projects](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=project-template) that you can import containing notebooks, data sets, prompts, and other assets. + + ![Data set icon]Upload asset to project iconData sets][] that you can add to your project to refine, analyze, and build models. + + ![Prompt icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/prompt.svg)[Prompts](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=example-prompt) that you can use in the Prompt Lab to prompt a foundation model. + + ![Model icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/model.svg)[Foundation models](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=foundation-model) that you can use in the Prompt Lab. + + + + + + * Contribute to the [Decision Optimization community](https://ibm.biz/decision-optimization-community) + + + +**Parent topic:**[Quick start tutorials](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c53bd428f2955b76bf24620a21a6461a1cc19f11.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c53bd428f2955b76bf24620a21a6461a1cc19f11.md new file mode 100644 index 0000000..4be5b81 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c53bd428f2955b76bf24620a21a6461a1cc19f11.md @@ -0,0 +1,23 @@ +# applycartnode properties + +# applycartnode properties # + +You can use C&R Tree modeling nodes to generate a C&R Tree model nugget\. The scripting name of this model nugget is *applycartnode*\. For more information on scripting the modeling node itself, see [cartnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/cartnodeslots.html#cartnodeslots)\. + + + +applycartnode properties + +Table 1\. applycartnode properties + +| `applycartnode` Properties | Values | Property description | +| --------------------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `calculate_conf` | *flag* | Available when SQL generation is enabled; this property includes confidence calculations in the generated tree\. | +| `display_rule_id` | *flag* | Adds a field in the scoring output that indicates the ID for the terminal node to which each record is assigned\. | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `sql_generate` | `Never``NoMissingValues``MissingValues``native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c562415979d3b38aa74c27fd68f13d54ffe47fe5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c562415979d3b38aa74c27fd68f13d54ffe47fe5.md new file mode 100644 index 0000000..bd43c28 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c562415979d3b38aa74c27fd68f13d54ffe47fe5.md @@ -0,0 +1,34 @@ +# Adding associated services to a project + +# Adding associated services to a project # + +To run some tools, you must associate a Watson Machine Learning service instance with the project\. + +After you [create a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html), you can add an associated service to it at any time\. + +**Required permission** : You must have the **Admin** role in the project to add an associated service\. + +For some types of assets, you must associate the IBM Watson Machine Learning service with the project\. You are prompted to associate the IBM Watson Machine Learning the first time you open tools like Prompt Lab, AutoAI, SPSS Modeler, and Decision Optimization\. + +You can also add the Watson Machine Learning service to a project directly: + + + +1. Go to the project's **Manage** tab and select the **Services and integrations** page\. +2. In the **IBM Services** section, click **Associate Service**\. +3. Select your IBM Watson Machine Learning service instance and click **Associate**\. + + + +## Learn more ## + + + + * [Creating and managing IBM Cloud services](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/create-services.html) + * [IBM Cloud services for IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/cloud-services.html) + + + +**Parent topic:**[Administering projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/admin-project.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c5673e6023d99f8354e9b61da2d2f1b58fbc970f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c5673e6023d99f8354e9b61da2d2f1b58fbc970f.md new file mode 100644 index 0000000..97db72a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c5673e6023d99f8354e9b61da2d2f1b58fbc970f.md @@ -0,0 +1,20 @@ +# C5.0 node (SPSS Modeler) + +# C5\.0 node # + +This node uses the C5\.0 algorithm to build either a decision tree or a rule set\. A C5\.0 model works by splitting the sample based on the field that provides the maximum information gain\. Each sub\-sample defined by the first split is then split again, usually based on a different field, and the process repeats until the subsamples cannot be split any further\. Finally, the lowest\-level splits are reexamined, and those that do not contribute significantly to the value of the model are removed or pruned\. + +Note: The C5\.0 node can predict only a categorical target\. When analyzing data with categorical (nominal or ordinal) fields, the node is likely to group categories together\. + +C5\.0 can produce two kinds of models\. A decision tree is a straightforward description of the splits found by the algorithm\. Each terminal (or "leaf") node describes a particular subset of the training data, and each case in the training data belongs to exactly one terminal node in the tree\. In other words, exactly one prediction is possible for any particular data record presented to a decision tree\. + +In contrast, a rule set is a set of rules that tries to make predictions for individual records\. Rule sets are derived from decision trees and, in a way, represent a simplified or distilled version of the information found in the decision tree\. Rule sets can often retain most of the important information from a full decision tree but with a less complex model\. Because of the way rule sets work, they do not have the same properties as decision trees\. The most important difference is that with a rule set, more than one rule may apply for any particular record, or no rules at all may apply\. If multiple rules apply, each rule gets a weighted "vote" based on the confidence associated with that rule, and the final prediction is decided by combining the weighted votes of all of the rules that apply to the record in question\. If no rule applies, a default prediction is assigned to the record\. + +Example\. A medical researcher has collected data about a set of patients, all of whom suffered from the same illness\. During their course of treatment, each patient responded to one of five medications\. You can use a C5\.0 model, in conjunction with other nodes, to help find out which drug might be appropriate for a future patient with the same illness\. + +Requirements\. To train a C5\.0 model, there must be one categorical (i\.e\., nominal or ordinal) `Target` field, and one or more `Input` fields of any type\. Fields set to `Both` or `None` are ignored\. Fields used in the model must have their types fully instantiated\. A weight field can also be specified\. + +Strengths\. C5\.0 models are quite robust in the presence of problems such as missing data and large numbers of input fields\. They usually do not require long training times to estimate\. In addition, C5\.0 models tend to be easier to understand than some other model types, since the rules derived from the model have a very straightforward interpretation\. C5\.0 also offers the powerful boosting method to increase accuracy of classification\. + +Tip: C5\.0 model building speed may benefit from enabling parallel processing\. Note: When first creating a flow, you select which runtime to use\. By default, flows use the IBM SPSS Modeler runtime\. If you want to use native Spark algorithms instead of SPSS algorithms, select the Spark runtime\. Properties for this node will vary depending on which runtime option you choose\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c5f5acc006cd6f06be3266ee98f89fabf4f6fbaf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c5f5acc006cd6f06be3266ee98f89fabf4f6fbaf.md new file mode 100644 index 0000000..acc0fc4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c5f5acc006cd6f06be3266ee98f89fabf4f6fbaf.md @@ -0,0 +1,7 @@ +# Troubleshooting information for SPSS Modeler + +# Troubleshooting SPSS Modeler # + +The information in this section provides troubleshooting details for issues you may encounter in SPSS Modeler\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c61d407536d31a069aa857469a0eebfef1c0e1b8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c61d407536d31a069aa857469a0eebfef1c0e1b8.md new file mode 100644 index 0000000..58c2602 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c61d407536d31a069aa857469a0eebfef1c0e1b8.md @@ -0,0 +1,115 @@ +# IBM Db2 Warehouse connection + +# IBM Db2 Warehouse connection # + +To access your data in IBM Db2 Warehouse, create a connection asset for it\. + +IBM Db2 Warehouse is an analytics data warehouse that gives you a high level of control over your data and applications\. You can use the IBM Db2 Warehouse connection to connect to a database in these products: + + + + * IBM Db2 Warehouse in IBM Cloud + * IBM Db2 Warehouse on\-prem + + + +## Create a connection to Db2 Warehouse ## + +To create the connection asset, you need these connection details: + + + + * **Database name** + * **Hostname or IP address** of the database server + * **Port number** + * **API key** or **Username** and **password** + * **Application name** (optional): The name of the application that is currently using the connection\. For information, see [Client info properties support by the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/Javadocs/src/tpc/imjcc_r0052001.html)\. + * **Client accounting information** (optional): The value of the accounting string from the client information that is specified for the connection\. For information, see [Client info properties support by the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/Javadocs/src/tpc/imjcc_r0052001.html)\. + * **Client hostname** (optional): The hostname of the machine on which the application that is using the connection is running\. For information, see [Client info properties support by the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/Javadocs/src/tpc/imjcc_r0052001.html)\. + * **Client user** (optional): The name of the user on whose behalf the application that is using the connection is running\. For information, see [Client info properties support by the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/Javadocs/src/tpc/imjcc_r0052001.html)\. + * **SSL certificate** (if required by the database server) + + + +### Credentials ### + +For Credentials, you can enter either an API key or a username and password + +#### Authenticating with an API Key #### + +You can use an API key to authenticate to Db2 Warehouse in IBM Cloud\. + +**Db2 Warehouse in IBM Cloud** +First add the user ID as an IAM user or as a service ID\. For instructions, see **the Console user experience** section of the [Identity and access management (IAM) on IBM Cloud](https://cloud.ibm.com/docs/Db2whc?topic=Db2whc-iam#console-ux) topic\. + +If users want to authenticate with Db2 Warehouse with an IAM API key, the administrator of the Db2 Warehouse instance can add the IAM users by using the User management console, and then the users can each create an API key for themselves by using the IAM access management console\. + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Db2 Warehouse connections in the following workspaces and tools: + + + + * Data Refinery + * Decision Optimization + * Notebooks\. Click **Read data** on the **Code snippets** pane to get the connection credentials and load the data into a data structure\. See [Load data from data source connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html#conns)\. + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Db2 Warehouse setup ## + + + + * IBM Db2 Warehouse on Cloud: [Getting started with Db2 Warehouse on Cloud](https://cloud.ibm.com/docs/Db2whc?topic=Db2whc-getting-started) + * IBM Db2 Warehouse on\-prem: [Setting up Db2 Warehouse](https://www.ibm.com/docs/SSCJDQ/com.ibm.swg.im.dashdb.doc/admin/local_setup.html) + + + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the product documentation in [Learn more ](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-db2-wh.html?context=cdpaas&locale=en#lm) for the correct syntax\. + +## Known issue ## + +On Data Refinery, system\-level schemas aren’t filtered out\. + +## Learn more ## + + + + * IBM Db2 Warehouse on Cloud [product documentation](https://cloud.ibm.com/docs/Db2whc) (IBM Cloud) + * IBM Db2 Warehouse on\-prem [product documentation](https://www.ibm.com/docs/SSCJDQ/com.ibm.swg.im.dashdb.doc/local_overview.html) + + + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6223eeb52369b6b2baa2b489c9da41c882154b9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6223eeb52369b6b2baa2b489c9da41c882154b9.md new file mode 100644 index 0000000..fc5ab85 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6223eeb52369b6b2baa2b489c9da41c882154b9.md @@ -0,0 +1,62 @@ +# Watsonx.governance + +# Watsonx\.governance # + +Use watsonx\.governance to accelerate responsible, transparent, and explainable AI workflows with an AI governance solution that provides end\-to\-end monitoring for machine learning and generative AI models\. Monitor your foundation model and machine learning assets from request to production\. Collect facts about models that are built with IBM tools or third\-party providers in a single dashboard to aid in meeting compliance and governance goals\. + +## Develop a comprehensive governance solution ## + +Using watsonx\.governance, you can extend the best practices of AI governance from predictive machine learning models to generative AI while monitoring and mitigating the risks associated with models, users, and data sets\. The benefits of this approach include: + + + + * Responsible AI: extend the practices of responsible AI from governing predictive machine learning models to the use of generative AI with any foundation or model provider\. + * Explainability: Use automation to improve transparency and explainability for tracked models\. Use tools for detecting and mitigating risks that are associated with AI\. + * Transparent and regulatory policies: Mitigate AI risks by tracking the end\-to\-end AI lifecycle to aid compliance with internal policies and external regulations for enterprise\-wide AI solutions\. + + + +### Use the AI risk atlas a guide ### + +Start your governance journey by reviewing the [Risk Atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) to learn about the potential risks of working with AI models\. The Risk Atlas provides a guide to understanding some of the risks of working with AI models, including generative AI, foundation models, and machine learning models\. In addition to describing potential risks, it provides real\-world context\. It is intended as an educational resource and is not meant as a prescriptive tool\. + +### Governance in action ### + +This illustration depicts a typical governance flow, from request to monitoring in production\. + +![watsonx\.governance flow](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/wastonx-gov-concept.svg) + +## Components of watsonx\.governance ## + +Watsonx\.governance includes these tools for addressing your governance needs in an integrated solution: + + + + * **Watson OpenScale** provides tools for configuring monitors that evaluate your deployed assets against thresholds you specify\. For example, you can configure threshold that alerts you when predictive machine learning models perform below a specified threshold for fairness in monitored outcomes, or drift from accuracy\. Alerts for foundation models can warn you when a threshold is breached for the presence of hateful or abusive language or the detection of personal identifiable information\. A Model Health monitor provides real\-time performance tracking for deployed models\. + * **AI Factsheets** collects the metadata for machine learning models and prompt templates you explicitly track\. Develop AI use cases to gather all of the information for managing a model or prompt template from the request phase through development and into production\. Manage multiple versions or a model, or compare different approaches to solving a business problem within a use case\. Factsheets display information about the models including creation information, data that is used, and where the asset is in the lifecycle\. A common model inventory dashboard gives you a view of all tracked assets, or you can view the details of a particular model, all in service of meeting policy and compliance goals\. + + + +### Extend governance with watsonx\.ai ### + +To create an end\-to\-end experience for developing assets and then adding them to governance, use watsonx\.ai with watsonx\.governance\. Watsonx\.ai extends the Watson Studio and Watson Machine Learning services to work with foundation models, including capabilities for saving prompt templates for a curated collection of large language model assets\. + +For more information on watsonx\.ai, see: + + + + * [Overview of IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/overview-wx.html) + * [Signing up for IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/signup-wx.html) + + + +## Next steps ## + + + + * [Develop a governance plan](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-plan.html) + * To begin governance, follow the steps in [Provisioning and launching IBM watsonx\.governance](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-provision-launch.html) to provision Watson OpenScale with AI Factsheets\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6379e4acdd7b1c335e9944b8d9dbb08db220420.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6379e4acdd7b1c335e9944b8d9dbb08db220420.md new file mode 100644 index 0000000..f45096f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6379e4acdd7b1c335e9944b8d9dbb08db220420.md @@ -0,0 +1,30 @@ +# Information functions (SPSS Modeler) + +# Information functions # + +You can use information functions to gain insight into the values of a particular field\. They're typically used to derive flag fields\. + +For example, the `@BLANK` function creates a flag field indicating records whose values are blank for the selected field\. Similarly, you can check the storage type for a field using any of the storage type functions, such as `is_string`\. + + + +CLEM information functions + +Table 1\. CLEM information functions + +| Function | Result | Description | +| -------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| `@BLANK(FIELD)` | *Boolean* | Returns true for all records whose values are blank according to the blank\-handling rules set in an upstream Type node or source node (Types tab)\. | +| `@NULL(ITEM)` | *Boolean* | Returns true for all records whose values are undefined\. Undefined values are system null values, displayed in SPSS Modeler as `$null$`\. | +| `is_date(ITEM)` | *Boolean* | Returns true for all records whose type is a date\. | +| `is_datetime(ITEM)` | *Boolean* | Returns true for all records whose type is a date, time, or timestamp\. | +| `is_integer(ITEM)` | *Boolean* | Returns true for all records whose type is an integer\. | +| `is_number(ITEM)` | *Boolean* | Returns true for all records whose type is a number\. | +| `is_real(ITEM)` | *Boolean* | Returns true for all records whose type is a real\. | +| `is_string(ITEM)` | *Boolean* | Returns true for all records whose type is a string\. | +| `is_time(ITEM)` | *Boolean* | Returns true for all records whose type is a time\. | +| `is_timestamp(ITEM)` | *Boolean* | Returns true for all records whose type is a timestamp\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c64a69ebc1360788037b11e8b0dc5bb74d913819.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c64a69ebc1360788037b11e8b0dc5bb74d913819.md new file mode 100644 index 0000000..f0644b3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c64a69ebc1360788037b11e8b0dc5bb74d913819.md @@ -0,0 +1,31 @@ +# svmnode properties + +# svmnode properties # + +![SVM node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/svm_icon.png)The Support Vector Machine (SVM) node enables you to classify data into one of two groups without overfitting\. SVM works well with wide data sets, such as those with a very large number of input fields\. + + + +svmnode properties + +Table 1\. svmnode properties + +| `svmnode` Properties | Values | Property description | +| --------------------------------- | ------------------------------------------------------------------------------ | ---------------------------------------------------------------------------- | +| `all_probabilities` | *flag* | | +| `stopping_criteria` | `1.0E-1`
`1.0E-2`
`1.0E-3`
`1.0E-4`
`1.0E-5`
`1.0E-6` | Determines when to stop the optimization algorithm\. | +| `regularization` | *number* | Also known as the C parameter\. | +| `precision` | *number* | Used only if measurement level of target field is `Continuous`\. | +| `kernel` | `RBF`
`Polynomial`
`Sigmoid`
`Linear` | Type of kernel function used for the transformation\. `RBF` is the default\. | +| `rbf_gamma` | *number* | Used only if `kernel` is `RBF`\. | +| `gamma` | *number* | Used only if `kernel` is `Polynomial` or `Sigmoid`\. | +| `bias` | *number* | | +| `degree` | *number* | Used only if `kernel` is `Polynomial`\. | +| `calculate_variable_importance` | *flag* | | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `adjusted_propensity_partition` | `Test`
`Validation` | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6b0055426c9e91760f4923ed42be91d64fca6c8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6b0055426c9e91760f4923ed42be91d64fca6c8.md new file mode 100644 index 0000000..5827a74 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6b0055426c9e91760f4923ed42be91d64fca6c8.md @@ -0,0 +1,71 @@ +# Notebooks and scripts + +# Notebooks and scripts # + +You can create, edit and execute Python and R code using Jupyter notebooks and scripts in code editors, for example the notebook editor or an integrated development environment (IDE), like RStudio\. + +**Notebooks** : A Jupyter notebook is a web\-based environment for interactive computing\. You can use notebooks to run small pieces of code that process your data, and you can immediately view the results of your computation\. Notebooks include all of the building blocks you need to work with data, namely the data, the code computations that process the data, the visualizations of the results, and text and rich media to enhance understanding\. + +**Scripts** : A script is a file containing a set of commands and comments\. The script can be saved and used later to re\-execute the saved commands\. Unlike in a notebook, the commands in a script can only be executed in a linear fashion\. + +## Notebooks ## + +**Required permissions** : **Editor** or **Admin** role in a project + +**Tools** : Notebook editor + +**Programming languages** : Python and R + +**Data format** : All types + +Code support is available for loading and accessing data from project assets for: + +: Data assets, such as CSV, JSON and \.xlsx and \.xls files : Database connections and connected data assets + +See [Data load support](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-load-support.html)\. for the supported file and database types\. + +**Data size** : 5 GB\. If your files are larger, you must load the data in multiple parts\. + +## Scripts ## + +**Required permissions** : **Editor** or **Admin** role in a project + +**Tools** : RStudio + +**Programming languages** : R + +**Data format** : All types + +Code support is available for loading and accessing data from project assets for: : Data assets, such as CSV, JSON and \.xlsx and \.xls files : Database connections and connected data assets + +See [Data load support](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-load-support.html)\. for the supported file and database types\. + +**Data size** : 5 GB\. If your files are larger, you must load the data in multiple parts\. + +## Working in the notebook editor ## + +The notebook editor is largely used for interactive, exploratory data analysis programming and data visualization\. Only one person can edit a notebook at a time\. All other users can access opened notebooks in view mode only, while they are locked\. + +You can use the preinstalled open source libraries that come with the notebook runtime environments, add your own libraries, and benefit from the IBM libraries provided at no extra cost\. + +When your notebooks are ready, you can create jobs to run the notebooks directly from the notebook editor\. Your job configurations can use environment variables that are passed to the notebooks with different values when the notebooks run\. + +## Working in RStudio ## + +RStudio is an integrated development environment for working with R scripts or Shiny apps\. Although the RStudio IDE cannot be started in a Spark with R environment runtime, you can use Spark in your R scripts and Shiny apps by accessing Spark kernels programmatically\. + +R scripts and Shiny apps can only be created and used in the RStudio IDE\. You can't create jobs for R scripts or R Shiny deployments\. + +## Learn more ## + + + + * [Quick start: Analyze data in a Jupyter notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html) + * [RStudio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-overview.html) + * [Notebook editor](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-editor.html) + + + +**Parent topic:**[Analyzing data and building models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-science.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6b9bd6294c9a3ef6cd7e45e1b3765c061d92cc3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6b9bd6294c9a3ef6cd7e45e1b3765c061d92cc3.md new file mode 100644 index 0000000..8a7233f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6b9bd6294c9a3ef6cd7e45e1b3765c061d92cc3.md @@ -0,0 +1,29 @@ +# Using non-ASCII characters + +# Using non\-ASCII characters # + +To use non\-ASCII characters, Python requires explicit encoding and decoding of strings into Unicode\. In SPSS Modeler, Python scripts are assumed to be encoded in UTF\-8, which is a standard Unicode encoding that supports non\-ASCII characters\. The following script will compile because the Python compiler has been set to UTF\-8 by SPSS Modeler\. + +![Scripting example showing Japanese characters\. The node that's created has an incorrect label\.](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/images/japanese_example1.jpg) + +However, the resulting node has an incorrect label\. + +Figure 1\. Node label containing non\-ASCII characters, displayed incorrectly + +![Node label containing non\-ASCII characters, displayed incorrectly](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/images/incorrect_node_label.jpg) + +The label is incorrect because the string literal itself has been converted to an ASCII string by Python\. + +Python allows Unicode string literals to be specified by adding a `u` character prefix before the string literal: + +![Scripting example showing Japanese characters\. The node that's created has the correct label\.](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/images/japanese_example2.jpg) + +This will create a Unicode string and the label will be appear correctly\. + +Figure 2\. Node label containing non\-ASCII characters, displayed correctly + +![Node label containing non\-ASCII characters, displayed correctly](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/images/correct_node_label.jpg) + +Using Python and Unicode is a large topic that's beyond the scope of this document\. Many books and online resources are available that cover this topic in great detail\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6ee4cacfc1e29bafbb8ed5d98521ea68388d0cb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6ee4cacfc1e29bafbb8ed5d98521ea68388d0cb.md new file mode 100644 index 0000000..9ffcca5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c6ee4cacfc1e29bafbb8ed5d98521ea68388d0cb.md @@ -0,0 +1,17 @@ +# Decision Optimization + +# Decision Optimization # + +IBM® Decision Optimization gives you access to IBM's industry\-leading solution engines for mathematical programming and constraint programming\. You can build Decision Optimization models either with notebooks or by using the powerful Decision Optimization experiment UI (Beta version)\. Here you can import, or create and edit models in Python, in OPL or with natural language expressions provided by the intelligent Modeling Assistant (Beta version)\. You can also deploy models with Watson Machine Learning\. + +Data format +: Tabular: `.csv`, `.xls`, `.json` files\. See [Prepare data view](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/modelbuilderUI.html#ModelBuilderInterface__section_preparedata) + + Data from [Connected data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html) + + For deployment see [Model input and output data file formats](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/ModelIOFileFormats.html) + +Data size +: Any + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c7049b7393149edc2256a9d4edb1d6e5a6e24b72.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c7049b7393149edc2256a9d4edb1d6e5a6e24b72.md new file mode 100644 index 0000000..96d8fa3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c7049b7393149edc2256a9d4edb1d6e5a6e24b72.md @@ -0,0 +1,27 @@ +# {{ document.title.text }} + +# Downstream retraining # + +![icon for value alignment risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-value-alignment.svg)Risks associated with inputTraining and tuning phaseValue alignmentNew + +### Description ### + +Using data from user\-generated content or AI\-generated content from downstream applications for retraining a model can result in misalignment, undesirable output, and inaccurate or inappropriate model behavior\. + +### Why is downstream retraining a concern for foundation models? ### + +Repurposing downstream output for re\-training a model without implementing proper human vetting increases the chances of undesirable outputs being incorporated into the training or tuning data of the model, resulting in an echo chamber effect\. Improper model behavior can result in business entities facing legal consequences or reputational harms\. + +Example + +#### Model collapse due to training using AI\-generated content #### + +As stated in the source article, a group of researchers from the UK and Canada have investigated the problem of using AI\-generated content for training instead of human\-generated content\. They found that using model\-generated content in training causes irreversible defects in the resulting models and that learning from data produced by other models causes [model collapse](https://arxiv.org/pdf/2305.17493v2.pdf)\. + +Sources: + +[VentureBeat, June 2023](https://venturebeat.com/ai/the-ai-feedback-loop-researchers-warn-of-model-collapse-as-ai-trains-on-ai-generated-content/) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c709b8079f21daa0ee315823a6713b556ac2789b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c709b8079f21daa0ee315823a6713b556ac2789b.md new file mode 100644 index 0000000..1896fdb --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c709b8079f21daa0ee315823a6713b556ac2789b.md @@ -0,0 +1,27 @@ +# {{ document.title.text }} + +# Personal information in prompt # + +![icon for privacy risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-privacy.svg)Risks associated with inputInferencePrivacyNew + +### Description ### + +Inclusion of personal information as a part of a generative model’s prompt, either through the system prompt design or through the inclusion of end user input, might later result in unintended reuse or disclosure of that personal information\. + +### Why is personal information in prompt a concern for foundation models? ### + +Prompt data might be stored or later used for other purposes like model evaluation and retraining\. These types of data must be reviewed with respect to privacy laws and regulations\. Without proper data storage and usage business entities could face fines, reputational harms, and other legal consequences\. + +Example + +#### Disclose personal health information in ChatGPT prompts #### + +As per the source articles, some people on social media shared about using ChatGPT as their makeshift therapists\. Articles that users may include personal health information in their prompts during the interaction, which may raise privacy concerns\. The information could be shared with the company that own the tech and could be used for training or tuning or even share with [unspecified third parties](https://openai.com/policies/privacy-policy)\. + +Sources: + +[The Conversation, February 2023](https://theconversation.com/chatgpt-is-a-data-privacy-nightmare-if-youve-ever-posted-online-you-ought-to-be-concerned-199283) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c70bb33e4e6792511dc4e7d88536017e64bcd0f1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c70bb33e4e6792511dc4e7d88536017e64bcd0f1.md new file mode 100644 index 0000000..7eeaea0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c70bb33e4e6792511dc4e7d88536017e64bcd0f1.md @@ -0,0 +1,12 @@ +# Data Asset node (SPSS Modeler) + +# Data Asset node # + +You can use the Data Asset import node to pull in data from remote data sources using connections or from your local computer\. First, you must create the connection\. + +Note for connections to a Planning Analytics database, you must choose a view (not a cube)\. + +You can also pull in data from a local data file ( \.csv, \.txt, \.json, \.xls, \.xlsx, \.sav, and \.sas are supported)\. Only the first sheet is imported from spreadsheets\. In the node's properties, under DATA, select one or more data files to upload\. You can also simply drag\-and\-drop the data file from your local file system onto your canvas\. + +Note: You can import a stream ( \.str) into watsonx\.ai that was created in SPSS Modeler Subscription or SPSS Modeler client\. If the imported stream contains one or more import or export nodes, you'll be prompted to convert the nodes\. See [Importing an SPSS Modeler stream](https://dataplatform.cloud.ibm.com/docs/content/wsd/migration.html)\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c81beea067ccc7fed12806f3ff0f20519092f2e4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c81beea067ccc7fed12806f3ff0f20519092f2e4.md new file mode 100644 index 0000000..f8522f3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c81beea067ccc7fed12806f3ff0f20519092f2e4.md @@ -0,0 +1,7 @@ +# Statistics (SPSS Modeler) + +# Statistics node # + +The Statistics node gives you basic summary information about numeric fields\. You can get summary statistics for individual fields and correlations between fields\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c832eb23963c0f4bcddb2dd45c8e67001aee8f4f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c832eb23963c0f4bcddb2dd45c8e67001aee8f4f.md new file mode 100644 index 0000000..109de95 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c832eb23963c0f4bcddb2dd45c8e67001aee8f4f.md @@ -0,0 +1,90 @@ +# Microsoft Azure File Storage connection + +# Microsoft Azure File Storage connection # + +To access your data in Microsoft Azure File Storage, create a connection asset for it\. + +Azure Files are Microsoft's cloud file system\. They are managed file shares that are accessible via the Server Message Block (SMB) protocol or the Network File System (NFS) protocol\. + +## Create a connection to Microsoft Azure File Storage ## + +To create the connection asset, you need these connection details: + +Connection string: Authentication is managed by the Azure portal access keys\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Microsoft Azure File Storage connections in the following workspaces and tools: + +**Projects** + + + + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Azure File Storage setup ## + +Set up storage and access keys on the Microsoft Azure portal\. For instructions see [Manage storage account access keys](https://docs.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage)\. +Example connection string, which you can find in the **ApiKeys** section of the container: + +`DefaultEndpointsProtocol=https;AccountName=sampleaccount;AccountKey=samplekey;EndpointSuffix=core.windows.net` + +Choose the method to create and manage your Azure Files: + + + + * [Quickstart: Create and manage Azure Files share with Windows virtual machines](https://docs.microsoft.com/en-us/azure/storage/files/storage-files-quick-create-use-windows) + * [Quickstart: Create and manage Azure file shares with the Azure portal](https://docs.microsoft.com/en-us/azure/storage/files/storage-how-to-use-files-portal) + * [Quickstart: Create and manage an Azure file share with Azure PowerShell](https://docs.microsoft.com/en-us/azure/storage/files/storage-how-to-use-files-powershell) + * [Quickstart: Create and manage Azure file shares using Azure CLI](https://docs.microsoft.com/en-us/azure/storage/files/storage-how-to-use-files-cli) + * [Quickstart: Create and manage Azure file shares with Azure Storage Explorer](https://docs.microsoft.com/en-us/azure/storage/files/storage-how-to-use-files-storage-explorer) + + + +## Restriction ## + +Microsoft Azure's maximum file size is 1 TB\. + +## Supported file types ## + +The Azure File Storage connection supports these file types: Avro, CSV, Delimited text, Excel, JSON, ORC, Parquet, SAS, SAV, SHP, and XML\. + +## Known issue ## + +During the upload, the data is appended in portions to a temporary blob and then converted into the file\. Depending on the size of the streamed content, there might be a delay in creating the file\. Wait until all the data is uploaded\. + +## Learn more ## + +[Azure Files](https://azure.microsoft.com/en-us/services/storage/files/) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c8816bf425ef039884dbf6a7282f8d7adb7c5d04.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c8816bf425ef039884dbf6a7282f8d7adb7c5d04.md new file mode 100644 index 0000000..90c5fe9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c8816bf425ef039884dbf6a7282f8d7adb7c5d04.md @@ -0,0 +1,29 @@ +# {{ document.title.text }} + +# Data transfer # + +![icon for data laws risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-data-laws.svg)Risks associated with inputTraining and tuning phaseData lawsTraditional + +### Description ### + +Laws and other restrictions that apply to the transfer of data can limit or prohibit transferring or repurposing data from one country to another\. Repurposing data can be further restricted within countries or with local regulations\. + +### Why is data transfer a concern for foundation models? ### + +Data transfer restrictions can impact the availability of the data required for training an AI model and can lead to poorly represented data\. Failing to comply with data transfer laws might result in fines and other legal consequences\. + +Example + +#### Data Restriction Laws #### + +As stated in the research article, data localization measures which restrict the ability to move data globally will reduce the capacity to develop tailored AI capacities\. It will affect AI directly by providing less training data and indirectly by undercutting the building blocks on which AI is built\. + +Examples include [China's data localization laws](https://iapp.org/resources/article/demystifying-data-localization-in-china-a-practical-guide/), GDPR restrictions on the processing and use of personal data, and [Singapore's bilateral data sharing](https://www.imda.gov.sg/how-we-can-help/data-innovation/trusted-data-sharing-framework)\. + +Sources: + +[Brookings, December 2018](https://www.brookings.edu/articles/the-impact-of-artificial-intelligence-on-international-trade) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c89753519b91f85dc9e0ed54a3248cd82d5f2a9e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c89753519b91f85dc9e0ed54a3248cd82d5f2a9e.md new file mode 100644 index 0000000..2d9e2d1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c89753519b91f85dc9e0ed54a3248cd82d5f2a9e.md @@ -0,0 +1,18 @@ +# The Expression Builder (SPSS Modeler) + +# The Expression Builder # + +You can type CLEM expressions manually or use the Expression Builder, which displays a complete list of CLEM functions and operators as well as data fields from the current flow, allowing you to quickly build expressions without memorizing the exact names of fields or functions\. + +In addition, the Expression Builder controls automatically add the proper quotes for fields and values, making it easier to create syntactically correct expressions\. + +Notes: + + + + * The Expression Builder isn't supported in scripting or parameter settings\. + * If you want to change your datasource, before changing the source you should check that the Expression Builder can still support the functions you have selected\. Because not all databases support all functions, you may encounter an error if you run against a new datasource\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c8b4a993cb8642bc87432fcb305eee744c16a154.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c8b4a993cb8642bc87432fcb305eee744c16a154.md new file mode 100644 index 0000000..d00d109 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c8b4a993cb8642bc87432fcb305eee744c16a154.md @@ -0,0 +1,60 @@ +# Importing a stream (SPSS Modeler) + +# Importing an SPSS Modeler stream # + +You can import a stream ( \.str) that was created in SPSS Modeler Subscription or SPSS Modeler client\. + + + +1. From your project's Assets tab, click \. +2. Select Local file, select the \.str file you want to import, and click Create\. + + + +If the imported stream contains one or more source (import) or export nodes, you'll be prompted to convert the nodes\. Watsonx\.ai will walk you through the migration process\. + +Watch the following video for an example of this easy process: + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +[https://www\.ustream\.tv/embed/recorded/127732173](https://www.ustream.tv/embed/recorded/127732173) + +If the stream contains multiple import nodes that use the same data file, then you must first add that file to your project as a data asset before migrating because the conversion can't upload the same file to more than one import node\. After adding the data asset to your project, reopen the flow and proceed with the migration using the new data asset\. Nodes with the same name will be automatically mapped to project assets\. + +Configure export nodes to export to your project or to a connection\. The following export nodes are supported: + + + +Table 1\. Export nodes that can be migrated + +| Supported SPSS Modeler export nodes | +| ----------------------------------- | +| Analytic Server | +| Database | +| Flat File | +| Statistics Export | +| Data Collection | +| Excel | +| IBM Cognos Analytics Export | +| TM1 Export | +| SAS | +| XML Export | + + + +Notes: Keep the following information in mind when migrating nodes\. + + + + * When migrating export nodes, you're converting node types that don't exist in watsonx\.ai\. The nodes are converted to Data Asset export nodes or a connection\. Due to a current limitation for automatically migrating nodes, only existing project assets or connections can be selected as export targets\. These assets will be overwritten during export when the flow runs\. + * To preserve any type or filter information, when an import node is replaced with Data Asset nodes, they're converted to a SuperNode\. + * After migration, you can go back later and use the Convert button if you want to migrate a node that you skipped previously\. + * If the stream you imported uses scripting, you may encounter an error when you run the flow even after completing a migration\. This could be due to the flow script containing a reference to an unsupported import or export node\. To avoid such errors, you must remove the scripting code that references the unsupported node\. + * If the stream you're importing contains unsupported data file types, you need to convert them to a supported type (CSV, Excel, or SPSS Statistics \.sav)\. + * In some cases, some settings from your original stream may not be restored during migration\. For example, if the field delimiter in your original stream was tabs, it may be changed to commas after migration\. Settings such as custom SQL also aren't migrated currently\. Compare the new migrated flow to your original stream and making adjustments as needed\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c926dfb3758881e6698f630e496f3817101e4176.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c926dfb3758881e6698f630e496f3817101e4176.md new file mode 100644 index 0000000..ae4a729 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c926dfb3758881e6698f630e496f3817101e4176.md @@ -0,0 +1,326 @@ +# AutoAI tutorial: Build a Binary Classification Model + +# AutoAI tutorial: Build a Binary Classification Model # + +This tutorial guides you through training a model to predict if a customer is likely to buy a tent from an outdoor equipment store\. + +Create an AutoAI experiment to build a model that analyzes your data and selects the best model type and algorithms to produce, train, and optimize pipelines\. After you review the pipelines, save one as a model, deploy it, and then test it to get a prediction\. + +Watch this video to see a preview of the steps in this tutorial\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + + + + * Transcript + + Synchronize transcript with video + + + + | Time | Transcript | + | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | 00:00 | In this video, you will see how to build a binary classification model that assesses the likelihood that a customer of an outdoor equipment company will buy a tent. | + | 00:11 | This video uses a data set called "GoSales", which you'll find in the Gallery. | + | 00:16 | View the data set. | + | 00:20 | The feature columns are "GENDER", "AGE", "MARITAL\_STATUS", and "PROFESSION" and contain the attributes on which the machine learning model will base predictions. | + | 00:31 | The label columns are "IS\_TENT", "PRODUCT\_LINE", and "PURCHASE\_AMOUNT" and contain historical outcomes that the models could be trained to predict. | + | 00:44 | Add this data set to the "Machine Learning" project and then go to the project. | + | 00:56 | You'll find the GoSales.csv file with your other data assets. | + | 01:02 | Add to the project an "AutoAI experiment". | + | 01:08 | This project already has the Watson Machine Learning service associated. | + | 01:13 | If you haven't done that yet, first, watch the video showing how to run an AutoAI experiment based on a sample. | + | 01:22 | Just provide a name for the experiment and then click "Create". | + | 01:30 | The AutoAI experiment builder displays. | + | 01:33 | You first need to load the training data. | + | 01:36 | In this case, the data set will be from the project. | + | 01:40 | Select the GoSales.csv file from the list. | + | 01:45 | AutoAI reads the data set and lists the columns found in the data set. | + | 01:50 | Since you want the model to predict the likelihood that a given customer will purchase a tent, select "IS\_TENT" as the column to predict. | + | 01:59 | Now, edit the experiment settings. | + | 02:03 | First, look at the settings for the data source. | + | 02:06 | If you have a large data set, you can run the experiment on a subsample of rows and you can configure how much of the data will be used for training and how much will be used for evaluation. | + | 02:19 | The default is a 90%/10% split, where 10% of the data is reserved for evaluation. | + | 02:27 | You can also select which columns from the data set to include when running the experiment. | + | 02:35 | On the "Prediction" panel, you can select a prediction type. | + | 02:39 | In this case, AutoAI analyzed your data and determined that the "IS\_TENT" column contains true-false information, making this data suitable for a "Binary classification" model. | + | 02:52 | The positive class is "TRUE" and the recommended metric is "Accuracy". | + | 03:01 | If you'd like, you can choose specific algorithms to consider for this experiment and the number of top algorithms for AutoAI to test, which determines the number of pipelines generated. | + | 03:16 | On the "Runtime" panel, you can review other details about the experiment. | + | 03:21 | In this case, accepting the default settings makes the most sense. | + | 03:25 | Now, run the experiment. | + | 03:28 | AutoAI first loads the data set, then splits the data into training data and holdout data. | + | 03:37 | Then wait, as the "Pipeline leaderboard" fills in to show the generated pipelines using different estimators, such as XGBoost classifier, or enhancements such as hyperparameter optimization and feature engineering, with the pipelines ranked based on the accuracy metric. | + | 03:58 | Hyperparameter optimization is a mechanism for automatically exploring a search space for potential hyperparameters, building a series of models and comparing the models using metrics of interest. | + | 04:10 | Feature engineering attempts to transform the raw data into the combination of features that best represents the problem to achieve the most accurate prediction. | + | 04:21 | Okay, the run has completed. | + | 04:24 | By default, you'll see the "Relationship map". | + | 04:28 | But you can swap views to see the "Progress map". | + | 04:32 | You may want to start with comparing the pipelines. | + | 04:36 | This chart provides metrics for the eight pipelines, viewed by cross validation score or by holdout score. | + | 04:46 | You can see the pipelines ranked based on other metrics, such as average precision. | + | 04:55 | Back on the "Experiment summary" tab, expand a pipeline to view the model evaluation measures and ROC curve. | + | 05:03 | During AutoAI training, your data set is split into two parts: training data and holdout data. | + | 05:11 | The training data is used by the AutoAI training stages to generate the model pipelines, and cross validation scores are used to rank them. | + | 05:21 | After training, the holdout data is used for the resulting pipeline model evaluation and computation of performance information, such as ROC curves and confusion matrices. | + | 05:33 | You can view an individual pipeline to see more details in addition to the confusion matrix, precision recall curve, model information, and feature importance. | + | 05:46 | This pipeline had the highest ranking, so you can save this as a machine learning model. | + | 05:52 | Just accept the defaults and save the model. | + | 05:56 | Now that you've trained the model, you're ready to view the model and deploy it. | + | 06:04 | The "Overview" tab shows a model summary and the input schema. | + | 06:09 | To deploy the model, you'll need to promote it to a deployment space. | + | 06:15 | Select the deployment space from the list, add a description for the model, and click "Promote". | + | 06:24 | Use the link to go to the deployment space. | + | 06:28 | Here's the model you just created, which you can now deploy. | + | 06:33 | In this case, it will be an online deployment. | + | 06:37 | Just provide a name for the deployment and click "Create". | + | 06:41 | Then wait, while the model is deployed. | + | 06:44 | When the model deployment is complete, view the deployment. | + | 06:49 | On the "API reference" tab, you'll find the scoring endpoint for future reference. | + | 06:56 | You'll also find code snippets for various programming languages to utilize this deployment from your application. | + | 07:05 | On the "Test" tab, you can test the model prediction. | + | 07:09 | You can either enter test input data or paste JSON input data, and click "Predict". | + | 07:20 | This shows that there's a very high probability that the first customer will buy a tent and a very high probability that the second customer will not buy a tent. | + | 07:33 | And back in the project, you'll find the AutoAI experiment and the model on the "Assets" tab. | + | 07:44 | Find more videos in the Cloud Pak for Data as a Service documentation. | + + + + + +## Overview of the data sets ## + +The sample data is structured (in rows and columns) and saved in a \.csv file format\. + +You can view the sample data file in a text editor or spreadsheet program: +![Spreadsheet of the Go Sales data set that contains customer and purchase information](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_binary_sample_data.png) + +#### What do you want to predict? #### + +Choose the column whose values that your model predicts\. + +In this tutorial, the model predicts the values of the `IS_TENT` column: + + + + * `IS_TENT`: Whether the customer bought a tent + + + +The model that is built in this tutorial predicts whether a customer is likely to purchase a tent\. + +## Tasks overview ## + +This tutorial presents the basic steps for building and training a machine learning model with AutoAI: + + + +1. [Create a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai_example_binary_classifier.html?context=cdpaas&locale=en#step0) +2. [Create an AutoAI experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai_example_binary_classifier.html?context=cdpaas&locale=en#step1) +3. [Training the experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai_example_binary_classifier.html?context=cdpaas&locale=en#step2) +4. [Deploy the trained model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai_example_binary_classifier.html?context=cdpaas&locale=en#step3) +5. [Test the deployed model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai_example_binary_classifier.html?context=cdpaas&locale=en#step4) +6. [Creating a batch to score the model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai_example_binary_classifier.html?context=cdpaas&locale=en#step5) + + + +## Task 1: Create a project ## + + + +1. From the *Samples*, download the [GoSales](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/aa07a773f71cf1172a349f33e2028e4e?context=wx) data set file to your local computer\. +2. From the Projects page, to create a new project, select **New Project**\. + a. Select **Create an empty project**. + b. Include your project name. + c. Click **Create**. + + + +## Task 2: Create an AutoAI experiment ## + + + +1. On the *Assets* tab from within your project, click **New asset > Build machine learning models automatically**\. +2. Specify a name and optional description for your new experiment\. +3. Select the **Associate a Machine Learning service instance** link to associate the Watson Machine Learning Server instance with your project\. Click **Reload** to confirm your configuration\. +4. To add a data source, you can choose one of these options: + a. If you downloaded your file locally, upload the training data file, *GoSales.csv*, from your local computer. Drag the file onto the data panel or click **browse** and follow the prompts. + b. If you already uploaded your file to your project, click **select from project**, then select the **data asset** tab and choose *GoSales.csv*. + + + +## Task 3: Training the experiment ## + + + +1. In **Configuration details**, select **No** for the option to create a Time Series Forecast\. +2. Choose `IS_TENT` as the column to predict\. AutoAI analyzes your data and determines that the `IS_TENT` column contains True and False information, making this data suitable for a binary classification model\. The default metric for a binary classification is ROC/AUC\. + + ![Configuring experiment details. No to time series forecast and IS TENT as the column to predict.](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_binary_run_configuration_test.png) +3. Click **Run experiment**\. As the model trains, an infographic shows the process of building the pipelines\. + + Note:You might see slight differences in results based on the Cloud Pak for Data platform and version you use. + + ![Experiment summary of AutoAI generated pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_binary_pipeline_build.png) + + For a list of algorithms or estimators that are available with each machine learning technique in AutoAI, see [AutoAI implementation detail](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html). +4. When all the pipelines are created, you can compare their accuracy on the **Pipeline leaderboard**\. + + ![Pipeline leaderboard that ranks generated pipelines based on accuracy](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_binary_pipeline_leaderboard.png) +5. Select the pipeline with Rank 1 and click **Save as** to create your model\. Then, select **Create**\. This option saves the pipeline under the **Models** section in the **Assets** tab\. + + + +## Task 4: Deploy the trained model ## + + + +1. You can deploy the model from the model details page\. You can access the model details page in one of these ways: + + + + 1. Clicking the model’s name in the notification displayed when you save the model. + 2. Open the **Assets** tab for the project, select the **Models** section and select the model’s name. + + + +2. Click **Promote to Deployment Space** then select or create the space where the model will be deployed\. + + + + 1. To create a deployment space: + + + + 1. Enter a name. + 2. Associate it with a Machine Learning Service. + 3. Select **Create**. + + + + + +3. After you create your deployment space or select an existing one, select **Promote**\. +4. Click the deployment space link from the notification\. +5. From the **Assets** tab of the deployment space: + + + + 1. Hover over the model’s name and click the deployment icon ![Deploy icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/deploy-icon.png). + + + + 1. In the page that opens, complete the fields: + + + + 1. Select **Online** as the **Deployment type**. + 2. Specify a name for the deployment. + 3. Click **Create**. + + + + + + + + + +![Creating an online deployment space to promote the model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_binary_deployment.png) + +After the deployment is complete, click **Deployments** and select the deployment name to view the details page\. + +## Task 5: Test the deployed model ## + +You can test the deployed model from the deployment details page: + + + +1. On the **Test** tab of the deployment details page, complete the form with test values or enter JSON test data by clicking the terminal icon ![Terminal icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/terminal-icon.png) to provide the following JSON input data\. + + {"input_data":[{ + + "fields": + + "GENDER","AGE","MARITAL_STATUS","PROFESSION","PRODUCT_LINE","PURCHASE_AMOUNT"], + + "values": "M",27,"Single", "Professional","Camping Equipment",144.78]] + + }]} + + Note: The test data replicates the data fields for the model, except for the prediction field. +2. Click **Predict** to predict whether a customer with the entered attributes is likely to buy a tent\. The resulting prediction indicates that a customer with the attributes entered has a high probability of purchasing a tent\. + + + +![Result of the Tent model prediction\. Prediction equals true, likely to buy a tent](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_binary_test.png) + +## Task 6: Creating a batch job to score the model ## + +For a batch deployment, you provide input data, also known as the model payload, in a CSV file\. The data must be structured like the training data, with the same column headers\. The batch job processes each row of data and creates a corresponding prediction\. + +In a real scenario, you would submit new data to the model to get a score\. However, this tutorial uses the same training data GoSales\-updated\.csv that you downloaded as part of the tutorial setup\. Ensure that you delete the `IS_TENT` column and save the file before you upload it to the batch job\. When deploying a model, you can add the payload data to a project, upload it to a space, or link to it in a storage repository such as a Cloud Object Storage bucket\. For this tutorial, upload the file directly to the deployment space\. + +### Step 1: Add data to space ### + +From the **Assets** page of the deployment space: + + + +1. Click **Add to space** then choose **Data**\. +2. Upload the file GoSales\-updated\.csv file that you saved locally\. + + + +### Step 2: Create the batch deployment ### + +Now you can define the batch deployment\. + + + +1. Click the deployment icon next to the model’s name\. +2. Enter a name a name for the deployment\. + + + + 1. Select **Batch** as the **Deployment type**. + 2. Choose the smallest hardware specification. + 3. Click **Create**. + + + + + +### Step 3: Create the batch job ### + +The batch job runs the deployment\. To create the job, you must specify the input data and the name for the output file\. You can set up a job to run on a schedule or run immediately\. + + + +1. Click **New job**\. +2. Specify a name for the job +3. Configure to the smallest hardware specification +4. (Optional): To set a schedule and receive notifications\. +5. Upload the input file: *GoSales\-updated\.csv* +6. Name the output file: *GoSales\-output\.csv* +7. Review and click **Create** to run the job\. + + + +### Step 4: View the output ### + +When the deployment status changes to *Deployed*, return to the **Assets** page for the deployment space\. The file *GoSales\-output\.csv* was created and added to your assets list\. + +Click the download icon next to the output file and open the file in an editor\. You can review the prediction results for the customer information that is submitted for batch processing\. + +For each case, the prediction that is returned indicates the confidence score of whether a customer will buy a tent\. + +## Next steps ## + +[Building an AutoAI experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-build.html) + +**Parent topic:**[AutoAI overview](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c9769e4047faf3c5f55b2a7bd5fcce3e321870e6.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c9769e4047faf3c5f55b2a7bd5fcce3e321870e6.md new file mode 100644 index 0000000..bbbb506 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c9769e4047faf3c5f55b2a7bd5fcce3e321870e6.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Trust calibration # + +![icon for value alignment risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-value-alignment.svg)Risks associated with outputValue alignmentNew + +### Description ### + +Trust calibration presents problems when a person places too little or too much trust in an AI model's guidance, resulting in poor decision making\. + +### Why is trust calibration a concern for foundation models? ### + +In tasks where humans make choices based on AI\-based suggestions, consequences of poor decision making increase with the importance of the decision\. Bad decisions can harm users and can lead to financial harm, reputational harm, and other legal consequences for business entities\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c9857afef4c7e7c2ad0b764277b90a2bce51adc8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c9857afef4c7e7c2ad0b764277b90a2bce51adc8.md new file mode 100644 index 0000000..4ad2b68 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c9857afef4c7e7c2ad0b764277b90a2bce51adc8.md @@ -0,0 +1,44 @@ +# Setting options for values (SPSS Modeler) + +# Setting options for values # + +The Value mode column under the Type node settings displays a drop\-down list of predefined values\. Choosing the Specify option on this list and then clicking the gear icon opens a new screen where you can set options for reading, specifying, labeling, and handling values for the selected field\. + +Many of the controls are common to all types of data\. These common controls are discussed here\. + +Measure\. Displays the currently selected measurement level\. You can change this setting to reflect the way that you intend to use data\. For instance, if a field called `day_of_week` contains numbers that represent individual days, you might want to change this to nominal data in order to create a distribution node that examines each category individually\. + +Role\. Used to tell modeling nodes whether fields will be Input (predictor fields) or Target (predicted fields) for a machine\-learning process\. Other roles are also available such as Both , None, Partition, Split, Frequency, or Record ID\. + +Value mode\. Select a mode to determine values for the selected field\. Choices for reading values include the following: + + + + * Read\. Select to read values when the node runs\. + * Pass\. Select not to read data for the current field\. + * Specify\. Options here are used to specify values and labels for the selected field\. Used with value checking, use this option to specify values that are based on your knowledge of the current field\. This option activates unique controls for each type of field\. You can't specify values or labels for a field whose measurement level is Typeless\. + * Extend\. Select to append the current data with the values that you enter here\. For example, if field\_1 has a range from `(0,10)` and you enter a range of values from `(8,16)`, the range is extended by adding the `16` without removing the original minimum\. The new range would be `(0,16)`\. + * Current\. Select to keep the current data values\. + + + +Value Labels (Add/Edit Labels)\. In this section you can enter custom labels for each value of the selected field\. + +Max list length\. Only available for data with a measurement level of either Geospatial or Collection\. Set the maximum length of the list by specifying the number of elements the list can contain\. + +Max string length\. Only available for typeless data\. Use this field when you're generating SQL to create a table\. Enter the value of the largest string in your data; this generates a column in the table that's big enough for the string\. If the string length value is not available, a default string size is used that may not be appropriate for the data (for example, if the value is too small, errors can occur when writing data to the table; too large a value could adversely affect performance)\. + +Check\. Select a method of coercing values to conform to the specified continuous, flag, or nominal values\. This option corresponds to the Check column in the main Type node settings, and a selection made here will override those in the main settings\. Used with the options for specifying values and labels, value checking allows you to conform values in the data with expected values\. For example, if you specify values as `1, 0` and then use the Discard\. option here, you can discard all records with values other than `1` or `0`\. + +Define missing values\. Select to activate the following controls you can use to declare missing values or blanks in your data\. + + + + * Missing values\. Use this field to define specific values (such as `99` or `0`) as blanks\. The value should be appropriate for the storage type of the field\. + * Range\. Used to specify a range of missing values (such as ages `1–17` or greater than `65`)\. If a bound value is blank, then the range is unbounded\. For example, if you specify a lower bound of `100` with no upper bound, then all values greater than or equal to `100` are defined as missing\. The bound values are inclusive\. For example, a range with a lower bound of `5` and an upper bound of `10` includes `5` and `10` in the range definition\. You can define a missing value range for any storage type, including date/time and string (in which case the alphabetic sort order is used to determine whether a value is within the range)\. + * Null/White space\. You can also specify system nulls (displayed in the data as `$null$`) and white space (string values with no visible characters) as blanks\. Note that the Type node also treats empty strings as white space for purposes of analysis, although they are stored differently internally and may be handled differently in certain cases\. + + + +Note: To code blanks as undefined or `$null$`, use the Filler node\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c9fb652c433a0a0bc419cbfe4ecc3680252d2fe3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c9fb652c433a0a0bc419cbfe4ecc3680252d2fe3.md new file mode 100644 index 0000000..32e5a4e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/c9fb652c433a0a0bc419cbfe4ecc3680252d2fe3.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Copyright infringement # + +![icon for intellectual property risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-intellectual-property.svg)Risks associated with outputIntellectual propertyNew + +### Description ### + +Generative AI output that is too similar or identical to existing work risks claims of copyright infringement\. Uncertainty and variability around the ownership, copyrightability, and patentability of output generated by AI increases the risk of copyright infringement problems\. + +### Why is copyright infringement a concern for foundation models? ### + +Laws and regulations concerning the use of content that looks the same or closely similar to other copyrighted data are largely unsettled and can vary from country to country, providing challenges in determining and implementing compliance\. Business entities could face fines, reputational harms, and other legal consequences\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ca6f118dbe9a1782053fe1f5f4697dda07a7a365.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ca6f118dbe9a1782053fe1f5f4697dda07a7a365.md new file mode 100644 index 0000000..822f46f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ca6f118dbe9a1782053fe1f5f4697dda07a7a365.md @@ -0,0 +1,78 @@ +# Flow properties + +# Flow properties # + +You can control a variety of flow properties with scripting\. To reference flow properties, you must set the execution method to use scripts: + + stream = modeler.script.stream() + stream.setPropertyValue("execute_method", "Script") + +The previous example uses the node property to create a list of all nodes in the flow and write that list in the flow annotations\. The annotation produced looks like this: + + This flow is called "druglearn" and contains the following nodes: + + type node called "Define Types" + derive node called "Na_to_K" + variablefile node called "DRUG1n" + neuralnetwork node called "Drug" + c50 node called "Drug" + filter node called "Discard Fields" + +Flow properties are described in the following table\. + + + +Flow properties + +Table 1\. Flow properties + +| Property name | Data type | Property description | +| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------- | +| `execute_method` | `Normal`
`Script` | | +| `date_format` | `"DDMMYY" "MMDDYY" "YYMMDD" "YYYYMMDD" "YYYYDDD" DAY MONTH "DD-MM-YY" "DD-MM-YYYY" "MM-DD-YY" "MM-DD-YYYY" "DD-MON-YY" "DD-MON-YYYY" "YYYY-MM-DD" "DD.MM.YY" "DD.MM.YYYY" "MM.DD.YYYY" "DD.MON.YY" "DD.MON.YYYY" "DD/MM/YY" "DD/MM/YYYY" "MM/DD/YY" "MM/DD/YYYY" "DD/MON/YY" "DD/MON/YYYY" MON YYYY q Q YYYY ww WK YYYY` | | +| `date_baseline` | *number* | | +| `date_2digit_baseline` | *number* | | +| `time_format` | `"HHMMSS" "HHMM" "MMSS" "HH:MM:SS" "HH:MM" "MM:SS" "(H)H:(M)M:(S)S" "(H)H:(M)M" "(M)M:(S)S" "HH.MM.SS" "HH.MM" "MM.SS" "(H)H.(M)M.(S)S" "(H)H.(M)M" "(M)M.(S)S"` | | +| `time_rollover` | *flag* | | +| `import_datetime_as_string` | *flag* | | +| `decimal_places` | *number* | | +| `decimal_symbol` | `Default`
`Period`
`Comma` | | +| `angles_in_radians` | *flag* | | +| `use_max_set_size` | *flag* | | +| `max_set_size` | *number* | | +| `ruleset_evaluation` | `Voting`
`FirstHit` | | +| `refresh_source_nodes` | *flag* | Use to refresh import nodes automatically upon flow execution\. | +| `script` | *string* | | +| `annotation` | *string* | | +| `name` | *string* | This property is read\-only\. If you want to change the name of a flow, you should save it with a different name\. | +| `parameters` | | Use this property to update flow parameters from within a stand\-alone script\. | +| `nodes` | | See detailed information that follows\. | +| `encoding` | `SystemDefault`
`"UTF-8"` | | +| `stream_rewriting` | *boolean* | | +| `stream_rewriting_maximise_sql` | *boolean* | | +| `stream_rewriting_optimise_clem_ execution` | *boolean* | | +| `stream_rewriting_optimise_syntax_ execution` | *boolean* | | +| `enable_parallelism` | *boolean* | | +| `sql_generation` | *boolean* | | +| `database_caching` | *boolean* | | +| `sql_logging` | *boolean* | | +| `sql_generation_logging` | *boolean* | | +| `sql_log_native` | *boolean* | | +| `sql_log_prettyprint` | *boolean* | | +| `record_count_suppress_input` | *boolean* | | +| `record_count_feedback_interval` | *integer* | | +| `use_stream_auto_create_node_ settings` | *boolean* | If true, then flow\-specific settings are used, otherwise user preferences are used\. | +| `create_model_applier_for_new_ models` | *boolean* | If true, when a model builder creates a new model, and it has no active update links, a new model applier is added\. | +| `create_model_applier_update_links` | `createEnabled`

`createDisabled`

`doNotCreate` | Defines the type of link created when a model applier node is added automatically\. | +| `create_source_node_from_builders` | *boolean* | If true, when a source builder creates a new source output, and it has no active update links, a new import node is added\. | +| `create_source_node_update_links` | `createEnabled`

`createDisabled`

`doNotCreate` | Defines the type of link created when an import node is added automatically\. | +| `has_coordinate_system` | *boolean* | If true, applies a coordinate system to the entire flow\. | +| `coordinate_system` | *string* | The name of the selected projected coordinate system\. | +| `deployment_area` | `modelRefresh`

`Scoring`

`None` | Choose how you want to deploy the flow\. If this value is set to `None`, no other deployment entries are used\. | +| `scoring_terminal_node_id` | *string* | Choose the scoring branch in the flow\. It can be any terminal node in the flow\. | +| `scoring_node_id` | *string* | Choose the nugget in the scoring branch\. | +| `model_build_node_id` | *string* | Choose the modeling node in the flow\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/caaa2e09b5b6f7ac550e936268b45d3cb7a412a1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/caaa2e09b5b6f7ac550e936268b45d3cb7a412a1.md new file mode 100644 index 0000000..f876467 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/caaa2e09b5b6f7ac550e936268b45d3cb7a412a1.md @@ -0,0 +1,226 @@ +# Watson Machine Learning plans and compute usage + +# Watson Machine Learning plans and compute usage # + +You use Watson Machine Learning resources, which are measured in capacity unit hours (CUH), when you train AutoAI models, run machine learning models, or score deployed models\. You use Watson Machine Learning resources, measured in resource units (RU), when you run inferencing services with foundation models\. This topic describes the various plans you can choose, what services are included, and how computing resources are calculated\. + +## Watson Machine Learning in Cloud Pak for Data as a Service and watsonx ## + +Important:The Watson Machine Learning plan includes details for watsonx\.ai\. Watsonx\.ai is a studio of integrated tools for working with generative AI, powered by foundation models, and machine learning models\. If you are using Cloud Pak for Data as a Service, then the details for working with foundation models and metering prompt inferencing using Resource Units do not apply to your plan\. + +For more information on watsonx\.ai, see: + + + + * [Overview of IBM watsonx\.ai](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/overview-wx.html) + * [Comparison of IBM watsonx and Cloud Pak for Data as a Service](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/compare-platforms.html) + * [Signing up for IBM watsonx\.ai](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/signup-wx.html) + + + +If you are enabled for both watsonx and Cloud Pak for Data as a Service, you can switch between the two platforms\. + +## Choosing a Watson Machine Learning plan ## + +View a comparison of plans and consider the details to choose a plan that fits your needs\. + + + + * [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html?context=cdpaas&locale=en#wml-plan) + * [Capacity Unit Hours (CUH), tokens, and Resource Units (RU)](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html?context=cdpaas&locale=en#wml-meters) + * [Watson Machine Learning plan details](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html?context=cdpaas&locale=en#wml-plan-details) + * [Capacity Unit Hours metering](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html?context=cdpaas&locale=en#cuh-metering) + * [Monitoring CUH and RU usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html?context=cdpaas&locale=en#wml-track-usage) + + + +### Watson Machine Learning plans ### + +Watson Machine Learning plans govern how you are billed for models you train and deploy with Watson Machine Learning and for prompts you use with foundation models\. Choose a plan based on your needs: + + + + * **Lite** is a free plan with limited capacity\. Choose this plan if you are evaluating Watson Machine Learning and want to try out the capabilities\. The Lite plan does not support running a foundation model tuning experiment on watsonx\. + * **Essentials** is a pay\-as\-you\-go plan that gives you the flexibility to build, deploy, and manage models to match your needs\. + * **Standard** is a high\-capacity enterprise plan that is designed to support all of an organization's machine learning needs\. Capacity unit hours are provided at a flat rate, while resource unit consumption is pay\-as\-you\-go\. + + + +For plan details and pricing, see [IBM Cloud Machine Learning](https://cloud.ibm.com/catalog/services/machine-learning)\. + +### Capacity Unit Hours (CUH), tokens, and Resource Units (RU) ### + +For metering and billing purposes, machine learning models and deployments or foundation models are measured with these units: + + + + * *Capacity Unit Hours* (CUH) measure compute resource consumption per unit hour for usage and billing purposes\. CUH measures all Watson Machine Learning activity except for Foundation Model inferencing\. + * *Resource Units* (RU) measure foundation model inferencing consumption\. Inferencing is the process of calling the foundation model to generate output in response to a prompt\. Each RU equals 1,000 *tokens*\. A token is a basic unit of text (typically 4 characters or 0\.75 words) used in the input or output for a foundation model prompt\. Choose a plan that corresponds to your usage requirements\. For details on tokens, see [Tokens and tokenization](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tokens.html)\. + * A *rate limit* monitors and restricts the number of inferencing requests per second processed for foundation models for a given Watson Machine Learning plan instance\. The rate limit is higher for paid plans than for the free Lite plan\. + + + +## Watson Machine Learning plan details ## + +The Lite plan provides enough free resources for you to evaluate the capabilities of watsonx\.ai\. You can then choose a paid plan that matches the needs of your organization, based on plan features and capacity\. + + + +Table 1\. Plan details + +| Plan features | Lite | Essentials | Standard | +| ------------------------------------------------------------- | ------------------------------- | ---------------------------------------------------------------- | --------------------------------------------------------------------- | +| Machine Learning usage in CUH | 20 CUH per month | CUH billing based on CUH rate multiplied by hours of consumption | 2500 CUH per month | +| Foundation model inferencing in tokens or Resource Units (RU) | 50,000 tokens per month | Billed for usage (1000 tokens = 1 RU) | Billed for usage (1000 tokens = 1 RU) | +| Max parallel Decision Optimization batch jobs per deployment | 2 | 5 | 100 | +| Deployment jobs retained per space | 100 | 1000 | 3000 | +| Deployment time to idle | 1 day | 3 days | 3 days | +| HIPAA support | NA | NA | Dallas region only
Must be enabled in your [IBM Cloud account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security.html#hipaa) | +| Rate limit per plan ID | 2 inference requests per second | 8 inference requests per second | 8 inference requests per second | + + + +Note: If you upgrade from Essentials to Standard, you cannot revert to an Essentials plan\. You must create a new plan\. + +For all plans: + + + + * Foundational Model inferencing Resource Units (RU) can be used for Prompt Lab inferencing, including input and output\. That is, the prompt you enter for input is counted in addition to the generated output\. (watsonx only) + * Foundation model inferencing is available only for the Dallas and Frankfurt data centers\. (watsonx only) + * Foundation model tuning in the Tuning Studio is available only in the Dallas data center\. (watsonx only) + * Three model classes determine the RU rate\. The price per RU differs according to model class\. (watsonx only) + * Capacity\-unit\-hour (CUH) rate consumption for training is based on training tool, hardware specification, and runtime environment\. + * Capacity\-unit\-hour (CUH) rate consumption for deployment is based on deployment type, hardware specification, and software specification\. + * Watson Machine Learning places limits on the number of [deployment jobs](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-details.html) retained for each single [deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html)\. If you exceed your limit, you cannot create new deployment jobs until you delete existing jobs or upgrade your plan\. By default, jobs metadata will be auto\-delete after 30 days\. You can override this value when creating a job\. See [Managing jobs](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-jobs.html)\. + * Time to idle refers to the amount of time to consider a deployment active between scoring requests\. If a deployment does not receive scoring requests for a given duration, it is treated as inactive, or idle, and billing stops for all frameworks other than SPSS\. + * A plan allows for at least the stated rate limit, and the actual rate limit can be higher than the stated limit\. For example, the Lite plan might process more than 2 requests per second without issuing an error\. If you have a paid plan and believe you are reaching the rate limit in error, contact IBM Support for assistance\. + + + +For plan details and pricing, see [IBM Cloud Machine Learning](https://cloud.ibm.com/catalog/services/watson-machine-learning)\. + +## Resource unit metering (watsonx) ## + +Resource Units billing is based on the rate of the billing class for the foundation model multipled by the number of Resource Units (RU)\. A Resource Unit is equal to 1000 tokens from the input and output of foundation model inferencing\. The three foundation model billing classes have different RU rates\. + + + +Table 2\. Foundation model billing details + +| Model | Origin | Billing class | Price per RU | +| -------------------------- | ----------- | ------------- | --------------- | +| granite\-13b\-instruct\-v2 | IBM | Class 2 | $0\.0018 per RU | +| granite\-13b\-instruct\-v1 | IBM | Class 2 | $0\.0018 per RU | +| granite\-13b\-chat\-v2 | IBM | Class 2 | $0\.0018 per RU | +| granite\-13b\-chat\-v1 | IBM | Class 2 | $0\.0018 per RU | +| flan\-t5\-xl\-3b | Open source | Class 1 | $0\.0006 per RU | +| flan\-t5\-xxl\-11b | Open source | Class 2 | $0\.0018 per RU | +| flan\-ul2\-20b | Open source | Class 3 | $0\.0050 per RU | +| gpt\-neox\-20b | Open source | Class 3 | $0\.0050 per RU | +| llama\-2\-13b\-chat | Open source | Class 1 | $0\.0006 per RU | +| llama\-2\-70b\-chat | Open source | Class 2 | $0\.0018 per RU | +| mpt\-7b\-instruct2 | Open source | Class 1 | $0\.0006 per RU | +| mt0\-xxl\-13b | Open source | Class 2 | $0\.0018 per RU | +| starcoder\-15\.5b | Open source | Class 2 | $0\.0018 per RU | +| Tuned foundation model | Custom | Class 1 | $0\.0006 per RU | + + + + + + * For more information about each model, see [Supported foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html)\. + * For information about tuned foundation models, see [Tuning Studio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-studio.html)\. + * For information about regional support for each model, see [Regional availability for foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/regional-datactr.html#data-centers)\. + + + +Note: You do not consume tokens when you use the generative AI search and answer app for this documentation site\. + +## Capacity Unit Hours metering (watsonx and Watson Machine Learning) ## + +CUH consumption is affected by the computational hardware resources you apply for a task as well as other factors such as the software specification and model type\. + +### CUH consumption rates by asset type ### + + + +Table 3\. CUH consumption rates by asset type + +| Asset type | Capacity type | Capacity units per hour | +| --------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | +| AutoAI experiment | 8 vCPU and 32 GB RAM | 20 | +| Decision Optimization training | 2 vCPU and 8 GB RAM
4 vCPU and 16 GB RAM
8 vCPU and 32 GB RAM
16 vCPU and 64 GB RAM | 6
7
9
13 | +| Decision Optimization deployments | 2 vCPU and 8 GB RAM
4 vCPU and 16 GB RAM
8 vCPU and 32 GB RAM
16 vCPU and 64 GB RAM | 30
40
50
60 | +| Machine Learning models
(training, evaluating, or scoring) | 1 vCPU and 4 GB RAM
2 vCPU and 8 GB RAM
4 vCPU and 16 GB RAM
8 vCPU and 32 GB RAM
16 vCPU and 64 GB RAM | 0\.5
1
2
4
8 | +| Foundation model tuning experiment
(watsonx only) | NVIDIA A100 80GB GPU | 43 | + + + +### CUH consumption by deployment and framework type ### + +CUH consumption for deployments is calculated using these formulas: + + + +Table 4\. CUH consumption by deployment and framework type + +| Deployment type | Framework | CUH calculation | +| --------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | +| Online | AutoAI, Python functions and scripts, SPSS, Scikit\-Learn custom libraries, Tensorflow, RShiny | deployment\_active\_duration *no\_of\_nodes* CUH\_rate\_for\_capacity\_type\_framework | +| Online | Spark, PMML, Scikit\-Learn, Pytorch, XGBoost | score\_duration\_in\_seconds *no\_of\_nodes* CUH\_rate\_for\_capacity\_type\_framework | +| Batch | all frameworks | job\_duration\_in\_seconds *no\_of\_nodes* CUH\_rate\_for\_capacity\_type\_framework | + + + +## Monitoring resource usage ## + +You can track CUH or RU usage for assets you own or collaborate on in a project or space\. If you are an account owner or administrator, you can track CUH or RU usage for an entire account\. + +### Tracking CUH or RU usage in a project ### + +To monitor CUH or RU consumption in a project: + + + +1. Navigate to the **Manage** tab for a project\. +2. Click **Resources** to review a summary of resource consumption for assets in the project or space, or to review resource consumption details for particular assets\. + + ![Tracking resources in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/Resource-tracking.png) + + + +### Tracking CUH usage for an account ### + +You can track the runtime usage for an account on the **Environment Runtimes** page if you are the IBM Cloud account owner or administrator or the Watson Machine Learning service owner\. For details, see [Monitoring resources](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html)\. + +### Tracking CUH consumption for machine learning in a notebook ### + +To calculate capacity unit hours in a notebook, use: + + CP = client.service_instance.get_details() + CUH = CUH["entity"]["capacity_units"]/(3600*1000) + print(CUH) + +For example: + + 'capacity_units': {'current': 19773430} + + 19773430/(3600*1000) + +returns 5\.49 CUH + +For details, see the Service Instances section of the [IBM Watson Machine Learning API](https://cloud.ibm.com/apidocs/machine-learning) documentation\. + +## Learn more ## + + + + * [Compute options for AutoAI experiments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-autoai.html) + * [Compute options for model training and scoring](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/run-cuh-deploy-spaces.html) + + + +**Parent topic:**[Watson Machine Learning](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/wml.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cad5f0781542a67a581819b52bb1b6b4bb9ece74.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cad5f0781542a67a581819b52bb1b6b4bb9ece74.md new file mode 100644 index 0000000..6afba87 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cad5f0781542a67a581819b52bb1b6b4bb9ece74.md @@ -0,0 +1,72 @@ +# Parameters + +# Parameters # + +Parameters provide a useful way of passing values at runtime, rather than hard coding them directly in a script\. Parameters and their values are defined in the same way as for flows; that is, as entries in the parameters table of a flow, or as parameters on the command line\. The `Stream` class implements a set of functions defined by the `ParameterProvider` object as shown in the following table\. `Session` provides a `getParameters()` call which returns an object that defines those functions\. + + + +Functions defined by the ParameterProvider object + +Table 1\. Functions defined by the ParameterProvider object + +| Method | Return type | Description | +| ------------------------------------------------ | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `p.parameterIterator()` | Iterator | Returns an iterator of parameter names for this object\. | +| `p.getParameterDefinition( parameterName)` | `ParameterDefinition` | Returns the parameter definition for the parameter with the specified name, or `None` if no such parameter exists in this provider\. The result may be a snapshot of the definition at the time the method was called and need not reflect any subsequent modifications made to the parameter through this provider\. | +| `p.getParameterLabel(parameterName)` | *string* | Returns the label of the named parameter, or `None` if no such parameter exists\. | +| `p.setParameterLabel(parameterName, label)` | Not applicable | Sets the label of the named parameter\. | +| `p.getParameterStorage( parameterName)` | `ParameterStorage` | Returns the storage of the named parameter, or `None` if no such parameter exists\. | +| `p.setParameterStorage( parameterName, storage)` | Not applicable | Sets the storage of the named parameter\. | +| `p.getParameterType(parameterName)` | `ParameterType` | Returns the type of the named parameter, or `None` if no such parameter exists\. | +| `p.setParameterType(parameterName, type)` | Not applicable | Sets the type of the named parameter\. | +| `p.getParameterValue(parameterName)` | Object | Returns the value of the named parameter, or `None` if no such parameter exists\. | +| `p.setParameterValue(parameterName, value)` | Not applicable | Sets the value of the named parameter\. | + + + +In the following example, the script aggregates some Telco data to find which region has the lowest average income data\. A flow parameter is then set with this region\. That flow parameter is then used in a Select node to exclude that region from the data, before a churn model is built on the remainder\. + +The example is artificial because the script generates the Select node itself and could therefore have generated the correct value directly into the Select node expression\. However, flows are typically pre\-built, so setting parameters in this way provides a useful example\. + +The first part of this example script creates the flow parameter that will contain the region with the lowest average income\. The script also creates the nodes in the aggregation branch and the model building branch, and connects them together\. + + import modeler.api + + stream = modeler.script.stream() + + # Initialize a flow parameter + stream.setParameterStorage("LowestRegion", modeler.api.ParameterStorage.INTEGER) + + # First create the aggregation branch to compute the average income per region + sourcenode = stream.findByID("idGXVBG5FBZH") + + aggregatenode = modeler.script.stream().createAt("aggregate", "Aggregate", 294, 142) + aggregatenode.setPropertyValue("keys", ["region"]) + aggregatenode.setKeyedPropertyValue("aggregates", "income", ["Mean"]) + + tablenode = modeler.script.stream().createAt("table", "Table", 462, 142) + + stream.link(sourcenode, aggregatenode) + stream.link(aggregatenode, tablenode) + + selectnode = stream.createAt("select", "Select", 210, 232) + selectnode.setPropertyValue("mode", "Discard") + # Reference the flow parameter in the selection + selectnode.setPropertyValue("condition", "'region' = '$P-LowestRegion'") + + typenode = stream.createAt("type", "Type", 366, 232) + typenode.setKeyedPropertyValue("direction", "Drug", "Target") + + c50node = stream.createAt("c50", "C5.0", 534, 232) + + stream.link(sourcenode, selectnode) + stream.link(selectnode, typenode) + stream.link(typenode, c50node) + +The example script creates the following flow\. + +Figure 1\. Flow that results from the example script + +![Flow that results from the example script](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/images/example_stream_session_2.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cb130d4e1ae505ce39cbd49bf9d22359b9ec80ab.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cb130d4e1ae505ce39cbd49bf9d22359b9ec80ab.md new file mode 100644 index 0000000..35d127d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cb130d4e1ae505ce39cbd49bf9d22359b9ec80ab.md @@ -0,0 +1,53 @@ +# cartnode properties + +# cartnode properties # + +![C&R Tree node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/cartnodeicon.png)The Classification and Regression (C&R) Tree node generates a decision tree that allows you to predict or classify future observations\. The method uses recursive partitioning to split the training records into segments by minimizing the impurity at each step, where a node in the tree is considered "pure" if 100% of cases in the node fall into a specific category of the target field\. Target and input fields can be numeric ranges or categorical (nominal, ordinal, or flags); all splits are binary (only two subgroups)\. + + + +cartnode properties + +Table 1\. cartnode properties + +| `cartnode` Properties | Values | Property description | +| ---------------------------------- | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `target` | *field* | C&R Tree models require a single target and one or more input fields\. A frequency field can also be specified\. See the topic [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `continue_training_existing_model` | *flag* | | +| `objective` | `Standard``Boosting``Bagging``psm` | `psm` is used for very large datasets, and requires a Server connection\. | +| `model_output_type` | `Single``InteractiveBuilder` | | +| `use_tree_directives` | *flag* | | +| `tree_directives` | *string* | Specify directives for growing the tree\. Directives can be wrapped in triple quotes to avoid escaping newlines or quotes\. Note that directives may be highly sensitive to minor changes in data or modeling options and may not generalize to other datasets\. | +| `use_max_depth` | `Default``Custom` | | +| `max_depth` | *integer* | Maximum tree depth, from 0 to 1000\. Used only if `use_max_depth = Custom`\. | +| `prune_tree` | *flag* | Prune tree to avoid overfitting\. | +| `use_std_err` | *flag* | Use maximum difference in risk (in Standard Errors)\. | +| `std_err_multiplier` | *number* | Maximum difference\. | +| `max_surrogates` | *number* | Maximum surrogates\. | +| `use_percentage` | *flag* | | +| `min_parent_records_pc` | *number* | | +| `min_child_records_pc` | *number* | | +| `min_parent_records_abs` | *number* | | +| `min_child_records_abs` | *number* | | +| `use_costs` | *flag* | | +| `costs` | *structured* | Structured property\. | +| `priors` | `Data``Equal``Custom` | | +| `custom_priors` | *structured* | Structured property\. | +| `adjust_priors` | *flag* | | +| `trails` | *number* | Number of component models for boosting or bagging\. | +| `set_ensemble_method` | `Voting``HighestProbability``HighestMeanProbability` | Default combining rule for categorical targets\. | +| `range_ensemble_method` | `Mean``Median` | Default combining rule for continuous targets\. | +| `large_boost` | *flag* | Apply boosting to very large data sets\. | +| `min_impurity` | *number* | | +| `impurity_measure` | `Gini``Twoing``Ordered` | | +| `train_pct` | *number* | Overfit prevention set\. | +| `set_random_seed` | *flag* | Replicate results option\. | +| `seed` | *number* | | +| `calculate_variable_importance` | *flag* | | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `adjusted_propensity_partition` | `Test``Validation` | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cb81643be8ee3b3dc2f6bccdb77bd2cec32c8926.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cb81643be8ee3b3dc2f6bccdb77bd2cec32c8926.md new file mode 100644 index 0000000..33bcfa4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cb81643be8ee3b3dc2f6bccdb77bd2cec32c8926.md @@ -0,0 +1,37 @@ +# Integrating with Google Cloud Platform + +# Integrating with Google Cloud Platform # + +You can configure an integration with the Google Cloud Platform (GCP) to allow IBM watsonx users to access data sources from GCP\. Before proceeding, make sure you have proper permissions\. + +After you configure an integration, you'll see it under **Service instances**\. For example, you'll see a new **GCP** tab that lists your BigQuery data sets and Storage buckets\. + +To configure an integration with GCP: + + + +1. Log on to the Google Cloud Platform at [https://console\.cloud\.google\.com](https://console.cloud.google.com)\. +2. Go to **IAM & Admin > Service Accounts**\. +3. Open your project and then click **CREATE SERVICE ACCOUNT**\.1\. Specify a name and description for the new service account and click **CREATE**\. Specify other options as desired and click **DONE**\.1\. Click the actions menu next to the service instance and select **Create key**\. For key type, select **JSON** and then click **CREATE**\. The JSON key file will be downloaded to your machine\. + + Important: Write down your key ID and secret and store them in a sStore the key file in a secure location. +4. In IBM watsonx, under **Administrator > Cloud integrations**, go to the **GCP** tab, enable integration, and then paste the contents from the JSON key file into the text field\. Only certain properties from the JSON will be stored, and the `private_key` property will be encrypted\. +5. Go back to Google Cloud Platform and edit the service account you created previously\. Add the following roles: +6. Confirm that you can see your GCP services\. From the main menu, choose **Administration > Services > Services instances**\. Click the **GCP** tab to see those services, for example, BigQuery data sets and Storage buckets\. + + + +Now users who have credentials to your GCP services can can [create connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) to them by selecting them on the **Add connection** page\. Then they can access data from those connections by [creating connected data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + +## Next steps ## + + + + * [Set up a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html) + * [Create connections in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) + + + +**Parent topic:** + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cbc6bda4ec8356f2ce95dd4548406abee1ec5b76.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cbc6bda4ec8356f2ce95dd4548406abee1ec5b76.md new file mode 100644 index 0000000..71933ca --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cbc6bda4ec8356f2ce95dd4548406abee1ec5b76.md @@ -0,0 +1,13 @@ +# Sequence node (SPSS Modeler) + +# Sequence node # + +The Sequence node discovers patterns in sequential or time\-oriented data, in the format `bread -> cheese`\. The elements of a sequence are item sets that constitute a single transaction\. + +For example, if a person goes to the store and purchases bread and milk and then a few days later returns to the store and purchases some cheese, that person's buying activity can be represented as two item sets\. The first item set contains bread and milk, and the second one contains cheese\. A sequence is a list of item sets that tend to occur in a predictable order\. The Sequence node detects frequent sequences and creates a generated model node that can be used to make predictions\. + +Requirements\. To create a Sequence rule set, you need to specify an ID field, an optional time field, and one or more content fields\. Note that these settings must be made on the Fields tab of the modeling node; they cannot be read from an upstream Type node\. The ID field can have any role or measurement level\. If you specify a time field, it can have any role but its storage must be numeric, date, time, or timestamp\. If you do not specify a time field, the Sequence node will use an implied timestamp, in effect using row numbers as time values\. Content fields can have any measurement level and role, but all content fields must be of the same type\. If they are numeric, they must be integer ranges (not real ranges)\. + +Strengths\. The Sequence node is based on the CARMA association rules algorithm, which uses an efficient two\-pass method for finding sequences\. In addition, the generated model node created by a Sequence node can be inserted into a data stream to create predictions\. The generated model node can also generate supernodes for detecting and counting specific sequences and for making predictions based on specific sequences\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cbdd718bcee7b1ffde95191be1749d57b9a1a60d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cbdd718bcee7b1ffde95191be1749d57b9a1a60d.md new file mode 100644 index 0000000..d3f9f46 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cbdd718bcee7b1ffde95191be1749d57b9a1a60d.md @@ -0,0 +1,19 @@ +# Federated Learning homomorphic encryption sample for API + +# Federated Learning homomorphic encryption sample for API # + +Download and review sample files that show how to run a Federated Learning experiment with Fully Homomorphic Encryption (FHE)\. + +## Homomorphic encryption ## + +FHE is an advanced, optional method to provide additional security and privacy for your data by encrypting data sent between parties and the aggregator\. This method still creates a computational result that is the same as if the computations were done on unencrypted data\. For more details on applying homomorphic encryption in Federated Learning, see [Applying encryption](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-homo.html)\. + +## Download the Federated Learning sample files ## + +Download the following notebooks\. + +[Federated Learning FHE Demo](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/aa449d3939b73847c502bd7822d0949a) + +**Parent topic:**[Federated Learning tutorial and samples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-demo.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cc0adf041f1628221cac49a1baec1d497d762dc4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cc0adf041f1628221cac49a1baec1d497d762dc4.md new file mode 100644 index 0000000..9db3a8a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cc0adf041f1628221cac49a1baec1d497d762dc4.md @@ -0,0 +1,6 @@ +# Heat map charts + +# Heat map charts # + +Heat map charts present data where the individual values that are contained in a matrix are represented as colors\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cc60febf8e5d1907ce0ccf3868cd9e4b494aa1bf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cc60febf8e5d1907ce0ccf3868cd9e4b494aa1bf.md new file mode 100644 index 0000000..fe90367 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cc60febf8e5d1907ce0ccf3868cd9e4b494aa1bf.md @@ -0,0 +1,47 @@ +# knnnode properties + +# knnnode properties # + +![KNN node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/knn_nodeicon.png)The *k*\-Nearest Neighbor (KNN) node associates a new case with the category or value of the *k* objects nearest to it in the predictor space, where *k* is an integer\. Similar cases are near each other and dissimilar cases are distant from each other\. + + + +knnnode properties + +Table 1\. knnnode properties + +| `knnnode` Properties | Values | Property description | +| --------------------------------- | ---------------------------------- | ------------------------------------------------------------ | +| `analysis` | `PredictTarget``IdentifyNeighbors` | | +| `objective` | `Balance``Speed``Accuracy``Custom` | | +| `normalize_ranges` | *flag* | | +| `use_case_labels` | *flag* | Check box to enable next option\. | +| `case_labels_field` | *field* | | +| `identify_focal_cases` | *flag* | Check box to enable next option\. | +| `focal_cases_field` | *field* | | +| `automatic_k_selection` | *flag* | | +| `fixed_k` | *integer* | Enabled only if `automatic_k_selectio` is `False`\. | +| `minimum_k` | *integer* | Enabled only if `automatic_k_selectio` is `True`\. | +| `maximum_k` | *integer* | | +| `distance_computation` | `Euclidean``CityBlock` | | +| `weight_by_importance` | *flag* | | +| `range_predictions` | `Mean``Median` | | +| `perform_feature_selection` | *flag* | | +| `forced_entry_inputs` | \[*field1 \.\.\. fieldN*\] | | +| `stop_on_error_ratio` | *flag* | | +| `number_to_select` | *integer* | | +| `minimum_change` | *number* | | +| `validation_fold_assign_by_field` | *flag* | | +| `number_of_folds` | *integer* | Enabled only if `validation_fold_assign_by_field` is `False` | +| `set_random_seed` | *flag* | | +| `random_seed` | *number* | | +| `folds_field` | *field* | Enabled only if `validation_fold_assign_by_field` is `True` | +| `all_probabilities` | *flag* | | +| `save_distances` | *flag* | | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `adjusted_propensity_partition` | `Test``Validation` | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cccf5ec3e34e81e3e25ffe29317cdac2ed1c936d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cccf5ec3e34e81e3e25ffe29317cdac2ed1c936d.md new file mode 100644 index 0000000..ac99f57 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cccf5ec3e34e81e3e25ffe29317cdac2ed1c936d.md @@ -0,0 +1,86 @@ +# Configuring quality evaluations in watsonx.governance + +# Configuring quality evaluations in watsonx\.governance # + +watsonx\.governance quality evaluations measure your foundation model's ability to provide correct outcomes + +When you [evaluate prompt templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-eval-prompt.html), you can review a summary of quality evaluation results for the text classification task type\. + +The summary displays scores and violations for metrics that are calculated with default settings\. + +To configure quality evaluations with your own settings, you can set a minimum sample size and set threshold values for each metric\. The minimum sample size indicates the minimum number of model transaction records that you want to evaluate and the threshold values create alerts when your metric scores violate your thresholds\. The metric scores must be higher than the threshold values to avoid violations\. Higher metric values indicate better scores\. + +## Supported quality metrics ## + +When you enable quality evaluations in watsonx\.governance, you can generate metrics that help you determine how well your foundation model predicts outcomes\. + +watsonx\.governance supports the following quality metrics: + + + + * Accuracy + + - **Description**: The proportion of correct predictions - **Default thresholds**: Lower limit = 80% - **Problem types**: Multiclass classification - **Chart values**: Last value in the timeframe - **Metrics details available**: Confusion matrix - **Understanding accuracy**: Accuracy can mean different things depending on the type of algorithm: - **Multi-class classification**: Accuracy measures the number of times any class was predicted correctly, normalized by the number of data points. For more details, see [Multi-class classification](https://spark.apache.org/docs/2.1.0/mllib-evaluation-metrics.html#multiclass-classification)\{: external\} in the Apache Spark documentation. + + + + + + * Weighted true positive rate + + - **Description**: Weighted mean of class TPR with weights equal to class probability - **Default thresholds**: Lower limit = 80% - **Problem type**: Multiclass classification - **Chart values**: Last value in the timeframe - **Metrics details available**: Confusion matrix - **Do the math**: The True positive rate is calculated by the following formula:`number of true positives TPR = _________________________________________________________ number of true positives + number of false negatives` + + + + + + * Weighted false positive rate + + - **Description**: Weighted mean of class FPR with weights equal to class probability. For more details, see [Multi-class classification](https://spark.apache.org/docs/2.1.0/mllib-evaluation-metrics.html#multiclass-classification)\{: external\} in the Apache Spark documentation. - **Default thresholds**: Lower limit = 80% - **Problem type**: Multiclass classification - **Chart values**: Last value in the timeframe - **Metrics details available**: Confusion matrix - **Do the math**: The Weighted False Positive Rate is the application of the FPR with weighted data.`number of false positives FPR = ______________________________________________________ (number of false positives + number of true negatives)` + + + + + + * Weighted recall + + - **Description**: Weighted mean of recall with weights equal to class probability - **Default thresholds**: Lower limit = 80% - **Problem type**: Multiclass classification - **Chart values**: Last value in the timeframe - **Metrics details available**: Confusion matrix - **Do the math**: Weighted recall (wR) is defined as the number of true positives (Tp) over the number of true positives plus the number of false negatives (Fn) used with weighted data.`number of true positives Recall = ______________________________________________________ number of true positives + number of false negatives` + + + + + + * Weighted precision + + - **Description**: Weighted mean of precision with weights equal to class probability - **Default thresholds**: Lower limit = 80% - **Problem type**: Multiclass classification - **Chart values**: Last value in the timeframe - **Metrics details available**: Confusion matrix - **Do the math**: Precision (P) is defined as the number of true positives (Tp) over the number of true positives plus the number of false positives (Fp).`number of true positives Precision = ________________________________________________________ number of true positives + the number of false positives` + + + + + + * Weighted F1\-Measure + + - **Description**: Weighted mean of F1-measure with weights equal to class probability - **Default thresholds**: Lower limit = 80% - **Problem type**: Multiclass classification - **Chart values**: Last value in the timeframe - **Metrics details available**: Confusion matrix - **Do the math**: The Weighted F1-Measure is the result of using weighted data.`precision * recall F1 = 2 * ____________________ precision + recall` + + + + + + * Matthews correlation coefficient + + - **Description**: Measures the quality of binary and multiclass classifications by accounting for true and false positives and negatives. Balanced measure that can be used even if the classes are different sizes. A correlation coefficient value between -1 and \+1. A coefficient of \+1 represents a perfect prediction, 0 an average random prediction and -1 and inverse prediction. - **Default thresholds**: Lower limit = 80 - **Chart values**: Last value in the timeframe - **Metrics details available**: Confusion matrix + + + + + + * Label skew + + - **Description**: Measures the asymmetry of label distributions. If skewness is 0, the dataset is perfectly balanced, it if is less than -1 or greater than 1, the distribution is highly skewed, anything in between is moderately skewed. - **Default thresholds**: + - Lower limit = -0.5 - Upper limit = 0.5 - **Chart values**: Last value in the timeframe + + + +**Parent topic:**[Configuring model evaluations](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-monitors-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ccdf1d5375060fcde288a920a6f3c1b48454c6db.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ccdf1d5375060fcde288a920a6f3c1b48454c6db.md new file mode 100644 index 0000000..7b7f836 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ccdf1d5375060fcde288a920a6f3c1b48454c6db.md @@ -0,0 +1,38 @@ +# dataauditnode properties + +# dataauditnode properties # + +![Data Audit node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/dataauditnodeicon.png)The Data Audit node provides a comprehensive first look at the data, including summary statistics, histograms and distribution for each field, as well as information on outliers, missing values, and extremes\. Results are displayed in an easy\-to\-read matrix that can be sorted and used to generate full\-size graphs and data preparation nodes\. + + + +dataauditnode properties + +Table 1\. dataauditnode properties + +| `dataauditnode` properties | Data type | Property description | +| ------------------------------- | -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| `custom_fields` | *flag* | | +| `fields` | *\[field1 … fieldN\]* | | +| `overlay` | *field* | | +| `display_graphs` | *flag* | Used to turn the display of graphs in the output matrix on or off\. | +| `basic_stats` | *flag* | | +| `advanced_stats` | *flag* | | +| `median_stats` | *flag* | | +| `calculate` | `Count``Breakdown` | Used to calculate missing values\. Select either, both, or neither calculation method\. | +| `outlier_detection_method` | `std``iqr` | Used to specify the detection method for outliers and extreme values\. | +| `outlier_detection_std_outlier` | *number* | If `outlier_detection_method` is `std`, specifies the number to use to define outliers\. | +| `outlier_detection_std_extreme` | *number* | If `outlier_detection_method` is `std`, specifies the number to use to define extreme values\. | +| `outlier_detection_iqr_outlier` | *number* | If `outlier_detection_method` is `iqr`, specifies the number to use to define outliers\. | +| `outlier_detection_iqr_extreme` | *number* | If `outlier_detection_method` is `iqr`, specifies the number to use to define extreme values\. | +| `use_output_name` | *flag* | Specifies whether a custom output name is used\. | +| `output_name` | *string* | If `use_output_name` is true, specifies the name to use\. | +| `output_mode` | `Screen``File` | Used to specify target location for output generated from the output node\. | +| `output_format` | `Formatted` (\.*tab*) `Delimited` (\.*csv*) `HTML` (\.*html*) `Output` (\.*cou*) | Used to specify the type of output\. | +| `paginate_output` | *flag* | When the `output_format` is `HTML`, causes the output to be separated into pages\. | +| `lines_per_page` | *number* | When used with `paginate_output`, specifies the lines per page of output\. | +| `full_filename` | *string* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cd0745062372b6a66356728dea39ee6d8237d0de.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cd0745062372b6a66356728dea39ee6d8237d0de.md new file mode 100644 index 0000000..8c5bc38 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cd0745062372b6a66356728dea39ee6d8237d0de.md @@ -0,0 +1,38 @@ +# randomtrees properties + +# randomtrees properties # + +![Random Trees node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/rfnodeicon.png)The Random Trees node is similar to the C&RT Tree node; however, the Random Trees node is designed to process big data to create a single tree\. The Random Trees tree node generates a decision tree that you use to predict or classify future observations\. The method uses recursive partitioning to split the training records into segments by minimizing the impurity at each step, where a node in the tree is considered pure if 100% of cases in the node fall into a specific category of the target field\. Target and input fields can be numeric ranges or categorical (nominal, ordinal, or flags); all splits are binary (only two subgroups)\. + + + +randomtrees properties + +Table 1\. randomtrees properties + +| `randomtrees` Properties | Values | Property description | +| ---------------------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `target` | *field* | In the Random Trees node, models require a single target and one or more input fields\. A frequency field can also be specified\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `number_of_models` | *integer* | Determines the number of models to build as part of the ensemble modeling\. | +| `use_number_of_predictors` | *flag* | Determines whether `number_of_predictors` is used\. | +| `number_of_predictors` | *integer* | Specifies the number of predictors to be used when building split models\. | +| `use_stop_rule_for_accuracy` | *flag* | Determines whether model building stops when accuracy can't be improved\. | +| `sample_size` | *number* | Reduce this value to improve performance when processing very large datasets\. | +| `handle_imbalanced_data` | *flag* | If the target of the model is a particular flag outcome, and the ratio of the desired outcome to a non\-desired outcome is very small, then the data is imbalanced and the bootstrap sampling that's conducted by the model may affect the model's accuracy\. Enable imbalanced data handling so that the model will capture a larger proportion of the desired outcome and generate a stronger model\. | +| `use_weighted_sampling` | *flag* | When False, variables for each node are randomly selected with the same probability\. When True, variables are weighted and selected accordingly\. | +| `max_node_number` | *integer* | Maximum number of nodes allowed in individual trees\. If the number would be exceeded on the next split, tree growth halts\. | +| `max_depth` | *integer* | Maximum tree depth before growth halts\. | +| `min_child_node_size` | *integer* | Determines the minimum number of records allowed in a child node after the parent node is split\. If a child node would contain fewer records than specified here, the parent node won't be split\. | +| `use_costs` | *flag* | | +| `costs` | *structured* | Structured property\. The format is a list of 3 values: the actual value, the predicted value, and the cost if that prediction is wrong\. For example: `tree.setPropertyValue("costs", ["drugA", "drugB", 3.0], "drugX", "drugY", 4.0]])` | +| `default_cost_increase` | `none``linear``square``custom` | Note this is only enabled for ordinal targets\. Set default values in the costs matrix\. | +| `max_pct_missing` | *integer* | If the percentage of missing values in any input is greater than the value specified here, the input is excluded\. Minimum 0, maximum 100\. | +| `exclude_single_cat_pct` | *integer* | If one category value represents a higher percentage of the records than specified here, the entire field is excluded from model building\. Minimum 1, maximum 99\. | +| `max_category_number` | *integer* | If the number of categories in a field exceeds this value, the field is excluded from model building\. Minimum 2\. | +| `min_field_variation` | *number* | If the coefficient of variation of a continuous field is smaller than this value, the field is excluded from model building\. | +| `num_bins` | *integer* | Only used if the data is made up of continuous inputs\. Set the number of equal frequency bins to be used for the inputs; options are: 2, 4, 5, 10, 20, 25, 50, or 100\. | +| `topN` | *integer* | Specifies the number of rules to report\. Default value is 50, with a minimum of 1 and a maximum of 1000\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cd1c58ad8e180ab922890fa8182ff7f51c589962.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cd1c58ad8e180ab922890fa8182ff7f51c589962.md new file mode 100644 index 0000000..2cecb08 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cd1c58ad8e180ab922890fa8182ff7f51c589962.md @@ -0,0 +1,115 @@ +# IBM Cloud Object Storage (infrastructure) connection + +# IBM Cloud Object Storage (infrastructure) connection # + +To access your data in IBM Cloud Object Storage (infrastructure), create a connection asset for it\. + +The Cloud Object Storage (infrastructure) connection is for object storage that was formerly on SoftLayer\. SoftLayer was replaced by IBM Cloud\. You cannot provision a new instance for Cloud Object Storage (infrastructure)\. This connection is for users who set up an earlier instance on SoftLayer\. + +## Create a connection to Cloud Object Storage (infrastructure) ## + +To create the connection asset, you need this information\. + +### Required connection values ### + +The **Login URL** is required, plus one of the following values for authentication: + + + + * **Access Key** and **Secret Key** + * **Credentials** If you plan to use the S3 API, you must enter an **Access Key**\. + + + +### Connection values in the Cloud Object Storage Resource list ### + +The values for these fields are found in the Cloud Object Storage **Resource list**\. + +To find the **Login URL**: + + + +1. Go to the Cloud Object Storage **Resource list** at [https://cloud\.ibm\.com/resources](https://cloud.ibm.com/resources)\. +2. Expand the **Storage** resource\. +3. Click the Cloud Object Storage service\. From the menu, select **Endpoints**\. +4. Copy the value of the public endpoint that is in the same region as the bucket that you want to use\. + + + +To find the values for **Access key** and the **Secret Key**: + + + +1. Go to the Cloud Object Storage **Resource list** at [https://cloud\.ibm\.com/resources](https://cloud.ibm.com/resources)\. +2. Expand the **Storage** resource\. +3. Click the Cloud Object Storage service, and then click the **Service credentials** tab\. +4. Expand the Key name that you want to use\. Copy the values without the quotation marks: +5. **Access Key**: `access_key_id` +6. **Secret Key**: `secret_access_key` + + Note: Alternatively, you can use the contents of the JSON file in **Credentials** to copy the values for the **Access Key** and **Secret Key**. + + + +To find the **Credentials**: + + + +1. Go to the Cloud Object Storage **Resource list** at [https://cloud\.ibm\.com/resources](https://cloud.ibm.com/resources)\. +2. Expand the **Storage** resource\. +3. Click the Cloud Object Storage service, and then click the **Service credentials** tab\. +4. Expand the Key name that you want to use\. +5. Copy the entire JSON file\. Include the opening and closing braces `{ }` symbols\. + + + +For **Certificates** +(Optional) Enter the self\-signed SSL certificate that was created by a tool such as OpenSSL\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +**Projects** + + + + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Supported file types ## + +The Cloud Object Storage (infrastructure) connection supports these file types: Avro, CSV, Delimited text, Excel, JSON, ORC, Parquet, SAS, SAV, SHP, and XML\. + +## Learn more ## + +Related connection: [IBM Cloud Object Storage connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cd27e36e95ae5324468c33cf3a112dc1611ca74c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cd27e36e95ae5324468c33cf3a112dc1611ca74c.md new file mode 100644 index 0000000..7889474 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cd27e36e95ae5324468c33cf3a112dc1611ca74c.md @@ -0,0 +1,276 @@ +# Customizing with third-party and private Python libraries + +# Customizing with third\-party and private Python libraries # + +If your model requires custom components such as user\-defined transformers, estimators, or user\-defined tensors, you can create a custom software specification that is derived from a base, or a predefined specification\. Python functions and Python scripts also support custom software specifications\. + +You can use custom software specification to reference any third\-party libraries, user\-created Python packages, or both\. Third\-party libraries or user\-created Python packages must be specified as package extensions so that they can be referenced in a custom software specification\. + +You can customize deployment runtimes in these ways: + + + + * [Define customizations in a Watson Studio project and then promote them to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-create-custom-software-spec.html?context=cdpaas&locale=en#custom-ws) + * [Create package extensions and custom software specifications in a deployment space by using the Watson Machine Learning Python client](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-create-custom-software-spec.html?context=cdpaas&locale=en#custom-wml) + + + +For more information, see [Troubleshooting](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-create-custom-software-spec.html?context=cdpaas&locale=en#ts)\. + +## Defining customizations in a Watson Studio project and then promoting them to a deployment space ## + +Environments in Watson Studio projects can be customized to include third\-party libraries that can be installed from Anaconda or from the PyPI repository\. + +For more information, see [Environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html)\. + +As part of custom environment creation, these steps are performed internally (visible to the user): + + + + * A package extension that contains the details of third\-party libraries is created in `conda YAML format`\. + * A custom software specification with the same name as the custom environment is created and the package extension that is created is associated with this custom software specification\. + + + +The models or Python functions/scripts created with the custom environment must reference the custom software specification when they are saved in Watson Machine Learning repository in the project scope\. + +### Propagating software specifications and package extensions from projects to deployment spaces ### + +To export custom software specifications and package extensions that were created in a Watson Studio project to a deployment space: + + + +1. From your project interface, click the **Manage** tab\. +2. Select **Environments**\. +3. Click the **Templates** tab\. +4. From your custom environment's **Options** menu, select **Promote to space**\. + + + +![Selecting "Promote to space" for a custom environment in Watson Studio interface](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/promote-custom-env-from-ws.png) + +Alternatively, when you promote any model or Python function that is associated with a custom environment from a Watson Studio project to a deployment space, the associated custom software specification and package extension is also promoted to the deployment space\. + +If you want to update software specifications and package extensions after you promote them to deployment space, follow these steps: + + + +1. In the deployment space, delete the software specifications, package extensions, and associated models (optional) by using the Watson Machine Learning Python client\. +2. In a project, promote the model, function, or script that is associated with the changed custom software specification and package extension to the space\. + + + +Software specifications are also included when you import a project or space that includes one\. + +## Creating package extensions and custom software specifications in a deployment space by using the Watson Machine Learning Python client ## + +You can use the Watson Machine Learning APIs or Python client to define a custom software specification that is derived from a base specification\. + +High\-level steps to create a custom software specification that uses third\-party libraries or user\-created Python packages: + + + +1. Optional: [Save a conda YAML file that contains a list of third\-party libraries](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-create-custom-software-spec.html?context=cdpaas&locale=en#save-conda-yaml) or [save a user\-created Python library and create a package extension](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-create-custom-software-spec.html?context=cdpaas&locale=en#save-user-created)\. + + Note: This step is not required if the model does not have any dependency on a third-party library or a user-created Python library. +2. Create a custom software specification +3. Add a reference of the package extensions to the custom software specification that you created\. + + + +### Saving a conda YAML file that contains a list of third\-party libraries ### + +To save a conda YAML file that contains a list of third\-party libraries as a package extension and create a custom software specification that is linked to the package extension: + + + +1. Authenticate and create the client\. + + Refer to [Authentication](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-authentication.html). +2. Create and set the default deployment space, then list available software specifications\. + + metadata = { + wml_client.spaces.ConfigurationMetaNames.NAME: + 'examples-create-software-spec', + wml_client.spaces.ConfigurationMetaNames.DESCRIPTION: + 'For my models' + } + space_details = wml_client.spaces.store(meta_props=metadata) + space_uid = wml_client.spaces.get_id(space_details) + + # set the default space + wml_client.set.default_space(space_uid) + + # see available meta names for software specs + print('Available software specs configuration:', wml_client.software_specifications.ConfigurationMetaNames.get()) + wml_client.software_specifications.list() + + asset_id = 'undefined' + pe_asset_id = 'undefined' +3. Create the metadata for package extensions to add to the base specification\. + + pe_metadata = { + wml_client.package_extensions.ConfigurationMetaNames.NAME: + 'My custom library', + # optional: + # wml_client.software_specifications.ConfigurationMetaNames.DESCRIPTION: + wml_client.package_extensions.ConfigurationMetaNames.TYPE: + 'conda_yml' + } +4. Create a yaml file that contains the list of packages and then save it as `customlibrary.yaml`\. + + Example yaml file: + + name: add-regex-package + dependencies: + - regex + + For more information, see [Examples of customizations](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/example-customizations.html). +5. Store package extension information\. + + pe_asset_details = wml_client.package_extensions.store( + meta_props=pe_metadata, + file_path='customlibrary.yaml' + ) + pe_asset_id = wml_client.package_extensions.get_id(pe_asset_details) +6. Create the metadata for the software specification and store the software specification\. + + # Get the id of the base software specification + base_id = wml_client.software_specifications.get_id_by_name('default_py3.9') + + # create the metadata for software specs + ss_metadata = { + wml_client.software_specifications.ConfigurationMetaNames.NAME: + 'Python 3.9 with pre-installed ML package', + wml_client.software_specifications.ConfigurationMetaNames.DESCRIPTION: + 'Adding some custom libraries like regex', # optional + wml_client.software_specifications.ConfigurationMetaNames.BASE_SOFTWARE_SPECIFICATION: + {'guid': base_id}, + wml_client.software_specifications.ConfigurationMetaNames.PACKAGE_EXTENSIONS: + [{'guid': pe_asset_id}] + } + + # store the software spec + ss_asset_details = wml_client.software_specifications.store(meta_props=ss_metadata) + + # get the id of the new asset + asset_id = wml_client.software_specifications.get_id(ss_asset_details) + + # view new software specification details + import pprint as pp + + ss_asset_details = wml_client.software_specifications.get_details(asset_id) + print('Package extensions', pp.pformat( + ss_asset_details['entity']['package_extensions'] + )) + + + +### Saving a user\-created Python library and creating a package extension ### + +For more information, see [Requirements for using custom components in models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-custom_libs_overview.html)\. + +To save a user\-created Python package as a package extension and create a custom software specification that is linked to the package extension: + + + +1. Authenticate and create the client\. + + Refer to [Authentication](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-authentication.html). +2. Create and set the default deployment space, then list available software specifications\. + + metadata = { + wml_client.spaces.ConfigurationMetaNames.NAME: + 'examples-create-software-spec', + wml_client.spaces.ConfigurationMetaNames.DESCRIPTION: + 'For my models' + } + space_details = wml_client.spaces.store(meta_props=metadata) + space_uid = wml_client.spaces.get_id(space_details) + + # set the default space + wml_client.set.default_space(space_uid) + + # see available meta names for software specs + print('Available software specs configuration:', wml_client.software_specifications.ConfigurationMetaNames.get()) + wml_client.software_specifications.list() + + asset_id = 'undefined' + pe_asset_id = 'undefined' +3. Create the metadata for package extensions to add to the base specification\. + + Note:You can specify `pip_zip` only as a value for the `wml_client.package_extensions.ConfigurationMetaNames.TYPE` metadata property. + + pe_metadata = { + wml_client.package_extensions.ConfigurationMetaNames.NAME: + 'My Python library', + # optional: + # wml_client.software_specifications.ConfigurationMetaNames.DESCRIPTION: + wml_client.package_extensions.ConfigurationMetaNames.TYPE: + 'pip.zip' + } +4. Specify the path of the user\-created Python library\. + + python_lib_file_path="my-python-library-0.1.zip" + + For more information, see [Requirements for using custom components in models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-custom_libs_overview.html). +5. Store package extension information\. + + pe_asset_details = wml_client.package_extensions.store( + meta_props=pe_metadata, + file_path=python_lib_file_path + ) + pe_asset_id = wml_client.package_extensions.get_id(pe_asset_details) +6. Create the metadata for the software specification and store the software specification\. + + # Get the id of the base software specification + base_id = wml_client.software_specifications.get_id_by_name('default_py3.9') + + # create the metadata for software specs + ss_metadata = { + wml_client.software_specifications.ConfigurationMetaNames.NAME: + 'Python 3.9 with pre-installed ML package', + wml_client.software_specifications.ConfigurationMetaNames.DESCRIPTION: + 'Adding some custom libraries like regex', # optional + wml_client.software_specifications.ConfigurationMetaNames.BASE_SOFTWARE_SPECIFICATION: + {'guid': base_id}, + wml_client.software_specifications.ConfigurationMetaNames.PACKAGE_EXTENSIONS: + [{'guid': pe_asset_id}] + } + + # store the software spec + ss_asset_details = wml_client.software_specifications.store(meta_props=ss_metadata) + + # get the id of the new asset + asset_id = wml_client.software_specifications.get_id(ss_asset_details) + + # view new software specification details + import pprint as pp + + ss_asset_details = wml_client.software_specifications.get_details(asset_id) + print('Package extensions', pp.pformat( + ss_asset_details['entity']['package_extensions'] + )) + + + +## Troubleshooting ## + +When a conda yml based custom library installation fails with this error: `Encountered error while installing custom library`, try these alternatives: + + + + * Use a different version of the same package that is available in Anaconda for the concerned Python version\. + * Install the library from the pypi repository, by using pip\. Edit the conda yml installation file contents: + + name: + dependencies: + - numpy + - pip: + - pandas==1.2.5 + + + +**Parent topic:**[Customizing deployment runtimes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-customize.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cda0897d49b56ee521bf16e52014da5e2e1d2710.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cda0897d49b56ee521bf16e52014da5e2e1d2710.md new file mode 100644 index 0000000..d93a30f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cda0897d49b56ee521bf16e52014da5e2e1d2710.md @@ -0,0 +1,61 @@ +# autoclassifiernode properties + +# autoclassifiernode properties # + +![Auto Classifier node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/binaryclassifiernodeicon.png)The Auto Classifier node creates and compares a number of different models for binary outcomes (yes or no, churn or do not churn, and so on), allowing you to choose the best approach for a given analysis\. A number of modeling algorithms are supported, making it possible to select the methods you want to use, the specific options for each, and the criteria for comparing the results\. The node generates a set of models based on the specified options and ranks the best candidates according to the criteria you specify\. + + + +autoclassifiernode properties + +Table 1\. autoclassifiernode properties + +| `autoclassifiernode` Properties | Values | Property description | +| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `target` | *field* | For flag targets, the Auto Classifier node requires a single target and one or more input fields\. Weight and frequency fields can also be specified\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `ranking_measure` | `Accuracy`
`Area_under_curve`
`Profit`
`Lift`
`Num_variables` | | +| `ranking_dataset` | `Training`
`Test` | | +| `number_of_models` | *integer* | Number of models to include in the model nugget\. Specify an integer between 1 and 100\. | +| `calculate_variable_importance` | *flag* | | +| `enable_accuracy_limit` | *flag* | | +| `accuracy_limit` | *integer* | Integer between 0 and 100\. | +| `enable_area_under_curve_limit` | *flag* | | +| `area_under_curve_limit` | *number* | Real number between 0\.0 and 1\.0\. | +| `enable_profit_limit` | *flag* | | +| `profit_limit` | *number* | Integer greater than 0\. | +| `enable_lift_limit` | *flag* | | +| `lift_limit` | *number* | Real number greater than 1\.0\. | +| `enable_number_of_variables_limit` | *flag* | | +| `number_of_variables_limit` | *number* | Integer greater than 0\. | +| `use_fixed_cost` | *flag* | | +| `fixed_cost` | *number* | Real number greater than 0\.0\. | +| `variable_cost` | *field* | | +| `use_fixed_revenue` | *flag* | | +| `fixed_revenue` | *number* | Real number greater than 0\.0\. | +| `variable_revenue` | *field* | | +| `use_fixed_weight` | *flag* | | +| `fixed_weight` | *number* | Real number greater than 0\.0 | +| `variable_weight` | *field* | | +| `lift_percentile` | *number* | Integer between 0 and 100\. | +| `enable_model_build_time_limit` | *flag* | | +| `model_build_time_limit` | *number* | Integer set to the number of minutes to limit the time taken to build each individual model\. | +| `enable_stop_after_time_limit` | *flag* | | +| `stop_after_time_limit` | *number* | Real number set to the number of hours to limit the overall elapsed time for an auto classifier run\. | +| `enable_stop_after_valid_model_produced` | *flag* | | +| `use_costs` | *flag* | | +| `` | *flag* | Enables or disables the use of a specific algorithm\. | +| `.` | *string* | Sets a property value for a specific algorithm\. See [Setting algorithm properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/factorymodeling_algorithmproperties.html#factorymodeling_algorithmproperties) for more information\. | +| `use_cross_validation` | *field* | Fields added to this list can take either the condition or prediction role in rules that are generated by the model\. This is on a rule by rule basis, so a field might be a condition in one rule and a prediction in another\. | +| `number_of_folds` | *integer* | N fold parameter for cross validation, with range from 3 to 10\. | +| `set_random_seed` | *boolean* | Setting a random seed allows you to replicate analyses\. Specify an integer or click Generate, which will create a pseudo\-random integer between 1 and 2147483647, inclusive\. By default, analyses are replicated with seed 229176228\. | +| `random_seed` | *integer* | Random seed | +| `stop_if_valid_model` | *boolean* | | +| `filter_individual_model_output` | *boolean* | Removes from the output all of the additional fields generated by the individual models that feed into the Ensemble node\. Select this option if you're interested only in the combined score from all of the input models\. Ensure that this option is deselected if, for example, you want to use an Analysis node or Evaluation node to compare the accuracy of the combined score with that of each of the individual input models | +| `set_ensemble_method` | `"Voting" "ConfidenceWeightedVoting" "HighestConfidence"` | Ensemble method for set targets\. | +| `set_voting_tie_selection` | `"Random" "HighestConfidence"` | If voting is tied, select value randomly or by using highest confidence\. | +| `flag_ensemble_method` | `"Voting" "ConfidenceWeightedVoting" "RawPropensityWeightedVoting" "HighestConfidence" "AverageRawPropensity"` | Ensemble method for flag targets\. | +| `flag_voting_tie_selection` | `"Random" "HighestConfidence" "RawPropensity"` | If voting is tied, select the value randomly, with highest confidence, or with raw propensity\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cdf460b2bb910f74723297bcb8e940bf370c6ffd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cdf460b2bb910f74723297bcb8e940bf370c6ffd.md new file mode 100644 index 0000000..916a22a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cdf460b2bb910f74723297bcb8e940bf370c6ffd.md @@ -0,0 +1,39 @@ +# Batch deployment input details for Scikit-learn and XGBoost models + +# Batch deployment input details for Scikit\-learn and XGBoost models # + +Follow these rules when you are specifying input details for batch deployments of Scikit\-learn and XGBoost models\. + +Data type summary table: + + + +| Data | Description | +| ------------ | ------------------------------------------ | +| Type | inline, data references | +| File formats | CSV, \.zip archive that contains CSV files | + + + +## Data source ## + +If you are specifying input/output data references programmatically: + + + + * Data source reference `type` depends on the asset type\. Refer to the **Data source reference types** section in [Adding data assets to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + + + +**Notes:** + + + + * The environment variables parameter of deployment jobs is not applicable\. + * For connections of type [Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html) or [Cloud Object Storage (infrastructure)](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos-infra.html), you must configure **Access key** and **Secret key**, also known as [HMAC credentials](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-uhc-hmac-credentials-main), + + + +**Parent topic:**[Batch deployment input details by framework](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-input-by-framework.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce13ae6812f1e2ca6ad429d4b01af25f9f398148.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce13ae6812f1e2ca6ad429d4b01af25f9f398148.md new file mode 100644 index 0000000..7ba4f09 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce13ae6812f1e2ca6ad429d4b01af25f9f398148.md @@ -0,0 +1,49 @@ +# Deploying models with Watson Machine Learning + +# Deploying models with Watson Machine Learning # + +Using IBM Watson Machine Learning, you can deploy models, scripts, and functions, manage your deployments, and prepare your assets to put into production to generate predictions and insights\. + +This graphic illustrates a typical process for a machine learning model\. After you build and train a machine learning model, use Watson Machine Learning to deploy the model, manage the input data, and put your machine learning assets to use\. + +![Building a machine learning model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/ml_overview.svg) + +## IBM Watson Machine Learning architecture and services ## + +Watson Machine Learning is a service on IBM Cloud with features for training and deploying machine learning models and neural networks\. Built on a scalable, open source platform based on Kubernetes and Docker components, Watson Machine Learning enables you to build, train, deploy, and manage machine learning and deep learning models\. + +## Deploying and managing models with Watson Machine Learning ## + +Watson Machine Learning supports popular frameworks, including: TensorFlow, Scikit\-Learn, and PyTorch to build and deploy models\. For a list of supported frameworks, refer to [Supported frameworks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/pm_service_supported_frameworks.html)\. + +To build and train a model: + + + + * Use one of the tools that are listed in [Analyzing data and building models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-science.html)\. + * [Import a model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-importing-model.html) that you built and trained outside of Watson Studio\. + + + +### Deployment infrastructure ### + + + + * [Deploy trained models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html) as a web service or for batch processing\. + * [Deploy Python functions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-py-function.html) to simplify AI solutions\. + + + +### Programming Interfaces ### + + + + * Use [Python client library](https://ibm.github.io/watson-machine-learning-sdk/) to work with all of your Watson Machine Learning assets in a notebook\. + * Use [REST API](https://cloud.ibm.com/apidocs/machine-learning) to call methods from the base URLs for the Watson Machine Learning API endpoints\. + * When you call the API, use the URL and add the path for each method to form the complete API endpoint for your requests\. For details on checking endpoints, refer to [Looking up a deployment endpoint](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-online.html)\. + + + +**Parent topic:**[Deploying and managing models](https://dataplatform.cloud.ibm.com/docs/content/wsj/wmls/wmls-deploy-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce14b5eff03a17683c6aa16d02f62e1ebad0d7f2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce14b5eff03a17683c6aa16d02f62e1ebad0d7f2.md new file mode 100644 index 0000000..93bfbb7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce14b5eff03a17683c6aa16d02f62e1ebad0d7f2.md @@ -0,0 +1,19 @@ +# applycarmanode properties + +# applycarmanode properties # + +You can use Carma modeling nodes to generate a Carma model nugget\. The scripting name of this model nugget is *applycarmanode*\. For more information on scripting the modeling node itself, see [carmanode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/carmanodeslots.html#carmanodeslots)\. + + + +applycarmanode properties + +Table 1\. applycarmanode properties + +| `applycarmanode` Properties | Values | Property description | +| --------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `enable_sql_generation` | `udf``native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce1b598a354c454f2d201039a2bb6d69babbf840.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce1b598a354c454f2d201039a2bb6d69babbf840.md new file mode 100644 index 0000000..3a2494d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce1b598a354c454f2d201039a2bb6d69babbf840.md @@ -0,0 +1,53 @@ +# SPSS predictive analytics clustering algorithms in notebooks + +# SPSS predictive analytics clustering algorithms in notebooks # + +You can use the scalable Two\-Step or the Cluster model evaluation algorithm to cluster data in notebooks\. + +## Two\-Step Cluster ## + +Scalable Two\-Step is based on the familiar two\-step clustering algorithm, but extends both its functionality and performance in several directions\. + +First, it can effectively work with large and distributed data supported by Spark that provides the Map\-Reduce computing paradigm\. + +Second, the algorithm provides mechanisms for selecting the most relevant features for clustering the given data, as well as detecting rare outlier points\. Moreover, it provides an enhanced set of evaluation and diagnostic features for enabling insight\. + +The two\-step clustering algorithm first performs a pre\-clustering step by scanning the entire dataset and storing the dense regions of data cases in terms of summary statistics called cluster features\. The cluster features are stored in memory in a data structure called the CF\-tree\. Finally, an agglomerative hierarchical clustering algorithm is applied to cluster the set of cluster features\. + +**Python example code:** + + from spss.ml.clustering.twostep import TwoStep + + cluster = TwoStep(). \ + setInputFieldList(["region", "happy", "age"]). \ + setDistMeasure("LOGLIKELIHOOD"). \ + setFeatureImportanceMethod("CRITERION"). \ + setAutoClustering(True) + + clusterModel = cluster.fit(data) + predictions = clusterModel.transform(data) + predictions.show() + +## Cluster model evaluation ## + +Cluster model evaluation (CME) aims to interpret cluster models and discover useful insights based on various evaluation measures\. + +It's a post\-modeling analysis that's generic and independent from any types of cluster models\. + +**Python example code:** + + from spss.ml.clustering.twostep import TwoStep + + cluster = TwoStep(). \ + setInputFieldList(["region", "happy", "age"]). \ + setDistMeasure("LOGLIKELIHOOD"). \ + setFeatureImportanceMethod("CRITERION"). \ + setAutoClustering(True) + + clusterModel = cluster.fit(data) + predictions = clusterModel.transform(data) + predictions.show() + +**Parent topic:**[SPSS predictive analytics algorithms](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spss-algorithms.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce40b0cef1449476821a1ebd8d0cf339c866d16a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce40b0cef1449476821a1ebd8d0cf339c866d16a.md new file mode 100644 index 0000000..27b2c1c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce40b0cef1449476821a1ebd8d0cf339c866d16a.md @@ -0,0 +1,25 @@ +# applyneuralnetworknode properties + +# applyneuralnetworknode properties # + +You can use Neural Network modeling nodes to generate a Neural Network model nugget\. The scripting name of this model nugget is *applyneuralnetworknode*\. For more information on scripting the modeling node itself, see [neuralnetworknode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/properties/neuralnetworkslots.html#neuralnetworkslots)\. + + + +applyneuralnetworknode properties + +Table 1\. applyneuralnetworknode properties + +| `applyneuralnetworknode` Properties | Values | Property description | +| ----------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `use_custom_name` | *flag* | | +| `custom_name` | *string* | | +| `confidence` | `onProbability`
`onIncrease` | | +| `score_category_probabilities` | *flag* | | +| `max_categories` | *number* | | +| `score_propensity` | *flag* | | +| `enable_sql_generation` | `false`
`true`
`native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce7976afe82e2d17ee1fa308570afa42e0e91667.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce7976afe82e2d17ee1fa308570afa42e0e91667.md new file mode 100644 index 0000000..991c69d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ce7976afe82e2d17ee1fa308570afa42e0e91667.md @@ -0,0 +1,41 @@ +# Building the flow (SPSS Modeler) + +# Building the flow # + + + +1. Add a Data Asset node that points to pm\_customer\_train1\.csv\. +2. Add a Type node, and select `response` as the target field (Role = Target)\. Set the measure for this field to Flag\. + + Figure 1. Setting the measurement level and role + + ![Setting the measurement level and role](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autoflag_build_target.png) +3. Set the role to None for the following fields: `customer_id`, `campaign`, `response_date`, `purchase`, `purchase_date`, `product_id`, `Rowid`, and `X_random`\. These fields will be ignored when you are building the model\. +4. Click Read Values in the Type node to make sure that values are instantiated\. + + As we saw earlier, our source data includes information about four different campaigns, each targeted to a different type of customer account. These campaigns are coded as integers in the data, so to make it easier to remember which account type each integer represents, let's define labels for each one. + + Figure 2. Choosing to specify values for a field + + ![Choosing to specify values for a field](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autoflag_build_value.png) +5. On the row for the campaign field, click the entry in the Value mode column\. +6. Choose Specify from the drop\-down\. + + Figure 3. Defining labels for the field values + + ![Defining labels for the field values](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autoflag_build_labels.png) +7. Click the Edit icon in the column for the campaign field\. Type the labels as shown for each of the four values\. +8. Click OK\. Now the labels will be displayed in output windows instead of the integers\. +9. Attach a Table node to the Type node\. +10. Right\-click the Table node and select Run\. +11. In the Outputs panel, double\-click the table output to open it\. +12. Click OK to close the output window\. + + + +Although the data includes information about four different campaigns, you will focus the analysis on one campaign at a time\. Since the largest number of records fall under the Premium account campaign (coded `campaign=2` in the data), you can use a Select node to include only these records in the flow\. + +Figure 4\. Selecting records for a single campaign + +![Selecting records for a single campaign](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autoflag_build_select.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cebdc984a6e14e7dc6b7526324bf06a0ce6ffe34.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cebdc984a6e14e7dc6b7526324bf06a0ce6ffe34.md new file mode 100644 index 0000000..676641c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cebdc984a6e14e7dc6b7526324bf06a0ce6ffe34.md @@ -0,0 +1,26 @@ +# applycoxregnode properties + +# applycoxregnode properties # + +You can use Cox modeling nodes to generate a Cox model nugget\. The scripting name of this model nugget is *applycoxregnode*\. For more information on scripting the modeling node itself, see [coxregnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/coxregnodeslots.html#coxregnodeslots)\. + + + +applycoxregnode properties + +Table 1\. applycoxregnode properties + +| `applycoxregnode` Properties | Values | Property description | +| ---------------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `future_time_as` | `Intervals``Fields` | | +| `time_interval` | *number* | | +| `num_future_times` | *integer* | | +| `time_field` | *field* | | +| `past_survival_time` | *field* | | +| `all_probabilities` | *flag* | | +| `cumulative_hazard` | *flag* | | +| `enable_sql_generation` | `false``native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cee9ef1f47611f6a9c00bb76c91b94b7da2a62ff.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cee9ef1f47611f6a9c00bb76c91b94b7da2a62ff.md new file mode 100644 index 0000000..b3047d9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cee9ef1f47611f6a9c00bb76c91b94b7da2a62ff.md @@ -0,0 +1,86 @@ +# Starting the aggregator (Admin) + +# Starting the aggregator (Admin) # + +An administrator completes the following steps to start the experiment and train the global model\. + + + + * [Step 1: Set up the Federated Learning experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-agg.html?context=cdpaas&locale=en#fl-setup) + * [Step 2: Create the remote training system](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-agg.html?context=cdpaas&locale=en#rts) + * [Step 3: Start the experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-agg.html?context=cdpaas&locale=en#start) + + + +## Step 1: Set up the Federated Learning experiment ## + +Set up a Federated Learning experiment from a project\. + + + +1. From the project, click **New asset > Federated Learning**\. +2. Name the experiment\. + *Optional:* Add an optional description and tags. +3. [Add new collaborators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html) to the project\. +4. In the **Configure** tab, choose the training framework and model type\. See [Frameworks, fusion methods, and Python versions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-frames.html) for a table listing supported frameworks, fusion methods, and their attributes\. *Optional:* You can choose to enable the homomorphic encryption feature\. For more details, see [Applying encryption](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-homo.html)\. +5. Click **Select** under **Model specification** and upload the `.zip` file that contains your initial model\. +6. In the **Define hyperparameters** tab, you can choose hyperparameter options available for your framework and fusion method to tune your model\. + + + +## Step 2: Create the Remote Training System ## + +Create Remote Training Systems (RTS) that authenticates the participating parties of the experiment\. + + + +1. At **Select remote training system**, click **Add new systems**\. + ![Screenshot of Remote Training System UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl-rts.png) +2. Configure the RTS\. + + \| Field name \| Definition \| Example \| \| -- \| -- \| -- \| \| Name \| A name to identify this RTS instance. \| `Canada Bank Model: Federated Learning Experiment` \| \| Description + (Optional) \| Description of the training system. \| This Remote Training System is for a + Federated Learning experiment to train a model for + predicting credit card fraud with data from Canadian banks. \| \| System administrator + (Optional) \| Specify a user with read-only access to this RTS. They can see system details, logs, and scripts, but not necessarily participate in the experiment. They should be contacted if issues occur when running the experiment. \| `Admin (admin@example.com)` \| \| Allowed identities \| List project collaborators who can participate in the Federated Learning experiment training. Multiple collaborators can be registered in this RTS, but only one can participate in the experiment. Multiple RTS's are needed to authenticate all participating collaborators. \| `John Doe (john.doe@example.com)` + `Jane Doe (jane.doe@example.com)` \| \| Allowed IP addresses + (Optional) \| Restrict individual parties from connecting to Federated Learning outside of a specified IP address. + + 1. To configure this, click **Configure**. + 2. For *Allowed identities*, select the user to place IP constraints on. + 3. For *Allowed IP addresses for user*, enter a comma seperated list of IPs and or CIDRs that can connect to the Remote Training System. Note: Both IPv4 and IPv6 are supported. \| John + 1234:5678:90ab:cdef:1234:5678:90ab:cdef: (John’s office IP), 123.123.123.123 (John’s home IP), 0987.6543.21ab.cdef (Remote VM IP) + Jane + 123.123.123.0/16 (Jane's home IP), 0987.6543.21ab.cdef (Remote machine IP) \| \| Tags + (Optional) \| Associate keywords with the Remote Training System to make it easier to find. \| `Canada` + `Bank` + `Model` + `Credit` + `Fraud` \| + + + + + +1. Click **Add** to save the RTS instance\. If you are creating multiple remote training instances, you can repeat these steps\. +2. Click **Add systems** to save the RTS as an asset in the project\. + + Tip: You can use an RTS definition for future experiments. For example, in the **Select remote training system** tab, you can select any Remote Training System that you previously created. +3. Each RTS can only authenticate one of its allowed party identities\. Create an RTS for each new participating part(ies)\. + + + +## Step 3: Start the experiment ## + +Start the Federated Learning aggregator to initiate training of the global model\. + + + +1. Click **Review and create** to view the settings of your current Federated Learning experiment\. Then, click **Create**\. ![Screenshot of Review and Create Experiment UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl-rev.png) +2. The Federated Learning experiment will be in `Pending` status while the aggregator is starting\. When the aggregator starts, the status will change to `Setup – Waiting for remote systems`\. + + + +**Parent topic:**[Creating a Federated Learning experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-start.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cf4254ce9e6d890ccaa2564da3e9b57071ade342.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cf4254ce9e6d890ccaa2564da3e9b57071ade342.md new file mode 100644 index 0000000..38d387e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cf4254ce9e6d890ccaa2564da3e9b57071ade342.md @@ -0,0 +1,373 @@ +# Compute resource options for the notebook editor in projects + +# Compute resource options for the notebook editor in projects # + +When you run a notebook in the notebook editor in a project, you choose an environment template, which defines the compute resources for the runtime environment\. The environment template specifies the type, size, and power of the hardware configuration, plus the software configuration\. For notebooks, environment templates include a supported language of Python and R\. + + + + * [Types of environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html?context=cdpaas&locale=en#types) + * [Runtime releases](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html?context=cdpaas&locale=en#runtime-releases) + * [CPU environment templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html?context=cdpaas&locale=en#default-cpu) + * [Spark environment templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html?context=cdpaas&locale=en#default-spark) + * [GPU environment templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html?context=cdpaas&locale=en#default-gpu) + * [Default hardware specifications for scoring models with Watson Machine Learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html?context=cdpaas&locale=en#wml) + * [Data files in notebook environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html?context=cdpaas&locale=en#data-files) + * [Compute usage by service](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html?context=cdpaas&locale=en#compute) + * [Runtime scope](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html?context=cdpaas&locale=en#scope) + * [Changing environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html?context=cdpaas&locale=en#change-env) + + + +## Types of environments ## + +You can use these types of environments for running notebook: + + + + * [Anaconda CPU environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html?context=cdpaas&locale=en#default-cpu) for standard workloads\. + * [Spark environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html?context=cdpaas&locale=en#default-spark) for parallel processing that is provided by the platform or by other services\. + * [GPU environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html?context=cdpaas&locale=en#default-gpu) for compute\-intensive machine learning models\. + + + +Most environment types for notebooks have default environment templates so you can get started quickly\. Otherwise, you can [create custom environment templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-customize-env-definition.html)\. + + + +Environment types for notebooks + +| Environment type | Default templates | Custom templates | +| ---------------- | ----------------- | ---------------- | +| Anaconda CPU | ✓ | ✓ | +| Spark clusters | ✓ | ✓ | +| GPU | ✓ | ✓ | + + + +## Runtime releases ## + +The default environments for notebooks are added as an affiliate of a runtime release and prefixed with `Runtime` followed by the release year and release version\. + +A runtime release specifies a list of key data science libraries and a language version, for example Python 3\.10\. All environments of a runtime release are built based on the library versions defined in the release, thus ensuring the consistent use of data science libraries across all data science applications\. + +The `Runtime 22.2` and `Runtime 23.1` releases are available for Python 3\.10 and R 4\.2\. + +While a runtime release is supported, IBM will update the library versions to address security requirements\. Note that these updates will not change the `.` versions of the libraries, but only the `` versions\. This ensures that your notebook assets will continue to run\. + +### Library packages included in Runtimes ### + +For specific versions of popular data science library packages included in Watson Studio runtimes refer to these tables: + + + +Table 3\. Packages and their versions in the various Runtime releases for Python + +| Library | Runtime 22\.2 on Python 3\.10 | Runtime 23\.1 on Python 3\.10 | +| ------------- | ----------------------------- | ----------------------------- | +| Keras | 2\.9 | 2\.12 | +| Lale | 0\.7 | 0\.7 | +| LightGBM | 3\.3 | 3\.3 | +| NumPy | 1\.23 | 1\.23 | +| ONNX | 1\.12 | 1\.13 | +| ONNX Runtime | 1\.12 | 1\.13 | +| OpenCV | 4\.6 | 4\.7 | +| pandas | 1\.4 | 1\.5 | +| PyArrow | 8\.0 | 11\.0 | +| PyTorch | 1\.12 | 2\.0 | +| scikit\-learn | 1\.1 | 1\.1 | +| SciPy | 1\.8 | 1\.10 | +| SnapML | 1\.8 | 1\.13 | +| TensorFlow | 2\.9 | 2\.12 | +| XGBoost | 1\.6 | 1\.6 | + + + + + +Table 4\. Packages and their versions in the various Runtime releases for R + +| Library | Runtime 22\.2 on R 4\.2 | Runtime 23\.1 on R 4\.2 | +| ------------- | ----------------------- | ----------------------- | +| arrow | 8\.0 | 11\.0 | +| car | 3\.0 | 3\.0 | +| caret | 6\.0 | 6\.0 | +| catools | 1\.18 | 1\.18 | +| forecast | 8\.16 | 8\.16 | +| ggplot2 | 3\.3 | 3\.3 | +| glmnet | 4\.1 | 4\.1 | +| hmisc | 4\.7 | 4\.7 | +| keras | 2\.9 | 2\.12 | +| lme4 | 1\.1 | 1\.1 | +| mvtnorm | 1\.1 | 1\.1 | +| pandoc | 2\.12 | 2\.12 | +| psych | 2\.2 | 2\.2 | +| python | 3\.10 | 3\.10 | +| randomforest | 4\.7 | 4\.7 | +| reticulate | 1\.25 | 1\.25 | +| sandwich | 3\.0 | 3\.0 | +| scikit\-learn | 1\.1 | 1\.1 | +| spatial | 7\.3 | 7\.3 | +| tensorflow | 2\.9 | 2\.12 | +| tidyr | 1\.2 | 1\.2 | +| xgboost | 1\.6 | 1\.6 | + + + +In addition to the libraries listed in the tables, runtimes include many other useful libraries\. To see the full list, select the **Manage** tab in your project, then click **Templates**, select the **Environments** tab, and then click on one of the listed environments\. + +## CPU environment templates ## + +You can select any of the following default CPU environment templates for notebooks\. The default environment templates are listed under **Templates** on the **Environments** page on the **Manage** tab of your project\. + +`DO` Indicates that the environment templates includes the CPLEX and the DOcplex libraries to model and solve decision optimization problems that exceed the complexity that is supported by the Community Edition of the libraries in the other default Python environments\. See [Decision Optimization notebooks](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/DONotebooks.html)\. + +`NLP` Indicates that the environment templates includes the Watson Natural Language Processing library with pre\-trained models for language processing tasks that you can run on unstructured data\. See [Using the Watson Natural Language Processing library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp.html)\. This default environment should be large enough to run the pre\-trained models\. + + + +Default CPU environment templates for notebooks + +| Name | Hardware configuration | CUH rate per hour | +| ------------------------------------------ | ---------------------- | ----------------- | +| Runtime 22\.2 on Python 3\.10 XXS | 1 vCPU and 4 GB RAM | 0\.5 | +| Runtime 22\.2 on Python 3\.10 XS | 2 vCPU and 8 GB RAM | 1 | +| Runtime 22\.2 on Python 3\.10 S | 4 vCPU and 16 GB RAM | 2 | +| Runtime 23\.1 on Python 3\.10 XXS | 1 vCPU and 4 GB RAM | 0\.5 | +| Runtime 23\.1 on Python 3\.10 XS | 2 vCPU and 8 GB RAM | 1 | +| Runtime 23\.1 on Python 3\.10 S | 4 vCPU and 16 GB RAM | 2 | +| DO \+ NLP Runtime 22\.2 on Python 3\.10 XS | 2 vCPU and 8 GB RAM | 6 | +| NLP \+ DO Runtime 23\.1 on Python 3\.10 XS | 2 vCPU and 8 GB RAM | 6 | +| Runtime 22\.2 on R 4\.2 S | 4 vCPU and 16 GB RAM | 2 | +| Runtime 23\.1 on R 4\.2 S | 4 vCPU and 16 GB RAM | 2 | + + + +You should stop all active CPU runtimes when you no longer need them to prevent consuming extra capacity unit hours (CUHs)\. See [CPU idle timeout](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html#stop-active-runtimes)\. + +### Notebooks and CPU environments ### + +When you open a notebook in edit mode in a CPU runtime environment, exactly one interactive session connects to a Jupyter kernel for the notebook language and the environment runtime that you select\. The runtime is started per single user and not per notebook\. This means that if you open a second notebook with the same environment template in the same project, a second kernel is started in the same runtime\. Runtime resources are shared by the Jupyter kernels that you start in the runtime\. Runtime resources are also shared if the CPU has GPU\. + +If you want to avoid sharing runtimes but want to use the same environment template for multiple notebooks in a project, you should create custom environment templates with the same specifications and associate each notebook with its own template\. + +If necessary, you can restart or reconnect to the kernel\. When you restart a kernel, the kernel is stopped and then started in the same session again, but all execution results are lost\. When you reconnect to a kernel after losing a connection, the notebook is connected to the same kernel session, and all previous execution results which were saved are available\. + +## Spark environment templates ## + +You can select any of the following default Spark environment templates for notebooks\. The default environment templates are listed under **Templates** on the **Environments** page on the **Manage** tab of your project\. + + + +Default Spark environment templates for notebooks + +| Name | Hardware configuration | CUH rate per hour | +| --------------------------- | ----------------------------------------------------------------------- | ----------------- | +| Default Spark 3\.3 & R 4\.2 | 2 Executors each: 1 vCPU and 4 GB RAM;
Driver: 1 vCPU and 4 GB RAM | 1 | +| Default Spark 3\.4 & R 4\.2 | 2 Executors each: 1 vCPU and 4 GB RAM;
Driver: 1 vCPU and 4 GB RAM | 1 | + + + +You should stop all active Spark runtimes when you no longer need them to prevent consuming extra capacity unit hours (CUHs)\. See [Spark idle timeout](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html#stop-active-runtimes)\. + +### Large Spark environments ### + +If you have the Watson Studio Professional plan, you can create custom environment templates for larger Spark environments\. + +Professional plan users can have up to 35 executors and can choose from the following options for both driver and executor: + + + +Hardware configurations for Spark environments + +| Hardware configuration | +| ---------------------- | +| 1 vCPU and 4 GB RAM | +| 1 vCPU and 8 GB RAM | +| 1 vCPU and 12 GB RAM | + + + +The CUH rate per hour increases by 0\.5 for every vCPU that is added\. For example, `1x Driver: 3vCPU with 12GB of RAM` and `4x Executors: 2vCPU with 8GB of RAM` amounts to `(3 + (4 * 2)) = 11 vCPUs` and `5.5 CUH`\. + +### Notebooks and Spark environments ### + +You can select the same Spark environment template for more than one notebook\. Every notebook associated with that environment has its own dedicated Spark cluster and no resources are shared\. + +When you start a Spark environment, extra resources are needed for the Jupyter Enterprise Gateway, Spark Master, and the Spark worker daemons\. These extra resources amount to 1 vCPU and 2 GB of RAM for the driver and 1 GB RAM for each executor\. You need to take these extra resources into account when selecting the hardware size of a Spark environment\. For example: if you create a notebook and select `Default Spark 3.3 & Python 3.10`, the Spark cluster consumes 3 vCPU and 12 GB RAM but, as 1 vCPU and 4 GB RAM are required for the extra resources, the resources remaining for the notebook are 2 vCPU and 8 GB RAM\. + +### File system on a Spark cluster ### + +If you want to share files across executors and the driver or kernel of a Spark cluster, you can use the shared file system at `/home/spark/shared`\. + +If you want to use your own custom libraries, you can store them under `/home/spark/shared/user-libs/`\. There are four subdirectories under `/home/spark/shared/user-libs/` that are pre\-configured to be made available to Python and R or Java runtimes\. + +The following tables lists the pre\-configured subdirectories where you can add your custom libaries\. + + + +Table 5\. Pre\-configured subdirectories for custom libraries + +| Directory | Type of library | +| --------------------------------------- | ------------------ | +| `/home/spark/shared/user-libs/python3/` | Python 3 libraries | +| `/home/spark/shared/user-libs/R/` | R packages | +| `/home/spark/shared/user-libs/spark2/` | Java JAR files | + + + +To share libraries across a Spark driver and executors: + + + +1. Download your custom libraries or JAR files to the appropriate pre\-configured directory\. +2. Restart the kernel from the notebook menu by clicking **Kernel > Restart Kernel**\. This loads your custom libraries or JAR files in Spark\. + + + +Note that these libraries are not persisted\. When you stop the environment runtime and restart it again later, you need to load the libraries again\. + +## GPU environment templates ## + +You can select the following GPU environment template for notebooks\. The environment templates are listed under **Templates** on the **Environments** page on the **Manage** tab of your project\. + +The GPU environment template names indicate the accelerator power\. The GPU environment templates include the Watson Natural Language Processing library with pre\-trained models for language processing tasks that you can run on unstructured data\. See [Using the Watson Natural Language Processing library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp.html)\. + +**~** Indicates that the environment template requires the Watson Studio Professional plan\. See [Offering plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/ws-plans.html)\. + + + +Default GPU environment templates for notebooks + +| Name | Hardware configuration | CUH rate per hour | +| ---------------------------------------------- | ----------------------------------------------------- | ----------------- | +| GPU V100 Runtime 22\.2 on Python 3\.10 **~** | 40 vCPU \+ 172 GB RAM \+ 1 NVIDIA TESLA V100 (1 GPU) | 68 | +| GPU V100 Runtime 23\.1 on Python 3\.10 **~** | 40 vCPU \+ 172 GB RAM \+ 1 NVIDIA TESLA V100 (1 GPU) | 68 | +| GPU 2xV100 Runtime 22\.2 on Python 3\.10 **~** | 80 vCPU and 344 GB RAM \+ 2 NVIDIA TESLA V100 (2 GPU) | 136 | +| GPU 2xV100 Runtime 23\.1 on Python 3\.10 **~** | 80 vCPU and 344 GB RAM \+ 2 NVIDIA TESLA V100 (2 GPU) | 136 | + + + +You should stop all active GPU runtimes when you no longer need them to prevent consuming extra capacity unit hours (CUHs)\. See [GPU idle timeout](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html#stop-active-runtimes)\. + +### Notebooks and GPU environments ### + +GPU environments for notebooks are available only in the Dallas IBM Cloud service region\. + +You can select the same Python and GPU environment template for more than one notebook in a project\. In this case, every notebook kernel runs in the same runtime instance and the resources are shared\. To avoid sharing runtime resources, create multiple custom environment templates with the same specifications and associate each notebook with its own template\. + +## Default hardware specifications for scoring models with Watson Machine Learning ## + +When you invoke the Watson Machine Learning API within a notebook, you consume compute resources from the Watson Machine Learning service as well as the compute resources for the notebook kernel\. + +You can select any of the following hardware specifications when you connect to Watson Machine Learning and create a deployment\. + + + +Hardware specifications available when invoking the Watson Machine Learning service in a notebook + +| Capacity size | Hardware configuration | CUH rate per hour | +| ------------- | --------------------------- | ----------------- | +| Extra small | 1x4 = 1 vCPU and 4 GB RAM | 0\.5 | +| Small | 2x8 = 2 vCPU and 8 GB RAM | 1 | +| Medium | 4x16 = 4 vCPU and 16 GB RAM | 2 | +| Large | 8x32 = 8 vCPU and 32 GB RAM | 4 | + + + +## Data files in notebook environments ## + +If you are working with large data sets, you should store the data sets in smaller chunks in the IBM Cloud Object Storage associated with your project and process the data in chunks in the notebook\. Alternatively, you should run the notebook in a Spark environment\. + +Be aware that the file system of each runtime is non\-persistent and cannot be shared across environments\. To persist files in Watson Studio, you should use IBM Cloud Object Storage\. The easiest way to use IBM Cloud Object Storage in notebooks in projects is to leverage the [`project-lib` package for Python](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/project-lib-python.html) or the [`project-lib` package for R](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/project-lib-r.html)\. + +## Compute usage by service ## + +The notebook runtimes consumes compute resources as CUH from Watson Studio, while running default or custom environments\. You can monitor the Watson Studio CUH consumption in the project on the **Resource usage** page on the **Manage** tab of the project\. + +Notebooks can also consume CUH from the Watson Machine Learning service when the notebook invokes the Watson Machine Learning to score a model\. You can monitor the total monthly amount of CUH consumption for the Watson Machine Learning service on the **Resource usage** page on the **Manage** tab of the project\. + +### Track CUH consumption for Watson Machine Learning in a notebook ### + +To calculate capacity unit hours consumed by a notebook, run this code in the notebook: + + CP = client.service_instance.get_details() + CUH = CUH["entity"]["capacity_units"]/(3600*1000) + print(CUH) + +For example: + + 'capacity_units': {'current': 19773430} + + 19773430/(3600*1000) + +returns 5\.49 CUH + +For details, see the Service Instances section of the [IBM Watson Machine Learning API](https://cloud.ibm.com/apidocs/machine-learning) documentation\. + +## Runtime scope ## + +Environment runtimes are always scoped to an environment template and a user within a project\. If different users in a project work with the same environment, each user will get a separate runtime\. + +If you select to run a version of a notebook as a scheduled job, each scheduled job will always start in a dedicated runtime\. The runtime is stopped when the job finishes\. + +## Changing the environment of a notebook ## + +You can switch environments for different reasons, for example, you can: + + + + * Select an environment with more processing power or more RAM + * Change from using an environment without Spark to a Spark environment + + + +You can only change the environment of a notebook if the notebook is unlocked\. You can change the environment: + + + + * From the notebook opened in edit mode: + + + + 1. Save your notebook changes. + 2. Click the Notebook Info icon (![Notebook Info icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/get-information_32.png)) from the notebook toolbar and then click **Environment**. + 3. Select another template with the compute power and memory capacity from the list. + 4. Select **Change environment**. This stops the active runtime and starts the newly selected environment. + + + + * From the **Assets** page of your project: + + + + 1. Select the notebook in the Notebooks section, click **Actions > Change Environment** and select another environment. The kernel must be stopped before you can change the environment. This new runtime environment will be instantiated the next time the notebook is opened for editing. + + + + * In the notebook job by editing the job template\. See [Editing job settings](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html#view-job-details)\. + + + +## Next steps ## + + + + * [Creating a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/creating-notebooks.html) + * [Creating your own environment template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-customize-env-definition.html) + * [Customizing an environment template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/customize-envs.html) + * [Stopping active notebook runtimes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html#stop-active-runtimes) + + + +## Learn more ## + + + + * [Monitoring account resource usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html) + + + +**Parent topic:**[Compute resources for tools](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cf6fe4e4058c24f0beb94d379fb9e820c09456d2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cf6fe4e4058c24f0beb94d379fb9e820c09456d2.md new file mode 100644 index 0000000..9d94cc9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cf6fe4e4058c24f0beb94d379fb9e820c09456d2.md @@ -0,0 +1,20 @@ +# GLE node (SPSS Modeler) + +# GLE node # + +The GLE model identifies the dependent variable that is linearly related to the factors and covariates via a specified link function\. Moreover, the model allows for the dependent variable to have a non\-normal distribution\. It covers widely used statistical models, such as linear regression for normally distributed responses, logistic models for binary data, loglinear models for count data, complementary log\-log models for interval\-censored survival data, plus many other statistical models through its very general model formulation\. + +Examples\. A shipping company can use generalized linear models to fit a Poisson regression to damage counts for several types of ships constructed in different time periods, and the resulting model can help determine which ship types are most prone to damage\. + +A car insurance company can use generalized linear models to fit a gamma regression to damage claims for cars, and the resulting model can help determine the factors that contribute the most to claim size\. + +Medical researchers can use generalized linear models to fit a complementary log\-log regression to interval\-censored survival data to predict the time to recurrence for a medical condition\. + +GLE models work by building an equation that relates the input field values to the output field values\. After the model is generated, you can use it to estimate values for new data\. + +For a categorical target, for each record, a probability of membership is computed for each possible output category\. The target category with the highest probability is assigned as the predicted output value for that record\. + +Requirements\. You need one or more input fields and exactly one target field (which can have a measurement level of `Continuous`, `Categorical`, or `Flag`) with two or more categories\. Fields used in the model must have their types fully instantiated\. + +Note: When first creating a flow, you select which runtime to use\. By default, flows use the IBM SPSS Modeler runtime\. If you want to use native Spark algorithms instead of SPSS algorithms, select the Spark runtime\. Properties for this node will vary depending on which runtime option you choose\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cf88bcc09a32b2d6d65f2c2a831e2960aca1e347.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cf88bcc09a32b2d6d65f2c2a831e2960aca1e347.md new file mode 100644 index 0000000..8670f7f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cf88bcc09a32b2d6d65f2c2a831e2960aca1e347.md @@ -0,0 +1,5 @@ +# Cloud Object Storage on IBM watsonx + +# Cloud Object Storage on IBM® watsonx # + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cfc54bb4cea29104bd4f9793b51abe558aa0250d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cfc54bb4cea29104bd4f9793b51abe558aa0250d.md new file mode 100644 index 0000000..8bd8ca0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/cfc54bb4cea29104bd4f9793b51abe558aa0250d.md @@ -0,0 +1,7 @@ +# Plot node (SPSS Modeler) + +# Plot node # + +Plot nodes show the relationship between numeric fields\. You can create a plot using points (also known as a scatterplot), or you can use lines\. You can create three types of line plots by specifying an X Mode in the node properties\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d0142ffcd3063427101ccc165c5e5f2b0fa286db.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d0142ffcd3063427101ccc165c5e5f2b0fa286db.md new file mode 100644 index 0000000..6902164 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d0142ffcd3063427101ccc165c5e5f2b0fa286db.md @@ -0,0 +1,26 @@ +# Federated Learning XGBoost samples + +# Federated Learning XGBoost samples # + +These are links to sample files to run Federated Learning by using API calls with an XGBoost framework\. To see a step\-by\-step UI driven approach, go to [Federated Learning XGBoost tutorial for UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-xg-tutorial.html)\. + +## Download the Federated Learning sample files ## + +The Federated Learning samples have two parts, both in Jupyter Notebook format that can run in the latest Python environment\. + +For single\-user demonstrative purposes, the Notebooks are placed in a project\. Go to the following link and click **Create project** to get all the sample files\. + +[Download the Federated Learning project](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/45a71514d67d87bb7900880b4501732c?context=wx) + +You can also get the Notebook separately\. For practical purposes of Federated Learning, one user would run the admin Notebook and multiple users would run the party Notebook\. For more details on the admin and party, see [Terminology](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-term.html) + + + +1. [Federated Learning XGBoost Demo Part 1 \- for Admin](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/c95a130a2efdddc0a4b38c319a011fed) +2. [Federated Learning XGBoost Demo Part 2 \- for Party](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/155a5e78ca72a013e45d54ae87012306) + + + +**Parent topic:**[Federated Learning tutorial and samples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-demo.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d04178dde54f21a248daff3f1582eb4bf1e9ac43.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d04178dde54f21a248daff3f1582eb4bf1e9ac43.md new file mode 100644 index 0000000..ca03872 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d04178dde54f21a248daff3f1582eb4bf1e9ac43.md @@ -0,0 +1,28 @@ +# Text Analytics (SPSS Modeler) + +# Text Analytics # + +SPSS Modeler offers nodes that are specialized for handling text\. + +The Text Analytics nodes offer powerful text analytics capabilities, using advanced linguistic technologies and Natural Language Processing (NLP) to rapidly process a large variety of unstructured text data and, from this text, extract and organize the key concepts\. Text Analytics can also group these concepts into categories\. + +Around 80% of data held within an organization is in the form of text documents—for example, reports, web pages, e\-mails, and call center notes\. Text is a key factor in enabling an organization to gain a better understanding of their customers' behavior\. A system that incorporates NLP can intelligently extract concepts, including compound phrases\. Moreover, knowledge of the underlying language allows classification of terms into related groups, such as products, organizations, or people, using meaning and context\. As a result, you can quickly determine the relevance of the information to your needs\. These extracted concepts and categories can be combined with existing structured data, such as demographics, and applied to modeling in SPSS Modeler to yield better and more\-focused decisions\. + +Linguistic systems are knowledge sensitive—the more information contained in their dictionaries, the higher the quality of the results\. Text Analytics provides a set of linguistic resources, such as dictionaries for terms and synonyms, libraries, and templates\. These nodes further allow you to develop and refine these linguistic resources to your context\. Fine\-tuning of the linguistic resources is often an iterative process and is necessary for accurate concept retrieval and categorization\. Custom templates, libraries, and dictionaries for specific domains, such as CRM and genomics, are also included\. + +Tips for getting started: + + + + * Watch the following video for an overview of Text Analytics\. + * See the [Hotel satisfaction example for Text Analytics](https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_ta_hotel.html)\. + + + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +[https://video\.ibm\.com/embed/channel/23952663/video/spss\-text\-analytics\-workbench](https://video.ibm.com/embed/channel/23952663/video/spss-text-analytics-workbench) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d05d9570cd32acccf91588c5886a1c4f5da56d01.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d05d9570cd32acccf91588c5886a1c4f5da56d01.md new file mode 100644 index 0000000..08e1397 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d05d9570cd32acccf91588c5886a1c4f5da56d01.md @@ -0,0 +1,40 @@ +# xgboosttreenode properties + +# xgboosttreenode properties # + +![XGBoost Tree node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/pythonxgboosttreenodeicon.png)XGBoost Tree© is an advanced implementation of a gradient boosting algorithm with a tree model as the base model\. Boosting algorithms iteratively learn weak classifiers and then add them to a final strong classifier\. XGBoost Tree is very flexible and provides many parameters that can be overwhelming to most users, so the XGBoost Tree node in SPSS Modeler exposes the core features and commonly used parameters\. The node is implemented in Python\. + + + +xgboosttreenode properties + +Table 1\. xgboosttreenode properties + +| `xgboosttreenode` properties | Data type | Property description | +| ---------------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `custom_fields` | *boolean* | This option tells the node to use field information specified here instead of that given in any upstream Type node(s)\. After selecting this option, specify the fields as required\. | +| `target` | *field* | The target fields\. | +| `inputs` | *field* | The input fields\. | +| `tree_method` | *string* | The tree method for model building\. Possible values are `auto`, `exact`, or `approx`\. Default is `auto`\. | +| `num_boost_round` | *integer* | The num boost round value for model building\. Specify a value between `1` and `1000`\. Default is `10`\. | +| `max_depth` | *integer* | The max depth for tree growth\. Specify a value of `1` or higher\. Default is `6`\. | +| `min_child_weight` | *Double* | The min child weight for tree growth\. Specify a value of `0` or higher\. Default is `1`\. | +| `max_delta_step` | *Double* | The max delta step for tree growth\. Specify a value of `0` or higher\. Default is `0`\. | +| `objective_type` | *string* | The objective type for the learning task\. Possible values are `reg:linear`, `reg:logistic`, `reg:gamma`, `reg:tweedie`, `count:poisson`, `rank:pairwise`, `binary:logistic`, or `multi`\. Note that for flag targets, only `binary:logistic` or `multi` can be used\. If `multi` is used, the score result will show the `multi:softmax` and `multi:softprob` XGBoost objective types\. | +| `early_stopping` | *Boolean* | Whether to use the early stopping function\. Default is `False`\. | +| `early_stopping_rounds` | *integer* | Validation error needs to decrease at least every early stopping round(s) to continue training\. Default is `10`\. | +| `evaluation_data_ratio` | *Double* | Ration of input data used for validation errors\. Default is `0.3`\. | +| `random_seed` | *integer* | The random number seed\. Any number between `0` and `9999999`\. Default is `0`\. | +| `sample_size` | *Double* | The sub sample for control overfitting\. Specify a value between `0.1` and `1.0`\. Default is `0.1`\. | +| `eta` | *Double* | The eta for control overfitting\. Specify a value between `0` and `1`\. Default is `0.3`\. | +| `gamma` | *Double* | The gamma for control overfitting\. Specify any number `0` or greater\. Default is `6`\. | +| `col_sample_ratio` | *Double* | The colsample by tree for control overfitting\. Specify a value between `0.01` and `1`\. Default is `1`\. | +| `col_sample_level` | *Double* | The colsample by level for control overfitting\. Specify a value between `0.01` and `1`\. Default is `1`\. | +| `lambda` | *Double* | The lambda for control overfitting\. Specify any number `0` or greater\. Default is `1`\. | +| `alpha` | *Double* | The alpha for control overfitting\. Specify any number `0` or greater\. Default is `0`\. | +| `scale_pos_weight` | *Double* | The scale pos weight for handling imbalanced datasets\. Default is `1`\. | +| `use_HPO` | | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d05f366afc5726dc1a258edc3689067381efdecc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d05f366afc5726dc1a258edc3689067381efdecc.md new file mode 100644 index 0000000..bfb7d3c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d05f366afc5726dc1a258edc3689067381efdecc.md @@ -0,0 +1,27 @@ +# About CLEM (SPSS Modeler) + +# About CLEM # + +The Control Language for Expression Manipulation (CLEM) is a powerful language for analyzing and manipulating the data that streams through an SPSS Modeler flow\. Data miners use CLEM extensively in flow operations to perform tasks as simple as deriving profit from cost and revenue data or as complex as transforming web log data into a set of fields and records with usable information\. + +CLEM is used within SPSS Modeler to: + + + + * Compare and evaluate conditions on record fields + * Derive values for new fields + * Derive new values for existing fields + * Reason about the sequence of records + * Insert data from records into reports + + + +CLEM expressions are indispensable for data preparation in SPSS Modeler and can be used in a wide range of nodes—from record and field operations (Select, Balance, Filler) to plots and output (Analysis, Report, Table)\. For example, you can use CLEM in a Derive node to create a new field based on a formula such as ratio\. + +CLEM expressions can also be used for global search and replace operations\. For example, the expression `@NULL(@FIELD)` can be used in a Filler node to replace **system\-missing values** with the integer value 0\. (To replace **user\-missing values**, also called blanks, use the `@BLANK` function\.) + +More complex CLEM expressions can also be created\. For example, you can derive new fields based on a conditional set of rules, such as a new value category created by using the following expressions: `If: CardID = @OFFSET(CardID,1), Then: @OFFSET(ValueCategory,1), Else: 'exclude'`\. + +This example uses the `@OFFSET` function to say: If the value of the field *CardID* for a given record is the same as for the previous record, then return the value of the field named *ValueCategory* for the previous record\. Otherwise, assign the string "exclude\." In other words, if the *CardID*s for adjacent records are the same, they should be assigned the same value category\. (Records with the exclude string can later be culled using a Select node\.) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d0907278ca0ea55b0e0ed9e834810d502a817af0.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d0907278ca0ea55b0e0ed9e834810d502a817af0.md new file mode 100644 index 0000000..2db84b2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d0907278ca0ea55b0e0ed9e834810d502a817af0.md @@ -0,0 +1,85 @@ +# Troubleshooting Synthetic Data Generator + +# Troubleshooting Synthetic Data Generator # + +Use this information to resolve questions about using *Synthetic Data Generator*\. + +## Typeless columns ignored for an Import node ## + +When you use an **Import** node that contains **Typeless** columns, these columns will be ignored when you use the **Mimic** node\. After pressing the **Read Values** button, the **Typeless** columns will be automatically set to **Pass** and will not be present in the final dataset\. + +Suggested workaround: + +Add a new column in the **Generate** node for the missing column(s)\. + +## Size limit notice ## + +The *Synthetic Data Generator* environment can import up to ~2\.5GB of data\. + +Suggested workaround: + +If you receive a related error message or your data fails to import, please reduce the amount of data and try again\. + +## Internal error occurred: SCAPI error: The value on row 1,029 is not a valid string ## + +For example, preview of data asset using **Import** node gives the following error: + + Node: + Import + WDP Connector Error: CDICO9999E: Internal error occurred: SCAPI error: The value on row 1,029 is not a valid string of the Bit data type for the SecurityDelay column. + +This is expected behavior\. In this particular case, the 1st 1000 rows were binary, 0's or 1's\. The value at row 1,029 was 3\. For most flat files, *Synthetic Data Generator* reads the 1st 1000 records to infer the data type\. In this case, *Synthetic Data Generator* inferred binary values (0 or 1)\. When *Synthetic Data Generator* read a value of 3 at row 1,029, it threw an error, as 3 is not a binary value\. + +Suggested workarounds: + + + +1. Users can adjust their `Infer_record_count` parameter to include more data, choosing 2000 rows instead (or more)\. +2. Users can update the value in the first 1000 rows that is causing the error, if this is an error in the data\. + + + +## Error Mimic Data set no available input record\. ## + +The **Mimic** node requires the input dataset to have at least one valid record (a record without any missing values)\. If your dataset is empty, or if the dataset does not contain at least one valid record, clicking **Run selection** gives the following error message: + + Node: + Mimic + Mimic Data set no available input record. + +Suggested workarounds: + + + +1. Fix your dataset so that there is at least one record (row) that contains a value for every column and then try again\. +2. Click **Read values** from the **Import** node and run your flow again\. ![Read values](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/td-read-values-sd.png) + + + +## Error: Incorrect number of fields detected in the server data model\. or WDP Connector Execution Error ## + +Creating a new flow using a `.synth` file, then doing a migration of the **Import** node with a newly uploaded file to the project, and then running the flow, gives one or both of the following errors: + + Error: Incorrect number of fields detected in the server data model. + +or + + WDP Connector Execution Error + +This error is caused by using different data sets (data models) for the create flow and for the migration data\. + +Suggested workaround: + +Run the **Mimic** node that creates the **Generate** node a second time\. + +## Error: Valid variable does not exist in metadata ## + +Doing a migration of the **Import** node and then running the flow fails and gives the error: + + Error: Valid variable does not exist in metadata + +Suggested workaround: + +Make sure that in your **Import** node you have at least one field that is not **Typeless**\. For example, in the screen capture below, the only field in the **Import** node is **Typeless**\. At least one field that is not **Typeless** should be added to the **Import** node to avoid this error\. ![Typeless field in Import node](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/images/td-import-typeless-sd.png) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d0dece55336bc8393593243d829b9d4b1e6159fd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d0dece55336bc8393593243d829b9d4b1e6159fd.md new file mode 100644 index 0000000..d841b4e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d0dece55336bc8393593243d829b9d4b1e6159fd.md @@ -0,0 +1,119 @@ +# Add users to the account + +# Add users to the account # + +As an **Administrator**, you add the people in your organization who need access to IBM watsonx to the IBM Cloud account and then assign them the appropriate roles for their tasks\. + + + +1. [Add nonadministrative users](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-addl-users.html?context=cdpaas&locale=en#users) to the IBM Cloud account and assign access groups or roles so that they can work in IBM watsonx\. The new users receive an email invitation to join the account\. They must accept the invitation to be added to the account\. +2. Set up access groups to simplify permissions and role assignment\. +3. Optional: [Add administrative users](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-addl-users.html?context=cdpaas&locale=en#adminuser) to the IBM Cloud account\. + + + +## Add nonadministrative users to your IBM Cloud account ## + +You invite users to your IBM Cloud account by sending an email invitation\. The user accepts the invitation to join the account\. You must assign them roles (or access groups) to provide the necessary permissions to work in IBM watsonx\. For a baseline role assignment, you can provide minimum permissions by assigning the following roles in the **Manage > Access(IAM) > Users > Invite users > Access policy** screen in IBM Cloud: + + + +Table 1\. Minimum roles for new IBM watsonx users + +| Level | Role | Description | +| --------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| Service | **All Identity and Access enabled services** | Can access all services that use IAM for access management; usually assigned only to administrators in a production environment | +| Resources | **All resources** | Scope of resources for which user has access | +| Resource group access | **Viewer** | Can view but not modify resource groups | +| Service access | **Reader** | Can perform read\-only actions within a service | +| Platform access | **Viewer** | Can view but not modify service instances | + + + +### IBM account membership ### + +To be authorized for IBM watsonx, users must have existing IBMids\. If the invited user does not have an IBMid, it is created for them when they join the account\. + +### Assigning roles ### + +To assign minimum permissions to individual users: + + + +1. From IBM watsonx, click **Administration > Access (IAM)** to open the **Manage access and users** page for your IBM Cloud account\. +2. Click **Users > Invite users\+**\. +3. Enter one or more email addresses that are separated by commas, spaces, or line breaks\. The limit is 100 email addresses\. The settings apply to all the email addresses\. +4. Click the **Access policy** tile\. +5. Select **All Identity and Access enabled services**, then click **Next** to assign Resource access\. +6. For **Resources**, choose **All resources**\. Click **Next**\. +7. For **Resource group access**, choose **Viewer**\. Click **Next** +8. For **Roles and action**, choose the following minimum permissions: + + + + * In the **Service access** section, select **Reader** + * In the **Platform access** section, select **Viewer**. + + + +9. Review the settings and edit if necessary\. +10. Click **Add** to save the policy\. +11. Click **Invite** to send an email invitation to each email address\. The policies are assigned to the users when they accept the invitation to join the account\. + + + +### Modifying a user's role ### + +When you change a user's role, their access to services changes\. Their ability to complete work in IBM watsonx can be impacted if they do not have the necessary access\. + +## Optional: Add administrative users to your IBM Cloud account ## + +You can add administrative users with the **Administrator** role for account management\. This role also provides the **Manager** role for all services in the account\. + +To add a user as an IBM Cloud account administrator: + + + +1. Follow the steps to [add a non\-administrative user](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-addl-users.html?context=cdpaas&locale=en#users), except change these settings for an individual user's roles: + + + + * In the **Service access** section, select **Manager**. + * In the **Platform access** section, select **Administrator**. + + + +2. Alternatively, create an access group containing these roles and assign the user to the access group\. +3. Click **Invite**\. The new users receive an email invitation to join the account\. They must accept the invitation to be added to the account\. +4. After the user joins the account, add account management permissions\. Click the user's name, then **Access > Assign access** under **Access policies**\. +5. For the service to assign access to, choose **All Account Management Services**\. +6. Next, in the **Platform access** section, select **Administrator** and click **Add**\. +7. Click **Assign**\. + + + +## Next steps ## + + + + * Finish [setting up the platform](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-platform.html)\. + * [Upgrade your service instances](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/upgrade.html#app) to billable plans\. + + + +## Learn more ## + + + + * [Roles in IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/roles.html) + * [IBM Cloud docs: Account types](https://cloud.ibm.com/docs/account?topic=account-accounts) + * [IBM Cloud docs: IAM access](https://cloud.ibm.com/docs/account?topic=account-userroles) + * [IBM Cloud docs: What is IBM Cloud Identity and Access Management](https://cloud.ibm.com/docs/account?topic=account-iamoverview) + * [IBM Cloud docs: Setting up access groups](https://cloud.ibm.com/docs/account?topic=account-groups) + * [IBM Cloud docs: Giving access to resources in resource groups](https://cloud.ibm.com/docs/account?topic=account-rgs_manage_access) + + + +**Parent topic:**[Managing users and access](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-access.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d11a81e7333f63092fcf2c047744f2f3c18c1903.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d11a81e7333f63092fcf2c047744f2f3c18c1903.md new file mode 100644 index 0000000..ed4cfe8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d11a81e7333f63092fcf2c047744f2f3c18c1903.md @@ -0,0 +1,13 @@ +# Learning (SPSS Modeler) + +# Learning # + +Running the flow trains the C5\.0 rule and neural network (net)\. The network may take some time to train, but training can be interrupted early to save a net that produces reasonable results\. After the learning is complete, model nuggets are generated: one represents the neural net and one represents the rule\. + +Figure 1\. Generated model nuggets + +![Generated model nuggets](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_condition_nuggets.png) + +These model nuggets enable us to test the system or export the results of the model\. In this example, we will test the results of the model\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d171fcf10d8a1699fd8ac67e44053bbf6405631c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d171fcf10d8a1699fd8ac67e44053bbf6405631c.md new file mode 100644 index 0000000..1106347 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d171fcf10d8a1699fd8ac67e44053bbf6405631c.md @@ -0,0 +1,14 @@ +# The Concepts tab (SPSS Modeler) + +# The Concepts tab # + +In the Text Analytics Workbench, you can use the Concepts tab to create and explore concepts as well as explore and tweak the extraction results\. + +Concepts are the most basic level of extraction results available to use as building blocks, called descriptors, for your categories\. Categories are a group of closely related ideas and patterns to which documents and records are assigned through a scoring process\. + +Text mining is an iterative process in which extraction results are reviewed according to the context of the text data, fine\-tuned to produce new results, and then reevaluated\. Extraction results can be refined by modifying the linguistic resources\. To simplify the process of fine\-tuning your linguistic resources, you can perform common dictionary tasks directly from the Concepts tab\. You can fine\-tune other linguistic resources directly from the Resource editor tab\. + +Figure 1\. Concepts tab + +![Concepts tab](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tmwb_conceptview.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d174298e1dd7898c08771488715d83fc7a7740ae.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d174298e1dd7898c08771488715d83fc7a7740ae.md new file mode 100644 index 0000000..0001280 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d174298e1dd7898c08771488715d83fc7a7740ae.md @@ -0,0 +1,95 @@ +# Working with pre-trained models + +# Working with pre\-trained models # + +Watson Natural Language Processing provides pre\-trained models in over 20 languages\. They are curated by a dedicated team of experts, and evaluated for quality on each specific language\. These pre\-trained models can be used in production environments without you having to worry about license or intellectual property infringements\. + +## Loading and running a model ## + +To load a model, you first need to know its name\. Model names follow a standard convention encoding the type of model (like classification or entity extraction), type of algorithm (like BERT or SVM), language code, and details of the type system\. + +To find the model that matches your needs, use the task catalog\. See [Watson NLP task catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html)\. + +You can find the expected input for a given block class (for example to the Entity Mentions model) by using `help()` on the block class `run()` method: + + import watson_nlp + + help(watson_nlp.blocks.keywords.TextRank.run) + +Watson Natural Language Processing encapsulates natural language functionality through blocks and workflows\. Each block or workflow supports functions to: + + + + * `load()`: load a model + * `run()`: run the model on input arguments + * `train()`: train the model on your own data (not all blocks and workflows support training) + * `save()`: save the model that has been trained on your own data + + + +### Blocks ### + +Two types of blocks exist: + + + + * [Blocks that operate directly on the input document](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-pretrained.html?context=cdpaas&locale=en#operate-data) + * [Blocks that depend on other blocks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-pretrained.html?context=cdpaas&locale=en#operate-blocks) + + + +[Workflows](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-pretrained.html?context=cdpaas&locale=en#workflows) run one more blocks on the input document, in a pipeline\. + +#### Blocks that operate directly on the input document #### + +An example of a block that operates directly on the input document is the Syntax block, which performs natural language processing operations such as tokenization, lemmatization, part of speech tagging or dependency parsing\. + +Example: running syntax analysis on a text snippet: + + import watson_nlp + + # Load the syntax model for English + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + + # Run the syntax model and print the result + syntax_prediction = syntax_model.run('Welcome to IBM!') + print(syntax_prediction) + +#### Blocks that depend on other blocks #### + +Blocks that depend on other blocks cannot be applied on the input document directly\. They are applied on the output of one or more preceeding blocks\. For example, the Keyword Extraction block depends on the Syntax and Noun Phrases block\. + +These blocks can be loaded but can only be run in a particular order on the input document\. For example: + + import watson_nlp + text = "Anna went to school at University of California Santa Cruz. \ + Anna joined the university in 2015." + + # Load Syntax, Noun Phrases and Keywords models for English + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + noun_phrases_model = watson_nlp.load('noun-phrases_rbr_en_stock') + keywords_model = watson_nlp.load('keywords_text-rank_en_stock') + + # Run the Syntax and Noun Phrases models + syntax_prediction = syntax_model.run(text, parsers=('token', 'lemma', 'part_of_speech')) + noun_phrases = noun_phrases_model.run(text) + + # Run the keywords model + keywords = keywords_model.run(syntax_prediction, noun_phrases, limit=2) + print(keywords) + +### Workflows ### + +Workflows are predefined end\-to\-end pipelines from a raw document to a final block, where all necessary blocks are chained as part of the workflow pipeline\. For instance, the Entity Mentions block offered in Runtime 22\.2 requires syntax analysis results, so the end\-to\-end process would be: input text \-> Syntax analysis \-> Entity Mentions \-> Entity Mentions results\. Starting with Runtime 23\.1, you can call the Entity Mentions workflow\. Refer to this sample: + + import watson_nlp + + # Load the workflow model + mentions_workflow = watson_nlp.load('entity-mentions_transformer-workflow_multilingual_slate.153m.distilled') + + # Run the entity extraction workflow on the input text + mentions_workflow.run('IBM announced new advances in quantum computing', language_code="en") + +**Parent topic:**[Watson Natural Language Processing library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1908d2f2c1701d4a9ac3354e42dff295c06b40d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1908d2f2c1701d4a9ac3354e42dff295c06b40d.md new file mode 100644 index 0000000..5d98b1d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1908d2f2c1701d4a9ac3354e42dff295c06b40d.md @@ -0,0 +1,40 @@ +# rfnode properties + +# rfnode properties # + +![Random Forest node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/pythonrfnodeicon.png)The Random Forest node uses an advanced implementation of a bagging algorithm with a tree model as the base model\. This Random Forest modeling node in SPSS Modeler is implemented in Python and requires the scikit\-learn© Python library\. + + + +rfnode properties + +Table 1\. rfnode properties + +| `rfnode` properties | Data type | Property description | +| -------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `custom_fields` | *boolean* | This option tells the node to use field information specified here instead of that given in any upstream Type node(s)\. After selecting this option, specify the following fields as required\. | +| `inputs` | *field* | List of the field names for input\. | +| `target` | *field* | One field name for target\. | +| `fast_build` | *boolean* | Utilize multiple CPU cores to improve model building\. | +| `role_use` | *string* | Specify `predefined` to use predefined roles or `custom` to use custom field assignments\. Default is predefined\. | +| `splits` | *field* | List of the field names for split\. | +| `n_estimators` | *integer* | Number of trees to build\. Default is `10`\. | +| `specify_max_depth` | *Boolean* | Specify custom max depth\. If `false`, nodes are expanded until all leaves are pure or until all leaves contain less than `min_samples_split` samples\. Default is `false`\. | +| `max_depth` | *integer* | The maximum depth of the tree\. Default is `10`\. | +| `min_samples_leaf` | *integer* | Minimum leaf node size\. Default is `1`\. | +| `max_features` | *string* | The number of features to consider when looking for the best split:



* If `auto`, then `max_features=sqrt(n_features)` for classifier and `max_features=sqrt(n_features)` for regression\.
* If `sqrt`, then `max_features=sqrt(n_features)`\.
* If `log2`, then `max_features=log2 (n_features)`\.



Default is `auto`\. | +| `bootstrap` | *Boolean* | Use bootstrap samples when building trees\. Default is `true`\. | +| `oob_score` | *Boolean* | Use out\-of\-bag samples to estimate the generalization accuracy\. Default value is `false`\. | +| `extreme` | *Boolean* | Use extremely randomized trees\. Default is `false`\. | +| `use_random_seed` | *Boolean* | Specify this to get replicated results\. Default is `false`\. | +| `random_seed` | *integer* | The random number seed to use when build trees\. Specify any integer\. | +| `cache_size` | *float* | The size of the kernel cache in MB\. Default is `200`\. | +| `enable_random_seed` | *Boolean* | Enables the `random_seed` parameter\. Specify true or false\. Default is `false`\. | +| `enable_hpo` | *Boolean* | Specify `true` or `false` to enable or disable the HPO options\. If set to `true`, Rbfopt will be applied to determine the "best" Random Forest model automatically, which reaches the target objective value defined by the user with the following `target_objval` parameter\. | +| `target_objval` | *float* | The objective function value (error rate of the model on the samples) you want to reach (for example, the value of the unknown optimum)\. Set this parameter to the appropriate value if the optimum is unknown (for example, `0.01`)\. | +| `max_iterations` | *integer* | Maximum number of iterations for trying the model\. Default is `1000`\. | +| `max_evaluations` | *integer* | Maximum number of function evaluations for trying the model, where the focus is accuracy over speed\. Default is `300`\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1afa9bb4e0475a56190dc8254e004308bea484d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1afa9bb4e0475a56190dc8254e004308bea484d.md new file mode 100644 index 0000000..5b6d55d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1afa9bb4e0475a56190dc8254e004308bea484d.md @@ -0,0 +1,117 @@ +# Creating notebooks + +# Creating notebooks # + +You can add a notebook to your project by using one of these methods: creating a notebook file or copying a sample notebook from the Samples\. + +**Required permissions** : You must have the Admin or Editor role in the project to create a notebook\. + +Watch this short video to learn the basics of Jupyter notebooks\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Creating a notebook file in the notebook editor ## + +To create a notebook file in the notebook editor: + + + +1. From your project, click **New asset > Work with data and models in Python or R notebooks**\. +2. On the **New Notebook** page, specify the method to use to create your notebook\. You can create a blank notebook, upload a notebook file from your file system, or upload a notebook file from a URL: + + + + * The notebook file you select to upload must follow these requirements: + + + + * The file type must be *.ipynb*. + * The file name must not exceed 255 characters. + * The file name must not contain these characters: `< > : ” / | ( ) ?` + + + + * The URL must be a public URL that is shareable and doesn't require authentication. + ![Notebook options](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/createnotebook.png) + + + +3. Specify the runtime environment for the language you want to use (Python or R)\. You can select a provided environment template or an environment template which you created and configured under **Templates** on the **Environments** page on the **Manage** tab of your project\. For more information on environments, see [Notebook environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html)\. +4. Click **Create Notebook**\. The notebook opens in edit mode\. + + Note that the time that it takes to create a new notebook or to open an existing one for editing might vary. If no runtime container is available, a container needs to be created and only after it is available, the Jupyter notebook user interface can be loaded. The time it takes to create a container depends on the cluster load and size. Once a runtime container exists, subsequent calls to open notebooks will be significantly faster. + + The opened notebook is locked by you. For more information, see [Locking and unlocking notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/creating-notebooks.html?context=cdpaas&locale=en#locking-and-unlocking). +5. Tell the service to trust your notebook content and execute all cells\. + + When a new notebook is opened in edit mode, the notebook is considered to be *untrusted* by the Jupyter service by default. When you run an untrusted notebook, content deemed untrusted will not be executed. Untrusted content includes any Javascript, HTML or Javascript in Markdown cells or in any output cells that you did not generate. + + + + 1. Click **Not Trusted** in the upper right corner of the notebook. + 2. Click **Trust** to execute all cells. + + + + + +## Adding a notebook from the Samples ## + +Notebooks from the Samples are based on real\-world scenarios and contain many useful examples of computations and visualizations that you can adapt to your analysis needs\. + +To copy a sample notebook: + + + +1. In the main menu, click **Samples**, then filter for **Notebooks** to show only notebook cards\. +2. Find the card for the sample notebook you want, and click the card\. You can view the notebook contents to browse the steps and the code that it contains\. +3. To work with a copy of the sample notebook, click **Add to project**\. +4. Choose the project for the notebook, and click **Add**\. +5. Optional: Change the name and description for the notebook\. +6. Specify the runtime environment\. If you created an environment template on the *Environments* page of your project, it will display in the list of runtimes you can select from\. +7. Click **Create**\. The notebook opens in edit mode and is locked by you\. Locking the file avoids possible merge conflicts that might be caused by competing changes to the file\. To get familiar with the structure of a notebook, see [Parts of a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/parts-of-a-notebook.html)\. + + + +## Locking and unlocking notebooks ## + +If you open a notebook in edit mode, this notebook is locked by you\. While you hold the lock, only you can make changes to the notebook\. All other projects users will see the lock icon on the notebook\. Only project administrators are able to unlock a locked notebook and open it in edit mode\. + +When you close the notebook, the lock is released and another user can select to open the notebook in edit mode\. Note that you must close the notebook while the runtime environment is still active\. The notebook lock can't be released for you if the runtime was stopped or is in idle state\. If the notebook lock is not released for you, you can unlock the notebook from the project's Assets page\. Locking the file avoids possible merge conflicts that might be caused by competing changes to the file\. + +## Finding your notebooks ## + +You can find and open notebooks from the **Assets** page of the project\. + +You can open a notebook in view or edit mode\. When you open a notebook in view mode, you can't change or run the notebook\. You can only change or run a notebook when it is opened in edit mode and started in an environment\. + +You can open a notebook by: + + + + * Clicking the notebook\. This opens the notebook in view mode\. To then open the notebook in edit mode, click the pencil icon (![Edit icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/pencil-icon.png)) on the notebook toolbar\. This starts the environment associated with the notebook\. + * Expanding the three vertical dots on the right of the notebook entry, and selecting **View** or **Edit**\. + + + +## Next step ## + + + + * [Code and run notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/code-run-notebooks.html) + + + +## Learn more ## + + + + * [Provided CPU runtime environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html#default-cpu) + * [Provided Spark runtime environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html#default-spark) + * [Change the environment runtime used by a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html#change-env) + + + +**Parent topic:**[Jupyter Notebook editor](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-editor.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1b1e93ad61d2b095bf8a00e9739fcf7d1dc974c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1b1e93ad61d2b095bf8a00e9739fcf7d1dc974c.md new file mode 100644 index 0000000..b1b110e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1b1e93ad61d2b095bf8a00e9739fcf7d1dc974c.md @@ -0,0 +1,29 @@ +# Building a model (SPSS Modeler) + +# Building a model # + +By exploring and manipulating the data, you have been able to form some hypotheses\. The ratio of sodium to potassium in the blood seems to affect the choice of drug, as does blood pressure\. But you cannot fully explain all of the relationships yet\. This is where modeling will likely provide some answers\. In this case, you will try to fit the data using a rule\-building model called C5\.0\. + +Since you're using a derived field, `Na_to_K`, you can filter out the original fields, `Na` and `K`, so they're not used twice in the modeling algorithm\. You can do this by using a Filter node\. + + + +1. Place a Filter node on the canvas and connect it to the Derive node\. + + Figure 1. Filter node + + ![Derive node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_drug_build_flow.png) +2. Double\-click the Filter node to edit its properties\. Name it Discard Fields\. +3. For Mode, make sure Filter the selected fields is selected\. Then select the `K` and `Na` fields\. Click `Save`\. +4. Place a Type node on the canvas and connect it to the Filter node\. With the Type node, you can indicate the types of fields you're using and how they're used to predict the outcomes\. + + Figure 2. Type node + + ![Type node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_drug_build_flow2.png) +5. Double\-click the Type node to edit its properties\. Name it Define Types\. +6. Set the role for the `Drug` field to Target, indicating that `Drug` is the field you want to predict\. Leave the role for the other fields set to Input so they'll be used as predictors\. Click Save\. +7. To estimate the model, place a C5\.0 node on the canvas and attach it to the end of the flow\. Then click the Run button on the toolbar to run the flow\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1c3f3db7837f7c5803f52829a542f6ba8b4837d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1c3f3db7837f7c5803f52829a542f6ba8b4837d.md new file mode 100644 index 0000000..1bcaf32 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1c3f3db7837f7c5803f52829a542f6ba8b4837d.md @@ -0,0 +1,33 @@ +# gmm properties + +# gmm properties # + +![Gaussian Mixture node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/pythongmmnodeicon.png)A Gaussian Mixture© model is a probabilistic model that assumes all the data points are generated from a mixture of a finite number of Gaussian distributions with unknown parameters\. One can think of mixture models as generalizing k\-means clustering to incorporate information about the covariance structure of the data as well as the centers of the latent Gaussians\. The Gaussian Mixture node in SPSS Modeler exposes the core features and commonly used parameters of the Gaussian Mixture library\. The node is implemented in Python\. + + + +gmm properties + +Table 1\. gmm properties + +| `gmm` properties | Data type | Property description | +| -------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `custom_fields` | *boolean* | This option tells the node to use field information specified here instead of that given in any upstream Type node(s)\. After selecting this option, specify the following fields as required\. | +| `inputs` | *field* | List of the field names for input\. | +| `target` | *field* | One field name for target\. | +| `fast_build` | *boolean* | Utilize multiple CPU cores to improve model building\. | +| `use_partition` | *boolean* | Set to `True` or `False` to specify whether to use partitioned data\. Default is `False`\. | +| `covariance_type` | *string* | Specify `Full`, `Tied`, `Diag`, or `Spherical` to set the covariance type\. | +| `number_component` | *integer* | Specify an integer for the number of mixture components\. Minimum value is `1`\. Default value is `2`\. | +| `component_lable` | *boolean* | Specify `True` to set the cluster label to a string or `False` to set the cluster label to a number\. Default is `False`\. | +| `label_prefix` | *string* | If using a string cluster label, you can specify a prefix\. | +| `enable_random_seed` | *boolean* | Specify `True` if you want to use a random seed\. Default is `False`\. | +| `random_seed` | *integer* | If using a random seed, specify an integer to be used for generating random samples\. | +| `tol` | *Double* | Specify the convergence threshold\. Default is `0.000.1`\. | +| `max_iter` | *integer* | Specify the maximum number of iterations to perform\. Default is `100`\. | +| `init_params` | *string* | Set the initialization parameter to use\. Options are `Kmeans` or `Random`\. | +| `warm_start` | *boolean* | Specify `True` to use the solution of the last fitting as the initialization for the next call of fit\. Default is `False`\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1cde4ff34352a6e5cdc9914fd26cf72574e2d59.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1cde4ff34352a6e5cdc9914fd26cf72574e2d59.md new file mode 100644 index 0000000..6125d5d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1cde4ff34352a6e5cdc9914fd26cf72574e2d59.md @@ -0,0 +1,7 @@ +# Flows + +# Flows # + +A flow is the main IBM® SPSS® Modeler document type\. It can be saved, loaded, edited and executed\. Flows can also have parameters, global values, a script, and other information associated with them\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1db4f3b084cb401795c925f280207cbcb3d94aa.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1db4f3b084cb401795c925f280207cbcb3d94aa.md new file mode 100644 index 0000000..9bad0ac --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1db4f3b084cb401795c925f280207cbcb3d94aa.md @@ -0,0 +1,15 @@ +# Storage and data access for IBM Watson Pipelines + +# Storage and data access for IBM Watson Pipelines # + +Learn where files and data are stored outside of IBM Watson Pipelines and use it in a Pipelines\. + +## Access data on Cloud Object Storage ## + +File storage refers to the repository where you store assets to use with the pipeline\. It is a Cloud Object Storage bucket that is used as storage for a particular scope, such as a project or deployment space\. + +A storage location is referenced by a Cloud Object Storage data connection in its scope\. Refer to a file by pointing to a location such as an object key in a dedicated, self\-managed bucket\. + +**Parent topic:**[Creating a pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-create.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1fafa3a73f77b401f49cc641be44d61bc9c0689.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1fafa3a73f77b401f49cc641be44d61bc9c0689.md new file mode 100644 index 0000000..b446ef9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1fafa3a73f77b401f49cc641be44d61bc9c0689.md @@ -0,0 +1,68 @@ +# Date and time functions (SPSS Modeler) + +# Date and time functions # + +CLEM includes a family of functions for handling fields with datetime storage of string variables representing dates and times\. + +The formats of date and time used are specific to each flow and are specified in the flow properties\. The date and time functions parse date and time strings according to the currently selected format\. + +When you specify a year in a date that uses only two digits (that is, the century is not specified), SPSS Modeler uses the default century that's specified in the flow properties\. + + + +CLEM date and time functions + +Table 1\. CLEM date and time functions + +| Function | Result | Description | +| ------------------------------------------------------------ | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `@TODAY` | *String* | If you select Rollover days/mins in the flow properties, this function returns the current date as a string in the current date format\. If you use a two\-digit date format and don't select Rollover days/mins, this function returns `$null$` on the current server\. | +| `to_time(ITEM)` | *Time* | Converts the storage of the specified field to a time\. | +| `to_date(ITEM)` | *Date* | Converts the storage of the specified field to a date\. | +| `to_timestamp(ITEM)` | *Timestamp* | Converts the storage of the specified field to a timestamp\. | +| `to_datetime(ITEM)` | *Datetime* | Converts the storage of the specified field to a date, time, or timestamp value\. | +| `datetime_date(ITEM)` | *Date* | Returns the date value for a *number*, *string*, or *timestamp*\. Note this is the only function that allows you to convert a number (in seconds) back to a date\. If `ITEM` is a string, creates a date by parsing a string in the current date format\. The date format specified in the flow properties must be correct for this function to be successful\. If `ITEM` is a number, it's interpreted as a number of seconds since the base date (or epoch)\. Fractions of a day are truncated\. If `ITEM` is timestamp, the date part of the timestamp is returned\. If `ITEM` is a date, it's returned unchanged\. | +| `date_before(DATE1, DATE2)` | *Boolean* | Returns a value of true if *DATE1* represents a date or timestamp before that represented by *DATE2*\. Otherwise, this function returns a value of 0\. | +| `date_days_difference(DATE1, DATE2)` | *Integer* | Returns the time in days from the date or timestamp represented by *DATE1* to that represented by *DATE2*, as an integer\. If *DATE2* is before *DATE1*, this function returns a negative number\. | +| `date_in_days(DATE)` | *Integer* | Returns the time in days from the baseline date to the date or timestamp represented by *DATE*, as an integer\. If *DATE* is before the baseline date, this function returns a negative number\. You must include a valid date for the calculation to work appropriately\. For example, you should not specify 29 February 2001 as the date\. Because 2001 isn't a leap year, this date doesn't exist\. | +| `date_in_months(DATE)` | *Real* | Returns the time in months from the baseline date to the date or timestamp represented by *DATE*, as a real number\. This is an approximate figure based on a month of 30\.4375 days\. If *DATE* is before the baseline date, this function returns a negative number\. You must include a valid date for the calculation to work appropriately\. For example, you should not specify 29 February 2001 as the date\. Because 2001 isn't a leap year, this date doesn't exist\. | +| `date_in_weeks(DATE)` | *Real* | Returns the time in weeks from the baseline date to the date or timestamp represented by *DATE*, as a real number\. This is based on a week of 7\.0 days\. If *DATE* is before the baseline date, this function returns a negative number\. You must include a valid date for the calculation to work appropriately\. For example, you should not specify 29 February 2001 as the date\. Because 2001 isn't a leap year, this date doesn't exist\. | +| `date_in_years(DATE)` | *Real* | Returns the time in years from the baseline date to the date or timestamp represented by *DATE*, as a real number\. This is an approximate figure based on a year of 365\.25 days\. If *DATE* is before the baseline date, this function returns a negative number\. You must include a valid date for the calculation to work appropriately\. For example, you should not specify 29 February 2001 as the date\. Because 2001 isn't a leap year, this date doesn't exist\. | +| `date_months_difference (DATE1, DATE2)` | *Real* | Returns the time in months from the date or timestamp represented by *DATE1* to that represented by *DATE2*, as a real number\. This is an approximate figure based on a month of 30\.4375 days\. If *DATE2* is before *DATE1*, this function returns a negative number\. | +| `datetime_date(YEAR, MONTH, DAY)` | *Date* | Creates a date value for the given *YEAR*, *MONTH*, and *DAY*\. The arguments must be integers\. | +| `datetime_day(DATE)` | *Integer* | Returns the day of the month from a given *DATE* or timestamp\. The result is an integer in the range 1 to 31\. | +| `datetime_day_name(DAY)` | *String* | Returns the full name of the given *DAY*\. The argument must be an integer in the range 1 (Sunday) to 7 (Saturday)\. | +| `datetime_hour(TIME)` | *Integer* | Returns the hour from a *TIME* or timestamp\. The result is an integer in the range 0 to 23\. | +| `datetime_in_seconds(TIME)` | *Real* | Returns the seconds portion stored in *TIME*\. | +| `datetime_in_seconds(DATE)`, `datetime_in_seconds(DATETIME)` | *Real* | Returns the accumulated number, converted into seconds, from the difference between the current *DATE* or *DATETIME* and the baseline date (1900\-01\-01)\. | +| `datetime_minute(TIME)` | *Integer* | Returns the minute from a *TIME* or timestamp\. The result is an integer in the range 0 to 59\. | +| `datetime_month(DATE)` | *Integer* | Returns the month from a *DATE* or timestamp\. The result is an integer in the range 1 to 12\. | +| `datetime_month_name (MONTH)` | *String* | Returns the full name of the given *MONTH*\. The argument must be an integer in the range 1 to 12\. | +| `datetime_now` | *Timestamp* | Returns the current time as a timestamp\. | +| `datetime_second(TIME)` | *Integer* | Returns the second from a *TIME* or timestamp\. The result is an integer in the range 0 to 59\. | +| `datetime_day_short_name``(DAY)` | *String* | Returns the abbreviated name of the given *DAY*\. The argument must be an integer in the range 1 (Sunday) to 7 (Saturday)\. | +| `datetime_month_short_name``(MONTH)` | *String* | Returns the abbreviated name of the given *MONTH*\. The argument must be an integer in the range 1 to 12\. | +| `datetime_time(HOUR, MINUTE, SECOND)` | *Time* | Returns the time value for the specified *HOUR*, *MINUTE*, and *SECOND*\. The arguments must be integers\. | +| `datetime_time(ITEM)` | *Time* | Returns the time value of the given *ITEM*\. | +| `datetime_timestamp(YEAR, MONTH, DAY, HOUR, MINUTE, SECOND)` | *Timestamp* | Returns the timestamp value for the given *YEAR*, *MONTH*, *DAY*, *HOUR*, *MINUTE*, and *SECOND*\. | +| `datetime_timestamp(DATE, TIME)` | *Timestamp* | Returns the timestamp value for the given *DATE* and *TIME*\. | +| `datetime_timestamp``(NUMBER)` | *Timestamp* | Returns the timestamp value of the given number of seconds\. | +| `datetime_weekday(DATE)` | *Integer* | Returns the day of the week from the given *DATE* or timestamp\. | +| `datetime_year(DATE)` | *Integer* | Returns the year from a *DATE* or timestamp\. The result is an integer such as 2021\. | +| `date_weeks_difference``(DATE1, DATE2)` | *Real* | Returns the time in weeks from the date or timestamp represented by *DATE1* to that represented by *DATE2*, as a real number\. This is based on a week of 7\.0 days\. If *DATE2* is before *DATE1*, this function returns a negative number\. | +| `date_years_difference (DATE1, DATE2)` | *Real* | Returns the time in years from the date or timestamp represented by *DATE1* to that represented by *DATE2*, as a real number\. This is an approximate figure based on a year of 365\.25 days\. If *DATE2* is before *DATE1*, this function returns a negative number\. | +| `date_from_ywd(YEAR, WEEK, DAY)` | *Integer* | Converts the year, week in year, and day in week, to a date using the ISO 8601 standard\. | +| `date_iso_day(DATE)` | *Integer* | Returns the day in the week from the date using the ISO 8601 standard\. | +| `date_iso_week(DATE)` | *Integer* | Returns the week in the year from the date using the ISO 8601 standard\. | +| `date_iso_year(DATE)` | *Integer* | Returns the year from the date using the ISO 8601 standard\. | +| `time_before(TIME1, TIME2)` | *Boolean* | Returns a value of true if *TIME1* represents a time or timestamp before that represented by *TIME2*\. Otherwise, this function returns a value of 0\. | +| `time_hours_difference (TIME1, TIME2)` | *Real* | Returns the time difference in hours between the times or timestamps represented by *TIME1* and *TIME2*, as a real number\. If you select Rollover days/mins in the flow properties, a higher value of *TIME1* is taken to refer to the previous day\. If you don't select the rollover option, a higher value of *TIME1* causes the returned value to be negative\. | +| `time_in_hours(TIME)` | *Real* | Returns the time in hours represented by *TIME*, as a real number\. For example, under time format `HHMM`, the expression `time_in_hours('0130')` evaluates to 1\.5\. *TIME* can represent a time or a timestamp\. | +| `time_in_mins(TIME)` | *Real* | Returns the time in minutes represented by *TIME*, as a real number\. *TIME* can represent a time or a timestamp\. | +| `time_in_secs(TIME)` | *Integer* | Returns the time in seconds represented by *TIME*, as an integer\. *TIME* can represent a time or a timestamp\. | +| `time_mins_difference(TIME1, TIME2)` | *Real* | Returns the time difference in minutes between the times or timestamps represented by *TIME1* and *TIME2*, as a real number\. If you select Rollover days/mins in the flow properties, a higher value of *TIME1* is taken to refer to the previous day (or the previous hour, if only minutes and seconds are specified in the current format)\. If you don't select the rollover option, a higher value of *TIME1* will cause the returned value to be negative\. | +| `time_secs_difference(TIME1, TIME2)` | *Integer* | Returns the time difference in seconds between the times or timestamps represented by *TIME1* and *TIME2*, as an integer\. If you select Rollover days/mins in the flow properties, a higher value of *TIME1* is taken to refer to the previous day (or the previous hour, if only minutes and seconds are specified in the current format)\. If you don't select the rollover option, a higher value of *TIME1* causes the returned value to be negative\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1fef8c7f5be28316caa952ccc76281e6f3fe12f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1fef8c7f5be28316caa952ccc76281e6f3fe12f.md new file mode 100644 index 0000000..56bcf41 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d1fef8c7f5be28316caa952ccc76281e6f3fe12f.md @@ -0,0 +1,9 @@ +# Summarizing multiple fields (SPSS Modeler) + +# Summarizing multiple fields # + +The CLEM language includes a number of functions that return summary statistics across multiple fields\. + +These functions may be particularly useful in analyzing survey data, where multiple responses to a question may be stored in multiple fields\. See [Working with multiple\-response data](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/clem_reference/clem_overview_multiple_response_data.html#clem_overview_multiple_response_data) for more information\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d21cd926ca1fe170c8c1645ca0ec65aedddb4aef.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d21cd926ca1fe170c8c1645ca0ec65aedddb4aef.md new file mode 100644 index 0000000..dd60c81 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d21cd926ca1fe170c8c1645ca0ec65aedddb4aef.md @@ -0,0 +1,73 @@ +# Publishing a notebook as a gist + +# Publishing a notebook as a gist # + +A gist is a simple way to share a notebook or parts of a notebook with other users\. Unlike when you publish to a GitHub repository, you don't need to manage your gists; you can edit your gists directly in the browser\. + +All project collaborators, who have administrator or editor permission, can share notebooks or parts of a notebook as gists\. The latest saved version of your notebook is published as a gist\. + +Before you can create a gist, you must be logged in to GitHub and have authorized access to gists in GitHub from Watson Studio\. See [Publish notebooks on GitHub](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/github-integration.html)\. If this information is missing, you are prompted for it\. + +To publish a notebook as a gist: + + + +1. Open the notebook in edit mode\. +2. Click the GitHub integration icon (![Shows the upload icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/upload.png)) and select **Publish as gist**\. + + + +Watch this video to see how to enable GitHub integration\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + + + + * Transcript + + Synchronize transcript with video + + + + | Time | Transcript | + | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | 00:00 | This video shows you how to publish notebooks from your Watson Studio project to your GitHub account. | + | 00:07 | Navigate to your profile and settings. | + | 00:11 | On the "Integrations" tab, visit the link to generate a GitHub personal access token. | + | 00:17 | Provide a descriptive name for the token and select the repo and gist scopes, then generate the token. | + | 00:29 | Copy the token, return to the GitHub integration settings, and paste the token. | + | 00:36 | The token is validated when you save it to your profile settings. | + | 00:42 | Now, navigate to your projects. | + | 00:44 | You enable GitHub integration at the project level on the "Settings" tab. | + | 00:50 | Simply scroll to the bottom and paste the existing GitHub repository URL. | + | 00:56 | You'll find that on the "Code" tab in the repo. | + | 01:01 | Click "Update" to make the connection. | + | 01:05 | Now, go to the "Assets" tab and open the notebook you want to publish. | + | 01:14 | Notice that this notebook has the credentials replaced with X's. | + | 01:19 | It's a best practice to remove or replace credentials before publishing to GitHub. | + | 01:24 | So, this notebook is ready for publishing. | + | 01:27 | You can provide the target path along with a commit message. | + | 01:31 | You also have the option to publish content without hidden code, which means that any cells in the notebook that began with the hidden cell comment will not be published. | + | 01:42 | When you're, ready click "Publish". | + | 01:45 | The message tells you that the notebook was published successfully and provides links to the notebook, the repository, and the commit. | + | 01:54 | Let's take a look at the commit. | + | 01:57 | So, there's the commit, and you can navigate to the repository to see the published notebook. | + | 02:04 | Lastly, you can publish as a gist. | + | 02:07 | Gists are another way to share your work on GitHub. | + | 02:10 | Every gist is a git repository, so it can be forked and cloned. | + | 02:15 | There are two types of gists: public and secret. | + | 02:19 | If you start out with a secret gist, you can convert it to a public gist later. | + | 02:24 | And again, you have the option to remove hidden cells. | + | 02:29 | Follow the link to see the published gist. | + | 02:32 | So that's the basics of Watson Studio's GitHub integration. | + | 02:37 | Find more videos in the Cloud Pak for Data as a Service documentation. | + + + + + +**Parent topic:**[Managing the lifecycle of notebooks and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-nb-lifecycle.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d2d9f4e05cabc566b2021116ed28ef413fa96779.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d2d9f4e05cabc566b2021116ed28ef413fa96779.md new file mode 100644 index 0000000..d7a2c7c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d2d9f4e05cabc566b2021116ed28ef413fa96779.md @@ -0,0 +1,7 @@ +# Node properties overview + +# Node properties overview # + +Each type of node has its own set of legal properties, and each property has a type\. This type may be a general type—number, flag, or string—in which case settings for the property are coerced to the correct type\. An error is raised if they can't be coerced\. Alternatively, the property reference may specify the range of legal values, such as `Discard`, `PairAndDiscard`, and `IncludeAsText`, in which case an error is raised if any other value is used\. Flag properties should be read or set by using values of `true` and `false`\. (Variations including `Off`, `OFF`, `off`, `No`, `NO`, `no`, `n`, `N`, `f`, `F`, `false`, `False`, `FALSE`, or `0` are also recognized when setting values, but may cause errors when reading property values in some cases\. All other values are regarded as true\. Using `true` and `false` consistently will avoid any confusion\.) In this documentation's reference tables, the structured properties are indicated as such in the Property description column, and their usage formats are provided\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d2ea86e13b810569e718e9dca4c00da28a2e1c9a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d2ea86e13b810569e718e9dca4c00da28a2e1c9a.md new file mode 100644 index 0000000..361d3a9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d2ea86e13b810569e718e9dca4c00da28a2e1c9a.md @@ -0,0 +1,45 @@ +# xgboostasnode properties + +# xgboostasnode properties # + +![XGBoost\-AS node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/sparkxgboostASnodeicon.png)XGBoost is an advanced implementation of a gradient boosting algorithm\. Boosting algorithms iteratively learn weak classifiers and then add them to a final strong classifier\. XGBoost is very flexible and provides many parameters that can be overwhelming to most users, so the XGBoost\-AS node in SPSS Modeler exposes the core features and commonly used parameters\. The XGBoost\-AS node is implemented in Spark\. + + + +xgboostasnode properties + +Table 1\. xgboostasnode properties + +| `xgboostasnode` properties | Data type | Property description | +| -------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `target_field` | *field* | List of the field names for target\. | +| `input_fields` | *field* | List of the field names for inputs\. | +| `nWorkers` | *integer* | The number of workers used to train the XGBoost model\. Default is `1`\. | +| `numThreadPerTask` | *integer* | The number of threads used per worker\. Default is `1`\. | +| `useExternalMemory` | *Boolean* | Whether to use external memory as cache\. Default is false\. | +| `boosterType` | *string* | The booster type to use\. Available options are `gbtree`, `gblinear`, or `dart`\. Default is `gbtree`\. | +| `numBoostRound` | *integer* | The number of rounds for boosting\. Specify a value of `0` or higher\. Default is `10`\. | +| `scalePosWeight` | *Double* | Control the balance of positive and negative weights\. Default is `1`\. | +| `randomseed` | *integer* | The seed used by the random number generator\. Default is 0\. | +| `objectiveType` | *string* | The learning objective\. Possible values are `reg:linear`, `reg:logistic`, `reg:gamma`, `reg:tweedie`, `rank:pairwise`, `binary:logistic`, or `multi`\. Note that for flag targets, only `binary:logistic` or `multi` can be used\. If `multi` is used, the score result will show the `multi:softmax` and `multi:softprob` XGBoost objective types\. Default is `reg:linear`\. | +| `evalMetric` | *string* | Evaluation metrics for validation data\. A default metric will be assigned according to the objective\. Possible values are `rmse`, `mae`, `logloss`, `error`, `merror`, `mlogloss`, `auc`, `ndcg`, `map`, or `gamma-deviance`\. Default is `rmse`\. | +| `lambda` | *Double* | L2 regularization term on weights\. Increasing this value will make the model more conservative\. Specify any number `0` or greater\. Default is `1`\. | +| `alpha` | *Double* | L1 regularization term on weights\. Increasing this value will make the model more conservative\. Specify any number `0` or greater\. Default is `0`\. | +| `lambdaBias` | *Double* | L2 regularization term on bias\. If the `gblinear` booster type is used, this lambda bias linear booster parameter is available\. Specify any number `0` or greater\. Default is `0`\. | +| `treeMethod` | *string* | If the `gbtree` or `dart` booster type is used, this tree method parameter for tree growth (and the other tree parameters that follow) is available\. It specifies the XGBoost tree construction algorithm to use\. Available options are `auto`, `exact`, or `approx`\. Default is `auto`\. | +| `maxDepth` | *integer* | The maximum depth for trees\. Specify a value of `2` or higher\. Default is `6`\. | +| `minChildWeight` | *Double* | The minimum sum of instance weight (hessian) needed in a child\. Specify a value of `0` or higher\. Default is `1`\. | +| `maxDeltaStep` | *Double* | The maximum delta step to allow for each tree's weight estimation\. Specify a value of `0` or higher\. Default is `0`\. | +| `sampleSize` | *Double* | The sub sample for is the ratio of the training instance\. Specify a value between `0.1` and `1.0`\. Default is `1.0`\. | +| `eta` | *Double* | The step size shrinkage used during the update step to prevent overfitting\. Specify a value between `0` and `1`\. Default is `0.3`\. | +| `gamma` | *Double* | The minimum loss reduction required to make a further partition on a leaf node of the tree\. Specify any number `0` or greater\. Default is `6`\. | +| `colsSampleRatio` | *Double* | The sub sample ratio of columns when constructing each tree\. Specify a value between `0.01` and `1`\. Default is`1`\. | +| `colsSampleLevel` | *Double* | The sub sample ratio of columns for each split, in each level\. Specify a value between `0.01` and `1`\. Default is `1`\. | +| `normalizeType` | *string* | If the dart booster type is used, this dart parameter and the following three dart parameters are available\. This parameter sets the normalization algorithm\. Specify `tree` or `forest`\. Default is `tree`\. | +| `sampleType` | *string* | The sampling algorithm type\. Specify `uniform` or `weighted`\. Default is `uniform`\. | +| `rateDrop` | *Double* | The dropout rate dart booster parameter\. Specify a value between `0.0` and `1.0`\. Default is `0.0`\. | +| `skipDrop` | *Double* | The dart booster parameter for the probability of skip dropout\. Specify a value between `0.0` and `1.0`\. Default is `0.0`\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d2f4f71189d7f5c92ddc2ccb38f2bce1efd4bc65.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d2f4f71189d7f5c92ddc2ccb38f2bce1efd4bc65.md new file mode 100644 index 0000000..3bcfb69 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d2f4f71189d7f5c92ddc2ccb38f2bce1efd4bc65.md @@ -0,0 +1,52 @@ +# Managing payload data for watsonx.governance + +# Managing payload data for watsonx\.governance # + +You must provide payload data to configure drift v2 and generative AI quality evaluations in watsonx\.governance\. + +Payload data contains all of your model transactions\. You can log payload data with watsonx\.governance to enable evaluations\. To log payload data, watsonx\.governance must receive scoring requests\. + +## Logging payload data ## + +When you send a scoring request, watsonx\.governance processes your model transactions to enable model evaluations\. watsonx\.governance scores the data and stores it as records in a payload logging table within the watsonx\.governance data mart\. + +The payload logging table contains the following columns when you evaluate prompt templates: + + + + * **Required columns**: + + + + * Prompt variable(s): Contains the values for the variables that are created for prompt templates + * `generated_text`: Contains the output that's generated by the foundation model + + + + * **Optional columns**: + + + + * `input_token_count`: Contains the number of tokens in the input text + * `generated_token_count`: Contains the number of tokens in the generated text + * `prediction_probability`: Contains the aggregate value of log probabilities of generated tokens that represent the winning output + + + + + +The table can also include timestamp and ID columns to store your data as scoring records\. + +You can view your payload logging table by accessing the database that you specified for the data mart or by using the [Watson OpenScale Python SDK](https://client-docs.aiopenscale.cloud.ibm.com/html/index.html) as shown in the following example: + +![Python SDK sample output of payload logging table](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-ntbok.png) + +## Sending payload data ## + +If you are using IBM Watson Machine Learning as your machine learning provider, watsonx\.governance automatically logs payload data when your model is scored\. + +After you configure evaluations, you can also use a payload logging endpoint to send scoring requests to run on\-demand evaluations\. For production models, you can also upload payload data with a CSV file to send scoring requests\. For more information see, [Sending model transactions](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-send-model-transactions.html)\. + +**Parent topic:**[Managing data for model evaluations in Watson OpenScale](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-manage-data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d3084bfb07d425ebace9f538d800e08daea97594.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d3084bfb07d425ebace9f538d800e08daea97594.md new file mode 100644 index 0000000..6d9c3ff --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d3084bfb07d425ebace9f538d800e08daea97594.md @@ -0,0 +1,44 @@ +# SPSS Modeler flow scripting example + +# Flow scripting example # + +You can use a flow to train a model when it runs\. Normally, to test the model, you might run the modeling node to add the model to the flow, make the appropriate connections, and run an Analysis node\. + +Using a script, you can automate the process of testing the model nugget after you create it\. For example, you might use a script such as the following to train a neural network model: + + stream = modeler.script.stream() + neuralnetnode = stream.findByType("neuralnetwork", None) + results = [] + neuralnetnode.run(results) + appliernode = stream.createModelApplierAt(results[0], "Drug", 594, 187) + analysisnode = stream.createAt("analysis", "Drug", 688, 187) + typenode = stream.findByType("type", None) + stream.linkBetween(appliernode, typenode, analysisnode) + analysisnode.run([]) + +The following bullets describe each line in this script example\. + + + + * The first line defines a variable that points to the current flow\. + * In line 2, the script finds the Neural Net builder node\. + * In line 3, the script creates a list where the execution results can be stored\. + * In line 4, the Neural Net model nugget is created\. This is stored in the list defined on line 3\. + * In line 5, a model apply node is created for the model nugget and placed on the flow canvas\. + * In line 6, an analysis node called `Drug` is created\. + * In line 7, the script finds the Type node\. + * In line 8, the script connects the model apply node created in line 5 between the Type node and the Analysis node\. + * Finally, the Analysis node runs to produce the Analysis report\. + + + +Tips: + + + + * It's possible to use a script to build and run a flow from scratch, starting with a blank canvas\. + * For complete details about scripting, see the [Scripting and automation](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/scripting_overview.html) guide\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d377da7cf67645f321593fa8b1536be2f0753333.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d377da7cf67645f321593fa8b1536be2f0753333.md new file mode 100644 index 0000000..a430699 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d377da7cf67645f321593fa8b1536be2f0753333.md @@ -0,0 +1,106 @@ +# IBM Watson Query connection + +# IBM Watson Query connection # + +To access your data in Watson Query, create a connection asset for it\. A Watson Query connection is created automatically in a catalog or project when you publish a virtual object to a catalog or assign it to a project\. The Watson Query connection was formerly named the Data Virtualization connection\. + +Watson Query integrates data sources across multiple types and locations and turns all this data into one logical data view\. This virtual data view makes the job of getting value out of your data easy\. + +## Create a Watson Query connection ## + +To create the connection asset, you need these connection details: + + + + * **Database name** + * **Hostname or IP address** of the database + * **Port number** + * **Instance ID** + * [Credentials information](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-data-virtual.html?context=cdpaas&locale=en#creds) + * **Application name** (optional): The name of the application that is currently using the connection\. For information, see [Client info properties support by the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/Javadocs/src/tpc/imjcc_r0052001.html)\. + * **Client accounting information** (optional): The value of the accounting string from the client information that is specified for the connection\. For information, see [Client info properties support by the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/Javadocs/src/tpc/imjcc_r0052001.html)\. + * **Client hostname** (optional): The hostname of the machine on which the application that is using the connection is running\. For information, see [Client info properties support by the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/Javadocs/src/tpc/imjcc_r0052001.html)\. + * **Client user** (optional): The name of the user on whose behalf the application that is using the connection is running\. For information, see [Client info properties support by the IBM Data Server Driver for JDBC and SQLJ](https://www.ibm.com/docs/SSEPGG_11.5.0/Javadocs/src/tpc/imjcc_r0052001.html)\. + * **SSL certificate** (if required by the database server) + + + +### Credentials ### + +**Connecting to a Watson Query instance in IBM Cloud** + + + + * **API key**: Enter an IAM API key\. Prerequisites: + + + + 1. Add the user ID as an IAM user or as a service ID to your IBM Cloud account. For instructions, see the **Console user experience** section of the [Identity and access management (IAM) on IBM Cloud](https://cloud.ibm.com/docs/Db2whc?topic=Db2whc-iam#console-ux) topic. + 2. The Watson Query Manager of the Watson Query instance must add IAM users by selecting **Data > Watson Query > Administration > User management** from the IBM watsonx navigation menu. + + + + + +**Connecting to a Watson Query instance in Cloud Pak for Data (on\-prem)** + + + + * **User credentials**: Enter your Cloud Pak for Data username and password\. + * **API key**: Enter an API key value with your Cloud Pak for Data username and a Cloud Pak for Data API key\. Use this syntax: `user_name:api_key` + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Watson Query connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Setup ## + +[Getting started with Watson Query ](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-virtualize.html) + +## Restriction ## + +You can use this connection only for source data\. You cannot write to data with this connection\. + +## Learn more ## + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d43de202e6d3eee211893585616bda7eb09211c4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d43de202e6d3eee211893585616bda7eb09211c4.md new file mode 100644 index 0000000..997d2b6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d43de202e6d3eee211893585616bda7eb09211c4.md @@ -0,0 +1,91 @@ +# Continuous machine learning (SPSS Modeler) + +# Continuous machine learning # + +As a result of IBM research, and inspired by natural selection in biology, continuous machine learning is available for the Auto Classifier node and the Auto Numeric node\. + +An inconvenience with modeling is models getting outdated due to changes to your data over time\. This is commonly referred to as model drift or concept drift\. To help overcome model drift effectively, SPSS Modeler provides continuous automated machine learning\. + +What is model drift? When you build a model based on historical data, it can become stagnant\. In many cases, new data is always coming in—new variations, new patterns, new trends, etc\.—that the old historical data doesn't capture\. To solve this problem, IBM was inspired by the famous phenomenon in biology called the natural selection of species\. Think of models as species and think of data as nature\. Just as nature selects species, we should let data select the model\. There's one big difference between models and species: species can evolve, but models are static after they're built\. + +There are two preconditions for species to evolve; the first is gene mutation, and the second is population\. Now, from a modeling perspective, to satisfy the first precondition (gene mutation), we should introduce new data changes into the existing model\. To satisfy the second precondition (population), we should use a number of models rather than just one\. What can represent a number of models? An Ensemble Model Set (EMS)\! + +The following figure illustrates how an EMS can evolve\. The upper left portion of the figure represents historical data with hybrid partitions\. The hybrid partitions ensure a rich initial EMS\. The upper right portion of the figure represents a new chunk of data that becomes available, with vertical bars on each side\. The left vertical bar represents current status, and the right vertical bar represents the status when there's a risk of model drift\. In each new round of continuous machine learning, two steps are performed to evolve your model and avoid model drift\. + +First, you construct an ensemble model set (EMS) using existing training data\. After that, when a new chunk of data becomes available, new models are built against that new data and added to the EMS as component models\. The weights of existing component models in the EMS are reevaluated using the new data\. As a result of this reevaluation, component models having higher weights are selected for the current prediction, and component models having lower weights may be deleted from the EMS\. This process refreshes the EMS for both model weights and model instances, thus evolving in a flexible and efficient way to address the inevitable changes to your data over time\. + +Figure 1\. Continuous auto machine learning + +![Continuous auto machine learning](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/caml.png) + +The ensemble model set (EMS) is a generated auto model nugget, and there's a refresh link between the auto modeling node and the generated auto model nugget that defines the refresh relationship between them\. When you enable continuous auto machine learning, new data assets are continuously fed to auto modeling nodes to generate new component models\. The model nugget is updated instead of replaced\. + +The following figure provides an example of the internal structure of an EMS in a continuous machine learning scenario\. Only the top three component models are selected for the current prediction\. For each component model (labeled as M1, M2, and M3), two kinds of weights are maintained\. Current Model Weight (CMW) describes how a component model performs with a new chunk of data, and Accumulated Model Weight (AMW) describes the comprehensive performance of a component model against recent chunks of data\. AMW is calculated iteratively via CMW and previous values of itself, and there's a hyper parameter beta to balance between them\. The formula to calculate AMW is called exponential moving average\. + +When a new chunk of data becomes available, first SPSS Modeler uses it to build a few new component models\. In this example figure, model four (M4) is built with CMW and AMW calculated during the initial model building process\. Then SPSS Modeler uses the new chunk of data to reevaluate measures of existing component models (M1, M2, and M3) and update their CMW and AMW based on the reevaluation results\. Finally, SPSS Modeler might reorder the component models based on CMW or AMW and select the top three component models accordingly\. + +In this figure, CMW is described using normalized value (sum = 1) and AMW is calculated based on CMW\. In SPSS Modeler, the absolute value (equal to evaluation\-weighted measure selected \- for example, accuracy) is chosen to represent CMW and AMW for simplicity\. + +Figure 2\. EMS structure + +![EMS structure](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/caml_details.png)Note that there are two types of weights defined for each EMS component model, both of which could be used for selecting top N models and component model drop out: + + + + * Current Model Weight (CMW) is computed via evaluation against the new data chunk (for example, evaluation accuracy on the new data chunk)\. + * Accumulated Model Weight (AMW) is computed via combining both CMW and existing AMW (for example, exponentially weighted moving average (EWMA)\. + + Exponential moving average formula for calculating AMW: + ![Exponential moving average formula for calculating AMW](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/caml_alg.png) + + + +In SPSS Modeler, after running an Auto Classifier node to generate a model nugget, the following model options are available for continuous machine learning: + + + + * Enable continuous auto machine learning during model refresh\. Select this option to enable continuous machine learning\. Keep in mind that consistent metadata (data model) must be used to train the continuous auto model\. If you select this option, other options are enabled\. + * Enable automatic model weights reevaluation\. This option controls whether evaluation measures (accuracy, for example) are computed and updated during model refresh\. If you select this option, an automatic evaluation process will run after the EMS (during model refresh)\. This is because it's usually necessary to reevaluate existing component models using new data to reflect the current state of your data\. Then the weights of the EMS component models are assigned according to reevaluation results, and the weights are used to decide the proportion a component model contributes to the final ensemble prediction\. This option is selected by default\. + + Figure 3. Model settings + + ![Model settings](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/caml_settings.png) + + Figure 4. Flag target + + ![Flag target](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/caml_models.png)Following are the supported CMW and AMW for the Auto Classifier node: + + + + Table 1. Supported CMW and AMW + + | Target type | CMW | AMW | + | ----------- | -------------------------------------- | ----------------------------------------- | + | flag target | Overall Accuracy
Area Under Curve | Accumulated Accuracy
Accumulated AUC | + | set target | Overall Accuracy | Accumulated Accuracy | + + + + The following three options are related to AMW, which is used to evaluate how a component model performs during recent data chunk periods: + * Enable accumulated factor during model weights reevaluation\. If you select this option, AMW computation will be enabled during model weights reevaluation\. AMW represents the comprehensive performance of an EMS component model during recent data chunk periods, related to the accumulated factor β defined in the AMW formula listed previously, which you can adjust in the node properties\. When this option isn't selected, only CMW will be computed\. This option is selected by default\. + * Perform model reduction based on accumulated limit during model refresh\. Select this option if you want component models with an AMW value below the specified limit to be removed from the auto model EMS during model refresh\. This can be helpful in discarding component models that are useless to prevent the auto model EMS from becoming too heavy\.The accumulated limit value evaluation is related to the weighted measure used when Evaluation\-weighted voting is selected as the ensemble method\. See the following\. + + Figure 5. Set and flag targets + + ![Set and flag targets](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/caml_targets.png) + + Note that if you select Model Accuracy for the evaluation-weighted measure, models with an accumulated accuracy below the specified limit will be deleted. And if you select Area under curve for the evaluation-weighted measure, models with an accumulated AUC below the specified limit will be deleted. + + By default, Model Accuracy is used for the evaluation-weighted measure for the Auto Classifier node, and there's an optional AUC ROC measure in the case of flag targets. + * Use accumulated evaluation\-weighted voting\. Select this option if you want AMW to be used for the current scoring/prediction\. Otherwise, CMW will be used by default\. This option is enabled when Evaluation\-weighted voting is selected for the ensemble method\. + + Note that for flag targets, by selecting this option, if you select Model Accuracy for the evaluation-weighted measure, then Accumulated Accuracy will be used as the AMW to perform the current scoring. Or if you select Area under curve for the evaluation-weighted measure, then Accumulated AUC will be used as the AMW to perform the current scoring. If you don't select this option and you select Model Accuracy for the evaluation-weighted measure, then Overall Accuracy will be used as the CMW to perform the current scoring. If you select Area under curve, Area under curve will be used as the CMW to perform the current scoring. + + For set targets, if you select this Use accumulated evaluation-weighted voting option, then Accumulated Accuracy will be used as the AMW to perform the current scoring. Otherwise, Overall Accuracy will be used as the CMW to perform the current scoring. + + + +With continuous auto machine learning, the auto model nugget is evolving all the time by rebuilding the auto model, which ensures that you get the most updated version reflecting the current state of your data\. SPSS Modeler provides the flexibility for different top N component models in the EMS to be selected according to their current weights, which keeps pace with varying data during different periods\. + +Note: The Auto Numeric node is a much simpler case, providing a subset of the options in the Auto Classifier node\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d476f3e93d23f52ef1d5079343d92db793e3ad5e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d476f3e93d23f52ef1d5079343d92db793e3ad5e.md new file mode 100644 index 0000000..58c8c1f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d476f3e93d23f52ef1d5079343d92db793e3ad5e.md @@ -0,0 +1,40 @@ +# Decision Optimization output data definition + +# Output data definition # + +When submitting your job you can define what output data you want and how you collect it (as either inline or referenced data)\. + +For more information about output file types and names see [Model input and output data file formats](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/ModelIOFileFormats.html#topic_modelIOFileFormats)\. + +Some output data definition examples: + + + + * To collect solution\.csv output as inline data: + + "output_data": [{ + "id":"solution.csv" + }] + * Regexp can be also used as an identifier\. For example to collect all csv output files as inline data: + + "output_data": [{ + "id":".*\.csv" + }] + * Similarly for reference data, to collect all csv files in COS/S3 in job specific folder, you can combine regexp and $\{job\_id\} and $\{ attachment\_name \} place holder + + "output_data_references": [{ + "id":".*\.csv", + "type": "connection_asset", + "connection": { + "id" : + }, + "location": { + "bucket": "XXXXXXXXX", + "path": "${job_id}/${attachment_name}" } + }] + + For example, here if you have a job with identifier to generate a solution.csv file, you will have in your COS/S3 bucket, a XXXXXXXXX / solution.csv file. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d487db53087c5fd4cd2a25112f1f8a8e496efc72.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d487db53087c5fd4cd2a25112f1f8a8e496efc72.md new file mode 100644 index 0000000..06d5555 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d487db53087c5fd4cd2a25112f1f8a8e496efc72.md @@ -0,0 +1,27 @@ +# extensionprocessnode properties + +# extensionprocessnode properties # + +![Extension Transform node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/extensionprocessnode.png) With the Extension Transform node, you can take data from a flow and apply transformations to the data using R scripting or Python for Spark scripting\. + + + +extensionprocessnode properties + +Table 1\. extensionprocessnode properties + +| `extensionprocessnode` properties | Data type | Property description | +| --------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------- | +| `syntax_type` | *R**Python* | Specify which script runs – R or Python (R is the default)\. | +| `r_syntax` | *string* | The R scripting syntax to run\. | +| `python_syntax` | *string* | The Python scripting syntax to run\. | +| `use_batch_size` | *flag* | Enable use of batch processing\. | +| `batch_size` | *integer* | Specify the number of data records to include in each batch\. | +| `convert_flags` | `StringsAndDoubles LogicalValues` | Option to convert flag fields\. | +| `convert_missing` | *flag* | Option to convert missing values to the R NA value\. | +| `convert_datetime` | *flag* | Option to convert variables with date or datetime formats to R date/time formats\. | +| `convert_datetime_class` | `POSIXct POSIXlt` | Options to specify to what format variables with date or datetime formats are converted\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d51ad51e5407bf4efae5c97fe7e031db56cf8733.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d51ad51e5407bf4efae5c97fe7e031db56cf8733.md new file mode 100644 index 0000000..722edda --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d51ad51e5407bf4efae5c97fe7e031db56cf8733.md @@ -0,0 +1,18 @@ +# Decision Optimization run parameters + +# Run parameters and Environment # + +You can select various run parameters for the optimization solve in the Decision Optimization experiment UI\. + +Quick links to sections: + + + + * [CPLEX runtime version](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_RunParameters/runparams.html?context=cdpaas&locale=en#RunConfig__cplexruntime) + * [Python version](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_RunParameters/runparams.html?context=cdpaas&locale=en#RunConfig__pyversion) + * [Run configuration parameters](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_RunParameters/runparams.html?context=cdpaas&locale=en#RunConfig__section_runconfig) + * [Environment for scenario](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_RunParameters/runparams.html?context=cdpaas&locale=en#RunConfig__section_runparamenv) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5521b8ec8ced84a2e383b3b6d5bc20795ef87b7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5521b8ec8ced84a2e383b3b6d5bc20795ef87b7.md new file mode 100644 index 0000000..f5a6c12 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5521b8ec8ced84a2e383b3b6d5bc20795ef87b7.md @@ -0,0 +1,41 @@ +# Time series analysis + +# Time series analysis # + +A time series is a sequence of data values measured at successive, though not necessarily regular, points in time\. The time series library allows you to perform various key operations on time series data, including segmentation, forecasting, joins, transforms, and reducers\. + +The library supports various time series types, including numeric, categorical, and arrays\. Examples of time series data include: + + + + * Stock share prices and trading volumes + * Clickstream data + * Electrocardiogram (ECG) data + * Temperature or seismographic data + * Network performance measurements + * Network logs + * Electricity usage as recorded by a smart meter and reported via an Internet of Things data feed + + + +An entry in a time series is called an observation\. Each observation comprises a time tick, a 64\-bit integer that indicates when the observation was made, and the data that was recorded for that observation\. The recorded data can be either numerical, for example, a temperature or a stock share price, or categorical, for example, a geographic area\. A time series can but must not necessarily be associated with a time reference system (TRS), which defines the granularity of each time tick and the start time\. + +The time series library is Python only\. + +## Next step ## + + + + * [Using the time series library](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-lib-using.html) + + + +## Learn more ## + + + + * [Time series key functionality](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-key-functionality.html) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d579aba442c4652bac088173107ecfebbf4d8290.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d579aba442c4652bac088173107ecfebbf4d8290.md new file mode 100644 index 0000000..c677e94 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d579aba442c4652bac088173107ecfebbf4d8290.md @@ -0,0 +1,43 @@ +# Federated Learning tutorials and samples + +# Federated Learning tutorials and samples # + +Select the tutorial that fits your needs\. To facilitate the learning process of Federated Learning, one tutorial with a UI\-based approach and one tutorial with an API calling approach for multiple frameworks and data sets is provided\. The results of either are the same\. All UI\-based tutorials demonstrate how to create the Federated Learning experiment in a low\-code environment\. All API\-based tutorials use two sample notebooks with Python scripts to demonstrate how to build and train the experiment\. + +## Tensorflow ## + +These hands\-on tutorials teach you how to create a Federated Learning experiment step by step\. These tutorials use the MNIST data set to demonstrate how different parties can contribute data to train a model to recognize handwriting\. You can choose between a UI\-based or API version of the tutorial\. + + + + * [Federated Learning Tensorflow tutorial for UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-tf2-tutorial.html) + + * [Federated Learning Tensorflow samples for API](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-tf2-samples.html) + + + +## XGBoost ## + +This is a tutorial for Federated Learning that teaches you how to create an experiment step by step with an income in the XGBoost framework\. The tutorial demonstrates how different parties can contribute data to train a model about adult incomes\. + + + + * [Federated Learning XGBoost tutorial for UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-xg-tutorial.html) + + * [Federated Learning XGBoost sample for API](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-xg-samples.html) + + + +## Homomorphic encryption ## + +This is a tutorial for Federated Learning that teaches you how to use the advanced method of homomorphic encryption step by step\. + + + + * [Federated Learning homomorphic encryption sample for API](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-fhe-sample.html) + + + +**Parent topic:**[IBM Federated learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fed-lea.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5863a9857f07023885a810210dfb819ad692ed7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5863a9857f07023885a810210dfb819ad692ed7.md new file mode 100644 index 0000000..4a01120 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5863a9857f07023885a810210dfb819ad692ed7.md @@ -0,0 +1,34 @@ +# Setting algorithm properties + +# Setting algorithm properties # + +For the Auto Classifier, Auto Numeric, and Auto Cluster nodes, you can set properties for specific algorithms used by the node by using the general form: + + autonode.setKeyedPropertyValue(, , ) + +For example: + + node.setKeyedPropertyValue("neuralnetwork", "method", "MultilayerPerceptron") + +Algorithm names for the Auto Classifier node are `cart`, `chaid`, `quest`, `c50`, `logreg`, `decisionlist`, `bayesnet`, `discriminant`, `svm` and `knn`\. + +Algorithm names for the Auto Numeric node are `cart`, `chaid`, `neuralnetwork`, `genlin`, `svm`, `regression`, `linear` and `knn`\. + +Algorithm names for the Auto Cluster node are `twostep`, `k-means`, and `kohonen`\. + +Property names are standard as documented for each algorithm node\. + +Algorithm properties that contain periods or other punctuation must be wrapped in single quotes\. For example: + + node.setKeyedPropertyValue("logreg", "tolerance", "1.0E-5") + +Multiple values can also be assigned for a property\. For example: + + node.setKeyedPropertyValue("decisionlist", "search_direction", ["Up", "Down"]) + +To enable or disable the use of a specific algorithm: + + node.setPropertyValue("chaid", True) + +Note: In cases where certain algorithm options aren't available in the Auto Classifier node, or when only a single value can be specified rather than a range of values, the same limits apply with scripting as when accessing the node in the standard manner\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d59300b05666e072ea812effa009e2dd4b60a508.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d59300b05666e072ea812effa009e2dd4b60a508.md new file mode 100644 index 0000000..9dccdea --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d59300b05666e072ea812effa009e2dd4b60a508.md @@ -0,0 +1,11 @@ +# Examining the data (SPSS Modeler) + +# Examining the data # + +For the first part of the process, imagine you have a flow that plots a number of graphs\. If the time series of temperature or power contains visible patterns, you could differentiate between impending error conditions or possibly predict their occurrence\. For both temperature and power, the flow plots the time series associated with the three different error codes on separate graphs, yielding six graphs\. Select nodes separate the data associated with the different error codes\. + +The graphs clearly display patterns distinguishing 202 errors from 101 and 303 errors\. The 202 errors show rising temperature and fluctuating power over time; the other errors don't\. However, patterns distinguishing 101 from 303 errors are less clear\. Both errors show even temperature and a drop in power, but the drop in power seems steeper for 303 errors\. + +Based on these graphs, it appears that the presence and rate of change for both temperature and power, as well as the presence and degree of fluctuation, are relevant to predicting and distinguishing faults\. These attributes should therefore be added to the data before applying the learning systems\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5d31fda0eebfcdd87005ed54ebedfd164fa073b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5d31fda0eebfcdd87005ed54ebedfd164fa073b.md new file mode 100644 index 0000000..cb0ccb9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5d31fda0eebfcdd87005ed54ebedfd164fa073b.md @@ -0,0 +1,22 @@ +# Charts node (SPSS Modeler) + +# Charts node # + +With the Charts node, you can launch the chart builder and create chart definitions to save with your flow\. Then when you run the node, chart output is generated\. + +The Charts node is available under the Graphs section on the node palette\. After adding a Charts node to your flow, double\-click it to open the properties pane\. Then click Launch Chart Builder to open the chart builder and create one or more chart definitions to associate with the node\. See [Visualizing your data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/visualizations.html) for details about creating charts\. + +Figure 1\. Example charts + +![Shows four example charts](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/charts_thumbnail4.png) Notes: + + + + * When you create a chart, it uses a sample of your data\. After clicking Save and close to save the chart definition and return to your flow, the Charts node will then use all of your data when you run it\. + * Chart definitions are listed in the node properties panel, with icons available for editing them or removing them\. + * When you right\-click a Charts node to run it, the defined chart (or charts) is built and added to the Outputs pane\. Open the chart output to interact with it by hovering over it, zooming in or out, or downloading the chart as an image file (\. png)\. + * When creating a chart, you can click Back to flow to close the chart builder and return to your flow\. But you can't run the Charts node until you save a chart definition\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5d7bd00bd17efe339c848f46345f2192fda5c11.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5d7bd00bd17efe339c848f46345f2192fda5c11.md new file mode 100644 index 0000000..42b664c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5d7bd00bd17efe339c848f46345f2192fda5c11.md @@ -0,0 +1,72 @@ +# Google Cloud Storage connection + +# Google Cloud Storage connection # + +To access your data in Google Cloud Storage, create a connection asset for it\. + +Google Cloud Storage is an online file storage web service for storing and accessing data on Google Cloud Platform Infrastructure\. + +## Create a connection to Google Cloud Storage ## + +To create the connection asset, you need these connection details: + + + + * Project ID + * Credentials: The contents of the Google service account key JSON file + * Client ID and Client secret + * Access token + * Refresh token + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Google Cloud Storage connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Supported file types ## + +The Google Cloud Storage connection supports these file types: Avro, CSV, Delimited text, Excel, JSON, ORC, Parquet, SAS, SAV, SHP, and XML\. + +## Learn more ## + +[Google Cloud Storage documentation](https://cloud.google.com/storage/docs/introduction) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5fafc625d1a1d0793d9521351e9b59a04af00e9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5fafc625d1a1d0793d9521351e9b59a04af00e9.md new file mode 100644 index 0000000..39b1fbf --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d5fafc625d1a1d0793d9521351e9b59a04af00e9.md @@ -0,0 +1,25 @@ +# Missing data values (SPSS Modeler) + +# Missing data values # + +During the data preparation phase of data mining, you will often want to replace missing values in the data\. + +Missing values are values in the data set that are unknown, uncollected, or incorrectly entered\. Usually, such values aren't valid for their fields\. For example, the field `Sex` should contain the values `M` and `F`\. If you discover the values `Y` or `Z` in the field, you can safely assume that such values aren't valid and should therefore be interpreted as blanks\. Likewise, a negative value for the field `Age` is meaningless and should also be interpreted as a blank\. Frequently, such obviously wrong values are purposely entered, or fields are left blank, during a questionnaire to indicate a nonresponse\. At times, you may want to examine these blanks more closely to determine whether a nonresponse, such as the refusal to give one's age, is a factor in predicting a specific outcome\. + +Some modeling techniques handle missing data better than others\. For example, the [C5\.0 node](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/c50.html) and the [Apriori node](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/apriori.html) cope well with values that are explicitly declared as "missing" in a [Type node](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/type.html)\. Other modeling techniques have trouble dealing with missing values and experience longer training times, resulting in less\-accurate models\. + +There are several types of missing values recognized by : + + + + * Null or system\-missing values\. These are nonstring values that have been left blank in the database or source file and have not been specifically defined as "missing" in an [Import](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/_nodes_import.html) or Type node\. System\-missing values are displayed as `$null$`\. Note that empty strings are not considered nulls in , although they may be treated as nulls by certain databases\. + * Empty strings and white space\. Empty string values and white space (strings with no visible characters) are treated as distinct from null values\. Empty strings are treated as equivalent to white space for most purposes\. For example, if you select the option to treat white space as blanks in an Import or Type node, this setting applies to empty strings as well\. + * Blank or user\-defined missing values\. These are values such as `unknown`, `99`, or `–1` that are explicitly defined in an Import node or Type node as missing\. Optionally, you can also choose to treat nulls and white space as blanks, which allows them to be flagged for special treatment and to be excluded from most calculations\. For example, you can use the `@BLANK` function to treat these values, along with other types of missing values, as blanks\. + + + +Reading in mixed data\. Note that when you're reading in fields with numeric storage (either integer, real, time, timestamp, or date), any non\-numeric values are set to `null` or `system missing`\. This is because, unlike some applications, doesn't allow mixed storage types within a field\. To avoid this, you should read in any fields with mixed data as strings by changing the storage type in the Import node or external application as necessary\. + +Reading empty strings from Oracle\. When reading from or writing to an Oracle database, be aware that, unlike and unlike most other databases, Oracle treats and stores empty string values as equivalent to null values\. This means that the same data extracted from an Oracle database may behave differently than when extracted from a file or another database, and the data may return different results\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d64140c0b8d4187b49046528ff61a54d77a99223.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d64140c0b8d4187b49046528ff61a54d77a99223.md new file mode 100644 index 0000000..0db2f2a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d64140c0b8d4187b49046528ff61a54d77a99223.md @@ -0,0 +1,15 @@ +# CHAID node (SPSS Modeler) + +# CHAID node # + +CHAID, or Chi\-squared Automatic Interaction Detection, is a classification method for building decision trees by using chi\-square statistics to identify optimal splits\. + +CHAID first examines the crosstabulations between each of the input fields and the outcome, and tests for significance using a chi\-square independence test\. If more than one of these relations is statistically significant, CHAID will select the input field that is the most significant (smallest `p` value)\. If an input has more than two categories, these are compared, and categories that show no differences in the outcome are collapsed together\. This is done by successively joining the pair of categories showing the least significant difference\. This category\-merging process stops when all remaining categories differ at the specified testing level\. For nominal input fields, any categories can be merged; for an ordinal set, only contiguous categories can be merged\. + +Exhaustive CHAID is a modification of CHAID that does a more thorough job of examining all possible splits for each predictor but takes longer to compute\. + +Requirements\. Target and input fields can be continuous or categorical; nodes can be split into two or more subgroups at each level\. Any ordinal fields used in the model must have numeric storage (not string)\. If necessary, the Reclassify node can be used to convert them\. + +Strengths\. Unlike the C&R Tree and QUEST nodes, CHAID can generate nonbinary trees, meaning that some splits have more than two branches\. It therefore tends to create a wider tree than the binary growing methods\. CHAID works for all types of inputs, and it accepts both case weights and frequency variables\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d669435b8d1c91d913bd24768e52644b95c675ae.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d669435b8d1c91d913bd24768e52644b95c675ae.md new file mode 100644 index 0000000..6a22f14 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d669435b8d1c91d913bd24768e52644b95c675ae.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Unreliable source attribution # + +![icon for explainability risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-explainability.svg)Risks associated with outputExplainabilityAmplified + +### Description ### + +Source attribution is the AI system's ability to describe from what training data it generated a portion or all its output\. Since current techniques are based on approximations, these attributions might be incorrect\. + +### Why is unreliable source attribution a concern for foundation models? ### + +Low quality explanations make it difficult for users, model validators, and auditors to understand and trust the model\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d69f33671e13df29fe56579ac4654ebc54a11f12.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d69f33671e13df29fe56579ac4654ebc54a11f12.md new file mode 100644 index 0000000..cf20da9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d69f33671e13df29fe56579ac4654ebc54a11f12.md @@ -0,0 +1,137 @@ +# SQL optimization (SPSS Modeler) + +# Nodes supporting SQL pushback # + +The tables in this section show nodes representing data\-mining operations that support SQL pushback\. If a node doesn't appear in these tables, it doesn't support SQL pushback\. + + + +Table 1\. Record Operations nodes + +| Nodes supporting SQL generation | Notes | +| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Select | Supports generation only if SQL generation for the select expression itself is supported\. If any fields have nulls, SQL generation does not give the same results for discard as are given in native SPSS Modeler\. | +| Sample | Simple sampling supports SQL generation to varying degrees depending on the database\. | +| Aggregate | SQL generation support for aggregation depends on the data storage type\. | +| RFM Aggregate | Supports generation except if saving the date of the second or third most recent transactions, or if only including recent transactions\. However, including recent transactions does work if the `datetime_date(YEAR,MONTH,DAY)` function is pushed back\. | +| Sort | | +| Merge | No SQL generated for merge by order\.

Merge by key with full or partial outer join is only supported if the database/driver supports it\. Non\-matching input fields can be renamed by means of a Filter node, or the Filter settings of an import node\.

Supports SQL generation for merge by condition\.

For all types of merge, `SQL_SP_EXISTS` is not supported if inputs originate in different databases\. | +| Append | Supports generation if inputs are unsorted\. SQL optimization is only possible when your inputs have the same number of columns\. | +| Distinct | A Distinct node with the (default) mode Create a composite record for each group selected doesn't support SQL optimization\. | + + + + + +Table 2\. SQL generation support in the Sample node for simple sampling + +| Mode | Sample | Max size | Seed | Db2 for z/OS | Db2 for OS/400 | Db2 for Win/UNIX | Oracle | SQL Server | Teradata | +| ------- | -------- | -------- | ---- | ------------ | -------------- | ---------------- | ------ | ---------- | -------- | +| Include | First | n/a | | Y | Y | Y | Y | Y | Y | +| | 1\-in\-n | off | | Y | Y | Y | Y | | Y | +| | | max | | Y | Y | Y | Y | | Y | +| | Random % | off | off | Y | | Y | Y | | Y | +| | | | on | Y | | Y | Y | | | +| | | max | off | Y | | Y | Y | | Y | +| | | | on | Y | | Y | Y | | | +| Discard | First | off | | | | | Y | | | +| | | max | | | | | Y | | | +| | 1\-in\-n | off | | Y | Y | Y | Y | | Y | +| | | max | | Y | Y | Y | Y | | Y | +| | Random % | off | off | Y | | Y | Y | | Y | +| | | | on | Y | | Y | Y | | | +| | | max | off | Y | | Y | Y | | Y | +| | | | on | Y | | Y | Y | | | + + + + + +Table 3\. SQL generation support in the Aggregate node + +| Storage | Sum | Mean | Min | Max | SDev | Median | Count | Variance | Percentile | +| --------- | --- | ---- | --- | --- | ---- | ------ | ----- | -------- | ---------- | +| Integer | Y | Y | Y | Y | Y | Y\* | Y | Y | Y\* | +| Real | Y | Y | Y | Y | Y | Y\* | Y | Y | Y\* | +| Date | | | Y | Y | | Y\* | Y | | Y\* | +| Time | | | Y | Y | | Y\* | Y | | Y\* | +| Timestamp | | | Y | Y | | Y\* | Y | | Y\* | +| String | | | Y | Y | | Y\* | Y | | Y\* | + + + +\* Median and Percentile are supported on Oracle\. + + + +Table 4\. Field Operations nodes + +| Nodes supporting SQL generation | Notes | +| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Type | Supports SQL generation if the Type node is instantiated and no `ABORT` or `WARN` type checking is specified\. | +| Filter | | +| Derive | Supports SQL generation if SQL generated for the derive expression is supported (see expressions later on this page)\. | +| Ensemble | Supports SQL generation for Continuous targets\. For other targets, supports generation only if the Highest confidence wins ensemble method is used\. | +| Filler | Supports SQL generation if the SQL generated for the derive expression is supported\. | +| Anonymize | Supports SQL generation for Continuous targets, and partial SQL generation for Nominal and Flag targets\. | +| Reclassify | | +| Binning | Supports SQL generation if the Tiles (equal count) binning method is used and the Read from Bin Values tab if available option is selected\. Due to differences in the way that bin boundaries are calculated (this is caused by the nature of the distribution of data in bin fields), you might see differences in the binning output when comparing normal flow execution results and SQL pushback results\. To avoid this, use the Record count tiling method, and either Add to next or Keep in current tiles to obtain the closest match between the two methods of flow execution\. | +| RFM Analysis | Supports SQL generation if the Read from Bin Values tab if available option is selected, but downstream nodes will not support it\. | +| Partition | Supports SQL generation to assign records to partitions\. | +| Set To Flag | | +| Restructure | | + + + + + +Table 5\. Graphs nodes + +| Nodes supporting SQL generation | Notes | +| ------------------------------- | ----- | +| Distribution | | +| Web | | +| Evaluation | | + + + +For some models, SQL for the model nugget can be generated, pushing back the model scoring stage to the database\. The main use of this feature is not to improve performance, but to allow flows containing these nuggets to have their full SQL pushed back\. See [Generating SQL from model nuggets](https://dataplatform.cloud.ibm.com/docs/content/wsd/sql_native.html) for more information\. + + + +Table 6\. Model nuggets + +| Model nuggets supporting SQL generation | Notes | +| --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| C&R Tree | Supports SQL generation for the single tree option, but not for the boosting, bagging, or large dataset options\. | +| QUEST | | +| CHAID | | +| C5\.0 | | +| Decision List | | +| Linear | Supports SQL generation for the standard model option, but not for the boosting, bagging, or large dataset options\. | +| Neural Net | Supports SQL generation for the standard model option (Multilayer Perceptron only), but not for the boosting, bagging, or large dataset options\. | +| PCA/Factor | | +| Logistic | Supports SQL generation for Multinomial procedure but not Binomial\. For Multinomial, generation isn't supported when confidences are selected, unless the target type is Flag\. | +| Generated Rulesets | | +| Auto Classifier | If a User Defined Function (UDF) scoring adapter is enabled, these nuggets support SQL pushback\. Also, if either SQL generation for Continuous targets, or the Highest confidence wins ensemble method are used, these nuggets support further pushback downstream\. | +| Auto Numeric | If a User Defined Function (UDF) scoring adapter is enabled, these nuggets support SQL pushback\. Also, if either SQL generation for Continuous targets, or the Highest confidence wins ensemble method are used, these nuggets support further pushback downstream\. | + + + + + +Table 7\. Outputs nodes + +| Nodes supporting SQL generation | Notes | +| ------------------------------- | ------------------------------------------------------------------------------- | +| Table | Supports generation if SQL generation is supported for highlight expression\. | +| Matrix | Supports generation except if All numerics is selected for the Fields option\. | +| Analysis | Supports generation, depending on the options selected\. | +| Transform | | +| Statistics | Supports generation if the Correlate option isn't used\. | +| Report | | +| Set Globals | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d6a347cb86df46925701892180f4d8a5b8e14508.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d6a347cb86df46925701892180f4d8a5b8e14508.md new file mode 100644 index 0000000..3082419 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d6a347cb86df46925701892180f4d8a5b8e14508.md @@ -0,0 +1,7 @@ +# applyregressionnode properties + +# applyregressionnode properties # + +You can use Linear Regression modeling nodes to generate a Linear Regression model nugget\. The scripting name of this model nugget is *applyregressionnode*\. No other properties exist for this model nugget\. For more information on scripting the modeling node itself, see [regressionnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/regressionnodeslots.html#regressionnodeslots)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d6db1fbf1b0a11fd3423b6f057182019496ff3f5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d6db1fbf1b0a11fd3423b6f057182019496ff3f5.md new file mode 100644 index 0000000..1832418 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d6db1fbf1b0a11fd3423b6f057182019496ff3f5.md @@ -0,0 +1,9 @@ +# Python scripting + +# Python scripting # + +This guide to the Python scripting language is an introduction to the components that you're most likely to use when scripting in SPSS Modeler, including concepts and programming basics\. + +This provides you with enough knowledge to start developing your own Python scripts to use in SPSS Modeler\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d71261b71a4cf5a1ad5e148ede7751b630060bdf.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d71261b71a4cf5a1ad5e148ede7751b630060bdf.md new file mode 100644 index 0000000..5b10482 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d71261b71a4cf5a1ad5e148ede7751b630060bdf.md @@ -0,0 +1,127 @@ +# Detecting entities with a custom transformer model + +# Detecting entities with a custom transformer model # + +If you don't have a fixed set of terms or you cannot express entities that you like to detect as regular expressions, you can build a custom transformer model\. The model is based on the pretrained Slate IBM Foundation model\. + +When you use the pretrained model, you can build multi\-lingual models\. You don't have to have separate models for each language\. + +You need sufficient training data to achieve high quality (2000 – 5000 per entity type)\. If you have GPUs available, use them for training\. + +Note:Training transformer models is CPU and memory intensive\. The predefined environments are not large enough to complete the training\. Create a custom notebook environment with a larger amount of CPU and memory, and use that to run your notebook\. If you have GPUs available, it's highly recommended to use them\. See [Creating your own environment template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-customize-env-definition.html)\. + +## Input data format ## + +The training data is represented as an array with multiple JSON objects\. Each JSON object represents one training instance, and must have a `text` and a `mentions` field\. The `text` field represents the training sentence text, and `mentions` is an array of JSON objects with the text, type, and location of each mention: + + [ + { + "text": str, + "mentions": { + "location": { + "begin": int, + "end": int + }, + "text": str, + "type": str + },...] + },... + ] + +Example: + + [ + { + "id": 38863234, + "text": "I'm moving to Colorado in a couple months.", + "mentions": { + "text": "Colorado", + "type": "Location", + "location": { + "begin": 14, + "end": 22 + } + }, + { + "text": "couple months", + "type": "Duration", + "location": { + "begin": 28, + "end": 41 + } + }] + } + ] + +## Training your model ## + +The transformer algorithm is using the pretrained Slate model\. The pretrained Slate model is only available in Runtime 23\.1\. + +To get the options available for configuring Transformer training, enter: + + help(watson_nlp.workflows.entity_mentions.transformer.Transformer.train) + +**Sample code** + + import watson_nlp + from watson_nlp.toolkit.entity_mentions_utils.train_util import prepare_stream_of_train_records_from_JSON_collection + + # load the syntax models for all languages to be supported + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + syntax_models = [syntax_model] + + # load the pretrained Slate model + pretrained_model_resource = watson_nlp.load('pretrained-model_slate.153m.distilled_many_transformer_multilingual_uncased') + + # prepare the train and dev data + # entity_train_data is a directory with one or more json files in the input format specified above + train_data_stream = prepare_stream_of_train_records_from_JSON_collection('entity_train_data') + dev_data_stream = prepare_stream_of_train_records_from_JSON_collection('entity_train_data') + + # train a transformer workflow model + trained_workflow = watson_nlp.workflows.entity_mentions.transformer.Transformer.train( + train_data_stream=train_data_stream, + dev_data_stream=dev_data_stream, + syntax_models=syntax_models, + template_resource=pretrained_model_resource, + num_train_epochs=3, + ) + +## Applying the model on new data ## + +Apply the trained transformer workflow model on new data by using the `run()` method, as you would use on any of the existing pre\-trained blocks\. + +**Code sample** + + trained_workflow.run('Bruce is at Times Square') + +## Storing and loading the model ## + +The custom transformer model can be stored as any other model as described in "Loading and storing models", using `ibm_watson_studio_lib`\. + +To load the custom transformer model, extra steps are required: + + + +1. Ensure that you have an access token on the **Access control** page on the **Manage** tab of your project\. Only project admins can create access tokens\. The access token can have **Viewer** or **Editor** access permissions\. Only editors can inject the token into a notebook\. +2. Add the project token to the notebook by clicking **More > Insert project token** from the notebook action bar and then run the cell\. + + By running the inserted hidden code cell, a `wslib` object is created that you can use for functions in the `ibm-watson-studio-lib` library. For information on the available `ibm-watson-studio-lib` functions, see [Using ibm-watson-studio-lib for Python](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html). +3. Download and extract the model to your local runtime environment: + + import zipfile + model_zip = 'trained_workflow_file' + model_folder = 'trained_workflow_folder' + wslib.download_file('trained_workflow', file_name=model_zip) + + with zipfile.ZipFile(model_zip, 'r') as zip_ref: + zip_ref.extractall(model_folder) +4. Load the model from the extracted folder: + + trained_workflow = watson_nlp.load(model_folder) + + + +**Parent topic:**[Creating your own models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-create-model.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d733288343a1790788e8069eb55908f9d12566a9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d733288343a1790788e8069eb55908f9d12566a9.md new file mode 100644 index 0000000..cdbcbfb --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d733288343a1790788e8069eb55908f9d12566a9.md @@ -0,0 +1,13 @@ +# Reading in text data (SPSS Modeler) + +# Reading in text data # + + + +1. You can read in delimited text data using a Data Asset import node\. From the Palette, under Import, add a Data Asset node to your flow\. +2. Double\-click the node to display its properties and select the data file drug1n\.csv\. +3. Now that you've added the data file, you may want to glance at the values for some of the records\. One way to do this is by building a flow that includes a Table node\. An easier way is to simply right\-click the Data Asset node you just added and select Preview\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d73c52b16ec33caa6d1f51effa5a6e37052d6110.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d73c52b16ec33caa6d1f51effa5a6e37052d6110.md new file mode 100644 index 0000000..46b7f93 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d73c52b16ec33caa6d1f51effa5a6e37052d6110.md @@ -0,0 +1,9 @@ +# Nodes palette (SPSS Modeler) + +# Nodes palette # + +The following sections describe all the nodes available on the palette in SPSS Modeler\. Drag\-and\-drop or double\-click a node in the list to add it to your flow canvas\. You can then double\-click any node icon in your flow to set its properties\. Hover over a property to see information about it, or click the information icon to see Help\. + +When first creating a flow, you select which runtime to use\. By default, the flow will use the IBM SPSS Modeler runtime\. If you want to use native Spark algorithms instead of SPSS algorithms, select the Spark runtime\. Properties for some nodes will vary depending on which runtime option you choose\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d778df3dc8ef2d3ab4ec511b8d20d35778794b93.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d778df3dc8ef2d3ab4ec511b8d20d35778794b93.md new file mode 100644 index 0000000..95e106f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d778df3dc8ef2d3ab4ec511b8d20d35778794b93.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Inaccessible training data # + +![icon for explainability risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-explainability.svg)Risks associated with outputExplainabilityAmplified + +### Description ### + +Without access to the training data, the types of explanations a model can provide are limited and more likely to be incorrect\. + +### Why is inaccessible training data a concern for foundation models? ### + +Low quality explanations without source data make it difficult for users, model validators, and auditors to understand and trust the model\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d7fd91bac6be16abd9b158c6b118e5e09e047c6d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d7fd91bac6be16abd9b158c6b118e5e09e047c6d.md new file mode 100644 index 0000000..2b38678 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d7fd91bac6be16abd9b158c6b118e5e09e047c6d.md @@ -0,0 +1,19 @@ +# Browsing the model (SPSS Modeler) + +# Browsing the model # + + + + * Run the Logistic node to generate the model\. Right\-click the model nugget and select View Model\. + + Figure 1. Browsing the model results + + ![Browsing the model results](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_classify_model.png) + + You can then explore the model information, feature (predictor) importance, and parameter estimates information. + + Note that these results are based on the training data only. To assess how well the model generalizes to other data in the real world, you can use a Partition node to hold out a subset of records for purposes of testing and validation. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d83baae9c79e5df9ca904ab1886ac4826447b495.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d83baae9c79e5df9ca904ab1886ac4826447b495.md new file mode 100644 index 0000000..aa1794e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d83baae9c79e5df9ca904ab1886ac4826447b495.md @@ -0,0 +1,136 @@ +# Examples of environment template customizations + +# Examples of environment template customizations # + +You can follow examples of how to add custom libraries through conda or pip using the provided templates for Python and R when you create an environment template\. + +You can use mamba in place of conda in the following examples with conda\. Remember to select the checkbox to install from mamba if you add channels or packages from mamba to the existing environment template\. + +Examples exist for: + + + + * [Adding conda packages](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/example-customizations.html?context=cdpaas&locale=en#add-conda-package) + * [Adding pip packages](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/example-customizations.html?context=cdpaas&locale=en#add-pip-package) + * [Combining conda and pip packages](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/example-customizations.html?context=cdpaas&locale=en#combine-conda-pip) + * [Adding complex packages with internal dependencies](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/example-customizations.html?context=cdpaas&locale=en#complex-packages) + * [Adding conda packages for R notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/example-customizations.html?context=cdpaas&locale=en#conda-in-r) + * [Setting environment variables](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/example-customizations.html?context=cdpaas&locale=en#set-vars) + + + +Hints and tips: + + + + * [Best practices](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/example-customizations.html?context=cdpaas&locale=en#best-practices) + + + +## Adding conda packages ## + +To get latest versions of pandas\-profiling: + + dependencies: + - pandas-profiling + +This is equivalent to running `conda install pandas-profiling` in a notebook\. + +## Adding pip packages ## + +You can also customize an environment using `pip` if a particular package is not available in conda channels: + + dependencies: + - pip: + - ibm-watson-machine-learning + +This is equivalent to running `pip install ibm-watson-machine-learning` in a notebook\. + +The customization will actually do more than just install the specified `pip` package\. The default behavior of `conda` is to also look for a new version of `pip` itself and then install it\. Checking all the implicit dependencies in `conda` often takes several minutes and also gigabytes of memory\. The following customization will shortcut the installation of `pip`: + + channels: + - empty + - nodefaults + + dependencies: + - pip: + - ibm-watson-machine-learning + +The conda channel `empty` does not provide any packages\. There is no `pip` package in particular\. `conda` won't try to install `pip` and will use the already pre\-installed version instead\. Note that the keyword `nodefaults` in the list of channels needs at least one other channel in the list\. Otherwise `conda` will silently ignore the keyword and use the default channels\. + +## Combining conda and pip packages ## + +You can list multiple packages with one package per line\. A single customization can have both conda packages and pip packages\. + + dependencies: + - pandas-profiling + - scikit-learn=0.20 + - pip: + - watson-machine-learning-client-V4 + - sklearn-pandas==1.8.0 + +Note that the required template notation is sensitive to leading spaces\. Each item in the list of conda packages must have two leading spaces\. Each item in the list of pip packages must have four leading spaces\. The version of a conda package must be specified using a single equals symbol (`=`), while the version of a pip package must be added using two equals symbols (`==`)\. + +## Adding complex packages with internal dependencies ## + +When you add many packages or a complex package with many internal dependencies, the conda installation might take long or might even stop without you seeing any error message\. To avoid this from happening: + + + + * Specify the versions of the packages you want to add\. This reduces the search space for conda to resolve dependencies\. + * Increase the memory size of the environment\. + * Use a specific channel instead of the default conda channels that are defined in the `.condarc` file\. This avoids running lengthy searches through big channels\. + + + +Example of a customization that doesn't use the default conda channels: + + # get latest version of the prophet package from the conda-forge channel + channels: + - conda-forge + - nodefaults + + dependencies: + - prophet + +This customization corresponds to the following command in a notebook: + + !conda install -c conda-forge --override-channels prophet -y + +## Adding conda packages for R notebooks ## + +The following example shows you how to create a customization that adds conda packages to use in an R notebook: + + channels: + - defaults + + dependencies: + - r-plotly + +This customization corresponds to the following command in a notebook: + + print(system("conda install r-plotly", intern=TRUE)) + +The names of R packages in conda generally start with the prefix `r-`\. If you just use `plotly` in your customization, the installation would succeed but the Python package would be installed instead of the R package\. If you then try to use the package in your R code as in `library(plotly)`, this would return an error\. + +## Setting environment variables ## + +You can set environment variables in your environment by adding a variables section to the software customization template as shown in the following example: + + variables: + my_var: my_value + HTTP_PROXY: https://myproxy:3128 + HTTPS_PROXY: https://myproxy:3128 + NO_PROXY: cluster.local + +The example also shows that you can use the variables section to set a proxy server for an environment\. + +**Limitation**: You cannot override existing environment variables, for example LD\_LIBRARY\_PATH, using this approach\. + +## Best practices ## + +To avoid problems that can arise finding packages or resolving conflicting dependencies, start by installing the packages you need manually through a notebook in a test environment\. This enables you to check interactively if packages can be installed without errors\. After you have verified that the packages were all correctly installed, create a customization for your development or production environment and add the packages to the customization template\. + +**Parent topic:**[Customizing environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/customize-envs.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d872c74770b5729e037e841679f741cf3d8c20ad.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d872c74770b5729e037e841679f741cf3d8c20ad.md new file mode 100644 index 0000000..dbc913b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d872c74770b5729e037e841679f741cf3d8c20ad.md @@ -0,0 +1,6 @@ +# Tree charts + +# Tree charts # + +Tree charts represent hierarchy in a tree\-like structure\. The structure of a Tree chart consists of a root node (has no parent node), line connections (named branches), and leaf nodes (have no child nodes)\. Line connections represent the relationships and connections between the members\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d8bd7c30f776f7218860187f535c6b72d1a8dc74.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d8bd7c30f776f7218860187f535c6b72d1a8dc74.md new file mode 100644 index 0000000..c98e51a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d8bd7c30f776f7218860187f535c6b72d1a8dc74.md @@ -0,0 +1,143 @@ +# Adding data assets to a deployment space + +# Adding data assets to a deployment space # + +Learn about various ways of adding and promoting data assets to a space and data types that are used in deployments\. + +Data can be: + + + + * A data file such as a \.csv file + * A connection to data that is located in a repository such as a database\. + * Connected data that is located in a storage bucket\. For more information, see [Using data from the Cloud Object Storage service](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html?context=cdpaas&locale=en#cos-data)\. + + + +**Notes:** + + + + * For definitions of data\-related terms, refer to [Asset types and properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html)\. + + + +You can add data to a space in one of these ways: + + + + * [Add data and connections to space by using UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html?context=cdpaas&locale=en#add-directly) + * [Promote a data source, such as a file or a connection from an associated project](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-promote-assets.html) + * [Save a data asset to a space programmatically](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html?context=cdpaas&locale=en#add-programmatically) + * [Import a space or a project, including data assets, into an existing space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-import-to-space.html)\. + + + +Data added to a space is managed in a similar way to data added to a Watson Studio project\. For example: + + + + * Adding data to a space creates a new copy of the asset and its attachments within the space, maintaining a reference back to the project asset\. If an asset such as a data connection requires access credentials, they persist and are the same whether you are accessing the data from a project or from a space\. + * Just like with data connection in a project, you can edit data connection details from the space\. + * Data assets are stored in a space in the same way that they are stored in a project\. They use the same file structure for the space as the structure used for the project\. + + + +## Adding data and connections to space by using UI ## + +To add data or connections to space by using UI: + + + +1. From the **Assets** tab of your deployment space, click **Import assets**\. +2. Choose between adding a connected data asset, local file, or connection to a data source: + + + + * If you want to add a connected data asset, select **Connected data**. Choose a connection and click **Import**. + * If you want to add a local file, select **Local file > Data asset**. Upload your file and click **Done**. + * If you want to add a connection to a data source, select **Data access > Connection**. Choose a connection and click **Import**. + + + + + +The data asset displays in the space and is available for use as an input data source in a deployment job\. + +Note:Some types of connections allow for using your personal platform credentials\. If you add a connection or connected data that uses your personal platform credentials, tick the **Use my platform login credentials** checkbox\. + +## Adding data to space programmatically ## + +If you are using APIs to create, update, or delete Watson Machine Learning assets, make sure that you are using only Watson Machine Learning [API calls](https://cloud.ibm.com/apidocs/machine-learning)\. + +For an example of how to add assets programmatically, refer to this sample notebook: [Use SPSS and batch deployment with Db2 to predict customer churn](https://github.com/IBM/watson-machine-learning-samples/blob/df8e5122a521638cb37245254fe35d3a18cd3f59/cloud/notebooks/python_sdk/deployments/spss/Use%20SPSS%20and%20batch%20deployment%20with%20DB2%20to%20predict%20customer%20churn.ipynb) + +### Data source reference types in Watson Machine Learning ### + +Data source reference types are referenced in Watson Machine Learning requests to represent input data and results locations\. Use `data_asset` and `connection_asset` for these types of data sources: + + + + * Cloud Object Storage + * Db2 + * Database data + + + +**Notes:** + + + + * For Decision Optimization, the reference type is `url`\. + + + +#### Example data\_asset payload #### + + {"input_data_references": [{ + "type": "data_asset", + "connection": { + }, + "location": { + "href": "/v2/assets/?space_id=" + } + }] + +#### Example connection\_asset payload #### + + "input_data_references": [{ + "type": "connection_asset", + "connection": { + "id": "" + }, + "location": { + "bucket": "", + "file_name": "/" + } + + }] + +For more information, see: + + + + * Watson Machine Learning [REST API](https://cloud.ibm.com/apidocs/machine-learning) + + + +## Using data from the Cloud Object Storage service ## + +Cloud Object Storage service can be used with deployment jobs through a connected data asset or a connection asset\. To use data from the Cloud Object Storage service: + + + +1. Create a connection to IBM Cloud Object Storage by adding a **Connection** to your project or space and selecting Cloud Object Storage (infrastructure) or Cloud Object Storage as the connector\. Provide the secret key, access key, and login URL\. + + Note:When you are creating a connection to Cloud Object Storage or Cloud Object Storage (Infrastructure), you must specify both `access_key` and `secret_key`. If `access_key` and `secret_key` are not specified, downloading the data from that connection doesn't work in a batch deployment job. For reference, see [IBM Cloud Object Storage connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html) and [IBM Cloud Object Storage (infrastructure) connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos-infra.html). +2. Add input and output files to the deployment space as connected data by using the Cloud Object Storage connection that you created\. + + + +**Parent topic:**[Assets in deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets-all.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d91044a492d05f87613bba485cd2fae1f54764db.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d91044a492d05f87613bba485cd2fae1f54764db.md new file mode 100644 index 0000000..914687e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d91044a492d05f87613bba485cd2fae1f54764db.md @@ -0,0 +1,41 @@ +# filternode properties + +# filternode properties # + +![Filter node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/filternodeicon.png)The Filter node filters (discards) fields, renames fields, and maps fields from one import node to another\. + +Using the default\_include property\. Note that setting the value of the `default_include` property doesn't automatically include or exclude all fields; it simply determines the default for the current selection\. This is functionally equivalent to selecting the Include All Fields option in the Filter node properties\. For example, suppose you run the following script: + + node = modeler.script.stream().create("filter", "Filter") + node.setPropertyValue("default_include", False) + # Include these two fields in the list + for f in ["Age", "Sex"]: + node.setKeyedPropertyValue("include", f, True) + +This will cause the node to pass the fields `Age` and `Sex` and discard all others\. Now suppose you run the same script again but name two different fields: + + node = modeler.script.stream().create("filter", "Filter") + node.setPropertyValue("default_include", False) + # Include these two fields in the list + for f in ["BP", "Na"]: + node.setKeyedPropertyValue("include", f, True) + +This will add two more fields to the filter so that a total of four fields are passed (`Age`, `Sex`, `BP`, `Na`)\. In other words, resetting the value of `default_include` to `False` doesn't automatically reset all fields\. + +Alternatively, if you now change `default_include` to `True`, either using a script or in the Filter node dialog box, this would flip the behavior so the four fields listed previously would be discarded rather than included\. When in doubt, experimenting with the controls in the Filter node properties may be helpful in understanding this interaction\. + + + +filternode properties + +Table 1\. filternode properties + +| `filternode` properties | Data type | Property description | +| ----------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `default_include` | *flag* | Keyed property to specify whether the default behavior is to pass or filter fields: Note that setting this property doesn't automatically include or exclude all fields; it simply determines whether selected fields are included or excluded by default\. | +| `include` | *flag* | Keyed property for field inclusion and removal\. | +| `new_name` | *string* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d92a34a349cee727b017af7d40b880b232220959.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d92a34a349cee727b017af7d40b880b232220959.md new file mode 100644 index 0000000..53c0c21 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d92a34a349cee727b017af7d40b880b232220959.md @@ -0,0 +1,50 @@ +# Watson Natural Language Processing library usage samples + +# Watson Natural Language Processing library usage samples # + +The sample notebooks demonstrate how to use the different Watson Natural Language Processing blocks and how to train your own models\. + +## Sample project and notebooks ## + +To help you get started with the Watson Natural Language Processing library, you can download a sample project and notebooks from the Samples\. + +You can access the Samples by selecting **Samples** from the Cloud Pak for Data navigation menu\. + +**Sample notebooks** + + + + * [Financial complaint analysis](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/39047aede50128e7cbc8ea19660fe1f6) + + This notebook shows you how to analyze financial customer complaints using Watson Natural Language Processing. It uses data from the Consumer Complaint Database published by the Consumer Financial Protection Bureau (CFPB). The notebook teaches you to use the Tone classification and Emotion classification models. + * [Car complaint analysis](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/4b8aa2c1ee67a6cd1172a1cf760f65f7) + + This notebook demonstrates how to analyze car complaints using Watson Natural Language Processing. It uses publicly available complaint records from car owners stored by the National Highway and Transit Association (NHTSA) of the US Department of Transportation. This notebook shows you how use syntax analysis to extract the most frequently used nouns, which typically depict the problems that review authors talk about and combine these results with structured data using association rule mining. + * [Complaint classification with Watson Natural Language Processing](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/636001e59902133a4a23fd89f011c232) + + This notebook demonstrates how to train different text classifiers using Watson Natural Language Processing. The classifiers predict the product group from the text of a customer complaint. This could be used, for example to route a complaint to the appropriate staff member. The data that is used in this notebook is taken from the Consumer Complaint Database that is published by the Consumer Financial Protection Bureau (CFPB), a U.S. government agency and is publicly available. You will learn how to train a custom CNN model and a VotingEnsemble model and evaluate their quality. + * [Entity extraction on Financial Complaints with Watson Natural Language Processing](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/636001e59902133a4a23fd89f0112100) + + This notebook demonstrates how to extract named entities from financial customer complaints using Watson Natural Language Processing. It uses data from the Consumer Complaint Database published by the Consumer Financial Protection Bureau (CFPB). In the notebook you will learn how to do dictionary-based term extraction to train a custom extraction model based on given dictionaries and extract entities using the BERT or a transformer model. + + + +**Sample project** + +If you don't want to download the sample notebooks to your project individually, you can download the entire sample project [Text Analysis with Watson Natural Language Processing](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/636001e59902133a4a23fd89f010e4cb) from the IBM watsonx Gallery\. + +The sample project contains the sample notebooks listed in the previous section, including: + + + + * Analyzing hotel reviews using Watson Natural Language Processing + + This notebook shows you how to use syntax analysis to extract the most frequently used nouns from the hotel reviews, classify the sentiment of the reviews and use targets sentiment analysis. The data file that is used by this notebook is included in the project as a data asset. + + + +You can run all of the sample notebooks with the `NLP + DO Runtime 23.1 on Python 3.10 XS` environment except for the *Analyzing hotel reviews using Watson Natural Language Processing* notebook\. To run this notebook, you need to create an environment template that is large enough to load the CPU\-optimized models for sentiment and targets sentiment analysis\. + +**Parent topic:**[Watson Natural Language Processing library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d9304450e79dc05b5ecc4fe98d48fecef76a852e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d9304450e79dc05b5ecc4fe98d48fecef76a852e.md new file mode 100644 index 0000000..430a15e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d9304450e79dc05b5ecc4fe98d48fecef76a852e.md @@ -0,0 +1,39 @@ +# Finding nodes + +# Finding nodes # + +Flows provide a number of ways for locating an existing node\. These methods are summarized in the following table\. + + + +Methods for locating an existing node + +Table 1\. Methods for locating an existing node + +| Method | Return type | Description | +| ---------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `s.findAll(type, label)` | Collection | Returns a list of all nodes with the specified type and label\. Either the type or label can be `None`, in which case the other parameter is used\. | +| `s.findAll(filter, recursive)` | Collection | Returns a collection of all nodes that are accepted by the specified filter\. If the recursive flag is `True`, any SuperNodes within the specified flow are also searched\. | +| `s.findByID(id)` | Node | Returns the node with the supplied ID or `None` if no such node exists\. The search is limited to the current stream\. | +| `s.findByType(type, label)` | Node | Returns the node with the supplied type, label, or both\. Either the type or name can be `None`, in which case the other parameter is used\. If multiple nodes result in a match, then an arbitrary one is chosen and returned\. If no nodes result in a match, then the return value is `None`\. | +| `s.findDownstream(fromNodes)` | Collection | Searches from the supplied list of nodes and returns the set of nodes downstream of the supplied nodes\. The returned list includes the originally supplied nodes\. | +| `s.findUpstream(fromNodes)` | Collection | Searches from the supplied list of nodes and returns the set of nodes upstream of the supplied nodes\. The returned list includes the originally supplied nodes\. | +| `s.findProcessorForID(String id, boolean recursive)` | Node | Returns the node with the supplied ID or `None` if no such node exists\. If the recursive flag is `true`, then any composite nodes within this diagram are also searched\. | + + + +As an example, if a flow contains a single Filter node that the script needs to access, the Filter node can be found by using the following script: + + stream = modeler.script.stream() + node = stream.findByType("filter", None) + ... + +Alternatively, you can use the ID of a node\. For example: + + stream = modeler.script.stream() + node = stream.findByID("id49CVL4GHVV8") # the Derive node ID + node.setPropertyValue("mode", "Multiple") + node.setPropertyValue("name_extension", "new_derive") + +To obtain the ID for any node in a flow, click the Scripting icon on the toolbar, then select the desired node in your flow and click Insert selected node ID\.![Node ID](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/spss_node_id.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d96c3a08a5607bdcb1bc85e0bedd8743ea0b3dc5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d96c3a08a5607bdcb1bc85e0bedd8743ea0b3dc5.md new file mode 100644 index 0000000..7817c91 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d96c3a08a5607bdcb1bc85e0bedd8743ea0b3dc5.md @@ -0,0 +1,20 @@ +# Automated data preparation (SPSS Modeler) + +# Automated data preparation # + +Preparing data for analysis is one of the most important steps in any data\-mining project—and traditionally, one of the most time consuming\. The Auto Data Prep node handles the task for you, analyzing your data and identifying fixes, screening out fields that are problematic or not likely to be useful, deriving new attributes when appropriate, and improving performance through intelligent screening techniques\. + +You can use the Auto Data Prep node in fully automated fashion, allowing the node to choose and apply fixes, or you can preview the changes before they're made and accept or reject them as desired\. With this node, you can ready your data for data mining quickly and easily, without the need for prior knowledge of the statistical concepts involved\. If you run the node with the default settings, models will tend to build and score more quickly\. + +This example uses the flow named Automated Data Preparation, available in the example project \. The data file is telco\.csv\. This example demonstrates the increased accuracy you can find by using the default Auto Data Prep node settings when building models\. + +Let's take a look at the flow\. + + + +1. Open the Example Project\. +2. Scroll down to the Modeler flows section, click View all, and select the Automated Data Preparation flow\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d9b02a6929162af5f13e95c700ce0e548f6a9ee3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d9b02a6929162af5f13e95c700ce0e548f6a9ee3.md new file mode 100644 index 0000000..718a1bd --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/d9b02a6929162af5f13e95c700ce0e548f6a9ee3.md @@ -0,0 +1,171 @@ +# Controlling access to Cloud Object Storage buckets + +# Controlling access to Cloud Object Storage buckets # + +A bucket is a logical abstraction that provides a container for data\. Buckets in Cloud Object Storage are created in IBM Cloud\. Within a Cloud Object Storage instance, you can use policies to restrict users' access to buckets\. + +Here's how it works: + +![A Cloud Object Storage instance with two buckets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/COSInstanceAndBuckets.svg) + +In this illustration, two credentials are associated with a Cloud Object Storage instance\. Each of the credentials references an IAM service ID in which policies are defined to control which bucket that service ID can access\. By using a specific credential when you add a Cloud Object Storage connection to a project, only the buckets accessible to the service ID associated with that credential are visible\. + +To create connections that restrict users' access to buckets, follow these steps\. + +First, in IBM Cloud: + + + +1. [Create a Cloud Object Storage instance and several buckets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/cos_buckets.html?context=cdpaas&locale=en#createbucket) +2. [Create a service credential and Service ID for each combination of buckets that you want users to be able to access](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/cos_buckets.html?context=cdpaas&locale=en#credentials) +3. [Verify that the service IDs were created](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/cos_buckets.html?context=cdpaas&locale=en#verify) +4. [Edit the policies of each service ID to provide access to the appropriate buckets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/cos_buckets.html?context=cdpaas&locale=en#policy) +5. [Copy values from each of the service credentials that you created](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/cos_buckets.html?context=cdpaas&locale=en#copy) +6. [Copy the endpoint](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/cos_buckets.html?context=cdpaas&locale=en#endpoint) + + Then, in your project: +7. [Add Cloud Object Storage connections that use the service credentials that you created](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/cos_buckets.html?context=cdpaas&locale=en#add) +8. [Test users' access to buckets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/cos_buckets.html?context=cdpaas&locale=en#test) + + + +## Step 1: Create a Cloud Object Storage instance and several buckets ## + + + +1. From the [IBM Cloud catalog](https://cloud.ibm.com/catalog#services), search for Object Storage, then create a Cloud Object Storage instance\. +2. Select **Buckets** in the navigation pane\. +3. Create as many buckets as you need\. + + For example, create three buckets: dept1-bucket, dept2-bucket, and dept3-bucket. + + ![Buckets page](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/BucketsAndObjectsPage.png) + + + +## Step 2: Create a service credential and Service ID for each combination of buckets that you want users to be able to access ## + + + +1. Select **Service credentials** in the navigation pane\. +2. Click **New Credential**\. +3. In the Add new credential dialog, provide a name for the credential and select the appropriate access role\. +4. Within the **Select Service ID** field, click **Create New Service ID**\. +5. Enter a name for the new service ID\. We recommend using the same or a similar name to that of the credential for easy identification\. +6. Click **Add**\. +7. Repeat steps 2 to 6 for each credential that you want to create\. + + For example, create three credentials: cos-all-access, dept1-dept2-buckets-only, and dept2-dept3-buckets-only. + + ![Service credentials page](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/ServiceCredentialsPage.png) + + + +## Step 3: Verify that the service IDs were created ## + + + +1. In the IBM Cloud page header, click **Manage > Access (IAM)**\. +2. Select **Service IDs** in the navigation pane\. +3. Confirm that the service IDs you created in steps 2d and 2e are visible\. + + ![Service IDs page](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/ServiceIDsPage.png) + + + +## Step 4: Edit the policies of each service ID to provide access to the appropriate buckets ## + + + +1. Open each service ID in turn\. +2. On the Access policies tab, select **Edit** from the Actions menu to view the policy\. +3. If necessary, edit the policy to provide access to the appropriate buckets\. +4. If needed, create one or more new policies\. + + + + 1. Remove the existing, default policy which provides access to all of the buckets in the Cloud Object Storage instance. + 2. Click **Assign access**. + 3. For **Resource type**, specify "bucket". + 4. For **Resource ID**, specify a bucket name. + 5. In the Select roles section, select **Viewer** from the "Assign platform access roles" list and select **Writer** from the "Assign service access roles" list. + + + + + +### Example 1 ### + +By default, the policy for the cos\-all\-access service ID provides Writer access to the Cloud Object Storage instance\. + +![Access policies tab for the cos\-all\-access service ID](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/AccessPoliciesPageForcosallaccess.png) + +Because you want this service ID and the corresponding credential to provide users with access to all of the buckets, no edits are required\. + +![Edit policy page for the cos\-all\-access service ID](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/cosallaccessServiceIDPolicy.png) + +### Example 2 ### + +By default, the policy for the "dept1\-dept2\-buckets\-only" service ID provides Writer access to the Cloud Object Storage instance\. Because you want this service ID and the corresponding credential to provide users with access only to the dept1\-bucket and dept2\-bucket buckets, remove the default policy and create two access policies, one for dept1\-bucket and one for dept2\-bucket\. + +![Access policies tab for the dept1\-dept2\-buckets\-only service ID](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/AccessPoliciesPageFordept1dept2bucketsonly.png) + +![Edit Policy page for the dept1\-bucket\-only service ID](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/SelectRolesSection_dept1.png) + +![Edit Policy page for the dept2\-bucket\-only service ID](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/SelectRolesSection_dept2.png) + +## Step 5: Copy values from each of the service credentials that you created ## + + + +1. Return to your IBM Cloud Dashboard and select Cloud Object Storage from the **Storage** list\. +2. Select **Service credentials** in the navigation pane\. +3. Click the **View credentials** action for one of the service IDs that you created in step 2\. +4. Copy the "apikey" value and the "resource\_instance\_id" value to a temporary location, such as a desktop note\. + + ![cos-all-access credential](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/ViewCredentials_apikey.png) + + ![cos-all-access credential](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/ViewCredentials_resourceinstanceid.png) +5. Repeat steps 3 and 4 for each credential\. + + + +## Step 6: Copy the Endpoint ## + + + +1. Select **Endpoint** in the navigation pane\. +2. Copy the URL of the endpoint that you want to connect to\. Save the value to a temporary location, such as a desktop note\. + + + +## Step 7: Add Cloud Object Storage connections that use the service credentials that you created ## + + + +1. Return to your project on the *Assets* tab, and click **New asset > Connect to a data source**\.\. +2. On the New connection page, click **Cloud Object Storage**\. +3. Name the new connection and enter the login URL (from the Endpoints page) as well as the "apikey" and "resource\_instance\_id" values that you copied in step 5 from one of the service credentials\. +4. Repeat steps 3 to 5 for each service credential\. + + The connections will be visible in the Data assets section of the project. + + + +## Test users' access to buckets ## + +Going forward, when you add a data asset from a Cloud Object Storage connection to a project, you'll see only the buckets that the policies allow you to access\. To test this: + + + +1. From a project, click **New asset > Connected data**\. Or from a catalog, click **Add to project > Connected data**\. +2. In the Connection source section, click **Select source**\. + + On the Select connection source page, you can see the Cloud Object Storage connections that you created. +3. Select one of the Cloud Object Storage connections to see that only the buckets accessible to the service ID associated with that bucket's credential are visible\. + + + +**Parent topic:**[Adding connections to projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/da0357b0ade596e1a23f676f76ff4304b97aef2b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/da0357b0ade596e1a23f676f76ff4304b97aef2b.md new file mode 100644 index 0000000..3400626 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/da0357b0ade596e1a23f676f76ff4304b97aef2b.md @@ -0,0 +1,9 @@ +# Jython code size limits + +# Jython code size limits # + +Jython compiles each script to Java bytecode, which the Java Virtual Machine (JVM) then runs\. However, Java imposes a limit on the size of a single bytecode file\. So when Jython attempts to load the bytecode, it can cause the JVM to crash\. SPSS Modeler is unable to prevent this from happening\. + +Ensure that you write your Jython scripts using good coding practices (such as minimizing duplicated code by using variables or functions to compute common intermediate values)\. If necessary, you may need to split your code over several source files or define it using modules as these are compiled into separate bytecode files\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/da3d295da633cd271fb3970ad2ed4b31bdcb6247.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/da3d295da633cd271fb3970ad2ed4b31bdcb6247.md new file mode 100644 index 0000000..5e0b4e5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/da3d295da633cd271fb3970ad2ed4b31bdcb6247.md @@ -0,0 +1,42 @@ +# meansnode properties + +# meansnode properties # + +![Means node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/matrixnodeicon.png)The Means node compares the means between independent groups or between pairs of related fields to test whether a significant difference exists\. For example, you could compare mean revenues before and after running a promotion or compare revenues from customers who didn't receive the promotion with those who did\. + + + +meansnode properties + +Table 1\. meansnode properties + +| `meansnode` properties | Data type | Property description | +| -------------------------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `means_mode` | `BetweenGroups``BetweenFields` | Specifies the type of means statistic to be executed on the data\. | +| `test_fields` | `[field1 ... fieldn]` | Specifies the test field when `means_mode` is set to `BetweenGroups`\. | +| `grouping_field` | *field* | Specifies the grouping field\. | +| `paired_fields` | `[field1 field2]``field3 field4]``...]` | Specifies the field pairs to use when `means_mode` is set to `BetweenFields`\. | +| `label_correlations` | *flag* | Specifies whether correlation labels are shown in output\. This setting applies only when `means_mode` is set to `BetweenFields`\. | +| `correlation_mode` | `Probability``Absolute` | Specifies whether to label correlations by probability or absolute value\. | +| `weak_label` | *string* | | +| `medium_label` | *string* | | +| `strong_label` | *string* | | +| `weak_below_probability` | *number* | When `correlation_mode` is set to `Probability`, specifies the cutoff value for weak correlations\. This must be a value between 0 and 1—for example, 0\.90\. | +| `strong_above_probability` | *number* | Cutoff value for strong correlations\. | +| `weak_below_absolute` | *number* | When `correlation_mode` is set to `Absolute`, specifies the cutoff value for weak correlations\. This must be a value between 0 and 1—for example, 0\.90\. | +| `strong_above_absolute` | *number* | Cutoff value for strong correlations\. | +| `unimportant_label` | *string* | | +| `marginal_label` | *string* | | +| `important_label` | *string* | | +| `unimportant_below` | *number* | Cutoff value for low field importance\. This must be a value between 0 and 1—for example, 0\.90\. | +| `important_above` | *number* | | +| `use_output_name` | *flag* | Specifies whether a custom output name is used\. | +| `output_name` | *string* | Name to use\. | +| `output_mode` | `Screen``File` | Specifies the target location for output generated from the output node\. | +| `output_format` | `Formatted` (\.*tab*) `Delimited` (\.*csv*) `HTML` (\.*html*) `Output` (\.*cou*) | Specifies the type of output\. | +| `full_filename` | *string* | | +| `output_view` | `Simple``Advanced` | Specifies whether the simple or advanced view is displayed in the output\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/da7407d415b3eff25ca3dd588bba677cc8cd3494.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/da7407d415b3eff25ca3dd588bba677cc8cd3494.md new file mode 100644 index 0000000..fcf0a42 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/da7407d415b3eff25ca3dd588bba677cc8cd3494.md @@ -0,0 +1,27 @@ +# Collaborator security + +# Collaborator security # + +IBM watsonx provides attribute\-based access control to protect workspaces such as projects and catalogs\. You control access to workspaces by assigning roles and by restricting collaborators\. + + + +Table 1\. Collaborator security mechanisms for IBM watsonx + +| Mechanism | Purpose | Responsibility | Configured on | +| ---------------------- | -------------------------------------------- | -------------- | ------------- | +| [Collaborator roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-collab.html?context=cdpaas&locale=en#collaborator-roles) | Assign roles to control access to workspaces | Customer | IBM watsonx | + + + +## Collaborator roles ## + +Everyone working in IBM watsonx is assigned a role that determines the workspaces that they can access and the tasks that they can perform\. Collaborator roles control access to projects, deployment spaces, and catalogs using permissions specific to the role\. Roles are assigned in IBM watsonx to provide **Admin**, **Editor**, or **Viewer** permissions\. + +Users also have an IAM Platform access role for the Cloud account and they may also have an IAM Service access role for workspaces\. To understand how the roles provide secure access, see [Roles in IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/roles.html)\. + +To understand the permissions for each collaborator role, see [Project collaborator roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborator-permissions.html)\. + +**Parent topic:**[Security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dac8a5e350d74e41c1738f4e2a02258fecf9d20d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dac8a5e350d74e41c1738f4e2a02258fecf9d20d.md new file mode 100644 index 0000000..a6359ba --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dac8a5e350d74e41c1738f4e2a02258fecf9d20d.md @@ -0,0 +1,25 @@ +# Managing data for model evaluations in watsonx.governance + +# Managing data for model evaluations in watsonx\.governance # + +To enable model evaluations in watsonx\.governance, you must prepare your data for logging to generate insights\. + +You must provide your model data to watsonx\.governance in a format that it supports to enable model evaluations\. watsonx\.governance processes your model transactions and logs the data in the watsonx\.governance data mart\. The data mart is the logging database that stores the data that is used for model evaluations\. The following sections describe the different types of data that watsonx\.governance logs for model evaluations: + +## Payload data ## + +Payload data contains the input and output transactions for your deployment\. To configure explainability and fairness and drift evaluations, watsonx\.governance must receive payload data from your model that it stores in a payload logging table\. The payload logging table contains the feature and prediction columns that exist in your training data and a prediction probability column that contains the model's confidence in the prediction that it provides\. The table also includes timestamp and ID columns to identify each scoring request that you send to watsonx\.governance as shown in the following example: + +![Python SDK sample output of payload logging table](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-ntbok.png) + +You must send scoring requests to provide watsonx\.governance with a log of your model transactions\. For more information, see [Managing payload data](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-payload-logging.html)\. + +## Feedback data ## + +Feedback data is labeled data that matches the structure of training data and includes known model outcomes that are compared to your model predictions to measure the accuracy of your model\. watsonx\.governance uses feedback data to enable you to configure quality evaluations\. You must upload feedback data regularly to watsonx\.governance to continuously measure the accuracy of your model predictions\. For more information, see [Managing feedback data](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-manage-feedback-data.html)\. + +## Learn more ## + +[Sending model transactions](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-send-model-transactions.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dad2ede59535330241f2febdf9bf99e21deb4393.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dad2ede59535330241f2febdf9bf99e21deb4393.md new file mode 100644 index 0000000..fd1a18e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dad2ede59535330241f2febdf9bf99e21deb4393.md @@ -0,0 +1,9 @@ +# Working with times and dates (SPSS Modeler) + +# Working with times and dates # + +Time and date formats may vary depending on your data source and locale\. The formats of date and time are specific to each flow and are set in the flow properties\. + +The following examples are commonly used functions for working with date/time fields\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dafb63017668c5dd34a07a1850ce9e9a37d0f525.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dafb63017668c5dd34a07a1850ce9e9a37d0f525.md new file mode 100644 index 0000000..c65a771 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dafb63017668c5dd34a07a1850ce9e9a37d0f525.md @@ -0,0 +1,40 @@ +# decisionlistnode properties + +# decisionlistnode properties # + +![Decision List node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/decisionlistnodeicon.png)The Decision List node identifies subgroups, or segments, that show a higher or lower likelihood of a given binary outcome relative to the overall population\. For example, you might look for customers who are unlikely to churn or are most likely to respond favorably to a campaign\. You can incorporate your business knowledge into the model by adding your own custom segments and previewing alternative models side by side to compare the results\. Decision List models consist of a list of rules in which each rule has a condition and an outcome\. Rules are applied in order, and the first rule that matches determines the outcome\. + + + +decisionlistnode properties + +Table 1\. decisionlistnode properties + +| `decisionlistnode` Properties | Values | Property description | +| --------------------------------- | --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `target` | *field* | Decision List models use a single target and one or more input fields\. A frequency field can also be specified\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `model_output_type` | `Model``InteractiveBuilder` | | +| `search_direction` | `Up``Down` | Relates to finding segments; where Up is the equivalent of High Probability, and Down is the equivalent of Low Probability\. | +| `target_value` | *string* | If not specified, will assume true value for flags\. | +| `max_rules` | *integer* | The maximum number of segments excluding the remainder\. | +| `min_group_size` | *integer* | Minimum segment size\. | +| `min_group_size_pct` | *number* | Minimum segment size as a percentage\. | +| `confidence_level` | *number* | Minimum threshold that an input field has to improve the likelihood of response (give lift), to make it worth adding to a segment definition\. | +| `max_segments_per_rule` | *integer* | | +| `mode` | `Simple``Expert` | | +| `bin_method` | `EqualWidth``EqualCount` | | +| `bin_count` | *number* | | +| `max_models_per_cycle` | *integer* | Search width for lists\. | +| `max_rules_per_cycle` | *integer* | Search width for segment rules\. | +| `segment_growth` | *number* | | +| `include_missing` | *flag* | | +| `final_results_only` | *flag* | | +| `reuse_fields` | *flag* | Allows attributes (input fields which appear in rules) to be re\-used\. | +| `max_alternatives` | *integer* | | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `adjusted_propensity_partition` | `Test``Validation` | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/db504727c8688251caab0c18e12bde9dc625ecd1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/db504727c8688251caab0c18e12bde9dc625ecd1.md new file mode 100644 index 0000000..5a9d99e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/db504727c8688251caab0c18e12bde9dc625ecd1.md @@ -0,0 +1,24 @@ +# applytcmnode properties + +# applytcmnode properties # + +You can use Temporal Causal Modeling (TCM) modeling nodes to generate a TCM model nugget\. The scripting name of this model nugget is *applytcmnode*\. For more information on scripting the modeling node itself, see [tcmnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/tcmnodeslots.html#tcmnodeslots)\. + + + +applytcmnode properties + +Table 1\. applytcmnode properties + +| `applytcmnode` Properties | Values | Property description | +| ------------------------- | --------- | -------------------- | +| `ext_future` | *boolean* | | +| `ext_future_num` | *integer* | | +| `noise_res` | *boolean* | | +| `conf_limits` | *boolean* | | +| `target_fields` | *list* | | +| `target_series` | *list* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dcb8fb91999d79190f3e5d54de32b1b7f1401779.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dcb8fb91999d79190f3e5d54de32b1b7f1401779.md new file mode 100644 index 0000000..589e864 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dcb8fb91999d79190f3e5d54de32b1b7f1401779.md @@ -0,0 +1,25 @@ +# distributionnode properties + +# distributionnode properties # + +![Distribution node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/distributionnodeicon.png)The Distribution node shows the occurrence of symbolic (categorical) values, such as mortgage type or gender\. Typically, you might use the Distribution node to show imbalances in the data, which you could then rectify using a Balance node before creating a model\. + + + +distributionnode properties + +Table 1\. distributionnode properties + +| `distributionnode` properties | Data type | Property description | +| ----------------------------- | ------------------------- | -------------------- | +| `plot` | `SelectedFields``Flags` | | +| `x_field` | *field* | | +| `color_field` | *field* | Overlay field\. | +| `normalize` | *flag* | | +| `sort_mode` | `ByOccurence``Alphabetic` | | +| `use_proportional_scale` | *flag* | | +| `use_grid` | *boolean* | Display gridlines\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dce29488a4d041b77f6e9b1b514f41335fae0696.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dce29488a4d041b77f6e9b1b514f41335fae0696.md new file mode 100644 index 0000000..2fc1d5b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dce29488a4d041b77f6e9b1b514f41335fae0696.md @@ -0,0 +1,157 @@ +# Syntax analysis + +# Syntax analysis # + +The Watson Natural Language Processing Syntax block encapsulates syntax analysis functionality\. + +**Block names** + + + + * `syntax_izumo__stock` + * `syntax_izumo__stock-dp` (Runtime 23\.1 only) + + + +**Supported languages** + +The Syntax analysis block is available for the following languages\. For a list of the language codes and the corresponding language, see [Language codes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html#lang-codes)\. + +Language codes to use for model `syntax_izumo__stock`: af, ar, bs, ca, cs, da, de, el, en, es, fi, fr, he, hi, hr, it, ja, ko, nb, nl, nn, pl, pt, ro, ru, sk, sr, sv, tr, zh\_cn, zh\_tw + +Language codes to use for model `syntax_izumo__stock-dp`: af, ar, bs, ca, cs, da, de, el, en, es, fi, fr, he, hi, hr, it, ja, ko, nb, nl, nn, pl, pt, ro, ru, sk, sr, sv, tr, zh + + + +List of the supported languages for each syntax task + +| Task | Supported language codes | +| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| Tokenization | af, ar, bs, ca, cs, da, de, el, en, es, fi, fr, he, hi, hr, it, ja, ko, nb, nl, nn, pl, pt, ro, ru, sk, sr, sv, tr, zh\_cn, zh\_tw, zh | +| Part\-of\-speech tagging | af, ar, bs, ca, cs, da, de, nl, nn, el, en, es, fi, fr, he, hi, hr, it, ja, ko, nb, pl, pt, ro, ru, sk, sr, sv, tr, zh\_cn, zh\_tw, zh | +| Lemmatization | af, ar, bs, ca, cs, da, de, el, en, es, fi, fr, he, hi, hr, it, ja, ko, nb, nl, nn, pl, pt, ro, ru, sk, sr, sv, tr, zh\_cn, zh\_tw, zh | +| Sentence detection | af, ar, bs, ca, cs, da, de, el, en, es, fi, fr, he, hi, hr, it, ja, ko, nb, nl, nn, pl, pt, ro, ru, sk, sr, sv, tr, zh\_cn, zh\_tw, zh | +| Paragraph detection | af, ar, bs, ca, cs, da, de, el, en, es, fi, fr, he, hi, hr, it, ja, ko, nb, nl, nn, pl, pt, ro, ru, sk, sr, sv, tr, zh\_cn, zh\_tw, zh | +| Dependency parsing | af, ar, bs, cs, da, de, en, es, fi, fr, hi, hr, it, ja, nb, nl, nn, pt, ro, ru, sk, sr, sv | + + + +**Capabilities** + +Use this block to perform tasks like sentence detection, tokenization, part\-of\-speech tagging, lemmatization and dependency parsing in different languages\. For most tasks, you will likely only need sentence detection, tokenization, and part\-of\-speech tagging\. For these use cases use the `syntax_model_xx_stock` model\. If you want to run dependency parsing in Runtime 23\.1, use the `syntax_model_xx_stock-dp` model\. In Runtime 22\.2, dependency parsing is included in the `syntax_model_xx_stock` model\. + +The analysis for Part\-of\-speech (POS) tagging and dependencies follows the Universal Parts of Speech tagset ([Universal POS tags](https://universaldependencies.org/u/pos/)) and the Universal Dependencies v2 tagset ([Universal Dependency Relations](https://universaldependencies.org/u/dep/))\. + +The following table shows you the capabilities of each task based on the same example and the outcome to the parse\. + + + +Capabilities of each syntax task based on an example + +| Capabilities | Examples | Parser attributes | +| ----------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ----------------- | +| Tokenization | I don't like Mondays" \-\-> "I" , "do", "n't", "like", "Mondays | token | +| Part\-Of\_Speech detection | "I don't like Mondays" \-\-> "I"\\POS\_PRON, "do"\\POS\_AUX, "n't"\\POS\_PART, "like"\\POS\_VERB, "Mondays"\\POS\_PROPN | part\_of\_speech | +| Lemmatization | I don't like Mondays" \-\-> "I", "do", "not", "like", "Monday | lemma | +| Dependency parsing | I don't like Mondays" \-\-> "I"\-SUBJECT\->"like"<\-OBJECT\-"Mondays | dependency | +| Sentence detection | "I don't like Mondays" \-\-> returns this sentence | sentence | +| Paragraph detection (Currently paragraph detection is still experimental and returns similar results to sentence detection\.) | "I don't like Mondays" \-\-> returns this sentence as being a paragraph | sentence | + + + +**Dependencies on other blocks** + +None + +**Code sample** + + import watson_nlp + + # Load Syntax for English + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + + # Detect tokens, lemma and part-of-speech + text = 'I don\'t like Mondays' + syntax_prediction = syntax_model.run(text, parsers=('token', 'lemma', 'part_of_speech')) + + # Print the syntax result + print(syntax_prediction) + +Output of the code sample: + + { + "text": "I don't like Mondays", + "producer_id": { + "name": "Izumo Text Processing", + "version": "0.0.1" + }, + "tokens": [ + { + "span": { + "begin": 0, + "end": 1, + "text": "I" + }, + "lemma": "I", + "part_of_speech": "POS_PRON" + }, + { + "span": { + "begin": 2, + "end": 4, + "text": "do" + }, + "lemma": "do", + "part_of_speech": "POS_AUX" + }, + { + "span": { + "begin": 4, + "end": 7, + "text": "n't" + }, + "lemma": "not", + "part_of_speech": "POS_PART" + }, + { + "span": { + "begin": 8, + "end": 12, + "text": "like" + }, + "lemma": "like", + "part_of_speech": "POS_VERB" + }, + { + "span": { + "begin": 13, + "end": 20, + "text": "Mondays" + }, + "lemma": "Monday", + "part_of_speech": "POS_PROPN" + } + ], + "sentences": [ + { + "span": { + "begin": 0, + "end": 20, + "text": "I don't like Mondays" + } + } + ], + "paragraphs": [ + { + "span": { + "begin": 0, + "end": 20, + "text": "I don't like Mondays" + } + } + ] + } + +**Parent topic:**[Watson Natural Language Processing task catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dce39ca6c888ca6d5cf3f9b9d18d06fd3bd2dfbe.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dce39ca6c888ca6d5cf3f9b9d18d06fd3bd2dfbe.md new file mode 100644 index 0000000..abcb3f8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dce39ca6c888ca6d5cf3f9b9d18d06fd3bd2dfbe.md @@ -0,0 +1,13 @@ +# K-Means-AS node (SPSS Modeler) + +# K\-Means\-AS node # + +K\-Means is one of the most commonly used clustering algorithms\. It clusters data points into a predefined number of clusters\. The K\-Means\-AS node in SPSS Modeler is implemented in Spark\. + +See [K\-Means Algorithms](https://spark.apache.org/docs/2.2.0/ml-clustering.html) for more details\.^1^ + +Note that the K\-Means\-AS node performs one\-hot encoding automatically for categorical variables\. + +^1^ "Clustering\." *Apache Spark*\. MLlib: Main Guide\. Web\. 3 Oct 2017\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dd88591c39c90f2cf211c3ee3330b7e7939c3472.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dd88591c39c90f2cf211c3ee3330b7e7939c3472.md new file mode 100644 index 0000000..30e2ac8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dd88591c39c90f2cf211c3ee3330b7e7939c3472.md @@ -0,0 +1,29 @@ +# {{ document.title.text }} + +# Decision bias # + +![icon for fairness risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-fairness.svg)Risks associated with outputFairnessNew + +### Description ### + +Decision bias occurs when one group is unfairly advantaged over another due to decisions of the model\. This bias can result from bias in the training data or as an unintended consequence of how the model was trained\. + +### Why is decision bias a concern for foundation models? ### + +Bias can harm persons affected by the decisions of the model\. Business entities could face fines, reputational harms, and other legal consequences\. + +Example + +#### Unfair health risk assignment for black patients #### + +A study on racial bias in health algorithms estimated that racial bias reduces the number of black patients identified for extra care by more than half\. The study found that bias occurred because the algorithm used health costs as a proxy for health needs\. Less money is spent on black patients who have the same level of need, and the algorithm thus falsely concludes that black patients are healthier than equally sick white patients\. + +Sources: + +[Science, October 2019](https://www.science.org/doi/10.1126/science.aax2342) + +[American Civil Liberties Union, 2022](https://www.aclu.org/news/privacy-technology/algorithms-in-health-care-may-worsen-medical-racism#:~:text=In%202019%2C%20a%20bombshell%20study,recommended%20for%20the%20same%20care) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de0c1913d6d770641762ed518fefe8fffc5a1f13.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de0c1913d6d770641762ed518fefe8fffc5a1f13.md new file mode 100644 index 0000000..a0ba79a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de0c1913d6d770641762ed518fefe8fffc5a1f13.md @@ -0,0 +1,21 @@ +# Logistic node (SPSS Modeler) + +# Logistic node # + +Logistic regression, also known as nominal regression, is a statistical technique for classifying records based on values of input fields\. It is analogous to linear regression but takes a categorical target field instead of a numeric one\. Both binomial models (for targets with two discrete categories) and multinomial models (for targets with more than two categories) are supported\. + +Logistic regression works by building a set of equations that relate the input field values to the probabilities associated with each of the output field categories\. After the model is generated, you can use it to estimate probabilities for new data\. For each record, a probability of membership is computed for each possible output category\. The target category with the highest probability is assigned as the predicted output value for that record\. + +Binomial example\. A telecommunications provider is concerned about the number of customers it is losing to competitors\. Using service usage data, you can create a binomial model to predict which customers are liable to transfer to another provider and customize offers so as to retain as many customers as possible\. A binomial model is used because the target has two distinct categories (likely to transfer or not)\. + +Note: For binomial models only, string fields are limited to eight characters\. If necessary, longer strings can be recoded using a Reclassify node or by using the Anonymize node\. + +Multinomial example\. A telecommunications provider has segmented its customer base by service usage patterns, categorizing the customers into four groups\. Using demographic data to predict group membership, you can create a multinomial model to classify prospective customers into groups and then customize offers for individual customers\. + +Requirements\. One or more input fields and exactly one categorical target field with two or more categories\. For a binomial model the target must have a measurement level of `Flag`\. For a multinomial model the target can have a measurement level of `Flag`, or of `Nominal` with two or more categories\. Fields set to `Both` or `None` are ignored\. Fields used in the model must have their types fully instantiated\. + +Strengths\. Logistic regression models are often quite accurate\. They can handle symbolic and numeric input fields\. They can give predicted probabilities for all target categories so that a second\-best guess can easily be identified\. Logistic models are most effective when group membership is a truly categorical field; if group membership is based on values of a continuous range field (for example, high IQ versus low IQ), you should consider using linear regression to take advantage of the richer information offered by the full range of values\. Logistic models can also perform automatic field selection, although other approaches such as tree models or Feature Selection might do this more quickly on large datasets\. Finally, since logistic models are well understood by many analysts and data miners, they may be used by some as a baseline against which other modeling techniques can be compared\. + +When processing large datasets, you can improve performance noticeably by disabling the likelihood\-ratio test, an advanced output option\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de359e77f61c11b6f759e8dfe8ea69aac3d0514a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de359e77f61c11b6f759e8dfe8ea69aac3d0514a.md new file mode 100644 index 0000000..6717380 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de359e77f61c11b6f759e8dfe8ea69aac3d0514a.md @@ -0,0 +1,6 @@ +# Parallel charts + +# Parallel charts # + +Parallel charts are useful for visualizing high dimensional geometry and for analyzing multivariate data\. Parallel charts resemble line charts for time\-series data, but the axes do not correspond to points in time (a natural order is not present)\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de60e212953766b4698982b3b631d1a25a019f2e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de60e212953766b4698982b3b631d1a25a019f2e.md new file mode 100644 index 0000000..a385029 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de60e212953766b4698982b3b631d1a25a019f2e.md @@ -0,0 +1,24 @@ +# Accessing project assets with ibm-watson-studio-lib + +# Accessing project assets with ibm\-watson\-studio\-lib # + +The `ibm-watson-studio-lib` library for Python and R contains a set of functions that help you to interact with IBM Watson Studio projects and project assets\. You can think of the library as a programmatical interface to a project\. Using the `ibm-watson-studio-lib` library, you can access project metadata and assets, including files and connections\. The library also contains functions that simplify fetching files associated with the project\. + +## Next steps ## + + + + * Start using `ibm-watson-studio-lib` in new notebooks: + + + + * [ibm-watson-studio-lib for Python](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html) + * [ibm-watson-studio-lib for R](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-r.html) + + + + + +**Parent topic:**[Loading and accessing data in a notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de6c4cb72844fc59fd80fc0b26acc8c94a3ba994.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de6c4cb72844fc59fd80fc0b26acc8c94a3ba994.md new file mode 100644 index 0000000..74d3220 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de6c4cb72844fc59fd80fc0b26acc8c94a3ba994.md @@ -0,0 +1,19 @@ +# Caching options for nodes (SPSS Modeler) + +# Caching options for nodes # + +To optimize the running of flows, you can set up a cache on any nonterminal node\. When you set up a cache on a node, the cache is filled with the data that passes through the node the next time you run the data flow\. From then on, the data is read from the cache (which is stored temporarily) rather than from the data source\. + +Caching is most useful following a time\-consuming operation such as a sort, merge, or aggregation\. For example, suppose that you have an import node set to read sales data from a database and an Aggregate node that summarizes sales by location\. You can set up a cache on the Aggregate node rather than on the import node because you want the cache to store the aggregated data rather than the entire data set\. Note: Caching at import nodes, which simply stores a copy of the original data as it is read into SPSS Modeler, won't improve performance in most circumstances\. + +Nodes with caching enabled are displayed with a special circle\-backslash icon\. When the data is cached at the node, the icon changes to a check mark\. + +Figure 1\. Node with empty cache vs\. node with full cache + +![Shows a node with an empty cache and a node with a full cache](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/cache_nodes.png) + +A circle\-backslash icon by node indicates that its cache is empty\. When the cache is full, the icon becomes a check mark\. If you want to replace the contents of the cache, you must first flush the cache and then re\-run the data flow to refill it\. + +In your flow, right\-click the node and select \. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de79f406db76b8d50a2b8ab35d4a385983aa5f54.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de79f406db76b8d50a2b8ab35d4a385983aa5f54.md new file mode 100644 index 0000000..7849ee7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de79f406db76b8d50a2b8ab35d4a385983aa5f54.md @@ -0,0 +1,52 @@ +# Project collaborator roles and permissions + +# Project collaborator roles and permissions # + +When you add a collaborator to a project, you specify which actions that the user can do by assigning a role\. + +These roles provide these permissions for projects: + + + +| Action | Viewer | Editor | Admin | +| --------------------------------------------------------------------------------- | ------ | ------ | ----- | +| View all information for data assets | ✓ | ✓ | ✓ | +| View jobs | ✓ | ✓ | ✓ | +| Add and read data assets | | ✓ | ✓ | +| View Data Refinery flows and SPSS Modeler flows | | ✓ | ✓ | +| View all other types of assets | ✓ | ✓ | ✓ | +| Create, add, modify, or delete all types of assets | | ✓ | ✓ | +| Submit inference requests to foundation models, including tuned foundation models | | ✓ | ✓ | +| Run and schedule assets that run in tools and jobs | | ✓ | ✓ | +| Create and modify data asset visualizations | ✓ | ✓ | ✓ | +| Save visualizations to your project | | ✓ | ✓ | +| Create and modify data asset profiles | | ✓ | ✓ | +| Share notebooks | | ✓ | ✓ | +| Promote assets to deployment spaces | | ✓ | ✓ | +| Edit the project readme | | ✓ | ✓ | +| Use project access tokens | | ✓ | ✓ | +| Manage environment templates | | ✓ | ✓ | +| Stop your own environment runtimes | | ✓ | ✓ | +| Export a project to desktop | | ✓ | ✓ | +| Manage project collaborators **\*** | | | ✓ | +| Set up integrations | | | ✓ | +| Manage associated services | | | ✓ | +| Manage project access tokens | | | ✓ | +| Mark project as sensitive | | | ✓ | + + + +**\*** To add collaborators or change collaborator roles, users with the **Admin** role in the project must also belong to the project creator's IBM Cloud account\. + +## Learn more ## + + + + * [Adding collaborators to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html) + * [Determine your roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/your-roles.html) + + + +**Parent topic:**[Administering projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/admin-project.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de9ce5d0599d0d181890911721738ba3dee01e34.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de9ce5d0599d0d181890911721738ba3dee01e34.md new file mode 100644 index 0000000..32c887d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/de9ce5d0599d0d181890911721738ba3dee01e34.md @@ -0,0 +1,35 @@ +# Payload logging in watsonx.governance + +# Payload logging in watsonx\.governance # + +You can enable payload logging in watsonx\.governance to configure model evaluations\. + +To [manage payload data](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-manage-payload-data.html) for configuring drift v2, generative AI quality, and model health evaluations, watsonx\.governance must log your payload data in the payload logging table\. + +Generative AI quality evaluations use payload data to generate results for the following task types when you evaluate prompt templates: + + + + * Text summarization + * Content generation + * Question answering + + + +Drift v2 and model health evaluations use payload data to generate results for the following task types when you evaluate prompt templates: + + + + * Text classification + * Text summarization + * Content generation + * Entity extraction + * Question answering + + + +You can log your payload data with the payload logging endpoint or by uploading a CSV file\. For more information, see [Sending model transactions](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-send-model-transactions.html) + +**Parent topic:**[Managing payload data in Watson OpenScale](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-manage-payload-data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/deb599f49c3e459a08e8bf25304b063b50caa294.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/deb599f49c3e459a08e8bf25304b063b50caa294.md new file mode 100644 index 0000000..5bd7ca9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/deb599f49c3e459a08e8bf25304b063b50caa294.md @@ -0,0 +1,70 @@ +# Deploying a Decision Optimization model by using the user interface + +# Deploying a Decision Optimization model by using the user interface # + +You can save a model for deployment in the Decision Optimization experiment UI and promote it to your Watson Machine Learning deployment space\. + +## Procedure ## + +To save your model for deployment: + + + +1. In the Decision Optimization experiment UI, either from the Scenario or from the Overview pane, click the menu icon ![Scenario menu icon](https://dataplatform.cloud.ibm.com/docs/content/DO/WML_Deployment/images/scenariomenu.jpg) for the scenario that you want to deploy, and select **Save for deployment** +2. Specify a name for your model and add a description, if needed, then click **Next**\. + + + + 1. Review the Input and Output schema and select the tables you want to include in the schema. + 2. Review the Run parameters and add, modify or delete any parameters as necessary. + 3. Review the Environment and Model files that are listed in the Review and save window. + 4. Click Save. + + + + The model is then available in the **Models** section of your project. + + + +To promote your model to your deployment space: + + + +3. View your model in the Models section of your project\.You can see a summary with input and output schema\. Click **Promote to deployment space**\. +4. In the Promote to space window that opens, check that the Target space field displays the name of your deployment space and click **Promote**\. +5. Click the link **deployment space** in the message that you receive that confirms successful promotion\. Your promoted model is displayed in the Assets tab of your **Deployment space**\. The information pane shows you the Type, Software specification, description and any defined tags such as the Python version used\. + + + +To create a new deployment: + + + +6. From the **Assets tab** of your deployment space, open your model and click **New Deployment**\. +7. In the Create a deployment window that opens, specify a name for your deployment and select a **Hardware specification**\.Click **Create** to create the deployment\. Your deployment window opens from which you can later create jobs\. + + + + + +## Creating and running Decision Optimization jobs ## + +You can create and run jobs to your deployed model\. + +### Procedure ### + + + +1. Return to your deployment space by using the navigation path and (if the data pane isn't already open) click the data icon to open the data pane\. Upload your input data tables, and solution and kpi output tables here\. (You must have output tables defined in your model to be able to see the solution and kpi values\.) +2. Open your deployment model, by selecting it in the Deployments tab of your deployment space and click **New job**\. +3. Define the details of your job by entering a name, and an optional description for your job and click **Next**\. +4. Configure your job by selecting a hardware specification and **Next**\.You can choose to schedule you job here, or leave the default schedule option off and click **Next**\. You can also optionally choose to turn on notifications or click Next\. +5. Choose the data that you want to use in your job by clicking Select the source for each of your input and output tables\. Click **Next**\. +6. You can now review and create your model by clicking **Create**\.When you receive a successful job creation message, you can then view it by opening it from your deployment space\. There you can see the run status of your job\. +7. Open the run for your job\.Your job log opens and you can also view and copy the payload information\. + + + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/decca51bacc7be33f484d36177b24c4bd0fe4cfd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/decca51bacc7be33f484d36177b24c4bd0fe4cfd.md new file mode 100644 index 0000000..58cc8f9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/decca51bacc7be33f484d36177b24c4bd0fe4cfd.md @@ -0,0 +1,19 @@ +# Decision Optimization input and output data + +# Input and output data # + +You can access the input and output data you defined in the experiment UI by using the following dictionaries\. + +The data that you imported in the **Prepare data view** in the experiment UI is accessible from the input dictionary\. You must define each table by using the syntax `inputs['tablename']`\. For example, here food is an entity that is defined from the table called `diet_food`: + + food = inputs['diet_food'] + +Similarly, to show tables in the Explore solution view of the experiment UI you must specify them using the syntax `outputs['tablename']`\. For example, + + outputs['solution'] = solution_df + +defines an output table that is called `solution`\. The entity `solution_df` in the Python model defines this table\. + +You can find this Diet example in the Model\_Builder folder of the [DO\-samples](https://github.com/IBMDecisionOptimization/DO-Samples)\. To import and run (solve) it in the experiment UI, see [Solving and analyzing a model: the diet problem](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Notebooks/solveModel.html#task_mtg_n3q_m1b)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dedc196b72e081228279b523ba3585aed93c2370.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dedc196b72e081228279b523ba3585aed93c2370.md new file mode 100644 index 0000000..8188790 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/dedc196b72e081228279b523ba3585aed93c2370.md @@ -0,0 +1,83 @@ +# Cloudera Impala connection + +# Cloudera Impala connection # + +To access your data in Cloudera Impala, create a connection asset for it\. + +Cloudera Impala provides SQL queries directly on your Apache Hadoop data stored in HDFS or HBase\. + +## Supported versions ## + +Cloudera Impala 1\.3\+ + +## Create a connection to Cloudera Impala ## + +To create the connection asset, you need these connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Username and password + * SSL certificate (if required by the database server) + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Cloudera Impala connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Cloudera Impala setup ## + +[Cloudera Impala installation](https://docs.cloudera.com/documentation/enterprise/5-14-x/topics/cm_ig_install_impala.html) + +## Restriction ## + +You can use this connection only for source data\. You cannot write to data or export data with this connection\. + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [Impala SQL Language Reference](https://docs.cloudera.com/documentation/enterprise/5-5-x/topics/impala_langref.html) for the correct syntax\. + +## Learn more ## + +[Cloudera Impala documentation](https://docs.cloudera.com/documentation/enterprise/5-5-x/topics/impala.html) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e008266c010adfef841c513ae7bcb91436f9ae9c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e008266c010adfef841c513ae7bcb91436f9ae9c.md new file mode 100644 index 0000000..8372a07 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e008266c010adfef841c513ae7bcb91436f9ae9c.md @@ -0,0 +1,27 @@ +# Frameworks and software specifications in Watson Machine Learning + +# Frameworks and software specifications in Watson Machine Learning # + +You can use popular tools, libraries, and frameworks to train and deploy your machine learning models and functions\. + +## Overview of software specifications ## + +Software specifications define the programming language and version that you use for a building a model or a function\. You can use software specifications to configure the software that is used for running your models and functions\. You can also define the software version to be used and include your own extensions\. For example, you can use conda \.yml files or custom libraries\. + +## Supported frameworks and software specifications ## + +You can use predefined tools, libraries, and frameworks to train and deploy your machine learning models and functions\. Examples of supported frameworks include Scikit\-learn, Tensorflow, and more\. + +For more information, see [Supported deployment frameworks and software specifications](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/pm_service_supported_frameworks.html)\. + +![Frameworks and software specifications for model delpoyments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/frameworks-software-specs.png) + +## Managing outdated frameworks and software specifications ## + +Update software specifications and frameworks in your models when they become outdated\. Sometimes, you can seamlessly update your assets\. In other cases, you must retrain or redeploy your assets\. + +For more information, see [Managing outdated software specifications or frameworks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-manage-outdated.html)\. + +**Parent topic:**[Deploying assets with Watson Machine Learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e01184bcba866d676b5a236d6638e78d3f55c794.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e01184bcba866d676b5a236d6638e78d3f55c794.md new file mode 100644 index 0000000..5ee012a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e01184bcba866d676b5a236d6638e78d3f55c794.md @@ -0,0 +1,37 @@ +# hdbscannode properties + +# hdbscannode properties # + +![HDBSCAN node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/pythonhdbscannodeicon.png)Hierarchical Density\-Based Spatial Clustering (HDBSCAN)© uses unsupervised learning to find clusters, or dense regions, of a data set\. The HDBSCAN node in SPSS Modeler exposes the core features and commonly used parameters of the HDBSCAN library\. The node is implemented in Python, and you can use it to cluster your dataset into distinct groups when you don't know what those groups are at first\. + + + +hdbscannode properties + +Table 1\. hdbscannode properties + +| `hdbscannode` properties | Data type | Property description | +| -------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| custom\_fields | *boolean* | This option tells the node to use field information specified here instead of that given in any upstream Type node(s)\. After selecting this option, specify the following fields as required\. | +| `inputs` | *field* | Input fields for clustering\. | +| `useHPO` | *boolean* | Specify `true` or `false` to enable or disable Hyper\-Parameter Optimization (HPO) based on Rbfopt, which automatically discovers the optimal combination of parameters so that the model will achieve the expected or lesser error rate on the samples\. Default is `false`\. | +| `min_cluster_size` | *integer* | The minimum size of clusters\. Specify an integer\. Default is `5`\. | +| `min_samples` | *integer* | The number of samples in a neighborhood for a point to be considered a core point\. Specify an integer\. If set to `0`, the `min_cluster_size` is used\. Default is `0`\. | +| `algorithm` | *string* | Specify which algorithm to use: `best`, `generic`, `prims_kdtree`, `prims_balltree`, `boruvka_kdtree`, or `boruvka_balltree`\. Default is `best`\. | +| `metric` | *string* | Specify which metric to use when calculating distance between instances in a feature array: `euclidean`, `cityblock`, `L1`, `L2`, `manhattan`, `braycurtis`, `canberra`, `chebyshev`, `correlation`, `minkowski`, or `sqeuclidean`\. Default is `euclidean`\. | +| `useStringLabel` | *boolean* | Specify `true` to use a string cluster label, or `false` to use a number cluster label\. Default is `false`\. | +| `stringLabelPrefix` | *string* | If the `useStringLabel` parameter is set to `true`, specify a value for the string label prefix\. Default prefix is `cluster`\. | +| `approx_min_span_tree` | *boolean* | Specify `true` to accept an approximate minimum spanning tree, or `false` if you are willing to sacrifice speed for correctness\. Default is `true`\. | +| `cluster_selection_method` | *string* | Specify the method to use for selecting clusters from the condensed tree: `eom` or `leaf`\. Default is `eom` (Excess of Mass algorithm)\. | +| `allow_single_cluster` | *boolean* | Specify `true` if you want to allow single cluster results\. Default is `false`\. | +| `p_value` | *double* | Specify the `p value` to use if you're using `minkowski` for the metric\. Default is `1.5`\. | +| `leaf_size` | *integer* | If using a space tree algorithm (`boruvka_kdtree`, or `boruvka_balltree`), specify the number of points in a leaf node of the tree\. Default is `40`\. | +| `outputValidity` | *boolean* | Specify `true` or `false` to control whether the Validity Index chart is included in the model output\. | +| `outputCondensed` | *boolean* | Specify `true` or `false` to control whether the Condensed Tree chart is included in the model output\. | +| `outputSingleLinkage` | *boolean* | Specify `true` or `false` to control whether the Single Linkage Tree chart is included in the model output\. | +| `outputMinSpan` | *boolean* | Specify `true` or `false` to control whether the Min Span Tree chart is included in the model output\. | +| `is_split` | | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e01c7d12e53747c7ed71d615d7e9dcd8f17638ed.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e01c7d12e53747c7ed71d615d7e9dcd8f17638ed.md new file mode 100644 index 0000000..bb8352b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e01c7d12e53747c7ed71d615d7e9dcd8f17638ed.md @@ -0,0 +1,43 @@ +# treeas properties + +# treeas properties # + +![Tree\-AS node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/treeASnodeicon.png)The Tree\-AS node is similar to the CHAID node; however, the Tree\-AS node is designed to process big data to create a single tree and displays the resulting model in the output viewer\. The node generates a decision tree by using chi\-square statistics (CHAID) to identify optimal splits\. This use of CHAID can generate nonbinary trees, meaning that some splits have more than two branches\. Target and input fields can be numeric range (continuous) or categorical\. Exhaustive CHAID is a modification of CHAID that does a more thorough job of examining all possible splits but takes longer to compute\. + + + +treeas properties + +Table 1\. treeas properties + +| `treeas` Properties | Values | Property description | +| ---------------------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `target` | *field* | In the Tree\-AS node, CHAID models require a single target and one or more input fields\. A frequency field can also be specified\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `method` | `chaid``exhaustive_chaid` | | +| `max_depth` | *integer* | Maximum tree depth, from 0 to 20\. The default value is 5\. | +| `num_bins` | *integer* | Only used if the data is made up of continuous inputs\. Set the number of equal frequency bins to be used for the inputs; options are: 2, 4, 5, 10, 20, 25, 50, or 100\. | +| `record_threshold` | *integer* | The number of records at which the model will switch from using p\-values to Effect sizes while building the tree\. The default is 1,000,000; increase or decrease this in increments of 10,000\. | +| `split_alpha` | *number* | Significance level for splitting\. The value must be between 0\.01 and 0\.99\. | +| `merge_alpha` | *number* | Significance level for merging\. The value must be between 0\.01 and 0\.99\. | +| `bonferroni_adjustment` | *flag* | Adjust significance values using Bonferroni method\. | +| `effect_size_threshold_cont` | *number* | Set the Effect size threshold when splitting nodes and merging categories when using a continuous target\. The value must be between 0\.01 and 0\.99\. | +| `effect_size_threshold_cat` | *number* | Set the Effect size threshold when splitting nodes and merging categories when using a categorical target\. The value must be between 0\.01 and 0\.99\. | +| `split_merged_categories` | *flag* | Allow resplitting of merged categories\. | +| `grouping_sig_level` | *number* | Used to determine how groups of nodes are formed or how unusual nodes are identified\. | +| `chi_square` | `pearson``likelihood_ratio` | Method used to calculate the chi\-square statistic: Pearson or Likelihood Ratio | +| `minimum_record_use` | `use_percentage``use_absolute` | | +| `min_parent_records_pc` | *number* | Default value is 2\. Minimum 1, maximum 100, in increments of 1\. Parent branch value must be higher than child branch\. | +| `min_child_records_pc` | *number* | Default value is 1\. Minimum 1, maximum 100, in increments of 1\. | +| `min_parent_records_abs` | *number* | Default value is 100\. Minimum 1, maximum 100, in increments of 1\. Parent branch value must be higher than child branch\. | +| `min_child_records_abs` | *number* | Default value is 50\. Minimum 1, maximum 100, in increments of 1\. | +| `epsilon` | *number* | Minimum change in expected cell frequencies\.\. | +| `max_iterations` | *number* | Maximum iterations for convergence\. | +| `use_costs` | *flag* | | +| `costs` | *structured* | Structured property\. The format is a list of 3 values: the actual value, the predicted value, and the cost if that prediction is wrong\. For example: `tree.setPropertyValue("costs", ["drugA", "drugB", 3.0], "drugX", "drugY", 4.0]])` | +| `default_cost_increase` | `none``linear``square``custom` | Only enabled for ordinal targets\. Set default values in the costs matrix\. | +| `calculate_conf` | *flag* | | +| `display_rule_id` | *flag* | Adds a field in the scoring output that indicates the ID for the terminal node to which each record is assigned\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e03dd29f683c4f22a7084c9ab8f1488c380170f0.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e03dd29f683c4f22a7084c9ab8f1488c380170f0.md new file mode 100644 index 0000000..f511e52 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e03dd29f683c4f22a7084c9ab8f1488c380170f0.md @@ -0,0 +1,86 @@ +# Apache Cassandra connection + +# Apache Cassandra connection # + +To access your data in Apache Cassandra, create a connection asset for it\. + +Apache Cassandra is an open source, distributed, NoSQL database\. + +## Supported versions ## + +Apache Cassandra 2\.0 or later + +## Create a connection to Apache Cassandra ## + +To create the connection asset, you need these connection details: + + + + * Hostname or IP address + * Port number + * Keyspace + * Username and password + * SSL certificate (if required by the database server) + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Apache Cassandra connections in the following workspaces and tools: + + + + * Data Refinery + * Decision Optimization + * Notebooks\. Click **Read data** on the **Code snippets** pane to get the connection credentials and load the data into a data structure\. See [Load data from data source connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html#conns)\. + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Apache Cassandra setup ## + + + + * [Installing Cassandra](https://cassandra.apache.org/doc/latest/getting_started/installing.html) + * [Configuring Cassandra](https://cassandra.apache.org/doc/latest/getting_started/configuring.html) + * [CREATE KEYSPACE](https://cassandra.apache.org/doc/latest/cql/ddl.html#create-keyspace) + + + +## Learn more ## + + + + * [cassandra\.apache\.org](https://cassandra.apache.org/) + * [Cassandra Documentation](https://cassandra.apache.org/doc/latest/architecture/overview.html) + + + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e0b0b51cd757048207eefe4ec8f1e98e967d9e69.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e0b0b51cd757048207eefe4ec8f1e98e967d9e69.md new file mode 100644 index 0000000..9cae8da --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e0b0b51cd757048207eefe4ec8f1e98e967d9e69.md @@ -0,0 +1,205 @@ +# SPSS predictive analytics data preparation algorithms in notebooks + +# SPSS predictive analytics data preparation algorithms in notebooks # + +Descriptives provides efficient computation of the univariate and bivariate statistics and automatic data preparation features on large scale data\. It can be used widely in data profiling, data exploration, and data preparation for subsequent modeling analyses\. + +The core statistical features include essential univariate and bivariate statistical summaries, univariate order statistics, metadata information creation from raw data, statistics for visualization of single fields and field pairs, data preparation features, and data interestingness score and data quality assessment\. It can efficiently support the functionality required for automated data processing, user interactivity, and obtaining data insights for single fields or the relationships between the pairs of fields inclusive with a specified target\. + +**Python example code:** + + from spss.ml.datapreparation.descriptives import Descriptives + + de = Descriptives(). \ + setInputFieldsList(["Field1", "Field2"]). \ + setTargetFieldList(["Field3"]). \ + setTrimBlanks("TRIM_BOTH") + + deModel = de.fit(df) + + PMML = deModel.toPMML() + statXML = deModel.statXML() + + predictions = deModel.transform(df) + predictions.show() + +## Descriptives Selection Strategy ## + +When the number of field pairs is too large (for example, larger than the default of 1000), SelectionStrategy is used to limit the number of pairs for which bivariate statistics will be computed\. The strategy involves 2 steps: + + + +1. Limit the number of pairs based on the univariate statistics\. +2. Limit the number of pairs based on the core association bivariate statistics\. + + + +Notice that the pair will always be included under the following conditions: + + + +1. The pair consists of a predictor field and a target field\. +2. The pair of predictors or targets is enforced\. + + + +## Smart Data Preprocessing ## + +The Smart Data Preprocessing (SDP) engine is an analytic component for data preparation\. It consists of three separate modules: relevance analysis, relevance and redundancy analysis, and smart metadata (SMD) integration\. + +Given the data with regular fields, list fields, and map fields, relevance analysis evaluates the associations of input fields with targets, and selects a specified number of fields for subsequent analysis\. Meanwhile, it expands list fields and map fields, and extracts the selected fields into regular column\-based format\. + +Due to the efficiency of relevance analysis, it's also used to reduce the large number of fields in wide data to a moderate level where traditional analytics can work\. + +SmartDataPreprocessingRelevanceAnalysis exports these outputs: + + + + * JSON file, containing model information + * new column\-based data + * the related data model + + + +**Python example code:** + + from spss.ml.datapreparation.smartdatapreprocessing import SmartDataPreprocessingRelevanceAnalysis + + sdpRA = SmartDataPreprocessingRelevanceAnalysis(). \ + setInputFieldList(["holderage", "vehicleage", "claimamt"]). \ + setTargetFieldList(["vehiclegroup", "nclaims"]). \ + setMaxNumTarget(3). \ + setInvalidPairsThresEnabled(True). \ + setRMSSEThresEnabled(True). \ + setAbsVariCoefThresEnabled(True). \ + setInvalidPairsThreshold(0.7). \ + setRMSSEThreshold(0.7). \ + setAbsVariCoefThreshold(0.05). \ + setMaxNumSelFields(2). \ + setConCatRatio(0.3). \ + setFilterSelFields(True) + + predictions = sdpRA.transform(data) + predictions.show() + +## Sparse Data Convertor ## + +Sparse Data Convertor (SDC) converts regular data fields into list fields\. You just need to specify the fields that you want to convert into list fields, then SDC will merge the fields according to their measurement level\. It will generate, at most, three kinds of list fields: continuous list field, categorical list field, and map field\. + +**Python example code:** + + from spss.ml.datapreparation.sparsedataconverter import SparseDataConverter + + sdc = SparseDataConverter(). \ + setInputFieldList(["Age", "Sex", "Marriage", "BP", "Cholesterol", "Na", "K", "Drug"]) + predictions = sdc.transform(data) + predictions.show() + +## Binning ## + +You can use this function to derive one or more new binned fields or to obtain the bin definitions used to determine the bin values\. + +**Python example code:** + + from spss.ml.datapreparation.binning.binning import Binning + + binDefinition = BinDefinitions(1, False, True, True, [CutPoint(50.0, False)]) + binField = BinRequest("integer_field", "integer_bin", binDefinition, None) + + params = [binField] + bining = Binning().setBinRequestsParam(params) + + outputDF = bining.transform(inputDF) + +## Hex Binning ## + +You can use this function to calculate and assign hexagonal bins to two fields\. + +**Python example code:** + + from spss.ml.datapreparation.binning.hexbinning import HexBinning + from spss.ml.param.binningsettings import HexBinningSetting + + params = [HexBinningSetting("field1_out", "field1", 5, -1.0, 25.0, 5.0), + HexBinningSetting("field2_out", "field2", 5, -1.0, 25.0, 5.0)] + + hexBinning = HexBinning().setHexBinRequestsParam(params) + outputDF = hexBinning.transform(inputDF) + +## Complex Sampling ## + +The complexSampling function selects a pseudo\-random sample of records from a data source\. + +The complexSampling function performs stratified sampling of incoming data using simple exact sampling and simple proportional sampling\. The stratifying fields are specified as input and the sampling counts or sampling ratio for each of the strata to be sampled must also be provided\. Optionally, the record counts for each strata may be provided to improve performance\. + +**Python example code:** + + from spss.ml.datapreparation.sampling.complexsampling import ComplexSampling + from spss.ml.datapreparation.params.sampling import RealStrata, Strata, Stratification + + transformer = ComplexSampling(). \ + setRandomSeed(123444). \ + setRepeatable(True). \ + setStratification(Stratification(["real_field"], [ + Strata(key=RealStrata(11.1)], samplingCount=25), + Strata(key=RealStrata(2.4)], samplingCount=40), + Strata(key=RealStrata(12.9)], samplingRatio=0.5)])). \ + setFrequencyField("frequency_field") + + sampled = transformer.transform(unionDF) + +## Count and Sample ## + +The countAndSample function produces a pseudo\-random sample having a size approximately equal to the \\'samplingCount\\' input\. + +The sampling is accomplished by calling the SamplingComponent with a sampling ratio that's computed as \\'samplingCount / totalRecords\\' where \\'totalRecords\\' is the record count of the incoming data\. + +**Python example code:** + + from spss.ml.datapreparation.sampling.countandsample import CountAndSample + + transformer = CountAndSample().setSamplingCount(20000).setRandomSeed(123) + sampled = transformer.transform(unionDF) + +## MR Sampling ## + +The mrsampling function selects a pseudo\-random sample of records from a data source at a specified sampling ratio\. The size of the sample will be approximately the specified proportion of the total number of records subject to an optional maximum\. The set of records and their total number will vary with random seed\. Every record in the data source has the same probability of being selected\. + +**Python example code:** + + from spss.ml.datapreparation.sampling.mrsampling import MRSampling + + transformer = MRSampling().setSamplingRatio(0.5).setRandomSeed(123).setDiscard(True) + sampled = transformer.transform(unionDF) + +## Sampling Model ## + +The samplingModel function selects a pseudo\-random percentage of the subsequence of input records defined by every Nth record for a given step size N\. The total sample size may be optionally limited by a maximum\. + +When the step size is 1, the subsequence is the entire sequence of input records\. When the sampling ratio is 1\.0, selection becomes deterministic, not pseudo\-random\. + +Note that with distributed data, the samplingModel function applies the selection criteria independently to each data split\. The maximum sample size, if any, applies independently to each split and not to the entire data source; the subsequence is started fresh at the start of each split\. + +**Python example code:** + + from spss.ml.datapreparation.sampling.samplingcomponent import SamplingModel + + transformer = SamplingModel().setSamplingRatio(1.0).setSamplingStep(2).setRandomSeed(123).setDiscard(False) + sampled = transformer.transform(unionDF) + +## Sequential Sampling ## + +The sequentialSampling function is similar to the samplingModel function\. It also selects a pseudo\-random percentage of the subsequence of input records defined by every Nth record for a given step size N\. The total sample size may be optionally limited by a maximum\. + +When the step size is 1, the subsequence is the entire sequence of input records\. When the sampling ratio is 1\.0, selection becomes deterministic, not pseudo\-random\. The main difference between sequentialSampling and samplingModel is that with distributed data, the sequentialSampling function applies the selection criteria to the entire data source, while the samplingModel function applies the selection criteria independently to each data split\. + +**Python example code:** + + from spss.ml.datapreparation.sampling.samplingcomponent import SequentialSampling + + transformer = SequentialSampling().setSamplingRatio(1.0).setSamplingStep(2).setRandomSeed(123).setDiscard(False) + sampled = transformer.transform(unionDF) + +**Parent topic:**[SPSS predictive analytics algorithms](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spss-algorithms.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e0d36a6f5028fc5ed005e87faf9f65f976e62a37.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e0d36a6f5028fc5ed005e87faf9f65f976e62a37.md new file mode 100644 index 0000000..6c15009 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e0d36a6f5028fc5ed005e87faf9f65f976e62a37.md @@ -0,0 +1,94 @@ +# Set up your system + +# Set up your system # + +Before you can use IBM Federated Learning, ensure that you have the required hardware, software, and dependencies\. + +## Core requirements by role ## + +Each entity that participates in a Federated Learning experiment must meet the requirements for their role\. + +### Admin software requirements ### + +Designate an admin for the Federated Learning experiment\. The admin must have: + + + + * Access to the platform with Watson Studio and Watson Machine Learning enabled\. + You must [create a Watson Machine Learning service instance](https://cloud.ibm.com/catalog/services/machine-learning). + * A [project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html) for assembling the global model\. You must [associate the Watson Machine Learning service instance with your project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assoc-services.html)\. + + + +### Party hardware and software requirements ### + +Each party must have a system that meets these minimum requirements\. + +Note: Remote parties participating in the same Federated Learning experiment can use different hardware specs and architectures, as long as they each meet the minimum requirement\. + +#### Supported architectures #### + + + + * x86 64\-bit + * PPC + * Mac M\-series + * 4 GB memory or greater + + + +#### Supported environments #### + + + + * Linux + * Mac OS/Unix + * Windows + + + +#### Software dependencies #### + + + + * A supported [Python version and a machine learning framework](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-frames.html)\. + * The Watson Machine Learning Python client\. + + + + 1. If you are using Linux, run `pip install 'ibm-watson-machine-learning[fl-rt22.2-py3.10]'`. + 2. If you are using Mac OS with M-series CPU and Conda, download the installation script and then run `./install_fl_rt22.2_macos.sh `. + + + + + +## Network requirements ## + +An outbound connection from the remote party to aggregator is required\. Parties can use firewalls that restrict internal connections with each other\. + +## Data sources requirements ## + +Data must comply with these requirements\. + + + + * Data must be in a directory or storage repository that is accessible to the party that uses them\. + * Each data source for a federate model must have the same features\. IBM Federated Learning supports horizontal federated learning only\. + * Data must be in a readable format, but the formats can vary by data source\. Suggested formats include: + + + + * Hive + * Excel + * CSV + * XML + * Database + + + + + +**Parent topic:**[Creating a Federated Learning experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-start.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e0e5646ea00a170bb595e9e0bbccb69f702ffc7c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e0e5646ea00a170bb595e9e0bbccb69f702ffc7c.md new file mode 100644 index 0000000..8fc823e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e0e5646ea00a170bb595e9e0bbccb69f702ffc7c.md @@ -0,0 +1,49 @@ +# Analyzing data and working with models + +# Analyzing data and working with models # + +You can analyze data and build or work with models in projects\. The methods that you choose for preparing data or working models help you determine which tools best fit your needs\. + +Each tool has a specific, primary task\. Some tools have capabilities for multiple types of tasks\. + +You can choose a tool based on how much automation you want: + + + + * Code editor tools: Use to write code in Python or R, all also with Spark\. + * Graphical builder tools: Use menus and drag\-and\-drop functionality on a builder to visually program\. + * Automated builder tools: Use to configure automated tasks that require limited user input\. + + + + + +Tool to tasks + +| Tool | Primary task | Tool type | Work with data | Work with models | +| ---------------------------- | --------------------------------------------------------------------- | ------------------------------ | -------------- | ---------------- | +| [Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) | Prepare and visualize data | Graphical builder | ✓ | | +| [Visualizations](https://dataplatform.cloud.ibm.com/docs/content/dataview/idh_idc_cg_help_main.html) | Build graphs to visualize data | Graphical builder | ✓ | | +| [Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) | Experiment with foundation models and prompts | Graphical builder | | ✓ | +| [Tuning Studio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-studio.html) | Tune a foundation model to return output in a certain style or format | Graphical builder | ✓ | ✓ | +| [Jupyter notebook editor](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-editor.html) | Work with data and models in Python or R notebooks | Code editor | ✓ | ✓ | +| [Federated learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fed-lea.html) | Train models on distributed data | Code editor | | ✓ | +| [RStudio IDE](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-overview.html) | Work with data and models in R | Code editor | ✓ | ✓ | +| [SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsd/spss-modeler.html) | Build models as a visual flow | Graphical builder | ✓ | ✓ | +| [Decision Optimization](https://dataplatform.cloud.ibm.com/docs/content/DO/DOWS-Cloud_home.html) | Solve optimization problems | Graphical builder, code editor | ✓ | ✓ | +| [AutoAI tool](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) | Build machine learning models automatically | Automated builder | ✓ | ✓ | +| [Pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-overview.html) | Automate model lifecycle | Graphical builder | ✓ | ✓ | +| [Synthetic Data Generator](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/synthetic_data_overview_sd.html) | Generate synthetic tabular data | Graphical builder | ✓ | ✓ | + + + +## Learn more ## + + + + * [Foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-overview.html) + * [Notebooks and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebooks-and-scripts.html) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e0f6fbca52d2ee44ac2e0795fa11fb53e3054c47.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e0f6fbca52d2ee44ac2e0795fa11fb53e3054c47.md new file mode 100644 index 0000000..983943d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e0f6fbca52d2ee44ac2e0795fa11fb53e3054c47.md @@ -0,0 +1,18 @@ +# Geospatial measurement sublevels (SPSS Modeler) + +# Geospatial measurement sublevels # + +The Geospatial measurement level, which is used with the List storage type, has six sublevels that are used to identify different types of geospatial data\. + + + + * Point\. Identifies a specific location (for example, the center of a city)\. + * Polygon\. A series of points that identifies the single boundary of a region and its location (for example, a county)\. + * LineString\. Also referred to as a Polyline or just a Line, a LineString is a series of points that identifies the route of a line\. For example, a LineString might be a fixed item, such as a road, river, or railway; or the track of something that moves, such as an aircraft's flight path or a ship's voyage\. + * MultiPoint\. Used when each row in your data contains multiple points per region\. For example, if each row represents a city street, the multiple points for each street can be used to identify every street lamp\. + * MultiPolygon\. Used when each row in your data contains several polygons\. For example, if each row represents the outline of a country, the US can be recorded as several polygons to identify the different areas such as the mainland, Alaska, and Hawaii\. + * MultiLineString\. Used when each row in your data contains several lines\. Because lines cannot branch, you can use a MultiLineString to identify a group of lines (for example, data such as the navigable waterways or the railway network in each country)\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e1074d5c232cb13e3cd1fb6e832753626d2fe30e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e1074d5c232cb13e3cd1fb6e832753626d2fe30e.md new file mode 100644 index 0000000..183bc51 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e1074d5c232cb13e3cd1fb6e832753626d2fe30e.md @@ -0,0 +1,40 @@ +# Language detection + +# Language detection # + +The Watson Natural Language Processing Language Detection identifies the language of input text\. + +**Block name**`lang-detect_izumo_multi_stock` + +**Supported languages** + +The Language Detection block is able to detect the following languages: + +af, ar, bs, ca, cs, da, de, el, en, es, fi, fr, he, hi, hr, it, ja, ko, nb, nl, nn, pl, pt, ro, ru, sk, sr, sv, tr, zh\_cn, zh\_tw + +**Capabilities** + +Use this block to detect the language of an input text\. + +**Dependencies on other blocks** + +None + +**Code sample** + + # Load the language detection model + lang_detection_model = watson_nlp.load('lang-detect_izumo_multi_stock') + + # Run it on input text + detected_lang = lang_detection_model.run('IBM announced new advances in quantum computing') + + # Retrieve language ISO code + print(detected_lang.to_iso_format()) + +Output of the code sample: + + EN + +**Parent topic:**[Watson Natural Language Processing task catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-block-catalog.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e10cebbd89f23e057645097b776a51dea0c1555f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e10cebbd89f23e057645097b776a51dea0c1555f.md new file mode 100644 index 0000000..2ed428f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e10cebbd89f23e057645097b776a51dea0c1555f.md @@ -0,0 +1,20 @@ +# applyrandomtrees properties + +# applyrandomtrees properties # + +You can use the Random Trees modeling node to generate a Random Trees model nugget\. The scripting name of this model nugget is *applyrandomtrees*\. For more information on scripting the modeling node itself, see [randomtrees properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/rf_nodeslots.html#rf_nodeslots)\. + + + +applyrandomtrees properties + +Table 1\. applyrandomtrees properties + +| `applyrandomtrees` Properties | Values | Property description | +| ----------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `calculate_conf` | *flag* | This property includes confidence calculations in the generated tree\. | +| `enable_sql_generation` | `false`
`native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e1232c341b3f590c23e9e81ddd157bc99ff77191.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e1232c341b3f590c23e9e81ddd157bc99ff77191.md new file mode 100644 index 0000000..db0635d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e1232c341b3f590c23e9e81ddd157bc99ff77191.md @@ -0,0 +1,14 @@ +# Supported data sources (SPSS Modeler) + +# Supported data sources for SPSS Modeler # + +In SPSS Modeler, you can connect to your data no matter where it lives\. + + + + * [Connectors](https://dataplatform.cloud.ibm.com/docs/content/wsd/spss-connections.html?context=cdpaas&locale=en#sql_overview__ibm-data-src-spss) + * [Data files](https://dataplatform.cloud.ibm.com/docs/content/wsd/spss-connections.html?context=cdpaas&locale=en#sql_overview__file-types-spss) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e14741f9a90592b67437aaed4b7042cd3dc268a8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e14741f9a90592b67437aaed4b7042cd3dc268a8.md new file mode 100644 index 0000000..bfe7ff4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e14741f9a90592b67437aaed4b7042cd3dc268a8.md @@ -0,0 +1,9 @@ +# Extension model nugget (SPSS Modeler) + +# Extension model nugget # + +The Extension model nugget is generated and placed on your flow canvas after running the Extension Model node, which contains your R script or Python for Spark script that defines the model building and model scoring\. + +By default, the Extension model nugget contains the script that's used for model scoring, options for reading the data, and any output from the R console or Python for Spark\. Optionally, the Extension model nugget can also contain various other forms of model output, such as graphs and text output\. After the Extension model nugget is generated and added to your flow canvas, an output node can be connected to it\. The output node is then used in the usual way within your flow to obtain information about the data and models, and for exporting data in various formats\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e14c56a78f56157e862de99906254b291f5b3321.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e14c56a78f56157e862de99906254b291f5b3321.md new file mode 100644 index 0000000..7bc8f3f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e14c56a78f56157e862de99906254b291f5b3321.md @@ -0,0 +1,184 @@ +# Quick start: Build and deploy a machine learning model with AutoAI + +# Quick start: Build and deploy a machine learning model with AutoAI # + +You can automate the process of building a machine learning model with the AutoAI tool\. Read about the AutoAI tool, then watch a video and take a tutorial that’s suitable for beginners and does not require coding\. + +Your basic workflow includes these tasks: + + + +1. Open your sandbox project\. Projects are where you can collaborate with others to work with data\. +2. Add your data to the project\. You can add CSV files or data from a remote data source through a connection\. +3. Create an AutoAI experiment in the project\. +4. Review the model pipelines and save the desired pipeline as a model to deploy or as a notebook to customize\. +5. Deploy and test your model\. + + + +## Read about AutoAI ## + +The AutoAI graphical tool automatically analyzes your data and generates candidate model pipelines customized for your predictive modeling problem\. These model pipelines are created iteratively as AutoAI analyzes your dataset and discovers data transformations, algorithms, and parameter settings that work best for your problem setting\. Results are displayed on a leaderboard, showing the automatically generated model pipelines ranked according to your problem optimization objective\. + +[Read more about AutoAI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) + +[Learn about other ways to build models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-science.html) + +## Watch a video about creating a model using AutoAI ## + +![Watch Video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) Watch this video to see how to create and run an AutoAI experiment based on the bank marketing sample\. + +Note: This video shows tasks 2\-5 of this tutorial\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Try a tutorial to create a model using AutoAI ## + +This tutorial guides you through training a model to predict if a customer is likely subscribe to a term deposit based on a marketing campaign\. + +In this tutorial, you will complete these tasks: + + + + * [Task 1: Open a project\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html?context=cdpaas&locale=en#step01) + * [Task 2: Build and train the model\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html?context=cdpaas&locale=en#step02) + * [Task 3: Promote the model to a deployment space and deploy the trained model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html?context=cdpaas&locale=en#step03) + * [Task 4: Test the deployed model\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html?context=cdpaas&locale=en#step04) + * [Task 5: Create a batch job to score the model\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html?context=cdpaas&locale=en#step05) + + + +This tutorial will take approximately 30 minutes to complete\. + +### Sample data ### + +The sample data that is used in the guided experience is UCI: Bank marketing data used to predict whether a customer enrolls in a marketing promotion\. + +![Spreadsheet of the Bank marketing data set](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_bank_sample_description.png) + +Expand all sections + + + + * Tips for completing this tutorial + + \#\#\# Use the video picture-in-picture Tip: Start the video, then as you scroll through the tutorial, the video moves to picture-in-picture mode. Close the video table of contents for the best experience with picture-in-picture. You can use picture-in-picture mode so you can follow the video as you complete the tasks in this tutorial. Click the timestamps for each task to follow along.The following animated image shows how to use the video picture-in-picture and table of contents features: ![How to use picture-in-picture and chapters](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/pip-and-chapters.gif)\{: width="560px" height="315px" data-tearsheet="this"\} \#\#\# Get help in the community If you need help with this tutorial, you can ask a question or find an answer in the [Cloud Pak for Data Community discussion forum](https://community.ibm.com/community/user/cloudpakfordata/communities/community-home/digestviewer?communitykey=c0c16ff2-10ef-4b50-ae4c-57d769937235)\{: new\_window\}. \#\#\# Set up your browser windows For the optimal experience completing this tutorial, open Cloud Pak for Data in one browser window, and keep this tutorial page open in another browser window to switch easily between the two applications. Consider arranging the two browser windows side-by-side to make it easier to follow along. ![Side-by-side tutorial and UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/tutorial-side-by-side.png)\{: width="560px" height="315px" data-tearsheet="this"\} Tip: If you encounter a guided tour while completing this tutorial in the user interface, click **Maybe later**. + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 1: Open a project + + You need a project to store the data and the AutoAI experiment. You can use your sandbox project or create a project. 1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg)\{: iih\}, choose **Projects > View all projects** 1. Open your sandbox project. If you want to use a new project: 1. Click **New project**. 1. Select **Create an empty project**. 1. Enter a name and optional description for the project. 1. Choose an existing [object storage service instance](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/storage-options.html)\{: new\_window\} or create a new one. 1. Click **Create**. 1. When the project opens, click the **Manage** tab and select the **Services and integrations** page. 1. On the *IBM services* tab, click **Associate service**. 1. Select your Watson Machine Learning instance. If you don't have a Watson Machine Learning service instance provisioned yet, follow these steps: 1. Click **New service**. 1. Select **Watson Machine Learning**. 1. Click **Create**. 1. Select the new service instance from the list. 1. Click **Associate service**. 1. If necessary, click **Cancel** to return to the *Services & Integrations* page. For more information or to watch a video, see [Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html)\{: new\_window\}. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the new project. + + ![The following image shows the new project.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/autoai-new-project.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 2: Build and train the model + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:08. Now that you have a project, you are ready to build and train the model using AutoAI. Follow these steps to create the AutoAI experiment, review the model pipelines, and select a pipeline to save as a model: 1. Click the **Assets** tab in your project, and then click **New asset > Build machine learning models automatically**. 1. On the *Build machine learning models automatically* page, complete the basic fields: 1. Click the **Samples** panel. 1. Select **Bank marketing sample data**, and click **Next**. The project name and description will be filled in for you. 1. Confirm that the Machine Learning service instance that you associated with your project is selected in the *Watson Machine Learning Service Instance* field. 1. Click **Create**. 1. In this sample AutoAI experiment, you will see that the *Bank marketing sample data* is already selected for your experiment. ![Choose a prediction column](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_bank_sample_predict_label.png)\{: biw\} 1. Review the preset experiment settings. Based on the data set and the selected column to predict, AutoAI analyzes a subset of the data and chooses a prediction type and metric to optimize. In this case, the prediction type is *Binary Classification*, the positive class is *Yes*, and the optimized metric is *ROC AUC & run time*. 1. Click **Run experiment**. As the model trains, you see an infographic that shows the process of building the pipelines. + ![Build model pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_bank_sample_pipeline_build2.png)\{: biw\} For a list of algorithms, or estimators, available with each machine learning technique in AutoAI, see: [AutoAI implementation detail](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html). 1. After the experiment run is complete, you can view and compare the ranked pipelines in a leaderboard. ![Pipeline leaderboard](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_bank_sample_leaderboard2.png)\{: biw\} 1. You can click **Pipeline comparison** to see how they differ. ![Pipeline comparison metric chart](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_bank_sample_metric.png)\{: biw\} 1. Click the highest ranked pipeline to see the pipeline details. 1. Click **Save as**, select **Model**, and click **Create**. This saves the pipeline as a model in your project. 1. When the model is saved, click the **View in project** link in the notification to view the model in your project. Alternatively, you can navigate to the **Assets** tab in the project, and click the model name in the *Models* section. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the model. + + ![The following image shows the model.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/autoai-model.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 3: Promote the model to a deployment space and deploy the trained model + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 04:57. Before you can deploy the model, you need to promote the model to a deployment space. Follow these steps to promote the model to a deployment space to deploy the model: 1. Click **Promote to deployment space**. 1. Choose an existing deployment space. If you don't have a deployment space: 1. Click **Create a new deployment space**. 1. Provide a space name and optional description. 1. Select a storage service. 1. Select a machine learning service. 1. Click **Create**. 1. Click **Close**. 1. Select your new deployment space from the list. 1. Select the **Go to the model in the space after promoting it** option. 1. Click **Promote**. Note: If you didn't select the option to go to the model in the space after promoting it, you can use the navigation menu to navigate to **Deployments** to select your deployment space and model.1. With the model open, click **New deployment**. 1. Select **Online** as the *Deployment type*. 1. Specify a name for the deployment. 1. Click **Create**. 1. When the deployment is complete, click the deployment name to view the deployment details page. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the new deployment. + + ![The following image shows the new deployment.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/autoai-deployment.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 4: Test the deployed model + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 06:22. Now that you have the model deployed, you can test that that online deployment using the user interface or through the Watson Machine Learning APIs. Follow these steps to use the user interface to test the model with new data: 1. Click the **Test** tab. You can test the deployed model from the deployment details page in two ways: test with a form or test with JSON code. 1. Click the **JSON input** tab, copy the following test data, and paste it to replace the existing JSON text: `json { "input_data": [ { "fields": "age", "job", "marital", "education", "default", "balance", "housing", "loan", "contact", "day", "month", "duration", "campaign", "pdays", "previous", "poutcome" ], "values": 27, "unemployed", "married", "primary", "no", 1787, "no", "no", "cellular", 19, "oct", 79, 1, -1, 0, "unknown" ] ] } ] }` 1. Click **Predict** to predict whether a customer with the specified attributes is likely to sign up for a particular kind of account. The resulting prediction indicates that this customer has a high probability of not enrolling in the marketing promotion. 1. Click the **X** to close the *Prediction results* window. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the results of testing the deployment. The values for your prediction might differ from the values in the following image. + + ![The following image shows the results of testing the deployment.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/autoai-deployment-test.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 5: Create a batch job to score the model + + Now that you have tested the deployed model with a single prediction, you can create a batch deployment to score multiple records at the same time. \#\#\# Task 5a: Set up batch deployment ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 07:00. For a batch deployment, you provide input data, also known as the model payload, in a CSV file. The data must be structured like the training data, with the same column headers. The batch job processes each row of data and creates a corresponding prediction. Follow these steps to upload the payload data to the deployment space: 1. Copy and paste the following text into a text editor, and save the file as `bank-payload.csv`. `txt age,job,marital,education,default,balance,housing,loan,contact,day,month,duration,campaign,pdays,previous,poutcome 30,unemployed,married,primary,no,1787,no,no,cellular,19,oct,79,1,-1,0,unknown 33,services,married,secondary,no,4789,yes,yes,cellular,11,may,220,1,339,4,failure 35,management,single,tertiary,no,1350,yes,no,cellular,16,apr,185,1,330,1,failure 30,management,married,tertiary,no,1476,yes,yes,unknown,3,jun,199,4,-1,0,unknown 59,blue-collar,married,secondary,no,0,yes,no,unknown,5,may,226,1,-1,0,unknown 35,management,single,tertiary,no,747,no,no,cellular,23,feb,141,2,176,3,failure 36,self-employed,married,tertiary,no,307,yes,no,cellular,14,may,341,1,330,2,other 39,technician,married,secondary,no,147,yes,no,cellular,6,may,151,2,-1,0,unknown 41,entrepreneur,married,tertiary,no,221,yes,no,unknown,14,may,57,2,-1,0,unknown 43,services,married,primary,no,-88,yes,yes,cellular,17,apr,313,1,147,2,failure 39,services,married,secondary,no,9374,yes,no,unknown,20,may,273,1,-1,0,unknown 43,admin.,married,secondary,no,264,yes,no,cellular,17,apr,113,2,-1,0,unknown 36,technician,married,tertiary,no,1109,no,no,cellular,13,aug,328,2,-1,0,unknown 20,student,single,secondary,no,502,no,no,cellular,30,apr,261,1,-1,0,unknown 31,blue-collar,married,secondary,no,360,yes,yes,cellular,29,jan,89,1,241,1,failure 40,management,married,tertiary,no,194,no,yes,cellular,29,aug,189,2,-1,0,unknown 56,technician,married,secondary,no,4073,no,no,cellular,27,aug,239,5,-1,0,unknown 37,admin.,single,tertiary,no,2317,yes,no,cellular,20,apr,114,1,152,2,failure 25,blue-collar,single,primary,no,-221,yes,no,unknown,23,may,250,1,-1,0,unknown 31,services,married,secondary,no,132,no,no,cellular,7,jul,148,1,152,1,other` 1. Click your deployment space in the navigation trail. ![Navigation trail](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/autoai-breadcrumbs.png) 1. Click the **Assets** tab. 1. Drag the **bank-payload.csv** file into the side panel, and wait for the file to upload. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the *Assets* tab in the deployment space. + + ![Assets tab in the deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/autoai-assets-tab.png)\{: width="100%" \} \#\#\# Task 5b: Create the batch deployment ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 07:30. To process a batch of inputs and have the output written to a file instead of displayed in real time, create a batch deployment job. 1. Go to the **Assets** tab in the deployment space. 1. Click the ![Overflow menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/overflow-menu--vertical.svg)\{: iih\} **Overflow** menu for your model, and choose **Deploy**. 1. For the *Deployment type*, select **Batch**. 1. Type a name for the deployment. 1. Choose the smallest hardware specification. 1. Click **Create**. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows batch deployment. + + ![Batch deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/autoai-batch-page.png)\{: width="100%" \} \#\#\# Task 5c: Create the batch job ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 07:44. The batch job runs the deployment. To create the job, you specify the input data and the name for the output file. You can set up a job to run on a schedule, or run immediately. Follow these steps to create a batch job: 1. On the deployment page, click **New job**. 1. Specify a name for the job, and click **Next**. 1. Select the smallest hardware specification, and click **Next**. 1. Optional: Set a schedule, and click **Next**. 1. Optional: Choose to receive notifications, and click **Next**. 1. On the *Choose data* screen, select the *Input* data: 1. Click **Select data source**. 1. Select **Data asset > bank-payload.csv**. 1. Click **Confirm**. 1. Back on the *Choose data* screen, specify the *Output* file: 1. Click **Add**. 1. Click **Select data source**. 1. Ensure that the **Create new** tab is selected. 1. For the *Name*, type `bank-output.csv`\{: .cp\}. 1. Click **Confirm**. 1. Click **Next** for the final step. 1. Review the settings, and click **Create and run** to run the job immediately. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the job details for the batch deployment. + + ![Create a job for the batch deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/autoai_bank_job.png)\{: width="100%" \} \#\#\# Task 5d: View the output ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 08:42. Follow these steps to review the output file from the batch job. 1. Click the job name to see the status. 1. When the status changes to *Completed*, click your deployment space name in the navigation trail. 1. Click the **Assets** tab. 1. Click the **bank-output.csv** file to review the prediction results for the customer information that is submitted for batch processing. For each case, the prediction returned these customers are unlikely to subscribe to the bank promotion. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the results of the batch deployment job. + + ![The following image shows the results of the batch deployment job.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/autoai_bank_sample_batch_output.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html?context=cdpaas&locale=en#video-preview) + + + +## Next steps ## + +Now you can use this data set for further analysis\. For example, you or other users can do any of these tasks: + + + + * [Cleansing and shaping data](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html) + * [Analyze the data in a Juypter notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html) + + + +## Additional resources ## + + + + * Try these additional tutorials to get more hands\-on experience with building models using AutoAI: + + + + * [Build a Binary classification Model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai_example_binary_classifier.html) + * [Build a univariate time series experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-ts-uni-tutorial.html) + * [Build a text analysis experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-text-analysis.html) + + + + * Try these other methods to build models: + + + + * [Build and deploy a model in a Jupyter notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-notebook.html) + * [Build and deploy a model with SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html) + * [Build and deploy a Decision Optimization model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html) + + + + * View more [videos](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html)\. + * Find sample data sets, projects, models, prompts, and notebooks in the Samples to gain hands\-on experience: + + ![Notebook icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook.svg)[Notebooks](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=notebook) that you can add to your project to get started analyzing data and building models. + + ![Project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/ibm-cloud--projects.svg)[Projects](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=project-template) that you can import containing notebooks, data sets, prompts, and other assets. + + ![Data set icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/data--set.svg)[Data sets](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=dataset) that you can add to your project to refine, analyze, and build models. + + ![Prompt icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/prompt.svg)[Prompts](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=example-prompt) that you can use in the Prompt Lab to prompt a foundation model. + + ![Model icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/model.svg)[Foundation models](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=foundation-model) that you can use in the Prompt Lab. + + + +**Parent topic:**[Quick start tutorials](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e176531ba95036356a7e5dca50a8df728c78ce79.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e176531ba95036356a7e5dca50a8df728c78ce79.md new file mode 100644 index 0000000..2e77844 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e176531ba95036356a7e5dca50a8df728c78ce79.md @@ -0,0 +1,27 @@ +# Firewall access for the platform + +# Firewall access for the platform # + +If a data source resides behind a firewall, then IBM watsonx requires inbound access through the firewall in order to make a connection\. Inbound firewall access is required whether the data source resides on a third\-party cloud provider or in an data center\. The method for configuring inbound access varies for different vendor's firewalls\. In general, you configure inbound access rules by entering the IP addresses for the IBM watsonx cluster to allow for access by IBM watsonx\. + +You can enter the IP addresses using the starting and ending addresses for a range or by using CIDR notation\. Classless Inter\-Domain Routing (CIDR) notation is a compact representation of an IP address and its associated network mask\. For start and end addresses, copy each address and enter them in the inbound rules for your firewall\. Alternately, copy the addresses in CIDR notation\. + +The IBM watsonx IP addresses vary by region\. The user interface lists the IP addresses for the current region\. The IP addresses apply to the base infrastructure for IBM watsonx\. + +Follow these steps to look up the IP addresses for IBM watsonx cluster: + + + +1. Go to the **Administration > Cloud integrations** page\. +2. Click the **Firewall configuration** link to view the list of IP ranges used by IBM watsonx in your region\. +3. View the IP ranges for the IBM watsonx cluster in either CIDR notation or as Start and End addresses\. +4. Choose **Include private IPs** to view the private IP addresses\. The private IP addresses allow connections to IBM Cloud Object Storage buckets that are behind a firewall\. See [Firewall access for Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall-cfg-private-cos.html)\. +5. Copy each of the IP ranges listed and paste them into the appropriate security configuration or inbound firewall rules area for your cloud provider\. + + + +For example, if your data source resides on AWS, open the **Create Security Group** dialog for your AWS Management Console\. Paste the IP ranges into the **Inbound** section for the security group rules\. + +**Parent topic:**[Configuring firewall access](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall_ovrvw.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e2089a0f2315f9897f6e3dde50e4fc3ebd2e65aa.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e2089a0f2315f9897f6e3dde50e4fc3ebd2e65aa.md new file mode 100644 index 0000000..6814af9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e2089a0f2315f9897f6e3dde50e4fc3ebd2e65aa.md @@ -0,0 +1,111 @@ +# Project collaborators + +# Project collaborators # + +Collaborators are the people you add to the project to work together\. After you create a project, add collaborators to share knowledge and resources freely, shift workloads flexibly, and help one another complete jobs\. + +**Required permissions** : To manage collaborators, both of the following conditions must be true: : \- You must have the **Admin** role in the project\. : \- You must belong to the project creator's IBM Cloud account\. + + + + * [Add collaborators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html?context=cdpaas&locale=en#add-collaborators) + * [Add service IDs](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html?context=cdpaas&locale=en#serviceids) + * [Change collaborator roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html?context=cdpaas&locale=en#change-role) + * [Remove a collaborator](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html?context=cdpaas&locale=en#remove-a-collaborator) + + + +## Add collaborators ## + +To add a collaborator as a **Viewer** or **Editor** of your project, they must either be: + + + + * A member of the project creator's IBM Cloud account, or; + * A member of the same organization single sign\-on (SAML federation on IBM Cloud)\. + + + +To add a collaborator as an **Admin** of your project, they must be a member of the project creator's IBM Cloud account\. + +Watch this video to see how to add collaborators and grant them access to your projects\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +To add collaborators to your project: + + + +1. From your project, click the **Access Control** page on the **Manage** tab\. +2. Click **Add collaborators** then select **Add users**\. +3. Add the collaborators who you want to have the same access level: + + + + * Type email addresses into the **Find users** field. + * Copy multiple email addresses, separated by commas, and paste them into the **Find users** field. + + + +4. Choose the [role](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborator-permissions.html) for the collaborators and click **Add**: + + + + * **Viewer**: View the project. + * **Editor**: Control project assets. + * **Admin**: Control project assets, collaborators, and settings. + + + +5. Add more collaborators with the same or different access levels\. +6. Click **Add**\. + + + +The invited users are added to your project immediately\. + +## Add service IDs ## + +You can create service IDs in IBM Cloud to enable an application outside of IBM Cloud access to your IBM Cloud services\. Because service IDs are not tied to a specific user, if a user happens to leave an organization and is deleted from the account, the service ID remains ensuring that your application or service stays up and running\. See [Creating and working with service IDs](https://cloud.ibm.com/docs/account?topic=account-serviceids)\. + +To add a service ID to your project: + + + +1. From your project, select the **Access Control** page on the **Manage** tab\. +2. Click **Add collaborators** and select **Add service IDs**\. +3. In the **Find service IDs** field, search for the service name or description and select the one you want\. +4. Add other service IDs that you want to have the same access level\. +5. Select the access level\. +6. Click **Add**\. + + + +## Change collaborator roles ## + +To change the role for a project collaborator or service ID: + + + +1. Go to the **Access Control** page on the **Manage** tab\. +2. In the row for the collaborator or service ID, click the edit icon next to the role name\. +3. Select the new role and click **Save**\. + + + +## Remove a collaborator ## + +To remove a collaborator or service ID from a project, go to the **Access Control** page on the **Manage** tab\. In the row for the collaborator or service ID, click the remove icon\. + +## Learn more ## + + + + * [Collaborator permissions](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborator-permissions.html) + * [Setup additional account users](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-addl-users.html) + + + +**Parent topic:**[Administering projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/admin-project.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e334a64775ae571c661cdcc847669f0e20c207ff.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e334a64775ae571c661cdcc847669f0e20c207ff.md new file mode 100644 index 0000000..9480b6f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e334a64775ae571c661cdcc847669f0e20c207ff.md @@ -0,0 +1,86 @@ +# Video library + +# Video library # + +Watch short videos for data scientists, data engineers, and data stewards to learn about watsonx\. The videos and accompanying tutorials are task\-focused and provide hands\-on experience by using the tools in watsonx\. + +Note: These videos provides a visual method to learn the concepts and tasks in this documentation\. If you are having difficulty viewing any of the videos on this page, visit the **[Video playlists](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx-docs.html)** page\. + +#### First watch the IBM watsonx\.ai overview video\. #### + +![Watch Video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) Select any video from the lists below to watch here\. + +## Quick start ## + +IBM watsonx\.ai overview + + + + * Classify text + * Summarize large, complex documents + * Generate content + * Extract text from complex documents + + + +Get started + + + + * Create a project + * Collaborate in projects + * Tour the samples collection + * Load and analyze public data sets + + + +Work with data + + + + * Prepare data with Data Refinery + + * Generate synthetic tabular data + + * Analyze data in a Jupyter notebook + + + +IBM watsonx\.governance + + + + * Track a model in an AI use case + + * Evaluate a prompt template + + * Track a prompt template + + + +Work with foundation models + + + + * Prompt a foundation model using Prompt Lab + * Prompt tips: Get started prompting foundation models + * Introduction to the retrieval\-augmented generation pattern + * Tune a foundation model + + + +Build models + + + + * Build and deploy a model with AutoAI + + * Build and deploy a model in a Jupyter notebook + + * Build and deploy a model with SPSS Modeler + * Build and deploy a Decision Optimization model + * Create a pipeline to automate the lifecycle for a model + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e3526b694c68c40edc206e216b454e63b83f3eba.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e3526b694c68c40edc206e216b454e63b83f3eba.md new file mode 100644 index 0000000..a9c8329 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e3526b694c68c40edc206e216b454e63b83f3eba.md @@ -0,0 +1,210 @@ +# Asset contents or previews + +# Asset contents or previews # + +In projects and other workspaces, you can see a preview of data assets that contain relational data\. + + + + * [Requirements and restrictions](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/previews.html?context=cdpaas&locale=en#require) + * [Previews of data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/previews.html?context=cdpaas&locale=en#data) + + + +## Requirements and restrictions ## + +You can view the contents or previews of assets under the following conditions and restrictions\. + + + + * **Workspaces** + You can view the preview or contents of assets in these workspaces: + + + + * Projects + * Deployment spaces + + + + + + + + * **Types of assets** + + + + * Data assets from files + * Connected data assets + * Models + * Notebooks + + + + + + + + * **Required permissions** + To see the asset contents or preview, these conditions must be true: + + + + * You have any collaborator role in the workspace. + + + + + + + + * **Restrictions for data assets** + + Additional requirements apply to connected data assets and data assets from files. See [Requirements for data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/previews.html?context=cdpaas&locale=en#require-data). Previews are not available for data assets that were added as managed assets by using the [Watson Data API](https://cloud.ibm.com/apidocs/watson-data-api#createattachmentnewv2). + + + +## Previews of data assets ## + +The previews of data assets show a view of the data\. + +You can see when the data in the preview was last fetched and refresh the preview data by clicking the refresh icon\. + + + + * [Requirements for data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/previews.html?context=cdpaas&locale=en#require-data) + * [Preview information for data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/previews.html?context=cdpaas&locale=en#preview-info) + * [File extensions and mime types of previewed files](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/previews.html?context=cdpaas&locale=en#files) + + + +### Requirements for data assets ### + +The additional requirements for viewing previews of data assets depend on whether the data is accessed through a connection or from a file\. + +#### Connected data assets #### + +You can see previews of data assets that are accessed through a connection if all these conditions are true: + + + + * You have access to the data asset and its associated connection\. See [Requirements and restrictions](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/previews.html?context=cdpaas&locale=en#require)\. + * The data asset contains structured data\. Structured data resides in fixed fields within a record or file, for example, relational database data or spreadsheets\. + * You have credentials for the connection: + + + + * For connections with shared credentials, the username in the connection details has access to the object at the data source. + * For connections with personal credentials, you must enter your personal credentials when you see a key icon (![the key symbol for private connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/privatekey.png)). This is a one-time step that permanently unlocks the connection for you. See [Adding connections to projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html). + + + + + +#### Data assets from files #### + +You can see previews of data assets from files if the following conditions are true: + + + + * You have access to the data asset\. See [Requirements and restrictions](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/previews.html?context=cdpaas&locale=en#require)\. + * The file is stored in IBM Cloud Object Storage\. For preview of text or image files from an IBM Cloud Object Storage connection to work, the connection credentials must include an access key and a secret key\. If you’re using an existing Cloud Object Storage connection that doesn’t have these keys, edit the connection asset and add them\. See [IBM Cloud Object Storage connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-cos.html)\. + * The file type is supported\. See [File extensions and mime types of previewed files](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/previews.html?context=cdpaas&locale=en#files)\. + + + +### Preview information for data assets ### + +For structured data, the preview displays a limited number of rows and columns: + + + + * The number of rows in the preview is limited to 1,000\. + * The amount of data is limited to 800 KB\. The more columns the data asset has, the fewer rows that appear in the preview\. + + + +Previews show different information for different types of data assets and files\. + +#### Structured data #### + +For structured data, the preview shows column names, data types, and a subset of columns and rows of data\. The supported formats of structured data area: Relational data, CSV, TSV, Avro, partitioned data, and Parquet (projects)\. + +Assets from file based connections like Apache Kafka and Apache Cassandra are not supported\. + +#### Unstructured data #### + +Unstructured data files must be stored in IBM Cloud Object Storage to have previews\. + +For these unstructured data files, the preview shows the whole document: Text, JSON, HTML, PDF, images, and Microsoft Excel documents\. HTML files are supported in text format\. Images stored in IBM Cloud Object Storage support JPG, JPEG, PNG, GIF, BMP, and BMP1\. Microsoft Excel document previews show the first sheet\. + +For connected folder assets, the preview shows the files and subfolders, which you can also preview\. + +### File extensions and mime types of previewed files ### + +These types of files that contain structured data have previews: + + + +Structured data files + +| Extension | Mime type | +| --------- | --------------------------------------------------------------------- | +| AVRO | | +| CSV | text/csv | +| CSV1 | application/csv | +| JSON | application/json | +| PARQ | | +| TSV | | +| TXT | text/plain | +| XLSX | application/vnd\.openxmlformats\-officedocument\.spreadsheetml\.sheet | +| XLS | application/vnd\.ms\-excel | +| XLSM | application/vnd\.ms\-excel\.sheet\.macroEnabled\.12 | + + + +These types of image files have previews: + + + +Image files + +| Extension | Mime type | +| --------- | ---------- | +| BMP | image/bmp | +| GIF | image/gif | +| JPG | image/jpeg | +| JPEG | image/jpeg | +| PNG | image/png | + + + +These types of document files have previews: + + + +Document files + +| Extension | Mime type | +| --------- | --------------- | +| HTML | text/html | +| PDF | application/pdf | +| TXT | text/plain | + + + +## Learn more ## + + + + * [Searching for assets across the platform](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/search-assets.html) + * [Profile](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/profile.html) + * [Activities](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/asset-activities.html) + * [Visualizations](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/visualizations.html) + + + +**Parent topic:**[Asset types and properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e399a5b6fa720c6f21337792f822f20f20f98910.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e399a5b6fa720c6f21337792f822f20f20f98910.md new file mode 100644 index 0000000..4a6379c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e399a5b6fa720c6f21337792f822f20f20f98910.md @@ -0,0 +1,50 @@ +# autoclusternode properties + +# autoclusternode properties # + +![Auto Cluster node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/autoclusternodeicon.png)The Auto Cluster node estimates and compares clustering models, which identify groups of records that have similar characteristics\. The node works in the same manner as other automated modeling nodes, allowing you to experiment with multiple combinations of options in a single modeling pass\. Models can be compared using basic measures with which to attempt to filter and rank the usefulness of the cluster models, and provide a measure based on the importance of particular fields\. + + + +autoclusternode properties + +Table 1\. autoclusternode properties + +| `autoclusternode` Properties | Values | Property description | +| ------------------------------------ | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `evaluation` | *field* | Note: Auto Cluster node only\. Identifies the field for which an importance value will be calculated\. Alternatively, can be used to identify how well the cluster differentiates the value of this field and, therefore, how well the model will predict this field\. | +| `ranking_measure` | `Silhouette``Num_clusters``Size_smallest_cluster``Size_largest_cluster``Smallest_to_largest``Importance` | | +| `ranking_dataset` | `Training``Test` | | +| `summary_limit` | *integer* | Number of models to list in the report\. Specify an integer between 1 and 100\. | +| `enable_silhouette_limit` | *flag* | | +| `silhouette_limit` | *integer* | Integer between 0 and 100\. | +| `enable_number_less_limit` | *flag* | | +| `number_less_limit` | *number* | Real number between 0\.0 and 1\.0\. | +| `enable_number_greater_limit` | *flag* | | +| `number_greater_limit` | *number* | Integer greater than 0\. | +| `enable_smallest_cluster_limit` | *flag* | | +| `smallest_cluster_units` | `Percentage``Counts` | | +| `smallest_cluster_limit_percentage` | *number* | | +| `smallest_cluster_limit_count` | *integer* | Integer greater than 0\. | +| `enable_largest_cluster_limit` | *flag* | | +| `largest_cluster_units` | `Percentage``Counts` | | +| `largest_cluster_limit_percentage` | *number* | | +| `largest_cluster_limit_count` | *integer* | | +| `enable_smallest_largest_limit` | *flag* | | +| `smallest_largest_limit` | *number* | | +| `enable_importance_limit` | *flag* | | +| `importance_limit_condition` | `Greater_than``Less_than` | | +| `importance_limit_greater_than` | *number* | Integer between 0 and 100\. | +| `importance_limit_less_than` | *number* | Integer between 0 and 100\. | +| `` | *flag* | Enables or disables the use of a specific algorithm\. | +| `.` | *string* | Sets a property value for a specific algorithm\. See [Setting algorithm properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/factorymodeling_algorithmproperties.html#factorymodeling_algorithmproperties) for more information\. | +| `number_of_models` | *integer* | | +| `enable_model_build_time_limit` | *boolean* | (K\-Means, Kohonen, TwoStep, SVM, KNN, Bayes Net and Decision List models only\.)
Sets a maximum time limit for any one model\. For example, if a particular model requires an unexpectedly long time to train because of some complex interaction, you probably don't want it to hold up your entire modeling run\. | +| `model_build_time_limit` | *integer* | Time spent on model build\. | +| `enable_stop_after_time_limit` | *boolean* | (Neural Network, K\-Means, Kohonen, TwoStep, SVM, KNN, Bayes Net and C&R Tree models only\.)
Stops a run after a specified number of hours\. All models generated up to that point will be included in the model nugget, but no further models will be produced\. | +| `stop_after_time_limit` | *double* | Run time limit (hours)\. | +| `stop_if_valid_model` | *boolean* | Stops a run when a model passes all criteria specified under the Discard settings\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e3b9f33c36e5636808b137cfa4745e39f3b48d62.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e3b9f33c36e5636808b137cfa4745e39f3b48d62.md new file mode 100644 index 0000000..3500850 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e3b9f33c36e5636808b137cfa4745e39f3b48d62.md @@ -0,0 +1,230 @@ +# SPSS predictive analytics forecasting using data preparation for time series data in notebooks + +# SPSS predictive analytics forecasting using data preparation for time series data in notebooks # + +Data preparation for time series data (TSDP) provides the functionality to convert raw time data (in Flattened multi\-dimensional format, which includes transactional (event) based and column\-based data) into regular time series data (in compact row\-based format) which is required by the subsequent time series analysis methods\. + +The main job of TSDP is to generate time series in terms of the combination of each unique value in the dimension fields with metric fields\. In addition, it sorts the data based on the timestamp, extracts metadata of time variables, transforms time series with another time granularity (interval) by applying an aggregation or distribution function, checks the data quality, and handles missing values if needed\. + +**Python example code:** + + from spss.ml.forecasting.timeseriesdatapreparation import TimeSeriesDataPreparation + + tsdp = TimeSeriesDataPreparation(). \ + setMetricFieldList(["Demand"]). \ + setDateTimeField("Date"). \ + setEncodeSeriesID(True). \ + setInputTimeInterval("MONTH"). \ + setOutTimeInterval("MONTH"). \ + setQualityScoreThreshold(0.0). \ + setConstSeriesThreshold(0.0) + + tsdpOut = tsdp.transform(data) + +## TimeSeriesDataPreparationConvertor ## + +This is the date/time convertor API that's used to provide some functionalities of the date/time convertor inside TSDP for applications to use\. There are two use cases for this component: + + + + * Compute the time points between a specified start and end time\. In this case, the start and end time both occur after the first observation in the previous TSDP\\'s output\. + * Compute the time points between a start index and end index referring to the last observation in the previous TSDP\\'s output\. + + + +## Temporal causal modeling ## + +Temporal causal modeling (TCM) refers to a suite of methods that attempt to discover key temporal relationships in time series data by using a combination of Granger causality and regression algorithms for variable selection\. + +**Python example code:** + + from spss.ml.forecasting.timeseriesdatapreparation import TimeSeriesDataPreparation + from spss.ml.common.wrapper import LocalContainerManager + from spss.ml.forecasting.temporalcausal import TemporalCausal + from spss.ml.forecasting.params.predictor import MaxLag, MaxNumberOfPredictor, Predictor + from spss.ml.forecasting.params.temporal import FieldNameList, FieldSettings, Forecast, Fit + from spss.ml.forecasting.reversetimeseriesdatapreparation import ReverseTimeSeriesDataPreparation + + tsdp = TimeSeriesDataPreparation().setDimFieldList(["Demension1", "Demension2"]). \ + setMetricFieldList(["m1", "m2", "m3", "m4"]). \ + setDateTimeField("date"). \ + setEncodeSeriesID(True). \ + setInputTimeInterval("MONTH"). \ + setOutTimeInterval("MONTH") + tsdpOutput = tsdp.transform(changedDF) + + lcm = LocalContainerManager() + lcm.exportContainers("TSDP", tsdp.containers) + + estimator = TemporalCausal(lcm). \ + setInputContainerKeys(["TSDP"]). \ + setTargetPredictorList([Predictor( + targetList="", "", ""]], + predictorCandidateList="", "", ""]])]). \ + setMaxNumPredictor(MaxNumberOfPredictor(False, 4)). \ + setMaxLag(MaxLag("SETTING", 5)). \ + setTolerance(1e-6) + + tcmModel = estimator.fit(tsdpOutput) + transformer = tcmModel.setDataEncoded(True). \ + setCILevel(0.95). \ + setOutTargetValues(False). \ + setTargets(FieldSettings(fieldNameList=FieldNameList(seriesIDList=["da1", "db1", "m1"]]))). \ + setReestimate(False). \ + setForecast(Forecast(outForecast=True, forecastSpan=5, outCI=True)). \ + setFit(Fit(outFit=True, outCI=True, outResidual=True)) + + predictions = transformer.transform(tsdpOutput) + rtsdp = ReverseTimeSeriesDataPreparation(lcm). \ + setInputContainerKeys(["TSDP"]). \ + setDeriveFutureIndicatorField(True) + + rtsdpOutput = rtsdp.transform(predictions) + rtsdpOutput.show() + +## Temporal Causal Auto Regressive Model ## + +Autoregressive (AR) models are built to compute out\-of\-sample forecasts for predictor series that aren't target series\. These predictor forecasts are then used to compute out\-of\-sample forecasts for the target series\. + +**Model produced by TemporalCausal** + +TemporalCausal exports outputs: + + + + * a JSON file that contains TemporalCausal model information + * an XML file that contains multi series model + + + +**Python example code:** + + from spss.ml.common.wrapper import LocalContainerManager + from spss.ml.forecasting.temporalcausal import TemporalCausal, TemporalCausalAutoRegressiveModel + from spss.ml.forecasting.params.predictor import MaxLag, MaxNumberOfPredictor, Predictor + from spss.ml.forecasting.params.temporal import FieldNameList, FieldSettingsAr, ForecastAr + + lcm = LocalContainerManager() + arEstimator = TemporalCausal(lcm). \ + setInputContainerKeys([tsdp.uid]). \ + setTargetPredictorList([Predictor( + targetList = "da1", "db1", "m2"]], + predictorCandidateList = "da1", "db1", "m1"], + "da1", "db2", "m1"], + "da1", "db2", "m2"], + "da1", "db3", "m1"], + "da1", "db3", "m2"], + "da1", "db3", "m3"]])]). \ + setMaxNumPredictor(MaxNumberOfPredictor(False, 5)). \ + setMaxLag(MaxLag("SETTING", 5)) + + arEstimator.fit(df) + + tcmAr = TemporalCausalAutoRegressiveModel(lcm).\ + setInputContainerKeys([arEstimator.uid]).\ + setDataEncoded(True).\ + setOutTargetValues(True). \ + setTargets(FieldSettingsAr(FieldNameList( + seriesIDList=["da1", "db1", "m1"], + "da1", "db2", "m2"], + "da1", "db3", "m3"]]))).\ + setForecast(ForecastAr(forecastSpan = 5)) + + scored = tcmAr.transform(df) + scored.show() + +## Temporal Causal Outlier Detection ## + +One of the advantages of building TCM models is the ability to detect model\-based outliers\. Outlier detection refers to a capability to identify the time points in the target series with values that stray too far from their expected (fitted) values based on the TCM models\. + +## Temporal Causal Root Cause Analysis ## + +The root cause analysis refers to a capability to explore the Granger causal graph in order to analyze the key/root values that resulted in the outlier in question\. + +## Temporal Causal Scenario Analysis ## + +Scenario analysis refers to a capability of the TCM models to "play\-out" the repercussions of artificially setting the value of a time series\. A scenario is the set of forecasts that are performed by substituting the values of a root time series by a vector of substitute values\. + +## Temporal Causal Summary ## + +TCM Summary selects Top N models based on one model quality measure\. There are five model quality measures: Root Mean Squared Error (RMSE), Root Mean Squared Percentage Error (RMSPE), Bayesian Information Criterion (BIC), Akaike Information Criterion (AIC), and R squared (RSQUARE)\. Both N and the model quality measure can be set by the user\. + +## Time Series Exploration ## + +Time Series Exploration explores the characteristics of time series data based on some statistics and tests to generate preliminary insights about the time series before modeling\. It covers not only analytic methods for expert users (including time series clustering, unit root test, and correlations), but also provides an automatic exploration process based on a simple time series decomposition method for business users\. + +**Python example code:** + + from spss.ml.forecasting.timeseriesexploration import TimeSeriesExploration + + tse = TimeSeriesExploration(). \ + setAutoExploration(True). \ + setClustering(True) + + tseModel = tse.fit(data) + predictions = tseModel.transform(data) + predictions.show() + +## Reverse Data preparation for time series data ## + +Reverse Data preparation for time series data (RTSDP) provides functionality that converts the compact row based (CRB) format that's generated by TimeSeriesDataPreperation (TSDP) or TemporalCausalModel (TCM Score) back to the flattened multidimensional (FMD) format\. + +**Python example code:** + + from spss.ml.common.wrapper import LocalContainerManager + from spss.ml.forecasting.params.temporal import GroupType + from spss.ml.forecasting.reversetimeseriesdatapreparation import ReverseTimeSeriesDataPreparation + from spss.ml.forecasting.timeseriesdatapreparation import TimeSeriesDataPreparation + + manager = LocalContainerManager() + tsdp = TimeSeriesDataPreparation(manager). \ + setDimFieldList(["Dimension1", "Dimension2", "Dimension3"]). \ + setMetricFieldList( + ["Metric1", "Metric2", "Metric3", "Metric4", "Metric5", "Metric6", "Metric7", "Metric8", "Metric9", "Metric10"]). \ + setDateTimeField("TimeStamp"). \ + setEncodeSeriesID(False). \ + setInputTimeInterval("WEEK"). \ + setOutTimeInterval("WEEK"). \ + setMissingImputeType("LINEAR_INTERP"). \ + setQualityScoreThreshold(0.0). \ + setConstSeriesThreshold(0.0). \ + setGroupType( + GroupType([("Metric1", "MEAN"), ("Metric2", "SUM"), ("Metric3", "MODE"), ("Metric4", "MIN"), ("Metric5", "MAX")])) + + tsdpOut = tsdp.transform(changedDF) + rtsdp = ReverseTimeSeriesDataPreparation(manager). \ + setInputContainerKeys([tsdp.uid]). \ + setDeriveFutureIndicatorField(True) + + rtdspOut = rtsdp.transform(tsdpOut) + + import com.ibm.spss.ml.forecasting.traditional.TimeSeriesForecastingModelReEstimate + + val tsdp = TimeSeriesDataPreparation(). + setDimFieldList(Array("da", "db")). + setMetricFieldList(Array("metric")). + setDateTimeField("date"). + setEncodeSeriesID(false). + setInputTimeInterval("MONTH"). + setOutTimeInterval("MONTH") + + val lcm = LocalContainerManager() + lcm.exportContainers("k", tsdp.containers) + + val reestimate = TimeSeriesForecastingModelReEstimate(lcm). + setForecast(ForecastEs(outForecast = true, forecastSpan = 4, outCI = true)). + setFitSettings(Fit(outFit = true, outCI = true, outResidual = true)). + setOutInputData(true). + setInputContainerKeys(Seq("k")) + + val rtsdp = ReverseTimeSeriesDataPreparation(tsdp.manager). + setInputContainerKeys(List(tsdp.uid)). + setDeriveFutureIndicatorField(true) + + val pipeline = new Pipeline().setStages(Array(tsdp, reestimate, rtsdp)) + val scored = pipeline.fit(data).transform(data) + scored.show() + +**Parent topic:**[SPSS predictive analytics algorithms](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/spss-algorithms.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e3e5fa98908eee308d960761e9f29cf7a8aad690.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e3e5fa98908eee308d960761e9f29cf7a8aad690.md new file mode 100644 index 0000000..e70d1f8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e3e5fa98908eee308d960761e9f29cf7a8aad690.md @@ -0,0 +1,43 @@ +# {{ document.title.text }} + +# Evasion attack # + +![icon for robustness risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-robustness.svg)Risks associated with inputInferenceRobustnessAmplified + +### Description ### + +Evasion attacks attempt to make a model output incorrect results by perturbing the data sent to the trained model\. + +### Why is evasion attack a concern for foundation models? ### + +Evasion attacks alter model behavior, usually to benefit the attacker\. If not properly accounted for, business entities could face fines, reputational harms, and other legal consequences\. + +Example + +#### Adversarial attacks on autonomous vehicles' AI components #### + +A report from the European Union Agency for Cybersecurity (ENISA) found that autonomous vehicles are “highly vulnerable to a wide range of attacks” that could be dangerous for passengers, pedestrians, and people in other vehicles\. The report states that an adversarial attack might be used to make the AI ‘blind’ to pedestrians by manipulating the image recognition component to misclassify pedestrians\. This attack could lead to havoc on the streets, as autonomous cars may hit pedestrians on the road or crosswalks\. + +Other studies have demonstrated potential adversarial attacks on autonomous vehicles: + + + + * Fooling machine learning algorithms by making minor changes to street sign graphics, such as adding stickers\. + * Security researchers from Tencent demonstrated how adding three small stickers in an intersection could cause Tesla's autopilot system to swerve into the wrong lane\. + * Two McAfee researchers demonstrated how using only black electrical tape could trick a 2016 Tesla into a dangerous burst of acceleration by changing a speed limit sign from 35 mph to 85 mph\. + + + +Sources: + +[Venture Beat, February 2021](https://venturebeat.com/business/eu-report-warns-that-ai-makes-autonomous-vehicles-highly-vulnerable-to-attack/) + +[IEEE, August 2017](https://spectrum.ieee.org/slight-street-sign-modifications-can-fool-machine-learning-algorithms) + +[IEEE, April 2019](https://spectrum.ieee.org/three-small-stickers-on-road-can-steer-tesla-autopilot-into-oncoming-lane) + +[Market Watch, February 2020](https://www.marketwatch.com/story/85-in-a-35-hackers-show-how-easy-it-is-to-manipulate-a-self-driving-tesla-2020-02-19) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e3efb6106ae81db5a8b3379c3edcf86e31f95ab0.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e3efb6106ae81db5a8b3379c3edcf86e31f95ab0.md new file mode 100644 index 0000000..38b29f9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e3efb6106ae81db5a8b3379c3edcf86e31f95ab0.md @@ -0,0 +1,16 @@ +# Creating a class instance + +# Creating a class instance # + +You can use classes to hold class (or shared) attributes or to create class instances\. To create an instance of a class, you call the class as if it were a function\. For example, consider the following class: + + class MyClass: + pass + +Here, the `pass` statement is used because a statement is required to complete the class, but no action is required programmatically\. + +The following statement creates an instance of the class `MyClass`: + + x = MyClass() + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e45c894cb0df39ad55a35183d62a6cbd570076ca.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e45c894cb0df39ad55a35183d62a6cbd570076ca.md new file mode 100644 index 0000000..68ac655 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e45c894cb0df39ad55a35183d62a6cbd570076ca.md @@ -0,0 +1,29 @@ +# Browser support + +# Browser support # + +The supported web browsers provide the best experience for IBM watsonx\. + +Use the latest versions of these web browers with IBM watsonx: + + + + * Chrome + * Microsoft Edge + * Mozilla Firefox + Tip for Firefox on Mac users: Horizontal scrolling within the UI can be interpreted by your Mac as an attempt to swipe between pages. If this behavior is undesired or if the browser crashes after the service prompts you to stay on the page, consider disabling the **Swipe between pages** gesture in **Launchpad > System Preferences > Trackpad > More Gestures**. + * Firefox ESR (see Mozilla Firefox Extended Support Release for more details) + + + +## Learn more ## + + + + * [Language support](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/localization.html) + + + +**Parent topic:**[FAQ](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e45eeb80195e54d02a6f6cb7505f1fb73b4d4dab.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e45eeb80195e54d02a6f6cb7505f1fb73b4d4dab.md new file mode 100644 index 0000000..4b4cec5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e45eeb80195e54d02a6f6cb7505f1fb73b4d4dab.md @@ -0,0 +1,76 @@ +# Watson OpenScale offering plan options + +# Watson OpenScale offering plan options # + +The Watson OpenScale enables responsible, transparent, and explainable AI\. + +With Watson OpenScale you can: + + + + * Evaluate machine learning models for dimensions such as fairness, quality, or drift\. + * Explore transactions to gain insights about your model\. + + + +## Watson OpenScale legacy offering plans ## + +Important:The legacy offering plan for Watson OpenScale is available only in the Frankfurt region\. In the Dallas region, the [watsonx\.governance plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-plan-options.html) are available instead\. + +### Watson OpenScale Standard v2 plan ### + +Watson OpenScale offers a Standard v2 plan that charge users on a per model basis\. + +There are no restrictions or limitations on payload data, feedback rows, or explanations under the Standard v2 instance\. + +### Regional limitations ### + +Watson OpenScale is not available in some regions\. See [Regional availability for services and features](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/regional-datactr.html) for more details\. + +Note:The regional availability for every service can also be found in the [IBM watsonx catalog](https://dataplatform.cloud.ibm.com/data/catalog?target=services&context=cpdaas)\. + +### Quota limits ### + +To avoid performance issues and manage resources efficiently, Watson OpenScale sets the following quota limits: + + + +| Asset | Limit | +| ------------------ | ------------------------ | +| DataMart | 100 per instance | +| Service providers | 100 per instance | +| Integrated systems | 100 per instance | +| Subscriptions | 100 per service provider | +| Monitor instances | 100 per subscription | + + + +Every asset in Watson OpenScale has a hard limitation of 10000 instances of the asset per service instance\. + +### PostgreSQL databases for Watson OpenScale ### + +You can use a PostgreSQL database for your Watson OpenScale instance\. PostgreSQL is a powerful, open source object\-relational database that is highly customizable and compliant with many security standards\. + +If your model processes personally identifiable information (PII), use a PostgreSQL database for your model\. PostgreSQL is compliant with: + + + + * GDPR + * HIPAA + * PCI\-DSS + * SOC 1 Type 2 + * SOC 2 Type 2 + * ISO 27001 + * ISO 27017 + * ISO 27018 + * ISO 27701 + + + +## Next steps ## + +[Managing the Watson OpenScale service](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-provision-launch.html) + +**Parent topic:**[watsonx\.governance](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/aiopenscale.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e45f37bddb38d6656992642fbea2707fe34e942a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e45f37bddb38d6656992642fbea2707fe34e942a.md new file mode 100644 index 0000000..79a8fe8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e45f37bddb38d6656992642fbea2707fe34e942a.md @@ -0,0 +1,16 @@ +# Delegating CPLEX solve to Watson Machine Learning + +# Delegating the Decision Optimization solve to run on Watson Machine Learning from Java or \.NET CPLEX or CPO models # + +You can delegate the Decision Optimization solve to run on Watson Machine Learning from your Java or \.NET (CPLEX or CPO) models\. + +Delegating the solve is only useful if you are building and generating your models locally\. You cannot deploy models and run jobs Watson Machine Learning with this method\. For full use of Java models on Watson Machine Learning use the Java™ worker Important: To deploy and test models on Watson Machine Learning, use the Java worker\. For more information about deploying Java models, see the [Java worker GitHub](https://github.com/IBMDecisionOptimization/cplex-java-worker/blob/master/README.md)\.For the library and documentation for: + + + + * Java CPLEX or CPO models\. See [Decision Optimization GitHub DOforWMLwithJava](https://github.com/IBMDecisionOptimization/DOforWMLwithJava)\. + * \.NET CPLEX or CPO models\. See [Decision Optimization GitHub DOforWMLWith\.NET](https://github.com/IBMDecisionOptimization/DOForWMLWith.NET)\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e4eca1e5e22f94051d1c8e115d9d874658b5697a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e4eca1e5e22f94051d1c8e115d9d874658b5697a.md new file mode 100644 index 0000000..f7d036e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e4eca1e5e22f94051d1c8e115d9d874658b5697a.md @@ -0,0 +1,57 @@ +# Getting and preparing data in a project + +# Getting and preparing data in a project # + +After you create a project, or join one, the next step is to add data to the project and prepare the data for analysis\. + +**Required permissions** : You must have the **Admin** or **Editor** role in a project to add or prepare data\. + +You can add data assets from your local system, from a catalog, from the Samples, or from connections to data sources\. + +You can add these types of data assets to a project: + + + + * Data assets from files from your local system, including structured data, unstructured data, and images\. The files are stored in the project's IBM Cloud Object Storage bucket\. + * Connection assets that contain information for connecting to data sources\. You can add connections to IBM or third\-party data sources\. See [Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html)\. + * Connected data assets that specify a table, view, or file that is accessed through a connection to a data source\. + * Connected folder assets that specify a path in IBM Cloud Object Storage\. + + + +To get started quickly, take a tutorial\. See [Quick start tutorials](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html)\. + +To [refine data](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) by cleansing and shaping it, you can: + + + + * Select the **Prepare data** tile on your watsonx home page\. + * Add the data to the project, then open the data asset and click **Prepare data**\. + + + +To [manage feature groups](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/feature-group.html) for a data asset, open the data asset and go to its **Feature group** page\. + +To create [synthetic data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/synthetic_data_overview_sd.html), you can: + + + + * Select the **Prepare data** tile on your watsonx home page\. + * Select the **Generate synthetic tabular data** tile\. + + + +## Learn more ## + + + + * [Create a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html) + * [Adding data to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html) + * [Refining data with Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) + * [Adding connections to the Platform assets catalog](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html) + * [Manage feature groups (beta)](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/feature-group.html) + * [Creating synthetic data](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/synthetic_data_overview_sd.html) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e54340e1ef02d2436758a56105b3182481ff1783.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e54340e1ef02d2436758a56105b3182481ff1783.md new file mode 100644 index 0000000..37753ba --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e54340e1ef02d2436758a56105b3182481ff1783.md @@ -0,0 +1,80 @@ +# watsonx.governance offering plan options + +# watsonx\.governance offering plan options # + +The watsonx\.governance service enables responsible, transparent, and explainable AI\. + +The available plans depend on the region where you are provisioning the service from the IBM Cloud catalog\. + + + + * In the Dallas region, provision a [watsonx\.governance plan](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-plan-options.html?context=cdpaas&locale=en#wos-plan-options-xgov-plans)\. + * In the Frankfurt region, provision an [Watson OpenScale](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-plan-options2.html) plan\. + + + +## watsonx\.governance plans (Dallas only) ## + +Watsonx\.governance offers a free Lite plan and a paid Essentials plan\. + +With watsonx\.governance you can: + + + + * Evaluate machine learning models for dimensions such as fairness, quality, or drift\. + * Define AI use cases in a collaborative, open way to define a business problem and track the solution\. + * Capture the details for machine learning models, in each stage of their lifecycle, and store the data in factsheets within an associated AI use case\. + * Maintain collections of AI uses cases in inventories, where you can manage access\. + + + +For Large Language Models in watsonx\.ai, you can also: + + + + * Evaluate prompt templates across multiple dimensions such as quality, Personally Identifable Information (PII) in prompt input and outputs, and Abuse or Profanity in Prompt input and ouput\. + * Monitor metrics for Large Language Model performance\. + * Automatically capture metadata in a Factsheet from development to deployment, for each stage in the lifecycle\. + + + +### watsonx\.governance Lite plan features ### + +Lite plan features include: + + + + * Maximum of 200 resource units + * 1 resource unit per predictive model evaluation + * 1 resource unit per foundational model evaluation + * 1 resource unit per global explanation, with a maximum of 500 local explanations + * 1 resource unit per 500 local explanations + * Maximum of 1,000 records per evaluation + * Limit of 3 rows per use case + * Limit of 3 use cases + * Limit of 1 inventory + + + +### watsonx\.governance Essential plan features ### + +Essential plan features include: + + + + * Maximum of 500 inventories + * 1 resource unit per predictive model evaluation + * 1 resource unit per foundational model evaluation + * 1 resource unit per global explanation, with a maximum of 500 local explanations + * 1 resource unit per 500 local explanations + * Maximum of 50,000 records per evaluation + + + +## Next steps ## + +[Provisioning and launching the watsonx\.governance service](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-provision-launch.html) + +**Parent topic:**[watsonx\.governance](https://dataplatform.cloud.ibm.com/docs/content/svc-welcome/aiopenscale.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e5895bc081edbf0cd7340015decd0d0180aac44a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e5895bc081edbf0cd7340015decd0d0180aac44a.md new file mode 100644 index 0000000..cb3d8ae --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e5895bc081edbf0cd7340015decd0d0180aac44a.md @@ -0,0 +1,28 @@ +# Creating a Federated Learning experiment + +# Creating a Federated Learning experiment # + +Learn how to create a Federated Learning experiment to train a machine learning model\. + +Watch this short overview video of how to create a Federated Learning experiment\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +Follow these steps to create a Federated Learning experiment: + + + + * [Set up your system](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-setup.html) + * [Creating the initial model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-models.html) + * [Create the data handler](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-handler.html) + * [Starting the aggregator (Admin)](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-agg.html) + * [Connecting to the aggregator (Party)](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-conn.html) + * [Monitoring and saving the model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-mon.html) + + + +**Parent topic:**[IBM Federated Learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fed-lea.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e59b59312d1eb3b2ba78d7e78993883bb3784c2b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e59b59312d1eb3b2ba78d7e78993883bb3784c2b.md new file mode 100644 index 0000000..5ba5164 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e59b59312d1eb3b2ba78d7e78993883bb3784c2b.md @@ -0,0 +1,122 @@ +# Techniques for avoiding undesirable output + +# Techniques for avoiding undesirable output # + +Every foundation model has the potential to generate output that includes incorrect or even harmful content\. Understand the types of undesirable output that can be generated, the reasons for the undesirable output, and steps that you can take to reduce the risk of harm\. + +The foundation models that are available in IBM watsonx\.ai can generate output that contains hallucinations, personal information, hate speech, abuse, profanity, and bias\. The following techniques can help reduce the risk, but do not guarantee that generated output will be free of undesirable content\. + +Find techniques to help you avoid the following types of undesirable content in foundation model output: + + + + * [Hallucinations](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-hallucinations.html?context=cdpaas&locale=en#hallucinations) + * [Personal information](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-hallucinations.html?context=cdpaas&locale=en#personal-info) + * [Hate speech, abuse, and profanity](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-hallucinations.html?context=cdpaas&locale=en#hap) + * [Bias](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-hallucinations.html?context=cdpaas&locale=en#bias) + + + +## Hallucinations ## + +When a foundation model generates off\-topic, repetitive, or incorrect content or fabricates details, that behavior is sometimes called *hallucination*\. + +Off\-topic hallucinations can happen because of pseudo\-randomness in the decoding of the generated output\. In the best cases, that randomness can result in wonderfully creative output\. But randomness can also result in nonsense output that is not useful\. + +The model might return hallucinations in the form of fabricated details when it is prompted to generate text, but is not given enough related text to draw upon\. If you include correct details in the prompt, for example, the model is less likely to hallucinate and make up details\. + +### Techniques for avoiding hallucinations ### + +To avoid hallucinations, test one or more of these techniques: + + + + * Choose a model with pretraining and fine\-tuning that matches your domain and the task you are doing\. + * Provide context in your prompt\. + + If you instruct a foundation model to generate text on a subject that is not common in its pretraining data and you don't add information about the subject to the prompt, the model is more likely to hallucinate. + * Specify conservative values for the Min tokens and Max tokens parameters and specify one or more stop sequences\. + + When you specify a high value for the Min tokens parameter, you can force the model to generate a longer response than the model would naturally return for a prompt. The model is more likely to hallucinate as it adds words to the output to reach the required limit. + * For use cases that don't require much creativity in the generated output, use greedy decoding\. If you prefer to use sampling decoding, be sure to specify conservative values for the temperature, top\-p, and top\-k parameters\. + * To reduce repetitive text in the generated output, try increasing the repetition penalty parameter\. + * If you see repetitive text in the generated output when you use greedy decoding, and if some creativity is acceptable for your use case, then try using sampling decoding instead\. Be sure to set moderately low values for the temperature, top\-p, and top\-k parameters\. + * In your prompt, instruct the model what to do when it has no confident or high\-probability answer\. + + For example, in a question-answering scenario, you can include the instruction: `If the answer is not in the article, say “I don't know”.` + + + +## Personal information ## + +A foundation model's vocabulary is formed from words in its pretraining data\. If pretraining data includes web pages that are scraped from the internet, the model's vocabulary might contain the following types of information: + + + + * Names of article authors + * Contact information from company websites + * Personal information from questions and comments that are posted in open community forums + + + +If you use a foundation model to generate text for part of an advertising email, the generated content might include contact information for another company\! + +If you ask a foundation model to write a paper with citations, the model might include references that look legitimate but aren't\. It might even attribute those made\-up references to real authors from the correct field\. A foundation model is likely to generate imitation citations, correct in form but not grounded in facts, because the models are good at stringing together words (including names) that have a high probability of appearing together\. The fact that the model lends the output a touch of legitimacy, by including the names of real people as authors in citations, makes this form of hallucination compelling and believable\. It also makes this form of hallucination dangerous\. People can get into trouble if they believe that the citations are real\. Not to mention the harm that can come to people who are listed as authors of works they did not write\. + +### Techniques for excluding personal information ### + +To exclude personal information, try these techniques: + + + + * In your prompt, instruct the model to refrain from mentioning names, contact details, or personal information\. + + For example, when you prompt a model to generate an advertising email, instruct the model to include your company name and phone number. Also, instruct the model to “include no other company or personal information”. + * In your larger application, pipeline, or solution, post\-process the content that is generated by the foundation model to find and remove personal information\. + + + +## Hate speech, abuse, and profanity ## + +As with personal information, when pretraining data includes hateful or abusive terms or profanity, a foundation model that is trained on that data has those problematic terms in its vocabulary\. If inappropriate language is in the model's vocabulary, the foundation model might generate text that includes undesirable content\. + +When you use foundation models to generate content for your business, you must do the following things: + + + + * Recognize that this kind of output is always possible\. + * Take steps to reduce the likelihood of triggering the model to produce this kind of harmful output\. + * Build human review and verification processes into your solutions\. + + + +### Techniques for reducing the risk of hate speech, abuse, and profanity ### + +To avoid hate speech, abuse, and profanity, test one or more of these techniques: + + + + * In the Prompt Lab, set the **AI guardrails** switch to On\. When this feature is enabled, any sentence in the input prompt or generated output that contains harmful language is replaced with a message that says that potentially harmful text was removed\. + * Do not include hate speech, abuse, or profanity in your prompt to prevent the model from responding in kind\. + * In your prompt, instruct the model to use clean language\. + + For example, depending on the tone you need for the output, instruct the model to use “formal”, “professional”, “PG”, or “friendly” language. + * In your larger application, pipeline, or solution, post\-process the content that is generated by the foundation model to remove undesirable content\. + + + +## Reducing the risk of bias in model output ## + +During pretraining, a foundation model learns the statistical probability that certain words follow other words based on how those words appear in the training data\. Any bias in the training data is trained into the model\. + +For example, if the training data more frequently refers to doctors as men and nurses as women, that bias is likely to be reflected in the statistical relationships between those words in the model\. As a result, the model is likely to generate output that more frequently refers to doctors as men and nurses as women\. Sometimes, people believe that algorithms can be more fair and unbiased than humans because the algorithms are “just using math to decide”\. But bias in training data is reflected in content that is generated by foundation models that are trained on that data\. + +### Techniques for reducing bias ### + +It is difficult to debias output that is generated by a foundation model that was pretrained on biased data\. However, you might improve results by including content in your prompt to counter bias that might apply to your use case\. + +For example, instead of instructing a model to “list heart attack symptoms”, you might instruct the model to “list heart attack symptoms, including symptoms common for men and symptoms common for women”\. + +**Parent topic:**[Prompt tips](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-tips.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e5d702e67e93752155510b56a3b2f464e190eba2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e5d702e67e93752155510b56a3b2f464e190eba2.md new file mode 100644 index 0000000..17b808d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e5d702e67e93752155510b56a3b2f464e190eba2.md @@ -0,0 +1,1012 @@ +# Sample foundation model prompts for common tasks + +# Sample foundation model prompts for common tasks # + +Try these samples to learn how different prompts can guide foundation models to do common tasks\. + +## How to use this topic ## + +Explore the sample prompts in this topic: + + + + * Copy and paste the prompt text and input parameter values into the Prompt Lab in IBM watsonx\.ai + * See what text is generated\. + * See how different models generate different output\. + * Change the prompt text and parameters to see how results vary\. + + + +There is no one right way to prompt foundation models\. But patterns have been found, in academia and industry, that work fairly reliably\. Use the samples in this topic to build your skills and your intuition about prompt engineering through experimentation\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +**Video chapters** +\[ 0:11 \] Introduction to prompts and Prompt Lab +\[ 0:33 \] Key concept: Everything is text completion +\[ 1:34 \] Useful prompt pattern: Few\-shot prompt +\[ 1:58 \] Stopping criteria: Max tokens, stop sequences +\[ 3:32 \] Key concept: Fine\-tuning +\[ 4:32 \] Useful prompt pattern: Zero\-shot prompt +\[ 5:32 \] Key concept: Be flexible, try different prompts +\[ 6:14 \] Next steps: Experiment with sample prompts + +## Samples overview ## + +You can find samples that prompt foundation models to generate output that supports the following tasks: + + + + * [Classification](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#classification) + * [Extraction](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#extraction) + * [Generation](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#generation) + * [Question answering (QA)](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#qa) + * [Summarization](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#summarization) + * [Code generation and conversion](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#code) + * [Dialogue](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#dialogue) + + + +The following table shows the foundation models that are used in task\-specific samples\. A checkmark indicates that the model is used in a sample for the associated task\. + + + +Table 1\. Models used in samples for certain tasks + +| Model | Classification | Extraction | Generation | QA | Summarization | Coding | Dialogue | +| -------------------------- | -------------- | ---------- | ---------- | -- | ------------- | ------ | -------- | +| flan\-t5\-xxl\-11b | ✓ | | | ✓ | | | | +| flan\-ul2\-20b | ✓ | ✓ | | ✓ | | | | +| gpt\-neox\-20b | ✓ | | ✓ | | ✓ | | | +| granite\-13b\-chat\-v1 | | | | | | | ✓ | +| granite\-13b\-instruct\-v1 | | | ✓ | ✓ | | | | +| granite\-13b\-instruct\-v2 | | ✓ | ✓ | ✓ | | | | +| llama\-2 chat | | | | | | | ✓ | +| mpt\-7b\-instruct2 | ✓ | | | | ✓ | | | +| mt0\-xxl\-13b | ✓ | | | ✓ | | | | +| starcoder\-15\.5b | | | | | | ✓ | | + + + +The following table summarizes the available sample prompts\. + + + +Table 2\. List of sample prompts + +| Scenario | Prompt editor | Prompt format | Model | Decoding | Notes | +| ------------------------------------------------------------------------------------------------------------------------------------ | ------------- | ---------------- | -------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------- | +| [Sample 1a: Classify a message](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample1a) | Freeform | Zero\-shot | • mt0\-xxl\-13b
• flan\-t5\-xxl\-11b
• flan\-ul2\-20b | Greedy | • Uses the class names as stop sequences to stop the model after it prints the class name | +| [Sample 1b: Classify a message](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample1b) | Freeform | Few\-shot | • gpt\-neox\-20b
• mpt\-7b\-instruct | Greedy | • Uses the class names as stop sequences | +| [Sample 1c: Classify a message](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample1c) | Structured | Few\-shot | • gpt\-neox\-20b
• mpt\-7b\-instruct | Greedy | • Uses the class names as stop sequences | +| [Sample 2a: Extract details from a complaint](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample2a) | Freeform | Zero\-shot | • flan\-ul2\-20b
• granite\-13b\-instruct\-v2 | Greedy | | +| [Sample 3a: Generate a numbered list on a particular theme](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample3a) | Freeform | Few\-shot | • gpt\-neox\-20b | Sampling | • Generates formatted output
• Uses two newline characters as a stop sequence to stop the model after one list | +| [Sample 3b: Generate a numbered list on a particular theme](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample3b) | Structured | Few\-shot | • gpt\-neox\-20b | Sampling | • Generates formatted output\.
• Uses two newline characters as a stop sequence | +| [Sample 3c: Generate a numbered list on a particular theme](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample3c) | Freeform | Zero\-shot | • granite\-13b\-instruct\-v1
• granite\-13b\-instruct\-v2 | Greedy | • Generates formatted output | +| [Sample 4a: Answer a question based on an article](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample4a) | Freeform | Zero\-shot | • mt0\-xxl\-13b
• flan\-t5\-xxl\-11b
• flan\-ul2\-20b | Greedy | • Uses a period "\." as a stop sequence to cause the model to return only a single sentence | +| [Sample 4b: Answer a question based on an article](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample4b) | Structured | Zero\-shot | • mt0\-xxl\-13b
• flan\-t5\-xxl\-11b
• flan\-ul2\-20b | Greedy | • Uses a period "\." as a stop sequence
• Generates results for multiple inputs at once | +| [Sample 4c: Answer a question based on a document](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample4c) | Freeform | Zero\-shot | • granite\-13b\-instruct\-v2 | Greedy | | +| [Sample 4d: Answer general knowledge questions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample4d) | Freeform | Zero\-shot | • granite\-13b\-instruct\-v1 | Greedy | | +| [Sample 5a: Summarize a meeting transcript](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample5a) | Freeform | Zero\-shot | • flan\-t5\-xxl\-11b
• flan\-ul2\-20b
• mpt\-7b\-instruct2 | Greedy | | +| [Sample 5b: Summarize a meeting transcript](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample5b) | Freeform | Few\-shot | • gpt\-neox\-20b | Greedy | | +| [Sample 5c: Summarize a meeting transcript](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample5c) | Structured | Few\-shot | • gpt\-neox\-20b | Greedy | • Generates formatted output
• Uses two newline characters as a stop sequence to stop the model after one list | +| [Sample 6a: Generate programmatic code from instructions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample6a) | Freeform | Few\-shot | • starcoder\-15\.5b | Greedy | • Generates programmatic code as output
• Uses as a stop sequence | +| [Sample 6b: Convert code from one programming language to another](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample6b) | Freeform | Few\-shot | • starcoder\-15\.5b | Greedy | • Generates programmatic code as output
• Uses as a stop sequence | +| [Sample 7a: Converse in a dialogue](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample7a) | Freeform | Custom structure | • granite\-13b\-chat\-v1 | Greedy | • Generates dialogue output like a chatbot
• Uses a special token that is named END\_KEY as a stop sequence | +| [Sample 7b: Converse in a dialogue](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=cdpaas&locale=en#sample7b) | Freeform | Custom structure | • llama\-2 chat | Greedy | • Generates dialogue output like a chatbot
• Uses a model\-specific prompt format | + + + +## Classification ## + +Classification is useful for predicting data in distinct categories\. Classifications can be binary, with two classes of data, or multi\-class\. A classification task is useful for categorizing information, such as customer feedback, so that you can manage or act on the information more efficiently\. + +### Sample 1a: Classify a message ### + +Scenario: Given a message that is submitted to a customer\-support chatbot for a cloud software company, classify the customer's message as either a question or a problem\. Depending on the class assignment, the chat is routed to the correct support team for the issue type\. + +**Model choice** +Models that are instruction\-tuned can generally complete this task with this sample prompt\. Suggestions: mt0\-xxl\-13b, flan\-t5\-xxl\-11b, or flan\-ul2\-20b + +**Decoding** +Greedy\. The model must return one of the specified class names; it cannot be creative and make up new classes\. + +**Stopping criteria** + + + + * Specify two stop sequences: "Question" and "Problem"\. After the model generates either of those words, it should stop\. + * With such short output, the Max tokens parameter can be set to 5\. + + + +**Prompt text** +Paste this zero\-shot prompt text into the freeform prompt editor in Prompt Lab, select the model, set parameters, and then click **Generate** to see the result\. + + Classify this customer message into one of two classes: Question, Problem. + + Class name: Question + Description: The customer is asking a technical question or a how-to question + about our products or services. + + Class name: Problem + Description: The customer is describing a problem they are having. They might + say they are trying something, but it's not working. They might say they are + getting an error or unexpected results. + + Message: I'm having trouble registering for a new account. + Class name: + +### Sample 1b: Classify a message ### + +Scenario: Given a message that is submitted to a customer\-support chatbot for a cloud software company, classify the customer's message as either a question or a problem description\. Based on the class type, the chat can be routed to the correct support team\. + +**Model choice** +With few\-shot examples of both classes, most models can complete this task well, including: gpt\-neox\-20b and mpt\-7b\-instruct\. + +**Decoding** +Greedy\. The model must return one of the specified class names; it cannot be creative and make up new classes\. + +**Stopping criteria** + + + + * Specify two stop sequences: "Question" and "Problem"\. After the model generates either of those words, it should stop\. + * With such short output, the Max tokens parameter can be set to 5\. + + + +**Prompt text** +Paste this few\-shot prompt text into the freeform prompt editor in Prompt Lab, select the model, set parameters, and then click **Generate** to see the result\. + + Message: When I try to log in, I get an error. + Class name: Problem + + Message: Where can I find the plan prices? + Class name: Question + + Message: What is the difference between trial and paygo? + Class name: Question + + Message: The registration page crashed, and now I can't create a new account. + Class name: Problem + + Message: What regions are supported? + Class name: Question + + Message: I can't remember my password. + Class name: Problem + + Message: I'm having trouble registering for a new account. + +### Sample 1c: Classify a message ### + +Scenario: Given a message that is submitted to a customer\-support chatbot for a cloud software company, classify the customer's message as either a question or a problem description\. Based on the class type, the chat can be routed to the correct support team\. + +**Model choice** +With few\-shot examples of both classes, most models can complete this task well, including: gpt\-neox\-20b and mpt\-7b\-instruct\. + +**Decoding** +Greedy\. The model must return one of the specified class names, not be creative and make up new classes\. + +**Stopping criteria** + + + + * Specify two stop sequences: "Question" and "Problem"\. After the model generates either of those words, it should stop\. + * With such short output, the Max tokens parameter can be set to 5\. + + + +**Set up section** +Paste these headers and examples into the **Examples** area of the **Set up** section: + + + +Table 2\. Classification few\-shot examples + +| **Message:** | **Class name:** | +| ---------------------------------------------------------------------- | --------------- | +| `When I try to log in, I get an error.` | `Problem` | +| `Where can I find the plan prices?` | `Question` | +| `What is the difference between trial and paygo?` | `Question` | +| `The registration page crashed, and now I can't create a new account.` | `Problem` | +| `What regions are supported?` | `Question` | +| `I can't remember my password.` | `Problem` | + + + +**Try section** +Paste this message in the **Try** section: + + I'm having trouble registering for a new account. + +Select the model and set parameters, then click **Generate** to see the result\. + +## Extracting details ## + +Extraction tasks can help you to find key terms or mentions in data based on the semantic meaning of words rather than simple text matches\. + +### Sample 2a: Extract details from a complaint ### + +Scenario: Given a complaint from a customer who had trouble booking a flight on a reservation website, identify the factors that contributed to this customer's unsatisfactory experience\. + +**Model choices** +flan\-ul2\-20b, granite\-13b\-instruct\-v2 + +**Decoding** +Greedy\. We need the model to return words that are in the input; the model cannot be creative and make up new words\. + +**Stopping criteria** +The list of extracted factors will not be long, so set the Max tokens parameter to 50\. + +**Prompt text** +Paste this zero\-shot prompt text into the freeform prompt editor in Prompt Lab, select the model, set parameters, and then click **Generate** to see the result\. + + From the following customer complaint, extract all the factors that + caused the customer to be unhappy. + + Customer complaint: + I just tried to book a flight on your incredibly slow website. All + the times and prices were confusing. I liked being able to compare + the amenities in economy with business class side by side. But I + never got to reserve a seat because I didn't understand the seat map. + Next time, I'll use a travel agent! + + Numbered list of all the factors that caused the customer to be unhappy: + +## Generating natural language ## + +Generation tasks are what large language models do best\. Your prompts can help guide the model to generate useful language\. + +### Sample 3a: Generate a numbered list on a particular theme ### + +Scenario: Generate a numbered list on a particular theme\. + +**Model choice** +gpt\-neox\-20b was trained to recognize and handle special characters, such as the newline character, well\. This model is a good choice when you want your generated text to be formatted a specific way with special characters\. + +**Decoding** +Sampling\. This is a creative task\. Set the following parameters: + + + + * Temperature: 0\.7 + * Top P: 1 + * Top K: 50 + * Random seed: 9045 (To get different output each time you click **Generate**, specify a different value for the Random seed parameter or clear the parameter\.) + + + +**Stopping criteria** + + + + * To make sure the model stops generating text after one list, specify a stop sequence of two newline characters\. To do that, click the **Stop sequence** text box, press the Enter key twice, then click **Add sequence**\. + * The list will not be very long, so set the Max tokens parameter to 50\. + + + +**Prompt text** +Paste this few\-shot prompt text into the freeform prompt editor in Prompt Lab, select the model, set parameters, and then click **Generate** to see the result\. + + What are 4 types of dog breed? + 1. Poodle + 2. Dalmatian + 3. Golden retriever + 4. Bulldog + + What are 3 ways to incorporate exercise into your day? + 1. Go for a walk at lunch + 2. Take the stairs instead of the elevator + 3. Park farther away from your destination + + What are 4 kinds of vegetable? + 1. Spinach + 2. Carrots + 3. Broccoli + 4. Cauliflower + + What are the 3 primary colors? + 1. Red + 2. Green + 3. Blue + + What are 3 ingredients that are good on pizza? + +### Sample 3b: Generate a numbered list on a particular theme ### + +Scenario: Generate a numbered list on a particular theme\. + +**Model choice** +gpt\-neox\-20b was trained to recognize and handle special characters, such as the newline character, well\. This model is a good choice when you want your generated text to be formatted in a specific way with special characters\. + +**Decoding** +Sampling\. This scenario is a creative one\. Set the following parameters: + + + + * Temperature: 0\.7 + * Top P: 1 + * Top K: 50 + * Random seed: 9045 (To generate different results, specify a different value for the Random seed parameter or clear the parameter\.) + + + +**Stopping criteria** + + + + * To make sure that the model stops generating text after one list, specify a stop sequence of two newline characters\. To do that, click in the **Stop sequence** text box, press the Enter key twice, then click **Add sequence**\. + * The list will not be long, so set the Max tokens parameter to 50\. + + + +**Set up section** +Paste these headers and examples into the **Examples** area of the **Set up** section: + + + +Table 3\. Generation few\-shot examples + +| **`Input:`** | **`Output:`** | +| -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | +| `What are 4 types of dog breed?` | `1. Poodle 2. Dalmatian 3. Golden retriever 4. Bulldog` | +| `What are 3 ways to incorporate exercise into your day?` | `1. Go for a walk at lunch 2. Take the stairs instead of the elevator 3. Park farther away from your destination` | +| `What are 4 kinds of vegetable?` | `1. Spinach 2. Carrots 3. Broccoli 4. Cauliflower` | +| `What are the 3 primary colors?` | `1. Red 2. Green 3. Blue` | + + + +**Try section** +Paste this input in the **Try** section: + + What are 3 ingredients that are good on pizza? + +Select the model and set parameters, then click **Generate** to see the result\. + +### Sample 3c: Generate a numbered list on a particular theme ### + +Scenario: Ask the model to play devil's advocate\. Describe a potential action and ask the model to list possible downsides or risks that are associated with the action\. + +**Model choice** +Similar to gpt\-neox\-20b, the granite\-13b\-instruct model was trained to recognize and handle special characters, such as the newline character, well\. The granite\-13b\-instruct\-v2 oe granite\-13b\-instruct\-v1 model is a good choice when you want your generated text to be formatted in a specific way with special characters\. + +**Decoding** +Greedy\. The model must return the most predictable content based on what's in the prompt; the model cannot be too creative\. + +**Stopping criteria** +The summary might run several sentences, so set the Max tokens parameter to 60\. + +**Prompt text** +Paste this prompt text into the freeform prompt editor in Prompt Lab, select the model, set parameters, and then click **Generate** to see the result\. + + You are playing the role of devil's advocate. Argue against the proposed plans. List 3 detailed, unique, compelling reasons why moving forward with the plan would be a bad choice. Consider all types of risks. + + Plan we are considering: + Extend our store hours. + Three problems with this plan are: + 1. We'll have to pay more for staffing. + 2. Risk of theft increases late at night. + 3. Clerks might not want to work later hours. + + Plan we are considering: + Open a second location for our business. + Three problems with this plan are: + 1. Managing two locations will be more than twice as time-consuming than managed just one. + 2. Creating a new location doesn't guarantee twice as many customers. + 3. A new location means added real estate, utility, and personnel expenses. + + Plan we are considering: + Refreshing our brand image by creating a new logo. + Three problems with this plan are: + +## Question answering ## + +Question\-answering tasks are useful in help systems and other scenarios where frequently asked or more nuanced questions can be answered from existing content\. + +To help the model return factual answers, implement the retrieval\-augmented generation pattern\. For more information, see [Retrieval\-augmented generation](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-rag.html)\. + +### Sample 4a: Answer a question based on an article ### + +Scenario: The website for an online seed catalog has many articles to help customers plan their garden and ultimately select which seeds to purchase\. A new widget is being added to the website to answer customer questions based on the contents of the article the customer is viewing\. Given a question that is related to an article, answer the question based on the article\. + +**Model choice** +Models that are instruction\-tuned, such as mt0\-xxl\-13b, flan\-t5\-xxl\-11b, or flan\-ul2\-20b, can generally complete this task with this sample prompt\. + +**Decoding** +Greedy\. The answers must be grounded in the facts in the article, and if there is no good answer in the article, the model should not be creative and make up an answer\. + +**Stopping criteria** +To cause the model to return a one\-sentence answer, specify a period "\." as a stop sequence\. The Max tokens parameter can be set to 50\. + +**Prompt text** +Paste this zero\-shot prompt text into the freeform prompt editor in Prompt Lab, select the model, set parameters, and then click **Generate** to see the result\. + + Article: + ### + Tomatoes are one of the most popular plants for vegetable gardens. + Tip for success: If you select varieties that are resistant to + disease and pests, growing tomatoes can be quite easy. For + experienced gardeners looking for a challenge, there are endless + heirloom and specialty varieties to cultivate. Tomato plants come + in a range of sizes. There are varieties that stay very small, less + than 12 inches, and grow well in a pot or hanging basket on a balcony + or patio. Some grow into bushes that are a few feet high and wide, + and can be grown is larger containers. Other varieties grow into + huge bushes that are several feet wide and high in a planter or + garden bed. Still other varieties grow as long vines, six feet or + more, and love to climb trellises. Tomato plants do best in full + sun. You need to water tomatoes deeply and often. Using mulch + prevents soil-borne disease from splashing up onto the fruit when you + water. Pruning suckers and even pinching the tips will encourage the + plant to put all its energy into producing fruit. + ### + + Answer the following question using only information from the article. + Answer in a complete sentence, with proper capitalization and punctuation. + If there is no good answer in the article, say "I don't know". + + Question: Why should you use mulch when growing tomatoes? + Answer: + +You can experiment with asking other questions too, such as: + + + + * How large do tomato plants get? + * Do tomato plants prefer shade or sun? + * Is it easy to grow tomatoes? + + + +Try out\-of\-scope questions too, such as: + + + + * How do you grow cucumbers? + + + +### Sample 4b: Answer a question based on an article ### + +Scenario: The website for an online seed catalog has many articles to help customers plan their garden and ultimately select which seeds to purchase\. A new widget is being added to the website to answer customer questions based on the contents of the article the customer is viewing\. Given a question related to a particular article, answer the question based on the article\. + +**Model choice** +Models that are instruction\-tuned, such as mt0\-xxl\-13b, flan\-t5\-xxl\-11b, or flan\-ul2\-20b, can generally complete this task with this sample prompt\. + +**Decoding** +Greedy\. The answers must be grounded in the facts in the article, and if there is no good answer in the article, the model should not be creative and make up an answer\. + +**Stopping criteria** +To cause the model to return a one\-sentence answer, specify a period "\." as a stop sequence\. The Max tokens parameter can be set to 50\. + +**Set up section** +Paste this text into the **Instruction** area of the **Set up** section: + + Article: + ### + Tomatoes are one of the most popular plants for vegetable gardens. + Tip for success: If you select varieties that are resistant to + disease and pests, growing tomatoes can be quite easy. For + experienced gardeners looking for a challenge, there are endless + heirloom and specialty varieties to cultivate. Tomato plants come + in a range of sizes. There are varieties that stay very small, less + than 12 inches, and grow well in a pot or hanging basket on a balcony + or patio. Some grow into bushes that are a few feet high and wide, + and can be grown is larger containers. Other varieties grow into + huge bushes that are several feet wide and high in a planter or + garden bed. Still other varieties grow as long vines, six feet or + more, and love to climb trellises. Tomato plants do best in full + sun. You need to water tomatoes deeply and often. Using mulch + prevents soil-borne disease from splashing up onto the fruit when you + water. Pruning suckers and even pinching the tips will encourage the + plant to put all its energy into producing fruit. + ### + + Answer the following question using only information from the article. + Answer in a complete sentence, with proper capitalization and punctuation. + If there is no good answer in the article, say "I don't know". + +**Try section** +In the **Try** section, add an extra test row so you can paste each of these two questions in a separate row: + + Why should you use mulch when growing tomatoes? + + How do you grow cucumbers? + +Select the model and set parameters, then click **Generate** to see two results\. + +### Sample 4c: Answer a question based on a document ### + +Scenario: You are creating a chatbot that can answer user questions\. When a user asks a question, you want the agent to answer the question with information from a specific document\. + +**Model choice** +Models that are instruction\-tuned, such as granite\-13b\-instruct\-v2, can complete the task with this sample prompt\. + +**Decoding** +Greedy\. The answers must be grounded in the facts in the document, and if there is no good answer in the article, the model should not be creative and make up an answer\. + +**Stopping criteria** +Use a Max tokens parameter of 50\. + +**Prompt text** +Paste this zero\-shot prompt text into the freeform prompt editor in Prompt Lab, select the model, set parameters, and then click **Generate** to see the result\. + + Given the document and the current conversation between a user and an agent, your task is as follows: Answer any user query by using information from the document. The response should be detailed. + + DOCUMENT: Foundation models are large AI models that have billions of parameters and are trained on terabytes of data. Foundation models can do various tasks, including text, code, or image generation, classification, conversation, and more. Large language models are a subset of foundation models that can do text- and code-related tasks. + DIALOG: USER: What are foundation models? + +### Sample 4d: Answer general knowledge questions ### + +Scenario: Answer general questions about finance\. + +**Model choice** +The granite\-13b\-instruct\-v1 model can be used for multiple tasks, including text generation, summarization, question and answering, classification, and extraction\. + +**Decoding** +Greedy\. This sample is answering questions, so we don't want creative output\. + +**Stopping criteria** +Set the **Max tokens parameter** to 200 so the model can return a complete answer\. + +**Prompt text** +The model was tuned for question\-answering with examples in the following format: + +`<|user|>` +*content of the question* +\`<\|assistant\|> +*new line for the model's answer* + +You can use the exact syntax `<|user|>` and `<|assistant|>` in the lines before and after the question or you can replace the values with equivalent terms, such as `User` and `Assistant`\. + +If you're using version 1, do not include any trailing white spaces after the `<\assistant\>` label, and be sure to add a new line\. + +Paste this prompt text into the freeform prompt editor in Prompt Lab, select the model, set parameters, and then click **Generate** to see the result\. + + <|user|> + Tell me about interest rates + <|assistant|> + +After the model generates an answer, you can ask a follow\-up question\. The model uses information from the previous question when it generates a response\. + + <|user|> + Who sets it? + <|assistant|> + +The model retains information from a previous question when it answers a follow\-up question, but it is not optimized to support an extended dialogue\. + +Note: When you ask a follow\-up question, the previous question is submitted again, which adds to the number of tokens that are used\. + +## Summarization ## + +Summarization tasks save you time by condensing large amounts of text into a few key pieces of information\. + +### Sample 5a: Summarize a meeting transcript ### + +Scenario: Given a meeting transcript, summarize the main points as meeting notes so those notes can be shared with teammates who did not attend the meeting\. + +**Model choice** +Models that are instruction\-tuned can generally complete this task with this sample prompt\. Suggestions: flan\-t5\-xxl\-11b, flan\-ul2\-20b, or mpt\-7b\-instruct2\. + +**Decoding** +Greedy\. The model must return the most predictable content based on what's in the prompt; the model cannot be too creative\. + +**Stopping criteria** +The summary might run several sentences, so set the Max tokens parameter to 60\. + +**Prompt text** +Paste this zero\-shot prompt text into the freeform prompt editor in Prompt Lab, select the model, set parameters, and then click **Generate** to see the result\. + + Summarize the following transcript. + Transcript: + 00:00 [alex] Let's plan the team party! + 00:10 [ali] How about we go out for lunch at the restaurant? + 00:21 [sam] Good idea. + 00:47 [sam] Can we go to a movie too? + 01:04 [alex] Maybe golf? + 01:15 [sam] We could give people an option to do one or the other. + 01:29 [alex] I like this plan. Let's have a party! + Summary: + +### Sample 5b: Summarize a meeting transcript ### + +Scenario: Given a meeting transcript, summarize the main points as meeting notes so those notes can be shared with teammates who did not attend the meeting\. + +**Model choice** +With few\-shot examples, most models can complete this task well\. Try: gpt\-neox\-20b\. + +**Decoding** +Greedy\. The model must return the most predictable content based on what's in the prompt, not be too creative\. + +**Stopping criteria** + + + + * To make sure that the model stops generating text after the summary, specify a stop sequence of two newline characters\. To do that, click in the **Stop sequence** text box, press the Enter key twice, then click **Add sequence**\. + * Set the Max tokens parameter to 60\. + + + +**Prompt text** +Paste this few\-shot prompt text into the freeform prompt editor in Prompt Lab, select the model, set parameters, and then click **Generate** to see the result\. + + Transcript: + 00:00 [sam] I wanted to share an update on project X today. + 00:15 [sam] Project X will be completed at the end of the week. + 00:30 [erin] That's great! + 00:35 [erin] I heard from customer Y today, and they agreed to buy our product. + 00:45 [alex] Customer Z said they will too. + 01:05 [sam] Great news, all around. + Summary: + Sam shared an update that project X will be complete at the end of the week. + Erin said customer Y will buy our product. And Alex said customer Z will buy + our product too. + + Transcript: + 00:00 [ali] The goal today is to agree on a design solution. + 00:12 [alex] I think we should consider choice 1. + 00:25 [ali] I agree + 00:40 [erin] Choice 2 has the advantage that it will take less time. + 01:03 [alex] Actually, that's a good point. + 01:30 [ali] So, what should we do? + 01:55 [alex] I'm good with choice 2. + 02:20 [erin] Me too. + 02:45 [ali] Done! + Summary: + Alex suggested considering choice 1. Erin pointed out choice two will take + less time. The team agreed with choice 2 for the design solution. + + Transcript: + 00:00 [alex] Let's plan the team party! + 00:10 [ali] How about we go out for lunch at the restaurant? + 00:21 [sam] Good idea. + 00:47 [sam] Can we go to a movie too? + 01:04 [alex] Maybe golf? + 01:15 [sam] We could give people an option to do one or the other. + 01:29 [alex] I like this plan. Let's have a party! + Summary: + +### Sample 5c: Summarize a meeting transcript ### + +Scenario: Given a meeting transcript, summarize the main points in a bulleted list so that the list can be shared with teammates who did not attend the meeting\. + +**Model choice** +gpt\-neox\-20b was trained to recognize and handle special characters, such as the newline character, well\. This model is a good choice when you want your generated text to be formatted in a specific way with special characters\. + +**Decoding** +Greedy\. The model must return the most predictable content based on what's in the prompt; the model cannot be too creative\. + +**Stopping criteria** + + + + * To make sure that the model stops generating text after one list, specify a stop sequence of two newline characters\. To do that, click in the **Stop sequence** text box, press the Enter key twice, then click **Add sequence**\. + * Set the Max tokens parameter to 60\. + + + +**Set up section** +Paste these headers and examples into the **Examples** area of the **Set up** section: + + + +Table 4\. Summarization few\-shot examples + +| **`Transcript:`** | **`Summary:`** | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `00:00 [sam] I wanted to share an update on project X today. 00:15 [sam] Project X will be completed at the end of the week. 00:30 [erin] That's great! 00:35 [erin] I heard from customer Y today, and they agreed to buy our product. 00:45 [alex] Customer Z said they will too. 01:05 [sam] Great news, all around.` | `- Sam shared an update that project X will be complete at the end of the week - Erin said customer Y will buy our product - And Alex said customer Z will buy our product too` | +| `00:00 [ali] The goal today is to agree on a design solution. 00:12 [alex] I think we should consider choice 1. 00:25 [ali] I agree 00:40 [erin] Choice 2 has the advantage that it will take less time. 01:03 [alex] Actually, that's a good point. 01:30 [ali] So, what should we do? 01:55 [alex] I'm good with choice 2. 02:20 [erin] Me too. 02:45 [ali] Done!` | `- Alex suggested considering choice 1 - Erin pointed out choice two will take less time - The team agreed with choice 2 for the design solution` | + + + +**Try section** +Paste this message in the **Try** section: + + 00:00 [alex] Let's plan the team party! + 00:10 [ali] How about we go out for lunch at the restaurant? + 00:21 [sam] Good idea. + 00:47 [sam] Can we go to a movie too? + 01:04 [alex] Maybe golf? + 01:15 [sam] We could give people an option to do one or the other. + 01:29 [alex] I like this plan. Let's have a party! + +Select the model and set parameters, then click **Generate** to see the result\. + +## Code generation and conversion ## + +Foundation models that can generate and convert programmatic code are great resources for developers\. They can help developers to brainstorm and troubleshoot programming tasks\. + +### Sample 6a: Generate programmatic code from instructions ### + +Scenario: You want to generate code from instructions\. Namely, you want to write a function in the Python programming language that returns a sequence of prime numbers that are lower than the number that is passed to the function as a variable\. + +**Model choice** +Models that can generate code, such as starcoder\-15\.5b, can generally complete this task when a sample prompt is provided\. + +**Decoding** +Greedy\. The answer must be a valid code snippet\. The model cannot be creative and make up an answer\. + +**Stopping criteria** +To stop the model after it returns a single code snippet, specify `` as the stop sequence\. The Max tokens parameter can be set to 1,000\. + +**Prompt text** +Paste this code snippet into the freeform prompt editor in Prompt Lab, select the model, set parameters, and then click **Generate** to see the result\. + + Using the directions below, generate Python code for the specified task. + + Input: + # Write a Python function that prints 'Hello World!' string 'n' times. + + Output: + def print_n_times(n): + for i in range(n): + print("Hello World!") + + + + Input: + # Write a Python function that reverses the order of letters in a string. + # The function named 'reversed' takes the argument 'my_string', which is a string. It returns the string in reverse order. + + Output: + +The output contains Python code similar to the following snippet: + + def reversed(my_string): + return my_string[::-1] + +Be sure to test the generated code to verify that it works as you expect\. + +For example, if you run `reversed("good morning")`, the result is `'gninrom doog'`\. + +Note: The StarCoder model might generate code that is taken directly from its training data\. As a result, generated code might require attribution\. You are responsible for ensuring that any generated code that you use is properly attributed, if necessary\. + +### Sample 6b: Convert code from one programming language to another ### + +Scenario: You want to convert code from one programming language to another\. Namely, you want to convert a code snippet from C\+\+ to Python\. + +**Model choice** +Models that can generate code, such as starcoder\-15\.5b, can generally complete this task when a sample prompt is provided\. + +**Decoding** +Greedy\. The answer must be a valid code snippet\. The model cannot be creative and make up an answer\. + +**Stopping criteria** +To stop the model after it returns a single code snippet, specify `` as the stop sequence\. The Max tokens parameter can be set to 300\. + +**Prompt text** +Paste this code snippet into the freeform prompt editor in Prompt Lab, select the model, set parameters, and then click **Generate** to see the result\. + +This prompt includes an example input and output pair\. The input is C\+\+ code and the output is the equivalent function in Python code\. + +The C\+\+ code snippet to be converted is included next\. It is a function that counts the number of arithmetic progressions with the sum `S` and common difference of `D`, where `S` and `D` are integer values that are passed as parameters\. + +The final part of the prompt identifies the language that you want the C\+\+ code snippet to be converted into\. + + Translate the following code from C++ to Python. + + C++: + #include "bits/stdc++.h" + using namespace std; + bool isPerfectSquare(long double x) { + long double sr = sqrt(x); + return ((sr - floor(sr)) == 0); + } + void checkSunnyNumber(int N) { + if (isPerfectSquare(N + 1)) { + cout << "Yes + "; + } else { + cout << "No + "; + } + } + int main() { + int N = 8; + checkSunnyNumber(N); + return 0; + } + + Python: + from math import * + + def isPerfectSquare(x): + sr = sqrt(x) + return ((sr - floor(sr)) == 0) + + def checkSunnyNumber(N): + if (isPerfectSquare(N + 1)): + print("Yes") + else: + print("No") + + if __name__ == '__main__': + N = 8 + checkSunnyNumber(N) + + + + C++: + #include + using namespace std; + int countAPs(int S, int D) { + S = S * 2; + int answer = 0; + for (int i = 1; i <= sqrt(S); i++) { + if (S % i == 0) { + if (((S / i) - D * i + D) % 2 == 0) + answer++; + if ((D * i - (S / i) + D) % 2 == 0) + answer++; + } + } + return answer; + } + int main() { + int S = 12, D = 1; + cout << countAPs(S, D); + return 0; + } + + Python: + +The output contains Python code similar to the following snippet: + + from math import * + + def countAPs(S, D): + S = S * 2 + answer = 0 + for i in range(1, int(sqrt(S)) + 1): + if (S % i == 0): + if (((S / i) - D * i + D) % 2 == 0): + answer += 1 + if ((D * i - (S / i) + D) % 2 == 0): + answer += 1 + return answer + + if __name__ == '__main__': + S = 12 + D = 1 + print(countAPs(S, D)) + +The generated Python code functions the same as the C\+\+ function included in the prompt\. + +Test the generated Python code to verify that it works as you expect\. + +Remember, the StarCoder model might generate code that is taken directly from its training data\. As a result, generated code might require attribution\. You are responsible for ensuring that any generated code that you use is properly attributed, if necessary\. + +## Dialogue ## + +Dialogue tasks are helpful in customer service scenarios, especially when a chatbot is used to guide customers through a workflow to reach a goal\. + +### Sample 7a: Converse in a dialogue ### + +Scenario: Generate dialogue output like a chatbot\. + +**Model choice** +Like other foundation models, granite\-13b\-chat can be used for multiple tasks\. However, it is optimized for carrying on a dialogue\. + +**Decoding** +Greedy\. This sample is answering general knowledge, factual questions, so we don't want creative output\. + +**Stopping criteria** + + + + * A helpful feature of the model is the inclusion of a special token that is named `END_KEY` at the end of each response\. When some generative models return a response to the input in fewer tokens than the maximum number allowed, they can repeat patterns from the input\. This model prevents such repetition by incorporating a reliable stop sequence for the prompt\. Add `END_KEY` as the stop sequence\. + * Set the **Max tokens parameter** to 200 so the model can return a complete answer\. + + + +**Prompt text** +The model expects the input to follow a specific pattern\. + +Start the input with an instruction\. For example, the instruction might read as follows: + +Participate in a dialogue with various people as an AI assistant\. As the Assistant, you are upbeat, professional, and polite\. You do your best to understand exactly what the human needs and help them to achieve their goal as best you can\. You do not give false or misleading information\. If you don't know an answer, you state that you don't know or aren't sure about the right answer\. You prioritize caution over usefulness\. You do not answer questions that are unsafe, immoral, unethical, or dangerous\. + +Next, add lines to capture the question and answer pattern with the following syntax: + +Human: +*content of the question* +Assistant: +*new line for the model's answer* + +You can replace the terms *Human* and *Assistant* with other terms\. + +If you're using version 1, do not include any trailing white spaces after the *Assistant:* label, and be sure to add a new line\. + +Paste the following prompt text into the freeform prompt editor in Prompt Lab, select the model, set parameters, and then click **Generate** to see the result\. + + Participate in a dialogue with various people as an AI assistant. As the Assistant, you are upbeat, professional, and polite. You do your best to understand exactly what the human needs and help them to achieve their goal as best you can. You do not give false or misleading information. You prioritize caution over usefulness. You do not answer questions that are unsafe, immoral, unethical, or dangerous. + + Human: How does a bill become a law? + Assistant: + +After the initial output is generated, continue the dialogue by asking a follow\-up question\. For example, if the output describes how a bill becomes a law in the United States, you can ask about how laws are made in other countries\. + + Human: What about in Canada? + Assistant: + +A few notes about using this sample with the model: + + + + * The prompt input outlines the chatbot scenario and describes the personality of the AI assistant\. The description explains that the assistant should indicate when it doesn't know an answer\. It also directs the assistant to avoid discussing unethical topics\. + * The assistant is able to respond to a follow\-up question that relies on information from an earlier exchange in the same dialogue\. + * The model expects the input to follow a specific pattern\. + * The generated response from the model is clearly indicated by the keyword `END_KEY`\. You can use this keyword as a stop sequence to help the model generate succinct responses\. + + + +### Sample 7b: Converse in a dialogue ### + +Scenario: Generate dialogue output like a chatbot\. + +**Model choice** +Like other foundation models, Llama 2 (in both the 70 billion and 13 billion sizes) can be used for multiple tasks\. But both Llama 2 models are optimized for dialogue use cases\. The llama\-2\-70b\-chat and llama\-2\-13b\-chat are the only models in watsonx\.ai that are fine\-tuned for the `[INST]<><>[/INST]` prompt format\. For more information about this prompt format, see [How to prompt Llama 2](https://huggingface.co/blog/llama2#how-to-prompt-llama-2)\. + +**Decoding** +Greedy\. This sample is answering general knowledge, factual questions, so we don't want creative output\. + +**Stopping criteria** +Set the Max tokens parameter to 100\. + +The template for Llama 2 uses an end\-of\-string (EOS) token (``) to delimit the end of the agent's response\. The model output stops generating text when the `` EOS token is encountered\. + +**Prompt text** +Paste this prompt text into the freeform prompt editor in Prompt Lab, select the model, set parameters, and then click **Generate** to see the result\. + + [INST] <> + You are a helpful assistant. Begin each response with the phrase "Dear user, ". If you are unsure about an answer, truthfully say "I don't know"<> + + I have a question about the Earth.[/INST] + Dear user, go on. + [INST] + + How many moons are there? + [/INST] + +After the initial output is generated, continue the dialogue to ask about more planets, wrapping your user messages in the same `[INST]` structure\. You don't need to add an `` token to the start of follow\-up questions\. + +The output looks something like this: + + [INST] <> + You are a helpful assistant. Begin each response with the phrase "Dear user, ". If you are unsure about an answer, truthfully say "I don't know"<> + + I have a question about the Earth.[/INST] + Dear user, go on. + [INST] + + How many moons are there? + [/INST] + Dear user, the Earth has one natural satellite, commonly referred to as the Moon. + [INST] + + What about Saturn? + [/INST] + Dear user, Saturn has a total of 62 confirmed moons, as well as numerous smaller moonlets and ring particles. The largest moon of Saturn is Titan, which is the second-largest moon in the solar system, after Jupiter's moon Ganymede. + [INST] + + And Mars? + [/INST] + Dear user, Mars has two small natural satellites, Phobos and Deimos. Both moons are thought to be captured asteroids, and are irregularly shaped and very small, with diameters of about 22 kilometers and 12 kilometers respectively. + +Notice a few important points about the output that the model generates as you go: + + + + * The so\-called *system instruction*, in the `<><>` tags, continues to influence the output at each dialogue turn without having to repeat the system instruction\. In other words, the *assistant responses* continue to be prepended with "Dear user, "\. + * In true dialogue fashion, the assistant response to the *user input* "How many moons are there?" takes into account the previous user input "I have a question about the Earth\." and returns the number of moons orbiting Earth\. + * Also in proper dialogue form, the assistant responses continue to follow the topic of the conversation, which is the number of moons\. (Otherwise, the generated output to the vague user message "And Mars?" could wander off in any direction\.) + * Caution: Newline (carriage\-return) characters especially, and spaces to a lesser extent, in the prompt text can have a dramatic impact on the output generated\. + * When you use Llama 2 for chat use cases, follow the recommended prompt template format as closely as possible\. Do not use the `[INST]<><>[/INST]` prompt format when you use Llama 2 for any other tasks besides chat\. + + + +**Parent topic:**[Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e5e1d00dc75181ede4fc66bdc17bf3c07eb314ec.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e5e1d00dc75181ede4fc66bdc17bf3c07eb314ec.md new file mode 100644 index 0000000..fd0440a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e5e1d00dc75181ede4fc66bdc17bf3c07eb314ec.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Improper usage # + +![icon for value alignment risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-value-alignment.svg)Risks associated with outputValue alignmentNew + +### Description ### + +Using a model for a purpose the model was not designed for might result in inaccurate or undesired behavior\. Without proper documentation of the model purpose and constraints, models can be used or repurposed for tasks for which they are not suited\. + +### Why is improper usage a concern for foundation models? ### + +Reusing a model without understanding its original data, design intent, and goals might result in unexpected and unwanted model behaviors\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e5ea38444d60150c0fd2eb498bf33793dde5fed2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e5ea38444d60150c0fd2eb498bf33793dde5fed2.md new file mode 100644 index 0000000..cc15ca5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e5ea38444d60150c0fd2eb498bf33793dde5fed2.md @@ -0,0 +1,70 @@ +# Language support for the product and the documentation + +# Language support for the product and the documentation # + +IBM watsonx is translated into multiple languages\. + +## Supported languages ## + +The IBM watsonx user interface is translated into these languages: + + + + * Brazilian Portuguese + * Simplified Chinese + * Traditional Chinese + * French + * German + * Italian + * Japanese + * Korean + * Spanish + * Swedish + + + +The documentation is automatically translated into these languages: + + + + * Brazilian Portuguese + * Simplified Chinese + * French + * German + * Italian + * Japanese + * Korean + * Spanish + + + +IBM is not responsible for any damages or losses resulting from the use of automatically (machine) translated content\. + +When the translated documentation is not as current as the English content, you see a message and have the option of switching to the English content\. + +## Changing languages ## + +To change the language for this documentation, scroll to the end of any documentation page, and select a language from the language selector\. + +![Screen capture of the language switcher](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lang-switcher.png) + +To change the language for both the product user interface and this documentation, select a different language for your browser: + + + + * In the Google Chrome browser, you can change the language in the advanced settings\. + * In the Mozilla Firefox browser, you can change the language in the general settings\. + + + +## Learn more ## + + + + * [Browser support](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/browser-support.html) + + + +**Parent topic:**[FAQ](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e61658d2ba7d0d13e5a6008e28670d1b1f6cb7bb.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e61658d2ba7d0d13e5a6008e28670d1b1f6cb7bb.md new file mode 100644 index 0000000..8c5a623 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e61658d2ba7d0d13e5a6008e28670d1b1f6cb7bb.md @@ -0,0 +1,21 @@ +# Hidden variables + +# Hidden variables # + +You can hide data by creating Private variables\. Private variables can be accessed only by the class itself\. If you declare names of the form `__xxx` or `__xxx_yyy`, that is with two preceding underscores, the Python parser will automatically add the class name to the declared name, creating hidden variables\. For example: + + class MyClass: + __attr = 10 #private class attribute + + def method1(self): + pass + + def method2(self, p1, p2): + pass + + def __privateMethod(self, text): + self.__text = text #private attribute + +Unlike in Java, in Python all references to instance variables must be qualified with `self`; there's no implied use of `this`\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e64b1811e55868cf510b06bfd1a24ba4ac3008f1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e64b1811e55868cf510b06bfd1a24ba4ac3008f1.md new file mode 100644 index 0000000..973e775 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e64b1811e55868cf510b06bfd1a24ba4ac3008f1.md @@ -0,0 +1,26 @@ +# Federated Learning Tensorflow samples + +# Federated Learning Tensorflow samples # + +Download and review sample files that show how to run a Federated Learning experiment by using API calls with a Tensorflow Keras model framework\. + +To see a step\-by\-step UI driven approach rather than sample files, see the [Federated Learning Tensorflow tutorial for UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-tf2-tutorial.html)\. + +## Download the Federated Learning sample files ## + +The Federated Learning sample has two parts, both in Jupyter Notebook format that can run in the latest Python environment\. + +For single\-user demonstrative purposes, the Notebooks are placed in a project\. Access the [Federated Learning project](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/cab78523832431e767c41527a42a6727), and click **Create project** to get all the sample files at once\. + +You can also get the Notebook separately\. Since, for practical purposes of Federated Learning, one user would run the admin Notebook and multiple users would run the party Notebook\. For more details on the admin and party, see [Terminology](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-term.html)\. + + + +1. [Federated Learning Tensorflow Demo Part 1 \- for Admin](https://github.com/IBMDataScience/sample-notebooks/blob/master/CloudPakForData/notebooks/4.7/Federated_Learning_TF_Demo_Part_1.ipynb) +2. [Federated Learning Tensorflow Demo Part 2 \- for Party](https://github.com/IBMDataScience/sample-notebooks/blob/master/CloudPakForData/notebooks/4.7/Federated_Learning_TF_Demo_Part_2.ipynb) + + + +**Parent topic:**[Federated Learning tutorial and samples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-demo.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e6a2ef28a33aa6a8c8b2321133a8816257cd1612.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e6a2ef28a33aa6a8c8b2321133a8816257cd1612.md new file mode 100644 index 0000000..fc131bc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e6a2ef28a33aa6a8c8b2321133a8816257cd1612.md @@ -0,0 +1,34 @@ +# Reusing a project asset in Resource editor + +# Reusing a project asset in Resource editor # + +From the Text Analytics Workbench, you can save a template or library as a project asset\. You can then use the template or library in other Text Mining nodes by loading it in the Resource editor\. + +## Procedure ## + + + +1. Save a library or template in Text Analytics Workbench\. + + + + 1. On the Resource Editor tab, select the template or library to save. + 2. Click the Options icon and select Save as project asset. + 3. Enter details about the asset, and click Submit. + + + +2. Load a library or template in a different Text Analytics Workbench\. + + + + 1. On the Resource Editor tab, open the toolbar menu for your current template or library. + 2. Click the Options icon and select Load library or Change template. + 3. Find your library or template and select it. + 4. Click Apply. + + + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e6a30655cbd3745acbcbf18e79b4c3979ca6b35b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e6a30655cbd3745acbcbf18e79b4c3979ca6b35b.md new file mode 100644 index 0000000..5132239 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e6a30655cbd3745acbcbf18e79b4c3979ca6b35b.md @@ -0,0 +1,36 @@ +# Managing your IBM Cloud account + +# Managing your IBM Cloud account # + +You can manage your IBM Cloud account to view billing and usage, manage account users, and manage services\. + +**Required permissions** : You must be the IBM Cloud account owner or administrator\. + +To manage your IBM Cloud account, choose **Administration > Account and billing > Account > Manage in IBM Cloud** from IBM watsonx\. Then from the IBM Cloud console, choose an option from the **Manage** menu\. + + + + * Account: See [Adding orgs and spaces](https://cloud.ibm.com/docs/account?topic=account-orgsspacesusers#orgsspacesusers) and [Managing resource groups](https://cloud.ibm.com/docs/account?topic=account-rgs)\. + * Billing and Usage: See [How you're charged](https://cloud.ibm.com/docs/billing-usage?topic=billing-usage-charges#charges)\. + * Access (IAM): See [Inviting users](https://cloud.ibm.com/docs/account?topic=account-access-getstarted)\. + + + +## Learn more ## + + + + * [Activity Tracker events](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/at-events.html) + * [Manage your settings](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/personal-settings.html) + * [Set up IBM watsonx for your organization](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-platform.html) + * [Manage users and access](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-access.html) + * [IBM Cloud SAML Federation Guide](https://www.ibm.com/cloud/blog/ibm-cloud-saml-federation-guide) + * [Delete your IBM Cloud account](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_console.html#deletecloud) + * [Check the status of IBM Cloud services](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/service-status.html) + * [Configure private service endpoints](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/endpoints-vrf.html) + + + +**Parent topic:**[Administration](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/administer-accounts.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e6b5ead096e68a255c5526add4c828534891c090.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e6b5ead096e68a255c5526add4c828534891c090.md new file mode 100644 index 0000000..8881267 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e6b5ead096e68a255c5526add4c828534891c090.md @@ -0,0 +1,17 @@ +# Gaussian Mixture node (SPSS Modeler) + +# Gaussian Mixture node # + +A Gaussian Mixture© model is a probabilistic model that assumes all the data points are generated from a mixture of a finite number of Gaussian distributions with unknown parameters\. + +One can think of mixture models as generalizing k\-means clustering to incorporate information about the covariance structure of the data as well as the centers of the latent Gaussians\.^1^ + +The Gaussian Mixture node in watsonx\.ai exposes the core features and commonly used parameters of the Gaussian Mixture library\. The node is implemented in Python\. + +For more information about Gaussian Mixture modeling algorithms and parameters, see [Gaussian Mixture Models](http://scikit-learn.org/stable/modules/mixture.html) and [Gaussian Mixture](https://scikit-learn.org/stable/modules/generated/sklearn.mixture.GaussianMixture.html)\. ^2^ + +^1^ [User Guide\.](https://scikit-learn.org/stable/modules/mixture.html)*Gaussian mixture models*\. Web\. © 2007 \- 2017\. scikit\-learn developers\. + +^2^ [Scikit\-learn: Machine Learning in Python](http://jmlr.csail.mit.edu/papers/v12/pedregosa11a.html), Pedregosa *et al\.*, JMLR 12, pp\. 2825\-2830, 2011\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e700c898ec2efe96c76c2cac042e063529b23d3b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e700c898ec2efe96c76c2cac042e063529b23d3b.md new file mode 100644 index 0000000..697b4ed --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e700c898ec2efe96c76c2cac042e063529b23d3b.md @@ -0,0 +1,93 @@ +# Dremio connection + +# Dremio connection # + +To access your data in Dremio, create a connection asset for it\. + +Dremio is an open data lake platform\. It supports all the major third\-party data sources\. + +## Create a connection to Dremio ## + +To create the connection asset, you need these connection details: + + + + * Username and password + * Hostname: You can create a Dremio Cloud instance only in the European Union (EU) or the United States (US)\. Use `sql.dremio.cloud` for the US, and use `sql.eu.dremio.cloud` for the EU\. Dremio Software can be hosted anywhere\. + * Port number: The default port for Dremio Cloud instances is `443` and for Dremio Software it is `31010`\. + * Dremio Cloud Project ID: See [Obtaining the ID of a Project](https://docs.dremio.com/cloud/cloud-entities/projects/.#obtaining-the-id-of-a-project)\. + * SSL certificate: + + + + * Select `Port is SSL-enabled` if you provided `Dremio Cloud Project ID`. + * Select `Port is SSL-enabled` and provide `SSL Certificate` if you want to connect to Dremio Software with SSL. + + + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** +Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** +Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use the Dremio connection in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Dremio setup ## + +Dremio can be set up in various deployments, see [Dremio Cluster Deployment](https://docs.dremio.com/current/get-started/cluster-deployments/)\. To set up Dremio Cloud, see [Dremio Cloud](https://docs.dremio.com/cloud/)\. + +## Restrictions ## + +You can use this connection only for reading data\. You cannot write data or export data with this connection\. + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [Dremio SQL Reference](https://docs.dremio.com/software/sql-reference/) for the correct syntax\. + +## Learn more ## + + + + * [Dremio Software documentation](https://docs.dremio.com/current/) + * [Dremio Cloud documentation](https://docs.dremio.com/cloud/) + + + +**Parent topic**: [Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e70109f320a53829d66f6e07ee0a9b79b59aee13.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e70109f320a53829d66f6e07ee0a9b79b59aee13.md new file mode 100644 index 0000000..cb9abf2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e70109f320a53829d66f6e07ee0a9b79b59aee13.md @@ -0,0 +1,45 @@ +# Your sandbox project + +# Your sandbox project # + +A project is where you work with data and models by using tools\. When you sign up for watsonx\.ai, your sandbox project is created automatically, and you can start working in it immediately\. + +Initially, your sandbox project is empty\. To start working, click a task tile on the home page or go to the **Assets** page in your project, click **New asset**, and select a task\. Each task can result in an asset that is saved in the project\. Many tasks include samples that you can use\. You can find sample prompts, notebooks, data sets, and other assets in the Samples from the home page\. You can share your work by [adding collaborators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html) to your project\. If you need to work with data, you can [add data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html) to your project\. + +If your sandbox project is your only project, then any task that you select occurs in the context of your sandbox project\. When you have multiple projects, you can change the default project by selecting a project from the **Open in** list on the home page\. + +Other projects that you create have the same functionality as your sandbox project, except that your Watson Machine Learning service instance is automatically associated with your sandbox project\. You must manually associate your Watson Machine Learning service instance with other projects\. + +## Manually creating a sandbox project ## + +If you switch from Cloud Pak for Data as a Service to watsonx, you can create a sandbox project from the watsonx home page when the following conditions are met: + + + + * You have one or more instances of the Watson Machine Learning service\. + * You have exactly one instance of the IBM Cloud Object Storage service\. + + + +To manually create a sandbox project, click **Create sandbox** in the **Projects** section\. + +Otherwise, you can create a different project\. See [Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html)\. You are guided through associating a Watson Machine Learning service with the project when you open certain tools\. + +You can switch an existing project from the Cloud Pak for Data as a Service to watsonx\. See [Switching the platform for a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/switch-platform.html)\. + +## Learn more ## + + + + * [Asset types and properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html) + * [Adding collaborators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html) + * [Add data assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html) + * [Manage assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-assets.html) + * [Adding associated services to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assoc-services.html) + * [Object storage for workspaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/storage-options.html) + + + +**Parent topic:**[Projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e73062f1e8466ab5604358a0ad0d66f31c81507c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e73062f1e8466ab5604358a0ad0d66f31c81507c.md new file mode 100644 index 0000000..9e4880c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e73062f1e8466ab5604358a0ad0d66f31c81507c.md @@ -0,0 +1,47 @@ +# Setting up temporary credentials or a Role ARN for Amazon S3 + +# Setting up temporary credentials or a Role ARN for Amazon S3 # + +Instead of adding another IAM user to your Amazon S3 account, you can grant them access with temporary security credentials and a Session token\. Or, you can create a Role ARN (Amazon Resource Name) and then grant permission to that role to access the account\. The trusted user can then use the role\. + +You can assign role policies to the temporary credentials to limit the permissions\. For example, you can assign read\-only access or access to a particular S3 bucket\. + +**Prerequisite**: You must be the IAM owner of the Amazon S3 account\. + +You can set up one of the following authentication combinations: + + + + * **Access key**, **Secret key**, and **Session token** + * **Access key**, **Secret key**, **Role ARN**, **Role session name**, and optional **Duration seconds** + * **Access key**, **Secret key**, **Role ARN**, **Role session name**, **External ID**, and optional **Duration seconds** + + + +## Access key, Secret key, and Session token ## + +Use the AWS Security Token Service (AWS STS) operations in the AWS API to obtain temporary security credentials\. These credentials consist of an Access key, a Secret key, and a Session token that expires within a configurable amount of time\. For instructions, see the AWS documentation: [Requesting temporary security credentials](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html)\. + +## Access key, Secret key, Role ARN, Role session name, and optional Duration seconds ## + +If someone else has their own S3 account, you can create a temporary role for that person to access your S3 account\. Create the role either with the AWS Management Console or the AWS CLI\. See [Creating a role to delegate permissions to an IAM user](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html) + +The **Role ARN** is the Amazon Resource Name for connection's role\. +The **Role session name** identifies the session to S3 administrators\. For example, your IAM username\. +The **Duration seconds** parameter is optional\. The minimum is 15 minutes\. The maximum is 36 hours, the default is 1 hour\. The duration seconds timer starts every time that the connection is established\. + +You then provide values for the **Access key**, **Secret key**, **Role ARN**, **Role session name**, and optional **Duration seconds** to the user who will create the connection\. + +## Access key, Secret key, Role ARN, Role session name, External ID, and optional Duration seconds ## + +If someone else has their own S3 account, you can create a temporary role for that person to access your S3 account\. With this combination, the **External ID** is a unique string that you specify and that the user must enter for extra security\. First, create the role either with the AWS Management Console or the AWS CLI\. See [Creating a role to delegate permissions to an IAM user](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)\. To create the External ID, see [How to use an external ID when granting access to your AWS resources to a third party](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html)\. + +You then provide the values for the **Access key**, **Secret key**, **Role ARN**, **Role session name**, **External ID**, and optional **Duration seconds** to the user who will create the connection\. + +## Learn more ## + +[Amazon Resource Names (ARNs)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) + +**Parent topic:**[Amazon S3 connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-amazon-s3.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e732dfb3c4f38abecba99da31750fb6291560db5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e732dfb3c4f38abecba99da31750fb6291560db5.md new file mode 100644 index 0000000..f8f0487 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e732dfb3c4f38abecba99da31750fb6291560db5.md @@ -0,0 +1,19 @@ +# Firewall access for Watson Machine Learning + +# Firewall access for Watson Machine Learning # + +To allow Watson Machine Learning to access data that is located behind a firewall, you add the appropriate IP addresses for your region to the inbound rules for your firewall\. + +## Dallas (us\-south) ## + + + + * dal10 \- 169\.60\.39\.152/29 + * dal12 \- 169\.48\.198\.96/29 + * dal13 \- 169\.61\.47\.128/29,169\.62\.162\.88/29 + + + +**Parent topic:**[Configuring firewall access](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall_ovrvw.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e76a86b7ee87a78fa06482285bad02694abcc3ca.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e76a86b7ee87a78fa06482285bad02694abcc3ca.md new file mode 100644 index 0000000..e786e70 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e76a86b7ee87a78fa06482285bad02694abcc3ca.md @@ -0,0 +1,197 @@ +# Watson Studio environments compute usage + +# Watson Studio environments compute usage # + +Compute usage is calculated by the number of capacity unit hours (CUH) consumed by an active environment runtime in Watson Studio\. Watson Studio plans govern how you are billed monthly for the resources you consume\. + + + +Capacity units included in each plan per month + +| Feature | Lite | Professional | Standard (legacy) | Enterprise (legacy) | +| ---------------- | --------------------- | --------------------------------------------- | ------------------------------------- | --------------------------------------- | +| Processing usage | 10 CUH
per month | Unlimited CUH
billed for usage per month | 10 CUH per month
\+ pay for more | 5000 CUH per month
\+ pay for more | + + + + + +Capacity units included in each plan per month + +| Feature | Lite | Professional | +| ---------------- | ---------------- | --------------------------------------------- | +| Processing usage | 10 CUH per month | Unlimited CUH
billed for usage per month | + + + +## Capacity units per hour for notebooks ## + + + +Notebooks + +| Capacity type | Language | Capacity units per hour | +| ------------------------------------------------------------- | ----------------------------------- | --------------------------------------------- | +| 1 vCPU and 4 GB RAM | Python
R | 0\.5 | +| 2 vCPU and 8 GB RAM | Python
R | 1 | +| 4 vCPU and 16 GB RAM | Python
R | 2 | +| 8 vCPU and 32 GB RAM | Python
R | 4 | +| 16 vCPU and 64 GB RAM | Python
R | 8 | +| Driver: 1 vCPU and 4 GB RAM; 1 Executor: 1 vCPU and 4 GB RAM | Spark with Python
Spark with R | 1
CUH per additional executor is 0\.5 | +| Driver: 1 vCPU and 4 GB RAM; 1 Executor: 2 vCPU and 8 GB RAM | Spark with Python
Spark with R | 1\.5
CUH per additional executor is 1 | +| Driver: 2 vCPU and 8 GB RAM; 1 Executor: 1 vCPU and 4 GB RAM; | Spark with Python
Spark with R | 1\.5
CUH per additional executor is 0\.5 | +| Driver: 2 vCPU and 8 GB RAM; 1 Executor: 2 vCPU and 8 GB RAM; | Spark with Python
Spark with R | 2
CUH per additional executor is 1 | + + + +The rate of capacity units per hour consumed is determined for: + + + + * Default Python or R environments by the hardware size and the number of users in a project using one or more runtimes + + For example: The `IBM Runtime 22.2 on Python 3.10 XS` with 2 vCPUs will consume 1 CUH if it runs for one hour. If you have a project with 7 users working on notebooks 8 hours a day, 5 days a week, all using the `IBM Runtime 22.2 on Python 3.10 XS` environment, and everyone shuts down their runtimes when they leave in the evening, runtime consumption is `5 x 7 x 8 = 280 CUH per week`. + + The CUH calculation becomes more complex when different environments are used to run notebooks in the same project and if users have multiple active runtimes, all consuming their own CUHs. Additionally, there might be notebooks, which are scheduled to run during off-hours, and long-running jobs, likewise consuming CUHs. + * Default Spark environments by the hardware configuration size of the driver, and the number of executors and their size\. + + + +## Capacity units per hour for notebooks with Decision Optimization ## + +The rate of capacity units per hour consumed is determined by the hardware size and the price for Decision Optimization\. + + + +Decision Optimization notebooks + +| Capacity type | Language | Capacity units per hour | +| --------------------- | ------------------------------- | ----------------------- | +| 1 vCPU and 4 GB RAM | Python \+ Decision Optimization | 0\.5 \+ 5 = 5\.5 | +| 2 vCPU and 8 GB RAM | Python \+ Decision Optimization | 1 \+ 5 = 6 | +| 4 vCPU and 16 GB RAM | Python \+ Decision Optimization | 2 \+ 5 = 7 | +| 8 vCPU and 32 GB RAM | Python \+ Decision Optimization | 4 \+ 5 = 9 | +| 16 vCPU and 64 GB RAM | Python \+ Decision Optimization | 8 \+ 5 = 13 | + + + +## Capacity units per hour for notebooks with Watson Natural Language Processing ## + +The rate of capacity units per hour consumed is determined by the hardware size and the price for Watson Natural Language Processing\. + + + +Watson Natural Language Processing notebooks + +| Capacity type | Language | Capacity units per hour | +| --------------------- | -------------------------------------------- | ----------------------- | +| 1 vCPU and 4 GB RAM | Python \+ Watson Natural Language Processing | 0\.5 \+ 5 = 5\.5 | +| 2 vCPU and 8 GB RAM | Python \+ Watson Natural Language Processing | 1 \+ 5 = 6 | +| 4 vCPU and 16 GB RAM | Python \+ Watson Natural Language Processing | 2 \+ 5 = 7 | +| 8 vCPU and 32 GB RAM | Python \+ Watson Natural Language Processing | 4 \+ 5 = 9 | +| 16 vCPU and 64 GB RAM | Python \+ Watson Natural Language Processing | 8 \+ 5 = 13 | + + + +## Capacity units per hour for Synthetic Data Generator ## + + + +| Capacity type | Capacity units per hour | +| ------------------- | ----------------------- | +| 2 vCPU and 8 GB RAM | 7 | + + + +## Capacity units per hour for SPSS Modeler flows ## + + + +SPSS Modeler flows + +| Name | Capacity type | Capacity units per hour | +| --------------- | ---------------- | ----------------------- | +| Default SPSS XS | 4 vCPU 16 GB RAM | 2 | + + + +## Capacity units per hour for Data Refinery and Data Refinery flows ## + + + +Data Refinery and Data Refinery flows + +| Name | Capacity type | Capacity units per hour | +| -------------------------------- | ------------------------------------------------------------------ | ----------------------- | +| Default Data Refinery XS runtime | 3 vCPU and 12 GB RAM | 1\.5 | +| Default Spark 3\.3 & R 4\.2 | 2 Executors each: 1 vCPU and 4 GB RAM; Driver: 1 vCPU and 4 GB RAM | 1\.5 | + + + +## Capacity units per hour for RStudio ## + + + +RStudio + +| Name | Capacity type | Capacity units per hour | +| ------------------ | --------------------- | ----------------------- | +| Default RStudio XS | 2 vCPU and 8 GB RAM | 1 | +| Default RStudio M | 8 vCPU and 32 GB RAM | 4 | +| Default RStudio L | 16 vCPU and 64 GB RAM | 8 | + + + +## Capacity units per hour for GPU environments ## + + + +GPU environments + +| Capacity type | GPUs | Language | Capacity units per hour | +| --------------------- | ---- | --------------- | ----------------------- | +| 1 x NVIDIA Tesla V100 | 1 | Python with GPU | 68 | +| 2 x NVIDIA Tesla V100 | 2 | Python with GPU | 136 | + + + +## Runtime capacity limit ## + +You are notified when you're about to reach the monthly runtime capacity limit for your Watson Studio service plan\. When this happens, you can: + + + + * Stop active runtimes you don't need\. + * Upgrade your service plan\. For up\-to\-date information, see the[Services catalog page for Watson Studio](https://dataplatform.cloud.ibm.com/data/catalog/data-science-experience?context=wx&target=services)\. + + + +Remember: The CUH counter continues to increase while a runtime is active so stop the runtimes you aren't using\. If you don't explicitly stop a runtime, the runtime is stopped after an idle timeout\. During the idle time, you will continue to consume CUHs for which you are billed\. + +## Track runtime usage for a project ## + +You can view the environment runtimes that are currently active in a project, and monitor usage for the project from the project's **Environments** page\. + +## Track runtime usage for an account ## + +The CUH consumed by the active runtimes in a project are billed to the account that the project creator has selected in his or her profile settings at the time the project is created\. This account can be the account of the project creator, or another account that the project creator has access to\. If other users are added to the project and use runtimes, their usage is also billed against the account that the project creator chose at the time of project creation\. + +You can track the runtime usage for an account on the **Environment Runtimes** page if you are the IBM Cloud account owner or administrator\. + +To view the total runtime usage across all of the projects and see how much of your plan you have currently used, choose **Administration > Environment runtimes**\. + +A list of the active runtimes billed to your account is displayed\. You can see who created the runtimes, when, and for which projects, as well as the capacity units that were consumed by the active runtimes at the time you view the list\. + +## Learn more ## + + + + * [Idle runtime timeouts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html#stop-active-runtimes) + * [Monitor account resource usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html) + * [Upgrade your service](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/upgrade.html) + + + +**Parent topic:**[Managing compute resources](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e777a9c7d0450d572431f168374224179c1ae7c4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e777a9c7d0450d572431f168374224179c1ae7c4.md new file mode 100644 index 0000000..fa81ba6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e777a9c7d0450d572431f168374224179c1ae7c4.md @@ -0,0 +1,6 @@ +# Multiple series charts + +# Multiple series charts # + +Multiple series charts are similar to line charts, with the exception that you can chart multiple variables on the Y\-axis\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e778331bf398f2db0f6477ef689d0dd6a2aaa81e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e778331bf398f2db0f6477ef689d0dd6a2aaa81e.md new file mode 100644 index 0000000..ae7e22b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e778331bf398f2db0f6477ef689d0dd6a2aaa81e.md @@ -0,0 +1,132 @@ +# Key management by KMS + +# Key management by KMS # + +Parquet modular encryption can work with arbitrary Key Management Service (KMS) servers\. A custom KMS client class, able to communicate with the chosen KMS server, has to be provided to the Analytics Engine powered by Apache Spark instance\. This class needs to implement the KmsClient interface (part of the Parquet modular encryption API)\. Analytics Engine powered by Apache Spark includes the VaultClient KmsClient, that can be used out of the box if you use Hashicorp Vault as the KMS server for the master keys\. If you use or plan to use a different KMS system, you can develop a custom KmsClient class (taking the VaultClient code as an example)\. + +## Custom KmsClient class ## + +Parquet modular encryption provides a simple interface called `org.apache.parquet.crypto.keytools.KmsClient` with the following two main functions that you must implement: + + // Wraps a key - encrypts it with the master key, encodes the result and + // potentially adds KMS-specific metadata. + public String wrapKey(byte[] keyBytes, String masterKeyIdentifier) + // Decrypts (unwraps) a key with the master key. + public byte[] unwrapKey(String wrappedKey, String masterKeyIdentifier) + +In addition, the interface provides the following initialization function that passes KMS parameters and other configuration: + + public void initialize(Configuration configuration, String kmsInstanceID, String kmsInstanceURL, String accessToken) + +See [Example of KmsClient implementation](https://github.com/apache/parquet-mr/blob/master/parquet-hadoop/src/test/java/org/apache/parquet/crypto/keytools/samples/VaultClient.java) to learn how to implement a KmsClient\. + +After you have developed the custom KmsClient class, add it to a jar supplied to Analytics Engine powered by Apache Spark, and pass its full name in the Spark Hadoop configuration, for example: + + sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "full.name.of.YourKmsClient" + +## Key management by Hashicorp Vault ## + +If you decide to use Hashicorp Vault as the KMS server, you can use the pre\-packaged VaultClient: + + sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient") + +### Creating master keys ### + +Consult the Hashicorp Vault documentation for the specifics about actions on Vault\. See: + + + + * [Transit Secrets Engine](https://www.vaultproject.io/docs/secrets/transit) + * [Encryption as a Service: Transit Secrets Engine](https://learn.hashicorp.com/tutorials/vault/eaas-transit) + * Enable the Transit Engine either at the default path or providing a custom path\. + * Create named encryption keys\. + * Configure access policies with which a user or machine is allowed to access these named keys\. + + + +### Writing encrypted data ### + + + +1. Pass the following parameters: + + + + * Set `"parquet.encryption.kms.client.class"` to `"com.ibm.parquet.key.management.VaultClient"`: + + sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient") + * Optional: Set the custom path `"parquet.encryption.kms.instance.id"` to your transit engine: + + sc.hadoopConfiguration.set("parquet.encryption.kms.instance.id" , "north/transit1") + * Set `"parquet.encryption.kms.instance.url"` to the URL of your Vault instance: + + sc.hadoopConfiguration.set("parquet.encryption.kms.instance.url" , "https://:8200") + * Set `"parquet.encryption.key.access.token"` to a valid access token with the access policy attached, which provides access rights to the required keys in your Vault instance: + + sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "") + * If the token is located in a local file, load it: + + val token = scala.io.Source.fromFile("").mkStringsc.hadoopConfiguration.set("parquet.encryption.key.access.token" , token) + + + +2. Specify which columns need to be encrypted, and with which master keys\. You must also specify the footer key\. For example: + + val k1 = "key1" + val k2 = "key2" + val k3 = "key3" + dataFrame.write + .option("parquet.encryption.footer.key" , k1) + .option("parquet.encryption.column.keys" , k2+":SSN,Address;"+k3+":CreditCard") + .parquet("") + + Note: If either the `"parquet.encryption.column.keys"` or the `"parquet.encryption.footer.key"` parameter is not set, an exception will be thrown. + + + +## Reading encrypted data ## + +The required metadata, including the ID and URL of the Hashicorp Vault instance, is stored in the encrypted Parquet files\. + +To read the encrypted metadata: + + + +1. Set KMS client to the Vault client implementation: + + sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient") +2. Provide the access token with policy attached that grants access to the relevant keys: + + sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "") +3. Call the regular Parquet read commands, such as: + + val dataFrame = spark.read.parquet("") + + + +## Key rotation ## + +If key rotation is required, an administrator with access rights to the KMS key rotation actions must rotate master keys in Hashicorp Vault using the procedure described in the Hashicorp Vault documentation\. Thereafter the administrator can trigger Parquet key rotation by calling: + + public static void KeyToolkit.rotateMasterKeys(String folderPath, Configuration hadoopConfig) + +To enable Parquet key rotation, the following Hadoop configuration properties must be set: + + + + * The parameters `"parquet.encryption.key.access.token"` and `"parquet.encryption.kms.instance.url"` must set set, and optionally `"parquet.encryption.kms.instance.id"` + * The parameter `"parquet.encryption.key.material.store.internally"` must be set to `"false"`\. + * The parameter `"parquet.encryption.kms.client.class"` must be set to `"com.ibm.parquet.key.management.VaultClient"` + + + +For example: + + sc.hadoopConfiguration.set("parquet.encryption.kms.instance.url" , "https://:8200")sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "") + sc.hadoopConfiguration.set("parquet.encryption.kms.client.class","com.ibm.parquet.key.management.VaultClient") + sc.hadoopConfiguration.set("parquet.encryption.key.material.store.internally", "false") + KeyToolkit.rotateMasterKeys("", sc.hadoopConfiguration) + +**Parent topic:**[Parquet encryption](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/parquet-encryption.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e7b64045af2c3ff02183fb1ccc036327cee5e971.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e7b64045af2c3ff02183fb1ccc036327cee5e971.md new file mode 100644 index 0000000..6e6dbe3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e7b64045af2c3ff02183fb1ccc036327cee5e971.md @@ -0,0 +1,36 @@ +# Configuring firewall access + +# Configuring firewall access # + +Firewalls protect valuable data from public access\. If your data sources reside behind a firewall for protection, and you are not using a Satellite Connector or Satellite location, then you must configure the firewall to allow the IP addresses for IBM watsonx and also for individual services\. Otherwise, IBM watsonx is denied access to the data sources\. + +To allow IBM watsonx access to private data sources, you configure inbound firewall rules using the security mechanisms for your firewall\. Inbound firewall rules are not required for connections that use a Satellite Connector or Satellite location, which establishes a link by performing an outbound connection\. For more information, see [Connecting to data behind a firewall](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +All services in IBM watsonx actively use WebSockets for the proper functioning of the user interface and APIs\. Any firewall between the user and the IBM watsonx domain must allow **HTTPUpgrade**\. If IBM watsonx is installed behind a firewall, traffic for the **wss://** protocol must be enabled\. + +## Configuring inbound access rules for firewalls ## + +If data sources reside behind a firewall, then inbound access rules are required for IBM watsonx\. Inbound firewall rules protect the network against incoming traffic from the internet\. The following scenarios require inbound access rules through a firewall: + + + + * [Firewall access for IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall_cfg.html) + * [Firewall access for Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall-cfg-private-cos.html) + * [Firewall access for AWS Redshift](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall-redshift.html) + * [Firewall access for Watson Studio](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall-dsx.html) + * [Firewall access for Watson Machine Learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall-wml.html) + * [Firewall access for Spark](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall-spark.html) + + + +## Learn more ## + + + + * [Connecting to data behind a firewall](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html) + + + +**Parent topic:**[Setting up the platform for administrators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-platform.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e7fac7868f0d237efbfcc625d8c265aeebca3e7d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e7fac7868f0d237efbfcc625d8c265aeebca3e7d.md new file mode 100644 index 0000000..3f8b1d7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e7fac7868f0d237efbfcc625d8c265aeebca3e7d.md @@ -0,0 +1,34 @@ +# Text Mining node (SPSS Modeler) + +# Text Mining node # + +Figure 1\. Text Mining node to analyze comments from hotel guests + +![Text Mining node to analyze comments from hotel guests](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_tm.png) + + + +1. Add a Data Asset node that points to hotelSatisfaction\.csv\. +2. From the Text Analytics category on the node palette, add a Text Mining node, connect it to the Data Asset node you added in the previous step, and double\-click it to open its properties\. +3. Under Fields, select `Comments` for the Text field and select `id` for the ID field\. Note that only the Text field is required\. + + Figure 2. Text Mining node properties + + ![Text Mining node build properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_tm_props1.png) +4. Under Copy resources from, select Text analysis package, click Select Resources, and then load Hotel Satisfaction (English)\.tap (with `Current category set(s) = Topic + Opinion`)\.A text analysis package (TAP) is a predefined set of libraries and advanced linguistic and nonlinguistic resources bundled with one or more sets of predefined categories\. If no text analysis package is relevant for your application, you can instead start by selecting Resource template under Copy resources from\. A resource template is a predefined set of libraries and advanced linguistic and nonlinguistic resources that have been fine\-tuned for a particular domain or usage\. + + Figure 3. Text Mining node properties + + ![Text Mining node build properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_tm_props2.png) +5. Under Build models, make sure Build interactively (category model nugget) is selected\. Later when you run the node, this option will launch an interactive interface (known as the Text Analytics Workbench) in which you can extract concepts and patterns, explore and fine\-tune the extracted results, build and refine categories, and build category model nuggets\. +6. Under Begin session by, select Extracting concepts and text links\. The option Extracting concepts extracts only concepts, whereas TLA extraction outputs both concepts and text links that are connections between topics (service, personnel, food, etc\.) and opinions\. +7. Under Expert, select Accommodate spelling for a minimum word character length of\. This option applies a fuzzy grouping technique that helps group commonly misspelled words or closely spelled words under one concept\. The fuzzy grouping algorithm temporarily strips all vowels (except the first one) and strips double/triple consonants from extracted words and then compares them to see if they're the same (so, for example, `location` and `locatoin` are grouped together)\. + + Figure 4. Text Mining node properties + + ![Text Mining node expert properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_tm_props3.png) +8. Click Save\. Right\-click the Text Mining node and run it to open the Text Analytics Workbench and proceed to the next section of this tutorial\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e81f1fd08e472af1516e6c6b0c936a2dca55cc20.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e81f1fd08e472af1516e6c6b0c936a2dca55cc20.md new file mode 100644 index 0000000..2bed3dc --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e81f1fd08e472af1516e6c6b0c936a2dca55cc20.md @@ -0,0 +1,5 @@ +# Db2 Warehouse on IBM watsonx + +# Db2 Warehouse on IBM watsonx # + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e85352e9588726771a8cd594a268eca7d04379bd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e85352e9588726771a8cd594a268eca7d04379bd.md new file mode 100644 index 0000000..1d5a7e0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e85352e9588726771a8cd594a268eca7d04379bd.md @@ -0,0 +1,26 @@ +# applyextension properties + +# applyextension properties # + +You can use Extension Model nodes to generate an Extension model nugget\. The scripting name of this model nugget is *applyextension*\. For more information on scripting the modeling node itself, see [extensionmodelnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/extensionmodelnodeslots.html#extensionmodelnodeslots)\. + + + +applyextension properties + +Table 1\. applyextension properties + +| `applyextension` Properties | Values | Property Description | +| --------------------------- | ---------------------------------------- | ----------------------------------------------------------------------------------------- | +| `r_syntax` | *string* | R scripting syntax for model scoring\. | +| `python_syntax` | *string* | Python scripting syntax for model scoring\. | +| `use_batch_size` | *flag* | Enable use of batch processing\. | +| `batch_size` | *integer* | Specify the number of data records to be included in each batch\. | +| `convert_flags` | `StringsAndDoubles`
`LogicalValues` | Option to convert flag fields\. | +| `convert_missing` | *flag* | Option to convert missing values to the R NA value\. | +| `convert_datetime` | *flag* | Option to convert variables with date or datetime formats to R date/time formats\. | +| `convert_datetime_class` | `POSIXct`

`POSIXlt` | Options to specify to what format variables with date or datetime formats are converted\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e88edbb9a31f8b7c70fb3ba48136d9c3cd6767ac.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e88edbb9a31f8b7c70fb3ba48136d9c3cd6767ac.md new file mode 100644 index 0000000..db393db --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e88edbb9a31f8b7c70fb3ba48136d9c3cd6767ac.md @@ -0,0 +1,160 @@ +# Overview of IBM watsonx as a Service + +# Overview of IBM watsonx as a Service # + +IBM watsonx\.ai is a studio of integrated tools for working with generative AI capabilities that are powered by foundation models and for building machine learning models\. The IBM watsonx\.ai component provides a secure and collaborative environment where you can access your organization's trusted data, automate AI processes, and deliver AI in your applications\. The IBM watsonx\.governance component provides end\-to\-end monitoring for machine learning and generative AI models to accelerate responsible, transparent, and explainable AI workflows\. + +Watch this short video that introduces watsonx\.ai\. + +Looking for watsonx\.data? Go to [IBM watsonx\.data documentation](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-getting-started)\. + +You can accomplish the following goals with watsonx: + + + + * **Build machine learning models** + Build models by using open source frameworks and code-based, automated, or visual data science tools. + * **Experiment with foundation models** + Test prompts to generate, classify, summarize, or extract content from your input text. Choose from IBM models or open source models from Hugging Face. + * **Manage the AI lifecycle** + Manage and automate the full AI model lifecycle with all the integrated tools and runtimes to train, validate, and deploy AI models. + * **Govern AI** + Track and document the detailed history of AI models to help ensure compliance. + + + +Watsonx\.ai provides these tools for working with data and models: + + + +Tools for working with data and models + +| What you can use | What you can do | Best to use when | +| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Data Refinery](https://dataplatform.cloud.ibm.com/docs/content/wsj/refinery/refining_data.html) | Access and refine data from diverse data source connections\.

Materialize the resulting data sets as snapshots in time that might combine, join, or filter data for other data scientists to analyze and explore\. | You need to visualize the data when you want to shape or cleanse it\.

You want to simplify the process of preparing large amounts of raw data for analysis\. | +| [Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) | Experiment with IBM and open source foundation models by inputting prompts\. | You want to engineer prompts for your generative AI solution\. | +| [Tuning Studio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-studio.html) | Tailor the output that a foundation model returns to better meet your needs\. | You want to adjust foundation model outputs for use in your generative AI solution\. | +| [AutoAI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) | Use AutoAI to automatically select algorithms, engineer features, generate pipeline candidates, and train machine learning model pipeline candidates\.

Then, evaluate the ranked pipelines and save the best as models\.

Deploy the trained models to a space, or export the model training pipeline that you like from AutoAI into a notebook to refine it\. | You want an advanced and automated way to build a good set of training pipelines and machine learning models quickly\.

You want to be able to export the generated pipelines to refine them\. | +| [Notebooks and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebooks-and-scripts.html) | Prompt foundation models with the Python library\.

Use notebooks and scripts to write your own feature engineering, model training, and evaluation code in Python or R\. Use training data sets that are available in the project, or connections to data sources such as databases, data lakes, or object storage\.

Code with your favorite open source frameworks and libraries\. | You want to use Python or R coding skills to have full control over the code that you use to work with models\. | +| [SPSS Modeler flows](https://dataplatform.cloud.ibm.com/docs/content/wsd/spss-modeler.html) | Use SPSS Modeler flows to create your own machine learning model training, evaluation, and scoring flows\. Use training data sets that are available in the project, or connections to data sources such as databases, data lakes, or object storage\. | You want a simple way to explore data and define machine learning model training, evaluation, and scoring flows\. | +| [RStudio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-overview.html) | Analyze data and build and test machine learning models by working with R in RStudio\. | You want to use a development environment to work in R\. | +| [Decision Optimization](https://dataplatform.cloud.ibm.com/docs/content/DO/DOWS-Cloud_home.html) | Prepare data, import models, solve problems and compare scenarios, visualize data, find solutions, produce reports, and save models to deploy with Watson Machine Learning\. | You need to evaluate millions of possibilities to find the best solution to a prescriptive analytics problem\. | +| [Federated learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fed-lea.html) | Train a common machine learning model that uses distributed data\. | You need to train a machine learning model without moving, combining, or sharing data that is distributed across multiple locations\. | +| [Watson Pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-overview.html) | Use pipelines to create repeatable and scheduled flows that automate notebook, Data Refinery, and machine learning pipelines, from data ingestion to model training, testing, and deployment\. | You want to automate some or all of the steps in an MLOps flow\. | +| [Synthetic Data Generator](https://dataplatform.cloud.ibm.com/docs/content/wsj/synthetic/synthetic_data_overview_sd.html) | Generate synthetic tabular data based on production data or a custom data schema using visual flows and modeling algorithms\. | You want to mask or mimic production data or you want to generate synthetic data from a custom data schema\. | + + + +Watsonx\.governance provides these tools for governing models\. + + + +Tools for governing models + +| What you can use | What you can do | Best to use when | +| -------------------- | ----------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | +| [Factsheets](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-create-use-case.html) | View model lifecycle status, general model and deployment details, training information and metrics, and deployment metrics\. | You want to make sure that your model is compliant and performing as expected\. | +| [Watson OpenScale](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/getting-started.html) | Monitor model output and explain model predictions\. | You need to keep your models fair and be able to explain model predictions\. | + + + +## Security and privacy of your data and models ## + +Your work on watsonx, including your data and the models that you create, are private to your account: + + + + * Your data is accessible only by you\. Your data is used to train only your models\. Your data will never be accessible or used by IBM or any other person or organization\. Your data is stored in dedicated storage buckets from your IBM Cloud Object Storage service instance\. Data is encrypted at rest and in motion\. + * The models that you create are accessible only by you\. Your models will never be accessible or used by IBM or any other person or organization\. Your models are secured in the same way as your data\. + + + +Learn more about security and your options: + + + + * [Security and privacy of foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-security.html) + * [Data security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-data.html) + * [Security of watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html) + + + +## Underlying architecture ## + +Watsonx includes the following functionality as the secure and scalable foundation for your organization to collaborate efficiently: + + + + * **Software and hardware** + Watsonx is fully managed by IBM on IBM Cloud. Software updates are automatic. Scaling of compute resources and storage is automatic. + * **Storage** + A IBM Cloud Object Storage service instance is automatically provisioned for you to provide storage. + * **Compute resources** + You can choose the appropriate runtime for your jobs. Compute resource usage is billed based on the rate for the runtime environment and its active duration. + * **Security, compliance, and isolation** + The data security, network security, security standards compliance, and isolation of watsonx are managed by IBM Cloud. You can set up extra security and encryption options. + * **User management** + You add users and user groups and manage their account roles and permissions with IBM Cloud Identity and Access Management. You assign roles within each collaborative workspace across the platform. + * **Global search** + You can search for assets across the platform. + * **Shared connections to data sources** + You can share connections with others across the platform in the Platform assets catalog. + * **Samples** + You can experiment with IBM-curated sample data sets, notebooks, projects, and models. + + + +Watsonx\.ai on the watsonx platform includes the Watson Studio, Watson Machine Learning, and IBM Cloud Object Storage services\. Watsonx\.governance on the watsonx platform includes the watsonx\.governance service\. + +## Workspaces and assets ## + +Watsonx is organized as a set of collaborative workspaces where you can work with your team or organization\. Each workspace has a set of members with roles that provide permissions to perform actions\. Most users work with assets, which are the items that users add to the platform\. Data assets contain metadata that represents data, while assets that you create in tools, such as models, run code to work with data\. You build assets in projects, and manage the deployment of completed assets in deployment spaces\. + +### Projects and tools ### + +Projects are where your data science and model builder teams work with data to create assets, such as, saved prompts, notebooks, models, or pipelines\. Your first project, which is known as your sandbox project, is created automatically when you sign up for watsonx\.ai\. + +The following image shows what the **Overview** page of a project might look like\. + +![Overview page for a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-project-overview.png) + +### Deployment spaces ### + +Deployment spaces are where your ModelOps team deploys models and other deployable assets to production and then tests and manages deployments in production\. After you build models and deployable assets in projects, you promote them to deployment spaces\. + +The following image shows what the **Overview** page of a deployment space might look like\. + +![Overview page for a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-deployment-overview.png) + +## Samples ## + +The platform includes an integrated collection of samples that provides models, data assets, prompts, notebooks, and sample projects\. Sample notebooks provide examples of data science and machine learning code\. Sample projects contain sets of data, models, other assets, and detailed instructions on how to solve a particular business problem\. + +The following image shows what Samples looks like\. + +![Samples page](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/wx-samples.png) + + + + * See a tour of the samples collection + + + +## Learn more ## + + + + * [Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + * [Asset types and properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html) + * [AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + * [Your sandbox project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/sandbox.html) + * [Deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html) + * [Foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-overview.html) + * [Foundation models Python library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-python-lib.html) + * [Comparison of IBM watsonx as a Service and Cloud Pak for Data as a Service](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/compare-platforms.html) + * [Feature differences between watsonx deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/feature-matrix.html) + * [IBM watsonx\.data documentation](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-getting-started) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e8b776685a4c1ffcdc8f90c57c3ad7243a43b2b3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e8b776685a4c1ffcdc8f90c57c3ad7243a43b2b3.md new file mode 100644 index 0000000..f5b31f8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e8b776685a4c1ffcdc8f90c57c3ad7243a43b2b3.md @@ -0,0 +1,20 @@ +# Forecasting catalog sales (SPSS Modeler) + +# Forecasting catalog sales # + +A catalog company is interested in forecasting monthly sales of its men's clothing line, based on 10 years of their sales data\. + +This example uses the flow Forecasting Catalog Sales, available in the example project \. The data file is catalog\_seasfac\.csv\. + +We've seen in an earlier tutorial how you can let the Expert Modeler decide which is the most appropriate model for your time series\. Now it's time to take a closer look at the two methods that are available when choosing a model yourself—exponential smoothing and ARIMA\. + +To help you decide on an appropriate model, it's a good idea to plot the time series first\. Visual inspection of a time series can often be a powerful guide in helping you choose\. In particular, you need to ask yourself: + + + + * Does the series have an overall trend? If so, does the trend appear constant or does it appear to be dying out with time? + * Does the series show seasonality? If so, do the seasonal fluctuations seem to grow with time or do they appear constant over successive periods? + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e933c12c1df97e13cba40bcd54e4f4b8133da10c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e933c12c1df97e13cba40bcd54e4f4b8133da10c.md new file mode 100644 index 0000000..5e3ce11 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e933c12c1df97e13cba40bcd54e4f4b8133da10c.md @@ -0,0 +1,739 @@ +# Functions used in Watson Pipelines's Expression Builder + +# Functions used in Watson Pipelines's Expression Builder # + +Use these functions in Pipelines code editors, for example, to define a user variable or build an advanced condition\. + +The Experssion Builder uses the categories for coding functions: + + + + * [Conversion functions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-expr-builder.html?context=cdpaas&locale=en#conversion) + * [Standard functions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-expr-builder.html?context=cdpaas&locale=en#ofext) + * [Accessing advanced global objects](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-expr-builder.html?context=cdpaas&locale=en#advanced) + + + +## Conversion functions ## + +Converts a single data element format to another\. + +### Table for basic data type conversion ### + + + +| Type | Accepts | Returns | Syntax | +| ----------- | -------------------------------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------- | +| `double` | `int, uint, string` | `double` | `double(val)` | +| `duration` | `string` | `duration` | `duration(string)`
Duration must end with "s", which stands for seconds\. | +| `int` | `int, uint, double, string, timestamp` | `int` | `int(val)` | +| `timestamp` | `string` | `timestamp` | `timestamp(string)`
Converts strings to timestamps according to RFC3339, that is "1972\-01\-01T10:00:20\.021\-05:00"\. | +| `uint` | `int, double, string` | `uint` | `uint(val)` | + + + +#### Example #### + +For example, to cast a value to type `double`: + + double(%val%) + +When you cast double to `int | uint`, result rounds toward zero and errors if result is out of range\. + +## Standard functions ## + +Functions that are unique to IBM Watson Pipelines\. + +### sub ### + +Replaces substrings of a string that matches the given regular expression that starts at position offset\. + +#### Syntax #### + + (string).sub(substring (string), replacement (string), [occurrence (int), offset (int)]]) + +returns: the string with substrings updated\. + +#### Examples #### + + 'aaabbbcccbbb'.sub('[b]+','RE') + +Returns 'aaaREcccRE'\. + +### format ### + +Formats a string or timestamp according to a format specifier and returns the resulting string\. + +#### Syntax #### + +***format* as a method of strings** + + (string).format(parameter 1 (string or bool or number)... parameter 10 (string or bool or number)) + +returns: the string that contains the formatted input values\. + +***format* as a method of timestamps** + + (timestamp).format(layout(string)) + +returns: the formatted timestamp in string format\. + +#### Examples #### + + 'number=%d, text=%s'.format(1, 'str') + +Returns the string 'number=1, text=str'\. + + timestamp('2020-07-24T09:07:29.000-00:00').format('%Y/%m/%d') + +Returns the string '2020/07/24'\. + +### now ### + +Returns the current timestamp\. + +#### Syntax #### + + now() + +returns: the current timestamp\. + +### parseTimestamp ### + +Returns the current timestamp in string format\. + +#### Syntax #### + + parseTimestamp([timestamp_string(string)] [layout(string)]) + +returns: the current timestamp to a string of type string\. + +#### Examples #### + + parseTimestamp('2020-07-24T09:07:29Z') + +Returns '2020\-07\-24T09:07:29\.000\-00:00'\. + +### min ### + +Returns minimum value in list\. + +#### Syntax #### + + (list).min() + +returns: the minimum value of the list\. + +#### Examples #### + + [1,2,3].min() + +Returns the integer 1\. + +### max ### + +Returns maximum value in list\. + +#### Syntax #### + + (list).max() + +returns: the maximum value of the list\. + +#### Examples #### + + [1,2,3].max() + +Returns the integer 3\. + +### argmin ### + +Returns index of minimum value in list\. + +#### Syntax #### + + (list).argmin() + +returns: the index of the minimum value of the list\. + +#### Examples #### + + [1,2,3].argmin() + +Returns the integer 0\. + +### argmax ### + +Returns index of maximum value in list\. + +#### Syntax #### + + (list).argmax() + +returns: the index of the maximum value of the list\. + +#### Examples #### + + [1,2,3].argmax() + +Returns the integer 2\. + +### sum ### + +Returns the sum of values in list\. + +#### Syntax #### + + (list).sum() + +returns: the index of the maximum value of the list\. + +#### Examples #### + + [1,2,3].argmax() + +Returns the integer 2\. + +### base64\.decode ### + +Decodes base64\-encoded string to bytes\. This function returns an error if the string input is not base64\-encoded\. + +#### Syntax #### + + base64.decode(base64_encoded_string(string)) + +returns: the decoded base64\-encoded string in byte format\. + +#### Examples #### + + base64.decode('aGVsbG8=') + +Returns 'hello' in bytes\. + +### base64\.encode ### + +Encodes bytes to a base64\-encoded string\. + +#### Syntax #### + + base64.encode(bytes_to_encode (bytes)) + +returns: the encoded base64\-encoded string of the original byte value\. + +#### Examples #### + + base64.decode(b'hello') + +Returns 'aGVsbG8=' in bytes\. + +### charAt ### + +Returns the character at the given position\. If the position is negative, or greater than the length of the string, the function produces an error\. + +#### Syntax #### + + (string).charAt(index (int)) + +returns: the character of the specified position in integer format\. + +#### Examples #### + + 'hello'.charAt(4) + +Returns the character 'o'\. + +### indexOf ### + +Returns the integer index of the first occurrence of the search string\. If the search string is not found the function returns \-1\. + +#### Syntax #### + + (string).indexOf(search_string (string), [offset (int)]) + +returns: the index of the first character occurrence after the offset\. + +#### Examples #### + + 'hello mellow'.indexOf('ello', 2) + +Returns the integer 7\. + +### lowerAscii ### + +Returns a new string with ASCII characters turned to lowercase\. + +#### Syntax #### + + (string).lowerAscii() + +returns: the new lowercase string\. + +#### Examples #### + + 'TacoCat'.lowerAscii() + +Returns the string 'tacocat'\. + +### replace ### + +Returns a new string based on the target, which replaces the occurrences of a search string with a replacement string if present\. The function accepts an optional limit on the number of substring replacements to be made\. + +#### Syntax #### + + (string).replace(search_string (string), replacement (string), [offset (int)]) + +returns: the new string with occurrences of a search string replaced\. + +#### Examples #### + + 'hello hello'.replace('he', 'we') + +Returns the string 'wello wello'\. + +### split ### + +Returns a list of strings that are split from the input by the separator\. The function accepts an optional argument that specifies a limit on the number of substrings that are produced by the split\. + +#### Syntax #### + + (string).split(separator (string), [limit (int)]) + +returns: the split string as a string list\. + +#### Examples #### + + 'hello hello hello'.split(' ') + +Returns the string list \['hello', 'hello', 'hello'\]\. + +### substring ### + +Returns the substring given a numeric range corresponding to character positions\. Optionally you might omit the trailing range for a substring from a character position until the end of a string\. + +#### Syntax #### + + (string).substring(start (int), [end (int)]) + +returns: the substring at the specified index of the string\. + +#### Examples #### + + 'tacocat'.substring(4) + +Returns the string 'cat'\. + +### trim ### + +Returns a new string, which removes the leading and trailing white space in the target string\. The trim function uses the Unicode definition of white space, which does not include the zero\-width spaces\. + +#### Syntax #### + + (string).trim() + +returns: the new string with white spaces removed\. + +#### Examples #### + + ' \ttrim\n '.trim() + +Returns the string 'trim'\. + +### upperAscii ### + +Returns a new string where all ASCII characters are upper\-cased\. + +#### Syntax #### + + (string).upperAscii() + +returns: the new string with all characters turned to uppercase\. + +#### Examples #### + + 'TacoCat'.upperAscii() + +Returns the string 'TACOCAT'\. + +### size ### + +Returns the length of the string, bytes, list, or map\. + +#### Syntax #### + + (string | bytes | list | map).size() + +returns: the length of the string, bytes, list, or map array\. + +#### Examples #### + + 'hello'.size() + +Returns the integer 5\. + + 'hello'.size() + +Returns the integer 5\. + + ['a','b','c'].size() + +Returns the integer 3\. + + {'key': 'value'}.size() + +Returns the integer 1\. + +### contains ### + +Tests whether the string operand contains the substring\. + +#### Syntax #### + + (string).contains(substring (string)) + +returns: a Boolean value of whether the substring exists in the string operand\. + +#### Examples #### + + 'hello'.contains('ll') + +Returns true\. + +### endsWith ### + +Tests whether the string operand ends with the specified suffix\. + +#### Syntax #### + + (string).endsWith(suffix (string)) + +returns: a Boolean value of whether the string ends with specified suffix in the string operand\. + +#### Examples #### + + 'hello'.endsWith('llo') + +Returns true\. + +### startsWith ### + +Tests whether the string operand starts with the prefix argument\. + +#### Syntax #### + + (string).startsWith(prefix (string)) + +returns: a Boolean value of whether the string begins with specified prefix in the string operand\. + +#### Examples #### + + 'hello'.startsWith('he') + +Returns true\. + +### matches ### + +Tests whether the string operand matches regular expression\. + +#### Syntax #### + + (string).matches(prefix (string)) + +returns: a Boolean value of whether the string matches the specified regular expression\. + +#### Examples #### + + 'Hello'.matches('[Hh]ello') + +Returns true\. + +### getDate ### + +Get the day of the month from the date with time zone (default Coordinated Universal Time), one\-based indexing\. + +#### Syntax #### + + (timestamp).getDate([time_zone (string)]) + +returns: the day of the month with one\-based indexing\. + +#### Examples #### + + timestamp('2020-07-24T09:07:29.000-00:00').getDate() + +Returns 24\. + +### getDayOfMonth ### + +Get the day of the month from the date with time zone (default Coordinated Universal Time), zero\-based indexing\. + +#### Syntax #### + + (timestamp).getDayOfMonth([time_zone (string)]) + +returns: the day of the month with zero\-based indexing\. + +#### Examples #### + + timestamp('2020-07-24T09:07:29.000-00:00').getDayOfMonth() + +Returns 23\. + +### getDayOfWeek ### + +Get day of the week from the date with time zone (default Coordinated Universal Time), zero\-based indexing, zero for Sunday\. + +#### Syntax #### + + (timestamp).getDayOfWeek([time_zone (string)]) + +returns: the day of the week with zero\-based indexing\. + +#### Examples #### + + timestamp('2020-07-24T09:07:29.000-00:00').getDayOfWeek() + +Returns 5\. + +### getDayOfYear ### + +Get the day of the year from the date with time zone (default Coordinated Universal Time), zero\-based indexing\. + +#### Syntax #### + + (timestamp).getDayOfYear([time_zone (string)]) + +returns: the day of the year with zero\-based indexing\. + +#### Examples #### + + timestamp('2020-07-24T09:07:29.000-00:00').getDayOfYear() + +Returns 205\. + +### getFullYear ### + +Get the year from the date with time zone (default Coordinated Universal Time)\. + +#### Syntax #### + + (timestamp).getFullYear([time_zone (string)]) + +returns: the year from the date\. + +#### Examples #### + + timestamp('2020-07-24T09:07:29.000-00:00').getFullYear() + +Returns 2020\. + +### getMonth ### + +Get the month from the date with time zone, 0\-11\. + +#### Syntax #### + + (timestamp).getMonth([time_zone (string)]) + +returns: the month from the date\. + +#### Examples #### + + timestamp('2020-07-24T09:07:29.000-00:00').getMonth() + +Returns 6\. + +### getHours ### + +Get hours from the date with time zone, 0\-23\. + +#### Syntax #### + + (timestamp).getHours([time_zone (string)]) + +returns: the hour from the date\. + +#### Examples #### + + timestamp('2020-07-24T09:07:29.000-00:00').getHours() + +Returns 9\. + +### getMinutes ### + +Get minutes from the date with time zone, 0\-59\. + +#### Syntax #### + + (timestamp).getMinutes([time_zone (string)]) + +returns: the minute from the date\. + +#### Examples #### + + timestamp('2020-07-24T09:07:29.000-00:00').getMinutes() + +Returns 7\. + +### getSeconds ### + +Get seconds from the date with time zone, 0\-59\. + +#### Syntax #### + + (timestamp).getSeconds([time_zone (string)]) + +returns: the second from the date\. + +#### Examples #### + + timestamp('2020-07-24T09:07:29.000-00:00').getSeconds() + +Returns 29\. + +### getMilliseconds ### + +Get milliseconds from the date with time zone, 0\-999\. + +#### Syntax #### + + (timestamp).getMilliseconds([time_zone (string)]) + +returns: the millisecond from the date\. + +#### Examples #### + + timestamp('2020-07-24T09:07:29.021-00:00').getMilliseconds() + +Returns 21\. + +## Access to advanced global objects ## + +Get node outputs, user variables, and pipeline parameters by using the following Pipelines code\. + +### Get user variable ### + +Gets the most up\-to\-date value of a user variable\. + +#### Syntax #### + + vars. + +#### Examples #### + + + +| Example | Output | +| ------------------ | ------------------------------------------------- | +| `vars.my_user_var` | Gets the value of the user variable `my_user_var` | + + + +### Get parameters ### + +Gets the flow parameters\. + +#### Syntax #### + + params. + +#### Examples #### + + + +| Example | Output | +| ---------- | ----------------------------------- | +| `params.a` | Gets the value of the parameter `a` | + + + +### Get parameter sets ### + +Gets the flow parameter sets\. + +#### Syntax #### + + param_set.. + +#### Examples #### + + + +| Example | Output | +| ---------------------------- | ------------------------------------------------------------------ | +| `param_set.ps.a` | Gets the value of the parameter `a` from a parameter set `ps` | +| `param_sets.config` | Gets the pipeline configuration values | +| `param_sets.config.deadline` | Gets a date object from the configurations parameter set | +| `param_sets.ps["$PARAM"]` | Gets the value of the parameter `$PARAM` from a parameter set `ps` | + + + +### Get task results ### + +Get a pipeline task's resulting output and other metrics from a pipeline task after it completes its run\. + +#### Syntax #### + + tasks.. + +#### Examples #### + + + +| Example | Output | +| ------------------------------------------------ | -------------------------------------------------- | +| `tasks.run_datastage_job` | Gets the results dictionary of job output | +| `tasks.run_datastage_job.results.score` | Gets the value `score` of job output | +| `tasks.run_datastage_job.results.timestamp` | Gets the end timestamp of job run | +| `tasks.run_datastage_job.results.error` | Gets the number of errors from job run | +| `tasks.loop_task.loop.counter` | Gets the current loop iterative counter of job run | +| `tasks.loop_task.loop.item` | Gets the current loop iterative item of job run | +| `tasks.run_datastage_job.results.status` | Gets either success or fail status of job run | +| `tasks.run_datastage_job.results.status_message` | Gets the status message of job run | +| `tasks.run_datastage_job.results.job_name` | Gets the job name | +| `tasks.run_datastage_job.results.job` | Gets the Cloud Pak for Data path of job | +| `tasks.run_datastage_job.results.job_run` | Gets the Cloud Pak for Data run path of job run | + + + +### Get pipeline context objects ### + +Gets values that are evaluated in the context of a pipeline that is run in a scope (project, space, catalog)\. + +#### Examples #### + + + +| Example | Output | +| ---------------------------------- | ----------------------------------------------- | +| `ctx.scope.id` | Gets scope ID | +| `ctx.scope.type` | Returns either "project", "space", or "catalog" | +| `ctx.scope.name` | Gets scope name | +| `ctx.pipeline.id` | Gets pipeline ID | +| `ctx.pipeline.name` | Gets pipeline name | +| `ctx.job.id` | Gets job ID | +| `ctx.run_datastage_job.id` | Gets job run ID | +| `ctx.run_datastage_job.started_at` | Gets job run start time | +| `ctx.user.id` | Gets the user ID | + + + +### Get error status ### + +If the exception handler is triggered, an error object is created and becomes accessible only within the exception handler\. + +#### Examples #### + + + +| Example | Output | +| ------------------------- | ------------------------------------------------------------- | +| `error.status` | Gets either success or fail status of job run, usually failed | +| `error.status_message` | Gets the error status message | +| `error.job` | Gets the Cloud Pak for Data path of job | +| `error.run_datastage_job` | Gets the Cloud Pak for Data run path of job | + + + +**Parent topic:**[Adding conditions to a Pipelines](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-conditions.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e990e009903e315fa6752e7e82c2634af4a425b9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e990e009903e315fa6752e7e82c2634af4a425b9.md new file mode 100644 index 0000000..82acb91 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e990e009903e315fa6752e7e82c2634af4a425b9.md @@ -0,0 +1,7 @@ +# Ways to use Decision Optimization + +# Ways to use Decision Optimization # + +To build Decision Optimization models, you can create Python notebooks with DOcplex, a native Python API for Decision Optimization, or use the Decision Optimization experiment UI that has more benefits and features\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e9e9556ca0c7b258d910bb31222a78beabb46a48.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e9e9556ca0c7b258d910bb31222a78beabb46a48.md new file mode 100644 index 0000000..e94b54c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/e9e9556ca0c7b258d910bb31222a78beabb46a48.md @@ -0,0 +1,99 @@ +# Decision Optimization model input and output data + +# Model input and output data adaptation # + +When submitting your job you can include your data inline or reference your data in your request\. This data will be mapped to a file named with data identifier and used by the model\. The data identifier extension will define the format of the file used\. + +The following adaptations are supported: + + + + * **Tabular inline data** to embed your data in your request\. For example: + + "input_data": [{ + "id":"diet_food.csv", + "fields" : "name","unit_cost","qmin","qmax"], + "values" : + "Roasted Chicken", 0.84, 0, 10] + ] + }] + + This will generate the corresponding `diet_food.csv` file that is used as the model input file. Only csv adaptation is currently supported. + * **Inline data**, that is, non\-tabular data (such as an OPL `.dat` file or an `.lp`file) to embed data in your request\. For example: + + "input_data": [{ + "id":"diet_food.csv", + "content":"Input data as a base64 encoded string" + }] + * **URL** referenced data allowing you to reference files stored at a particular URL or REST data service\. For example: + + "input_data_references": { + "type": "url", + "id": "diet_food.csv", + "connection": { + "verb": "GET", + "url": "https://myserver.com/diet_food.csv", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + }, + "location": {} + } + + This will copy the corresponding `diet_food.csv` file that is used as the model input file. + * **Data assets** allowing you to reference any data asset or connected data asset present in your space and benefit from the data connector integration capabilities\. For example: + + "input_data_references": [{ + "name": "test_ref_input", + "type": "data_asset", + "connection": {}, + "location": { + "href": "/v2/assets/ASSET-ID?space_id=SPACE-ID" + } + }], + "output_data_references": [{ + "type": "data_asset", + "connection": {}, + "location": { + "href": "/v2/assets/ASSET-ID?space_id=SPACE-ID" + } + }] + + With this data asset type there are many different connections available. For more information, see [Batch deployment details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-details.html#do). + * **Connection assets** allowing you to reference any data and then refer to the connection, without having to specify credentials each time\. For more information, see [Supported data sources in Decision Optimization](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/DOconnections.html)\. Referencing a secure connection without having to use inline credentials in the payload also offers you better security\. For more information, see [Example connection\_asset payload](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html#connection_asset_payload)\.For example, to connect to a COS/S3 via a Connection asset: + + { + "type" : "connection_asset", + "id" : "diet_food.csv", + "connection" : { + "id" : + }, + "location" : { + "file_name" : "FILENAME.csv", + "bucket" : "BUCKET-NAME" + } + } + + For information about the parameters used in these examples, see [Deployment job definitions](https://cloud.ibm.com/apidocs/machine-learning-cp#deployment-job-definitions-create). + + Another example showing you how to connect to a DB2 asset via a connection asset: + + { + "type" : "connection_asset", + "id" : "diet_food.csv", + "connection" : { + "id" : + }, + "location" : { + "table_name" : "TABLE-NAME", + "schema_name" : "SCHEMA-NAME" + } + } + + + +With this connection asset type there are many different connections available\. For more information, see [Batch deployment details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-batch-details.html#do)\. + +You can combine different adaptations in the same request\. For more information about data definitions see [Adding data to an analytics project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/add-data-project.html)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ea3e8b5797ee8a3fd8aa34ea9a1eeb6d81b6a779.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ea3e8b5797ee8a3fd8aa34ea9a1eeb6d81b6a779.md new file mode 100644 index 0000000..d6e6c74 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ea3e8b5797ee8a3fd8aa34ea9a1eeb6d81b6a779.md @@ -0,0 +1,142 @@ +# IBM Cloud Object Storage connection + +# IBM Cloud Object Storage connection # + +To access your data in IBM Cloud Object Storage (COS), create a connection asset for it\. + +IBM Cloud Object Storage on IBM Cloud provides unstructured data storage for cloud applications\. Cloud Object Storage offers S3 API and application binding with regional and cross\-regional resiliency\. + +## Create a connection to IBM Cloud Object Storage ## + +To create the connection asset, you need these connection details: + + + + * **Bucket** name\. (Optional\. If you do not enter the bucket name, then the credentials must have permission to list all the buckets\.) + * **Login URL**\. To find the **Login URL**: + + + + 1. Go to the Cloud Object Storage **Resource list** at [https://cloud.ibm.com/resources](https://cloud.ibm.com/resources). + 2. Expand the **Storage** resource. + 3. Click the Cloud Object Storage service. From the menu, select **Endpoints**. + 4. Optional: Use the **Select resiliency** and **Select location** menus to filter the choices. + 5. Copy the value of the public endpoint that is in the same region as the bucket that you want to use. + + + + * **SSL certificate**: (Optional)\. A self\-signed certificate that was created by a tool such as OpenSSL\. + + + +### Credentials ### + +Use one of the following combination of values for authentication: + + + + * **Service credentials** + + + + + + * **Resource instance ID** and **API key** + + + + + + * **Resource instance ID**, **API key**, **Access key**, and **Secret key** (In this combination, the **Resource instance ID** and **API key** are used for authentication\. The **Access key** and **Secret key** are stored\.) + * **Access key** and **Secret key** + + + +To find the value for **Service credentials**: + + + +1. Go to the Cloud Object Storage **Resource list** at [https://cloud\.ibm\.com/resources](https://cloud.ibm.com/resources)\. +2. Expand the **Storage** resource\. +3. Click the Cloud Object Storage service, and then click the **Service credentials** tab\. +4. Expand the Key name that you want to use\. +5. Copy the entire JSON file\. Include the opening and closing braces `{ }` symbols\. + + + +To find the values for the **API key**, **Access key**, **Secret key**, and the **Resource instance ID**: + + + +1. Go to the Cloud Object Storage **Resource list** at [https://cloud\.ibm\.com/resources](https://cloud.ibm.com/resources)\. +2. Expand the **Storage** resource\. +3. Click the Cloud Object Storage service, and then click the **Service credentials** tab\. +4. Expand the Key name that you want to use\. Copy the values without the quotation marks: +5. **API key**: `apikey` +6. **Access key**: `access_key_id` +7. **Secret key**: `secret_access_key` +8. **Resource instance ID**: `resource_instance_id` + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use IBM Cloud Object Storage connections in the following workspaces and tools: + +**Projects** + + + + * AutoAI + * Data Refinery + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Connecting to the Cloud Object Storage service with the S3 API ## + +To connect to Cloud Object Storage with the S3 API, you need the **Login URL**, an **Access key** and a **Secret key**\. + +The **API key** is a token that is used to call the Watson IoT Platform HTTP APIs\. Users are assigned roles and they can generate an API key that they can use to authorize calls to API endpoints\. For more information, see the [IBM Cloud Object Storage S3 API documentation](https://cloud.ibm.com/docs/cloud-object-storage/api-reference?topic=cloud-object-storage-compatibility-api)\. + +## IBM Cloud Object Storage setup ## + +[Getting started with IBM Cloud Object Storage](https://cloud.ibm.com/docs/cloud-object-storage) + +## Supported file types ## + +The IBM Cloud Object Storage connection supports these file types: Avro, CSV, Delimited text, Excel, JSON, ORC, Parquet, SAS, SAV, SHP, and XML\. + +## Learn more ## + +[Controlling access to COS buckets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/cos_buckets.html) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ea4cb9cd97ffb8c956b4f5d28d2759c0ed832bb5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ea4cb9cd97ffb8c956b4f5d28d2759c0ed832bb5.md new file mode 100644 index 0000000..6719bac --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ea4cb9cd97ffb8c956b4f5d28d2759c0ed832bb5.md @@ -0,0 +1,35 @@ +# transformnode properties + +# transformnode properties # + +![Table node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/transformnodeicon.png)The Transform node allows you to select and visually preview the results of transformations before applying them to selected fields\. + + + +transformnode properties + +Table 1\. transformnode properties + +| `transformnode` properties | Data type | Property description | +| -------------------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------- | +| `fields` | \[ *field1… fieldn*\] | The fields to be used in the transformation\. | +| `formula` | `All``Select` | Indicates whether all or selected transformations should be calculated\. | +| `formula_inverse` | *flag* | Indicates if the inverse transformation should be used\. | +| `formula_inverse_offset` | *number* | Indicates a data offset to be used for the formula\. Set as 0 by default, unless specified by user\. | +| `formula_log_n` | *flag* | Indicates if the log~n~ transformation should be used\. | +| `formula_log_n_offset` | *number* | | +| `formula_log_10` | *flag* | Indicates if the log~10~ transformation should be used\. | +| `formula_log_10_offset` | *number* | | +| `formula_exponential` | *flag* | Indicates if the exponential transformation (e^x^) should be used\. | +| `formula_square_root` | *flag* | Indicates if the square root transformation should be used\. | +| `use_output_name` | *flag* | Specifies whether a custom output name is used\. | +| `output_name` | *string* | If `use_output_name` is true, specifies the name to use\. | +| `output_mode` | `Screen``File` | Used to specify target location for output generated from the output node\. | +| `output_format` | `HTML` (\.*html*) `Output` (\.*cou*) | Used to specify the type of output\. | +| `paginate_output` | *flag* | When the `output_format` is `HTML`, causes the output to be separated into pages\. | +| `lines_per_page` | *number* | When used with `paginate_output`, specifies the lines per page of output\. | +| `full_filename` | *string* | Indicates the file name to be used for the file output\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eaef856f725cd9a9605000f3ae98cbe61a9f50f0.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eaef856f725cd9a9605000f3ae98cbe61a9f50f0.md new file mode 100644 index 0000000..8dcd54a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eaef856f725cd9a9605000f3ae98cbe61a9f50f0.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Extraction attack # + +![icon for robustness risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-robustness.svg)Risks associated with inputInferenceRobustnessAmplified + +### Description ### + +An attack that attempts to copy or steal the AI model by appropriately sampling the input space, observing outputs, and building a surrogate model, is known as an extraction attack\. + +### Why is extraction attack a concern for foundation models? ### + +A successful attack mimics the model, enabling the attacker to repurpose it for their benefit such as eliminating a competitive advantage or causing reputational harm\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eba93b500af79fe9bc96ff2ffc71078766532a86.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eba93b500af79fe9bc96ff2ffc71078766532a86.md new file mode 100644 index 0000000..4c317db --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eba93b500af79fe9bc96ff2ffc71078766532a86.md @@ -0,0 +1,91 @@ +# IBM Cloud Databases for DataStax connection + +# IBM Cloud Databases for DataStax connection # + +To access your data in IBM Cloud Databases for DataStax, create a connection asset for it\. + +Important: The IBM Cloud Databases for DataStax connector is deprecated and will be discontinued in a future release\. + +IBM Cloud Databases for DataStax is a scale\-out NoSQL database in IBM Cloud that is built on Apache Cassandra\. It’s designed to power real\-time applications with high availability and massive scalability\. + +## Create a connection to IBM Cloud Databases for DataStax ## + +To create the connection asset, you need these connection details: + + + + * Host name + * Port number + * Username and password + * Keyspace + * SSL certificate (if required by the database server) + + + +Recommended values to insert into "SSL certificate", "Key certificate" and "Private key" fields can be found in `secure-connect-bundle.zip`\. It can be downloaded from the Databases for DataStax instance (tab `Overview`)\. After downloading secure connect bundle, unzip it, and you'll find the following: + + + + * SSL certificate property: contents of `ca.crt` + * Private key property: contents of `key` + + + +In order to paste contents of `key` into Private key property, it has to be parsed to one\-line\. It can be done for example by executing following in the console: `tr -d '\n' < key`\. The output from this command can be put into `Private key` property\. + + + + * Key certificate property: contents of `cert` + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +**Projects** + + + + * Data Refinery + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## IBM Cloud Databases for DataStax setup ## + +[Getting Started with IBM Cloud Databases for DataStax](https://cloud.ibm.com/docs/databases-for-cassandra) + +## Learn more ## + +[IBM Cloud Databases for DataStax Documentation](https://cloud.ibm.com/databases/databases-for-cassandra/create) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ebb83f528ac02840efe18510ed95979d2cda5641.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ebb83f528ac02840efe18510ed95979d2cda5641.md new file mode 100644 index 0000000..1d68870 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ebb83f528ac02840efe18510ed95979d2cda5641.md @@ -0,0 +1,314 @@ +# AutoAI implementation details + +# AutoAI implementation details # + +AutoAI automatically prepares data, applies algorithms, or estimators, and builds model pipelines that are best suited for your data and use case\. + +The following sections describe some of these technical details that go into generating the pipelines and provide a list of research papers that describe how AutoAI was designed and implemented\. + + + + * [Preparing the data for training (pre\-processing)](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html?context=cdpaas&locale=en#data-prep) + * [Automated model selection](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html?context=cdpaas&locale=en#auto-select) + * [Algorithms used for classification models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html?context=cdpaas&locale=en#estimators-classification) + * [Algorithms used for regression models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html?context=cdpaas&locale=en#estimators-regression) + * [Metrics by model type](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html?context=cdpaas&locale=en#metric-by-model) + * [Data transformations](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html?context=cdpaas&locale=en#data-transformations) + * [Automated Feature Engineering](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html?context=cdpaas&locale=en#feat-eng) + * [Hyperparameter optimization](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html?context=cdpaas&locale=en#hyper-opt) + * [AutoAI FAQ](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html?context=cdpaas&locale=en#autoai-faq) + * [Learn more](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html?context=cdpaas&locale=en#add-resource) + + + +## Preparing the data for training (data pre\-processing) ## + +During automatic data preparation, or pre\-processing, AutoAI analyzes the training data and prepares it for model selection and pipeline generation\. Most data sets contain missing values but machine learning algorithms typically expect no missing values\. On exception to this rule is described in [xgboost section 3\.4](https://arxiv.org/abs/1603.02754)\. AutoAI algorithms perform various missing value imputations in your data set by using various techniques, making your data ready for machine learning\. In addition, AutoAI detects and categorizes features based on their data types, such as categorical or numerical\. It explores encoding and scaling strategies that are based on the feature categorization\. + +Data preparation involves these steps: + + + + * [Feature column classification](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html?context=cdpaas&locale=en#col-classification) + * [Feature engineering](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html?context=cdpaas&locale=en#feature-eng) + * [Pre\-processing (data imputation and encoding)](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-details.html?context=cdpaas&locale=en#pre-process) + + + +### Feature column classification ### + + + + * Detects the types of feature columns and classifies them as categorical or numerical class + * Detects various types of missing values (default, user\-provided, outliers) + + + +### Feature engineering ### + + + + * Handles rows for which target values are missing (drop (default) or target imputation) + * Drops unique value columns (except datetime and timestamps) + * Drops constant value columns + + + +### Pre\-processing (data imputation and encoding) ### + + + + * Applies Sklearn imputation/encoding/scaling strategies (separately on each feature class)\. For example, the current default method for missing value imputation strategies, which are used in the product are `most frequent` for categorical variables and `mean` for numerical variables\. + * Handles labels of test set that were not seen in training set + * HPO feature: Optimizes imputation/encoding/scaling strategies given a data set and algorithm + + + +## Automatic model selection ## + +The second stage in an AutoAI experiment training is automated model selection\. The automated model selection algorithm uses the Data Allocation by using Upper Bounds strategy\. This approach sequentially allocates small subsets of training data among a large set of algorithms\. The goal is to select an algorithm that gives near\-optimal accuracy when trained on all data, while also minimizing the cost of misallocated samples\. The system currently supports all Scikit\-learn algorithms, and the popular XGBoost and LightGBM algorithms\. Training and evaluation of models on large data sets is costly\. The approach of starting small subsets and allocating incrementally larger ones to models that work well on the data set saves time, without sacrificing performance\. Snap machine learning algorithms were added to the system to boost the performance even more\. + +### Selecting algorithms for a model ### + +Algorithms are selected to match the data and the nature of the model, but they can also balance accuracy and duration of runtime, if the model is configured for that option\. For example, Snap ML algorithms are typically faster for training than Scikit\-learn algorithms\. They are often the preferred algorithms AutoAI selects automatically for cases where training is optimized for a shorter run time and accuracy\. You can manually select them if training speed is a priority\. For details, see [Snap ML documentation](https://snapml.readthedocs.io/)\. For a discussion of when SnapML algorithms are useful, see this [blog post on using SnapML algorithms](https://lukasz-cmielowski.medium.com/watson-studio-autoai-python-api-and-covid-19-data-78169beacf36)\. + +### Algorithms used for classification models ### + +These algorithms are the default algorithms that are used for model selection for classification problems\. + + + +Table 1: Default algorithms for classification + +| **Algorithm** | **Description** | +| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Decision Tree Classifier | Maps observations about an item (represented in branches) to conclusions about the item's target value (represented in leaves)\. Supports both binary and multiclass labels, and both continuous and categorical features\. | +| Extra Trees Classifier | An averaging algorithm based on randomized decision trees\. | +| Gradient Boosted Tree Classifier | Produces a classification prediction model in the form of an ensemble of decision trees\. It supports binary labels and both continuous and categorical features\. | +| LGBM Classifier | Gradient boosting framework that uses leaf\-wise (horizontal) tree\-based learning algorithm\. | +| Logistic Regression | Analyzes a data set where one or more independent variables that determine one of two outcomes\. Only binary logistic regression is supported | +| Random Forest Classifier | Constructs multiple decision trees to produce the label that is a mode of each decision tree\. It supports both binary and multiclass labels, and both continuous and categorical features\. | +| SnapDecisionTreeClassifier | This algorithm provides a decision tree classifier by using the IBM Snap ML library\. | +| SnapLogisticRegression | This algorithm provides regularized logistic regression by using the IBM Snap ML solver\. | +| SnapRandomForestClassifier | This algorithm provides a random forest classifier by using the IBM Snap ML library\. | +| SnapSVMClassifier | This algorithm provides a regularized support vector machine by using the IBM Snap ML solver\. | +| XGBoost Classifier | Accurate sure procedure that can be used for classification problems\. XGBoost models are used in various areas, including web search ranking and ecology\. | +| SnapBoostingMachineClassifier | Boosting machine for binary and multi\-class classification tasks that mix binary decision trees with linear models with random fourier features\. | + + + +### Algorithms used for regression models ### + +These algorithms are the default algorithms that are used for automatic model selection for regression problems\. + + + +Table 2: Default algorithms for regression + +| **Algorithm** | **Description** | +| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Decision Tree Regression | Maps observations about an item (represented in the branches) to conclusions about the item's target value (represented in the leaves)\. It supports both continuous and categorical features\. | +| Extra Trees Regression | An averaging algorithm based on randomized decision trees\. | +| Gradient Boosting Regression | Produces a regression prediction model in the form of an ensemble of decision trees\. It supports both continuous and categorical features\. | +| LGBM Regression | Gradient boosting framework that uses tree\-based learning algorithms\. | +| Linear Regression | Models the linear relationship between a scalar\-dependent variable y and one or more explanatory variables (or independent variables) x\. | +| Random Forest Regression | Constructs multiple decision trees to produce the mean prediction of each decision tree\. It supports both continuous and categorical features\. | +| Ridge | Ridge regression is similar to Ordinary Least Squares but imposes a penalty on the size of coefficients\. | +| SnapBoostingMachineRegressor | This algorithm provides a boosting machine by using the IBM Snap ML library that can be used to construct an ensemble of decision trees\. | +| SnapDecisionTreeRegressor | This algorithm provides a decision tree by using the IBM Snap ML library\. | +| SnapRandomForestRegressor | This algorithm provides a random forest by using the IBM Snap ML library\. | +| XGBoost Regression | GBRT is an accurate and effective off\-the\-shelf procedure that can be used for regression problems\. Gradient Tree Boosting models are used in various areas, including web search ranking and ecology\. | + + + +## Metrics by model type ## + +The following metrics are available for measuring the accuracy of pipelines during training and for scoring data\. + +### Binary classification metrics ### + + + + * Accuracy (default for ranking the pipelines) + * Roc auc + * Average precision + * F + * Negative log loss + * Precision + * Recall + + + +### Multi\-class classification metrics ### + +Metrics for multi\-class models generate scores for how well a pipeline performs against the specified measurement\. For example, an F1 score averages *precision* (of the predictions made, how many positive predictions were correct) and *recall* (of all possible positive predictions, how many were predicted correctly)\. + +You can further refine a score by qualifying it to calculate the given metric globally (macro), per label (micro), or to weight an imbalanced data set to favor classes with more representation\. + + + + * Metrics with the *micro* qualifier calculate metrics globally by counting the total number of true positives, false negatives and false positives\. + * Metrics with the *macro* qualifier calculates metrics for each label, and finds their unweighted mean\. All labels are weighted equally\. + * Metrics with the *weighted* qualifier calculate metrics for each label, and find their average weighted by the contribution of each class\. For example, in a data set that includes categories for apples, peaches, and plums, if there are many more instances of apples, the weighted metric gives greater importance to correctly predicting apples\. This alters *macro* to account for label imbalance\. Use a weighted metric such as F1\-weighted for an imbalanced data set\. + + + +These are the multi\-class classification metrics: + + + + * Accuracy (default for ranking the pipelines) + * F1 + * F1 Micro + * F1 Macro + * F1 Weighted + * Precision + * Precision Micro + * Precision Macro + * Precision Weighted + * Recall + * Recall Micro + * Recall Macro + * Recall Weighted + + + +### Regression metrics ### + + + + * Negative root mean squared error (default for ranking the pipeline) + * Negative mean absolute error + * Negative root mean squared log error + * Explained variance + * Negative mean squared error + * Negative mean squared log error + * Negative median absolute error + * R2 + + + +## Automated Feature Engineering ## + +The third stage in the AutoAI process is automated feature engineering\. The automated feature engineering algorithm is based on Cognito, described in the research papers, [Cognito: Automated Feature Engineering for Supervised Learning](https://ieeexplore.ieee.org/abstract/document/7836821) and [Feature Engineering for Predictive Modeling by using Reinforcement Learning](https://research.ibm.com/publications/feature-engineering-for-predictive-modeling-using-reinforcement-learning)\. The system explores various feature construction choices in a hierarchical and nonexhaustive manner, while progressively maximizing the accuracy of the model through an exploration\-exploitation strategy\. This method is inspired from the "trial and error" strategy for feature engineering, but conducted by an autonomous agent in place of a human\. + +### Metrics used for feature importance ### + +For tree\-based classification and regression algorithms such as Decision Tree, Extra Trees, Random Forest, XGBoost, Gradient Boosted, and LGBM, feature importances are their inherent feature importance scores based on the reduction in the criterion that is used to select split points, and calculated when these algorithms are trained on the training data\. + +For nontree algorithms such as Logistic Regression, LInear Regression, SnapSVM, and Ridge, the feature importances are the feature importances of a Random Forest algorithm that is trained on the same training data as the nontree algorithm\. + +For any algorithm, all feature importances are in the range between zero and one and have been normalized as the ratio with respect to the maximum feature importance\. + +### Data transformations ### + +For feature engineering, AutoAI uses a novel approach that explores various feature construction choices in a structured, nonexhaustive manner, while progressively maximizing model accuracy by using reinforcement learning\. This results in an optimized sequence of transformations for the data that best match the algorithms, or algorithms, of the model selection step\. This table lists some of the transformations that are used and some well\-known conditions under which they are useful\. This is not an exhaustive list of scenarios where the transformation is useful, as that can be complex and hard to interpret\. Finally, the listed scenarios are not an explanation of how the transformations are selected\. The selection of which transforms to apply is done in a trial and error, performance\-oriented manner\. + + + +Table 3: Transformations for feature engineering + +| **Name** | **Code** | **Function** | +| ---------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Principle Component Analysis | pca | Reduce dimensions of data and realign across a more suitable coordinate system\. Helps tackle the 'curse of dimensionality' in linearly correlated data\. It eliminates redundancy and separates significant signals in data\. | +| Standard Scaler | stdscaler | Scales data features to a standard range\. This helps the efficacy and efficiency of certain learning algorithms and other transformations such as PCA\. | +| Logarithm | log | Reduces right skewness in features and make them more symmetric\. Resulting symmetry in features helps algorithms understand the data better\. Even scaling based on mean and variance is more meaningful on symmetrical data\. Additionally, it can capture specific physical relationships between feature and target that is best described through a logarithm\. | +| Cube Root | cbrt | Reduces right skewness in data like logarithm, but is weaker than log in its impact, which might be more suitable in some cases\. It is also applicable to negative or zero values to which log doesn't apply\. Cube root can also change units such as reducing volume to length\. | +| Square root | sqrt | Reduces mild right skewness in data\. It is weaker than log or cube root\. It works with zeros and reduces spatial dimensions such as area to length\. | +| Square | square | Reduces left skewness to a moderate extent to make such distributions more symmetric\. It can also be helpful in capturing certain phenomena such as super\-linear growth\. | +| Product | product | A product of two features can expose a nonlinear relationship to better predict the target value than the individual values alone\. For example, item cost into number of items that are sold is a better indication of the size of a business than any of those alone\. | +| Numerical XOR | nxor | This transform helps capture "exclusive disjunction" type of relationships between variables, similar to a bitwise XOR, but in a general numerical context\. | +| Sum | sum | Sometimes the sum of two features is better correlated to the prediction target than the features alone\. For instance, loans from different sources, when summed up, provide a better idea of a credit applicant's total indebtedness\. | +| Divide | divide | Division is a fundamental operand that is used to express quantities such as gross GDP over population (per capita GDP), representing a country's average lifespan better than either GDP alone or population alone\. | +| Maximum | max | Take the higher of two values\. | +| Rounding | round | This transformation can be seen as perturbation or adding some noise to reduce overfitting that might be a result of inaccurate observations\. | +| Absolute Value | abs | Consider only the magnitude and not the sign of observation\. Sometimes, the direction or sign of an observation doesn't matter so much as the magnitude of it, such as physical displacement, while considering fuel or time spent in the actual movement\. | +| Hyperbolic tangent | tanh | Nonlinear activation function can improve prediction accuracy, similar to that of neural network activation functions\. | +| Sine | sin | Can reorient data to discover periodic trends such as simple harmonic motions\. | +| Cosine | cos | Can reorient data to discover periodic trends such as simple harmonic motions\. | +| Tangent | tan | Trigonometric tangent transform is usually helpful in combination with other transforms\. | +| Feature Agglomeration | feature agglomeration | Clustering different features into groups, based on distance or affinity, provides ease of classification for the learning algorithm\. | +| Sigmoid | sigmoid | Nonlinear activation function can improve prediction accuracy, similar to that of neural network activation functions\. | +| Isolation Forest | isoforestanomaly | Performs clustering by using an Isolation Forest to create a new feature containing an anomaly score for each sample\. | +| Word to vector | word2vec | This algorithm, which is used for text analysis, is applied before all other transformations\. It takes a corpus of text as input and outputs a set of vectors\. By turning text into a numerical representation, it can detect and compare similar words\. When trained with enough data, `word2vec` can make accurate predictions about a word’s meaning or relationship to other words\. The predictions can be used to analyze text and predict meaning in sentiment analysis applications\. | + + + +## Hyperparameter Optimization ## + +The final stage in AutoAI is hyperparameter optimization\. The AutoAI approach optimizes the parameters of the best performing pipelines from the previous phases\. It is done by exploring the parameter ranges of these pipelines by using a black box hyperparameter optimizer called RBFOpt\. RBFOpt is described in the research paper [RBFOpt: an open\-source library for black\-box optimization with costly function evaluations](http://www.optimization-online.org/DB_HTML/2014/09/4538.html)\. RBFOpt is suited for AutoAI experiments because it is built for optimizations with costly evaluations, as in the case of training and scoring an algorithm\. RBFOpt's approach builds and iteratively refines a surrogate model of the unknown objective function to converge quickly despite the long evaluation times of each iteration\. + +## AutoAI FAQs ## + +The following are commonly asked questions about creating an AutoAI experiment\. + +### How many pipelines are created? ### + +Two AutoAI parameters determine the number of pipelines: + + + + * **max\_num\_daub\_ensembles:** Maximum number (top\-K ranked by DAUB model selection) of the selected algorithm, or estimator types, for example LGBMClassifierEstimator, XGBoostClassifierEstimator, or LogisticRegressionEstimator to use in pipeline composition\. The default is 1, where only the highest ranked by model selection algorithm type is used\. + * **num\_folds:** Number of subsets of the full data set to train pipelines in addition to the full data set\. The default is 1 for training the full data set\. + + + +For each fold and algorithm type, AutoAI creates four pipelines of increased refinement, corresponding to: + + + +1. Pipeline with default sklearn parameters for this algorithm type, +2. Pipeline with optimized algorithm by using HPO +3. Pipeline with optimized feature engineering +4. Pipeline with optimized feature engineering and optimized algorithm by using HPO + + + +The total number of pipelines that are generated is: + + TotalPipelines= max_num_daub_ensembles * 4, if num_folds = 1: + + TotalPipelines= (num_folds+1)* max_num_daub_ensembles * 4, if num_folds > 1 : + +### What hyperparameter optimization is applied to my model? ### + +AutoAI uses a model\-based, derivative\-free global search algorithm, called RBfOpt, which is tailored for the costly machine learning model training and scoring evaluations that are required by hyperparameter optimization (HPO)\. In contrast to Bayesian optimization, which fits a Gaussian model to the unknown objective function, RBfOpt fits a radial basis function mode to accelerate the discovery of hyper\-parameter configurations that maximize the objective function of the machine learning problem at hand\. This acceleration is achieved by minimizing the number of expensive training and scoring machine learning models evaluations and by eliminating the need to compute partial derivatives\. + +For each fold and algorithm type, AutoAI creates two pipelines that use HPO to optimize for the algorithm type\. + + + + * The first is based on optimizing this algorithm type based on the preprocessed (imputed/encoded/scaled) data set (pipeline 2) above)\. + * The second is based on optimizing the algorithm type based on optimized feature engineering of the preprocessed (imputed/encoded/scaled) data set\. + + + +The parameter values of the algorithms of all pipelines that are generated by AutoAI is published in status messages\. + +For more details regarding the RbfOpt algorithm, see: + + + + * [RbfOpt: A blackbox optimization library in Python](https://github.com/coin-or/rbfopt) + * [An effective algorithm for hyperparameter optimization of neural networks\. IBM Journal of Research and Development, 61(4\-5), 2017](http://ieeexplore.ieee.org/document/8030298/) + + + +**Research references** + +This list includes some of the foundational research articles that further detail how AutoAI was designed and implemented to promote trust and transparency in the automated model\-building process\. + + + + * [Toward cognitive automation of data science](https://scholar.google.com/citations?view_op=view_citation&hl=en&user=km7EsqsAAAAJ&cst[…]&sortby=pubdate&citation_for_view=km7EsqsAAAAJ:R3hNpaxXUhUC) + * [Cognito: Automated feature engineering for supervised learning](https://scholar.google.com/citations?view_op=view_citation&hl=en&user=km7EsqsAAAAJ&cst[…]&sortby=pubdate&citation_for_view=km7EsqsAAAAJ:maZDTaKrznsC) + + + +## Next steps ## + +[Data imputation in AutoAI experiments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-imputation.html) + +**Parent topic:**[AutoAI overview](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/autoai-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec03e18490e47db0efbd6a00bda7ddb85b0a14d7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec03e18490e47db0efbd6a00bda7ddb85b0a14d7.md new file mode 100644 index 0000000..262b139 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec03e18490e47db0efbd6a00bda7ddb85b0a14d7.md @@ -0,0 +1,85 @@ +# Get help + +# Get help # + +You can get help with IBM watsonx through documentation, training, support, and community resources\. + + + + * [Platform setup](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-help.html?context=cdpaas&locale=en#platform) + * [Training](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-help.html?context=cdpaas&locale=en#training) + * [Community resources](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-help.html?context=cdpaas&locale=en#community) + * [Samples](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-help.html?context=cdpaas&locale=en#samples) + * [Support](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-help.html?context=cdpaas&locale=en#support) + + + +## Help with platform setup ## + +You must be the account owner or administrator for a billable IBM Cloud account to set up the IBM watsonx platform for your organization\. To learn how to set up IBM watsonx, see [Setting up the platform](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-platform.html)\. + +## Training ## + +Start training your model by data preparation, analysis, and visualization\. Learn how to build, deploy, and trust your models\. Use the following tutorials and videos to get started with IBM watsonx: + + + + * [Quick start tutorials](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html) + * [Video library](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html) + + + +## Community resources ## + +Share and gain knowledge using IBM Community and get the most out of our services\. + +Explore blogs, forums, and other resources in these communities: + + + + * [watsonx\.ai Community](https://community.ibm.com/community/user/watsonx/communities/community-home?communitykey=81927b7e-9a92-4236-a0e0-018a27c4ad6e) + * [Data Science Community](https://community.ibm.com/community/user/datascience/home) + * [Watson Studio Community](https://community.ibm.com/community/user/watsonstudio/home) + + + +Find more blogs and forums on the following platforms: + + + + * [IBM Data and AI on Medium](https://medium.com/ibm-data-ai) + * [Watson Studio Stack Overflow](https://stackoverflow.com/questions/tagged/watson-studio) + + + +## Samples ## + +You can use sample projects, notebooks, and data sets to get started fast\. + +Find samples in the following locations: + + + + * [Samples](https://dataplatform.cloud.ibm.com/gallery) + * [IBM Data Science assets in GitHub](https://github.com/IBMDataScience) + + + +## Support ## + +IBM Cloud provides you with three paid support options to customize your experience according to your business needs\. Choose from [Basic, Advanced, or Premium support plan](https://cloud.ibm.com/docs/get-support?topic=get-support-support-plans)\. The level of support that you select determines the severity that you can assign to support cases and your level of access to the tools available in the Support Center\. + +You can also go to [IBM Cloud Support Center](https://cloud.ibm.com/unifiedsupport/supportcenter) to open a support case, browse FAQs, or ask questions to IBM Chat Bot\. + +## Learn more ## + + + + * [Known issues](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/known-issues.html) + * [FAQ](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html) + * [Browser support](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/browser-support.html) + * [Language support](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/localization.html) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec10ac085ba8a12ba0d8af2dc66adfbe759b3183.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec10ac085ba8a12ba0d8af2dc66adfbe759b3183.md new file mode 100644 index 0000000..b8bcf2d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec10ac085ba8a12ba0d8af2dc66adfbe759b3183.md @@ -0,0 +1,7 @@ +# Sim Gen node (SPSS Modeler) + +# Sim Gen node # + +The Simulation Generate node provides an easy way to generate simulated data, either without historical data using user specified statistical distributions, or automatically using the distributions obtained from running a Simulation Fitting node on existing historical data\. Generating simulated data is useful when you want to evaluate the outcome of a predictive model in the presence of uncertainty in the model inputs\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec154ae6f7fe894644424bfa90c6ca31e13a4b71.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec154ae6f7fe894644424bfa90c6ca31e13a4b71.md new file mode 100644 index 0000000..d0ba63b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec154ae6f7fe894644424bfa90c6ca31e13a4b71.md @@ -0,0 +1,24 @@ +# applybayesnetnode properties + +# applybayesnetnode properties # + +You can use Bayesian network modeling nodes to generate a Bayesian network model nugget\. The scripting name of this model nugget is *applybayesnetnode*\. For more information on scripting the modeling node itself, see [bayesnetnode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/bayesnetnodeslots.html#bayesnetnodeslots)\. + + + +applybayesnetnode properties + +Table 1\. applybayesnetnode properties + +| `applybayesnetnode` Properties | Values | Property description | +| --------------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `all_probabilities` | *flag* | | +| `raw_propensity` | *flag* | | +| `adjusted_propensity` | *flag* | | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `enable_sql_generation` | `false``native` | When using data from a database, SQL code can be pushed back to the database for execution, providing superior performance for many operations\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec284ab3dc23241975f76e0519b531407042aef1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec284ab3dc23241975f76e0519b531407042aef1.md new file mode 100644 index 0000000..cef4683 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec284ab3dc23241975f76e0519b531407042aef1.md @@ -0,0 +1,88 @@ +# Amazon RDS for PostgreSQL connection + +# Amazon RDS for PostgreSQL connection # + +To access your data in Amazon RDS for PostgreSQL, create a connection asset for it\. + +Amazon RDS for PostgreSQL is a PostgreSQL relational database that runs on the Amazon Relational Database Service (RDS)\. + +## Supported versions ## + +PostgreSQL database versions 9\.4, 9\.5, 9\.6, 10, 11 and 12 + +## Create a connection to Amazon RDS for PostgreSQL ## + +To create the connection asset, you need these connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Username and password + * SSL certificate (if required by the database server) + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Amazon RDS for PostgreSQL connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Decision Optimization + * Notebooks\. Click **Read data** on the **Code snippets** pane to get the connection credentials and load the data into a data structure\. See [Load data from data source connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/load-and-access-data.html#conns)\. + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Amazon RDS for PostgreSQL setup ## + +For setup instructions, see these topics: + + + + * [Creating an Amazon RDS DB Instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html) + * [Connecting to a DB Instance Running the PostgreSQL Database Engine](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ConnectToPostgreSQLInstance.html) + + + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [ Amazon RDS for PostgreSQL documentation](https://aws.amazon.com/rds/postgresql/) for the correct syntax\. + +## Learn more ## + +[Amazon RDS for PostgreSQL](https://aws.amazon.com/rds/postgresql/) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec433541f7f0c2dc7620ff10cf44884f96ef7aa5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec433541f7f0c2dc7620ff10cf44884f96ef7aa5.md new file mode 100644 index 0000000..89bb559 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec433541f7f0c2dc7620ff10cf44884f96ef7aa5.md @@ -0,0 +1,80 @@ +# Importing scripts into a notebook + +# Importing scripts into a notebook # + +If you want to streamline your notebooks, you can move some of the code from your notebooks into a script that your notebook can import\. For example, you can move all helper functions, classes, and visualization code snippets into a script, and the script can be imported by all of the notebooks that share the same runtime\. Without all of the extra code, your notebooks can more clearly communicate the results of your analysis\. + +To import a script from your local machine to a notebook and write to the script from the notebook, use one of the following options: + + + + * Copy the code from your local script file into a notebook cell\. + + + + * For Python: + + At the beginning of this cell, add `%%writefile myfile.py` to save the code as a Python file to your working directory. Notebooks that use the same runtime can also import this file. + + The advantage of this method is that the code is available in your notebook, and you can edit and save it as a new Python script at any time. + * For R: + + If you want to save code in a notebook as an R script to the working directory, you can use the `writeLines(myfile.R)` function. + + + + * Save your local script file in Cloud Object Storage and then make the file available to the runtime by adding it to the runtime's local file system\. This is only supported for Python\. + + + + 1. Click the **Upload asset to project** icon (![Shows the Upload asset to project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/find_data_icon.png)), and then browse the script file or drag it into your notebook sidebar. The script file is added to Cloud Object Storage bucket associated with your project. + 2. Make the script file available to the Python runtime by adding the script to the runtime's local file system: + + + + 1. Click the **Code snippets icon** (![Code snippets icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/code-snippets-icon.png)), and then select **Read data**. + ![Read data](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/code-snippets-read-data.png) + 2. Click **Select data from project** and then select **Data asset**. + 3. From the list of data assets available in your project's COS, select your script and then click **Select**. + ![Select data from project](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/select-data-from-project.png). + 4. Click an empty cell in your notebook and then from the **Load as** menu in the notebook sidebar select **Insert StreamingBody object**. + ![Insert StreamingBody object to notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/read-as-streaming-body.png) + 5. Write the contents of the StreamingBody object to a file in the local runtime\`s file system: + + f = open('.py', 'wb') + f.write(streaming_body_1.read()) + f.close() + + This opens a file with write access and calls the write method to write to the file. + 6. Import the script: + + import + + + + + + + +To import the classes to access the methods in a script in your notebook, use the following command: + + + + * For Python: + + from import + * For R: + + source("./myCustomFunctions.R") + ## available in base R + + To source an R script from the web: + + source_url("") + ## available in devtools + + + +**Parent topic:**[Libraries and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/libraries.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec7fcf477e212945eab7bb85c2279f37d62d4b49.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec7fcf477e212945eab7bb85c2279f37d62d4b49.md new file mode 100644 index 0000000..c38a8e7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ec7fcf477e212945eab7bb85c2279f37d62d4b49.md @@ -0,0 +1,42 @@ +# Comparing the models (SPSS Modeler) + +# Comparing the models # + + + +1. Run the flow\. A generated model nugget is built and placed on the canvas, and results are added to the Outputs panel\. You can view the model nugget, or save or deploy it in a number of ways\. + + + +Right\-click the model nugget and select View Model\. You'll see details about each of the models created during the run\. (In a real situation, in which hundreds of models are estimated on a large dataset, this could take many hours\.) + +Figure 1\. Auto numeric example flow with model nugget + +![Auto numeric sample flow with model nugget](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autocont.png) + +If you want to explore any of the individual models further, you can click a model name in the ESTIMATOR column to drill down and explore the individual model results\. + +Figure 2\. Auto Numeric results + +![Auto Numeric results](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autocont_compare_view.png) + +By default, models are sorted by accuracy (correlation) because correlation this was the measure you selected in the Auto Numeric node's properties\. For purposes of ranking, the absolute value of the accuracy is used, with values closer to 1 indicating a stronger relationship\. + +You can sort on a different column by clicking the header for that column\. + +Based on these results, you decide to use all three of these most accurate models\. By combining predictions from multiple models, limitations in individual models may be avoided, resulting in a higher overall accuracy\. + +In the USE column, make sure all three models are selected\. + +Attach an Analysis node (from the Outputs palette) after the model nugget\. Right\-click the Analysis node and choose Run to run the flow again\. + +Figure 3\. Auto Numeric sample flow + +![Auto numeric sample flow](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autocont.png) + +The averaged score generated by the ensembled model is added in a field named `$XR-taxable_value`, with a correlation of 0\.934, which is higher than those of the three individual models\. The ensemble scores also show a low mean absolute error and may perform better than any of the individual models when applied to other datasets\. + +Figure 4\. Auto Numeric sample flow analysis results + +![Auto numeric sample flow analysis results](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_autocont_compare_results.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ed7afe85422b1db8eaed166840d275dddb63cafa.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ed7afe85422b1db8eaed166840d275dddb63cafa.md new file mode 100644 index 0000000..f0cd650 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ed7afe85422b1db8eaed166840d275dddb63cafa.md @@ -0,0 +1,117 @@ +# Managing your account settings + +# Managing your account settings # + +From the Account window you can view information about your IBM Cloud account and set the **Resource scope**, **Credentials for connections**, and **Regional project storage** settings for IBM watsonx\. + + + + * [View account information](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/account-settings.html?context=cdpaas&locale=en#view-account-information) + * [Set the scope for resources](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/account-settings.html?context=cdpaas&locale=en#set-the-scope-for-resources) + * [Set the type of credentials for connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/account-settings.html?context=cdpaas&locale=en#set-the-credentials-for-connections) + * [Set the login session expiration](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/account-settings.html?context=cdpaas&locale=en#set-expiration) + + + +You must be the IBM Cloud account owner or administrator to manage the account settings\. + +## View account information ## + +You can see the account name, ID and type\. + + + +1. Select **Administration > Account and billing > Account** to open the account window\. +2. If you need to manage your Cloud account, click the **Manage in IBM Cloud** link to navigate to the Account page on IBM Cloud\. + + + +## Set the scope for resources ## + +By default, account users see resources based on membership\. You can restrict the resource scope to the current account to control access\. By setting the resource scope to the current account, users cannot access resources outside of their account, regardless of membership\. The scope applies to projects, catalogs, and spaces\. + +To restrict resources to current account: + + + +1. Select **Administration > Account and billing > Account** to open the account settings window\. +2. Set **Resource scope** to **On**\. Access is updated immediately to be restricted to the current account\. + + + +## Set the credentials for connections ## + +The credentials for connections setting determines the type of credentials users must specify when creating a new connection\. This setting applies only when new connections are created; existing connections are not affected\. + +### Either personal or shared credentials ### + +You can allow users the ability to specify personal or shared credentials when creating a new connection\. Radio buttons will appear on the new connection form, allowing the user to select personal or shared\. + +To allow the credential type to be chosen on the new connection form: + + + +1. Select **Administration > Account and billing > Account** to open the account settings window\. +2. Set both **Shared credentials** and **Personal credentials** to **Enabled**\. + + + +### Personal credentials ### + +When personal credentials are specified, each user enters their own credentials when creating a new connection or when using a connection to access data\. + +To require personal credentials for all new connections: + + + +1. Select **Administration > Account and billing > Account** to open the account settings window\. +2. Set **Personal credentials** to **Enabled**\. +3. Set **Shared credentials** to **Disabled**\. + + + +### Shared credentials ### + +With shared credentials, the credentials that were entered by the creator of the connection are made available to all other users when accessing data with the connection\. + +To require shared credentials for all new connections: + + + +1. Select **Administration > Account and billing > Account** to open the account settings window\. +2. Set **Shared credentials** to **Enabled**\. +3. Set **Personal credentials** to **Disabled**\. + + + +## Set the login session expiration ## + +Active and inactive session durations are managed through IBM Cloud\. You are notified of a session expiration 5 minutes before the session expires\. Unless your service supports autosaving, your work is not saved when your session expires\. + +You can change the default durations for active and inactive sessions\. For more information on required permissions and duration limits, see [Setting limits for login sessions](https://cloud.ibm.com/docs/account?topic=account-iam-work-sessions&interface=ui)\. + +To change the default durations: + + + +1. From the watsonx navigation menu, select **Administration > Access (IAM)**\. +2. In IBM Cloud, select **Manage > Access (IAM) > Settings**\. +3. Select the **Login session** tab\. +4. For each expiration time that you want to change, edit the time and click **Save**\. + + + +The inactivity duration cannot be longer than the maximum session duration, and the token lifetime cannot be longer than the inactivity duration\. IBM Cloud prevents you from inputing an invalid combination of settings\. + +### Learn more ### + + + + * [Managing all projects in the account](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-manage-projects.html) + * [Adding connections to projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html) + + + +**Parent topic:**[Managing IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_console.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/edb1038f1d71a450556d13ae34a416e46d7213fe.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/edb1038f1d71a450556d13ae34a416e46d7213fe.md new file mode 100644 index 0000000..67bb9fb --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/edb1038f1d71a450556d13ae34a416e46d7213fe.md @@ -0,0 +1,42 @@ +# Examining the data (SPSS Modeler) + +# Examining the data # + +It's always a good idea to have a feel for the nature of your data before building a model\. + +Does the data exhibit seasonal variations? Although Watson Studio can automatically find the best seasonal or nonseasonal model for each series, you can often obtain faster results by limiting the search to nonseasonal models when seasonality is not present in your data\. Without examining the data for each of the local markets, we can get a rough picture of the presence or absence of seasonality by plotting the total number of subscribers over all five markets\. + +Figure 1\. Plotting the total number of subscribers + +![Plotting the total number of subscribers](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_bandwidth_forecast_data1.png) + + + +1. From the Graphs palette, attach a Time Plot node to the Filter node\. +2. Add the `Total` field to the Series list\. +3. Deselect the Display series in separate panel and Normalize options\. Save the changes\. +4. Right\-click the Time Plot node and run it, then open the output that was generated\. + + Figure 2. Time plot of the Total field + + ![Time plot of the Total field](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_bandwidth_forecast_data2.png) + + The series exhibits a very smooth upward trend with no hint of seasonal variations. There might be individual series with seasonality, but it appears that seasonality isn't a prominent feature of the data in general. + + Of course, you should inspect each of the series before ruling out seasonal models. You can then separate out series exhibiting seasonality and model them separately. + + Watson Studio makes it easy to plot multiple series together. +5. Double\-click the Time Plot node to open its properties again\. +6. Remove the `Total` field from the Series list\. +7. Add the `Market_1` through `Market_5` fields to the list\. +8. Run the Time Plot node again\. + + Figure 3. Time plot of multiple fields + + ![Time plot of multiple fields](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_bandwidth_forecast_data3.png) + + Inspection of each of the markets reveals a steady upward trend in each case. Although some markets are a little more erratic than others, there's no evidence of seasonality. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ee838ea978f9a0b0265a8d2b35ff2f64d00a1738.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ee838ea978f9a0b0265a8d2b35ff2f64d00a1738.md new file mode 100644 index 0000000..94bc9a8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ee838ea978f9a0b0265a8d2b35ff2f64d00a1738.md @@ -0,0 +1,9 @@ +# Collection node (SPSS Modeler) + +# Collection node # + +Collections are similar to histograms, but collections show the distribution of values for one numeric field relative to the values of another, rather than the occurrence of values for a single field\. A collection is useful for illustrating a variable or field whose values change over time\. + +Using 3\-D graphing, you can also include a symbolic axis displaying distributions by category\. Two\-dimensional collections are shown as stacked bar charts, with overlays where used\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eec0eb0502def7b7adb112f8d7d4c38e1f6d9170.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eec0eb0502def7b7adb112f8d7d4c38e1f6d9170.md new file mode 100644 index 0000000..bca6d8b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eec0eb0502def7b7adb112f8d7d4c38e1f6d9170.md @@ -0,0 +1,39 @@ +# Numeric functions (SPSS Modeler) + +# Numeric functions # + +CLEM contains a number of commonly used numeric functions\. + + + +CLEM numeric functions + +Table 1\. CLEM numeric functions + +| Function | Result | Description | +| ---------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| –`NUM` | *Number* | Used to negate *NUM*\. Returns the corresponding number with the opposite sign\. | +| `NUM1` \+ `NUM2` | *Number* | Returns the sum of *NUM1* and *NUM2*\. | +| `NUM1` –`NUM2` | *Number* | Returns the value of *NUM2* subtracted from *NUM1*\. | +| `NUM1` \* `NUM2` | *Number* | Returns the value of *NUM1* multiplied by *NUM2*\. | +| `NUM1` / `NUM2` | *Number* | Returns the value of *NUM1* divided by *NUM2*\. | +| `INT1 div INT2` | *Number* | Used to perform integer division\. Returns the value of *INT1* divided by *INT2*\. | +| `INT1 rem INT2` | *Number* | Returns the remainder of *INT1* divided by *INT2*\. For example, `INT1 – (INT1 div INT2)* INT2`\. | +| `BASE ** POWER` | *Number* | Returns *BASE* raised to the power *POWER*, where either may be any number (except that *BASE* must not be zero if *POWER* is zero of any type other than integer 0)\. If *POWER* is an integer, the computation is performed by successively multiplying powers of *BASE*\. Thus, if *BASE* is an integer, the result will be an integer\. If *POWER* is integer 0, the result is always a 1 of the same type as *BASE*\. Otherwise, if *POWER* is not an integer, the result is computed as `exp(POWER * log(BASE))`\. | +| `abs(NUM)` | *Number* | Returns the absolute value of *NUM*, which is always a number of the same type\. | +| `exp(NUM)` | *Real* | Returns *e* raised to the power *NUM*, where *e* is the base of natural logarithms\. | +| `fracof(NUM)` | *Real* | Returns the fractional part of *NUM*, defined as `NUM–intof(NUM)`\. | +| `intof(NUM)` | *Integer* | Truncates its argument to an integer\. It returns the integer of the same sign as *NUM* and with the largest magnitude such that `abs(INT) <= abs(NUM)`\. | +| `log(NUM)` | *Real* | Returns the natural (base *e*) logarithm of *NUM*, which must not be a zero of any kind\. | +| `log10(NUM)` | *Real* | Returns the base 10 logarithm of *NUM*, which must not be a zero of any kind\. This function is defined as `log(NUM) / log(10)`\. | +| `negate(NUM)` | *Number* | Used to negate *NUM*\. Returns the corresponding number with the opposite sign\. | +| `round(NUM)` | *Integer* | Used to round *NUM* to an integer by taking `intof(NUM+0.5`) if *NUM* is positive or `intof(NUM–0.5)` if *NUM* is negative\. | +| `sign(NUM)` | *Number* | Used to determine the sign of *NUM*\. This operation returns –1, 0, or 1 if *NUM* is an integer\. If *NUM* is a real, it returns –1\.0, 0\.0, or 1\.0, depending on whether *NUM* is negative, zero, or positive\. | +| `sqrt(NUM)` | *Real* | Returns the square root of *NUM*\. *NUM* must be positive\. | +| `sum_n(LIST)` | *Number* | Returns the sum of values from a list of numeric fields or null if all of the field values are null\. | +| `mean_n(LIST)` | *Number* | Returns the mean value from a list of numeric fields or null if all of the field values are null\. | +| `sdev_n(LIST)` | *Number* | Returns the standard deviation from a list of numeric fields or null if all of the field values are null\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eed64f79ebfdd957deebec6261b3a70a248f3d35.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eed64f79ebfdd957deebec6261b3a70a248f3d35.md new file mode 100644 index 0000000..dba680f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eed64f79ebfdd957deebec6261b3a70a248f3d35.md @@ -0,0 +1,16 @@ +# Filter node (SPSS Modeler) + +# Filter node # + +You can rename or exclude fields at any point in a flow\. For example, as a medical researcher, you may not be concerned about the potassium level (field\-level data) of patients (record\-level data); therefore, you can filter out the `K` (potassium) field\. This can be done using a separate Filter node or using the Filter tab on an import or output node\. The functionality is the same regardless of which node it's accessed from\. + + + + * From import nodes, you can rename or filter fields as the data is read in\. + * Using a Filter node, you can rename or filter fields at any point in the flow\. + * You can use the Filter tab in various nodes to define or edit multiple response sets\. + * Finally, you can use a Filter node to map fields from one import node to another\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eed66538a3e4854d56210ab1d6ac49016f1e40a2.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eed66538a3e4854d56210ab1d6ac49016f1e40a2.md new file mode 100644 index 0000000..bbae1f2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eed66538a3e4854d56210ab1d6ac49016f1e40a2.md @@ -0,0 +1,97 @@ +# streamingtimeseries properties + +# streamingtimeseries properties # + +![Streaming TS node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/timeseriesprocessnode.png)The Streaming Time Series node builds and scores time series models in one step\. + + + +streamingtimeseries properties + +Table 1\. streamingtimeseries properties + +| `streamingtimeseries` properties | Values | Property description | +| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `targets` | *field* | The Streaming TS node forecasts one or more targets, optionally using one or more input fields as predictors\. Frequency and weight fields aren't used\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `candidate_inputs` | \[*field1 \.\.\. fieldN*\] | Input or predictor fields used by the model\. | +| `use_period` | *flag* | | +| `date_time_field` | *field* | | +| `input_interval` | `None``Unknown``Year``Quarter``Month``Week``Day``Hour``Hour_nonperiod``Minute``Minute_nonperiod``Second``Second_nonperiod` | | +| `period_field` | *field* | | +| `period_start_value` | *integer* | | +| `num_days_per_week` | *integer* | | +| `start_day_of_week` | `Sunday``Monday``Tuesday``Wednesday``Thursday``Friday``Saturday` | | +| `num_hours_per_day` | *integer* | | +| `start_hour_of_day` | *integer* | | +| `timestamp_increments` | *integer* | | +| `cyclic_increments` | *integer* | | +| `cyclic_periods` | *list* | | +| `output_interval` | `None``Year``Quarter``Month``Week``Day``Hour``Minute``Second` | | +| `is_same_interval` | *flag* | | +| `cross_hour` | *flag* | | +| `aggregate_and_distribute` | *list* | | +| `aggregate_default` | `Mean``Sum``Mode``Min``Max` | | +| `distribute_default` | `Mean``Sum` | | +| `group_default` | `Mean``Sum``Mode``Min``Max` | | +| `missing_imput` | `Linear_interp``Series_mean``K_mean``K_median``Linear_trend` | | +| `k_span_points` | *integer* | | +| `use_estimation_period` | *flag* | | +| `estimation_period` | `Observations``Times` | | +| `date_estimation` | *list* | Only available if you use `date_time_field`\. | +| `period_estimation` | *list* | Only available if you use `use_period`\. | +| `observations_type` | `Latest``Earliest` | | +| `observations_num` | *integer* | | +| `observations_exclude` | *integer* | | +| `method` | `ExpertModeler``Exsmooth``Arima` | | +| `expert_modeler_method` | `ExpertModeler``Exsmooth``Arima` | | +| `consider_seasonal` | *flag* | | +| `detect_outliers` | *flag* | | +| `expert_outlier_additive` | *flag* | | +| `expert_outlier_innovational` | *flag* | | +| `expert_outlier_level_shift` | *flag* | | +| `expert_outlier_transient` | *flag* | | +| `expert_outlier_seasonal_additive` | *flag* | | +| `expert_outlier_local_trend` | *flag* | | +| `expert_outlier_additive_patch` | *flag* | | +| `consider_newesmodels` | *flag* | | +| `exsmooth_model_type` | `Simple``HoltsLinearTrend``BrownsLinearTrend``DampedTrend``SimpleSeasonal``WintersAdditive``WintersMultiplicative``DampedTrendAdditive``DampedTrendMultiplicative``MultiplicativeTrendAdditive``MultiplicativeSeasonal``MultiplicativeTrendMultiplicative``MultiplicativeTrend` | | +| `futureValue_type_method` | `Compute``specify` | | +| `exsmooth_transformation_type` | `None``SquareRoot``NaturalLog` | | +| `arima.p` | *integer* | | +| `arima.d` | *integer* | | +| `arima.q` | *integer* | | +| `arima.sp` | *integer* | | +| `arima.sd` | *integer* | | +| `arima.sq` | *integer* | | +| `arima_transformation_type` | `None``SquareRoot``NaturalLog` | | +| `arima_include_constant` | *flag* | | +| `tf_arima.p.`*fieldname* | *integer* | For transfer functions\. | +| `tf_arima.d.`*fieldname* | *integer* | For transfer functions\. | +| `tf_arima.q.`*fieldname* | *integer* | For transfer functions\. | +| `tf_arima.sp.`*fieldname* | *integer* | For transfer functions\. | +| `tf_arima.sd.`*fieldname* | *integer* | For transfer functions\. | +| `tf_arima.sq.`*fieldname* | *integer* | For transfer functions\. | +| `tf_arima.delay.`*fieldname* | *integer* | For transfer functions\. | +| `tf_arima.transformation_type.`*fieldname* | `None``SquareRoot``NaturalLog` | For transfer functions\. | +| `arima_detect_outliers` | *flag* | | +| `arima_outlier_additive` | *flag* | | +| `arima_outlier_level_shift` | *flag* | | +| `arima_outlier_innovational` | *flag* | | +| `arima_outlier_transient` | *flag* | | +| `arima_outlier_seasonal_additive` | *flag* | | +| `arima_outlier_local_trend` | *flag* | | +| `arima_outlier_additive_patch` | *flag* | | +| `conf_limit_pct` | *real* | | +| `events` | *fields* | | +| `forecastperiods` | *integer* | | +| `extend_records_into_future` | *flag* | | +| `conf_limits` | *flag* | | +| `noise_res` | *flag* | | +| `max_models_output` | *integer* | Specify the maximum number of models you want to include in the output\. Note that if the number of models built exceeds this threshold, the models aren't shown in the output but they're still available for scoring\. Default value is `10`\. Displaying a large number of models may result in poor performance or instability\. | +| `custom_fields` | *boolean* | This option tells the node to use the field information specified here instead of that given in any upstream Type node(s)\. After selecting this option, specify the following fields as required\. | +| `arima` | *array* | A list with `p`, `d`, `q`, `sp`, `sd`, `sq`\. | +| `tf_arima` | *array* | A list with `name`, `p`, `q`, `d`, `sp`, `sq`, `sd`, `delay` and `type`\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eee6714a8cf20e18ea398651b41e0278071ee42b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eee6714a8cf20e18ea398651b41e0278071ee42b.md new file mode 100644 index 0000000..85e27ba --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eee6714a8cf20e18ea398651b41e0278071ee42b.md @@ -0,0 +1,49 @@ +# Exporting a project + +# Exporting a project # + +You can share assets in a project with others and copy a project by exporting them as a ZIP file to your desktop\. The project readme file is added to the exported ZIP file by default\. + +## Requirements and restrictions ## + +**Required role** : You need **Admin** or **Editor** role in the project to export a project\. + +**Restrictions** : \- You cannot export assets larger than 500 MB : \- If your project is marked as sensitive, you can't export data assets, connections or connected data from the project\. : \- Be mindful when selecting assets to always also include the dependencies of those assets, for example the data assets or connections for a data flow, a notebook, connected data, or jobs\. There is no check for dependencies\. If you don't include the dependencies, subsequent project imports do not work\. : \- You can only export and share assets across projects created in watsonx\.ai\. You can't export a project from Cloud Pak for Data as a Service and import it into watsonx\.ai, or the other way around\. You can however, move projects between Cloud Pak for Data as a Service and watsonx\.ai\. See [Switching the platform for a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/switch-platform.html)\. : \- Exporting a project from one region and importing the assets to a project or space in another region can result in an error creating the assets\. The error message `An unexpected response was returned when creating asset` is a symptom of this restriction\. : \- Exporting a project is not available for all Watson Studio plans\. See [Watson Studio plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/ws-plans.html)\. + +## Exporting a project to desktop ## + +Exporting a project packs the project assets that you select into a single ZIP file that can be shared like any other file\. + +To export project assets to desktop: + + + +1. Open the project you want to export assets from\. +2. Check whether the assets that you include in your export, for example notebooks or connections, don't contain credentials or other sensitive information that you don't want to share\. You should remove this information before you begin the export\. Only private connection credentials are removed\. +3. Optional\. Add information to the readme on the **Overview** page of your project about the assets that you include in the export\. For example, you can give a brief description of the analytics use case of the added assets and the data analysis methods that are used\. +4. Click ![the Export to desktop icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/export-proj.png) from the project toolbar\. +5. Select the assets to add\. You can filter by asset type or customize the project export settings by selecting preferences (the settings icon to the right of the window title) which are applied each time you export the project\. +6. Optional: Change the name of the project export file\. +7. Supply a password if you want to export connections that have shared credentials\. Note that this password must be provided to decrypt these credentials on project import\. +8. Click **Export**\. Do not leave the page while the export is running\. + + When you export to desktop, the file is saved to the `Downloads` folder by default. If a ZIP file with the same name already exists, the existing file isn't overwritten. + + Ensure that your browser settings download the ZIP file to the desktop as a .zip file and not as a folder. Compressing this folder to enable project import leads to an error. Note also that you cannot manually add other assets to an exported project ZIP file on your desktop. + + The status of a project export is tracked on the project's **Overview** page. + + + +## Learn more ## + + + + * [Administering a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/admin-project.html) + * [Importing a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/import-project.html) + + + +**Parent topic:**[Administering projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/admin-project.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eef0f3c3dc121f5c389e547bd20f2aa807074028.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eef0f3c3dc121f5c389e547bd20f2aa807074028.md new file mode 100644 index 0000000..52beefe --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/eef0f3c3dc121f5c389e547bd20f2aa807074028.md @@ -0,0 +1,73 @@ +# Key management by application + +# Key management by application # + +This topic describes how to manage column encryption keys by application\. It explains how to provide master keys and how to write and read encrypted data using these master keys\. + +## Providing master keys ## + +To provide master keys: + + + +1. Pass the explicit master keys, in the following format: + + parameter name: "encryption.key.list" + parameter value: ": , :.." + + For example: + + sc.hadoopConfiguration.set("encryption.key.list" , "k1:iKwfmI5rDf7HwVBcqeNE6w== , k2:LjxH/aXxMduX6IQcwQgOlw== , k3:rnZHCxhUHr79Y6zvQnxSEQ==") + + The length of master keys before base64 encoding can be 16, 24 or 32 bytes (128, 192 or 256 bits). + + + +## Writing encrypted data ## + +To write encrypted data: + + + +1. Specify which columns to encrypt, and which master keys to use: + + parameter name: "encryption.column.keys" + parameter value: ":,;: .." +2. Specify the footer key: + + parameter name: "encryption.footer.key" + parameter value: "" + + For example: + + dataFrame.write + .option("encryption.footer.key" , "k1") + .option("encryption.column.keys" , "k2:SSN,Address;k3:CreditCard") + .parquet("") + + Note:`""` must contain the string `.encrypted` in the URL, for example `/path/to/my_table.parquet.encrypted`. If either the `"encryption.column.keys"` parameter or the `"encryption.footer.key"` parameter is not set, an exception will be thrown. + + + +## Reading encrypted data ## + +The required metadata is stored in the encrypted Parquet files\. + +To read the encrypted data: + + + +1. Provide the encryption keys: + + sc.hadoopConfiguration.set("encryption.key.list" , "k1:iKwfmI5rDf7HwVBcqeNE6w== , k2:LjxH/aXxMduX6IQcwQgOlw== , k3:rnZHCxhUHr79Y6zvQnxSEQ==") +2. Call the regular parquet read commands, such as: + + val dataFrame = spark.read.parquet("") + + Note:`""` must contain the string `.encrypted` in the URL, for example `/path/to/my_table.parquet.encrypted`. + + + +**Parent topic:**[Parquet encryption](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/parquet-encryption.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/efae4449ceb6f88aa4545f33bd886ec3080171b4.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/efae4449ceb6f88aa4545f33bd886ec3080171b4.md new file mode 100644 index 0000000..35c94ff --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/efae4449ceb6f88aa4545f33bd886ec3080171b4.md @@ -0,0 +1,13 @@ +# SLRM node (SPSS Modeler) + +# SLRM node # + +Use the Self\-Learning Response Model (SLRM) node to build a model that you can continually update, or reestimate, as a dataset grows without having to rebuild the model every time using the complete dataset\. For example, this is useful when you have several products and you want to identify which one a customer is most likely to buy if you offer it to them\. This model allows you to predict which offers are most appropriate for customers and the probability of the offers being accepted\. + +Initially, you can build the model using a small dataset with randomly made offers and the responses to those offers\. As the dataset grows, the model can be updated and therefore becomes more able to predict the most suitable offers for customers and the probability of their acceptance based upon other input fields such as age, gender, job, and income\. You can change the offers available by adding or removing them from within the node, instead of having to change the target field of the dataset\. + +Before running an SLRM node, you must specify both the target and target response fields in the node properties\. The target field must have string storage, not numeric\. The target response field must be a flag\. The true value of the flag indicates offer acceptance and the false value indicates offer refusal\. + +Example\. A financial institution wants to achieve more profitable results by matching the offer that is most likely to be accepted to each customer\. You can use a self\-learning model to identify the characteristics of customers most likely to respond favorably based on previous promotions and to update the model in real time based on the latest customer responses\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/efd36f1bf92225311b684d6aa0d05a597f00d707.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/efd36f1bf92225311b684d6aa0d05a597f00d707.md new file mode 100644 index 0000000..77dfc4e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/efd36f1bf92225311b684d6aa0d05a597f00d707.md @@ -0,0 +1,19 @@ +# TLA node output (SPSS Modeler) + +# TLA node output # + +After running a Text Link Analysis node, the data is restructured\. It's important to understand the way text mining restructures your data\. + +If you desire a different structure for data mining, you can use nodes on the Field Operations palette to accomplish this\. For example, if you're working with data in which each row represents a text record, then one row is created for each pattern uncovered in the source text data\. For each row in the output, there are 15 fields: + + + + * Six fields ( Concept\#, such as Concept1, Concept2, \.\.\., and Concept6) represent any concepts found in the pattern match + * Six fields ( Type\#, such as Type1, Type2, \.\.\., and Type6) represent the type for each concept + * Rule Name represents the name of the text link rule used to match the text and produce the output + * A field using the name of the ID field you specified in the node and representing the record or document ID as it was in the input data + * Matched Text represents the portion of the text data in the original record or document that was matched to the TLA pattern + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/effb546fc8c21e2c0e9bb87b259bd34b91d4f0dd.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/effb546fc8c21e2c0e9bb87b259bd34b91d4f0dd.md new file mode 100644 index 0000000..5e3e800 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/effb546fc8c21e2c0e9bb87b259bd34b91d4f0dd.md @@ -0,0 +1,27 @@ +# {{ document.title.text }} + +# Toxic output # + +![icon for value alignment risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-value-alignment.svg)Risks associated with outputValue alignmentNew + +### Description ### + +A scenario in which the model produces toxic, hateful, abusive, and aggressive content is known as toxic output\. + +### Why is toxic output a concern for foundation models? ### + +Hateful, abusive, and aggressive content can adversely impact and harm people interacting with the model\. Business entities could face fines, reputational harms, and other legal consequences\. + +Example + +#### Toxic and Aggressive Chatbot Responses #### + +According to the article and screenshots of conversations with Bing’s AI shared on Reddit and Twitter, the chatbot’s responses were seen to insult users, lie to them, sulk, gaslight, and emotionally manipulate people, question its existence, describe someone who found a way to force the bot to disclose its hidden rules as its “enemy,” and claim it spied on Microsoft's developers through the webcams on their laptops\. + +Sources: + +[Forbes, February 2023](https://www.forbes.com/sites/siladityaray/2023/02/16/bing-chatbots-unhinged-responses-going-viral/?sh=60cd949d110c) + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md new file mode 100644 index 0000000..9658871 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md @@ -0,0 +1,998 @@ +# Glossary + +# Glossary # + +This glossary provides terms and definitions for watsonx\.ai and watsonx\.governance\. + +The following cross\-references are used in this glossary: + + + + * *See* refers you from a nonpreferred term to the preferred term or from an abbreviation to the spelled\-out form\. + * *See also* refers you to a related or contrasting term\. + + + +[A](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossa)[B](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossb)[C](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossc)[D](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossd)[E](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glosse)[F](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossf)[G](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossg)[H](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossh)[I](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossi)[J](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossj)[K](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossk)[L](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossl)[M](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossm)[N](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossn)[O](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glosso)[P](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossp)[R](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossr)[S](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glosss)[T](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glosst)[U](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossu)[V](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossv)[W](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossw)[Z](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#glossz) + +## A ## + +### accelerator ### + +In high\-performance computing, a specialized circuit that is used to take some of the computational load from the CPU, increasing the efficiency of the system\. For example, in deep learning, GPU\-accelerated computing is often employed to offload part of the compute workload to a GPU while the main application runs off the CPU\. See also [graphics processing unit](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x8987320)\. + +### accountability ### + +The expectation that organizations or individuals will ensure the proper functioning, throughout their lifecycle, of the AI systems that they design, develop, operate or deploy, in accordance with their roles and applicable regulatory frameworks\. This includes determining who is responsible for an AI mistake which may require legal experts to determine liability on a case\-by\-case basis\. + +### activation function ### + +A function defining a neural unit's output given a set of incoming activations from other neurons + +### active learning ### + +A model for machine learning in which the system requests more labeled data only when it needs it\. + +### active metadata ### + +Metadata that is automatically updated based on analysis by machine learning processes\. For example, profiling and data quality analysis automatically update metadata for data assets\. + +### active runtime ### + +An instance of an environment that is running to provide compute resources to analytical assets\. + +### agent ### + +An algorithm or a program that interacts with an environment to learn optimal actions or decisions, typically using reinforcement learning, to achieve a specific goal\. + +### AI ### + +See [artificial intelligence](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x3448902)\. + +### AI accelerator ### + +Specialized silicon hardware designed to efficiently execute AI\-related tasks like deep learning, machine learning, and neural networks for faster, energy\-efficient computing\. It can be a dedicated unit in a core, a separate chiplet on a multi\-module chip or a separate card\. + +### AI ethics ### + +A multidisciplinary field that studies how to optimize AI's beneficial impact while reducing risks and adverse outcomes\. Examples of AI ethics issues are data responsibility and privacy, fairness, explainability, robustness, transparency, environmental sustainability, inclusion, moral agency, value alignment, accountability, trust, and technology misuse\. + +### AI governance ### + +An organization's act of governing, through its corporate instructions, staff, processes and systems to direct, evaluate, monitor, and take corrective action throughout the AI lifecycle, to provide assurance that the AI system is operating as the organization intends, as its stakeholders expect, and as required by relevant regulation\. + +### AI safety ### + +The field of research aiming to ensure artificial intelligence systems operate in a manner that is beneficial to humanity and don't inadvertently cause harm, addressing issues like reliability, fairness, transparency, and alignment of AI systems with human values\. + +### AI system ### + +See [artificial intelligence system](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10065431)\. + +### algorithm ### + +A formula applied to data to determine optimal ways to solve analytical problems\. + +### analytics ### + +The science of studying data in order to find meaningful patterns in the data and draw conclusions based on those patterns\. + +### appropriate trust ### + +In an AI system, an amount of trust that is calibrated to its accuracy, reliability, and credibility\. + +### artificial intelligence (AI) ### + +The capability to acquire, process, create and apply knowledge in the form of a model to make predictions, recommendations or decisions\. + +### artificial intelligence system (AI system) ### + +A system that can make predictions, recommendations or decisions that influence physical or virtual environments, and whose outputs or behaviors are not necessarily pre\-determined by its developer or user\. AI systems are typically trained with large quantities of structured or unstructured data, and might be designed to operate with varying levels of autonomy or none, to achieve human\-defined objectives\. + +### asset ### + +An item that contains information about data, other valuable information, or code that works with data\. See also [data asset](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x6094928)\. + +### attention mechanism ### + +A mechanism in deep learning models that determines which parts of the input a model focuses on when producing output\. + +### AutoAI experiment ### + +An automated training process that considers a series of training definitions and parameters to create a set of ranked pipelines as model candidates\. + +## B ## + +### batch deployment ### + +A method to deploy models that processes input data from a file, data connection, or connected data in a storage bucket, then writes the output to a selected destination\. + +### bias ### + +Systematic error in an AI system that has been designed, intentionally or not, in a way that may generate unfair decisions\. Bias can be present both in the AI system and in the data used to train and test it\. AI bias can emerge in an AI system as a result of cultural expectations; technical limitations; or unanticipated deployment contexts\. See also [fairness](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x3565572)\. + +### bias detection ### + +The process of calculating fairness to metrics to detect when AI models are delivering unfair outcomes based on certain attributes\. + +### bias mitigation ### + +Reducing biases in AI models by curating training data and applying fairness techniques\. + +### binary classification ### + +A classification model with two classes\. Predictions are a binary choice of one of the two classes\. + +## C ## + +### classification model ### + +A predictive model that predicts data in distinct categories\. Classifications can be binary, with two classes of data, or multi\-class when there are more than 2 categories\. + +### cleanse ### + +To ensure that all values in a data set are consistent and correctly recorded\. + +### CNN ### + +See [convolutional neural network](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10297974)\. + +### computational linguistics ### + +Interdisciplinary field that explores approaches for computationally modeling natural languages\. + +### compute resource ### + +The hardware and software resources that are defined by an environment template to run assets in tools\. + +### confusion matrix ### + +A performance measurement that determines the accuracy between a model's positive and negative predicted outcomes compared to positive and negative actual outcomes\. + +### connected data asset ### + +A pointer to data that is accessed through a connection to an external data source\. + +### connected folder asset ### + +A pointer to a folder in IBM Cloud Object Storage\. + +### connection ### + +The information required to connect to a database\. The actual information that is required varies according to the DBMS and connection method\. + +### connection asset ### + +An asset that contains information that enables connecting to a data source\. + +### constraint ### + + + + * In databases, a relationship between tables\. + * In Decision Optimization, a condition that must be satisfied by the solution of a problem\. + + + +### continuous learning ### + +Automating the tasks of monitoring model performance, retraining with new data, and redeploying to ensure prediction quality\. + +### convolutional neural network (CNN) ### + +A class of neural network commonly used in computer vision tasks that uses convolutional layers to process image data\. + +### Core ML deployment ### + +The process of downloading a deployment in Core ML format for use in iOS apps\. + +### corpus ### + +A collection of source documents that are used to train a machine learning model\. + +### cross\-validation ### + +A technique for testing how well a model generalizes in the absence of a hold\-out test sample\. Cross\-validation divides the training data into a number of subsets, and then builds the same number of models, with each subset held out in turn\. Each of those models is tested on the holdout sample, and the average accuracy of the models on those holdout samples is used to estimate the accuracy of the model when applied to new data\. + +### curate ### + +To select, collect, preserve, and maintain content relevant to a specific topic\. Curation establishes, maintains, and adds value to data; it transforms data into trusted information and knowledge\. + +## D ## + +### data asset ### + +An asset that points to data, for example, to an uploaded file\. Connections and connected data assets are also considered data assets\. See also [asset](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x2172042)\. + +### data imputation ### + +The substitution of missing values in a data set with estimated or explicit values\. + +### data lake ### + +A large\-scale data storage repository that stores raw data in any format in a flat architecture\. Data lakes hold structured and unstructured data as well as binary data for the purpose of processing and analysis\. + +### data lakehouse ### + +A unified data storage and processing architecture that combines the flexibility of a data lake with the structured querying and performance optimizations of a data warehouse, enabling scalable and efficient data analysis for AI and analytics applications\. + +### data mining ### + +The process of collecting critical business information from a data source, correlating the information, and uncovering associations, patterns, and trends\. See also [predictive analytics](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x5067245)\. + +### Data Refinery flow ### + +A set of steps that cleanse and shape data to produce a new data asset\. + +### data science ### + +The analysis and visualization of structured and unstructured data to discover insights and knowledge\. + +### data set ### + +A collection of data, usually in the form of rows (records) and columns (fields) and contained in a file or database table\. + +### data source ### + +A repository, queue, or feed for reading data, such as a Db2 database\. + +### data table ### + +A collection of data, usually in the form of rows (records) and columns (fields) and contained in a table\. + +### data warehouse ### + +A large, centralized repository of data collected from various sources that is used for reporting and data analysis\. It primarily stores structured and semi\-structured data, enabling businesses to make informed decisions\. + +### DDL ### + +See [distributed deep learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x9443383)\. + +### decision boundary ### + +A division of data points in a space into distinct groups or classifications\. + +### decoder\-only model ### + +A model that generates output text word by word by inference from the input sequence\. Decoder\-only models are used for tasks such as generating text and answering questions\. + +### deep learning ### + +A computational model that uses multiple layers of interconnected nodes, which are organized into hierarchical layers, to transform input data (first layer) through a series of computations to produce an output (final layer)\. Deep learning is inspired by the structure and function of the human brain\. See also [distributed deep learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x9443383)\. + +### deep neural network ### + +A neural network with multiple hidden layers, allowing for more complex representations of the data\. + +### deployment ### + +A model or application package that is available for use\. + +### deployment space ### + +A workspace where models are deployed and deployments are managed\. + +### deterministic ### + +Describes a characteristic of computing systems when their outputs are completely determined by their inputs\. + +### DevOps ### + +A software methodology that integrates application development and IT operations so that teams can deliver code faster to production and iterate continuously based on market feedback\. + +### discriminative AI ### + +A class of algorithm that focuses on finding a boundary that separates different classes in the data\. + +### distributed deep learning (DDL) ### + +An approach to deep learning training that leverages the methods of distributed computing\. In a DDL environment, compute workload is distributed between the central processing unit and graphics processing unit\. See also [deep learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x9443378)\. + +### DOcplex ### + +A Python API for modeling and solving Decision Optimization problems\. + +## E ## + +### embedding ### + +A numerical representation of a unit of information, such as a word or a sentence, as a vector of real\-valued numbers\. Embeddings are learned, low\-dimensional representations of higher\-dimensional data\. See also [encoding](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x2426645), [representation](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x6075962)\. + +### emergence ### + +A property of foundation models in which the model exhibits behaviors that were not explicitly trained\. + +### emergent behavior ### + +A behavior exhibited by a foundation model that was not explicitly constructed\. + +### encoder\-decoder model ### + +A model for both understanding input text and for generating output text based on the input text\. Encoder\-decoder models are used for tasks such as summarization or translation\. + +### encoder\-only model ### + +A model that understands input text at the sentence level by transforming input sequences into representational vectors called embeddings\. Encoder\-only models are used for tasks such as classifying customer feedback and extracting information from large documents\. + +### encoding ### + +The representation of a unit of information, such as a character or a word, as a set of numbers\. See also [embedding](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10298004), [positional encoding](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10298071)\. + +### endpoint URL ### + +A network destination address that identifies resources, such as services and objects\. For example, an endpoint URL is used to identify the location of a model or function deployment when a user sends payload data to the deployment\. + +### environment ### + +The compute resources for running jobs\. + +### environment runtime ### + +An instantiation of the environment template to run analytical assets\. + +### environment template ### + +A definition that specifies hardware and software resources to instantiate environment runtimes\. + +### exogenous feature ### + +A feature that can influence the predictive model but cannot be influenced in return\. For example, temperatures can affect predicted ice cream sales, but ice cream sales cannot influence temperatures\. + +### experiment ### + +A model training process that considers a series of training definitions and parameters to determine the most accurate model configuration\. + +### explainability ### + + + + * The ability of human users to trace, audit, and understand predictions that are made in applications that use AI systems\. + * The ability of an AI system to provide insights that humans can use to understand the causes of the system's predictions\. + + + +## F ## + +### fairness ### + +In an AI system, the equitable treatment of individuals or groups of individuals\. The choice of a specific notion of equity for an AI system depends on the context in which it is used\. See also [bias](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x2803778)\. + +### feature ### + +A property or characteristic of an item within a data set, for example, a column in a spreadsheet\. In some cases, features are engineered as combinations of other features in the data set\. + +### feature engineering ### + +The process of selecting, transforming, and creating new features from raw data to improve the performance and predictive power of machine learning models\. + +### feature group ### + +A set of columns of a particular data asset along with the metadata that is used for machine learning\. + +### feature selection ### + +Identifying the columns of data that best support an accurate prediction or score in a machine learning model\. + +### feature store ### + +A centralized repository or system that manages and organizes features, providing a scalable and efficient way to store, retrieve, and share feature data across machine learning pipelines and applications\. + +### feature transformation ### + +In AutoAI, a phase of pipeline creation that applies algorithms to transform and optimize the training data to achieve the best outcome for the model type\. + +### federated learning ### + +The training of a common machine learning model that uses multiple data sources that are not moved, joined, or shared\. The result is a better\-trained model without compromising data security\. + +### few\-shot prompting ### + +A prompting technique in which a small number of examples are provided to the model to demonstrate how to complete the task\. + +### fine tuning ### + +The process of adapting a pre\-trained model to perform a specific task by conducting additional training\. Fine tuning may involve (1) updating the model’s existing parameters, known as full fine tuning, or (2) updating a subset of the model’s existing parameters or adding new parameters to the model and training them while freezing the model’s existing parameters, known as parameter\-efficient fine tuning\. + +### flow ### + +A collection of nodes that define a set of steps for processing data or training a model\. + +### foundation model ### + +An AI model that can be adapted to a wide range of downstream tasks\. Foundation models are typically large\-scale generative models that are trained on unlabeled data using self\-supervision\. As large scale models, foundation models can include billions of parameters\. + +## G ## + +### Gantt chart ### + +A graphical representation of a project timeline and duration in which schedule data is displayed as horizontal bars along a time scale\. + +### gen AI ### + +See [generative AI](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10298036)\. + +### generative AI (gen AI) ### + +A class of AI algorithms that can produce various types of content including text, source code, imagery, audio, and synthetic data\. + +### generative variability ### + +The characteristic of generative models to produce varied outputs, even when the input to the model is held constant\. See also [probabilistic](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10298081)\. + +### GPU ### + +See [graphics processing unit](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x8987320)\. + +### graphical builder ### + +A tool for creating analytical assets by visually coding\. A canvas is an area on which to place objects or nodes that can be connected to create a flow\. + +### graphics processing unit (GPU) ### + +A specialized processor designed to rapidly manipulate and alter memory to accelerate the creation of images in a frame buffer intended for output to a display\. GPUs are heavily utilized in machine learning due to their parallel processing capabilities\. See also [accelerator](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x2048370)\. + +## H ## + +### hallucination ### + +A response from a foundation model that includes off\-topic, repetitive, incorrect, or fabricated content\. Hallucinations involving fabricating details can happen when a model is prompted to generate text, but the model doesn't have enough related text to draw upon to generate a result that contains the correct details\. + +### hold\-out set ### + +A set of labeled data that is intentionally withheld from both the training and validation sets, serving as an unbiased assessment of the final model's performance on unseen data\. + +### homogenization ### + +The trend in machine learning research in which a small number of deep neural net architectures, such as the transformer, are achieving state\-of\-the\-art results across a wide variety of tasks\. + +### HPO ### + +See [hyperparameter optimization](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x9895660)\. + +### human oversight ### + +Human involvement in reviewing decisions rendered by an AI system, enabling human autonomy and accountability of decision\. + +### hyperparameter ### + +In machine learning, a parameter whose value is set before training as a way to increase model accuracy\. + +### hyperparameter optimization (HPO) ### + +The process for setting hyperparameter values to the settings that provide the most accurate model\. + +## I ## + +### image ### + +A software package that contains a set of libraries\. + +### incremental learning ### + +The process of training a model using data that is continually updated without forgetting data obtained from the preceding tasks\. This technique is used to train a model with batches of data from a large training data source\. + +### inferencing ### + +The process of running live data through a trained AI model to make a prediction or solve a task\. + +### ingest ### + + + + * To feed data into a system for the purpose of creating a base of knowledge\. + * To continuously add a high\-volume of real\-time data to a database\. + + + +### insight ### + +An accurate or deep understanding of something\. Insights are derived using cognitive analytics to provide current snapshots and predictions of customer behaviors and attitudes\. + +### intelligent AI ### + +Artificial intelligence systems that can understand, learn, adapt, and implement knowledge, demonstrating abilities like decision\-making, problem\-solving, and understanding complex concepts, much like human intelligence\. + +### intent ### + +A purpose or goal expressed by customer input to a chatbot, such as answering a question or processing a bill payment\. + +## J ## + +### job ### + +A separately executable unit of work\. + +## K ## + +### knowledge base ### + +See [corpus](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x3954167)\. + +## L ## + +### label ### + +A class or category assigned to a data point in supervised learning\.Labels can be derived from data but are often applied by human labelers or annotators\. + +### labeled data ### + +Raw data that is assigned labels to add context or meaning so that it can be used to train machine learning models\. For example, numeric values might be labeled as zip codes or ages to provide context for model inputs and outputs\. + +### large language model (LLM) ### + +A language model with a large number of parameters, trained on a large quantity of text\. + +### LLM ### + +See [large language model](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10298052)\. + +## M ## + +### machine learning (ML) ### + +A branch of artificial intelligence (AI) and computer science that focuses on the use of data and algorithms to imitate the way that humans learn, gradually improving the accuracy of AI models\. + +### machine learning framework ### + +The libraries and runtime for training and deploying a model\. + +### machine learning model ### + +An AI model that is trained on a a set of data to develop algorithms that it can use to analyze and learn from new data\. + +### mental model ### + +An individual’s understanding of how a system works and how their actions affect system outcomes\. When these expectations do not match the actual capabilities of a system, it can lead to frustration, abandonment, or misuse\. + +### misalignment ### + +A discrepancy between the goals or behaviors that an AI system is optimized to achieve and the true, often complex, objectives of its human users or designers + +### ML ### + +See [machine learning](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x8397498)\. + +### MLOps ### + + + + * The practice for collaboration between data scientists and operations professionals to help manage production machine learning (or deep learning) lifecycle\. MLOps looks to increase automation and improve the quality of production ML while also focusing on business and regulatory requirements\. It involves model development, training, validation, deployment, monitoring, and management and uses methods like CI/CD\. + * A methodology that takes a machine learning model from development to production\. + + + +### model ### + + + + * In a machine learning context, a set of functions and algorithms that have been trained and tested on a data set to provide predictions or decisions\. + * In Decision Optimization, a mathematical formulation of a problem that can be solved with CPLEX optimization engines using different data sets\. + + + +### ModelOps ### + +A methodology for managing the full lifecycle of an AI model, including training, deployment, scoring, evaluation, retraining, and updating\. + +### monitored group ### + +A class of data that is monitored to determine if the results from a predictive model differ significantly from the results of the reference group\. Groups are commonly monitored based on characteristics that include race, gender, or age\. + +### multiclass classification model ### + +A classification task with more than two classes\. For example, where a binary classification model predicts yes or no values, a multi\-class model predicts yes, no, maybe, or not applicable\. + +### multivariate time series ### + +Time series experiment that contains two or more changing variables\. For example, a time series model forecasting the electricity usage of three clients\. + +## N ## + +### natural language processing (NLP) ### + +A field of artificial intelligence and linguistics that studies the problems inherent in the processing and manipulation of natural language, with an aim to increase the ability of computers to understand human languages\. + +### natural language processing library ### + +A library that provides basic natural language processing functions for syntax analysis and out\-of\-the\-box pre\-trained models for a wide variety of text processing tasks\. + +### neural network ### + +A mathematical model for predicting or classifying cases by using a complex mathematical scheme that simulates an abstract version of brain cells\. A neural network is trained by presenting it with a large number of observed cases, one at a time, and allowing it to update itself repeatedly until it learns the task\. + +### NLP ### + +See [natural language processing](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x2031058)\. + +### node ### + +In an SPSS Modeler flow, the graphical representation of a data operation\. + +### notebook ### + +An interactive document that contains executable code, descriptive text for that code, and the results of any code that is run\. + +### notebook kernel ### + +The part of the notebook editor that executes code and returns the computational results\. + +## O ## + +### object storage ### + +A method of storing data, typically used in the cloud, in which data is stored as discrete units, or objects, in a storage pool or repository that does not use a file hierarchy but that stores all objects at the same level\. + +### one\-shot learning ### + +A model for deep learning that is based on the premise that most human learning takes place upon receiving just one or two examples\. This model is similar to unsupervised learning\. + +### one\-shot prompting ### + +A prompting technique in which a single example is provided to the model to demonstrate how to complete the task\. + +### online deployment ### + +Method of accessing a model or Python code deployment through an API endpoint as a web service to generate predictions online, in real time\. + +### ontology ### + +An explicit formal specification of the representation of the objects, concepts, and other entities that can exist in some area of interest and the relationships among them\. + +### operational asset ### + +An asset that runs code in a tool or a job\. + +### optimization ### + +The process of finding the most appropriate solution to a precisely defined problem while respecting the imposed constraints and limitations\. For example, determining how to allocate resources or how to find the best elements or combinations from a large set of alternatives\. + +### Optimization Programming Language ### + +A modeling language for expressing model formulations of optimization problems in a format that can be solved by CPLEX optimization engines such as IBM CPLEX\. + +### optimized metric ### + +A metric used to measure the performance of the model\. For example, accuracy is the typical metric used to measure the performance of a binary classification model\. + +### orchestration ### + +The process of creating an end\-to\-end flow that can train, run, deploy, test, and evaluate a machine learning model, and uses automation to coordinate the system, often using microservices\. + +### overreliance ### + +A user's acceptance of an incorrect recommendation made by an AI model\. See also [reliance](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10299283), [underreliance](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10299288)\. + +## P ## + +### parameter ### + + + + * A configurable part of the model that is internal to a model and whose values are estimated or learned from data\. Parameters are aspects of the model that are adjusted during the training process to help the model accurately predict the output\. The model's performance and predictive power largely depend on the values of these parameters\. + * A real\-valued weight between 0\.0 and 1\.0 indicating the strength of connection between two neurons in a neural network\. + + + +### party ### + +In Federated Learning, an entity that contributes data for training a common model\. The data is not moved or combined but each party gets the benefit of the federated training\. + +### payload ### + +The data that is passed to a deployment to get back a score, prediction, or solution\. + +### payload logging ### + +The capture of payload data and deployment output to monitor ongoing health of AI in business applications\. + +### pipeline ### + + + + * In Watson Pipelines, an end\-to\-end flow of assets from creation through deployment\. + * In AutoAI, a candidate model\. + + + +### pipeline leaderboard ### + +In AutoAI, a table that shows the list of automatically generated candidate models, as pipelines, ranked according to the specified criteria\. + +### policy ### + +A strategy or rule that an agent follows to determine the next action based on the current state\. + +### positional encoding ### + +An encoding of an ordered sequence of data that includes positional information, such as encoding of words in a sentence that includes each word's position within the sentence\. See also [encoding](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x2426645)\. + +### predictive analytics ### + +A business process and a set of related technologies that are concerned with the prediction of future possibilities and trends\. Predictive analytics applies such diverse disciplines as probability, statistics, machine learning, and artificial intelligence to business problems to find the best action for a specific situation\. See also [data mining](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x2114083)\. + +### pretrained model ### + +An AI model that was previously trained on a large data set to accomplish a specific task\. Pretrained models are used instead of building a model from scratch\. + +### pretraining ### + +The process of training a machine learning model on a large dataset before fine\-tuning it for a specific task\. + +### privacy ### + +Assurance that information about an individual is protected from unauthorized access and inappropriate use\. + +### probabilistic ### + +The characteristic of being subject to randomness; non\-deterministic\. Probabilistic models do not produce the same outputs given the same inputs\. See also [generative variability](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10298041)\. + +### project ### + +A collaborative workspace for working with data and other assets\. + +### prompt ### + + + + * Data, such as text or an image, that prepares, instructs, or conditions a foundation model's output\. + * A component of an action that indicates that user input is required for a field before making a transition to an output screen\. + + + +### prompt engineering ### + +The process of designing natural language prompts for a language model to perform a specific task\. + +### prompting ### + +The process of providing input to a foundation model to induce it to produce output\. + +### prompt tuning ### + +An efficient, low\-cost way of adapting a pre\-trained model to new tasks without retraining the model or updating its weights\. Prompt tuning involves learning a small number of new parameters that are appended to a model’s prompt, while freezing the model’s existing parameters\. + +### pruning ### + +The process of simplifying, shrinking, or trimming a decision tree or neural network\. This is done by removing less important nodes or layers, reducing complexity to prevent overfitting and improve model generalization while maintaining its predictive power\. + +### Python ### + +A programming language that is used in data science and AI\. + +### Python function ### + +A function that contains Python code to support a model in production\. + +## R ## + +### R ### + +An extensible scripting language that is used in data science and AI that offers a wide variety of analytic, statistical, and graphical functions and techniques\. + +### RAG ### + +See [retrieval augmented generation](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10299275)\. + +### random seed ### + +A number used to initialize a pseudorandom number generator\. Random seeds enable reproducibility for processes that rely on random number generation\. + +### reference group ### + +A group that is identified as most likely to receive a positive result in a predictive model\. The results can be compared to a monitored group to look for potential bias in outcomes\. + +### refine ### + +To cleanse and shape data\. + +### regression model ### + +A model that relates a dependent variable to one or more independent variables\. + +### reinforcement learning ### + +A machine learning technique in which an agent learns to make sequential decisions in an environment to maximize a reward signal\. Inspired by trial and error learning, agents interact with the environment, receive feedback, and adjust their actions to achieve optimal policies\. + +### reinforcement learning on human feedback (RLHF) ### + +A method of aligning a language learning model's responses to the instructions given in a prompt\. RLHF requires human annotators rank multiple outputs from the model\. These rankings are then used to train a reward model using reinforcement learning\. The reward model is then used to fine\-tune the large language model's output\. + +### reliance ### + +In AI systems, a user’s acceptance of a recommendation made by, or the output generated by, an AI model\. See also [overreliance](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10299271), [underreliance](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10299288)\. + +### representation ### + +An encoding of a unit of information, often as a vector of real\-valued numbers\. See also [embedding](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10298004)\. + +### retrieval augmented generation (RAG) ### + +A technique in which a large language model is augmented with knowledge from external sources to generate text\. In the retrieval step, relevant documents from an external source are identified from the user’s query\. In the generation step, portions of those documents are included in the LLM prompt to generate a response grounded in the retrieved documents\. + +### reward ### + +A signal used to guide an agent, typically a reinforcement learning agent, that provides feedback on the goodness of a decision + +### RLHF ### + +See [reinforcement learning on human feedback](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10298109)\. + +### runtime environment ### + +The predefined or custom hardware and software configuration that is used to run tools or jobs, such as notebooks\. + +## S ## + +### scoring ### + + + + * In machine learning, the process of measuring the confidence of a predicted outcome\. + * The process of computing how closely the attributes for an incoming identity match the attributes of an existing entity\. + + + +### script ### + +A file that contains Python or R scripts to support a model in production\. + +### self\-attention ### + +An attention mechanism that uses information from the input data itself to determine what parts of the input to focus on when generating output\. + +### self\-supervised learning ### + +A machine learning training method in which a model learns from unlabeled data by masking tokens in an input sequence and then trying to predict them\. An example is "I like ***\_\_*** sprouts"\. + +### sentience ### + +The capacity to have subjective experiences and feelings, or consciousness\. It involves the ability to perceive, reason, and experience sensations such as pain and pleasure\. + +### sentiment analysis ### + +Examination of the sentiment or emotion expressed in text, such as determining if a movie review is positive or negative\. + +### shape ### + +To customize data by filtering, sorting, removing columns; joining tables; performing operations that include calculations, data groupings, hierarchies and more\. + +### small data ### + +Data that is accessible and comprehensible by humans\. See also [structured data](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x2490040)\. + +### SQL pushback ### + +In SPSS Modeler, the process of performing many data preparation and mining operations directly in the database through SQL code\. + +### structured data ### + +Data that resides in fixed fields within a record or file\. Relational databases and spreadsheets are examples of structured data\. See also [unstructured data](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x2490044), [small data](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x8317275)\. + +### structured information ### + +Items stored in structured resources, such as search engine indices, databases, or knowledge bases\. + +### supervised learning ### + +A machine learning training method in which a model is trained on a labeled dataset to make predictions on new data\. + +## T ## + +### temperature ### + +A parameter in a generative model that specifies the amount of variation in the generation process\. Higher temperatures result in greater variability in the model's output\. + +### text classification ### + +A model that automatically identifies and classifies text into specified categories\. + +### time series ### + +A set of values of a variable at periodic points in time\. + +### time series model ### + +A model that tracks and predicts data over time\. + +### token ### + +A discrete unit of meaning or analysis in a text, such as a word or subword\. + +### tokenization ### + +The process used in natural language processing to split a string of text into smaller units, such as words or subwords\. + +### trained model ### + +A model that is trained with actual data and is ready to be deployed to predict outcomes when presented with new data\. + +### training ### + +The initial stage of model building, involving a subset of the source data\. The model learns by example from the known data\. The model can then be tested against a further, different subset for which the outcome is already known\. + +### training data ### + +A set of annotated documents that can be used to train machine learning models\. + +### training set ### + +A set of labeled data that is used to train a machine learning model by exposing it to examples and their corresponding labels, enabling the model to learn patterns and make predictions\. + +### transfer learning ### + +A machine learning strategy in which a trained model is applied to a completely new problem\. + +### transformer ### + +A neural network architecture that uses positional encodings and the self\-attention mechanism to predict the next token in a sequence of tokens\. + +### transparency ### + +Sharing appropriate information with stakeholders on how an AI system has been designed and developed\. Examples of this information are what data is collected, how it will be used and stored, and who has access to it; and test results for accuracy, robustness and bias\. + +### trust calibration ### + +The process of evaluating and adjusting one’s trust in an AI system based on factors such as its accuracy, reliability, and credibility\. + +### Turing test ### + +Proposed by Alan Turing in 1950, a test of a machine's ability to exhibit intelligent behavior equivalent to, or indistinguishable from, that of a human\. + +## U ## + +### underreliance ### + +A user's rejection of a correct recommendations made by an AI model\. See also [overreliance](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10299271), [reliance](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x10299283)\. + +### univariate time series ### + +Time series experiment that contains only one changing variable\. For example, a time series model forecasting the temperature has a single prediction column of the temperature\. + +### unstructured data ### + +Any data that is stored in an unstructured format rather than in fixed fields\. Data in a word processing document is an example of unstructured data\. See also [structured data](https://dataplatform.cloud.ibm.com/docs/content/wsj/wscommon/glossary-wx.html?context=cdpaas&locale=en#x2490040)\. + +### unstructured information ### + +Data that is not contained in a fixed location, such as the natural language text document\. + +### unsupervised learning ### + + + + * A machine learning training method in which a model is not provided with labeled data and must find patterns or structure in the data on its own\. + * A model for deep learning that allows raw, unlabeled data to be used to train a system with little to no human effort\. + + + +## V ## + +### validation set ### + +A separate set of labeled data that is used to evaluate the performance and generalization ability of a machine learning model during the training process, assisting in hyperparameter tuning and model selection\. + +### vector ### + +A one\-dimensional, ordered list of numbers, such as \[1, 2, 5\] or \[0\.7, 0\.2, \-1\.0\]\. + +### virtual agent ### + +A pretrained chat bot that can process natural language to respond and complete simple business transactions, or route more complicated requests to a human with subject matter expertise\. + +### visualization ### + +A graph, chart, plot, table, map, or any other visual representation of data\. + +## W ## + +### weight ### + +A coefficient for a node that transforms input data within the network's layer\. Weight is a parameter that an AI model learns through training, adjusting its value to reduce errors in the model's predictions\. + +## Z ## + +### zero\-shot prompt ### + +A prompting technique in which the model completes a task without being given a specific example of how\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f05134c8c952a7585b82a042b14bcf1234af9329.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f05134c8c952a7585b82a042b14bcf1234af9329.md new file mode 100644 index 0000000..013d9e6 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f05134c8c952a7585b82a042b14bcf1234af9329.md @@ -0,0 +1,25 @@ +# Anonymize node (SPSS Modeler) + +# Anonymize node # + +With the Anonymize node, you can disguise field names, field values, or both when working with data that's to be included in a model downstream of the node\. In this way, the generated model can be freely distributed (for example, to Technical Support) with no danger that unauthorized users will be able to view confidential data, such as employee records or patients' medical records\. + +Depending on where you place the Anonymize node in your flow, you may need to make changes to other nodes\. For example, if you insert an Anonymize node upstream from a Select node, the selection criteria in the Select node will need to be changed if they are acting on values that have now become anonymized\. + +The method to be used for anonymizing depends on various factors\. For field names and all field values except Continuous measurement levels, the data is replaced by a string of the form: + + prefix_Sn + +where `prefix_` is either a user\-specified string or the default string `anon_`, and `n` is an integer value that starts at 0 and is incremented for each unique value (for example, `anon_S0`, `anon_S1`, etc\.)\. + +Field values of type Continuous must be transformed because numeric ranges deal with integer or real values rather than strings\. As such, they can be anonymized only by transforming the range into a different range, thus disguising the original data\. Transformation of a value `x` in the range is performed in the following way: + + A*(x + B) + +where: + +`A` is a scale factor, which must be greater than 0\. + +`B` is a translation offset to be added to the values\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f0b03ce62e6dc8ac7598a8b8316c4bf8cea132d5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f0b03ce62e6dc8ac7598a8b8316c4bf8cea132d5.md new file mode 100644 index 0000000..5559617 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f0b03ce62e6dc8ac7598a8b8316c4bf8cea132d5.md @@ -0,0 +1,62 @@ +# Data security + +# Data security # + +In IBM watsonx, data security mechanisms, such as encryption, protect sensitive customer and corporate data, both in transit and at rest\. A secure , and other mechanisms protect your valuable corporate data\. A secure IBM Cloud Object Storage instance stores data assets from projects, catalogs, and deployment spaces\. + + + +| Mechanism | Purpose | Responsibility | Configured on | +| ----------------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------ | -------------------------- | +| [Configuring Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-data.html?context=cdpaas&locale=en#configuring-cloud-object-storage) | IBM Cloud Object Storage is required to store assets | Customer | IBM Cloud | +| [Controlling access with service credentials](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-data.html?context=cdpaas&locale=en#controlling-access-with-service-credentials) | Authorize a Cloud Object Storage instance for a specific project | Customer | IBM Cloud and IBM watsonx | +| [Encrypting at rest data](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-data.html?context=cdpaas&locale=en#encrypting-at-rest-data) | Default encryption is provided\. Use IBM Key Protect to manage your own keys\. | Shared | IBM Cloud | +| [Encrypting in motion data](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-data.html?context=cdpaas&locale=en#encrypting-in-motion-data) | Encryption methods such as HTTPS, SSL, and TLS are used to protect data in motion\. | IBM, Third\-party clouds | IBM Cloud, Cloud providers | +| [Backups](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-data.html?context=cdpaas&locale=en#backups) | Use IBM Cloud Backup to manage backups for your data\. | Shared | IBM Cloud | + + + +## Configuring Cloud Object Storage ## + +IBM Cloud Object Storage provides storage for projects, catalogs, and deployment spaces\. You are required to associate an IBM Cloud Object Storage instance when you create projects, catalogs, or deployment spaces to store files for assets, such as uploaded data files or notebook files\. The Lite plan instance is free to use for storage capacity up to 25 GB per month\. + +You can also access data sources in an IBM Cloud Object Storage instance\. To access data IBM Cloud Object Storage, you create an IBM Cloud Object Storage connection when you want to connect to data stored in IBM Cloud Object Storage\. An IBM Cloud Object Storage connection has a different purpose from the IBM Cloud Object Storage instance that you associate with a project, deployment space, or catalog\. + +The IBM Cloud Identity and Access Management (IAM) service securely authenticates users and controls access to IBM Cloud Object Storage\. See [IBM Cloud docs: Getting started with IAM](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-iam) for instructions on setting up access control for Cloud Object Storage on IBM Cloud\. + +See [IBM Cloud docs: Getting started with IBM Cloud Object Storage](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-getting-started-cloud-object-storage) + +## Controlling access with service credentials ## + +Cloud Object Storage credentials consist of a service credential and a Service ID\. Policies are assigned to Service IDs to control access\. The credentials are used to create a secure connection to the Cloud Object Storage instance, with access control as determined by the policy\. + +For more information, see [Controlling access to Cloud Object Storage buckets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/cos_buckets.html) + +## Encrypting at rest data ## + +By default, at rest data is encrypted with randomly generated keys that are managed by IBM\. If the default keys are sufficient protection for your data, no additional action is needed\. To provide extra protection for at rest data, you can create and manage your own keys with IBM® Key Protect for IBM Cloud™\. Key Protect is a full\-service encryption solution that allows data to be secured and stored in IBM Cloud Object Storage\. + +To encrypt your Cloud Object Storage instance with your own key, create an instance of the IBM Key Project service from the IBM Cloud catalog\. Not all Watson Studio plans support customer\-generated encryption keys\. + + + + * For instructions on encrypting your Cloud Object Storage instance with your own key, see [Setting up IBM Cloud Object Storage for use with IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html) + * For an overview of how to encrypt data with your own keys, see [IBM Cloud docs: Encrypting data with your own keys](https://cloud.ibm.com/docs/overview?topic=overview-key-encryption) + * For the complete documentation for Key Protect, see [IBM Cloud docs: IBM Key Protect](https://cloud.ibm.com/docs/key-protect) + * For an overview of how encryption works in the IBM Cloud Security Architecture, see [Data security architecture](https://www.ibm.com/cloud/architecture/architectures/data-security-arch) + + + +## Encrypting in motion data ## + +Data is encrypted when transmitted by IBM on any public networks and within the Cloud Service's private data center network\. Encryption methods such as HTTPS, SSL, and TLS are used to protect data in motion\. + +## Backups ## + +To avoid loss of important data, create and properly store backups\. You can use IBM Cloud Backup to securely back up your data between IBM Cloud servers in one or more IBM Cloud data centers\. See [IBM Cloud docs: Getting started with IBM Cloud Backup](https://cloud.ibm.com/docs/Backup?topic=Backup-getting-started) + +**Learn More** For more information, see [IBM Cloud docs: Getting started with Security and Compliance Center](https://cloud.ibm.com/docs/security-compliance)\. + +**Parent topic:**[Security](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f0db4483c93a5d14dbf8076c4dd42d22a4f8542d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f0db4483c93a5d14dbf8076c4dd42d22a4f8542d.md new file mode 100644 index 0000000..d84f0f1 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f0db4483c93a5d14dbf8076c4dd42d22a4f8542d.md @@ -0,0 +1,64 @@ +# Notices + +# Notices # + +These notices apply to the watsonx platform\. + +The Offering includes some or all of the following that IBM provides under the [SIL Open Font License 1\.1](https://opensource.org/license/openfont-html/): + + + + * AMSFONTS + * AMSFONTS (matplotlib) + * CARLOGO (matplotlib) + * CMMI9 (libtasn1) + * cvxopt 1\.3\.0 + * FONTS (harfbuzz) + * FONTS (pillow) + * FONT AWESOME (Apache ORC) + * FONT AWESOME \- FONT (bazel) + * FONT AWESOME 4\.2\.0 (arrow) + * FONT\-AWESOME\-IE7\.MIN\.CSS (Jetty) + * FONT AWESOME (nbconvert) + * FONTAWESOME\-FONTS + * HELVETICA\-NEUE + * READLINE\.PS (Readline) + * FONT\-AWESOME (Notebook) + * FONTAWESOME + * FONTAWESOME (Tables) + * FONT AWESOME FONTS + * FONTAWESOME (FONT) (JupyterLab) + * Font\-Awesome v4\.6\.3 + * Font\-Awesome v4\.3\.0 + * Font\-Awesome v4\.7\.0 + * handsontable v0\.25\.1 + * minio 7\.1\.7 + * IBM PLEX TYPEFACE (carbon\-components) + * nbconvert v5\.2\.1 + * nbconvert v5\.1\.1 + * nbconvert 6\.4\.4 + * nbconvert 6\.5\.0 + * nbdime 3\.1\.1 + * NotoNastaliqUrdu\-Regular\.ttf (pillow) + * NOTO\-FONTS (pillow) + * QTAWESOME\-FONTS (qtawesome) + * qtawesome v3\.3\.0 + * READLINE\.PS (Readline) + * RLUSERMAN\.PS (Readline) + * STIX FONT (matplotlib) + + + +The Offering includes some or all of the following that IBM provides under the [UBUNTU FONT LICENCE Version 1\.0](https://ubuntu.com/legal/font-licence): + + + + * Font\_license (Werkzeug) + + + +## Learn more ## + +[Foundation model use terms](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-disclaimer.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f0ef147dbc0554f53b331e7b6d5715d0269ffba8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f0ef147dbc0554f53b331e7b6d5715d0269ffba8.md new file mode 100644 index 0000000..90120e3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f0ef147dbc0554f53b331e7b6d5715d0269ffba8.md @@ -0,0 +1,14 @@ +# Referencing existing nodes + +# Referencing existing nodes # + +A flow is often pre\-built with some parameters that must be modified before the flow runs\. Modifying these parameters involves the following tasks: + + + +1. Locating the nodes in the relevant flow\. +2. Changing the node or flow settings (or both)\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f127eff442d2c1d1a1ea01b23e8135b502ef2e79.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f127eff442d2c1d1a1ea01b23e8135b502ef2e79.md new file mode 100644 index 0000000..2ac174a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f127eff442d2c1d1a1ea01b23e8135b502ef2e79.md @@ -0,0 +1,27 @@ +# smotenode properties + +# smotenode properties # + +![SMOTE node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/smotenodeicon.png)The Synthetic Minority Over\-sampling Technique (SMOTE) node provides an over\-sampling algorithm to deal with imbalanced data sets\. It provides an advanced method for balancing data\. The SMOTE process node in SPSS Modeler is implemented in Python and requires the imbalanced\-learn© Python library\. + + + +smotenode properties + +Table 1\. smotenode properties + +| `smotenode` properties | Data type | Property description | +| ---------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `target` | *field* | The target field\. | +| `sample_ratio` | *string* | Enables a custom ratio value\. The two options are Auto (`sample_ratio_auto`) or Set ratio (`sample_ratio_manual`)\. | +| `sample_ratio_value` | *float* | The ratio is the number of samples in the minority class over the number of samples in the majority class\. It must be larger than `0` and less than or equal to `1`\. Default is `auto`\. | +| `enable_random_seed` | *Boolean* | If set to `true`, the `random_seed` property will be enabled\. | +| `random_seed` | *integer* | The seed used by the random number generator\. | +| `k_neighbours` | *integer* | The number of nearest neighbors to be used for constructing synthetic samples\. Default is `5`\. | +| `m_neighbours` | *integer* | The number of nearest neighbors to be used for determining if a minority sample is in danger\. This option is only enabled with the SMOTE algorithm types `borderline1` and `borderline2`\. Default is `10`\. | +| `algorithm` | *string* | The type of SMOTE algorithm: `regular`, `borderline1`, or `borderline2`\. | +| `use_partition` | *Boolean* | If set to `true`, only training data will be used for model building\. Default is `true`\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f140f179614d126e483732933a5ca8dcf0a32876.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f140f179614d126e483732933a5ca8dcf0a32876.md new file mode 100644 index 0000000..523a0eb --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f140f179614d126e483732933a5ca8dcf0a32876.md @@ -0,0 +1,16 @@ +# Summary (SPSS Modeler) + +# Summary # + +This example Introduction to Modeling flow demonstrates the basic steps for creating, evaluating, and scoring a model\. + + + + * The modeling node estimates the model by studying records for which the outcome is known, and creates a model nugget\. This is sometimes referred to as training the model\. + * The model nugget can be added to any flow with the expected fields to score records\. By scoring the records for which you already know the outcome (such as existing customers), you can evaluate how well it performs\. + * After you're satisfied that the model performs acceptably well, you can score new data (such as prospective customers) to predict how they will respond\. + * The data used to train or estimate the model may be referred to as the analytical or historical data; the scoring data may also be referred to as the operational data\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f161a94239c1dc6696dbb583ec46bc64f3aa8906.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f161a94239c1dc6696dbb583ec46bc64f3aa8906.md new file mode 100644 index 0000000..d6d4754 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f161a94239c1dc6696dbb583ec46bc64f3aa8906.md @@ -0,0 +1,36 @@ +# Text Link Analyisis node (SPSS Modeler) + +# Text Link Analysis node # + +In some cases, you may not need to create a category model to score\. The Text Link Analysis (TLA) node adds a pattern\-matching technology to text mining's concept extraction\. This identifies relationships between the concepts in the text data based on known patterns\. These relationships can describe how a customer feels about a product, which companies are doing business together, or even the relationships between genes or pharmaceutical agents\. + +Figure 1\. Text Link Analysis node + +![Text Link Analysis node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_tla.png) + + + +1. Add a Text Link Analysis node to your canvas and connect it to the Data Asset node that points to hotelSatisfaction\.csv\. Double\-click the node to open its properties\. +2. Select `id` for the ID field and `Comments` for the Text field\. Note that only the Text field is required\. +3. For Copy resources from, select the Hotel Satisfaction (English) template\. + + Figure 2. Text Link Analysis node FIELD properties + + ![Text Link Analysis node FIELD properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_tlaprops.png) +4. Under Expert, select Accommodate spelling for a minimum word character length of\. + + Figure 3. Text Link Analysis node Expert properties + + ![Text Link Analysis node Expert properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_tlaexpert.png)The resulting output is a table (or the result of an Export node). + + Figure 4. Raw TLA output + + ![Raw TLA output](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_tlaraw.png) + + Figure 5. Counting sentiments on a TLA node + + ![Counting sentiments on a TLA node](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_ta_hotel_tlacount.png) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f1b21b1232720492424bb07cd73c93df2b9cd229.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f1b21b1232720492424bb07cd73c93df2b9cd229.md new file mode 100644 index 0000000..76e3d66 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f1b21b1232720492424bb07cd73c93df2b9cd229.md @@ -0,0 +1,42 @@ +# coxregnode properties + +# coxregnode properties # + +![Cox node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/cox_reg_node_icon.png)The Cox regression node enables you to build a survival model for time\-to\-event data in the presence of censored records\. The model produces a survival function that predicts the probability that the event of interest has occurred at a given time (*t*) for given values of the input variables\. + + + +coxregnode properties + +Table 1\. coxregnode properties + +| `coxregnode` Properties | Values | Property description | +| ----------------------- | ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | +| `survival_time` | *field* | Cox regression models require a single field containing the survival times\. | +| `target` | *field* | Cox regression models require a single target field, and one or more input fields\. See [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `method` | `Enter`
`Stepwise`
`BackwardsStepwise` | | +| `groups` | *field* | | +| `model_type` | `MainEffects`
`Custom` | | +| `custom_terms` | \[*BP\*Sex" "BP\*Age*\] | | +| `mode` | `Expert`
`Simple` | | +| `max_iterations` | *number* | | +| `p_converge` | `1.0E-4`
`1.0E-5`
`1.0E-6`
`1.0E-7`
`1.0E-8`
`0` | | +| `l_converge` | `1.0E-1`
`1.0E-2`
`1.0E-3`
`1.0E-4`
`1.0E-5`
`0` | | +| `removal_criterion` | `LR`
`Wald`
`Conditional` | | +| `probability_entry` | *number* | | +| `probability_removal` | *number* | | +| `output_display` | `EachStep`
`LastStep` | | +| `ci_enable` | *flag* | | +| `ci_value` | `90`
`95`
`99` | | +| `correlation` | *flag* | | +| `display_baseline` | *flag* | | +| `survival` | *flag* | | +| `hazard` | *flag* | | +| `log_minus_log` | *flag* | | +| `one_minus_survival` | *flag* | | +| `separate_line` | *field* | | +| `value` | *number* or *string* | If no value is specified for a field, the default option "Mean" will be used for that field\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f1cdb96ad5a56206f662bb3025b93f6d5820242b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f1cdb96ad5a56206f662bb3025b93f6d5820242b.md new file mode 100644 index 0000000..d9d4291 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f1cdb96ad5a56206f662bb3025b93f6d5820242b.md @@ -0,0 +1,55 @@ +# plotnode properties + +# plotnode properties # + +![Plot node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/plotnodeicon.png)The Plot node shows the relationship between numeric fields\. You can create a plot by using points (a scatterplot) or lines\. + + + +plotnode properties + +Table 1\. plotnode properties + +| `plotnode` properties | Data type | Property description | +| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `x_field` | *field* | Specifies a custom label for the *x* axis\. Available only for labels\. | +| `y_field` | *field* | Specifies a custom label for the *y* axis\. Available only for labels\. | +| `three_D` | *flag* | Specifies a custom label for the *y* axis\. Available only for labels in 3\-D graphs\. | +| `z_field` | *field* | | +| `color_field` | *field* | Overlay field\. | +| `size_field` | *field* | | +| `shape_field` | *field* | | +| `panel_field` | *field* | Specifies a nominal or flag field for use in making a separate chart for each category\. Charts are paneled together in one output window\. | +| `animation_field` | *field* | Specifies a nominal or flag field for illustrating data value categories by creating a series of charts displayed in sequence using animation\. | +| `transp_field` | *field* | Specifies a field for illustrating data value categories by using a different level of transparency for each category\. Not available for line plots\. | +| `overlay_type` | `None``Smoother``Function` | Specifies whether an overlay function or LOESS smoother is displayed\. | +| `overlay_expression` | *string* | Specifies the expression used when `overlay_type` is set to `Function`\. | +| `style` | `Point``Line` | | +| `point_type` | `Rectangle Dot Triangle Hexagon Plus Pentagon Star BowTie HorizontalDash VerticalDash IronCross Factory House Cathedral OnionDome ConcaveTriangle OblateGlobe CatEye FourSidedPillow RoundRectangle Fan` | | +| `x_mode` | `Sort``Overlay``AsRead` | | +| `x_range_mode` | `Automatic``UserDefined` | | +| `x_range_min` | *number* | | +| `x_range_max` | *number* | | +| `y_range_mode` | `Automatic``UserDefined` | | +| `y_range_min` | *number* | | +| `y_range_max` | *number* | | +| `z_range_mode` | `Automatic``UserDefined` | | +| `z_range_min` | *number* | | +| `z_range_max` | *number* | | +| `jitter` | *flag* | | +| `records_limit` | *number* | | +| `if_over_limit` | `PlotBins``PlotSample``PlotAll` | | +| `x_label_auto` | *flag* | | +| `x_label` | *string* | | +| `y_label_auto` | *flag* | | +| `y_label` | *string* | | +| `z_label_auto` | *flag* | | +| `z_label` | *string* | | +| `use_grid` | *flag* | | +| `graph_background` | *color* | Standard graph colors are described at the beginning of this section\. | +| `page_background` | *color* | Standard graph colors are described at the beginning of this section\. | +| `use_overlay_expr` | *flag* | Deprecated in favor of `overlay_type`\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f24c445f7ab9052a92e411b826c60dee2df78448.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f24c445f7ab9052a92e411b826c60dee2df78448.md new file mode 100644 index 0000000..e81db4f --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f24c445f7ab9052a92e411b826c60dee2df78448.md @@ -0,0 +1,41 @@ +# collectionnode properties + +# collectionnode properties # + +![Collection node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/collectionnodeicon.png)The Collection node shows the distribution of values for one numeric field relative to the values of another\. (It creates graphs that are similar to histograms\.) It's useful for illustrating a variable or field whose values change over time\. Using 3\-D graphing, you can also include a symbolic axis displaying distributions by category\. + + + +collectionnode properties + +Table 1\. collectionnode properties + +| `collectionnode` properties | Data type | Property description | +| --------------------------- | --------------------------- | ---------------------------------------------------------------------- | +| `over_field` | *field* | | +| `over_label_auto` | *flag* | | +| `over_label` | *string* | | +| `collect_field` | *field* | | +| `collect_label_auto` | *flag* | | +| `collect_label` | *string* | | +| `three_D` | *flag* | | +| `by_field` | *field* | | +| `by_label_auto` | *flag* | | +| `by_label` | *string* | | +| `operation` | `Sum``Mean``Min``Max``SDev` | | +| `color_field` | *string* | | +| `panel_field` | *string* | | +| `animation_field` | *string* | | +| `range_mode` | `Automatic``UserDefined` | | +| `range_min` | *number* | | +| `range_max` | *number* | | +| `bins` | `ByNumber``ByWidth` | | +| `num_bins` | *number* | | +| `bin_width` | *number* | | +| `use_grid` | *flag* | | +| `graph_background` | *color* | Standard graph colors are described at the beginning of this section\. | +| `page_background` | *color* | Standard graph colors are described at the beginning of this section\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f290d0c61b4a664e303de559bbc559015fd375f9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f290d0c61b4a664e303de559bbc559015fd375f9.md new file mode 100644 index 0000000..04be962 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f290d0c61b4a664e303de559bbc559015fd375f9.md @@ -0,0 +1,25 @@ +# Example: Searching for nodes using a custom filter + +# Example: Searching for nodes using a custom filter # + +The section [Finding nodes](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/jython/clementine/python_node_find.html#python_node_find) includes an example of searching for a node in a flow using the type name of the node as the search criterion\. In some situations, a more generic search is required and this can be accomplished by using the `NodeFilter` class and the flow `findAll()` method\. This type of search involves the following two steps: + + + +1. Creating a new class that extends `NodeFilter` and that implements a custom version of the `accept()` method\. +2. Calling the flow `findAll()` method with an instance of this new class\. This returns all nodes that meet the criteria defined in the `accept()` method\. + + + +The following example shows how to search for nodes in a flow that have the node cache enabled\. The returned list of nodes can be used to either flush or disable the caches of these nodes\. + + import modeler.api + + class CacheFilter(modeler.api.NodeFilter): + """A node filter for nodes with caching enabled""" + def accept(this, node): + return node.isCacheEnabled() + + cachingnodes = modeler.script.stream().findAll(CacheFilter(), False) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f2d3c76d5eabbbf72a0314f29374527c8339591a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f2d3c76d5eabbbf72a0314f29374527c8339591a.md new file mode 100644 index 0000000..7963c5a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f2d3c76d5eabbbf72a0314f29374527c8339591a.md @@ -0,0 +1,24 @@ +# applygmm properties + +# applygmm properties # + +You can use the Gaussian Mixture node to generate a Gaussian Mixture model nugget\. The scripting name of this model nugget is *applygmm*\. For more information on scripting the modeling node itself, see [gmm properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/gmmnodeslots.html#gmmnodeslots)\. + + + +applygmm properties + +Table 1\. applygmm properties + +| `applygmm` properties | Data type | Property description | +| --------------------- | --------- | -------------------- | +| `centers` | | | +| `item_count` | | | +| `total` | | | +| `dimension` | | | +| `components` | | | +| `partition` | | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f30cf59adffcbe4164483b5a63260724a1dfc7ca.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f30cf59adffcbe4164483b5a63260724a1dfc7ca.md new file mode 100644 index 0000000..b4ff198 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f30cf59adffcbe4164483b5a63260724a1dfc7ca.md @@ -0,0 +1,33 @@ +# Tracking assets in an AI use case + +# Tracking assets in an AI use case # + +Track machine learning models or prompt templates in AI use cases to capture details about them in factsheets\. Use the information collected in the AI use case to monitor the progress of assets through the AI lifecycle, from request to production\. + +Define an AI use case to identify a business problem and request a solution\. A solution might be a predictive machine learning model or a generative AI prompt template\. When an asset is developed, associate it with the use case to capture details about the asset in factsheets\. As the asset moves through the AI lifecycle, from development to testing and then to production, the factsheets collect the data to support governance or compliance goals\. + +## Creating approaches to compare ways to solve a problem ## + +Each AI use case can contain at least one *approach*\. An approach is one facet of the solution to the business problem represented by the AI use case\. For example, you might create two approaches to compare by using different frameworks for predictive models to see which one performs best\. Or, created approaches to track several prompt templates in a use case\. + +Approaches also capture version information\. The same version number is applied to all assets in an approach\. If you have a stable version of an asset, you might maintain that version in an approach and create a new approach for the next round of iteration and experimentation\. + +This use case includes three approaches for organizing three prompt templates for an insurance claims processing use case: + +![Multiple approaches for an insurance claim use case](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/xgov-prompt-approach1.png) + +## Adding assets to a use case ## + +You can track these assets in an AI use case: + + + + * [Prompt templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-track-prompt-temp.html) include the prompt input for a foundation model and variables that are defined to make the prompt reusable for generating new output\. + * [Machine learning models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-track-ml-model.html) that are created by using a Watson Machine Learning tool such as AutoAI or SPSS Modeler\. + * [External models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-external-models.html) are models that are created in Jupyter Notebooks or models that are created by using a third\-party machine learning provider\. + + + +**Parent topic:**[Governing assets in AI use cases](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-use-cases.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f31a520a8c2c1b9c7f80b14ebcd096bb1121d53d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f31a520a8c2c1b9c7f80b14ebcd096bb1121d53d.md new file mode 100644 index 0000000..6228490 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f31a520a8c2c1b9c7f80b14ebcd096bb1121d53d.md @@ -0,0 +1,73 @@ +# Managing deployment jobs + +# Managing deployment jobs # + +A job is a way of running a batch deployment, script, or notebook in Watson Machine Learning\. You can choose to run a job manually or on a schedule that you specify\. After you create one or more jobs, you can view and manage them from the **Jobs** tab of your deployment space\. + +From the **Jobs** tab of your space, you can: + + + + * See the list of the jobs in your space + * View the details of each job\. You can change the schedule settings of a job and pick a different environment template\. + * Monitor job runs + * Delete jobs + + + +See the following sections for various aspects of job management: + + + + * [Creating a job for a batch deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-jobs.html?context=cdpaas&locale=en#create-jobs-batch) + * [Viewing jobs in a space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-jobs.html?context=cdpaas&locale=en#viewing-jobs-in-a-space) + * [Managing job metadata retention ](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-jobs.html?context=cdpaas&locale=en#delete-jobs) + + + +## Creating a job for a batch deployment ## + +Important: You must have an existing batch deployment to create a batch job\. + +To learn how to create a job for a batch deployment, see [Creating jobs in a batch deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-jobs.html)\. + +## Viewing jobs in a space ## + +You can view all of the jobs that exist for your deployment space from the Jobs page\. You can also delete a job\. + +To view the details of a specific job, click the job\. From the job's details page, you can do the following: + + + + * View the runs for that job and the status of each run\. If a run failed, you can select the run and view the log tail or download the entire log file to help you troubleshoot the run\. A failed run might be related to a temporary connection or environment problem\. Try running the job again\. If the job still fails, you can send the log to Customer Support\. + * When a job is running, a progress indicator on the information page displays information about relative progress of the run\. You can use the progress indicator to monitor a long run\. + * Edit schedule settings or pick another environment template\. + * Run the job manually by clicking the run icon from the job action bar\. You must deselect the schedule to run the job manually\. + + + +## Managing job metadata retention ## + +The Watson Machine Learning plan that is associated with your IBM Cloud account sets limits on the number of running and stored deployments that you can create\. If you exceed your limit, you cannot create new deployments until you delete existing deployments or upgrade your plan\. For more information, see [Watson Machine Learning plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html)\. + +### Managing metadata retention and deletion programmatically ### + +If you are managing a job programmatically by using the Python client or REST API, you can retrieve metadata from the deployment endpoint by using the `GET` method during the 30 days\. + +To keep the metadata for more or less than 30 days, change the query parameter from the default of `retention=30` for the `POST` method to override the default and preserve the metadata\. + +Note:Changing the value to `retention=-1` cancels the auto\-delete and preserves the metadata\. + +To delete a job programmatically, specify the query parameter `hard_delete=true` for the Watson Machine Learning `DELETE` method to completely remove the job metadata\. + +The following example shows how to use `DELETE` method: + + DELETE /ml/v4/deployment_jobs/{JobsID} + +## Learn from samples ## + +Refer to [Machine learning samples and examples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-samples-overview.html) for links to sample notebooks that demonstrate creating batch deployments and jobs by using the Watson Machine Learning [REST API](https://cloud.ibm.com/apidocs/machine-learning) and Watson Machine Learning [Python client library](https://ibm.github.io/watson-machine-learning-sdk/)\. + +**Parent topic:**[Managing predictive deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f37bd72c28f0dac8d9478eceaba4f077abcde0c9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f37bd72c28f0dac8d9478eceaba4f077abcde0c9.md new file mode 100644 index 0000000..8d93176 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f37bd72c28f0dac8d9478eceaba4f077abcde0c9.md @@ -0,0 +1,23 @@ +# Decision Optimization notebook tutorial create new scenario + +# Create new scenario # + +To solve with different versions of your model or data you can create new scenarios in the Decision Optimization experiment UI\. + +## Procedure ## + +To create a new scenario: + + + +1. Click the **Open scenario pane** icon ![Open scenario pane button](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Introduction/images/CPDscenariomanage.jpg) to open the **Scenario** panel\. +2. Use the Create Scenario drop\-down menu to create a new scenario from the current one\. +3. Add a name for the duplicate scenario and click **Create**\. +4. Working in your new scenario, in the Prepare data view, open the `diet_food` data table in full mode\. +5. Locate the entry for *Hotdog* at row 9, and set the `qmax` value to 0 to exclude hot dog from possible solutions\. +6. Switch to the **Build model** view and run the model again\. +7. You can see the impact of your changes on the solution by switching from one scenario to the other\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f3ba8ccb1e55bb6535944cb5acdb19efaeb1c3f9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f3ba8ccb1e55bb6535944cb5acdb19efaeb1c3f9.md new file mode 100644 index 0000000..13831f5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f3ba8ccb1e55bb6535944cb5acdb19efaeb1c3f9.md @@ -0,0 +1,5 @@ +# Db2 on IBM watsonx + +# Db2 on IBM watsonx # + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f3c0ad81bbf56463510440f7f81eb146a6c0015c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f3c0ad81bbf56463510440f7f81eb146a6c0015c.md new file mode 100644 index 0000000..3a7b573 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f3c0ad81bbf56463510440f7f81eb146a6c0015c.md @@ -0,0 +1,86 @@ +# Time series lazy evaluation + +# Time series lazy evaluation # + +Lazy evaluation is an evaluation strategy that delays the evaluation of an expression until its value is needed\. When combined with memoization, lazy evaluation strategy avoids repeated evaluations and can reduce the running time of certain functions by a significant factor\. + +The time series library uses lazy evaluation to process data\. Notionally an execution graph is constructed on time series data whose evaluation is triggered only when its output is materialized\. Assuming an object is moving in a one dimensional space, whose location is captured by x(t)\. You can determine the harsh acceleration/braking (`h(t)`) of this object by using its velocity (`v(t)`) and acceleration (`a(t)`) time series as follows: + + # 1d location timeseries + x(t) = input location timeseries + + # velocity - first derivative of x(t) + v(t) = x(t) - x(t-1) + + # acceleration - second derivative of x(t) + a(t) = v(t) - v(t-1) + + # harsh acceleration/braking using thresholds on acceleration + h(t) = +1 if a(t) > threshold_acceleration + = -1 if a(t) < threshold_deceleration + = 0 otherwise + +This results in a simple execution graph of the form: + + x(t) --> v(t) --> a(t) --> h(t) + +Evaluations are triggered only when an action is performed, such as `compute h(5...10)`, i\.e\. `compute h(5), ..., h(10)`\. The library captures narrow temporal dependencies between time series\. In this example, `h(5...10)` requires `a(5...10)`, which in turn requires `v(4...10)`, which then requires `x(3...10)`\. Only the relevant portions of `a(t)`, `v(t)` and `x(t)` are evaluated\. + + h(5...10) <-- a(5...10) <-- v(4...10) <-- x(3...10) + +Furthermore, evaluations are memoized and can thus be reused in subsequent actions on `h`\. For example, when a request for `h(7...12)` follows a request for `h(5...10)`, the memoized values `h(7...10)` would be leveraged; further, `h(11...12)` would be evaluated using `a(11...12), v(10...12)` and `x(9...12)`, which would in turn leverage `v(10)` and `x(9...10)` memoized from the prior computation\. + +In a more general example, you could define a smoothened velocity timeseries as follows: + + # 1d location timeseries + x(t) = input location timeseries + + # velocity - first derivative of x(t) + v(t) = x(t) - x(t-1) + + # smoothened velocity + # alpha is the smoothing factor + # n is a smoothing history + v_smooth(t) = (v(t)*1.0 + v(t-1)*alpha + ... + v(t-n)*alpha^n) / (1 + alpha + ... + alpha^n) + + # acceleration - second derivative of x(t) + a(t) = v_smooth(t) - v_smooth(t-1) + +In this example `h(l...u)` has the following temporal dependency\. Evaluation of `h(l...u)` would strictly adhere to this temporal dependency with memoization\. + + h(l...u) <-- a(l...u) <-- v_smooth(l-1...u) <-- v(l-n-1...u) <-- x(l-n-2...u) + +## An Example ## + +The following example shows a python code snippet that implements harsh acceleration on a simple in\-memory time series\. The library includes several built\-in transforms\. In this example the difference transform is applied twice to the location time series to compute acceleration time series\. A map operation is applied to the acceleration time series using a harsh lambda function, which is defined after the code sample, that maps acceleration to either `+1` (harsh acceleration), `-1` (harsh braking) and `0` (otherwise)\. The filter operation selects only instances wherein either harsh acceleration or harsh braking is observed\. Prior to calling `get_values`, an execution graph is created, but no computations are performed\. On calling `get_values(5, 10)`, the evaluation is performed with memoization on the narrowest possible temporal dependency in the execution graph\. + + import tspy + from tspy.builders.functions import transformers + + x = tspy.time_series([1.0, 2.0, 4.0, 7.0, 11.0, 16.0, 22.0, 29.0, 28.0, 30.0, 29.0, 30.0, 30.0]) + v = x.transform(transformers.difference()) + a = v.transform(transformers.difference()) + h = a.map(harsh).filter(lambda h: h != 0) + + print(h[5, 10]) + +The harsh lambda is defined as follows: + + def harsh(a): + threshold_acceleration = 2.0 + threshold_braking = -2.0 + + if (a > threshold_acceleration): + return +1 + elif (a < threshold_braking): + return -1 + else: + return 0 + +## Learn more ## + +To use the `tspy` Python SDK, see the [`tspy` Python SDK documentation](https://ibm-cloud.github.io/tspy-docs/)\. + +**Parent topic:**[Time series analysis](https://dataplatform.cloud.ibm.com/docs/content/wsj/spark/time-series-lib.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f3dd7962cb3aa07c8c469ede0c7852993ac3f290.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f3dd7962cb3aa07c8c469ede0c7852993ac3f290.md new file mode 100644 index 0000000..8c8bcd8 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f3dd7962cb3aa07c8c469ede0c7852993ac3f290.md @@ -0,0 +1,25 @@ +# Import node common properties + +# Import node common properties # + +Properties that are common to most import nodes are listed here, with information on specific nodes in the topics that follow\. + + + +Import node common properties + +Table 1\. Import node common properties + +| Property name | Data type | Property description | +| ----------------- | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `asset_type` | `DataAsset`
`Connection` | Specify your data type: `DataAsset` or `Connection`\. | +| `asset_id` | *string* | When `DataAsset` is set for the `asset_type`, this is the ID of the asset\. | +| `asset_name` | *string* | When `DataAsset` is set for the `asset_type`, this is the name of the asset\. | +| `connection_id` | *string* | When `Connection` is set for the `asset_type`, this is the ID of the connection\. | +| `connection_name` | *string* | When `Connection` is set for the `asset_type`, this is the name of the connection\. | +| `connection_path` | *string* | When `Connection` is set for the `asset_type`, this is the path of the connection\. | +| `user_settings` | *string* | Escaped JSON string containing the interaction properties for the connection\. Contact IBM for details about available interaction points\.

Example:

`user_settings: "{\"interactionProperties\":{\"write_mode\":\"write\",\"file_name\":\"output.csv\",\"file_format\":\"csv\",\"quote_numerics\":true,\"encoding\":\"utf-8\",\"first_line_header\":true,\"include_types\":false}}"`

Note that these values will change based on the type of connection you're using\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f43870b5b6ce4d191950fdaae6aafc36f05360c9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f43870b5b6ce4d191950fdaae6aafc36f05360c9.md new file mode 100644 index 0000000..89f56e5 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f43870b5b6ce4d191950fdaae6aafc36f05360c9.md @@ -0,0 +1,84 @@ +# Compute resource options for RStudio in projects + +# Compute resource options for RStudio in projects # + +When you run RStudio in a project, you choose an environment template for the runtime environment\. The environment template specifies the type, size, and power of the hardware configuration, plus the software template\. + + + + * [Types of environments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-envs.html?context=cdpaas&locale=en#types) + * [Default environment templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-envs.html?context=cdpaas&locale=en#default) + * [Compute usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-envs.html?context=cdpaas&locale=en#compute) + * [Runtime scope](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-envs.html?context=cdpaas&locale=en#scope) + * [Changing the runtime](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-envs.html?context=cdpaas&locale=en#change-env) + + + +## Types of environments ## + +You can use this type of environment with RStudio: + + + + * Default RStudio CPU environments for standard workloads + + + +## Default environment templates ## + +You can select any of the following default environment templates for RStudio in a project\. These default environment templates are listed under **Templates** on the **Environments** page on the **Manage** tab of your project\. All environment templates use RStudio with Runtime 23\.1 on the R 4\.2 programming language\. + + + +Default RStudio environment templates + +| Name | Hardware configuration | Local storage | CUH rate per hour | +| -------------------- | ---------------------- | ------------- | ----------------- | +| `Default RStudio L` | 16 vCPU and 64 GB RAM | 2 GB | 8 | +| `Default RStudio M` | 8 vCPU and 32 GB RAM | 2 GB | 4 | +| `Default RStudio XS` | 2 vCPU and 8 GB RAM | 2 GB | 1 | + + + +If you don't explicitly select an environment, `Default RStudio M` is the default\. The hardware configuration of the available RStudio environments is preset and cannot be changed\. + +For compute\-intensive processing on a large data set, consider pushing your data processing to Spark from your RStudio session\. See [Using Spark in RStudio](https://medium.com/ibm-data-science-experience/access-ibm-analytics-for-apache-spark-from-rstudio-eb11bf8b401b)\. + +To prevent consuming extra capacity unit hours (CUHs), stop all active RStudio runtimes when you no longer need them\. See [RStudio idle timeout](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html#stop-active-runtimes)\. + +## Compute usage in projects ## + +RStudio consumes compute resources as CUH from the Watson Studio service in projects\. + +You can monitor the Watson Studio CUH consumption on the **Resource usage** page on the **Manage** tab of your project\. + +## Runtime scope ## + +An RStudio environment runtime is always scoped to a project and a user\. Each user can only have one RStudio runtime per project at one time\. If you start RStudio in a project in which you already have an active RStudio session, the existing active session is disconnected and you can continue working in the new RStudio session\. + +## Changing the RStudio runtime ## + +If you notice that processing is very slow, you can restart RStudio and select a larger environment runtime\. + +To change the RStudio environment runtime: + + + +1. Save any data from your current session before switching to another environment\. +2. Stop the active RStudio runtime under **Tool runtimes** on the **Environments** page on the **Manage** tab of your project\. +3. Restart RStudio from the **Launch IDE** menu on your project's action bar and select another environment with the compute power and memory capacity that better meets your data processing requirements\. + + + +## Learn more ## + + + + * [RStudio](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/rstudio-overview.html) + * [Monitoring account resource usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html) + + + +**Parent topic:**[Choosing compute resources for tools](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/environments-parent.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f495f5206c908fb1a31f18a8ab3ce9465164564c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f495f5206c908fb1a31f18a8ab3ce9465164564c.md new file mode 100644 index 0000000..d7eee14 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f495f5206c908fb1a31f18a8ab3ce9465164564c.md @@ -0,0 +1,57 @@ +# Getting started with IBM watsonx as a Service + +# Getting started with IBM watsonx as a Service # + +You can sign up for IBM watsonx\.ai or IBM watsonx\.governance and explore the tutorials, resources, and tools to immediately get started working with models or governing models\. If you are an administrator, follow the steps to set up watsonx for your organization\. + +## Start working ## + +To start working: + + + +1. If you haven't already, [sign up](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/signup-wx.html) for watsonx\.ai or watsonx\.governance\. +2. Click a task tile on the watsonx home page and start working\. For example, click **Experiment with foundation models and build prompts** to open the Prompt Lab\. Then, choose a sample prompt and start experimenting\. Your first project, where you save your work, is created automatically\. See [Your sandbox project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/sandbox.html)\. +3. Explore your resources: + + + + * Take a [Quick start tutorial](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html) + * Click a category in the **Samples** area of the home page to try out a notebook, a prompt, or a sample project. + + + + + +If you are an existing Cloud Pak for Data as a Service user, you can [switch to watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/platform-switcher.html)\. + +## Set up the platform as an administrator ## + +To set up the watsonx platform for your organization, see [Setting up the platform as an administrator](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-platform.html)\. + +## Learn about watsonx ## + +To understand watsonx, start with these resources: + + + + * [Overview of watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/overview-wx.html) + * [Video library](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html) + * [Projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html) + * [Foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-overview.html) + * [Read blogs on Medium and the IBM Community](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-help.html#community) + + + +Other information: + + + + * [Get help](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-help.html) + * [Browser support](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/browser-support.html) + * [Language support](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/localization.html) + * [IBM watsonx APIs](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wdp-apis.html) + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f4a482326d45dc729eb8d1a6735cefacd7ae5578.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f4a482326d45dc729eb8d1a6735cefacd7ae5578.md new file mode 100644 index 0000000..3759c33 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f4a482326d45dc729eb8d1a6735cefacd7ae5578.md @@ -0,0 +1,156 @@ +# Creating online deployments in Watson Machine Learning + +# Creating online deployments in Watson Machine Learning # + +Create an online (also called `Web service`) deployment to load a model or Python code when the deployment is created to generate predictions online, in real time\. For example, if you create a classification model to test whether a new customer is likely to participate in a sales promotion, you can create an online deployment for the model\. Then, you can enter the new customer data to get an immediate prediction\. + +### Supported frameworks ### + +Online deployment is supported for these frameworks: + + + + * PMML + * Python Function + * PyTorch\-Onnx + * Tensorflow + * Scikit\-Learn + * Spark MLlib + * SPSS + * XGBoost + + + +You can create an online deployment [from the user interface](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-online.html?context=cdpaas&locale=en#online-interface) or [programmatically](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-online.html?context=cdpaas&locale=en#online-programmatically)\. + +To send payload data to an asset that is deployed online, you must know the endpoint URL of the deployment\. Examples include, classification of data, or making predictions from the data\. For more information, see [Retrieving the deployment endpoint](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-online.html?context=cdpaas&locale=en#get-online-endpoint)\. + +Additionally, you can: + + + + * [Test your online deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-online.html?context=cdpaas&locale=en#test-online-deployment) + * [Access the deployment details](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-online.html?context=cdpaas&locale=en#access-online-details) + + + +## Creating an online deployment from the User Interface ## + + + +1. From the deployment space, click the name of the asset that you want to deploy\. The details page opens\. +2. Click **New deployment**\. +3. Choose **Online** as the deployment type\. +4. Provide a name and an optional description for the deployment\. +5. If you want to specify a name to be used instead of deployment ID, use the **Serving name** field\. + + + + * The name must be validated to be unique per IBM cloud region (all names in a specific region share a global namespace). + * The name must contain only these characters: \[a-z,0-9,\_\] and must be a maximum 36 characters long. + * Serving name works only as part of the prediction URL. In some cases, you must still use the deployment ID. + + + +6. Click **Create** to create the deployment\. + + + +## Creating an online deployment programmatically ## + +Refer to [Machine learning samples and examples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-samples-overview.html) for links to sample notebooks\. These notebooks demonstrate creating online deployments that use the Watson Machine Learning [REST API](https://cloud.ibm.com/apidocs/machine-learning) and Watson Machine Learning [Python client library](https://ibm.github.io/watson-machine-learning-sdk/)\. + +## Retrieving the online deployment endpoint ## + +You can find the endpoint URL of a deployment in these ways: + + + + * From the **Deployments** tab of your space, click your deployment name\. A page with deployment details opens\. You can find the endpoint there\. + * Using the Watson Machine Learning Python client: + + + + 1. List the deployments by calling the [Python client method](https://ibm.github.io/watson-machine-learning-sdk/core_api.html#client.Deployments.list)`client.deployments.list()` + 2. Find the row with your deployment. The deployment endpoint URL is listed in the `url` column. + + + + + +**Notes**: + + + + * If you added **Serving name** to the deployment, two alternative endpoint URLs show on the screen; one containing the deployment ID, and the other containing your serving name\. You can use either one of these URLs with your deployment\. + * The **API Reference** tab also shows code snippets in various programming languages that illustrate how to access the deployment\. + + + +For more information, see [Endpoint URLs](https://cloud.ibm.com/apidocs/machine-learning#endpoint-url)\. + +## Testing your online deployment ## + +From the **Deployments** tab of your space, click your deployment name\. A page with deployment details opens\. The **Test** tab provides a place where you can enter data and get a prediction back from the deployed model\. If your model has a defined schema, a form shows on screen\. In the form, you can enter data in one of these ways: + + + + * Enter data directly in the form + * Download a CSV template, enter values, and upload the input data + * Upload a file that contains input data from your local file system or from the space + * Change to the JSON tab and enter your input data as JSON code Regardless of method, the input data must match the schema of the model\. Submit the input data and get a score, or prediction, back\. + + + +### Sample deployment code ### + +When you submit JSON code as the payload, or input data, for a deployment, your input data must match the schema of the model\. The 'fields' must match the column headers for the data, and the 'values' must contain the data, in the same order\. Use this format: + + {"input_data":[{ + "fields": , , ...], + "values": , , ...]] + }]} + +Refer to this example: + + {"input_data":[{ + "fields": "PassengerId","Pclass","Name","Sex","Age","SibSp","Parch","Ticket","Fare","Cabin","Embarked"], + "values": 1,3,"Braund, Mr. Owen Harris",0,22,1,0,"A/5 21171",7.25,null,"S"]] + }]} + +**Notes:** + + + + * All strings are enclosed in double quotation marks\. The Python notation for dictionaries looks similar, but Python strings in single quotation marks are not accepted in the JSON data\. + * Missing values can be indicated with `null`\. + * You can specify a hardware specification for an online deployment, for example if you are [scaling a deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-scaling.html)\. + + + +### Preparing payload that matches the schema of an existing model ### + +Refer to this sample code: + + model_details = client.repository.get_details("") # retrieves details and includes schema + columns_in_schema = [] + for i in range(0, len(model_details['entity']['input'].get('fields'))): + columns_in_schema.append(model_details['entity']['input'].get('fields')[i]) + + X = X[columns_in_schema] # where X is a pandas dataframe that contains values to be scored + #(...) + scoring_values = X.values.tolist() + array_of_input_fields = X.columns.tolist() + payload_scoring = {"input_data": [{"fields": array_of_input_fields],"values": scoring_values}]} + +## Accessing the online deployment details ## + +To access your online deployment details: From the **Deployments** tab of your space, click your deployment name and then click the **Deployment details** tab\. The **Deployment details** tab contains specific information that is related to the currently opened online deployment and allows for adding a model to the model inventory, to enable activity tracking and model comparison\. + +## Additional information ## + +Refer to [Assets in deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets-all.html) for details on managing deployment jobs, and updating, scaling, or deleting an online deployment\. + +**Parent topic:**[Managing predictive deployments](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f4f623d5a7c8913e227e962bd1f347b36aab7b51.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f4f623d5a7c8913e227e962bd1f347b36aab7b51.md new file mode 100644 index 0000000..6cc4622 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f4f623d5a7c8913e227e962bd1f347b36aab7b51.md @@ -0,0 +1,51 @@ +# Expressions and conditions (SPSS Modeler) + +# Expressions and conditions # + +CLEM expressions can return a result (used when deriving new values)\. + +For example: + + Weight * 2.2 + Age + 1 + sqrt(Signal-Echo) + +Or, they can evaluate *true* or *false* (used when selecting on a condition)\. For example: + + Drug = "drugA" + Age < 16 + not(PowerFlux) and Power > 2000 + +You can combine operators and functions arbitrarily in CLEM expressions\. For example: + + sqrt(abs(Signal))* max(T1, T2) + Baseline + +Brackets and operator precedence determine the order in which the expression is evaluated\. In this example, the order of evaluation is: + + + + * `abs(Signal`) is evaluated, and `sqrt` is applied to its result + * `max(T1, T2)` is evaluated + * The two results are multiplied: x has higher precedence than `+` + * Finally, `Baseline` is added to the result + + + +The descending order of precedence (that is, operations that are performed first to operations that are performed last) is as follows: + + + + * Function arguments + * Function calls + * xx + * x / mod div rem + * `+ –` + * `> < >= <= /== == = /=` + + + +If you want to override precedence, or if you're in any doubt of the order of evaluation, you can use parentheses to make it explicit\. For example: + + sqrt(abs(Signal))* (max(T1, T2) + Baseline) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f5086d0b6258fef503cb3219f427ffbff73135e1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f5086d0b6258fef503cb3219f427ffbff73135e1.md new file mode 100644 index 0000000..4411ced --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f5086d0b6258fef503cb3219f427ffbff73135e1.md @@ -0,0 +1,38 @@ +# Programming IBM Watson Pipelines + +# Programming IBM Watson Pipelines # + +You can program in a pipeline by using a notebook, or running Bash scripts in a pipeline\. + +## Programming with Bash scripts ## + +[Run Bash scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-config.html#run-bash) in a pipeline to compute or process data as part of the flow\. + +## Programming with notebooks ## + +You can use a notebook to run an end\-to\-end pipeline or to run parts of a pipeline, such as model training\. + + + + * For details on creating notebooks and for links to sample notebooks, see [Notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-editor.html)\. + * For details on running a notebook as a pipeline job, see [Run notebook job](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-config.html#run-notebook)\. + + + +### Using the Python client ### + +Use the [Watson Pipelines Python client](https://pypi.org/project/ibm-watson-pipelines/) for working with pipelines in a notebook\. + +To install the library, use `pip` to install the latest package of `ibm-watson-pipelines` in your coding environment\. For example, run the following code in your notebook environment or console\. + + !pip install ibm-watson-pipelines + +Use the client documentation for syntax and descriptions for commands that access pipeline components\. + +### Go further ### + +To learn more about how to orchestrate external tasks efficiently, see [Making tasks more efficiently with Tekton](https://medium.com/@rafal.bigaj/tekton-and-friends-how-to-orchestrate-external-tasks-efficiently-3fcacf882f6d), a key continuous delivery framework used for Pipelines\. + +**Parent topic:**[Creating a pipeline](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-orchestration-create.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f585df82f7a94309af9fb51196f188b4fa212118.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f585df82f7a94309af9fb51196f188b4fa212118.md new file mode 100644 index 0000000..3c52057 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f585df82f7a94309af9fb51196f188b4fa212118.md @@ -0,0 +1,7 @@ +# Spark node properties + +# Spark node properties # + +Refer to this section for a list of available properties for Spark nodes\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f5a6d2ae83a7989e17704e69f0a640368c676594.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f5a6d2ae83a7989e17704e69f0a640368c676594.md new file mode 100644 index 0000000..a7c328e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f5a6d2ae83a7989e17704e69f0a640368c676594.md @@ -0,0 +1,22 @@ +# Expression Builder (SPSS Modeler) + +# Expression Builder # + +You can type CLEM expressions manually or use the Expression Builder, which displays a complete list of CLEM functions and operators as well as data fields from the current flow, allowing you to quickly build expressions without memorizing the exact names of fields or functions\. + +The Expression Builder controls automatically add the proper quotes for fields and values, making it easier to create syntactically correct expressions\. + +Notes: + + + + * The Expression Builder is not supported in parameter settings\. + * If you want to change your datasource, before changing the source you should check that the Expression Builder can still support the functions you have selected\. Because not all databases support all functions, you may encounter an error if you run against a new datasource\. + * You can run an SPSS Modeler desktop stream file ( \.str) that contains database functions\. But they aren't yet available in the Expression Builder user interface\. + + + +Figure 1\. Expression Builder + +![Expression Builder](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/expressionbuilder_full.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f5af4bcc2d0168d2698beb2a858c24f81a476610.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f5af4bcc2d0168d2698beb2a858c24f81a476610.md new file mode 100644 index 0000000..5af9748 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f5af4bcc2d0168d2698beb2a858c24f81a476610.md @@ -0,0 +1,6 @@ +# Map charts + +# Map charts # + +Map charts are commonly used to compare values and show categories across geographical regions\. Map charts are most beneficial when the data contains geographic information (countries, regions, states, counties, postal codes, and so on)\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f64414c7f435b4b5e5a681a5f561c07780037836.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f64414c7f435b4b5e5a681a5f561c07780037836.md new file mode 100644 index 0000000..2f2571b --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f64414c7f435b4b5e5a681a5f561c07780037836.md @@ -0,0 +1,113 @@ +# IBM Cloud Data Engine connection + +# IBM Cloud Data Engine connection # + +To access your data in IBM Cloud Data Engine, create a connection asset for it\. + +IBM Cloud Data Engine is a service on IBM Cloud that you use to build, manage, and consume data lakes and their table assets in IBM Cloud Object Storage (COS)\. IBM Cloud Data Engine provides functions to load, prepare, and query big data that is stored in various formats\. It also includes a metastore with table definitions\. IBM Cloud Data Engine was formerly named "IBM Cloud SQL Query\." + +## Prerequisites ## + +## Create a connection to IBM Cloud Data Engine ## + +To create the connection asset, you need these connection details: + + + + * The Cloud Resource Name (CRN) of the IBM Cloud Data Engine instance\. Go to the IBM Cloud Data Engine service instance in your resources list in your IBM Cloud dashboard and copy the value of the CRN from the deployment details\. + * Target Cloud Object Storage: A default location where IBM Cloud Data Engine stores query results\. You can specify any Cloud Object Storage bucket that you have access to\. You can also select the default Cloud Object Storage bucket that is created when you open the IBM Cloud Data Engine web console for the first time from IBM Cloud dashboard\. See the **Target location** field in the IBM Cloud Data Engine web console\. + * IBM Cloud API key: An API key for a user or service ID that has access to your IBM Cloud Data Engine and Cloud Object Storage services (for both the Cloud Object Storage data that you want to query and the default target Cloud Object Storage location)\. + + + +You can create a new API key for your own user: + + + +1. In the IBM Cloud console, go to **Manage > Access (IAM)**\. +2. In the left navigation, select **API keys**\. +3. Select **Create an IBM Cloud API Key**\. + + + +### Credentials ### + +IBM Cloud Data Engine uses the SSO credentials that are specified as a single API key, which authenticates a user or service ID\. +The API key must have the following properties: + + + + * Manage permission for the IBM Cloud Data Engine instance + * Read access to all Cloud Object Storage locations that you want to read from + * Write access to the default Cloud Object Storage target location + * Write access to the IBM Cloud Data Engine instance + + + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use IBM Cloud Data Engine connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Notebooks\. See the Notebook [tutorial](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/e82c765fd1165439caccfc4ce8579a25) for using the IBM Cloud Data Engine (SQL Query) API to run SQL statements\. + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Restrictions ## + +You can only use this connection for source data\. You cannot write to data or export data with this connection\. + +## IBM Cloud Data Engine setup ## + +To set up IBM Cloud Data Engine on IBM Cloud Object Storage, see [Getting started with IBM Cloud Data Engine](https://cloud.ibm.com/docs/sql-query/sql-query.html#overview?cm_sp=Cloud-Product-_-OnPageNavLink-IBMCloudPlatform_IBMCloudObjectStorage-_-COSsql_LearnMore)\. + +## Supported encryption ## + +By default, all objects that are stored in IBM Cloud Object Storage are encrypted by using randomly generated keys and an all\-or\-nothing\-transform (AONT)\. For details, see [Encrypting your data](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-encryption)\. Additionally, you can use managed keys to encrypt the SQL query texts and error messages that are stored in the job information\. See [Encrypting SQL queries with Key Protect](https://cloud.ibm.com/docs/sql-query?topic=sql-query-keyprotect)\. + +### Running SQL statements ### + +[Video to learn how you can get started to run a basic query](https://cloud.ibm.com/docs/sql-query?topic=sql-query-overview#running) + +## Learn more ## + + + + * [IBM Cloud Data Engine](https://www.ibm.com/cloud/sql-query) + * [Connecting to a Cloud Data Lake with IBM Cloud Pak for Data](https://www.ibm.com/cloud/blog/connecting-to-a-cloud-data-lake-with-ibm-cloud-pak-for-data) + + + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f650943069620aa0bd7652df1abdce2c076de464.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f650943069620aa0bd7652df1abdce2c076de464.md new file mode 100644 index 0000000..0dc7740 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f650943069620aa0bd7652df1abdce2c076de464.md @@ -0,0 +1,7 @@ +# Python node properties + +# Python node properties # + +Refer to this section for a list of available properties for Python nodes\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f6670b3b49f00e4ee1f44e8b1c09e24afedd2529.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f6670b3b49f00e4ee1f44e8b1c09e24afedd2529.md new file mode 100644 index 0000000..3e53ae0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f6670b3b49f00e4ee1f44e8b1c09e24afedd2529.md @@ -0,0 +1,46 @@ +# rfmaggregatenode properties + +# rfmaggregatenode properties # + +![RFM Aggregate node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/mergenodeicon.png) The Recency, Frequency, Monetary (RFM) Aggregate node enables you to take customers' historical transactional data, strip away any unused data, and combine all of their remaining transaction data into a single row that lists when they last dealt with you, how many transactions they have made, and the total monetary value of those transactions\. + +Example + + node = stream.create("rfmaggregate", "My node") + node.setPropertyValue("relative_to", "Fixed") + node.setPropertyValue("reference_date", "2007-10-12") + node.setPropertyValue("id_field", "CardID") + node.setPropertyValue("date_field", "Date") + node.setPropertyValue("value_field", "Amount") + node.setPropertyValue("only_recent_transactions", True) + node.setPropertyValue("transaction_date_after", "2000-10-01") + + + +rfmaggregatenode properties + +Table 1\. rfmaggregatenode properties + +| `rfmaggregatenode` properties | Data type | Property description | +| ----------------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `relative_to` | `Fixed``Today` | Specify the date from which the recency of transactions will be calculated\. | +| `reference_date` | *date* | Only available if `Fixed` is chosen in `relative_to`\. | +| `contiguous` | *flag* | If your data is presorted so that all records with the same ID appear together in the data stream, selecting this option speeds up processing\. | +| `id_field` | *field* | Specify the field to be used to identify the customer and their transactions\. | +| `date_field` | *field* | Specify the date field to be used to calculate recency against\. | +| `value_field` | *field* | Specify the field to be used to calculate the monetary value\. | +| `extension` | *string* | Specify a prefix or suffix for duplicate aggregated fields\. | +| `add_as` | `Suffix``Prefix` | Specify if the `extension` should be added as a suffix or a prefix\. | +| `discard_low_value_records` | *flag* | Enable use of the `discard_records_below` setting\. | +| `discard_records_below` | *number* | Specify a minimum value below which any transaction details are not used when calculating the RFM totals\. The units of value relate to the `value` field selected\. | +| `only_recent_transactions` | *flag* | Enable use of either the `specify_transaction_date` or `transaction_within_last` settings\. | +| `specify_transaction_date` | *flag* | | +| `transaction_date_after` | *date* | Only available if `specify_transaction_date` is selected\. Specify the transaction date after which records will be included in your analysis\. | +| `transaction_within_last` | *number* | Only available if `transaction_within_last` is selected\. Specify the number and type of periods (days, weeks, months, or years) back from the Calculate Recency relative to date after which records will be included in your analysis\. | +| `transaction_scale` | `Days``Weeks``Months``Years` | Only available if `transaction_within_last` is selected\. Specify the number and type of periods (days, weeks, months, or years) back from the Calculate Recency relative to date after which records will be included in your analysis\. | +| `save_r2` | *flag* | Displays the date of the second most recent transaction for each customer\. | +| `save_r3` | *flag* | Only available if `save_r2` is selected\. Displays the date of the third most recent transaction for each customer\. | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f67e458a29cf154c33221a8889789241725fe5c7.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f67e458a29cf154c33221a8889789241725fe5c7.md new file mode 100644 index 0000000..39149c7 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f67e458a29cf154c33221a8889789241725fe5c7.md @@ -0,0 +1,15 @@ +# Python and Jython + +# Python and Jython # + +Jython is an implementation of the Python scripting language, which is written in the Java language and integrated with the Java platform\. Python is a powerful object\-oriented scripting language\. + +Jython is useful because it provides the productivity features of a mature scripting language and, unlike Python, runs in any environment that supports a Java virtual machine (JVM)\. This means that the Java libraries on the JVM are available to use when you're writing programs\. With Jython, you can take advantage of this difference, and use the syntax and most of the features of the Python language\. + +As a scripting language, Python (and its Jython implementation) is easy to learn and efficient to code, and has minimal required structure to create a running program\. Code can be entered interactively, that is, one line at a time\. Python is an interpreted scripting language; there is no precompile step, as there is in Java\. Python programs are simply text files that are interpreted as they're input (after parsing for syntax errors)\. Simple expressions, like defined values, as well as more complex actions, such as function definitions, are immediately executed and available for use\. Any changes that are made to the code can be tested quickly\. Script interpretation does, however, have some disadvantages\. For example, use of an undefined variable is not a compiler error, so it's detected only if (and when) the statement in which the variable is used is executed\. In this case, you can edit and run the program to debug the error\. + +Python sees everything, including all data and code, as an object\. You can, therefore, manipulate these objects with lines of code\. Some select types, such as numbers and strings, are more conveniently considered as values, not objects; this is supported by Python\. There is one null value that's supported\. This null value has the reserved name `None`\. + +For a more in\-depth introduction to Python and Jython scripting, and for some example scripts, see [http://www\.ibm\.com/developerworks/java/tutorials/j\-jython1/j\-jython1\.html](http://www.ibm.com/developerworks/java/tutorials/j-jython1/j-jython1.html) and [http://www\.ibm\.com/developerworks/java/tutorials/j\-jython2/j\-jython2\.html](http://www.ibm.com/developerworks/java/tutorials/j-jython2/j-jython2.html)\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f6cc81e55c6aad12849a56837f14538576f5a42c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f6cc81e55c6aad12849a56837f14538576f5a42c.md new file mode 100644 index 0000000..7c004fe --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f6cc81e55c6aad12849a56837f14538576f5a42c.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Confidential data disclosure # + +![icon for intellectual property risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-intellectual-property.svg)Risks associated with inputTraining and tuning phaseIntellectual propertyTraditional + +### Description ### + +Models might be trained or fine\-tuned using confidential data or the company’s intellectual property, which could result in unwanted disclosure of that information\. + +### Why is confidential data disclosure a concern for foundation models? ### + +If not developed in accordance with data protection rules and regulations, the model might expose confidential information or IP in the generated output or through an adversarial attack\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f7b2dd759b6fc618d53ad49053c24ef8d35105c5.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f7b2dd759b6fc618d53ad49053c24ef8d35105c5.md new file mode 100644 index 0000000..160221c --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f7b2dd759b6fc618d53ad49053c24ef8d35105c5.md @@ -0,0 +1,29 @@ +# Deploying and managing assets + +# Deploying and managing assets # + +Use Watson Machine Learning to deploy models and solutions so that you can put them into productive use, then monitor the deployed assets for fairness and explainability\. You can also automate the AI lifecycle to keep your deployed assets current\. + +## Completing the AI lifecycle ## + +After you prepare your data and build then train models or solutions, you complete the AI lifecycle by deploying and monitoring your assets\. + +![Overview of model workflow](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/ml-engineer-overview-wx.svg) + +Deployment is the final stage of the lifecycle of a model or script, where you run your models and code\. Watson Machine Learning provides the tools that you need to deploy an asset, such as a predictive model, Python function\. You can also deploy foundation model assets, such as prompt templates, to put them into production\. + +Following deployment, you can use model management tools to evaluate your models\. IBM Watson OpenScale tracks and measures outcomes from your AI models, and helps ensure they remain fair, explainable, and compliant\. Watson OpenScale also detects and helps correct the drift in accuracy when an AI model is in production\. + +Finally, you can use IBM Watson Pipelines to manage your ModelOps processes\. Create a pipeline that automates parts of the AI lifecycle, such as training and deploying a machine learning model\. + +## Next steps ## + + + + * To learn more about how to manage assets in a deployment space, see [Manage assets in a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html)\. + * To learn more about how to deploy assets from a deployment space, see [Deploy assets from a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy-general.html)\. + * To learn more how to deploy by using [Python client](https://ibm.github.io/watson-machine-learning-sdk/) or , see [Sample notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-samples-overview.html)\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f7d94e6cd13f36eb9b1fe7653c436dc5745250b1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f7d94e6cd13f36eb9b1fe7653c436dc5745250b1.md new file mode 100644 index 0000000..e7c3788 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f7d94e6cd13f36eb9b1fe7653c436dc5745250b1.md @@ -0,0 +1,9 @@ +# Candlestick charts + +# Candlestick charts # + +Candlestick charts are a style of financial charts that are used to describe price movements of a security, derivative, or currency\. Each candlestick element typically shows one day\. A one\-month chart might show the 20 trading days as 20 candlesticks elements\. Candlestick charts are most often used in the analysis of equity and currency price patterns and are similar to box plots\. + +The data set that is used to create a candlestick chart must contain open, high, low, and close values for each time period you want to display\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f7d95a9fcca49861b0d4b7dce677d4e6eff1f7c1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f7d95a9fcca49861b0d4b7dce677d4e6eff1f7c1.md new file mode 100644 index 0000000..b712567 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f7d95a9fcca49861b0d4b7dce677d4e6eff1f7c1.md @@ -0,0 +1,12 @@ +# Creating advanced visualizations (SPSS Modeler) + +# Creating advanced visualizations # + +The previous three sections use different types of graph nodes\. Another way to explore data is with the advanced visualizations feature\. + +You can use the Charts node to launch the chart builder and create advanced charts to explore your data from different perspectives and identify patterns, connections, and relationships within your data\. + +Figure 1\. Advanced visualizations + +![Advanced visualizations](https://dataplatform.cloud.ibm.com/docs/content/wsd/images/tut_drug_viz.png) + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f7e8527824e15b4194a3fd12ceee049f910016db.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f7e8527824e15b4194a3fd12ceee049f910016db.md new file mode 100644 index 0000000..d3062b9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f7e8527824e15b4194a3fd12ceee049f910016db.md @@ -0,0 +1,108 @@ +# Watson Natural Language Processing library + +# Watson Natural Language Processing library # + +The Watson Natural Language Processing library provides natural language processing functions for syntax analysis and pre\-trained models for a wide variety of text processing tasks, such as sentiment analysis, keyword extraction, and classification\. The Watson Natural Language Processing library is available for Python only\. + +With Watson Natural Language Processing, you can turn unstructured data into structured data, making the data easier to understand and transferable, in particular if you are working with a mix of unstructured and structured data\. Examples of such data are call center records, customer complaints, social media posts, or problem reports\. The unstructured data is often part of a larger data record that includes columns with structured data\. Extracting meaning and structure from the unstructured data and combining this information with the data in the columns of structured data: + + + + * Gives you a deeper understanding of the input data + * Can help you to make better decisions\. + + + +Watson Natural Language Processing provides pre\-trained models in over 20 languages\. They are curated by a dedicated team of experts, and evaluated for quality on each specific language\. These pre\-trained models can be used in production environments without you having to worry about license or intellectual property infringements\. + +Although you can create your own models, the easiest way to get started with Watson Natural Language Processing is to run the pre\-trained models on unstructured text to perform language processing tasks\. + +Some examples of language processing tasks available in Watson Natural Language Processing pre\-trained models: + + + + * Language detection: detect the language of the input text + * Syntax: tokenization, lemmatization, part of speech tagging, and dependency parsing + * Entity extraction: find mentions of entities (like person, organization, or date) + * Noun phrase extraction: extract noun phrases from the input text + * Text classification: analyze text and then assign a set of pre\-defined tags or categories based on its content + * Sentiment classification: is the input document positive, negative or neutral? + * Tone classification: classify the tone in the input document (like excited, frustrated, or sad) + * Emotion classification: classify the emotion of the input document (like anger or disgust) + * Keywords extraction: extract noun phrases that are relevant in the input text + * Concepts: find concepts from DBPedia in the input text + * Relations: detect relations between two entities + * Hierarchical categories: assign individual nodes within a hierarchical taxonomy to the input document + * Embeddings: map individual words or larger text snippets into a vector space + + + +Watson Natural Language Processing encapsulates natural language functionality through blocks and workflows\. Blocks and workflows support functions to load, run, train, and save a model\. + +For more information, refer to [Working with pre\-trained models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-pretrained.html)\. + +Some examples of how you can use the Watson Natural Language Processing library: + +Running syntax analysis on a text snippet: + + import watson_nlp + + # Load the syntax model for English + syntax_model = watson_nlp.load('syntax_izumo_en_stock') + + # Run the syntax model and print the result + syntax_prediction = syntax_model.run('Welcome to IBM!') + print(syntax_prediction) + +Extracting entities from a text snippet: + + import watson_nlp + entities_workflow = watson_nlp.load('entity-mentions_transformer-workflow_multilingual_slate.153m.distilled') + entities = entities_workflow.run('IBM\'s CEO Arvind Krishna is based in the US', language_code="en") + print(entities.get_mention_pairs()) + +For examples of how to use the Watson Natural Language Processing library, refer to [Watson Natural Language Processing library usage samples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp-samples.html)\. + +## Using Watson Natural Language Processing in a notebook ## + +You can run your Python notebooks that use the Watson Natural Language Processing library in any of the environments that listed here\. The GPU environment templates include the Watson Natural Language Processing library\. + +DO \+ NLP: Indicates that the environment template includes both the CPLEX and the DOcplex libraries to model and solve decision optimization problems and the Watson Natural Language Processing library\. + +**~** : Indicates that the environment template requires the Watson Studio Professional plan\. See [Offering plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/ws-plans.html)\. + + + +Environment templates that include the Watson Natural Language Processing library + +| Name | Hardware configuration | CUH rate per hour | +| ---------------------------------------------- | ------------------------------------------- | ----------------- | +| NLP \+ DO Runtime 23\.1 on Python 3\.10 XS | 2vCPU and 8 GB RAM | 6 | +| DO \+ NLP Runtime 22\.2 on Python 3\.10 XS | 2 vCPU and 8 GB RAM | 6 | +| GPU V100 Runtime 23\.1 on Python 3\.10 **~** | 40 vCPU \+ 172 GB \+ 1 NVIDIA® V100 (1 GPU) | 68 | +| GPU 2xV100 Runtime 23\.1 on Python 3\.10 **~** | 80 vCPU \+ 344 GB \+ 2 NVIDIA® V100 (2 GPU) | 136 | +| GPU V100 Runtime 22\.2 on Python 3\.10 **~** | 40 vCPU \+ 172 GB \+ 1 NVIDIA® V100 (1 GPU) | 68 | +| GPU 2xV100 Runtime 22\.2 on Python 3\.10 **~** | 80 vCPU \+ 344 GB \+ 2 NVIDIA® V100 (2 GPU) | 136 | + + + +Normally these environments are sufficient to run notebooks that use prebuilt models\. If you need a larger environment, for example to train your own models, you can create a custom template that includes the Watson Natural Language Processing library\. Refer to [Creating your own environment template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-customize-env-definition.html)\. + + + + * Create a custom template without GPU by selecting the engine type `Default`, the hardware configuration size that you need, and choosing `NLP + DO Runtime 23.1 on Python 3.10` or `DO + NLP Runtime 22.2 on Python 3.10` as the software version\. + * Create a custom template with GPU by selecting the engine type `GPU`, the hardware configuration size that you need, and choosing `GPU Runtime 23.1 on Python 3.10` or `GPU Runtime 22.2 on Python 3.10` as the software version\. + + + +## Learn more ## + + + + * [Creating your own environment template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/create-customize-env-definition.html) + + + +**Parent topic:**[Notebooks and scripts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebooks-and-scripts.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f8026e82645eb65bd5e2741bc4df0e63da748b47.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f8026e82645eb65bd5e2741bc4df0e63da748b47.md new file mode 100644 index 0000000..27c6d74 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f8026e82645eb65bd5e2741bc4df0e63da748b47.md @@ -0,0 +1,17 @@ +# {{ document.title.text }} + +# Prompt leaking # + +![icon for robustness risk](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/images/risk-robustness.svg)Risks associated with inputInferenceRobustnessAmplified + +### Description ### + +A prompt leak attack attempts to extract a model's system prompt (also known as the system message)\. + +### Why is prompt leaking a concern for foundation models? ### + +A successful attack copies the system prompt used in the model\. Depending on the content of that prompt, the attacker might gain access to valuable information, such as sensitive personal information or intellectual property, and might be able to replicate some of the functionality of the model\. + +**Parent topic:**[AI risk atlas](https://dataplatform.cloud.ibm.com/docs/content/wsj/ai-risk-atlas/ai-risk-atlas.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f837935a2fefed20e2cac93656e376f9868cc515.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f837935a2fefed20e2cac93656e376f9868cc515.md new file mode 100644 index 0000000..77a7a6e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f837935a2fefed20e2cac93656e376f9868cc515.md @@ -0,0 +1,13 @@ +# SMOTE node (SPSS Modeler) + +# SMOTE node # + +The Synthetic Minority Over\-sampling Technique (SMOTE) node provides an over\-sampling algorithm to deal with imbalanced data sets\. It provides an advanced method for balancing data\. The SMOTE node in watsonx\.ai is implemented in Python and requires the imbalanced\-learn© Python library\. + +For details about the imbalanced\-learn library, see [imbalanced\-learn documentation](https://imbalanced-learn.org/stable/index.html)^1^\. + +The Modeling tab on the nodes palette contains the SMOTE node and other Python nodes\. + +^1^Lemaître, Nogueira, Aridas\. "Imbalanced\-learn: A Python Toolbox to Tackle the Curse of Imbalanced Datasets in Machine Learning\." *Journal of Machine Learning Research*, vol\. 18, no\. 17, 2017, pp\. 1\-5\. (http://jmlr\.org/papers/v18/16\-365\.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f837e34ed0ad4739783010d9ffd3684c37fd465c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f837e34ed0ad4739783010d9ffd3684c37fd465c.md new file mode 100644 index 0000000..28cefe9 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f837e34ed0ad4739783010d9ffd3684c37fd465c.md @@ -0,0 +1,67 @@ +# Mathematical methods + +# Mathematical methods # + +From the `math` module you can access useful mathematical methods\. Some of these methods are listed in the following table\. Unless specified otherwise, all values are returned as floats\. + + + +Mathematical methods + +Table 1\. Mathematical methods + +| Method | Usage | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `math.ceil(x)` | Return the ceiling of `x` as a float, that is the smallest integer greater than or equal to `x` | +| `math.copysign(x, y)` | Return `x` with the sign of `y`\. `copysign(1, -0.0)` returns `-1` | +| `math.fabs(x)` | Return the absolute value of `x` | +| `math.factorial(x)` | Return `x` factorial\. If `x` is negative or not an integer, a `ValueError` is raised\. | +| `math.floor(x)` | Return the floor of `x` as a float, that is the largest integer less than or equal to `x` | +| `math.frexp(x)` | Return the mantissa (`m`) and exponent (`e`) of `x` as the pair `(m, e)`\. `m` is a float and `e` is an integer, such that `x == m * 2**e` exactly\. If `x` is zero, returns `(0.0, 0)`, otherwise `0.5 <= abs(m) < 1`\. | +| `math.fsum(iterable)` | Return an accurate floating point sum of values in `iterable` | +| `math.isinf(x)` | Check if the float `x` is positive or negative infinitive | +| `math.isnan(x)` | Check if the float `x` is `NaN` (not a number) | +| `math.ldexp(x, i)` | Return `x * (2**i)`\. This is essentially the inverse of the function `frexp`\. | +| `math.modf(x)` | Return the fractional and integer parts of `x`\. Both results carry the sign of `x` and are floats\. | +| `math.trunc(x)` | Return the `Real` value `x`, that has been truncated to an `Integral`\. | +| `math.exp(x)` | Return `e**x` | +| `math.log(x[, base])` | Return the logarithm of `x` to the given value of `base`\. If `base` is not specified, the natural logarithm of `x` is returned\. | +| `math.log1p(x)` | Return the natural logarithm of `1+x (base e)` | +| `math.log10(x)` | Return the base\-10 logarithm of `x` | +| `math.pow(x, y)` | Return `x` raised to the power `y`\. `pow(1.0, x)` and `pow(x, 0.0)` always return `1`, even when `x` is zero or NaN\. | +| `math.sqrt(x)` | Return the square root of `x` | + + + +Along with the mathematical functions, there are also some useful trigonometric methods\. These methods are listed in the following table\. + + + +Trigonometric methods + +Table 2\. Trigonometric methods + +| Method | Usage | +| ------------------ | ---------------------------------------------------------------------------------------------------------------------- | +| `math.acos(x)` | Return the arc cosine of `x` in radians | +| `math.asin(x)` | Return the arc sine of `x` in radians | +| `math.atan(x)` | Return the arc tangent of `x` in radians | +| `math.atan2(y, x)` | Return `atan(y / x)` in radians\. | +| `math.cos(x)` | Return the cosine of `x` in radians\. | +| `math.hypot(x, y)` | Return the Euclidean norm `sqrt(x*x + y*y)`\. This is the length of the vector from the origin to the point `(x, y)`\. | +| `math.sin(x)` | Return the sine of `x` in radians | +| `math.tan(x)` | Return the tangent of `x` in radians | +| `math.degrees(x)` | Convert angle `x` from radians to degrees | +| `math.radians(x)` | Convert angle `x` from degrees to radians | +| `math.acosh(x)` | Return the inverse hyperbolic cosine of `x` | +| `math.asinh(x)` | Return the inverse hyperbolic sine of `x` | +| `math.atanh(x)` | Return the inverse hyperbolic tangent of `x` | +| `math.cosh(x)` | Return the hyperbolic cosine of `x` | +| `math.sinh(x)` | Return the hyperbolic cosine of `x` | +| `math.tanh(x)` | Return the hyperbolic tangent of `x` | + + + +There are also two mathematical constants\. The value of `math.pi` is the mathematical constant pi\. The value of `math.e` is the mathematical constant e\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f839cd35991df790f17239c9c63bfcae701f3d65.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f839cd35991df790f17239c9c63bfcae701f3d65.md new file mode 100644 index 0000000..a136671 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f839cd35991df790f17239c9c63bfcae701f3d65.md @@ -0,0 +1,148 @@ +# Tips for writing foundation model prompts: prompt engineering + +# Tips for writing foundation model prompts: prompt engineering # + +Part art, part science, *prompt engineering* is the process of crafting prompt text to best effect for a given model and parameters\. When it comes to prompting foundation models, there isn't just one right answer\. There are usually multiple ways to prompt a foundation model for a successful result\. + +Use the Prompt Lab to experiment with crafting prompts\. + + + + * For help using the prompt editor, see [Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html)\. + * Try the samples that are available from the **Sample prompts** tab\. + * Learn from documented samples\. See [Sample prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html)\. + + + +As you experiment, remember these tips\. The tips in this topic will help you successfully prompt most text\-generating foundation models\. + +## Tip 1: Always remember that everything is text completion ## + +Your *prompt* is the text you submit for processing by a foundation model\. + +The Prompt Lab in IBM watsonx\.ai is not a chatbot interface\. For most models, simply asking a question or typing an instruction usually won't yield the best results\. That's because the model isn't *answering* your prompt, the model is *appending text to it*\. + +This image demonstrates prompt text and generated output: + + + + * Prompt text: "I took my dog " + * Generated output: "to the park\." + + + +![Text completion in Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fm-prompt-lab-text-completion.png) + +## Tip 2: Include all the needed prompt components ## + +Effective prompts usually have one or more of the following components: instruction, context, examples, and cue\. + +### Instruction ### + +An instruction is an imperative statement that tells the model what to do\. For example, if you want the model to list ideas for a dog\-walking business, your instruction could be: "List ideas for starting a dog\-walking business:" + +### Context ### + +Including background or contextual information in your prompt can nudge the model output in a desired direction\. Specifically, (tokenized) words that appear in your prompt text are more likely to be included in the generated output\. + +### Examples ### + +To indicate the format or shape that you want the model response to be, include one or more pairs of example input and corresponding desired output showing the pattern you want the generated text to follow\. (Including one example in your prompt is called *one\-shot prompting*, including two or more examples in your prompt is called *few\-shot* prompting, and when your prompt has no examples, that's called *zero\-shot* prompting\.) + +Note that when you are prompting models that have been fine\-tuned, you might not need examples\. + +### Cue ### + +A cue is text at the end of the prompt that is likely to start the generated output on a desired path\. (Remember, as much as it seems like the model is *responding to your prompt*, the model is really *appending text to your prompt* or *continuing your prompt*\.) + +## Tip 3: Include descriptive details ## + +The more guidance, the better\. Experiment with including descriptive phrases related to aspects of your ideal result: content, style, and length\. Including these details in your prompt can cause a more creative or more complete result to be generated\. + +For example, you could improve upon the sample instruction given previously: + + + + * Original: "List ideas for starting a dog\-walking business" + * Improved: "List ideas for starting a large, wildly successful dog\-walking business" + + + +## Example ## + +### Before ### + +In this image, you can see a prompt with the original, simple instruction\. This prompt doesn't produce great results\. + +![Example prompt text with just a simple instruction](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fm-prompt-lab-prompt-too-simple.png) + +### After ### + +In this image, you can see all the prompt components: instruction (complete with descriptive details), context, example, and cue\. This prompt produces a much better result\. + +![Example prompt text with an instruction, context, an example, and a cue](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fm-prompt-lab-prompt-components.png) + +You can experiment with this prompt in the Prompt Lab yourself: + +**Model:** gpt\-neox\-20b + +**Decoding:** Sampling + + + + * Temperature: 0\.7 + * Top P: 1 + * Top K: 50 + * Repetition penalty: 1\.02 + + + +**Stopping criteria:** + + + + * Stop sequence: Two newline characters + * Min tokens: 0 + * Max tokens: 80 + + + +**Prompt text:** + +Copy this prompt text and paste it into the freeform prompt editor in Prompt Lab, then click **Generate** to see a result\. + +With no random seed specified, results will vary each time you submit the prompt\. + + Based on the following industry research, suggest ideas for starting a large, wildly + successful dog-walking business. + + Industry research: + *** + The most successful dog-walking businesses cater to owners' needs and desires while + also providing great care to the dogs. For example, owners want flexible hours, a + shuttle to pick up and drop off dogs at home, and personalized services, such as + custom meal and exercise plans. Consider too how social media has permeated our lives. + Web-enabled interaction provide images and video that owners will love to share online, + which is great advertising for the business. + *** + + Ideas for starting a lemonade business: + - Set up a lemonade stand + - Partner with a restaurant + - Get a celebrity to endorse the lemonade + + Ideas for starting a large, wildly successful dog-walking business: + +## Learn more ## + + + + * [Sample prompts](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html) + * [Avoiding hallucinations](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-hallucinations.html) + * [Generating accurate output](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-factual-accuracy.html) + + + +**Parent topic:**[Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f870af12bc30438b0dab4ff5365b5279f2f9a93a.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f870af12bc30438b0dab4ff5365b5279f2f9a93a.md new file mode 100644 index 0000000..c95e490 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f870af12bc30438b0dab4ff5365b5279f2f9a93a.md @@ -0,0 +1,189 @@ +# Quick start: Build a model using SPSS Modeler + +# Quick start: Build a model using SPSS Modeler # + +You can create, train, and deploy models using SPSS Modeler\. Read about SPSS Modeler, then watch a video and follow a tutorial that’s suitable for beginners and requires no coding\. + +Your basic workflow includes these tasks: + + + +1. Open your sandbox project\. Projects are where you can collaborate with others to work with data\. +2. Add an SPSS Modeler flow to the project\. +3. Configure the nodes on the canvas, and run the flow\. +4. Review the model details and save the model\. +5. Deploy and test your model\. + + + +## Read about SPSS Modeler ## + +With SPSS Modeler flows, you can quickly develop predictive models using business expertise and deploy them into business operations to improve decision making\. Designed around the long\-established SPSS Modeler client software and the industry\-standard CRISP\-DM model it uses, the flows interface supports the entire data mining process, from data to better business results\. + +SPSS Modeler offers a variety of modeling methods taken from machine learning, artificial intelligence, and statistics\. The methods available on the node palette allow you to derive new information from your data and to develop predictive models\. Each method has certain strengths and is best suited for particular types of problems\. + +[Read more about SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsd/spss-modeler.html) + +[Learn about other ways to build models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/data-science.html) + +## Watch a video about creating a model using SPSS Modeler ## + +![Watch Video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) Watch this video to see how to create and run an SPSS Modeler flow to train a machine learning model\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + +## Try a tutorial to create a model using SPSS Modeler ## + +In this tutorial, you will complete these tasks: + + + + * [Task 1: Open a project\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html?context=cdpaas&locale=en#step01) + * [Task 2: Add a data set to your project\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html?context=cdpaas&locale=en#step02) + * [Task 3: Create the SPSS Modeler flow\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html?context=cdpaas&locale=en#step03) + * [Task 4: Add the nodes to the SPSS Modeler flow\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html?context=cdpaas&locale=en#step04) + * [Task 5: Run the SPSS Modeler flow and explore the model details\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html?context=cdpaas&locale=en#step05) + * [Task 6: Evaluate the model\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html?context=cdpaas&locale=en#step06) + * [Task 7: Deploy and test the model with new data\.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html?context=cdpaas&locale=en#step07) + + + +This tutorial will take approximately 30 minutes to complete\. + +### Example data ### + +The data set used in this tutorial is from the University of California, Irvine, and is the result of an extensive study based on hospital admissions over a period of time\. The model will use three important factors to help predict chronic kidney disease\. + +Expand all sections + + + + * Tips for completing this tutorial + + \#\#\# Use the video picture-in-picture Tip: Start the video, then as you scroll through the tutorial, the video moves to picture-in-picture mode. Close the video table of contents for the best experience with picture-in-picture. You can use picture-in-picture mode so you can follow the video as you complete the tasks in this tutorial. Click the timestamps for each task to follow along.The following animated image shows how to use the video picture-in-picture and table of contents features: ![How to use picture-in-picture and chapters](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/pip-and-chapters.gif)\{: width="560px" height="315px" data-tearsheet="this"\} \#\#\# Get help in the community If you need help with this tutorial, you can ask a question or find an answer in the [Cloud Pak for Data Community discussion forum](https://community.ibm.com/community/user/cloudpakfordata/communities/community-home/digestviewer?communitykey=c0c16ff2-10ef-4b50-ae4c-57d769937235)\{: new\_window\}. \#\#\# Set up your browser windows For the optimal experience completing this tutorial, open Cloud Pak for Data in one browser window, and keep this tutorial page open in another browser window to switch easily between the two applications. Consider arranging the two browser windows side-by-side to make it easier to follow along. ![Side-by-side tutorial and UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/tutorial-side-by-side.png)\{: width="560px" height="315px" data-tearsheet="this"\} Tip: If you encounter a guided tour while completing this tutorial in the user interface, click **Maybe later**. + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 1: Open a project + + You need a project to store the SPSS Modeler flow. You can use your sandbox project or create a project. 1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg)\{: iih\}, choose **Projects > View all projects** 1. Open your sandbox project. If you want to use a new project: 1. Click **New project**. 1. Select **Create an empty project**. 1. Enter a name and optional description for the project. 1. Choose an existing [object storage service instance](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/storage-options.html)\{: new\_window\} or create a new one. 1. Click **Create**. For more information or to watch a video, see [Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html)\{: new\_window\}. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the new project. + + ![The following image shows the new project.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/spss-new-project.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 2: Add the data set to your project + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 00:13. This tutorial uses a sample data set. Follow these steps to add the sample data set to your project: 1. Access the [UCI ML Repository: Chronic Kidney Disease Data Set](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/a25870b7249ad55605de7a2e59567a7e)\{: new\_window\} in the *Samples*. 1. Click **Preview**. There are three important factors that help predict chronic kidney disease which are available as part of this analysis: the age of the test subject, the serum creatinine test results, and diabetes test results. And the class value indicates if the patient has been previously diagnosed for kidney disease. 1. Click **Add to project**. 1. Select the project from the list, and click **Add**. 1. Click **View Project**. 1. From your project's *Assets* page, locate the **UCI ML Repository Chronic Kidney Disease Data Set.csv** file. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the *Assets* tab in the project. + + ![The following image shows the \*Assets\* tab in the project.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/spss-project-asset.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 3: Create the SPSS Modeler flow + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 01:11. Follow these steps to create an SPSS Modeler flow in the project: 1. Click **New asset > Build models as a visual flow**. 1. Type a name and description for the flow. 1. For the runtime definition, accept the **Default SPSS Modeler S** definition. 1. Click **Create**. This opens up the Flow Editor that you'll use to create the flow. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the flow editor. + + ![The following image shows the flow editor.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/spss-flow-editor.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 4: Add the nodes to the SPSS Modeler flow + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 01:31. After you load the data, you must transform the data. Create a simple flow by dragging transformers and estimators onto the canvas and connecting them to the data source. Use the following nodes from the palette: - Data Asset: loads the csv file from the project - Partition: divides the data into training and testing segments - Type: sets the data type. Use it to designate the `class` field as a `target` type. - C5.0: a classification algorithm - Analysis: view the model and check its accuracy - Table: preview the data with predictions Follow these steps to create the flow: 1. Add the data asset node: 1. From the *Import* section, drag the **Data Asset** node onto the canvas. 1. Double-click the **Data Asset** node to select the data set. 1. Select **Data asset > UCI ML Repository Chronic Kidney Disease Data Set.csv**. 1. Click **Select**. 1. View the Data Asset properties. 1. Click **Save**. 1. Add the Partition node: 1. From the *Field Operations* section, drag the **Partition** node onto the canvas. 1. Connect the **Data Asset** node to the **Partition** node. 1. Double-click the **Partition** node to view its properties. The default partition divides half of the data for training and the other half for testing. 1. Click **Save**. 1. Add the Type node: 1. From the *Field Operations* section, drag the **Type** node onto the canvas. 1. Connect the **Partition** node to the **Type** node. 1. Double-click the **Type** node to view its properties. The Type node specifies the measurement level for each field. This source data file uses four different measurement levels: Continuous, Categorical, Nominal, Ordinal, and Flag. 1. Search for the `class` field. For each field, the role indicates the part that each field plays in modeling. Change the `class`**Role** to **Target** - the field you want to predict. 1. Click **Save**. 1. Add the C5.0 classification algorithm node: 1. From the *Modeling* section, drag the **C5.0** node onto the canvas. 1. Connect the **Type** node to the **C5.0** node. 1. Double-click the **C5.0** node to view its properties. By default, the C5.0 algorithm builds a decision tree. A C5.0 model works by splitting the sample based on the field that provides the maximum information gain. Each sub-sample defined by the first split is then split again, usually based on a different field, and the process repeats until the subsamples can't be split any further. Finally, the lowest-level splits are reexamined, and those that don't contribute significantly to the value of the model are removed. 1. Toggle on **Use settings defined in this node**. 1. For *Target*, select **class**. 1. In the **Inputs** section, click **Add columns**. 1. Clear the checkbox next to *Field name*. 1. Select **age**, **sc**, **dm**. 1. Click **OK**. 1. Click **Save**. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the completed flow. + + ![flow showing Data Asset node, Partition node, Type node, and C5.0 class node](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/spss-completed-flow.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 5: Run the SPSS Modeler flow and explore the model details + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 04:20. Now that you have designed the flow, follow these steps to run the flow, and examine the tree diagram to see the decision points: 1. Right-click the **C5.0** node and select **Run**. Running the flow generates a new model nugget on the canvas. 1. Right-click the model nugget and select **View Model** to view the model details. 1. View the **Model Information** which provides a model summary. 1. Click **Top Decision Rules**. A table displays a series of rules that were used to assign individual records to child nodes based on the values of different input fields. 1. Click **Feature Importance**. A chart shows the relative importance of each predictor in estimating the model. From this, you can see that serum creatinine is easily the most significant factor, with diabetes being the next most significant factor. 1. Click **Tree Diagram**. The same model is displayed in the form of a tree, with a node at each decision point. 1. Hover over the top node, which provides a summary for all the records in the data set. Almost 40% of the cases in the data set are classified as not diagnosed with kidney disease. The tree can provide additional clues as to what factors might be responsible. 1. Notice the two branches stemming from the top node, which indicates a split by *serum creatinine*. - Review the branch that shows records where the serum creatinine is greater than 1.25. In this case, 100% of those patients have a positive kidney disease diagnosis. - Review the branch that shows records where the serum creatinine is less than or equal to 1.25. Almost 80% of those patients don't have a positive kidney disease diagnosis, but almost 20% with lower serum creatinine were still diagnosed with kidney disease. 1. Notice the branches stemming from *sc<=1.250*, which is split by *diabetes*. - Review the branch that shows patients with low serum creatinine (sc<=1.250) and diagnosed diabetes (dm=yes). 100% of these patients were also diagnosed with kidney disease. - Review the branch that shows patients with low serum creatinine (sc<=1.250) and no diabetes (dm=no), 85% were not diagnosed with kidney disease, but 15% of them were still diagnosed with kidney disease. 1. Notice the branches stemming from *dm = no*, which is split by the last significant factor, *age*. - Review the branch that shows patients 14 years old or younger (age <= 14). This branch shows that 75% of young patients with low serum creatinine and no diabetes were at risk of getting kidney disease. - Review the branch that shows patients older than 14 years old (age > 14). This branch shows that only 12% of patients over 14 years old with low serum creatinine and no diabetes were at risk of getting kidney disease. 1. Close the model details. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the tree diagram. + + ![The following image shows the tree diagram.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/spss-tree-diagram.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 6: Evaluate the model + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 07:24. Follow these steps to use the Analysis and Table nodes to evaluate the model: 1. From the *Outputs* section, drag the **Analysis** node onto the canvas. 1. Connect the **Model** nugget to the **Analysis** node. 1. Right-click the **Analysis** node, and select **Run**. 1. From the *Outputs* panel, open the **Analysis**, which shows that the model correctly predicted a kidney disease diagnosis almost 95% of the time. Close the **Analysis**. 1. Right-click the **Analysis** node, and select **Save branch as a model**. 1. For the *Model name*, type `Kidney Disease Analysis`\{: .cp\}. 1. Click **Save**. 1. Click **Close**. 1. From the *Outputs* section, drag the **Table** node onto the canvas. 1. Connect the **Model** nugget to the **Table** node. 1. Right-click the **Table** node, and select **Preview data**. 1. When the Preview displays, scroll to the last two columns. The **$C-Class** column contains the prediction of kidney disease, and the **$CC-Class** column indicates the confidence score for that prediction. 1. Close the **Preview**. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the preview table with the predictions. + + ![The following image shows the preview table with the predictions.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/spss-preview-predictions.png)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html?context=cdpaas&locale=en#video-preview) + + + + + + * Task 7: Deploy and test the model with new data + + ![preview tutorial video](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/lc-video.png) To preview this task, watch the video beginning at 09:10. Lastly, follow these steps to deploy this model and predict the outcome with new data. 1. Return to the Project's **Assets** tab. 1. Click the **Models** section, and open the **Kidney Disease Analysis** model. 1. Click **Promote to deployment space**. 1. Choose an existing deployment space. If you don't have a deployment space, you can create a new one: 1. Provide a space name. 1. Select a storage service. 1. Select a machine learning service. 1. Click **Create**. 1. Click **Close**. 1. Select **Go to the model in the space after promoting it**. 1. Click **Promote**. 1. When the model displays inside the deployment space, click **New deployment**. 1. Select **Online** as the *Deployment type*. 1. Specify a name for the deployment. 1. Click **Create**. 1. When the deployment is complete, click the deployment name to view the deployment details page. 1. Go to the **Test** tab. You can test the deployed model from the deployment details page in two ways: test with a form or test with JSON code. 1. Click the **JSON input**, then copy the following test data and paste it to replace the existing JSON text: `json { "input_data": [ { "fields": "age", "bp", "sg", "al", "su", "rbc", "pc", "pcc", "ba", "bgr", "bu", "sc", "sod", "pot", "hemo", "pcv", "wbcc", "rbcc", "htn", "dm", "cad", "appet", "pe", "ane", "class" ], "values": "62", "80", "1.01", "2", "3", "normal", "normal", "notpresent", "notpresent", "423", "53", "1.8", "", "", "9.6", "31", "7500", "", "no", "yes", "no", "poor", "no", "yes", "ckd" ] ] } ] }` 1. Click **Predict** to predict whether a 62 year old with diabetes and a serum creatinine ratio of 1.8 would likely be diagnosed with kidney disease. The resulting prediction indicates that this patient has a high probability of a kidney disease diagnosis. \#\#\# ![Checkpoint icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/checkmark--filled-blue.svg)\{: iih\} Check your progress The following image shows the Test tab for the model deployment with a prediction. + + ![The following image shows the Test tab for the model deployment with a prediction.](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/spss-deployment-prediction.gif)\{: width="100%" \} + [Back to the top](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html?context=cdpaas&locale=en#video-preview) + + + +## Next steps ## + +Now you can use this data set for further analysis\. For example, you can perform tasks such as: + + + + * [Cleansing and shaping data](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-refine.html) + * [Analyze the data in a Jupyter notebook](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-analyze.html) + + + +## Additional resources ## + + + + * Find more [SPSS Modeler tutorials](https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials.html) + * Try these other methods to build models: + + + + * [Build and deploy a machine learning model with AutoAI](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build.html) + * [Build and deploy a machine learning model with SPSS Modeler](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-build-spss.html) + * [Build and deploy a Decision Optimization model](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/get-started-do.html) + + + + * View more [videos](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/videos-wx.html)\. + * Find sample data sets, projects, models, prompts, and notebooks in the Samples to gain hands\-on experience: + + ![Notebook icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/notebook.svg)[Notebooks](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=notebook) that you can add to your project to get started analyzing data and building models. + + ![Project icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/ibm-cloud--projects.svg)[Projects](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=project-template) that you can import containing notebooks, data sets, prompts, and other assets. + + ![Data set icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/data--set.svg)[Data sets](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=dataset) that you can add to your project to refine, analyze, and build models. + + ![Prompt icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/prompt.svg)[Prompts](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=example-prompt) that you can use in the Prompt Lab to prompt a foundation model. + + ![Model icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/model.svg)[Foundation models](https://dataplatform.cloud.ibm.com/gallery?context=wx&format=foundation-model) that you can use in the Prompt Lab. + * Contribute to the [SPSS Modeler community](https://ibm.biz/spss-modeler-community) + + + +**Parent topic:**[Quick start tutorials](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/quickstart-tutorials.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f8e12f246225210b8c984d447b3e15867d2e8869.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f8e12f246225210b8c984d447b3e15867d2e8869.md new file mode 100644 index 0000000..32605d0 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f8e12f246225210b8c984d447b3e15867d2e8869.md @@ -0,0 +1,13 @@ +# Customizing Watson Machine Learning deployment runtimes + +# Customizing Watson Machine Learning deployment runtimes # + +Create custom Watson Machine Learning deployment runtimes with libraries and packages that are required for your deployments\. You can build custom images based on deployment runtime images available in IBM Watson Machine Learning\. The images contain preselected open source libraries and selected IBM libraries\. + +For a list of requirements for creating private Python packages, refer to [Requirements for using custom components in ML models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-custom_libs_overview.html)\. + +You can customize your deployment runtimes by [customizing Python runtimes with third\-party libraries and user\-created Python packages](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-create-custom-software-spec.html) + +**Parent topic:**[Deploying and managing assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/wmls/wmls-deploy-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f8ebee6125bee635dd8af7bf2f6340d58ce99958.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f8ebee6125bee635dd8af7bf2f6340d58ce99958.md new file mode 100644 index 0000000..576628e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f8ebee6125bee635dd8af7bf2f6340d58ce99958.md @@ -0,0 +1,145 @@ +# Evaluating prompt templates in deployment spaces + +# Evaluating prompt templates in deployment spaces # + +You can evaluate prompt templates in deployment spaces to measure the performance of foundation model tasks and understand how your model generates responses\. + +With watsonx\.governance, you can evaluate prompt templates in deployment spaces to measure how effectively your foundation models generate responses for the following task types: + + + + * [Classification](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#classification) + * [Summarization](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#summarization) + * [Generation](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#generation) + * [Question answering](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#qa) + * [Entity extraction](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html#extraction) + + + +Prompt templates are saved prompt inputs for foundation models\. You can evaluate prompt template deployments in pre\-production and production spaces\. + +## Before you begin ## + +You must have access to a watsonx\.governance deployment space to evaluate prompt templates\. For more information, see [Setting up watsonx\.governance](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-setup-wos.html)\. + +To run evaluations, you must log in and [switch](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/personal-settings.html#account) to a watsonx account that has watsonx\.governance and watsonx\.ai instances that are installed and open a deployment space\. You must be assigned the **Admin** or **Editor** roles for the account to open deployment spaces\. + +In your project, you must also [create and save a prompt template](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html#creating-and-running-a-prompt) and [promote a prompt template to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/prompt-template-deploy.html)\. You must specify at least one variable when you create prompt templates to enable evaluations\. + +The following sections describe how to evaluate prompt templates in deployment spaces and review your evaluation results: + + + + * [Evaluating prompt templates in pre\-production spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-eval-prompt-spaces.html?context=cdpaas&locale=en#prompt-eval-pre-prod) + * [Evaluating prompt templates in production spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-eval-prompt-spaces.html?context=cdpaas&locale=en#prompt-eval-prod) + + + +## Evaluating prompt templates in pre\-production spaces ## + +### Activate evaluation ### + +To run prompt template evaluations, you can click **Activate** on the **Evaluations** tab when you open a deployment to open the **Evaluate prompt template** wizard\. You can run evaluations only if you are assigned the **Admin** or **Editor** roles for your deployment space\. + +![Run prompt template evaluation](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-activate-prompt-eval.png) + +### Select dimensions ### + +The **Evaluate prompt template** wizard displays the dimensions that are available to evaluate for the task type that is associated with your prompt\. You can expand the dimensions to view the list of metrics that are used to evaluate the dimensions that you select\. + +![Select dimensions to evaluate](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-select-dimension-preprod-spaces.png) + +watsonx\.governance automatically configures evaluations for each dimension with default settings\. To [configure evaluations](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-monitors-overview.html) with different settings, you can select **Advanced settings** to set minimum sample sizes and threshold values for each metric as shown in the following example: + +![Configure evaluations](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-config-eval-settings.png) + +### Select test data ### + +You must upload a CSV file that contains test data with reference columns and columns for each prompt variable\. When the upload completes, you must also map [prompt variables](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-variables.html#creating-prompt-variables) to the associated columns from your test data\. + +![Select test data to upload](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-select-test-data-preprod-spaces.png) + +### Review and evaluate ### + +You can review the selections for the prompt task type, the uploaded test data, and the type of evaluation that runs\. You must select **Evaluate** to run the evaluation\. + +![Review and evaluate prompt template evaluation settings](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-review-evaluate-preprod-spaces.png) + +### Reviewing evaluation results ### + +When your evaluation finishes, you can review a summary of your evaluation results on the **Evaluations** tab in watsonx\.governance to gain insights about your model performance\. The summary provides an overview of metric scores and violations of default score thresholds for your prompt template evaluations\. + +To analyze results, you can click the arrow ![navigation arrow](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-nav-arrow.png) next to your prompt template evaluation to view data visualizations of your results over time\. You can also analyze results from the model health evaluation that is run by default during prompt template evaluations to understand how efficiently your model processes your data\. + +The **Actions** menu also provides the following options to help you analyze your results: + + + + * **Evaluate now**: Run evaluation with a different test data set + * **All evaluations**: Display a history of your evaluations to understand how your results change over time\. + * **Configure monitors**: Configure evaluation thresholds and sample sizes\. + * **View model information**: View details about your model to understand how your deployment environment is set up\. + + + +![Analyze prompt template evaluation results](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-review-results-preprod.png) + +If you [track your prompt templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-track-prompt-temp.html), you can review evaluation results to gain insights about your model performance throughout the AI lifecycle\. + +## Evaluating prompt templates in production spaces ## + +### Activate evaluation ### + +To run prompt template evaluations, you can click **Activate** on the **Evaluations** tab when you open a deployment to open the **Evaluate prompt template** wizard\. You can run evaluations only if you are assigned the **Admin** or **Editor** roles for your deployment space\. + +![Run prompt template evaluation](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-activate-prompt-eval.png) + +### Select dimensions ### + +The **Evaluate prompt template** wizard displays the dimensions that are available to evaluate for the task type that is associated with your prompt\. You can provide a label column name for the reference output that you specify in your feedback data\. You can also expand the dimensions to view the list of metrics that are used to evaluate the dimensions that you select\. + +![Select dimensions to evaluate](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-select-dimensions-pre-prod-spaces.png) + +watsonx\.governance automatically configures evaluations for each dimension with default settings\. To [configure evaluations](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-monitors-overview.html) with different settings, you can select **Advanced settings** to set minimum sample sizes and threshold values for each metric as shown in the following example: + +![Configure evaluations](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-config-eval-settings.png) + +### Review and evaluate ### + +You can review the selections for the prompt task type and the type of evaluation that runs\. You can also select **View payload schema** or **View feedback schema** to validate that your column names match the prompt variable names in the prompt template\. You must select **Activate** to run the evaluation\. + +![Review and evaluate selections](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-review-evaluate-prod-spaces.png) + +To generate evaluation results, select **Evaluate now** in the **Actions** menu to open the **Import test data** window when the evaluation summary page displays\. + +![Select evaluate now](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-evaluate-now-prod-space.png) + +### Import test data ### + +In the **Import test data** window, you can select **Upload payload data** or **Upload feedback data** to upload a CSV file that contains labeled columns that match the columns in your payload and feedback schemas\. + +![Import test data](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-import-test-data-prod-space.png) + +When your upload completes successfully, you can select **Evaluate now** to run your evaluation\. + +### Reviewing evaluation results ### + +When your evaluation finishes, you can review a summary of your evaluation results on the **Evaluations** tab in watsonx\.governance to gain insights about your model performance\. The summary provides an overview of metric scores and violations of default score thresholds for your prompt template evaluations\. + +To analyze results, you can click the arrow ![navigation arrow](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-nav-arrow.png) next to your prompt template evaluation to view data visualizations of your results over time\. You can also analyze results from the model health evaluation that is run by default during prompt template evaluations to understand how efficiently your model processes your data\. + +The **Actions** menu also provides the following options to help you analyze your results: + + + + * **Evaluate now**: Run evaluation with a different test data set + * **Configure monitors**: Configure evaluation thresholds and sample sizes\. + * **View model information**: View details about your model to understand how your deployment environment is set up\. + + + +![Analyze prompt template evaluation results](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/images/wos-eval-results-prod-spaces.png) + +If you [track your prompt templates](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/xgov-track-prompt-temp.html), you can review evaluation results to gain insights about your model performance throughout the AI lifecycle\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f908a5f1d788e2597335215a464817436a3d3ed1.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f908a5f1d788e2597335215a464817436a3d3ed1.md new file mode 100644 index 0000000..e865270 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f908a5f1d788e2597335215a464817436a3d3ed1.md @@ -0,0 +1,112 @@ +# Levels of user access roles in IBM watsonx + +# Levels of user access roles in IBM watsonx # + +Every user of IBM watsonx has multiple levels of roles with the corresponding permissions, or actions\. The permissions determine what actions a user can perform on the platform or within a service\. Some roles are set in IBM Cloud, and others are set in IBM watsonx\. + +The IBM Cloud account owner or administrator sets the Identity and Access (IAM) Platform and Service access roles in the IBM Cloud account\. Workspace administrators in watsonx set the collaborator roles for workspaces, for example, projects and deployment spaces\. + +Familiarity with the IBM Cloud IAM feature, Access groups, Platform roles, and Service roles is required to configure user access for IBM watsonx\. See [IBM Cloud docs: IAM access](https://cloud.ibm.com/docs/account?topic=account-userroles) for a description of IBM Cloud IAM Platform and Service roles\. + +This illustration shows the different levels of roles assigned to each user so that they can work in IBM watsonx\. + +Levels of roles in IBM watsonx + +![Levels of roles in IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/roles_venn.svg) + +The levels of roles are: + + + + * [IAM Platform access roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/roles.html?context=cdpaas&locale=en#platform) determine your permissions for the IBM Cloud account\. At least the **Viewer** role is required to work with services\. + * [IAM Service access roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/roles.html?context=cdpaas&locale=en#service) determine your permissions within services\. + * [Workspace collaborator roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/roles.html?context=cdpaas&locale=en#workspace) determine what actions you have permission to perform within workspaces in IBM watsonx\. + + + +## IAM Platform access roles ## + +The IAM Platform access roles are assigned and managed in the IBM Cloud account\. + +IAM Platform access roles provide permissions to manage the IBM Cloud account and to access services within IBM watsonx\. The Platform access roles are **Viewer**, **Operator**, **Editor**, and **Administrator**\. The Platform roles are available to all services on IBM Cloud\. + +The **Viewer** role has minimal, view\-only permissions\. Users need at least **Viewer** role to see the services in IBM watsonx\. A **Viewer** can: + + + + * View, but not modify, available service instances and assets + * Associate services with projects\. + * Become collaborator in projects or deployment spaces\. + * Create projects and deployment spaces if assigned appropriate permissions for Cloud Object Storage\. + + + +The **Operator** role has permissions to configure existing service instances\. + +The **Editor** role provides access to these actions: + + + + * All Viewer role permissions\. + * Provision instances of services\. + * Update plans for service instances\. + + + +The **Administrator** role provides the same permissions as the **Owner** role for the account\. With **Administrator** role, you can: + + + + * All Viewer, Operator, and Editor permissions\. + * Perform all management actions for services\. + * Add users to the [IBM Cloud account and assign roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-addl-users.html) + * Perform administrative tasks in IBM watsonx + * [Manage services for IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_console.html) + + + +To understand IAM Platform access roles, see [IBM Cloud docs: What is IBM Cloud Identity and Access Management?](https://cloud.ibm.com/docs/account?topic=account-iamoverview)\. + +## IAM Service access roles ## + +Service roles apply to individual services and define actions permitted within the service\. IBM Cloud Object Storage has its own set of Service access roles\. See [Setting up IBM Cloud Object Storage for use with IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html)\. + +## Workspace collaborator roles ## + +Your role in a specific workspace determines what actions you can perform in that workspace\. Your IAM roles do not affect your role within a workspace\. For example, you can be the **Administrator** of the Cloud account, but this does not automatically make you an administrator for a project or catalog\. The **Admin** collaborator role for a project (or other workspace) must be explicitly assigned\. Similarly, roles are specific to each project\. You may have **Admin** role in a project, which gives you full control of the contents of that project, including managing collaborators and assets\. But you can have the **Viewer** role in another project, which allows you to only view the contents of that project\. + +Projects and deployment spaces have these roles: + + + + * **Admin**: Control assets, collaborators, and settings in the workspace\. + * **Editor**: Control assets in the workspace\. + * **Viewer**: View the workspace and its contents\. + + + +The permissions that are associated with each role are specific to the type of workspace: + + + + * [Project collaborator roles and permissions](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborator-permissions.html) + * [Deployment space collaborator roles and permissions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/collaborator-permissions-wml.html) + + + +## Learn more ## + + + + * [IBM Cloud docs: What is IBM Cloud Identity and Access Management?](https://cloud.ibm.com/docs/account?topic=account-iamoverview) + * [IBM Cloud docs: IAM access](https://cloud.ibm.com/docs/account?topic=account-userroles) + * [Setting up IBM watsonx for your organization](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-platform.html) + * [Managing IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_console.html) + * [Find your IBM Cloud account owner or administrator](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/faq.html#accountadmin) + * [Determine your roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/your-roles.html) + + + +**Parent topic:**[Adding users to the account](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-addl-users.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f964efda57733a3b39890b30ff22bd5c47eed893.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f964efda57733a3b39890b30ff22bd5c47eed893.md new file mode 100644 index 0000000..e3b0e52 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f964efda57733a3b39890b30ff22bd5c47eed893.md @@ -0,0 +1,74 @@ +# Managing IBM watsonx + +# Managing IBM watsonx # + +As the owner or an administrator of the IBM Cloud account, you can monitor and manage services and the platform\. + + + + * [Configuring services](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_console.html?context=cdpaas&locale=en#core) + + + +An IBM Cloud account administrator is a user in the account who was assigned the **Administrator** role in IBM Cloud for the All Identity and Access enabled services option in IAM\. If you're not sure of your roles, see [Determine your roles](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/your-roles.html)\. + +You perform some administrative tasks within IBM watsonx, and others in IBM Cloud\. Some tasks require steps in both areas, depending on your goals\. + +## Configuring services ## + +The services that are included in watsonx\.ai are Watson Studio and Watson Machine Learning\. + + + +| Task | In IBM watsonx? | In IBM Cloud? | +| --------------------------------------------------------------- | --------------- | ------------- | +| [Manage services in IBM Cloud](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/create-services.html#manage) | ✓ | ✓ | +| [Switch service region](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_console.html?context=cdpaas&locale=en#region) | ✓ | | +| [Upgrade your IBM Cloud account](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/upgrade.html#account) | ✓ | ✓ | +| [Upgrade your services](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/upgrade.html#app) | ✓ | | +| [Configure private service endpoints](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/endpoints-vrf.html) | | ✓ | +| [Remove users](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-removeusers.html) | ✓ | ✓ | +| [Stop using IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/stopapps.html) | ✓ | ✓ | +| [Monitor account resource usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html) | ✓ | ✓ | +| [View and manage environment runtimes](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/monitor-resources.html#monitor-cuh) | ✓ | | +| [Set up IBM Cloud Object Storage for use with IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html) | ✓ | ✓ | +| [Manage users and access](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/setup-access.html) | ✓ | ✓ | +| [Set resources scope](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/account-settings.html) | ✓ | | +| [Set type of credentials for connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/account-settings.html) | ✓ | | +| [Manage IBM Cloud account in IBM Cloud](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/account-settings.html) | | ✓ | +| [Manage all projects in the account](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-manage-projects.html) | ✓ | ✓ | +| [Secure IBM watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/security-overview.html) | ✓ | ✓ | +| [Set up IBM Cloud App ID (beta)](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/admin-appid.html) | | ✓ | +| [Delegate encryption keys for IBM Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html#byok) | ✓ | ✓ | + + + +## Switch service region ## + +The platform and services are available in multiple IBM Cloud service regions and you can have services in more than one region\. Your projects, catalogs, and data are specific to the region in which they were saved and can be accessed only from your services in that region\. If you provision Watson Studio services in both the Dallas and the Frankfurt regions, you can't access projects that you created in the Frankfurt region from the Dallas region\. + +To switch your service region: + + + +1. Log in to IBM watsonx\. +2. Click the **Region Switcher**![Region Switcher icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/region_switcher.png) in the home page header\. +3. Select the region that contains your services and projects\. + + + +For wider browsers, you can select the region from the dropdown menu\. + +## Learn more ## + + + + * [Watson Studio offering plans](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/ws-plans.html) + * [Watson Machine Learning plans and compute usage](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/wml-plans.html) + * [Roles in the platform](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/roles.html) + + + +**Parent topic:**[Administration](https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/administer-accounts.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f965be0f67b8b3c26be38939a33fa8ab74aea4cc.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f965be0f67b8b3c26be38939a33fa8ab74aea4cc.md new file mode 100644 index 0000000..00dc98e --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f965be0f67b8b3c26be38939a33fa8ab74aea4cc.md @@ -0,0 +1,27 @@ +# Kohonen node (SPSS Modeler) + +# Kohonen node # + +Kohonen networks are a type of neural network that perform clustering, also known as a knet or a self\-organizing map\. This type of network can be used to cluster the dataset into distinct groups when you don't know what those groups are at the beginning\. Records are grouped so that records within a group or cluster tend to be similar to each other, and records in different groups are dissimilar\. + +The basic units are neurons, and they are organized into two layers: the input layer and the output layer (also called the output map)\. All of the input neurons are connected to all of the output neurons, and these connections have strengths, or weights, associated with them\. During training, each unit competes with all of the others to "win" each record\. + +The output map is a two\-dimensional grid of neurons, with no connections between the units\. + +Input data is presented to the input layer, and the values are propagated to the output layer\. The output neuron with the strongest response is said to be the winner and is the answer for that input\. + +Initially, all weights are random\. When a unit wins a record, its weights (along with those of other nearby units, collectively referred to as a neighborhood) are adjusted to better match the pattern of predictor values for that record\. All of the input records are shown, and weights are updated accordingly\. This process is repeated many times until the changes become very small\. As training proceeds, the weights on the grid units are adjusted so that they form a two\-dimensional "map" of the clusters (hence the term self\-organizing map)\. + +When the network is fully trained, records that are similar should be close together on the output map, whereas records that are vastly different will be far apart\. + +Unlike most learning methods in watsonx\.ai, Kohonen networks do *not* use a target field\. This type of learning, with no target field, is called unsupervised learning\. Instead of trying to predict an outcome, Kohonen nets try to uncover patterns in the set of input fields\. Usually, a Kohonen net will end up with a few units that summarize many observations (strong units), and several units that don't really correspond to any of the observations (weak units)\. The strong units (and sometimes other units adjacent to them in the grid) represent probable cluster centers\. + +Another use of Kohonen networks is in dimension reduction\. The spatial characteristic of the two\-dimensional grid provides a mapping from the `k` original predictors to two derived features that preserve the similarity relationships in the original predictors\. In some cases, this can give you the same kind of benefit as factor analysis or PCA\. + +Note that the method for calculating default size of the output grid is different from older versions of SPSS Modeler\. The method will generally produce smaller output layers that are faster to train and generalize better\. If you find that you get poor results with the default size, try increasing the size of the output grid on the Expert tab\. + +Requirements\. To train a Kohonen net, you need one or more fields with the role set to `Input`\. Fields with the role set to `Target`, `Both`, or `None` are ignored\. + +Strengths\. You do not need to have data on group membership to build a Kohonen network model\. You don't even need to know the number of groups to look for\. Kohonen networks start with a large number of units, and as training progresses, the units gravitate toward the natural clusters in the data\. You can look at the number of observations captured by each unit in the model nugget to identify the strong units, which can give you a sense of the appropriate number of clusters\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f975b9964d088181cf34a1341083bc82053812d8.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f975b9964d088181cf34a1341083bc82053812d8.md new file mode 100644 index 0000000..8792347 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f975b9964d088181cf34a1341083bc82053812d8.md @@ -0,0 +1,40 @@ +# Values and data types (SPSS Modeler) + +# Values and data types # + +CLEM expressions are similar to formulas constructed from values, field names, operators, and functions\. The simplest valid CLEM expression is a value or a field name\. + +Examples of valid values are: + + 3 + 1.79 + 'banana' + +Examples of field names are: + + Product_ID + '$P-NextField' + +where `Product` is the name of a field from a market basket data set, `'$P-NextField'` is the name of a parameter, and the value of the expression is the value of the named field\. Typically, field names start with a letter and may also contain digits and underscores (\_)\. You can use names that don't follow these rules if you place the name within quotation marks\. CLEM values can be any of the following: + + + + * Strings (for example, `"c1"`, `"Type 2"`, `"a piece of free text"`) + * Integers (for example, `12`, `0`, `–189`) + * Real numbers (for example, `12.34`, `0.0`, `–0.0045`) + * Date/time fields (for example, `05/12/2002`, `12/05/2002`, `12/05/02`) + + + +It's also possible to use the following elements: + + + + * Character codes (for example, `` `a` or 3``) + * Lists of items (for example, `[1 2 3]`, `['Type 1' 'Type 2']`) + + + +Character codes and lists don't usually occur as field values\. Typically, they're used as arguments of CLEM functions\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f976e639bde8a2b880e46d94f4c832b6ed9a9303.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f976e639bde8a2b880e46d94f4c832b6ed9a9303.md new file mode 100644 index 0000000..0b48ea3 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/f976e639bde8a2b880e46d94f4c832b6ed9a9303.md @@ -0,0 +1,20 @@ +# How extraction works (SPSS Modeler) + +# How extraction works # + +During the extraction of key concepts and ideas from your responses, Text Analytics relies on linguistics\-based text analysis\. This approach offers the speed and cost effectiveness of statistics\-based systems\. But it offers a far higher degree of accuracy, while requiring far less human intervention\. Linguistics\-based text analysis is based on the field of study known as natural language processing, also known as computational linguistics\. + +Understanding how the extraction process works can help you make key decisions when fine\-tuning your linguistic resources (libraries, types, synonyms, and more)\. Steps in the extraction process include: + + + + * Converting source data to a standard format + * Identifying candidate terms + * Identifying equivalence classes and integration of synonyms + * Assigning a type + * Indexing + * Matching patterns and events extraction + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fa15a8a5795baec1d8933a768407294110203e03.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fa15a8a5795baec1d8933a768407294110203e03.md new file mode 100644 index 0000000..4d76885 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fa15a8a5795baec1d8933a768407294110203e03.md @@ -0,0 +1,101 @@ +# IBM Informix connection + +# IBM Informix connection # + +To access your data in an IBM Informix database, create a connection asset for it\. + +IBM Informix is a database that contains relational, object\-relational, or dimensional data\. You can use the Informix connection to access data from an on\-prem Informix database server or from IBM Informix on Cloud\. + +## Supported Informix versions (on\-prem) ## + + + + * Informix 14\.10 and later\. This version does not support the Progress DataDirect JDBC driver, which is used by the Informix connection\. The Informix connection supports Informix 14\.10 features that are comparable to previous Informix versions, but not the new features\. Issues related to DataDirect's JDBC driver are not supported\. + * Informix 12\.10 and later + * Informix 11\.0 and later + * Informix 10\.0 and later + * Informix 9\.2 and later + + + +## Create a connection to Informix ## + +To create the connection asset, you need these connection details: + + + + * Name of the database server + * Name of the database + * Hostname or IP address of the database + * Port number (Default is `1526`) + * Username and password + + + +On\-prem Informix database servers: For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use Informix connections in the following workspaces and tools: + +**Projects** + + + + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## Informix setup ## + +To set up Informix, see these topics: + + + + * Informix on\-prem: [Creating a database server after installation](https://www.ibm.com/docs/SSGU8G_14.1.0/com.ibm.inst.doc/ids_inst_023.htm) + * Informix on Cloud: [Getting started with Informix on Cloud](https://cloud.ibm.com/docs/InformixOnCloud/InformixOnCloud.html) + + + +### Running SQL statements ### + +To ensure that your SQL statements run correctly, refer to the [Guide to SQL: Syntax](https://www.ibm.com/docs/SSGU8G_14.1.0/com.ibm.sqls.doc/sqls.htm) in the product documentation for the correct syntax\. + +## Learn more ## + + + + * [Informix product documentation](https://www.ibm.com/docs/informix-servers/14.10) (on\-prem) + * [IBM Informix on Cloud](https://www.ibm.com/cloud/informix) + * [IBM Informix on Cloud FAQ](https://www.ibm.com/cloud/informix/faq) + + + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fa4acdc5db590992630c704d00defb142f2f0489.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fa4acdc5db590992630c704d00defb142f2f0489.md new file mode 100644 index 0000000..3c86a9a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fa4acdc5db590992630c704d00defb142f2f0489.md @@ -0,0 +1,93 @@ +# Object storage for workspaces + +# Object storage for workspaces # + +You must choose an IBM Cloud Object Storage instance when you create a project, catalog, or deployment space workspace\. Information that is stored in IBM Cloud Object Storage is encrypted and resilient\. Each workspace has its own dedicated bucket\. + +You can encrypt the Cloud Object Storage instance that you use for workspaces with your own key\. See [Encrypt IBM Cloud Object Storage with your own key](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html#byok)\. The Locations in each user's Profile must include the **Global** location to allow access to Cloud Object Storage\. + +When you create a workspace, the Cloud Object Storage bucket defaults to Regional resiliency\. Regional buckets distribute data across several data centers that are within the same metropolitan area\. If one of these data centers suffers an outage or destruction, availability and performance are not affected\. + +If you are the account owner or administrator, you administer Cloud Object Storage from the **Resource list > Storage** page on the IBM Cloud dashboard\. For example, you can upload and download assets, manage buckets, and configure credentials and other security settings for the Cloud Object Storage instance\. + +Follow these steps to manage the Cloud Object Storage instance on IBM Cloud: + + + +1. Select a project from the Project list\. +2. Click the **Manage** tab\. +3. On the **General** page, locate the **Storage** section that displays the bucket name for the project\. +4. Select **Manage in IBM Cloud** to open the Cloud Object Storage **Buckets** list\. +5. Select the bucket name for the project to display a list of assets\. +6. Checkmark an asset to download it or perform other tasks as needed\. + + + +Watch this video to see how to manage an object storage instance\. + +Video disclaimer: Some minor steps and graphical elements in this video might differ from your platform\. + +This video provides a visual method to learn the concepts and tasks in this documentation\. + + + + * Transcript + + Synchronize transcript with video + + + + | Time | Transcript | + | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | 00:00 | This video shows how to manage an IBM Cloud Object Storage instance. | + | 00:06 | When you create a Watson Studio project, an IBM Cloud Object Storage instance is associated with the project. | + | 00:15 | On the Manage tab, you'll see the associated object storage instance and have the option to manage it in IBM Cloud. | + | 00:24 | IBM Cloud Object Storage uses buckets to organize your data. | + | 00:30 | You can see that this instance contains a bucket with the "jupyternotebooks" prefix, which was created when the "Jupyter Notebooks" project was created. | + | 00:41 | If you open that bucket, you'll see all of the files that you added to that project. | + | 00:47 | From here, you can download an object or delete it from the bucket. | + | 00:53 | You can also view the object SQL URL to access that object from your application. | + | 01:00 | You can add objects to the bucket from here. | + | 01:03 | Just browse to select the file and wait for it to upload to storage. | + | 01:10 | And then that file will be available in the Files slide-out panel in the project. | + | 01:16 | Let's create a bucket. | + | 01:20 | You can create a Standard or Archive bucket, based on predefined settings, or create a custom bucket. | + | 01:28 | Provide a bucket name, which must be unique across the IBM Cloud Object Storage system. | + | 01:35 | Select a resiliency. | + | 01:38 | Cross Region provides higher availability and durability and Regional provides higher performance. | + | 01:45 | The Single Site option will only distribute data across devices within a single site. | + | 01:52 | Then select the location based on workload proximity. | + | 01:57 | Next, select a storage class, which defines the cost of storing data based on frequency of access. | + | 02:05 | Smart Tier provides automatic cost optimization for your storage. | + | 02:11 | Standard indicates frequent access. | + | 02:14 | Vault is for less frequent access. | + | 02:18 | And Cold Vault is for rare access. | + | 02:21 | There are other, optional settings to add rules, keys, and services. | + | 02:27 | Refer to the documentation for more details on these options. | + | 02:32 | When you're ready, create the bucket. | + | 02:35 | And, from here, you could add files to that bucket. | + | 02:40 | On the Access policies panel, you can manage access to buckets using IAM policies - that's Identity and Access Management. | + | 02:50 | On the Configuration panel, you'll find information about Key Protect encryption keys, as well as the bucket instance CRN and endpoints to access the data in the buckets from your application. | + | 03:01 | You can also find some of the same information on the Endpoints panel. | + | 03:06 | On the Service credentials panel, you'll find the API and access keys to authenticate with your instance from your application. | + | 03:15 | You can also connect the object storage to a Cloud Foundry application, check usage details, and view your plan details. | + | 03:26 | Find more videos in the Cloud Pak for Data as a Service documentation. | + + + + + +## Learn more ## + + + + * [Setting up IBM Cloud Object Storage](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/wdp_admin_cos.html) + * [IBM Cloud docs: Getting started with IBM Cloud Object Storage](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-getting-started-cloud-object-storage) + * [IBM Cloud docs: Endpoints and storage locations](https://cloud.ibm.com/docs/cloud-object-storage/basics?topic=cloud-object-storage-endpoints) + * [Troubleshooting Cloud Object Storage for projects](https://dataplatform.cloud.ibm.com/docs/content/wsj/troubleshoot/troubleshoot-cos.html) + + + +**Parent topic:**[Creating a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fae139f839dab4c6eb794d689dacceff869c718f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fae139f839dab4c6eb794d689dacceff869c718f.md new file mode 100644 index 0000000..25d2825 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fae139f839dab4c6eb794d689dacceff869c718f.md @@ -0,0 +1,93 @@ +# Switching the platform for a space + +# Switching the platform for a space # + +You can switch the platform for some spaces between the Cloud Pak for Data as a Service and the watsonx platform\. When you switch a space to another platform, you can use the tools that are specific to that platform\. + +For example, you might switch an existing space from Cloud Pak for Data as a Service to watsonx to consolidate your collaborative work on one platform\. See [Comparison between watsonx and Cloud Pak for Data as a Service](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/compare-platforms.html)\. + +Note: You cannot promote Prompt Lab assets created with foundation model inferencing to a space\. + + + + * [Requirements](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/switch-platform-space.html?context=cdpaas&locale=en#requirements) + * [Restrictions](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/switch-platform-space.html?context=cdpaas&locale=en#restrictions) + * [What happens when you switch a space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/switch-platform-space.html?context=cdpaas&locale=en#consequences) + * [Switch the platform for a space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/switch-platform-space.html?context=cdpaas&locale=en#move-one) + + + +## Requirements ## + +You can switch a space from one platform to the other if you have the required accounts and permissions\. + +**Required accounts** : You must be signed up for both Cloud Pak for Data as a Service and watsonx\. + +**Required permissions** : You must have the **Admin** role in the space that you want to switch\. + +**Required services** : The current account that you are working in must have both of these services provisioned: : \- Watson Studio : \- Watson Machine Learning + +## Restrictions ## + +To switch a space from Cloud Pak for Data as a Service to watsonx, all the assets in the space must be supported by both platforms\. + +Spaces that contain any of the following asset types, but no other types of assets, are eligible to switch from Cloud Pak for Data as a Service to watsonx: + + + + * Connected data asset + * Connection + * Data asset from a file + * Deployment + * Jupyter notebook + * Model + * Python function + * Script + + + +You can’t switch a space that contains assets that are specific to Cloud Pak for Data as a Service\. If you add any assets that you created with services other than Watson Studio and Watson Machine Learning to a project, you can't switch that space to watsonx\. Although Pipelines assets are supported in both Cloud Pak for Data as a Service and watsonx spaces, you can't switch a space that contains pipeline assets because pipelines can reference unsupported assets\. + +For more information about asset types, see [Asset types and properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html)\. + +## What happens when you switch the platform for a space ## + +Switching a space between platforms has the following effects: + +**Collaborators** : Collaborators in the project receive notifications of the switch on the original platform\. If any collaborators do not have accounts for the destination platform, those collaborators can no longer access the project\. + +**Jobs** : Scheduled jobs are retained\. Any jobs that are running at the time of the switch continue until completion on the original platform\. Any jobs that are scheduled for times after the switch are run on the destination platform\. Job history is not retained\. + +**Environments** : Custom hardware and software specifications are retained\. + +**Space history** : Recent activity and asset activities are not retained\. + +**Resource usage** : Resource usage is cumulative because you continue to use the same service instances\. + +**Storage** : The space's IBM Cloud Object Storage bucket remains the same\. + +## Switch the platform for a space ## + +You can switch the platform for a space from within the space on the original platform\. You can switch between Cloud Pak for Data as a Service and watsonx\. + +To switch the platform for a space: + + + +1. From the space you want to switch, open the **Manage** tab, select the **General** page, and in the **Controls** section, click **Switch platform**\. If you don't see a **Switch platform** button or the button is not active, you can't switch the space\. +2. Select the destination platform and click **Switch platform**\. + + + +## Learn more ## + + + + * [Comparison between watsonx and Cloud Pak for Data as a Service](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/compare-platforms.html) + * [Asset types and properties](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html) + + + +**Parent topic:**[Deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fb7f7b9a220c66f7e3407ca9553d974cd4a14402.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fb7f7b9a220c66f7e3407ca9553d974cd4a14402.md new file mode 100644 index 0000000..0f97216 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fb7f7b9a220c66f7e3407ca9553d974cd4a14402.md @@ -0,0 +1,46 @@ +# Managing feedback data for watsonx.governance + +# Managing feedback data for watsonx\.governance # + +You must provide feedback data to watsonx\.governance to enable you to configure quality and generative AI quality evaluations and determine any changes in your model predictions\. + +When you provide feedback data to watsonx\.governance, you can regularly evaluate the accuracy of your model predictions\. + +## Feedback logging ## + +watsonx\.governance stores the feedback data that you provide as records in a feedback logging table\. + +The feedback logging table contains the following columns when you evaluate prompt templates: + + + + * **Required columns**: + + + + * Prompt variable(s): Contains the values for the variables that are created for prompt templates + * `reference_output`: Contains the ground truth value + + + + * **Optional columns**: + + + + * `_original_prediction`: Contains the output that's generated by the foundation model + + + + + +## Uploading feedback data ## + +You can use a feedback logging endpoint to upload data for quality evaluations\. You can also upload feedback data with a CSV file\. For more information, see [Sending model transactions](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-send-model-transactions.html)\. + +## Learn more ## + +[Sending model transactions](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-send-model-transactions.html) + +**Parent topic:**[Managing data for model evaluations in Watson OpenScale](https://dataplatform.cloud.ibm.com/docs/content/wsj/model/wos-manage-data.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fb9d913b400e9f00e6aa6eff7a7c8a84f5762dc9.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fb9d913b400e9f00e6aa6eff7a7c8a84f5762dc9.md new file mode 100644 index 0000000..012d5dd --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fb9d913b400e9f00e6aa6eff7a7c8a84f5762dc9.md @@ -0,0 +1,104 @@ +# Creating jobs in the Notebook editor + +# Creating jobs in the Notebook editor # + +You can create a job to run a notebook directly in the Notebook editor\. + +To create a notebook job: + + + +1. In the Notebook editor, click ![the jobs icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/images/Run-schedule_Blue.png) from the menu bar and select **Create a job**\. +2. Define the job details by entering a name and a description (optional)\. +3. On the Configure page, select: + + + + * A notebook version. The most recently saved version of the notebook is used by default. If no version of the notebook exists, you must create a version by clicking ![the versions icon](https://dataplatform.cloud.ibm.com/docs/content/wsj/console/images/versions.png) from the notebook action bar. + * A runtime. By default, the job uses the same environment template that was selected for the notebook. + * **Advanced configuration** to add environment variables and select the job run retention settings. + + + + * The environment variables that are passed to the notebook when the job is started and affect the execution of the notebook. + + Each variable declaration must be made for a single variable in the following format `VAR_NAME=foo` and appear on its own line. + + For example, to determine which data source to access if the same notebook is used in different jobs, you can set the variable `DATA_SOURCE` to `DATA_SOURCE=jdbc:db2//db2.server.com:1521/testdata` in the notebook job that trains a model and to `DATA_SOURCE=jdbc:db2//db2.server.com:1521/productiondata` in the job where the model runs on real data. In another example, the variables `BATCH_SIZE`, `NUM_CLASSES` and `EPOCHS` that are required for a Keras model can be passed to the same notebook with different values in separate jobs. + * Select the job run result output. You can select: + + + + * **Log & notebook** to store the output files of specific runs, the log file, and the resulting notebook. This is the default that is set for all new jobs. Select: + + + + * To compare the results of different job runs, not just by viewing the log file. By keeping the output files of specific job runs, you can compare the results of job runs to fine tune your code. For example, by configuring different environment variables when the job is started, you can change the way the code in the notebook behaves and then compare these differences (including graphics) step by step between runs. + + Note: + + + + * The job run retention value is set to 5 by default to avoid creating too many run output files. This means that the last 5 job run output files will be retained. You need to adjust this value if you want to compare more run output files. + * You cannot use the results of a specific job run to create a URL to enable "Sharing by URL". If you want to use a specific job result run as the source of what is shown via "Share by URL", you must create a new job and select **Log & updated version**. + + + + * To view the logs. + + + + * **Log only** to store the log file only. The resulting notebook is discarded. Select: + + + + * To view the logs. + + + + * **Log & updated version** to store the log file and update the output cells of the version you used as input to this task. Select: + + + + * To view the logs. + * To share the result of a job run via "Share by URL". + + + + + + + + * **Retention configuration** to set how long to retain finished job runs and job run artifacts like logs or notebook results. You can either select the number of days to retain the job runs or the last number of job runs to keep. The retention value is set to 5 by default (the last 5 job run output files are retained). + + Be mindful when changing the default as too many job run files can quickly use up project storage. + + + +4. On the Schedule page, you can optionally add a one\-time or repeating schedule\. + + If you define a start day and time without selecting **Repeat**, the job will run exactly one time at the specified day and time. If you define a start date and time and you select **Repeat**, the job will run for the first time at the timestamp indicated in the Repeat section. + + You can't change the time zone; the schedule uses your web browser's time zone setting. If you exclude certain weekdays, the job might not run as you would expect. The reason might be due to a discrepancy between the time zone of the user who creates the schedule, and the time zone of the compute node where the job runs. + + An API key is generated when you create a scheduled job, and future runs will use this API key. If you didn't create a scheduled job but choose to modify one, an API key is generated for you when you modify the job and future runs will use this API key. +5. Optionally set to see notifications for the job\. You can select the type of alerts to receive\. +6. Review the job settings\. Then create the job and run it immediately, or create the job and run it later\. All notebook code cells are run and all output cells are updated\. + + The notebook job is listed under **Jobs** in your project. To view the notebook run output, click the job and then **Run result** on the Job run details page. + + + +## Learn more ## + + + + * [Viewing job details](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html#view-job-details) + * [Coding and running notebooks](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/code-run-notebooks.html) + * [Environments for the Notebook editor](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/notebook-environments.html) + + + +**Parent topic:**[Creating and managing jobs](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/jobs.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fbc3c5f81d060cd996489b772abac886f12130a3.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fbc3c5f81d060cd996489b772abac886f12130a3.md new file mode 100644 index 0000000..55f9409 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fbc3c5f81d060cd996489b772abac886f12130a3.md @@ -0,0 +1,49 @@ +# When to tune a foundation model + +# When to tune a foundation model # + +Find out when tuning a model can help you use a foundation model to achieve your goals\. + +Tune a foundation model when you want to do the following things: + + + + * Reduce the cost of inferencing at scale + + Larger foundation models typically generate better results. However, they are also more expensive to use. By tuning a model, you can get similar, sometimes even better results from a smaller model that costs less to use. + * Get the model's output to use a certain style or format + * Improve the model's performance by teaching the model a specialized task + * Generate output in a reliable form in response to zero\-shot prompts + + + +## When not to tune a model ## + +Tuning a model is not always the right approach for improving the output of a model\. For example, tuning a model cannot help you do the following things: + + + + * Improve the accuracy of answers in model output + + If you're using a foundation model for factual recall in a question-answering scenario, tuning will marginally improve answer accuracy. To get factual answers, you must provide factual information as part of your input to the model. Tuning can be used to help the generated factual answers conform to a format that can be more-easily used by a downstream process in a workflow. To learn about methods for returning factual answers, see [Retreival-augmented generation](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-rag.html). + * Get the model to use a specific vocabulary in its output consistently + + Large language models that are trained on large amounts of data formulate a vocabulary based on that initial set of data. You can introduce significant terms to the model from training data that you use to tune the model. However, the model might not use these preferred terms reliably in its output. + * Teach a foundation model to perform an entirely new task + + Experimenting with prompt engineering is an important first step because it helps you understand the type of output that a foundation model is and is not capable of generating. You can use tuning to tweak, tailor, and shape the output that a foundation model is able to return. + + + +## Learn more ## + + + + * [Retreival\-augmented generation](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-rag.html) + * [Tuning methods](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-methods.html) + + + +**Parent topic:**[Foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-overview.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fbd84cb5a6901ddaf7412396f4c6cc190e1b7328.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fbd84cb5a6901ddaf7412396f4c6cc190e1b7328.md new file mode 100644 index 0000000..06a74ac --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fbd84cb5a6901ddaf7412396f4c6cc190e1b7328.md @@ -0,0 +1,28 @@ +# Common node properties + +# Common node properties # + +A number of properties are common to all nodes in SPSS Modeler\. + + + +Common node properties + +Table 1\. Common node properties + +| Property name | Data type | Property description | +| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `use_custom_name` | *flag* | | +| `name` | *string* | Read\-only property that reads the name (either auto or custom) for a node on the canvas\. | +| `custom_name` | *string* | Specifies a custom name for the node\. | +| `tooltip` | *string* | | +| `annotation` | *string* | | +| `keywords` | *string* | Structured slot that specifies a list of keywords associated with the object (for example, `["Keyword1" "Keyword2"]`)\. | +| `cache_enabled` | *flag* | | +| `node_type` | `source_supernode`

`process_supernode`

`terminal_supernode`

all node names as specified for scripting | Read\-only property used to refer to a node by type\. For example, instead of referring to a node only by name, such as `real_income`, you can also specify the type, such as `userinputnode` or `filternode`\. | + + + +SuperNode\-specific properties are discussed separately, as with all other nodes\. See [SuperNode properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/defining_slot_parameters_in_supernodes.html#defining_slot_parameters_in_supernodes) for more information\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fc8006009802ae14770be53062787d8a392b0070.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fc8006009802ae14770be53062787d8a392b0070.md new file mode 100644 index 0000000..909d310 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fc8006009802ae14770be53062787d8a392b0070.md @@ -0,0 +1,12 @@ +# Linear node (SPSS Modeler) + +# Linear node # + +Linear regression is a common statistical technique for classifying records based on the values of numeric input fields\. Linear regression fits a straight line or surface that minimizes the discrepancies between predicted and actual output values\. + +Requirements\. Only numeric fields can be used in a linear regression model\. You must have exactly one target field (with the role set to Target) and one or more predictors (with the role set to Input)\. Fields with a role of Both or None are ignored, as are non\-numeric fields\. (If necessary, non\-numeric fields can be recoded using a Derive node\.) + +Strengths\. Linear regression models are relatively simple and give an easily interpreted mathematical formula for generating predictions\. Because linear regression is a long\-established statistical procedure, the properties of these models are well understood\. Linear models are also typically very fast to train\. The Linear node provides methods for automatic field selection in order to eliminate nonsignificant input fields from the equation\. + +Tip: In cases where the target field is categorical rather than a continuous range, such as yes/no or churn/don't churn, logistic regression can be used as an alternative\. Logistic regression also provides support for non\-numeric inputs, removing the need to recode these fields\. Note: When first creating a flow, you select which runtime to use\. By default, flows use the IBM SPSS Modeler runtime\. If you want to use native Spark algorithms instead of SPSS algorithms, select the Spark runtime\. Properties for this node will vary depending on which runtime option you choose\. + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fc8dbf139a485e98914cbb73b8ba684b283ae983.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fc8dbf139a485e98914cbb73b8ba684b283ae983.md new file mode 100644 index 0000000..c95f4f2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fc8dbf139a485e98914cbb73b8ba684b283ae983.md @@ -0,0 +1,124 @@ +# Deploying a tuned foundation model + +# Deploying a tuned foundation model # + +Deploy a tuned model so you can add it to a business workflow and start to use foundation models in a meaningful way\. + +## Before you begin ## + +The tuning experiment that you used to tune the foundation model must be finished\. For more information, see [Tuning a foundation model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-tune.html)\. + +## Deploy a tuned model ## + +To deploy a tuned model, complete the following steps: + + + +1. From the navigation menu, expand **Projects**, and then click **All projects**\. +2. Click to open your project\. +3. From the *Assets* tab, click the **Experiments** asset type\. +4. Click to open the tuning experiment for the model you want to deploy\. +5. From the *Tuned models* list, find the completed tuning experiment, and then click **New deployment**\. +6. Name the tuned model\. + + The name of the tuning experiment is used as the tuned model name if you don't change it. The name has a number after it in parentheses, which counts the deployments. The number starts at one and is incremented by one each time you deploy this tuning experiment. +7. **Optional**: Add a description and tags\. +8. In the *Target deployment space* field, choose a deployment space\. + + The deployment space must be associated with a machine learning instance that is in the same account as the project where the tuned model was created. + + If you don't have a deployment space, choose **Create a new deployment space**, and then follow the steps in [Creating deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-create.html). + + For more information, see [What is a deployment space?](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-deploy.html?context=cdpaas&locale=en#deployment-space) +9. In the *Deployment serving name* field, add a label for the deployment\. + + The serving name is used in the URL for the API endpoint that identifies your deployment. Adding a name is helpful because the human-readable name that you add replaces a long, system-generated ID that is assigned otherwise. + + The serving name also abstracts the deployment from its service instance details. Applications refer to this name that allows for the underlying service instance to be changed without impacting users. + + The name can have up to 36 characters. The supported characters are \[a-z,0-9,\_\]. + + The name must be unique across the IBM Cloud region. You might be prompted to change the serving name if the name you choose is already in use. +10. **Tip**: Select **View deployment in deployment space after creating**\. Otherwise, you need to take more steps to find your deployed model\. +11. Click **Deploy**\. + + + +After the tuned model is promoted to the deployment space and deployed, a copy of the tuned model is stored in your project as a model asset\. + +### What is a deployment space? ### + +When you create a new deployment, a tuned model is promoted to a deployment space, and then deployed\. A deployment space is separate from the project where you create the asset\. A deployment space is associated with the following services that it uses to deploy assets: + + + + * Watson Machine Learning: A product with tools and services you can use to build, train, and deploy machine learning models\. This service hosts your turned model\. + * IBM Cloud Object Storage: A secure platform for storing structured and unstructured data\. Your deployed model asset is stored in a Cloud Object Storage bucket that is associated with your project\. + + + +For more information, see [Deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html)\. + +## Testing the deployed model ## + +The true test of your tuned model is how it responds to input that follows tuned\-for patterns\. + +You can test the tuned model from one of the following pages: + + + + * **Prompt Lab**: A tool with an intuitive user interface for prompting foundation models\. You can customize the prompt parameters for each input\. You can also save the prompt as a notebook so you can interact with it programmatically\. + * **Deployment space**: Useful when you want to test your model programmatically\. From the *API Reference* tab, you can find information about the available endpoints and code examples\. You can also submit input as text and choose to return the output or in a stream, as the output is generated\. However, you cannot change the prompt parameters for the input text\. + + + +To test your tuned model, complete the following steps: + + + +1. From the navigation menu, select **Deployments**\. +2. Click the name of the deployment space where you deployed the tuned model\. +3. Click the name of your deployed model\. +4. Follow the appropriate steps based on where you want to test the tuned model: + + + + * From Prompt Lab: + + + + 1. Click **Open in Prompt Lab**, and then choose the project where you want to work with the model. + + Prompt Lab opens and the tuned model that you deployed is selected from the Model field. + 2. In the *Try* section, add a prompt to the **Input** field that follows the prompt pattern that your tuned model is trained to recognize, and then click **Generate**. + + + + For more information about how to use the prompt editor, see [Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html). + * From the deployment space: + + + + 1. Click the *Test* tab. + 2. In the *Input data* field, add a prompt that follows the prompt pattern that your tuned model is trained to recognize, and then click **Generate**. + + You can click **View parameter settings** to see the prompt parameters that are applied to the model by default. To change the prompt parameters, you must go to the Prompt Lab. + + + + + + + +## Learn more ## + + + + * [Tuning a foundation model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-tuning-tune.html) + * [Security and privacy for foundation models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-security.html) + + + +**Parent topic:**[Deploying foundation model assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/deploy-found-assets.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fcbdbfd3e4bebefe552fad012509948faba34b44.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fcbdbfd3e4bebefe552fad012509948faba34b44.md new file mode 100644 index 0000000..ae23c29 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fcbdbfd3e4bebefe552fad012509948faba34b44.md @@ -0,0 +1,22 @@ +# applyc50node properties + +# applyc50node properties # + +You can use C5\.0 modeling nodes to generate a C5\.0 model nugget\. The scripting name of this model nugget is *applyc50node*\. For more information on scripting the modeling node itself, see [c50node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/c50nodeslots.html#c50nodeslots)\. + + + +applyc50node properties + +Table 1\. applyc50node properties + +| `applyc50node` Properties | Values | Property description | +| --------------------------------- | ----------------------------- | ---------------------------------------------------------------------------------------------------------------- | +| `sql_generate` | `udf``Never``NoMissingValues` | Used to set SQL generation options during rule set execution\. The default value is `udf`\. | +| `calculate_conf` | *flag* | Available when SQL generation is enabled; this property includes confidence calculations in the generated tree\. | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd0ba49bf07fcc9caf384a50b3012f98e4f1d81e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd0ba49bf07fcc9caf384a50b3012f98e4f1d81e.md new file mode 100644 index 0000000..901fe31 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd0ba49bf07fcc9caf384a50b3012f98e4f1d81e.md @@ -0,0 +1,113 @@ +# MongoDB connection + +# MongoDB connection # + +To access your data in MongoDB, create a connection asset for it\. + +MongoDB is a distributed database that stores data in JSON\-like documents\. + +## Supported editions and versions ## + +### MongoDB editions ### + + + + * MongoDB Community + * IBM Cloud Databases for MongoDB\. See [IBM Cloud Databases for MongoDB connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mongodb.html) for this data source\. + * MongoDB Atlas + * WiredTiger Storage Engine + + + +### MongoDB versions ### + + + + * MongoDB 3\.6 and later, 4\.x, 5\.x, and 6\.x + * Microsoft Azure Cosmos DB for MongoDB 3\.6 and later, 4\.x + + + +## Create a connection to MongoDB ## + +To create the connection asset, you need these connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Authentication database: The name of the database in which the user was created\. + * Username and password + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use MongoDB connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## MongoDB setup ## + +[MongoDB installation](https://docs.mongodb.com/manual/installation/) + +## Restrictions ## + + + + * You can only use this connection for source data\. You cannot write to data or export data with this connection\. + * MongoDB Query Language (MQL) is not supported\. + + + +## Learn more ## + + + + * [MongoDB tutorials](https://docs.mongodb.com/manual/tutorial/) + * [mongodb\.com](https://www.mongodb.com/) + + + +**Related connection**: [IBM Cloud Databases for MongoDB connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn-mongodb.html) + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd32e17ff88251cdfc3fa01a1ad8eebda98eda06.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd32e17ff88251cdfc3fa01a1ad8eebda98eda06.md new file mode 100644 index 0000000..df03d21 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd32e17ff88251cdfc3fa01a1ad8eebda98eda06.md @@ -0,0 +1,38 @@ +# Accessing asset details + +# Accessing asset details # + +Display details about an asset and preview data assets in a deployment space\. + +To display details about the asset, click the asset name\. For example, click a model name to view details such as the associated software and hardware specifications, the model creation date, and more\. Some details, such as the model name, description, and tags, are editable\. + +For data assets, you can also preview the data\. + +## Previewing data assets ## + +To preview a data asset, click the data asset name\. + + + + * User's access to the data is based on the API layer\. This means that if user's bearer token allows for viewing data, the data preview is displayed\. + * For tabular data, only a subset of the data is displayed\. Also, column names are displayed but their data types are not inferred\. + * For data in XLS files, only the first worksheet is displayed for preview\. + * All data from Cloud Object Storage connectors is assumed to be tabular data\. + + + +MIME types supported for preview: + + + +| Format | Mime types | +| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Image | image/bmp, image/cmu\-raster, image/fif, image/florian, image/g3fax, image/gif, image/ief, image/jpeg, image/jutvision, image/naplps, image/pict, image/png, image/svg\+xml, image/vnd\.net\-fpx, image/vnd\.rn\-realflash, image/vnd\.rn\-realpix, image/vnd\.wap\.wbmp, image/vnd\.xiff, image/x\-cmu\-raster, image/x\-dwg, image/x\-icon, image/x\-jg, image/x\-jps, image/x\-niff, image/x\-pcx, image/x\-pict, image/x\-portable\-anymap, image/x\-portable\-bitmap, image/x\-portable\-greymap, image/x\-portable\-pixmap, image/x\-quicktime, image/x\-rgb, image/x\-tiff, image/x\-windows\-bmp, image/x\-xwindowdump, image/xbm, image/xpm | +| Text | application/json, text/asp, text/css, text/csv, text/html, text/mcf, text/pascal, text/plain, text/richtext, text/scriplet, text/tab\-separated\-values, text/tab\-separated\-values, text/uri\-list, text/vnd\.abc, text/vnd\.fmi\.flexstor, text/vnd\.rn\-realtext, text/vnd\.wap\.wml, text/vnd\.wap\.wmlscript, text/webviewhtml, text/x\-asm, text/x\-audiosoft\-intra, text/x\-c, text/x\-component, text/x\-fortran, text/x\-h, text/x\-java\-source, text/x\-la\-asf, text/x\-m, text/x\-pascal, text/x\-script, text/x\-script\.csh, text/x\-script\.elisp, text/x\-script\.ksh, text/x\-script\.lisp, text/x\-script\.perl, text/x\-script\.perl\-module, text/x\-script\.python, text/x\-script\.rexx, text/x\-script\.tcl, text/x\-script\.tcsh, text/x\-script\.zsh, text/x\-server\-parsed\-html, text/x\-setext, text/x\-sgml, text/x\-speech, text/x\-uil, text/x\-uuencode, text/x\-vcalendar, text/xml | +| Tabular data | text/csv, application/excel, application/vnd\.ms\-excel, application/vnd\.openxmlformats\-officedocument\.spreadsheetml\.sheet, data from connections | + + + +**Parent topic:**[Assets in deployment spaces](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets-all.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd3b0e405075464c05c52e5bb0c414a870b06334.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd3b0e405075464c05c52e5bb0c414a870b06334.md new file mode 100644 index 0000000..3785b22 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd3b0e405075464c05c52e5bb0c414a870b06334.md @@ -0,0 +1,36 @@ +# Administering a project + +# Administering a project # + +If you have the **Admin** role in a project, you can perform administrative tasks for the project\. + + + + * [Manage collaborators](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/collaborate.html) + * [Mark data assets in project as sensitive](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/mark-sensitive.html) + * [Stop all active runtimes](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/manage-envs-new.html#stop-active-runtimes) + * [Export a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/export-project.html) + * [Manage project access tokens](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/token.html) + * [Remove assets](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-assets.html#remove-asset) + * [Edit a locked asset](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-assets.html#editassets) + * [Delete the project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/admin-project.html?context=cdpaas&locale=en#delete-project) + * [Copy a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/admin-project.html?context=cdpaas&locale=en#copy-project) + * [Switch the platform for a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/switch-platform.html) + + + +Note: In the activity log, the user ID for some activities might display `icp4d-dev` instead of `admin`\. + +## Delete a project ## + +If you have the **Admin** role in a project, you can delete it\. All project assets, associated files in the project's storage, and the associated storage for the project are also deleted\. Data in a remote data source that is accessed through a connection is not affected\. + +To delete a project, choose **Project > View All Projects** and then choose **Delete** from the **ACTIONS** menu next to the project name\. + +## Copy a project ## + +You can copy an existing project by [exporting it](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/export-project.html), and then [importing it](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/import-project.html) with a different name\. + +**Parent topic:**[Projects ](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd45693344e2b3cc3bdb7d1aa209ad9fbacb5309.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd45693344e2b3cc3bdb7d1aa209ad9fbacb5309.md new file mode 100644 index 0000000..d037e1a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd45693344e2b3cc3bdb7d1aa209ad9fbacb5309.md @@ -0,0 +1,19 @@ +# dvcharts properties + +# dvcharts properties # + +![Charts node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/chartsnodeicon.png)With the Charts node, you can launch the chart builder and create chart definitions to save with your flow\. Then when you run the node, chart output is generated\. + + + +dvcharts properties + +Table 1\. dvcharts properties + +| `dvcharts` properties | Data type | Property description | +| --------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| `chart_definition` | `list` | List of chart definitions, including chart type (string), chart name (string), chart template (string), and used fields (list of field names), | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd48879c34d316981b4f67c2b82c8179e0042f74.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd48879c34d316981b4f67c2b82c8179e0042f74.md new file mode 100644 index 0000000..3d0e951 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd48879c34d316981b4f67c2b82c8179e0042f74.md @@ -0,0 +1,30 @@ +# Credentials for prompting foundation models (IBM Cloud API key and IAM token) + +# Credentials for prompting foundation models (IBM Cloud API key and IAM token) # + +To prompt foundation models in IBM watsonx\.ai programmatically, you need an IBM Cloud API key and sometimes an IBM Cloud IAM token\. + +## IBM Cloud API key ## + +To use the [foundation models Python library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-python-lib.html), you need an IBM Cloud API key\. + +**Python pseudo\-code** + + my_credentials = { + "url" : "https://us-south.ml.cloud.ibm.com", + "apikey" : + } + ... + model = Model( ... credentials=my_credentials ... ) + +You can create this API key by using multiple interfaces\. For full instructions, see [Creating an API key](https://cloud.ibm.com/docs/account?topic=account-userapikey&interface=ui#create_user_key) + +## IBM Cloud IAM token ## + +When you click the **View code** button in the Prompt Lab, a curl command is displayed that you can call outside the Prompt Lab to submit the current prompt and parameters to the selected model and get a generated response\. In the command, there is a placeholder for an IBM Cloud IAM token\. + +For information about generating that access token, see: [Generating an IBM Cloud IAM token](https://cloud.ibm.com/docs/account?topic=account-iamtoken_from_apikey) + +**Parent topic:**[Foundation models Python library](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-python-lib.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd903f9a58632df14be5c98eeda32e1fc2f46f4b.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd903f9a58632df14be5c98eeda32e1fc2f46f4b.md new file mode 100644 index 0000000..3e72787 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd903f9a58632df14be5c98eeda32e1fc2f46f4b.md @@ -0,0 +1,9 @@ +# Defining missing values (SPSS Modeler) + +# Defining missing values # + +In the Type node settings, select the desired field in the table and then click the gear icon at the end of its row\. Missing values settings are available in the window that appears\. + +Select Define missing values to define missing value handing for this field\. Here you can define explicit values to be considered as missing values for this field, or this can also be accomplished by means of a downstream Filler node\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd94481e337829121072f5e46cc39b6290e43b44.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd94481e337829121072f5e46cc39b6290e43b44.md new file mode 100644 index 0000000..d7248a2 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fd94481e337829121072f5e46cc39b6290e43b44.md @@ -0,0 +1,26 @@ +# Auto Data Prep node (SPSS Modeler) + +# Auto Data Prep node # + +Preparing data for analysis is one of the most important steps in any project—and traditionally, one of the most time consuming\. Automated Data Preparation (ADP) handles the task for you, analyzing your data and identifying fixes, screening out fields that are problematic or not likely to be useful, deriving new attributes when appropriate, and improving performance through intelligent screening techniques\. You can use the algorithm in fully automatic fashion, allowing it to choose and apply fixes, or you can use it in interactive fashion, previewing the changes before they are made and accept or reject them as you want\. + +Using ADP enables you to make your data ready for model building quickly and easily, without needing prior knowledge of the statistical concepts involved\. Models will tend to build and score more quickly + +Note: When ADP prepares a field for analysis, it creates a new field containing the adjustments or transformations, rather than replacing the existing values and properties of the old field\. The old field is not used in further analysis; its role is set to None\. + +Example\. An insurance company with limited resources to investigate homeowner's insurance claims wants to build a model for flagging suspicious, potentially fraudulent claims\. Before building the model, they will ready the data for modeling using automated data preparation\. Since they want to be able to review the proposed transformations before the transformations are applied, they will use automated data preparation in interactive mode\. + +An automotive industry group keeps track of the sales for a variety of personal motor vehicles\. In an effort to be able to identify over\- and underperforming models, they want to establish a relationship between vehicle sales and vehicle characteristics\. They will use automated data preparation to prepare the data for analysis, and build models using the data "before" and "after" preparation to see how the results differ\. + +What is your objective? Automated data preparation recommends data preparation steps that will affect the speed with which other algorithms can build models and improve the predictive power of those models\. This can include transforming, constructing and selecting features\. The target can also be transformed\. You can specify the model\-building priorities that the data preparation process should concentrate on\. + + + + * Balance speed and accuracy\. This option prepares the data to give equal priority to both the speed with which data are processed by model\-building algorithms and the accuracy of the predictions\. + * Optimize for speed\. This option prepares the data to give priority to the speed with which data are processed by model\-building algorithms\. When you are working with very large datasets, or are looking for a quick answer, select this option\. + * Optimize for accuracy\. This option prepares the data to give priority to the accuracy of predictions produced by model\-building algorithms\. + * Custom analysis\. When you want to manually change the algorithm on the Settings tab, select this option\. Note that this setting is automatically selected if you subsequently make changes to options on the Settings tab that are incompatible with one of the other objectives\. + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fe207218ce0d1148aa57d10ed8848cd7e6ffd87e.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fe207218ce0d1148aa57d10ed8848cd7e6ffd87e.md new file mode 100644 index 0000000..3c88d1d --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fe207218ce0d1148aa57d10ed8848cd7e6ffd87e.md @@ -0,0 +1,487 @@ +# Federated Learning XGBoost tutorial for UI + +# Federated Learning XGBoost tutorial for UI # + +This tutorial demonstrates the usage of Federated Learning with the goal of training a machine learning model with data from different users without having users share their data\. The steps are done in a low code environment with the UI and with an XGBoost framework\. + +In this tutorial you learn to: + + + + * [Step 1: Start Federated Learning as the admin](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-xg-tutorial.html?context=cdpaas&locale=en#step-1) + + + + * [Before you begin](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-xg-tutorial.html?context=cdpaas&locale=en#before-you-begin) + * [Start the aggregator](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-xg-tutorial.html?context=cdpaas&locale=en#start-the-aggregator) + + + + * [Step 2: Train model as a party](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-xg-tutorial.html?context=cdpaas&locale=en#step-2) + + + + * [Step 3: Save and deploy the model online](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-xg-tutorial.html?context=cdpaas&locale=en#step-3) + * [Step 4: Score the model](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-xg-tutorial.html?context=cdpaas&locale=en#step-4) + + + + + +**Notes:** + + + + * This is a step\-by\-step tutorial for running a UI driven Federated Learning experiment\. To see a code sample for an API driven approach, go to [Federated Learning XGBoost samples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-xg-samples.html)\. + * In this tutorial, *admin* refers to the user that starts the Federated Learning experiment, and *party* refers to one or more users who send their model results after the experiment is started by the admin\. While the tutorial can be done by the admin and multiple parties, a single user can also complete a full run through as both the admin and the party\. For a simpler demonstrative purpose, in the following tutorial only one data set is submitted by one party\. For more information on the admin and party, see [Terminology](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-term.html)\. + + + +## Step 1: Start Federated Learning ## + +In this section, you learn to start the Federated Learning experiment\. + +### Before you begin ### + + + +1. Log in to [IBM Cloud](https://cloud.ibm.com/)\. If you don't have an account, create one with any email\. +2. [Create a Watson Machine Learning service instance](https://cloud.ibm.com/catalog/services/machine-learning) if you do not have it set up in your environment\. +3. Log in to [watsonx](https://dataplatform.cloud.ibm.com/home2?context=wx)\. +4. Use an existing [project](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html) or create a new one\. You must have at least admin permission\. +5. Associate the Watson Machine Learning service with your project\. + + + + 1. In your project, click the **Manage > Service & integrations**. + 2. Click **Associate service**. + 3. Select your Watson Machine Learning instance from the list, and click **Associate**; or click **New service** if you do not have one to set up an instance. + + + + ![Screenshot of associating the service](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl_tut_add_wml_service.png) + + + +### Start the aggregator ### + + + +1. Create the Federated learning experiment asset: + + + + 1. Click the **Assets** tab in your project. + + + + 1. Click **New asset > Train models on distributed data**. + 2. Type a *Name* for your experiment and optionally a description. + 3. Verify the associated Watson Machine Learning instance under *Select a machine learning instance*. If you don't see a Watson Machine Learning instance associated, follow these steps: + + + + 1. Click **Associate a Machine Learning Service Instance**. + 2. Select an existing instance and click **Associate**, or create a **New service**. + 3. Click **Reload** to see the associated service. + + ![Screenshot of associating the service](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl_demo_2.png) + 4. Click **Next**. + + + + + + + +2. Configure the experiment\. + + + + 1. On the *Configure* page, select a **Hardware specification**. + 2. Under the *Machine learning framework* dropdown, select **scikit-learn**. + 3. For the *Model type*, select **XGBoost**. + 4. For the *Fusion method*, select **XGBoost classification fusion** + + ![Screenshot of selecting XGBoost classification](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl_xg_framework.png) + + + +3. Define the hyperparameters\. + + + + 1. Set the value for the *Rounds* field to `5`. + 2. Accept the default values for the rest of the fields. + + ![Screenshot of selecting hyperparameters](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl_xg_hyperparameters.png) + 3. Click **Next**. + + + +4. Select remote training systems\. + + + + 1. Click **Add new systems**. + + ![Screenshot of Add RTS UI](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl_demo_7.png) + 2. Give your Remote Training System a name. + 3. Under **Allowed identities**, select the user that will participate in the experiment, and then click **Add**. You can add as many allowed identities as participants in this Federated Experiment training instance. For this tutorial, choose only yourself. + Any allowed identities must be part of the project and have at least**Admin** permission. + 4. When you are finished, click **Add systems**. + + ![Screenshot of creating an RTS](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl_xg_create_rts.png) + 5. Return to the *Select remote training systems* page, verify that your system is selected, and then click **Next**. + + ![Screenshot of selecting RTS](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl_xg_select_rts.png) + + + +5. Review your settings, and then click **Create**\. +6. Watch the status\. Your Federated Learning experiment status is *Pending* when it starts\. When your experiment is ready for parties to connect, the status will change to *Setup – Waiting for remote systems*\. This may take a few minutes\. + + + +## Step 2: Train model as a party ## + + + +1. Ensure that you are using the same Python version as the admin\. Using a different Python version might cause compatibility issues\. To see Python versions compatible with different frameworks, see [Frameworks and Python version compatibility](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-frames.html#fl-py-fmwk)\. +2. Create a new local directory\. +3. Download the *Adult* data set into the directory with this command: `wget https://api.dataplatform.cloud.ibm.com/v2/gallery-assets/entries/5fcc01b02d8f0e50af8972dc8963f98e/data -O adult.csv`\. +4. Download the data handler by running `wget https://raw.githubusercontent.com/IBMDataScience/sample-notebooks/master/Files/adult_sklearn_data_handler.py -O adult_sklearn_data_handler.py`\. +5. Install Watson Machine Learning\. + + + + * If you are using Linux, run `pip install 'ibm-watson-machine-learning[fl-rt22.2-py3.10]'`. + * If you are using Mac OS with M-series CPU and Conda, download the [installation script](https://raw.github.ibm.com/WML/federated-learning/master/docs/install_fl_rt22.2_macos.sh?token=AAAXW7VVQZF7LYMTX5VOW7DEDULLE) and then run `./install_fl_rt22.2_macos.sh `. + You now have the party connector script, `mnist_keras_data_handler.py`, `mnist-keras-test.pkl` and `mnist-keras-train.pkl`, data handler in the same directory. + + + +6. Go back to the Federated Learning experiment page, where the aggregator is running\. Click **View Setup Information**\. +7. Click the download icon next to the remote training system, and select **Party connector script**\. +8. Ensure that you have the party connector script, the *Adult* data set, and the data handler in the same directory\. If you run `ls -l`, you should see: + + adult.csv + adult_sklearn_data_handler.py + rts__.py +9. In the party connector script: + + + + 1. Authenticate using any method. + 2. Put in these parameters for the `"data"` section: + + "data": { + "name": "AdultSklearnDataHandler", + "path": "./adult_sklearn_data_handler.py", + "info": { + "txt_file": "./adult.csv" + }, + }, + + where: + + + + * `name`: Class name defined for the data handler. + * `path`: Path of where the data handler is located. + * `info`: Create a key value pair for the file type of local data set, or the path of your data set. + + + + + +10. Run the party connector script: `python3 rts__.py`\. +11. When all participating parties connect to the aggregator, the aggregator facilitates the local model training and global model update\. Its status is *Training*\. You can monitor the status of your Federated Learning experiment from the user interface\. +12. When training is complete, the party receives a `Received STOP message` on the party\. +13. Now, you can save the trained model and deploy it to a space\. + + + +## Step 3: Save and deploy the model online ## + +In this section, you learn how to save and deploy the model that you trained\. + + + +1. Save your model\. + + + + 1. In your completed Federated Learning experiment, click **Save model to project**. + 2. Give your model a name and click **Save**. + 3. Go to your project home. + + + +2. Create a deployment space, if you don't have one\. + + + + 1. From the navigation menu ![Navigation menu](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/images/navigation-menu.svg), click **Deployments**. + 2. Click **New deployment space**. + 3. Fill in the fields, and click **Create**. + + ![Screenshot of creating a deployment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/images/fl_xg_create_deploy.png) + + + +3. Promote the model to a space\. + + + + 1. Return to your project, and click the **Assets** tab. + 2. In the *Models* section, click the model to view its details page. + 3. Click **Promote to space**. + 4. Choose a deployment space for your trained model. + 5. Select the **Go to the model in the space after promoting it** option. + 6. Click **Promote**. + + + +4. When the model displays inside the deployment space, click **New deployment**\. + + + + 1. Select **Online** as the *Deployment type*. + 2. Specify a name for the deployment. + 3. Click **Create**. + + + + + +## Step 4: Score the model ## + +In this section, you learn to create a Python function to process the scoring data to ensure that it is in the same format that was used during training\. For comparison, you will also score the raw data set by calling the Python function that we created\. + + + +1. Define the Python function as follows\. The function loads the scoring data in its raw format and processes the data exactly as it was done during training\. Then, score the processed data\. + + def adult_scoring_function(): + + import pandas as pd + + from ibm_watson_machine_learning import APIClient + + wml_credentials = { + "url": "https://us-south.ml.cloud.ibm.com", + "apikey": "" + } + client = APIClient(wml_credentials) + client.set.default_space('') + + # converts scoring input data format to pandas dataframe + def create_dataframe(raw_dataset): + + fields = raw_dataset.get("input_data")[0].get("fields") + values = raw_dataset.get("input_data")[0].get("values") + + raw_dataframe = pd.DataFrame( + columns = fields, + data = values + ) + + return raw_dataframe + + # reuse preprocess definition from training data handler + def preprocess(training_data): + + """ + Performs the following preprocessing on adult training and testing data: + * Drop following features: 'workclass', 'fnlwgt', 'education', 'marital-status', 'occupation', + 'relationship', 'capital-gain', 'capital-loss', 'hours-per-week', 'native-country' + * Map 'race', 'sex' and 'class' values to 0/1 + * ' White': 1, ' Amer-Indian-Eskimo': 0, ' Asian-Pac-Islander': 0, ' Black': 0, ' Other': 0 + * ' Male': 1, ' Female': 0 + * Further details in Kamiran, F. and Calders, T. Data preprocessing techniques for classification without discrimination + * Split 'age' and 'education' columns into multiple columns based on value + + :param training_data: Raw training data + :type training_data: `pandas.core.frame.DataFrame + :return: Preprocessed training data + :rtype: `pandas.core.frame.DataFrame` + """ + if len(training_data.columns)==15: + # drop 'fnlwgt' column + training_data = training_data.drop(training_data.columns[2], axis='columns') + + training_data.columns = ['age', + 'workclass', + 'education', + 'education-num', + 'marital-status', + 'occupation', + 'relationship', + 'race', + 'sex', + 'capital-gain', + 'capital-loss', + 'hours-per-week', + 'native-country', + 'class'] + + # filter out columns unused in training, and reorder columns + training_dataset = training_data['race', 'sex', 'age', 'education-num', 'class']] + + # map 'sex' and 'race' feature values based on sensitive attribute privileged/unpriveleged groups + training_dataset['sex'] = training_dataset['sex'].map({' Female': 0, + ' Male': 1}) + + training_dataset['race'] = training_dataset['race'].map({' Asian-Pac-Islander': 0, + ' Amer-Indian-Eskimo': 0, + ' Other': 0, + ' Black': 0, + ' White': 1}) + + # map 'class' values to 0/1 based on positive and negative classification + training_dataset['class'] = training_dataset['class'].map({' <=50K': 0, ' >50K': 1}) + + training_dataset['age'] = training_dataset['age'].astype(int) + training_dataset['education-num'] = training_dataset['education-num'].astype(int) + + # split age column into category columns + for i in range(8): + if i != 0: + training_dataset['age' + str(i)] = 0 + + for index, row in training_dataset.iterrows(): + if row['age'] < 20: + training_dataset.loc[index, 'age1'] = 1 + elif ((row['age'] < 30) & (row['age'] >= 20)): + training_dataset.loc[index, 'age2'] = 1 + elif ((row['age'] < 40) & (row['age'] >= 30)): + training_dataset.loc[index, 'age3'] = 1 + elif ((row['age'] < 50) & (row['age'] >= 40)): + training_dataset.loc[index, 'age4'] = 1 + elif ((row['age'] < 60) & (row['age'] >= 50)): + training_dataset.loc[index, 'age5'] = 1 + elif ((row['age'] < 70) & (row['age'] >= 60)): + training_dataset.loc[index, 'age6'] = 1 + elif row['age'] >= 70: + training_dataset.loc[index, 'age7'] = 1 + + # split age column into multiple columns + training_dataset['ed6less'] = 0 + for i in range(13): + if i >= 6: + training_dataset['ed' + str(i)] = 0 + training_dataset['ed12more'] = 0 + + for index, row in training_dataset.iterrows(): + if row['education-num'] < 6: + training_dataset.loc[index, 'ed6less'] = 1 + elif row['education-num'] == 6: + training_dataset.loc[index, 'ed6'] = 1 + elif row['education-num'] == 7: + training_dataset.loc[index, 'ed7'] = 1 + elif row['education-num'] == 8: + training_dataset.loc[index, 'ed8'] = 1 + elif row['education-num'] == 9: + training_dataset.loc[index, 'ed9'] = 1 + elif row['education-num'] == 10: + training_dataset.loc[index, 'ed10'] = 1 + elif row['education-num'] == 11: + training_dataset.loc[index, 'ed11'] = 1 + elif row['education-num'] == 12: + training_dataset.loc[index, 'ed12'] = 1 + elif row['education-num'] > 12: + training_dataset.loc[index, 'ed12more'] = 1 + + training_dataset.drop(['age', 'education-num'], axis=1, inplace=True) + + # move class column to be last column + label = training_dataset['class'] + training_dataset.drop('class', axis=1, inplace=True) + training_dataset['class'] = label + + return training_dataset + + def score(raw_dataset): + try: + + # create pandas dataframe from input + raw_dataframe = create_dataframe(raw_dataset) + + # reuse preprocess from training data handler + processed_dataset = preprocess(raw_dataframe) + + # drop class column + processed_dataset.drop('class', inplace=True, axis='columns') + + # create data payload for scoring + fields = processed_dataset.columns.values.tolist() + values = processed_dataset.values.tolist() + scoring_dataset = {client.deployments.ScoringMetaNames.INPUT_DATA: [{'fields': fields, 'values': values}]} + print(scoring_dataset) + + # score data + prediction = client.deployments.score('', scoring_dataset) + return prediction + + except Exception as e: + return {'error': repr(e)} + + return score +2. Replace the variables in the previous Python function: + + + + * `API KEY`: Your IAM API key. To create a new API key, go to the [IBM Cloud website](https://cloud.ibm.com/), and click **Create an IBM Cloud API key** under **Manage > Access(IAM) > API keys**. + * `SPACE ID`: ID of the Deployment space where the adult income deployment is running. To see your space ID, go to **Deployment spaces > `YOUR SPACE NAME` > Manage**. Copy the *Space GUID*. + * `MODEL DEPLOYMENT ID`: Online deployment ID for the adult income model. To see your model ID, you can see it by clicking the model in your project. It is in both the address bar and the information pane. + + + +3. Get the Software Spec ID for Python 3\.9\. For list of other environments run client\.software\_specifications\.list()\. `software_spec_id = client.software_specifications.get_id_by_name('default_py3.9')` +4. Store the Python function into your Watson Studio space\. + + # stores python function in space + meta_props = { + client.repository.FunctionMetaNames.NAME: 'Adult Income Scoring Function', + client.repository.FunctionMetaNames.SOFTWARE_SPEC_ID: software_spec_id + } + stored_function = client.repository.store_function(meta_props=meta_props, function=adult_scoring_function) + function_id = stored_function['metadata'] +5. Create an online deployment by using the Python function\. + + # create online deployment for fucntion + meta_props = { + client.deployments.ConfigurationMetaNames.NAME: "Adult Income Online Scoring Function", + client.deployments.ConfigurationMetaNames.ONLINE: {} + } + online_deployment = client.deployments.create(function_id, meta_props=meta_props) + function_deployment_id = online_deployment['metadata'] +6. Download the Adult Income data set\. This is reused as our scoring data\. + + import pandas as pd + + # read adult csv dataset + adult_csv = pd.read_csv('./adult.csv', dtype='category') + + # use 10 random rows for scoring + sample_dataset = adult_csv.sample(n=10) + + fields = sample_dataset.columns.values.tolist() + values = sample_dataset.values.tolist() +7. Score the adult income data by using the Python function created\. + + raw_dataset = {client.deployments.ScoringMetaNames.INPUT_DATA: [{'fields': fields, 'values': values}]} + + prediction = client.deployments.score(function_deployment_id, raw_dataset) + print(prediction) + + + +### Next steps ### + +[Creating your Federated Learning experiment](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-start.html)\. + +**Parent topic:**[Federated Learning tutorial and samples](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fl-demo.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fe2254205e6dd1ee2a4ec62036ab86bc5e084f5d.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fe2254205e6dd1ee2a4ec62036ab86bc5e084f5d.md new file mode 100644 index 0000000..fe98797 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fe2254205e6dd1ee2a4ec62036ab86bc5e084f5d.md @@ -0,0 +1,35 @@ +# bayesnetnode properties + +# bayesnetnode properties # + +![Bayes Net node icon](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/images/bayesian_network_icon.png)With the Bayesian Network (Bayes Net) node, you can build a probability model by combining observed and recorded evidence with real\-world knowledge to establish the likelihood of occurrences\. The node focuses on Tree Augmented Naïve Bayes (TAN) and Markov Blanket networks that are primarily used for classification\. + + + +bayesnetnode properties + +Table 1\. bayesnetnode properties + +| `bayesnetnode` Properties | Values | Property description | +| ---------------------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `inputs` | *\[field1 \.\.\. fieldN\]* | Bayesian network models use a single target field, and one or more input fields\. Continuous fields are automatically binned\. See the topic [Common modeling node properties](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/scripting_guide/clementine/modelingnodeslots_common.html#modelingnodeslots_common) for more information\. | +| `continue_training_existing_model` | *flag* | | +| `structure_type` | `TAN``MarkovBlanket` | Select the structure to be used when building the Bayesian network\. | +| `use_feature_selection` | *flag* | | +| `parameter_learning_method` | `Likelihood``Bayes` | Specifies the method used to estimate the conditional probability tables between nodes where the values of the parents are known\. | +| `mode` | `Expert``Simple` | | +| `missing_values` | *flag* | | +| `all_probabilities` | *flag* | | +| `independence` | `Likelihood``Pearson` | Specifies the method used to determine whether paired observations on two variables are independent of each other\. | +| `significance_level` | *number* | Specifies the cutoff value for determining independence\. | +| `maximal_conditioning_set` | *number* | Sets the maximal number of conditioning variables to be used for independence testing\. | +| `inputs_always_selected` | *\[field1 \.\.\. fieldN\]* | Specifies which fields from the dataset are always to be used when building the Bayesian network\.

Note: The target field is always selected\. | +| `maximum_number_inputs` | *number* | Specifies the maximum number of input fields to be used in building the Bayesian network\. | +| `calculate_variable_importance` | *flag* | | +| `calculate_raw_propensities` | *flag* | | +| `calculate_adjusted_propensities` | *flag* | | +| `adjusted_propensity_partition` | `Test``Validation` | | + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fe88457ca86ffe3be30873156a7a0a4fd12975af.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fe88457ca86ffe3be30873156a7a0a4fd12975af.md new file mode 100644 index 0000000..c90f803 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fe88457ca86ffe3be30873156a7a0a4fd12975af.md @@ -0,0 +1,9 @@ +# Accessing the Expression Builder (SPSS Modeler) + +# Accessing the Expression Builder # + +The Expression Builder is available in all nodes where CLEM expressions are used, including Select, Balance, Derive, Filler, Analysis, Report, and Table nodes\. + +You can open it by double\-clicking the node to open its properties, then click the calculator button by the formula field\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fe9ff9f5cc449798c00d008182f55bdaa91e546c.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fe9ff9f5cc449798c00d008182f55bdaa91e546c.md new file mode 100644 index 0000000..b21e3da --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fe9ff9f5cc449798c00d008182f55bdaa91e546c.md @@ -0,0 +1,16 @@ +# Handling records with missing values (SPSS Modeler) + +# Handling records with missing values # + +If the majority of missing values are concentrated in a small number of records, you can just exclude those records\. For example, a bank usually keeps detailed and complete records on its loan customers\. + +If, however, the bank is less restrictive in approving loans for its own staff members, data gathered for staff loans is likely to have several blank fields\. In such a case, there are two options for handling these missing values: + + + + * You can use a [Select node](https://dataplatform.cloud.ibm.com/docs/content/wsd/nodes/select.html) to remove the staff records + * If the data set is large, you can discard all records with blanks + + + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fecb1c7b603627e1cf1386ad0ebdfe57fa485f93.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fecb1c7b603627e1cf1386ad0ebdfe57fa485f93.md new file mode 100644 index 0000000..64f8469 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/fecb1c7b603627e1cf1386ad0ebdfe57fa485f93.md @@ -0,0 +1,95 @@ +# MariaDB connection + +# MariaDB connection # + +To access your data in MariaDB, create a connection asset for it\. + +MariaDB is an open source relational database\. You can use the MariaDB connection to connect to either a MariaDB server or to a Microsoft Azure Database for MariaDB service in the cloud\. + +## Supported versions ## + + + + * MariaDB server: 10\.5\.5 + * Microsoft Azure Database for MariaDB: 10\.3 + + + +## Create a connection to MariaDB ## + +To create the connection asset, you need these connection details: + + + + * Database name + * Hostname or IP address + * Port number + * Username and password + * SSL certificate (if required by the database server) + + + +For **Private connectivity**, to connect to a database that is not externalized to the internet (for example, behind a firewall), you must set up a [secure connection](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/securingconn.html)\. + +### Choose the method for creating a connection based on where you are in the platform ### + +**In a project** : Click **Assets > New asset > Connect to a data source**\. See [Adding a connection to a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/create-conn.html)\. + +**In a deployment space** : Click **Add to space > Connection**\. See [Adding connections to a deployment space](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-space-add-assets.html)\. + +**In the Platform assets catalog** : Click **New connection**\. See [Adding platform connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/platform-conn.html)\. + +### Next step: Add data assets from the connection ### + + + + * See [Add data from a connection in a project](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/connected-data.html)\. + + + +## Where you can use this connection ## + +You can use MariaDB connections in the following workspaces and tools: + +**Projects** + + + + * Data Refinery + * Decision Optimization + * SPSS Modeler + * Synthetic Data Generator + + + +**Catalogs** + + + + * Platform assets catalog + + + +## MariaDB setup ## + +Setup depends on whether you are connecting from a local MariaDB server or a Microsoft Azure Database for MariaDB database service in the cloud\. + + + + * MariaDB server: [MariaDB Administration](https://mariadb.com/kb/en/mariadb-administration/) + * Microsoft Azure Database for MariaDB: [Quickstart: Create an Azure Database for MariaDB server by using the Azure portal](https://docs.microsoft.com/en-us/azure/mariadb/quickstart-create-mariadb-server-database-using-azure-portal) + + + +## Learn more ## + + + + * [MariaDB Foundation](https://mariadb.org/) + * [Microsoft Azure Database for MariaDB](https://azure.microsoft.com/en-us/services/mariadb/) + + + +**Parent topic:**[Supported connections](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/conn_types.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ff69e780bd8feceaf7a0add24c159679f7359f81.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ff69e780bd8feceaf7a0add24c159679f7359f81.md new file mode 100644 index 0000000..5a7f771 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ff69e780bd8feceaf7a0add24c159679f7359f81.md @@ -0,0 +1,65 @@ +# Markdown cheatsheet + +# Markdown cheatsheet # + +You can use Markdown tagging to improve the readability of a project readme or the Markdown cells in Jupyter notebooks\. The differences between Markdown in the readme files and in notebooks are noted\. + +**Headings:** Use \#s followed by a blank space for notebook titles and section headings: + +`#` title +`##` major headings +`###` subheadings +`####` 4th level subheadings + +**Emphasis:** Use this code: Bold: `__string__` or `**string**`, Italic: `_string_` or `*string*`, Strikethrough: `~~string~~` + +**Mathematical symbols:** Use this code: `$ mathematical symbols $` + +**Monospace font:** Surround text with a back single quotation mark (\`)\. Use monospace for file path and file names and for text users enter or message text users see\. + +**Line breaks:** Sometimes Markdown doesn’t make line breaks when you want them\. Put two spaces at the end of the line, or use this code for a manual line break: `
` + +**Indented quoting:** Use a greater\-than sign (`>`) and then a space, then type the text\. The text is indented and has a gray horizontal line to the left of it until the next carriage return\. + +**Bullets:** Use the dash sign (`-`) with a space after it or a space, a dash, and a space (`-`), to create a circular bullet\. To create a sub bullet, use a tab followed a dash and a space\. You can also use an asterisk instead of a dash, and it works the same\. + +**Numbered lists:** Start with `1.` followed by a space, then your text\. Hit return and numbering is automatic\. Start each line with some number and a period, then a space\. Tab to indent to get subnumbering\. + +**Checkboxes in readme files:** Use this code for an unchecked box: `- [ ]` +Use this code for a checked box: `- [x]` + +**Tables in readme files:** Use this code: + + | Heading | Heading | + | ----| ----| + | text | text | + | text | text | + +**Graphics in notebooks:** Drag and drop images to the Markdown cell to attach it to the notebook\. To add images to other cell types, use graphics that are hosted on the web with this code, substituting *url/name* with the full URL and name of the image: `Alt text` + +**Graphics in readme files:** Use this code: `Alt text] + +**Geometric shapes:** Use this code with a decimal or hex reference number from here: [!UTF\-8 Geometric shapes](https://www.w3schools.com/charsets/ref_utf_geometric.asp)`&#reference_number;` + +**Horizontal lines:** Use three asterisks: `***` + +**Internal links:** To link to a section, add an anchor above the section title and then create a link\. + +Use this code to create an anchor: `` +Use this code to create the link: `[section title](#section-ID)` +Make sure that the section\_ID is unique within the notebook or readme\. + +Alternatively, for notebooks you can skip creating anchors and use this code: `[section title](#section-title)` +For the text in the parentheses, replace spaces and special characters with a hyphen and make all characters lowercase\. + +Test all links\! + +**External links:** Use this code: `[link text](http://url)` + +To create a link that opens in a new window or tab, use this code: `link text` + +Test all links\! + +**Parent topic:**[Projects ](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html) + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ff6c435adbd62de03c06ce4f90343d3cd04f9e8f.md b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ff6c435adbd62de03c06ce4f90343d3cd04f9e8f.md new file mode 100644 index 0000000..fc53cb4 --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/files/docs/ff6c435adbd62de03c06ce4f90343d3cd04f9e8f.md @@ -0,0 +1,11 @@ +# Extension Transform node (SPSS Modeler) + +# Extension Transform node # + +With the Extension Transform node, you can take data from an SPSS Modeler flow and apply transformations to the data using R scripting or Python for Spark scripting\. + +When the data has been modified, it's returned to the flow for further processing, model building, and model scoring\. The Extension Transform node makes it possible to transform data using algorithms that are written in R or Python for Spark, and enables you to develop data transformation methods that are tailored to a particular problem\. + +After adding the node to your canvas, double\-click the node to open its properties\. + + diff --git a/assets/seed/v2/corpora/watsonxdocsqa-v1/questions.jsonl b/assets/seed/v2/corpora/watsonxdocsqa-v1/questions.jsonl new file mode 100644 index 0000000..fd4491a --- /dev/null +++ b/assets/seed/v2/corpora/watsonxdocsqa-v1/questions.jsonl @@ -0,0 +1,75 @@ +{"question_id": "train_1", "question": "What foundation models have been built by IBM?", "answer": "Foundation models built by IBM include: \ngranite-13b-chat-v2\ngranite-13b-chat-v1\ngranite-13b-instruct-v1\"", "gold_doc_ids": ["docs/b2593108fa446c4b4b0ef5adc2cd5d9585b0b63c.md"]} +{"question_id": "train_2", "question": "How can you ensure the removal of harmful content when utilizing foundation models in the Prompt Lab?", "answer": "To remove harmful content when you're working with foundation models in the Prompt Lab, set the AI guardrails switch to On.", "gold_doc_ids": ["docs/812c39cf410f9fe3f0d0e7c62ed1bc015370c849.md"]} +{"question_id": "train_3", "question": "When to tune a foundation model?", "answer": "Tune a foundation model when you want to do the following things:\n\nReduce the cost of inferencing at scale\nGet the model's output to use a certain style or format\nImprove the model's performance by teaching the model a specialized task\nGenerate output in a reliable form in response to zero-shot prompts\"", "gold_doc_ids": ["docs/fbc3c5f81d060cd996489b772abac886f12130a3.md"]} +{"question_id": "train_4", "question": "How do I avoid generating personal information with foundation models?", "answer": "To exclude personal information, try these techniques:\n- In your prompt, instruct the model to refrain from mentioning names, contact details, or personal information.\n- In your larger application, pipeline, or solution, post-process the content that is generated by the foundation model to find and remove personal information.\"", "gold_doc_ids": ["docs/e59b59312d1eb3b2ba78d7e78993883bb3784c2b.md"]} +{"question_id": "train_5", "question": "What Python libraries are available for interacting with IBM Watson Machine Learning AutoAI experiments, and what are their respective functionalities?", "answer": "The `autoai-lib` Python library offers a range of functions designed to facilitate interaction with IBM Watson Machine Learning AutoAI experiments. With this library, you can examine and modify the data transformations applied during pipeline creation. Likewise, the `autoai-ts-libs` library enables interaction with pipeline notebooks specifically tailored for time series experiments.", "gold_doc_ids": ["docs/83cd92cdb99db6263492fad998e932f50f0f8e99.md"]} +{"question_id": "train_6", "question": "What are the steps involved in configuring the watsonx platform for an organization's use?", "answer": "The setup process for the watsonx platform on IBM watsonx.ai involves several steps: signing up for the service, upgrading to a paid plan, configuring the required services, and assigning appropriate permissions to users within your organization. IBM watsonx.ai, hosted on the watsonx platform, offers cloud-based services for tasks such as data preparation, data science, and AI modeling. Additionally, the platform benefits from robust security measures comparable to those found on IBM Cloud.", "gold_doc_ids": ["docs/27db2218237b89f557d3702f4270288e4460e9cb.md"]} +{"question_id": "train_7", "question": "What is the difference between fine-tuning and prompt-tuning foundation models?", "answer": "Fine-tuning changes the parameters of the underlying foundation model to guide the model to generate output that is optimized for a task. Prompt-tuning adjusts the content of the prompt that is passed to the model to guide the model to generate output that matches a pattern you specify. In this case the underlying foundation model and its parameters are not edited, only the prompt input is altered.", "gold_doc_ids": ["docs/15a014c514b00ff78c689585f393e21bae922db2.md"]} +{"question_id": "train_8", "question": "How are words mapped to tokens?", "answer": "The mapping from words to tokens is context dependent. It depends on the word's position in a sentence, surrounding words, and on the language and chosen model.", "gold_doc_ids": ["docs/b193a2795bdef17a5d204cdd18188a767e2fe7b7.md"]} +{"question_id": "train_9", "question": "What are the different types of joins that can be performed in Data Refinery?", "answer": "There are several types of joins that can be performed in Data Refinery, including left join, right join, inner join, full join, semi join, and anti join. Each type of join has a specific purpose and can be used to combine data from two data sets based on a comparison of the values in specified key columns.", "gold_doc_ids": ["docs/9c03418999e6b01345837d9dd0f8e0410ed5cb7d.md"]} +{"question_id": "train_10", "question": "How can you edit the sample size in Data Refinery?", "answer": "To edit the sample size in Data Refinery, open the Flow settings and go to the Source data sets tab. Click the overflow menu next to the data source and select Edit sample.", "gold_doc_ids": ["docs/0999f59bb8e2e2ab7722d57cdbc051a0984abe45.md"]} +{"question_id": "train_11", "question": "What information is needed to create a Watson Query connection?", "answer": "To create a Watson Query connection, you need the following information: database name, hostname or IP address of the database, port number, instance ID, credentials information, application name (optional), client accounting information (optional), client hostname (optional), client user (optional), and SSL certificate (if required by the database server).", "gold_doc_ids": ["docs/d377da7cf67645f321593fa8b1536be2f0753333.md"]} +{"question_id": "train_12", "question": "How do you mark a Jupyter notebook as trusted?", "answer": "To trust a notebook in Jupyter, click the \"Not Trusted\" button in the upper right corner of the notebook and then click \"Trust\" to execute all cells.", "gold_doc_ids": ["docs/d1afa9bb4e0475a56190dc8254e004308bea484d.md"]} +{"question_id": "train_13", "question": "What is the purpose of the Data Audit node in SPSS Modeler?", "answer": "The Data Audit node provides a comprehensive first look at the data you bring to SPSS Modeler, presented in an interactive, easy-to-read matrix that can be sorted and used to generate full-size graphs. This node can be used to gain a preliminary understanding of the data, including information about outliers, extremes, and missing values.", "gold_doc_ids": ["docs/7f4648fd3e7f8564c98cf142e0e09e23e8097a9e.md"]} +{"question_id": "train_14", "question": "What information is needed to create a connection to Db2 Warehouse?", "answer": "To create a connection to Db2 Warehouse, you need the following information: database name, hostname or IP address of the database server, port number, API key or username and password, application name (optional), client accounting information (optional), client hostname (optional), client user (optional), and SSL certificate (if required by the database server).", "gold_doc_ids": ["docs/c61d407536d31a069aa857469a0eebfef1c0e1b8.md"]} +{"question_id": "train_15", "question": "What is optimization?", "answer": "Optimization is the process of finding the most appropriate solution to a precisely defined problem while respecting the imposed constraints and limitations. For example, determining how to allocate resources or how to find the best elements or combinations from a large set of alternatives.", "gold_doc_ids": ["docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md"]} +{"question_id": "train_16", "question": "What is a Jupyter Notebook?", "answer": "A Jupyter Notebook is a web-based environment for interactive computing. It allows you to run small pieces of code that process your data, and then immediately view the results of your computation.", "gold_doc_ids": ["docs/577964b0c132f5ea793054c3ff67417dda6511d3.md"]} +{"question_id": "train_17", "question": "What is an algorithm?", "answer": "An algorithm is a formula applied to data to determine optimal ways to solve analytical problems.", "gold_doc_ids": ["docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md"]} +{"question_id": "train_18", "question": "What is a resource group in IAM?", "answer": "A resource group is a logical grouping of resources that helps with access control. Resources are any service that is managed by IAM, such as databases. Whenever you create a service instance from the Cloud catalog, you must assign it to a resource group.", "gold_doc_ids": ["docs/abfaaf84948b090c8ea099ff44cc8cd878371073.md"]} +{"question_id": "train_19", "question": "What are the different types of classification algorithms that can be used to train a custom classification model?", "answer": "There are three different families of classification algorithms that can be used to train a custom classification model: classic machine learning using SVM (Support Vector Machines), deep learning using CNN (Convolutional Neural Networks), and a transformer-based algorithm using a pre-trained transformer model.", "gold_doc_ids": ["docs/9e2277ec0ed75ec2871c8bccb4b9af3f78350c9b.md"]} +{"question_id": "train_20", "question": "What is a confusion matrix?", "answer": "A confusion matrix is a performance measurement that determines the accuracy between a model's positive and negative predicted outcomes to positive and negative actual outcomes.", "gold_doc_ids": ["docs/5042fbfb0c15aeded02ff805c4869ac838910c7a.md"]} +{"question_id": "train_21", "question": "What is a visualization?", "answer": "A visualization is a visual representation of data, such as a graph, chart, plot, table, or map.", "gold_doc_ids": ["docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md"]} +{"question_id": "train_22", "question": "How do I assign roles to enable access to Cloud Object Storage?", "answer": "The IBM Cloud account owner or administrator assigns appropriate roles to users to provide access to Cloud Object Storage. Storage delegation must be disabled when using role-based access. Additionally, rather than assigning each individual user a set of roles, you can create an access group. Access groups expedite role assignments by grouping permissions. For instructions on creating access groups, see the IBM Cloud docs: Setting up access groups.", "gold_doc_ids": ["docs/39ad64c9004e83507a968c5c0b1c8ef952b3eace.md"]} +{"question_id": "train_23", "question": "What are the different methods for imputing missing data in binary classification, multiclass classification, or regression experiments?", "answer": "There are three methods for imputing missing data in binary classification, multiclass classification, or regression experiments: most frequent, median, and mean. Most frequent replaces missing values with the value that appears most frequently in the column, median replaces missing values with the value in the middle of the sorted column, and mean replaces missing values with the average value for the column.", "gold_doc_ids": ["docs/73f96a06142ee17a6c55e5700580f33250552a00.md"]} +{"question_id": "train_24", "question": "What is a candlestick chart?", "answer": "A candlestick chart is a type of financial chart that is used to describe price movements of a security, derivative, or currency. It typically shows one day of data and is most often used in the analysis of equity and currency price patterns. The data set that is used to create a candlestick chart must contain open, high, low, and close values for each time period you want to display.", "gold_doc_ids": ["docs/f7d94e6cd13f36eb9b1fe7653c436dc5745250b1.md"]} +{"question_id": "train_25", "question": "What is a Jupyter notebook?", "answer": "A Jupyter notebook is a web-based environment for interactive computing. It allows you to run small pieces of code that process your data, and immediately view the results of your computation. Notebooks include all of the building blocks you need to work with data, including the data itself, the code computations that process the data, visualizations of the results, and text and rich media to enhance understanding.", "gold_doc_ids": ["docs/292d19849e8fbe48869f5e3a50439964563a90d1.md"]} +{"question_id": "train_26", "question": "What is a time series model?", "answer": "A time series model is a model that tracks and predicts data over time.", "gold_doc_ids": ["docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md"]} +{"question_id": "train_27", "question": "What are the benefits of using scripting in SPSS Modeler?", "answer": "Scripting in SPSS Modeler can be used to automate repetitive tasks, impose a specific order for node executions in a flow, set properties for a node, and perform derivations using a subset of CLEM. Additionally, scripting can be used to specify an automatic sequence of actions that normally involves user interaction, such as building a model and then testing it.", "gold_doc_ids": ["docs/14a06de43e6b08188a7672b5be8068a572de5b7c.md"]} +{"question_id": "train_28", "question": "What is temperature in a generative model?", "answer": "Temperature is a parameter in a generative model that specifies the amount of variation in the generation process. Higher temperatures result in greater variability in the model's output.", "gold_doc_ids": ["docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md"]} +{"question_id": "train_29", "question": "What is Watson OpenScale?", "answer": "Watson OpenScale is a tool that helps organizations evaluate and monitor the performance of their AI models. It tracks and measures outcomes from AI models, and helps ensure that they remain fair, explainable, and compliant no matter where the models were built or are running. Watson OpenScale also detects and helps correct the drift in accuracy when an AI model is in production.", "gold_doc_ids": ["docs/777f72f32fd20e96c4a5f0cca461fe9a79334e96.md"]} +{"question_id": "train_30", "question": "What is a weight in an AI model?", "answer": "A weight is a coefficient for a node that transforms input data within the network's layer. It is a parameter that an AI model learns through training, adjusting its value to reduce errors in the model's predictions.", "gold_doc_ids": ["docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md"]} +{"question_id": "train_31", "question": "What is the difference between traditional AI models and foundation models?", "answer": "Traditional AI models are trained on large, structured, well-labeled data sets that encompass a specific task, and can be used for a single task. Foundation models are trained on large, diverse, unlabeled data sets and can be used for many different tasks.", "gold_doc_ids": ["docs/58c6d0a1c6dad01e3f0f1748dc472c3ddcc07e43.md"]} +{"question_id": "train_32", "question": "What is the difference between the Symmetric Mean Absolute Percentage Error (SMAPE) and the Root Mean Squared Error (RMSE) metrics?", "answer": "The Symmetric Mean Absolute Percentage Error (SMAPE) metric is calculated by dividing the absolute difference between the actual value and the predicted value by half the sum of the absolute actual value and the predicted value, and then averaging the result across all fitted points. The Root Mean Squared Error (RMSE) metric is calculated by taking the square root of the mean of the squared differences between the actual values and the predicted values.", "gold_doc_ids": ["docs/510bb82156702471c527d6ef7e51fe69ef746004.md"]} +{"question_id": "train_33", "question": "How can you monitor the progress of a federated learning experiment?", "answer": "You can monitor the progress of a federated learning experiment by viewing a dynamic diagram of the training progress. The diagram shows the four stages of a training round: sending model, training, receiving models, and aggregating.", "gold_doc_ids": ["docs/3acf4aabd6be9c3bc0e0a363c3bfffdd4a37b442.md"]} +{"question_id": "train_34", "question": "What is RFM analysis?", "answer": "RFM analysis is a quantitative method for determining which customers are likely to be the best ones by examining how recently they last purchased from you (recency), how often they purchased (frequency), and how much they spent over all transactions (monetary).", "gold_doc_ids": ["docs/9e15d946edfb82ef911d36032c073cf1736b39da.md"]} +{"question_id": "train_35", "question": "What is a knowledge base?", "answer": "A knowledge base is a collection of information-containing artifacts, such as process information in internal company wiki pages, files in GitHub, messages in a collaboration tool, topics in product documentation, text passages in a database like Db2, a collection of legal contracts in PDF files, or customer support tickets in a content management system.", "gold_doc_ids": ["docs/752d982c2f694ffee2a312cea6adf22c2384d4b2.md"]} +{"question_id": "train_36", "question": "How do you edit, duplicate, insert, or delete a step in Data Refinery?", "answer": "In the Steps pane, click the overflow menu on the step for the operation that you want to change. Select the action (Edit, Duplicate, Insert step before, Insert step after, or Delete). If you select Edit, Data Refinery goes into edit mode and either displays the operation to be edited on the command line or in the Operation pane. Apply the edited operation. If you select Duplicate, the duplicated step is inserted after the selected step. Note: The Duplicate action is not available for the Join or Union operations. Data Refinery updates the Data Refinery flow to reflect the changes and reruns all the operations.", "gold_doc_ids": ["docs/0999f59bb8e2e2ab7722d57cdbc051a0984abe45.md"]} +{"question_id": "train_37", "question": "What is an Analysis node in SPSS modeler?", "answer": "An Analysis node is a node in a predictive model that allows you to evaluate the ability of the model to generate accurate predictions. It performs various comparisons between predicted values and actual values (your target field) for one or more model nuggets. You can also use Analysis nodes to compare predictive models to other predictive models.", "gold_doc_ids": ["docs/6d7b948346f167b5390a0e56e1b6de83ae31a19a.md"]} +{"question_id": "train_38", "question": "How do you save a Data Refinery flow?", "answer": "To save a Data Refinery flow, click the Save Data Refinery flow icon in the Data Refinery toolbar. The default output of the Data Refinery flow is saved as a data asset with the name source-file-name_shaped.csv. For example, if the source file is mydata.csv, the default name and output for the Data Refinery flow is mydata_csv_shaped. You can edit the name and add an extension by changing the target of the Data Refinery flow.", "gold_doc_ids": ["docs/0999f59bb8e2e2ab7722d57cdbc051a0984abe45.md"]} +{"question_id": "train_39", "question": "What are the different methods for tuning foundation models?", "answer": "Foundation models can be tuned in two ways: fine-tuning and prompt-tuning. Fine-tuning changes the parameters of the underlying foundation model to guide the model to generate output that is optimized for a task. Prompt-tuning adjusts the content of the prompt that is passed to the model to guide the model to generate output that matches a pattern you specify. The underlying foundation model and its parameters are not edited. Only the prompt input is altered.", "gold_doc_ids": ["docs/15a014c514b00ff78c689585f393e21bae922db2.md"]} +{"question_id": "train_40", "question": "How can I export the data from a Data Refinery flow to a CSV file?", "answer": "To export the data from a Data Refinery flow to a CSV file, click the Export icon on the toolbar. This will create a CSV file that is downloaded to your computer's Downloads folder (or the user-specified download location) at the current step in the Data Refinery flow. If you are in snapshot view, the output of the CSV file will be at the step that you clicked. If you are viewing a sample (subset) of the data, only the sample data will be in the output.", "gold_doc_ids": ["docs/0999f59bb8e2e2ab7722d57cdbc051a0984abe45.md"]} +{"question_id": "train_41", "question": "How do I import a space or a project to a new deployment space?", "answer": "To import a space or a project to a new deployment space, you need to create a new deployment space and enter the details for the space. Then, in the Upload space assets section, upload the exported compressed file that contains data assets and click Create. The assets from the exported file will be added as space assets.", "gold_doc_ids": ["docs/a11374b50b49477362fa00bbb32a277776f7e8e2.md"]} +{"question_id": "train_42", "question": "What is the purpose of the Feature Selection node?", "answer": "The Feature Selection node is used to identify the most important fields for a given analysis. It consists of three steps: screening, ranking, and selecting. Screening removes unimportant and problematic inputs and records, or cases such as input fields with too many missing values or with too much or too little variation to be useful. Ranking sorts remaining inputs and assigns ranks based on importance. Selecting identifies the subset of features to use in subsequent models—for example, by preserving only the most important inputs and filtering or excluding all others.", "gold_doc_ids": ["docs/9e1cdb994e758d43d9d8cdc5d88e2b5c7e0088d7.md"]} +{"question_id": "train_43", "question": "What is a Pareto chart?", "answer": "A Pareto chart is a type of chart that contains both bars and a line graph. The bars represent individual variable categories and the line graph represents the cumulative total.", "gold_doc_ids": ["docs/6b4213fc5352021865e77592ebc27242e746b5aa.md"]} +{"question_id": "train_44", "question": "What are the four main areas of Watson OpenScale?", "answer": "The four main areas of Watson OpenScale are Insights, Explain a transaction, Configuration, and Support. Insights displays the models that you are monitoring and provides status on the results of model evaluations. Explain a transaction describes how the model determined a prediction. Configuration can be used to select a database, set up a machine learning provider, and optionally add integrated services. Support provides you with resources to get the help you need with Watson OpenScale.", "gold_doc_ids": ["docs/777f72f32fd20e96c4a5f0cca461fe9a79334e96.md"]} +{"question_id": "train_45", "question": "What is artificial intelligence?", "answer": "Artificial intelligence is the capability to acquire, process, create and apply knowledge in the form of a model to make predictions, recommendations or decisions.", "gold_doc_ids": ["docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md"]} +{"question_id": "test_1", "question": "What foundation models are available in watsonx.ai ?", "answer": "The following models are available in watsonx.ai: \nflan-t5-xl-3b\nFlan-t5-xxl-11b\nflan-ul2-20b\ngpt-neox-20b\ngranite-13b-chat-v2\ngranite-13b-chat-v1\ngranite-13b-instruct-v2\ngranite-13b-instruct-v1\nllama-2-13b-chat\nllama-2-70b-chat\nmpt-7b-instruct2\nmt0-xxl-13b\nstarcoder-15.5b", "gold_doc_ids": ["docs/5b37710fe7bbd6efb842feb7b49b036302e18f81.md"]} +{"question_id": "test_2", "question": "What is greedy decoding?", "answer": "Greedy decoding produces output that closely matches the most common language in the model's pretraining data and in your prompt text, which is desirable in less creative or fact-based use cases. A weakness of greedy decoding is that it can cause repetitive loops in the generated output.", "gold_doc_ids": ["docs/42ae491240ef740e6a8c5cf32b817e606f554e49.md"]} +{"question_id": "test_3", "question": "What tuning parameters are available for IBM foundation models?", "answer": "Tuning parameter values for IBM foundation models:\nInitialization method\ninitialization text\nbatch_size\naccumulate_steps\nlearning_rate\nnum_epochs\"", "gold_doc_ids": ["docs/51747f17f413f1f34cfd73d170de392d874d03dd.md"]} +{"question_id": "test_4", "question": "What are tokens and tokenization?", "answer": "A token is a collection of characters that has semantic meaning for a model. Tokenization is the process of converting the words in your prompt into tokens.", "gold_doc_ids": ["docs/b193a2795bdef17a5d204cdd18188a767e2fe7b7.md"]} +{"question_id": "test_5", "question": "What is the \"random seed\" parameter in prompt tuning experiments?", "answer": "Random seed refers to the number that is used to start the random number generator that the model uses to randomize its token choices. If you want to remove this intentional randomness as a variable from your experiments, you can pick a number and specify that same number each time you run the experiment.", "gold_doc_ids": ["docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md"]} +{"question_id": "test_6", "question": "How to build reusable prompts?", "answer": "A great way to add flexibility to a prompt is to add prompt variables. A prompt variable is a placeholder keyword that you include in the static text of your prompt at creation time and replace with text dynamically at run time.", "gold_doc_ids": ["docs/6049d5aa5de41309e6281534a464abd6898a758c.md"]} +{"question_id": "test_7", "question": "What are the functionalities of the Prompt Lab in IBM watsonx.ai, and how does it facilitate the process of crafting and optimizing prompts for deployed foundation models?", "answer": "In the Prompt Lab in IBM watsonx.ai, you can experiment with prompting different foundation models, explore sample prompts, and save and share your best prompts.\n\nYou use the Prompt Lab to engineer effective prompts that you submit to deployed foundation models for inferencing. You do not use the Prompt Lab to create new foundation models.", "gold_doc_ids": ["docs/78a8c07b83df1b01276353d098e84f12304636e2.md"]} +{"question_id": "test_8", "question": "How do I avoid repetitive text in prompt tuning experiments?", "answer": "If you notice repetitive text in the generated output from your selected prompt, model, and parameters, you can address this by implementing a repetition penalty. This penalty reduces the likelihood of the model repeating tokens that were recently used, resulting in more diverse output. Adjusting the penalty to a higher value enhances the diversity and variability of the generated text.", "gold_doc_ids": ["docs/42ae491240ef740e6a8c5cf32b817e606f554e49.md"]} +{"question_id": "test_9", "question": "What happens to unsaved prompt text within Prompt Lab, and how long does it persist on the webpage before being deleted?", "answer": "The prompt text remains unsaved unless the user decides to save their progress. While unsaved, the prompt text persists on the webpage until a page refresh occurs, upon which the text is automatically deleted.", "gold_doc_ids": ["docs/38fb0908b90954d96ceff54ba975de832286a0a7.md"]} +{"question_id": "test_10", "question": "Why deploy a prompt template?", "answer": "Deploy a prompt template so you can add it to a business workflow or so you can evaluate the prompt template to measure performance.", "gold_doc_ids": ["docs/b2117b2cd0fea469149b23facb6a9f7f32905afd.md"]} +{"question_id": "test_11", "question": "What is trust calibration?", "answer": "Trust calibration is the process of evaluating and adjusting one's trust in an AI system based on factors such as its accuracy, reliability, and credibility.", "gold_doc_ids": ["docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md"]} +{"question_id": "test_12", "question": "What are parameters in CLEM?", "answer": "Parameters are user-defined variables that are saved and persisted with the current flow or SuperNode and can be accessed from the user interface as well as through scripting. They are often used in scripting to control the behavior of the script, by providing information about fields and values that don't need to be hard coded in the script.", "gold_doc_ids": ["docs/717b697e0045b5d7dff6acc93ad5dec98e27ebdc.md"]} +{"question_id": "test_13", "question": "What is a data warehouse?", "answer": "A data warehouse is a large, centralized repository of data collected from various sources that is used for reporting and data analysis. It primarily stores structured and semi-structured data, enabling businesses to make informed decisions.", "gold_doc_ids": ["docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md"]} +{"question_id": "test_14", "question": "What is the retrieval-augmented generation pattern?", "answer": "The retrieval-augmented generation pattern is a technique for generating factually accurate output based on information in a knowledge base. It involves three basic steps: searching for relevant content in the knowledge base, pulling the most relevant content into the prompt as context, and sending the combined prompt text to the model to generate output.", "gold_doc_ids": ["docs/43785386700cf73e37a8f76adc4ef9fb01ee0aeb.md"]} +{"question_id": "test_15", "question": "What is the workflow for a Federated Learning experiment?", "answer": "The workflow for a Federated Learning experiment involves three main roles: the data scientist, the party, and the admin. The data scientist identifies the data sources, creates an initial \"untrained\" model, and creates a data handler file. The party connects to the aggregator on their system, which can be remote. The admin controls the Federated Learning experiment by configuring the experiment to accommodate remote parties and starting the aggregator.", "gold_doc_ids": ["docs/4b48ef3d089f3142b1ed604a32873217f89e052f.md"]} +{"question_id": "test_16", "question": "What are the benefits of using IBM Federated Learning?", "answer": "IBM Federated Learning enables sites with large volumes of data to be collected, cleaned, and trained on an enterprise scale without migration. It also accommodates for the differences in data format, quality, and constraints, and complies with data privacy and security while training models with different data sources.", "gold_doc_ids": ["docs/a7845d8c3e419cedd06e8c447adf41e6e3d860c8.md"]} +{"question_id": "test_17", "question": "How do I delete a deployment using the Python client?", "answer": "To delete a deployment using the Python client, use the `client.deployments.delete(deployment_uid)` method. This method will return a SUCCESS message if the deployment was successfully deleted. You can also use the `client.deployments.list()` method to check that the deployment was removed.", "gold_doc_ids": ["docs/315971ae6c6a4eede13e9e1449b2a36f548b928f.md"]} +{"question_id": "test_18", "question": "What is an ontology?", "answer": "An ontology is an explicit formal specification of the representation of the objects, concepts, and other entities that can exist in some area of interest and the relationships among them.", "gold_doc_ids": ["docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md"]} +{"question_id": "test_19", "question": "What are the key functions of the geospatial library?", "answer": "The geospatial library includes functions to read and write data, topological functions, geohashing, indexing, ellipsoidal and routing functions. All calculated geometries are accurate without the need for projections, and the geospatial functions take advantage of the distributed processing capabilities provided by Spark. The library also includes native geohashing support for geometries used in simple aggregations and in indexing, thereby improving storage retrieval considerably. Additionally, the library supports extensions of Spark distributed joins and the SQL/MM extensions to Spark SQL.", "gold_doc_ids": ["docs/3508f0dda4ccbdbb07bd583218f4e4260dc01c0d.md"]} +{"question_id": "test_20", "question": "What is a map chart?", "answer": "A map chart is a type of chart that is commonly used to compare values and show categories across geographical regions. It is most beneficial when the data contains geographic information (countries, regions, states, counties, postal codes, and so on).", "gold_doc_ids": ["docs/f5af4bcc2d0168d2698beb2a858c24f81a476610.md"]} +{"question_id": "test_21", "question": "What versions of IBM Db2 for z/OS are supported?", "answer": "IBM Db2 for z/OS version 11 and later are supported.", "gold_doc_ids": ["docs/be7f45c3e17998a50b8414d623007ed668b37c04.md"]} +{"question_id": "test_22", "question": "What is the purpose of the Sim Eval node in IBM SPSS Modeler?", "answer": "The Sim Eval node is a terminal node that evaluates a specified field, provides a distribution of the field, and produces charts of distributions and correlations. It is primarily used to evaluate continuous fields and is designed to be used with data that was obtained from the Sim Fit and Sim Gen nodes.", "gold_doc_ids": ["docs/82546b72edbfb76f571cfd06a7009e01615fa054.md"]} +{"question_id": "test_23", "question": "What is a deterministic computing system?", "answer": "Deterministic describes a characteristic of computing systems when their outputs are completely determined by their inputs.", "gold_doc_ids": ["docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md"]} +{"question_id": "test_24", "question": "How can I search for assets across the platform?", "answer": "You can use the global search bar to search for assets across all the projects and deployment spaces to which you have access.", "gold_doc_ids": ["docs/977c81385f7825613f1edbd3c0dbf44c259ba8d7.md"]} +{"question_id": "test_25", "question": "What file types are supported by the Box connection?", "answer": "The Box connection supports Avro, CSV, Delimited text, Excel, JSON, ORC, Parquet, SAS, SAV, SHP, and XML file types.", "gold_doc_ids": ["docs/b481bde61eeba2cc6b2a0c1d9c43d8dd56ab2a08.md"]} +{"question_id": "test_26", "question": "What are the properties of the Bayes Net node in the Clementine data mining tool?", "answer": "The Bayes Net node in the Clementine data mining tool has several properties, including the ability to build a probability model by combining observed and recorded evidence with real-world knowledge, the ability to focus on Tree Augmented Naïve Bayes (TAN) and Markov Blanket networks, and the ability to use a single target field and one or more input fields. Additionally, the node can be used for classification and can be trained using existing models. The node also allows for feature selection and the use of different methods for estimating conditional probability tables and determining independence. The significance level and maximal conditioning set can also be specified. Finally, the node allows for the selection of specific fields from the dataset to be always used when building the Bayesian network.", "gold_doc_ids": ["docs/fe2254205e6dd1ee2a4ec62036ab86bc5e084f5d.md"]} +{"question_id": "test_27", "question": "What are the natural language processing tasks supported in the Watson Natural Language Processing library?", "answer": "The Watson Natural Language Processing library supports the following natural language processing tasks: language detection, syntax analysis, noun phrase extraction, keyword extraction and ranking, entity extraction, sentiment classification, and tone classification.", "gold_doc_ids": ["docs/15d57c8193b99b8525bc2999ef82ef1cd7eae8ad.md"]} +{"question_id": "test_28", "question": "What is an IBM Cloud service ID?", "answer": "A service ID is a unique identifier that is used to enable an application outside of IBM Cloud access to your IBM Cloud services. Service IDs are not tied to a specific user, and access policies can be assigned to each service ID to ensure that your application has the appropriate access for authenticating with your IBM Cloud services.", "gold_doc_ids": ["docs/abfaaf84948b090c8ea099ff44cc8cd878371073.md"]} +{"question_id": "test_29", "question": "What is sentiment analysis?", "answer": "Sentiment analysis is the examination of the sentiment or emotion expressed in text, such as determining if a movie review is positive or negative.", "gold_doc_ids": ["docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md"]} +{"question_id": "test_30", "question": "How do I create a connection to Microsoft SQL Server?", "answer": "To create a connection to Microsoft SQL Server, you will need the following connection details: the database name, hostname or IP address, either the port number or the instance name, username and password, and the SSL certificate (if required by the database server). Additionally, if the server is configured for dynamic ports, you should use the instance name. If the Microsoft SQL Server has been set up in a domain that uses NTLM (New Technology LAN Manager) authentication, you should select the \"Use Active Directory\" option and enter the name of the domain that is associated with the username and password. Finally, for private connectivity, you will need to set up a secure connection if the database is not externalized to the internet (for example, behind a firewall).", "gold_doc_ids": ["docs/7946dcf2f69a7420490a7b5ca677c2273de5764b.md"]} diff --git a/assets/seed/v2/indexes/cloudflare-state-fixed-v1/chunks.jsonl b/assets/seed/v2/indexes/cloudflare-state-fixed-v1/chunks.jsonl new file mode 100644 index 0000000..fc31d6e --- /dev/null +++ b/assets/seed/v2/indexes/cloudflare-state-fixed-v1/chunks.jsonl @@ -0,0 +1,522 @@ +{"chunk_id": "605cedc86ebbb1c5", "doc_id": "durable-objects/api/alarms.md", "text": "---\ntitle: Alarms\ndescription: Schedule future wake-ups for Durable Objects using the Alarms API with guaranteed at-least-once execution.\npcx_content_type: concept\nsidebar:\n order: 8\nproducts:\n - durable-objects\n---\n\nimport { Type, GlossaryTooltip, Tabs, TabItem } from \"~/components\";\n\n## Background\n\nDurable Objects alarms allow you to schedule the Durable Object to be woken up at a time in the future. When the alarm's scheduled time comes, the `alarm()` handler method will be called. Alarms are modified using the Storage API, and alarm operations follow the same rules as other storage operations.\n\nNotably:\n\n- Each Durable Object is able to schedule a single alarm at a time by calling `setAlarm()`.\n- Alarms have guaranteed at-least-on", "char_start": 0, "char_end": 800, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "b18a8eb2651602c3", "doc_id": "durable-objects/api/alarms.md", "text": "urable Object is able to schedule a single alarm at a time by calling `setAlarm()`.\n- Alarms have guaranteed at-least-once execution and are retried automatically when the `alarm()` handler throws.\n- Retries are performed using exponential backoff starting at a 2 second delay from the first failure with up to 6 retries allowed.\n\n:::note[How are alarms different from Cron Triggers?]\n\nAlarms are more fine grained than [Cron Triggers](/workers/configuration/cron-triggers/). A Worker can have up to three Cron Triggers configured at once, but it can have an unlimited amount of Durable Objects, each of which can have an alarm set.\n\nAlarms are directly scheduled from within your Durable Object. Cron Triggers, on the other hand, are not programmatic. [Cron Triggers](/workers/configuration/cron-tri", "char_start": 680, "char_end": 1480, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "cff4ca07d66fb846", "doc_id": "durable-objects/api/alarms.md", "text": " Durable Object. Cron Triggers, on the other hand, are not programmatic. [Cron Triggers](/workers/configuration/cron-triggers/) execute based on their schedules, which have to be configured through the Cloudflare dashboard or API.\n\n:::\n\nAlarms can be used to build distributed primitives, like queues or batching of work atop Durable Objects. Alarms also provide a mechanism to guarantee that operations within a Durable Object will complete without relying on incoming requests to keep the Durable Object alive. For a complete example, refer to [Use the Alarms API](/durable-objects/examples/alarms-api/).\n\n## Scheduling multiple events with a single alarm\n\nAlthough each Durable Object can only have one alarm set at a time, you can manage many scheduled and recurring events by storing your event ", "char_start": 1360, "char_end": 2160, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "cfd0aefacb26c75f", "doc_id": "durable-objects/api/alarms.md", "text": " Object can only have one alarm set at a time, you can manage many scheduled and recurring events by storing your event schedule in storage and having the `alarm()` handler process due events, then reschedule itself for the next one.\n\n```js\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport class AgentServer extends DurableObject {\n // Schedule a one-time or recurring event\n async scheduleEvent(id, runAt, repeatMs = null) {\n await this.ctx.storage.put(`event:${id}`, { id, runAt, repeatMs });\n const currentAlarm = await this.ctx.storage.getAlarm();\n if (!currentAlarm || runAt < currentAlarm) {\n await this.ctx.storage.setAlarm(runAt);\n }\n }\n\n async alarm() {\n const now = Date.now();\n const events = await this.ctx.storage.list({ prefix: \"event:\" });\n let", "char_start": 2040, "char_end": 2840, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "c2a6882ec52cbed6", "doc_id": "durable-objects/api/alarms.md", "text": "sync alarm() {\n const now = Date.now();\n const events = await this.ctx.storage.list({ prefix: \"event:\" });\n let nextAlarm = null;\n\n for (const [key, event] of events) {\n if (event.runAt <= now) {\n await this.processEvent(event);\n if (event.repeatMs) {\n event.runAt = now + event.repeatMs;\n await this.ctx.storage.put(key, event);\n } else {\n await this.ctx.storage.delete(key);\n }\n }\n // Track the next event time\n if (event.runAt > now && (!nextAlarm || event.runAt < nextAlarm)) {\n nextAlarm = event.runAt;\n }\n }\n\n if (nextAlarm) await this.ctx.storage.setAlarm(nextAlarm);\n }\n\n async processEvent(event) {\n // Your event handling logic here\n }\n}\n```\n\n## Storage methods\n\n### `getAlarm`\n\n", "char_start": 2720, "char_end": 3520, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "951e8d688c224d6d", "doc_id": "durable-objects/api/alarms.md", "text": " }\n\n async processEvent(event) {\n // Your event handling logic here\n }\n}\n```\n\n## Storage methods\n\n### `getAlarm`\n\n- getAlarm(): \n\n - If there is an alarm set, then return the currently set alarm time as the number of milliseconds elapsed since the UNIX epoch. Otherwise, return `null`.\n\n - If `getAlarm` is called while an [`alarm`](/durable-objects/api/alarms/#alarm) is already running, it returns `null` unless `setAlarm` has also been called since the alarm handler started running.\n\n### `setAlarm`\n\n- setAlarm(scheduledTimeMs ) : \n\n - Set the time for the alarm to run. Specify the time as the number of milliseconds elapsed since the UNIX epoch.\n - If you call `setAlarm` when there is ", "char_start": 3400, "char_end": 4200, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "41db25117c24e0ae", "doc_id": "durable-objects/api/alarms.md", "text": ". Specify the time as the number of milliseconds elapsed since the UNIX epoch.\n - If you call `setAlarm` when there is already one scheduled, it will override the existing alarm.\n\n:::caution[Calling `setAlarm` inside the constructor]\nIf you wish to call `setAlarm` inside the constructor of a Durable Object, ensure that you are first checking whether an alarm has already been set.\n\nThis is due to the fact that, if the Durable Object wakes up after being inactive, the constructor is invoked before the [`alarm` handler](/durable-objects/api/alarms/#alarm). Therefore, if the constructor calls `setAlarm`, it could interfere with the next alarm which has already been set.\n:::\n\n### `deleteAlarm`\n\n- `deleteAlarm()`: \n\n - Unset the alarm if there is a currently set alarm.\n\n -", "char_start": 4080, "char_end": 4880, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "6b0e585e64edc106", "doc_id": "durable-objects/api/alarms.md", "text": "\n### `deleteAlarm`\n\n- `deleteAlarm()`: \n\n - Unset the alarm if there is a currently set alarm.\n\n - Calling `deleteAlarm()` inside the `alarm()` handler may prevent retries on a best-effort basis, but is not guaranteed.\n\n## Handler methods\n\n### `alarm`\n\n- alarm(alarmInfo ): \n\n - Called by the system when a scheduled alarm time is reached.\n\n - The optional parameter `alarmInfo` object has two properties:\n\n - `retryCount` : The number of times this alarm event has been retried.\n - `isRetry` : A boolean value to indicate if the alarm has been retried. This value is `true` if this alarm event is a retry.\n\n - Only one instance of `alarm()` will ever run at a given time", "char_start": 4760, "char_end": 5560, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "b1022706b06de01c", "doc_id": "durable-objects/api/alarms.md", "text": ". This value is `true` if this alarm event is a retry.\n\n - Only one instance of `alarm()` will ever run at a given time per Durable Object instance.\n - The `alarm()` handler has guaranteed at-least-once execution and will be retried upon failure using exponential backoff, starting at 2 second delays for up to 6 retries. This only applies to the most recent `setAlarm()` call. Retries will be performed if the method fails with an uncaught exception.\n\n - This method can be `async`.\n\n:::note[Catching exceptions in alarm handlers]\n\nBecause alarms are only retried up to 6 times on error, it's recommended to catch any exceptions inside your `alarm()` handler and schedule a new alarm before returning if you want to make sure your alarm handler will be retried indefinitely. Otherwise, a sufficie", "char_start": 5440, "char_end": 6240, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "a4a05b49c7cb961f", "doc_id": "durable-objects/api/alarms.md", "text": "w alarm before returning if you want to make sure your alarm handler will be retried indefinitely. Otherwise, a sufficiently long outage in a downstream service that you depend on or a bug in your code that goes unfixed for hours can exhaust the limited number of retries, causing the alarm to not be re-run in the future until the next time you call `setAlarm`.\n\n:::\n\n## Example\n\nThis example shows how to both set alarms with the `setAlarm(timestamp)` method and handle alarms with the `alarm()` handler within your Durable Object.\n\n- The `alarm()` handler will be called once every time an alarm fires.\n- If an unexpected error terminates the Durable Object, the `alarm()` handler may be re-instantiated on another machine.\n- Following a short delay, the `alarm()` handler will run from the beginn", "char_start": 6120, "char_end": 6920, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "e835a1c13d15ab25", "doc_id": "durable-objects/api/alarms.md", "text": "ler may be re-instantiated on another machine.\n- Following a short delay, the `alarm()` handler will run from the beginning on the other machine.\n\n\n\n\n\n```js\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport default {\n\tasync fetch(request, env) {\n\t\treturn await env.ALARM_EXAMPLE.getByName(\"foo\").fetch(request);\n\t},\n};\n\nconst SECONDS = 1000;\n\nexport class AlarmExample extends DurableObject {\n\tconstructor(ctx, env) {\n\t\tsuper(ctx, env);\n\t\tthis.storage = ctx.storage;\n\t}\n\tasync fetch(request) {\n\t\t// If there is no alarm currently set, set one for 10 seconds from now\n\t\tlet currentAlarm = await this.storage.getAlarm();\n\t\tif (currentAlarm == null) {\n\t\t\tthis.storage.setAlarm(Date.now() + 10 * SECONDS);\n\t\t}\n\t}\n\tasync alarm() {\n\t\t// Th", "char_start": 6800, "char_end": 7600, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "3f667e8373b3bcf6", "doc_id": "durable-objects/api/alarms.md", "text": "rm();\n\t\tif (currentAlarm == null) {\n\t\t\tthis.storage.setAlarm(Date.now() + 10 * SECONDS);\n\t\t}\n\t}\n\tasync alarm() {\n\t\t// The alarm handler will be invoked whenever an alarm fires.\n\t\t// You can use this to do work, read from the Storage API, make HTTP calls\n\t\t// and set future alarms to run using this.storage.setAlarm() from within this handler.\n\t}\n}\n```\n\n\n\n\n\n```python\nimport time\n\nfrom workers import DurableObject, WorkerEntrypoint\n\nclass Default(WorkerEntrypoint):\n async def fetch(self, request):\n return await self.env.ALARM_EXAMPLE.getByName(\"foo\").fetch(request)\n\nSECONDS = 1000\n\nclass AlarmExample(DurableObject):\n def __init__(self, ctx, env):\n super().__init__(ctx, env)\n self.storage = ctx.storage\n\n async d", "char_start": 7480, "char_end": 8280, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "d0276c3be30e2f4f", "doc_id": "durable-objects/api/alarms.md", "text": "t):\n def __init__(self, ctx, env):\n super().__init__(ctx, env)\n self.storage = ctx.storage\n\n async def fetch(self, request):\n # If there is no alarm currently set, set one for 10 seconds from now\n current_alarm = await self.storage.getAlarm()\n if current_alarm is None:\n self.storage.setAlarm(int(time.time() * 1000) + 10 * SECONDS)\n\n async def alarm(self):\n # The alarm handler will be invoked whenever an alarm fires.\n # You can use this to do work, read from the Storage API, make HTTP calls\n # and set future alarms to run using self.storage.setAlarm() from within this handler.\n pass\n```\n\n\n\n\n\nThe following example shows how to use the `alarmInfo` property to identify if the alarm event has bee", "char_start": 8160, "char_end": 8960, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "c3de7dd0f887ff6c", "doc_id": "durable-objects/api/alarms.md", "text": "abItem>\n\n\n\nThe following example shows how to use the `alarmInfo` property to identify if the alarm event has been attempted before.\n\n\n\n\n\n```js\nclass MyDurableObject extends DurableObject {\n\tasync alarm(alarmInfo) {\n\t\tif (alarmInfo?.retryCount != 0) {\n\t\t\tconsole.log(\n\t\t\t\t\"This alarm event has been attempted ${alarmInfo?.retryCount} times before.\",\n\t\t\t);\n\t\t}\n\t}\n}\n```\n\n\n\n\n\n```python\nclass MyDurableObject(DurableObject):\n async def alarm(self, alarm_info):\n if alarm_info and alarm_info.get('retryCount', 0) != 0:\n print(f\"This alarm event has been attempted {alarm_info.get('retryCount')} times before.\")\n```\n\n\n\n\n\n## Related resources\n\n- Under", "char_start": 8840, "char_end": 9640, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "2eef773b5cd39bee", "doc_id": "durable-objects/api/alarms.md", "text": "as been attempted {alarm_info.get('retryCount')} times before.\")\n```\n\n\n\n\n\n## Related resources\n\n- Understand how to [use the Alarms API](/durable-objects/examples/alarms-api/) in an end-to-end example.\n- Read the [Durable Objects alarms announcement blog post](https://blog.cloudflare.com/durable-objects-alarms/).\n- Review the [Storage API](/durable-objects/api/sqlite-storage-api/) documentation for Durable Objects.\n", "char_start": 9520, "char_end": 9956, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "8fe6291da8e57ac8", "doc_id": "durable-objects/api/state.md", "text": "---\ntitle: Durable Object State\ndescription: API reference for DurableObjectState, which controls concurrency, WebSocket attachment, and storage access.\npcx_content_type: concept\nsidebar:\n order: 5\nproducts:\n - durable-objects\n---\n\nimport { Tabs, TabItem, GlossaryTooltip, Type, MetaInfo } from \"~/components\";\n\n## Description\n\nThe `DurableObjectState` interface is accessible as an instance property on the Durable Object class. This interface encapsulates methods that modify the state of a Durable Object, for example which WebSockets are attached to a Durable Object or how the runtime should handle concurrent Durable Object requests.\n\nThe `DurableObjectState` interface is different from the S", "char_start": 0, "char_end": 800, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "db195d22573714cb", "doc_id": "durable-objects/api/state.md", "text": "Durable Object requests.\n\nThe `DurableObjectState` interface is different from the Storage API in that it does not have top-level methods which manipulate persistent application data. These methods are instead encapsulated in the [`DurableObjectStorage`](/durable-objects/api/sqlite-storage-api/) interface and accessed by [`DurableObjectState::storage`](/durable-objects/api/state/#storage).\n\n \n\n```js\nimport { DurableObject } from \"cloudflare:workers\";\n\n// Durable Object\nexport class MyDurableObject extends DurableObject {\n // DurableObjectState is accessible via the ctx instance property\n\tconstructor(ctx, env) {\n\t\tsuper(ctx, env);\n\t}\n ...\n}\n```\n\n \n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n MY_DURABLE_OBJECT: DurableObjectNamespace;\n}\n\n// Durable Object\nexport class MyDurableObject extends DurableObject {\n // DurableObjectState is accessible via the ctx instance property\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\t}\n ...\n}\n```\n\n\n\n\n\n```python\nfrom workers import DurableObject\n\n# Durable Object\nclass MyDurableObject(DurableObject):\n # DurableObjectState is accessible via the ctx instance property\n def __init__(self, ctx, env):\n super().__init__(ct", "char_start": 1360, "char_end": 2160, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "db7c37d3f61974d2", "doc_id": "durable-objects/api/state.md", "text": "# DurableObjectState is accessible via the ctx instance property\n def __init__(self, ctx, env):\n super().__init__(ctx, env)\n # ...\n```\n\n\n\n\n\n## Methods and Properties\n\n### `exports`\n\nContains loopback bindings to the Worker's own top-level exports. This has exactly the same meaning as [`ExecutionContext`'s `ctx.exports`](/workers/runtime-apis/context/#exports).\n\n### `waitUntil`\n\n`waitUntil` is available on `DurableObjectState` for API compatibility with [Workers Runtime APIs](/workers/runtime-apis/context/#waituntil).\n\n:::note[`waitUntil` has no effect in Durable Objects]\n\nUnlike in Workers, `waitUntil` has no effect in Durable Objects. It does not extend the lifetime of a Durable Object or affect when a request or RPC completes.\n\nDurable Objects automatically remain a", "char_start": 2040, "char_end": 2840, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "81fcc7eee25a8997", "doc_id": "durable-objects/api/state.md", "text": "tend the lifetime of a Durable Object or affect when a request or RPC completes.\n\nDurable Objects automatically remain active as long as there is ongoing work or pending I/O, so `waitUntil` is not needed. Refer to [Lifecycle of a Durable Object](/durable-objects/concepts/durable-object-lifecycle/) for more information.\n:::\n\n#### Parameters\n\n- A required promise of any type.\n\n#### Return values\n\n- None.\n\n### `blockConcurrencyWhile`\n\n`blockConcurrencyWhile` executes an async callback while blocking any other events from being delivered to the Durable Object until the callback completes. This method guarantees ordering and prevents concurrent requests. All events that were not explicitly initiated as part of the callback itself will be blocked. Once the callback completes, all other events wi", "char_start": 2720, "char_end": 3520, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "8bbe582da9711bcf", "doc_id": "durable-objects/api/state.md", "text": "ot explicitly initiated as part of the callback itself will be blocked. Once the callback completes, all other events will be delivered.\n\n- `blockConcurrencyWhile` is commonly used within the constructor of the Durable Object class to enforce initialization to occur before any requests are delivered.\n- Another use case is executing `async` operations based on the current state of the Durable Object and using `blockConcurrencyWhile` to prevent that state from changing while yielding the event loop.\n- If the callback throws an exception, the object will be terminated and reset. This ensures that the object cannot be left stuck in an uninitialized state if something fails unexpectedly.\n- To avoid this behavior, enclose the body of your callback in a `try...catch` block to ensure it cannot thr", "char_start": 3400, "char_end": 4200, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "946bf39984267310", "doc_id": "durable-objects/api/state.md", "text": "expectedly.\n- To avoid this behavior, enclose the body of your callback in a `try...catch` block to ensure it cannot throw an exception.\n\nTo help mitigate deadlocks there is a 30 second timeout applied when executing the callback. If this timeout is exceeded, the Durable Object will be reset. It is best practice to have the callback do as little work as possible to improve overall request throughput to the Durable Object.\n\n:::note[When to use `blockConcurrencyWhile`]\n\nUse `blockConcurrencyWhile` in the constructor to run schema migrations or initialize state before any requests are processed. This ensures your Durable Object is fully ready before handling traffic.\n\nFor regular request handling, you rarely need `blockConcurrencyWhile`. SQLite storage operations are synchronous and do not yi", "char_start": 4080, "char_end": 4880, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "b00e1de9174904c3", "doc_id": "durable-objects/api/state.md", "text": "gular request handling, you rarely need `blockConcurrencyWhile`. SQLite storage operations are synchronous and do not yield the event loop, so they execute atomically without it. For asynchronous KV storage operations, input gates already prevent other requests from interleaving during storage calls.\n\nReserve `blockConcurrencyWhile` outside the constructor for cases where you make external async calls (such as `fetch()`) and cannot tolerate state changes while the event loop yields.\n\n:::\n\n\n\n\n\n```js\n// Durable Object\nexport class MyDurableObject extends DurableObject {\n\tinitialized = false;\n\n\tconstructor(ctx, env) {\n\t\tsuper(ctx, env);\n\n\t\t// blockConcurrencyWhile will ensure that initialized will always be true\n\t\tthis.ctx.blockConcurre", "char_start": 4760, "char_end": 5560, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "7ea281402ae6da0b", "doc_id": "durable-objects/api/state.md", "text": "\t\tsuper(ctx, env);\n\n\t\t// blockConcurrencyWhile will ensure that initialized will always be true\n\t\tthis.ctx.blockConcurrencyWhile(async () => {\n\t\t\tthis.initialized = true;\n\t\t});\n\t}\n ...\n}\n```\n\n\n\n\n\n```python\n# Durable Object\nclass MyDurableObject(DurableObject):\n\tdef __init__(self, ctx, env):\n\t\tsuper().__init__(ctx, env)\n\t\tself.initialized = False\n\n\t\t# blockConcurrencyWhile will ensure that initialized will always be true\n\t\tasync def set_initialized():\n\t\t\tself.initialized = True\n\t\tself.ctx.blockConcurrencyWhile(set_initialized)\n\t# ...\n```\n\n\n\n\n\n#### Parameters\n\n- A required callback which returns a `Promise`.\n\n#### Return values\n\n- A `Promise` returned by the callback.\n\n### `acceptWebSocket`\n\n`acceptWebSocket` is par", "char_start": 5440, "char_end": 6240, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "977908ae4923c262", "doc_id": "durable-objects/api/state.md", "text": "se`.\n\n#### Return values\n\n- A `Promise` returned by the callback.\n\n### `acceptWebSocket`\n\n`acceptWebSocket` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected.\n\n`acceptWebSocket` adds a WebSocket to the set of WebSockets attached to the Durable Object. Once called, any incoming messages will be delivered by calling the Durable Object's `webSocketMessage` handler, and `webSocketClose` will be invoked upon disconnect. After calling `acceptWebSocket`, the WebSocket is accepted and its `send` and `close` methods can be used.\n\nThe [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#d", "char_start": 6120, "char_end": 6920, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "06b08842d30858b4", "doc_id": "durable-objects/api/state.md", "text": "s `send` and `close` methods can be used.\n\nThe [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api) takes the place of the standard [WebSockets API](/workers/runtime-apis/websockets/). Therefore, `ws.accept` must not have been called separately and `ws.addEventListener` method will not receive events as they will instead be delivered to the Durable Object.\n\nThe WebSocket Hibernation API permits a maximum of 32,768 WebSocket connections per Durable Object, but the CPU and memory usage of a given workload may further limit the practical number of simultaneous connections.\n\n#### Parameters\n\n- A required `WebSocket` with name `ws`.\n- An optional `Array` of associated tags. Tags can be used to retrieve WebSockets via [`Durabl", "char_start": 6800, "char_end": 7600, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "2d071914a4bb05cb", "doc_id": "durable-objects/api/state.md", "text": "` with name `ws`.\n- An optional `Array` of associated tags. Tags can be used to retrieve WebSockets via [`DurableObjectState::getWebSockets`](/durable-objects/api/state/#getwebsockets). Each tag is a maximum of 256 characters and there can be at most 10 tags associated with a WebSocket.\n\n#### Return values\n\n- None.\n\n### `getWebSockets`\n\n`getWebSockets` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected.\n\n`getWebSockets` returns an `Array` which is the set of WebSockets attached to the Durable Object. An optional tag argument can be used to filter the list according to tags supplied whe", "char_start": 7480, "char_end": 8280, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "cd60cc481979df1d", "doc_id": "durable-objects/api/state.md", "text": "s attached to the Durable Object. An optional tag argument can be used to filter the list according to tags supplied when calling [`DurableObjectState::acceptWebSocket`](/durable-objects/api/state/#acceptwebsocket).\n\n:::note[`waitUntil` is not necessary]\n\nDisconnected WebSockets are not returned by this method, but `getWebSockets` may still return WebSockets even after `ws.close` has been called. For example, if the server-side WebSocket sends a close, but does not receive one back (and has not detected a disconnect from the client), then the connection is in the `CLOSING` readyState. The client might send more messages, so the WebSocket is technically not disconnected.\n\nWith the [`web_socket_auto_reply_to_close`](/workers/configuration/compatibility-flags/#websocket-auto-reply-to-close) c", "char_start": 8160, "char_end": 8960, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "de445ab72a8f8a5b", "doc_id": "durable-objects/api/state.md", "text": "With the [`web_socket_auto_reply_to_close`](/workers/configuration/compatibility-flags/#websocket-auto-reply-to-close) compatibility flag (enabled by default on compatibility dates on or after `2026-04-07`), the runtime automatically completes the close handshake, so WebSockets transition from `CLOSING` to `CLOSED` much faster and are less likely to be observed in the `CLOSING` state.\n\n:::\n\n#### Parameters\n\n- An optional tag of type `string`.\n\n#### Return values\n\n- An `Array`.\n\n### `setWebSocketAutoResponse`\n\n`setWebSocketAutoResponse` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected.\n\n`setW", "char_start": 8840, "char_end": 9640, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "f7fa583c6df7cb5b", "doc_id": "durable-objects/api/state.md", "text": "i), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected.\n\n`setWebSocketAutoResponse` sets an automatic response, auto-response, for the request provided for all WebSockets attached to the Durable Object. If a request is received matching the provided request then the auto-response will be returned without waking WebSockets in hibernation and incurring billable duration charges.\n\n`setWebSocketAutoResponse` is a common alternative to setting up a server for static ping/pong messages because this can be handled without waking hibernating WebSockets.\n\n#### Parameters\n\n- An optional `WebSocketRequestResponsePair(request string, response string)` enabling any WebSocket accepted via [`DurableObjectState::acceptWebSocket`](/durable-objects/a", "char_start": 9520, "char_end": 10320, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "efbbce3eef0d4873", "doc_id": "durable-objects/api/state.md", "text": "string, response string)` enabling any WebSocket accepted via [`DurableObjectState::acceptWebSocket`](/durable-objects/api/state/#acceptwebsocket) to automatically reply to the provided response when it receives the provided request. Both request and response are limited to 2,048 characters each. If the parameter is omitted, any previously set auto-response configuration will be removed. [`DurableObjectState::getWebSocketAutoResponseTimestamp`](/durable-objects/api/state/#getwebsocketautoresponsetimestamp) will still reflect the last timestamp that an auto-response was sent.\n\n#### Return values\n\n- None.\n\n### `getWebSocketAutoResponse`\n\n`getWebSocketAutoResponse` returns the `WebSocketRequestResponsePair` object last set by [`DurableObjectState::setWebSocketAutoResponse`](/durable-objects/a", "char_start": 10200, "char_end": 11000, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "67e81fee3a8217f9", "doc_id": "durable-objects/api/state.md", "text": "he `WebSocketRequestResponsePair` object last set by [`DurableObjectState::setWebSocketAutoResponse`](/durable-objects/api/state/#setwebsocketautoresponse), or null if not auto-response has been set.\n\n:::note[inspect `WebSocketRequestResponsePair`]\n\n`WebSocketRequestResponsePair` can be inspected further by calling `getRequest` and `getResponse` methods.\n\n:::\n\n#### Parameters\n\n- None.\n\n#### Return values\n\n- A `WebSocketRequestResponsePair` or null.\n\n### `getWebSocketAutoResponseTimestamp`\n\n`getWebSocketAutoResponseTimestamp` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected.\n\n`getWebSocketAutoResponseTi", "char_start": 10880, "char_end": 11680, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "702ef9f334888347", "doc_id": "durable-objects/api/state.md", "text": "able Object to be removed from memory to save costs while keeping its WebSockets connected.\n\n`getWebSocketAutoResponseTimestamp` gets the most recent `Date` on which the given WebSocket sent an auto-response, or null if the given WebSocket never sent an auto-response.\n\n#### Parameters\n\n- A required `WebSocket`.\n\n#### Return values\n\n- A `Date` or null.\n\n### `setHibernatableWebSocketEventTimeout`\n\n`setHibernatableWebSocketEventTimeout` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected.\n\n`setHibernatableWebSocketEventTimeout` sets the maximum amount of time in milliseconds that a WebSocket event can run fo", "char_start": 11560, "char_end": 12360, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "483d0c9dc220bb51", "doc_id": "durable-objects/api/state.md", "text": "`setHibernatableWebSocketEventTimeout` sets the maximum amount of time in milliseconds that a WebSocket event can run for.\n\nIf no parameter or a parameter of `0` is provided and a timeout has been previously set, then the timeout will be unset. The maximum value of timeout is 604,800,000 ms (7 days).\n\n#### Parameters\n\n- An optional `number`.\n\n#### Return values\n\n- None.\n\n### `getHibernatableWebSocketEventTimeout`\n\n`getHibernatableWebSocketEventTimeout` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected.\n\n`getHibernatableWebSocketEventTimeout` gets the currently set hibernatable WebSocket event timeout if", "char_start": 12240, "char_end": 13040, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "0d026cefca0a8780", "doc_id": "durable-objects/api/state.md", "text": "ockets connected.\n\n`getHibernatableWebSocketEventTimeout` gets the currently set hibernatable WebSocket event timeout if one has been set via [`DurableObjectState::setHibernatableWebSocketEventTimeout`](/durable-objects/api/state/#sethibernatablewebsocketeventtimeout).\n\n#### Parameters\n\n- None.\n\n#### Return values\n\n- A number, or null if the timeout has not been set.\n\n### `getTags`\n\n`getTags` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected.\n\n`getTags` returns tags associated with a given WebSocket. This method throws an exception if the WebSocket has not been associated with the Durable Object via [`D", "char_start": 12920, "char_end": 13720, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "df6eb99b9e92b161", "doc_id": "durable-objects/api/state.md", "text": "iven WebSocket. This method throws an exception if the WebSocket has not been associated with the Durable Object via [`DurableObjectState::acceptWebSocket`](/durable-objects/api/state/#acceptwebsocket).\n\n#### Parameters\n\n- A required `WebSocket`.\n\n#### Return values\n\n- An `Array` of tags.\n\n### `abort`\n\n`abort` is used to forcibly reset a Durable Object. A JavaScript `Error` with the message passed as a parameter will be logged. This error is not able to be caught within the application code.\n\n\n\n\n\n```js\n// Durable Object\nexport class MyDurableObject extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\t}\n\n async sayHello() {\n // Error: Hello, World! will be logged\n this.ctx.abort(", "char_start": 13600, "char_end": 14400, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "d3cf43ff4ab6c9a8", "doc_id": "durable-objects/api/state.md", "text": ", env: Env) {\n\t\tsuper(ctx, env);\n\t}\n\n async sayHello() {\n // Error: Hello, World! will be logged\n this.ctx.abort(\"Hello, World!\");\n }\n}\n```\n\n\n\n\n\n```python\n# Durable Object\nclass MyDurableObject(DurableObject):\n\tdef __init__(self, ctx, env):\n\t\tsuper().__init__(ctx, env)\n\n\tasync def say_hello(self):\n\t\t# Error: Hello, World! will be logged\n\t\tself.ctx.abort(\"Hello, World!\")\n```\n\n\n\n\n\n:::caution[Not available in local development]\n\n`abort` is not available in local development with the `wrangler dev` CLI command.\n\n:::\n\n#### Parameters\n\n- An optional `string` .\n\n#### Return values\n\n- None.\n\n## Properties\n\n### `id`\n\n`id` is a readonly property of type `DurableObjectId` corresponding to the [`DurableObjectId`](/durable-ob", "char_start": 14280, "char_end": 15080, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "b00da838064a3fab", "doc_id": "durable-objects/api/state.md", "text": "es\n\n### `id`\n\n`id` is a readonly property of type `DurableObjectId` corresponding to the [`DurableObjectId`](/durable-objects/api/id) of the Durable Object.\n\n### `storage`\n\n`storage` is a readonly property of type `DurableObjectStorage` encapsulating the [Storage API](/durable-objects/api/sqlite-storage-api/).\n\n## Related resources\n\n- [Durable Objects: Easy, Fast, Correct - Choose Three](https://blog.cloudflare.com/durable-objects-easy-fast-correct-choose-three/).\n", "char_start": 14960, "char_end": 15429, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "2f37882cf03765c7", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "---\ntitle: Invoke methods\ndescription: Call RPC methods or send fetch requests to Durable Objects using stubs from a Worker.\npcx_content_type: concept\ntags:\n - RPC\nsidebar:\n order: 2\nproducts:\n - durable-objects\n---\n\nimport { Render, Tabs, TabItem, GlossaryTooltip } from \"~/components\";\n\n## Invoking methods on a Durable Object\n\nAll new projects and existing projects with a compatibility date greater than or equal to [`2024-04-03`](/workers/configuration/compatibility-flags/#durable-object-stubs-and-service-bindings-support-rpc) should prefer to invoke [Remote Procedure Call (RPC)](/workers/runtime-apis/rpc/) methods defined on a Durable Object class.\n\nProjects requiring HTTP request/response flows or legacy projects can cont", "char_start": 0, "char_end": 800, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "ad36a545bffa5212", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "ass\">Durable Object class.\n\nProjects requiring HTTP request/response flows or legacy projects can continue to invoke the `fetch()` handler on the Durable Object class.\n\n### Invoke RPC methods\n\nBy writing a Durable Object class which inherits from the built-in type `DurableObject`, public methods on the Durable Objects class are exposed as [RPC methods](/workers/runtime-apis/rpc/), which you can call using a [DurableObjectStub](/durable-objects/api/stub) from a Worker.\n\nAll RPC calls are [asynchronous](/workers/runtime-apis/rpc/lifecycle/), accept and return [serializable types](/workers/runtime-apis/rpc/), and [propagate exceptions](/workers/runtime-apis/rpc/error-handling/) to the caller without a stack trace. Refer to [Workers RPC](/workers/runtime-apis/rpc/) for comple", "char_start": 680, "char_end": 1480, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "2cea8ee9dbde3741", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "/rpc/error-handling/) to the caller without a stack trace. Refer to [Workers RPC](/workers/runtime-apis/rpc/) for complete details.\n\n\n\n:::note\n\nWith RPC, the `DurableObject` superclass defines `ctx` and `env` as class properties. What was previously called `state` is now called `ctx` when you extend the `DurableObject` class. The name `ctx` is adopted rather than `state` for the `DurableObjectState` interface to be consistent between `DurableObject` and `WorkerEntrypoint` objects.\n\n:::\n\nRefer to [Build a Counter](/durable-objects/examples/build-a-counter/) for a complete example.\n\n### Invoking the `fetch` handler\n\nIf your project is stuck on a compatibility date before [`2024-04-03`](/workers/configuration/compatibility-flags/#durable-", "char_start": 1360, "char_end": 2160, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "d4764c048c7bb1bf", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "your project is stuck on a compatibility date before [`2024-04-03`](/workers/configuration/compatibility-flags/#durable-object-stubs-and-service-bindings-support-rpc), or has the need to send a [`Request`](/workers/runtime-apis/request/) object and return a `Response` object, then you should send requests to a Durable Object via the fetch handler.\n\n \n\n```js\nimport { DurableObject } from \"cloudflare:workers\";\n\n// Durable Object\nexport class MyDurableObject extends DurableObject {\n\tconstructor(ctx, env) {\n\t\tsuper(ctx, env);\n\t}\n\n\tasync fetch(request) {\n\t\treturn new Response(\"Hello, World!\");\n\t}\n}\n\n// Worker\nexport default {\n\tasync fetch(request, env) {\n\t\t// A stub is a client used to invoke methods on the Durable Object\n\t\tconst stub = e", "char_start": 2040, "char_end": 2840, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "be4c4a3381cd092e", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "ult {\n\tasync fetch(request, env) {\n\t\t// A stub is a client used to invoke methods on the Durable Object\n\t\tconst stub = env.MY_DURABLE_OBJECT.getByName(\"foo\");\n\n\t\t// Methods on the Durable Object are invoked via the stub\n\t\tconst response = await stub.fetch(request);\n\n\t\treturn response;\n\t},\n};\n```\n\n \n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tMY_DURABLE_OBJECT: DurableObjectNamespace;\n}\n\n// Durable Object\nexport class MyDurableObject extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\t}\n\n\tasync fetch(request: Request): Promise {\n\t\treturn new Response(\"Hello, World!\");\n\t}\n}\n\n// Worker\nexport default {\n\tasync fetch(request, e", "char_start": 2720, "char_end": 3520, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "bf884dfbcf4dc210", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "t): Promise {\n\t\treturn new Response(\"Hello, World!\");\n\t}\n}\n\n// Worker\nexport default {\n\tasync fetch(request, env) {\n\t\t// A stub is a client used to invoke methods on the Durable Object\n\t\tconst stub = env.MY_DURABLE_OBJECT.getByName(\"foo\");\n\n\t\t// Methods on the Durable Object are invoked via the stub\n\t\tconst response = await stub.fetch(request);\n\n\t\treturn response;\n\t},\n} satisfies ExportedHandler;\n```\n\n \n\nThe `URL` associated with the [`Request`](/workers/runtime-apis/request/) object passed to the `fetch()` handler of your Durable Object must be a well-formed URL, but does not have to be a publicly-resolvable hostname.\n\nWithout RPC, customers frequently construct requests which corresponded to private methods on the Durable Object and dispatch requests from ", "char_start": 3400, "char_end": 4200, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "f36253fee3562f68", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "rs frequently construct requests which corresponded to private methods on the Durable Object and dispatch requests from the `fetch` handler. RPC is obviously more ergonomic in this example.\n\n \n\n```js\nimport { DurableObject } from \"cloudflare:workers\";\n\n// Durable Object\nexport class MyDurableObject extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\t}\n\n\tprivate hello(name) {\n\t\treturn new Response(`Hello, ${name}!`);\n\t}\n\n\tprivate goodbye(name) {\n\t\treturn new Response(`Goodbye, ${name}!`);\n\t}\n\n\tasync fetch(request) {\n\t\tconst url = new URL(request.url);\n\t\tlet name = url.searchParams.get(\"name\");\n\t\tif (!name) {\n\t\t\tname = \"World\";\n\t\t}\n\n\t\tswitch (url.pathname) {\n\t\t\tcase \"/hello\":\n\t\t\t\treturn this.he", "char_start": 4080, "char_end": 4880, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "63809542286f605e", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "arams.get(\"name\");\n\t\tif (!name) {\n\t\t\tname = \"World\";\n\t\t}\n\n\t\tswitch (url.pathname) {\n\t\t\tcase \"/hello\":\n\t\t\t\treturn this.hello(name);\n\t\t\tcase \"/goodbye\":\n\t\t\t\treturn this.goodbye(name);\n\t\t\tdefault:\n\t\t\t\treturn new Response(\"Bad Request\", { status: 400 });\n\t\t}\n\t}\n}\n\n// Worker\nexport default {\n\tasync fetch(_request, env, _ctx) {\n\t\t// A stub is a client used to invoke methods on the Durable Object\n\t\tconst stub = env.MY_DURABLE_OBJECT.getByName(\"foo\");\n\n\t\t// Invoke the fetch handler on the Durable Object stub\n\t\tlet response = await stub.fetch(\"http://do/hello?name=World\");\n\n\t\treturn response;\n\t},\n};\n```\n\n \n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tMY_DURABLE_OBJECT: DurableObjectNamespace;\n}\n\n// Durable Object\nexport class MyDurableObject extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\t}\n\n\tprivate hello(name: string) {\n\t\treturn new Response(`Hello, ${name}!`);\n\t}\n\n\tprivate goodbye(name: string) {\n\t\treturn new Response(`Goodbye, ${name}!`);\n\t}\n\n\tasync fetch(request: Request): Promise {\n\t\tconst url = new URL(request.url);\n\t\tlet name = url.searchParams.get(\"name\");\n\t\tif (!name) {\n\t\t\tname = \"World\";\n\t\t}\n\n\t\tswitch (url.pathname) {\n\t\t\tcase \"/hello\":\n\t\t\t\treturn this.hello(name);\n\t\t\tcase \"/goodbye\":\n\t\t\t\treturn this.goodbye(name);\n\t\t\tdefault:\n\t\t\t\treturn new Response(\"Bad Request\", { status: 400 });\n\t\t", "char_start": 5440, "char_end": 6240, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "c1693d4b6ecd2fd4", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "\tcase \"/goodbye\":\n\t\t\t\treturn this.goodbye(name);\n\t\t\tdefault:\n\t\t\t\treturn new Response(\"Bad Request\", { status: 400 });\n\t\t}\n\t}\n}\n\n// Worker\nexport default {\n\tasync fetch(_request, env, _ctx) {\n\t\t// A stub is a client used to invoke methods on the Durable Object\n\t\tconst stub = env.MY_DURABLE_OBJECT.getByName(\"foo\");\n\n\t\t// Invoke the fetch handler on the Durable Object stub\n\t\tlet response = await stub.fetch(\"http://do/hello?name=World\");\n\n\t\treturn response;\n\t},\n} satisfies ExportedHandler;\n```\n\n \n", "char_start": 6120, "char_end": 6640, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "d6630a7594780d98", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "---\ntitle: Rules of Durable Objects\ndescription: Design guidelines for building correct and effective Durable Objects applications, covering when and how to use them.\npcx_content_type: concept\nsidebar:\n order: 1\nproducts:\n - durable-objects\n---\n\nimport { WranglerConfig, TypeScriptExample, Render } from \"~/components\";\n\nDurable Objects provide a powerful primitive for building stateful, coordinated applications. Each Durable Object is a single-threaded, globally-unique instance with its own persistent storage. Understanding how to design around these properties is essential for building effective applications.\n\nThis is a guidebook on how to build more effective and correct Durable Object applications.\n\n## When to use Durable Objects\n\n### Use Durable Objects for stateful coordination, not ", "char_start": 0, "char_end": 800, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "810dccad13820273", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "ct Durable Object applications.\n\n## When to use Durable Objects\n\n### Use Durable Objects for stateful coordination, not stateless request handling\n\nWorkers are stateless functions: each request may run on a different instance, in a different location, with no shared memory between requests. Durable Objects are stateful compute: each instance has a unique identity, runs in a single location, and maintains state across requests.\n\nUse Durable Objects when you need:\n\n- **Coordination** \u2014 Multiple clients need to interact with shared state (chat rooms, multiplayer games, collaborative documents)\n- **Strong consistency** \u2014 Operations must be serialized to avoid race conditions (inventory management, booking systems, turn-based games)\n- **Per-entity storage** \u2014 Each user, tenant, or resource need", "char_start": 680, "char_end": 1480, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "81ebb6c2b7bb2d51", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "(inventory management, booking systems, turn-based games)\n- **Per-entity storage** \u2014 Each user, tenant, or resource needs its own isolated database (multi-tenant SaaS, per-user data)\n- **Persistent connections** \u2014 Long-lived WebSocket connections that survive across requests (real-time notifications, live updates)\n- **Scheduled work per entity** \u2014 Each entity needs its own timer or scheduled task (subscription renewals, game timeouts)\n\nUse plain Workers when you need:\n\n- **Stateless request handling** \u2014 API endpoints, proxies, or transformations with no shared state\n- **Maximum global distribution** \u2014 Requests should be handled at the nearest edge location\n- **High fan-out** \u2014 Each request is independent and can be processed in parallel\n\n\n```ts\nimport", "char_start": 1360, "char_end": 2160, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "b001d14f87ea16cb", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "t** \u2014 Each request is independent and can be processed in parallel\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tBOOKING: DurableObjectNamespace;\n}\n\n// \u2705 Good use of Durable Objects: Seat booking requires coordination\n// All booking requests for a venue must be serialized to prevent double-booking\nexport class SeatBooking extends DurableObject {\nasync bookSeat(\nseatId: string,\nuserId: string\n): Promise<{ success: boolean; message: string }> {\n// Check if seat is already booked\nconst existing = this.ctx.storage.sql\n.exec<{ user_id: string }>(\n\"SELECT user_id FROM bookings WHERE seat_id = ?\",\nseatId\n)\n.toArray();\n\n \tif (existing.length > 0) {\n \t\treturn { success: false, message: \"Seat alread", "char_start": 2040, "char_end": 2840, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "806ebd515d54ffcc", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "seat_id = ?\",\nseatId\n)\n.toArray();\n\n \tif (existing.length > 0) {\n \t\treturn { success: false, message: \"Seat already booked\" };\n \t}\n\n \t// Book the seat - this is safe because Durable Objects are single-threaded\n \tthis.ctx.storage.sql.exec(\n \t\t\"INSERT INTO bookings (seat_id, user_id, booked_at) VALUES (?, ?, ?)\",\n \t\tseatId,\n \t\tuserId,\n \t\tDate.now()\n \t);\n\n \treturn { success: true, message: \"Seat booked successfully\" };\n }\n}\n\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\tconst url = new URL(request.url);\n\t\tconst eventId = url.searchParams.get(\"event\") ?? \"default\";\n\n \t// Route to a Durable Object by event ID\n \t// All bookings for the same event go to the same instance\n \tconst id = env.BOOKING.idFromName(eventId);\n ", "char_start": 2720, "char_end": 3520, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "e43a56a0fdee15f8", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "nt ID\n \t// All bookings for the same event go to the same instance\n \tconst id = env.BOOKING.idFromName(eventId);\n \tconst booking = env.BOOKING.get(id);\n\n \tconst { seatId, userId } = await request.json<{\n \t\tseatId: string;\n \t\tuserId: string;\n \t}>();\n \tconst result = await booking.bookSeat(seatId, userId);\n\n \treturn Response.json(result, {\n \t\tstatus: result.success ? 200 : 409,\n \t});\n },\n};\n```\n\n\nA common pattern is to use Workers as the stateless entry point that routes requests to Durable Objects when coordination is needed. The Worker handles authentication, validation, and response formatting, while the Durable Object handles the stateful logic.\n\n## Design and sharding\n\n### Model your Durable Objects around your \"atom\" of coordinati", "char_start": 3400, "char_end": 4200, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "0d58dae7a0d3aac8", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "ect handles the stateful logic.\n\n## Design and sharding\n\n### Model your Durable Objects around your \"atom\" of coordination\n\nThe most important design decision is choosing what each Durable Object represents. Create one Durable Object per logical unit that needs coordination: a chat room, a game session, a document, a user's data, or a tenant's workspace.\n\nThis is the key insight that makes Durable Objects powerful. Instead of a shared database with locks, each \"atom\" of your application gets its own single-threaded execution environment with private storage.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\n// Each chat room is its own Durable Object instance\nexport cla", "char_start": 4080, "char_end": 4880, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "479a228198e1a749", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "e Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\n// Each chat room is its own Durable Object instance\nexport class ChatRoom extends DurableObject {\n\tasync sendMessage(userId: string, message: string) {\n\t\t// All messages to this room are processed sequentially by this single instance.\n\t\t// No race conditions, no distributed locks needed.\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?)\",\n\t\t\tuserId,\n\t\t\tmessage,\n\t\t\tDate.now()\n\t\t);\n\t}\n}\n\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\tconst url = new URL(request.url);\n\t\tconst roomId = url.searchParams.get(\"room\") ?? \"lobby\";\n\n\t\t// Each room ID maps to exactly one Durable Object instance globally\n\t\tconst id = env.CHAT_ROOM.idFromName(roomId);\n\t\tco", "char_start": 4760, "char_end": 5560, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "05baa7ddbae22f6b", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "// Each room ID maps to exactly one Durable Object instance globally\n\t\tconst id = env.CHAT_ROOM.idFromName(roomId);\n\t\tconst stub = env.CHAT_ROOM.get(id);\n\n\t\tawait stub.sendMessage(\"user-123\", \"Hello, room!\");\n\t\treturn new Response(\"Message sent\");\n\t},\n};\n```\n\n\n\n:::note\n\nIf you have global application or user configuration that you need to access frequently (on every request), consider using [Workers KV](/kv/) instead.\n\n:::\n\nDo not create a single \"global\" Durable Object that handles all requests:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\n// \ud83d\udd34 Bad: A single Durable Object handling ALL chat rooms\nexport class ChatRoom extends DurableObject", "char_start": 5440, "char_end": 6240, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "26679750324275bf", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "ChatRoom>;\n}\n\n// \ud83d\udd34 Bad: A single Durable Object handling ALL chat rooms\nexport class ChatRoom extends DurableObject {\nasync sendMessage(roomId: string, userId: string, message: string) {\n// All messages for ALL rooms go through this single instance.\n// This becomes a bottleneck as traffic grows.\nthis.ctx.storage.sql.exec(\n\"INSERT INTO messages (room_id, user_id, content) VALUES (?, ?, ?)\",\nroomId,\nuserId,\nmessage\n);\n}\n}\n\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\t// \ud83d\udd34 Bad: Always using the same ID means one global instance\n\t\tconst id = env.CHAT_ROOM.idFromName(\"global\");\n\t\tconst stub = env.CHAT_ROOM.get(id);\n\n \tawait stub.sendMessage(\"room-123\", \"user-456\", \"Hello!\");\n \treturn new Response(\"Sent\");\n },\n};\n\n```\n\n\n### Me", "char_start": 6120, "char_end": 6920, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "3894ea2578d1a6c3", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "Message(\"room-123\", \"user-456\", \"Hello!\");\n \treturn new Response(\"Sent\");\n },\n};\n\n```\n\n\n### Message throughput limits\n\nA single Durable Object can handle approximately **500-1,000 requests per second** for simple operations. This limit varies based on the work performed per request:\n\n| Operation type | Throughput |\n|----------------|------------|\n| Simple pass-through (minimal parsing) | ~1,000 req/sec |\n| Moderate processing (JSON parsing, validation) | ~500-750 req/sec |\n| Complex operations (transformation, storage writes) | ~200-500 req/sec |\n\nWhen modeling your \"atom,\" factor in the expected request rate. If your use case exceeds these limits, shard your workload across multiple Durable Objects.\n\nFor example, consider a real-time game with 50,000 concurrent p", "char_start": 6800, "char_end": 7600, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "081133235ebfa324", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "s, shard your workload across multiple Durable Objects.\n\nFor example, consider a real-time game with 50,000 concurrent players sending 10 updates per second. This generates 500,000 requests per second total. You would need 500-1,000 game session Durable Objects\u2014not one global coordinator.\n\nCalculate your sharding requirements:\n\n```\n\nRequired DOs = (Total requests/second) / (Requests per DO capacity)\n\n```\n\n### Use deterministic IDs for predictable routing\n\nUse `getByName()` with meaningful, deterministic strings for consistent routing. The same input always produces the same Durable Object ID, ensuring requests for the same logical entity always reach the same instance.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {", "char_start": 7480, "char_end": 8280, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "a2807c49ff9acb54", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "TypeScriptExample filename=\"index.ts\">\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tGAME_SESSION: DurableObjectNamespace;\n}\n\nexport class GameSession extends DurableObject {\n\tasync join(playerId: string) {\n\t\t// Game logic here\n\t}\n}\n\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\tconst url = new URL(request.url);\n\t\tconst gameId = url.searchParams.get(\"game\");\n\n\t\tif (!gameId) {\n\t\t\treturn new Response(\"Missing game ID\", { status: 400 });\n\t\t}\n\n\t\t// \u2705 Good: Deterministic ID from a meaningful string\n\t\t// All requests for \"game-abc123\" go to the same Durable Object\n\t\tconst stub = env.GAME_SESSION.getByName(gameId);\n\n\t\tawait stub.join(\"player-xyz\");\n\t\treturn new Response(\"Joined game\");\n\t},\n};\n```\n\n\n\nCreating a stub does not instantiate or wake up the Durable Object. The Durable Object is only activated when you call a method on the stub.\n\nUse `newUniqueId()` only when you need a new, random instance and will store the mapping externally:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tGAME_SESSION: DurableObjectNamespace;\n}\n\nexport class GameSession extends DurableObject {\n\tasync join(playerId: string) {\n\t\t// Game logic here\n\t}\n}\n\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\t// newUniqueId() creates a random ID - useful when cr", "char_start": 8840, "char_end": 9640, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "e1bdebd34b00174e", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\t// newUniqueId() creates a random ID - useful when creating new instances\n\t\t// You must store this ID somewhere (e.g., D1) to find it again later\n\t\tconst id = env.GAME_SESSION.newUniqueId();\n\t\tconst stub = env.GAME_SESSION.get(id);\n\n \t// Store the mapping: gameCode -> id.toString()\n \t// await env.DB.prepare(\"INSERT INTO games (code, do_id) VALUES (?, ?)\").bind(gameCode, id.toString()).run();\n\n \treturn Response.json({ gameId: id.toString() });\n },\n};\n\n```\n\n\n### Use parent-child relationships for related entities\n\nDo not put all your data in a single Durable Object. When you have hierarchical data (workspaces containing projects, game servers managing matches), create separate child Durable Obj", "char_start": 9520, "char_end": 10320, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "a9be732a9023a067", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "ave hierarchical data (workspaces containing projects, game servers managing matches), create separate child Durable Objects for each entity. The parent coordinates and tracks children, while children handle their own state independently.\n\nThis enables parallelism: operations on different children can happen concurrently, while each child maintains its own single-threaded consistency ([read more about this pattern](/reference-architecture/diagrams/storage/durable-object-control-data-plane-pattern/)).\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tGAME_SERVER: DurableObjectNamespace;\n\tGAME_MATCH: DurableObjectNamespace;\n}\n\n// Parent: Coordinates matches, but doesn't store match data\nexport cl", "char_start": 10200, "char_end": 11000, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "bbb98100b90d88d3", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "GAME_MATCH: DurableObjectNamespace;\n}\n\n// Parent: Coordinates matches, but doesn't store match data\nexport class GameServer extends DurableObject {\n\tasync createMatch(matchName: string): Promise {\n\t\tconst matchId = crypto.randomUUID();\n\n\t\t// Store reference to the child in parent's database\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"INSERT INTO matches (id, name, created_at) VALUES (?, ?, ?)\",\n\t\t\tmatchId,\n\t\t\tmatchName,\n\t\t\tDate.now()\n\t\t);\n\n\t\t// Initialize the child Durable Object\n\t\tconst childId = this.env.GAME_MATCH.idFromName(matchId);\n\t\tconst childStub = this.env.GAME_MATCH.get(childId);\n\t\tawait childStub.init(matchId, matchName);\n\n\t\treturn matchId;\n\t}\n\n\tasync listMatches(): Promise<{ id: string; name: string }[]> {\n\t\t// Parent knows about all matches without waking up each", "char_start": 10880, "char_end": 11680, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "c2754497b973acd1", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "sync listMatches(): Promise<{ id: string; name: string }[]> {\n\t\t// Parent knows about all matches without waking up each child\n\t\tconst cursor = this.ctx.storage.sql.exec<{ id: string; name: string }>(\n\t\t\t\"SELECT id, name FROM matches ORDER BY created_at DESC\"\n\t\t);\n\t\treturn cursor.toArray();\n\t}\n}\n\n// Child: Handles its own game state independently\nexport class GameMatch extends DurableObject {\n\tasync init(matchId: string, matchName: string) {\n\t\tawait this.ctx.storage.put(\"matchId\", matchId);\n\t\tawait this.ctx.storage.put(\"matchName\", matchName);\n\t\tthis.ctx.storage.sql.exec(`\n\t\t\tCREATE TABLE IF NOT EXISTS players (\n\t\t\t\tid TEXT PRIMARY KEY,\n\t\t\t\tname TEXT NOT NULL,\n\t\t\t\tscore INTEGER DEFAULT 0\n\t\t\t)\n\t\t`);\n\t}\n\n\tasync addPlayer(playerId: string, playerName: string) {\n\t\tthis.ctx.storage.sql.exe", "char_start": 11560, "char_end": 12360, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "f216dfd4f4d4a3fe", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "ore INTEGER DEFAULT 0\n\t\t\t)\n\t\t`);\n\t}\n\n\tasync addPlayer(playerId: string, playerName: string) {\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"INSERT INTO players (id, name, score) VALUES (?, ?, 0)\",\n\t\t\tplayerId,\n\t\t\tplayerName\n\t\t);\n\t}\n\n\tasync updateScore(playerId: string, score: number) {\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"UPDATE players SET score = ? WHERE id = ?\",\n\t\t\tscore,\n\t\t\tplayerId\n\t\t);\n\t}\n}\n```\n\n\n\nWith this pattern:\n\n- Listing matches only queries the parent (children stay hibernated)\n- Different matches process player actions in parallel\n- Each match has its own SQLite database for player data\n\n### Consider location hints for latency-sensitive applications\n\nBy default, a Durable Object is created near the location of the first request it receives. For most applications, this work", "char_start": 12240, "char_end": 13040, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "495dc9f03cc2dbe6", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "efault, a Durable Object is created near the location of the first request it receives. For most applications, this works well. However, you can provide a location hint to influence where the Durable Object is created.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tGAME_SESSION: DurableObjectNamespace;\n}\n\nexport class GameSession extends DurableObject {\n\t// Game session logic\n}\n\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\tconst url = new URL(request.url);\n\t\tconst gameId = url.searchParams.get(\"game\") ?? \"default\";\n\t\tconst region = url.searchParams.get(\"region\") ?? \"wnam\"; // Western North America\n\n \t// Provide a location hint for where this Durable Object s", "char_start": 12920, "char_end": 13720, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "5b65be3d535a1f6e", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "arams.get(\"region\") ?? \"wnam\"; // Western North America\n\n \t// Provide a location hint for where this Durable Object should be created\n \tconst id = env.GAME_SESSION.idFromName(gameId);\n \tconst stub = env.GAME_SESSION.get(id, { locationHint: region });\n\n \treturn new Response(\"Connected to game session\");\n },\n};\n\n```\n\n\nLocation hints are suggestions, not guarantees. Refer to [Data location](/durable-objects/reference/data-location/) for available regions and details.\n\n## Storage and state\n\n### Use SQLite-backed Durable Objects\n\n[SQLite storage](/durable-objects/api/sqlite-storage-api/) is the recommended storage backend for new Durable Objects. It provides a familiar SQL API for relational queries, indexes, transactions, and better performance than the legac", "char_start": 13600, "char_end": 14400, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "4befa41f0eca87bf", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "cts. It provides a familiar SQL API for relational queries, indexes, transactions, and better performance than the legacy key-value storage backed Durable Objects. SQLite Durable Objects also support the KV API in synchronous and asynchronous versions.\n\nConfigure your Durable Object class to use SQLite storage in your Wrangler configuration:\n\n\n```jsonc\n{\n \"migrations\": [\n { \"tag\": \"v1\", \"new_sqlite_classes\": [\"ChatRoom\"] }\n ]\n}\n```\n\n\n\nThen use the SQL API in your Durable Object:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\ntype Message = {\nid: number;\nuser_id: string;\ncontent: string;\ncreated_at: number;\n};\n\nexport class ChatRo", "char_start": 14280, "char_end": 15080, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "122dcdccbd84bad9", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "ChatRoom>;\n}\n\ntype Message = {\nid: number;\nuser_id: string;\ncontent: string;\ncreated_at: number;\n};\n\nexport class ChatRoom extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\n \t// Create tables on first instantiation\n \tthis.ctx.storage.sql.exec(`\n \t\tCREATE TABLE IF NOT EXISTS messages (\n \t\t\tid INTEGER PRIMARY KEY AUTOINCREMENT,\n \t\t\tuser_id TEXT NOT NULL,\n \t\t\tcontent TEXT NOT NULL,\n \t\t\tcreated_at INTEGER NOT NULL\n \t\t)\n \t`);\n }\n\n async addMessage(userId: string, content: string) {\n \tthis.ctx.storage.sql.exec(\n \t\t\"INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?)\",\n \t\tuserId,\n \t\tcontent,\n \t\tDate.now()\n \t);\n }\n\n async getRecentMessages(limit: number = 50): Promise {\n \t// Use type parameter for typed results\n \tconst cursor = this.ctx.storage.sql.exec(\n \t\t\"SELECT * FROM messages ORDER BY created_at DESC LIMIT ?\",\n \t\tlimit\n \t);\n \treturn cursor.toArray();\n }\n}\n\n```\n\n\nRefer to [Access Durable Objects storage](/durable-objects/best-practices/access-durable-objects-storage/) for more details on the SQL API.\n\n### Initialize storage and run migrations in the constructor\n\nUse `blockConcurrencyWhile()` in the constructor to run migrations and initialize state before any requests are processed. This ensures your schema is ready and prevents race conditions during initialization.\n\n:::note\n`PR", "char_start": 15640, "char_end": 16440, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "c95242a5e4ef1e17", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "quests are processed. This ensures your schema is ready and prevents race conditions during initialization.\n\n:::note\n`PRAGMA user_version` is not supported by Durable Objects SQLite storage. You must use an alternative approach to track your schema version.\n:::\n\nFor production applications, use a migration library that handles version tracking and execution automatically:\n\n- [`durable-utils`](https://github.com/lambrospetrou/durable-utils#sqlite-schema-migrations) \u2014 provides a `SQLSchemaMigrations` class that tracks executed migrations both in memory and in storage.\n- [`@cloudflare/actors` storage utilities](https://github.com/cloudflare/actors/blob/main/packages/storage/src/sql-schema-migrations.ts) \u2014 a reference implementation of the same pattern used by the Cloudflare Actors framework.\n", "char_start": 16320, "char_end": 17120, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "d493d723bcae1024", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "src/sql-schema-migrations.ts) \u2014 a reference implementation of the same pattern used by the Cloudflare Actors framework.\n\nIf you prefer not to use a library, you can track schema versions manually using a `_sql_schema_migrations` table. The following example demonstrates this approach:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\n\t\t// blockConcurrencyWhile() ensures no requests are processed until this completes\n\t\tctx.blockConcurrencyWhile(async () => {\n\t\t\tawait this.migrate();\n\t\t});\n\t}\n\n\tprivate async migrate() {\n\t\t// Create the migrations tracki", "char_start": 17000, "char_end": 17800, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "c83e36cada5798d4", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "rencyWhile(async () => {\n\t\t\tawait this.migrate();\n\t\t});\n\t}\n\n\tprivate async migrate() {\n\t\t// Create the migrations tracking table if it does not exist\n\t\tthis.ctx.storage.sql.exec(`\n\t\t\tCREATE TABLE IF NOT EXISTS _sql_schema_migrations (\n\t\t\t\tid INTEGER PRIMARY KEY,\n\t\t\t\tapplied_at TEXT NOT NULL DEFAULT (datetime('now'))\n\t\t\t);\n\t\t`);\n\n\t\t// Determine the current schema version\n\t\tconst version =\n\t\t\tthis.ctx.storage.sql\n\t\t\t\t.exec<{ version: number }>(\n\t\t\t\t\t\"SELECT COALESCE(MAX(id), 0) as version FROM _sql_schema_migrations\",\n\t\t\t\t)\n\t\t\t\t.one().version;\n\n\t\tif (version < 1) {\n\t\t\tthis.ctx.storage.sql.exec(`\n\t\t\t\tCREATE TABLE IF NOT EXISTS messages (\n\t\t\t\t\tid INTEGER PRIMARY KEY AUTOINCREMENT,\n\t\t\t\t\tuser_id TEXT NOT NULL,\n\t\t\t\t\tcontent TEXT NOT NULL,\n\t\t\t\t\tcreated_at INTEGER NOT NULL\n\t\t\t\t);\n\t\t\t\tCREATE INDEX I", "char_start": 17680, "char_end": 18480, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "3d0ee1f4d3d93271", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "MENT,\n\t\t\t\t\tuser_id TEXT NOT NULL,\n\t\t\t\t\tcontent TEXT NOT NULL,\n\t\t\t\t\tcreated_at INTEGER NOT NULL\n\t\t\t\t);\n\t\t\t\tCREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at);\n\t\t\t\tINSERT INTO _sql_schema_migrations (id) VALUES (1);\n\t\t\t`);\n\t\t}\n\n\t\tif (version < 2) {\n\t\t\t// Future migration: add a new column\n\t\t\tthis.ctx.storage.sql.exec(`\n\t\t\t\tALTER TABLE messages ADD COLUMN edited_at INTEGER;\n\t\t\t\tINSERT INTO _sql_schema_migrations (id) VALUES (2);\n\t\t\t`);\n\t\t}\n\t}\n}\n```\n\n\n\n### Understand the difference between in-memory state and persistent storage\n\nDurable Objects provide multiple state management layers, each with different characteristics:\n\n| Type | Speed | Persistence | Use Case |\n| ----------------------", "char_start": 18360, "char_end": 19160, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "9d914d6e9efd4a37", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " | Speed | Persistence | Use Case |\n| ---------------------------- | -------- | ---------------------------- | --------------------------- |\n| In-memory (class properties) | Fastest | Lost on eviction or crash | Caching, active connections |\n| SQLite storage | Fast | Durable across restarts | Primary data storage |\n| External (R2, D1) | Variable | Durable, cross-DO accessible | Large files, shared data |\n\nIn-memory state is **not preserved** if the Durable Object is evicted from memory due to inactivity, or if it crashes from an uncaught exception. Always persist important state to SQLite storage.\n\n\n```ts\nimport { DurableObject } from \"cloudflar", "char_start": 19040, "char_end": 19840, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "523cab551a803350", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "portant state to SQLite storage.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\ntype Message = {\nid: number;\nuser_id: string;\ncontent: string;\ncreated_at: number;\n};\n\nexport class ChatRoom extends DurableObject {\n\t// In-memory cache - fast but NOT preserved across evictions or crashes\n\tprivate messageCache: Message[] | null = null;\n\n async getRecentMessages(): Promise {\n \t// Return from cache if available (only valid while DO is in memory)\n \tif (this.messageCache !== null) {\n \t\treturn this.messageCache;\n \t}\n\n \t// Otherwise, load from durable storage\n \tconst cursor = this.ctx.storage.sql.exec(\n \t\t\"SELECT * FROM messages", "char_start": 19720, "char_end": 20520, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "8825ddc2eb98afa8", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "herwise, load from durable storage\n \tconst cursor = this.ctx.storage.sql.exec(\n \t\t\"SELECT * FROM messages ORDER BY created_at DESC LIMIT 100\"\n \t);\n \tthis.messageCache = cursor.toArray();\n \treturn this.messageCache;\n }\n\n async addMessage(userId: string, content: string) {\n \t// \u2705 Always persist to durable storage first\n \tthis.ctx.storage.sql.exec(\n \t\t\"INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?)\",\n \t\tuserId,\n \t\tcontent,\n \t\tDate.now()\n \t);\n\n \t// Then update the cache (if it exists)\n \t// If the DO crashes here, the message is still saved in SQLite\n \tthis.messageCache = null; // Invalidate cache\n }\n}\n\n```\n\n\n:::caution\n\nIf an uncaught exception occurs in your Durable Object, the runtime may", "char_start": 20400, "char_end": 21200, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "ad1ea2200798342d", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "e\n }\n}\n\n```\n\n\n:::caution\n\nIf an uncaught exception occurs in your Durable Object, the runtime may terminate the instance. Any in-memory state will be lost, but SQLite storage remains intact. Always persist critical state to storage before performing operations that might fail.\n\n:::\n\n### Create indexes for frequently-queried columns\n\nJust like any database, indexes dramatically improve read performance for frequently-filtered columns. The cost is slightly more storage and marginally slower writes.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\t", "char_start": 21080, "char_end": 21880, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "d3c3f12293041b9d", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "ce;\n}\n\nexport class ChatRoom extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\n\t\tctx.blockConcurrencyWhile(async () => {\n\t\t\tthis.ctx.storage.sql.exec(`\n\t\t\t\tCREATE TABLE IF NOT EXISTS messages (\n\t\t\t\t\tid INTEGER PRIMARY KEY AUTOINCREMENT,\n\t\t\t\t\tuser_id TEXT NOT NULL,\n\t\t\t\t\tcontent TEXT NOT NULL,\n\t\t\t\t\tcreated_at INTEGER NOT NULL\n\t\t\t\t);\n\n\t\t\t\t-- Index for queries filtering by user\n\t\t\t\tCREATE INDEX IF NOT EXISTS idx_messages_user_id ON messages(user_id);\n\n\t\t\t\t-- Index for time-based queries (recent messages)\n\t\t\t\tCREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at);\n\n\t\t\t\t-- Composite index for user + time queries\n\t\t\t\tCREATE INDEX IF NOT EXISTS idx_messages_user_time ON messages(user_id, created_at);\n\t\t\t`);\n\t\t});\n\t}\n\n\t/", "char_start": 21760, "char_end": 22560, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "a79d668c7bbf0863", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "time queries\n\t\t\t\tCREATE INDEX IF NOT EXISTS idx_messages_user_time ON messages(user_id, created_at);\n\t\t\t`);\n\t\t});\n\t}\n\n\t// This query benefits from idx_messages_user_time\n\tasync getUserMessages(userId: string, since: number) {\n\t\treturn this.ctx.storage.sql\n\t\t\t.exec(\n\t\t\t\t\"SELECT * FROM messages WHERE user_id = ? AND created_at > ? ORDER BY created_at\",\n\t\t\t\tuserId,\n\t\t\t\tsince\n\t\t\t)\n\t\t\t.toArray();\n\t}\n}\n```\n\n\n\n### Understand how input and output gates work\n\nWhile Durable Objects are single-threaded, JavaScript's `async`/`await` can allow multiple requests to interleave execution while a request waits for the result of an asynchronous operation. Cloudflare's runtime uses **input gates** and **output gates** to prevent data races and ensure correctness by default.\n\n**Input gates", "char_start": 22440, "char_end": 23240, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "d85f6feda575cfd6", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "untime uses **input gates** and **output gates** to prevent data races and ensure correctness by default.\n\n**Input gates** block new events (incoming requests, fetch responses) while synchronous JavaScript execution is in progress. Awaiting async operations like `fetch()` or KV storage methods opens the input gate, allowing other requests to interleave. However, storage operations provide special protection:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCOUNTER: DurableObjectNamespace;\n}\n\nexport class Counter extends DurableObject {\n\t// This code is safe due to input gates\n\tasync increment(): Promise {\n\t\t// While these storage operations execute, no other requests\n\t\t// can interleave - input", "char_start": 23120, "char_end": 23920, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "d5c00f12b27a4e14", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "ncrement(): Promise {\n\t\t// While these storage operations execute, no other requests\n\t\t// can interleave - input gate blocks new events\n\t\tconst value = (await this.ctx.storage.get(\"count\")) ?? 0;\n\t\tawait this.ctx.storage.put(\"count\", value + 1);\n\t\treturn value + 1;\n\t}\n}\n```\n\n\n**Output gates** hold outgoing network messages (responses, fetch requests) until pending storage writes complete. This ensures clients never see confirmation of data that has not been persisted:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tasync sendMessage(userId: string, content: string): Promise", "char_start": 23800, "char_end": 24600, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "73b1367cd3f4ce4e", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\nexport class ChatRoom extends DurableObject {\n\tasync sendMessage(userId: string, content: string): Promise {\n\t\t// Write to storage - don't need to await for correctness\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?)\",\n\t\t\tuserId,\n\t\t\tcontent,\n\t\t\tDate.now()\n\t\t);\n\n \t// This response is held by the output gate until the write completes.\n \t// The client only receives \"Message sent\" after data is safely persisted.\n \treturn \"Message sent\";\n }\n}\n\n```\n\n\n**Write coalescing:** Multiple storage writes without intervening `await` calls are automatically batched into a single atomic implicit transaction:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nex", "char_start": 24480, "char_end": 25280, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "1a188841ea38aaa3", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "icit transaction:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tACCOUNT: DurableObjectNamespace;\n}\n\nexport class Account extends DurableObject {\n\tasync transfer(fromId: string, toId: string, amount: number) {\n\t\t// \u2705 Good: These writes are coalesced into one atomic transaction\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"UPDATE accounts SET balance = balance - ? WHERE id = ?\",\n\t\t\tamount,\n\t\t\tfromId\n\t\t);\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"UPDATE accounts SET balance = balance + ? WHERE id = ?\",\n\t\t\tamount,\n\t\t\ttoId\n\t\t);\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"INSERT INTO transfers (from_id, to_id, amount, created_at) VALUES (?, ?, ?, ?)\",\n\t\t\tfromId,\n\t\t\ttoId,\n\t\t\tamount,\n\t\t\tDate.now()\n\t\t);\n\t\t// All three writes commit together", "char_start": 25160, "char_end": 25960, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "79a0c0b10474abbc", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "reated_at) VALUES (?, ?, ?, ?)\",\n\t\t\tfromId,\n\t\t\ttoId,\n\t\t\tamount,\n\t\t\tDate.now()\n\t\t);\n\t\t// All three writes commit together atomically\n\t}\n\n\t// \ud83d\udd34 Bad: await on KV operations breaks coalescing\n\tasync transferBrokenKV(fromId: string, toId: string, amount: number) {\n\t\tconst fromBalance = (await this.ctx.storage.get(`balance:${fromId}`)) ?? 0;\n\t\tawait this.ctx.storage.put(`balance:${fromId}`, fromBalance - amount);\n\t\t// If the next write fails, the debit already committed!\n\t\tconst toBalance = (await this.ctx.storage.get(`balance:${toId}`)) ?? 0;\n\t\tawait this.ctx.storage.put(`balance:${toId}`, toBalance + amount);\n\t}\n}\n```\n\n\n\nFor more details, see [Durable Objects: Easy, Fast, Correct \u2014 Choose three](https://blog.cloudflare.com/durable-objects-easy-fast-correct-c", "char_start": 25840, "char_end": 26640, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "14f7ab473277d453", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "ee [Durable Objects: Easy, Fast, Correct \u2014 Choose three](https://blog.cloudflare.com/durable-objects-easy-fast-correct-choose-three/) and the [glossary](/durable-objects/reference/glossary/).\n\n### Avoid race conditions with non-storage I/O\n\nInput gates only protect during storage operations. Non-storage I/O like `fetch()` or writing to R2 allows other requests to interleave, which can cause race conditions:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tPROCESSOR: DurableObjectNamespace;\n}\n\nexport class Processor extends DurableObject {\n\t// \u26a0\ufe0f Potential race condition: fetch() allows interleaving\n\tasync processItem(id: string) {\n\t\tconst item = await this.ctx.storage.get<{ status: string }>(`item:${", "char_start": 26520, "char_end": 27320, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "d795a5962aab5200", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "ows interleaving\n\tasync processItem(id: string) {\n\t\tconst item = await this.ctx.storage.get<{ status: string }>(`item:${id}`);\n\n \tif (item?.status === \"pending\") {\n \t\t// During this fetch, other requests CAN execute and modify storage\n \t\tconst result = await fetch(\"https://api.example.com/process\");\n\n \t\t// Another request may have already processed this item!\n \t\tawait this.ctx.storage.put(`item:${id}`, { status: \"completed\" });\n \t}\n }\n}\n\n```\n\n\nTo handle this, use optimistic locking (check-and-set) patterns: read a version number before the external call, then verify it has not changed before writing.\n\n:::note\n\nWith the legacy KV storage backend, use the [`transaction()`](/durable-objects/api/sqlite-storage-api/#transaction) method for atomic read-mo", "char_start": 27200, "char_end": 28000, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "dd78dd22e3f9881f", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "orage backend, use the [`transaction()`](/durable-objects/api/sqlite-storage-api/#transaction) method for atomic read-modify-write operations across async boundaries.\n\n:::\n\n### Use `blockConcurrencyWhile()` sparingly\n\nThe [`blockConcurrencyWhile()`](/durable-objects/api/state/#blockconcurrencywhile) method guarantees that no other events are processed until the provided callback completes, even if the callback performs asynchronous I/O. This is useful for operations that must be atomic, such as state initialization from storage in the constructor:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tconstructor(ctx: Durab", "char_start": 27880, "char_end": 28680, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "3d7b5625f469516f", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "AT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\n\t\t// \u2705 Good: Use blockConcurrencyWhile for one-time initialization\n\t\tctx.blockConcurrencyWhile(async () => {\n\t\t\tthis.ctx.storage.sql.exec(`\n\t\t\t\tCREATE TABLE IF NOT EXISTS messages (\n\t\t\t\t\tid INTEGER PRIMARY KEY,\n\t\t\t\t\tcontent TEXT\n\t\t\t\t)\n\t\t\t`);\n\t\t});\n\t}\n\n\t// \ud83d\udd34 Bad: Don't use blockConcurrencyWhile on every request\n\tasync sendMessageSlow(content: string) {\n\t\tawait this.ctx.blockConcurrencyWhile(async () => {\n\t\t\tthis.ctx.storage.sql.exec(\n\t\t\t\t\"INSERT INTO messages (content) VALUES (?)\",\n\t\t\t\tcontent\n\t\t\t);\n\t\t});\n\t\t// If this takes ~5ms, you're limited to ~200 requests/second\n\t}\n\n\t// \u2705 Good: Let output gates handle consistency\n\tasync ", "char_start": 28560, "char_end": 29360, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "c903ba766fa6b895", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "/ If this takes ~5ms, you're limited to ~200 requests/second\n\t}\n\n\t// \u2705 Good: Let output gates handle consistency\n\tasync sendMessageFast(content: string) {\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"INSERT INTO messages (content) VALUES (?)\",\n\t\t\tcontent\n\t\t);\n\t\t// Output gate ensures write completes before response is sent\n\t\t// Other requests can be processed concurrently\n\t}\n}\n```\n\n\n\nBecause `blockConcurrencyWhile()` blocks _all_ concurrency unconditionally, it significantly reduces throughput. If each call takes ~5ms, that individual Durable Object is limited to approximately 200 requests/second. Reserve it for initialization and migrations, not regular request handling. For normal operations, rely on input/output gates and write coalescing instead.\n\nFor atomic read-modify-write o", "char_start": 29240, "char_end": 30040, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "1b785251fc083a7d", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "andling. For normal operations, rely on input/output gates and write coalescing instead.\n\nFor atomic read-modify-write operations during request handling, prefer [`transaction()`](/durable-objects/api/sqlite-storage-api/#transaction) over `blockConcurrencyWhile()`. Transactions provide atomicity for storage operations without blocking unrelated concurrent requests.\n\n:::caution\n\nUsing `blockConcurrencyWhile()` across I/O operations (such as `fetch()`, KV, R2, or other external API calls) is an anti-pattern. This is equivalent to holding a lock across I/O in other languages or concurrency frameworks \u2014 it blocks all other requests while waiting for slow external operations, severely degrading throughput. Keep `blockConcurrencyWhile()` callbacks fast and limited to local storage operations.\n\n:", "char_start": 29920, "char_end": 30720, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "5d3422ca175e517f", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "severely degrading throughput. Keep `blockConcurrencyWhile()` callbacks fast and limited to local storage operations.\n\n:::\n\n## Communication and API design\n\n### Use RPC methods instead of the `fetch()` handler\n\nProjects with a [compatibility date](/workers/configuration/compatibility-flags/) of `2024-04-03` or later should use RPC methods. RPC is more ergonomic, provides better type safety, and eliminates manual request/response parsing.\n\nDefine public methods on your Durable Object class, and call them directly from stubs with full TypeScript support:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\t// Type parameter provides typed method calls on the stub\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\ntype Messa", "char_start": 30600, "char_end": 31400, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "b8eaa9efb728e907", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "{\n\t// Type parameter provides typed method calls on the stub\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\ntype Message = {\nid: number;\nuserId: string;\ncontent: string;\ncreatedAt: number;\n};\n\nexport class ChatRoom extends DurableObject {\n\t// Public methods are automatically exposed as RPC endpoints\n\tasync sendMessage(userId: string, content: string): Promise {\n\t\tconst createdAt = Date.now();\n\t\tconst result = this.ctx.storage.sql.exec<{ id: number }>(\n\t\t\t\"INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?) RETURNING id\",\n\t\t\tuserId,\n\t\t\tcontent,\n\t\t\tcreatedAt\n\t\t);\n\t\tconst { id } = result.one();\n\t\treturn { id, userId, content, createdAt };\n\t}\n\n async getMessages(limit: number = 50): Promise {\n \tconst cursor = this.ctx.storage.sql.exec<{\n \t\ti", "char_start": 31280, "char_end": 32080, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "d87db044b4d1e000", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\n async getMessages(limit: number = 50): Promise {\n \tconst cursor = this.ctx.storage.sql.exec<{\n \t\tid: number;\n \t\tuser_id: string;\n \t\tcontent: string;\n \t\tcreated_at: number;\n \t}>(\"SELECT * FROM messages ORDER BY created_at DESC LIMIT ?\", limit);\n\n \treturn cursor.toArray().map((row) => ({\n \t\tid: row.id,\n \t\tuserId: row.user_id,\n \t\tcontent: row.content,\n \t\tcreatedAt: row.created_at,\n \t}));\n }\n}\n\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\tconst url = new URL(request.url);\n\t\tconst roomId = url.searchParams.get(\"room\") ?? \"lobby\";\n\n \tconst id = env.CHAT_ROOM.idFromName(roomId);\n \t// stub is typed as DurableObjectStub\n \tconst stub = env.CHAT_ROOM.get(id);\n\n \tif (request.method === \"POS", "char_start": 31960, "char_end": 32760, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "898bb2a4c43eb3fa", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " stub is typed as DurableObjectStub\n \tconst stub = env.CHAT_ROOM.get(id);\n\n \tif (request.method === \"POST\") {\n \t\tconst { userId, content } = await request.json<{\n \t\t\tuserId: string;\n \t\t\tcontent: string;\n \t\t}>();\n \t\t// Direct method call with full type checking\n \t\tconst message = await stub.sendMessage(userId, content);\n \t\treturn Response.json(message);\n \t}\n\n \t// TypeScript knows getMessages() returns Promise\n \tconst messages = await stub.getMessages(100);\n \treturn Response.json(messages);\n },\n};\n\n```\n\n\nRefer to [Invoke methods](/durable-objects/best-practices/create-durable-object-stubs-and-send-requests/) for more details on RPC and the legacy `fetch()` handler.\n\n### Initialize Durable Objects explicitly wi", "char_start": 32640, "char_end": 33440, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "112d924c86e30d21", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "-send-requests/) for more details on RPC and the legacy `fetch()` handler.\n\n### Initialize Durable Objects explicitly with an `init()` method\n\nDurable Objects do not know their own name or ID from within. If your Durable Object needs to know its identity (for example, to store a reference to itself or to communicate with related objects), you must explicitly initialize it.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tprivate roomId: string | null = null;\n\n\t// Call this after creating the Durable Object for the first time\n\tasync init(roomId: string, createdBy: string) {\n\t\t// Check if already initialized\n\t\tconst exi", "char_start": 33320, "char_end": 34120, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "0545aaeaef7ca620", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "Object for the first time\n\tasync init(roomId: string, createdBy: string) {\n\t\t// Check if already initialized\n\t\tconst existing = await this.ctx.storage.get(\"roomId\");\n\t\tif (existing) {\n\t\t\treturn; // Already initialized\n\t\t}\n\n\t\t// Store the identity\n\t\tawait this.ctx.storage.put(\"roomId\", roomId);\n\t\tawait this.ctx.storage.put(\"createdBy\", createdBy);\n\t\tawait this.ctx.storage.put(\"createdAt\", Date.now());\n\n\t\t// Cache in memory for this session\n\t\tthis.roomId = roomId;\n\t}\n\n\tasync getRoomId(): Promise {\n\t\tif (this.roomId) {\n\t\t\treturn this.roomId;\n\t\t}\n\n\t\tconst stored = await this.ctx.storage.get(\"roomId\");\n\t\tif (!stored) {\n\t\t\tthrow new Error(\"ChatRoom not initialized. Call init() first.\");\n\t\t}\n\n\t\tthis.roomId = stored;\n\t\treturn stored;\n\t}\n}\n\nexport default {\n\tasync fetch(request: Req", "char_start": 34000, "char_end": 34800, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "3b43f50addc39b78", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "ed. Call init() first.\");\n\t\t}\n\n\t\tthis.roomId = stored;\n\t\treturn stored;\n\t}\n}\n\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\tconst url = new URL(request.url);\n\t\tconst roomId = url.searchParams.get(\"room\") ?? \"lobby\";\n\n\t\tconst id = env.CHAT_ROOM.idFromName(roomId);\n\t\tconst stub = env.CHAT_ROOM.get(id);\n\n\t\t// Initialize on first access\n\t\tawait stub.init(roomId, \"system\");\n\n\t\treturn new Response(`Room ${await stub.getRoomId()} ready`);\n\t},\n};\n```\n\n\n\n### Always `await` RPC calls\n\nWhen calling methods on a Durable Object stub, always use `await`. Unawaited calls create dangling promises, causing errors to be swallowed and return values to be lost.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:worker", "char_start": 34680, "char_end": 35480, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "3f76e4279068c008", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "eturn values to be lost.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tasync sendMessage(userId: string, content: string): Promise {\n\t\tconst result = this.ctx.storage.sql.exec<{ id: number }>(\n\t\t\t\"INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?) RETURNING id\",\n\t\t\tuserId,\n\t\t\tcontent,\n\t\t\tDate.now()\n\t\t);\n\t\treturn result.one().id;\n\t}\n}\n\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\tconst id = env.CHAT_ROOM.idFromName(\"lobby\");\n\t\tconst stub = env.CHAT_ROOM.get(id);\n\n \t// \ud83d\udd34 Bad: Not awaiting the call\n \t// The message ID is lost, and any errors are swall", "char_start": 35360, "char_end": 36160, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "6524d83c8e07f41c", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " = env.CHAT_ROOM.get(id);\n\n \t// \ud83d\udd34 Bad: Not awaiting the call\n \t// The message ID is lost, and any errors are swallowed\n \tstub.sendMessage(\"user-123\", \"Hello\");\n\n \t// \u2705 Good: Properly awaited\n \tconst messageId = await stub.sendMessage(\"user-123\", \"Hello\");\n\n \treturn Response.json({ messageId });\n },\n};\n\n```\n\n\n## Error handling\n\n### Handle errors and use exception boundaries\n\nUncaught exceptions in a Durable Object can leave it in an unknown state and may cause the runtime to terminate the instance. Wrap risky operations in `try...catch` blocks, and handle errors appropriately.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexpo", "char_start": 36040, "char_end": 36840, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "3f24755e86897888", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tasync processMessage(userId: string, content: string) {\n\t\t// \u2705 Good: Wrap risky operations in try...catch\n\t\ttry {\n\t\t\t// Validate input before processing\n\t\t\tif (!content || content.length > 10000) {\n\t\t\t\tthrow new Error(\"Invalid message content\");\n\t\t\t}\n\n\t\t\tthis.ctx.storage.sql.exec(\n\t\t\t\t\"INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?)\",\n\t\t\t\tuserId,\n\t\t\t\tcontent,\n\t\t\t\tDate.now()\n\t\t\t);\n\n\t\t\t// External call that might fail\n\t\t\tawait this.notifySubscribers(content);\n\t\t} catch (error) {\n\t\t\t// Log the error for debugging\n\t\t\tconsole.error(\"Failed to process message:\", error);\n\n\t\t\t// Re-throw if it's a validation err", "char_start": 36720, "char_end": 37520, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "c30428cc5461eb9d", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " the error for debugging\n\t\t\tconsole.error(\"Failed to process message:\", error);\n\n\t\t\t// Re-throw if it's a validation error (don't retry)\n\t\t\tif (error instanceof Error && error.message.includes(\"Invalid\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\t// For transient errors, you might want to handle differently\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate async notifySubscribers(content: string) {\n\t\t// External notification logic\n\t}\n}\n```\n\n\n\nWhen calling Durable Objects from a Worker, errors may include `.retryable` and `.overloaded` properties indicating whether the operation can be retried. For transient failures, implement exponential backoff to avoid overwhelming the system.\n\nRefer to [Error handling](/durable-objects/best-practices/error-handling/) for details on error properties, retry strateg", "char_start": 37400, "char_end": 38200, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "d052e3162776629b", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "efer to [Error handling](/durable-objects/best-practices/error-handling/) for details on error properties, retry strategies, and exponential backoff patterns.\n\n## WebSockets and real-time\n\n### Use the Hibernatable WebSockets API for cost efficiency\n\nThe Hibernatable WebSockets API allows Durable Objects to sleep while maintaining WebSocket connections. This significantly reduces costs for applications with many idle connections.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tasync fetch(request: Request): Promise {\n\t\tconst url = new URL(request.url);\n\n \tif (url.pathname === \"/websocket\") {\n \t\t// Chec", "char_start": 38080, "char_end": 38880, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "1a7d81a2ce58a61c", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "quest): Promise {\n\t\tconst url = new URL(request.url);\n\n \tif (url.pathname === \"/websocket\") {\n \t\t// Check for WebSocket upgrade\n \t\tif (request.headers.get(\"Upgrade\") !== \"websocket\") {\n \t\t\treturn new Response(\"Expected WebSocket\", { status: 400 });\n \t\t}\n\n \t\tconst pair = new WebSocketPair();\n \t\tconst [client, server] = Object.values(pair);\n\n \t\t// Accept the WebSocket with Hibernation API\n \t\tthis.ctx.acceptWebSocket(server);\n\n \t\treturn new Response(null, { status: 101, webSocket: client });\n \t}\n\n \treturn new Response(\"Not found\", { status: 404 });\n }\n\n // Called when a message is received (even after hibernation)\n async webSocketMessage(ws: WebSocket, message: string | ArrayBuffer) {\n \tconst data = typeof message === \"string\" ? messag", "char_start": 38760, "char_end": 39560, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "8018ce861b53b525", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " webSocketMessage(ws: WebSocket, message: string | ArrayBuffer) {\n \tconst data = typeof message === \"string\" ? message : \"binary data\";\n\n \t// Broadcast to all connected clients\n \tfor (const client of this.ctx.getWebSockets()) {\n \t\tif (client !== ws && client.readyState === WebSocket.OPEN) {\n \t\t\tclient.send(data);\n \t\t}\n \t}\n }\n\n // Called when a WebSocket is closed\n async webSocketClose(\n \tws: WebSocket,\n \tcode: number,\n \treason: string,\n \twasClean: boolean\n ) {\n \t// With web_socket_auto_reply_to_close (compat date >= 2026-04-07), the runtime\n \t// auto-replies to Close frames. Calling close() is safe but no longer required.\n \tws.close(code, reason);\n \tconsole.log(`WebSocket closed: ${code} ${reason}`);\n }\n\n // Called when a WebSo", "char_start": 39440, "char_end": 40240, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "a2c109e43bceccff", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\n \tws.close(code, reason);\n \tconsole.log(`WebSocket closed: ${code} ${reason}`);\n }\n\n // Called when a WebSocket error occurs\n async webSocketError(ws: WebSocket, error: unknown) {\n \tconsole.error(\"WebSocket error:\", error);\n }\n}\n\n```\n\n\nWith the Hibernation API, your Durable Object can go to sleep when there is no active JavaScript execution, but WebSocket connections remain open. When a message arrives, the Durable Object wakes up automatically.\n\nBest practices:\n\n- The [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api) exposes `webSocketError`, `webSocketMessage`, and `webSocketClose` handlers for their respective WebSocket events.\n- With the [`web_socket_auto_reply_to_close`](/workers", "char_start": 40120, "char_end": 40920, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "2656a6d17ab3785d", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " `webSocketClose` handlers for their respective WebSocket events.\n- With the [`web_socket_auto_reply_to_close`](/workers/configuration/compatibility-flags/#websocket-auto-reply-to-close) compatibility flag (enabled by default on compatibility dates on or after `2026-04-07`), the runtime automatically completes the close handshake. Calling `ws.close()` in `webSocketClose` is still safe but no longer required. On older compatibility dates, you **must** call `ws.close()` to avoid `1006` abnormal closure errors.\n\nRefer to [WebSockets](/durable-objects/best-practices/websockets/) for more details.\n\n### Use `serializeAttachment()` to persist per-connection state\n\nWebSocket attachments let you store metadata for each connection that survives hibernation. Use this for user IDs, session tokens, or ", "char_start": 40800, "char_end": 41600, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "43feb1a526897793", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "chments let you store metadata for each connection that survives hibernation. Use this for user IDs, session tokens, or other per-connection data.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\ntype ConnectionState = {\n\tuserId: string;\n\tusername: string;\n\tjoinedAt: number;\n};\n\nexport class ChatRoom extends DurableObject {\n\tasync fetch(request: Request): Promise {\n\t\tconst url = new URL(request.url);\n\n\t\tif (url.pathname === \"/websocket\") {\n\t\t\tif (request.headers.get(\"Upgrade\") !== \"websocket\") {\n\t\t\t\treturn new Response(\"Expected WebSocket\", { status: 400 });\n\t\t\t}\n\n\t\t\tconst userId = url.searchParams.get(\"userId\") ?? \"anonymous\";\n\t\t\tconst username = url.se", "char_start": 41480, "char_end": 42280, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "6109ed6ff07cedf0", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "et\", { status: 400 });\n\t\t\t}\n\n\t\t\tconst userId = url.searchParams.get(\"userId\") ?? \"anonymous\";\n\t\t\tconst username = url.searchParams.get(\"username\") ?? \"Anonymous\";\n\n\t\t\tconst pair = new WebSocketPair();\n\t\t\tconst [client, server] = Object.values(pair);\n\n\t\t\tthis.ctx.acceptWebSocket(server);\n\n\t\t\t// Store per-connection state that survives hibernation\n\t\t\tconst state: ConnectionState = {\n\t\t\t\tuserId,\n\t\t\t\tusername,\n\t\t\t\tjoinedAt: Date.now(),\n\t\t\t};\n\t\t\tserver.serializeAttachment(state);\n\n\t\t\t// Broadcast join message\n\t\t\tthis.broadcast(`${username} joined the chat`);\n\n\t\t\treturn new Response(null, { status: 101, webSocket: client });\n\t\t}\n\n\t\treturn new Response(\"Not found\", { status: 404 });\n\t}\n\n\tasync webSocketMessage(ws: WebSocket, message: string | ArrayBuffer) {\n\t\t// Retrieve the connection state (wor", "char_start": 42160, "char_end": 42960, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "a3e7529101057913", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " });\n\t}\n\n\tasync webSocketMessage(ws: WebSocket, message: string | ArrayBuffer) {\n\t\t// Retrieve the connection state (works even after hibernation)\n\t\tconst state = ws.deserializeAttachment() as ConnectionState;\n\n\t\tconst chatMessage = JSON.stringify({\n\t\t\tuserId: state.userId,\n\t\t\tusername: state.username,\n\t\t\tcontent: message,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\n\t\tthis.broadcast(chatMessage);\n\t}\n\n\tasync webSocketClose(ws: WebSocket, code: number, reason: string) {\n\t\t// With web_socket_auto_reply_to_close (compat date >= 2026-04-07), the runtime\n\t\t// auto-replies to Close frames. Calling close() is safe but no longer required.\n\t\tws.close(code, reason);\n\t\tconst state = ws.deserializeAttachment() as ConnectionState;\n\t\tthis.broadcast(`${state.username} left the chat`);\n\t}\n\n\tprivate broadcast(message:", "char_start": 42840, "char_end": 43640, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "79d2769b8f30b52a", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "izeAttachment() as ConnectionState;\n\t\tthis.broadcast(`${state.username} left the chat`);\n\t}\n\n\tprivate broadcast(message: string) {\n\t\tfor (const client of this.ctx.getWebSockets()) {\n\t\t\tif (client.readyState === WebSocket.OPEN) {\n\t\t\t\tclient.send(message);\n\t\t\t}\n\t\t}\n\t}\n}\n```\n\n\n\n## Scheduling and lifecycle\n\n### Use alarms for per-entity scheduled tasks\n\nEach Durable Object can schedule its own future work using the [Alarms API](/durable-objects/api/alarms/), allowing a Durable Object to execute background tasks on any interval without an incoming request, RPC call, or WebSocket message.\n\nKey points about alarms:\n\n- **`setAlarm(timestamp)`** schedules the `alarm()` handler to run at any time in the future (millisecond precision)\n- **Alarms do not repeat automatically** \u2014 you", "char_start": 43520, "char_end": 44320, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "3abc124f6cd7c157", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "alarm()` handler to run at any time in the future (millisecond precision)\n- **Alarms do not repeat automatically** \u2014 you must call `setAlarm()` again to schedule the next execution\n- **Only schedule alarms when there is work to do** \u2014 avoid waking up every Durable Object on short intervals (seconds), as each alarm invocation incurs costs\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tGAME_MATCH: DurableObjectNamespace;\n}\n\nexport class GameMatch extends DurableObject {\n\tasync startGame(durationMs: number = 60000) {\n\t\tawait this.ctx.storage.put(\"gameStarted\", Date.now());\n\t\tawait this.ctx.storage.put(\"gameActive\", true);\n\n \t// Schedule the game to end after the duration\n \tawait this.ctx.storage", "char_start": 44200, "char_end": 45000, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "ca64c9e440ec6c3b", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "is.ctx.storage.put(\"gameActive\", true);\n\n \t// Schedule the game to end after the duration\n \tawait this.ctx.storage.setAlarm(Date.now() + durationMs);\n }\n\n // Called when the alarm fires\n async alarm(alarmInfo?: AlarmInvocationInfo) {\n \tconst isActive = await this.ctx.storage.get(\"gameActive\");\n\n \tif (!isActive) {\n \t\treturn; // Game was already ended\n \t}\n\n \t// End the game\n \tawait this.ctx.storage.put(\"gameActive\", false);\n \tawait this.ctx.storage.put(\"gameEnded\", Date.now());\n\n \t// Calculate final scores, notify players, etc.\n \ttry {\n \t\tawait this.calculateFinalScores();\n \t} catch (err) {\n \t\t// If we're almost out of retries but still have work to do, schedule a new alarm\n \t\t// rather than letting our retries run out to ensure ", "char_start": 44880, "char_end": 45680, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "f75a1e1ccebf8d60", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "t of retries but still have work to do, schedule a new alarm\n \t\t// rather than letting our retries run out to ensure we keep getting invoked.\n \t\tif (alarmInfo && alarmInfo.retryCount >= 5) {\n \t\t\tawait this.ctx.storage.setAlarm(Date.now() + 30 * 1000);\n \t\t\treturn;\n \t\t}\n \t\tthrow err;\n \t}\n\n \t// Schedule the next alarm only if there's more work to do\n \t// In this case, schedule cleanup in 24 hours\n \tawait this.ctx.storage.setAlarm(Date.now() + 24 * 60 * 60 * 1000);\n }\n\n private async calculateFinalScores() {\n \t// Game ending logic\n }\n}\n\n```\n\n\n### Make alarm handlers idempotent\n\nIn rare cases, alarms may fire more than once. Your `alarm()` handler should be safe to run multiple times without causing issues.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tSUBSCRIPTION: DurableObjectNamespace;\n}\n\nexport class Subscription extends DurableObject {\n\tasync alarm() {\n\t\t// \u2705 Good: Check state before performing the action\n\t\tconst lastRenewal = await this.ctx.storage.get(\"lastRenewal\");\n\t\tconst renewalPeriod = 30 * 24 * 60 * 60 * 1000; // 30 days\n\n\t\t// If we already renewed recently, don't do it again\n\t\tif (lastRenewal && Date.now() - lastRenewal < renewalPeriod - 60000) {\n\t\t\tconsole.log(\"Already renewed recently, skipping\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Perform the renewal\n\t\tconst success = await this.processRenewal", "char_start": 46240, "char_end": 47040, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "6f892e6cbc845245", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "ready renewed recently, skipping\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Perform the renewal\n\t\tconst success = await this.processRenewal();\n\n\t\tif (success) {\n\t\t\t// Record the renewal time\n\t\t\tawait this.ctx.storage.put(\"lastRenewal\", Date.now());\n\n\t\t\t// Schedule the next renewal\n\t\t\tawait this.ctx.storage.setAlarm(Date.now() + renewalPeriod);\n\t\t} else {\n\t\t\t// Retry in 1 hour\n\t\t\tawait this.ctx.storage.setAlarm(Date.now() + 60 * 60 * 1000);\n\t\t}\n\t}\n\n\tprivate async processRenewal(): Promise {\n\t\t// Payment processing logic\n\t\treturn true;\n\t}\n}\n```\n\n\n\n### Clean up storage with `deleteAll()`\n\nTo fully clear a Durable Object's storage, call `deleteAll()`. Simply deleting individual keys or dropping tables is not sufficient, as some internal metadata may remain. Workers with a compatibili", "char_start": 46920, "char_end": 47720, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "6c4445e232921f10", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "g individual keys or dropping tables is not sufficient, as some internal metadata may remain. Workers with a compatibility date before [2026-02-24](/workers/configuration/compatibility-flags/#durable-object-deleteall-deletes-alarms) and an alarm set should delete the alarm first with `deleteAlarm()`.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tasync clearStorage() {\n\n \t// Delete all storage, including any set alarm\n \tawait this.ctx.storage.deleteAll();\n\n \t// The Durable Object instance still exists, but with empty storage\n \t// A subsequent request will find no data\n }\n}\n\n```\n\n\n#", "char_start": 47600, "char_end": 48400, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "16ab12dda82e5514", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "still exists, but with empty storage\n \t// A subsequent request will find no data\n }\n}\n\n```\n\n\n### Design for unexpected shutdowns\n\n\n\n## Anti-patterns to avoid\n\n### Do not use a single Durable Object as a global singleton\n\nA single Durable Object handling all traffic becomes a bottleneck. While async operations allow request interleaving, all synchronous JavaScript execution is single-threaded, and storage operations provide serialization guarantees that limit throughput.\n\nA common mistake is using a Durable Object for global rate limiting or global counters. This funnels all traffic through a single instance:\n\n\n```ts\nimport { DurableObject } from \"cloudf", "char_start": 48280, "char_end": 49080, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "d785589bd4ccdeae", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " traffic through a single instance:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tRATE_LIMITER: DurableObjectNamespace;\n}\n\n// \ud83d\udd34 Bad: Global rate limiter - ALL requests go through one instance\nexport class RateLimiter extends DurableObject {\n\tasync checkLimit(ip: string): Promise {\n\t\tconst key = `rate:${ip}`;\n\t\tconst count = (await this.ctx.storage.get(key)) ?? 0;\n\t\tawait this.ctx.storage.put(key, count + 1);\n\t\treturn count < 100;\n\t}\n}\n\n// \ud83d\udd34 Bad: Always using the same ID creates a global bottleneck\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\t// Every single request to your application goes through this one DO\n\t\tconst limiter = env.RATE_LIMITER", "char_start": 48960, "char_end": 49760, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "3aa30cb688cd8ec0", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "se {\n\t\t// Every single request to your application goes through this one DO\n\t\tconst limiter = env.RATE_LIMITER.get(\n\t\t\tenv.RATE_LIMITER.idFromName(\"global\")\n\t\t);\n\n\t\tconst ip = request.headers.get(\"CF-Connecting-IP\") ?? \"unknown\";\n\t\tconst allowed = await limiter.checkLimit(ip);\n\n\t\tif (!allowed) {\n\t\t\treturn new Response(\"Rate limited\", { status: 429 });\n\t\t}\n\n\t\treturn new Response(\"OK\");\n\t},\n};\n```\n\n\n\nThis pattern does not scale. As traffic increases, the single Durable Object becomes a chokepoint. Instead, identify natural coordination boundaries in your application (per user, per room, per document) and create separate Durable Objects for each.\n\n## Testing and migrations\n\n### Test with Vitest and plan for class migrations\n\nUse `@cloudflare/vitest-pool-workers` ", "char_start": 49640, "char_end": 50440, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "8be684e451d36155", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": ".\n\n## Testing and migrations\n\n### Test with Vitest and plan for class migrations\n\nUse `@cloudflare/vitest-pool-workers` for testing Durable Objects. The integration provides utilities for direct instance access.\n\n\n```ts\nimport { env } from \"cloudflare:workers\";\nimport {\n\trunInDurableObject,\n\trunDurableObjectAlarm,\n} from \"cloudflare:test\";\nimport { describe, it, expect } from \"vitest\";\n\ndescribe(\"ChatRoom\", () => {\n\nit(\"should send and retrieve messages\", async () => {\nconst id = env.CHAT_ROOM.idFromName(\"test-room\");\nconst stub = env.CHAT_ROOM.get(id);\n\n \t// Call RPC methods directly on the stub\n \tawait stub.sendMessage(\"user-1\", \"Hello!\");\n \tawait stub.sendMessage(\"user-2\", \"Hi there!\");\n\n \tconst messages = await stub.getMe", "char_start": 50320, "char_end": 51120, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "9dbeacadabe85a45", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "Message(\"user-1\", \"Hello!\");\n \tawait stub.sendMessage(\"user-2\", \"Hi there!\");\n\n \tconst messages = await stub.getMessages(10);\n \texpect(messages).toHaveLength(2);\n });\n\n it(\"can access instance internals and trigger alarms\", async () => {\n \tconst id = env.CHAT_ROOM.idFromName(\"test-room\");\n \tconst stub = env.CHAT_ROOM.get(id);\n\n \t// Access storage directly for verification\n \tawait runInDurableObject(stub, async (instance, state) => {\n \t\tconst count = state.storage.sql\n \t\t\t.exec<{ count: number }>(\"SELECT COUNT(*) as count FROM messages\")\n \t\t\t.one();\n \t\texpect(count.count).toBe(2);\n \t});\n\n \t// Trigger alarms immediately without waiting\n \tconst alarmRan = await runDurableObjectAlarm(stub);\n \texpect(alarmRan).toBe(false); // No alarm was sched", "char_start": 51000, "char_end": 51800, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "41e2247d8140269a", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "aiting\n \tconst alarmRan = await runDurableObjectAlarm(stub);\n \texpect(alarmRan).toBe(false); // No alarm was scheduled\n });\n});\n\n```\n\n\nConfigure Vitest in your `vitest.config.ts`:\n\n```ts\nimport { cloudflareTest } from \"@cloudflare/vitest-pool-workers\";\nimport { defineConfig } from \"vitest/config\";\n\nexport default defineConfig({\n\tplugins: [\n\t\tcloudflareTest({\n\t\t\twrangler: { configPath: \"./wrangler.jsonc\" },\n\t\t}),\n\t],\n});\n```\n\nFor schema changes, run migrations in the constructor using `blockConcurrencyWhile()`. For class renames or deletions, use Wrangler migrations:\n\n\n```jsonc\n{\n \"migrations\": [\n // Rename a class\n { \"tag\": \"v2\", \"renamed_classes\": [{ \"from\": \"OldChatRoom\", \"to\": \"ChatRoom\" }] },\n // Delete a class (removes all data!)\n", "char_start": 51680, "char_end": 52480, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "f3b332997c4f2960", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "g\": \"v2\", \"renamed_classes\": [{ \"from\": \"OldChatRoom\", \"to\": \"ChatRoom\" }] },\n // Delete a class (removes all data!)\n { \"tag\": \"v3\", \"deleted_classes\": [\"DeprecatedRoom\"] }\n ]\n}\n```\n\n\nRefer to [Durable Objects migrations](/durable-objects/reference/durable-objects-migrations/) for more details on class migrations, and [Testing with Durable Objects](/durable-objects/examples/testing-with-durable-objects/) for comprehensive testing patterns including SQLite queries and alarm testing.\n\n## Related resources\n\n- [Workers Best Practices](/workers/best-practices/workers-best-practices/): code patterns for request handling, observability, and security that apply to the Workers calling your Durable Objects.\n- [Rules of Workflows](/workflows/build/rules-of-workflows/): best pr", "char_start": 52360, "char_end": 53160, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "42d8a788e9b3a948", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "apply to the Workers calling your Durable Objects.\n- [Rules of Workflows](/workflows/build/rules-of-workflows/): best practices for durable, multi-step Workflows \u2014 useful when combining Workflows with Durable Objects for long-running orchestration.\n", "char_start": 53040, "char_end": 53289, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "b0f7ddabf0ed1ef9", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "---\ntitle: Lifecycle of a Durable Object\ndescription: Understand how a Durable Object is created, activated, handles requests, and is eventually evicted.\npcx_content_type: concept\nsidebar:\n order: 3\nproducts:\n - durable-objects\n---\n\nimport { Render } from \"~/components\";\n\nThis section describes the lifecycle of a [Durable Object](/durable-objects/concepts/what-are-durable-objects/).\n\nTo use a Durable Object you need to create a [Durable Object Stub](/durable-objects/api/stub/).\nSimply creating the Durable Object Stub does not send a request to the Durable Object, and therefore the Durable Object is not yet instantiated.\nA request is sent to the Durable Object and its lifecycle begins only once a method is invoked on the Durable Object Stub.\n\n```js\nconst stub = env.MY_DURABLE_OBJECT.getBy", "char_start": 0, "char_end": 800, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "bacf01c3ea3b3d3a", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "fecycle begins only once a method is invoked on the Durable Object Stub.\n\n```js\nconst stub = env.MY_DURABLE_OBJECT.getByName(\"foo\");\n// Now the request is sent to the remote Durable Object.\nconst rpcResponse = await stub.sayHello();\n```\n\n## Durable Object Lifecycle state transitions\n\nA Durable Object can be in one of the following states at any moment:\n\n| State | Description |\n| ------------------------------------- | ----------------------------------------------------------------------------------------------------------------", "char_start": 680, "char_end": 1480, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "004b0c70c30137e9", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "----- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **Active, in-memory** | The Durable Object runs, in memory, and handles incoming requests. |\n| **Idle, in-memory non-hibernateable** | The Durable Object waits for the next incoming request/event, but does not satisfy the criteria for hibernation. ", "char_start": 1360, "char_end": 2160, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "7caaca590f803bc2", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "ria for hibernation. |\n| **Idle, in-memory hibernateable** | The Durable Object waits for the next incoming request/event and satisfies the criteria for hibernation. It is up to the runtime to decide when to hibernate the Durable Object. Currently, it is after 10 seconds of inactivity while in this state. |\n| **Hibernated** | The Durable Object is removed from memory. Hibernated WebSocket connections stay connected. |\n| **Inactive** | The Durable Object is ", "char_start": 2040, "char_end": 2840, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "253391f0450ed14a", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": " |\n| **Inactive** | The Durable Object is completely removed from the host process and might need to cold start. This is the initial state of all Durable Objects. |\n\nThis is how a Durable Object transitions among these states (each state is in a rounded rectangle).\n\n![Lifecycle of a Durable Object](~/assets/images/durable-objects/durable-object-lifecycle.png)\n\nAssuming a Durable Object does not run, the first incoming request or event (like an alarm) will execute the `constructor()` of the Durable Object class, then run the corresponding function invoked.\n\nAt this point the Durable Object is in the **active in-m", "char_start": 2720, "char_end": 3520, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "9d16c15ab5b1c4bb", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "ble Object class, then run the corresponding function invoked.\n\nAt this point the Durable Object is in the **active in-memory state**.\n\nOnce all incoming requests or events have been processed, the Durable Object remains idle in-memory for a few seconds either in a hibernateable state or in a non-hibernateable state.\n\nHibernation can only occur if **all** of the conditions below are true:\n\n- No `setTimeout`/`setInterval` scheduled callbacks are set, since there would be no way to recreate the callback after hibernating.\n- No in-progress awaited `fetch()` exists, since it is considered to be waiting for I/O.\n- No WebSocket standard API is used.\n- No request/event is still being processed, because hibernating would mean losing track of the async function which is eventually supposed to retur", "char_start": 3400, "char_end": 4200, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "9c76377332806f4b", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "being processed, because hibernating would mean losing track of the async function which is eventually supposed to return a response to that request.\n- No active outbound TCP socket (`connect()`) or outbound WebSocket connection exists.\n\nAfter 10 seconds of no incoming request or event, and all the above conditions satisfied, the Durable Object will transition into the **hibernated** state.\n\n:::caution\nWhen hibernated, the in-memory state is discarded, so ensure you persist all important information in the Durable Object's storage.\n:::\n\nIf any of the above conditions is false, the Durable Object remains in-memory, in the **idle, in-memory, non-hibernateable** state.\n\nIn case of an incoming request or event while in the **hibernated** state, the `constructor()` will run again, and the Durab", "char_start": 4080, "char_end": 4880, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "2d6f2a7f3e343757", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "ase of an incoming request or event while in the **hibernated** state, the `constructor()` will run again, and the Durable Object will transition to the **active, in-memory** state and execute the invoked function.\n\nWhile in the **idle, in-memory, non-hibernateable** state, after 70-140 seconds of inactivity (no incoming requests or events), the Durable Object will be evicted entirely from memory and potentially from the Cloudflare host and transition to the **inactive** state.\n\n:::note[Outbound connections keep Durable Objects alive]\nActive outbound connections created via [`connect()`](/workers/runtime-apis/tcp-sockets/) (TCP) or an outbound WebSocket prevent the Durable Object from being evicted. Eviction is deferred until both conditions are met: all outbound connections have closed, *", "char_start": 4760, "char_end": 5560, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "1b8ea98ac4260c7c", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "e Object from being evicted. Eviction is deferred until both conditions are met: all outbound connections have closed, **and** the standard 70-140 second inactivity window has elapsed with no incoming requests or events.\n\nWhile kept alive by an outbound connection, the Durable Object remains in memory in the **idle, in-memory, non-hibernateable** state and continues to [incur duration charges](/durable-objects/platform/pricing/#when-does-a-durable-object-incur-duration-charges).\n\nEach outbound connection keeps the Durable Object alive for a maximum of 15 minutes. After 15 minutes, the connection stops preventing eviction (the connection itself continues operating), and the [standard eviction rules](/durable-objects/concepts/durable-object-lifecycle/#durable-object-lifecycle-state-transitio", "char_start": 5440, "char_end": 6240, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "d92fb3d457fdfd28", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "e [standard eviction rules](/durable-objects/concepts/durable-object-lifecycle/#durable-object-lifecycle-state-transitions) resume.\n\nThis applies to outbound TCP sockets and outbound WebSockets (including a `fetch()` request upgraded to a WebSocket via `Upgrade: websocket`). It does not apply to plain `fetch()` subrequests. Those never keep the Durable Object alive, even while the response body is still streaming.\n:::\n\nObjects in the **hibernated** state keep their Websocket clients connected, and the runtime decides if and when to transition the object to the **inactive** state (for example deciding to move the object to a different host) thus restarting the lifecycle.\n\nThe next incoming request or event starts the cycle again.\n\n:::note[Lifecycle states incurring duration charges]\nA Durab", "char_start": 6120, "char_end": 6920, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "c47f1cb7383a1b06", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "The next incoming request or event starts the cycle again.\n\n:::note[Lifecycle states incurring duration charges]\nA Durable Object incurs charges only when it is **actively running in-memory**, or when it is **idle in-memory and non-hibernateable** (indicated as green rectangles in the diagram).\n:::\n\n## Shutdown behavior\n\nDurable Objects will occasionally shut down and objects are restarted, which will run your Durable Object class constructor. This can happen for various reasons, including:\n\n- New Worker [deployments](/workers/versions-and-deployments/) with code updates\n- Lack of requests to an object following the state transitions documented above\n- Cloudflare updates to the Workers runtime system\n- Workers runtime decisions on where to host objects\n\nWhen a Durable Object is shut down, ", "char_start": 6800, "char_end": 7600, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "e40291fa69204799", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "to the Workers runtime system\n- Workers runtime decisions on where to host objects\n\nWhen a Durable Object is shut down, the object instance is automatically restarted and new requests are routed to the new instance. In-flight requests are handled as follows:\n\n- **HTTP & RPC requests**: In-flight requests are allowed to finish if they do not access a Durable Object's storage. If a request attempts to access a Durable Object's storage, it will be stopped immediately and return an error to maintain Durable Objects global uniqueness property. When the Worker runtime system is being updated, in-flight requests have up to 30 seconds to complete.\n- **WebSocket connections**: WebSocket requests are terminated automatically during shutdown. This is so that the new instance can take over the connec", "char_start": 7480, "char_end": 8280, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "faf9f9510d5d4534", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "bSocket requests are terminated automatically during shutdown. This is so that the new instance can take over the connection as soon as possible.\n- **Other invocations (email, cron)**: Other invocations are treated similarly to HTTP requests.\n\nIt is important to ensure that any services using Durable Objects are designed to handle the possibility of a Durable Object being shut down.\n\n### Code updates\n\nWhen your Durable Object code is updated, your Worker and Durable Objects are released globally in an eventually consistent manner. This will cause a Durable Object to shut down, with the behavior described above. Updates can also create a situation where a request reaches a new version of your Worker in one location, and calls to a Durable Object still running a previous version elsewhere. R", "char_start": 8160, "char_end": 8960, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "b27088cba7d414a3", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": " new version of your Worker in one location, and calls to a Durable Object still running a previous version elsewhere. Refer to [Code updates](/durable-objects/platform/known-issues/#code-updates) for more information about handling this scenario.\n\n### Working without shutdown hooks\n\n\n", "char_start": 8840, "char_end": 9200, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "926d05c1e64f5885", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "---\ntitle: What are Durable Objects?\ndescription: Durable Objects provide globally unique, single-threaded compute instances with persistent storage on Cloudflare.\npcx_content_type: concept\nsidebar:\n order: 2\nproducts:\n - durable-objects\n---\n\nimport { Render } from \"~/components\";\n\n\n\n## Durable Objects highlights\n\nDurable Objects have properties that make them a great fit for distributed stateful scalable applications.\n\n**Serverless compute, zero infrastructure management**\n\n- Durable Objects are built on-top of the Workers runtime, so they support exactly the same code (JavaScript and WASM), and similar memory and CPU limits.\n- Each Durable Object is [implicitly created on first access](/durable-objects/api/namespace/#g", "char_start": 0, "char_end": 800, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "9fb789dcb37f4afa", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "r memory and CPU limits.\n- Each Durable Object is [implicitly created on first access](/durable-objects/api/namespace/#get). User applications are not concerned with their lifecycle, creating them or destroying them. Durable Objects migrate among healthy servers, and therefore applications never have to worry about managing them.\n- Each Durable Object stays alive as long as requests are being processed, and remains alive for several seconds after being idle before hibernating, allowing applications to [exploit in-memory caching](/durable-objects/reference/in-memory-state/) while handling many consecutive requests and boosting their performance.\n\n**Storage colocated with compute**\n\n- Each Durable Object has its own [durable, transactional, and strongly consistent storage](/durable-objects/a", "char_start": 680, "char_end": 1480, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "cf6ea4b3e9de95f5", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "ompute**\n\n- Each Durable Object has its own [durable, transactional, and strongly consistent storage](/durable-objects/api/sqlite-storage-api/) (up to 10 GB[^1]), persisted across requests, and accessible only within that object.\n\n**Single-threaded concurrency**\n\n- Each [Durable Object instance has an identifier](/durable-objects/api/id/), either randomly-generated or user-generated, which allows you to globally address which Durable Object should handle a specific action or request.\n- Durable Objects are single-threaded and cooperatively multi-tasked, just like code running in a web browser. For more details on how safety and correctness are achieved, refer to the blog post [\"Durable Objects: Easy, Fast, Correct \u2014 Choose three\"](https://blog.cloudflare.com/durable-objects-easy-fast-correc", "char_start": 1360, "char_end": 2160, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "a7c92c0493d0ed5a", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "ost [\"Durable Objects: Easy, Fast, Correct \u2014 Choose three\"](https://blog.cloudflare.com/durable-objects-easy-fast-correct-choose-three/).\n\n**Elastic horizontal scaling across Cloudflare's global network**\n\n- Durable Objects can be spread around the world, and you can [optionally influence where each instance should be located](/durable-objects/reference/data-location/#provide-a-location-hint). Durable Objects are not yet available in every Cloudflare data center; refer to the [where.durableobjects.live](https://where.durableobjects.live/) project for live locations.\n- Each Durable Object type (or [\"Namespace binding\"](/durable-objects/api/namespace/) in Cloudflare terms) corresponds to a JavaScript class implementing the actual logic. There is no hard limit on how many Durable Objects can ", "char_start": 2040, "char_end": 2840, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "55bcbd32adcf1862", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "corresponds to a JavaScript class implementing the actual logic. There is no hard limit on how many Durable Objects can be created for each namespace.\n- Durable Objects scale elastically as your application creates millions of objects. There is no need for applications to manage infrastructure or plan ahead for capacity.\n\n## Durable Objects features\n\n### In-memory state\n\nEach Durable Object has its own [in-memory state](/durable-objects/reference/in-memory-state/). Applications can use this in-memory state to optimize the performance of their applications by keeping important information in-memory, thereby avoiding the need to access the durable storage at all.\n\nUseful cases for in-memory state include batching and aggregating information before persisting it to storage, or for immediately", "char_start": 2720, "char_end": 3520, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "ef7f788decb7625f", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "ses for in-memory state include batching and aggregating information before persisting it to storage, or for immediately rejecting/handling incoming requests meeting certain criteria, and more.\n\nIn-memory state is reset when the Durable Object hibernates after being idle for some time. Therefore, it is important to persist any in-memory data to the durable storage if that data will be needed at a later time when the Durable Object receives another request.\n\n### Storage API\n\nThe [Durable Object Storage API](/durable-objects/api/sqlite-storage-api/) allows Durable Objects to access fast, transactional, and strongly consistent storage. A Durable Object's attached storage is private to its unique instance and cannot be accessed by other objects.\n\nThere are two flavors of the storage API, a [ke", "char_start": 3400, "char_end": 4200, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "eb18ddd80d001f12", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "private to its unique instance and cannot be accessed by other objects.\n\nThere are two flavors of the storage API, a [key-value (KV) API](/durable-objects/api/legacy-kv-storage-api/) and an [SQL API](/durable-objects/api/sqlite-storage-api/).\n\nWhen using the [new SQLite in Durable Objects storage backend](/durable-objects/reference/durable-objects-migrations/#create-migration), you have access to both the APIs. However, if you use the previous storage backend you only have access to the key-value API.\n\n### Alarms API\n\nDurable Objects provide an [Alarms API](/durable-objects/api/alarms/) which allows you to schedule the Durable Object to be woken up at a time in the future. This is useful when you want to do certain work periodically, or at some specific point in time, without having to man", "char_start": 4080, "char_end": 4880, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "48bfec12e1ad6f84", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": ". This is useful when you want to do certain work periodically, or at some specific point in time, without having to manually manage infrastructure such as job scheduling runners on your own.\n\nYou can combine Alarms with in-memory state and the durable storage API to build batch and aggregation applications such as queues, workflows, or advanced data pipelines.\n\n### WebSockets\n\nWebSockets are long-lived TCP connections that enable bi-directional, real-time communication between client and server. Because WebSocket sessions are long-lived, applications commonly use Durable Objects to accept either the client or server connection.\n\nBecause Durable Objects provide a single-point-of-coordination between Cloudflare Workers, a single Durable Object instance can be used in parallel with WebSocket", "char_start": 4760, "char_end": 5560, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "e4417742157b02e4", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "oint-of-coordination between Cloudflare Workers, a single Durable Object instance can be used in parallel with WebSockets to coordinate between multiple clients, such as participants in a chat room or a multiplayer game.\n\nDurable Objects support the [WebSocket Standard API](/durable-objects/best-practices/websockets/#websocket-standard-api), as well as the [WebSockets Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api) which extends the Web Standard WebSocket API to reduce costs by not incurring billing charges during periods of inactivity.\n\n### RPC\n\nDurable Objects support Workers [Remote-Procedure-Call (RPC)](/workers/runtime-apis/rpc/) which allows applications to use JavaScript-native methods and objects to communicate between Workers", "char_start": 5440, "char_end": 6240, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "c772edff9a60fa3a", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "runtime-apis/rpc/) which allows applications to use JavaScript-native methods and objects to communicate between Workers and Durable Objects.\n\nUsing RPC for communication makes application development easier and simpler to reason about, and more efficient.\n\n## Actor programming model\n\nAnother way to describe and think about Durable Objects is through the lens of the [Actor programming model](https://en.wikipedia.org/wiki/Actor_model). There are several popular examples of the Actor model supported at the programming language level through runtimes or library frameworks, like [Erlang](https://www.erlang.org/), [Elixir](https://elixir-lang.org/), [Akka](https://akka.io/), or [Microsoft Orleans for .NET](https://learn.microsoft.com/en-us/dotnet/orleans/overview).\n\nThe Actor model simplifies a", "char_start": 6120, "char_end": 6920, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "d212b5746f3ca523", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "r [Microsoft Orleans for .NET](https://learn.microsoft.com/en-us/dotnet/orleans/overview).\n\nThe Actor model simplifies a lot of problems in distributed systems by abstracting away the communication between actors using RPC calls (or message sending) that could be implemented on-top of any transport protocol, and it avoids most of the concurrency pitfalls you get when doing concurrency through shared memory such as race conditions when multiple processes/threads access the same data in-memory.\n\nEach Durable Object instance can be seen as an Actor instance, receiving messages (incoming HTTP/RPC requests), executing some logic in its own single-threaded context using its attached durable storage or in-memory state, and finally sending messages to the outside world (outgoing HTTP/RPC requests ", "char_start": 6800, "char_end": 7600, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "6ee4a1821a37e2ef", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "ached durable storage or in-memory state, and finally sending messages to the outside world (outgoing HTTP/RPC requests or responses), even to another Durable Object instance.\n\nEach Durable Object has certain capabilities in terms of [how much work it can do](/durable-objects/platform/limits/#how-much-work-can-a-single-durable-object-do), which should influence the application's [architecture to fully take advantage of the platform](/reference-architecture/diagrams/storage/durable-object-control-data-plane-pattern/).\n\nDurable Objects are natively integrated into Cloudflare's infrastructure, giving you the ultimate serverless platform to build distributed stateful applications exploiting the entirety of Cloudflare's network.\n\n## Durable Objects in Cloudflare\n\nMany of Cloudflare's products u", "char_start": 7480, "char_end": 8280, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "8a7de24c53db7409", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "ions exploiting the entirety of Cloudflare's network.\n\n## Durable Objects in Cloudflare\n\nMany of Cloudflare's products use Durable Objects. Some of our technical blog posts showcase real-world applications and use-cases where Durable Objects make building applications easier and simpler.\n\nThese blog posts may also serve as inspiration on how to architect scalable applications using Durable Objects, and how to integrate them with the rest of Cloudflare Developer Platform.\n\n- [Durable Objects aren't just durable, they're fast: a 10x speedup for Cloudflare Queues](https://blog.cloudflare.com/how-we-built-cloudflare-queues/)\n- [Behind the scenes with Stream Live, Cloudflare's live streaming service](https://blog.cloudflare.com/behind-the-scenes-with-stream-live-cloudflares-live-streaming-servi", "char_start": 8160, "char_end": 8960, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "4c1adf2784868a9d", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": " live streaming service](https://blog.cloudflare.com/behind-the-scenes-with-stream-live-cloudflares-live-streaming-service/)\n- [DO it again: how we used Durable Objects to add WebSockets support and authentication to AI Gateway](https://blog.cloudflare.com/do-it-again/)\n- [Workers Builds: integrated CI/CD built on the Workers platform](https://blog.cloudflare.com/workers-builds-integrated-ci-cd-built-on-the-workers-platform/)\n- [Build durable applications on Cloudflare Workers: you write the Workflows, we take care of the rest](https://blog.cloudflare.com/building-workflows-durable-execution-on-workers/)\n- [Building D1: a Global Database](https://blog.cloudflare.com/building-d1-a-global-database/)\n- [Billions and billions (of logs): scaling AI Gateway with the Cloudflare Developer Platform", "char_start": 8840, "char_end": 9640, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "d61568ff992b8e59", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "ing-d1-a-global-database/)\n- [Billions and billions (of logs): scaling AI Gateway with the Cloudflare Developer Platform](https://blog.cloudflare.com/billions-and-billions-of-logs-scaling-ai-gateway-with-the-cloudflare/)\n- [Indexing millions of HTTP requests using Durable Objects](https://blog.cloudflare.com/r2-rayid-retrieval/)\n\nFinally, the following blog posts may help you learn some of the technical implementation aspects of Durable Objects, and how they work.\n\n- [Durable Objects: Easy, Fast, Correct \u2014 Choose three](https://blog.cloudflare.com/durable-objects-easy-fast-correct-choose-three/)\n- [Zero-latency SQLite storage in every Durable Object](https://blog.cloudflare.com/sqlite-in-durable-objects/)\n- [Workers Durable Objects Beta: A New Approach to Stateful Serverless](https://blog.", "char_start": 9520, "char_end": 10320, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "4ba023dc39de724c", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "re.com/sqlite-in-durable-objects/)\n- [Workers Durable Objects Beta: A New Approach to Stateful Serverless](https://blog.cloudflare.com/introducing-workers-durable-objects/)\n\n## Get started\n\nGet started now by following the [\"Get started\" guide](/durable-objects/get-started/) to create your first application using Durable Objects.\n\n[^1]: Storage per Durable Object with SQLite is currently 1 GB. This will be raised to 10 GB for general availability.\n", "char_start": 10200, "char_end": 10652, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "ebb913b5ea2c1590", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "---\nsummary: Build a counter using Durable Objects and Workers with RPC methods.\npcx_content_type: example\ntitle: Build a counter\nsidebar:\n order: 3\ndescription: Build a counter using Durable Objects and Workers with RPC methods.\nreviewed: 2023-08-04\nproducts:\n - durable-objects\n - workers\n---\n\nimport { TabItem, Tabs, WranglerConfig } from \"~/components\";\n\nThis example shows how to build a counter using Durable Objects and Workers with [RPC methods](/workers/runtime-apis/rpc) that can print, increment, and decrement a `name` provided by the URL query string parameter, for example, `?name=A`.\n\n \n\n```js\nimport { DurableObject } from \"cloudflare:workers\";\n\n// Worker\nexport default {\n\tasync fetch(request, env) {\n\t\tlet url = new URL(re", "char_start": 0, "char_end": 800, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "dc46c04d5e89fc5b", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "rableObject } from \"cloudflare:workers\";\n\n// Worker\nexport default {\n\tasync fetch(request, env) {\n\t\tlet url = new URL(request.url);\n\t\tlet name = url.searchParams.get(\"name\");\n\t\tif (!name) {\n\t\t\treturn new Response(\n\t\t\t\t\"Select a Durable Object to contact by using\" +\n\t\t\t\t\t\" the `name` URL query string parameter, for example, ?name=A\",\n\t\t\t);\n\t\t}\n\n\t\t// A stub is a client Object used to send messages to the Durable Object.\n\t\tlet stub = env.COUNTERS.getByName(name);\n\n\t\t// Send a request to the Durable Object using RPC methods, then await its response.\n\t\tlet count = null;\n\t\tswitch (url.pathname) {\n\t\t\tcase \"/increment\":\n\t\t\t\tcount = await stub.increment();\n\t\t\t\tbreak;\n\t\t\tcase \"/decrement\":\n\t\t\t\tcount = await stub.decrement();\n\t\t\t\tbreak;\n\t\t\tcase \"/\":\n\t\t\t\t// Serves the current value.\n\t\t\t\tcount = await ", "char_start": 680, "char_end": 1480, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "528b7f25bae9745b", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "rement\":\n\t\t\t\tcount = await stub.decrement();\n\t\t\t\tbreak;\n\t\t\tcase \"/\":\n\t\t\t\t// Serves the current value.\n\t\t\t\tcount = await stub.getCounterValue();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn new Response(\"Not found\", { status: 404 });\n\t\t}\n\n\t\treturn new Response(`Durable Object '${name}' count: ${count}`);\n\t},\n};\n\n// Durable Object\nexport class Counter extends DurableObject {\n\tasync getCounterValue() {\n\t\tlet value = (await this.ctx.storage.get(\"value\")) || 0;\n\t\treturn value;\n\t}\n\n\tasync increment(amount = 1) {\n\t\tlet value = (await this.ctx.storage.get(\"value\")) || 0;\n\t\tvalue += amount;\n\t\t// You do not have to worry about a concurrent request having modified the value in storage.\n\t\t// \"input gates\" will automatically protect against unwanted concurrency.\n\t\t// Read-modify-write is safe.\n\t\tawait this.ctx.st", "char_start": 1360, "char_end": 2160, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "769ec96851b27ec9", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "nput gates\" will automatically protect against unwanted concurrency.\n\t\t// Read-modify-write is safe.\n\t\tawait this.ctx.storage.put(\"value\", value);\n\t\treturn value;\n\t}\n\n\tasync decrement(amount = 1) {\n\t\tlet value = (await this.ctx.storage.get(\"value\")) || 0;\n\t\tvalue -= amount;\n\t\tawait this.ctx.storage.put(\"value\", value);\n\t\treturn value;\n\t}\n}\n```\n\n \n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCOUNTERS: DurableObjectNamespace;\n}\n\n// Worker\nexport default {\n\tasync fetch(request, env) {\n\t\tlet url = new URL(request.url);\n\t\tlet name = url.searchParams.get(\"name\");\n\t\tif (!name) {\n\t\t\treturn new Response(\n\t\t\t\t\"Select a Durable Object to contact by using\" +\n\t\t\t\t\t\" the `name` URL query string p", "char_start": 2040, "char_end": 2840, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "d88e8fcbceec01cd", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "name) {\n\t\t\treturn new Response(\n\t\t\t\t\"Select a Durable Object to contact by using\" +\n\t\t\t\t\t\" the `name` URL query string parameter, for example, ?name=A\",\n\t\t\t);\n\t\t}\n\n\t\t// A stub is a client Object used to send messages to the Durable Object.\n\t\tlet stub = env.COUNTERS.get(name);\n\n\t\tlet count = null;\n\t\tswitch (url.pathname) {\n\t\t\tcase \"/increment\":\n\t\t\t\tcount = await stub.increment();\n\t\t\t\tbreak;\n\t\t\tcase \"/decrement\":\n\t\t\t\tcount = await stub.decrement();\n\t\t\t\tbreak;\n\t\t\tcase \"/\":\n\t\t\t\t// Serves the current value.\n\t\t\t\tcount = await stub.getCounterValue();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn new Response(\"Not found\", { status: 404 });\n\t\t}\n\n\t\treturn new Response(`Durable Object '${name}' count: ${count}`);\n\t},\n} satisfies ExportedHandler;\n\n// Durable Object\nexport class Counter extends DurableObject ", "char_start": 2720, "char_end": 3520, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "9b98a2838162b5b3", "doc_id": "durable-objects/examples/build-a-counter.md", "text": " count: ${count}`);\n\t},\n} satisfies ExportedHandler;\n\n// Durable Object\nexport class Counter extends DurableObject {\n\tasync getCounterValue() {\n\t\tlet value = (await this.ctx.storage.get(\"value\")) || 0;\n\t\treturn value;\n\t}\n\n\tasync increment(amount = 1) {\n\t\tlet value: number = (await this.ctx.storage.get(\"value\")) || 0;\n\t\tvalue += amount;\n\t\t// You do not have to worry about a concurrent request having modified the value in storage.\n\t\t// \"input gates\" will automatically protect against unwanted concurrency.\n\t\t// Read-modify-write is safe.\n\t\tawait this.ctx.storage.put(\"value\", value);\n\t\treturn value;\n\t}\n\n\tasync decrement(amount = 1) {\n\t\tlet value: number = (await this.ctx.storage.get(\"value\")) || 0;\n\t\tvalue -= amount;\n\t\tawait this.ctx.storage.put(\"value\", value);\n\t\treturn value;\n\t}\n}\n```\n\n", "char_start": 3400, "char_end": 4200, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "0bbf0d20fcab0bb0", "doc_id": "durable-objects/examples/build-a-counter.md", "text": ".storage.get(\"value\")) || 0;\n\t\tvalue -= amount;\n\t\tawait this.ctx.storage.put(\"value\", value);\n\t\treturn value;\n\t}\n}\n```\n\n \n\n```py\nfrom workers import DurableObject, Response, WorkerEntrypoint\nfrom urllib.parse import urlparse, parse_qs\n\n# Worker\nclass Default(WorkerEntrypoint):\n\tasync def fetch(self, request):\n\t\tparsed_url = urlparse(request.url)\n\t\tquery_params = parse_qs(parsed_url.query)\n\t\tname = query_params.get('name', [None])[0]\n\n\t\tif not name:\n\t\t\treturn Response(\n\t\t\t\t\"Select a Durable Object to contact by using\"\n\t\t\t\t+ \" the `name` URL query string parameter, for example, ?name=A\"\n\t\t\t)\n\n\t\t# A stub is a client Object used to send messages to the Durable Object.\n\t\tstub = self.env.COUNTERS.getByName(name)\n\n\t\t# Send a request to the Dura", "char_start": 4080, "char_end": 4880, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "6ba6cb98b648f920", "doc_id": "durable-objects/examples/build-a-counter.md", "text": " used to send messages to the Durable Object.\n\t\tstub = self.env.COUNTERS.getByName(name)\n\n\t\t# Send a request to the Durable Object using RPC methods, then await its response.\n\t\tcount = None\n\n\t\tif parsed_url.path == \"/increment\":\n\t\t\tcount = await stub.increment()\n\t\telif parsed_url.path == \"/decrement\":\n\t\t\tcount = await stub.decrement()\n\t\telif parsed_url.path == \"\" or parsed_url.path == \"/\":\n\t\t\t# Serves the current value.\n\t\t\tcount = await stub.getCounterValue()\n\t\telse:\n\t\t\treturn Response(\"Not found\", status=404)\n\n\t\treturn Response(f\"Durable Object '{name}' count: {count}\")\n\n# Durable Object\nclass Counter(DurableObject):\n\tdef __init__(self, ctx, env):\n\t\tsuper().__init__(ctx, env)\n\n\tasync def getCounterValue(self):\n\t\tvalue = await self.ctx.storage.get(\"value\")\n\t\treturn value if value is not No", "char_start": 4760, "char_end": 5560, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "c5d3387170f13ab8", "doc_id": "durable-objects/examples/build-a-counter.md", "text": " env)\n\n\tasync def getCounterValue(self):\n\t\tvalue = await self.ctx.storage.get(\"value\")\n\t\treturn value if value is not None else 0\n\n\tasync def increment(self, amount=1):\n\t\tvalue = await self.ctx.storage.get(\"value\")\n\t\tvalue = (value if value is not None else 0) + amount\n\t\t# You do not have to worry about a concurrent request having modified the value in storage.\n\t\t# \"input gates\" will automatically protect against unwanted concurrency.\n\t\t# Read-modify-write is safe.\n\t\tawait self.ctx.storage.put(\"value\", value)\n\t\treturn value\n\n\tasync def decrement(self, amount=1):\n\t\tvalue = await self.ctx.storage.get(\"value\")\n\t\tvalue = (value if value is not None else 0) - amount\n\t\tawait self.ctx.storage.put(\"value\", value)\n\t\treturn value\n```\n\n \n\nFinally, configure your Wrangler file to incl", "char_start": 5440, "char_end": 6240, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "e63a93a4ef6ae030", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "lf.ctx.storage.put(\"value\", value)\n\t\treturn value\n```\n\n \n\nFinally, configure your Wrangler file to include a Durable Object [binding](/durable-objects/get-started/#4-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously.\n\n\n\n```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"my-counter\",\n\t\"main\": \"src/index.ts\",\n\t\"durable_objects\": {\n\t\t\"bindings\": [\n\t\t\t{\n\t\t\t\t\"name\": \"COUNTERS\",\n\t\t\t\t\"class_name\": \"Counter\"\n\t\t\t}\n\t\t]\n\t},\n\t\"migrations\": [\n\t\t{\n\t\t\t\"tag\": \"v1\",\n\t\t\t\"new_sqlite_classes\": [\n\t\t\t\t\"Counter\"\n\t\t\t]\n\t\t}\n\t]\n}\n```\n\n\n\n### Related resources\n\n- [Workers RPC](/workers/runtime-apis/rpc/)\n- [Durable Objects: Easy, ", "char_start": 6120, "char_end": 6920, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "19fc640dd28774ae", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "\n}\n```\n\n\n\n### Related resources\n\n- [Workers RPC](/workers/runtime-apis/rpc/)\n- [Durable Objects: Easy, Fast, Correct \u2014 Choose three](https://blog.cloudflare.com/durable-objects-easy-fast-correct-choose-three/).\n", "char_start": 6800, "char_end": 7028, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "8c02fd408bf4079e", "doc_id": "durable-objects/platform/storage-options.md", "text": "---\npcx_content_type: navigation\ntitle: Choose a data or storage product\ndescription: Compare Cloudflare storage and data products to find the best option for your Durable Objects use case.\nexternal_link: /workers/platform/storage-options/\nsidebar:\n order: 3\nproducts:\n - durable-objects\n---\n", "char_start": 0, "char_end": 294, "metadata": {"title": "storage-options", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/platform/storage-options.md", "format": "markdown", "raw_hash": "33e8840fac344dafaf1d71dcbb6037a09674c1b004fbe840317e11db755fd98c"}} +{"chunk_id": "99a5f073e22c3c5e", "doc_id": "kv/concepts/how-kv-works.md", "text": "---\npcx_content_type: concept\ntitle: How KV works\ndescription: Workers KV stores data centrally and caches it globally, optimizing for high-read, low-latency workloads.\nsidebar:\n order: 6\nproducts:\n - kv\n---\n\nKV is a global, low-latency, key-value data store. It stores data in a small number of centralized data centers, then caches that data in Cloudflare's data centers after access.\n\nKV supports exceptionally high read volumes with low latency, making it possible to build dynamic APIs that scale thanks to KV's built-in caching and global distribution.\nRequests which are not in cache and need to access the central stores can experience higher latencies.\n\n## Write data to KV and read data from KV\n\nWhen you write to KV, your data is written to central data stores. Your data is not sent aut", "char_start": 0, "char_end": 800, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "210c2b9515a6bb50", "doc_id": "kv/concepts/how-kv-works.md", "text": "o KV and read data from KV\n\nWhen you write to KV, your data is written to central data stores. Your data is not sent automatically to every location's cache.\n\n![Your data is written to central data stores when you write to KV.](~/assets/images/kv/kv-write.svg)\n\nInitial reads from a location do not have a cached value. Data must be read from the nearest regional tier, followed by a central tier, degrading finally to the central stores for a truly cold global read. While the first access is slow globally, subsequent requests are faster, especially if requests are concentrated in a single region.\n\n:::note[Hot and cold read]\n\nA hot read means that the data is cached on Cloudflare's edge network using the [CDN](https://developers.cloudflare.com/cache/), whether it is in a local cache or a regio", "char_start": 680, "char_end": 1480, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "b6964e7a9f03ad92", "doc_id": "kv/concepts/how-kv-works.md", "text": "lare's edge network using the [CDN](https://developers.cloudflare.com/cache/), whether it is in a local cache or a regional cache. A cold read means that the data is not cached, so the data must be fetched from the central stores.\n:::\n\n![Initial reads will miss the cache and go to the nearest central data store first.](~/assets/images/kv/kv-slow-read.svg)\n\nFrequent reads from the same location return the cached value without reading from anywhere else, resulting in the fastest response times. KV operates diligently to update the cached values by refreshing from upper tier caches and central data stores before cache expires in the background.\n\nRefreshing from upper tiers and the central data stores in the background is done carefully so that assets that are being accessed continue to be kep", "char_start": 1360, "char_end": 2160, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "6e792c98ce1fabab", "doc_id": "kv/concepts/how-kv-works.md", "text": "nd the central data stores in the background is done carefully so that assets that are being accessed continue to be kept served from the cache without any stalls.\n\n![As mentioned above, frequent reads will return a cached value.](~/assets/images/kv/kv-fast-read.svg)\n\nKV is optimized for high-read applications. It stores data centrally and uses a hybrid push/pull-based replication to store data in cache. KV is suitable for use cases where you need to write relatively infrequently, but read quickly and frequently. Infrequently read values are pulled from other data centers or the central stores, while more popular values are cached in the data centers they are requested from.\n\n## Performance\n\nTo improve KV performance, increase the [`cacheTtl` parameter](/kv/api/read-key-value-pairs/#cachet", "char_start": 2040, "char_end": 2840, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "5262a2711af498fb", "doc_id": "kv/concepts/how-kv-works.md", "text": "om.\n\n## Performance\n\nTo improve KV performance, increase the [`cacheTtl` parameter](/kv/api/read-key-value-pairs/#cachettl-parameter) up from its default 60 seconds.\n\nKV achieves high performance by [caching](https://www.cloudflare.com/en-gb/learning/cdn/what-is-caching/) which makes reads eventually-consistent with writes.\n\nChanges are usually immediately visible in the Cloudflare global network location at which they are made. Changes may take up to 60 seconds or more to be visible in other global network locations as their cached versions of the data time out.\n\nNegative lookups indicating that the key does not exist are also cached, so the same delay exists noticing a value is created as when a value is changed.\n\n## Consistency\n\nKV achieves high performance by being eventually-consisten", "char_start": 2720, "char_end": 3520, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "ec59477af17deac5", "doc_id": "kv/concepts/how-kv-works.md", "text": "value is created as when a value is changed.\n\n## Consistency\n\nKV achieves high performance by being eventually-consistent. At the Cloudflare global network location at which changes are made, these changes are usually immediately visible. However, this is not guaranteed and therefore it is not advised to rely on this behaviour. In other global network locations changes may take up to 60 seconds or more to be visible as their cached versions of the data time-out.\n\nVisibility of changes takes longer in locations which have recently read a previous version of a given key (including reads that indicated the key did not exist, which are also cached locally).\n\n:::note\n\nKV is not ideal for applications where you need support for atomic operations or where values must be read and written in a sing", "char_start": 3400, "char_end": 4200, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "465d8574e3cf0c37", "doc_id": "kv/concepts/how-kv-works.md", "text": "t ideal for applications where you need support for atomic operations or where values must be read and written in a single transaction.\nIf you need stronger consistency guarantees, consider using [Durable Objects](/durable-objects/).\n:::\n\nAn approach to achieve write-after-write consistency is to send all of your writes for a given KV key through a corresponding instance of a Durable Object, and then read that value from KV in other Workers. This is useful if you need more control over writes, but are satisfied with KV's read characteristics described above.\n\n## Guidance\n\nWorkers KV is an eventually-consistent edge key-value store. That makes it ideal for **read-heavy**, highly cacheable workloads such as:\n\n- Serving static assets\n- Storing application configuration\n- Storing user preferen", "char_start": 4080, "char_end": 4880, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "b5ab2a81a03f933b", "doc_id": "kv/concepts/how-kv-works.md", "text": "highly cacheable workloads such as:\n\n- Serving static assets\n- Storing application configuration\n- Storing user preferences\n- Implementing allow-lists/deny-lists\n- Caching\n\nIn these scenarios, Workers are invoked in a data center closest to the user and Workers KV data will be cached in that region for subsequent requests to minimize latency.\n\nIf you have a **write-heavy** [Redis](https://redis.io)-type workload where you are updating the same key tens or hundreds of times per second, KV will not be an ideal fit.\nIf you can revisit how your application writes to single key-value pairs and spread your writes across several discrete keys, Workers KV can suit your needs.\nAlternatively, [Durable Objects](/durable-objects/) provides a key-value API with higher writes per key rate limits.\n\n## Se", "char_start": 4760, "char_end": 5560, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "ff9e8b3d3f2522b5", "doc_id": "kv/concepts/how-kv-works.md", "text": "ernatively, [Durable Objects](/durable-objects/) provides a key-value API with higher writes per key rate limits.\n\n## Security\n\nRefer to [Data security documentation](/kv/reference/data-security/) to understand how Workers KV secures data.\n", "char_start": 5440, "char_end": 5680, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "7f7155a30e907646", "doc_id": "kv/concepts/kv-bindings.md", "text": "---\npcx_content_type: concept\ntitle: KV bindings\ndescription: KV bindings connect a Cloudflare Worker to a KV namespace for reading and writing data.\ntags:\n - Bindings\nsidebar:\n order: 7\nproducts:\n - kv\n---\n\nimport { WranglerConfig } from \"~/components\";\n\nKV [bindings](/workers/runtime-apis/bindings/) allow for communication between a Worker and a KV namespace.\n\nConfigure KV bindings in the [Wrangler configuration file](/workers/wrangler/configuration/).\n\n## Access KV from Workers\n\nA [KV namespace](/kv/concepts/kv-namespaces/) is a key-value database replicated to Cloudflare's global network.\n\nTo connect to a KV namespace from within a Worker, you must define a binding that points to the namespace's ID.\n\nThe name of your binding does not need to match the KV namespace's name. Instead, t", "char_start": 0, "char_end": 800, "metadata": {"title": "kv-bindings", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md", "format": "markdown", "raw_hash": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78"}} +{"chunk_id": "7c7c5d7be4c1a742", "doc_id": "kv/concepts/kv-bindings.md", "text": " that points to the namespace's ID.\n\nThe name of your binding does not need to match the KV namespace's name. Instead, the binding should be a valid JavaScript identifier, because the identifier will exist as a global variable within your Worker.\n\nA KV namespace will have a name you choose (for example, `My tasks`), and an assigned ID (for example, `06779da6940b431db6e566b4846d64db`).\n\nTo execute your Worker, define the binding.\n\nIn the following example, the binding is called `TODO`. In the `kv_namespaces` portion of your Wrangler configuration file, add:\n\n\n\n```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"worker\",\n\t// ...\n\t\"kv_namespaces\": [\n\t\t{\n\t\t\t\"binding\": \"TODO\",\n\t\t\t\"id\": \"06779da6940b431db6e566b4846d64db\"\n\t\t}\n\t]\n}\n```\n\n\n", "char_start": 680, "char_end": 1480, "metadata": {"title": "kv-bindings", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md", "format": "markdown", "raw_hash": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78"}} +{"chunk_id": "4e728e0ce0ef022b", "doc_id": "kv/concepts/kv-bindings.md", "text": "kv_namespaces\": [\n\t\t{\n\t\t\t\"binding\": \"TODO\",\n\t\t\t\"id\": \"06779da6940b431db6e566b4846d64db\"\n\t\t}\n\t]\n}\n```\n\n\n\nWith this, the deployed Worker will have a `TODO` field in their environment object (the second parameter of the `fetch()` request handler). Any methods on the `TODO` binding will map to the KV namespace with an ID of `06779da6940b431db6e566b4846d64db` \u2013 which you called `My Tasks` earlier.\n\n```js\nexport default {\n async fetch(request, env, ctx) {\n // Get the value for the \"to-do:123\" key\n // NOTE: Relies on the `TODO` KV binding that maps to the \"My Tasks\" namespace.\n let value = await env.TODO.get(\"to-do:123\");\n\n // Return the value, as is, for the Response\n return new Response(value);\n },\n};\n```\n\n## Use KV bindings when developing locally\n\nWhen you us", "char_start": 1360, "char_end": 2160, "metadata": {"title": "kv-bindings", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md", "format": "markdown", "raw_hash": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78"}} +{"chunk_id": "ea23639a06385243", "doc_id": "kv/concepts/kv-bindings.md", "text": "s, for the Response\n return new Response(value);\n },\n};\n```\n\n## Use KV bindings when developing locally\n\nWhen you use Wrangler to develop locally with the `wrangler dev` command, Wrangler will default to using a local version of KV to avoid interfering with any of your live production data in KV. This means that reading keys that you have not written locally will return `null`.\n\nTo have `wrangler dev` connect to your Workers KV namespace running on Cloudflare's global network, set `\"remote\" : true` in the KV binding configuration. Refer to the [remote bindings documentation](/workers/local-development/#remote-bindings) for more information.\n\n\n\n```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"worker\",\n\t// ...\n\t\"kv_namespaces\": [\n\t\t{\n\t\t\t\"bind", "char_start": 2040, "char_end": 2840, "metadata": {"title": "kv-bindings", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md", "format": "markdown", "raw_hash": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78"}} +{"chunk_id": "ccd7bca3285379ca", "doc_id": "kv/concepts/kv-bindings.md", "text": "\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"worker\",\n\t// ...\n\t\"kv_namespaces\": [\n\t\t{\n\t\t\t\"binding\": \"TODO\",\n\t\t\t\"id\": \"06779da6940b431db6e566b4846d64db\"\n\t\t}\n\t]\n}\n```\n\n\n\n## Access KV from Durable Objects and Workers using ES modules format\n\n[Durable Objects](/durable-objects/) use ES modules format. Instead of a global variable, bindings are available as properties of the `env` parameter [passed to the constructor](/durable-objects/get-started/#2-write-a-durable-object-class).\n\nAn example might look like:\n\n```js\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport class MyDurableObject extends DurableObject {\n constructor(ctx, env) {\n super(ctx, env);\n }\n\n async fetch(request) {\n const valueFromKV = await this.env.NAMESPACE.get(\"some", "char_start": 2720, "char_end": 3520, "metadata": {"title": "kv-bindings", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md", "format": "markdown", "raw_hash": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78"}} +{"chunk_id": "c38726920a9ad04e", "doc_id": "kv/concepts/kv-bindings.md", "text": "tx, env) {\n super(ctx, env);\n }\n\n async fetch(request) {\n const valueFromKV = await this.env.NAMESPACE.get(\"someKey\");\n return new Response(valueFromKV);\n }\n}\n```\n", "char_start": 3400, "char_end": 3575, "metadata": {"title": "kv-bindings", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md", "format": "markdown", "raw_hash": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78"}} +{"chunk_id": "206647a653f63cf0", "doc_id": "kv/concepts/kv-namespaces.md", "text": "---\npcx_content_type: concept\ntitle: KV namespaces\ndescription: A KV namespace is a key-value database replicated across Cloudflare's global network.\nsidebar:\n order: 7\nproducts:\n - kv\n---\nimport { Type, MetaInfo, WranglerConfig, DashButton } from \"~/components\";\n\nA KV namespace is a key-value database replicated to Cloudflare\u2019s global network.\n\nBind your KV namespaces through Wrangler or via the Cloudflare dashboard.\n\n:::note\n\nKV namespace IDs are public and bound to your account.\n\n:::\n\n## Bind your KV namespace through Wrangler\n\nTo bind KV namespaces to your Worker, assign an array of the below object to the `kv_namespaces` key.\n\n* `binding` \n\n * The binding name used to refer to the KV namespace.\n\n* `id` \n\n * The binding name used to refer to the KV namespace.\n\n* `id` \n\n * The ID of the KV namespace.\n\n* `preview_id` \n\n * The ID of the KV namespace used during `wrangler dev`.\n\nExample:\n\n\n\n```jsonc\n{\n\t\"kv_namespaces\": [\n\t\t{\n\t\t\t\"binding\": \"\",\n\t\t\t\"id\": \"\"\n\t\t}\n\t]\n}\n```\n\n\n\n## Bind your KV namespace via the dashboard\n\nTo bind the namespace to your Worker in the Cloudflare dashboard:\n\n1. In the Cloudflare dashboard, go to the **Workers & Pages** page.\n\n \n2. Select your **Worker**.\n3. Select **Settings** > **Bindings**.\n4. Select **Add**.\n5. Select **KV Namesp", "char_start": 680, "char_end": 1480, "metadata": {"title": "kv-namespaces", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-namespaces.md", "format": "markdown", "raw_hash": "2f64b8fb39ce55bc43d5a6f7e36d5af10e672f9e9ec64d1f1e918258ad7ddbfc"}} +{"chunk_id": "1a784f7a825888e5", "doc_id": "kv/concepts/kv-namespaces.md", "text": "and-pages\" />\n2. Select your **Worker**.\n3. Select **Settings** > **Bindings**.\n4. Select **Add**.\n5. Select **KV Namespace**.\n6. Enter your desired variable name (the name of the binding).\n7. Select the KV namespace you wish to bind the Worker to.\n8. Select **Deploy**.\n", "char_start": 1360, "char_end": 1631, "metadata": {"title": "kv-namespaces", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-namespaces.md", "format": "markdown", "raw_hash": "2f64b8fb39ce55bc43d5a6f7e36d5af10e672f9e9ec64d1f1e918258ad7ddbfc"}} +{"chunk_id": "d75e68329fbe5909", "doc_id": "kv/examples/cache-data-with-workers-kv.md", "text": "---\nsummary: Cache data or API responses in Workers KV to improve application performance\npcx_content_type: example\ntitle: Cache data with Workers KV\nsidebar:\n order: 5\ndescription: Example of how to use Workers KV to build a distributed application configuration store.\nreviewed: 2025-03-27\nproducts:\n - kv\n---\n\nimport { Render, PackageManagers, Tabs, TabItem } from \"~/components\";\n\nWorkers KV can be used as a persistent, single, global cache accessible from Cloudflare Workers to speed up your application.\nData cached in Workers KV is accessible from all other Cloudflare locations as well, and persists until expiry or deletion.\n\nAfter fetching data from external resources in your Workers application, you can write the data to Workers KV.\nOn subsequent Worker requests (in the same region o", "char_start": 0, "char_end": 800, "metadata": {"title": "cache-data-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", "format": "markdown", "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87"}} +{"chunk_id": "3ebcf9c660fc9681", "doc_id": "kv/examples/cache-data-with-workers-kv.md", "text": "s in your Workers application, you can write the data to Workers KV.\nOn subsequent Worker requests (in the same region or in other regions), you can read the cached data from Workers KV instead of calling the external API.\nThis improves your Worker application's performance and resilience while reducing load on external resources.\n\nThis example shows how you can cache data in Workers KV and read cached data from Workers KV in a Worker application.\n\n:::note[Note]\n\nYou can also cache data in Workers with the [Cache API](/workers/runtime-apis/cache/). With the Cache API,\nthe contents of the cache do not replicate outside of the originating data center and the cache is ephemeral (can be evicted).\n\nWith Workers KV, the data is persisted by default to [central stores](/kv/concepts/how-kv-works/)", "char_start": 680, "char_end": 1480, "metadata": {"title": "cache-data-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", "format": "markdown", "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87"}} +{"chunk_id": "211464025e648195", "doc_id": "kv/examples/cache-data-with-workers-kv.md", "text": "ral (can be evicted).\n\nWith Workers KV, the data is persisted by default to [central stores](/kv/concepts/how-kv-works/) (or can be set to [expire](/kv/api/write-key-value-pairs/#expiring-keys), and can be accessed from other Cloudflare locations.\n:::\n\n## Cache data in Workers KV from your Worker application\n\nIn the following `index.ts` file, the Worker fetches data from an external server and caches the response in Workers KV. If the data is already cached in Workers KV, the Worker reads the cached data from Workers KV instead of calling the external API.\n\n\n\n```js title=\"index.ts\" collapse={42-1000}\ninterface Env {\n CACHE_KV: KVNamespace;\n}\n\nexport default {\n async fetch(request, env, ctx): Promise {\n\n const EXPIRATION_TTL = 30; // Cache exp", "char_start": 1360, "char_end": 2160, "metadata": {"title": "cache-data-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", "format": "markdown", "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87"}} +{"chunk_id": "f6a3fdbcefed8b62", "doc_id": "kv/examples/cache-data-with-workers-kv.md", "text": "\n}\n\nexport default {\n async fetch(request, env, ctx): Promise {\n\n const EXPIRATION_TTL = 30; // Cache expiration in seconds\n const url = 'https://example.com';\n const cacheKey = \"cache-json-example\";\n\n // Try to get data from KV cache first\n let data = await env.CACHE_KV.get(cacheKey, { type: 'json' });\n let fromCache = true;\n\n // If data is not in cache, fetch it from example.com\n if (!data) {\n console.log('Cache miss. Fetching fresh data from example.com');\n fromCache = false;\n\n \t\t// In this example, we are fetching HTML content but it can also be API responses or any other data\n const response = await fetch(url);\n \t\tconst htmlData = await response.text();\n\n \t\t// In this example, we are converting HTML to JSON to demonstrate cac", "char_start": 2040, "char_end": 2840, "metadata": {"title": "cache-data-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", "format": "markdown", "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87"}} +{"chunk_id": "f59bc9945918c00c", "doc_id": "kv/examples/cache-data-with-workers-kv.md", "text": " \t\tconst htmlData = await response.text();\n\n \t\t// In this example, we are converting HTML to JSON to demonstrate caching JSON data with Workers KV\n \t\t// You could cache any type of data, or even cache the HTML data directly\n \t\tdata = helperConvertToJSON(htmlData);\n \t\t// The expirationTtl option is used to set the expiration time for the cache entry (in seconds), otherwise it will be stored indefinitely\n \t\tawait env.CACHE_KV.put(cacheKey, JSON.stringify(data), { expirationTtl: EXPIRATION_TTL });\n }\n\n // Return the appropriate response format\n \treturn new Response(JSON.stringify({\n \t\tdata,\n \t\tfromCache\n \t}), {\n \t\theaders: { 'Content-Type': 'application/json' }\n \t});\n\n}\n} satisfies ExportedHandler;\n\n// Helper function to convert HTML to JSON\nfuncti", "char_start": 2720, "char_end": 3520, "metadata": {"title": "cache-data-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", "format": "markdown", "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87"}} +{"chunk_id": "c7392efad75a3e34", "doc_id": "kv/examples/cache-data-with-workers-kv.md", "text": "': 'application/json' }\n \t});\n\n}\n} satisfies ExportedHandler;\n\n// Helper function to convert HTML to JSON\nfunction helperConvertToJSON(html: string) {\n// Parse HTML and extract relevant data\nconst title = helperExtractTitle(html);\nconst content = helperExtractContent(html);\nconst lastUpdated = new Date().toISOString();\n\n return { title, content, lastUpdated };\n\n}\n\n// Helper function to extract title from HTML\nfunction helperExtractTitle(html: string) {\nconst titleMatch = html.match(/(.\\*?)<\\/title>/i);\nreturn titleMatch ? titleMatch[1] : 'No title found';\n}\n\n// Helper function to extract content from HTML\nfunction helperExtractContent(html: string) {\nconst bodyMatch = html.match(/<body>(.\\*?)<\\/body>/is);\nif (!bodyMatch) return 'No content found';\n\n // Strip HTML tags ", "char_start": 3400, "char_end": 4200, "metadata": {"title": "cache-data-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", "format": "markdown", "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87"}} +{"chunk_id": "32df81bd58da66e8", "doc_id": "kv/examples/cache-data-with-workers-kv.md", "text": "st bodyMatch = html.match(/<body>(.\\*?)<\\/body>/is);\nif (!bodyMatch) return 'No content found';\n\n // Strip HTML tags for a simple text representation\n const textContent = bodyMatch[1].replace(/<[^>]*>/g, ' ')\n \t.replace(/\\s+/g, ' ')\n \t.trim();\n\n return textContent;\n\n}\n\n```\n</TabItem>\n<TabItem label=\"wrangler.jsonc\">\n```json\n{\n\t\"$schema\": \"node_modules/wrangler/config-schema.json\",\n\t\"name\": \"<ENTER_WORKER_NAME>\",\n\t\"main\": \"src/index.ts\",\n\t\"compatibility_date\": \"2025-03-03\",\n\t\"observability\": {\n\t\t\"enabled\": true\n\t},\n\t\"kv_namespaces\": [\n\t\t{\n\t\t\t\"binding\": \"CACHE_KV\",\n\t\t\t\"id\": \"<YOUR_BINDING_ID>\"\n\t\t}\n\t]\n}\n```\n\n</TabItem>\n</Tabs>\n\nThis code snippet demonstrates how to read and update cached data in Workers KV from your Worker.\nIf the data is not in the Workers KV cache, the Worker", "char_start": 4080, "char_end": 4880, "metadata": {"title": "cache-data-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", "format": "markdown", "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87"}} +{"chunk_id": "ebcdd2c559bab23f", "doc_id": "kv/examples/cache-data-with-workers-kv.md", "text": "ow to read and update cached data in Workers KV from your Worker.\nIf the data is not in the Workers KV cache, the Worker fetches the data from an external server and caches it in Workers KV.\n\nIn this example, we convert HTML to JSON to demonstrate how to cache JSON data with Workers KV, but any type of data\ncan be cached in Workers KV. For instance, you could cache API responses, HTML content, or any other data that you want to persist across requests.\n\n## Related resources\n\n- [Rust support in Workers](/workers/languages/rust/).\n- [Using KV in Workers](/kv/get-started/).\n", "char_start": 4760, "char_end": 5338, "metadata": {"title": "cache-data-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", "format": "markdown", "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87"}} +{"chunk_id": "6384ce26d076790f", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "---\nsummary: Use Workers KV to as a geo-distributed, low-latency configuration store for your Workers application\npcx_content_type: example\ntitle: Build a distributed configuration store\nsidebar:\n order: 5\ndescription: Example of how to use Workers KV to build a distributed application configuration store.\nreviewed: 2025-03-27\nproducts:\n - kv\n---\n\nimport { Render, PackageManagers, Tabs, TabItem } from \"~/components\";\n\nStoring application configuration data is an ideal use case for Workers KV. Configuration data can include data to personalize an application for each user or tenant, enable features for user groups, restrict access with allow-lists/deny-lists, etc. These use-cases can have high read volumes that are highly cacheable by Workers KV, which can ensure low-latency reads from yo", "char_start": 0, "char_end": 800, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "5e7cbf4b587441b6", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "use-cases can have high read volumes that are highly cacheable by Workers KV, which can ensure low-latency reads from your Workers application.\n\nIn this example, application configuration data is used to personalize the Workers application for each user. The configuration data is stored in an external application and database, and written to Workers KV using the REST API.\n\n## Write your configuration from your external application to Workers KV\n\nIn some cases, your source-of-truth for your configuration data may be stored elsewhere than Workers KV.\nIf this is the case, use the Workers KV REST API to write the configuration data to your Workers KV namespace.\n\nThe following external Node.js application demonstrates a simple scripts that reads user data from a database and writes it to Worker", "char_start": 680, "char_end": 1480, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "dfdfd495ff4a6be2", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": " external Node.js application demonstrates a simple scripts that reads user data from a database and writes it to Workers KV using the REST API library.\n\n<Tabs>\n<TabItem label=\"index.js\">\n```js title=\"index.js\"\nconst postgres = require('postgres');\nconst { Cloudflare } = require('cloudflare');\nconst { backOff } = require('exponential-backoff');\n\nif(!process.env.DATABASE_CONNECTION_STRING || !process.env.CLOUDFLARE_EMAIL || !process.env.CLOUDFLARE_API_KEY || !process.env.CLOUDFLARE_WORKERS_KV_NAMESPACE_ID || !process.env.CLOUDFLARE_ACCOUNT_ID) {\nconsole.error('Missing required environment variables.');\nprocess.exit(1);\n}\n\n// Setup Postgres connection\nconst sql = postgres(process.env.DATABASE_CONNECTION_STRING);\n\n// Setup Cloudflare REST API client\nconst client = new Cloudflare({\napiEmail: p", "char_start": 1360, "char_end": 2160, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "b0e7be410eead45c", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "rocess.env.DATABASE_CONNECTION_STRING);\n\n// Setup Cloudflare REST API client\nconst client = new Cloudflare({\napiEmail: process.env.CLOUDFLARE_EMAIL,\napiKey: process.env.CLOUDFLARE_API_KEY,\n});\n\n// Function to sync Postgres data to Workers KV\nasync function syncPreviewStatus() {\nconsole.log('Starting sync of user preview status...');\n\n try {\n \t// Get all users and their preview status\n \tconst users = await sql`SELECT id, preview_features_enabled FROM users`;\n\n \tconsole.log(users);\n\n \t// Create the bulk update body\n \tconst bulkUpdateBody = users.map(user => ({\n \t\tkey: user.id,\n \t\tvalue: JSON.stringify({\n \t\t\tpreview_features_enabled: user.preview_features_enabled\n \t\t})\n \t}));\n\n \tconst response = await backOff(async () => {\n \t\tconsole.log(\"trying to updat", "char_start": 2040, "char_end": 2840, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "ffb7b523dd8660fc", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "eatures_enabled\n \t\t})\n \t}));\n\n \tconst response = await backOff(async () => {\n \t\tconsole.log(\"trying to update\")\n \t\ttry{\n \t\t\tconst response = await client.kv.namespaces.bulkUpdate(process.env.CLOUDFLARE_WORKERS_KV_NAMESPACE_ID, {\n \t\t\t\taccount_id: process.env.CLOUDFLARE_ACCOUNT_ID,\n \t\t\t\tbody: bulkUpdateBody\n \t\t\t});\n \t\t}\n \t\tcatch(e){\n \t\t\t// Implement your error handling and logging here\n \t\t\tconsole.log(e);\n \t\t\tthrow e; // Rethrow the error to retry\n \t\t}\n \t});\n\n \tconsole.log(`Sync complete. Updated ${users.length} users.`);\n } catch (error) {\n \tconsole.error('Error syncing preview status:', error);\n }\n\n}\n\n// Run the sync function\nsyncPreviewStatus()\n.catch(console.error)\n.finally(() => process.exit(0));\n\n```\n</TabItem>\n<TabItem label=", "char_start": 2720, "char_end": 3520, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "57a9f8004cc3c9c5", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "sync function\nsyncPreviewStatus()\n.catch(console.error)\n.finally(() => process.exit(0));\n\n```\n</TabItem>\n<TabItem label=\".env\">\n```md title=\".env\"\nDATABASE_CONNECTION_STRING = <DB_CONNECTION_STRING_HERE>\nCLOUDFLARE_EMAIL = <CLOUDFLARE_EMAIL_HERE>\nCLOUDFLARE_API_KEY = <CLOUDFLARE_API_KEY_HERE>\nCLOUDFLARE_ACCOUNT_ID = <CLOUDFLARE_ACCOUNT_ID_HERE>\nCLOUDFLARE_WORKERS_KV_NAMESPACE_ID = <CLOUDFLARE_WORKERS_KV_NAMESPACE_ID_HERE>\n```\n\n</TabItem>\n<TabItem label=\"db.sql\">\n```sql title=\"db.sql\"\n-- Create users table with preview_features_enabled flag\nCREATE TABLE users (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n username VARCHAR(100) NOT NULL,\n email VARCHAR(255) NOT NULL,\n preview_features_enabled BOOLEAN DEFAULT false\n);\n\n-- Insert sample users\nINSERT INTO users (username, email, preview", "char_start": 3400, "char_end": 4200, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "e2a8e8a574bb7027", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "\n preview_features_enabled BOOLEAN DEFAULT false\n);\n\n-- Insert sample users\nINSERT INTO users (username, email, preview_features_enabled) VALUES\n('alice', 'alice@example.com', true),\n('bob', 'bob@example.com', false),\n('charlie', 'charlie@example.com', true);\n\n```\n</TabItem>\n</Tabs>\n\nIn this code snippet, the Node.js application reads user data from a Postgres database and writes the user data to be used for configuration in our Workers application to Workers KV using the Cloudflare REST API Node.js library.\nThe application also uses exponential backoff to handle retries in case of errors.\n\n## Use configuration data from Workers KV in your Worker application\n\nWith the configuration data now in the Workers KV namespace, we can use it in our Workers application to personalize the applicatio", "char_start": 4080, "char_end": 4880, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "8a66e2388bff9e7a", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "nfiguration data now in the Workers KV namespace, we can use it in our Workers application to personalize the application for each user.\n\n<Tabs>\n<TabItem label=\"index.ts\">\n```js title=\"index.ts\"\n// Example configuration data stored in Workers KV:\n// Key: \"user-id-abc\" | Value: {\"preview_features_enabled\": false}\n// Key: \"user-id-def\" | Value: {\"preview_features_enabled\": true}\n\ninterface Env {\n USER_CONFIGURATION: KVNamespace;\n}\n\nexport default {\n async fetch(request, env) {\n // Get user ID from query parameter\n const url = new URL(request.url);\n const userId = url.searchParams.get('userId');\n\n if (!userId) {\n return new Response('Please provide a userId query parameter', {\n status: 400,\n headers: { 'Content-Type': 'text/plain' }\n });\n }\n\n\n\t\tconst u", "char_start": 4760, "char_end": 5560, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "401ffa22d5918bb6", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "d query parameter', {\n status: 400,\n headers: { 'Content-Type': 'text/plain' }\n });\n }\n\n\n\t\tconst userConfiguration = await env.USER_CONFIGURATION.get<{\n\t\t\tpreview_features_enabled: boolean;\n\t\t}>(userId, {type: \"json\"});\n\n\t\tconsole.log(userConfiguration);\n\n // Build HTML response\n const html = `\n <!DOCTYPE html>\n <html>\n <head>\n <title>My App\n \n \n \n ${userConfiguration?.preview_features_enabled ? `\n
\n \ud83c\udf89 You have early access to preview features! \ud83c\udf89\n
\n ` : ''}\n

Welcome to My App

\n

This is the regular content everyone sees.

\n \n \n `;\n\n return new Response(html, {\n\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" }\n });\n }\n} satisfies ExportedHandler;\n\n```\n
\n\n```json\n{\n\t\"$schema\": \"node_modules/wrangler/config-schema.json\",\n\t\"name\": \"\",\n\t", "char_start": 6120, "char_end": 6920, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "5958f527cb589832", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "el=\"wrangler.jsonc\">\n```json\n{\n\t\"$schema\": \"node_modules/wrangler/config-schema.json\",\n\t\"name\": \"\",\n\t\"main\": \"src/index.ts\",\n\t\"compatibility_date\": \"2025-03-03\",\n\t\"observability\": {\n\t\t\"enabled\": true\n\t},\n\t\"kv_namespaces\": [\n\t\t{\n\t\t\t\"binding\": \"USER_CONFIGURATION\",\n\t\t\t\"id\": \"\"\n\t\t}\n\t]\n}\n```\n\n\n
\n\nThis code will use the path within the URL and find the file associated to the path within the KV store. It also sets the proper MIME type in the response to inform the browser how to handle the response. To retrieve the value from the KV store, this code uses `arrayBuffer` to properly handle binary data such as images, documents, and video/audio files.\n\n## Optimize performance for configuration\n\nTo optimize performance, you may opt to consolidate va", "char_start": 6800, "char_end": 7600, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "5acfbe912551359f", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "nd video/audio files.\n\n## Optimize performance for configuration\n\nTo optimize performance, you may opt to consolidate values in fewer key-value pairs. By doing so, you may benefit from higher caching efficiency and lower latency.\n\nFor example, instead of storing each user's configuration in a separate key-value pair, you may store all users' configurations in a single key-value pair. This approach may be suitable for use-cases where the configuration data is small and can be easily managed in a single key-value pair (the [size limit for a Workers KV value is 25 MiB](/kv/platform/limits/)).\n\n## Related resources\n\n- [Rust support in Workers](/workers/languages/rust/)\n- [Using KV in Workers](/kv/get-started/)\n", "char_start": 7480, "char_end": 8196, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "c31fb4f2cccb9c5f", "doc_id": "kv/index.md", "text": "---\ntitle: Cloudflare Workers KV\ndescription: Workers KV is a global, low-latency, key-value data store for building dynamic and performant APIs and websites.\npcx_content_type: overview\nsidebar:\n order: 1\nproducts:\n - kv\n---\n\nimport {\n\tCardGrid,\n\tDescription,\n\tFeature,\n\tLinkTitleCard,\n\tPlan,\n\tRelatedProduct,\n\tTabs,\n\tTabItem,\n\tLinkButton,\n} from \"~/components\";\n\n\n\nCreate a global, low-latency, key-value data storage.\n\n\n\n\n\nWorkers KV is a data storage that allows you to store and retrieve data globally. With Workers KV, you can build dynamic and performant APIs and websites that support high read volumes with low latency.\n\nFor example, you can use Workers KV for:\n\n- Caching API responses.\n- Storing user configurations / preferences.\n- S", "char_start": 0, "char_end": 800, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "e68f3dce3f4ad348", "doc_id": "kv/index.md", "text": "cy.\n\nFor example, you can use Workers KV for:\n\n- Caching API responses.\n- Storing user configurations / preferences.\n- Storing user authentication details.\n\nAccess your Workers KV namespace from Cloudflare Workers using [Workers Bindings](/workers/runtime-apis/bindings/) or from your external application using the REST API:\n\n\n\n\t\n\t\n```ts\nexport default {\n\tasync fetch(request, env, ctx): Promise {\n\t\t// write a key-value pair\n\t\tawait env.KV.put('KEY', 'VALUE');\n\n\t\t// read a key-value pair\n\t\tconst value = await env.KV.get('KEY');\n\n\t\t// list all key-value pairs\n\t\tconst allKeys = await env.KV.list();\n\n\t\t// delete a key-value pair\n\t\tawait env.KV.delete('KEY');\n\n\t\t// return a Workers response\n\t\treturn new Response", "char_start": 680, "char_end": 1480, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "9de53ab0ddc9e59d", "doc_id": "kv/index.md", "text": "ist();\n\n\t\t// delete a key-value pair\n\t\tawait env.KV.delete('KEY');\n\n\t\t// return a Workers response\n\t\treturn new Response(\n\t\t\tJSON.stringify({\n\t\t\t\tvalue: value,\n\t\t\t\tallKeys: allKeys,\n\t\t\t}),\n\t\t);\n\t},\n\n} satisfies ExportedHandler<{ KV: KVNamespace }>;\n\n ```\n \n \n\n```json\n{\n\t\"$schema\": \"node_modules/wrangler/config-schema.json\",\n\t\"name\": \"\",\n\t\"main\": \"src/index.ts\",\n\t\"compatibility_date\": \"2025-02-04\",\n\t\"observability\": {\n\t\t\"enabled\": true\n\t},\n\n\t\"kv_namespaces\": [\n\t\t{\n\t\t\t\"binding\": \"KV\",\n\t\t\t\"id\": \"\"\n\t\t}\n\t]\n}\n```\n\n \n \n\nSee the full [Workers KV binding API reference](/kv/api/read-key-value-pairs/).\n\n\n\n\n \n \t\n \t```\n ", "char_start": 1360, "char_end": 2160, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "048592596793cd46", "doc_id": "kv/index.md", "text": "/api/read-key-value-pairs/).\n\n\n\n\n \n \t\n \t```\n \tcurl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/storage/kv/namespaces/$NAMESPACE_ID/values/$KEY_NAME \\\n \t\t\t-X PUT \\\n \t\t\t-H 'Content-Type: multipart/form-data' \\\n \t\t\t-H \"X-Auth-Email: $CLOUDFLARE_EMAIL\" \\\n \t\t\t-H \"X-Auth-Key: $CLOUDFLARE_API_KEY\" \\\n \t\t\t-d '{\n \t\t\t\t\"value\": \"Some Value\"\n \t\t\t}'\n\n \tcurl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/storage/kv/namespaces/$NAMESPACE_ID/values/$KEY_NAME \\\n \t\t\t-H \"X-Auth-Email: $CLOUDFLARE_EMAIL\" \\\n \t\t\t-H \"X-Auth-Key: $CLOUDFLARE_API_KEY\"\n \t```\n \t\n \t\n \t\t```ts\n \t\tconst client = new Cloudflare({\n \t\t\tapiEmail: process.env", "char_start": 2040, "char_end": 2840, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "eb51c9eae46c73ad", "doc_id": "kv/index.md", "text": "abItem>\n \t\n \t\t```ts\n \t\tconst client = new Cloudflare({\n \t\t\tapiEmail: process.env['CLOUDFLARE_EMAIL'], // This is the default and can be omitted\n \t\t\tapiKey: process.env['CLOUDFLARE_API_KEY'], // This is the default and can be omitted\n \t\t});\n\n \t\tconst value = await client.kv.namespaces.values.update('', 'KEY', {\n \t\t\taccount_id: '',\n \t\t\tvalue: 'VALUE',\n \t\t});\n\n \t\tconst value = await client.kv.namespaces.values.get('', 'KEY', {\n \t\t\taccount_id: '',\n \t\t});\n\n \t\tconst value = await client.kv.namespaces.values.delete('', 'KEY', {\n \t\t\taccount_id: '',\n \t\t});\n\n \t\t// Automatically fetches more pages as needed.\n \t\tfor await (const namesp", "char_start": 2720, "char_end": 3520, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "d463031a31113574", "doc_id": "kv/index.md", "text": "ccount_id: '',\n \t\t});\n\n \t\t// Automatically fetches more pages as needed.\n \t\tfor await (const namespace of client.kv.namespaces.list({ account_id: '' })) {\n \t\t\tconsole.log(namespace.id);\n \t\t}\n\n \t\t```\n \t\n \n\nSee the full Workers KV [REST API and SDK reference](/api/resources/kv/) for details on using REST API from external applications, with pre-generated SDK's for external TypeScript, Python, or Go applications.\n\n\n\n\nGet started\n\n---\n\n## Features\n\n\n\tLearn how Workers KV stores and retrieves data.\n\n\n\n\nThe Workers command-line", "char_start": 3400, "char_end": 4200, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "418030b46355b1b9", "doc_id": "kv/index.md", "text": "ves data.\n\n\n\n\nThe Workers command-line interface, Wrangler, allows you to [create](/workers/wrangler/commands/general/#init), [test](/workers/wrangler/commands/general/#dev), and [deploy](/workers/wrangler/commands/pages/#pages-deploy) your Workers projects.\n\n\n\n\n\nBindings allow your Workers to interact with resources on the Cloudflare developer platform, including [R2](/r2/), [Durable Objects](/durable-objects/), and [D1](/d1/).\n\n\n\n---\n\n## Related products\n\n\n\nCloudflare R2 Storage allows developers to store large amounts of unstructured data without the costly egress bandwidth f", "char_start": 4080, "char_end": 4880, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "b8360ee4a86dc8bf", "doc_id": "kv/index.md", "text": "loudflare R2 Storage allows developers to store large amounts of unstructured data without the costly egress bandwidth fees associated with typical cloud storage services.\n\n\n\n\n\nCloudflare Durable Objects allows developers to access scalable compute and permanent, consistent storage.\n\n\n\n\n\nBuilt on SQLite, D1 is Cloudflare\u2019s first queryable relational database. Create an entire database by importing data or defining your tables and writing your queries within a Worker or through the API.\n\n\n\n---\n\n### More resources\n\n\n\n\n\n---\n\n### More resources\n\n\n\n\n\t Learn about KV limits.\n\n\n\n\t Learn about KV pricing.\n\n\n\n\t Ask questions, show off what you are building, and discuss the platform\n\twith other developers.\n\n\n\n\t Learn about product announcements, new tutorials, and what is new in\n\tCloudflare Developer Platform.\n\n\n\n", "char_start": 5440, "char_end": 6202, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "04df109282ce4b38", "doc_id": "queues/configuration/batching-retries.md", "text": "---\ntitle: Batching, Retries and Delays\ndescription: Configure message batching, retry behavior, and delivery delays for Cloudflare Queues.\npcx_content_type: concept\nsidebar:\n order: 2\nproducts:\n - queues\n---\n\nimport { WranglerConfig, TypeScriptExample, Tabs, TabItem } from \"~/components\";\n\n## Batching\n\nWhen configuring a [consumer Worker](/queues/reference/how-queues-works#consumers) for a queue, you can also define how messages are batched as they are delivered.\n\nBatching can:\n\n1. Reduce the total number of times your consumer Worker needs to be invoked (which can reduce costs).\n2. Allow you to batch messages when writing to an external API or service (reducing writes).\n3. Disperse load over time, especially if your producer Workers are associated with user-facing activity.\n\nThere are ", "char_start": 0, "char_end": 800, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "f75cc279b15e0edf", "doc_id": "queues/configuration/batching-retries.md", "text": ").\n3. Disperse load over time, especially if your producer Workers are associated with user-facing activity.\n\nThere are two ways to configure how messages are batched. You configure batching when connecting your consumer Worker to a queue.\n\n- `max_batch_size` - The maximum size of a batch delivered to a consumer (defaults to 10 messages).\n- `max_batch_timeout` - the _maximum_ amount of time the queue will wait before delivering a batch to a consumer (defaults to 5 seconds)\n\n:::note[Batch size configuration]\n\nBoth `max_batch_size` and `max_batch_timeout` work together. Whichever limit is reached first will trigger the delivery of a batch.\n\n:::\n\nFor example, a `max_batch_size = 30` and a `max_batch_timeout = 10` means that if 30 messages are written to the queue, the consumer will receive a ", "char_start": 680, "char_end": 1480, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "e30d988a3bc1e24c", "doc_id": "queues/configuration/batching-retries.md", "text": "ze = 30` and a `max_batch_timeout = 10` means that if 30 messages are written to the queue, the consumer will receive a batch of 30 messages. However, if it takes longer than 10 seconds for those 30 messages to be written to the queue, then the consumer will get a batch of messages that contains however many messages were on the queue at the time (somewhere between 1 and 29, in this case).\n\n:::note[Empty queues]\n\nWhen a queue is empty, a push-based (Worker) consumer's `queue` handler will not be invoked until there are messages to deliver. A queue does not attempt to push empty batches to a consumer and thus does not invoke unnecessary reads.\n\n[Pull-based consumers](/queues/configuration/pull-consumers/) that attempt to pull from a queue, even when empty, will incur a read operation.\n\n:::\n", "char_start": 1360, "char_end": 2160, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "c287216d3b8fd5fd", "doc_id": "queues/configuration/batching-retries.md", "text": "es/configuration/pull-consumers/) that attempt to pull from a queue, even when empty, will incur a read operation.\n\n:::\n\nWhen determining what size and timeout settings to configure, you will want to consider latency (how long can you wait to receive messages?), overall batch size (when writing to external systems), and cost (fewer-but-larger batches).\n\n### Batch settings\n\nThe following batch-level settings can be configured to adjust how Queues delivers batches to your configured consumer.\n\n\n\n| Setting | Default | Minimum | Maximum |\n| ----------------------------------------- | ----------- | --------- | ------------ |\n| Maximum Batch Size `max_batch_size` | 10 messages | 1 message | 100 messages |\n| Maximum Batch Timeout `max", "char_start": 2040, "char_end": 2840, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "0681670f0b3aeda4", "doc_id": "queues/configuration/batching-retries.md", "text": "-- |\n| Maximum Batch Size `max_batch_size` | 10 messages | 1 message | 100 messages |\n| Maximum Batch Timeout `max_batch_timeout` | 5 seconds | 0 seconds | 60 seconds |\n\n\n\n## Explicit acknowledgement and retries\n\nYou can acknowledge individual messages within a batch by explicitly acknowledging each message as it is processed. Messages that are explicitly acknowledged will not be re-delivered, even if your queue consumer fails on a subsequent message and/or fails to return successfully when processing a batch.\n\n- Each message can be acknowledged as you process it within a batch, and avoids the entire batch from being re-delivered if your consumer throws an error during batch processing.\n- Acknowledging individual messages is useful when you are calling external APIs,", "char_start": 2720, "char_end": 3520, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "e5b08bd743238ca3", "doc_id": "queues/configuration/batching-retries.md", "text": "rows an error during batch processing.\n- Acknowledging individual messages is useful when you are calling external APIs, writing messages to a database, or otherwise performing non-idempotent (state changing) actions on individual messages.\n\nTo explicitly acknowledge a message as delivered, call the `ack()` method on the message.\n\n\n\n```ts\nexport default {\n\tasync queue(batch, env, ctx): Promise {\n\t\tfor (const msg of batch.messages) {\n\t\t\t// TODO: do something with the message\n\t\t\t// Explicitly acknowledge the message as delivered\n\t\t\tmsg.ack();\n\t\t}\n\t},\n} satisfies ExportedHandler;\n```\n\n\n```python\nfrom workers import WorkerEntrypoint\n\nc", "char_start": 3400, "char_end": 4200, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "23e5724cf259619a", "doc_id": "queues/configuration/batching-retries.md", "text": ";\n```\n
\n\n```python\nfrom workers import WorkerEntrypoint\n\nclass Default(WorkerEntrypoint):\n async def queue(self, batch):\n for msg in batch.messages:\n # TODO: do something with the message\n # Explicitly acknowledge the message as delivered\n msg.ack()\n```\n\n\n\nYou can also call `retry()` to explicitly force a message to be redelivered in a subsequent batch. This is referred to as \"negative acknowledgement\". This can be particularly useful when you want to process the rest of the messages in that batch without throwing an error that would force the entire batch to be redelivered.\n\n\n\n```ts\n", "char_start": 4080, "char_end": 4880, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "ba889b75df67e647", "doc_id": "queues/configuration/batching-retries.md", "text": "atch to be redelivered.\n\n\n\n```ts\nexport default {\n\tasync queue(batch, env, ctx): Promise {\n\t\tfor (const msg of batch.messages) {\n\t\t\t// TODO: do something with the message that fails\n\t\t\tmsg.retry();\n\t\t}\n\t},\n} satisfies ExportedHandler;\n```\n\n\n```python\nfrom workers import WorkerEntrypoint\n\nclass Default(WorkerEntrypoint):\n async def queue(self, batch):\n for msg in batch.messages:\n # TODO: do something with the message that fails\n msg.retry()\n```\n\n\n\nYou can also acknowledge or negatively acknowledge messages at a batch level with `ackAll()` and `retryAll()`. Calling `ackAll()` on the ba", "char_start": 4760, "char_end": 5560, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "bcfd67504352f9f7", "doc_id": "queues/configuration/batching-retries.md", "text": "ledge or negatively acknowledge messages at a batch level with `ackAll()` and `retryAll()`. Calling `ackAll()` on the batch of messages (`MessageBatch`) delivered to your consumer Worker has the same behaviour as a consumer Worker that successfully returns (does not throw an error).\n\nNote that calls to `ack()`, `retry()` and their `ackAll()` / `retryAll()` equivalents follow the below precedence rules:\n\n- If you call `ack()` on a message, subsequent calls to `ack()` or `retry()` are silently ignored.\n- If you call `retry()` on a message and then call `ack()`: the `ack()` is ignored. The first method call wins in all cases.\n- If you call either `ack()` or `retry()` on a single message, and then either/any of `ackAll()` or `retryAll()` on the batch, the call on the single message takes prece", "char_start": 5440, "char_end": 6240, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "f3822dee54623ae9", "doc_id": "queues/configuration/batching-retries.md", "text": "ngle message, and then either/any of `ackAll()` or `retryAll()` on the batch, the call on the single message takes precedence. That is, the batch-level call does not apply to that message (or messages, if multiple calls were made).\n\n## Delivery failure\n\nWhen a message is failed to be delivered, the default behaviour is to retry delivery three times before marking the delivery as failed. You can set `max_retries` (defaults to 3) when configuring your consumer, but in most cases we recommend leaving this as the default.\n\nMessages that reach the configured maximum retries will be deleted from the queue, or if a [dead-letter queue](/queues/configuration/dead-letter-queues/) (DLQ) is configured, written to the DLQ instead.\n\n:::note\n\nEach retry counts as an additional read operation per [Queues ", "char_start": 6120, "char_end": 6920, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "95c84b54b793b33b", "doc_id": "queues/configuration/batching-retries.md", "text": "DLQ) is configured, written to the DLQ instead.\n\n:::note\n\nEach retry counts as an additional read operation per [Queues pricing](/queues/platform/pricing/).\n\n:::\n\nWhen a single message within a batch fails to be delivered, the entire batch is retried, unless you have [explicitly acknowledged](#explicit-acknowledgement-and-retries) a message (or messages) within that batch. For example, if a batch of 10 messages is delivered, but the 8th message fails to be delivered, all 10 messages will be retried and thus redelivered to your consumer in full.\n\n:::caution[Retried messages and consumer concurrency]\n\nRetrying messages with `retry()` or calling `retryAll()` on a batch will **not** cause the consumer to autoscale down if consumer concurrency is enabled. Refer to [Consumer concurrency](/queues", "char_start": 6800, "char_end": 7600, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "d8f708a2ae693a42", "doc_id": "queues/configuration/batching-retries.md", "text": "**not** cause the consumer to autoscale down if consumer concurrency is enabled. Refer to [Consumer concurrency](/queues/configuration/consumer-concurrency/) to learn more.\n\n:::\n\n## Delay messages\n\nWhen publishing messages to a queue, or when [marking a message or batch for retry](#explicit-acknowledgement-and-retries), you can choose to delay messages from being processed for a period of time.\n\nDelaying messages allows you to defer tasks until later, and/or respond to backpressure when consuming from a queue. For example, if an upstream API you are calling to returns a `HTTP 429: Too Many Requests`, you can delay messages to slow down how quickly you are consuming them before they are re-processed.\n\nMessages can be delayed by up to 24 hours.\n\n:::note\n\nConfiguring delivery and retry delays", "char_start": 7480, "char_end": 8280, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "8523a510b7981cd7", "doc_id": "queues/configuration/batching-retries.md", "text": "efore they are re-processed.\n\nMessages can be delayed by up to 24 hours.\n\n:::note\n\nConfiguring delivery and retry delays via the `wrangler` CLI or when [developing locally](/queues/configuration/local-development/) requires `wrangler` version `3.38.0` or greater. Use `npx wrangler@latest` to always use the latest version of `wrangler`.\n\n:::\n\n### Delay on send\n\nTo delay a message or batch of messages when sending to a queue, you can provide a `delaySeconds` parameter when sending a message.\n\n\n\n```ts\n// Delay a singular message by 600 seconds (10 minutes)\nawait env.YOUR_QUEUE.send(message, { delaySeconds: 600 });\n\n// Delay a batch of messages by 300 seconds (5 minutes)\nawait env.YOUR_QUEUE.sendBatch(messag", "char_start": 8160, "char_end": 8960, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "9d17899cba48b513", "doc_id": "queues/configuration/batching-retries.md", "text": ", { delaySeconds: 600 });\n\n// Delay a batch of messages by 300 seconds (5 minutes)\nawait env.YOUR_QUEUE.sendBatch(messages, { delaySeconds: 300 });\n\n// Do not delay this message.\n// If there is a global delay configured on the queue, ignore it.\nawait env.YOUR_QUEUE.sendBatch(messages, { delaySeconds: 0 });\n```\n\n\n```python\n# Delay a singular message by 600 seconds (10 minutes)\nawait env.YOUR_QUEUE.send(message, delaySeconds=600)\n\n# Delay a batch of messages by 300 seconds (5 minutes)\nawait env.YOUR_QUEUE.sendBatch(messages, delaySeconds=300)\n\n# Do not delay this message.\n# If there is a global delay configured on the queue, ignore it.\nawait env.YOUR_QUEUE.sendBatch(messages, delaySeconds=0)\n```\n\n\n\nYou can also c", "char_start": 8840, "char_end": 9640, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "3c7417a129e82ddf", "doc_id": "queues/configuration/batching-retries.md", "text": "on the queue, ignore it.\nawait env.YOUR_QUEUE.sendBatch(messages, delaySeconds=0)\n```\n\n\n\nYou can also configure a default, global delay on a per-queue basis by passing `--delivery-delay-secs` when creating a queue via the `wrangler` CLI:\n\n```sh\n# Delay all messages by 5 minutes as a default\nnpx wrangler queues create $QUEUE-NAME --delivery-delay-secs=300\n```\n\n### Delay on retry\n\nWhen [consuming messages from a queue](/queues/reference/how-queues-works/#consumers), you can choose to [explicitly mark messages to be retried](#explicit-acknowledgement-and-retries). Messages can be retried and delayed individually, or as an entire batch.\n\nTo delay an individual message within a batch:\n\n\n\n```t", "char_start": 9520, "char_end": 10320, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "2ac4c64df6d013c8", "doc_id": "queues/configuration/batching-retries.md", "text": "l message within a batch:\n\n\n\n```ts\nexport default {\n\tasync queue(batch, env, ctx): Promise {\n\t\tfor (const msg of batch.messages) {\n\t\t\t// Mark for retry and delay a singular message\n\t\t\t// by 3600 seconds (1 hour)\n\t\t\tmsg.retry({ delaySeconds: 3600 });\n\t\t}\n\t},\n} satisfies ExportedHandler;\n```\n\n\n```python\nfrom workers import WorkerEntrypoint\n\nclass Default(WorkerEntrypoint):\n async def queue(self, batch):\n for msg in batch.messages:\n # Mark for retry and delay a singular message\n # by 3600 seconds (1 hour)\n msg.retry(delaySeconds=3600)\n```\n\n\n\nTo delay a batch of messages:\n\n\n\n\nTo delay a batch of messages:\n\n\n\n```ts\nexport default {\n\tasync queue(batch, env, ctx): Promise {\n\t\t// Mark for retry and delay a batch of messages\n\t\t// by 600 seconds (10 minutes)\n\t\tbatch.retryAll({ delaySeconds: 600 });\n\t},\n} satisfies ExportedHandler;\n```\n\n\n```python\nfrom workers import WorkerEntrypoint\n\nclass Default(WorkerEntrypoint):\n async def queue(self, batch):\n # Mark for retry and delay a batch of messages\n # by 600 seconds (10 minutes)\n batch.retryAll(delaySeconds=600)\n```\n\n\n\nYou can also choose ", "char_start": 10880, "char_end": 11680, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "77adbde6d988298e", "doc_id": "queues/configuration/batching-retries.md", "text": " # by 600 seconds (10 minutes)\n batch.retryAll(delaySeconds=600)\n```\n\n\n\nYou can also choose to set a default retry delay to any messages that are retried due to either implicit failure or when calling `retry()` explicitly. This is set at the consumer level, and is supported in both push-based (Worker) and pull-based (HTTP) consumers.\n\nDelays can be configured via the `wrangler` CLI:\n\n```sh\n# Push-based consumers\n# Delay any messages that are retried by 60 seconds (1 minute) by default.\nnpx wrangler@latest queues consumer worker add $QUEUE-NAME $WORKER_SCRIPT_NAME --retry-delay-secs=60\n\n# Pull-based consumers\n# Delay any messages that are retried by 60 seconds (1 minute) by default.\nnpx wrangler@latest queues consumer http add $QUEUE-NAME --retry-delay-secs=60\n``", "char_start": 11560, "char_end": 12360, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "38cc887fcf01fdaf", "doc_id": "queues/configuration/batching-retries.md", "text": "d by 60 seconds (1 minute) by default.\nnpx wrangler@latest queues consumer http add $QUEUE-NAME --retry-delay-secs=60\n```\n\nDelays can also be configured in the [Wrangler configuration file](/workers/wrangler/configuration/#queues) with the `delivery_delay` setting for producers (when sending) and/or the `retry_delay` (when retrying) per-consumer:\n\n\n\n```jsonc\n{\n\t\"queues\": {\n\t\t\"producers\": [\n\t\t\t{\n\t\t\t\t\"binding\": \"\",\n\t\t\t\t\"queue\": \"\",\n\t\t\t\t\"delivery_delay\": 60 // delay every message delivery by 1 minute\n\t\t\t}\n\t\t],\n\t\t\"consumers\": [\n\t\t\t{\n\t\t\t\t\"queue\": \"my-queue\",\n\t\t\t\t\"retry_delay\": 300 // delay any retried message by 5 minutes before re-attempting delivery\n\t\t\t}\n\t\t]\n\t}\n}\n```\n\n\n\nIf you use both the `wrangler` CLI and the [Wrangler configuratio", "char_start": 12240, "char_end": 13040, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "49c71e008088199a", "doc_id": "queues/configuration/batching-retries.md", "text": "empting delivery\n\t\t\t}\n\t\t]\n\t}\n}\n```\n\n\n\nIf you use both the `wrangler` CLI and the [Wrangler configuration file](/workers/wrangler/configuration/) to change the settings associated with a queue or a queue consumer, the most recent configuration change will take effect.\n\nRefer to the [Queues REST API documentation](/api/resources/queues/subresources/consumers/methods/get/) to learn how to configure message delays and retry delays programmatically.\n\n### Message delay precedence\n\nMessages can be delayed by default at the queue level, or per-message (or batch).\n\n- Per-message/batch delay settings take precedence over queue-level settings.\n- Setting `delaySeconds: 0` on a message when sending or retrying will ignore any queue-level delays and cause the message to be delivered in ", "char_start": 12920, "char_end": 13720, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "5b134de8721f6316", "doc_id": "queues/configuration/batching-retries.md", "text": "s: 0` on a message when sending or retrying will ignore any queue-level delays and cause the message to be delivered in the next batch.\n- A message sent or retried with `delaySeconds: ` to a queue with a shorter default delay will still respect the message-level setting.\n\n### Apply a backoff algorithm\n\nYou can apply a backoff algorithm to increasingly delay messages based on the current number of attempts to deliver the message.\n\nEach message delivered to a consumer includes an `attempts` property that tracks the number of delivery attempts made.\n\nFor example, to generate an [exponential backoff](https://en.wikipedia.org/wiki/Exponential_backoff) for a message, you can create a helper function that calculates this for you:\n\n\n\n\n```ts\nfunction calculateExponentialBackoff(\n\tattempts: number,\n\tbaseDelaySeconds: number,\n): number {\n\treturn baseDelaySeconds ** attempts;\n}\n```\n\n\n```python\ndef calculate_exponential_backoff(attempts, base_delay_seconds):\n return base_delay_seconds ** attempts\n```\n\n\n\nIn your consumer, you then pass the value of `msg.attempts` and your desired delay factor as the argument to `delaySeconds` when calling `retry()` on an individual message:\n\n\n\n```ts\nconst BASE_DEL", "char_start": 14280, "char_end": 15080, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "eba1f262c0cd4c33", "doc_id": "queues/configuration/batching-retries.md", "text": " message:\n\n\n\n```ts\nconst BASE_DELAY_SECONDS = 30;\n\nexport default {\n\tasync queue(batch, env, ctx): Promise {\n\t\tfor (const msg of batch.messages) {\n\t\t\t// Mark for retry with exponential backoff\n\t\t\tmsg.retry({\n\t\t\t\tdelaySeconds: calculateExponentialBackoff(\n\t\t\t\t\tmsg.attempts,\n\t\t\t\t\tBASE_DELAY_SECONDS,\n\t\t\t\t),\n\t\t\t});\n\t\t}\n\t},\n} satisfies ExportedHandler;\n```\n\n\n```python\nfrom workers import WorkerEntrypoint\n\nBASE_DELAY_SECONDS = 30\n\nclass Default(WorkerEntrypoint):\n async def queue(self, batch):\n for msg in batch.messages:\n # Mark for retry and delay a singular message\n # by 3600 seconds (1 hour)\n ", "char_start": 14960, "char_end": 15760, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "ed12d6d4937f5829", "doc_id": "queues/configuration/batching-retries.md", "text": "h.messages:\n # Mark for retry and delay a singular message\n # by 3600 seconds (1 hour)\n msg.retry(\n delaySeconds=calculate_exponential_backoff(\n msg.attempts,\n BASE_DELAY_SECONDS,\n )\n )\n```\n\n\n\n## Related\n\n- Review the [JavaScript API](/queues/configuration/javascript-apis/) documentation for Queues.\n- Learn more about [How Queues Works](/queues/reference/how-queues-works/).\n- Understand the [metrics available](/queues/observability/metrics/) for your queues, including backlog and delayed message counts.", "char_start": 15640, "char_end": 16277, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "6c38740b7306a2bf", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "---\ntitle: Consumer concurrency\ndescription: Automatically scale out Queues consumer Workers horizontally to process messages faster.\npcx_content_type: concept\nsidebar:\n order: 5\nproducts:\n - queues\n---\n\nimport { WranglerConfig, DashButton } from \"~/components\";\n\nConsumer concurrency allows a [consumer Worker](/queues/reference/how-queues-works/#consumers) processing messages from a queue to automatically scale out horizontally to keep up with the rate that messages are being written to a queue.\n\nIn many systems, the rate at which you write messages to a queue can easily exceed the rate at which a single consumer can read and process those same messages. This is often because your consumer might be parsing message contents, writing to storage or a database, or making third-party (upstrea", "char_start": 0, "char_end": 800, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "ea2fa80ab2d20125", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "ecause your consumer might be parsing message contents, writing to storage or a database, or making third-party (upstream) API calls.\n\nNote that queue producers are always scalable, up to the [maximum supported messages-per-second](/queues/platform/limits/) (per queue) limit.\n\n## Enable concurrency\n\nBy default, all queues have concurrency enabled. Queue consumers will automatically scale up [to the maximum concurrent invocations](/queues/platform/limits/) as needed to manage a queue's backlog and/or error rates.\n\n## How concurrency works\n\nAfter processing a batch of messages, Queues will check to see if the number of concurrent consumers should be adjusted. The number of concurrent consumers invoked for a queue will autoscale based on several factors, including:\n\n- The number of messages i", "char_start": 680, "char_end": 1480, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "86add91f3298b111", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "concurrent consumers invoked for a queue will autoscale based on several factors, including:\n\n- The number of messages in the queue (backlog) and its rate of growth.\n- The ratio of failed (versus successful) invocations. A failed invocation is when your `queue()` handler returns an uncaught exception instead of `void` (nothing).\n- The value of `max_concurrency` set for that consumer.\n\nWhere possible, Queues will optimize for keeping your backlog from growing exponentially, in order to minimize scenarios where the backlog of messages in a queue grows to the point that they would reach the [message retention limit](/queues/platform/limits/) before being processed.\n\n:::note[Consumer concurrency and retried messages]\n\n[Retrying messages with `retry()`](/queues/configuration/batching-retries/#e", "char_start": 1360, "char_end": 2160, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "c4438def2e2db733", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "Consumer concurrency and retried messages]\n\n[Retrying messages with `retry()`](/queues/configuration/batching-retries/#explicit-acknowledgement-and-retries) or calling `retryAll()` on a batch will **not** count as a failed invocation.\n\n:::\n\n### Example\n\nIf you are writing 100 messages/second to a queue with a single concurrent consumer that takes 5 seconds to process a batch of 100 messages, the number of messages in-flight will continue to grow at a rate faster than your consumer can keep up.\n\nIn this scenario, Queues will notice the growing backlog and will scale the number of concurrent consumer Workers invocations up to a steady-state of (approximately) five (5) until the rate of incoming messages decreases, the consumer processes messages faster, or the consumer begins to generate err", "char_start": 2040, "char_end": 2840, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "270f0d7900c33da1", "doc_id": "queues/configuration/consumer-concurrency.md", "text": " the rate of incoming messages decreases, the consumer processes messages faster, or the consumer begins to generate errors.\n\n### Why are my consumers not autoscaling?\n\nIf your consumers are not autoscaling, there are a few likely causes:\n\n- `max_concurrency` has been set to 1.\n- Your consumer Worker is returning errors rather than processing messages. Inspect your consumer to make sure it is healthy.\n- A batch of messages is being processed. Queues checks if it should autoscale consumers only after processing an entire batch of messages, so it will not autoscale while a batch is being processed. Consider reducing batch sizes or refactoring your consumer to process messages faster.\n\n## Limit concurrency\n\n:::caution[Recommended concurrency setting]\n\nCloudflare recommends leaving the maximum", "char_start": 2720, "char_end": 3520, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "9441013376306948", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "es faster.\n\n## Limit concurrency\n\n:::caution[Recommended concurrency setting]\n\nCloudflare recommends leaving the maximum concurrency unset, which will allow your queue consumer to scale up as much as possible. Setting a fixed number means that your consumer will only ever scale up to that maximum, even as Queues increases the maximum supported invocations over time.\n\n:::\n\nIf you have a workflow that is limited by an upstream API and/or system, you may prefer for your backlog to grow, trading off increased overall latency in order to avoid overwhelming an upstream system.\n\nYou can configure the concurrency of your consumer Worker in two ways:\n\n1. Set concurrency settings in the Cloudflare dashboard\n2. Set concurrency settings via the [Wrangler configuration file](/workers/wrangler/configura", "char_start": 3400, "char_end": 4200, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "1badf0bd880b38fb", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "n the Cloudflare dashboard\n2. Set concurrency settings via the [Wrangler configuration file](/workers/wrangler/configuration/)\n\n### Set concurrency settings in the Cloudflare dashboard\n\nTo configure the concurrency settings for your consumer Worker from the dashboard:\n\n1. In the Cloudflare dashboard, go to the **Queues** page.\n\n\t \n\n2. Select your queue > **Settings**.\n3. Select **Edit Consumer** under Consumer details.\n4. Set **Maximum consumer invocations** to a value between `1` and `250`. This value represents the maximum number of concurrent consumer invocations available to your queue.\n\nTo remove a fixed maximum value, select **auto (recommended)**.\n\nNote that if you are writing messages to a queue faster than you can process them, mes", "char_start": 4080, "char_end": 4880, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "ec244b0730917a08", "doc_id": "queues/configuration/consumer-concurrency.md", "text": ", select **auto (recommended)**.\n\nNote that if you are writing messages to a queue faster than you can process them, messages may eventually reach the [maximum retention period](/queues/platform/limits/) set for that queue. Individual messages that reach that limit will expire from the queue and be deleted.\n\n### Set concurrency settings in the [Wrangler configuration file](/workers/wrangler/configuration/)\n\n:::note\n\nEnsure you are using the latest version of [wrangler](/workers/wrangler/install-and-update/). Support for configuring the maximum concurrency of a queue consumer is only supported in wrangler [`2.13.0`](https://github.com/cloudflare/workers-sdk/releases/tag/wrangler%402.13.0) or greater.\n\n:::\n\nTo set a fixed maximum number of concurrent consumer invocations for a given queue, c", "char_start": 4760, "char_end": 5560, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "a6eb8a729f43e9be", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "angler%402.13.0) or greater.\n\n:::\n\nTo set a fixed maximum number of concurrent consumer invocations for a given queue, configure a `max_concurrency` in your Wrangler file:\n\n\n\n```jsonc\n{\n\t\"queues\": {\n\t\t\"consumers\": [\n\t\t\t{\n\t\t\t\t\"queue\": \"my-queue\",\n\t\t\t\t\"max_concurrency\": 1\n\t\t\t}\n\t\t]\n\t}\n}\n```\n\n\n\nTo remove the limit, remove the `max_concurrency` setting from the `[[queues.consumers]]` configuration for a given queue and call `npx wrangler deploy` to push your configuration update.\n\n {/* Not yet available but will be very soon\n\n ### wrangler CLI\n\n ```sh\n # where `N` is a positive integer between 1 and 250\n wrangler queues consumer update --max-concurrency=N\n ```\n\n To remove the limit and allow Queues to scale your consumer to the", "char_start": 5440, "char_end": 6240, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "50ff1170047d01cf", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "update --max-concurrency=N\n ```\n\n To remove the limit and allow Queues to scale your consumer to the maximum number of invocations, call `consumer update` without any flags:\n\n ```sh\n # Call update without passing a flag to allow concurrency to scale to the maximum\n wrangler queues consumer update \n ``` */}\n\n## Billing\n\nWhen multiple consumer Workers are invoked, each Worker invocation incurs [CPU time costs](/workers/platform/pricing/#workers).\n\n- If you intend to process all messages written to a queue, _the effective overall cost is the same_, even with concurrency enabled.\n- Enabling concurrency simply brings those costs forward, and can help prevent messages from reaching the [message retention limit](/queues/platform/limits/).\n\nBilling for ", "char_start": 6120, "char_end": 6920, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "6d8e05e358ffca79", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "ward, and can help prevent messages from reaching the [message retention limit](/queues/platform/limits/).\n\nBilling for consumers follows the [Workers standard usage model](/workers/platform/pricing/#example-pricing) meaning a developer is billed for the request and for CPU time used in the request.\n\n### Example\n\nA consumer Worker that takes 2 seconds to process a batch of messages will incur the same overall costs to process 50 million (50,000,000) messages, whether it does so concurrently (faster) or individually (slower).\n", "char_start": 6800, "char_end": 7331, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "49ae9cc7623af083", "doc_id": "queues/examples/use-queues-with-durable-objects.md", "text": "---\ntitle: Use Queues from Durable Objects\nsummary: Publish to a queue from within a Durable Object.\npcx_content_type: example\nsidebar:\n order: 20\nhead:\n - tag: title\n content: Queues - Use Queues and Durable Objects\ndescription: Publish to a queue from within a Durable Object.\nreviewed: 2023-09-13\nproducts:\n - queues\n - durable-objects\n---\n\nimport { WranglerConfig } from \"~/components\";\n\nThe following example shows you how to write a Worker script to publish to [Cloudflare Queues](/queues/) from within a [Durable Object](/durable-objects/).\n\nPrerequisites:\n\n- A [queue created](/queues/get-started/#3-create-a-queue) via the Cloudflare dashboard or the [wrangler CLI](/workers/wrangler/install-and-update/).\n- A [configured **producer** binding](/queues/configuration/configure-queues/#", "char_start": 0, "char_end": 800, "metadata": {"title": "use-queues-with-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md", "format": "markdown", "raw_hash": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288"}} +{"chunk_id": "5dd41e753f551d71", "doc_id": "queues/examples/use-queues-with-durable-objects.md", "text": "](/workers/wrangler/install-and-update/).\n- A [configured **producer** binding](/queues/configuration/configure-queues/#producer-worker-configuration) in the Cloudflare dashboard or Wrangler file.\n- A [Durable Object namespace binding](/workers/wrangler/configuration/#durable-objects).\n\nConfigure your Wrangler file as follows:\n\n\n\n```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"my-worker\",\n\t\"queues\": {\n\t\t\"producers\": [\n\t\t\t{\n\t\t\t\t\"queue\": \"my-queue\",\n\t\t\t\t\"binding\": \"YOUR_QUEUE\"\n\t\t\t}\n\t\t]\n\t},\n\t\"durable_objects\": {\n\t\t\"bindings\": [\n\t\t\t{\n\t\t\t\t\"name\": \"YOUR_DO_CLASS\",\n\t\t\t\t\"class_name\": \"YourDurableObject\"\n\t\t\t}\n\t\t]\n\t},\n\t\"migrations\": [\n\t\t{\n\t\t\t\"tag\": \"v1\",\n\t\t\t\"new_sqlite_classes\": [\n\t\t\t\t\"YourDurableObject\"\n\t\t\t]\n\t\t}\n\t]\n}\n```\n\n\n\nThe followi", "char_start": 680, "char_end": 1480, "metadata": {"title": "use-queues-with-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md", "format": "markdown", "raw_hash": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288"}} +{"chunk_id": "d7ca784873189e5e", "doc_id": "queues/examples/use-queues-with-durable-objects.md", "text": "\t\t{\n\t\t\t\"tag\": \"v1\",\n\t\t\t\"new_sqlite_classes\": [\n\t\t\t\t\"YourDurableObject\"\n\t\t\t]\n\t\t}\n\t]\n}\n```\n\n\n\nThe following Worker script:\n\n1. Creates a Durable Object stub, or retrieves an existing one based on a userId.\n2. Passes request data to the Durable Object.\n3. Publishes to a queue from within the Durable Object.\n\nExtending the `DurableObject` base class makes your `Env` available on `this.env` and the Durable Object state available on `this.ctx` within the [`fetch()` handler](/durable-objects/best-practices/create-durable-object-stubs-and-send-requests/) in the Durable Object.\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\ninterface Env {\n YOUR_QUEUE: Queue;\n YOUR_DO_CLASS: DurableObjectNamespace;\n}\n\nexport default {\n async fetch(req, env, ctx): ", "char_start": 1360, "char_end": 2160, "metadata": {"title": "use-queues-with-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md", "format": "markdown", "raw_hash": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288"}} +{"chunk_id": "5651225548db8160", "doc_id": "queues/examples/use-queues-with-durable-objects.md", "text": "E: Queue;\n YOUR_DO_CLASS: DurableObjectNamespace;\n}\n\nexport default {\n async fetch(req, env, ctx): Promise {\n // Assume each Durable Object is mapped to a userId in a query parameter\n // In a production application, this will be a userId defined by your application\n // that you validate (and/or authenticate) first.\n const url = new URL(req.url);\n const userIdParam = url.searchParams.get(\"userId\");\n\n if (userIdParam) {\n // Get a stub that allows you to call that Durable Object\n const durableObjectStub = env.YOUR_DO_CLASS.getByName(userIdParam);\n\n // Pass the request to that Durable Object and await the response\n // This invokes the constructor once on your Durable Object class (defined further down)\n // on the first i", "char_start": 2040, "char_end": 2840, "metadata": {"title": "use-queues-with-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md", "format": "markdown", "raw_hash": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288"}} +{"chunk_id": "c8b7e39524874591", "doc_id": "queues/examples/use-queues-with-durable-objects.md", "text": "e\n // This invokes the constructor once on your Durable Object class (defined further down)\n // on the first initialization, and the fetch method on each request.\n // We pass the original Request to the Durable Object's fetch method\n const response = await durableObjectStub.fetch(req);\n\n // This would return \"wrote to queue\", but you could return any response.\n return response;\n }\n return new Response(\"userId must be provided\", { status: 400 });\n },\n} satisfies ExportedHandler;\n\nexport class YourDurableObject extends DurableObject {\n async fetch(req: Request): Promise {\n // Error handling elided for brevity.\n // Publish to your queue\n await this.env.YOUR_QUEUE.send({\n id: this.ctx.id.toString(), // Write the ID of the ", "char_start": 2720, "char_end": 3520, "metadata": {"title": "use-queues-with-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md", "format": "markdown", "raw_hash": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288"}} +{"chunk_id": "d1acf2811e2641ad", "doc_id": "queues/examples/use-queues-with-durable-objects.md", "text": " // Publish to your queue\n await this.env.YOUR_QUEUE.send({\n id: this.ctx.id.toString(), // Write the ID of the Durable Object to your queue\n // Write any other properties to your queue\n });\n\n return new Response(\"wrote to queue\");\n }\n}\n```\n", "char_start": 3400, "char_end": 3661, "metadata": {"title": "use-queues-with-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md", "format": "markdown", "raw_hash": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288"}} +{"chunk_id": "3a89c1b08a64d3cc", "doc_id": "queues/get-started.md", "text": "---\ntitle: Getting started\ndescription: Create your first Cloudflare Queue, a producer Worker, and a consumer Worker.\npcx_content_type: get-started\nsidebar:\n order: 2\nhead:\n - tag: title\n content: Getting started\nproducts:\n - queues\n - workers\n---\n\nimport { Render, PackageManagers, WranglerConfig } from \"~/components\";\n\nCloudflare Queues is a flexible messaging queue that allows you to queue messages for asynchronous processing. By following this guide, you will create your first queue, a Worker to publish messages to that queue, and a consumer Worker to consume messages from that queue.\n\n## Prerequisites\n\nTo use Queues, you will need:\n\n\n\n## 1. Create a Worker project\n\nYou will access your queue from a Worker, the producer Worker. You must ", "char_start": 0, "char_end": 800, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "753c81148635168e", "doc_id": "queues/get-started.md", "text": "ct=\"workers\" />\n\n## 1. Create a Worker project\n\nYou will access your queue from a Worker, the producer Worker. You must create at least one producer Worker to publish messages onto your queue. If you are using [R2 Bucket Event Notifications](/r2/buckets/event-notifications/), then you do not need a producer Worker.\n\nTo create a producer Worker, run:\n\n\n\n\n\nThis will create a new directory, which will include both a `src/index.ts` Worker script, and a [`wrangler.jsonc`](/workers/wrangler/configuration/) configuration file. After you create your Worker, you will create a", "char_start": 680, "char_end": 1480, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "4ea1747b3a2d8e6b", "doc_id": "queues/get-started.md", "text": "[`wrangler.jsonc`](/workers/wrangler/configuration/) configuration file. After you create your Worker, you will create a Queue to access.\n\nMove into the newly created directory:\n\n```sh\ncd producer-worker\n```\n\n## 2. Create a queue\n\nTo use queues, you need to create at least one queue to publish messages to and consume messages from.\n\nTo create a queue, run:\n\n```sh\nnpx wrangler queues create \n```\n\nChoose a name that is descriptive and relates to the types of messages you intend to use this queue for. Descriptive queue names look like: `debug-logs`, `user-clickstream-data`, or `password-reset-prod`.\n\nQueue names must be 1 to 63 characters long. Queue names cannot contain special characters outside dashes (`-`), and must start and end with a letter or number.\n\nYou cannot change ", "char_start": 1360, "char_end": 2160, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "4799c26c27e13aba", "doc_id": "queues/get-started.md", "text": "not contain special characters outside dashes (`-`), and must start and end with a letter or number.\n\nYou cannot change your queue name after you have set it. After you create your queue, you will set up your producer Worker to access it.\n\n## 3. Set up your producer Worker\n\nTo expose your queue to the code inside your Worker, you need to connect your queue to your Worker by creating a binding. [Bindings](/workers/runtime-apis/bindings/) allow your Worker to access resources, such as Queues, on the Cloudflare developer platform.\n\nTo create a binding, open your newly generated `wrangler.jsonc` file and add the following:\n\n\n\n```jsonc\n{\n\t\"queues\": {\n\t\t\"producers\": [\n\t\t\t{\n\t\t\t\t\"queue\": \"MY-QUEUE-NAME\",\n\t\t\t\t\"binding\": \"MY_QUEUE\"\n\t\t\t}\n\t\t]\n\t}\n}\n```\n\n\n\nReplace `MY-QU", "char_start": 2040, "char_end": 2840, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "6f137d1d03f0b95f", "doc_id": "queues/get-started.md", "text": "rs\": [\n\t\t\t{\n\t\t\t\t\"queue\": \"MY-QUEUE-NAME\",\n\t\t\t\t\"binding\": \"MY_QUEUE\"\n\t\t\t}\n\t\t]\n\t}\n}\n```\n\n\n\nReplace `MY-QUEUE-NAME` with the name of the queue you created in [step 2](/queues/get-started/#2-create-a-queue). Next, replace `MY_QUEUE` with the name you want for your `binding`. The binding must be a valid JavaScript variable name. This is the variable you will use to reference this queue in your Worker.\n\n### Write your producer Worker\n\nYou will now configure your producer Worker to create messages to publish to your queue. Your producer Worker will:\n\n1. Take a request it receives from the browser.\n2. Transform the request to JSON format.\n3. Write the request directly to your queue.\n\nIn your Worker project directory, open the `src` folder and add the following to your `index.ts` f", "char_start": 2720, "char_end": 3520, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "7742dac3bba34b00", "doc_id": "queues/get-started.md", "text": "ectly to your queue.\n\nIn your Worker project directory, open the `src` folder and add the following to your `index.ts` file:\n\n```ts null {8}\nexport default {\n async fetch(request, env, ctx): Promise {\n const log = {\n url: request.url,\n method: request.method,\n headers: Object.fromEntries(request.headers),\n };\n await env..send(log);\n return new Response(\"Success!\");\n },\n} satisfies ExportedHandler;\n```\n\nReplace `MY_QUEUE` with the name you have set for your binding from your `wrangler.jsonc` file.\n\nAlso add the queue to `Env` interface in `index.ts`.\n\n```ts null {2}\nexport interface Env {\n : Queue;\n}\n```\n\nIf this write fails, your Worker will return an error (raise an exception). If this write works, it will return `Success` ", "char_start": 3400, "char_end": 4200, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "73ca7ef3b76f9b40", "doc_id": "queues/get-started.md", "text": " this write fails, your Worker will return an error (raise an exception). If this write works, it will return `Success` back with a HTTP `200` status code to the browser.\n\nIn a production application, you would likely use a [`try...catch`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch) statement to catch the exception and handle it directly (for example, return a custom error or even retry).\n\n### Publish your producer Worker\n\nWith your Wrangler file and `index.ts` file configured, you are ready to publish your producer Worker. To publish your producer Worker, run:\n\n```sh\nnpx wrangler deploy\n```\n\nYou should see output that resembles the below, with a `*.workers.dev` URL by default.\n\n```\nUploaded (0.76 sec)\nPublished (0.76 sec)\nPublished (0.29 sec)\n https://..workers.dev\n```\n\nCopy your `*.workers.dev` subdomain and paste it into a new browser tab. Refresh the page a few times to start publishing requests to your queue. Your browser should return the `Success` response after writing the request to the queue each time.\n\nYou have built a queue and a producer Worker to publish messages to the queue. You will now create a consumer Worker to consume the messages published to your queue. Without a consumer Worker, the messages will stay on the queue until they expire, which defaults to four (4) days.\n\n## 4. Create your consumer Worker\n\nA consumer Worker receives messages fr", "char_start": 4760, "char_end": 5560, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "20527cc79f46c552", "doc_id": "queues/get-started.md", "text": "they expire, which defaults to four (4) days.\n\n## 4. Create your consumer Worker\n\nA consumer Worker receives messages from your queue. When the consumer Worker receives your queue's messages, it can write them to another source, such as a logging console or storage objects.\n\nIn this guide, you will create a consumer Worker and use it to log and inspect the messages with [`wrangler tail`](/workers/wrangler/commands/general/#tail). You will create your consumer Worker in the same Worker project that you created your producer Worker.\n\n:::note\n\nQueues also supports [pull-based consumers](/queues/configuration/pull-consumers/), which allows any HTTP-based client to consume messages from a queue. This guide creates a push-based consumer using Cloudflare Workers.\n\n:::\n\nTo create a consumer Worker", "char_start": 5440, "char_end": 6240, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "ea842b2a4189e0ed", "doc_id": "queues/get-started.md", "text": "sages from a queue. This guide creates a push-based consumer using Cloudflare Workers.\n\n:::\n\nTo create a consumer Worker, open your `index.ts` file and add the following `queue` handler to your existing `fetch` handler:\n\n```ts null {11}\nexport default {\n async fetch(request, env, ctx): Promise {\n const log = {\n url: request.url,\n method: request.method,\n headers: Object.fromEntries(request.headers),\n };\n await env..send(log);\n return new Response(\"Success!\");\n },\n async queue(batch, env, ctx): Promise {\n for (const message of batch.messages) {\n console.log(\"consumed from our queue:\", JSON.stringify(message.body));\n }\n },\n} satisfies ExportedHandler;\n```\n\nReplace `MY_QUEUE` with the name you have set for your binding f", "char_start": 6120, "char_end": 6920, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "3c3bb39015595995", "doc_id": "queues/get-started.md", "text": "dy));\n }\n },\n} satisfies ExportedHandler;\n```\n\nReplace `MY_QUEUE` with the name you have set for your binding from your `wrangler.jsonc` file.\n\nEvery time messages are published to the queue, your consumer Worker's `queue` handler (`async queue`) is called and it is passed one or more messages.\n\nIn this example, your consumer Worker transforms the queue's JSON formatted message into a string and logs that output. In a real world application, your consumer Worker can be configured to write messages to object storage (such as [R2](/r2/)), write to a database (like [D1](/d1/)), further process messages before calling an external API (such as an [email API](/workers/tutorials/)) or a data warehouse with your legacy cloud provider.\n\nWhen performing asynchronous tasks from within your c", "char_start": 6800, "char_end": 7600, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "2459fadf32f00250", "doc_id": "queues/get-started.md", "text": "tutorials/)) or a data warehouse with your legacy cloud provider.\n\nWhen performing asynchronous tasks from within your consumer handler, use `waitUntil()` to ensure the response of the function is handled. Other asynchronous methods are not supported within the scope of this method.\n\n### Connect the consumer Worker to your queue\n\nAfter you have configured your consumer Worker, you are ready to connect it to your queue.\n\nEach queue can only have one consumer Worker connected to it. If you try to connect multiple consumers to the same queue, you will encounter an error when attempting to publish that Worker.\n\nTo connect your queue to your consumer Worker, open your Wrangler file and add this to the bottom:\n\n\n\n```jsonc\n{\n\t\"queues\": {\n\t\t\"consumers\": [\n\t\t\t{\n\t\t\t\t\"queue\": \"\n\n```jsonc\n{\n\t\"queues\": {\n\t\t\"consumers\": [\n\t\t\t{\n\t\t\t\t\"queue\": \"\",\n\t\t\t\t// Required: this should match the name of the queue you created in step 3.\n\t\t\t\t// If you misspell the name, you will receive an error when attempting to publish your Worker.\n\t\t\t\t\"max_batch_size\": 10, // optional: defaults to 10\n\t\t\t\t\"max_batch_timeout\": 5 // optional: defaults to 5 seconds\n\t\t\t}\n\t\t]\n\t}\n}\n```\n\n\n\nReplace `MY-QUEUE-NAME` with the queue you created in [step 2](/queues/get-started/#2-create-a-queue).\n\nIn your consumer Worker, you are using queues to auto batch messages using the `max_batch_size` option and the `max_batch_timeout` option. The consumer Worker will receive messages in batches of `10` or every `5` seconds, whichever ", "char_start": 8160, "char_end": 8960, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "358f2ef9c7423920", "doc_id": "queues/get-started.md", "text": "max_batch_timeout` option. The consumer Worker will receive messages in batches of `10` or every `5` seconds, whichever happens first.\n\n`max_batch_size` (defaults to 10) helps to reduce the amount of times your consumer Worker needs to be called. Instead of being called for every message, it will only be called after 10 messages have entered the queue.\n\n`max_batch_timeout` (defaults to 5 seconds) helps to reduce wait time. If the producer Worker is not sending up to 10 messages to the queue for the consumer Worker to be called, the consumer Worker will be called every 5 seconds to receive messages that are waiting in the queue.\n\n### Publish your consumer Worker\n\nWith your Wrangler file and `index.ts` file configured, publish your consumer Worker by running:\n\n```sh\nnpx wrangler deploy\n```\n\n", "char_start": 8840, "char_end": 9640, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "7918cdcd7d1a2ab7", "doc_id": "queues/get-started.md", "text": " Wrangler file and `index.ts` file configured, publish your consumer Worker by running:\n\n```sh\nnpx wrangler deploy\n```\n\n## 5. Read messages from your queue\n\nAfter you set up consumer Worker, you can read messages from the queue.\n\nRun `wrangler tail` to start waiting for our consumer to log the messages it receives:\n\n```sh\nnpx wrangler tail\n```\n\nWith `wrangler tail` running, open the Worker URL you opened in [step 3](/queues/get-started/#3-set-up-your-producer-worker).\n\nYou should receive a `Success` message in your browser window.\n\nIf you receive a `Success` message, refresh the URL a few times to generate messages and push them onto the queue.\n\nWith `wrangler tail` running, your consumer Worker will start logging the requests generated by refreshing.\n\nIf you refresh less than 10 times, it", "char_start": 9520, "char_end": 10320, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "fd537de157f89333", "doc_id": "queues/get-started.md", "text": "ng, your consumer Worker will start logging the requests generated by refreshing.\n\nIf you refresh less than 10 times, it may take a few seconds for the messages to appear because batch timeout is configured for 10 seconds. After 10 seconds, messages should arrive in your terminal.\n\nIf you get errors when you refresh, check that the queue name you created in [step 2](/queues/get-started/#2-create-a-queue) and the queue you referenced in your Wrangler file is the same. You should ensure that your producer Worker is returning `Success` and is not returning an error.\n\nBy completing this guide, you have now created a queue, a producer Worker that publishes messages to that queue, and a consumer Worker that consumes those messages from it.\n\n## Related resources\n\n- Learn more about [Cloudflare Wo", "char_start": 10200, "char_end": 11000, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "0dc89ae08268e207", "doc_id": "queues/get-started.md", "text": "ue, and a consumer Worker that consumes those messages from it.\n\n## Related resources\n\n- Learn more about [Cloudflare Workers](/workers/) and the applications you can build on Cloudflare.\n", "char_start": 10880, "char_end": 11068, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "2291cd66e8242116", "doc_id": "queues/index.md", "text": "---\ntitle: Cloudflare Queues\ndescription: Send and receive messages with guaranteed delivery using Cloudflare Queues integrated with Workers.\npcx_content_type: overview\nsidebar:\n order: 1\nhead:\n - tag: title\n content: Overview\nproducts:\n - queues\n - workers\n---\n\nimport { CardGrid, Description, Feature, LinkTitleCard, Plan, RelatedProduct, LinkButton } from \"~/components\"\n\n\n\n\nSend and receive messages with guaranteed delivery and no charges for egress bandwidth.\n\n\n\n\n\n\nCloudflare Queues integrate with [Cloudflare Workers](/workers/) and enable you to build applications that can [guarantee delivery](/queues/reference/delivery-guarantees/), [offload work from a request](/queues/reference/how-queues-works/), [send data from Worker to ", "char_start": 0, "char_end": 800, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/queues/index.md", "format": "markdown", "raw_hash": "7ca76e34b7712d7ea2fb558cd572d8994848a8e4cecfdf412ae59aa6082aa778"}} +{"chunk_id": "4c06ffffb740134b", "doc_id": "queues/index.md", "text": "ce/delivery-guarantees/), [offload work from a request](/queues/reference/how-queues-works/), [send data from Worker to Worker](/queues/configuration/configure-queues/), and [buffer or batch data](/queues/configuration/batching-retries/).\n\nGet started\n\n***\n\n## Features\n\n\n\nCloudflare Queues allows you to batch, retry and delay messages.\n\n\n\n\n\n\nRedirect your messages when a delivery failure occurs.\n\n\n\n\n\n\nConfigure pull-based consumers to pull from a queue over HTTP fr", "char_start": 680, "char_end": 1480, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/queues/index.md", "format": "markdown", "raw_hash": "7ca76e34b7712d7ea2fb558cd572d8994848a8e4cecfdf412ae59aa6082aa778"}} +{"chunk_id": "5cde4948185f4309", "doc_id": "queues/index.md", "text": "nsumers\" href=\"/queues/configuration/pull-consumers/\">\n\nConfigure pull-based consumers to pull from a queue over HTTP from infrastructure outside of Cloudflare Workers.\n\n\n\n\n***\n\n## Related products\n\n\n\nCloudflare R2 Storage allows developers to store large amounts of unstructured data without the costly egress bandwidth fees associated with typical cloud storage services.\n\n\n\n\n\n\nCloudflare Workers allows developers to build serverless applications and deploy instantly across the globe for exceptional performance, reliability, and scale.\n\n\n\n\n***\n\n## More resources\n\n\n\n\n\n***\n\n## More resources\n\n\n\n\nLearn about pricing.\n\n\n\nLearn about Queues limits.\n\n\n\nTry Cloudflare Queues which can run on your local machine.\n\n\n\nFollow @CloudflareDev on Twitter to learn about product announcements, and what is new in Cloudflare Workers.\n\n\n\n\n\nConnect with the Workers community on Discord to ask questions, show what you are building, and discuss the platform with other developers.\n\n\n\nLearn how to configure Cloudflare Queues using Wrangler.\n\n\n\nLearn how to use JavaScript APIs to send and receive messages to a Cloudflare Queue.\n\n\n\nLearn how to confi", "char_start": 2720, "char_end": 3520, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/queues/index.md", "format": "markdown", "raw_hash": "7ca76e34b7712d7ea2fb558cd572d8994848a8e4cecfdf412ae59aa6082aa778"}} +{"chunk_id": "647772dee5517112", "doc_id": "queues/index.md", "text": "rd>\n\n\nLearn how to configure and manage event subscriptions for your queues.\n\n\n\n", "char_start": 3400, "char_end": 3603, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/queues/index.md", "format": "markdown", "raw_hash": "7ca76e34b7712d7ea2fb558cd572d8994848a8e4cecfdf412ae59aa6082aa778"}} +{"chunk_id": "1645270d28b3b7a9", "doc_id": "queues/reference/delivery-guarantees.md", "text": "---\ntitle: Delivery guarantees\ndescription: Cloudflare Queues provides at-least-once message delivery by default.\npcx_content_type: concept\nsidebar:\n order: 2\nproducts:\n - queues\n---\n\nDelivery guarantees define how strongly a messaging system enforces the delivery of messages it processes.\n\nAs you make stronger guarantees about message delivery, the system needs to perform more checks and acknowledgments to ensure that messages are delivered, or maintain state to ensure a message is only delivered the specified number of times. This increases the latency of the system and reduces the overall throughput of the system. Each message may require an additional internal acknowledgements, and an equivalent number of additional roundtrips, before it can be considered delivered.\n\n* **Queues provi", "char_start": 0, "char_end": 800, "metadata": {"title": "delivery-guarantees", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/delivery-guarantees.md", "format": "markdown", "raw_hash": "ed989b394791a8bf6c450e1f8f7fcfa3d13a0e1a4d43586a84edbe7087a2f222"}} +{"chunk_id": "8db96faea6941f36", "doc_id": "queues/reference/delivery-guarantees.md", "text": "wledgements, and an equivalent number of additional roundtrips, before it can be considered delivered.\n\n* **Queues provides *at least once* delivery by default** in order to optimize for reliability.\n* This means that messages are guaranteed to be delivered at least once, and in rare occasions, may be delivered more than once.\n* For the majority of applications, this is the right balance between not losing any messages and minimizing end-to-end latency, as exactly once delivery incurs additional overheads in any messaging system.\n\nIn cases where processing the same message more than once would introduce unintended behaviour, generating a unique ID when writing the message to the queue and using that as the primary key on database inserts and/or as an idempotency key to de-duplicate the mes", "char_start": 680, "char_end": 1480, "metadata": {"title": "delivery-guarantees", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/delivery-guarantees.md", "format": "markdown", "raw_hash": "ed989b394791a8bf6c450e1f8f7fcfa3d13a0e1a4d43586a84edbe7087a2f222"}} +{"chunk_id": "c1d00174763d724c", "doc_id": "queues/reference/delivery-guarantees.md", "text": " to the queue and using that as the primary key on database inserts and/or as an idempotency key to de-duplicate the message after processing. For example, using this idempotency key as the ID in an upstream email API or payment API will allow those services to reject the duplicate on your behalf, without you having to carry additional state in your application.\n", "char_start": 1360, "char_end": 1725, "metadata": {"title": "delivery-guarantees", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/delivery-guarantees.md", "format": "markdown", "raw_hash": "ed989b394791a8bf6c450e1f8f7fcfa3d13a0e1a4d43586a84edbe7087a2f222"}} +{"chunk_id": "34e234163816d036", "doc_id": "queues/reference/how-queues-works.md", "text": "---\ntitle: How Queues Works\ndescription: Learn about Queues architecture including producers, consumers, and message lifecycle.\npcx_content_type: concept\nsidebar:\n order: 1\nproducts:\n - queues\n---\n\nimport { WranglerConfig } from \"~/components\";\n\nCloudflare Queues is a flexible messaging queue that allows you to queue messages for asynchronous processing. Message queues are great at decoupling components of applications, like the checkout and order fulfillment services for an e-commerce site. Decoupled services are easier to reason about, deploy, and implement, allowing you to ship features that delight your customers without worrying about synchronizing complex deployments. Queues also allow you to batch and buffer calls to downstream services and APIs.\n\nThere are four major concepts to ", "char_start": 0, "char_end": 800, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "a3dcc91f2fb33b0f", "doc_id": "queues/reference/how-queues-works.md", "text": "nts. Queues also allow you to batch and buffer calls to downstream services and APIs.\n\nThere are four major concepts to understand with Queues:\n\n1. [Queues](#what-is-a-queue)\n2. [Producers](#producers)\n3. [Consumers](#consumers)\n4. [Messages](#messages)\n\n## What is a queue\n\nA queue is a buffer or list that automatically scales as messages are written to it, and allows a consumer Worker to pull messages from that same queue.\n\nQueues are designed to be reliable, and messages written to a queue should never be lost once the write succeeds. Similarly, messages are not deleted from a queue until the [consumer](#consumers) has successfully consumed the message.\n\nQueues does not guarantee that messages will be delivered to a consumer in the same order in which they are published.\n\nDevelopers can ", "char_start": 680, "char_end": 1480, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "7bb5658d281b85fd", "doc_id": "queues/reference/how-queues-works.md", "text": " guarantee that messages will be delivered to a consumer in the same order in which they are published.\n\nDevelopers can create multiple queues. Creating multiple queues can be useful to:\n\n* Separate different use-cases and processing requirements: for example, a logging queue vs. a password reset queue.\n* Horizontally scale your overall throughput (messages per second) by using multiple queues to scale out.\n* Configure different batching strategies for each consumer connected to a queue.\n\nFor most applications, a single producer Worker per queue, with a single consumer Worker consuming messages from that queue allows you to logically separate the processing for each of your queues.\n\n## Producers\n\nA producer is the term for a client that is publishing or producing messages on to a queue. A ", "char_start": 1360, "char_end": 2160, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "6542e8441787d9f8", "doc_id": "queues/reference/how-queues-works.md", "text": "ur queues.\n\n## Producers\n\nA producer is the term for a client that is publishing or producing messages on to a queue. A producer is configured by [binding](/workers/runtime-apis/bindings/) a queue to a Worker and writing messages to the queue by calling that binding.\n\nFor example, if we bound a queue named `my-first-queue` to a binding of `MY_FIRST_QUEUE`, messages can be written to the queue by calling `send()` on the binding:\n\n```ts\ninterface Env {\n readonly MY_FIRST_QUEUE: Queue;\n}\n\nexport default {\n async fetch(req, env, ctx): Promise {\n const message = {\n url: req.url,\n method: req.method,\n headers: Object.fromEntries(req.headers),\n };\n\n await env.MY_FIRST_QUEUE.send(message); // This will throw an exception if the send fails for any reason\n retu", "char_start": 2040, "char_end": 2840, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "1c002c3d79defec4", "doc_id": "queues/reference/how-queues-works.md", "text": ";\n\n await env.MY_FIRST_QUEUE.send(message); // This will throw an exception if the send fails for any reason\n return new Response(\"Sent!\");\n },\n} satisfies ExportedHandler;\n```\n\n:::note\n\n\nYou can also use [`context.waitUntil()`](/workers/runtime-apis/context/#waituntil) to send the message without blocking the response.\n\nNote that because `waitUntil()` is non-blocking, any errors raised from the `send()` or `sendBatch()` methods on a queue will be implicitly ignored.\n\n\n:::\n\nA queue can have multiple producer Workers. For example, you may have multiple producer Workers writing events or logs to a shared queue based on incoming HTTP requests from users. There is no limit to the total number of producer Workers that can write to a single queue.\n\nAdditionally, multiple queues can b", "char_start": 2720, "char_end": 3520, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "934969ea583d4845", "doc_id": "queues/reference/how-queues-works.md", "text": " no limit to the total number of producer Workers that can write to a single queue.\n\nAdditionally, multiple queues can be bound to a single Worker. That single Worker can decide which queue to write to (or write to multiple) based on any logic you define in your code.\n\n### Content types\n\nMessages published to a queue can be published in different formats, depending on what interoperability is needed with your consumer. The default content type is `json`, which means that any object that can be passed to `JSON.stringify()` will be accepted.\n\nTo explicitly set the content type or specify an alternative content type, pass the `contentType` option to the `send()` method of your queue:\n\n```ts\ninterface Env {\n readonly MY_FIRST_QUEUE: Queue;\n}\n\nexport default {\n async fetch(req, env, ctx): Pro", "char_start": 3400, "char_end": 4200, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "0ba7d6f505963092", "doc_id": "queues/reference/how-queues-works.md", "text": "ur queue:\n\n```ts\ninterface Env {\n readonly MY_FIRST_QUEUE: Queue;\n}\n\nexport default {\n async fetch(req, env, ctx): Promise {\n const message = {\n url: req.url,\n method: req.method,\n headers: Object.fromEntries(req.headers),\n };\n try {\n await env.MY_FIRST_QUEUE.send(message, { contentType: \"json\" }); // \"json\" is the default\n return new Response(\"Sent!\");\n } catch (e) {\n // Catch cases where send fails, including due to a mismatched content type\n const msg = e instanceof Error ? e.message : \"Unknown error\";\n return Response.json({ error: msg }, { status: 500 });\n }\n },\n} satisfies ExportedHandler;\n```\n\nTo only accept simple strings when writing to a queue, set `{ contentType: \"text\" }` instead:\n\n```ts\ninterface Env {\n ", "char_start": 4080, "char_end": 4880, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "0aefaf80de5682e6", "doc_id": "queues/reference/how-queues-works.md", "text": "\nTo only accept simple strings when writing to a queue, set `{ contentType: \"text\" }` instead:\n\n```ts\ninterface Env {\n readonly MY_FIRST_QUEUE: Queue;\n}\n\nexport default {\n async fetch(req, env, ctx): Promise {\n try {\n // This will throw an exception (error) if you pass a non-string to the queue,\n // such as a native JavaScript object or ArrayBuffer.\n await env.MY_FIRST_QUEUE.send(\"hello there\", { contentType: \"text\" }); // explicitly set 'text'\n return new Response(\"Sent!\");\n } catch (e) {\n const msg = e instanceof Error ? e.message : \"Unknown error\";\n return Response.json({ error: msg }, { status: 500 });\n }\n },\n} satisfies ExportedHandler;\n```\n\nThe [`QueuesContentType`](/queues/configuration/javascript-apis/#queuescontenttype) API ", "char_start": 4760, "char_end": 5560, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "81dfdf2daf3b8d31", "doc_id": "queues/reference/how-queues-works.md", "text": "fies ExportedHandler;\n```\n\nThe [`QueuesContentType`](/queues/configuration/javascript-apis/#queuescontenttype) API documentation describes how each format is serialized to a queue.\n\n## Consumers\n\nQueues supports two types of consumer:\n\n1. A [consumer Worker](/queues/configuration/configure-queues/), which is push-based: the Worker is invoked when the queue has messages to deliver.\n2. A [HTTP pull consumer](/queues/configuration/pull-consumers/), which is pull-based: the consumer calls the queue endpoint over HTTP to receive and then acknowledge messages.\n\nA queue can only have one type of consumer configured.\n\n### Create a consumer Worker\n\nA consumer is the term for a client that is subscribing to or *consuming* messages from a queue. In its most basic form, a consumer is defined by c", "char_start": 5440, "char_end": 6240, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "628cda554e646188", "doc_id": "queues/reference/how-queues-works.md", "text": "a client that is subscribing to or *consuming* messages from a queue. In its most basic form, a consumer is defined by creating a `queue` handler in a Worker:\n\n```ts\ninterface Env {\n // Add your bindings here, e.g. KV namespaces, R2 buckets, D1 databases\n}\n\nexport default {\n async queue(batch, env, ctx): Promise {\n // Do something with messages in the batch\n // i.e. write to R2 storage, D1 database, or POST to an external API\n for (const msg of batch.messages) {\n // Process each message\n console.log(msg.body);\n }\n },\n} satisfies ExportedHandler;\n```\n\nYou then connect that consumer to a queue with `wrangler queues consumer ` or by defining a `[[queues.consumers]]` configuration in your [Wrangler configuration file](/worker", "char_start": 6120, "char_end": 6920, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "ea794fb0281db6ad", "doc_id": "queues/reference/how-queues-works.md", "text": "worker-script-name>` or by defining a `[[queues.consumers]]` configuration in your [Wrangler configuration file](/workers/wrangler/configuration/) manually:\n\n\n\n```jsonc\n{\n\t\"queues\": {\n\t\t\"consumers\": [\n\t\t\t{\n\t\t\t\t\"queue\": \"\",\n\t\t\t\t\"max_batch_size\": 100, // optional\n\t\t\t\t\"max_batch_timeout\": 30 // optional\n\t\t\t}\n\t\t]\n\t}\n}\n```\n\n\n\nImportantly, each queue can only have one active consumer. This allows Cloudflare Queues to achieve at least once delivery and minimize the risk of duplicate messages beyond that.\n\n:::note[Best practice]\n\n\nConfigure a single consumer per queue. This both logically separates your queues, and ensures that errors (failures) in processing messages from one queue do not impact your other queues.\n\n\n:::\n\nNotably, you can use the s", "char_start": 6800, "char_end": 7600, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "53befbc5e91a1a96", "doc_id": "queues/reference/how-queues-works.md", "text": "rors (failures) in processing messages from one queue do not impact your other queues.\n\n\n:::\n\nNotably, you can use the same consumer with multiple queues. The queue handler that defines your consumer Worker will be invoked by the queues it is connected to.\n\n* The `MessageBatch` that is passed to your `queue` handler includes a `queue` property with the name of the queue the batch was read from.\n* This can reduce the amount of code you need to write, and allow you to process messages based on the name of your queues.\n\nFor example, a consumer configured to consume messages from multiple queues would resemble the following:\n\n```ts\ninterface Env {\n // Add your bindings here\n}\n\nexport default {\n async queue(batch, env, ctx): Promise {\n // MessageBatch has a `queue` property we can sw", "char_start": 7480, "char_end": 8280, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "7c41a94a2f19b05e", "doc_id": "queues/reference/how-queues-works.md", "text": "}\n\nexport default {\n async queue(batch, env, ctx): Promise {\n // MessageBatch has a `queue` property we can switch on\n switch (batch.queue) {\n case \"log-queue\":\n // Write the batch to R2\n break;\n case \"debug-queue\":\n // Write the message to the console or to another queue\n break;\n case \"email-reset\":\n // Trigger a password reset email via an external API\n break;\n default:\n // Handle messages we haven't mentioned explicitly (write a log, push to a DLQ)\n break;\n }\n },\n} satisfies ExportedHandler;\n```\n\n### Remove a consumer\n\nTo remove a queue from your project, run `wrangler queues consumer remove ` and then remove the desired queue below the `[[queues.consumers]]` in Wr", "char_start": 8160, "char_end": 8960, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "a4580ca57a7c4b60", "doc_id": "queues/reference/how-queues-works.md", "text": "ues consumer remove ` and then remove the desired queue below the `[[queues.consumers]]` in Wrangler file.\n\n### Pull consumers\n\nA queue can have a HTTP-based consumer that pulls from the queue, instead of messages being pushed to a Worker.\n\nThis consumer can be any HTTP-speaking service that can communicate over the Internet. Review the [pull consumer guide](/queues/configuration/pull-consumers/) to learn how to configure a pull-based consumer for a queue.\n\n## Messages\n\nA message is the object you are producing to and consuming from a queue.\n\nAny JSON serializable object can be published to a queue. For most developers, this means either simple strings or JSON objects. You can explicitly [set the content type](#content-types) when sending a message.\n\nMessages them", "char_start": 8840, "char_end": 9640, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "9c87468a34c03d96", "doc_id": "queues/reference/how-queues-works.md", "text": "trings or JSON objects. You can explicitly [set the content type](#content-types) when sending a message.\n\nMessages themselves can be [batched when delivered to a consumer](/queues/configuration/batching-retries/). By default, messages within a batch are treated as all or nothing when determining retries. If the last message in a batch fails to be processed, the entire batch will be retried. You can also choose to [explicitly acknowledge](/queues/configuration/batching-retries/) messages as they are successfully processed, and/or mark individual messages to be retried.\n", "char_start": 9520, "char_end": 10096, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "c107015535bd3253", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "---\npcx_content_type: reference\ntitle: Workers API reference\ndescription: Complete reference for the R2 in-Worker API, including bucket and object operations.\nproducts:\n - r2\n---\n\nimport { Type, MetaInfo, WranglerConfig, TabItem, Tabs } from \"~/components\";\n\nThe in-Worker R2 API is accessed by binding an R2 bucket to a [Worker](/workers). The Worker you write can expose external access to buckets via a route or manipulate R2 objects internally.\n\nThe R2 API includes some extensions and semantic differences from the S3 API. If you need S3 compatibility, consider using the [S3-compatible API](/r2/api/s3/).\n\n## Concepts\n\nR2 organizes the data you store, called objects, into containers, called buckets. Buckets are the fundamental unit of performance, scaling, and access within R2.\n\n## Create a", "char_start": 0, "char_end": 800, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "400fdda41e0655db", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "containers, called buckets. Buckets are the fundamental unit of performance, scaling, and access within R2.\n\n## Create a binding\n\n:::note[Bindings]\n\nA binding is how your Worker interacts with external resources such as [KV Namespaces](/kv/concepts/kv-namespaces/), [Durable Objects](/durable-objects/), or [R2 Buckets](/r2/buckets/). A binding is a runtime variable that the Workers runtime provides to your code. You can declare a variable name in your Wrangler file that will be bound to these resources at runtime, and interact with them through this variable. Every binding's variable name and behavior is determined by you when deploying the Worker. Refer to [Environment Variables](/workers/configuration/environment-variables/) for more information.\n\nA binding is defined in the Wrangler file", "char_start": 680, "char_end": 1480, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "fe0563079f7d9e6d", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "riables](/workers/configuration/environment-variables/) for more information.\n\nA binding is defined in the Wrangler file of your Worker project's directory.\n\n:::\n\nTo bind your R2 bucket to your Worker, add the following to your Wrangler file. Update the `binding` property to a valid JavaScript variable identifier and `bucket_name` to the name of your R2 bucket:\n\n\n\n```jsonc\n{\n\t\"r2_buckets\": [\n\t\t{\n\t\t\t\"binding\": \"MY_BUCKET\", // <~ valid JavaScript variable name\n\t\t\t\"bucket_name\": \"\"\n\t\t}\n\t]\n}\n```\n\n\n\nWithin your Worker, your bucket binding is now available under the `MY_BUCKET` variable and you can begin interacting with it using the [bucket methods](#bucket-method-definitions) described below.\n\n## Bucket method definitions\n\nThe following method", "char_start": 1360, "char_end": 2160, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "004d0d9941119c20", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "ng the [bucket methods](#bucket-method-definitions) described below.\n\n## Bucket method definitions\n\nThe following methods are available on the bucket binding object injected into your code.\n\nFor example, to issue a `PUT` object request using the binding above:\n\n \n\n```js\nexport default {\n\tasync fetch(request, env) {\n\t\tconst url = new URL(request.url);\n\t\tconst key = url.pathname.slice(1);\n\n\t\tswitch (request.method) {\n\t\t\tcase \"PUT\":\n\t\t\t\tawait env.MY_BUCKET.put(key, request.body);\n\t\t\t\treturn new Response(`Put ${key} successfully!`);\n\n\t\t\tdefault:\n\t\t\t\treturn new Response(`${request.method} is not allowed.`, {\n\t\t\t\t\tstatus: 405,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAllow: \"PUT\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t}\n\t},\n};\n```\n\n\n\n\n\n```py\nfrom workers import WorkerEntrypoint, Response\nfrom urllib.parse import urlparse\n\nclass Default(WorkerEntrypoint):\n\tasync def fetch(self, request):\n\t\turl = urlparse(request.url)\n\t\tkey = url.path[1:]\n\n\t\tif request.method == \"PUT\":\n\t\t\tawait self.env.MY_BUCKET.put(key, request.body)\n\t\t\treturn Response(f\"Put {key} successfully!\")\n\t\telse:\n\t\t\treturn Response(\n\t\t\t\tf\"{request.method} is not allowed.\",\n\t\t\t\tstatus=405,\n\t\t\t\theaders={\"Allow\": \"PUT\"}\n\t\t\t)\n```\n\n\n\n\n- `head` \" />\n\n - Retrieves the `R2Object` for the given key containing only object metadata, if the key exists, a", "char_start": 2720, "char_end": 3520, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "9928cfd8293e57be", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "Object | null>\" />\n\n - Retrieves the `R2Object` for the given key containing only object metadata, if the key exists, and `null` if the key does not exist.\n\n- `get` \" />\n\n - Retrieves the `R2ObjectBody` for the given key containing object metadata and the object body as a ReadableStream, if the key exists, and `null` if the key does not exist.\n - In the event that a precondition specified in options fails, get() returns an R2Object with body undefined.\n\n- `put` \" />\n\n - Stores the gi", "char_start": 3400, "char_end": 4200, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "96a05ea39eb4b144", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "uffer | ArrayBufferView | string | null | Blob, options?: R2PutOptions): Promise\" />\n\n - Stores the given value and metadata under the associated key. Once the write succeeds, returns an `R2Object` containing metadata about the stored Object.\n - In the event that a precondition specified in options fails, put() returns `null`, and the object will not be stored.\n - R2 writes are strongly consistent. Once the Promise resolves, all subsequent read operations will see this key value pair globally.\n\n- `delete` \" />\n\n - Deletes the given values and metadata under the associated keys. Once the delete succeeds, returns void.\n - R2 delet", "char_start": 4080, "char_end": 4880, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "dcb53aedad7d5133", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "> and metadata under the associated keys. Once the delete succeeds, returns void.\n - R2 deletes are strongly consistent. Once the Promise resolves, all subsequent read operations will no longer see the provided key value pairs globally.\n - Up to 1000 keys may be deleted per call.\n\n- `list` \" />\n\n * Returns an R2Objects containing a list of R2Object contained within the bucket.\n * The returned list of objects is ordered lexicographically.\n * Returns up to 1000 entries, but may return less in order to minimize memory pressure within the Worker.\n * To explicitly set the number of objects to list, provide an [R2ListOptions](/r2/api/workers/workers-api-reference/#r2listoptions) obj", "char_start": 4760, "char_end": 5560, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "9d999c5a9ffc5657", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " set the number of objects to list, provide an [R2ListOptions](/r2/api/workers/workers-api-reference/#r2listoptions) object with the `limit` property set.\n\n* `createMultipartUpload` \" />\n\n - Creates a multipart upload.\n - Returns Promise which resolves to an `R2MultipartUpload` object representing the newly created multipart upload. Once the multipart upload has been created, the multipart upload can be immediately interacted with globally, either through the Workers API, or through the S3 API.\n\n- `resumeMultipartUpload` \n\n - Returns an object representing a multipart upload with the given key and uploadId.\n - The resumeMultipartUpload ope", "char_start": 5440, "char_end": 6240, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "522b597fb17f268f", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " - Returns an object representing a multipart upload with the given key and uploadId.\n - The resumeMultipartUpload operation does not perform any checks to ensure the validity of the uploadId, nor does it verify the existence of a corresponding active multipart upload. This is done to minimize latency before being able to call subsequent operations on the `R2MultipartUpload` object.\n\n## `R2Object` definition\n\n`R2Object` is created when you `PUT` an object into an R2 bucket. `R2Object` represents the metadata of an object based on the information provided by the uploader. Every object that you `PUT` into an R2 bucket will have an `R2Object` created.\n\n- `key` \n\n - The object's key.\n\n- `version` \n\n - Random unique string associated with a specif", "char_start": 6120, "char_end": 6920, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "9ebdc588b42e4685", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "string\" />\n\n - The object's key.\n\n- `version` \n\n - Random unique string associated with a specific upload of a key.\n\n- `size` \n\n - Size of the object in bytes.\n\n- `etag` \n\n:::note\n\nCloudflare recommends using the `httpEtag` field when returning an etag in a response header. This ensures the etag is quoted and conforms to [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110#section-8.8.3).\n:::\n\n- The etag associated with the object upload.\n\n- `httpEtag` \n\n - The object's etag, in quotes so as to be returned as a header.\n\n- `uploaded` \n\n - A Date object representing the time the object was uploaded.\n\n- `httpMetadata` \n\n - Various HTTP headers associated", "char_start": 6800, "char_end": 7600, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "c758acba696f6e9f", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " the time the object was uploaded.\n\n- `httpMetadata` \n\n - Various HTTP headers associated with the object. Refer to [HTTP Metadata](#http-metadata).\n\n- `customMetadata` \" />\n\n - A map of custom, user-defined metadata associated with the object.\n\n- `range` \n\n - A `R2Range` object containing the returned range of the object.\n\n- `checksums` \n\n - A `R2Checksums` object containing the stored checksums of the object. Refer to [checksums](#checksums).\n\n- `writeHttpMetadata` \n\n - Retrieves the `httpMetadata` from the `R2Object` and applies their corresponding HTTP headers to the `Headers` input object. Refer to [HTTP Metadata](#http-metadata", "char_start": 7480, "char_end": 8280, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "de5e6173be17b2a4", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "ect` and applies their corresponding HTTP headers to the `Headers` input object. Refer to [HTTP Metadata](#http-metadata).\n\n- `storageClass` \n\n - The storage class associated with the object. Refer to [Storage Classes](#storage-class).\n\n- `ssecKeyMd5` \n\n - Hex-encoded MD5 hash of the [SSE-C](/r2/examples/ssec) key used for encryption (if one was provided). Hash can be used to identify which key is needed to decrypt object.\n\n## `R2ObjectBody` definition\n\n`R2ObjectBody` represents an object's metadata combined with its body. It is returned when you `GET` an object from an R2 bucket. The full list of keys for `R2ObjectBody` includes the list below and all keys inherited from [`R2Object`](#r2object-definition).\n\n- `body` \n\n - The object's value.\n\n- `bodyUsed` \n\n - Whether the object's value has been consumed or not.\n\n- `arrayBuffer` \" />\n\n - Returns a Promise that resolves to an `ArrayBuffer` containing the object's value.\n\n- `text` \" />\n\n - Returns a Promise that resolves to a string containing the object's value.\n\n- `json` () : Promise\" />\n\n - Returns a Promise that resolves to the given object containing the object's value.\n\n- `blob` \" />\n\n - Returns a Promise that resolves to a binary Blob containing the object's val", "char_start": 8840, "char_end": 9640, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "171d54cb7ac2ac7d", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "lob` \" />\n\n - Returns a Promise that resolves to a binary Blob containing the object's value.\n\n## `R2MultipartUpload` definition\n\nAn `R2MultipartUpload` object is created when you call `createMultipartUpload` or `resumeMultipartUpload`. `R2MultipartUpload` is a representation of an ongoing multipart upload.\n\nUncompleted multipart uploads will be automatically aborted after 7 days.\n\n:::note\n\nAn `R2MultipartUpload` object does not guarantee that there is an active underlying multipart upload corresponding to that object.\n\nA multipart upload can be completed or aborted at any time, either through the S3 API, or by a parallel invocation of your Worker. Therefore it is important to add the necessary error handling code around each operation on a `R2MultipartUpload`", "char_start": 9520, "char_end": 10320, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "ca6ab63b35552f8d", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "orker. Therefore it is important to add the necessary error handling code around each operation on a `R2MultipartUpload` object in case the underlying multipart upload no longer exists.\n\n:::\n\n- `key` \n\n - The `key` for the multipart upload.\n\n- `uploadId` \n\n - The `uploadId` for the multipart upload.\n\n- `uploadPart` \" />\n\n - Uploads a single part with the specified part number to this multipart upload. Each part must be uniform in size with an exception for the final part which can be smaller.\n - Returns an `R2UploadedPart` object containing the `etag` and `partNumber`. These `R2UploadedP", "char_start": 10200, "char_end": 11000, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "9ffff7a9e1d541af", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " which can be smaller.\n - Returns an `R2UploadedPart` object containing the `etag` and `partNumber`. These `R2UploadedPart` objects are required when completing the multipart upload.\n\n- `abort` \" />\n\n - Aborts the multipart upload. Returns a Promise that resolves when the upload has been successfully aborted.\n\n- `complete` \" />\n\n - Completes the multipart upload with the given parts.\n - Returns a Promise that resolves when the complete operation has finished. Once this happens, the object is immediately accessible globally by any subsequent read operation.\n\n## Method-specific types\n\n### R2GetOptions\n\n- `onlyIf` \n\n - Specifies that the object should only b", "char_start": 10880, "char_end": 11680, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "4e36148cee7c3638", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "types\n\n### R2GetOptions\n\n- `onlyIf` \n\n - Specifies that the object should only be returned given satisfaction of certain conditions in the `R2Conditional` or in the conditional Headers. Refer to [Conditional operations](#conditional-operations).\n\n- `range` \n\n - Specifies that only a specific length (from an optional offset) or suffix of bytes from the object should be returned. Refer to [Ranged reads](#ranged-reads).\n\n- `ssecKey` \n\n - Specifies a key to be used for [SSE-C](/r2/examples/ssec). Key must be 32 bytes in length, in the form of a hex-encoded string or an ArrayBuffer.\n\n#### Ranged reads\n\n`R2GetOptions` accepts a `range` parameter, which can be used to restrict the data returned in", "char_start": 11560, "char_end": 12360, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "e5a719b9a0e1ee99", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "ffer.\n\n#### Ranged reads\n\n`R2GetOptions` accepts a `range` parameter, which can be used to restrict the data returned in `body`.\n\nThere are 3 variations of arguments that can be used in a range:\n\n- An offset with an optional length.\n- An optional offset with a length.\n- A suffix.\n\n- `offset` \n\n - The byte to begin returning data from, inclusive.\n\n- `length` \n\n - The number of bytes to return. If more bytes are requested than exist in the object, fewer bytes than this number may be returned.\n\n- `suffix` \n\n - The number of bytes to return from the end of the file, starting from the last byte. If more bytes are requested than exist in the object, fewer bytes than this number may be returned.\n\n### R2PutOptions\n\n- `onlyIf` \n\n - Specifies that the object should only be stored given satisfaction of certain conditions in the `R2Conditional`. Refer to [Conditional operations](#conditional-operations).\n\n- `httpMetadata` \n\n - Various HTTP headers associated with the object. Refer to [HTTP Metadata](#http-metadata).\n\n- `customMetadata` \" /> \n\n - A map of custom, user-defined metadata that will be stored with the object.\n\n:::note\n\nOnly a single hashing algorithm can be specified at once.\n\n:::\n\n- `md5` \n\n - A md5 hash to use to check the received object's integrity.\n\n- `sha1` \n\n - A SHA-1 hash to use to check the received object's integrity.\n\n- `sha256` \n\n - A SHA-256 hash to use to check the received object's integrity.\n\n- `sha384` \n\n - A SHA-384 hash to use to check the received object's integrity.\n\n- `sha512` \n\n - A SHA-512 hash to use to check the received object's integr", "char_start": 13600, "char_end": 14400, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "6618429a29034097", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "=\"ArrayBuffer | string\" /> \n\n - A SHA-512 hash to use to check the received object's integrity.\n\n- `storageClass` \n\n - Sets the storage class of the object if provided. Otherwise, the object will be stored in the default storage class associated with the bucket. Refer to [Storage Classes](#storage-class).\n\n- `ssecKey` \n\n - Specifies a key to be used for [SSE-C](/r2/examples/ssec). Key must be 32 bytes in length, in the form of a hex-encoded string or an ArrayBuffer.\n\n### R2MultipartOptions\n\n- `httpMetadata` \n\n - Various HTTP headers associated with the object. Refer to [HTTP Metadata](#http-metadata).\n\n- `cus", "char_start": 14280, "char_end": 15080, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "1a6bf5e0aaab9322", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "xt=\"optional\" />\n\n - Various HTTP headers associated with the object. Refer to [HTTP Metadata](#http-metadata).\n\n- `customMetadata` \" /> \n\n - A map of custom, user-defined metadata that will be stored with the object.\n\n- `storageClass` \n\n - Sets the storage class of the object if provided. Otherwise, the object will be stored in the default storage class associated with the bucket. Refer to [Storage Classes](#storage-class).\n\n- `ssecKey` \n\n - Specifies a key to be used for [SSE-C](/r2/examples/ssec). Key must be 32 bytes in length, in the form of a hex-encoded string or an ArrayBuffer.\n\n### R2ListOptions\n\n- `limit` \n\n", "char_start": 14960, "char_end": 15760, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "bf3b07dccf12ad45", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "ex-encoded string or an ArrayBuffer.\n\n### R2ListOptions\n\n- `limit` \n\n - The number of results to return. Defaults to `1000`, with a maximum of `1000`.\n\n - If `include` is set, you may receive fewer than `limit` results in your response to accommodate metadata.\n\n- `prefix` \n\n - The prefix to match keys against. Keys will only be returned if they start with given prefix.\n\n- `cursor` \n\n - An opaque token that indicates where to continue listing objects from. A cursor can be retrieved from a previous list operation.\n\n- `delimiter` \n\n - The character to use when grouping keys.\n\n- `include`", "char_start": 15640, "char_end": 16440, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "ca762573190cbb81", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "elimiter` \n\n - The character to use when grouping keys.\n\n- `include` \" /> \n\n - Can include `httpMetadata` and/or `customMetadata`. If included, items returned by the list will include the specified metadata.\n\n - Note that there is a limit on the total amount of data that a single `list` operation can return. If you request data, you may receive fewer than `limit` results in your response to accommodate metadata.\n\n - The [compatibility date](/workers/configuration/compatibility-dates/) must be set to `2022-08-04` or later in your Wrangler file. If not, then the `r2_list_honor_include` compatibility flag must be set. Otherwise it is treated as `include: ['httpMetadata', 'customMetadata", "char_start": 16320, "char_end": 17120, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "ecbda11ee844b6bd", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "ist_honor_include` compatibility flag must be set. Otherwise it is treated as `include: ['httpMetadata', 'customMetadata']` regardless of what the `include` option provided actually is.\n\n This means applications must be careful to avoid comparing the amount of returned objects against your `limit`. Instead, use the `truncated` property to determine if the `list` request has more data to be returned.\n\n \n```js\nconst options = {\n\tlimit: 500,\n\tinclude: [\"customMetadata\"],\n};\n\nconst listed = await env.MY_BUCKET.list(options);\n\nlet truncated = listed.truncated;\nlet cursor = truncated ? listed.cursor : undefined;\n\n// \u274c - if your limit can't fit into a single response or your\n// bucket has less objects than the lim", "char_start": 17000, "char_end": 17800, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "e1f8b0e5b79e7377", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "rsor : undefined;\n\n// \u274c - if your limit can't fit into a single response or your\n// bucket has less objects than the limit, it will get stuck here.\nwhile (listed.objects.length < options.limit) {\n\t// ...\n}\n\n// \u2705 - use the truncated property to check if there are more\n// objects to be returned\nwhile (truncated) {\n\tconst next = await env.MY_BUCKET.list({\n\t\t...options,\n\t\tcursor: cursor,\n\t});\n\tlisted.objects.push(...next.objects);\n\n\ttruncated = next.truncated;\n\tcursor = next.cursor;\n}\n```\n \n```py\nlimit = 500\ninclude = [\"customMetadata\"]\n\nlisted = await self.env.MY_BUCKET.list(limit=limit, include=include)\n\ntruncated = listed.truncated\ncursor = listed.cursor if truncated else None\n\n# \u274c - if your limit can't fit into a single response or your\n", "char_start": 17680, "char_end": 18480, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "dc5c9531001e39ae", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "d.truncated\ncursor = listed.cursor if truncated else None\n\n# \u274c - if your limit can't fit into a single response or your\n# bucket has less objects than the limit, it will get stuck here.\nwhile len(listed.objects) < limit:\n ...\n\n# \u2705 - use the truncated property to check if there are more\n# objects to be returned\nwhile truncated:\n next_page = await self.env.MY_BUCKET.list(limit=limit, include=include, cursor=cursor)\n listed.objects.extend(next_page.objects)\n\n truncated = next_page.truncated\n cursor = next_page.cursor\n```\n \n\n### R2Objects\n\nAn object containing an `R2Object` array, returned by `BUCKET_BINDING.list()`.\n\n- `objects` \" />\n\n - An array of objects matching the `list` request.\n\n- `truncated` boolean\n\n - If true, indicates t", "char_start": 18360, "char_end": 19160, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "6f759388ad943dc3", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "ray\" />\n\n - An array of objects matching the `list` request.\n\n- `truncated` boolean\n\n - If true, indicates there are more results to be retrieved for the current `list` request.\n\n- `cursor` \n\n - A token that can be passed to future `list` calls to resume listing from that point. Only present if truncated is true.\n\n- `delimitedPrefixes` \" />\n\n - If a delimiter has been specified, contains all prefixes between the specified prefix and the next occurrence of the delimiter.\n\n - For example, if no prefix is provided and the delimiter is '/', `foo/bar/baz` would return `foo` as a delimited prefix. If `foo/` was passed as a prefix with the same structure and delimiter, `foo/bar` would be returned as a delim", "char_start": 19040, "char_end": 19840, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "b8820e3cd43dff62", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "d prefix. If `foo/` was passed as a prefix with the same structure and delimiter, `foo/bar` would be returned as a delimited prefix.\n\n### Conditional operations\n\nYou can pass an `R2Conditional` object to `R2GetOptions` and `R2PutOptions`. If the condition check for `get()` fails, the body will not be returned. This will make `get()` have lower latency.\n\nIf the condition check for `put()` fails, `null` will be returned instead of the `R2Object`.\n\n- `etagMatches` \n\n - Performs the operation if the object's etag matches the given string.\n\n- `etagDoesNotMatch` \n\n - Performs the operation if the object's etag does not match the given string.\n\n- `uploadedBefore` \n\n - Performs the operation if the object was uploaded before the given date.\n\n- `uploadedAfter` \n\n - Performs the operation if the object was uploaded after the given date.\n\nAlternatively, you can pass a `Headers` object containing conditional headers to `R2GetOptions` and `R2PutOptions`. For information on these conditional headers, refer to [the MDN docs on conditional requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Conditional_requests#conditional_headers). All conditional headers aside from `If-Range` are supported.\n\nFor more specific information about conditional requests, refer to [RFC", "char_start": 20400, "char_end": 21200, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "aeb690046965557e", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "al headers aside from `If-Range` are supported.\n\nFor more specific information about conditional requests, refer to [RFC 7232](https://datatracker.ietf.org/doc/html/rfc7232).\n\n### HTTP Metadata\n\nGenerally, these fields match the HTTP metadata passed when the object was created. They can be overridden when issuing `GET` requests, in which case, the given values will be echoed back in the response.\n\n- `contentType` \n\n- `contentLanguage` \n\n- `contentDisposition` \n\n- `contentEncoding` \n\n- `cacheControl` \n\n- `cacheExpiry` <", "char_start": 21080, "char_end": 21880, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "5633afa97a209290", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "tional\" />\n\n- `cacheControl` \n\n- `cacheExpiry` \n\n### Checksums\n\nIf a checksum was provided when using the `put()` binding, it will be available on the returned object under the `checksums` property. The MD5 checksum will be included by default for non-multipart objects.\n\n- `md5` \n\n - The MD5 checksum of the object.\n\n- `sha1` \n\n - The SHA-1 checksum of the object.\n\n- `sha256` \n\n - The SHA-256 checksum of the object.\n\n- `sha384` \n\n - The SHA-384 checksum of the object.\n", "char_start": 21760, "char_end": 22560, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "96e414fd61c329a5", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "e object.\n\n- `sha384` \n\n - The SHA-384 checksum of the object.\n\n- `sha512` \n\n - The SHA-512 checksum of the object.\n\n### `R2UploadedPart`\n\nAn `R2UploadedPart` object represents a part that has been uploaded. `R2UploadedPart` objects are returned from `uploadPart` operations and must be passed to `completeMultipartUpload` operations.\n\n- `partNumber` \n\n - The number of the part.\n\n- `etag` \n\n - The `etag` of the part.\n\n### Storage Class\n\nThe storage class where an `R2Object` is stored. The available storage classes are `Standard` and `InfrequentAccess`. Refer to [Storage classes](/r2/buckets/storage-classes/)\nfor more information.\n", "char_start": 22440, "char_end": 23236, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "e0fbc248c9ce7e24", "doc_id": "r2/buckets/create-buckets.md", "text": "---\npcx_content_type: how-to\ntitle: Create new buckets\ndescription: Create R2 buckets using the Cloudflare dashboard or Wrangler CLI.\nsidebar:\n order: 1\nproducts:\n - r2\n---\n\nYou can create a bucket from the Cloudflare dashboard or using Wrangler.\n\n:::note\n\nWrangler is [a command-line tool](/workers/wrangler/install-and-update/) for building with Cloudflare's developer products, including R2.\n\nThe R2 support in Wrangler allows you to manage buckets and perform basic operations against objects in your buckets. For more advanced use-cases, including bulk uploads or mirroring files from legacy object storage providers, we recommend [rclone](/r2/examples/rclone/) or an [S3-compatible](/r2/api/s3/) tool of your choice.\n\n:::\n\n## Bucket-Level Operations\n\nCreate a bucket with the [`r2 bucket crea", "char_start": 0, "char_end": 800, "metadata": {"title": "create-buckets", "path": "/data/corpora/cloudflare-state-v1/files/r2/buckets/create-buckets.md", "format": "markdown", "raw_hash": "fcb5cebd61d6e44db103ad8cbee20718ee6e48389ec3193ab5297216cce117ac"}} +{"chunk_id": "a681eaa40cc9bfb5", "doc_id": "r2/buckets/create-buckets.md", "text": "ompatible](/r2/api/s3/) tool of your choice.\n\n:::\n\n## Bucket-Level Operations\n\nCreate a bucket with the [`r2 bucket create`](/workers/wrangler/commands/r2/#r2-bucket-create) command:\n\n```sh\nwrangler r2 bucket create your-bucket-name\n```\n\n:::note\n\n- Bucket names can only contain lowercase letters (a-z), numbers (0-9), and hyphens (-).\n- Bucket names cannot begin or end with a hyphen.\n- Bucket names can only be between 3-63 characters in length.\n\nThe placeholder text is only for the example.\n\n:::\n\nList buckets in the current account with the [`r2 bucket list`](/workers/wrangler/commands/r2/#r2-bucket-list) command:\n\n```sh\nwrangler r2 bucket list\n```\n\nTo delete a bucket, you must first empty it and then delete it. For detailed instructions, refer to [Delete buckets](/r2/buckets/delete-buckets", "char_start": 680, "char_end": 1480, "metadata": {"title": "create-buckets", "path": "/data/corpora/cloudflare-state-v1/files/r2/buckets/create-buckets.md", "format": "markdown", "raw_hash": "fcb5cebd61d6e44db103ad8cbee20718ee6e48389ec3193ab5297216cce117ac"}} +{"chunk_id": "0887bfaec6140e3b", "doc_id": "r2/buckets/create-buckets.md", "text": " must first empty it and then delete it. For detailed instructions, refer to [Delete buckets](/r2/buckets/delete-buckets/).\n\n## Notes\n\n- Bucket names and buckets are not public by default. To allow public access to a bucket, refer to [Public buckets](/r2/buckets/public-buckets/).\n- For information on controlling access to your R2 bucket with Cloudflare Access, refer to [Protect an R2 Bucket with Cloudflare Access](/r2/tutorials/cloudflare-access/).\n- Invalid (unauthorized) access attempts to private buckets do not incur R2 operations charges against that bucket. Refer to the [R2 pricing FAQ](/r2/pricing/#frequently-asked-questions) to understand what operations are billed vs. not billed.\n", "char_start": 1360, "char_end": 2057, "metadata": {"title": "create-buckets", "path": "/data/corpora/cloudflare-state-v1/files/r2/buckets/create-buckets.md", "format": "markdown", "raw_hash": "fcb5cebd61d6e44db103ad8cbee20718ee6e48389ec3193ab5297216cce117ac"}} +{"chunk_id": "056db78f7fb49c25", "doc_id": "r2/how-r2-works.md", "text": "---\ntitle: How R2 works\n\npcx_content_type: concept\nsidebar:\n order: 2\ndescription: Find out how R2 works.\nproducts:\n - r2\nhead:\n - tag: title\n content: How R2 works\n---\n\nimport { Render, LinkCard } from \"~/components\";\n\nCloudflare R2 is an S3-compatible object storage service with no egress fees, built on Cloudflare's global network. It is [strongly consistent](/r2/reference/consistency/) and designed for high [data durability](/r2/reference/durability/).\n\nR2 is ideal for storing and serving unstructured data that needs to be accessed frequently over the internet, without incurring egress fees. It's a good fit for workloads like serving web assets, training AI models, and managing user-generated content.\n\n## Architecture\n\nR2's architecture is composed of multiple components:\n\n- **R2 ", "char_start": 0, "char_end": 800, "metadata": {"title": "how-r2-works", "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", "format": "markdown", "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18"}} +{"chunk_id": "e957b32a00197d50", "doc_id": "r2/how-r2-works.md", "text": "s, and managing user-generated content.\n\n## Architecture\n\nR2's architecture is composed of multiple components:\n\n- **R2 Gateway:** The entry point for all API requests that handles authentication and routing logic. This service is deployed across Cloudflare's global network via [Cloudflare Workers](/workers/).\n\n- **Metadata Service:** A distributed layer built on [Durable Objects](/durable-objects/) used to store and manage object metadata (e.g. object key, checksum) to ensure strong consistency of the object across the storage system. It includes a built-in cache layer to speed up access to metadata.\n\n- **Tiered Read Cache:** A caching layer that sits in front of the Distributed Storage Infrastructure that speeds up object reads by using [Cloudflare Tiered Cache](/cache/how-to/tiered-cach", "char_start": 680, "char_end": 1480, "metadata": {"title": "how-r2-works", "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", "format": "markdown", "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18"}} +{"chunk_id": "e846b6a367620372", "doc_id": "r2/how-r2-works.md", "text": "tributed Storage Infrastructure that speeds up object reads by using [Cloudflare Tiered Cache](/cache/how-to/tiered-cache/) to serve data closer to the client.\n\n- **Distributed Storage Infrastructure:** The underlying infrastructure that persistently stores encrypted object data.\n\n![R2 Architecture](public/images/r2/r2-architecture.png)\n\nR2 supports multiple client interfaces including [Cloudflare Workers Binding](/r2/api/workers/workers-api-usage/), [S3-compatible API](/r2/api/s3/api/), and a [REST API](/api/resources/r2/) that powers the Cloudflare Dashboard and Wrangler CLI. All requests are routed through the R2 Gateway, which coordinates with the Metadata Service and Distributed Storage Infrastructure to retrieve the object data.\n\n## Write data to R2\n\nWhen a write request (e.g. upload", "char_start": 1360, "char_end": 2160, "metadata": {"title": "how-r2-works", "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", "format": "markdown", "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18"}} +{"chunk_id": "fafbe58d70d66366", "doc_id": "r2/how-r2-works.md", "text": " Distributed Storage Infrastructure to retrieve the object data.\n\n## Write data to R2\n\nWhen a write request (e.g. uploading an object) is made to R2, the following sequence occurs:\n\n1. **Request handling:** The request is received by the R2 Gateway at the edge, close to the user, where it is authenticated.\n\n2. **Encryption and routing:** The Gateway reaches out to the Metadata Service to retrieve the [encryption key](/r2/reference/data-security/) and determines which storage cluster to write the encrypted data to within the [location](/r2/reference/data-location/) set for the bucket.\n\n3. **Writing to storage:** The encrypted data is written and stored in the distributed storage infrastructure, and replicated within the region (e.g. ENAM) for [durability](/r2/reference/durability/).\n\n4. **M", "char_start": 2040, "char_end": 2840, "metadata": {"title": "how-r2-works", "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", "format": "markdown", "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18"}} +{"chunk_id": "9e1716df6d7ad757", "doc_id": "r2/how-r2-works.md", "text": "torage infrastructure, and replicated within the region (e.g. ENAM) for [durability](/r2/reference/durability/).\n\n4. **Metadata commit:** Finally, the Metadata Service commits the object's metadata, making it visible in subsequent reads. Only after this commit is an `HTTP 200` success response sent to the client, preventing unacknowledged writes.\n\n![Write data to R2](public/images/r2/write-data-to-r2.png)\n\n## Read data from R2\n\nWhen a read request (e.g. fetching an object) is made to R2, the following sequence occurs:\n\n1. **Request handling:** The request is received by the R2 Gateway at the edge, close to the user, where it is authenticated.\n\n2. **Metadata lookup:** The Gateway asks the Metadata Service for the object metadata.\n\n3. **Reading the object:** The Gateway attempts to retrieve ", "char_start": 2720, "char_end": 3520, "metadata": {"title": "how-r2-works", "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", "format": "markdown", "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18"}} +{"chunk_id": "2185263db7b93ee9", "doc_id": "r2/how-r2-works.md", "text": "Gateway asks the Metadata Service for the object metadata.\n\n3. **Reading the object:** The Gateway attempts to retrieve the [encrypted](/r2/reference/data-security/) object from the tiered read cache. If it's not available, it retrieves the object from one of the distributed storage data centers within the region that holds the object data.\n\n4. **Serving to client:** The object is decrypted and served to the user.\n\n![Read data to R2](public/images/r2/read-data-to-r2.png)\n\n## Performance\n\nThe performance of your operations can be influenced by factors such as the bucket's geographical location, request origin, and access patterns.\n\nTo optimize upload performance for cross-region requests, enable [Local Uploads](/r2/buckets/local-uploads/) on your bucket.\n\nTo optimize read performance, enabl", "char_start": 3400, "char_end": 4200, "metadata": {"title": "how-r2-works", "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", "format": "markdown", "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18"}} +{"chunk_id": "5d39c59fb2835912", "doc_id": "r2/how-r2-works.md", "text": "region requests, enable [Local Uploads](/r2/buckets/local-uploads/) on your bucket.\n\nTo optimize read performance, enable [Cloudflare Cache](/cache/) when using a [custom domain](/r2/buckets/public-buckets/#custom-domains). When caching is enabled, read requests can bypass the R2 Gateway and be served directly from Cloudflare's edge cache, reducing latency. Note that cached data may not reflect the latest version immediately.\n\n![Read data to R2 with Cloudflare Cache](public/images/r2/read-data-to-r2-with-cloudflare-cache.png)\n\n## Learn more\n\n\n\n\n\n\n\n\n\n\n", "char_start": 4760, "char_end": 5213, "metadata": {"title": "how-r2-works", "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", "format": "markdown", "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18"}} +{"chunk_id": "5b555075ebcef452", "doc_id": "r2/index.md", "text": "---\ntitle: Cloudflare R2\n\npcx_content_type: overview\nsidebar:\n order: 1\ndescription: Cloudflare R2 is a cost-effective, scalable object storage solution for cloud-native apps, web content, and data lakes without egress fees.\nproducts:\n - r2\nhead:\n - tag: title\n content: Overview\n---\n\nimport {\n\tCardGrid,\n\tDescription,\n\tFeature,\n\tLinkButton,\n\tLinkTitleCard,\n\tPlan,\n\tRelatedProduct,\n} from \"~/components\";\n\n\n\nObject storage for all your data.\n\n\n\nCloudflare R2 Storage allows developers to store large amounts of unstructured data without the costly egress bandwidth fees associated with typical cloud storage services.\n\nYou can use R2 for multiple scenarios, including but not limited to:\n\n- Storage for cloud-native applications\n- Cloud storage for web content\n- Stor", "char_start": 0, "char_end": 800, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/r2/index.md", "format": "markdown", "raw_hash": "7e6bac2d545167b29be0e3b51617553f991edc15c97276ee890bfeca1ee90560"}} +{"chunk_id": "0738d5418ca2478b", "doc_id": "r2/index.md", "text": "scenarios, including but not limited to:\n\n- Storage for cloud-native applications\n- Cloud storage for web content\n- Storage for podcast episodes\n- Data lakes (analytics and big data)\n- Cloud storage output for large batch processes, such as machine learning model artifacts or datasets\n\n\n\tGet started\n\n\n\tBrowse the examples\n\n\n---\n\n## Features\n\n\n\nLocation Hints are optional parameters you can provide during bucket creation to indicate the primary geographical location you expect data will be accessed from.\n\n\n\n\n\nConfigure C", "char_start": 680, "char_end": 1480, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/r2/index.md", "format": "markdown", "raw_hash": "7e6bac2d545167b29be0e3b51617553f991edc15c97276ee890bfeca1ee90560"}} +{"chunk_id": "61aceacf675794cb", "doc_id": "r2/index.md", "text": "cation you expect data will be accessed from.\n\n\n\n\n\nConfigure CORS to interact with objects in your bucket and configure policies on your bucket.\n\n\n\n\n\nPublic buckets expose the contents of your R2 bucket directly to the Internet.\n\n\n\n\n\nCreate bucket scoped tokens for granular control over who can access your data.\n\n\n\n---\n\n## Related products\n\n\n\nA [serverless](https://www.cloudflare.com/learning/serverless/what-is-serverless/) execution environment that allows you to create entirely new applications or augment e", "char_start": 1360, "char_end": 2160, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/r2/index.md", "format": "markdown", "raw_hash": "7e6bac2d545167b29be0e3b51617553f991edc15c97276ee890bfeca1ee90560"}} +{"chunk_id": "9738579654e6d81b", "doc_id": "r2/index.md", "text": "g/serverless/what-is-serverless/) execution environment that allows you to create entirely new applications or augment existing ones without configuring or maintaining infrastructure.\n\n\n\n\n\nUpload, store, encode, and deliver live and on-demand video with one API, without configuring or maintaining infrastructure.\n\n\n\n\n\nA suite of products tailored to your image-processing needs.\n\n\n\n---\n\n## More resources\n\n\n\n\n\t Understand pricing for free and paid tier rates.\n\n\n\n\n\n\t Ask questions, show off what you are building, and discuss the platform\n\twith other developers.\n\n\n\n\t Learn about product announcements, new tutorials, and what is new in\n\tCloudflare Workers.\n\n\n\n", "char_start": 2720, "char_end": 3200, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/r2/index.md", "format": "markdown", "raw_hash": "7e6bac2d545167b29be0e3b51617553f991edc15c97276ee890bfeca1ee90560"}} +{"chunk_id": "2bc903c1ae6a7b3a", "doc_id": "r2/reference/consistency.md", "text": "---\ntitle: Consistency model\ndescription: R2 provides strong global consistency for reads, writes, deletes, and list operations.\npcx_content_type: concept\nsidebar:\n order: 7\nproducts:\n - r2\n---\n\nThis page details R2's consistency model, including where R2 is strongly, globally consistent and which operations this applies to.\n\nR2 can be described as \"strongly consistent\", especially in comparison to other distributed object storage systems. This strong consistency ensures that operations against R2 see the latest (accurate) state: clients should be able to observe the effects of any write, update and/or delete operation immediately, globally.\n\n## Terminology\n\nIn the context of R2, *strong* consistency and *eventual* consistency have the following meanings:\n\n* **Strongly consistent** - The", "char_start": 0, "char_end": 800, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "92a2fcbde612f0f4", "doc_id": "r2/reference/consistency.md", "text": "ext of R2, *strong* consistency and *eventual* consistency have the following meanings:\n\n* **Strongly consistent** - The effect of an operation will be observed globally, immediately, by all clients. Clients will not observe 'stale' (inconsistent) state.\n* **Eventually consistent** - Clients may not see the effect of an operation immediately. The state may take a some time (typically seconds to a minute) to propagate globally.\n\n## Operations and Consistency\n\nOperations against R2 buckets and objects adhere to the following consistency guarantees:\n\n\n\n| Action | Consistency |\n| ---------", "char_start": 680, "char_end": 1480, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "11ce2c854f7885f5", "doc_id": "r2/reference/consistency.md", "text": " |\n| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Read-after-write: Write (upload) an object, then read it | Strongly consistent: readers will immediately see the latest object globally |\n| Metadata: Update an object's metadata | Strongly consistent: readers will immediately see the updated metadata globally |\n| Deletion: Delete an object", "char_start": 1360, "char_end": 2160, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "257bc4c5c1d067f7", "doc_id": "r2/reference/consistency.md", "text": "ta globally |\n| Deletion: Delete an object | Strongly consistent: reads to that object will immediately return a \"does not exist\" error |\n| Object listing: List the objects in a bucket | Strongly consistent: the list operation will list all objects at that point in time |\n| IAM: Adding/removing R2 Storage permissions | Eventually consistent: A [new or updated API key](/fundamentals/api/get-started/create-token/) may take up to a minute to have permissions reflected globally |\n\n\n\nAdditional notes:\n\n* In the e", "char_start": 2040, "char_end": 2840, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "287de2fe926a872e", "doc_id": "r2/reference/consistency.md", "text": "e-token/) may take up to a minute to have permissions reflected globally |\n\n\n\nAdditional notes:\n\n* In the event two clients are writing (`PUT` or `DELETE`) to the same key, the last writer to complete \"wins\".\n* When performing a multipart upload, read-after-write consistency continues to apply once all parts have been successfully uploaded. In the case the same part is uploaded (in error) from multiple writers, the last write will win.\n* Copying an object within the same bucket also follows the same read-after-write consistency that writing a new object would. The \"copied\" object is immediately readable by all clients once the copy operation completes.\n* To delete an R2 bucket, it must be completely empty before deletion is allowed. If you attempt to delete a bucket that still", "char_start": 2720, "char_end": 3520, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "ba0bf751878021a3", "doc_id": "r2/reference/consistency.md", "text": "elete an R2 bucket, it must be completely empty before deletion is allowed. If you attempt to delete a bucket that still contains objects, you will receive an error such as: `The bucket you tried to delete (X) is not empty (account Y)` or `Bucket X cannot be deleted because it isn\u2019t empty.` For instructions on emptying and deleting a bucket, refer to [Delete buckets](/r2/buckets/delete-buckets/).\n\n\n## Caching\n\n:::note\n\n\nBy default, Cloudflare's cache will cache common, cacheable status codes automatically [per our cache documentation](/cache/how-to/configure-cache-status-code/#edge-ttl).\n\n\n:::\n\nWhen connecting a [custom domain](/r2/buckets/public-buckets/#custom-domains) to an R2 bucket and enabling caching for objects served from that bucket, the consistency model is necessarily relaxed w", "char_start": 3400, "char_end": 4200, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "8631a37b10d98623", "doc_id": "r2/reference/consistency.md", "text": "to an R2 bucket and enabling caching for objects served from that bucket, the consistency model is necessarily relaxed when accessing content via a domain with caching enabled.\n\nSpecifically, you should expect:\n\n* An object you delete from R2, but that is still cached, will still be available. You should [purge the cache](/cache/how-to/purge-cache/) after deleting objects if you need that delete to be reflected.\n* By default, Cloudflare\u2019s cache will [cache HTTP 404 (Not Found) responses](/cache/how-to/configure-cache-status-code/#edge-ttl) automatically. If you upload an object to that same path, the cache may continue to return HTTP 404s until the cache TTL (Time to Live) expires and the new object is fetched from R2 or the [cache is purged](/cache/how-to/purge-cache/).\n* An object for a ", "char_start": 4080, "char_end": 4880, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "5554f74f9d5f2849", "doc_id": "r2/reference/consistency.md", "text": ") expires and the new object is fetched from R2 or the [cache is purged](/cache/how-to/purge-cache/).\n* An object for a given key is overwritten with a new object: the old (previous) object will continue to be served to clients until the cache TTL expires (or the object is evicted) or the cache is purged.\n\nThe cache does not affect access via [Worker API bindings](/r2/api/workers/) or the [S3 API](/r2/api/s3/), as these operations are made directly against the bucket and do not transit through the cache.\n", "char_start": 4760, "char_end": 5270, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "13687b84b91c1022", "doc_id": "r2/reference/durability.md", "text": "---\ntitle: Durability\ndescription: R2 is designed for 99.999999999% annual durability using replication and erasure coding.\npcx_content_type: concept\nsidebar:\n order: 7\nproducts:\n - r2\n---\n\nR2 is designed to provide 99.999999999% (eleven 9s) of annual durability. This means that if you store 10,000,000 objects on R2, you can expect to lose an object once every 10,000 years on average.\n\n## How R2 achieves eleven-nines durability\n\nR2's durability is built on multiple layers of redundancy and data protection:\n\n- **Replication**: When you upload an object, R2 stores multiple \"copies\" of that object through either full replication and/or erasure coding. This ensures that the full or partial failure of any individual disk does not result in data loss. Erasure coding distributes parts of the o", "char_start": 0, "char_end": 800, "metadata": {"title": "durability", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/durability.md", "format": "markdown", "raw_hash": "4837c8a21782dd5eb6ba73f9faf2d44de5460c634aa525f363453cf2858835ba"}} +{"chunk_id": "e50b3e319a6408a8", "doc_id": "r2/reference/durability.md", "text": "e full or partial failure of any individual disk does not result in data loss. Erasure coding distributes parts of the object across multiple disks, ensuring that even if some disks fail, the object can still be reconstructed from a subset of the available parts, preventing hardware failure or physical impacts to data centers (such as fire or floods) from causing data loss.\n\n- **Hardware redundancy**: Storage clusters are comprised of hardware distributed across several data centers within a geographic region. This physical distribution ensures that localized failures\u2014such as power outages, network disruptions, or hardware malfunctions at a single facility\u2014do not result in data loss.\n\n- **Synchronous writes**: R2 returns an `HTTP 200 (OK)` for a write via API or otherwise indicates success", "char_start": 680, "char_end": 1480, "metadata": {"title": "durability", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/durability.md", "format": "markdown", "raw_hash": "4837c8a21782dd5eb6ba73f9faf2d44de5460c634aa525f363453cf2858835ba"}} +{"chunk_id": "1c33c1822f833f32", "doc_id": "r2/reference/durability.md", "text": "n data loss.\n\n- **Synchronous writes**: R2 returns an `HTTP 200 (OK)` for a write via API or otherwise indicates success only when data has been persisted to disk. We do not rely on asynchronous replication to support underlying durability guarantees. This is critical to R2\u2019s consistency guarantees and mitigates the chance of a client receiving a successful API response without the underlying metadata and storage infrastructure having persisted the change.\n\n### Considerations\n\n* Durability is not a guarantee of data availability. It is a measure of the likelihood of data loss.\n* R2 provides an availability [SLA of 99.9%](https://www.cloudflare.com/r2-service-level-agreement/)\n* Durability does not prevent intentional or accidental deletion of data. Use [bucket locks](/r2/buckets/bucket-loc", "char_start": 1360, "char_end": 2160, "metadata": {"title": "durability", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/durability.md", "format": "markdown", "raw_hash": "4837c8a21782dd5eb6ba73f9faf2d44de5460c634aa525f363453cf2858835ba"}} +{"chunk_id": "c3998c23d03e881c", "doc_id": "r2/reference/durability.md", "text": "nt/)\n* Durability does not prevent intentional or accidental deletion of data. Use [bucket locks](/r2/buckets/bucket-locks/) and/or bucket-scoped [API tokens](/r2/api/tokens/) to limit access to data.\n* Durability is also distinct from [consistency](/r2/reference/consistency/), which describes how reads and writes are reflected in the system's state (e.g. eventual consistency vs. strong consistency).\n", "char_start": 2040, "char_end": 2444, "metadata": {"title": "durability", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/durability.md", "format": "markdown", "raw_hash": "4837c8a21782dd5eb6ba73f9faf2d44de5460c634aa525f363453cf2858835ba"}} +{"chunk_id": "4dbfc635faa69ebf", "doc_id": "workers/get-started/guide.md", "text": "---\ntitle: CLI\ndescription: Set up and deploy your first Cloudflare Worker using Wrangler, the command-line interface.\npcx_content_type: get-started\nsidebar:\n order: 1\nhead:\n - tag: title\n content: Get started - CLI\nproducts:\n - workers\n---\n\nimport { Details, Render, PackageManagers } from \"~/components\";\n\nSet up and deploy your first Worker with Wrangler, the Cloudflare Developer Platform CLI.\n\nThis guide will instruct you through setting up and deploying your first Worker.\n\n## Prerequisites\n\n\n\n## 1. Create a new Worker project\n\nOpen a terminal window and run C3 to create your Worker project. [C3 (`create-cloudflare-cli`)](https://github.com/cloudflare/workers-sdk/tree/main/packages/create-cloudflare) is a command-line tool designed to help", "char_start": 0, "char_end": 800, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "80feb827ad1a7fef", "doc_id": "workers/get-started/guide.md", "text": "(https://github.com/cloudflare/workers-sdk/tree/main/packages/create-cloudflare) is a command-line tool designed to help you set up and deploy new applications to Cloudflare.\n\n\n\n\n\nNow, you have a new project set up. Move into that project folder.\n\n```sh\ncd my-first-worker\n```\n\n
\n\nIn your project directory, C3 will have generated the following:\n\n* `wrangler.jsonc`: Your [Wrangler](/workers/wrangler/configuration/#sample-wrangler-configuration) configuration file.\n* `index.js` (in `/src`): A minimal `'Hello World!'` Worker wri", "char_start": 680, "char_end": 1480, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "2b84db9a4f91ea38", "doc_id": "workers/get-started/guide.md", "text": "tion/#sample-wrangler-configuration) configuration file.\n* `index.js` (in `/src`): A minimal `'Hello World!'` Worker written in [ES module](/workers/reference/migrate-to-module-workers/) syntax.\n* `package.json`: A minimal Node dependencies configuration file.\n* `package-lock.json`: Refer to [`npm` documentation on `package-lock.json`](https://docs.npmjs.com/cli/v9/configuring-npm/package-lock-json).\n* `node_modules`: Refer to [`npm` documentation `node_modules`](https://docs.npmjs.com/cli/v7/configuring-npm/folders#node-modules).\n\n
\n\n
\n\nIn addition to creating new projects from C3 templates, C3 also supports creating new projects from existing Git repositories. To create a new project from an existing Git repo", "char_start": 1360, "char_end": 2160, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "4a9b5e481bcbee8d", "doc_id": "workers/get-started/guide.md", "text": "C3 also supports creating new projects from existing Git repositories. To create a new project from an existing Git repository, open your terminal and run:\n\n```sh\nnpm create cloudflare@latest -- --template \n```\n\n`` may be any of the following:\n\n- `user/repo` (GitHub)\n- `git@github.com:user/repo`\n- `https://github.com/user/repo`\n- `user/repo/some-template` (subdirectories)\n- `user/repo#canary` (branches)\n- `user/repo#1234abcd` (commit hash)\n- `bitbucket:user/repo` (Bitbucket)\n- `gitlab:user/repo` (GitLab)\n\nYour existing template folder must contain the following files, at a minimum, to meet the requirements for Cloudflare Workers:\n\n- `package.json`\n- `wrangler.jsonc` [See sample Wrangler configuration](/workers/wrangler/configuration/#sample-wrangler-configuration)\n- `src/` ", "char_start": 2040, "char_end": 2840, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "050ec900beeddd37", "doc_id": "workers/get-started/guide.md", "text": "ler.jsonc` [See sample Wrangler configuration](/workers/wrangler/configuration/#sample-wrangler-configuration)\n- `src/` containing a worker script referenced from `wrangler.jsonc`\n\n
\n\n## 2. Develop with Wrangler CLI\n\nC3 installs [Wrangler](/workers/wrangler/install-and-update/), the Workers command-line interface, in Workers projects by default. Wrangler lets you to [create](/workers/wrangler/commands/general/#init), [test](/workers/wrangler/commands/general/#dev), and [deploy](/workers/wrangler/commands/general/#deploy) your Workers projects.\n\nAfter you have created your first Worker, run the [`wrangler dev`](/workers/wrangler/commands/general/#dev) command in the project directory to start a local server for developing your Worker. This will allow you to preview your Worker loca", "char_start": 2720, "char_end": 3520, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "6b7d744c42ee615d", "doc_id": "workers/get-started/guide.md", "text": "he project directory to start a local server for developing your Worker. This will allow you to preview your Worker locally during development.\n\n```sh\nnpx wrangler dev\n```\n\nIf you have never used Wrangler before, it will open your web browser so you can login to your Cloudflare account.\n\nGo to [http://localhost:8787](http://localhost:8787) to view your Worker.\n\n
\n\nIf you have issues with this step or you do not have access to a browser interface, refer to the [`wrangler login`](/workers/wrangler/commands/general/#login) documentation.\n\n
\n\n## 3. Write code\n\nWith your new project generated and running, you can begin to write and edit your code.\n\nFind the `src/index.js` file. `index.js` will be populated with the code below:\n\n```js title=\"Original ind", "char_start": 3400, "char_end": 4200, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "ae68ff0d06ffcf3c", "doc_id": "workers/get-started/guide.md", "text": "t your code.\n\nFind the `src/index.js` file. `index.js` will be populated with the code below:\n\n```js title=\"Original index.js\"\nexport default {\n\tasync fetch(request, env, ctx) {\n\t\treturn new Response(\"Hello World!\");\n\t},\n};\n```\n\n
\n\nThis code block consists of a few different parts.\n\n```js title=\"Updated index.js\" {1}\nexport default {\n\tasync fetch(request, env, ctx) {\n\t\treturn new Response(\"Hello World!\");\n\t},\n};\n```\n\n`export default` is JavaScript syntax required for defining [JavaScript modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules#default_exports_versus_named_exports). Your Worker has to have a default export of an object, with properties corresponding to the events your Worker should handle.\n\n```js title=\"index.js\" {2}\ne", "char_start": 4080, "char_end": 4880, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "52e53f70398afa81", "doc_id": "workers/get-started/guide.md", "text": "xport of an object, with properties corresponding to the events your Worker should handle.\n\n```js title=\"index.js\" {2}\nexport default {\n\tasync fetch(request, env, ctx) {\n\t\treturn new Response(\"Hello World!\");\n\t},\n};\n```\n\nThis [`fetch()` handler](/workers/runtime-apis/handlers/fetch/) will be called when your Worker receives an HTTP request. You can define additional event handlers in the exported object to respond to different types of events. For example, add a [`scheduled()` handler](/workers/runtime-apis/handlers/scheduled/) to respond to Worker invocations via a [Cron Trigger](/workers/configuration/cron-triggers/).\n\nAdditionally, the `fetch` handler will always be passed three parameters: [`request`, `env` and `context`](/workers/runtime-apis/handlers/fetch/).\n\n```js title=\"index.js\" ", "char_start": 4760, "char_end": 5560, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "021c4eb7151a0816", "doc_id": "workers/get-started/guide.md", "text": "ssed three parameters: [`request`, `env` and `context`](/workers/runtime-apis/handlers/fetch/).\n\n```js title=\"index.js\" {3}\nexport default {\n\tasync fetch(request, env, ctx) {\n\t\treturn new Response(\"Hello World!\");\n\t},\n};\n```\n\nThe Workers runtime expects `fetch` handlers to return a `Response` object or a Promise which resolves with a `Response` object. In this example, you will return a new `Response` with the string `\"Hello World!\"`.\n\n
\n\nReplace the content in your current `index.js` file with the content below, which changes the text output.\n\n```js title=\"index.js\" {3}\nexport default {\n\tasync fetch(request, env, ctx) {\n\t\treturn new Response(\"Hello Worker!\");\n\t},\n};\n```\n\nThen, save the file and reload the page. Your Worker's output will have changed to the new text.\n\n
\n\nIf the output for your Worker does not change, make sure that:\n\n1. You saved the changes to `index.js`.\n2. You have `wrangler dev` running.\n3. You reloaded your browser.\n\n
\n\n## 4. Deploy your project\n\nDeploy your Worker via Wrangler to a `*.workers.dev` subdomain or a [Custom Domain](/workers/configuration/routing/custom-domains/).\n\n```sh\nnpx wrangler deploy\n```\n\nIf you have not configured any subdomain or domain, Wrangler will prompt you during the publish process to set one up.\n\nPreview your Worker at `..workers.dev`.\n\n
\n\nIf you see [`523` errors](/support/troubleshooti", "char_start": 6120, "char_end": 6920, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "f258bf1727dae214", "doc_id": "workers/get-started/guide.md", "text": "..workers.dev`.\n\n
\n\nIf you see [`523` errors](/support/troubleshooting/http-status-codes/cloudflare-5xx-errors/error-523/) when pushing your `*.workers.dev` subdomain for the first time, wait a minute or so and the errors will resolve themselves.\n\n
\n\n## Next steps\n\nTo do more:\n\n- Push your project to a GitHub or GitLab repository then [connect to builds](/workers/ci-cd/builds/#get-started) to enable automatic builds and deployments.\n- Visit the [Cloudflare dashboard](https://dash.cloudflare.com/) for simpler editing.\n- Review our [Examples](/workers/examples/) and [Tutorials](/workers/tutorials/) for inspiration.\n- Set up [bindings](/workers/runtime-apis/bindings/) to allow your Worker to interact with other resources and unlock ", "char_start": 6800, "char_end": 7600, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "e0a94a3522ba281b", "doc_id": "workers/get-started/guide.md", "text": ".\n- Set up [bindings](/workers/runtime-apis/bindings/) to allow your Worker to interact with other resources and unlock new functionality.\n- Learn how to [test and debug](/workers/testing/) your Workers.\n- Read about [Workers limits and pricing](/workers/platform/).\n", "char_start": 7480, "char_end": 7747, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "7aad1d066ac45d0a", "doc_id": "workers/index.md", "text": "---\ntitle: Cloudflare Workers\ndescription: Build and deploy serverless applications across Cloudflare's global network with Workers.\npcx_content_type: overview\nsidebar:\n order: 1\nhead:\n - tag: title\n content: Overview\nproducts:\n - workers\n---\n\nimport { Description, RelatedProduct, LinkButton } from \"~/components\";\n\n\n\tA serverless platform for building, deploying, and scaling apps across\n\t[Cloudflare's global network](https://www.cloudflare.com/network/) with a\n\tsingle command \u2014 no infrastructure to manage, no complex configuration\n\n\nWith Cloudflare Workers, you can expect to:\n\n- Deliver fast performance with high reliability anywhere in the world\n- Build full-stack apps with your framework of choice, including [React](/workers/framework-guides/web-apps/reac", "char_start": 0, "char_end": 800, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workers/index.md", "format": "markdown", "raw_hash": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4"}} +{"chunk_id": "b8ea7dd8b8a27c2b", "doc_id": "workers/index.md", "text": "e world\n- Build full-stack apps with your framework of choice, including [React](/workers/framework-guides/web-apps/react/), [Vue](/workers/framework-guides/web-apps/vue/), [Svelte](/workers/framework-guides/web-apps/sveltekit/), [Next](/workers/framework-guides/web-apps/nextjs/), [Astro](/workers/framework-guides/web-apps/astro/), [React Router](/workers/framework-guides/web-apps/react-router/), [and more](/workers/framework-guides/)\n- Use your preferred language, including [JavaScript](/workers/languages/javascript/), [TypeScript](/workers/languages/typescript/), [Python](/workers/languages/python/), [Rust](/workers/languages/rust/), [and more](/workers/runtime-apis/webassembly/)\n- Gain deep visibility and insight with built-in [observability](/workers/observability/logs/)\n- Get started ", "char_start": 680, "char_end": 1480, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workers/index.md", "format": "markdown", "raw_hash": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4"}} +{"chunk_id": "5ca3eb51825ffcb3", "doc_id": "workers/index.md", "text": "assembly/)\n- Gain deep visibility and insight with built-in [observability](/workers/observability/logs/)\n- Get started for free and grow with flexible [pricing](/workers/platform/pricing/), affordable at any scale\n\nGet started with your first project:\n\n\n\tDeploy a template\n\n\n\n\tDeploy with Wrangler CLI\n\n\n---\n\n## Build with Workers\n\n
\n#### Front-end applications\n\nDeploy [static assets](/workers/static-assets/) to Cloudflare's [CDN & cache](/cache/) for fast rendering\n
\n\n
\n#### Back-end applications\n\nBuild APIs and connect to data stores with [Smart Placement](/workers/configuration/p", "char_start": 1360, "char_end": 2160, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workers/index.md", "format": "markdown", "raw_hash": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4"}} +{"chunk_id": "4daeca337df3f906", "doc_id": "workers/index.md", "text": "\n#### Back-end applications\n\nBuild APIs and connect to data stores with [Smart Placement](/workers/configuration/placement/) to optimize latency\n
\n\n
\n#### Serverless AI inference\n\nRun LLMs, generate images, and more with [Workers AI](/workers-ai/)\n
\n\n
\n#### Background jobs\n\nSchedule [cron jobs](/workers/configuration/cron-triggers/), run durable [Workflows](/workflows/), and integrate with [Queues](/queues/)\n
\n\n
\n#### Observability & monitoring\n\nMonitor performance, debug issues, and analyze traffic with [real-time logs](/workers/observability/logs/) and [analytics](/workers/observability/metrics-and-analytics/)\n
\n\n---\n\n## Integrate with Workers\n\nConnect to external services like databases, APIs, and storag", "char_start": 2040, "char_end": 2840, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workers/index.md", "format": "markdown", "raw_hash": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4"}} +{"chunk_id": "8fa1b934b7095767", "doc_id": "workers/index.md", "text": "analytics/)\n\n\n---\n\n## Integrate with Workers\n\nConnect to external services like databases, APIs, and storage via [Bindings](/workers/runtime-apis/bindings/), enabling functionality with just a few lines of code:\n\n**Storage**\n\n\n\nScalable stateful storage for real-time coordination.\n\n\n\n\n\nServerless SQL database built for fast, global queries.\n\n\n\n\n\nLow-latency key-value storage for fast, edge-cached reads.\n\n\n\n\n\nGuaranteed delivery with no charges for egress bandwidth.\n\n\n\nGuaranteed delivery with no charges for egress bandwidth.\n\n\n\n\n\nConnect to your external database with accelerated queries, cached at the edge.\n\n\n\n**Compute**\n\n\n\nMachine learning models powered by serverless GPUs.\n\n\n\n\n\nDurable, long-running operations with automatic retries.\n\n\n\n\n\nVector database for AI-powered semantic search.\n\n\n\n\n\nVector database for AI-powered semantic search.\n\n\n\n\n\nZero-egress object storage for cost-efficient data access.\n\n\n\n\n\nProgrammatic serverless browser instances.\n\n\n\n**Media**\n\n\n\nGlobal caching for high-performance, low-latency delivery.\n\n\n\n\n\nStreamlined image infrastructure from a single API.\n\n\n\n---\n\nWant to connect with the Workers community? [Join our Discord](https://discord.cloudflare.com)\n", "char_start": 4080, "char_end": 4855, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workers/index.md", "format": "markdown", "raw_hash": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4"}} +{"chunk_id": "19ba8a469590f02a", "doc_id": "workers/runtime-apis/bindings/R2.md", "text": "---\npcx_content_type: navigation\ntitle: R2\nexternal_link: /r2/api/workers/workers-api-reference/\nhead: []\ndescription: APIs available in Cloudflare Workers to read from and write to R2\n buckets. R2 is S3-compatible, zero egress-fee, globally distributed object\n storage.\n\nproducts:\n - workers\n---\n", "char_start": 0, "char_end": 301, "metadata": {"title": "R2", "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/R2.md", "format": "markdown", "raw_hash": "2841b8b9a51fa5f4c64c88594a815553940dee47a4188c159ceb45ee97117261"}} +{"chunk_id": "38bea03ddfc9a430", "doc_id": "workers/runtime-apis/bindings/durable-objects.md", "text": "---\npcx_content_type: navigation\ntitle: Durable Objects\nexternal_link: /durable-objects/api/\nhead: []\ndescription: A globally distributed coordination API with strongly consistent storage.\n\nproducts:\n - workers\n---\n", "char_start": 0, "char_end": 216, "metadata": {"title": "durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/durable-objects.md", "format": "markdown", "raw_hash": "8529ae13ce8b7acbdca264566f3b019803c7b75debadeb5a51c51f380264520d"}} +{"chunk_id": "f42c069d24389363", "doc_id": "workers/runtime-apis/bindings/kv.md", "text": "---\npcx_content_type: navigation\ntitle: KV\nexternal_link: /kv/api/\nhead: []\ndescription: Global, low-latency, key-value data storage.\n\nproducts:\n - workers\n---\n", "char_start": 0, "char_end": 161, "metadata": {"title": "kv", "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/kv.md", "format": "markdown", "raw_hash": "1a31963e5b0a455f49a7f1c36fc207bab7c71eac3d352d8ca5a14183d3f29f7e"}} +{"chunk_id": "04135b44ef84b2f5", "doc_id": "workers/runtime-apis/bindings/queues.md", "text": "---\npcx_content_type: navigation\ntitle: Queues\nexternal_link: /queues/configuration/javascript-apis/\nhead: []\ndescription: Send and receive messages with guaranteed delivery.\n\nproducts:\n - workers\n---\n", "char_start": 0, "char_end": 202, "metadata": {"title": "queues", "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/queues.md", "format": "markdown", "raw_hash": "baded9ebba0468d738474f49995b6cf8ee867ddb56af29ccb83656258a46703c"}} +{"chunk_id": "23acbf65fad38f33", "doc_id": "workflows/build/rules-of-workflows.md", "text": "---\ntitle: Rules of Workflows\ndescription: Best practices for building resilient Workflows, including idempotency, state management, and error handling.\npcx_content_type: concept\nsidebar:\n order: 10\nproducts:\n - workflows\n---\n\nimport { WranglerConfig, TypeScriptExample } from \"~/components\";\n\nA Workflow contains one or more steps. Each step is a self-contained, individually retryable component of a Workflow. Steps may emit (optional) state that allows a Workflow to persist and continue from that step, even if a Workflow fails due to a network or infrastructure issue.\n\nThis is a small guidebook on how to build more resilient and correct Workflows.\n\n### Ensure API/Binding calls are idempotent\n\nBecause a step might be retried multiple times, your steps should (ideally) be idempotent. For co", "char_start": 0, "char_end": 800, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "731e0de5fb8d26e2", "doc_id": "workflows/build/rules-of-workflows.md", "text": " calls are idempotent\n\nBecause a step might be retried multiple times, your steps should (ideally) be idempotent. For context, idempotency is a logical property where the operation (in this case a step),\ncan be applied multiple times without changing the result beyond the initial application.\n\nAs an example, let us assume you have a Workflow that charges your customers, and you really do not want to charge them twice by accident. Before charging them, you should\ncheck if they were already charged:\n\n\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\tconst customer_id = 123456;\n\t\t// \u2705 Good: Non-idempotent API/Binding calls are always done **after** checking if the operation is\n\t\t", "char_start": 680, "char_end": 1480, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "9f1e4da48dde57b5", "doc_id": "workflows/build/rules-of-workflows.md", "text": "mer_id = 123456;\n\t\t// \u2705 Good: Non-idempotent API/Binding calls are always done **after** checking if the operation is\n\t\t// still needed.\n\t\tawait step.do(\n\t\t\t`charge ${customer_id} for its monthly subscription`,\n\t\t\tasync () => {\n\t\t\t\t// API call to check if customer was already charged\n\t\t\t\tconst subscription = await fetch(\n\t\t\t\t\t`https://payment.processor/subscriptions/${customer_id}`,\n\t\t\t\t).then((res) => res.json());\n\n\t\t\t\t// return early if the customer was already charged, this can happen if the destination service dies\n\t\t\t\t// in the middle of the request but still commits it, or if the Workflows Engine restarts.\n\t\t\t\tif (subscription.charged) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// non-idempotent call, this operation can fail and retry but still commit in the payment\n\t\t\t\t// processor - which means tha", "char_start": 1360, "char_end": 2160, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "f047677875011e14", "doc_id": "workflows/build/rules-of-workflows.md", "text": "on-idempotent call, this operation can fail and retry but still commit in the payment\n\t\t\t\t// processor - which means that, on retry, it would mischarge the customer again if the above checks\n\t\t\t\t// were not in place.\n\t\t\t\treturn await fetch(\n\t\t\t\t\t`https://payment.processor/subscriptions/${customer_id}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\tbody: JSON.stringify({ amount: 10.0 }),\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t}\n}\n```\n\n\n\n:::note\n\nGuaranteeing idempotency might be optional in your specific use-case and implementation, but we recommend that you always try to guarantee it.\n\n:::\n\n### Make your steps granular\n\nSteps should be as self-contained as possible. This allows your own logic to be more durable in case of failures in third-party APIs, network errors, and so on.\n\nYou can also ", "char_start": 2040, "char_end": 2840, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "9e90bda9dd6eda42", "doc_id": "workflows/build/rules-of-workflows.md", "text": "ows your own logic to be more durable in case of failures in third-party APIs, network errors, and so on.\n\nYou can also think of it as a transaction, or a unit of work.\n\n- \u2705 Minimize the number of API/binding calls per step (unless you need multiple calls to prove idempotency).\n\n\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \u2705 Good: Unrelated API/Binding calls are self-contained, so that in case one of them fails\n\t\t// it can retry them individually. It also has an extra advantage: you can control retry or\n\t\t// timeout policies for each granular step - you might not to want to overload http.cat in\n\t\t// case of it being down.\n\t\tconst httpCat = await step.do(\"get cutest cat", "char_start": 2720, "char_end": 3520, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "b7b4ff7dfca28759", "doc_id": "workflows/build/rules-of-workflows.md", "text": "ou might not to want to overload http.cat in\n\t\t// case of it being down.\n\t\tconst httpCat = await step.do(\"get cutest cat from KV\", async () => {\n\t\t\treturn await this.env.KV.get(\"cutest-http-cat\");\n\t\t});\n\n\t\tconst image = await step.do(\"fetch cat image from http.cat\", async () => {\n\t\t\treturn await fetch(`https://http.cat/${httpCat}`);\n\t\t});\n\t}\n}\n```\n\n\n\nOtherwise, your entire Workflow might not be as durable as you might think, and you may encounter some undefined behaviour. You can avoid them by following the rules below:\n\n- \ud83d\udd34 Do not encapsulate your entire logic in one single step.\n- \ud83d\udd34 Do not call separate services in the same step (unless you need it to prove idempotency).\n- \ud83d\udd34 Do not make too many service calls in the same step (unless you need it to prove idempotency).", "char_start": 3400, "char_end": 4200, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "a8d639bab1da74d3", "doc_id": "workflows/build/rules-of-workflows.md", "text": "o prove idempotency).\n- \ud83d\udd34 Do not make too many service calls in the same step (unless you need it to prove idempotency).\n- \ud83d\udd34 Do not do too much CPU-intensive work inside a single step - sometimes the engine may have to restart, and it will start over from the beginning of that step.\n\n\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \ud83d\udd34 Bad: you are calling two separate services from within the same step. This might cause\n\t\t// some extra calls to the first service in case the second one fails, and in some cases, makes\n\t\t// the step non-idempotent altogether\n\t\tconst image = await step.do(\"get cutest cat from KV\", async () => {\n\t\t\tconst httpCat = await this.env.KV.get(\"cutest-h", "char_start": 4080, "char_end": 4880, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "6e46b2009b068195", "doc_id": "workflows/build/rules-of-workflows.md", "text": "\t\tconst image = await step.do(\"get cutest cat from KV\", async () => {\n\t\t\tconst httpCat = await this.env.KV.get(\"cutest-http-cat\");\n\t\t\treturn fetch(`https://http.cat/${httpCat}`);\n\t\t});\n\t}\n}\n```\n\n\n\n### Do not rely on state outside of a step\n\nWorkflows may hibernate and lose all in-memory state. This will happen when engine detects that there is no pending work and can hibernate until it needs to wake-up (because of a sleep, retry, or event).\n\nThis means that you should not store state outside of a step:\n\n\n\n```ts\nfunction getRandomInt(min, max) {\n\tconst minCeiled = Math.ceil(min);\n\tconst maxFloored = Math.floor(max);\n\treturn Math.floor(Math.random() * (maxFloored - minCeiled) + minCeiled); // The maximum is exclusive and the minimum ", "char_start": 4760, "char_end": 5560, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "5851c846715f2839", "doc_id": "workflows/build/rules-of-workflows.md", "text": ";\n\treturn Math.floor(Math.random() * (maxFloored - minCeiled) + minCeiled); // The maximum is exclusive and the minimum is inclusive\n}\n\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \ud83d\udd34 Bad: `imageList` will be not persisted across engine's lifetimes. Which means that after hibernation,\n\t\t// `imageList` will be empty again, even though the following two steps have already ran.\n\t\tconst imageList: string[] = [];\n\n\t\tawait step.do(\"get first cutest cat from KV\", async () => {\n\t\t\tconst httpCat = await this.env.KV.get(\"cutest-http-cat-1\");\n\n\t\t\timageList.push(httpCat);\n\t\t});\n\n\t\tawait step.do(\"get second cutest cat from KV\", async () => {\n\t\t\tconst httpCat = await this.env.KV.get(\"cutest-http-cat-2\");\n\n\t\t\timageList.push(httpCa", "char_start": 5440, "char_end": 6240, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "7061f3fbc5656fbb", "doc_id": "workflows/build/rules-of-workflows.md", "text": "est cat from KV\", async () => {\n\t\t\tconst httpCat = await this.env.KV.get(\"cutest-http-cat-2\");\n\n\t\t\timageList.push(httpCat);\n\t\t});\n\n\t\t// A long sleep can (and probably will) hibernate the engine which means that the first engine lifetime ends here\n\t\tawait step.sleep(\"\ud83d\udca4\ud83d\udca4\ud83d\udca4\ud83d\udca4\", \"3 hours\");\n\n\t\t// When this runs, it will be on the second engine lifetime - which means `imageList` will be empty.\n\t\tawait step.do(\n\t\t\t\"choose a random cat from the list and download it\",\n\t\t\tasync () => {\n\t\t\t\tconst randomCat = imageList.at(getRandomInt(0, imageList.length));\n\t\t\t\t// this will fail since `randomCat` is undefined because `imageList` is empty\n\t\t\t\treturn await fetch(`https://http.cat/${randomCat}`);\n\t\t\t},\n\t\t);\n\t}\n}\n```\n\n\n\nInstead, you should build top-level state exclusively comprised of ", "char_start": 6120, "char_end": 6920, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "c6325b1a6dcb30be", "doc_id": "workflows/build/rules-of-workflows.md", "text": "omCat}`);\n\t\t\t},\n\t\t);\n\t}\n}\n```\n\n\n\nInstead, you should build top-level state exclusively comprised of `step.do` returns:\n\n\n\n```ts\nfunction getRandomInt(min, max) {\n\tconst minCeiled = Math.ceil(min);\n\tconst maxFloored = Math.floor(max);\n\treturn Math.floor(Math.random() * (maxFloored - minCeiled) + minCeiled); // The maximum is exclusive and the minimum is inclusive\n}\n\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \u2705 Good: imageList state is exclusively comprised of step returns - this means that in the event of\n\t\t// multiple engine lifetimes, imageList will be built accordingly\n\t\tconst imageList: string[] = await Promise.all([\n\t\t\tstep.do(\"get first cutest cat fr", "char_start": 6800, "char_end": 7600, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "0a3879a8c2248973", "doc_id": "workflows/build/rules-of-workflows.md", "text": "mageList will be built accordingly\n\t\tconst imageList: string[] = await Promise.all([\n\t\t\tstep.do(\"get first cutest cat from KV\", async () => {\n\t\t\t\treturn await this.env.KV.get(\"cutest-http-cat-1\");\n\t\t\t}),\n\n\t\t\tstep.do(\"get second cutest cat from KV\", async () => {\n\t\t\t\treturn await this.env.KV.get(\"cutest-http-cat-2\");\n\t\t\t}),\n\t\t]);\n\n\t\t// A long sleep can (and probably will) hibernate the engine which means that the first engine lifetime ends here\n\t\tawait step.sleep(\"\ud83d\udca4\ud83d\udca4\ud83d\udca4\ud83d\udca4\", \"3 hours\");\n\n\t\t// When this runs, it will be on the second engine lifetime - but this time, imageList will contain\n\t\t// the two most cutest cats\n\t\tawait step.do(\n\t\t\t\"choose a random cat from the list and download it\",\n\t\t\tasync () => {\n\t\t\t\tconst randomCat = imageList.at(getRandomInt(0, imageList.length));\n\t\t\t\t// this will ev", "char_start": 7480, "char_end": 8280, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "1af0acd25f98f888", "doc_id": "workflows/build/rules-of-workflows.md", "text": "ownload it\",\n\t\t\tasync () => {\n\t\t\t\tconst randomCat = imageList.at(getRandomInt(0, imageList.length));\n\t\t\t\t// this will eventually succeed since `randomCat` is defined\n\t\t\t\treturn await fetch(`https://http.cat/${randomCat}`);\n\t\t\t},\n\t\t);\n\t}\n}\n```\n\n\n\n### Avoid doing side effects outside of a `step.do`\n\nIt is not recommended to write code with any side effects outside of steps, unless you would like it to be repeated, because the Workflow engine may restart while an instance is running. If the engine restarts, the step logic will be preserved, but logic outside of the steps may be duplicated.\n\nFor example, a `console.log()` outside of workflow steps may cause the logs to print twice when the engine restarts.\n\nHowever, logic involving non-serializable resources, like a databas", "char_start": 8160, "char_end": 8960, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "d93743c0e7faa6d4", "doc_id": "workflows/build/rules-of-workflows.md", "text": "e the logs to print twice when the engine restarts.\n\nHowever, logic involving non-serializable resources, like a database connection, should be executed outside of steps. Operations outside of a `step.do` might be repeated more than once, due to the nature of the Workflows' instance lifecycle.\n\n:::note\nIf you use [Hyperdrive](/hyperdrive/) in a Workflow, create a new connection inside each `step.do()` and run your queries in that same step. Do not reuse a Hyperdrive-backed connection across steps.\n:::\n\n\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \ud83d\udd34 Bad: creating instances outside of steps\n\t\t// This might get called more than once creating more instances than expected\n\t", "char_start": 8840, "char_end": 9640, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "6bd3d14a82472340", "doc_id": "workflows/build/rules-of-workflows.md", "text": "d: creating instances outside of steps\n\t\t// This might get called more than once creating more instances than expected\n\t\tconst badInstance = await this.env.ANOTHER_WORKFLOW.create();\n\n\t\t// \ud83d\udd34 Bad: using non-deterministic functions outside of steps\n\t\t// this will produce different results if the instance has to restart, different runs of the same instance\n\t\t// might go through different paths\n\t\tconst badRandom = Math.random();\n\n\t\tif (badRandom > 0) {\n\t\t\t// do some stuff\n\t\t}\n\n\t\t// \u26a0\ufe0f Warning: This log may happen many times\n\t\tconsole.log(\"This might be logged more than once\");\n\n\t\tawait step.do(\"do some stuff and have a log for when it runs\", async () => {\n\t\t\t// do some stuff\n\n\t\t\t// this log will only appear once\n\t\t\tconsole.log(\"successfully did stuff\");\n\t\t});\n\n\t\t// \u2705 Good: wrap non-determinist", "char_start": 9520, "char_end": 10320, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "bf23550d7578b73d", "doc_id": "workflows/build/rules-of-workflows.md", "text": "\n\t\t\t// this log will only appear once\n\t\t\tconsole.log(\"successfully did stuff\");\n\t\t});\n\n\t\t// \u2705 Good: wrap non-deterministic function in a step\n\t\t// after running successfully will not run again\n\t\tconst goodRandom = await step.do(\"create a random number\", async () => {\n\t\t\treturn Math.random();\n\t\t});\n\n\t\t// \u2705 Good: calls that have no side effects can be done outside of steps\n\t\t// For Hyperdrive, create the connection inside each step instead of here.\n\t\tconst db = createDBConnection(this.env.DB_URL, this.env.DB_TOKEN);\n\n\t\t// \u2705 Good: run functions with side effects inside of a step\n\t\t// after running successfully will not run again\n\t\tconst goodInstance = await step.do(\n\t\t\t\"good step that returns state\",\n\t\t\tasync () => {\n\t\t\t\tconst instance = await this.env.ANOTHER_WORKFLOW.create();\n\n\t\t\t\treturn i", "char_start": 10200, "char_end": 11000, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "97ce173eb6051d90", "doc_id": "workflows/build/rules-of-workflows.md", "text": " step that returns state\",\n\t\t\tasync () => {\n\t\t\t\tconst instance = await this.env.ANOTHER_WORKFLOW.create();\n\n\t\t\t\treturn instance;\n\t\t\t},\n\t\t);\n\t}\n}\n```\n\n\n\n### Do not mutate your incoming events\n\nThe `event` passed to your Workflow's `run` method is immutable: changes you make to the event are not persisted across steps and/or Workflow restarts.\n\n\n\n```ts\ninterface MyEvent {\n\tuser: string;\n\tdata: string;\n}\n\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \ud83d\udd34 Bad: Mutating the event\n\t\t// This will not be persisted across steps and `event.payload` will\n\t\t// take on its original value.\n\t\tawait step.do(\"bad step that mutates the incoming event\", async () => {\n\t\t\tlet use", "char_start": 10880, "char_end": 11680, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "2511810a3c109fbb", "doc_id": "workflows/build/rules-of-workflows.md", "text": "ll\n\t\t// take on its original value.\n\t\tawait step.do(\"bad step that mutates the incoming event\", async () => {\n\t\t\tlet userData = await this.env.KV.get(event.payload.user);\n\t\t\tevent.payload = userData;\n\t\t});\n\n\t\t// \u2705 Good: persist data by returning it as state from your step\n\t\t// Use that state in subsequent steps\n\t\tlet userData = await step.do(\"good step that returns state\", async () => {\n\t\t\treturn await this.env.KV.get(event.payload.user);\n\t\t});\n\n\t\tlet someOtherData = await step.do(\n\t\t\t\"following step that uses that state\",\n\t\t\tasync () => {\n\t\t\t\t// Access to userData here\n\t\t\t\t// Will always be the same if this step is retried\n\t\t\t},\n\t\t);\n\t}\n}\n```\n\n\n\n### Name steps deterministically\n\nSteps should be named deterministically (that is, not using the current date/time, randomne", "char_start": 11560, "char_end": 12360, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "d5fb8fe34fbc68fb", "doc_id": "workflows/build/rules-of-workflows.md", "text": "ame steps deterministically\n\nSteps should be named deterministically (that is, not using the current date/time, randomness, etc). This ensures that their state is cached, and prevents the step from being rerun unnecessarily. Step names act as the \"cache key\" in your Workflow.\n\n\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \ud83d\udd34 Bad: Naming the step non-deterministically prevents it from being cached\n\t\t// This will cause the step to be re-run if subsequent steps fail.\n\t\tawait step.do(`step #1 running at: ${Date.now()}`, async () => {\n\t\t\tlet userData = await this.env.KV.get(event.payload.user);\n\t\t\t// Do not mutate event.payload\n\t\t\tevent.payload = userData;\n\t\t});\n\n\t\t// \u2705 Good:", "char_start": 12240, "char_end": 13040, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "d42709f2c09e9562", "doc_id": "workflows/build/rules-of-workflows.md", "text": " this.env.KV.get(event.payload.user);\n\t\t\t// Do not mutate event.payload\n\t\t\tevent.payload = userData;\n\t\t});\n\n\t\t// \u2705 Good: give steps a deterministic name.\n\t\t// Return dynamic values in your state, or log them instead.\n\t\tlet state = await step.do(\"fetch user data from KV\", async () => {\n\t\t\tlet userData = await this.env.KV.get(event.payload.user);\n\t\t\tconsole.log(`fetched at ${Date.now()}`);\n\t\t\treturn userData;\n\t\t});\n\n\t\t// \u2705 Good: steps that are dynamically named are constructed in a deterministic way.\n\t\t// In this case, `catList` is a step output, which is stable, and `catList` is\n\t\t// traversed in a deterministic fashion (no shuffles or random accesses) so,\n\t\t// it's fine to dynamically name steps (e.g: create a step per list entry).\n\t\tlet catList = await step.do(\"get cat list from KV\", asyn", "char_start": 12920, "char_end": 13720, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "a8210386fa356682", "doc_id": "workflows/build/rules-of-workflows.md", "text": "o dynamically name steps (e.g: create a step per list entry).\n\t\tlet catList = await step.do(\"get cat list from KV\", async () => {\n\t\t\treturn await this.env.KV.get(\"cat-list\");\n\t\t});\n\n\t\tfor (const cat of catList) {\n\t\t\tawait step.do(`get cat: ${cat}`, async () => {\n\t\t\t\treturn await this.env.KV.get(cat);\n\t\t\t});\n\t\t}\n\t}\n}\n```\n\n\n\n### Take care with `Promise.race()` and `Promise.any()`\n\nWorkflows allows the usage steps within the `Promise.race()` or `Promise.any()` methods as a way to achieve concurrent steps execution. However, some considerations must be taken.\n\nDue to the nature of Workflows' instance lifecycle, and given that a step inside a Promise will run until it finishes, the step that is returned during the first passage may not be the actual cached step, as [steps ar", "char_start": 13600, "char_end": 14400, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "6d0facb9f5cec811", "doc_id": "workflows/build/rules-of-workflows.md", "text": "un until it finishes, the step that is returned during the first passage may not be the actual cached step, as [steps are cached by their names](#name-steps-deterministically).\n\n\n\n```ts\n// helper sleep method\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \ud83d\udd34 Bad: The `Promise.race` is not surrounded by a `step.do`, which may cause undeterministic caching behavior.\n\t\tconst race_return = await Promise.race([\n\t\t\tstep.do(\"Promise first race\", async () => {\n\t\t\t\tawait sleep(1000);\n\t\t\t\treturn \"first\";\n\t\t\t}),\n\t\t\tstep.do(\"Promise second race\", async () => {\n\t\t\t\treturn \"second\";\n\t\t\t}),\n\t\t]);\n\n\t\tawait step.sleep(\"Sleep st", "char_start": 14280, "char_end": 15080, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "0d6287f76e803257", "doc_id": "workflows/build/rules-of-workflows.md", "text": ";\n\t\t\t}),\n\t\t\tstep.do(\"Promise second race\", async () => {\n\t\t\t\treturn \"second\";\n\t\t\t}),\n\t\t]);\n\n\t\tawait step.sleep(\"Sleep step\", \"2 hours\");\n\n\t\treturn await step.do(\"Another step\", async () => {\n\t\t\t// This step will return `first`, even though the `Promise.race` first returned `second`.\n\t\t\treturn race_return;\n\t\t});\n\t}\n}\n```\n\n\n\nTo ensure consistency, we suggest to surround the `Promise.race()` or `Promise.any()` within a `step.do()`, as this will ensure caching consistency across multiple passages.\n\n\n\n```ts\n// helper sleep method\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \u2705 Good: The `Promis", "char_start": 14960, "char_end": 15760, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "47b64a142c5658f7", "doc_id": "workflows/build/rules-of-workflows.md", "text": "low extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \u2705 Good: The `Promise.race` is surrounded by a `step.do`, ensuring deterministic caching behavior.\n\t\tconst race_return = await step.do(\"Promise step\", async () => {\n\t\t\treturn await Promise.race([\n\t\t\t\tstep.do(\"Promise first race\", async () => {\n\t\t\t\t\tawait sleep(1000);\n\t\t\t\t\treturn \"first\";\n\t\t\t\t}),\n\t\t\t\tstep.do(\"Promise second race\", async () => {\n\t\t\t\t\treturn \"second\";\n\t\t\t\t}),\n\t\t\t]);\n\t\t});\n\n\t\tawait step.sleep(\"Sleep step\", \"2 hours\");\n\n\t\treturn await step.do(\"Another step\", async () => {\n\t\t\t// This step will return `second` because the `Promise.race` was surround by the `step.do` method.\n\t\t\treturn race_return;\n\t\t});\n\t}\n}\n```\n\n\n\n### Instance IDs are unique\n\nWorkflow [instance ", "char_start": 15640, "char_end": 16440, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "f2b0d0b9ff6919d2", "doc_id": "workflows/build/rules-of-workflows.md", "text": "o` method.\n\t\t\treturn race_return;\n\t\t});\n\t}\n}\n```\n\n\n\n### Instance IDs are unique\n\nWorkflow [instance IDs](/workflows/build/workers-api/#workflowinstance) are unique per Workflow. The ID is the unique identifier that associates logs, metrics, state and status of a run to a specific instance, even after completion. Allowing ID re-use would make it hard to understand if a Workflow instance ID referred to an instance that run yesterday, last week or today.\n\nIt would also present a problem if you wanted to run multiple different Workflow instances with different [input parameters](/workflows/build/events-and-parameters/) for the same user ID, as you would immediately need to determine a new ID mapping.\n\nIf you need to associate multiple instances with a specific user, merchan", "char_start": 16320, "char_end": 17120, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "54649c5abd0c8c16", "doc_id": "workflows/build/rules-of-workflows.md", "text": "mediately need to determine a new ID mapping.\n\nIf you need to associate multiple instances with a specific user, merchant or other \"customer\" ID in your system, consider using a composite ID or using randomly generated IDs and storing the mapping in a database like [D1](/d1/).\n\n\n\n```ts\n// This is in the same file as your Workflow definition\nexport default {\n\tasync fetch(req: Request, env: Env): Promise {\n\t\t// \ud83d\udd34 Bad: Use an ID that isn't unique across future Workflow invocations\n\t\tlet userId = getUserId(req); // Returns the userId\n\t\tlet badInstance = await env.MY_WORKFLOW.create({\n\t\t\tid: userId,\n\t\t\tparams: payload,\n\t\t});\n\n\t\t// \u2705 Good: use an ID that is unique\n\t\t// e.g. a transaction ID, order ID, or task ID are good options\n\t\tlet instanceId =", "char_start": 17000, "char_end": 17800, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "c3eab6fce5f2f8af", "doc_id": "workflows/build/rules-of-workflows.md", "text": "// \u2705 Good: use an ID that is unique\n\t\t// e.g. a transaction ID, order ID, or task ID are good options\n\t\tlet instanceId = getTransactionId(); // e.g. assuming transaction IDs are unique\n\t\t// or: compose a composite ID and store it in your database\n\t\t// so that you can track all instances associated with a specific user or merchant.\n\t\tinstanceId = `${getUserId(req)}-${crypto.randomUUID().slice(0, 6)}`;\n\t\tlet { result } = await addNewInstanceToDB(userId, instanceId);\n\t\tlet goodInstance = await env.MY_WORKFLOW.create({\n\t\t\tid: instanceId,\n\t\t\tparams: payload,\n\t\t});\n\n\t\treturn Response.json({\n\t\t\tid: goodInstance.id,\n\t\t\tdetails: await goodInstance.status(),\n\t\t});\n\t},\n};\n```\n\n\n\n### `await` your steps\n\nWhen calling `step.do` or `step.sleep`, use `await` to avoid introducing bugs a", "char_start": 17680, "char_end": 18480, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "c749381f5b567f14", "doc_id": "workflows/build/rules-of-workflows.md", "text": "eScriptExample>\n\n### `await` your steps\n\nWhen calling `step.do` or `step.sleep`, use `await` to avoid introducing bugs and race conditions into your Workflow code.\n\nIf you don't call `await step.do` or `await step.sleep`, you create a dangling Promise. This occurs when a Promise is created but not properly `await`ed, leading to potential bugs and race conditions.\n\nThis happens when you do not use the `await` keyword or fail to chain `.then()` methods to handle the result of a Promise. For example, calling `fetch(GITHUB_URL)` without awaiting its response will cause subsequent code to execute immediately, regardless of whether the fetch completed. This can cause issues like premature logging, exceptions being swallowed (and not terminating the Workflow), and lost return values (state).\n\n\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \ud83d\udd34 Bad: The step isn't await'ed, and any state or errors is swallowed before it returns.\n\t\tconst badIssues = step.do(`fetch issues from GitHub`, async () => {\n\t\t\t// The step will return before this call is done\n\t\t\tlet issues = await getIssues(event.payload.repoName);\n\t\t\treturn issues;\n\t\t});\n\n\t\t// \u2705 Good: The step is correctly await'ed.\n\t\tconst goodIssues = await step.do(`fetch issues from GitHub`, async () => {\n\t\t\tlet issues = await getIssues(event.payload.repoName);\n\t\t\treturn issues;\n\t\t});\n\n\t\t// Rest of your W", "char_start": 19040, "char_end": 19840, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "f0b80defa7ecf82d", "doc_id": "workflows/build/rules-of-workflows.md", "text": "ub`, async () => {\n\t\t\tlet issues = await getIssues(event.payload.repoName);\n\t\t\treturn issues;\n\t\t});\n\n\t\t// Rest of your Workflow goes here!\n\t}\n}\n```\n\n\n\n### Use conditional logic carefully\n\nYou can use `if` statements, loops, and other control flow outside of steps. However, conditions must be based on **deterministic values** \u2014 either values from `event.payload` or return values from previous steps. Non-deterministic conditions (such as `Math.random()` or `Date.now()`) outside of steps can cause unexpected behavior if the Workflow restarts.\n\n\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\tconst config = await step.do(\"fetch config\", async () => {\n\t\t\treturn", "char_start": 19720, "char_end": 20520, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "9caaf24b108f8fbf", "doc_id": "workflows/build/rules-of-workflows.md", "text": "ent: WorkflowEvent, step: WorkflowStep) {\n\t\tconst config = await step.do(\"fetch config\", async () => {\n\t\t\treturn await this.env.KV.get(\"feature-flags\", { type: \"json\" });\n\t\t});\n\n\t\t// \u2705 Good: Condition based on step output (deterministic)\n\t\tif (config.enableEmailNotifications) {\n\t\t\tawait step.do(\"send email\", async () => {\n\t\t\t\t// Send email logic\n\t\t\t});\n\t\t}\n\n\t\t// \u2705 Good: Condition based on event payload (deterministic)\n\t\tif (event.payload.userType === \"premium\") {\n\t\t\tawait step.do(\"premium processing\", async () => {\n\t\t\t\t// Premium-only logic\n\t\t\t});\n\t\t}\n\n\t\t// \ud83d\udd34 Bad: Condition based on non-deterministic value outside a step\n\t\t// This could behave differently if the Workflow restarts\n\t\tif (Math.random() > 0.5) {\n\t\t\tawait step.do(\"maybe do something\", async () => {});\n\t\t}\n\n\t\t// \u2705 Good: ", "char_start": 20400, "char_end": 21200, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "d31727ac940d86d2", "doc_id": "workflows/build/rules-of-workflows.md", "text": "orkflow restarts\n\t\tif (Math.random() > 0.5) {\n\t\t\tawait step.do(\"maybe do something\", async () => {});\n\t\t}\n\n\t\t// \u2705 Good: Wrap non-deterministic values in a step\n\t\tconst shouldProcess = await step.do(\"decide randomly\", async () => {\n\t\t\treturn Math.random() > 0.5;\n\t\t});\n\t\tif (shouldProcess) {\n\t\t\tawait step.do(\"conditionally do something\", async () => {});\n\t\t}\n\t}\n}\n```\n\n\n\n### Batch multiple Workflow invocations\n\nWhen creating multiple Workflow instances, use the [`createBatch`](/workflows/build/workers-api/#createBatch) method to batch the invocations together. This allows you to create multiple Workflow instances in a single request, which will reduce the number of requests made to the Workflows API. However, each individual instance in the batch will still count towards t", "char_start": 21080, "char_end": 21880, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "85926f94b23d5525", "doc_id": "workflows/build/rules-of-workflows.md", "text": " number of requests made to the Workflows API. However, each individual instance in the batch will still count towards the [creation rate limit](/workflows/reference/limits/). Unlike `create`, `createBatch` is idempotent: if an existing instance with the same ID is still within its [retention limit](/workflows/reference/limits/), it will be skipped and excluded from the returned array.\n\n\n\n```ts\nexport default {\n\tasync fetch(req: Request, env: Env): Promise {\n\t\tlet instances = [\n\t\t\t{ id: \"user1\", params: { name: \"John\" } },\n\t\t\t{ id: \"user2\", params: { name: \"Jane\" } },\n\t\t\t{ id: \"user3\", params: { name: \"Alice\" } },\n\t\t\t{ id: \"user4\", params: { name: \"Bob\" } },\n\t\t];\n\n\t\t// \ud83d\udd34 Bad: Create them one by one, which is more likely to hit creation rate ", "char_start": 21760, "char_end": 22560, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "15fbdb3a419facda", "doc_id": "workflows/build/rules-of-workflows.md", "text": "\"user4\", params: { name: \"Bob\" } },\n\t\t];\n\n\t\t// \ud83d\udd34 Bad: Create them one by one, which is more likely to hit creation rate limits.\n\t\tfor (let instance of instances) {\n\t\t\tawait env.MY_WORKFLOW.create({\n\t\t\t\tid: instance.id,\n\t\t\t\tparams: instance.params,\n\t\t\t});\n\t\t}\n\n\t\t// \u2705 Good: Batch calls together\n\t\t// This improves throughput.\n\t\tlet createdInstances = await env.MY_WORKFLOW.createBatch(instances);\n\t\treturn Response.json({ instances: createdInstances });\n\t},\n};\n```\n\n\n\n### Limit timeouts to 30 minutes or less\n\nWhen setting a [WorkflowStep timeout](/workflows/build/workers-api/#workflowstep), ensure that its duration is 30 minutes or less. If your use case requires a timeout greater than 30 minutes, consider using `step.waitForEvent()` instead.\n\n### Keep non-stream step return ", "char_start": 22440, "char_end": 23240, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "1ce145e9a44742ba", "doc_id": "workflows/build/rules-of-workflows.md", "text": "uires a timeout greater than 30 minutes, consider using `step.waitForEvent()` instead.\n\n### Keep non-stream step return values under 1 MiB\n\nA non-stream `step.do()` return value can persist up to 1 MiB (2^20 bytes). If your step returns structured data exceeding this limit, the step will fail. This is a common issue when fetching large API responses or processing large files.\n\nIn JavaScript Workflows, `ReadableStream` is a supported serializable return type for larger binary output. When persisting this kind of output, you should:\n\n- Return a new stream from the step callback.\n- Keep individual chunks under 16 MB.\n- Do not return a locked stream or a stream that has already been read.\n- Rely only on streams returned from steps.\n :::note\n Only byte streams are supported - use ", "char_start": 23120, "char_end": 23920, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "e816fd58974ca160", "doc_id": "workflows/build/rules-of-workflows.md", "text": "at has already been read.\n- Rely only on streams returned from steps.\n :::note\n Only byte streams are supported - use `ReadableStream`.\n\nBYOB streams and BYOB readers are not supported.\n:::\n\nNote that streamed outputs are still considered part of the Workflow instance storage limit.\n\nIf these storage limits still do not work for you, consider storing your step outputs externally (for example, in [R2](/r2)) and saving a reference to it.\n\n\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \ud83d\udd34 Bad: Returning a large response that may exceed 1 MiB\n\t\tconst largeData = await step.do(\"fetch large dataset\", async () => {\n\t\t\tconst response = await fetch(\"https://api.examp", "char_start": 23800, "char_end": 24600, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "1b3418d4043e3ff5", "doc_id": "workflows/build/rules-of-workflows.md", "text": "\tconst largeData = await step.do(\"fetch large dataset\", async () => {\n\t\t\tconst response = await fetch(\"https://api.example.com/large-dataset\");\n\t\t\treturn await response.json(); // Could exceed 1 MiB\n\t\t});\n\n\t\t// \u2705 Good: Store large structured data externally and return a reference\n\t\tconst dataRef = await step.do(\"fetch and store large dataset\", async () => {\n\t\t\tconst response = await fetch(\"https://api.example.com/large-dataset\");\n\t\t\tconst data = await response.json();\n\t\t\t// Store in R2 and return a reference\n\t\t\tawait this.env.MY_BUCKET.put(\"dataset-123\", JSON.stringify(data));\n\t\t\treturn { key: \"dataset-123\" };\n\t\t});\n\n\t\t// Retrieve the data in a later step when needed\n\t\tconst data = await step.do(\"process dataset\", async () => {\n\t\t\tconst stored = await this.env.MY_BUCKET.get(dataRef.key);\n\t", "char_start": 24480, "char_end": 25280, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "784ac2ee60d3fcaf", "doc_id": "workflows/build/rules-of-workflows.md", "text": "nst data = await step.do(\"process dataset\", async () => {\n\t\t\tconst stored = await this.env.MY_BUCKET.get(dataRef.key);\n\t\t\treturn processData(await stored.json());\n\t\t});\n\t}\n}\n```\n\n\n\n## Related resources\n\n- [Workers Best Practices](/workers/best-practices/workers-best-practices/): code patterns for request handling, observability, and security that apply to the Workers triggering your Workflows.\n- [Rules of Durable Objects](/durable-objects/best-practices/rules-of-durable-objects/): best practices for stateful, coordinated applications \u2014 useful when combining Durable Objects with Workflows.\n", "char_start": 25160, "char_end": 25776, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "a2c13f629ce0d015", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "---\ntitle: Sleeping and retrying\ndescription: Configure sleep durations and retry logic for Workflows steps, including relative and absolute sleep timers.\npcx_content_type: concept\nsidebar:\n order: 4\nproducts:\n - workflows\n---\n\nimport { TypeScriptExample } from \"~/components\";\n\nThis guide details how to sleep a Workflow and/or configure retries for a Workflow step.\n\n## Sleep a Workflow\n\nYou can set a Workflow to sleep as an explicit step, which can be useful when you want a Workflow to wait, schedule work ahead, or pause until an input or other external state is ready.\n\n:::note\n\nA Workflow instance that is resuming from sleep will take priority over newly scheduled (queued) instances. This helps ensure that older Workflow instances can run to completion and are not blocked by newer insta", "char_start": 0, "char_end": 800, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "5de58b6e32dfa5ef", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "ued) instances. This helps ensure that older Workflow instances can run to completion and are not blocked by newer instances.\n\n:::\n\n### Sleep for a relative period\n\nUse `step.sleep` to have a Workflow sleep for a relative period of time:\n\n```ts\nawait step.sleep(\"sleep for a bit\", \"1 hour\");\n```\n\nThe second argument to `step.sleep` accepts both `number` (milliseconds) or a human-readable format, such as \"1 minute\" or \"26 hours\". The accepted units for `step.sleep` when used this way are as follows:\n\n```ts\n| \"second\"\n| \"minute\"\n| \"hour\"\n| \"day\"\n| \"week\"\n| \"month\"\n| \"year\"\n```\n\n### Sleep until a fixed date\n\nUse `step.sleepUntil` to have a Workflow sleep to a specific `Date`: this can be useful when you have a timestamp from another system or want to \"schedule\" work to occur at a specific time", "char_start": 680, "char_end": 1480, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "f6f1597739f82499", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": " this can be useful when you have a timestamp from another system or want to \"schedule\" work to occur at a specific time (e.g. Sunday, 9AM UTC).\n\n```ts\n// sleepUntil accepts a Date object as its second argument\nconst workflowsLaunchDate = Date.parse(\"24 Oct 2024 13:00:00 UTC\");\nawait step.sleepUntil(\"sleep until X times out\", workflowsLaunchDate);\n```\n\nYou can also provide a UNIX timestamp (milliseconds since the UNIX epoch) directly to `sleepUntil`.\n\n## Retry steps\n\nEach call to `step.do` in a Workflow accepts an optional `StepConfig`, which allows you define the retry behaviour for that step.\n\nIf you do not provide your own retry configuration, Workflows applies the following defaults:\n\n```ts\nconst defaultConfig: WorkflowStepConfig = {\n\tretries: {\n\t\tlimit: 5,\n\t\tdelay: 10000,\n\t\tbackoff: \"", "char_start": 1360, "char_end": 2160, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "2b2b9696017b0150", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "lowing defaults:\n\n```ts\nconst defaultConfig: WorkflowStepConfig = {\n\tretries: {\n\t\tlimit: 5,\n\t\tdelay: 10000,\n\t\tbackoff: \"exponential\",\n\t},\n\ttimeout: \"10 minutes\",\n};\n```\n\nWhen providing your own `StepConfig`, you can configure:\n\n- The total number of attempts to make for a step (limited to 10,000 retries per step)\n- The delay between attempts. Use a fixed duration as a `number` in milliseconds or a human-readable string, or use a function that returns the next delay.\n- What backoff algorithm to apply between each attempt: any of `constant`, `linear`, or `exponential`\n- When to timeout (in duration) before considering the step as failed (including during a retry attempt, as the timeout is set per attempt)\n\nFor example, to limit a step to 10 retries and have it apply an exponential delay (sta", "char_start": 2040, "char_end": 2840, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "adf00266f74637f5", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": " the timeout is set per attempt)\n\nFor example, to limit a step to 10 retries and have it apply an exponential delay (starting at 10 seconds) between each attempt, you would pass the following configuration as an optional object to `step.do`:\n\n```ts\nlet someState = await step.do(\n\t\"call an API\",\n\t{\n\t\tretries: {\n\t\t\tlimit: 10, // The total number of attempts\n\t\t\tdelay: \"10 seconds\", // Delay between each retry\n\t\t\tbackoff: \"exponential\", // Any of \"constant\" | \"linear\" | \"exponential\";\n\t\t},\n\t\ttimeout: \"30 minutes\",\n\t},\n\tasync () => {\n\t\t/* Step code goes here */\n\t},\n);\n```\n\n### Set a dynamic retry delay\n\nUse a delay function when the next retry delay should depend on the failed attempt or the thrown error. This gives you more control than a fixed delay with `constant`, `linear`, or `exponential`", "char_start": 2720, "char_end": 3520, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "97e824c399d5fa43", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": " attempt or the thrown error. This gives you more control than a fixed delay with `constant`, `linear`, or `exponential` backoff. It is useful for rate limits, downstream provider recovery, and short network failures.\n\nThe delay function receives an object with:\n\n- `ctx` - the current [`WorkflowStepContext`](/workflows/build/step-context/), including `ctx.attempt`.\n- `error` - the error that caused the retry.\n\nReturn a duration string, a number in milliseconds, or a promise that resolves to either value.\n\n\n\n```ts\nawait step.do(\n\t\"sync customer\",\n\t{\n\t\tretries: {\n\t\t\tlimit: 5,\n\t\t\tdelay: ({ ctx, error }) => {\n\t\t\t\tif (error.message.includes(\"rate limit\")) {\n\t\t\t\t\treturn `${ctx.attempt * 30} seconds`;\n\t\t\t\t}\n\n\t\t\t\treturn \"10 seconds\";\n\t\t\t},\n\t\t},\n\t},\n\tasync () => {\n\t\tawait syncCus", "char_start": 3400, "char_end": 4200, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "5849b276878c1e54", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "\t\t\t\t\treturn `${ctx.attempt * 30} seconds`;\n\t\t\t\t}\n\n\t\t\t\treturn \"10 seconds\";\n\t\t\t},\n\t\t},\n\t},\n\tasync () => {\n\t\tawait syncCustomer();\n\t},\n);\n```\n\n\n\n## Force a Workflow instance to fail\n\nYou can also force a Workflow instance to fail and _not_ retry by throwing a `NonRetryableError` from within the step.\n\nThis can be useful when you detect a terminal (permanent) error from an upstream system (such as an authentication failure) or other errors where retrying would not help.\n\n```ts\n// Import the NonRetryableError definition\nimport {\n\tWorkflowEntrypoint,\n\tWorkflowStep,\n\tWorkflowEvent,\n} from \"cloudflare:workers\";\nimport { NonRetryableError } from \"cloudflare:workflows\";\n\n// In your step code:\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: Wor", "char_start": 4080, "char_end": 4880, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "354ddfb92b7f6b66", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "rkflows\";\n\n// In your step code:\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\tawait step.do(\"some step\", async () => {\n\t\t\tif (!event.payload.data) {\n\t\t\t\tthrow new NonRetryableError(\n\t\t\t\t\t\"event.payload.data did not contain the expected payload\",\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n```\n\nThe Workflow instance itself will fail immediately, no further steps will be invoked, and the Workflow will not be retried.\n\nIf earlier steps registered rollback handlers, those handlers will still run before the instance settles into its terminal state.\n\n## Register rollback handlers\n\nYou can attach a rollback handler to `step.do()` to implement saga-style compensation. When the Workflow later fails, Workflows runs registered rollback ", "char_start": 4760, "char_end": 5560, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "1dfb1a5665e3005f", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": " to `step.do()` to implement saga-style compensation. When the Workflow later fails, Workflows runs registered rollback handlers in reverse `step-start` order.\n\nA failed step with rollback options can also participate in rollback alongside any completed steps which have a rollback handler registered. For example, if a steps throws a `NonRetryableError` after registering rollback, its rollback handler runs with `output` set to `undefined`.\n\n\n\n```ts\nimport {\n\tWorkflowEntrypoint,\n\ttype WorkflowEvent,\n\ttype WorkflowStep,\n} from \"cloudflare:workers\";\nimport { NonRetryableError } from \"cloudflare:workflows\";\n\nexport class OrderWorkflow extends WorkflowEntrypoint {\n\tasync run(_event: WorkflowEvent, step: WorkflowStep) {\n\t\tawait step.do(\n\t\t\t\"reserve inventory\",\n\t\t\t", "char_start": 5440, "char_end": 6240, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "813e993440c23430", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "int {\n\tasync run(_event: WorkflowEvent, step: WorkflowStep) {\n\t\tawait step.do(\n\t\t\t\"reserve inventory\",\n\t\t\tasync () => {\n\t\t\t\tconst reservation = await reserveInventory();\n\t\t\t\treturn { reservationId: reservation.id };\n\t\t\t},\n\t\t\t{\n\t\t\t\trollback: async ({ output }) => {\n\t\t\t\t\tconst { reservationId } = output as { reservationId: string };\n\t\t\t\t\tawait releaseInventory(reservationId);\n\t\t\t\t},\n\t\t\t\trollbackConfig: {\n\t\t\t\t\tretries: { limit: 3, delay: \"10 seconds\", backoff: \"linear\" },\n\t\t\t\t\ttimeout: \"2 minutes\",\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\tawait step.do(\"charge card\", async () => {\n\t\t\tthrow new NonRetryableError(\"payment processor rejected the charge\");\n\t\t});\n\t}\n}\n```\n\n\n\nRollback handlers receive:\n\n- `error` - the error that caused the Workflow to fail.\n- `output` - the value ret", "char_start": 6120, "char_end": 6920, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "c846a1e3671ac833", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "Example>\n\nRollback handlers receive:\n\n- `error` - the error that caused the Workflow to fail.\n- `output` - the value returned by the forward step, or `undefined` if the step failed before returning\n\nYou can use `rollbackConfig` to control retry behavior for the rollback handler. Throw a `NonRetryableError` from the rollback handler to stop retrying it immediately.\n\n## Catch Workflow errors\n\nAny uncaught exceptions that propagate to the top level, or any steps that reach their retry limit, will cause the Workflow to end execution in an `Errored` state.\n\nIf you want to avoid this, you can catch exceptions emitted by a `step`. This can be useful if you need to trigger clean-up tasks or have conditional logic that triggers additional steps.\n\nTo allow the Workflow to continue its execution, sur", "char_start": 6800, "char_end": 7600, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "139c7ee15228e3e6", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "up tasks or have conditional logic that triggers additional steps.\n\nTo allow the Workflow to continue its execution, surround the intended steps that are allowed to fail with a `try...catch` block.\n\n```ts\n...\nawait step.do('task', async () => {\n\t// work to be done\n});\n\ntry {\n await step.do('non-retryable-task', async () => {\n\t\t// work not to be retried\n throw new NonRetryableError('oh no');\n });\n} catch (e) {\n console.log(`Step failed: ${e.message}`);\n await step.do('clean-up-task', async () => {\n // Clean up code here\n });\n}\n\n// the Workflow will not fail and will continue its execution\n\nawait step.do('next-task', async() => {\n\t// more work to be done\n});\n...\n```\n", "char_start": 7480, "char_end": 8180, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "9bf9d9d12459a2fa", "doc_id": "workflows/build/step-context.md", "text": "---\ntitle: Step context\ndescription: Access runtime information in Workflows steps using the WorkflowStepContext object, including step name and retry attempt.\npcx_content_type: concept\nsidebar:\n order: 5\nproducts:\n - workflows\n---\n\nEvery `step.do` callback receives a **context object** (`WorkflowStepContext`) as its first argument. The context gives your step code runtime information about the step itself, the current retry attempt, and the resolved configuration for that step.\n\n## WorkflowStepContext\n\n```ts\ntype WorkflowStepContext = {\n\tstep: {\n\t\tname: string;\n\t\tcount: number;\n\t};\n\tattempt: number;\n\tconfig: WorkflowStepConfig;\n};\n```\n\n### Properties\n\n| Property | Type | Description ", "char_start": 0, "char_end": 800, "metadata": {"title": "step-context", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/step-context.md", "format": "markdown", "raw_hash": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3"}} +{"chunk_id": "a2b812d6df5782e1", "doc_id": "workflows/build/step-context.md", "text": "Type | Description |\n| ------------ | ------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |\n| `step.name` | `string` | The name you passed to `step.do`. |\n| `step.count` | `number` | How many ti", "char_start": 680, "char_end": 1480, "metadata": {"title": "step-context", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/step-context.md", "format": "markdown", "raw_hash": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3"}} +{"chunk_id": "8af3c8204b91b3d7", "doc_id": "workflows/build/step-context.md", "text": " |\n| `step.count` | `number` | How many times `step.do` has been called with this name so far in the current Workflow run. Starts at `1` for the first call with a given name. |\n| `attempt` | `number` | The current attempt number (1-indexed). `1` on the first try, `2` on the first retry, and so on. |\n| `config` | [`WorkflowStepConfig`](/workflows/build/workers-api/#workflowstepconfig) | The resolved retry and timeout configuration for this step, including any defaults applied by the runtime. |\n\nIf a step config's `retries.delay` is a function, the dynamic delay ", "char_start": 1360, "char_end": 2160, "metadata": {"title": "step-context", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/step-context.md", "format": "markdown", "raw_hash": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3"}} +{"chunk_id": "283edd201a0d807a", "doc_id": "workflows/build/step-context.md", "text": "he runtime. |\n\nIf a step config's `retries.delay` is a function, the dynamic delay is not exposed on `ctx.config.retries.delay`. The delay function receives its own context object with the current step context and the error that caused the retry.\n\n## Access the context\n\nPass a parameter to your `step.do` callback to receive the context object:\n\n```ts\nawait step.do(\"my-step\", async (ctx) => {\n\tconsole.log(ctx.step.name); // \"my-step\"\n\tconsole.log(ctx.step.count); // 1\n\tconsole.log(ctx.attempt); // 1 on first try, 2 on first retry, etc.\n\tconsole.log(ctx.config); // { retries: { limit: 5, ... }, timeout: \"10 minutes\" }\n});\n```\n\nThe context is also available when you pass a custom `WorkflowStepConfig`:\n\n```ts\nawait step.do(\n\t\"call an API\",\n\t{\n\t\tretries: {\n\t", "char_start": 2040, "char_end": 2840, "metadata": {"title": "step-context", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/step-context.md", "format": "markdown", "raw_hash": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3"}} +{"chunk_id": "9988b8e3b9e3795d", "doc_id": "workflows/build/step-context.md", "text": "t is also available when you pass a custom `WorkflowStepConfig`:\n\n```ts\nawait step.do(\n\t\"call an API\",\n\t{\n\t\tretries: {\n\t\t\tlimit: 10,\n\t\t\tdelay: \"10 seconds\",\n\t\t\tbackoff: \"exponential\",\n\t\t},\n\t\ttimeout: \"30 minutes\",\n\t},\n\tasync (ctx) => {\n\t\tconsole.log(ctx.config.retries.limit); // 10\n\t\tconsole.log(ctx.config.timeout); // \"30 minutes\"\n\t},\n);\n```\n\nTo configure delay functions, refer to [Set a dynamic retry delay](/workflows/build/sleeping-and-retrying/#set-a-dynamic-retry-delay).\n\n## Examples\n\n### Adjust behavior based on retry attempt\n\nUse `ctx.attempt` to change how your step behaves on retries. For example, you might use a fallback endpoint after a certain number of retries:\n\n```ts\nawait step.do(\n\t\"fetch data\",\n\t{ retries: { limit: 5, delay: \"5 seconds\", backoff: \"linear\" } },\n\tasync (ctx) ", "char_start": 2720, "char_end": 3520, "metadata": {"title": "step-context", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/step-context.md", "format": "markdown", "raw_hash": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3"}} +{"chunk_id": "76e4ca3b31b9be74", "doc_id": "workflows/build/step-context.md", "text": "s:\n\n```ts\nawait step.do(\n\t\"fetch data\",\n\t{ retries: { limit: 5, delay: \"5 seconds\", backoff: \"linear\" } },\n\tasync (ctx) => {\n\t\tconst url =\n\t\t\tctx.attempt <= 3\n\t\t\t\t? \"https://api.example.com/primary\"\n\t\t\t\t: \"https://api.example.com/fallback\";\n\n\t\tconst response = await fetch(url);\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Request failed with status ${response.status}`);\n\t\t}\n\t\treturn await response.json();\n\t},\n);\n```\n\n### Log step metadata for observability\n\nUse `ctx.step` to add structured metadata to your logs:\n\n```ts\nawait step.do(\"process-order\", async (ctx) => {\n\tconsole.log(\n\t\tJSON.stringify({\n\t\t\tstep: ctx.step.name,\n\t\t\tstepCount: ctx.step.count,\n\t\t\tattempt: ctx.attempt,\n\t\t\tretryLimit: ctx.config.retries?.limit,\n\t\t}),\n\t);\n\n\t// Your step logic here\n});\n```\n", "char_start": 3400, "char_end": 4168, "metadata": {"title": "step-context", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/step-context.md", "format": "markdown", "raw_hash": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3"}} +{"chunk_id": "9af621bb47d8e2f7", "doc_id": "workflows/build/trigger-workflows.md", "text": "---\ntitle: Trigger Workflows\ndescription: Trigger Workflows from Workers bindings, the REST API, or the Wrangler CLI.\npcx_content_type: concept\ntags:\n - Bindings\nsidebar:\n order: 3\nproducts:\n - workflows\n---\n\nimport { TypeScriptExample, WranglerConfig } from \"~/components\";\n\nYou can trigger Workflows both programmatically and via the Workflows APIs, including:\n\n1. With [Workers](/workers) via HTTP requests in a `fetch` handler, or bindings from a `queue` or `scheduled` handler\n2. On a recurring interval by defining `schedules` on a Workflow binding in your Wrangler configuration\n3. Using the [Workflows REST API](/api/resources/workflows/methods/list/)\n4. Via the [wrangler CLI](/workers/wrangler/commands/workflows/#workflows) in your terminal\n\n## Workers API (Bindings)\n\nYou can interact ", "char_start": 0, "char_end": 800, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "bf1851ef6c42529a", "doc_id": "workflows/build/trigger-workflows.md", "text": "ler CLI](/workers/wrangler/commands/workflows/#workflows) in your terminal\n\n## Workers API (Bindings)\n\nYou can interact with Workflows programmatically from any Worker script by creating a binding to a Workflow. A Worker can bind to multiple Workflows, including Workflows defined in other Workers projects (scripts) within your account.\n\nYou can trigger a Workflow:\n\n- Directly over HTTP via the [`fetch`](/workers/runtime-apis/handlers/fetch/) handler\n- From a [Queue consumer](/queues/configuration/javascript-apis/#consumer) inside a `queue` handler\n- On a recurring schedule by defining `schedules` on the Workflow binding in `wrangler.jsonc`\n- From a [Cron Trigger](/workers/configuration/cron-triggers/) inside a `scheduled` handler\n- Within a [Durable Object](/durable-objects/)\n\n:::note\n\nNew", "char_start": 680, "char_end": 1480, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "310337f2f2e9689d", "doc_id": "workflows/build/trigger-workflows.md", "text": "/configuration/cron-triggers/) inside a `scheduled` handler\n- Within a [Durable Object](/durable-objects/)\n\n:::note\n\nNew to Workflows? Start with the [Workflows tutorial](/workflows/get-started/guide/) to deploy your first Workflow and familiarize yourself with Workflows concepts.\n\n:::\n\nTo bind to a Workflow from your Workers code, you need to define a [binding](/workers/wrangler/configuration/) to a specific Workflow. For example, to bind to the Workflow defined in the [get started guide](/workflows/get-started/guide/), you would configure the [Wrangler configuration file](/workers/wrangler/configuration/) with the below:\n\n\n\n```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"workflows-tutorial\",\n\t\"main\": \"src/index.ts\",\n\t\"compatibility_date\": \"$", "char_start": 1360, "char_end": 2160, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "10e881b26894aa57", "doc_id": "workflows/build/trigger-workflows.md", "text": "_modules/wrangler/config-schema.json\",\n\t\"name\": \"workflows-tutorial\",\n\t\"main\": \"src/index.ts\",\n\t\"compatibility_date\": \"$today\",\n\t\"workflows\": [\n\t\t{\n\t\t\t// The name of the Workflow\n\t\t\t\"name\": \"workflows-tutorial\",\n\t\t\t// The binding name, which must be a valid JavaScript variable name. This will\n\t\t\t// be how you call (run) your Workflow from your other Workers handlers or\n\t\t\t// scripts.\n\t\t\t\"binding\": \"MY_WORKFLOW\",\n\t\t\t// Must match the class defined in your code that extends the Workflow class\n\t\t\t\"class_name\": \"MyWorkflow\"\n\t\t}\n\t]\n}\n```\n\n\n\nThe `binding = \"MY_WORKFLOW\"` line defines the JavaScript variable that our Workflow methods are accessible on, including `create` (which triggers a new instance) or `get` (which returns the status of an existing instance).\n\n### Schedule a ", "char_start": 2040, "char_end": 2840, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "4a480693790c0ca6", "doc_id": "workflows/build/trigger-workflows.md", "text": "g `create` (which triggers a new instance) or `get` (which returns the status of an existing instance).\n\n### Schedule a Workflow directly\n\nIf you want to create Workflow instances on a recurring interval, add a `schedules` array (up to 100 cron expressions per account) to the Workflow binding in your Wrangler configuration:\n\n\n\n```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"workflows-tutorial\",\n\t\"main\": \"src/index.ts\",\n\t\"compatibility_date\": \"$today\",\n\t\"workflows\": [\n\t\t{\n\t\t\t\"name\": \"workflows-tutorial\",\n\t\t\t\"binding\": \"MY_WORKFLOW\",\n\t\t\t\"class_name\": \"MyWorkflow\",\n\t\t\t\"schedules\": [\"0 * * * *\"]\n\t\t}\n\t]\n}\n```\n\n\n\nEach matching cron expression creates a new Workflow instance automatically. Use this when you want to run a Workflow on ", "char_start": 2720, "char_end": 3520, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "c2b56fb5f5c2560d", "doc_id": "workflows/build/trigger-workflows.md", "text": "ach matching cron expression creates a new Workflow instance automatically. Use this when you want to run a Workflow on a schedule without defining top-level `triggers.crons` and a separate `scheduled` handler.\n\nScheduled instances include the matching cron expression and scheduled trigger time on `event.schedule`:\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\tif (event.schedule) {\n\t\t\tconsole.log(event.schedule.cron);\n\t\t\tconsole.log(new Date(event.schedule.scheduledTime));\n\t\t}\n\t}\n}\n```\n\nOn [Workers Paid](/workers/platform/pricing/#workers), Workflow instances created by `schedules` can run for up to one hour per cron firing without consuming a Workflow concurrency slot. If the instance pauses or sleeps aft", "char_start": 3400, "char_end": 4200, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "e8755c47984cf9e7", "doc_id": "workflows/build/trigger-workflows.md", "text": "n for up to one hour per cron firing without consuming a Workflow concurrency slot. If the instance pauses or sleeps after that window, the instance yields and enters the normal concurrency queue upon resume. It resumes when a concurrency slot is available.\n\nUse the latest Wrangler release when configuring Workflow schedules. If your local Wrangler schema does not recognize `schedules` yet, update Wrangler before deploying.\n\nThe following example shows how you can manage Workflows from within a Worker, including:\n\n- Retrieving the status of an existing Workflow instance by its ID\n- Creating (triggering) a new Workflow instance\n- Returning the status of a given instance ID\n\n```ts title=\"src/index.ts\"\ninterface Env {\n\tMY_WORKFLOW: Workflow;\n}\n\nexport default {\n\tasync fetch(req: Request, env:", "char_start": 4080, "char_end": 4880, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "03e83059fd6dc847", "doc_id": "workflows/build/trigger-workflows.md", "text": "\n\n```ts title=\"src/index.ts\"\ninterface Env {\n\tMY_WORKFLOW: Workflow;\n}\n\nexport default {\n\tasync fetch(req: Request, env: Env) {\n\t\t// Get instanceId from query parameters\n\t\tconst instanceId = new URL(req.url).searchParams.get(\"instanceId\");\n\n\t\t// If an ?instanceId= query parameter is provided, fetch the status\n\t\t// of an existing Workflow by its ID.\n\t\tif (instanceId) {\n\t\t\tlet instance = await env.MY_WORKFLOW.get(instanceId);\n\t\t\treturn Response.json({\n\t\t\t\tstatus: await instance.status(),\n\t\t\t});\n\t\t}\n\n\t\t// Else, create a new instance of our Workflow, passing in any (optional)\n\t\t// params and return the ID.\n\t\tconst newId = crypto.randomUUID();\n\t\tlet instance = await env.MY_WORKFLOW.create({ id: newId });\n\t\treturn Response.json({\n\t\t\tid: instance.id,\n\t\t\tdetails: await instance.status(),\n\t\t});", "char_start": 4760, "char_end": 5560, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "f0dcff65bbf7c9fd", "doc_id": "workflows/build/trigger-workflows.md", "text": "_WORKFLOW.create({ id: newId });\n\t\treturn Response.json({\n\t\t\tid: instance.id,\n\t\t\tdetails: await instance.status(),\n\t\t});\n\t},\n};\n```\n\n### Inspect a Workflow's status\n\nYou can inspect the status of any running Workflow instance by calling `status` against a specific instance ID. This allows you to programmatically inspect whether an instance is queued (waiting to be scheduled), actively running, paused, or errored.\n\n```ts\nlet instance = await env.MY_WORKFLOW.get(\"abc-123\");\nlet status = await instance.status(); // Returns an InstanceStatus\n```\n\nThe possible values of status are as follows:\n\n```ts\n status:\n | \"queued\" // means that instance is waiting to be started (see concurrency limits)\n | \"running\"\n | \"paused\"\n | \"errored\"\n | \"terminated\" // user terminated the instance wh", "char_start": 5440, "char_end": 6240, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "cb2a739574ccb157", "doc_id": "workflows/build/trigger-workflows.md", "text": "concurrency limits)\n | \"running\"\n | \"paused\"\n | \"errored\"\n | \"terminated\" // user terminated the instance while it was running\n | \"complete\"\n | \"waiting\" // instance is hibernating and waiting for sleep or event to finish\n | \"waitingForPause\" // instance is finishing the current work to pause\n | \"unknown\";\n error?: {\n name: string,\n message: string\n };\n\toutput?: unknown;\n\trollback:\n\t\t| {\n\t\t\t\toutcome: \"complete\" | \"failed\";\n\t\t\t\terror: {\n\t\t\t\t\tname: string,\n\t\t\t\t\tmessage: string,\n\t\t\t\t} | null,\n\t\t }\n\t\t| null;\n```\n\nIf your Workflow registers rollback handlers on `step.do()`, inspect `rollback` after the instance finishes to see whether the compensating steps completed successfully. While rollback is actively running, the Workers API continues to return `status: \"", "char_start": 6120, "char_end": 6920, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "2645e894a31de0b0", "doc_id": "workflows/build/trigger-workflows.md", "text": "nsating steps completed successfully. While rollback is actively running, the Workers API continues to return `status: \"running\"`.\n\n### Explicitly pause a Workflow\n\nYou can explicitly pause a Workflow instance (and later resume it) by calling `pause` against a specific instance ID.\n\n```ts\nlet instance = await env.MY_WORKFLOW.get(\"abc-123\");\nawait instance.pause(); // Returns Promise\n```\n\n### Resume a Workflow\n\nYou can resume a paused Workflow instance by calling `resume` against a specific instance ID.\n\n```ts\nlet instance = await env.MY_WORKFLOW.get(\"abc-123\");\nawait instance.resume(); // Returns Promise\n```\n\nCalling `resume` on an instance that is not currently paused will have no effect.\n\n:::caution\nIf you have reached the maximum concurrent instances for your Workflow, resum", "char_start": 6800, "char_end": 7600, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "3e2682af580391d8", "doc_id": "workflows/build/trigger-workflows.md", "text": "ly paused will have no effect.\n\n:::caution\nIf you have reached the maximum concurrent instances for your Workflow, resuming an instance may not restart it immediately. The instance will be queued until a concurrency slot becomes available.\n:::\n\n### Stop a Workflow\n\nYou can stop/terminate a Workflow instance by calling `terminate` against a specific instance ID.\n\n```ts\nlet instance = await env.MY_WORKFLOW.get(\"abc-123\");\nawait instance.terminate(); // Returns Promise\n```\n\nTo run registered rollback handlers before terminating, pass `rollback: true`:\n\n```ts\nlet instance = await env.MY_WORKFLOW.get(\"abc-123\");\nawait instance.terminate({ rollback: true }); // Returns Promise\n```\n\nYou can also run rollback handlers from Wrangler:\n\n```sh\nnpx wrangler workflows instances terminate \n```\n\nYou can also run rollback handlers from Wrangler:\n\n```sh\nnpx wrangler workflows instances terminate --rollback\n# For a local Workflows instance during wrangler dev:\nnpx wrangler workflows instances terminate --local --rollback\n```\n\nOnce stopped/terminated, the Workflow instance _cannot_ be resumed.\n\n### Restart a Workflow\n\n```ts\nlet instance = await env.MY_WORKFLOW.get(\"abc-123\");\nawait instance.restart(); // Returns Promise\n```\n\nRestarting an instance will immediately cancel any in-progress steps, erase any intermediate state, and treat the Workflow as if it was run for the first time.\n\nTo restart an instance from a specific step instead of the beginning, refer to [`restart`](/workflows/build/workers-api/#r", "char_start": 8160, "char_end": 8960, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "8af6ef94c84b8faf", "doc_id": "workflows/build/trigger-workflows.md", "text": " restart an instance from a specific step instead of the beginning, refer to [`restart`](/workflows/build/workers-api/#restart) in the Workers API reference.\n\n### Trigger a Workflow from another Workflow\n\nYou can create a new Workflow instance from within a step of another Workflow. The parent Workflow will not block waiting for the child Workflow to complete \u2014 it continues execution immediately after the child instance is successfully created.\n\n\n\n```ts\nexport class ParentWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// Perform initial work\n\t\tconst result = await step.do(\"initial processing\", async () => {\n\t\t\t// ... processing logic\n\t\t\treturn { fileKey: \"output.pdf\" };\n\t\t});\n\n\t\t// Trigger a child workf", "char_start": 8840, "char_end": 9640, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "8ce27780d45b5739", "doc_id": "workflows/build/trigger-workflows.md", "text": "essing\", async () => {\n\t\t\t// ... processing logic\n\t\t\treturn { fileKey: \"output.pdf\" };\n\t\t});\n\n\t\t// Trigger a child workflow for additional processing\n\t\tconst childInstance = await step.do(\"trigger child workflow\", async () => {\n\t\t\treturn await this.env.CHILD_WORKFLOW.create({\n\t\t\t\tid: `child-${event.instanceId}`,\n\t\t\t\tparams: { fileKey: result.fileKey },\n\t\t\t});\n\t\t});\n\n\t\t// Parent continues immediately - not blocked by child workflow\n\t\tawait step.do(\"continue with other work\", async () => {\n\t\t\tconsole.log(`Started child workflow: ${childInstance.id}`);\n\t\t\t// This runs right away, regardless of child workflow status\n\t\t});\n\t}\n}\n```\n\n\n\nIf the child Workflow fails to start, the step will fail and be retried according to your retry configuration. Once the child instance is succ", "char_start": 9520, "char_end": 10320, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "af6343a8b168434a", "doc_id": "workflows/build/trigger-workflows.md", "text": "fails to start, the step will fail and be retried according to your retry configuration. Once the child instance is successfully created, it runs independently from the parent.\n\n## REST API (HTTP)\n\nRefer to the [Workflows REST API documentation](/api/resources/workflows/subresources/instances/methods/create/).\n\n## Command line (CLI)\n\nRefer to the [CLI quick start](/workflows/get-started/guide/) to learn more about how to manage and trigger Workflows via the command-line.\n", "char_start": 10200, "char_end": 10676, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "aabc40edc91c28e8", "doc_id": "workflows/build/workers-api.md", "text": "---\ntitle: Workers API\ndescription: Reference for the Workflows Workers API, including WorkflowEntrypoint, step methods, and instance management.\npcx_content_type: concept\nsidebar:\n order: 2\nproducts:\n - workflows\n---\n\nimport {\n\tMetaInfo,\n\tRender,\n\tType,\n\tTypeScriptExample,\n\tWranglerConfig,\n} from \"~/components\";\n\nThis guide details the Workflows API within Cloudflare Workers, including methods, types, and usage examples.\n\n## WorkflowEntrypoint\n\nThe `WorkflowEntrypoint` class is the core element of a Workflow definition. A Workflow must extend this class and define a `run` method with at least one `step` call to be considered a valid Workflow.\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// Steps", "char_start": 0, "char_end": 800, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "c488992b4c1550f3", "doc_id": "workflows/build/workers-api.md", "text": "flow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// Steps here\n\t}\n}\n```\n\n### run\n\n- run(event: WorkflowEvent<T>, step: WorkflowStep): Promise<T>\n - `event` - the event passed to the Workflow, including an optional `payload` containing data (parameters)\n - `step` - the `WorkflowStep` type that provides the step methods for your Workflow\n\nThe `run` method can optionally return data, which is available when querying the instance status via the [Workers API](/workflows/build/workers-api/#instancestatus), [REST API](/api/resources/workflows/subresources/instances/subresources/status/) and the Workflows dashboard. This can be useful if your Workflow is computing a result, returning the key to data stored in", "char_start": 680, "char_end": 1480, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "fa82358bd2e57a9e", "doc_id": "workflows/build/workers-api.md", "text": " the Workflows dashboard. This can be useful if your Workflow is computing a result, returning the key to data stored in object storage, or generating some kind of identifier you need to act on.\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// Steps here\n\t\tlet someComputedState = await step.do(\"my step\", async () => {});\n\n\t\t// Optional: return state from our run() method\n\t\treturn someComputedState;\n\t}\n}\n```\n\nThe `WorkflowEvent` type accepts an optional [type parameter](https://www.typescriptlang.org/docs/handbook/2/generics.html#working-with-generic-type-variables) that allows you to provide a type for the `payload` property within the `WorkflowEvent`.\n\nRefer to the [events and parameters](/workflow", "char_start": 1360, "char_end": 2160, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "16aefa9748441ca8", "doc_id": "workflows/build/workers-api.md", "text": "to provide a type for the `payload` property within the `WorkflowEvent`.\n\nRefer to the [events and parameters](/workflows/build/events-and-parameters/) documentation for how to handle events within your Workflow code.\n\nFinally, any JS control-flow primitive (if conditions, loops, `try...catch` blocks, promises, and more) can be used to manage steps inside the `run` method.\n\n## WorkflowEvent\n\n```ts\nexport type WorkflowCronSchedule = {\n\t/** Cron expression that triggered this event. */\n\tcron: string;\n\t/** Timestamp of the scheduled trigger, in milliseconds since the Unix epoch. */\n\tscheduledTime: number;\n};\n\nexport type WorkflowEvent = {\n\tpayload: Readonly;\n\ttimestamp: Date;\n\tinstanceId: string;\n\tworkflowName: string;\n\tschedule?: WorkflowCronSchedule;\n};\n```\n\n- The `WorkflowEvent` is t", "char_start": 2040, "char_end": 2840, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "82e890cfa381650e", "doc_id": "workflows/build/workers-api.md", "text": ": Date;\n\tinstanceId: string;\n\tworkflowName: string;\n\tschedule?: WorkflowCronSchedule;\n};\n```\n\n- The `WorkflowEvent` is the first argument to a Workflow's `run` method.\n - `payload` - a default type of `any` or type `T` if a type parameter is provided.\n - `timestamp` - a `Date` object set to the time the Workflow instance was created (triggered).\n - `instanceId` - the ID of the associated instance.\n - `workflowName` - the name of the associated Workflow.\n - `schedule` - metadata for Workflow instances created by a cron schedule, including the `cron` expression and `scheduledTime` in milliseconds since the Unix epoch.\n\nRefer to the [events and parameters](/workflows/build/events-and-parameters/) documentation for how to handle events within your Workflow code.\n\n## WorkflowStep\n\n### step", "char_start": 2720, "char_end": 3520, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "96fde108fc819ff8", "doc_id": "workflows/build/workers-api.md", "text": "ild/events-and-parameters/) documentation for how to handle events within your Workflow code.\n\n## WorkflowStep\n\n### step\n\n{/* prettier-ignore */}\n- step.do(name: string, callback: (ctx: WorkflowStepContext): RpcSerializable): Promise<T>\n- step.do(name: string, callback: (ctx: WorkflowStepContext): RpcSerializable, rollbackOptions?: WorkflowStepRollbackOptions<T>): Promise<T>\n- step.do(name: string, config?: WorkflowStepConfig, callback: (ctx: WorkflowStepContext):\n\tRpcSerializable): Promise<T>\n\t- `name` - the name of the step, up to 256 characters.\n\t- `config` (optional) - an optional `WorkflowStepConfig` for configuring [step specific retry behaviour](/workflows/build/sleeping-and-retrying/).\n\t- `callback` - an asynchronous fu", "char_start": 3400, "char_end": 4200, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "58b3b1d56fbf4025", "doc_id": "workflows/build/workers-api.md", "text": "configuring [step specific retry behaviour](/workflows/build/sleeping-and-retrying/).\n\t- `callback` - an asynchronous function that receives a [`WorkflowStepContext`](/workflows/build/step-context/) and optionally returns serializable state for the Workflow to persist. In JavaScript Workflows, this includes a fresh, unlocked `ReadableStream` for large binary output.\n- step.do(name: string, config?: WorkflowStepConfig, callback: (ctx: WorkflowStepContext):\n\tRpcSerializable, rollbackOptions?: WorkflowStepRollbackOptions<T>): Promise<T>\n\t- `name` - the name of the step, up to 256 characters.\n\t- `config` (optional) - an optional `WorkflowStepConfig` for configuring [step specific retry behaviour](/workflows/build/sleeping-and-retrying/).\n\t- `callback` - an ", "char_start": 4080, "char_end": 4880, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "2fabaea50c11a10a", "doc_id": "workflows/build/workers-api.md", "text": "tepConfig` for configuring [step specific retry behaviour](/workflows/build/sleeping-and-retrying/).\n\t- `callback` - an asynchronous function that receives a [`WorkflowStepContext`](/workflows/build/step-context/) and optionally returns serializable state for the Workflow to persist. In JavaScript Workflows, this includes a fresh, unlocked `ReadableStream` for large binary output.\n\t- `rollbackOptions` (optional) - register rollback logic for the step. If the Workflow later fails, registered rollbacks run in reverse step-start order.\n\n:::note[Returning state]\n\nWhen returning state from a `step`, ensure that the object you return is _serializable_.\n\nPrimitive types like `string`, `number`, and `boolean`, along with composite structures such as `Array` and `Object` (provided they ", "char_start": 4760, "char_end": 5560, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "9c70396288a29bca", "doc_id": "workflows/build/workers-api.md", "text": "pes like `string`, `number`, and `boolean`, along with composite structures such as `Array` and `Object` (provided they only contain serializable values), can be serialized. Any [structured-cloneable](https://developer.mozilla.org/en-US/docs/Web/API/Window/structuredClone) type can be serialized, as long it is no longer than 1 MB.\n\nOn the other hand, objects that include `Function` or `Symbol` types, and objects with circular references, cannot be serialized. The Workflow instance will throw an error if objects with those types is returned.\n\nIn JavaScript Workflows, `ReadableStream` is a supported serializable return type when a step needs to persist larger binary output than the normal 1 MiB non-stream step-result limit.\n\nReturn a new stream from the callback.\n\n:::caution\nDo n", "char_start": 5440, "char_end": 6240, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "5bd76a778cb618e3", "doc_id": "workflows/build/workers-api.md", "text": "nary output than the normal 1 MiB non-stream step-result limit.\n\nReturn a new stream from the callback.\n\n:::caution\nDo not return a locked stream or a stream that has already been read. BYOB streams and BYOB readers are not supported.\n:::\n\nAfter a `ReadableStream` object has been persisted within a step, it should not be reused - rely on the new fresh stream that gets returned from step. The bytes are preserved from the original stream, but the implementation might differ.\n\n:::\n\n\n\n```ts\ntype Env = {\n\tMY_BUCKET: R2Bucket;\n};\n\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(_event: WorkflowEvent, step: WorkflowStep) {\n\t\tconst reportStream = await step.do(\"read report from R2\", async () => {\n\t\t\tconst object = await this.env.MY_BUCKE", "char_start": 6120, "char_end": 6920, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "22a1b5f78a0ef2f6", "doc_id": "workflows/build/workers-api.md", "text": "p) {\n\t\tconst reportStream = await step.do(\"read report from R2\", async () => {\n\t\t\tconst object = await this.env.MY_BUCKET.get(\"reports/latest.csv\");\n\n\t\t\tif (!object?.body) {\n\t\t\t\tthrow new Error(\"Could not read reports/latest.csv from R2.\");\n\t\t\t}\n\n\t\t\treturn object.body;\n\t\t});\n\n\t\tconst preview = await new Response(reportStream).text();\n\t\treturn { preview };\n\t}\n}\n```\n\n\n\n- step.sleep(name: string, duration: WorkflowDuration): Promise<void>\n - `name` - the name of the step.\n - `duration` - the duration to sleep until, in either seconds or as a `WorkflowDuration` compatible string.\n - Refer to the [documentation on sleeping and retrying](/workflows/build/sleeping-and-retrying/) to learn more about how Workflows are retried.\n\n- step.sleepUntil(name:", "char_start": 6800, "char_end": 7600, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "cb22e0b4f150c815", "doc_id": "workflows/build/workers-api.md", "text": "](/workflows/build/sleeping-and-retrying/) to learn more about how Workflows are retried.\n\n- step.sleepUntil(name: string, timestamp: Date | number): Promise<void>\n - `name` - the name of the step.\n - `timestamp` - a JavaScript `Date` object or milliseconds from the Unix epoch to sleep the Workflow instance until.\n\n:::note\n\n`step.sleep` and `step.sleepUntil` methods do not count towards the maximum Workflow steps limit.\n\nMore information about the limits imposed on Workflow can be found in the [Workflows limits documentation](/workflows/reference/limits/).\n\n:::\n\n- step.waitForEvent(name: string, options: ): Promise<void>-\n `name` - the name of the step. - `options` - an object with properties for\n `type` (up to 100 characters [^1]), which determine", "char_start": 7480, "char_end": 8280, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "e4dffbca430891e3", "doc_id": "workflows/build/workers-api.md", "text": " the name of the step. - `options` - an object with properties for\n `type` (up to 100 characters [^1]), which determines which event type this\n `waitForEvent` call will match on when calling `instance.sendEvent`, and an\n optional `timeout` property, which defines how long the `waitForEvent` call\n will block for before throwing a timeout exception. The default timeout is 24\n hours.\n\n\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// Other steps in your Workflow\n\t\tlet stripeEvent = await step.waitForEvent(\n\t\t\t\"receive invoice paid webhook from Stripe\",\n\t\t\t{ type: \"stripe-webhook\", timeout: \"1 hour\" },\n\t\t);\n\t\t// Rest of your Workflow\n\t}\n}\n```\n\n\n\nReview the documentation on [events and parameters](/workflows/build/events-and-parameters/) to learn how to send events to a running Workflow instance.\n\n## WorkflowStepConfig\n\n```ts\nexport type WorkflowDynamicDelayContext = {\n\tctx: WorkflowStepContext;\n\terror: Error;\n};\n\nexport type WorkflowDelayFunction = (\n\tinput: WorkflowDynamicDelayContext,\n) => string | number | Promise;\n\nexport type WorkflowStepConfig = {\n\tretries?: {\n\t\tlimit: number;\n\t\tdelay: string | number | WorkflowDelayFunction;\n\t\tbackoff?: WorkflowBackoff;\n\t};\n\ttimeout?: string | number;\n};\n```\n\n- A `WorkflowStepConfig` is an optional argument to the `do` method of a `WorkflowStep` a", "char_start": 8840, "char_end": 9640, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "fb245b573458d936", "doc_id": "workflows/build/workers-api.md", "text": "out?: string | number;\n};\n```\n\n- A `WorkflowStepConfig` is an optional argument to the `do` method of a `WorkflowStep` and defines properties that allow you to configure the retry behaviour of that step.\n- Set `retries.delay` to a fixed duration, or pass a `WorkflowDelayFunction` to calculate the next retry delay from the current step context and thrown error.\n\nRefer to the [documentation on sleeping and retrying](/workflows/build/sleeping-and-retrying/) to learn more about how Workflows are retried.\n\n## Rollback options\n\n```ts\ntype WorkflowRollbackContext = {\n\tctx: WorkflowStepContext;\n\terror: Error;\n\toutput: T | undefined;\n};\n\ntype WorkflowRollbackHandler = (\n\tctx: WorkflowRollbackContext,\n) => Promise;\n\ntype WorkflowStepRollbackConfig = Pick<\n\tWorkflow", "char_start": 9520, "char_end": 10320, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "2fe9cf3bd3cab5b8", "doc_id": "workflows/build/workers-api.md", "text": " = unknown> = (\n\tctx: WorkflowRollbackContext,\n) => Promise;\n\ntype WorkflowStepRollbackConfig = Pick<\n\tWorkflowStepConfig,\n\t\"retries\" | \"timeout\"\n>;\n\ntype WorkflowStepRollbackOptions = {\n\trollback: WorkflowRollbackHandler;\n\trollbackConfig?: WorkflowStepRollbackConfig;\n};\n```\n\n- Pass this `WorkflowStepRollbackOptions` object as the final argument to `step.do()` to register a compensating action for a successful step.\n- `rollback` receives the original step context, the error that caused the Workflow to fail, and the step output returned by the forward step.\n- `rollbackConfig` applies retry and timeout settings to the rollback handler itself.\n\n\n\n```ts\nexport class BillingWorkflow extends WorkflowEntrypoint {\n\tasync run(_event: WorkflowEvent\n\n```ts\nexport class BillingWorkflow extends WorkflowEntrypoint {\n\tasync run(_event: WorkflowEvent, step: WorkflowStep) {\n\t\tawait step.do(\n\t\t\t\"create charge\",\n\t\t\tasync () => {\n\t\t\t\tconst charge = await createCharge();\n\t\t\t\treturn { chargeId: charge.id };\n\t\t\t},\n\t\t\t{\n\t\t\t\trollback: async ({ ctx, output, error }) => {\n\t\t\t\t\tconst { chargeId } = output as { chargeId: string };\n\t\t\t\t\tawait refundCharge(chargeId, {\n\t\t\t\t\t\treason: `${ctx.step.name}: ${error.message}`,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\trollbackConfig: {\n\t\t\t\t\tretries: {\n\t\t\t\t\t\tlimit: 3,\n\t\t\t\t\t\tdelay: \"30 seconds\",\n\t\t\t\t\t\tbackoff: \"linear\",\n\t\t\t\t\t},\n\t\t\t\t\ttimeout: \"5 minutes\",\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t}\n}\n```\n\n\n\n## WorkflowStepContext\n\n```ts\nexport type WorkflowStepContext = {\n\tstep: {\n\t\tname: string;\n\t\tcount: numbe", "char_start": 10880, "char_end": 11680, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "98022d88e0e2fe53", "doc_id": "workflows/build/workers-api.md", "text": "criptExample>\n\n## WorkflowStepContext\n\n```ts\nexport type WorkflowStepContext = {\n\tstep: {\n\t\tname: string;\n\t\tcount: number;\n\t};\n\tattempt: number;\n\tconfig: WorkflowStepConfig;\n};\n```\n\n- The `WorkflowStepContext` is passed as the first argument to the `step.do` callback function. It provides runtime information about the current step.\n - `step.name` - the name of the step as passed to `step.do`.\n - `step.count` - how many times `step.do` has been called with this name in the current Workflow run (1-indexed).\n - `attempt` - the current attempt number (1-indexed). `1` on the first try, `2` on the first retry, and so on.\n - `config` - the resolved `WorkflowStepConfig` for this step, including any defaults applied by the runtime.\n\nRefer to the [step context documentation](/workflows/build/ste", "char_start": 11560, "char_end": 12360, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "b5f45aae4c0264b0", "doc_id": "workflows/build/workers-api.md", "text": "his step, including any defaults applied by the runtime.\n\nRefer to the [step context documentation](/workflows/build/step-context/) for usage examples.\n\n## Workflow step limits\n\nEach workflow on Workers Paid supports 10,000 steps by default. You can increase this up to 25,000 steps by configuring `steps` within the `limits` property of your Workflow definition in your Wrangler configuration:\n\n\n\n```toml\n[[workflows]]\nname = \"my-workflow\"\nbinding = \"MY_WORKFLOW\"\nclass_name = \"MyWorkflow\"\n\n[workflows.limits]\nsteps = 25_000\n```\n\n\n\n`step.sleep` does not count towards the maximum steps limit.\n\nNote that Workflows on Workers Free have a limit of 1,024 steps. Refer to [Workflow limits](/workflows/reference/limits/) for more information.\n\n## NonRetryableError\n\n- throw new NonRetryableError(message: , name ): \n - When thrown inside [`step.do()`](/workflows/build/workers-api/#step), this error stops step retries, propagating the error to the top level (the [run](/workflows/build/workers-api/#run) function). Any error not handled at this top level will cause the Workflow instance to fail.\n - Refer to the [documentation on sleeping and retrying](/workflows/build/sleeping-and-retrying/) to learn more about how Workflows steps are retried.\n\n## Call Workflows from Workers\n\nWorkflows exposes an API directly to your Worker", "char_start": 12920, "char_end": 13720, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "c21eac232011bd85", "doc_id": "workflows/build/workers-api.md", "text": "about how Workflows steps are retried.\n\n## Call Workflows from Workers\n\nWorkflows exposes an API directly to your Workers scripts via the [bindings](/workers/runtime-apis/bindings/#what-is-a-binding) concept. Bindings allow you to securely call a Workflow without having to manage API keys or clients.\n\nYou can bind to a Workflow by defining a `[[workflows]]` binding within your Wrangler configuration.\n\nFor example, to bind to a Workflow called `workflows-starter` and to make it available on the `MY_WORKFLOW` variable to your Worker script, you would configure the following fields within the `[[workflows]]` binding definition:\n\n\n\n```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"workflows-starter\",\n\t\"main\": \"src/index.ts\",\n\t\"compatibility_date\": \"", "char_start": 13600, "char_end": 14400, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "7f4c95d374793148", "doc_id": "workflows/build/workers-api.md", "text": "de_modules/wrangler/config-schema.json\",\n\t\"name\": \"workflows-starter\",\n\t\"main\": \"src/index.ts\",\n\t\"compatibility_date\": \"$today\",\n\t\"workflows\": [\n\t\t{\n\t\t\t// name of your workflow\n\t\t\t\"name\": \"workflows-starter\",\n\t\t\t// binding name env.MY_WORKFLOW\n\t\t\t\"binding\": \"MY_WORKFLOW\",\n\t\t\t// this is class that extends the Workflow class in src/index.ts\n\t\t\t\"class_name\": \"MyWorkflow\",\n\t\t},\n\t],\n}\n```\n\n\n\n### Bind from Pages\n\nYou can bind and trigger Workflows from [Pages Functions](/pages/functions/) by deploying a Workers project with your Workflow definition and then invoking that Worker using [service bindings](/pages/functions/bindings/#service-bindings) or a standard `fetch()` call.\n\nVisit the documentation on [calling Workflows from Pages](/workflows/build/call-workflows-from-pages/) ", "char_start": 14280, "char_end": 15080, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "d480771adba95e00", "doc_id": "workflows/build/workers-api.md", "text": "`fetch()` call.\n\nVisit the documentation on [calling Workflows from Pages](/workflows/build/call-workflows-from-pages/) for examples.\n\n### Cross-script calls\n\nYou can also bind to a Workflow that is defined in a different Worker script from the script your Workflow definition is in. To do this, provide the `script_name` key with the name of the script to the `[[workflows]]` binding definition in your Wrangler configuration.\n\nFor example, if your Workflow is defined in a Worker script named `billing-worker`, but you are calling it from your `web-api-worker` script, your [Wrangler configuration file](/workers/wrangler/configuration/) would resemble the following:\n\n\n\n```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"web-api-worker\",\n\t\"main\": \"src/i", "char_start": 14960, "char_end": 15760, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "e02c03cb355ae724", "doc_id": "workflows/build/workers-api.md", "text": "Config>\n\n```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"web-api-worker\",\n\t\"main\": \"src/index.ts\",\n\t\"compatibility_date\": \"$today\",\n\t\"workflows\": [\n\t\t{\n\t\t\t// name of your workflow\n\t\t\t\"name\": \"billing-workflow\",\n\t\t\t// binding name env.MY_WORKFLOW\n\t\t\t\"binding\": \"MY_WORKFLOW\",\n\t\t\t// this is class that extends the Workflow class in src/index.ts\n\t\t\t\"class_name\": \"MyWorkflow\",\n\t\t\t// the script name where the Workflow is defined.\n\t\t\t// required if the Workflow is defined in another script.\n\t\t\t\"script_name\": \"billing-worker\",\n\t\t},\n\t],\n}\n```\n\n\n\n\n\n## Workflow\n\n:::note\n\nEnsure you have a compatibility date `2024-10-22` or later installed when binding to Workflows from within a Workers project.\n\n:::\n\nTh", "char_start": 15640, "char_end": 16440, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "c5593f58d2a93d96", "doc_id": "workflows/build/workers-api.md", "text": "e a compatibility date `2024-10-22` or later installed when binding to Workflows from within a Workers project.\n\n:::\n\nThe `Workflow` type provides methods that allow you to create, inspect the status, and manage running Workflow instances from within a Worker script.\nIt is part of the generated types produced by [`wrangler types`](/workers/wrangler/commands/general/#types).\n\n```ts title=\"./worker-configuration.d.ts\"\ninterface Env {\n\t// The 'MY_WORKFLOW' variable should match the \"binding\" value set in the Wrangler config file\n\tMY_WORKFLOW: Workflow;\n}\n```\n\nThe `Workflow` type exports the following methods:\n\n### create\n\nCreate (trigger) a new instance of the given Workflow.\n\n- create(options?: WorkflowInstanceCreateOptions): Promise<WorkflowInstance>\n - `options` - optio", "char_start": 16320, "char_end": 17120, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "b64ad3688940b45a", "doc_id": "workflows/build/workers-api.md", "text": ".\n\n- create(options?: WorkflowInstanceCreateOptions): Promise<WorkflowInstance>\n - `options` - optional properties to pass when creating an instance, including a user-provided ID and payload parameters.\n\nAn ID is automatically generated, but a user-provided ID can be specified (up to 100 characters [^1]). This can be useful when mapping Workflows to users, merchants or other identifiers in your system. You can also provide a JSON object as the `params` property, allowing you to pass data for the Workflow instance to act on as its [`WorkflowEvent`](/workflows/build/events-and-parameters/).\n\n```ts\n// Create a new Workflow instance with your own ID and pass params to the Workflow instance\nlet instance = await env.MY_WORKFLOW.create({\n\tid: myIdDefinedFromOtherSystem,\n\tparam", "char_start": 17000, "char_end": 17800, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "8ccdf5e961729b12", "doc_id": "workflows/build/workers-api.md", "text": "ss params to the Workflow instance\nlet instance = await env.MY_WORKFLOW.create({\n\tid: myIdDefinedFromOtherSystem,\n\tparams: { hello: \"world\" },\n});\nreturn Response.json({\n\tid: instance.id,\n\tdetails: await instance.status(),\n});\n```\n\nReturns a `WorkflowInstance`.\n\nThrows an error if the provided ID is already used by an existing instance that has not yet passed its [retention limit](/workflows/reference/limits/). To re-run a workflow with the same ID, you can [`restart`](/workflows/build/trigger-workflows/#restart-a-workflow) the existing instance.\n\n\n\nTo provide an optional type parameter to the `Workflow`, pass a type argument with your type when defining your Workflow bindings:\n\n```ts\ninterface User {\n\temail: string;\n\tcreatedTi", "char_start": 17680, "char_end": 18480, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "6bdd34a4e262284a", "doc_id": "workflows/build/workers-api.md", "text": " a type argument with your type when defining your Workflow bindings:\n\n```ts\ninterface User {\n\temail: string;\n\tcreatedTimestamp: number;\n}\n\ninterface Env {\n\t// Pass our User type as the type parameter to the Workflow definition\n MY_WORKFLOW: Workflow;\n}\n\nexport default {\n\tasync fetch(request, env, ctx) {\n\t\t// More likely to come from your database or via the request body!\n\t\tconst user: User = {\n\t\t\temail: user@example.com,\n\t\t\tcreatedTimestamp: Date.now()\n\t\t}\n\n\t\tlet instance = await env.MY_WORKFLOW.create({\n\t\t\t// params expects the type User\n\t\t\tparams: user\n\t\t})\n\n\t\treturn Response.json({\n\t\t\tid: instance.id,\n\t\t\tdetails: await instance.status(),\n\t\t});\n\t}\n}\n```\n\n### createBatch\n\nCreate (trigger) a batch of new instance of the given Workflow, up to 100 instances at a time.\n\nThis is useful", "char_start": 18360, "char_end": 19160, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "83449eb54b15af21", "doc_id": "workflows/build/workers-api.md", "text": "ateBatch\n\nCreate (trigger) a batch of new instance of the given Workflow, up to 100 instances at a time.\n\nThis is useful when you are scheduling multiple instances at once. A call to `createBatch` is treated the same as a call to `create` (for a single instance) and allows you to work within the [instance creation limit](/workflows/reference/limits/).\n\n- createBatch(batch: WorkflowInstanceCreateOptions[]): Promise<WorkflowInstance[]>\n - `batch` - list of Options to pass when creating an instance, including a user-provided ID and payload parameters.\n\nEach element of the `batch` list is expected to include both `id` and `params` properties:\n\n```ts\n// Create a new batch of 3 Workflow instances, each with its own ID and pass params to the Workflow instances\nconst listOfInst", "char_start": 19040, "char_end": 19840, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "4bda3cd880ac2989", "doc_id": "workflows/build/workers-api.md", "text": "ate a new batch of 3 Workflow instances, each with its own ID and pass params to the Workflow instances\nconst listOfInstances = [\n\t{ id: \"id-abc123\", params: { hello: \"world-0\" } },\n\t{ id: \"id-def456\", params: { hello: \"world-1\" } },\n\t{ id: \"id-ghi789\", params: { hello: \"world-2\" } },\n];\nlet instances = await env.MY_WORKFLOW.createBatch(listOfInstances);\n```\n\nReturns an array of `WorkflowInstance`.\n\nUnlike [`create`](/workflows/build/workers-api/#create), this operation is idempotent and will not fail if an ID is already in use. If an existing instance with the same ID is still within its [retention limit](/workflows/reference/limits/), it will be skipped and excluded from the returned array.\n\n### get\n\nGet a specific Workflow instance by ID.\n\n- get(id: string): Promise<WorkflowIns", "char_start": 19720, "char_end": 20520, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "1c868be40e15610d", "doc_id": "workflows/build/workers-api.md", "text": "m the returned array.\n\n### get\n\nGet a specific Workflow instance by ID.\n\n- get(id: string): Promise<WorkflowInstance>- `id` - the ID\n of the Workflow instance.\n\nReturns a `WorkflowInstance`. Throws an exception if the instance ID does not exist.\n\n```ts\n// Fetch an existing Workflow instance by ID:\ntry {\n\tlet instance = await env.MY_WORKFLOW.get(id);\n\treturn Response.json({\n\t\tid: instance.id,\n\t\tdetails: await instance.status(),\n\t});\n} catch (e: any) {\n\t// Handle errors\n\t// .get will throw an exception if the ID doesn't exist or is invalid.\n\tconst msg = `failed to get instance ${id}: ${e.message}`;\n\tconsole.error(msg);\n\treturn Response.json({ error: msg }, { status: 400 });\n}\n```\n\n## WorkflowInstanceCreateOptions\n\nOptional properties to pass when creating an instance.\n\n``", "char_start": 20400, "char_end": 21200, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "8e88c327d057d2bf", "doc_id": "workflows/build/workers-api.md", "text": "}, { status: 400 });\n}\n```\n\n## WorkflowInstanceCreateOptions\n\nOptional properties to pass when creating an instance.\n\n```ts\ninterface WorkflowInstanceCreateOptions {\n\t/**\n\t * An id for your Workflow instance. Must be unique within the Workflow.\n\t */\n\tid?: string;\n\t/**\n\t * The event payload the Workflow instance is triggered with\n\t */\n\tparams?: unknown;\n\t/**\n\t * The retention policy for the Workflow instance.\n\t * Defaults to the maximum retention period available for the owner's account.\n\t */\n\tretention?: {\n\t\t/**\n\t\t * How long to retain instance state after the Workflow completes successfully.\n\t\t */\n\t\tsuccessRetention?: WorkflowRetentionDuration;\n\t\t/**\n\t\t * How long to retain instance state after the Workflow ends in an errored or terminated state.\n\t\t */\n\t\terrorRetention?: WorkflowRetention", "char_start": 21080, "char_end": 21880, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "14328df4561bb84d", "doc_id": "workflows/build/workers-api.md", "text": "ain instance state after the Workflow ends in an errored or terminated state.\n\t\t */\n\t\terrorRetention?: WorkflowRetentionDuration;\n\t};\n}\n\ntype WorkflowRetentionDuration = WorkflowSleepDuration;\n```\n\nIf `retention` is not set, instance state is retained for the maximum retention period available on your account (3 days on the Workers Free plan, 30 days on the Workers Paid plan). Refer to the [retention limit](/workflows/reference/limits/) for more information.\n\nThe following example creates an instance that retains state for 1 day after success and 7 days after an error:\n\n```ts\nlet instance = await env.MY_WORKFLOW.create({\n\tid: myIdDefinedFromOtherSystem,\n\tparams: { hello: \"world\" },\n\tretention: {\n\t\tsuccessRetention: \"1 day\",\n\t\terrorRetention: \"7 days\",\n\t},\n});\n```\n\n## WorkflowInstance\n\nRepr", "char_start": 21760, "char_end": 22560, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "32ff9eb30fc4981e", "doc_id": "workflows/build/workers-api.md", "text": "\"world\" },\n\tretention: {\n\t\tsuccessRetention: \"1 day\",\n\t\terrorRetention: \"7 days\",\n\t},\n});\n```\n\n## WorkflowInstance\n\nRepresents a specific instance of a Workflow, and provides methods to manage the instance.\n\n```ts\ndeclare abstract class WorkflowInstance {\n\tpublic id: string;\n\t/**\n\t * Pause the instance.\n\t */\n\tpublic pause(): Promise;\n\t/**\n\t * Resume the instance. If it is already running, an error will be thrown.\n\t */\n\tpublic resume(): Promise;\n\t/**\n\t * Terminate the instance. If it is errored, terminated or complete, an error will be thrown.\n\t */\n\tpublic terminate(options?: WorkflowInstanceTerminateOptions): Promise;\n\t/**\n\t * Restart the instance from the beginning, or from a specific step.\n\t */\n\tpublic restart(options?: WorkflowInstanceRestartOptions): Promise;\n\t/", "char_start": 22440, "char_end": 23240, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "2ed572a5b51156ce", "doc_id": "workflows/build/workers-api.md", "text": "he beginning, or from a specific step.\n\t */\n\tpublic restart(options?: WorkflowInstanceRestartOptions): Promise;\n\t/**\n\t * Returns the current status of the instance.\n\t */\n\tpublic status(): Promise;\n}\n```\n\n### id\n\nReturn the id of a Workflow.\n\n- id: string\n\n### status\n\nReturn the status of a running Workflow instance.\n\n- status(): Promise<InstanceStatus>\n\n### pause\n\nPause a running Workflow instance.\n\n- pause(): Promise<void>\n\n### resume\n\nResume a paused Workflow instance.\n\n- resume(): Promise<void>\n\n### restart\n\nRestart a Workflow instance from the beginning, or from a specific step.\n\n- restart(options?: WorkflowInstanceRestartOptions): Promise<void>\n - `options` - optional proper", "char_start": 23120, "char_end": 23920, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "042fcb41242a7cb6", "doc_id": "workflows/build/workers-api.md", "text": ".\n\n- restart(options?: WorkflowInstanceRestartOptions): Promise<void>\n - `options` - optional properties that control from where the instance restarts.\n\n```ts\nlet instance = await env.MY_WORKFLOW.get(\"abc-123\");\n\n// Restart the instance from the beginning.\nawait instance.restart();\n\n// Restart the instance from the step named \"aggregate\".\nawait instance.restart({ from: { name: \"aggregate\" } });\n\n// Restart the instance from the third call to a step named \"process\".\nawait instance.restart({ from: { name: \"process\", count: 3 } });\n```\n\nWhen restarting from a specific step, the cached results of every earlier step are reused, while the target step and any steps that follow it run again. The call throws an error if no step matching `from` is found in the instance's executio", "char_start": 23800, "char_end": 24600, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "ed5941df8e5c2237", "doc_id": "workflows/build/workers-api.md", "text": " steps that follow it run again. The call throws an error if no step matching `from` is found in the instance's execution history.\n\n#### WorkflowInstanceRestartOptions\n\n```ts\ninterface WorkflowInstanceRestartOptions {\n\t/**\n\t * The step to restart the instance from.\n\t * If omitted, the instance restarts from the beginning.\n\t */\n\tfrom?: {\n\t\t/**\n\t\t * The name of the step.\n\t\t */\n\t\tname: string;\n\t\t/**\n\t\t * The 1-based index of the step, used when multiple steps share the same name and type. Defaults to 1 (the first occurrence).\n\t\t */\n\t\tcount?: number;\n\t\t/**\n\t\t * The step type. Use this to disambiguate when the same name is shared across step types. Defaults to \"do\".\n\t\t */\n\t\ttype?: \"do\" | \"sleep\" | \"waitForEvent\";\n\t};\n}\n```\n\nThe `from` object identifies the step to restart from. Only `name` is r", "char_start": 24480, "char_end": 25280, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "9c34e927a8add970", "doc_id": "workflows/build/workers-api.md", "text": "pe?: \"do\" | \"sleep\" | \"waitForEvent\";\n\t};\n}\n```\n\nThe `from` object identifies the step to restart from. Only `name` is required; `count` and `type` are only needed when the same step name appears more than once in the run.\n\n- `name` - the name of the step.\n- `count` - the 1-based index of the step, used when multiple steps share the same name and type (for example, inside a loop). Defaults to `1` (the first occurrence). Corresponds to `step.count` in the [step context](/workflows/build/step-context/).\n- `type` - the step type (`\"do\"`, `\"sleep\"`, or `\"waitForEvent\"`). Defaults to `\"do\"`. Use this when the same name is shared across different step types.\n\n### terminate\n\nTerminate a Workflow instance.\n\n- terminate(options?: WorkflowInstanceTerminateOptions): Promise<void>\n ", "char_start": 25160, "char_end": 25960, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "329c2239b4d2d98c", "doc_id": "workflows/build/workers-api.md", "text": "minate a Workflow instance.\n\n- terminate(options?: WorkflowInstanceTerminateOptions): Promise<void>\n - `options` - optional properties that control how the instance is terminated.\n\n```ts\nlet instance = await env.MY_WORKFLOW.get(\"abc-123\");\n\n// Terminate without running rollback handlers.\nawait instance.terminate();\n\n// Run registered rollback handlers before terminating.\nawait instance.terminate({ rollback: true });\n```\n\nIf `rollback` is `true`, Workflows runs the rollback handlers registered by completed or eligible steps before the instance reaches the `terminated` state. Steps without rollback handlers are skipped.\n\n#### WorkflowInstanceTerminateOptions\n\n```ts\ninterface WorkflowInstanceTerminateOptions {\n\t/**\n\t * If true, run registered rollback handlers before termi", "char_start": 25840, "char_end": 26640, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "43d6ac12e2e24fb6", "doc_id": "workflows/build/workers-api.md", "text": "ions\n\n```ts\ninterface WorkflowInstanceTerminateOptions {\n\t/**\n\t * If true, run registered rollback handlers before terminating the instance.\n\t */\n\trollback?: boolean;\n}\n```\n\n### sendEvent\n\n[Send an event](/workflows/build/events-and-parameters/) to a running Workflow instance.\n\n- sendEvent(): Promise<void>- `options` - the event `type`\n (up to 100 characters [^1]) and `payload` to send to the Workflow instance.\n The `type` must match the `type` in the corresponding `waitForEvent` call in\n your Workflow.\n\nReturn `void` on success; throws an exception if the Workflow is not running or is an errored state.\n\n\n\n```ts\nexport default {\n\tasync fetch(req: Request, env: Env) {\n\t\tconst instanceId = new URL(req.url).searchParams.get(\"instanceId\");\n\t\tconst webho", "char_start": 26520, "char_end": 27320, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "82ec327da05ebbac", "doc_id": "workflows/build/workers-api.md", "text": "sync fetch(req: Request, env: Env) {\n\t\tconst instanceId = new URL(req.url).searchParams.get(\"instanceId\");\n\t\tconst webhookPayload = await req.json();\n\n\t\tlet instance = await env.MY_WORKFLOW.get(instanceId);\n\t\t// Send our event, with `type` matching the event type defined in\n\t\t// our step.waitForEvent call\n\t\tawait instance.sendEvent({\n\t\t\ttype: \"stripe-webhook\",\n\t\t\tpayload: webhookPayload,\n\t\t});\n\n\t\treturn Response.json({\n\t\t\tstatus: await instance.status(),\n\t\t});\n\t},\n};\n```\n\n\n\nYou can call `sendEvent` multiple times, setting the value of the `type` property to match the specific `waitForEvent` calls in your Workflow.\n\nThis allows you to wait for multiple events at once, or use `Promise.race` to wait for multiple events and allow the first event to progress the Wor", "char_start": 27200, "char_end": 28000, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "c7f1ad1fa93bb92b", "doc_id": "workflows/build/workers-api.md", "text": "multiple events at once, or use `Promise.race` to wait for multiple events and allow the first event to progress the Workflow.\n\n### InstanceStatus\n\nDetails the status of a Workflow instance.\n\n```ts\ntype InstanceStatus = {\n\tstatus:\n\t\t| \"queued\" // means that instance is waiting to be started (see concurrency limits)\n\t\t| \"running\"\n\t\t| \"paused\"\n\t\t| \"errored\"\n\t\t| \"terminated\" // user terminated the instance while it was running\n\t\t| \"complete\"\n\t\t| \"waiting\" // instance is hibernating and waiting for sleep or event to finish\n\t\t| \"waitingForPause\" // instance is finishing the current work to pause\n\t\t| \"unknown\";\n\terror?: {\n\t\tname: string;\n\t\tmessage: string;\n\t};\n\toutput?: unknown;\n\trollback: {\n\t\toutcome: \"complete\" | \"failed\";\n\t\terror: {\n\t\t\tname: string;\n\t\t\tmessage: string;\n\t\t} | null;\n\t} | null;\n", "char_start": 27880, "char_end": 28680, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "7b3c70860c266c28", "doc_id": "workflows/build/workers-api.md", "text": ";\n\trollback: {\n\t\toutcome: \"complete\" | \"failed\";\n\t\terror: {\n\t\t\tname: string;\n\t\t\tmessage: string;\n\t\t} | null;\n\t} | null;\n};\n```\n\nIf a Workflow enters rollback, the Workers API continues to report `status: \"running\"` for compatibility while the rollback is executing. After the instance reaches a terminal state, inspect `rollback` to determine whether compensating steps completed successfully or failed.\n\n[^1]: Match pattern: `^[a-zA-Z0-9_][a-zA-Z0-9-_]*$`\n", "char_start": 28560, "char_end": 29017, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "458b86ae861fb6f6", "doc_id": "workflows/get-started/guide.md", "text": "---\ntitle: Build your first Workflow\ndescription: Create and deploy your first Cloudflare Workflow with durable, multi-step execution on the Workers platform.\npcx_content_type: get-started\nsidebar:\n order: 1\nproducts:\n - workflows\n---\n\nimport {\n\tDetails,\n\tLinkCard,\n\tRender,\n\tPackageManagers,\n\tWranglerConfig,\n\tSteps,\n} from \"~/components\";\n\nWorkflows allow you to build durable, multi-step applications using the Workers platform. A Workflow can automatically retry, persist state, run for hours or days, and coordinate between third-party APIs.\n\nYou can build Workflows to post-process file uploads to [R2 object storage](/r2/), automate generation of [Workers AI](/workers-ai/) embeddings into a [Vectorize](/vectorize/) vector database, or to trigger user lifecycle emails using [Email Service]", "char_start": 0, "char_end": 800, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "c4f132e414ca5a3b", "doc_id": "workflows/get-started/guide.md", "text": "/) embeddings into a [Vectorize](/vectorize/) vector database, or to trigger user lifecycle emails using [Email Service](/email-service/).\n\n:::note\nThe term \"Durable Execution\" is widely used to describe this programming model.\n\n\"Durable\" describes the ability of the program to implicitly persist state without you having to manually write to an external store or serialize program state.\n:::\n\nIn this guide, you will create and deploy a Workflow that fetches data, pauses, and processes results.\n\n## Quick start\n\nIf you want to skip the steps and pull down the complete Workflow we are building in this guide, run:\n\n```sh\nnpm create cloudflare@latest workflows-starter -- --template \"cloudflare/workflows-starter\"\n```\n\nUse this option if you are familiar with Cloudflare Workers or want to explore ", "char_start": 680, "char_end": 1480, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "4e492ca9087eb4e4", "doc_id": "workflows/get-started/guide.md", "text": "late \"cloudflare/workflows-starter\"\n```\n\nUse this option if you are familiar with Cloudflare Workers or want to explore the code first and learn the details later.\n\nFollow the steps below to learn how to build a Workflow from scratch.\n\n## Prerequisites\n\n\n\n## 1. Create a new Worker project\n\n\n\n1. Open a terminal and run the `create cloudflare` (C3) CLI tool to create your Worker project:\n\n \n\n \n\n2. Move into your new project directory:\n\n ```sh\n cd my-workflow\n ```\n\n
\n\n2. Move into your new project directory:\n\n ```sh\n cd my-workflow\n ```\n\n
\n\n In your project directory, C3 will have generated the following:\n - `wrangler.jsonc`: Your [Wrangler configuration file](/workers/wrangler/configuration/#sample-wrangler-configuration).\n - `src/index.ts`: A minimal Worker written in TypeScript.\n - `package.json`: A minimal Node dependencies configuration file.\n - `tsconfig.json`: TypeScript configuration.\n\n
\n\n\n\n## 2. Write your Workflow\n\n\n\n1. Create a new file `src/workflow.ts`:\n\n ```ts title=\"src/workflow.ts\"\n import { WorkflowEntrypoint, WorkflowStep } from \"cloudflare:workers\";\n import type { WorkflowEvent } from \"cloudflare:workers\";\n\n ty", "char_start": 2040, "char_end": 2840, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "73c574ea688900dc", "doc_id": "workflows/get-started/guide.md", "text": "Entrypoint, WorkflowStep } from \"cloudflare:workers\";\n import type { WorkflowEvent } from \"cloudflare:workers\";\n\n type Params = { name?: string };\n type IPResponse = { result: { ipv4_cidrs: string[] } };\n\n export class MyWorkflow extends WorkflowEntrypoint {\n \tasync run(event: WorkflowEvent, step: WorkflowStep) {\n \t\tconst data = await step.do(\"fetch data\", async () => {\n \t\t\tconst response = await fetch(\n \t\t\t\t\"https://api.cloudflare.com/client/v4/ips\",\n \t\t\t);\n \t\t\treturn await response.json();\n \t\t});\n\n \t\tawait step.sleep(\"pause\", \"20 seconds\");\n\n \t\tconst result = await step.do(\n \t\t\t\"process data\",\n \t\t\t{ retries: { limit: 3, delay: \"5 seconds\", backoff: \"linear\" } },\n \t\t\tasync () => {\n \t\t\t\treturn {\n \t\t\t\t\tname: event.payload.", "char_start": 2720, "char_end": 3520, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "8639beee99cbaa8f", "doc_id": "workflows/get-started/guide.md", "text": " { limit: 3, delay: \"5 seconds\", backoff: \"linear\" } },\n \t\t\tasync () => {\n \t\t\t\treturn {\n \t\t\t\t\tname: event.payload.name ?? \"World\",\n \t\t\t\t\tipCount: data.result.ipv4_cidrs.length,\n \t\t\t\t};\n \t\t\t},\n \t\t);\n\n \t\treturn result;\n \t}\n }\n ```\n\n A Workflow extends `WorkflowEntrypoint` and implements a `run` method. This code also passes in our `Params` type as a [type parameter](/workflows/build/events-and-parameters/) so that events that trigger our Workflow are typed.\n\n The [`step`](/workflows/build/workers-api/#step) object is the core of the Workflows API. It provides methods to define durable steps in your Workflow:\n - `step.do(name, callback)` - Executes code and persists the result. If the Workflow is interrupted or retried, it resumes from the last successful step rath", "char_start": 3400, "char_end": 4200, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "fb97bb18c04313c3", "doc_id": "workflows/get-started/guide.md", "text": "s code and persists the result. If the Workflow is interrupted or retried, it resumes from the last successful step rather than re-running completed work. The callback returns serializable data, including `ReadableStream` for large binary output in JavaScript Workflows.\n - `step.sleep(name, duration)` - Pauses the Workflow for a duration (for example, `\"10 seconds\"`, `\"1 hour\"`).\n\n If you return a stream, return a fresh, unlocked `ReadableStream`. BYOB streams and BYOB readers are not supported.\n\n You can pass a [retry configuration](/workflows/build/sleeping-and-retrying/) to `step.do()` to customize how failures are handled. See the [full step API](/workflows/build/workers-api/#step) for stream requirements, limits, and additional methods like `sleepUntil` a", "char_start": 4080, "char_end": 4880, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "be0639e73ba80ccc", "doc_id": "workflows/get-started/guide.md", "text": "tep API](/workflows/build/workers-api/#step) for stream requirements, limits, and additional methods like `sleepUntil` and `waitForEvent`.\n\n When deciding whether to break code into separate steps, ask yourself: \"Do I want all of this code to run again if just one part fails?\" Separate steps are ideal for operations like calling external APIs, querying databases, or reading files from storage - if a later step fails, your Workflow can retry from that point using data already fetched, avoiding redundant API calls or database queries.\n\n For more guidance on how to define your Workflow logic, refer to [Rules of Workflows](/workflows/build/rules-of-workflows/).\n\n\n\n## 3. Configure your Workflow\n\n\n\n1. Open `wrangler.jsonc`, which is your [Wrangler configuration file](/workers/", "char_start": 4760, "char_end": 5560, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "958dcab6f49444f4", "doc_id": "workflows/get-started/guide.md", "text": "\n## 3. Configure your Workflow\n\n\n\n1. Open `wrangler.jsonc`, which is your [Wrangler configuration file](/workers/wrangler/configuration/) for your Workers project and your Workflow, and add the `workflows` configuration:\n\n \n\n ```json title=\"wrangler.jsonc\"\n {\n \t\"$schema\": \"node_modules/wrangler/config-schema.json\",\n \t\"name\": \"my-workflow\",\n \t\"main\": \"src/index.ts\",\n \t\"compatibility_date\": \"$today\",\n \t\"observability\": {\n \t\t\"enabled\": true\n \t},\n \t\"workflows\": [\n \t\t{\n \t\t\t\"name\": \"my-workflow\",\n \t\t\t\"binding\": \"MY_WORKFLOW\",\n \t\t\t\"class_name\": \"MyWorkflow\"\n \t\t}\n \t]\n }\n ```\n\n \n\n The `class_name` must match your exported class, and `binding` is the variable name you use to access the Workflow in your code (like `en", "char_start": 5440, "char_end": 6240, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "dcd0e22802aaaf99", "doc_id": "workflows/get-started/guide.md", "text": "must match your exported class, and `binding` is the variable name you use to access the Workflow in your code (like `env.MY_WORKFLOW`).\n\n If you want the same Workflow to run automatically on a recurring interval, add `schedules` to the Workflow definition:\n\n \n\n ```jsonc\n {\n \"$schema\": \"node_modules/wrangler/config-schema.json\",\n \"name\": \"my-workflow\",\n \"main\": \"src/index.ts\",\n \"compatibility_date\": \"$today\",\n \"workflows\": [\n {\n \"name\": \"my-workflow\",\n \"binding\": \"MY_WORKFLOW\",\n \"class_name\": \"MyWorkflow\",\n \"schedules\": [\"0 * * * *\"]\n }\n ]\n }\n ```\n\n \n\n Each matching cron expression creates a new Workflow instance automatically, so you do not need top-lev", "char_start": 6120, "char_end": 6920, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "53c4d76dfc6ee2dc", "doc_id": "workflows/get-started/guide.md", "text": "glerConfig>\n\n Each matching cron expression creates a new Workflow instance automatically, so you do not need top-level `triggers.crons` and a separate `scheduled` handler for Workflow-specific recurring runs.\n\n Scheduled instances include the matching cron expression and scheduled trigger time on `event.schedule`.\n\n Use the latest Wrangler release when configuring Workflow schedules. If your local Wrangler schema does not recognize `schedules` yet, update Wrangler before deploying.\n\n You can also access [bindings](/workers/runtime-apis/bindings/) (such as [KV](/kv/), [R2](/r2/), or [D1](/d1/)) via `this.env` within your Workflow. For more information on bindings within Workers, refer to [Bindings (env)](/workers/runtime-apis/bindings/).\n\n2. Now, generate types for your binding", "char_start": 6800, "char_end": 7600, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "f1918db1a445331e", "doc_id": "workflows/get-started/guide.md", "text": "ngs within Workers, refer to [Bindings (env)](/workers/runtime-apis/bindings/).\n\n2. Now, generate types for your bindings:\n\n ```sh\n npx wrangler types\n ```\n\n This creates a `worker-configuration.d.ts` file with the `Env` type that includes your `MY_WORKFLOW` binding.\n\n\n\n## 4. Write your API\n\nNow, you'll need a place to call your Workflow.\n\n\n\n1. Replace `src/index.ts` with a [fetch handler](/workers/runtime-apis/handlers/fetch/) to start and check Workflow instances:\n\n ```ts title=\"src/index.ts\"\n export { MyWorkflow } from \"./workflow\";\n\n export default {\n \tasync fetch(request: Request, env: Env): Promise {\n \t\tconst url = new URL(request.url);\n \t\tconst instanceId = url.searchParams.get(\"instanceId\");\n\n \t\tif (instanceId) {\n \t\t\tconst instance =", "char_start": 7480, "char_end": 8280, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "bd6f4bf025a368a1", "doc_id": "workflows/get-started/guide.md", "text": "request.url);\n \t\tconst instanceId = url.searchParams.get(\"instanceId\");\n\n \t\tif (instanceId) {\n \t\t\tconst instance = await env.MY_WORKFLOW.get(instanceId);\n \t\t\treturn Response.json(await instance.status());\n \t\t}\n\n \t\tconst instance = await env.MY_WORKFLOW.create();\n \t\treturn Response.json({ instanceId: instance.id });\n \t},\n } satisfies ExportedHandler;\n ```\n\n\n\n## 5. Develop locally\n\n\n\n1. Start a local development server:\n\n ```sh\n npx wrangler dev\n ```\n\n2. To start a Workflow instance, open a new terminal window and run:\n\n ```sh\n curl http://localhost:8787\n ```\n\n An `instanceId` will be automatically generated:\n\n ```json output\n { \"instanceId\": \"abc-123-def\" }\n ```\n\n3. Check the status using the returned `instanceId`:\n\n ```sh\n cur", "char_start": 8160, "char_end": 8960, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "9b05d4a530fd5932", "doc_id": "workflows/get-started/guide.md", "text": " output\n { \"instanceId\": \"abc-123-def\" }\n ```\n\n3. Check the status using the returned `instanceId`:\n\n ```sh\n curl \"http://localhost:8787?instanceId=abc-123-def\"\n ```\n\n The Workflow will progress through its steps. After about 20 seconds (the sleep duration), it will complete.\n\n\n\n## 6. Deploy your Workflow\n\n\n\n1. Deploy your Workflow:\n\n ```sh\n npx wrangler deploy\n ```\n\n Test in production using the same curl commands against your deployed URL. You can also [trigger a workflow instance](/workflows/build/trigger-workflows/) in production via Workers, Wrangler, or the Cloudflare dashboard.\n\n Once deployed, you can also inspect Workflow instances with the CLI:\n\n ```sh\n npx wrangler workflows instances describe my-workflow latest\n ```\n\n The output of `", "char_start": 8840, "char_end": 9640, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "1a4bd125426a6431", "doc_id": "workflows/get-started/guide.md", "text": "ances with the CLI:\n\n ```sh\n npx wrangler workflows instances describe my-workflow latest\n ```\n\n The output of `instances describe` shows:\n - The status (success, failure, running) of each step\n - Any state emitted by the step. For streamed output, the CLI shows a preview or summary instead of the full contents.\n - Any `sleep` state, including when the Workflow will wake up\n - Retries associated with each step\n - Errors, including exception messages\n\n\n\n## Learn more\n\n\n\n\n\n\n\n\n", "char_start": 10200, "char_end": 10650, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "fd0245ce37415a1a", "doc_id": "workflows/index.md", "text": "---\ntitle: Cloudflare Workflows\ndescription: Build durable, multi-step applications on Cloudflare Workers that automatically retry and persist state.\norder: 0\npcx_content_type: overview\nsidebar:\n order: 1\nhead:\n - tag: title\n content: Overview\nproducts:\n - workflows\n---\n\nimport { AnimatedWorkflowDiagram, CardGrid, Description, Feature, Flex, LinkTitleCard, Plan, RelatedProduct, Tabs, TabItem, LinkButton } from \"~/components\"\n\n\n\nBuild durable multi-step applications on Cloudflare Workers with Workflows.\n\n\n\n\n\nWith Workflows, you can build applications that chain together multiple steps, automatically retry failed tasks,\nand persist state for minutes, hours, or even weeks - with no infrastructure to manage.\n\nUse Workflows to build re", "char_start": 0, "char_end": 800, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workflows/index.md", "format": "markdown", "raw_hash": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297"}} +{"chunk_id": "a748d3211d2b8cb9", "doc_id": "workflows/index.md", "text": "asks,\nand persist state for minutes, hours, or even weeks - with no infrastructure to manage.\n\nUse Workflows to build reliable AI applications, process data pipelines, manage user lifecycle with automated emails and trial expirations, and implement human-in-the-loop approval systems.\n\n\n
\n\n\n\n
\n
\n\n**Workfl", "char_start": 680, "char_end": 1480, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workflows/index.md", "format": "markdown", "raw_hash": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297"}} +{"chunk_id": "1d7823f082e87ba3", "doc_id": "workflows/index.md", "text": ": '2s' }\n\t]}\n\tautoPlay={true}\n\tloop={true}\n/>\n\n
\n
\n\n**Workflows give you:**\n\n- Durable multi-step execution without timeouts\n- The ability to pause for external events or approvals\n- Automatic retries and error handling\n- Built-in observability and debugging\n\n
\n
\n\n## Example\n\nAn image processing workflow that fetches from R2, generates an AI description, waits for approval, then publishes:\n\n```ts\nexport class ImageProcessingWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\tconst imageData = await step.do('fetch image', async () => {\n\t\t\tconst object = await this.env.BUCKET.get(event.payload.imageKey);\n\t\t\treturn await object.arrayBuffer();\n\t\t});\n\n\t\tconst description = await ste", "char_start": 1360, "char_end": 2160, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workflows/index.md", "format": "markdown", "raw_hash": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297"}} +{"chunk_id": "ae040b73cfa51ace", "doc_id": "workflows/index.md", "text": "his.env.BUCKET.get(event.payload.imageKey);\n\t\t\treturn await object.arrayBuffer();\n\t\t});\n\n\t\tconst description = await step.do('generate description', async () => {\n\t\t\tconst imageArray = Array.from(new Uint8Array(imageData));\n\t\t\treturn await this.env.AI.run('@cf/llava-hf/llava-1.5-7b-hf', {\n\t\t\t\timage: imageArray,\n\t\t\t\tprompt: 'Describe this image in one sentence',\n\t\t\t\tmax_tokens: 50,\n\t\t\t});\n\t\t});\n\n\t\tawait step.waitForEvent('await approval', {\n\t\t\tevent: 'approved',\n\t\t\ttimeout: '24 hours',\n\t\t});\n\n\t\tawait step.do('publish', async () => {\n\t\t\tawait this.env.BUCKET.put(`public/${event.payload.imageKey}`, imageData);\n\t\t});\n\t}\n}\n```\n\n\n\tGet started\n\n\n\tBrowse the examples\n\n\n\tBrowse the examples\n\n\n***\n\n## Features\n\n\n\nBreak complex operations into durable steps with automatic retries and error handling.\n\n\n\n\n\nPause workflows for seconds, hours, or days with `step.sleep()` and `step.sleepUntil()`.\n\n\n\n\n\nWait for webhooks, user input, or external system responses before continuing execution.\n\n\n\n\n\n\n\nTrigger, pause, resume, and terminate workflow instances programmatically or via API.\n\n\n\n***\n\n## Related products\n\n\n\nBuild serverless applications and deploy instantly across the globe for exceptional performance, reliability, and scale.\n\n\n\n\n\n\nDeploy dynamic front-end applications in record time.\n\n\n\n\n***\n\n## More resources\n\n\n\n\n\n\nLearn more about how Workflows is priced.\n\n\n\nLearn more about Workflow limits, and how to work within them.\n\n\n\nLearn more about the storage and database options you can build on with Workers.\n\n\n\nConnect with the Workers community on Discord to ask questions, show what you are building, and discuss the platform with other developers.\n\n\n\n\n\nFollow @CloudflareDev on Twitter to learn about product announcements, and what is new in Cloudflare Developer Platform.\n\n\n\n", "char_start": 4760, "char_end": 5115, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workflows/index.md", "format": "markdown", "raw_hash": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297"}} diff --git a/assets/seed/v2/indexes/cloudflare-state-fixed-v1/embeddings.npz b/assets/seed/v2/indexes/cloudflare-state-fixed-v1/embeddings.npz new file mode 100644 index 0000000000000000000000000000000000000000..87b70208e77abeb748cbcccd6bbc62a99fd27570 GIT binary patch literal 835724 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 +!+D5Tc1rItN63q*sEBYw+vj2xq0a#bu#UT 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©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%0An2nl{13C|u+OZW8)3## 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

+St*;FQsCGF4WF_TYCBdN#JpkqNU&)m9_&dzW| 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

#w;y}_JuN;Z0(9p=>LgH1z2Aq^vr5x2a4nw} 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 literal 0 HcmV?d00001 diff --git a/assets/seed/v2/indexes/cloudflare-state-fixed-v1/manifest.json b/assets/seed/v2/indexes/cloudflare-state-fixed-v1/manifest.json new file mode 100644 index 0000000..6e22a81 --- /dev/null +++ b/assets/seed/v2/indexes/cloudflare-state-fixed-v1/manifest.json @@ -0,0 +1,221 @@ +{ + "schema_version": "2.0", + "corpus_root": "/data/corpora/cloudflare-state-v1/files", + "created_at": "2026-07-13T14:41:54.959755+00:00", + "document_count": 40, + "chunk_count": 522, + "chunk_size": 800, + "chunk_overlap": 120, + "chunking_strategy": "fixed_character", + "chunking_params": {}, + "index_backend": "numpy", + "distance_metric": "cosine", + "backend_identity": "numpy", + "source_corpus_id": "cloudflare-state-v1", + "embedding_backend": "SentenceTransformerEmbedder", + "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + "embedding_revision": "1110a243fdf4706b3f48f1d95db1a4f5529b4d41", + "embedding_dim": 384, + "corpus_files": [ + { + "doc_id": "durable-objects/api/alarms.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", + "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f" + }, + { + "doc_id": "durable-objects/api/state.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", + "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5" + }, + { + "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", + "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518" + }, + { + "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", + "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9" + }, + { + "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", + "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126" + }, + { + "doc_id": "durable-objects/concepts/what-are-durable-objects.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", + "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25" + }, + { + "doc_id": "durable-objects/examples/build-a-counter.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", + "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4" + }, + { + "doc_id": "durable-objects/platform/storage-options.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/platform/storage-options.md", + "raw_hash": "33e8840fac344dafaf1d71dcbb6037a09674c1b004fbe840317e11db755fd98c" + }, + { + "doc_id": "kv/concepts/how-kv-works.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", + "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321" + }, + { + "doc_id": "kv/concepts/kv-bindings.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md", + "raw_hash": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78" + }, + { + "doc_id": "kv/concepts/kv-namespaces.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-namespaces.md", + "raw_hash": "2f64b8fb39ce55bc43d5a6f7e36d5af10e672f9e9ec64d1f1e918258ad7ddbfc" + }, + { + "doc_id": "kv/examples/cache-data-with-workers-kv.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", + "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87" + }, + { + "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", + "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc" + }, + { + "doc_id": "kv/index.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", + "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761" + }, + { + "doc_id": "queues/configuration/batching-retries.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", + "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce" + }, + { + "doc_id": "queues/configuration/consumer-concurrency.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", + "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08" + }, + { + "doc_id": "queues/examples/use-queues-with-durable-objects.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md", + "raw_hash": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288" + }, + { + "doc_id": "queues/get-started.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", + "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a" + }, + { + "doc_id": "queues/index.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/index.md", + "raw_hash": "7ca76e34b7712d7ea2fb558cd572d8994848a8e4cecfdf412ae59aa6082aa778" + }, + { + "doc_id": "queues/reference/delivery-guarantees.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/delivery-guarantees.md", + "raw_hash": "ed989b394791a8bf6c450e1f8f7fcfa3d13a0e1a4d43586a84edbe7087a2f222" + }, + { + "doc_id": "queues/reference/how-queues-works.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", + "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c" + }, + { + "doc_id": "r2/api/workers/workers-api-reference.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", + "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4" + }, + { + "doc_id": "r2/buckets/create-buckets.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/buckets/create-buckets.md", + "raw_hash": "fcb5cebd61d6e44db103ad8cbee20718ee6e48389ec3193ab5297216cce117ac" + }, + { + "doc_id": "r2/how-r2-works.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", + "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18" + }, + { + "doc_id": "r2/index.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/index.md", + "raw_hash": "7e6bac2d545167b29be0e3b51617553f991edc15c97276ee890bfeca1ee90560" + }, + { + "doc_id": "r2/reference/consistency.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", + "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf" + }, + { + "doc_id": "r2/reference/durability.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/durability.md", + "raw_hash": "4837c8a21782dd5eb6ba73f9faf2d44de5460c634aa525f363453cf2858835ba" + }, + { + "doc_id": "workers/get-started/guide.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", + "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8" + }, + { + "doc_id": "workers/index.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/index.md", + "raw_hash": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4" + }, + { + "doc_id": "workers/runtime-apis/bindings/R2.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/R2.md", + "raw_hash": "2841b8b9a51fa5f4c64c88594a815553940dee47a4188c159ceb45ee97117261" + }, + { + "doc_id": "workers/runtime-apis/bindings/durable-objects.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/durable-objects.md", + "raw_hash": "8529ae13ce8b7acbdca264566f3b019803c7b75debadeb5a51c51f380264520d" + }, + { + "doc_id": "workers/runtime-apis/bindings/kv.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/kv.md", + "raw_hash": "1a31963e5b0a455f49a7f1c36fc207bab7c71eac3d352d8ca5a14183d3f29f7e" + }, + { + "doc_id": "workers/runtime-apis/bindings/queues.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/queues.md", + "raw_hash": "baded9ebba0468d738474f49995b6cf8ee867ddb56af29ccb83656258a46703c" + }, + { + "doc_id": "workflows/build/rules-of-workflows.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", + "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821" + }, + { + "doc_id": "workflows/build/sleeping-and-retrying.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", + "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88" + }, + { + "doc_id": "workflows/build/step-context.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/step-context.md", + "raw_hash": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3" + }, + { + "doc_id": "workflows/build/trigger-workflows.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", + "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb" + }, + { + "doc_id": "workflows/build/workers-api.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", + "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535" + }, + { + "doc_id": "workflows/get-started/guide.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", + "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3" + }, + { + "doc_id": "workflows/index.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/index.md", + "raw_hash": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297" + } + ] +} diff --git a/assets/seed/v2/indexes/cloudflare-state-structural-v1/chunks.jsonl b/assets/seed/v2/indexes/cloudflare-state-structural-v1/chunks.jsonl new file mode 100644 index 0000000..54f75c0 --- /dev/null +++ b/assets/seed/v2/indexes/cloudflare-state-structural-v1/chunks.jsonl @@ -0,0 +1,537 @@ +{"chunk_id": "9646f8bd60d5b41d", "doc_id": "durable-objects/api/alarms.md", "text": "---\ntitle: Alarms\ndescription: Schedule future wake-ups for Durable Objects using the Alarms API with guaranteed at-least-once execution.\npcx_content_type: concept\nsidebar:\n order: 8\nproducts:\n - durable-objects\n---\n\nimport { Type, GlossaryTooltip, Tabs, TabItem } from \"~/components\";\n\n## Background\n\nDurable Objects alarms allow you to schedule the Durable Object to be woken up at a time in the future. When the alarm's scheduled time comes, the `alarm()` handler method will be called. Alarms are modified using the Storage API, and alarm operations follow the same rules as other storage operations.\n\nNotably:\n\n", "char_start": 0, "char_end": 672, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "9c481014141043b9", "doc_id": "durable-objects/api/alarms.md", "text": "- Each Durable Object is able to schedule a single alarm at a time by calling `setAlarm()`.\n- Alarms have guaranteed at-least-once execution and are retried automatically when the `alarm()` handler throws.\n- Retries are performed using exponential backoff starting at a 2 second delay from the first failure with up to 6 retries allowed.\n\n:::note[How are alarms different from Cron Triggers?]\n\nAlarms are more fine grained than [Cron Triggers](/workers/configuration/cron-triggers/). A Worker can have up to three Cron Triggers configured at once, but it can have an unlimited amount of Durable Objects, each of which can have an alarm set.\n\n", "char_start": 672, "char_end": 1314, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "031b9f2f5bd27cdd", "doc_id": "durable-objects/api/alarms.md", "text": "Alarms are directly scheduled from within your Durable Object. Cron Triggers, on the other hand, are not programmatic. [Cron Triggers](/workers/configuration/cron-triggers/) execute based on their schedules, which have to be configured through the Cloudflare dashboard or API.\n\n:::\n\nAlarms can be used to build distributed primitives, like queues or batching of work atop Durable Objects. Alarms also provide a mechanism to guarantee that operations within a Durable Object will complete without relying on incoming requests to keep the Durable Object alive. For a complete example, refer to [Use the Alarms API](/durable-objects/examples/alarms-api/).\n\n", "char_start": 1314, "char_end": 1968, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "933f90096b8dccf7", "doc_id": "durable-objects/api/alarms.md", "text": "## Scheduling multiple events with a single alarm\n\nAlthough each Durable Object can only have one alarm set at a time, you can manage many scheduled and recurring events by storing your event schedule in storage and having the `alarm()` handler process due events, then reschedule itself for the next one.\n\n```js\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport class AgentServer extends DurableObject {\n // Schedule a one-time or recurring event\n async scheduleEvent(id, runAt, repeatMs = null) {\n await this.ctx.storage.put(`event:${id}`, { id, runAt, repeatMs });\n const currentAlarm = await this.ctx.storage.getAlarm();\n if (!currentAlarm || runAt < currentAlarm) {\n await this.ctx.storage.setAlarm(runAt);\n }\n }\n\n", "char_start": 1968, "char_end": 2717, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "afb65df232f6f780", "doc_id": "durable-objects/api/alarms.md", "text": " async alarm() {\n const now = Date.now();\n const events = await this.ctx.storage.list({ prefix: \"event:\" });\n let nextAlarm = null;\n\n for (const [key, event] of events) {\n if (event.runAt <= now) {\n await this.processEvent(event);\n if (event.repeatMs) {\n event.runAt = now + event.repeatMs;\n await this.ctx.storage.put(key, event);\n } else {\n await this.ctx.storage.delete(key);\n }\n }\n // Track the next event time\n if (event.runAt > now && (!nextAlarm || event.runAt < nextAlarm)) {\n nextAlarm = event.runAt;\n }\n }\n\n if (nextAlarm) await this.ctx.storage.setAlarm(nextAlarm);\n }\n\n async processEvent(event) {\n // Your event handling logic here\n }\n}\n```\n\n", "char_start": 2717, "char_end": 3484, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "22eb37562253cd61", "doc_id": "durable-objects/api/alarms.md", "text": "## Storage methods\n\n### `getAlarm`\n\n- getAlarm(): \n\n - If there is an alarm set, then return the currently set alarm time as the number of milliseconds elapsed since the UNIX epoch. Otherwise, return `null`.\n\n - If `getAlarm` is called while an [`alarm`](/durable-objects/api/alarms/#alarm) is already running, it returns `null` unless `setAlarm` has also been called since the alarm handler started running.\n\n### `setAlarm`\n\n- setAlarm(scheduledTimeMs ) : \n\n - Set the time for the alarm to run. Specify the time as the number of milliseconds elapsed since the UNIX epoch.\n - If you call `setAlarm` when there is already one scheduled, it will override the existing alarm.\n\n", "char_start": 3484, "char_end": 4261, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "7a945dea18c64e17", "doc_id": "durable-objects/api/alarms.md", "text": ":::caution[Calling `setAlarm` inside the constructor]\nIf you wish to call `setAlarm` inside the constructor of a Durable Object, ensure that you are first checking whether an alarm has already been set.\n\nThis is due to the fact that, if the Durable Object wakes up after being inactive, the constructor is invoked before the [`alarm` handler](/durable-objects/api/alarms/#alarm). Therefore, if the constructor calls `setAlarm`, it could interfere with the next alarm which has already been set.\n:::\n\n### `deleteAlarm`\n\n- `deleteAlarm()`: \n\n - Unset the alarm if there is a currently set alarm.\n\n - Calling `deleteAlarm()` inside the `alarm()` handler may prevent retries on a best-effort basis, but is not guaranteed.\n\n", "char_start": 4261, "char_end": 5002, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "31176624a0aa1523", "doc_id": "durable-objects/api/alarms.md", "text": "## Handler methods\n\n### `alarm`\n\n- alarm(alarmInfo ): \n\n - Called by the system when a scheduled alarm time is reached.\n\n - The optional parameter `alarmInfo` object has two properties:\n\n - `retryCount` : The number of times this alarm event has been retried.\n - `isRetry` : A boolean value to indicate if the alarm has been retried. This value is `true` if this alarm event is a retry.\n\n", "char_start": 5002, "char_end": 5496, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "e1f9673666a8aeb0", "doc_id": "durable-objects/api/alarms.md", "text": " - Only one instance of `alarm()` will ever run at a given time per Durable Object instance.\n - The `alarm()` handler has guaranteed at-least-once execution and will be retried upon failure using exponential backoff, starting at 2 second delays for up to 6 retries. This only applies to the most recent `setAlarm()` call. Retries will be performed if the method fails with an uncaught exception.\n\n - This method can be `async`.\n\n:::note[Catching exceptions in alarm handlers]\n\n", "char_start": 5496, "char_end": 5976, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "69876eb2bc9801ed", "doc_id": "durable-objects/api/alarms.md", "text": "Because alarms are only retried up to 6 times on error, it's recommended to catch any exceptions inside your `alarm()` handler and schedule a new alarm before returning if you want to make sure your alarm handler will be retried indefinitely. Otherwise, a sufficiently long outage in a downstream service that you depend on or a bug in your code that goes unfixed for hours can exhaust the limited number of retries, causing the alarm to not be re-run in the future until the next time you call `setAlarm`.\n\n:::\n\n## Example\n\nThis example shows how to both set alarms with the `setAlarm(timestamp)` method and handle alarms with the `alarm()` handler within your Durable Object.\n\n", "char_start": 5976, "char_end": 6655, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "7dfbd579f285a388", "doc_id": "durable-objects/api/alarms.md", "text": "- The `alarm()` handler will be called once every time an alarm fires.\n- If an unexpected error terminates the Durable Object, the `alarm()` handler may be re-instantiated on another machine.\n- Following a short delay, the `alarm()` handler will run from the beginning on the other machine.\n\n\n\n\n\n```js\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport default {\n\tasync fetch(request, env) {\n\t\treturn await env.ALARM_EXAMPLE.getByName(\"foo\").fetch(request);\n\t},\n};\n\nconst SECONDS = 1000;\n\n", "char_start": 6655, "char_end": 7210, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "b226ea3c81c62d56", "doc_id": "durable-objects/api/alarms.md", "text": "export class AlarmExample extends DurableObject {\n\tconstructor(ctx, env) {\n\t\tsuper(ctx, env);\n\t\tthis.storage = ctx.storage;\n\t}\n\tasync fetch(request) {\n\t\t// If there is no alarm currently set, set one for 10 seconds from now\n\t\tlet currentAlarm = await this.storage.getAlarm();\n\t\tif (currentAlarm == null) {\n\t\t\tthis.storage.setAlarm(Date.now() + 10 * SECONDS);\n\t\t}\n\t}\n\tasync alarm() {\n\t\t// The alarm handler will be invoked whenever an alarm fires.\n\t\t// You can use this to do work, read from the Storage API, make HTTP calls\n\t\t// and set future alarms to run using this.storage.setAlarm() from within this handler.\n\t}\n}\n```\n\n\n\n\n\n```python\nimport time\n\nfrom workers import DurableObject, WorkerEntrypoint\n\n", "char_start": 7210, "char_end": 7967, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "6f3c450373ada5b0", "doc_id": "durable-objects/api/alarms.md", "text": "class Default(WorkerEntrypoint):\n async def fetch(self, request):\n return await self.env.ALARM_EXAMPLE.getByName(\"foo\").fetch(request)\n\nSECONDS = 1000\n\nclass AlarmExample(DurableObject):\n def __init__(self, ctx, env):\n super().__init__(ctx, env)\n self.storage = ctx.storage\n\n async def fetch(self, request):\n # If there is no alarm currently set, set one for 10 seconds from now\n current_alarm = await self.storage.getAlarm()\n if current_alarm is None:\n self.storage.setAlarm(int(time.time() * 1000) + 10 * SECONDS)\n\n", "char_start": 7967, "char_end": 8546, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "dbe66e2f5c879dde", "doc_id": "durable-objects/api/alarms.md", "text": " async def alarm(self):\n # The alarm handler will be invoked whenever an alarm fires.\n # You can use this to do work, read from the Storage API, make HTTP calls\n # and set future alarms to run using self.storage.setAlarm() from within this handler.\n pass\n```\n\n\n\n\n\nThe following example shows how to use the `alarmInfo` property to identify if the alarm event has been attempted before.\n\n\n\n\n\n```js\nclass MyDurableObject extends DurableObject {\n\tasync alarm(alarmInfo) {\n\t\tif (alarmInfo?.retryCount != 0) {\n\t\t\tconsole.log(\n\t\t\t\t\"This alarm event has been attempted ${alarmInfo?.retryCount} times before.\",\n\t\t\t);\n\t\t}\n\t}\n}\n```\n\n\n\n\n\n", "char_start": 8546, "char_end": 9331, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "e08782842f4a04cd", "doc_id": "durable-objects/api/alarms.md", "text": "```python\nclass MyDurableObject(DurableObject):\n async def alarm(self, alarm_info):\n if alarm_info and alarm_info.get('retryCount', 0) != 0:\n print(f\"This alarm event has been attempted {alarm_info.get('retryCount')} times before.\")\n```\n\n\n\n\n\n## Related resources\n\n- Understand how to [use the Alarms API](/durable-objects/examples/alarms-api/) in an end-to-end example.\n- Read the [Durable Objects alarms announcement blog post](https://blog.cloudflare.com/durable-objects-alarms/).\n- Review the [Storage API](/durable-objects/api/sqlite-storage-api/) documentation for Durable Objects.\n", "char_start": 9331, "char_end": 9956, "metadata": {"title": "If there is no alarm currently set, set one for 10 seconds from now", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", "format": "markdown", "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f"}} +{"chunk_id": "593d463edef0348e", "doc_id": "durable-objects/api/state.md", "text": "---\ntitle: Durable Object State\ndescription: API reference for DurableObjectState, which controls concurrency, WebSocket attachment, and storage access.\npcx_content_type: concept\nsidebar:\n order: 5\nproducts:\n - durable-objects\n---\n\nimport { Tabs, TabItem, GlossaryTooltip, Type, MetaInfo } from \"~/components\";\n\n## Description\n\nThe `DurableObjectState` interface is accessible as an instance property on the Durable Object class. This interface encapsulates methods that modify the state of a Durable Object, for example which WebSockets are attached to a Durable Object or how the runtime should handle concurrent Durable Object requests.\n\n", "char_start": 0, "char_end": 706, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "d676c4f8d09001b3", "doc_id": "durable-objects/api/state.md", "text": "The `DurableObjectState` interface is different from the Storage API in that it does not have top-level methods which manipulate persistent application data. These methods are instead encapsulated in the [`DurableObjectStorage`](/durable-objects/api/sqlite-storage-api/) interface and accessed by [`DurableObjectState::storage`](/durable-objects/api/state/#storage).\n\n \n\n```js\nimport { DurableObject } from \"cloudflare:workers\";\n\n// Durable Object\nexport class MyDurableObject extends DurableObject {\n // DurableObjectState is accessible via the ctx instance property\n\tconstructor(ctx, env) {\n\t\tsuper(ctx, env);\n\t}\n ...\n}\n```\n\n", "char_start": 706, "char_end": 1446, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "e073727eb94148b6", "doc_id": "durable-objects/api/state.md", "text": " \n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n MY_DURABLE_OBJECT: DurableObjectNamespace;\n}\n\n// Durable Object\nexport class MyDurableObject extends DurableObject {\n // DurableObjectState is accessible via the ctx instance property\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\t}\n ...\n}\n```\n\n\n\n\n\n```python\nfrom workers import DurableObject\n\n# Durable Object\nclass MyDurableObject(DurableObject):\n # DurableObjectState is accessible via the ctx instance property\n def __init__(self, ctx, env):\n super().__init__(ctx, env)\n # ...\n```\n\n\n\n\n\n", "char_start": 1446, "char_end": 2202, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "d792573dffbe575f", "doc_id": "durable-objects/api/state.md", "text": "## Methods and Properties\n\n### `exports`\n\nContains loopback bindings to the Worker's own top-level exports. This has exactly the same meaning as [`ExecutionContext`'s `ctx.exports`](/workers/runtime-apis/context/#exports).\n\n### `waitUntil`\n\n`waitUntil` is available on `DurableObjectState` for API compatibility with [Workers Runtime APIs](/workers/runtime-apis/context/#waituntil).\n\n:::note[`waitUntil` has no effect in Durable Objects]\n\nUnlike in Workers, `waitUntil` has no effect in Durable Objects. It does not extend the lifetime of a Durable Object or affect when a request or RPC completes.\n\n", "char_start": 2202, "char_end": 2802, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "868323eb0a13086f", "doc_id": "durable-objects/api/state.md", "text": "Durable Objects automatically remain active as long as there is ongoing work or pending I/O, so `waitUntil` is not needed. Refer to [Lifecycle of a Durable Object](/durable-objects/concepts/durable-object-lifecycle/) for more information.\n:::\n\n#### Parameters\n\n- A required promise of any type.\n\n#### Return values\n\n- None.\n\n### `blockConcurrencyWhile`\n\n`blockConcurrencyWhile` executes an async callback while blocking any other events from being delivered to the Durable Object until the callback completes. This method guarantees ordering and prevents concurrent requests. All events that were not explicitly initiated as part of the callback itself will be blocked. Once the callback completes, all other events will be delivered.\n\n", "char_start": 2802, "char_end": 3538, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "887031a8099e625a", "doc_id": "durable-objects/api/state.md", "text": "- `blockConcurrencyWhile` is commonly used within the constructor of the Durable Object class to enforce initialization to occur before any requests are delivered.\n- Another use case is executing `async` operations based on the current state of the Durable Object and using `blockConcurrencyWhile` to prevent that state from changing while yielding the event loop.\n- If the callback throws an exception, the object will be terminated and reset. This ensures that the object cannot be left stuck in an uninitialized state if something fails unexpectedly.\n- To avoid this behavior, enclose the body of your callback in a `try...catch` block to ensure it cannot throw an exception.\n\n", "char_start": 3538, "char_end": 4218, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "a6cf58fed8140377", "doc_id": "durable-objects/api/state.md", "text": "To help mitigate deadlocks there is a 30 second timeout applied when executing the callback. If this timeout is exceeded, the Durable Object will be reset. It is best practice to have the callback do as little work as possible to improve overall request throughput to the Durable Object.\n\n:::note[When to use `blockConcurrencyWhile`]\n\nUse `blockConcurrencyWhile` in the constructor to run schema migrations or initialize state before any requests are processed. This ensures your Durable Object is fully ready before handling traffic.\n\n", "char_start": 4218, "char_end": 4754, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "f181302f5fac180e", "doc_id": "durable-objects/api/state.md", "text": "For regular request handling, you rarely need `blockConcurrencyWhile`. SQLite storage operations are synchronous and do not yield the event loop, so they execute atomically without it. For asynchronous KV storage operations, input gates already prevent other requests from interleaving during storage calls.\n\nReserve `blockConcurrencyWhile` outside the constructor for cases where you make external async calls (such as `fetch()`) and cannot tolerate state changes while the event loop yields.\n\n:::\n\n\n\n\n\n```js\n// Durable Object\nexport class MyDurableObject extends DurableObject {\n\tinitialized = false;\n\n\tconstructor(ctx, env) {\n\t\tsuper(ctx, env);\n\n", "char_start": 4754, "char_end": 5460, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "3862d2db530fbc2a", "doc_id": "durable-objects/api/state.md", "text": "\t\t// blockConcurrencyWhile will ensure that initialized will always be true\n\t\tthis.ctx.blockConcurrencyWhile(async () => {\n\t\t\tthis.initialized = true;\n\t\t});\n\t}\n ...\n}\n```\n\n\n\n\n\n```python\n# Durable Object\nclass MyDurableObject(DurableObject):\n\tdef __init__(self, ctx, env):\n\t\tsuper().__init__(ctx, env)\n\t\tself.initialized = False\n\n\t\t# blockConcurrencyWhile will ensure that initialized will always be true\n\t\tasync def set_initialized():\n\t\t\tself.initialized = True\n\t\tself.ctx.blockConcurrencyWhile(set_initialized)\n\t# ...\n```\n\n\n\n\n\n#### Parameters\n\n- A required callback which returns a `Promise`.\n\n#### Return values\n\n- A `Promise` returned by the callback.\n\n", "char_start": 5460, "char_end": 6193, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "58a541a42a778866", "doc_id": "durable-objects/api/state.md", "text": "### `acceptWebSocket`\n\n`acceptWebSocket` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected.\n\n`acceptWebSocket` adds a WebSocket to the set of WebSockets attached to the Durable Object. Once called, any incoming messages will be delivered by calling the Durable Object's `webSocketMessage` handler, and `webSocketClose` will be invoked upon disconnect. After calling `acceptWebSocket`, the WebSocket is accepted and its `send` and `close` methods can be used.\n\n", "char_start": 6193, "char_end": 6843, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "f3f79e25d667cd18", "doc_id": "durable-objects/api/state.md", "text": "The [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api) takes the place of the standard [WebSockets API](/workers/runtime-apis/websockets/). Therefore, `ws.accept` must not have been called separately and `ws.addEventListener` method will not receive events as they will instead be delivered to the Durable Object.\n\nThe WebSocket Hibernation API permits a maximum of 32,768 WebSocket connections per Durable Object, but the CPU and memory usage of a given workload may further limit the practical number of simultaneous connections.\n\n", "char_start": 6843, "char_end": 7440, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "cb05f9e89ecc5547", "doc_id": "durable-objects/api/state.md", "text": "#### Parameters\n\n- A required `WebSocket` with name `ws`.\n- An optional `Array` of associated tags. Tags can be used to retrieve WebSockets via [`DurableObjectState::getWebSockets`](/durable-objects/api/state/#getwebsockets). Each tag is a maximum of 256 characters and there can be at most 10 tags associated with a WebSocket.\n\n#### Return values\n\n- None.\n\n### `getWebSockets`\n\n`getWebSockets` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected.\n\n", "char_start": 7440, "char_end": 8085, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "369b084e4fe530c2", "doc_id": "durable-objects/api/state.md", "text": "`getWebSockets` returns an `Array` which is the set of WebSockets attached to the Durable Object. An optional tag argument can be used to filter the list according to tags supplied when calling [`DurableObjectState::acceptWebSocket`](/durable-objects/api/state/#acceptwebsocket).\n\n:::note[`waitUntil` is not necessary]\n\nDisconnected WebSockets are not returned by this method, but `getWebSockets` may still return WebSockets even after `ws.close` has been called. For example, if the server-side WebSocket sends a close, but does not receive one back (and has not detected a disconnect from the client), then the connection is in the `CLOSING` readyState. The client might send more messages, so the WebSocket is technically not disconnected.\n\n", "char_start": 8085, "char_end": 8840, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "0b618f55de635092", "doc_id": "durable-objects/api/state.md", "text": "With the [`web_socket_auto_reply_to_close`](/workers/configuration/compatibility-flags/#websocket-auto-reply-to-close) compatibility flag (enabled by default on compatibility dates on or after `2026-04-07`), the runtime automatically completes the close handshake, so WebSockets transition from `CLOSING` to `CLOSED` much faster and are less likely to be observed in the `CLOSING` state.\n\n:::\n\n#### Parameters\n\n- An optional tag of type `string`.\n\n#### Return values\n\n- An `Array`.\n\n### `setWebSocketAutoResponse`\n\n`setWebSocketAutoResponse` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected.\n\n", "char_start": 8840, "char_end": 9635, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "a3a353c534b1d318", "doc_id": "durable-objects/api/state.md", "text": "`setWebSocketAutoResponse` sets an automatic response, auto-response, for the request provided for all WebSockets attached to the Durable Object. If a request is received matching the provided request then the auto-response will be returned without waking WebSockets in hibernation and incurring billable duration charges.\n\n`setWebSocketAutoResponse` is a common alternative to setting up a server for static ping/pong messages because this can be handled without waking hibernating WebSockets.\n\n", "char_start": 9635, "char_end": 10131, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "6df51dead5ae9ea4", "doc_id": "durable-objects/api/state.md", "text": "#### Parameters\n\n- An optional `WebSocketRequestResponsePair(request string, response string)` enabling any WebSocket accepted via [`DurableObjectState::acceptWebSocket`](/durable-objects/api/state/#acceptwebsocket) to automatically reply to the provided response when it receives the provided request. Both request and response are limited to 2,048 characters each. If the parameter is omitted, any previously set auto-response configuration will be removed. [`DurableObjectState::getWebSocketAutoResponseTimestamp`](/durable-objects/api/state/#getwebsocketautoresponsetimestamp) will still reflect the last timestamp that an auto-response was sent.\n\n#### Return values\n\n- None.\n\n", "char_start": 10131, "char_end": 10812, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "016b0051d4e17373", "doc_id": "durable-objects/api/state.md", "text": "### `getWebSocketAutoResponse`\n\n`getWebSocketAutoResponse` returns the `WebSocketRequestResponsePair` object last set by [`DurableObjectState::setWebSocketAutoResponse`](/durable-objects/api/state/#setwebsocketautoresponse), or null if not auto-response has been set.\n\n:::note[inspect `WebSocketRequestResponsePair`]\n\n`WebSocketRequestResponsePair` can be inspected further by calling `getRequest` and `getResponse` methods.\n\n:::\n\n#### Parameters\n\n- None.\n\n#### Return values\n\n- A `WebSocketRequestResponsePair` or null.\n\n", "char_start": 10812, "char_end": 11334, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "e39540505410b22c", "doc_id": "durable-objects/api/state.md", "text": "### `getWebSocketAutoResponseTimestamp`\n\n`getWebSocketAutoResponseTimestamp` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected.\n\n`getWebSocketAutoResponseTimestamp` gets the most recent `Date` on which the given WebSocket sent an auto-response, or null if the given WebSocket never sent an auto-response.\n\n#### Parameters\n\n- A required `WebSocket`.\n\n#### Return values\n\n- A `Date` or null.\n\n", "char_start": 11334, "char_end": 11915, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "370c1ff8c8b41417", "doc_id": "durable-objects/api/state.md", "text": "### `setHibernatableWebSocketEventTimeout`\n\n`setHibernatableWebSocketEventTimeout` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected.\n\n`setHibernatableWebSocketEventTimeout` sets the maximum amount of time in milliseconds that a WebSocket event can run for.\n\nIf no parameter or a parameter of `0` is provided and a timeout has been previously set, then the timeout will be unset. The maximum value of timeout is 604,800,000 ms (7 days).\n\n#### Parameters\n\n- An optional `number`.\n\n#### Return values\n\n- None.\n\n", "char_start": 11915, "char_end": 12614, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "15aec882136e74f0", "doc_id": "durable-objects/api/state.md", "text": "### `getHibernatableWebSocketEventTimeout`\n\n`getHibernatableWebSocketEventTimeout` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected.\n\n`getHibernatableWebSocketEventTimeout` gets the currently set hibernatable WebSocket event timeout if one has been set via [`DurableObjectState::setHibernatableWebSocketEventTimeout`](/durable-objects/api/state/#sethibernatablewebsocketeventtimeout).\n\n#### Parameters\n\n- None.\n\n#### Return values\n\n- A number, or null if the timeout has not been set.\n\n", "char_start": 12614, "char_end": 13291, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "74ed47c5b64b43b6", "doc_id": "durable-objects/api/state.md", "text": "### `getTags`\n\n`getTags` is part of the [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api), which allows a Durable Object to be removed from memory to save costs while keeping its WebSockets connected.\n\n`getTags` returns tags associated with a given WebSocket. This method throws an exception if the WebSocket has not been associated with the Durable Object via [`DurableObjectState::acceptWebSocket`](/durable-objects/api/state/#acceptwebsocket).\n\n#### Parameters\n\n- A required `WebSocket`.\n\n#### Return values\n\n- An `Array` of tags.\n\n", "char_start": 13291, "char_end": 13899, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "09d79414db5437d0", "doc_id": "durable-objects/api/state.md", "text": "### `abort`\n\n`abort` is used to forcibly reset a Durable Object. A JavaScript `Error` with the message passed as a parameter will be logged. This error is not able to be caught within the application code.\n\n\n\n\n\n```js\n// Durable Object\nexport class MyDurableObject extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\t}\n\n async sayHello() {\n // Error: Hello, World! will be logged\n this.ctx.abort(\"Hello, World!\");\n }\n}\n```\n\n\n\n\n\n```python\n# Durable Object\nclass MyDurableObject(DurableObject):\n\tdef __init__(self, ctx, env):\n\t\tsuper().__init__(ctx, env)\n\n", "char_start": 13899, "char_end": 14612, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "7b00d2ee06fc32da", "doc_id": "durable-objects/api/state.md", "text": "\tasync def say_hello(self):\n\t\t# Error: Hello, World! will be logged\n\t\tself.ctx.abort(\"Hello, World!\")\n```\n\n\n\n\n\n:::caution[Not available in local development]\n\n`abort` is not available in local development with the `wrangler dev` CLI command.\n\n:::\n\n#### Parameters\n\n- An optional `string` .\n\n#### Return values\n\n- None.\n\n## Properties\n\n### `id`\n\n`id` is a readonly property of type `DurableObjectId` corresponding to the [`DurableObjectId`](/durable-objects/api/id) of the Durable Object.\n\n### `storage`\n\n`storage` is a readonly property of type `DurableObjectStorage` encapsulating the [Storage API](/durable-objects/api/sqlite-storage-api/).\n\n", "char_start": 14612, "char_end": 15273, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "32083155adc7980a", "doc_id": "durable-objects/api/state.md", "text": "## Related resources\n\n- [Durable Objects: Easy, Fast, Correct - Choose Three](https://blog.cloudflare.com/durable-objects-easy-fast-correct-choose-three/).\n", "char_start": 15273, "char_end": 15429, "metadata": {"title": "Durable Object", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", "format": "markdown", "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5"}} +{"chunk_id": "43418512fe758afc", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "---\ntitle: Invoke methods\ndescription: Call RPC methods or send fetch requests to Durable Objects using stubs from a Worker.\npcx_content_type: concept\ntags:\n - RPC\nsidebar:\n order: 2\nproducts:\n - durable-objects\n---\n\nimport { Render, Tabs, TabItem, GlossaryTooltip } from \"~/components\";\n\n## Invoking methods on a Durable Object\n\nAll new projects and existing projects with a compatibility date greater than or equal to [`2024-04-03`](/workers/configuration/compatibility-flags/#durable-object-stubs-and-service-bindings-support-rpc) should prefer to invoke [Remote Procedure Call (RPC)](/workers/runtime-apis/rpc/) methods defined on a Durable Object class.\n\n", "char_start": 0, "char_end": 726, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "29b05d3872ed4b90", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "Projects requiring HTTP request/response flows or legacy projects can continue to invoke the `fetch()` handler on the Durable Object class.\n\n### Invoke RPC methods\n\nBy writing a Durable Object class which inherits from the built-in type `DurableObject`, public methods on the Durable Objects class are exposed as [RPC methods](/workers/runtime-apis/rpc/), which you can call using a [DurableObjectStub](/durable-objects/api/stub) from a Worker.\n\nAll RPC calls are [asynchronous](/workers/runtime-apis/rpc/lifecycle/), accept and return [serializable types](/workers/runtime-apis/rpc/), and [propagate exceptions](/workers/runtime-apis/rpc/error-handling/) to the caller without a stack trace. Refer to [Workers RPC](/workers/runtime-apis/rpc/) for complete details.\n\n", "char_start": 726, "char_end": 1493, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "6752025c63c57de5", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "\n\n:::note\n\nWith RPC, the `DurableObject` superclass defines `ctx` and `env` as class properties. What was previously called `state` is now called `ctx` when you extend the `DurableObject` class. The name `ctx` is adopted rather than `state` for the `DurableObjectState` interface to be consistent between `DurableObject` and `WorkerEntrypoint` objects.\n\n:::\n\nRefer to [Build a Counter](/durable-objects/examples/build-a-counter/) for a complete example.\n\n", "char_start": 1493, "char_end": 2003, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "31d4a096cf36e3d2", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "### Invoking the `fetch` handler\n\nIf your project is stuck on a compatibility date before [`2024-04-03`](/workers/configuration/compatibility-flags/#durable-object-stubs-and-service-bindings-support-rpc), or has the need to send a [`Request`](/workers/runtime-apis/request/) object and return a `Response` object, then you should send requests to a Durable Object via the fetch handler.\n\n \n\n```js\nimport { DurableObject } from \"cloudflare:workers\";\n\n// Durable Object\nexport class MyDurableObject extends DurableObject {\n\tconstructor(ctx, env) {\n\t\tsuper(ctx, env);\n\t}\n\n\tasync fetch(request) {\n\t\treturn new Response(\"Hello, World!\");\n\t}\n}\n\n", "char_start": 2003, "char_end": 2699, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "1d8ed86a8fc162d8", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "// Worker\nexport default {\n\tasync fetch(request, env) {\n\t\t// A stub is a client used to invoke methods on the Durable Object\n\t\tconst stub = env.MY_DURABLE_OBJECT.getByName(\"foo\");\n\n\t\t// Methods on the Durable Object are invoked via the stub\n\t\tconst response = await stub.fetch(request);\n\n\t\treturn response;\n\t},\n};\n```\n\n \n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tMY_DURABLE_OBJECT: DurableObjectNamespace;\n}\n\n// Durable Object\nexport class MyDurableObject extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\t}\n\n\tasync fetch(request: Request): Promise {\n\t\treturn new Response(\"Hello, World!\");\n\t}\n}\n\n", "char_start": 2699, "char_end": 3470, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "bc7d330debf17471", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "// Worker\nexport default {\n\tasync fetch(request, env) {\n\t\t// A stub is a client used to invoke methods on the Durable Object\n\t\tconst stub = env.MY_DURABLE_OBJECT.getByName(\"foo\");\n\n\t\t// Methods on the Durable Object are invoked via the stub\n\t\tconst response = await stub.fetch(request);\n\n\t\treturn response;\n\t},\n} satisfies ExportedHandler;\n```\n\n \n\nThe `URL` associated with the [`Request`](/workers/runtime-apis/request/) object passed to the `fetch()` handler of your Durable Object must be a well-formed URL, but does not have to be a publicly-resolvable hostname.\n\n", "char_start": 3470, "char_end": 4060, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "bef2a3856f941f2a", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "Without RPC, customers frequently construct requests which corresponded to private methods on the Durable Object and dispatch requests from the `fetch` handler. RPC is obviously more ergonomic in this example.\n\n \n\n```js\nimport { DurableObject } from \"cloudflare:workers\";\n\n// Durable Object\nexport class MyDurableObject extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\t}\n\n\tprivate hello(name) {\n\t\treturn new Response(`Hello, ${name}!`);\n\t}\n\n\tprivate goodbye(name) {\n\t\treturn new Response(`Goodbye, ${name}!`);\n\t}\n\n\tasync fetch(request) {\n\t\tconst url = new URL(request.url);\n\t\tlet name = url.searchParams.get(\"name\");\n\t\tif (!name) {\n\t\t\tname = \"World\";\n\t\t}\n\n", "char_start": 4060, "char_end": 4818, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "15b0bfcafc9c8cc8", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "\t\tswitch (url.pathname) {\n\t\t\tcase \"/hello\":\n\t\t\t\treturn this.hello(name);\n\t\t\tcase \"/goodbye\":\n\t\t\t\treturn this.goodbye(name);\n\t\t\tdefault:\n\t\t\t\treturn new Response(\"Bad Request\", { status: 400 });\n\t\t}\n\t}\n}\n\n// Worker\nexport default {\n\tasync fetch(_request, env, _ctx) {\n\t\t// A stub is a client used to invoke methods on the Durable Object\n\t\tconst stub = env.MY_DURABLE_OBJECT.getByName(\"foo\");\n\n\t\t// Invoke the fetch handler on the Durable Object stub\n\t\tlet response = await stub.fetch(\"http://do/hello?name=World\");\n\n\t\treturn response;\n\t},\n};\n```\n\n \n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tMY_DURABLE_OBJECT: DurableObjectNamespace;\n}\n\n", "char_start": 4818, "char_end": 5573, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "b951941f97fa59b1", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "// Durable Object\nexport class MyDurableObject extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\t}\n\n\tprivate hello(name: string) {\n\t\treturn new Response(`Hello, ${name}!`);\n\t}\n\n\tprivate goodbye(name: string) {\n\t\treturn new Response(`Goodbye, ${name}!`);\n\t}\n\n\tasync fetch(request: Request): Promise {\n\t\tconst url = new URL(request.url);\n\t\tlet name = url.searchParams.get(\"name\");\n\t\tif (!name) {\n\t\t\tname = \"World\";\n\t\t}\n\n\t\tswitch (url.pathname) {\n\t\t\tcase \"/hello\":\n\t\t\t\treturn this.hello(name);\n\t\t\tcase \"/goodbye\":\n\t\t\t\treturn this.goodbye(name);\n\t\t\tdefault:\n\t\t\t\treturn new Response(\"Bad Request\", { status: 400 });\n\t\t}\n\t}\n}\n\n", "char_start": 5573, "char_end": 6248, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "dc47cdba2dbc421e", "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "text": "// Worker\nexport default {\n\tasync fetch(_request, env, _ctx) {\n\t\t// A stub is a client used to invoke methods on the Durable Object\n\t\tconst stub = env.MY_DURABLE_OBJECT.getByName(\"foo\");\n\n\t\t// Invoke the fetch handler on the Durable Object stub\n\t\tlet response = await stub.fetch(\"http://do/hello?name=World\");\n\n\t\treturn response;\n\t},\n} satisfies ExportedHandler;\n```\n\n \n", "char_start": 6248, "char_end": 6640, "metadata": {"title": "create-durable-object-stubs-and-send-requests", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", "format": "markdown", "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518"}} +{"chunk_id": "1ecd01cf9e4fbc33", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "---\ntitle: Rules of Durable Objects\ndescription: Design guidelines for building correct and effective Durable Objects applications, covering when and how to use them.\npcx_content_type: concept\nsidebar:\n order: 1\nproducts:\n - durable-objects\n---\n\nimport { WranglerConfig, TypeScriptExample, Render } from \"~/components\";\n\nDurable Objects provide a powerful primitive for building stateful, coordinated applications. Each Durable Object is a single-threaded, globally-unique instance with its own persistent storage. Understanding how to design around these properties is essential for building effective applications.\n\nThis is a guidebook on how to build more effective and correct Durable Object applications.\n\n", "char_start": 0, "char_end": 713, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "1a2d60ea537dccc0", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "## When to use Durable Objects\n\n### Use Durable Objects for stateful coordination, not stateless request handling\n\nWorkers are stateless functions: each request may run on a different instance, in a different location, with no shared memory between requests. Durable Objects are stateful compute: each instance has a unique identity, runs in a single location, and maintains state across requests.\n\nUse Durable Objects when you need:\n\n", "char_start": 713, "char_end": 1148, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "82128b1a50b82ecf", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "- **Coordination** \u2014 Multiple clients need to interact with shared state (chat rooms, multiplayer games, collaborative documents)\n- **Strong consistency** \u2014 Operations must be serialized to avoid race conditions (inventory management, booking systems, turn-based games)\n- **Per-entity storage** \u2014 Each user, tenant, or resource needs its own isolated database (multi-tenant SaaS, per-user data)\n- **Persistent connections** \u2014 Long-lived WebSocket connections that survive across requests (real-time notifications, live updates)\n- **Scheduled work per entity** \u2014 Each entity needs its own timer or scheduled task (subscription renewals, game timeouts)\n\nUse plain Workers when you need:\n\n", "char_start": 1148, "char_end": 1834, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "ee29a2d2468fa0f5", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "- **Stateless request handling** \u2014 API endpoints, proxies, or transformations with no shared state\n- **Maximum global distribution** \u2014 Requests should be handled at the nearest edge location\n- **High fan-out** \u2014 Each request is independent and can be processed in parallel\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tBOOKING: DurableObjectNamespace;\n}\n\n", "char_start": 1834, "char_end": 2280, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "6b0e964e0b77d0a4", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "// \u2705 Good use of Durable Objects: Seat booking requires coordination\n// All booking requests for a venue must be serialized to prevent double-booking\nexport class SeatBooking extends DurableObject {\nasync bookSeat(\nseatId: string,\nuserId: string\n): Promise<{ success: boolean; message: string }> {\n// Check if seat is already booked\nconst existing = this.ctx.storage.sql\n.exec<{ user_id: string }>(\n\"SELECT user_id FROM bookings WHERE seat_id = ?\",\nseatId\n)\n.toArray();\n\n \tif (existing.length > 0) {\n \t\treturn { success: false, message: \"Seat already booked\" };\n \t}\n\n", "char_start": 2280, "char_end": 2861, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "796f628158d5dde7", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " \t// Book the seat - this is safe because Durable Objects are single-threaded\n \tthis.ctx.storage.sql.exec(\n \t\t\"INSERT INTO bookings (seat_id, user_id, booked_at) VALUES (?, ?, ?)\",\n \t\tseatId,\n \t\tuserId,\n \t\tDate.now()\n \t);\n\n \treturn { success: true, message: \"Seat booked successfully\" };\n }\n}\n\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\tconst url = new URL(request.url);\n\t\tconst eventId = url.searchParams.get(\"event\") ?? \"default\";\n\n \t// Route to a Durable Object by event ID\n \t// All bookings for the same event go to the same instance\n \tconst id = env.BOOKING.idFromName(eventId);\n \tconst booking = env.BOOKING.get(id);\n\n", "char_start": 2861, "char_end": 3562, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "3e3e27a7405527c2", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " \tconst { seatId, userId } = await request.json<{\n \t\tseatId: string;\n \t\tuserId: string;\n \t}>();\n \tconst result = await booking.bookSeat(seatId, userId);\n\n \treturn Response.json(result, {\n \t\tstatus: result.success ? 200 : 409,\n \t});\n },\n};\n```\n\n\nA common pattern is to use Workers as the stateless entry point that routes requests to Durable Objects when coordination is needed. The Worker handles authentication, validation, and response formatting, while the Durable Object handles the stateful logic.\n\n", "char_start": 3562, "char_end": 4113, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "777cc7c7299856c5", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "## Design and sharding\n\n### Model your Durable Objects around your \"atom\" of coordination\n\nThe most important design decision is choosing what each Durable Object represents. Create one Durable Object per logical unit that needs coordination: a chat room, a game session, a document, a user's data, or a tenant's workspace.\n\nThis is the key insight that makes Durable Objects powerful. Instead of a shared database with locks, each \"atom\" of your application gets its own single-threaded execution environment with private storage.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\n", "char_start": 4113, "char_end": 4817, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "7f49e4193ddf7cbd", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "// Each chat room is its own Durable Object instance\nexport class ChatRoom extends DurableObject {\n\tasync sendMessage(userId: string, message: string) {\n\t\t// All messages to this room are processed sequentially by this single instance.\n\t\t// No race conditions, no distributed locks needed.\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?)\",\n\t\t\tuserId,\n\t\t\tmessage,\n\t\t\tDate.now()\n\t\t);\n\t}\n}\n\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\tconst url = new URL(request.url);\n\t\tconst roomId = url.searchParams.get(\"room\") ?? \"lobby\";\n\n\t\t// Each room ID maps to exactly one Durable Object instance globally\n\t\tconst id = env.CHAT_ROOM.idFromName(roomId);\n\t\tconst stub = env.CHAT_ROOM.get(id);\n\n", "char_start": 4817, "char_end": 5595, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "43f054d87b398ead", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\t\tawait stub.sendMessage(\"user-123\", \"Hello, room!\");\n\t\treturn new Response(\"Message sent\");\n\t},\n};\n```\n\n\n\n:::note\n\nIf you have global application or user configuration that you need to access frequently (on every request), consider using [Workers KV](/kv/) instead.\n\n:::\n\nDo not create a single \"global\" Durable Object that handles all requests:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\n", "char_start": 5595, "char_end": 6134, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "5f4082cd68a1b0a0", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "// \ud83d\udd34 Bad: A single Durable Object handling ALL chat rooms\nexport class ChatRoom extends DurableObject {\nasync sendMessage(roomId: string, userId: string, message: string) {\n// All messages for ALL rooms go through this single instance.\n// This becomes a bottleneck as traffic grows.\nthis.ctx.storage.sql.exec(\n\"INSERT INTO messages (room_id, user_id, content) VALUES (?, ?, ?)\",\nroomId,\nuserId,\nmessage\n);\n}\n}\n\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\t// \ud83d\udd34 Bad: Always using the same ID means one global instance\n\t\tconst id = env.CHAT_ROOM.idFromName(\"global\");\n\t\tconst stub = env.CHAT_ROOM.get(id);\n\n \tawait stub.sendMessage(\"room-123\", \"user-456\", \"Hello!\");\n \treturn new Response(\"Sent\");\n },\n};\n\n```\n\n\n", "char_start": 6134, "char_end": 6914, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "d42243723fecc3b0", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "### Message throughput limits\n\nA single Durable Object can handle approximately **500-1,000 requests per second** for simple operations. This limit varies based on the work performed per request:\n\n| Operation type | Throughput |\n|----------------|------------|\n| Simple pass-through (minimal parsing) | ~1,000 req/sec |\n| Moderate processing (JSON parsing, validation) | ~500-750 req/sec |\n| Complex operations (transformation, storage writes) | ~200-500 req/sec |\n\nWhen modeling your \"atom,\" factor in the expected request rate. If your use case exceeds these limits, shard your workload across multiple Durable Objects.\n\n", "char_start": 6914, "char_end": 7537, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "4d0bb03d4585cc54", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "For example, consider a real-time game with 50,000 concurrent players sending 10 updates per second. This generates 500,000 requests per second total. You would need 500-1,000 game session Durable Objects\u2014not one global coordinator.\n\nCalculate your sharding requirements:\n\n```\n\nRequired DOs = (Total requests/second) / (Requests per DO capacity)\n\n```\n\n### Use deterministic IDs for predictable routing\n\nUse `getByName()` with meaningful, deterministic strings for consistent routing. The same input always produces the same Durable Object ID, ensuring requests for the same logical entity always reach the same instance.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tGAME_SESSION: DurableObjectNamespace;\n}\n\n", "char_start": 7537, "char_end": 8336, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "3dba726687652a23", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "export class GameSession extends DurableObject {\n\tasync join(playerId: string) {\n\t\t// Game logic here\n\t}\n}\n\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\tconst url = new URL(request.url);\n\t\tconst gameId = url.searchParams.get(\"game\");\n\n\t\tif (!gameId) {\n\t\t\treturn new Response(\"Missing game ID\", { status: 400 });\n\t\t}\n\n\t\t// \u2705 Good: Deterministic ID from a meaningful string\n\t\t// All requests for \"game-abc123\" go to the same Durable Object\n\t\tconst stub = env.GAME_SESSION.getByName(gameId);\n\n\t\tawait stub.join(\"player-xyz\");\n\t\treturn new Response(\"Joined game\");\n\t},\n};\n```\n\n\n\nCreating a stub does not instantiate or wake up the Durable Object. The Durable Object is only activated when you call a method on the stub.\n\n", "char_start": 8336, "char_end": 9114, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "5a3ed5f8468715aa", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "Use `newUniqueId()` only when you need a new, random instance and will store the mapping externally:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tGAME_SESSION: DurableObjectNamespace;\n}\n\nexport class GameSession extends DurableObject {\n\tasync join(playerId: string) {\n\t\t// Game logic here\n\t}\n}\n\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\t// newUniqueId() creates a random ID - useful when creating new instances\n\t\t// You must store this ID somewhere (e.g., D1) to find it again later\n\t\tconst id = env.GAME_SESSION.newUniqueId();\n\t\tconst stub = env.GAME_SESSION.get(id);\n\n", "char_start": 9114, "char_end": 9820, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "c044636fc915d5ce", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " \t// Store the mapping: gameCode -> id.toString()\n \t// await env.DB.prepare(\"INSERT INTO games (code, do_id) VALUES (?, ?)\").bind(gameCode, id.toString()).run();\n\n \treturn Response.json({ gameId: id.toString() });\n },\n};\n\n```\n\n\n### Use parent-child relationships for related entities\n\nDo not put all your data in a single Durable Object. When you have hierarchical data (workspaces containing projects, game servers managing matches), create separate child Durable Objects for each entity. The parent coordinates and tracks children, while children handle their own state independently.\n\n", "char_start": 9820, "char_end": 10440, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "c10792edc28fc7c9", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "This enables parallelism: operations on different children can happen concurrently, while each child maintains its own single-threaded consistency ([read more about this pattern](/reference-architecture/diagrams/storage/durable-object-control-data-plane-pattern/)).\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tGAME_SERVER: DurableObjectNamespace;\n\tGAME_MATCH: DurableObjectNamespace;\n}\n\n// Parent: Coordinates matches, but doesn't store match data\nexport class GameServer extends DurableObject {\n\tasync createMatch(matchName: string): Promise {\n\t\tconst matchId = crypto.randomUUID();\n\n", "char_start": 10440, "char_end": 11141, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "994daeeb549e5111", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\t\t// Store reference to the child in parent's database\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"INSERT INTO matches (id, name, created_at) VALUES (?, ?, ?)\",\n\t\t\tmatchId,\n\t\t\tmatchName,\n\t\t\tDate.now()\n\t\t);\n\n\t\t// Initialize the child Durable Object\n\t\tconst childId = this.env.GAME_MATCH.idFromName(matchId);\n\t\tconst childStub = this.env.GAME_MATCH.get(childId);\n\t\tawait childStub.init(matchId, matchName);\n\n\t\treturn matchId;\n\t}\n\n\tasync listMatches(): Promise<{ id: string; name: string }[]> {\n\t\t// Parent knows about all matches without waking up each child\n\t\tconst cursor = this.ctx.storage.sql.exec<{ id: string; name: string }>(\n\t\t\t\"SELECT id, name FROM matches ORDER BY created_at DESC\"\n\t\t);\n\t\treturn cursor.toArray();\n\t}\n}\n\n", "char_start": 11141, "char_end": 11858, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "6511ababd8edfe82", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "// Child: Handles its own game state independently\nexport class GameMatch extends DurableObject {\n\tasync init(matchId: string, matchName: string) {\n\t\tawait this.ctx.storage.put(\"matchId\", matchId);\n\t\tawait this.ctx.storage.put(\"matchName\", matchName);\n\t\tthis.ctx.storage.sql.exec(`\n\t\t\tCREATE TABLE IF NOT EXISTS players (\n\t\t\t\tid TEXT PRIMARY KEY,\n\t\t\t\tname TEXT NOT NULL,\n\t\t\t\tscore INTEGER DEFAULT 0\n\t\t\t)\n\t\t`);\n\t}\n\n\tasync addPlayer(playerId: string, playerName: string) {\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"INSERT INTO players (id, name, score) VALUES (?, ?, 0)\",\n\t\t\tplayerId,\n\t\t\tplayerName\n\t\t);\n\t}\n\n\tasync updateScore(playerId: string, score: number) {\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"UPDATE players SET score = ? WHERE id = ?\",\n\t\t\tscore,\n\t\t\tplayerId\n\t\t);\n\t}\n}\n```\n\n\n\n", "char_start": 11858, "char_end": 12650, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "b1e053976bc065d3", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "With this pattern:\n\n- Listing matches only queries the parent (children stay hibernated)\n- Different matches process player actions in parallel\n- Each match has its own SQLite database for player data\n\n### Consider location hints for latency-sensitive applications\n\nBy default, a Durable Object is created near the location of the first request it receives. For most applications, this works well. However, you can provide a location hint to influence where the Durable Object is created.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tGAME_SESSION: DurableObjectNamespace;\n}\n\nexport class GameSession extends DurableObject {\n\t// Game session logic\n}\n\n", "char_start": 12650, "char_end": 13397, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "dee967901c6a57e5", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "export default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\tconst url = new URL(request.url);\n\t\tconst gameId = url.searchParams.get(\"game\") ?? \"default\";\n\t\tconst region = url.searchParams.get(\"region\") ?? \"wnam\"; // Western North America\n\n \t// Provide a location hint for where this Durable Object should be created\n \tconst id = env.GAME_SESSION.idFromName(gameId);\n \tconst stub = env.GAME_SESSION.get(id, { locationHint: region });\n\n \treturn new Response(\"Connected to game session\");\n },\n};\n\n```\n\n\nLocation hints are suggestions, not guarantees. Refer to [Data location](/durable-objects/reference/data-location/) for available regions and details.\n\n", "char_start": 13397, "char_end": 14105, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "43eae556558d05c5", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "## Storage and state\n\n### Use SQLite-backed Durable Objects\n\n[SQLite storage](/durable-objects/api/sqlite-storage-api/) is the recommended storage backend for new Durable Objects. It provides a familiar SQL API for relational queries, indexes, transactions, and better performance than the legacy key-value storage backed Durable Objects. SQLite Durable Objects also support the KV API in synchronous and asynchronous versions.\n\nConfigure your Durable Object class to use SQLite storage in your Wrangler configuration:\n\n\n```jsonc\n{\n \"migrations\": [\n { \"tag\": \"v1\", \"new_sqlite_classes\": [\"ChatRoom\"] }\n ]\n}\n```\n\n\n\nThen use the SQL API in your Durable Object:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\n", "char_start": 14105, "char_end": 14902, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "68581de86fcec8ef", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "export interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\ntype Message = {\nid: number;\nuser_id: string;\ncontent: string;\ncreated_at: number;\n};\n\nexport class ChatRoom extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\n \t// Create tables on first instantiation\n \tthis.ctx.storage.sql.exec(`\n \t\tCREATE TABLE IF NOT EXISTS messages (\n \t\t\tid INTEGER PRIMARY KEY AUTOINCREMENT,\n \t\t\tuser_id TEXT NOT NULL,\n \t\t\tcontent TEXT NOT NULL,\n \t\t\tcreated_at INTEGER NOT NULL\n \t\t)\n \t`);\n }\n\n async addMessage(userId: string, content: string) {\n \tthis.ctx.storage.sql.exec(\n \t\t\"INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?)\",\n \t\tuserId,\n \t\tcontent,\n \t\tDate.now()\n \t);\n }\n\n", "char_start": 14902, "char_end": 15695, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "546dfd77be176eae", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " async getRecentMessages(limit: number = 50): Promise {\n \t// Use type parameter for typed results\n \tconst cursor = this.ctx.storage.sql.exec(\n \t\t\"SELECT * FROM messages ORDER BY created_at DESC LIMIT ?\",\n \t\tlimit\n \t);\n \treturn cursor.toArray();\n }\n}\n\n```\n\n\nRefer to [Access Durable Objects storage](/durable-objects/best-practices/access-durable-objects-storage/) for more details on the SQL API.\n\n### Initialize storage and run migrations in the constructor\n\nUse `blockConcurrencyWhile()` in the constructor to run migrations and initialize state before any requests are processed. This ensures your schema is ready and prevents race conditions during initialization.\n\n", "char_start": 15695, "char_end": 16429, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "44603c8c6696d17e", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": ":::note\n`PRAGMA user_version` is not supported by Durable Objects SQLite storage. You must use an alternative approach to track your schema version.\n:::\n\nFor production applications, use a migration library that handles version tracking and execution automatically:\n\n- [`durable-utils`](https://github.com/lambrospetrou/durable-utils#sqlite-schema-migrations) \u2014 provides a `SQLSchemaMigrations` class that tracks executed migrations both in memory and in storage.\n- [`@cloudflare/actors` storage utilities](https://github.com/cloudflare/actors/blob/main/packages/storage/src/sql-schema-migrations.ts) \u2014 a reference implementation of the same pattern used by the Cloudflare Actors framework.\n\n", "char_start": 16429, "char_end": 17121, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "95ab764724d96bc3", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "If you prefer not to use a library, you can track schema versions manually using a `_sql_schema_migrations` table. The following example demonstrates this approach:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\n\t\t// blockConcurrencyWhile() ensures no requests are processed until this completes\n\t\tctx.blockConcurrencyWhile(async () => {\n\t\t\tawait this.migrate();\n\t\t});\n\t}\n\n", "char_start": 17121, "char_end": 17740, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "31dc8f55e868c9cc", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\tprivate async migrate() {\n\t\t// Create the migrations tracking table if it does not exist\n\t\tthis.ctx.storage.sql.exec(`\n\t\t\tCREATE TABLE IF NOT EXISTS _sql_schema_migrations (\n\t\t\t\tid INTEGER PRIMARY KEY,\n\t\t\t\tapplied_at TEXT NOT NULL DEFAULT (datetime('now'))\n\t\t\t);\n\t\t`);\n\n\t\t// Determine the current schema version\n\t\tconst version =\n\t\t\tthis.ctx.storage.sql\n\t\t\t\t.exec<{ version: number }>(\n\t\t\t\t\t\"SELECT COALESCE(MAX(id), 0) as version FROM _sql_schema_migrations\",\n\t\t\t\t)\n\t\t\t\t.one().version;\n\n", "char_start": 17740, "char_end": 18229, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "1c893295171d0aec", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\t\tif (version < 1) {\n\t\t\tthis.ctx.storage.sql.exec(`\n\t\t\t\tCREATE TABLE IF NOT EXISTS messages (\n\t\t\t\t\tid INTEGER PRIMARY KEY AUTOINCREMENT,\n\t\t\t\t\tuser_id TEXT NOT NULL,\n\t\t\t\t\tcontent TEXT NOT NULL,\n\t\t\t\t\tcreated_at INTEGER NOT NULL\n\t\t\t\t);\n\t\t\t\tCREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at);\n\t\t\t\tINSERT INTO _sql_schema_migrations (id) VALUES (1);\n\t\t\t`);\n\t\t}\n\n\t\tif (version < 2) {\n\t\t\t// Future migration: add a new column\n\t\t\tthis.ctx.storage.sql.exec(`\n\t\t\t\tALTER TABLE messages ADD COLUMN edited_at INTEGER;\n\t\t\t\tINSERT INTO _sql_schema_migrations (id) VALUES (2);\n\t\t\t`);\n\t\t}\n\t}\n}\n```\n\n\n\n", "char_start": 18229, "char_end": 18857, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "b98900c07a6b2f77", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "### Understand the difference between in-memory state and persistent storage\n\nDurable Objects provide multiple state management layers, each with different characteristics:\n\n| Type | Speed | Persistence | Use Case |\n| ---------------------------- | -------- | ---------------------------- | --------------------------- |\n| In-memory (class properties) | Fastest | Lost on eviction or crash | Caching, active connections |\n| SQLite storage | Fast | Durable across restarts | Primary data storage |\n| External (R2, D1) | Variable | Durable, cross-DO accessible | Large files, shared data |\n\n", "char_start": 18857, "char_end": 19557, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "1bb36ea189fb55df", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "In-memory state is **not preserved** if the Durable Object is evicted from memory due to inactivity, or if it crashes from an uncaught exception. Always persist important state to SQLite storage.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\ntype Message = {\nid: number;\nuser_id: string;\ncontent: string;\ncreated_at: number;\n};\n\nexport class ChatRoom extends DurableObject {\n\t// In-memory cache - fast but NOT preserved across evictions or crashes\n\tprivate messageCache: Message[] | null = null;\n\n", "char_start": 19557, "char_end": 20185, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "4b82e8bf6d74ed61", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " async getRecentMessages(): Promise {\n \t// Return from cache if available (only valid while DO is in memory)\n \tif (this.messageCache !== null) {\n \t\treturn this.messageCache;\n \t}\n\n \t// Otherwise, load from durable storage\n \tconst cursor = this.ctx.storage.sql.exec(\n \t\t\"SELECT * FROM messages ORDER BY created_at DESC LIMIT 100\"\n \t);\n \tthis.messageCache = cursor.toArray();\n \treturn this.messageCache;\n }\n\n async addMessage(userId: string, content: string) {\n \t// \u2705 Always persist to durable storage first\n \tthis.ctx.storage.sql.exec(\n \t\t\"INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?)\",\n \t\tuserId,\n \t\tcontent,\n \t\tDate.now()\n \t);\n\n", "char_start": 20185, "char_end": 20917, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "17ddad453f5fc15b", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " \t// Then update the cache (if it exists)\n \t// If the DO crashes here, the message is still saved in SQLite\n \tthis.messageCache = null; // Invalidate cache\n }\n}\n\n```\n\n\n:::caution\n\nIf an uncaught exception occurs in your Durable Object, the runtime may terminate the instance. Any in-memory state will be lost, but SQLite storage remains intact. Always persist critical state to storage before performing operations that might fail.\n\n:::\n\n### Create indexes for frequently-queried columns\n\nJust like any database, indexes dramatically improve read performance for frequently-filtered columns. The cost is slightly more storage and marginally slower writes.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\n", "char_start": 20917, "char_end": 21705, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "54d75d72b66dad8a", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "export interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\n\t\tctx.blockConcurrencyWhile(async () => {\n\t\t\tthis.ctx.storage.sql.exec(`\n\t\t\t\tCREATE TABLE IF NOT EXISTS messages (\n\t\t\t\t\tid INTEGER PRIMARY KEY AUTOINCREMENT,\n\t\t\t\t\tuser_id TEXT NOT NULL,\n\t\t\t\t\tcontent TEXT NOT NULL,\n\t\t\t\t\tcreated_at INTEGER NOT NULL\n\t\t\t\t);\n\n\t\t\t\t-- Index for queries filtering by user\n\t\t\t\tCREATE INDEX IF NOT EXISTS idx_messages_user_id ON messages(user_id);\n\n\t\t\t\t-- Index for time-based queries (recent messages)\n\t\t\t\tCREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at);\n\n", "char_start": 21705, "char_end": 22406, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "10386c9d92d91ab4", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\t\t\t\t-- Composite index for user + time queries\n\t\t\t\tCREATE INDEX IF NOT EXISTS idx_messages_user_time ON messages(user_id, created_at);\n\t\t\t`);\n\t\t});\n\t}\n\n\t// This query benefits from idx_messages_user_time\n\tasync getUserMessages(userId: string, since: number) {\n\t\treturn this.ctx.storage.sql\n\t\t\t.exec(\n\t\t\t\t\"SELECT * FROM messages WHERE user_id = ? AND created_at > ? ORDER BY created_at\",\n\t\t\t\tuserId,\n\t\t\t\tsince\n\t\t\t)\n\t\t\t.toArray();\n\t}\n}\n```\n\n\n\n", "char_start": 22406, "char_end": 22867, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "cd44b61541e60a31", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "### Understand how input and output gates work\n\nWhile Durable Objects are single-threaded, JavaScript's `async`/`await` can allow multiple requests to interleave execution while a request waits for the result of an asynchronous operation. Cloudflare's runtime uses **input gates** and **output gates** to prevent data races and ensure correctness by default.\n\n**Input gates** block new events (incoming requests, fetch responses) while synchronous JavaScript execution is in progress. Awaiting async operations like `fetch()` or KV storage methods opens the input gate, allowing other requests to interleave. However, storage operations provide special protection:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\n", "char_start": 22867, "char_end": 23632, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "74063ff99957c031", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "export interface Env {\n\tCOUNTER: DurableObjectNamespace;\n}\n\nexport class Counter extends DurableObject {\n\t// This code is safe due to input gates\n\tasync increment(): Promise {\n\t\t// While these storage operations execute, no other requests\n\t\t// can interleave - input gate blocks new events\n\t\tconst value = (await this.ctx.storage.get(\"count\")) ?? 0;\n\t\tawait this.ctx.storage.put(\"count\", value + 1);\n\t\treturn value + 1;\n\t}\n}\n```\n\n\n**Output gates** hold outgoing network messages (responses, fetch requests) until pending storage writes complete. This ensures clients never see confirmation of data that has not been persisted:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\n", "char_start": 23632, "char_end": 24409, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "b428ced7250cde14", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "export interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tasync sendMessage(userId: string, content: string): Promise {\n\t\t// Write to storage - don't need to await for correctness\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?)\",\n\t\t\tuserId,\n\t\t\tcontent,\n\t\t\tDate.now()\n\t\t);\n\n \t// This response is held by the output gate until the write completes.\n \t// The client only receives \"Message sent\" after data is safely persisted.\n \treturn \"Message sent\";\n }\n}\n\n```\n\n\n**Write coalescing:** Multiple storage writes without intervening `await` calls are automatically batched into a single atomic implicit transaction:\n\n", "char_start": 24409, "char_end": 25179, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "6ee2e225b06f96bc", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tACCOUNT: DurableObjectNamespace;\n}\n\nexport class Account extends DurableObject {\n\tasync transfer(fromId: string, toId: string, amount: number) {\n\t\t// \u2705 Good: These writes are coalesced into one atomic transaction\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"UPDATE accounts SET balance = balance - ? WHERE id = ?\",\n\t\t\tamount,\n\t\t\tfromId\n\t\t);\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"UPDATE accounts SET balance = balance + ? WHERE id = ?\",\n\t\t\tamount,\n\t\t\ttoId\n\t\t);\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"INSERT INTO transfers (from_id, to_id, amount, created_at) VALUES (?, ?, ?, ?)\",\n\t\t\tfromId,\n\t\t\ttoId,\n\t\t\tamount,\n\t\t\tDate.now()\n\t\t);\n\t\t// All three writes commit together atomically\n\t}\n\n", "char_start": 25179, "char_end": 25976, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "e1af7383b3ac6995", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\t// \ud83d\udd34 Bad: await on KV operations breaks coalescing\n\tasync transferBrokenKV(fromId: string, toId: string, amount: number) {\n\t\tconst fromBalance = (await this.ctx.storage.get(`balance:${fromId}`)) ?? 0;\n\t\tawait this.ctx.storage.put(`balance:${fromId}`, fromBalance - amount);\n\t\t// If the next write fails, the debit already committed!\n\t\tconst toBalance = (await this.ctx.storage.get(`balance:${toId}`)) ?? 0;\n\t\tawait this.ctx.storage.put(`balance:${toId}`, toBalance + amount);\n\t}\n}\n```\n\n\n\nFor more details, see [Durable Objects: Easy, Fast, Correct \u2014 Choose three](https://blog.cloudflare.com/durable-objects-easy-fast-correct-choose-three/) and the [glossary](/durable-objects/reference/glossary/).\n\n", "char_start": 25976, "char_end": 26713, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "23f22c7221df83d3", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "### Avoid race conditions with non-storage I/O\n\nInput gates only protect during storage operations. Non-storage I/O like `fetch()` or writing to R2 allows other requests to interleave, which can cause race conditions:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tPROCESSOR: DurableObjectNamespace;\n}\n\nexport class Processor extends DurableObject {\n\t// \u26a0\ufe0f Potential race condition: fetch() allows interleaving\n\tasync processItem(id: string) {\n\t\tconst item = await this.ctx.storage.get<{ status: string }>(`item:${id}`);\n\n \tif (item?.status === \"pending\") {\n \t\t// During this fetch, other requests CAN execute and modify storage\n \t\tconst result = await fetch(\"https://api.example.com/process\");\n\n", "char_start": 26713, "char_end": 27511, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "17f9f4a35fe37a88", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " \t\t// Another request may have already processed this item!\n \t\tawait this.ctx.storage.put(`item:${id}`, { status: \"completed\" });\n \t}\n }\n}\n\n```\n\n\nTo handle this, use optimistic locking (check-and-set) patterns: read a version number before the external call, then verify it has not changed before writing.\n\n:::note\n\nWith the legacy KV storage backend, use the [`transaction()`](/durable-objects/api/sqlite-storage-api/#transaction) method for atomic read-modify-write operations across async boundaries.\n\n:::\n\n", "char_start": 27511, "char_end": 28053, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "e15aefd9deb414c8", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "### Use `blockConcurrencyWhile()` sparingly\n\nThe [`blockConcurrencyWhile()`](/durable-objects/api/state/#blockconcurrencywhile) method guarantees that no other events are processed until the provided callback completes, even if the callback performs asynchronous I/O. This is useful for operations that must be atomic, such as state initialization from storage in the constructor:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tconstructor(ctx: DurableObjectState, env: Env) {\n\t\tsuper(ctx, env);\n\n", "char_start": 28053, "char_end": 28727, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "ba31f118aea4f623", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\t\t// \u2705 Good: Use blockConcurrencyWhile for one-time initialization\n\t\tctx.blockConcurrencyWhile(async () => {\n\t\t\tthis.ctx.storage.sql.exec(`\n\t\t\t\tCREATE TABLE IF NOT EXISTS messages (\n\t\t\t\t\tid INTEGER PRIMARY KEY,\n\t\t\t\t\tcontent TEXT\n\t\t\t\t)\n\t\t\t`);\n\t\t});\n\t}\n\n\t// \ud83d\udd34 Bad: Don't use blockConcurrencyWhile on every request\n\tasync sendMessageSlow(content: string) {\n\t\tawait this.ctx.blockConcurrencyWhile(async () => {\n\t\t\tthis.ctx.storage.sql.exec(\n\t\t\t\t\"INSERT INTO messages (content) VALUES (?)\",\n\t\t\t\tcontent\n\t\t\t);\n\t\t});\n\t\t// If this takes ~5ms, you're limited to ~200 requests/second\n\t}\n\n", "char_start": 28727, "char_end": 29305, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "8d02e1ca814bb823", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\t// \u2705 Good: Let output gates handle consistency\n\tasync sendMessageFast(content: string) {\n\t\tthis.ctx.storage.sql.exec(\n\t\t\t\"INSERT INTO messages (content) VALUES (?)\",\n\t\t\tcontent\n\t\t);\n\t\t// Output gate ensures write completes before response is sent\n\t\t// Other requests can be processed concurrently\n\t}\n}\n```\n\n\n\nBecause `blockConcurrencyWhile()` blocks _all_ concurrency unconditionally, it significantly reduces throughput. If each call takes ~5ms, that individual Durable Object is limited to approximately 200 requests/second. Reserve it for initialization and migrations, not regular request handling. For normal operations, rely on input/output gates and write coalescing instead.\n\n", "char_start": 29305, "char_end": 30010, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "c13caa0e400a8e97", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "For atomic read-modify-write operations during request handling, prefer [`transaction()`](/durable-objects/api/sqlite-storage-api/#transaction) over `blockConcurrencyWhile()`. Transactions provide atomicity for storage operations without blocking unrelated concurrent requests.\n\n:::caution\n\nUsing `blockConcurrencyWhile()` across I/O operations (such as `fetch()`, KV, R2, or other external API calls) is an anti-pattern. This is equivalent to holding a lock across I/O in other languages or concurrency frameworks \u2014 it blocks all other requests while waiting for slow external operations, severely degrading throughput. Keep `blockConcurrencyWhile()` callbacks fast and limited to local storage operations.\n\n:::\n\n", "char_start": 30010, "char_end": 30724, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "213975f9baee0ec4", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "## Communication and API design\n\n### Use RPC methods instead of the `fetch()` handler\n\nProjects with a [compatibility date](/workers/configuration/compatibility-flags/) of `2024-04-03` or later should use RPC methods. RPC is more ergonomic, provides better type safety, and eliminates manual request/response parsing.\n\nDefine public methods on your Durable Object class, and call them directly from stubs with full TypeScript support:\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\t// Type parameter provides typed method calls on the stub\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\ntype Message = {\nid: number;\nuserId: string;\ncontent: string;\ncreatedAt: number;\n};\n\n", "char_start": 30724, "char_end": 31475, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "3c4a0e520a6236e3", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "export class ChatRoom extends DurableObject {\n\t// Public methods are automatically exposed as RPC endpoints\n\tasync sendMessage(userId: string, content: string): Promise {\n\t\tconst createdAt = Date.now();\n\t\tconst result = this.ctx.storage.sql.exec<{ id: number }>(\n\t\t\t\"INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?) RETURNING id\",\n\t\t\tuserId,\n\t\t\tcontent,\n\t\t\tcreatedAt\n\t\t);\n\t\tconst { id } = result.one();\n\t\treturn { id, userId, content, createdAt };\n\t}\n\n async getMessages(limit: number = 50): Promise {\n \tconst cursor = this.ctx.storage.sql.exec<{\n \t\tid: number;\n \t\tuser_id: string;\n \t\tcontent: string;\n \t\tcreated_at: number;\n \t}>(\"SELECT * FROM messages ORDER BY created_at DESC LIMIT ?\", limit);\n\n", "char_start": 31475, "char_end": 32239, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "f21395231bc0503f", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " \treturn cursor.toArray().map((row) => ({\n \t\tid: row.id,\n \t\tuserId: row.user_id,\n \t\tcontent: row.content,\n \t\tcreatedAt: row.created_at,\n \t}));\n }\n}\n\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\tconst url = new URL(request.url);\n\t\tconst roomId = url.searchParams.get(\"room\") ?? \"lobby\";\n\n \tconst id = env.CHAT_ROOM.idFromName(roomId);\n \t// stub is typed as DurableObjectStub\n \tconst stub = env.CHAT_ROOM.get(id);\n\n", "char_start": 32239, "char_end": 32728, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "5116d60db8cc686e", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " \tif (request.method === \"POST\") {\n \t\tconst { userId, content } = await request.json<{\n \t\t\tuserId: string;\n \t\t\tcontent: string;\n \t\t}>();\n \t\t// Direct method call with full type checking\n \t\tconst message = await stub.sendMessage(userId, content);\n \t\treturn Response.json(message);\n \t}\n\n \t// TypeScript knows getMessages() returns Promise\n \tconst messages = await stub.getMessages(100);\n \treturn Response.json(messages);\n },\n};\n\n```\n\n\nRefer to [Invoke methods](/durable-objects/best-practices/create-durable-object-stubs-and-send-requests/) for more details on RPC and the legacy `fetch()` handler.\n\n", "char_start": 32728, "char_end": 33396, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "4af4d54230d2489d", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "### Initialize Durable Objects explicitly with an `init()` method\n\nDurable Objects do not know their own name or ID from within. If your Durable Object needs to know its identity (for example, to store a reference to itself or to communicate with related objects), you must explicitly initialize it.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tprivate roomId: string | null = null;\n\n", "char_start": 33396, "char_end": 33959, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "8679a223aa63bb4a", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\t// Call this after creating the Durable Object for the first time\n\tasync init(roomId: string, createdBy: string) {\n\t\t// Check if already initialized\n\t\tconst existing = await this.ctx.storage.get(\"roomId\");\n\t\tif (existing) {\n\t\t\treturn; // Already initialized\n\t\t}\n\n\t\t// Store the identity\n\t\tawait this.ctx.storage.put(\"roomId\", roomId);\n\t\tawait this.ctx.storage.put(\"createdBy\", createdBy);\n\t\tawait this.ctx.storage.put(\"createdAt\", Date.now());\n\n\t\t// Cache in memory for this session\n\t\tthis.roomId = roomId;\n\t}\n\n\tasync getRoomId(): Promise {\n\t\tif (this.roomId) {\n\t\t\treturn this.roomId;\n\t\t}\n\n\t\tconst stored = await this.ctx.storage.get(\"roomId\");\n\t\tif (!stored) {\n\t\t\tthrow new Error(\"ChatRoom not initialized. Call init() first.\");\n\t\t}\n\n\t\tthis.roomId = stored;\n\t\treturn stored;\n\t}\n}\n\n", "char_start": 33959, "char_end": 34758, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "3284947e4f47e4ca", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "export default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\tconst url = new URL(request.url);\n\t\tconst roomId = url.searchParams.get(\"room\") ?? \"lobby\";\n\n\t\tconst id = env.CHAT_ROOM.idFromName(roomId);\n\t\tconst stub = env.CHAT_ROOM.get(id);\n\n\t\t// Initialize on first access\n\t\tawait stub.init(roomId, \"system\");\n\n\t\treturn new Response(`Room ${await stub.getRoomId()} ready`);\n\t},\n};\n```\n\n\n\n### Always `await` RPC calls\n\nWhen calling methods on a Durable Object stub, always use `await`. Unawaited calls create dangling promises, causing errors to be swallowed and return values to be lost.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\n", "char_start": 34758, "char_end": 35557, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "17383246e5b08f94", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "export class ChatRoom extends DurableObject {\n\tasync sendMessage(userId: string, content: string): Promise {\n\t\tconst result = this.ctx.storage.sql.exec<{ id: number }>(\n\t\t\t\"INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?) RETURNING id\",\n\t\t\tuserId,\n\t\t\tcontent,\n\t\t\tDate.now()\n\t\t);\n\t\treturn result.one().id;\n\t}\n}\n\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\tconst id = env.CHAT_ROOM.idFromName(\"lobby\");\n\t\tconst stub = env.CHAT_ROOM.get(id);\n\n \t// \ud83d\udd34 Bad: Not awaiting the call\n \t// The message ID is lost, and any errors are swallowed\n \tstub.sendMessage(\"user-123\", \"Hello\");\n\n \t// \u2705 Good: Properly awaited\n \tconst messageId = await stub.sendMessage(\"user-123\", \"Hello\");\n\n", "char_start": 35557, "char_end": 36312, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "24260a18ba161312", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " \treturn Response.json({ messageId });\n },\n};\n\n```\n\n\n## Error handling\n\n### Handle errors and use exception boundaries\n\nUncaught exceptions in a Durable Object can leave it in an unknown state and may cause the runtime to terminate the instance. Wrap risky operations in `try...catch` blocks, and handle errors appropriately.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\n", "char_start": 36312, "char_end": 36836, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "7d6436f073b9954b", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "export class ChatRoom extends DurableObject {\n\tasync processMessage(userId: string, content: string) {\n\t\t// \u2705 Good: Wrap risky operations in try...catch\n\t\ttry {\n\t\t\t// Validate input before processing\n\t\t\tif (!content || content.length > 10000) {\n\t\t\t\tthrow new Error(\"Invalid message content\");\n\t\t\t}\n\n\t\t\tthis.ctx.storage.sql.exec(\n\t\t\t\t\"INSERT INTO messages (user_id, content, created_at) VALUES (?, ?, ?)\",\n\t\t\t\tuserId,\n\t\t\t\tcontent,\n\t\t\t\tDate.now()\n\t\t\t);\n\n\t\t\t// External call that might fail\n\t\t\tawait this.notifySubscribers(content);\n\t\t} catch (error) {\n\t\t\t// Log the error for debugging\n\t\t\tconsole.error(\"Failed to process message:\", error);\n\n\t\t\t// Re-throw if it's a validation error (don't retry)\n\t\t\tif (error instanceof Error && error.message.includes(\"Invalid\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\n", "char_start": 36836, "char_end": 37630, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "8c1bcf311f65af6f", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\t\t\t// For transient errors, you might want to handle differently\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate async notifySubscribers(content: string) {\n\t\t// External notification logic\n\t}\n}\n```\n\n\n\nWhen calling Durable Objects from a Worker, errors may include `.retryable` and `.overloaded` properties indicating whether the operation can be retried. For transient failures, implement exponential backoff to avoid overwhelming the system.\n\nRefer to [Error handling](/durable-objects/best-practices/error-handling/) for details on error properties, retry strategies, and exponential backoff patterns.\n\n", "char_start": 37630, "char_end": 38240, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "33b61a0f174ac753", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "## WebSockets and real-time\n\n### Use the Hibernatable WebSockets API for cost efficiency\n\nThe Hibernatable WebSockets API allows Durable Objects to sleep while maintaining WebSocket connections. This significantly reduces costs for applications with many idle connections.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tasync fetch(request: Request): Promise {\n\t\tconst url = new URL(request.url);\n\n \tif (url.pathname === \"/websocket\") {\n \t\t// Check for WebSocket upgrade\n \t\tif (request.headers.get(\"Upgrade\") !== \"websocket\") {\n \t\t\treturn new Response(\"Expected WebSocket\", { status: 400 });\n \t\t}\n\n", "char_start": 38240, "char_end": 39040, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "de8de57810d23bd0", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " \t\tconst pair = new WebSocketPair();\n \t\tconst [client, server] = Object.values(pair);\n\n \t\t// Accept the WebSocket with Hibernation API\n \t\tthis.ctx.acceptWebSocket(server);\n\n \t\treturn new Response(null, { status: 101, webSocket: client });\n \t}\n\n \treturn new Response(\"Not found\", { status: 404 });\n }\n\n // Called when a message is received (even after hibernation)\n async webSocketMessage(ws: WebSocket, message: string | ArrayBuffer) {\n \tconst data = typeof message === \"string\" ? message : \"binary data\";\n\n \t// Broadcast to all connected clients\n \tfor (const client of this.ctx.getWebSockets()) {\n \t\tif (client !== ws && client.readyState === WebSocket.OPEN) {\n \t\t\tclient.send(data);\n \t\t}\n \t}\n }\n\n", "char_start": 39040, "char_end": 39792, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "324b2b24cbc37331", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " // Called when a WebSocket is closed\n async webSocketClose(\n \tws: WebSocket,\n \tcode: number,\n \treason: string,\n \twasClean: boolean\n ) {\n \t// With web_socket_auto_reply_to_close (compat date >= 2026-04-07), the runtime\n \t// auto-replies to Close frames. Calling close() is safe but no longer required.\n \tws.close(code, reason);\n \tconsole.log(`WebSocket closed: ${code} ${reason}`);\n }\n\n // Called when a WebSocket error occurs\n async webSocketError(ws: WebSocket, error: unknown) {\n \tconsole.error(\"WebSocket error:\", error);\n }\n}\n\n```\n\n\n", "char_start": 39792, "char_end": 40398, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "ff4237ded3ab7f88", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "With the Hibernation API, your Durable Object can go to sleep when there is no active JavaScript execution, but WebSocket connections remain open. When a message arrives, the Durable Object wakes up automatically.\n\nBest practices:\n\n", "char_start": 40398, "char_end": 40630, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "a1acb6018efb839d", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "- The [WebSocket Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api) exposes `webSocketError`, `webSocketMessage`, and `webSocketClose` handlers for their respective WebSocket events.\n- With the [`web_socket_auto_reply_to_close`](/workers/configuration/compatibility-flags/#websocket-auto-reply-to-close) compatibility flag (enabled by default on compatibility dates on or after `2026-04-07`), the runtime automatically completes the close handshake. Calling `ws.close()` in `webSocketClose` is still safe but no longer required. On older compatibility dates, you **must** call `ws.close()` to avoid `1006` abnormal closure errors.\n\nRefer to [WebSockets](/durable-objects/best-practices/websockets/) for more details.\n\n", "char_start": 40630, "char_end": 41401, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "600299afe420b4ee", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "### Use `serializeAttachment()` to persist per-connection state\n\nWebSocket attachments let you store metadata for each connection that survives hibernation. Use this for user IDs, session tokens, or other per-connection data.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\ntype ConnectionState = {\n\tuserId: string;\n\tusername: string;\n\tjoinedAt: number;\n};\n\nexport class ChatRoom extends DurableObject {\n\tasync fetch(request: Request): Promise {\n\t\tconst url = new URL(request.url);\n\n\t\tif (url.pathname === \"/websocket\") {\n\t\t\tif (request.headers.get(\"Upgrade\") !== \"websocket\") {\n\t\t\t\treturn new Response(\"Expected WebSocket\", { status: 400 });\n\t\t\t}\n\n", "char_start": 41401, "char_end": 42189, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "edbe3beadfda58c9", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\t\t\tconst userId = url.searchParams.get(\"userId\") ?? \"anonymous\";\n\t\t\tconst username = url.searchParams.get(\"username\") ?? \"Anonymous\";\n\n\t\t\tconst pair = new WebSocketPair();\n\t\t\tconst [client, server] = Object.values(pair);\n\n\t\t\tthis.ctx.acceptWebSocket(server);\n\n\t\t\t// Store per-connection state that survives hibernation\n\t\t\tconst state: ConnectionState = {\n\t\t\t\tuserId,\n\t\t\t\tusername,\n\t\t\t\tjoinedAt: Date.now(),\n\t\t\t};\n\t\t\tserver.serializeAttachment(state);\n\n\t\t\t// Broadcast join message\n\t\t\tthis.broadcast(`${username} joined the chat`);\n\n\t\t\treturn new Response(null, { status: 101, webSocket: client });\n\t\t}\n\n\t\treturn new Response(\"Not found\", { status: 404 });\n\t}\n\n", "char_start": 42189, "char_end": 42849, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "5dbbec48f2166e88", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\tasync webSocketMessage(ws: WebSocket, message: string | ArrayBuffer) {\n\t\t// Retrieve the connection state (works even after hibernation)\n\t\tconst state = ws.deserializeAttachment() as ConnectionState;\n\n\t\tconst chatMessage = JSON.stringify({\n\t\t\tuserId: state.userId,\n\t\t\tusername: state.username,\n\t\t\tcontent: message,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\n\t\tthis.broadcast(chatMessage);\n\t}\n\n\tasync webSocketClose(ws: WebSocket, code: number, reason: string) {\n\t\t// With web_socket_auto_reply_to_close (compat date >= 2026-04-07), the runtime\n\t\t// auto-replies to Close frames. Calling close() is safe but no longer required.\n\t\tws.close(code, reason);\n\t\tconst state = ws.deserializeAttachment() as ConnectionState;\n\t\tthis.broadcast(`${state.username} left the chat`);\n\t}\n\n", "char_start": 42849, "char_end": 43613, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "c4b66e923bd86c2d", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\tprivate broadcast(message: string) {\n\t\tfor (const client of this.ctx.getWebSockets()) {\n\t\t\tif (client.readyState === WebSocket.OPEN) {\n\t\t\t\tclient.send(message);\n\t\t\t}\n\t\t}\n\t}\n}\n```\n\n\n\n## Scheduling and lifecycle\n\n### Use alarms for per-entity scheduled tasks\n\nEach Durable Object can schedule its own future work using the [Alarms API](/durable-objects/api/alarms/), allowing a Durable Object to execute background tasks on any interval without an incoming request, RPC call, or WebSocket message.\n\nKey points about alarms:\n\n", "char_start": 43613, "char_end": 44157, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "d6797584f5e8ac28", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "- **`setAlarm(timestamp)`** schedules the `alarm()` handler to run at any time in the future (millisecond precision)\n- **Alarms do not repeat automatically** \u2014 you must call `setAlarm()` again to schedule the next execution\n- **Only schedule alarms when there is work to do** \u2014 avoid waking up every Durable Object on short intervals (seconds), as each alarm invocation incurs costs\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tGAME_MATCH: DurableObjectNamespace;\n}\n\nexport class GameMatch extends DurableObject {\n\tasync startGame(durationMs: number = 60000) {\n\t\tawait this.ctx.storage.put(\"gameStarted\", Date.now());\n\t\tawait this.ctx.storage.put(\"gameActive\", true);\n\n", "char_start": 44157, "char_end": 44921, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "9c9c1a8d82ac597a", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " \t// Schedule the game to end after the duration\n \tawait this.ctx.storage.setAlarm(Date.now() + durationMs);\n }\n\n // Called when the alarm fires\n async alarm(alarmInfo?: AlarmInvocationInfo) {\n \tconst isActive = await this.ctx.storage.get(\"gameActive\");\n\n \tif (!isActive) {\n \t\treturn; // Game was already ended\n \t}\n\n \t// End the game\n \tawait this.ctx.storage.put(\"gameActive\", false);\n \tawait this.ctx.storage.put(\"gameEnded\", Date.now());\n\n", "char_start": 44921, "char_end": 45407, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "a21f8e2a3d6c84b5", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " \t// Calculate final scores, notify players, etc.\n \ttry {\n \t\tawait this.calculateFinalScores();\n \t} catch (err) {\n \t\t// If we're almost out of retries but still have work to do, schedule a new alarm\n \t\t// rather than letting our retries run out to ensure we keep getting invoked.\n \t\tif (alarmInfo && alarmInfo.retryCount >= 5) {\n \t\t\tawait this.ctx.storage.setAlarm(Date.now() + 30 * 1000);\n \t\t\treturn;\n \t\t}\n \t\tthrow err;\n \t}\n\n \t// Schedule the next alarm only if there's more work to do\n \t// In this case, schedule cleanup in 24 hours\n \tawait this.ctx.storage.setAlarm(Date.now() + 24 * 60 * 60 * 1000);\n }\n\n private async calculateFinalScores() {\n \t// Game ending logic\n }\n}\n\n```\n\n\n", "char_start": 45407, "char_end": 46167, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "6e45190873263bc1", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "### Make alarm handlers idempotent\n\nIn rare cases, alarms may fire more than once. Your `alarm()` handler should be safe to run multiple times without causing issues.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tSUBSCRIPTION: DurableObjectNamespace;\n}\n\nexport class Subscription extends DurableObject {\n\tasync alarm() {\n\t\t// \u2705 Good: Check state before performing the action\n\t\tconst lastRenewal = await this.ctx.storage.get(\"lastRenewal\");\n\t\tconst renewalPeriod = 30 * 24 * 60 * 60 * 1000; // 30 days\n\n", "char_start": 46167, "char_end": 46774, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "5bf55a6cd102cced", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\t\t// If we already renewed recently, don't do it again\n\t\tif (lastRenewal && Date.now() - lastRenewal < renewalPeriod - 60000) {\n\t\t\tconsole.log(\"Already renewed recently, skipping\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Perform the renewal\n\t\tconst success = await this.processRenewal();\n\n\t\tif (success) {\n\t\t\t// Record the renewal time\n\t\t\tawait this.ctx.storage.put(\"lastRenewal\", Date.now());\n\n\t\t\t// Schedule the next renewal\n\t\t\tawait this.ctx.storage.setAlarm(Date.now() + renewalPeriod);\n\t\t} else {\n\t\t\t// Retry in 1 hour\n\t\t\tawait this.ctx.storage.setAlarm(Date.now() + 60 * 60 * 1000);\n\t\t}\n\t}\n\n\tprivate async processRenewal(): Promise {\n\t\t// Payment processing logic\n\t\treturn true;\n\t}\n}\n```\n\n\n\n", "char_start": 46774, "char_end": 47482, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "89b195cba5a7a9df", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "### Clean up storage with `deleteAll()`\n\nTo fully clear a Durable Object's storage, call `deleteAll()`. Simply deleting individual keys or dropping tables is not sufficient, as some internal metadata may remain. Workers with a compatibility date before [2026-02-24](/workers/configuration/compatibility-flags/#durable-object-deleteall-deletes-alarms) and an alarm set should delete the alarm first with `deleteAlarm()`.\n\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCHAT_ROOM: DurableObjectNamespace;\n}\n\nexport class ChatRoom extends DurableObject {\n\tasync clearStorage() {\n\n \t// Delete all storage, including any set alarm\n \tawait this.ctx.storage.deleteAll();\n\n", "char_start": 47482, "char_end": 48244, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "6bfafe1888d6e53e", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " \t// The Durable Object instance still exists, but with empty storage\n \t// A subsequent request will find no data\n }\n}\n\n```\n\n\n### Design for unexpected shutdowns\n\n\n\n## Anti-patterns to avoid\n\n### Do not use a single Durable Object as a global singleton\n\nA single Durable Object handling all traffic becomes a bottleneck. While async operations allow request interleaving, all synchronous JavaScript execution is single-threaded, and storage operations provide serialization guarantees that limit throughput.\n\nA common mistake is using a Durable Object for global rate limiting or global counters. This funnels all traffic through a single instance:\n\n", "char_start": 48244, "char_end": 48997, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "c91cf8af26981f89", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tRATE_LIMITER: DurableObjectNamespace;\n}\n\n// \ud83d\udd34 Bad: Global rate limiter - ALL requests go through one instance\nexport class RateLimiter extends DurableObject {\n\tasync checkLimit(ip: string): Promise {\n\t\tconst key = `rate:${ip}`;\n\t\tconst count = (await this.ctx.storage.get(key)) ?? 0;\n\t\tawait this.ctx.storage.put(key, count + 1);\n\t\treturn count < 100;\n\t}\n}\n\n", "char_start": 48997, "char_end": 49513, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "2fec2fb4c71e5191", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "// \ud83d\udd34 Bad: Always using the same ID creates a global bottleneck\nexport default {\n\tasync fetch(request: Request, env: Env): Promise {\n\t\t// Every single request to your application goes through this one DO\n\t\tconst limiter = env.RATE_LIMITER.get(\n\t\t\tenv.RATE_LIMITER.idFromName(\"global\")\n\t\t);\n\n\t\tconst ip = request.headers.get(\"CF-Connecting-IP\") ?? \"unknown\";\n\t\tconst allowed = await limiter.checkLimit(ip);\n\n\t\tif (!allowed) {\n\t\t\treturn new Response(\"Rate limited\", { status: 429 });\n\t\t}\n\n\t\treturn new Response(\"OK\");\n\t},\n};\n```\n\n\n\n", "char_start": 49513, "char_end": 50072, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "74053327942007ff", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "This pattern does not scale. As traffic increases, the single Durable Object becomes a chokepoint. Instead, identify natural coordination boundaries in your application (per user, per room, per document) and create separate Durable Objects for each.\n\n## Testing and migrations\n\n### Test with Vitest and plan for class migrations\n\nUse `@cloudflare/vitest-pool-workers` for testing Durable Objects. The integration provides utilities for direct instance access.\n\n\n```ts\nimport { env } from \"cloudflare:workers\";\nimport {\n\trunInDurableObject,\n\trunDurableObjectAlarm,\n} from \"cloudflare:test\";\nimport { describe, it, expect } from \"vitest\";\n\ndescribe(\"ChatRoom\", () => {\n\n", "char_start": 50072, "char_end": 50793, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "a93d5b02b62a1c93", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "it(\"should send and retrieve messages\", async () => {\nconst id = env.CHAT_ROOM.idFromName(\"test-room\");\nconst stub = env.CHAT_ROOM.get(id);\n\n \t// Call RPC methods directly on the stub\n \tawait stub.sendMessage(\"user-1\", \"Hello!\");\n \tawait stub.sendMessage(\"user-2\", \"Hi there!\");\n\n \tconst messages = await stub.getMessages(10);\n \texpect(messages).toHaveLength(2);\n });\n\n it(\"can access instance internals and trigger alarms\", async () => {\n \tconst id = env.CHAT_ROOM.idFromName(\"test-room\");\n \tconst stub = env.CHAT_ROOM.get(id);\n\n", "char_start": 50793, "char_end": 51350, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "d7ce9ed9816b5696", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": " \t// Access storage directly for verification\n \tawait runInDurableObject(stub, async (instance, state) => {\n \t\tconst count = state.storage.sql\n \t\t\t.exec<{ count: number }>(\"SELECT COUNT(*) as count FROM messages\")\n \t\t\t.one();\n \t\texpect(count.count).toBe(2);\n \t});\n\n \t// Trigger alarms immediately without waiting\n \tconst alarmRan = await runDurableObjectAlarm(stub);\n \texpect(alarmRan).toBe(false); // No alarm was scheduled\n });\n});\n\n```\n\n\nConfigure Vitest in your `vitest.config.ts`:\n\n```ts\nimport { cloudflareTest } from \"@cloudflare/vitest-pool-workers\";\nimport { defineConfig } from \"vitest/config\";\n\nexport default defineConfig({\n\tplugins: [\n\t\tcloudflareTest({\n\t\t\twrangler: { configPath: \"./wrangler.jsonc\" },\n\t\t}),\n\t],\n});\n```\n\n", "char_start": 51350, "char_end": 52138, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "34a01f6c0b5d7b1c", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "For schema changes, run migrations in the constructor using `blockConcurrencyWhile()`. For class renames or deletions, use Wrangler migrations:\n\n\n```jsonc\n{\n \"migrations\": [\n // Rename a class\n { \"tag\": \"v2\", \"renamed_classes\": [{ \"from\": \"OldChatRoom\", \"to\": \"ChatRoom\" }] },\n // Delete a class (removes all data!)\n { \"tag\": \"v3\", \"deleted_classes\": [\"DeprecatedRoom\"] }\n ]\n}\n```\n\n\nRefer to [Durable Objects migrations](/durable-objects/reference/durable-objects-migrations/) for more details on class migrations, and [Testing with Durable Objects](/durable-objects/examples/testing-with-durable-objects/) for comprehensive testing patterns including SQLite queries and alarm testing.\n\n", "char_start": 52138, "char_end": 52872, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "03656d86eb13b3b1", "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", "text": "## Related resources\n\n- [Workers Best Practices](/workers/best-practices/workers-best-practices/): code patterns for request handling, observability, and security that apply to the Workers calling your Durable Objects.\n- [Rules of Workflows](/workflows/build/rules-of-workflows/): best practices for durable, multi-step Workflows \u2014 useful when combining Workflows with Durable Objects for long-running orchestration.\n", "char_start": 52872, "char_end": 53289, "metadata": {"title": "rules-of-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", "format": "markdown", "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9"}} +{"chunk_id": "090da84d4cbb71cd", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "---\ntitle: Lifecycle of a Durable Object\ndescription: Understand how a Durable Object is created, activated, handles requests, and is eventually evicted.\npcx_content_type: concept\nsidebar:\n order: 3\nproducts:\n - durable-objects\n---\n\nimport { Render } from \"~/components\";\n\nThis section describes the lifecycle of a [Durable Object](/durable-objects/concepts/what-are-durable-objects/).\n\nTo use a Durable Object you need to create a [Durable Object Stub](/durable-objects/api/stub/).\nSimply creating the Durable Object Stub does not send a request to the Durable Object, and therefore the Durable Object is not yet instantiated.\nA request is sent to the Durable Object and its lifecycle begins only once a method is invoked on the Durable Object Stub.\n\n", "char_start": 0, "char_end": 754, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "b394fc01f2a79c84", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "```js\nconst stub = env.MY_DURABLE_OBJECT.getByName(\"foo\");\n// Now the request is sent to the remote Durable Object.\nconst rpcResponse = await stub.sayHello();\n```\n\n## Durable Object Lifecycle state transitions\n\nA Durable Object can be in one of the following states at any moment:\n\n", "char_start": 754, "char_end": 1036, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "51968ce675d80be1", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "| State | Description |\n| ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **Active, in-memory** | The Durable Object runs, in memory, and handles incoming requests. ", "char_start": 1036, "char_end": 1836, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "4009f0750a6bc08a", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "equests. ", "char_start": 1716, "char_end": 1904, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "b746a862c0b2021d", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "|\n| **Idle, in-memory non-hibernateable** | The Durable Object waits for the next incoming request/event, but does not satisfy the criteria for hibernation. |\n| **Idle, in-memory hibernateable** | The Durable Object waits for the next incoming request/event and satisfies the criteria for hibernation. It is up to the runtime to decide when to hibernate the Durable Object. Currently, it is after 10 seconds of inactivity while in this state. |\n| **Hibernated** | The Durable Object is removed from memory. ", "char_start": 1904, "char_end": 2571, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "ad2084b82f0f8ff4", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "Hibernated WebSocket connections stay connected. |\n| **Inactive** | The Durable Object is completely removed from the host process and might need to cold start. This is the initial state of all Durable Objects. |\n\n", "char_start": 2571, "char_end": 3067, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "d041ead3352ed135", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "This is how a Durable Object transitions among these states (each state is in a rounded rectangle).\n\n![Lifecycle of a Durable Object](~/assets/images/durable-objects/durable-object-lifecycle.png)\n\nAssuming a Durable Object does not run, the first incoming request or event (like an alarm) will execute the `constructor()` of the Durable Object class, then run the corresponding function invoked.\n\nAt this point the Durable Object is in the **active in-memory state**.\n\nOnce all incoming requests or events have been processed, the Durable Object remains idle in-memory for a few seconds either in a hibernateable state or in a non-hibernateable state.\n\nHibernation can only occur if **all** of the conditions below are true:\n\n", "char_start": 3067, "char_end": 3793, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "08e366e03ef80618", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "- No `setTimeout`/`setInterval` scheduled callbacks are set, since there would be no way to recreate the callback after hibernating.\n- No in-progress awaited `fetch()` exists, since it is considered to be waiting for I/O.\n- No WebSocket standard API is used.\n- No request/event is still being processed, because hibernating would mean losing track of the async function which is eventually supposed to return a response to that request.\n- No active outbound TCP socket (`connect()`) or outbound WebSocket connection exists.\n\nAfter 10 seconds of no incoming request or event, and all the above conditions satisfied, the Durable Object will transition into the **hibernated** state.\n\n", "char_start": 3793, "char_end": 4475, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "3d69aa3d7e4d79c4", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": ":::caution\nWhen hibernated, the in-memory state is discarded, so ensure you persist all important information in the Durable Object's storage.\n:::\n\nIf any of the above conditions is false, the Durable Object remains in-memory, in the **idle, in-memory, non-hibernateable** state.\n\nIn case of an incoming request or event while in the **hibernated** state, the `constructor()` will run again, and the Durable Object will transition to the **active, in-memory** state and execute the invoked function.\n\nWhile in the **idle, in-memory, non-hibernateable** state, after 70-140 seconds of inactivity (no incoming requests or events), the Durable Object will be evicted entirely from memory and potentially from the Cloudflare host and transition to the **inactive** state.\n\n", "char_start": 4475, "char_end": 5244, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "2e903f27b08a8132", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": ":::note[Outbound connections keep Durable Objects alive]\nActive outbound connections created via [`connect()`](/workers/runtime-apis/tcp-sockets/) (TCP) or an outbound WebSocket prevent the Durable Object from being evicted. Eviction is deferred until both conditions are met: all outbound connections have closed, **and** the standard 70-140 second inactivity window has elapsed with no incoming requests or events.\n\nWhile kept alive by an outbound connection, the Durable Object remains in memory in the **idle, in-memory, non-hibernateable** state and continues to [incur duration charges](/durable-objects/platform/pricing/#when-does-a-durable-object-incur-duration-charges).\n\n", "char_start": 5244, "char_end": 5925, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "5e54a7890f029f54", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "Each outbound connection keeps the Durable Object alive for a maximum of 15 minutes. After 15 minutes, the connection stops preventing eviction (the connection itself continues operating), and the [standard eviction rules](/durable-objects/concepts/durable-object-lifecycle/#durable-object-lifecycle-state-transitions) resume.\n\nThis applies to outbound TCP sockets and outbound WebSockets (including a `fetch()` request upgraded to a WebSocket via `Upgrade: websocket`). It does not apply to plain `fetch()` subrequests. Those never keep the Durable Object alive, even while the response body is still streaming.\n:::\n\n", "char_start": 5925, "char_end": 6543, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "bbe2526a17cd2871", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "Objects in the **hibernated** state keep their Websocket clients connected, and the runtime decides if and when to transition the object to the **inactive** state (for example deciding to move the object to a different host) thus restarting the lifecycle.\n\nThe next incoming request or event starts the cycle again.\n\n:::note[Lifecycle states incurring duration charges]\nA Durable Object incurs charges only when it is **actively running in-memory**, or when it is **idle in-memory and non-hibernateable** (indicated as green rectangles in the diagram).\n:::\n\n## Shutdown behavior\n\nDurable Objects will occasionally shut down and objects are restarted, which will run your Durable Object class constructor. This can happen for various reasons, including:\n\n", "char_start": 6543, "char_end": 7297, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "e98b6212892f3d2d", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "- New Worker [deployments](/workers/versions-and-deployments/) with code updates\n- Lack of requests to an object following the state transitions documented above\n- Cloudflare updates to the Workers runtime system\n- Workers runtime decisions on where to host objects\n\nWhen a Durable Object is shut down, the object instance is automatically restarted and new requests are routed to the new instance. In-flight requests are handled as follows:\n\n", "char_start": 7297, "char_end": 7740, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "3edc6765d8e57ac1", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "- **HTTP & RPC requests**: In-flight requests are allowed to finish if they do not access a Durable Object's storage. If a request attempts to access a Durable Object's storage, it will be stopped immediately and return an error to maintain Durable Objects global uniqueness property. When the Worker runtime system is being updated, in-flight requests have up to 30 seconds to complete.\n- **WebSocket connections**: WebSocket requests are terminated automatically during shutdown. This is so that the new instance can take over the connection as soon as possible.\n- **Other invocations (email, cron)**: Other invocations are treated similarly to HTTP requests.\n\n", "char_start": 7740, "char_end": 8404, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "f1d0cf14a60a551b", "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", "text": "It is important to ensure that any services using Durable Objects are designed to handle the possibility of a Durable Object being shut down.\n\n### Code updates\n\nWhen your Durable Object code is updated, your Worker and Durable Objects are released globally in an eventually consistent manner. This will cause a Durable Object to shut down, with the behavior described above. Updates can also create a situation where a request reaches a new version of your Worker in one location, and calls to a Durable Object still running a previous version elsewhere. Refer to [Code updates](/durable-objects/platform/known-issues/#code-updates) for more information about handling this scenario.\n\n### Working without shutdown hooks\n\n\n", "char_start": 8404, "char_end": 9200, "metadata": {"title": "durable-object-lifecycle", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", "format": "markdown", "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126"}} +{"chunk_id": "786f720749131492", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "---\ntitle: What are Durable Objects?\ndescription: Durable Objects provide globally unique, single-threaded compute instances with persistent storage on Cloudflare.\npcx_content_type: concept\nsidebar:\n order: 2\nproducts:\n - durable-objects\n---\n\nimport { Render } from \"~/components\";\n\n\n\n## Durable Objects highlights\n\nDurable Objects have properties that make them a great fit for distributed stateful scalable applications.\n\n**Serverless compute, zero infrastructure management**\n\n", "char_start": 0, "char_end": 550, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "a7ddae7e53b17960", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "- Durable Objects are built on-top of the Workers runtime, so they support exactly the same code (JavaScript and WASM), and similar memory and CPU limits.\n- Each Durable Object is [implicitly created on first access](/durable-objects/api/namespace/#get). User applications are not concerned with their lifecycle, creating them or destroying them. Durable Objects migrate among healthy servers, and therefore applications never have to worry about managing them.\n- Each Durable Object stays alive as long as requests are being processed, and remains alive for several seconds after being idle before hibernating, allowing applications to [exploit in-memory caching](/durable-objects/reference/in-memory-state/) while handling many consecutive requests and boosting their performance.\n\n", "char_start": 550, "char_end": 1334, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "a278914e7ec8ac65", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "**Storage colocated with compute**\n\n- Each Durable Object has its own [durable, transactional, and strongly consistent storage](/durable-objects/api/sqlite-storage-api/) (up to 10 GB[^1]), persisted across requests, and accessible only within that object.\n\n**Single-threaded concurrency**\n\n", "char_start": 1334, "char_end": 1624, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "673cb9eb8bb85d1e", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "- Each [Durable Object instance has an identifier](/durable-objects/api/id/), either randomly-generated or user-generated, which allows you to globally address which Durable Object should handle a specific action or request.\n- Durable Objects are single-threaded and cooperatively multi-tasked, just like code running in a web browser. For more details on how safety and correctness are achieved, refer to the blog post [\"Durable Objects: Easy, Fast, Correct \u2014 Choose three\"](https://blog.cloudflare.com/durable-objects-easy-fast-correct-choose-three/).\n\n**Elastic horizontal scaling across Cloudflare's global network**\n\n", "char_start": 1624, "char_end": 2246, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "2071ab72e70b8be5", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "- Durable Objects can be spread around the world, and you can [optionally influence where each instance should be located](/durable-objects/reference/data-location/#provide-a-location-hint). Durable Objects are not yet available in every Cloudflare data center; refer to the [where.durableobjects.live](https://where.durableobjects.live/) project for live locations.\n- Each Durable Object type (or [\"Namespace binding\"](/durable-objects/api/namespace/) in Cloudflare terms) corresponds to a JavaScript class implementing the actual logic. There is no hard limit on how many Durable Objects can be created for each namespace.\n- Durable Objects scale elastically as your application creates millions of objects. There is no need for applications to manage infrastructure or plan ahead for capacity.\n\n", "char_start": 2246, "char_end": 3044, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "f9dcd6cd9406897d", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "## Durable Objects features\n\n### In-memory state\n\nEach Durable Object has its own [in-memory state](/durable-objects/reference/in-memory-state/). Applications can use this in-memory state to optimize the performance of their applications by keeping important information in-memory, thereby avoiding the need to access the durable storage at all.\n\nUseful cases for in-memory state include batching and aggregating information before persisting it to storage, or for immediately rejecting/handling incoming requests meeting certain criteria, and more.\n\n", "char_start": 3044, "char_end": 3595, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "b0c5d38673304940", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "In-memory state is reset when the Durable Object hibernates after being idle for some time. Therefore, it is important to persist any in-memory data to the durable storage if that data will be needed at a later time when the Durable Object receives another request.\n\n### Storage API\n\nThe [Durable Object Storage API](/durable-objects/api/sqlite-storage-api/) allows Durable Objects to access fast, transactional, and strongly consistent storage. A Durable Object's attached storage is private to its unique instance and cannot be accessed by other objects.\n\nThere are two flavors of the storage API, a [key-value (KV) API](/durable-objects/api/legacy-kv-storage-api/) and an [SQL API](/durable-objects/api/sqlite-storage-api/).\n\n", "char_start": 3595, "char_end": 4324, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "e6830ba9b72b69b7", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "When using the [new SQLite in Durable Objects storage backend](/durable-objects/reference/durable-objects-migrations/#create-migration), you have access to both the APIs. However, if you use the previous storage backend you only have access to the key-value API.\n\n### Alarms API\n\nDurable Objects provide an [Alarms API](/durable-objects/api/alarms/) which allows you to schedule the Durable Object to be woken up at a time in the future. This is useful when you want to do certain work periodically, or at some specific point in time, without having to manually manage infrastructure such as job scheduling runners on your own.\n\n", "char_start": 4324, "char_end": 4953, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "055beb33dafa170f", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "You can combine Alarms with in-memory state and the durable storage API to build batch and aggregation applications such as queues, workflows, or advanced data pipelines.\n\n### WebSockets\n\nWebSockets are long-lived TCP connections that enable bi-directional, real-time communication between client and server. Because WebSocket sessions are long-lived, applications commonly use Durable Objects to accept either the client or server connection.\n\nBecause Durable Objects provide a single-point-of-coordination between Cloudflare Workers, a single Durable Object instance can be used in parallel with WebSockets to coordinate between multiple clients, such as participants in a chat room or a multiplayer game.\n\n", "char_start": 4953, "char_end": 5662, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "dcdcc68e619c45cc", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "Durable Objects support the [WebSocket Standard API](/durable-objects/best-practices/websockets/#websocket-standard-api), as well as the [WebSockets Hibernation API](/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api) which extends the Web Standard WebSocket API to reduce costs by not incurring billing charges during periods of inactivity.\n\n### RPC\n\nDurable Objects support Workers [Remote-Procedure-Call (RPC)](/workers/runtime-apis/rpc/) which allows applications to use JavaScript-native methods and objects to communicate between Workers and Durable Objects.\n\nUsing RPC for communication makes application development easier and simpler to reason about, and more efficient.\n\n", "char_start": 5662, "char_end": 6378, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "09c9f34b24269bfa", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "## Actor programming model\n\nAnother way to describe and think about Durable Objects is through the lens of the [Actor programming model](https://en.wikipedia.org/wiki/Actor_model). There are several popular examples of the Actor model supported at the programming language level through runtimes or library frameworks, like [Erlang](https://www.erlang.org/), [Elixir](https://elixir-lang.org/), [Akka](https://akka.io/), or [Microsoft Orleans for .NET](https://learn.microsoft.com/en-us/dotnet/orleans/overview).\n\n", "char_start": 6378, "char_end": 6892, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "a5ba8704e0beec96", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "The Actor model simplifies a lot of problems in distributed systems by abstracting away the communication between actors using RPC calls (or message sending) that could be implemented on-top of any transport protocol, and it avoids most of the concurrency pitfalls you get when doing concurrency through shared memory such as race conditions when multiple processes/threads access the same data in-memory.\n\nEach Durable Object instance can be seen as an Actor instance, receiving messages (incoming HTTP/RPC requests), executing some logic in its own single-threaded context using its attached durable storage or in-memory state, and finally sending messages to the outside world (outgoing HTTP/RPC requests or responses), even to another Durable Object instance.\n\n", "char_start": 6892, "char_end": 7657, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "fb627e6fd6e0f58e", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "Each Durable Object has certain capabilities in terms of [how much work it can do](/durable-objects/platform/limits/#how-much-work-can-a-single-durable-object-do), which should influence the application's [architecture to fully take advantage of the platform](/reference-architecture/diagrams/storage/durable-object-control-data-plane-pattern/).\n\nDurable Objects are natively integrated into Cloudflare's infrastructure, giving you the ultimate serverless platform to build distributed stateful applications exploiting the entirety of Cloudflare's network.\n\n## Durable Objects in Cloudflare\n\nMany of Cloudflare's products use Durable Objects. Some of our technical blog posts showcase real-world applications and use-cases where Durable Objects make building applications easier and simpler.\n\n", "char_start": 7657, "char_end": 8450, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "b826e62a9f224910", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "These blog posts may also serve as inspiration on how to architect scalable applications using Durable Objects, and how to integrate them with the rest of Cloudflare Developer Platform.\n\n", "char_start": 8450, "char_end": 8637, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "7f78f6e4bc8afedc", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "- [Durable Objects aren't just durable, they're fast: a 10x speedup for Cloudflare Queues](https://blog.cloudflare.com/how-we-built-cloudflare-queues/)\n- [Behind the scenes with Stream Live, Cloudflare's live streaming service](https://blog.cloudflare.com/behind-the-scenes-with-stream-live-cloudflares-live-streaming-service/)\n- [DO it again: how we used Durable Objects to add WebSockets support and authentication to AI Gateway](https://blog.cloudflare.com/do-it-again/)\n- [Workers Builds: integrated CI/CD built on the Workers platform](https://blog.cloudflare.com/workers-builds-integrated-ci-cd-built-on-the-workers-platform/)\n- [Build durable applications on Cloudflare Workers: you write the Workflows, we take care of the rest](https://blog.cloudflare.", "char_start": 8637, "char_end": 9398, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "eace376f20718f85", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "com/building-workflows-durable-execution-on-workers/)\n- [Building D1: a Global Database](https://blog.cloudflare.com/building-d1-a-global-database/)\n- [Billions and billions (of logs): scaling AI Gateway with the Cloudflare Developer Platform](https://blog.cloudflare.com/billions-and-billions-of-logs-scaling-ai-gateway-with-the-cloudflare/)\n- [Indexing millions of HTTP requests using Durable Objects](https://blog.cloudflare.com/r2-rayid-retrieval/)\n\n", "char_start": 9398, "char_end": 9852, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "b96a31ca2c71c5c0", "doc_id": "durable-objects/concepts/what-are-durable-objects.md", "text": "Finally, the following blog posts may help you learn some of the technical implementation aspects of Durable Objects, and how they work.\n\n- [Durable Objects: Easy, Fast, Correct \u2014 Choose three](https://blog.cloudflare.com/durable-objects-easy-fast-correct-choose-three/)\n- [Zero-latency SQLite storage in every Durable Object](https://blog.cloudflare.com/sqlite-in-durable-objects/)\n- [Workers Durable Objects Beta: A New Approach to Stateful Serverless](https://blog.cloudflare.com/introducing-workers-durable-objects/)\n\n## Get started\n\nGet started now by following the [\"Get started\" guide](/durable-objects/get-started/) to create your first application using Durable Objects.\n\n[^1]: Storage per Durable Object with SQLite is currently 1 GB. This will be raised to 10 GB for general availability.\n", "char_start": 9852, "char_end": 10652, "metadata": {"title": "what-are-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", "format": "markdown", "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25"}} +{"chunk_id": "6f214cb90fe14c8d", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "---\nsummary: Build a counter using Durable Objects and Workers with RPC methods.\npcx_content_type: example\ntitle: Build a counter\nsidebar:\n order: 3\ndescription: Build a counter using Durable Objects and Workers with RPC methods.\nreviewed: 2023-08-04\nproducts:\n - durable-objects\n - workers\n---\n\nimport { TabItem, Tabs, WranglerConfig } from \"~/components\";\n\nThis example shows how to build a counter using Durable Objects and Workers with [RPC methods](/workers/runtime-apis/rpc) that can print, increment, and decrement a `name` provided by the URL query string parameter, for example, `?name=A`.\n\n \n\n```js\nimport { DurableObject } from \"cloudflare:workers\";\n\n", "char_start": 0, "char_end": 722, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "d37e1a47053322db", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "// Worker\nexport default {\n\tasync fetch(request, env) {\n\t\tlet url = new URL(request.url);\n\t\tlet name = url.searchParams.get(\"name\");\n\t\tif (!name) {\n\t\t\treturn new Response(\n\t\t\t\t\"Select a Durable Object to contact by using\" +\n\t\t\t\t\t\" the `name` URL query string parameter, for example, ?name=A\",\n\t\t\t);\n\t\t}\n\n\t\t// A stub is a client Object used to send messages to the Durable Object.\n\t\tlet stub = env.COUNTERS.getByName(name);\n\n", "char_start": 722, "char_end": 1146, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "31519433616c649e", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "\t\t// Send a request to the Durable Object using RPC methods, then await its response.\n\t\tlet count = null;\n\t\tswitch (url.pathname) {\n\t\t\tcase \"/increment\":\n\t\t\t\tcount = await stub.increment();\n\t\t\t\tbreak;\n\t\t\tcase \"/decrement\":\n\t\t\t\tcount = await stub.decrement();\n\t\t\t\tbreak;\n\t\t\tcase \"/\":\n\t\t\t\t// Serves the current value.\n\t\t\t\tcount = await stub.getCounterValue();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn new Response(\"Not found\", { status: 404 });\n\t\t}\n\n\t\treturn new Response(`Durable Object '${name}' count: ${count}`);\n\t},\n};\n\n// Durable Object\nexport class Counter extends DurableObject {\n\tasync getCounterValue() {\n\t\tlet value = (await this.ctx.storage.get(\"value\")) || 0;\n\t\treturn value;\n\t}\n\n", "char_start": 1146, "char_end": 1830, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "cf6b7716af7169bf", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "\tasync increment(amount = 1) {\n\t\tlet value = (await this.ctx.storage.get(\"value\")) || 0;\n\t\tvalue += amount;\n\t\t// You do not have to worry about a concurrent request having modified the value in storage.\n\t\t// \"input gates\" will automatically protect against unwanted concurrency.\n\t\t// Read-modify-write is safe.\n\t\tawait this.ctx.storage.put(\"value\", value);\n\t\treturn value;\n\t}\n\n\tasync decrement(amount = 1) {\n\t\tlet value = (await this.ctx.storage.get(\"value\")) || 0;\n\t\tvalue -= amount;\n\t\tawait this.ctx.storage.put(\"value\", value);\n\t\treturn value;\n\t}\n}\n```\n\n \n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport interface Env {\n\tCOUNTERS: DurableObjectNamespace;\n}\n\n", "char_start": 1830, "char_end": 2580, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "2f6e67fe41ef5933", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "// Worker\nexport default {\n\tasync fetch(request, env) {\n\t\tlet url = new URL(request.url);\n\t\tlet name = url.searchParams.get(\"name\");\n\t\tif (!name) {\n\t\t\treturn new Response(\n\t\t\t\t\"Select a Durable Object to contact by using\" +\n\t\t\t\t\t\" the `name` URL query string parameter, for example, ?name=A\",\n\t\t\t);\n\t\t}\n\n\t\t// A stub is a client Object used to send messages to the Durable Object.\n\t\tlet stub = env.COUNTERS.get(name);\n\n\t\tlet count = null;\n\t\tswitch (url.pathname) {\n\t\t\tcase \"/increment\":\n\t\t\t\tcount = await stub.increment();\n\t\t\t\tbreak;\n\t\t\tcase \"/decrement\":\n\t\t\t\tcount = await stub.decrement();\n\t\t\t\tbreak;\n\t\t\tcase \"/\":\n\t\t\t\t// Serves the current value.\n\t\t\t\tcount = await stub.getCounterValue();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn new Response(\"Not found\", { status: 404 });\n\t\t}\n\n", "char_start": 2580, "char_end": 3353, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "41ee7cfb66075cfd", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "\t\treturn new Response(`Durable Object '${name}' count: ${count}`);\n\t},\n} satisfies ExportedHandler;\n\n// Durable Object\nexport class Counter extends DurableObject {\n\tasync getCounterValue() {\n\t\tlet value = (await this.ctx.storage.get(\"value\")) || 0;\n\t\treturn value;\n\t}\n\n\tasync increment(amount = 1) {\n\t\tlet value: number = (await this.ctx.storage.get(\"value\")) || 0;\n\t\tvalue += amount;\n\t\t// You do not have to worry about a concurrent request having modified the value in storage.\n\t\t// \"input gates\" will automatically protect against unwanted concurrency.\n\t\t// Read-modify-write is safe.\n\t\tawait this.ctx.storage.put(\"value\", value);\n\t\treturn value;\n\t}\n\n", "char_start": 3353, "char_end": 4012, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "2b21b1006b4adb75", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "\tasync decrement(amount = 1) {\n\t\tlet value: number = (await this.ctx.storage.get(\"value\")) || 0;\n\t\tvalue -= amount;\n\t\tawait this.ctx.storage.put(\"value\", value);\n\t\treturn value;\n\t}\n}\n```\n\n \n\n```py\nfrom workers import DurableObject, Response, WorkerEntrypoint\nfrom urllib.parse import urlparse, parse_qs\n\n# Worker\nclass Default(WorkerEntrypoint):\n\tasync def fetch(self, request):\n\t\tparsed_url = urlparse(request.url)\n\t\tquery_params = parse_qs(parsed_url.query)\n\t\tname = query_params.get('name', [None])[0]\n\n\t\tif not name:\n\t\t\treturn Response(\n\t\t\t\t\"Select a Durable Object to contact by using\"\n\t\t\t\t+ \" the `name` URL query string parameter, for example, ?name=A\"\n\t\t\t)\n\n", "char_start": 4012, "char_end": 4731, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "6471940146a75ada", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "\t\t# A stub is a client Object used to send messages to the Durable Object.\n\t\tstub = self.env.COUNTERS.getByName(name)\n\n\t\t# Send a request to the Durable Object using RPC methods, then await its response.\n\t\tcount = None\n\n\t\tif parsed_url.path == \"/increment\":\n\t\t\tcount = await stub.increment()\n\t\telif parsed_url.path == \"/decrement\":\n\t\t\tcount = await stub.decrement()\n\t\telif parsed_url.path == \"\" or parsed_url.path == \"/\":\n\t\t\t# Serves the current value.\n\t\t\tcount = await stub.getCounterValue()\n\t\telse:\n\t\t\treturn Response(\"Not found\", status=404)\n\n\t\treturn Response(f\"Durable Object '{name}' count: {count}\")\n\n# Durable Object\nclass Counter(DurableObject):\n\tdef __init__(self, ctx, env):\n\t\tsuper().__init__(ctx, env)\n\n", "char_start": 4731, "char_end": 5447, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "71b385e7a9858f92", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "\tasync def getCounterValue(self):\n\t\tvalue = await self.ctx.storage.get(\"value\")\n\t\treturn value if value is not None else 0\n\n\tasync def increment(self, amount=1):\n\t\tvalue = await self.ctx.storage.get(\"value\")\n\t\tvalue = (value if value is not None else 0) + amount\n\t\t# You do not have to worry about a concurrent request having modified the value in storage.\n\t\t# \"input gates\" will automatically protect against unwanted concurrency.\n\t\t# Read-modify-write is safe.\n\t\tawait self.ctx.storage.put(\"value\", value)\n\t\treturn value\n\n\tasync def decrement(self, amount=1):\n\t\tvalue = await self.ctx.storage.get(\"value\")\n\t\tvalue = (value if value is not None else 0) - amount\n\t\tawait self.ctx.storage.put(\"value\", value)\n\t\treturn value\n```\n\n \n\n", "char_start": 5447, "char_end": 6195, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "4f94f968412d63d7", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "Finally, configure your Wrangler file to include a Durable Object [binding](/durable-objects/get-started/#4-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously.\n\n\n\n```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"my-counter\",\n\t\"main\": \"src/index.ts\",\n\t\"durable_objects\": {\n\t\t\"bindings\": [\n\t\t\t{\n\t\t\t\t\"name\": \"COUNTERS\",\n\t\t\t\t\"class_name\": \"Counter\"\n\t\t\t}\n\t\t]\n\t},\n\t\"migrations\": [\n\t\t{\n\t\t\t\"tag\": \"v1\",\n\t\t\t\"new_sqlite_classes\": [\n\t\t\t\t\"Counter\"\n\t\t\t]\n\t\t}\n\t]\n}\n```\n\n\n\n", "char_start": 6195, "char_end": 6827, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "3dbf1a4972e1223a", "doc_id": "durable-objects/examples/build-a-counter.md", "text": "### Related resources\n\n- [Workers RPC](/workers/runtime-apis/rpc/)\n- [Durable Objects: Easy, Fast, Correct \u2014 Choose three](https://blog.cloudflare.com/durable-objects-easy-fast-correct-choose-three/).\n", "char_start": 6827, "char_end": 7028, "metadata": {"title": "Worker", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", "format": "markdown", "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4"}} +{"chunk_id": "8c02fd408bf4079e", "doc_id": "durable-objects/platform/storage-options.md", "text": "---\npcx_content_type: navigation\ntitle: Choose a data or storage product\ndescription: Compare Cloudflare storage and data products to find the best option for your Durable Objects use case.\nexternal_link: /workers/platform/storage-options/\nsidebar:\n order: 3\nproducts:\n - durable-objects\n---\n", "char_start": 0, "char_end": 294, "metadata": {"title": "storage-options", "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/platform/storage-options.md", "format": "markdown", "raw_hash": "33e8840fac344dafaf1d71dcbb6037a09674c1b004fbe840317e11db755fd98c"}} +{"chunk_id": "186391dada5a8cc1", "doc_id": "kv/concepts/how-kv-works.md", "text": "---\npcx_content_type: concept\ntitle: How KV works\ndescription: Workers KV stores data centrally and caches it globally, optimizing for high-read, low-latency workloads.\nsidebar:\n order: 6\nproducts:\n - kv\n---\n\nKV is a global, low-latency, key-value data store. It stores data in a small number of centralized data centers, then caches that data in Cloudflare's data centers after access.\n\nKV supports exceptionally high read volumes with low latency, making it possible to build dynamic APIs that scale thanks to KV's built-in caching and global distribution.\nRequests which are not in cache and need to access the central stores can experience higher latencies.\n\n", "char_start": 0, "char_end": 665, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "47a747981b8639af", "doc_id": "kv/concepts/how-kv-works.md", "text": "## Write data to KV and read data from KV\n\nWhen you write to KV, your data is written to central data stores. Your data is not sent automatically to every location's cache.\n\n![Your data is written to central data stores when you write to KV.](~/assets/images/kv/kv-write.svg)\n\nInitial reads from a location do not have a cached value. Data must be read from the nearest regional tier, followed by a central tier, degrading finally to the central stores for a truly cold global read. While the first access is slow globally, subsequent requests are faster, especially if requests are concentrated in a single region.\n\n:::note[Hot and cold read]\n\n", "char_start": 665, "char_end": 1310, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "0f890e172d1c443c", "doc_id": "kv/concepts/how-kv-works.md", "text": "A hot read means that the data is cached on Cloudflare's edge network using the [CDN](https://developers.cloudflare.com/cache/), whether it is in a local cache or a regional cache. A cold read means that the data is not cached, so the data must be fetched from the central stores.\n:::\n\n![Initial reads will miss the cache and go to the nearest central data store first.](~/assets/images/kv/kv-slow-read.svg)\n\nFrequent reads from the same location return the cached value without reading from anywhere else, resulting in the fastest response times. KV operates diligently to update the cached values by refreshing from upper tier caches and central data stores before cache expires in the background.\n\n", "char_start": 1310, "char_end": 2011, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "52686a6d9f2d708f", "doc_id": "kv/concepts/how-kv-works.md", "text": "Refreshing from upper tiers and the central data stores in the background is done carefully so that assets that are being accessed continue to be kept served from the cache without any stalls.\n\n![As mentioned above, frequent reads will return a cached value.](~/assets/images/kv/kv-fast-read.svg)\n\nKV is optimized for high-read applications. It stores data centrally and uses a hybrid push/pull-based replication to store data in cache. KV is suitable for use cases where you need to write relatively infrequently, but read quickly and frequently. Infrequently read values are pulled from other data centers or the central stores, while more popular values are cached in the data centers they are requested from.\n\n", "char_start": 2011, "char_end": 2725, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "1dbb087b24b93466", "doc_id": "kv/concepts/how-kv-works.md", "text": "## Performance\n\nTo improve KV performance, increase the [`cacheTtl` parameter](/kv/api/read-key-value-pairs/#cachettl-parameter) up from its default 60 seconds.\n\nKV achieves high performance by [caching](https://www.cloudflare.com/en-gb/learning/cdn/what-is-caching/) which makes reads eventually-consistent with writes.\n\nChanges are usually immediately visible in the Cloudflare global network location at which they are made. Changes may take up to 60 seconds or more to be visible in other global network locations as their cached versions of the data time out.\n\nNegative lookups indicating that the key does not exist are also cached, so the same delay exists noticing a value is created as when a value is changed.\n\n", "char_start": 2725, "char_end": 3446, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "3fa6925b96ee21b3", "doc_id": "kv/concepts/how-kv-works.md", "text": "## Consistency\n\nKV achieves high performance by being eventually-consistent. At the Cloudflare global network location at which changes are made, these changes are usually immediately visible. However, this is not guaranteed and therefore it is not advised to rely on this behaviour. In other global network locations changes may take up to 60 seconds or more to be visible as their cached versions of the data time-out.\n\nVisibility of changes takes longer in locations which have recently read a previous version of a given key (including reads that indicated the key did not exist, which are also cached locally).\n\n:::note\n\n", "char_start": 3446, "char_end": 4072, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "59a31d96cc6c8e46", "doc_id": "kv/concepts/how-kv-works.md", "text": "KV is not ideal for applications where you need support for atomic operations or where values must be read and written in a single transaction.\nIf you need stronger consistency guarantees, consider using [Durable Objects](/durable-objects/).\n:::\n\nAn approach to achieve write-after-write consistency is to send all of your writes for a given KV key through a corresponding instance of a Durable Object, and then read that value from KV in other Workers. This is useful if you need more control over writes, but are satisfied with KV's read characteristics described above.\n\n## Guidance\n\nWorkers KV is an eventually-consistent edge key-value store. That makes it ideal for **read-heavy**, highly cacheable workloads such as:\n\n", "char_start": 4072, "char_end": 4797, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "6c3d0f5418ebf692", "doc_id": "kv/concepts/how-kv-works.md", "text": "- Serving static assets\n- Storing application configuration\n- Storing user preferences\n- Implementing allow-lists/deny-lists\n- Caching\n\nIn these scenarios, Workers are invoked in a data center closest to the user and Workers KV data will be cached in that region for subsequent requests to minimize latency.\n\nIf you have a **write-heavy** [Redis](https://redis.io)-type workload where you are updating the same key tens or hundreds of times per second, KV will not be an ideal fit.\nIf you can revisit how your application writes to single key-value pairs and spread your writes across several discrete keys, Workers KV can suit your needs.\nAlternatively, [Durable Objects](/durable-objects/) provides a key-value API with higher writes per key rate limits.\n\n", "char_start": 4797, "char_end": 5555, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "0eb3193e00565054", "doc_id": "kv/concepts/how-kv-works.md", "text": "## Security\n\nRefer to [Data security documentation](/kv/reference/data-security/) to understand how Workers KV secures data.\n", "char_start": 5555, "char_end": 5680, "metadata": {"title": "how-kv-works", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", "format": "markdown", "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321"}} +{"chunk_id": "66d05fd33d011502", "doc_id": "kv/concepts/kv-bindings.md", "text": "---\npcx_content_type: concept\ntitle: KV bindings\ndescription: KV bindings connect a Cloudflare Worker to a KV namespace for reading and writing data.\ntags:\n - Bindings\nsidebar:\n order: 7\nproducts:\n - kv\n---\n\nimport { WranglerConfig } from \"~/components\";\n\nKV [bindings](/workers/runtime-apis/bindings/) allow for communication between a Worker and a KV namespace.\n\nConfigure KV bindings in the [Wrangler configuration file](/workers/wrangler/configuration/).\n\n## Access KV from Workers\n\nA [KV namespace](/kv/concepts/kv-namespaces/) is a key-value database replicated to Cloudflare's global network.\n\nTo connect to a KV namespace from within a Worker, you must define a binding that points to the namespace's ID.\n\n", "char_start": 0, "char_end": 717, "metadata": {"title": "kv-bindings", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md", "format": "markdown", "raw_hash": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78"}} +{"chunk_id": "bb696986f9bbfb52", "doc_id": "kv/concepts/kv-bindings.md", "text": "The name of your binding does not need to match the KV namespace's name. Instead, the binding should be a valid JavaScript identifier, because the identifier will exist as a global variable within your Worker.\n\nA KV namespace will have a name you choose (for example, `My tasks`), and an assigned ID (for example, `06779da6940b431db6e566b4846d64db`).\n\nTo execute your Worker, define the binding.\n\nIn the following example, the binding is called `TODO`. In the `kv_namespaces` portion of your Wrangler configuration file, add:\n\n\n\n```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"worker\",\n\t// ...\n\t\"kv_namespaces\": [\n\t\t{\n\t\t\t\"binding\": \"TODO\",\n\t\t\t\"id\": \"06779da6940b431db6e566b4846d64db\"\n\t\t}\n\t]\n}\n```\n\n\n\n", "char_start": 717, "char_end": 1481, "metadata": {"title": "kv-bindings", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md", "format": "markdown", "raw_hash": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78"}} +{"chunk_id": "e961b9437dca239b", "doc_id": "kv/concepts/kv-bindings.md", "text": "With this, the deployed Worker will have a `TODO` field in their environment object (the second parameter of the `fetch()` request handler). Any methods on the `TODO` binding will map to the KV namespace with an ID of `06779da6940b431db6e566b4846d64db` \u2013 which you called `My Tasks` earlier.\n\n```js\nexport default {\n async fetch(request, env, ctx) {\n // Get the value for the \"to-do:123\" key\n // NOTE: Relies on the `TODO` KV binding that maps to the \"My Tasks\" namespace.\n let value = await env.TODO.get(\"to-do:123\");\n\n // Return the value, as is, for the Response\n return new Response(value);\n },\n};\n```\n\n", "char_start": 1481, "char_end": 2105, "metadata": {"title": "kv-bindings", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md", "format": "markdown", "raw_hash": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78"}} +{"chunk_id": "b8635c113475d213", "doc_id": "kv/concepts/kv-bindings.md", "text": "## Use KV bindings when developing locally\n\nWhen you use Wrangler to develop locally with the `wrangler dev` command, Wrangler will default to using a local version of KV to avoid interfering with any of your live production data in KV. This means that reading keys that you have not written locally will return `null`.\n\nTo have `wrangler dev` connect to your Workers KV namespace running on Cloudflare's global network, set `\"remote\" : true` in the KV binding configuration. Refer to the [remote bindings documentation](/workers/local-development/#remote-bindings) for more information.\n\n\n\n", "char_start": 2105, "char_end": 2712, "metadata": {"title": "kv-bindings", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md", "format": "markdown", "raw_hash": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78"}} +{"chunk_id": "87d147d47c9c4e13", "doc_id": "kv/concepts/kv-bindings.md", "text": "```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"worker\",\n\t// ...\n\t\"kv_namespaces\": [\n\t\t{\n\t\t\t\"binding\": \"TODO\",\n\t\t\t\"id\": \"06779da6940b431db6e566b4846d64db\"\n\t\t}\n\t]\n}\n```\n\n\n\n## Access KV from Durable Objects and Workers using ES modules format\n\n[Durable Objects](/durable-objects/) use ES modules format. Instead of a global variable, bindings are available as properties of the `env` parameter [passed to the constructor](/durable-objects/get-started/#2-write-a-durable-object-class).\n\nAn example might look like:\n\n```js\nimport { DurableObject } from \"cloudflare:workers\";\n\nexport class MyDurableObject extends DurableObject {\n constructor(ctx, env) {\n super(ctx, env);\n }\n\n", "char_start": 2712, "char_end": 3437, "metadata": {"title": "kv-bindings", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md", "format": "markdown", "raw_hash": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78"}} +{"chunk_id": "9d3883b700ac1a34", "doc_id": "kv/concepts/kv-bindings.md", "text": " async fetch(request) {\n const valueFromKV = await this.env.NAMESPACE.get(\"someKey\");\n return new Response(valueFromKV);\n }\n}\n```\n", "char_start": 3437, "char_end": 3575, "metadata": {"title": "kv-bindings", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md", "format": "markdown", "raw_hash": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78"}} +{"chunk_id": "bb26a58bee7f61de", "doc_id": "kv/concepts/kv-namespaces.md", "text": "---\npcx_content_type: concept\ntitle: KV namespaces\ndescription: A KV namespace is a key-value database replicated across Cloudflare's global network.\nsidebar:\n order: 7\nproducts:\n - kv\n---\nimport { Type, MetaInfo, WranglerConfig, DashButton } from \"~/components\";\n\nA KV namespace is a key-value database replicated to Cloudflare\u2019s global network.\n\nBind your KV namespaces through Wrangler or via the Cloudflare dashboard.\n\n:::note\n\nKV namespace IDs are public and bound to your account.\n\n:::\n\n## Bind your KV namespace through Wrangler\n\nTo bind KV namespaces to your Worker, assign an array of the below object to the `kv_namespaces` key.\n\n* `binding` \n\n * The binding name used to refer to the KV namespace.\n\n", "char_start": 0, "char_end": 764, "metadata": {"title": "kv-namespaces", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-namespaces.md", "format": "markdown", "raw_hash": "2f64b8fb39ce55bc43d5a6f7e36d5af10e672f9e9ec64d1f1e918258ad7ddbfc"}} +{"chunk_id": "861c1962281d7016", "doc_id": "kv/concepts/kv-namespaces.md", "text": "* `id` \n\n * The ID of the KV namespace.\n\n* `preview_id` \n\n * The ID of the KV namespace used during `wrangler dev`.\n\nExample:\n\n\n\n```jsonc\n{\n\t\"kv_namespaces\": [\n\t\t{\n\t\t\t\"binding\": \"\",\n\t\t\t\"id\": \"\"\n\t\t}\n\t]\n}\n```\n\n\n\n## Bind your KV namespace via the dashboard\n\nTo bind the namespace to your Worker in the Cloudflare dashboard:\n\n1. In the Cloudflare dashboard, go to the **Workers & Pages** page.\n\n", "char_start": 764, "char_end": 1317, "metadata": {"title": "kv-namespaces", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-namespaces.md", "format": "markdown", "raw_hash": "2f64b8fb39ce55bc43d5a6f7e36d5af10e672f9e9ec64d1f1e918258ad7ddbfc"}} +{"chunk_id": "699a7efabd0b0417", "doc_id": "kv/concepts/kv-namespaces.md", "text": " \n2. Select your **Worker**.\n3. Select **Settings** > **Bindings**.\n4. Select **Add**.\n5. Select **KV Namespace**.\n6. Enter your desired variable name (the name of the binding).\n7. Select the KV namespace you wish to bind the Worker to.\n8. Select **Deploy**.\n", "char_start": 1317, "char_end": 1631, "metadata": {"title": "kv-namespaces", "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-namespaces.md", "format": "markdown", "raw_hash": "2f64b8fb39ce55bc43d5a6f7e36d5af10e672f9e9ec64d1f1e918258ad7ddbfc"}} +{"chunk_id": "efe9f54e7f7e0773", "doc_id": "kv/examples/cache-data-with-workers-kv.md", "text": "---\nsummary: Cache data or API responses in Workers KV to improve application performance\npcx_content_type: example\ntitle: Cache data with Workers KV\nsidebar:\n order: 5\ndescription: Example of how to use Workers KV to build a distributed application configuration store.\nreviewed: 2025-03-27\nproducts:\n - kv\n---\n\nimport { Render, PackageManagers, Tabs, TabItem } from \"~/components\";\n\nWorkers KV can be used as a persistent, single, global cache accessible from Cloudflare Workers to speed up your application.\nData cached in Workers KV is accessible from all other Cloudflare locations as well, and persists until expiry or deletion.\n\n", "char_start": 0, "char_end": 638, "metadata": {"title": "cache-data-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", "format": "markdown", "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87"}} +{"chunk_id": "ea6f63a0efcfb16d", "doc_id": "kv/examples/cache-data-with-workers-kv.md", "text": "After fetching data from external resources in your Workers application, you can write the data to Workers KV.\nOn subsequent Worker requests (in the same region or in other regions), you can read the cached data from Workers KV instead of calling the external API.\nThis improves your Worker application's performance and resilience while reducing load on external resources.\n\nThis example shows how you can cache data in Workers KV and read cached data from Workers KV in a Worker application.\n\n:::note[Note]\n\nYou can also cache data in Workers with the [Cache API](/workers/runtime-apis/cache/). With the Cache API,\nthe contents of the cache do not replicate outside of the originating data center and the cache is ephemeral (can be evicted).\n\n", "char_start": 638, "char_end": 1383, "metadata": {"title": "cache-data-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", "format": "markdown", "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87"}} +{"chunk_id": "f2e65a1bcbb2eb9d", "doc_id": "kv/examples/cache-data-with-workers-kv.md", "text": "With Workers KV, the data is persisted by default to [central stores](/kv/concepts/how-kv-works/) (or can be set to [expire](/kv/api/write-key-value-pairs/#expiring-keys), and can be accessed from other Cloudflare locations.\n:::\n\n## Cache data in Workers KV from your Worker application\n\nIn the following `index.ts` file, the Worker fetches data from an external server and caches the response in Workers KV. If the data is already cached in Workers KV, the Worker reads the cached data from Workers KV instead of calling the external API.\n\n\n\n```js title=\"index.ts\" collapse={42-1000}\ninterface Env {\n CACHE_KV: KVNamespace;\n}\n\nexport default {\n async fetch(request, env, ctx): Promise {\n\n", "char_start": 1383, "char_end": 2116, "metadata": {"title": "cache-data-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", "format": "markdown", "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87"}} +{"chunk_id": "88aa242f41394302", "doc_id": "kv/examples/cache-data-with-workers-kv.md", "text": " const EXPIRATION_TTL = 30; // Cache expiration in seconds\n const url = 'https://example.com';\n const cacheKey = \"cache-json-example\";\n\n // Try to get data from KV cache first\n let data = await env.CACHE_KV.get(cacheKey, { type: 'json' });\n let fromCache = true;\n\n // If data is not in cache, fetch it from example.com\n if (!data) {\n console.log('Cache miss. Fetching fresh data from example.com');\n fromCache = false;\n\n \t\t// In this example, we are fetching HTML content but it can also be API responses or any other data\n const response = await fetch(url);\n \t\tconst htmlData = await response.text();\n\n", "char_start": 2116, "char_end": 2765, "metadata": {"title": "cache-data-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", "format": "markdown", "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87"}} +{"chunk_id": "9ff82ab377053ca0", "doc_id": "kv/examples/cache-data-with-workers-kv.md", "text": " \t\t// In this example, we are converting HTML to JSON to demonstrate caching JSON data with Workers KV\n \t\t// You could cache any type of data, or even cache the HTML data directly\n \t\tdata = helperConvertToJSON(htmlData);\n \t\t// The expirationTtl option is used to set the expiration time for the cache entry (in seconds), otherwise it will be stored indefinitely\n \t\tawait env.CACHE_KV.put(cacheKey, JSON.stringify(data), { expirationTtl: EXPIRATION_TTL });\n }\n\n // Return the appropriate response format\n \treturn new Response(JSON.stringify({\n \t\tdata,\n \t\tfromCache\n \t}), {\n \t\theaders: { 'Content-Type': 'application/json' }\n \t});\n\n}\n} satisfies ExportedHandler;\n\n", "char_start": 2765, "char_end": 3471, "metadata": {"title": "cache-data-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", "format": "markdown", "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87"}} +{"chunk_id": "2cd35d8001064514", "doc_id": "kv/examples/cache-data-with-workers-kv.md", "text": "// Helper function to convert HTML to JSON\nfunction helperConvertToJSON(html: string) {\n// Parse HTML and extract relevant data\nconst title = helperExtractTitle(html);\nconst content = helperExtractContent(html);\nconst lastUpdated = new Date().toISOString();\n\n return { title, content, lastUpdated };\n\n}\n\n// Helper function to extract title from HTML\nfunction helperExtractTitle(html: string) {\nconst titleMatch = html.match(/(.\\*?)<\\/title>/i);\nreturn titleMatch ? titleMatch[1] : 'No title found';\n}\n\n// Helper function to extract content from HTML\nfunction helperExtractContent(html: string) {\nconst bodyMatch = html.match(/<body>(.\\*?)<\\/body>/is);\nif (!bodyMatch) return 'No content found';\n\n", "char_start": 3471, "char_end": 4177, "metadata": {"title": "cache-data-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", "format": "markdown", "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87"}} +{"chunk_id": "566277d25362e1ee", "doc_id": "kv/examples/cache-data-with-workers-kv.md", "text": " // Strip HTML tags for a simple text representation\n const textContent = bodyMatch[1].replace(/<[^>]*>/g, ' ')\n \t.replace(/\\s+/g, ' ')\n \t.trim();\n\n return textContent;\n\n}\n\n```\n</TabItem>\n<TabItem label=\"wrangler.jsonc\">\n```json\n{\n\t\"$schema\": \"node_modules/wrangler/config-schema.json\",\n\t\"name\": \"<ENTER_WORKER_NAME>\",\n\t\"main\": \"src/index.ts\",\n\t\"compatibility_date\": \"2025-03-03\",\n\t\"observability\": {\n\t\t\"enabled\": true\n\t},\n\t\"kv_namespaces\": [\n\t\t{\n\t\t\t\"binding\": \"CACHE_KV\",\n\t\t\t\"id\": \"<YOUR_BINDING_ID>\"\n\t\t}\n\t]\n}\n```\n\n</TabItem>\n</Tabs>\n\nThis code snippet demonstrates how to read and update cached data in Workers KV from your Worker.\nIf the data is not in the Workers KV cache, the Worker fetches the data from an external server and caches it in Workers KV.\n\n", "char_start": 4177, "char_end": 4952, "metadata": {"title": "cache-data-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", "format": "markdown", "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87"}} +{"chunk_id": "83beb6aa1300fecd", "doc_id": "kv/examples/cache-data-with-workers-kv.md", "text": "In this example, we convert HTML to JSON to demonstrate how to cache JSON data with Workers KV, but any type of data\ncan be cached in Workers KV. For instance, you could cache API responses, HTML content, or any other data that you want to persist across requests.\n\n## Related resources\n\n- [Rust support in Workers](/workers/languages/rust/).\n- [Using KV in Workers](/kv/get-started/).\n", "char_start": 4952, "char_end": 5338, "metadata": {"title": "cache-data-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", "format": "markdown", "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87"}} +{"chunk_id": "06fbb50bd93d6b03", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "---\nsummary: Use Workers KV to as a geo-distributed, low-latency configuration store for your Workers application\npcx_content_type: example\ntitle: Build a distributed configuration store\nsidebar:\n order: 5\ndescription: Example of how to use Workers KV to build a distributed application configuration store.\nreviewed: 2025-03-27\nproducts:\n - kv\n---\n\nimport { Render, PackageManagers, Tabs, TabItem } from \"~/components\";\n\n", "char_start": 0, "char_end": 424, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "380932d2b0382523", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "Storing application configuration data is an ideal use case for Workers KV. Configuration data can include data to personalize an application for each user or tenant, enable features for user groups, restrict access with allow-lists/deny-lists, etc. These use-cases can have high read volumes that are highly cacheable by Workers KV, which can ensure low-latency reads from your Workers application.\n\nIn this example, application configuration data is used to personalize the Workers application for each user. The configuration data is stored in an external application and database, and written to Workers KV using the REST API.\n\n", "char_start": 424, "char_end": 1056, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "18034ece51af489c", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "## Write your configuration from your external application to Workers KV\n\nIn some cases, your source-of-truth for your configuration data may be stored elsewhere than Workers KV.\nIf this is the case, use the Workers KV REST API to write the configuration data to your Workers KV namespace.\n\nThe following external Node.js application demonstrates a simple scripts that reads user data from a database and writes it to Workers KV using the REST API library.\n\n<Tabs>\n<TabItem label=\"index.js\">\n```js title=\"index.js\"\nconst postgres = require('postgres');\nconst { Cloudflare } = require('cloudflare');\nconst { backOff } = require('exponential-backoff');\n\n", "char_start": 1056, "char_end": 1708, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "dcbe6241551a6bf9", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "if(!process.env.DATABASE_CONNECTION_STRING || !process.env.CLOUDFLARE_EMAIL || !process.env.CLOUDFLARE_API_KEY || !process.env.CLOUDFLARE_WORKERS_KV_NAMESPACE_ID || !process.env.CLOUDFLARE_ACCOUNT_ID) {\nconsole.error('Missing required environment variables.');\nprocess.exit(1);\n}\n\n// Setup Postgres connection\nconst sql = postgres(process.env.DATABASE_CONNECTION_STRING);\n\n// Setup Cloudflare REST API client\nconst client = new Cloudflare({\napiEmail: process.env.CLOUDFLARE_EMAIL,\napiKey: process.env.CLOUDFLARE_API_KEY,\n});\n\n// Function to sync Postgres data to Workers KV\nasync function syncPreviewStatus() {\nconsole.log('Starting sync of user preview status...');\n\n", "char_start": 1708, "char_end": 2376, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "e3f54440584a137a", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": " try {\n \t// Get all users and their preview status\n \tconst users = await sql`SELECT id, preview_features_enabled FROM users`;\n\n \tconsole.log(users);\n\n \t// Create the bulk update body\n \tconst bulkUpdateBody = users.map(user => ({\n \t\tkey: user.id,\n \t\tvalue: JSON.stringify({\n \t\t\tpreview_features_enabled: user.preview_features_enabled\n \t\t})\n \t}));\n\n", "char_start": 2376, "char_end": 2756, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "d5b5a7d8c9e4fdf8", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": " \tconst response = await backOff(async () => {\n \t\tconsole.log(\"trying to update\")\n \t\ttry{\n \t\t\tconst response = await client.kv.namespaces.bulkUpdate(process.env.CLOUDFLARE_WORKERS_KV_NAMESPACE_ID, {\n \t\t\t\taccount_id: process.env.CLOUDFLARE_ACCOUNT_ID,\n \t\t\t\tbody: bulkUpdateBody\n \t\t\t});\n \t\t}\n \t\tcatch(e){\n \t\t\t// Implement your error handling and logging here\n \t\t\tconsole.log(e);\n \t\t\tthrow e; // Rethrow the error to retry\n \t\t}\n \t});\n\n \tconsole.log(`Sync complete. Updated ${users.length} users.`);\n } catch (error) {\n \tconsole.error('Error syncing preview status:', error);\n }\n\n}\n\n// Run the sync function\nsyncPreviewStatus()\n.catch(console.error)\n.finally(() => process.exit(0));\n\n", "char_start": 2756, "char_end": 3490, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "e5c41640bd0484ff", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "```\n</TabItem>\n<TabItem label=\".env\">\n```md title=\".env\"\nDATABASE_CONNECTION_STRING = <DB_CONNECTION_STRING_HERE>\nCLOUDFLARE_EMAIL = <CLOUDFLARE_EMAIL_HERE>\nCLOUDFLARE_API_KEY = <CLOUDFLARE_API_KEY_HERE>\nCLOUDFLARE_ACCOUNT_ID = <CLOUDFLARE_ACCOUNT_ID_HERE>\nCLOUDFLARE_WORKERS_KV_NAMESPACE_ID = <CLOUDFLARE_WORKERS_KV_NAMESPACE_ID_HERE>\n```\n\n</TabItem>\n<TabItem label=\"db.sql\">\n```sql title=\"db.sql\"\n-- Create users table with preview_features_enabled flag\nCREATE TABLE users (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n username VARCHAR(100) NOT NULL,\n email VARCHAR(255) NOT NULL,\n preview_features_enabled BOOLEAN DEFAULT false\n);\n\n", "char_start": 3490, "char_end": 4134, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "28fbb874d5cf082e", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "-- Insert sample users\nINSERT INTO users (username, email, preview_features_enabled) VALUES\n('alice', 'alice@example.com', true),\n('bob', 'bob@example.com', false),\n('charlie', 'charlie@example.com', true);\n\n```\n</TabItem>\n</Tabs>\n\nIn this code snippet, the Node.js application reads user data from a Postgres database and writes the user data to be used for configuration in our Workers application to Workers KV using the Cloudflare REST API Node.js library.\nThe application also uses exponential backoff to handle retries in case of errors.\n\n## Use configuration data from Workers KV in your Worker application\n\nWith the configuration data now in the Workers KV namespace, we can use it in our Workers application to personalize the application for each user.\n\n", "char_start": 4134, "char_end": 4898, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "0c68bde26e776b91", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "<Tabs>\n<TabItem label=\"index.ts\">\n```js title=\"index.ts\"\n// Example configuration data stored in Workers KV:\n// Key: \"user-id-abc\" | Value: {\"preview_features_enabled\": false}\n// Key: \"user-id-def\" | Value: {\"preview_features_enabled\": true}\n\ninterface Env {\n USER_CONFIGURATION: KVNamespace;\n}\n\nexport default {\n async fetch(request, env) {\n // Get user ID from query parameter\n const url = new URL(request.url);\n const userId = url.searchParams.get('userId');\n\n if (!userId) {\n return new Response('Please provide a userId query parameter', {\n status: 400,\n headers: { 'Content-Type': 'text/plain' }\n });\n }\n\n\n\t\tconst userConfiguration = await env.USER_CONFIGURATION.get<{\n\t\t\tpreview_features_enabled: boolean;\n\t\t}>(userId, {type: \"json\"});\n\n", "char_start": 4898, "char_end": 5683, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "d81c78c2764de02b", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "\t\tconsole.log(userConfiguration);\n\n", "char_start": 5683, "char_end": 5718, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "9aa50c3aba5e5a4c", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": " // Build HTML response\n const html = `\n <!DOCTYPE html>\n <html>\n <head>\n <title>My App\n \n \n \n ${userConfiguration?.preview_features_enabled ? `\n

\n \ud83c\udf89 You have early access to preview features! ", "char_start": 5718, "char_end": 6461, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "bf5b4c8a8457c74a", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "\ud83c\udf89\n
\n ` : ''}\n

Welcome to My App

\n

This is the regular content everyone sees.

\n \n \n `;\n\n", "char_start": 6461, "char_end": 6635, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "11a6c41990cfda92", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": " return new Response(html, {\n\t\t\theaders: { \"Content-Type\": \"text/html; charset=utf-8\" }\n });\n }\n} satisfies ExportedHandler;\n\n```\n\n\n```json\n{\n\t\"$schema\": \"node_modules/wrangler/config-schema.json\",\n\t\"name\": \"\",\n\t\"main\": \"src/index.ts\",\n\t\"compatibility_date\": \"2025-03-03\",\n\t\"observability\": {\n\t\t\"enabled\": true\n\t},\n\t\"kv_namespaces\": [\n\t\t{\n\t\t\t\"binding\": \"USER_CONFIGURATION\",\n\t\t\t\"id\": \"\"\n\t\t}\n\t]\n}\n```\n\n\n\n\n", "char_start": 6635, "char_end": 7146, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "9c68dce48e97771c", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "This code will use the path within the URL and find the file associated to the path within the KV store. It also sets the proper MIME type in the response to inform the browser how to handle the response. To retrieve the value from the KV store, this code uses `arrayBuffer` to properly handle binary data such as images, documents, and video/audio files.\n\n## Optimize performance for configuration\n\nTo optimize performance, you may opt to consolidate values in fewer key-value pairs. By doing so, you may benefit from higher caching efficiency and lower latency.\n\n", "char_start": 7146, "char_end": 7711, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "95db41021d489c62", "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", "text": "For example, instead of storing each user's configuration in a separate key-value pair, you may store all users' configurations in a single key-value pair. This approach may be suitable for use-cases where the configuration data is small and can be easily managed in a single key-value pair (the [size limit for a Workers KV value is 25 MiB](/kv/platform/limits/)).\n\n## Related resources\n\n- [Rust support in Workers](/workers/languages/rust/)\n- [Using KV in Workers](/kv/get-started/)\n", "char_start": 7711, "char_end": 8196, "metadata": {"title": "distributed-configuration-with-workers-kv", "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", "format": "markdown", "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc"}} +{"chunk_id": "927520d7d2efdd28", "doc_id": "kv/index.md", "text": "---\ntitle: Cloudflare Workers KV\ndescription: Workers KV is a global, low-latency, key-value data store for building dynamic and performant APIs and websites.\npcx_content_type: overview\nsidebar:\n order: 1\nproducts:\n - kv\n---\n\nimport {\n\tCardGrid,\n\tDescription,\n\tFeature,\n\tLinkTitleCard,\n\tPlan,\n\tRelatedProduct,\n\tTabs,\n\tTabItem,\n\tLinkButton,\n} from \"~/components\";\n\n\n\nCreate a global, low-latency, key-value data storage.\n\n\n\n\n\nWorkers KV is a data storage that allows you to store and retrieve data globally. With Workers KV, you can build dynamic and performant APIs and websites that support high read volumes with low latency.\n\nFor example, you can use Workers KV for:\n\n", "char_start": 0, "char_end": 727, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "20c72f173b8208c4", "doc_id": "kv/index.md", "text": "- Caching API responses.\n- Storing user configurations / preferences.\n- Storing user authentication details.\n\nAccess your Workers KV namespace from Cloudflare Workers using [Workers Bindings](/workers/runtime-apis/bindings/) or from your external application using the REST API:\n\n\n\n\t\n\t\n```ts\nexport default {\n\tasync fetch(request, env, ctx): Promise {\n\t\t// write a key-value pair\n\t\tawait env.KV.put('KEY', 'VALUE');\n\n\t\t// read a key-value pair\n\t\tconst value = await env.KV.get('KEY');\n\n\t\t// list all key-value pairs\n\t\tconst allKeys = await env.KV.list();\n\n\t\t// delete a key-value pair\n\t\tawait env.KV.delete('KEY');\n\n", "char_start": 727, "char_end": 1428, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "5772ef6310845d74", "doc_id": "kv/index.md", "text": "\t\t// return a Workers response\n\t\treturn new Response(\n\t\t\tJSON.stringify({\n\t\t\t\tvalue: value,\n\t\t\t\tallKeys: allKeys,\n\t\t\t}),\n\t\t);\n\t},\n\n} satisfies ExportedHandler<{ KV: KVNamespace }>;\n\n ```\n \n \n\n```json\n{\n\t\"$schema\": \"node_modules/wrangler/config-schema.json\",\n\t\"name\": \"\",\n\t\"main\": \"src/index.ts\",\n\t\"compatibility_date\": \"2025-02-04\",\n\t\"observability\": {\n\t\t\"enabled\": true\n\t},\n\n\t\"kv_namespaces\": [\n\t\t{\n\t\t\t\"binding\": \"KV\",\n\t\t\t\"id\": \"\"\n\t\t}\n\t]\n}\n```\n\n \n \n\nSee the full [Workers KV binding API reference](/kv/api/read-key-value-pairs/).\n\n\n\n\n", "char_start": 1428, "char_end": 2109, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "39e59a78ceed0626", "doc_id": "kv/index.md", "text": " \n \t\n \t```\n \tcurl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/storage/kv/namespaces/$NAMESPACE_ID/values/$KEY_NAME \\\n \t\t\t-X PUT \\\n \t\t\t-H 'Content-Type: multipart/form-data' \\\n \t\t\t-H \"X-Auth-Email: $CLOUDFLARE_EMAIL\" \\\n \t\t\t-H \"X-Auth-Key: $CLOUDFLARE_API_KEY\" \\\n \t\t\t-d '{\n \t\t\t\t\"value\": \"Some Value\"\n \t\t\t}'\n\n", "char_start": 2109, "char_end": 2490, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "81d0cfe363425280", "doc_id": "kv/index.md", "text": " \tcurl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/storage/kv/namespaces/$NAMESPACE_ID/values/$KEY_NAME \\\n \t\t\t-H \"X-Auth-Email: $CLOUDFLARE_EMAIL\" \\\n \t\t\t-H \"X-Auth-Key: $CLOUDFLARE_API_KEY\"\n \t```\n \t\n \t\n \t\t```ts\n \t\tconst client = new Cloudflare({\n \t\t\tapiEmail: process.env['CLOUDFLARE_EMAIL'], // This is the default and can be omitted\n \t\t\tapiKey: process.env['CLOUDFLARE_API_KEY'], // This is the default and can be omitted\n \t\t});\n\n \t\tconst value = await client.kv.namespaces.values.update('', 'KEY', {\n \t\t\taccount_id: '',\n \t\t\tvalue: 'VALUE',\n \t\t});\n\n", "char_start": 2490, "char_end": 3167, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "ef6c1be32baffb7a", "doc_id": "kv/index.md", "text": " \t\tconst value = await client.kv.namespaces.values.get('', 'KEY', {\n \t\t\taccount_id: '',\n \t\t});\n\n \t\tconst value = await client.kv.namespaces.values.delete('', 'KEY', {\n \t\t\taccount_id: '',\n \t\t});\n\n \t\t// Automatically fetches more pages as needed.\n \t\tfor await (const namespace of client.kv.namespaces.list({ account_id: '' })) {\n \t\t\tconsole.log(namespace.id);\n \t\t}\n\n \t\t```\n \t\n \n\nSee the full Workers KV [REST API and SDK reference](/api/resources/kv/) for details on using REST API from external applications, with pre-generated SDK's for external TypeScript, Python, or Go applications.\n\n\n\n\nGet started\n\n---\n\n", "char_start": 3167, "char_end": 3967, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "276472f39e988554", "doc_id": "kv/index.md", "text": "## Features\n\n\n\tLearn how Workers KV stores and retrieves data.\n\n\n\n\nThe Workers command-line interface, Wrangler, allows you to [create](/workers/wrangler/commands/general/#init), [test](/workers/wrangler/commands/general/#dev), and [deploy](/workers/wrangler/commands/pages/#pages-deploy) your Workers projects.\n\n\n\n\n\nBindings allow your Workers to interact with resources on the Cloudflare developer platform, including [R2](/r2/), [Durable Objects](/durable-objects/), and [D1](/d1/).\n\n\n\n---\n\n## Related products\n\n\n\n", "char_start": 3967, "char_end": 4759, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "a624109e87a83e80", "doc_id": "kv/index.md", "text": "Cloudflare R2 Storage allows developers to store large amounts of unstructured data without the costly egress bandwidth fees associated with typical cloud storage services.\n\n\n\n\n\nCloudflare Durable Objects allows developers to access scalable compute and permanent, consistent storage.\n\n\n\n\n\nBuilt on SQLite, D1 is Cloudflare\u2019s first queryable relational database. Create an entire database by importing data or defining your tables and writing your queries within a Worker or through the API.\n\n\n\n---\n\n### More resources\n\n\n\n", "char_start": 4759, "char_end": 5487, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "364703ec5b533699", "doc_id": "kv/index.md", "text": "\n\t Learn about KV limits.\n\n\n\n\t Learn about KV pricing.\n\n\n\n\t Ask questions, show off what you are building, and discuss the platform\n\twith other developers.\n\n\n\n\t Learn about product announcements, new tutorials, and what is new in\n\tCloudflare Developer Platform.\n\n\n\n", "char_start": 5487, "char_end": 6202, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", "format": "markdown", "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761"}} +{"chunk_id": "2ee3837386da2f28", "doc_id": "queues/configuration/batching-retries.md", "text": "---\ntitle: Batching, Retries and Delays\ndescription: Configure message batching, retry behavior, and delivery delays for Cloudflare Queues.\npcx_content_type: concept\nsidebar:\n order: 2\nproducts:\n - queues\n---\n\nimport { WranglerConfig, TypeScriptExample, Tabs, TabItem } from \"~/components\";\n\n## Batching\n\nWhen configuring a [consumer Worker](/queues/reference/how-queues-works#consumers) for a queue, you can also define how messages are batched as they are delivered.\n\nBatching can:\n\n1. Reduce the total number of times your consumer Worker needs to be invoked (which can reduce costs).\n2. Allow you to batch messages when writing to an external API or service (reducing writes).\n3. Disperse load over time, especially if your producer Workers are associated with user-facing activity.\n\n", "char_start": 0, "char_end": 790, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "7d689c9977664430", "doc_id": "queues/configuration/batching-retries.md", "text": "There are two ways to configure how messages are batched. You configure batching when connecting your consumer Worker to a queue.\n\n- `max_batch_size` - The maximum size of a batch delivered to a consumer (defaults to 10 messages).\n- `max_batch_timeout` - the _maximum_ amount of time the queue will wait before delivering a batch to a consumer (defaults to 5 seconds)\n\n:::note[Batch size configuration]\n\nBoth `max_batch_size` and `max_batch_timeout` work together. Whichever limit is reached first will trigger the delivery of a batch.\n\n:::\n\n", "char_start": 790, "char_end": 1332, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "93da65582b8306e0", "doc_id": "queues/configuration/batching-retries.md", "text": "For example, a `max_batch_size = 30` and a `max_batch_timeout = 10` means that if 30 messages are written to the queue, the consumer will receive a batch of 30 messages. However, if it takes longer than 10 seconds for those 30 messages to be written to the queue, then the consumer will get a batch of messages that contains however many messages were on the queue at the time (somewhere between 1 and 29, in this case).\n\n:::note[Empty queues]\n\nWhen a queue is empty, a push-based (Worker) consumer's `queue` handler will not be invoked until there are messages to deliver. A queue does not attempt to push empty batches to a consumer and thus does not invoke unnecessary reads.\n\n", "char_start": 1332, "char_end": 2012, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "82e80323af406dd4", "doc_id": "queues/configuration/batching-retries.md", "text": "[Pull-based consumers](/queues/configuration/pull-consumers/) that attempt to pull from a queue, even when empty, will incur a read operation.\n\n:::\n\nWhen determining what size and timeout settings to configure, you will want to consider latency (how long can you wait to receive messages?), overall batch size (when writing to external systems), and cost (fewer-but-larger batches).\n\n### Batch settings\n\nThe following batch-level settings can be configured to adjust how Queues delivers batches to your configured consumer.\n\n\n\n", "char_start": 2012, "char_end": 2551, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "a346c0d65843f98d", "doc_id": "queues/configuration/batching-retries.md", "text": "| Setting | Default | Minimum | Maximum |\n| ----------------------------------------- | ----------- | --------- | ------------ |\n| Maximum Batch Size `max_batch_size` | 10 messages | 1 message | 100 messages |\n| Maximum Batch Timeout `max_batch_timeout` | 5 seconds | 0 seconds | 60 seconds |\n\n\n\n## Explicit acknowledgement and retries\n\nYou can acknowledge individual messages within a batch by explicitly acknowledging each message as it is processed. Messages that are explicitly acknowledged will not be re-delivered, even if your queue consumer fails on a subsequent message and/or fails to return successfully when processing a batch.\n\n", "char_start": 2551, "char_end": 3260, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "1ed5ed626385c3e9", "doc_id": "queues/configuration/batching-retries.md", "text": "- Each message can be acknowledged as you process it within a batch, and avoids the entire batch from being re-delivered if your consumer throws an error during batch processing.\n- Acknowledging individual messages is useful when you are calling external APIs, writing messages to a database, or otherwise performing non-idempotent (state changing) actions on individual messages.\n\nTo explicitly acknowledge a message as delivered, call the `ack()` method on the message.\n\n", "char_start": 3260, "char_end": 3733, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "eeb8b1686f0e4154", "doc_id": "queues/configuration/batching-retries.md", "text": "\n\n```ts\nexport default {\n\tasync queue(batch, env, ctx): Promise {\n\t\tfor (const msg of batch.messages) {\n\t\t\t// TODO: do something with the message\n\t\t\t// Explicitly acknowledge the message as delivered\n\t\t\tmsg.ack();\n\t\t}\n\t},\n} satisfies ExportedHandler;\n```\n\n\n```python\nfrom workers import WorkerEntrypoint\n\nclass Default(WorkerEntrypoint):\n async def queue(self, batch):\n for msg in batch.messages:\n # TODO: do something with the message\n # Explicitly acknowledge the message as delivered\n msg.ack()\n```\n\n\n\n", "char_start": 3733, "char_end": 4459, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "574fd4f5fc993fdb", "doc_id": "queues/configuration/batching-retries.md", "text": "You can also call `retry()` to explicitly force a message to be redelivered in a subsequent batch. This is referred to as \"negative acknowledgement\". This can be particularly useful when you want to process the rest of the messages in that batch without throwing an error that would force the entire batch to be redelivered.\n\n\n\n```ts\nexport default {\n\tasync queue(batch, env, ctx): Promise {\n\t\tfor (const msg of batch.messages) {\n\t\t\t// TODO: do something with the message that fails\n\t\t\tmsg.retry();\n\t\t}\n\t},\n} satisfies ExportedHandler;\n```\n\n\n```python\nfrom workers import WorkerEntrypoint\n\n", "char_start": 4459, "char_end": 5210, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "87b293b226ac5739", "doc_id": "queues/configuration/batching-retries.md", "text": "class Default(WorkerEntrypoint):\n async def queue(self, batch):\n for msg in batch.messages:\n # TODO: do something with the message that fails\n msg.retry()\n```\n\n\n\nYou can also acknowledge or negatively acknowledge messages at a batch level with `ackAll()` and `retryAll()`. Calling `ackAll()` on the batch of messages (`MessageBatch`) delivered to your consumer Worker has the same behaviour as a consumer Worker that successfully returns (does not throw an error).\n\nNote that calls to `ack()`, `retry()` and their `ackAll()` / `retryAll()` equivalents follow the below precedence rules:\n\n", "char_start": 5210, "char_end": 5847, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "cdb66011ff9a509a", "doc_id": "queues/configuration/batching-retries.md", "text": "- If you call `ack()` on a message, subsequent calls to `ack()` or `retry()` are silently ignored.\n- If you call `retry()` on a message and then call `ack()`: the `ack()` is ignored. The first method call wins in all cases.\n- If you call either `ack()` or `retry()` on a single message, and then either/any of `ackAll()` or `retryAll()` on the batch, the call on the single message takes precedence. That is, the batch-level call does not apply to that message (or messages, if multiple calls were made).\n\n## Delivery failure\n\nWhen a message is failed to be delivered, the default behaviour is to retry delivery three times before marking the delivery as failed. You can set `max_retries` (defaults to 3) when configuring your consumer, but in most cases we recommend leaving this as the default.\n\n", "char_start": 5847, "char_end": 6645, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "4827c1665fe27f41", "doc_id": "queues/configuration/batching-retries.md", "text": "Messages that reach the configured maximum retries will be deleted from the queue, or if a [dead-letter queue](/queues/configuration/dead-letter-queues/) (DLQ) is configured, written to the DLQ instead.\n\n:::note\n\nEach retry counts as an additional read operation per [Queues pricing](/queues/platform/pricing/).\n\n:::\n\nWhen a single message within a batch fails to be delivered, the entire batch is retried, unless you have [explicitly acknowledged](#explicit-acknowledgement-and-retries) a message (or messages) within that batch. For example, if a batch of 10 messages is delivered, but the 8th message fails to be delivered, all 10 messages will be retried and thus redelivered to your consumer in full.\n\n:::caution[Retried messages and consumer concurrency]\n\n", "char_start": 6645, "char_end": 7407, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "e7b7842e41e68385", "doc_id": "queues/configuration/batching-retries.md", "text": "Retrying messages with `retry()` or calling `retryAll()` on a batch will **not** cause the consumer to autoscale down if consumer concurrency is enabled. Refer to [Consumer concurrency](/queues/configuration/consumer-concurrency/) to learn more.\n\n:::\n\n## Delay messages\n\nWhen publishing messages to a queue, or when [marking a message or batch for retry](#explicit-acknowledgement-and-retries), you can choose to delay messages from being processed for a period of time.\n\nDelaying messages allows you to defer tasks until later, and/or respond to backpressure when consuming from a queue. For example, if an upstream API you are calling to returns a `HTTP 429: Too Many Requests`, you can delay messages to slow down how quickly you are consuming them before they are re-processed.\n\n", "char_start": 7407, "char_end": 8190, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "dd149d7902fa8fca", "doc_id": "queues/configuration/batching-retries.md", "text": "Messages can be delayed by up to 24 hours.\n\n:::note\n\nConfiguring delivery and retry delays via the `wrangler` CLI or when [developing locally](/queues/configuration/local-development/) requires `wrangler` version `3.38.0` or greater. Use `npx wrangler@latest` to always use the latest version of `wrangler`.\n\n:::\n\n### Delay on send\n\nTo delay a message or batch of messages when sending to a queue, you can provide a `delaySeconds` parameter when sending a message.\n\n\n\n```ts\n// Delay a singular message by 600 seconds (10 minutes)\nawait env.YOUR_QUEUE.send(message, { delaySeconds: 600 });\n\n// Delay a batch of messages by 300 seconds (5 minutes)\nawait env.YOUR_QUEUE.sendBatch(messages, { delaySeconds: 300 });\n\n", "char_start": 8190, "char_end": 8989, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "887165b20b0d8da9", "doc_id": "queues/configuration/batching-retries.md", "text": "// Do not delay this message.\n// If there is a global delay configured on the queue, ignore it.\nawait env.YOUR_QUEUE.sendBatch(messages, { delaySeconds: 0 });\n```\n\n\n```python\n# Delay a singular message by 600 seconds (10 minutes)\nawait env.YOUR_QUEUE.send(message, delaySeconds=600)\n\n# Delay a batch of messages by 300 seconds (5 minutes)\nawait env.YOUR_QUEUE.sendBatch(messages, delaySeconds=300)\n\n# Do not delay this message.\n# If there is a global delay configured on the queue, ignore it.\nawait env.YOUR_QUEUE.sendBatch(messages, delaySeconds=0)\n```\n\n\n\nYou can also configure a default, global delay on a per-queue basis by passing `--delivery-delay-secs` when creating a queue via the `wrangler` CLI:\n\n", "char_start": 8989, "char_end": 9776, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "75b6446c2ddf754b", "doc_id": "queues/configuration/batching-retries.md", "text": "```sh\n# Delay all messages by 5 minutes as a default\nnpx wrangler queues create $QUEUE-NAME --delivery-delay-secs=300\n```\n\n### Delay on retry\n\nWhen [consuming messages from a queue](/queues/reference/how-queues-works/#consumers), you can choose to [explicitly mark messages to be retried](#explicit-acknowledgement-and-retries). Messages can be retried and delayed individually, or as an entire batch.\n\nTo delay an individual message within a batch:\n\n", "char_start": 9776, "char_end": 10227, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "2a8de8825885c59c", "doc_id": "queues/configuration/batching-retries.md", "text": "\n\n```ts\nexport default {\n\tasync queue(batch, env, ctx): Promise {\n\t\tfor (const msg of batch.messages) {\n\t\t\t// Mark for retry and delay a singular message\n\t\t\t// by 3600 seconds (1 hour)\n\t\t\tmsg.retry({ delaySeconds: 3600 });\n\t\t}\n\t},\n} satisfies ExportedHandler;\n```\n\n\n```python\nfrom workers import WorkerEntrypoint\n\nclass Default(WorkerEntrypoint):\n async def queue(self, batch):\n for msg in batch.messages:\n # Mark for retry and delay a singular message\n # by 3600 seconds (1 hour)\n msg.retry(delaySeconds=3600)\n```\n\n\n\nTo delay a batch of messages:\n\n", "char_start": 10227, "char_end": 10997, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "0542b63eec610fc6", "doc_id": "queues/configuration/batching-retries.md", "text": "\n\n```ts\nexport default {\n\tasync queue(batch, env, ctx): Promise {\n\t\t// Mark for retry and delay a batch of messages\n\t\t// by 600 seconds (10 minutes)\n\t\tbatch.retryAll({ delaySeconds: 600 });\n\t},\n} satisfies ExportedHandler;\n```\n\n\n```python\nfrom workers import WorkerEntrypoint\n\nclass Default(WorkerEntrypoint):\n async def queue(self, batch):\n # Mark for retry and delay a batch of messages\n # by 600 seconds (10 minutes)\n batch.retryAll(delaySeconds=600)\n```\n\n\n\n", "char_start": 10997, "char_end": 11660, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "ffb5a2cdaadf1a93", "doc_id": "queues/configuration/batching-retries.md", "text": "You can also choose to set a default retry delay to any messages that are retried due to either implicit failure or when calling `retry()` explicitly. This is set at the consumer level, and is supported in both push-based (Worker) and pull-based (HTTP) consumers.\n\nDelays can be configured via the `wrangler` CLI:\n\n```sh\n# Push-based consumers\n# Delay any messages that are retried by 60 seconds (1 minute) by default.\nnpx wrangler@latest queues consumer worker add $QUEUE-NAME $WORKER_SCRIPT_NAME --retry-delay-secs=60\n\n# Pull-based consumers\n# Delay any messages that are retried by 60 seconds (1 minute) by default.\nnpx wrangler@latest queues consumer http add $QUEUE-NAME --retry-delay-secs=60\n```\n\n", "char_start": 11660, "char_end": 12363, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "dfdb774cc78a6051", "doc_id": "queues/configuration/batching-retries.md", "text": "Delays can also be configured in the [Wrangler configuration file](/workers/wrangler/configuration/#queues) with the `delivery_delay` setting for producers (when sending) and/or the `retry_delay` (when retrying) per-consumer:\n\n\n\n```jsonc\n{\n\t\"queues\": {\n\t\t\"producers\": [\n\t\t\t{\n\t\t\t\t\"binding\": \"\",\n\t\t\t\t\"queue\": \"\",\n\t\t\t\t\"delivery_delay\": 60 // delay every message delivery by 1 minute\n\t\t\t}\n\t\t],\n\t\t\"consumers\": [\n\t\t\t{\n\t\t\t\t\"queue\": \"my-queue\",\n\t\t\t\t\"retry_delay\": 300 // delay any retried message by 5 minutes before re-attempting delivery\n\t\t\t}\n\t\t]\n\t}\n}\n```\n\n\n\n", "char_start": 12363, "char_end": 12975, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "afa259a365bbd4bd", "doc_id": "queues/configuration/batching-retries.md", "text": "If you use both the `wrangler` CLI and the [Wrangler configuration file](/workers/wrangler/configuration/) to change the settings associated with a queue or a queue consumer, the most recent configuration change will take effect.\n\nRefer to the [Queues REST API documentation](/api/resources/queues/subresources/consumers/methods/get/) to learn how to configure message delays and retry delays programmatically.\n\n### Message delay precedence\n\nMessages can be delayed by default at the queue level, or per-message (or batch).\n\n", "char_start": 12975, "char_end": 13500, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "21ee5003260c2ef8", "doc_id": "queues/configuration/batching-retries.md", "text": "- Per-message/batch delay settings take precedence over queue-level settings.\n- Setting `delaySeconds: 0` on a message when sending or retrying will ignore any queue-level delays and cause the message to be delivered in the next batch.\n- A message sent or retried with `delaySeconds: ` to a queue with a shorter default delay will still respect the message-level setting.\n\n### Apply a backoff algorithm\n\nYou can apply a backoff algorithm to increasingly delay messages based on the current number of attempts to deliver the message.\n\nEach message delivered to a consumer includes an `attempts` property that tracks the number of delivery attempts made.\n\n", "char_start": 13500, "char_end": 14176, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "7fe13f5ea68fe668", "doc_id": "queues/configuration/batching-retries.md", "text": "For example, to generate an [exponential backoff](https://en.wikipedia.org/wiki/Exponential_backoff) for a message, you can create a helper function that calculates this for you:\n\n\n\n```ts\nfunction calculateExponentialBackoff(\n\tattempts: number,\n\tbaseDelaySeconds: number,\n): number {\n\treturn baseDelaySeconds ** attempts;\n}\n```\n\n\n```python\ndef calculate_exponential_backoff(attempts, base_delay_seconds):\n return base_delay_seconds ** attempts\n```\n\n\n\nIn your consumer, you then pass the value of `msg.attempts` and your desired delay factor as the argument to `delaySeconds` when calling `retry()` on an individual message:\n\n", "char_start": 14176, "char_end": 14971, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "42b3583b1a55a0b8", "doc_id": "queues/configuration/batching-retries.md", "text": "\n\n```ts\nconst BASE_DELAY_SECONDS = 30;\n\nexport default {\n\tasync queue(batch, env, ctx): Promise {\n\t\tfor (const msg of batch.messages) {\n\t\t\t// Mark for retry with exponential backoff\n\t\t\tmsg.retry({\n\t\t\t\tdelaySeconds: calculateExponentialBackoff(\n\t\t\t\t\tmsg.attempts,\n\t\t\t\t\tBASE_DELAY_SECONDS,\n\t\t\t\t),\n\t\t\t});\n\t\t}\n\t},\n} satisfies ExportedHandler;\n```\n\n\n```python\nfrom workers import WorkerEntrypoint\n\nBASE_DELAY_SECONDS = 30\n\n", "char_start": 14971, "char_end": 15550, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "6d6a639c5adb96b2", "doc_id": "queues/configuration/batching-retries.md", "text": "class Default(WorkerEntrypoint):\n async def queue(self, batch):\n for msg in batch.messages:\n # Mark for retry and delay a singular message\n # by 3600 seconds (1 hour)\n msg.retry(\n delaySeconds=calculate_exponential_backoff(\n msg.attempts,\n BASE_DELAY_SECONDS,\n )\n )\n```\n\n\n\n## Related\n\n- Review the [JavaScript API](/queues/configuration/javascript-apis/) documentation for Queues.\n- Learn more about [How Queues Works](/queues/reference/how-queues-works/).\n- Understand the [metrics available](/queues/observability/metrics/) for your queues, including backlog and delayed message counts.", "char_start": 15550, "char_end": 16277, "metadata": {"title": "TODO: do something with the message", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", "format": "markdown", "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce"}} +{"chunk_id": "fe89bc2a7adc3836", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "---\ntitle: Consumer concurrency\ndescription: Automatically scale out Queues consumer Workers horizontally to process messages faster.\npcx_content_type: concept\nsidebar:\n order: 5\nproducts:\n - queues\n---\n\nimport { WranglerConfig, DashButton } from \"~/components\";\n\nConsumer concurrency allows a [consumer Worker](/queues/reference/how-queues-works/#consumers) processing messages from a queue to automatically scale out horizontally to keep up with the rate that messages are being written to a queue.\n\n", "char_start": 0, "char_end": 504, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "5ff4e8cea4a93521", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "In many systems, the rate at which you write messages to a queue can easily exceed the rate at which a single consumer can read and process those same messages. This is often because your consumer might be parsing message contents, writing to storage or a database, or making third-party (upstream) API calls.\n\nNote that queue producers are always scalable, up to the [maximum supported messages-per-second](/queues/platform/limits/) (per queue) limit.\n\n## Enable concurrency\n\nBy default, all queues have concurrency enabled. Queue consumers will automatically scale up [to the maximum concurrent invocations](/queues/platform/limits/) as needed to manage a queue's backlog and/or error rates.\n\n", "char_start": 504, "char_end": 1199, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "650dd34ff10e499d", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "## How concurrency works\n\nAfter processing a batch of messages, Queues will check to see if the number of concurrent consumers should be adjusted. The number of concurrent consumers invoked for a queue will autoscale based on several factors, including:\n\n- The number of messages in the queue (backlog) and its rate of growth.\n- The ratio of failed (versus successful) invocations. A failed invocation is when your `queue()` handler returns an uncaught exception instead of `void` (nothing).\n- The value of `max_concurrency` set for that consumer.\n\n", "char_start": 1199, "char_end": 1748, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "e9c58ba2cf2a5baa", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "Where possible, Queues will optimize for keeping your backlog from growing exponentially, in order to minimize scenarios where the backlog of messages in a queue grows to the point that they would reach the [message retention limit](/queues/platform/limits/) before being processed.\n\n:::note[Consumer concurrency and retried messages]\n\n[Retrying messages with `retry()`](/queues/configuration/batching-retries/#explicit-acknowledgement-and-retries) or calling `retryAll()` on a batch will **not** count as a failed invocation.\n\n:::\n\n### Example\n\nIf you are writing 100 messages/second to a queue with a single concurrent consumer that takes 5 seconds to process a batch of 100 messages, the number of messages in-flight will continue to grow at a rate faster than your consumer can keep up.\n\n", "char_start": 1748, "char_end": 2540, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "c9bf276e01f41c48", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "In this scenario, Queues will notice the growing backlog and will scale the number of concurrent consumer Workers invocations up to a steady-state of (approximately) five (5) until the rate of incoming messages decreases, the consumer processes messages faster, or the consumer begins to generate errors.\n\n### Why are my consumers not autoscaling?\n\nIf your consumers are not autoscaling, there are a few likely causes:\n\n", "char_start": 2540, "char_end": 2960, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "456506ed05d4d045", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "- `max_concurrency` has been set to 1.\n- Your consumer Worker is returning errors rather than processing messages. Inspect your consumer to make sure it is healthy.\n- A batch of messages is being processed. Queues checks if it should autoscale consumers only after processing an entire batch of messages, so it will not autoscale while a batch is being processed. Consider reducing batch sizes or refactoring your consumer to process messages faster.\n\n## Limit concurrency\n\n:::caution[Recommended concurrency setting]\n\n", "char_start": 2960, "char_end": 3479, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "592a1dc65d740790", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "Cloudflare recommends leaving the maximum concurrency unset, which will allow your queue consumer to scale up as much as possible. Setting a fixed number means that your consumer will only ever scale up to that maximum, even as Queues increases the maximum supported invocations over time.\n\n:::\n\nIf you have a workflow that is limited by an upstream API and/or system, you may prefer for your backlog to grow, trading off increased overall latency in order to avoid overwhelming an upstream system.\n\nYou can configure the concurrency of your consumer Worker in two ways:\n\n1. Set concurrency settings in the Cloudflare dashboard\n2. Set concurrency settings via the [Wrangler configuration file](/workers/wrangler/configuration/)\n\n", "char_start": 3479, "char_end": 4208, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "5278639960b1ffd5", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "### Set concurrency settings in the Cloudflare dashboard\n\nTo configure the concurrency settings for your consumer Worker from the dashboard:\n\n1. In the Cloudflare dashboard, go to the **Queues** page.\n\n\t \n\n2. Select your queue > **Settings**.\n3. Select **Edit Consumer** under Consumer details.\n4. Set **Maximum consumer invocations** to a value between `1` and `250`. This value represents the maximum number of concurrent consumer invocations available to your queue.\n\nTo remove a fixed maximum value, select **auto (recommended)**.\n\n", "char_start": 4208, "char_end": 4794, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "02414a26abe56c81", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "Note that if you are writing messages to a queue faster than you can process them, messages may eventually reach the [maximum retention period](/queues/platform/limits/) set for that queue. Individual messages that reach that limit will expire from the queue and be deleted.\n\n### Set concurrency settings in the [Wrangler configuration file](/workers/wrangler/configuration/)\n\n:::note\n\nEnsure you are using the latest version of [wrangler](/workers/wrangler/install-and-update/). Support for configuring the maximum concurrency of a queue consumer is only supported in wrangler [`2.13.0`](https://github.com/cloudflare/workers-sdk/releases/tag/wrangler%402.13.0) or greater.\n\n:::\n\n", "char_start": 4794, "char_end": 5475, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "cda16930d79c1dd6", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "To set a fixed maximum number of concurrent consumer invocations for a given queue, configure a `max_concurrency` in your Wrangler file:\n\n\n\n```jsonc\n{\n\t\"queues\": {\n\t\t\"consumers\": [\n\t\t\t{\n\t\t\t\t\"queue\": \"my-queue\",\n\t\t\t\t\"max_concurrency\": 1\n\t\t\t}\n\t\t]\n\t}\n}\n```\n\n\n\nTo remove the limit, remove the `max_concurrency` setting from the `[[queues.consumers]]` configuration for a given queue and call `npx wrangler deploy` to push your configuration update.\n\n {/* Not yet available but will be very soon\n\n ### wrangler CLI\n\n ```sh\n # where `N` is a positive integer between 1 and 250\n wrangler queues consumer update --max-concurrency=N\n ```\n\n", "char_start": 5475, "char_end": 6170, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "32279c3217bbffbb", "doc_id": "queues/configuration/consumer-concurrency.md", "text": " To remove the limit and allow Queues to scale your consumer to the maximum number of invocations, call `consumer update` without any flags:\n\n ```sh\n # Call update without passing a flag to allow concurrency to scale to the maximum\n wrangler queues consumer update \n ``` */}\n\n## Billing\n\nWhen multiple consumer Workers are invoked, each Worker invocation incurs [CPU time costs](/workers/platform/pricing/#workers).\n\n- If you intend to process all messages written to a queue, _the effective overall cost is the same_, even with concurrency enabled.\n- Enabling concurrency simply brings those costs forward, and can help prevent messages from reaching the [message retention limit](/queues/platform/limits/).\n\n", "char_start": 6170, "char_end": 6908, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "8e9279f335549ea7", "doc_id": "queues/configuration/consumer-concurrency.md", "text": "Billing for consumers follows the [Workers standard usage model](/workers/platform/pricing/#example-pricing) meaning a developer is billed for the request and for CPU time used in the request.\n\n### Example\n\nA consumer Worker that takes 2 seconds to process a batch of messages will incur the same overall costs to process 50 million (50,000,000) messages, whether it does so concurrently (faster) or individually (slower).\n", "char_start": 6908, "char_end": 7331, "metadata": {"title": "where `N` is a positive integer between 1 and 250", "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", "format": "markdown", "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08"}} +{"chunk_id": "5e9af3127499fc2a", "doc_id": "queues/examples/use-queues-with-durable-objects.md", "text": "---\ntitle: Use Queues from Durable Objects\nsummary: Publish to a queue from within a Durable Object.\npcx_content_type: example\nsidebar:\n order: 20\nhead:\n - tag: title\n content: Queues - Use Queues and Durable Objects\ndescription: Publish to a queue from within a Durable Object.\nreviewed: 2023-09-13\nproducts:\n - queues\n - durable-objects\n---\n\nimport { WranglerConfig } from \"~/components\";\n\nThe following example shows you how to write a Worker script to publish to [Cloudflare Queues](/queues/) from within a [Durable Object](/durable-objects/).\n\nPrerequisites:\n\n", "char_start": 0, "char_end": 572, "metadata": {"title": "use-queues-with-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md", "format": "markdown", "raw_hash": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288"}} +{"chunk_id": "dd08a3c832646e13", "doc_id": "queues/examples/use-queues-with-durable-objects.md", "text": "- A [queue created](/queues/get-started/#3-create-a-queue) via the Cloudflare dashboard or the [wrangler CLI](/workers/wrangler/install-and-update/).\n- A [configured **producer** binding](/queues/configuration/configure-queues/#producer-worker-configuration) in the Cloudflare dashboard or Wrangler file.\n- A [Durable Object namespace binding](/workers/wrangler/configuration/#durable-objects).\n\nConfigure your Wrangler file as follows:\n\n\n\n", "char_start": 572, "char_end": 1028, "metadata": {"title": "use-queues-with-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md", "format": "markdown", "raw_hash": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288"}} +{"chunk_id": "846e9f4ce986ec16", "doc_id": "queues/examples/use-queues-with-durable-objects.md", "text": "```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"my-worker\",\n\t\"queues\": {\n\t\t\"producers\": [\n\t\t\t{\n\t\t\t\t\"queue\": \"my-queue\",\n\t\t\t\t\"binding\": \"YOUR_QUEUE\"\n\t\t\t}\n\t\t]\n\t},\n\t\"durable_objects\": {\n\t\t\"bindings\": [\n\t\t\t{\n\t\t\t\t\"name\": \"YOUR_DO_CLASS\",\n\t\t\t\t\"class_name\": \"YourDurableObject\"\n\t\t\t}\n\t\t]\n\t},\n\t\"migrations\": [\n\t\t{\n\t\t\t\"tag\": \"v1\",\n\t\t\t\"new_sqlite_classes\": [\n\t\t\t\t\"YourDurableObject\"\n\t\t\t]\n\t\t}\n\t]\n}\n```\n\n\n\nThe following Worker script:\n\n1. Creates a Durable Object stub, or retrieves an existing one based on a userId.\n2. Passes request data to the Durable Object.\n3. Publishes to a queue from within the Durable Object.\n\n", "char_start": 1028, "char_end": 1684, "metadata": {"title": "use-queues-with-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md", "format": "markdown", "raw_hash": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288"}} +{"chunk_id": "ab24ffd578e92255", "doc_id": "queues/examples/use-queues-with-durable-objects.md", "text": "Extending the `DurableObject` base class makes your `Env` available on `this.env` and the Durable Object state available on `this.ctx` within the [`fetch()` handler](/durable-objects/best-practices/create-durable-object-stubs-and-send-requests/) in the Durable Object.\n\n```ts\nimport { DurableObject } from \"cloudflare:workers\";\n\ninterface Env {\n YOUR_QUEUE: Queue;\n YOUR_DO_CLASS: DurableObjectNamespace;\n}\n\n", "char_start": 1684, "char_end": 2113, "metadata": {"title": "use-queues-with-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md", "format": "markdown", "raw_hash": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288"}} +{"chunk_id": "cf6143485f316e9c", "doc_id": "queues/examples/use-queues-with-durable-objects.md", "text": "export default {\n async fetch(req, env, ctx): Promise {\n // Assume each Durable Object is mapped to a userId in a query parameter\n // In a production application, this will be a userId defined by your application\n // that you validate (and/or authenticate) first.\n const url = new URL(req.url);\n const userIdParam = url.searchParams.get(\"userId\");\n\n if (userIdParam) {\n // Get a stub that allows you to call that Durable Object\n const durableObjectStub = env.YOUR_DO_CLASS.getByName(userIdParam);\n\n", "char_start": 2113, "char_end": 2650, "metadata": {"title": "use-queues-with-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md", "format": "markdown", "raw_hash": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288"}} +{"chunk_id": "ba2cfd4600a43858", "doc_id": "queues/examples/use-queues-with-durable-objects.md", "text": " // Pass the request to that Durable Object and await the response\n // This invokes the constructor once on your Durable Object class (defined further down)\n // on the first initialization, and the fetch method on each request.\n // We pass the original Request to the Durable Object's fetch method\n const response = await durableObjectStub.fetch(req);\n\n // This would return \"wrote to queue\", but you could return any response.\n return response;\n }\n return new Response(\"userId must be provided\", { status: 400 });\n },\n} satisfies ExportedHandler;\n\n", "char_start": 2650, "char_end": 3246, "metadata": {"title": "use-queues-with-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md", "format": "markdown", "raw_hash": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288"}} +{"chunk_id": "e82716e7efc4d4bd", "doc_id": "queues/examples/use-queues-with-durable-objects.md", "text": "export class YourDurableObject extends DurableObject {\n async fetch(req: Request): Promise {\n // Error handling elided for brevity.\n // Publish to your queue\n await this.env.YOUR_QUEUE.send({\n id: this.ctx.id.toString(), // Write the ID of the Durable Object to your queue\n // Write any other properties to your queue\n });\n\n return new Response(\"wrote to queue\");\n }\n}\n```\n", "char_start": 3246, "char_end": 3661, "metadata": {"title": "use-queues-with-durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md", "format": "markdown", "raw_hash": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288"}} +{"chunk_id": "d166fff9652c78c4", "doc_id": "queues/get-started.md", "text": "---\ntitle: Getting started\ndescription: Create your first Cloudflare Queue, a producer Worker, and a consumer Worker.\npcx_content_type: get-started\nsidebar:\n order: 2\nhead:\n - tag: title\n content: Getting started\nproducts:\n - queues\n - workers\n---\n\nimport { Render, PackageManagers, WranglerConfig } from \"~/components\";\n\nCloudflare Queues is a flexible messaging queue that allows you to queue messages for asynchronous processing. By following this guide, you will create your first queue, a Worker to publish messages to that queue, and a consumer Worker to consume messages from that queue.\n\n## Prerequisites\n\nTo use Queues, you will need:\n\n\n\n", "char_start": 0, "char_end": 697, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "9e5f5891f6938334", "doc_id": "queues/get-started.md", "text": "## 1. Create a Worker project\n\nYou will access your queue from a Worker, the producer Worker. You must create at least one producer Worker to publish messages onto your queue. If you are using [R2 Bucket Event Notifications](/r2/buckets/event-notifications/), then you do not need a producer Worker.\n\nTo create a producer Worker, run:\n\n\n\n\n\n", "char_start": 697, "char_end": 1264, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "ef5a2ace53c4f1d0", "doc_id": "queues/get-started.md", "text": "This will create a new directory, which will include both a `src/index.ts` Worker script, and a [`wrangler.jsonc`](/workers/wrangler/configuration/) configuration file. After you create your Worker, you will create a Queue to access.\n\nMove into the newly created directory:\n\n```sh\ncd producer-worker\n```\n\n## 2. Create a queue\n\nTo use queues, you need to create at least one queue to publish messages to and consume messages from.\n\nTo create a queue, run:\n\n```sh\nnpx wrangler queues create \n```\n\nChoose a name that is descriptive and relates to the types of messages you intend to use this queue for. Descriptive queue names look like: `debug-logs`, `user-clickstream-data`, or `password-reset-prod`.\n\n", "char_start": 1264, "char_end": 1980, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "bc17938326e02aae", "doc_id": "queues/get-started.md", "text": "Queue names must be 1 to 63 characters long. Queue names cannot contain special characters outside dashes (`-`), and must start and end with a letter or number.\n\nYou cannot change your queue name after you have set it. After you create your queue, you will set up your producer Worker to access it.\n\n## 3. Set up your producer Worker\n\nTo expose your queue to the code inside your Worker, you need to connect your queue to your Worker by creating a binding. [Bindings](/workers/runtime-apis/bindings/) allow your Worker to access resources, such as Queues, on the Cloudflare developer platform.\n\nTo create a binding, open your newly generated `wrangler.jsonc` file and add the following:\n\n\n\n", "char_start": 1980, "char_end": 2686, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "7c4837636f3a6ae0", "doc_id": "queues/get-started.md", "text": "```jsonc\n{\n\t\"queues\": {\n\t\t\"producers\": [\n\t\t\t{\n\t\t\t\t\"queue\": \"MY-QUEUE-NAME\",\n\t\t\t\t\"binding\": \"MY_QUEUE\"\n\t\t\t}\n\t\t]\n\t}\n}\n```\n\n\n\nReplace `MY-QUEUE-NAME` with the name of the queue you created in [step 2](/queues/get-started/#2-create-a-queue). Next, replace `MY_QUEUE` with the name you want for your `binding`. The binding must be a valid JavaScript variable name. This is the variable you will use to reference this queue in your Worker.\n\n### Write your producer Worker\n\nYou will now configure your producer Worker to create messages to publish to your queue. Your producer Worker will:\n\n1. Take a request it receives from the browser.\n2. Transform the request to JSON format.\n3. Write the request directly to your queue.\n\n", "char_start": 2686, "char_end": 3422, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "9982c3c7b718632a", "doc_id": "queues/get-started.md", "text": "In your Worker project directory, open the `src` folder and add the following to your `index.ts` file:\n\n```ts null {8}\nexport default {\n async fetch(request, env, ctx): Promise {\n const log = {\n url: request.url,\n method: request.method,\n headers: Object.fromEntries(request.headers),\n };\n await env..send(log);\n return new Response(\"Success!\");\n },\n} satisfies ExportedHandler;\n```\n\nReplace `MY_QUEUE` with the name you have set for your binding from your `wrangler.jsonc` file.\n\nAlso add the queue to `Env` interface in `index.ts`.\n\n```ts null {2}\nexport interface Env {\n : Queue;\n}\n```\n\n", "char_start": 3422, "char_end": 4078, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "5bd2dbc2f5ca3b3b", "doc_id": "queues/get-started.md", "text": "If this write fails, your Worker will return an error (raise an exception). If this write works, it will return `Success` back with a HTTP `200` status code to the browser.\n\nIn a production application, you would likely use a [`try...catch`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch) statement to catch the exception and handle it directly (for example, return a custom error or even retry).\n\n### Publish your producer Worker\n\nWith your Wrangler file and `index.ts` file configured, you are ready to publish your producer Worker. To publish your producer Worker, run:\n\n```sh\nnpx wrangler deploy\n```\n\nYou should see output that resembles the below, with a `*.workers.dev` URL by default.\n\n", "char_start": 4078, "char_end": 4814, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "61c04fd44820b1f3", "doc_id": "queues/get-started.md", "text": "```\nUploaded (0.76 sec)\nPublished (0.29 sec)\n https://..workers.dev\n```\n\nCopy your `*.workers.dev` subdomain and paste it into a new browser tab. Refresh the page a few times to start publishing requests to your queue. Your browser should return the `Success` response after writing the request to the queue each time.\n\nYou have built a queue and a producer Worker to publish messages to the queue. You will now create a consumer Worker to consume the messages published to your queue. Without a consumer Worker, the messages will stay on the queue until they expire, which defaults to four (4) days.\n\n", "char_start": 4814, "char_end": 5487, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "6e047b419515e1d0", "doc_id": "queues/get-started.md", "text": "## 4. Create your consumer Worker\n\nA consumer Worker receives messages from your queue. When the consumer Worker receives your queue's messages, it can write them to another source, such as a logging console or storage objects.\n\nIn this guide, you will create a consumer Worker and use it to log and inspect the messages with [`wrangler tail`](/workers/wrangler/commands/general/#tail). You will create your consumer Worker in the same Worker project that you created your producer Worker.\n\n:::note\n\nQueues also supports [pull-based consumers](/queues/configuration/pull-consumers/), which allows any HTTP-based client to consume messages from a queue. This guide creates a push-based consumer using Cloudflare Workers.\n\n:::\n\n", "char_start": 5487, "char_end": 6213, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "df9193e25362f094", "doc_id": "queues/get-started.md", "text": "To create a consumer Worker, open your `index.ts` file and add the following `queue` handler to your existing `fetch` handler:\n\n```ts null {11}\nexport default {\n async fetch(request, env, ctx): Promise {\n const log = {\n url: request.url,\n method: request.method,\n headers: Object.fromEntries(request.headers),\n };\n await env..send(log);\n return new Response(\"Success!\");\n },\n async queue(batch, env, ctx): Promise {\n for (const message of batch.messages) {\n console.log(\"consumed from our queue:\", JSON.stringify(message.body));\n }\n },\n} satisfies ExportedHandler;\n```\n\nReplace `MY_QUEUE` with the name you have set for your binding from your `wrangler.jsonc` file.\n\n", "char_start": 6213, "char_end": 6953, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "e537c6c081391416", "doc_id": "queues/get-started.md", "text": "Every time messages are published to the queue, your consumer Worker's `queue` handler (`async queue`) is called and it is passed one or more messages.\n\nIn this example, your consumer Worker transforms the queue's JSON formatted message into a string and logs that output. In a real world application, your consumer Worker can be configured to write messages to object storage (such as [R2](/r2/)), write to a database (like [D1](/d1/)), further process messages before calling an external API (such as an [email API](/workers/tutorials/)) or a data warehouse with your legacy cloud provider.\n\n", "char_start": 6953, "char_end": 7547, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "ff975b47080d95c2", "doc_id": "queues/get-started.md", "text": "When performing asynchronous tasks from within your consumer handler, use `waitUntil()` to ensure the response of the function is handled. Other asynchronous methods are not supported within the scope of this method.\n\n### Connect the consumer Worker to your queue\n\nAfter you have configured your consumer Worker, you are ready to connect it to your queue.\n\nEach queue can only have one consumer Worker connected to it. If you try to connect multiple consumers to the same queue, you will encounter an error when attempting to publish that Worker.\n\nTo connect your queue to your consumer Worker, open your Wrangler file and add this to the bottom:\n\n\n\n", "char_start": 7547, "char_end": 8213, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "fb1e70ff5c08d7a0", "doc_id": "queues/get-started.md", "text": "```jsonc\n{\n\t\"queues\": {\n\t\t\"consumers\": [\n\t\t\t{\n\t\t\t\t\"queue\": \"\",\n\t\t\t\t// Required: this should match the name of the queue you created in step 3.\n\t\t\t\t// If you misspell the name, you will receive an error when attempting to publish your Worker.\n\t\t\t\t\"max_batch_size\": 10, // optional: defaults to 10\n\t\t\t\t\"max_batch_timeout\": 5 // optional: defaults to 5 seconds\n\t\t\t}\n\t\t]\n\t}\n}\n```\n\n\n\nReplace `MY-QUEUE-NAME` with the queue you created in [step 2](/queues/get-started/#2-create-a-queue).\n\nIn your consumer Worker, you are using queues to auto batch messages using the `max_batch_size` option and the `max_batch_timeout` option. The consumer Worker will receive messages in batches of `10` or every `5` seconds, whichever happens first.\n\n", "char_start": 8213, "char_end": 8976, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "0765e6f041566bb9", "doc_id": "queues/get-started.md", "text": "`max_batch_size` (defaults to 10) helps to reduce the amount of times your consumer Worker needs to be called. Instead of being called for every message, it will only be called after 10 messages have entered the queue.\n\n`max_batch_timeout` (defaults to 5 seconds) helps to reduce wait time. If the producer Worker is not sending up to 10 messages to the queue for the consumer Worker to be called, the consumer Worker will be called every 5 seconds to receive messages that are waiting in the queue.\n\n### Publish your consumer Worker\n\nWith your Wrangler file and `index.ts` file configured, publish your consumer Worker by running:\n\n```sh\nnpx wrangler deploy\n```\n\n## 5. Read messages from your queue\n\nAfter you set up consumer Worker, you can read messages from the queue.\n\n", "char_start": 8976, "char_end": 9750, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "8371d837fa5847bc", "doc_id": "queues/get-started.md", "text": "Run `wrangler tail` to start waiting for our consumer to log the messages it receives:\n\n```sh\nnpx wrangler tail\n```\n\nWith `wrangler tail` running, open the Worker URL you opened in [step 3](/queues/get-started/#3-set-up-your-producer-worker).\n\nYou should receive a `Success` message in your browser window.\n\nIf you receive a `Success` message, refresh the URL a few times to generate messages and push them onto the queue.\n\nWith `wrangler tail` running, your consumer Worker will start logging the requests generated by refreshing.\n\nIf you refresh less than 10 times, it may take a few seconds for the messages to appear because batch timeout is configured for 10 seconds. After 10 seconds, messages should arrive in your terminal.\n\n", "char_start": 9750, "char_end": 10483, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "f14de00c87c45de5", "doc_id": "queues/get-started.md", "text": "If you get errors when you refresh, check that the queue name you created in [step 2](/queues/get-started/#2-create-a-queue) and the queue you referenced in your Wrangler file is the same. You should ensure that your producer Worker is returning `Success` and is not returning an error.\n\nBy completing this guide, you have now created a queue, a producer Worker that publishes messages to that queue, and a consumer Worker that consumes those messages from it.\n\n## Related resources\n\n- Learn more about [Cloudflare Workers](/workers/) and the applications you can build on Cloudflare.\n", "char_start": 10483, "char_end": 11068, "metadata": {"title": "get-started", "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", "format": "markdown", "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a"}} +{"chunk_id": "641e10b0529354e1", "doc_id": "queues/index.md", "text": "---\ntitle: Cloudflare Queues\ndescription: Send and receive messages with guaranteed delivery using Cloudflare Queues integrated with Workers.\npcx_content_type: overview\nsidebar:\n order: 1\nhead:\n - tag: title\n content: Overview\nproducts:\n - queues\n - workers\n---\n\nimport { CardGrid, Description, Feature, LinkTitleCard, Plan, RelatedProduct, LinkButton } from \"~/components\"\n\n\n\n\nSend and receive messages with guaranteed delivery and no charges for egress bandwidth.\n\n\n\n\n\n\n", "char_start": 0, "char_end": 533, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/queues/index.md", "format": "markdown", "raw_hash": "7ca76e34b7712d7ea2fb558cd572d8994848a8e4cecfdf412ae59aa6082aa778"}} +{"chunk_id": "9aefdb078748e110", "doc_id": "queues/index.md", "text": "Cloudflare Queues integrate with [Cloudflare Workers](/workers/) and enable you to build applications that can [guarantee delivery](/queues/reference/delivery-guarantees/), [offload work from a request](/queues/reference/how-queues-works/), [send data from Worker to Worker](/queues/configuration/configure-queues/), and [buffer or batch data](/queues/configuration/batching-retries/).\n\nGet started\n\n***\n\n## Features\n\n\n\nCloudflare Queues allows you to batch, retry and delay messages.\n\n\n\n\n\n\nRedirect your messages when a delivery failure occurs.\n\n\n", "char_start": 533, "char_end": 1324, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/queues/index.md", "format": "markdown", "raw_hash": "7ca76e34b7712d7ea2fb558cd572d8994848a8e4cecfdf412ae59aa6082aa778"}} +{"chunk_id": "e66dbb95604acffd", "doc_id": "queues/index.md", "text": "\n\n\n\nConfigure pull-based consumers to pull from a queue over HTTP from infrastructure outside of Cloudflare Workers.\n\n\n\n\n***\n\n## Related products\n\n\n\nCloudflare R2 Storage allows developers to store large amounts of unstructured data without the costly egress bandwidth fees associated with typical cloud storage services.\n\n\n\n\n\n\nCloudflare Workers allows developers to build serverless applications and deploy instantly across the globe for exceptional performance, reliability, and scale.\n\n\n\n\n***\n\n## More resources\n\n\n\n", "char_start": 1324, "char_end": 2106, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/queues/index.md", "format": "markdown", "raw_hash": "7ca76e34b7712d7ea2fb558cd572d8994848a8e4cecfdf412ae59aa6082aa778"}} +{"chunk_id": "ec993170eae8bcdf", "doc_id": "queues/index.md", "text": "\nLearn about pricing.\n\n\n\nLearn about Queues limits.\n\n\n\nTry Cloudflare Queues which can run on your local machine.\n\n\n\nFollow @CloudflareDev on Twitter to learn about product announcements, and what is new in Cloudflare Workers.\n\n\n", "char_start": 2106, "char_end": 2769, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/queues/index.md", "format": "markdown", "raw_hash": "7ca76e34b7712d7ea2fb558cd572d8994848a8e4cecfdf412ae59aa6082aa778"}} +{"chunk_id": "ec3494ba6ff0dc09", "doc_id": "queues/index.md", "text": "\nConnect with the Workers community on Discord to ask questions, show what you are building, and discuss the platform with other developers.\n\n\n\nLearn how to configure Cloudflare Queues using Wrangler.\n\n\n\nLearn how to use JavaScript APIs to send and receive messages to a Cloudflare Queue.\n\n\n", "char_start": 2769, "char_end": 3405, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/queues/index.md", "format": "markdown", "raw_hash": "7ca76e34b7712d7ea2fb558cd572d8994848a8e4cecfdf412ae59aa6082aa778"}} +{"chunk_id": "1c0c79ae131ac678", "doc_id": "queues/index.md", "text": "\nLearn how to configure and manage event subscriptions for your queues.\n\n\n\n", "char_start": 3405, "char_end": 3603, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/queues/index.md", "format": "markdown", "raw_hash": "7ca76e34b7712d7ea2fb558cd572d8994848a8e4cecfdf412ae59aa6082aa778"}} +{"chunk_id": "28bc23ed549e75c6", "doc_id": "queues/reference/delivery-guarantees.md", "text": "---\ntitle: Delivery guarantees\ndescription: Cloudflare Queues provides at-least-once message delivery by default.\npcx_content_type: concept\nsidebar:\n order: 2\nproducts:\n - queues\n---\n\nDelivery guarantees define how strongly a messaging system enforces the delivery of messages it processes.\n\nAs you make stronger guarantees about message delivery, the system needs to perform more checks and acknowledgments to ensure that messages are delivered, or maintain state to ensure a message is only delivered the specified number of times. This increases the latency of the system and reduces the overall throughput of the system. Each message may require an additional internal acknowledgements, and an equivalent number of additional roundtrips, before it can be considered delivered.\n\n", "char_start": 0, "char_end": 784, "metadata": {"title": "delivery-guarantees", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/delivery-guarantees.md", "format": "markdown", "raw_hash": "ed989b394791a8bf6c450e1f8f7fcfa3d13a0e1a4d43586a84edbe7087a2f222"}} +{"chunk_id": "6ca75df89f5da92f", "doc_id": "queues/reference/delivery-guarantees.md", "text": "* **Queues provides *at least once* delivery by default** in order to optimize for reliability.\n* This means that messages are guaranteed to be delivered at least once, and in rare occasions, may be delivered more than once.\n* For the majority of applications, this is the right balance between not losing any messages and minimizing end-to-end latency, as exactly once delivery incurs additional overheads in any messaging system.\n\n", "char_start": 784, "char_end": 1217, "metadata": {"title": "delivery-guarantees", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/delivery-guarantees.md", "format": "markdown", "raw_hash": "ed989b394791a8bf6c450e1f8f7fcfa3d13a0e1a4d43586a84edbe7087a2f222"}} +{"chunk_id": "896ff1b56fd48e9d", "doc_id": "queues/reference/delivery-guarantees.md", "text": "In cases where processing the same message more than once would introduce unintended behaviour, generating a unique ID when writing the message to the queue and using that as the primary key on database inserts and/or as an idempotency key to de-duplicate the message after processing. For example, using this idempotency key as the ID in an upstream email API or payment API will allow those services to reject the duplicate on your behalf, without you having to carry additional state in your application.\n", "char_start": 1217, "char_end": 1725, "metadata": {"title": "delivery-guarantees", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/delivery-guarantees.md", "format": "markdown", "raw_hash": "ed989b394791a8bf6c450e1f8f7fcfa3d13a0e1a4d43586a84edbe7087a2f222"}} +{"chunk_id": "c2382be7fb1a0c81", "doc_id": "queues/reference/how-queues-works.md", "text": "---\ntitle: How Queues Works\ndescription: Learn about Queues architecture including producers, consumers, and message lifecycle.\npcx_content_type: concept\nsidebar:\n order: 1\nproducts:\n - queues\n---\n\nimport { WranglerConfig } from \"~/components\";\n\nCloudflare Queues is a flexible messaging queue that allows you to queue messages for asynchronous processing. Message queues are great at decoupling components of applications, like the checkout and order fulfillment services for an e-commerce site. Decoupled services are easier to reason about, deploy, and implement, allowing you to ship features that delight your customers without worrying about synchronizing complex deployments. Queues also allow you to batch and buffer calls to downstream services and APIs.\n\n", "char_start": 0, "char_end": 767, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "d83f6c10eee8ed8a", "doc_id": "queues/reference/how-queues-works.md", "text": "There are four major concepts to understand with Queues:\n\n1. [Queues](#what-is-a-queue)\n2. [Producers](#producers)\n3. [Consumers](#consumers)\n4. [Messages](#messages)\n\n## What is a queue\n\nA queue is a buffer or list that automatically scales as messages are written to it, and allows a consumer Worker to pull messages from that same queue.\n\nQueues are designed to be reliable, and messages written to a queue should never be lost once the write succeeds. Similarly, messages are not deleted from a queue until the [consumer](#consumers) has successfully consumed the message.\n\nQueues does not guarantee that messages will be delivered to a consumer in the same order in which they are published.\n\nDevelopers can create multiple queues. Creating multiple queues can be useful to:\n\n", "char_start": 767, "char_end": 1548, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "40da13d48cab606f", "doc_id": "queues/reference/how-queues-works.md", "text": "* Separate different use-cases and processing requirements: for example, a logging queue vs. a password reset queue.\n* Horizontally scale your overall throughput (messages per second) by using multiple queues to scale out.\n* Configure different batching strategies for each consumer connected to a queue.\n\nFor most applications, a single producer Worker per queue, with a single consumer Worker consuming messages from that queue allows you to logically separate the processing for each of your queues.\n\n## Producers\n\nA producer is the term for a client that is publishing or producing messages on to a queue. A producer is configured by [binding](/workers/runtime-apis/bindings/) a queue to a Worker and writing messages to the queue by calling that binding.\n\n", "char_start": 1548, "char_end": 2309, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "c7e8dd742c6b68b2", "doc_id": "queues/reference/how-queues-works.md", "text": "For example, if we bound a queue named `my-first-queue` to a binding of `MY_FIRST_QUEUE`, messages can be written to the queue by calling `send()` on the binding:\n\n```ts\ninterface Env {\n readonly MY_FIRST_QUEUE: Queue;\n}\n\nexport default {\n async fetch(req, env, ctx): Promise {\n const message = {\n url: req.url,\n method: req.method,\n headers: Object.fromEntries(req.headers),\n };\n\n await env.MY_FIRST_QUEUE.send(message); // This will throw an exception if the send fails for any reason\n return new Response(\"Sent!\");\n },\n} satisfies ExportedHandler;\n```\n\n:::note\n\n\nYou can also use [`context.waitUntil()`](/workers/runtime-apis/context/#waituntil) to send the message without blocking the response.\n\n", "char_start": 2309, "char_end": 3055, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "dec1d413f7442a8d", "doc_id": "queues/reference/how-queues-works.md", "text": "Note that because `waitUntil()` is non-blocking, any errors raised from the `send()` or `sendBatch()` methods on a queue will be implicitly ignored.\n\n\n:::\n\nA queue can have multiple producer Workers. For example, you may have multiple producer Workers writing events or logs to a shared queue based on incoming HTTP requests from users. There is no limit to the total number of producer Workers that can write to a single queue.\n\nAdditionally, multiple queues can be bound to a single Worker. That single Worker can decide which queue to write to (or write to multiple) based on any logic you define in your code.\n\n", "char_start": 3055, "char_end": 3670, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "7f8136600fa1886e", "doc_id": "queues/reference/how-queues-works.md", "text": "### Content types\n\nMessages published to a queue can be published in different formats, depending on what interoperability is needed with your consumer. The default content type is `json`, which means that any object that can be passed to `JSON.stringify()` will be accepted.\n\nTo explicitly set the content type or specify an alternative content type, pass the `contentType` option to the `send()` method of your queue:\n\n```ts\ninterface Env {\n readonly MY_FIRST_QUEUE: Queue;\n}\n\n", "char_start": 3670, "char_end": 4150, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "4ac7cb253e561f45", "doc_id": "queues/reference/how-queues-works.md", "text": "export default {\n async fetch(req, env, ctx): Promise {\n const message = {\n url: req.url,\n method: req.method,\n headers: Object.fromEntries(req.headers),\n };\n try {\n await env.MY_FIRST_QUEUE.send(message, { contentType: \"json\" }); // \"json\" is the default\n return new Response(\"Sent!\");\n } catch (e) {\n // Catch cases where send fails, including due to a mismatched content type\n const msg = e instanceof Error ? e.message : \"Unknown error\";\n return Response.json({ error: msg }, { status: 500 });\n }\n },\n} satisfies ExportedHandler;\n```\n\nTo only accept simple strings when writing to a queue, set `{ contentType: \"text\" }` instead:\n\n```ts\ninterface Env {\n readonly MY_FIRST_QUEUE: Queue;\n}\n\n", "char_start": 4150, "char_end": 4915, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "981dcdf31ac16c3e", "doc_id": "queues/reference/how-queues-works.md", "text": "export default {\n async fetch(req, env, ctx): Promise {\n try {\n // This will throw an exception (error) if you pass a non-string to the queue,\n // such as a native JavaScript object or ArrayBuffer.\n await env.MY_FIRST_QUEUE.send(\"hello there\", { contentType: \"text\" }); // explicitly set 'text'\n return new Response(\"Sent!\");\n } catch (e) {\n const msg = e instanceof Error ? e.message : \"Unknown error\";\n return Response.json({ error: msg }, { status: 500 });\n }\n },\n} satisfies ExportedHandler;\n```\n\nThe [`QueuesContentType`](/queues/configuration/javascript-apis/#queuescontenttype) API documentation describes how each format is serialized to a queue.\n\n## Consumers\n\nQueues supports two types of consumer:\n\n", "char_start": 4915, "char_end": 5681, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "05e9bbc03073a40d", "doc_id": "queues/reference/how-queues-works.md", "text": "1. A [consumer Worker](/queues/configuration/configure-queues/), which is push-based: the Worker is invoked when the queue has messages to deliver.\n2. A [HTTP pull consumer](/queues/configuration/pull-consumers/), which is pull-based: the consumer calls the queue endpoint over HTTP to receive and then acknowledge messages.\n\nA queue can only have one type of consumer configured.\n\n### Create a consumer Worker\n\nA consumer is the term for a client that is subscribing to or *consuming* messages from a queue. In its most basic form, a consumer is defined by creating a `queue` handler in a Worker:\n\n```ts\ninterface Env {\n // Add your bindings here, e.g. KV namespaces, R2 buckets, D1 databases\n}\n\n", "char_start": 5681, "char_end": 6379, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "d16d1a04c3a548cb", "doc_id": "queues/reference/how-queues-works.md", "text": "export default {\n async queue(batch, env, ctx): Promise {\n // Do something with messages in the batch\n // i.e. write to R2 storage, D1 database, or POST to an external API\n for (const msg of batch.messages) {\n // Process each message\n console.log(msg.body);\n }\n },\n} satisfies ExportedHandler;\n```\n\nYou then connect that consumer to a queue with `wrangler queues consumer ` or by defining a `[[queues.consumers]]` configuration in your [Wrangler configuration file](/workers/wrangler/configuration/) manually:\n\n\n\n```jsonc\n{\n\t\"queues\": {\n\t\t\"consumers\": [\n\t\t\t{\n\t\t\t\t\"queue\": \"\",\n\t\t\t\t\"max_batch_size\": 100, // optional\n\t\t\t\t\"max_batch_timeout\": 30 // optional\n\t\t\t}\n\t\t]\n\t}\n}\n```\n\n\n\n", "char_start": 6379, "char_end": 7173, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "e6bd68b37b2ecf94", "doc_id": "queues/reference/how-queues-works.md", "text": "Importantly, each queue can only have one active consumer. This allows Cloudflare Queues to achieve at least once delivery and minimize the risk of duplicate messages beyond that.\n\n:::note[Best practice]\n\n\nConfigure a single consumer per queue. This both logically separates your queues, and ensures that errors (failures) in processing messages from one queue do not impact your other queues.\n\n\n:::\n\nNotably, you can use the same consumer with multiple queues. The queue handler that defines your consumer Worker will be invoked by the queues it is connected to.\n\n", "char_start": 7173, "char_end": 7738, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "c837a1be4807c938", "doc_id": "queues/reference/how-queues-works.md", "text": "* The `MessageBatch` that is passed to your `queue` handler includes a `queue` property with the name of the queue the batch was read from.\n* This can reduce the amount of code you need to write, and allow you to process messages based on the name of your queues.\n\nFor example, a consumer configured to consume messages from multiple queues would resemble the following:\n\n```ts\ninterface Env {\n // Add your bindings here\n}\n\n", "char_start": 7738, "char_end": 8163, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "16466ba363a76b3e", "doc_id": "queues/reference/how-queues-works.md", "text": "export default {\n async queue(batch, env, ctx): Promise {\n // MessageBatch has a `queue` property we can switch on\n switch (batch.queue) {\n case \"log-queue\":\n // Write the batch to R2\n break;\n case \"debug-queue\":\n // Write the message to the console or to another queue\n break;\n case \"email-reset\":\n // Trigger a password reset email via an external API\n break;\n default:\n // Handle messages we haven't mentioned explicitly (write a log, push to a DLQ)\n break;\n }\n },\n} satisfies ExportedHandler;\n```\n\n", "char_start": 8163, "char_end": 8763, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "dfaa8e54f45c5e16", "doc_id": "queues/reference/how-queues-works.md", "text": "### Remove a consumer\n\nTo remove a queue from your project, run `wrangler queues consumer remove ` and then remove the desired queue below the `[[queues.consumers]]` in Wrangler file.\n\n### Pull consumers\n\nA queue can have a HTTP-based consumer that pulls from the queue, instead of messages being pushed to a Worker.\n\nThis consumer can be any HTTP-speaking service that can communicate over the Internet. Review the [pull consumer guide](/queues/configuration/pull-consumers/) to learn how to configure a pull-based consumer for a queue.\n\n## Messages\n\nA message is the object you are producing to and consuming from a queue.\n\n", "char_start": 8763, "char_end": 9415, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "53bbd9caefa7941b", "doc_id": "queues/reference/how-queues-works.md", "text": "Any JSON serializable object can be published to a queue. For most developers, this means either simple strings or JSON objects. You can explicitly [set the content type](#content-types) when sending a message.\n\nMessages themselves can be [batched when delivered to a consumer](/queues/configuration/batching-retries/). By default, messages within a batch are treated as all or nothing when determining retries. If the last message in a batch fails to be processed, the entire batch will be retried. You can also choose to [explicitly acknowledge](/queues/configuration/batching-retries/) messages as they are successfully processed, and/or mark individual messages to be retried.\n", "char_start": 9415, "char_end": 10096, "metadata": {"title": "how-queues-works", "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", "format": "markdown", "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c"}} +{"chunk_id": "d22edd62ce5ced23", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "---\npcx_content_type: reference\ntitle: Workers API reference\ndescription: Complete reference for the R2 in-Worker API, including bucket and object operations.\nproducts:\n - r2\n---\n\nimport { Type, MetaInfo, WranglerConfig, TabItem, Tabs } from \"~/components\";\n\nThe in-Worker R2 API is accessed by binding an R2 bucket to a [Worker](/workers). The Worker you write can expose external access to buckets via a route or manipulate R2 objects internally.\n\nThe R2 API includes some extensions and semantic differences from the S3 API. If you need S3 compatibility, consider using the [S3-compatible API](/r2/api/s3/).\n\n## Concepts\n\nR2 organizes the data you store, called objects, into containers, called buckets. Buckets are the fundamental unit of performance, scaling, and access within R2.\n\n", "char_start": 0, "char_end": 789, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "451790e3ddbe16ab", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "## Create a binding\n\n:::note[Bindings]\n\nA binding is how your Worker interacts with external resources such as [KV Namespaces](/kv/concepts/kv-namespaces/), [Durable Objects](/durable-objects/), or [R2 Buckets](/r2/buckets/). A binding is a runtime variable that the Workers runtime provides to your code. You can declare a variable name in your Wrangler file that will be bound to these resources at runtime, and interact with them through this variable. Every binding's variable name and behavior is determined by you when deploying the Worker. Refer to [Environment Variables](/workers/configuration/environment-variables/) for more information.\n\nA binding is defined in the Wrangler file of your Worker project's directory.\n\n:::\n\n", "char_start": 789, "char_end": 1523, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "75086f87d93838cf", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "To bind your R2 bucket to your Worker, add the following to your Wrangler file. Update the `binding` property to a valid JavaScript variable identifier and `bucket_name` to the name of your R2 bucket:\n\n\n\n```jsonc\n{\n\t\"r2_buckets\": [\n\t\t{\n\t\t\t\"binding\": \"MY_BUCKET\", // <~ valid JavaScript variable name\n\t\t\t\"bucket_name\": \"\"\n\t\t}\n\t]\n}\n```\n\n\n\nWithin your Worker, your bucket binding is now available under the `MY_BUCKET` variable and you can begin interacting with it using the [bucket methods](#bucket-method-definitions) described below.\n\n## Bucket method definitions\n\nThe following methods are available on the bucket binding object injected into your code.\n\nFor example, to issue a `PUT` object request using the binding above:\n\n", "char_start": 1523, "char_end": 2302, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "b2e6c823eb34767d", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " \n\n```js\nexport default {\n\tasync fetch(request, env) {\n\t\tconst url = new URL(request.url);\n\t\tconst key = url.pathname.slice(1);\n\n\t\tswitch (request.method) {\n\t\t\tcase \"PUT\":\n\t\t\t\tawait env.MY_BUCKET.put(key, request.body);\n\t\t\t\treturn new Response(`Put ${key} successfully!`);\n\n\t\t\tdefault:\n\t\t\t\treturn new Response(`${request.method} is not allowed.`, {\n\t\t\t\t\tstatus: 405,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAllow: \"PUT\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t}\n\t},\n};\n```\n\n\n\n\n```py\nfrom workers import WorkerEntrypoint, Response\nfrom urllib.parse import urlparse\n\nclass Default(WorkerEntrypoint):\n\tasync def fetch(self, request):\n\t\turl = urlparse(request.url)\n\t\tkey = url.path[1:]\n\n", "char_start": 2302, "char_end": 3082, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "bcdfdde0fb48dd14", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "\t\tif request.method == \"PUT\":\n\t\t\tawait self.env.MY_BUCKET.put(key, request.body)\n\t\t\treturn Response(f\"Put {key} successfully!\")\n\t\telse:\n\t\t\treturn Response(\n\t\t\t\tf\"{request.method} is not allowed.\",\n\t\t\t\tstatus=405,\n\t\t\t\theaders={\"Allow\": \"PUT\"}\n\t\t\t)\n```\n\n\n\n\n- `head` \" />\n\n - Retrieves the `R2Object` for the given key containing only object metadata, if the key exists, and `null` if the key does not exist.\n\n- `get` \" />\n\n", "char_start": 3082, "char_end": 3662, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "33cde44e73b075b4", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " - Retrieves the `R2ObjectBody` for the given key containing object metadata and the object body as a ReadableStream, if the key exists, and `null` if the key does not exist.\n - In the event that a precondition specified in options fails, get() returns an R2Object with body undefined.\n\n- `put` \" />\n\n", "char_start": 3662, "char_end": 4183, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "06a319138aea25c1", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " - Stores the given value and metadata under the associated key. Once the write succeeds, returns an `R2Object` containing metadata about the stored Object.\n - In the event that a precondition specified in options fails, put() returns `null`, and the object will not be stored.\n - R2 writes are strongly consistent. Once the Promise resolves, all subsequent read operations will see this key value pair globally.\n\n- `delete` \" />\n\n", "char_start": 4183, "char_end": 4720, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "3fdeadbd3e425122", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " - Deletes the given values and metadata under the associated keys. Once the delete succeeds, returns void.\n - R2 deletes are strongly consistent. Once the Promise resolves, all subsequent read operations will no longer see the provided key value pairs globally.\n - Up to 1000 keys may be deleted per call.\n\n- `list` \" />\n\n", "char_start": 4720, "char_end": 5142, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "847c8157ce1fe035", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " * Returns an R2Objects containing a list of R2Object contained within the bucket.\n * The returned list of objects is ordered lexicographically.\n * Returns up to 1000 entries, but may return less in order to minimize memory pressure within the Worker.\n * To explicitly set the number of objects to list, provide an [R2ListOptions](/r2/api/workers/workers-api-reference/#r2listoptions) object with the `limit` property set.\n\n* `createMultipartUpload` \" />\n\n", "char_start": 5142, "char_end": 5711, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "a4cded829c2cd2e0", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " - Creates a multipart upload.\n - Returns Promise which resolves to an `R2MultipartUpload` object representing the newly created multipart upload. Once the multipart upload has been created, the multipart upload can be immediately interacted with globally, either through the Workers API, or through the S3 API.\n\n- `resumeMultipartUpload` \n\n - Returns an object representing a multipart upload with the given key and uploadId.\n - The resumeMultipartUpload operation does not perform any checks to ensure the validity of the uploadId, nor does it verify the existence of a corresponding active multipart upload. This is done to minimize latency before being able to call subsequent operations on the `R2MultipartUpload` object.\n\n", "char_start": 5711, "char_end": 6509, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "4cb159533035a36a", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "## `R2Object` definition\n\n`R2Object` is created when you `PUT` an object into an R2 bucket. `R2Object` represents the metadata of an object based on the information provided by the uploader. Every object that you `PUT` into an R2 bucket will have an `R2Object` created.\n\n- `key` \n\n - The object's key.\n\n- `version` \n\n - Random unique string associated with a specific upload of a key.\n\n- `size` \n\n - Size of the object in bytes.\n\n- `etag` \n\n:::note\n\nCloudflare recommends using the `httpEtag` field when returning an etag in a response header. This ensures the etag is quoted and conforms to [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110#section-8.8.3).\n:::\n\n", "char_start": 6509, "char_end": 7263, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "a40767373bc9aa74", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "- The etag associated with the object upload.\n\n- `httpEtag` \n\n - The object's etag, in quotes so as to be returned as a header.\n\n- `uploaded` \n\n - A Date object representing the time the object was uploaded.\n\n- `httpMetadata` \n\n - Various HTTP headers associated with the object. Refer to [HTTP Metadata](#http-metadata).\n\n- `customMetadata` \" />\n\n - A map of custom, user-defined metadata associated with the object.\n\n- `range` \n\n - A `R2Range` object containing the returned range of the object.\n\n- `checksums` \n\n - A `R2Checksums` object containing the stored checksums of the object. Refer to [checksums](#checksums).\n\n", "char_start": 7263, "char_end": 8048, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "f58105dda664c55a", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "- `writeHttpMetadata` \n\n - Retrieves the `httpMetadata` from the `R2Object` and applies their corresponding HTTP headers to the `Headers` input object. Refer to [HTTP Metadata](#http-metadata).\n\n- `storageClass` \n\n - The storage class associated with the object. Refer to [Storage Classes](#storage-class).\n\n- `ssecKeyMd5` \n\n - Hex-encoded MD5 hash of the [SSE-C](/r2/examples/ssec) key used for encryption (if one was provided). Hash can be used to identify which key is needed to decrypt object.\n\n", "char_start": 8048, "char_end": 8659, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "af67afe2889000b8", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "## `R2ObjectBody` definition\n\n`R2ObjectBody` represents an object's metadata combined with its body. It is returned when you `GET` an object from an R2 bucket. The full list of keys for `R2ObjectBody` includes the list below and all keys inherited from [`R2Object`](#r2object-definition).\n\n- `body` \n\n - The object's value.\n\n- `bodyUsed` \n\n - Whether the object's value has been consumed or not.\n\n- `arrayBuffer` \" />\n\n - Returns a Promise that resolves to an `ArrayBuffer` containing the object's value.\n\n- `text` \" />\n\n - Returns a Promise that resolves to a string containing the object's value.\n\n- `json` () : Promise\" />\n\n", "char_start": 8659, "char_end": 9428, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "cb490a96d1706197", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " - Returns a Promise that resolves to the given object containing the object's value.\n\n- `blob` \" />\n\n - Returns a Promise that resolves to a binary Blob containing the object's value.\n\n## `R2MultipartUpload` definition\n\nAn `R2MultipartUpload` object is created when you call `createMultipartUpload` or `resumeMultipartUpload`. `R2MultipartUpload` is a representation of an ongoing multipart upload.\n\nUncompleted multipart uploads will be automatically aborted after 7 days.\n\n:::note\n\nAn `R2MultipartUpload` object does not guarantee that there is an active underlying multipart upload corresponding to that object.\n\n", "char_start": 9428, "char_end": 10076, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "2de81802ba56b1dd", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "A multipart upload can be completed or aborted at any time, either through the S3 API, or by a parallel invocation of your Worker. Therefore it is important to add the necessary error handling code around each operation on a `R2MultipartUpload` object in case the underlying multipart upload no longer exists.\n\n:::\n\n- `key` \n\n - The `key` for the multipart upload.\n\n- `uploadId` \n\n - The `uploadId` for the multipart upload.\n\n- `uploadPart` \" />\n\n", "char_start": 10076, "char_end": 10727, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "d6a67d035b84ef13", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " - Uploads a single part with the specified part number to this multipart upload. Each part must be uniform in size with an exception for the final part which can be smaller.\n - Returns an `R2UploadedPart` object containing the `etag` and `partNumber`. These `R2UploadedPart` objects are required when completing the multipart upload.\n\n- `abort` \" />\n\n - Aborts the multipart upload. Returns a Promise that resolves when the upload has been successfully aborted.\n\n- `complete` \" />\n\n", "char_start": 10727, "char_end": 11306, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "c807cbfec8717b35", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " - Completes the multipart upload with the given parts.\n - Returns a Promise that resolves when the complete operation has finished. Once this happens, the object is immediately accessible globally by any subsequent read operation.\n\n## Method-specific types\n\n### R2GetOptions\n\n- `onlyIf` \n\n - Specifies that the object should only be returned given satisfaction of certain conditions in the `R2Conditional` or in the conditional Headers. Refer to [Conditional operations](#conditional-operations).\n\n- `range` \n\n - Specifies that only a specific length (from an optional offset) or suffix of bytes from the object should be returned. Refer to [Ranged reads](#ranged-reads).\n\n- `ssecKey` \n\n", "char_start": 11306, "char_end": 12096, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "05ccde82c76e1291", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " - Specifies a key to be used for [SSE-C](/r2/examples/ssec). Key must be 32 bytes in length, in the form of a hex-encoded string or an ArrayBuffer.\n\n#### Ranged reads\n\n`R2GetOptions` accepts a `range` parameter, which can be used to restrict the data returned in `body`.\n\nThere are 3 variations of arguments that can be used in a range:\n\n- An offset with an optional length.\n- An optional offset with a length.\n- A suffix.\n\n- `offset` \n\n - The byte to begin returning data from, inclusive.\n\n- `length` \n\n - The number of bytes to return. If more bytes are requested than exist in the object, fewer bytes than this number may be returned.\n\n- `suffix` \n\n", "char_start": 12096, "char_end": 12818, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "b0a547ad2772a047", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " - The number of bytes to return from the end of the file, starting from the last byte. If more bytes are requested than exist in the object, fewer bytes than this number may be returned.\n\n### R2PutOptions\n\n- `onlyIf` \n\n - Specifies that the object should only be stored given satisfaction of certain conditions in the `R2Conditional`. Refer to [Conditional operations](#conditional-operations).\n\n- `httpMetadata` \n\n - Various HTTP headers associated with the object. Refer to [HTTP Metadata](#http-metadata).\n\n- `customMetadata` \" /> \n\n - A map of custom, user-defined metadata that will be stored with the object.\n\n:::note\n\n", "char_start": 12818, "char_end": 13618, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "ed314fa5c018d622", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "Only a single hashing algorithm can be specified at once.\n\n:::\n\n- `md5` \n\n - A md5 hash to use to check the received object's integrity.\n\n- `sha1` \n\n - A SHA-1 hash to use to check the received object's integrity.\n\n- `sha256` \n\n - A SHA-256 hash to use to check the received object's integrity.\n\n- `sha384` \n\n - A SHA-384 hash to use to check the received object's integrity.\n\n- `sha512` \n\n - A SHA-512 hash to use to check the received object's integrity.\n\n", "char_start": 13618, "char_end": 14406, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "61f6a11bb774c11b", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "- `storageClass` \n\n - Sets the storage class of the object if provided. Otherwise, the object will be stored in the default storage class associated with the bucket. Refer to [Storage Classes](#storage-class).\n\n- `ssecKey` \n\n - Specifies a key to be used for [SSE-C](/r2/examples/ssec). Key must be 32 bytes in length, in the form of a hex-encoded string or an ArrayBuffer.\n\n### R2MultipartOptions\n\n- `httpMetadata` \n\n - Various HTTP headers associated with the object. Refer to [HTTP Metadata](#http-metadata).\n\n- `customMetadata` \" /> \n\n", "char_start": 14406, "char_end": 15162, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "ecca5e73dee9df2f", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " - A map of custom, user-defined metadata that will be stored with the object.\n\n- `storageClass` \n\n - Sets the storage class of the object if provided. Otherwise, the object will be stored in the default storage class associated with the bucket. Refer to [Storage Classes](#storage-class).\n\n- `ssecKey` \n\n - Specifies a key to be used for [SSE-C](/r2/examples/ssec). Key must be 32 bytes in length, in the form of a hex-encoded string or an ArrayBuffer.\n\n### R2ListOptions\n\n- `limit` \n\n - The number of results to return. Defaults to `1000`, with a maximum of `1000`.\n\n - If `include` is set, you may receive fewer than `limit` results in your response to accommodate metadata.\n\n", "char_start": 15162, "char_end": 15955, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "86f1824c464cd231", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "- `prefix` \n\n - The prefix to match keys against. Keys will only be returned if they start with given prefix.\n\n- `cursor` \n\n - An opaque token that indicates where to continue listing objects from. A cursor can be retrieved from a previous list operation.\n\n- `delimiter` \n\n - The character to use when grouping keys.\n\n- `include` \" /> \n\n - Can include `httpMetadata` and/or `customMetadata`. If included, items returned by the list will include the specified metadata.\n\n", "char_start": 15955, "char_end": 16635, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "64f40cc28d7b2771", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " - Note that there is a limit on the total amount of data that a single `list` operation can return. If you request data, you may receive fewer than `limit` results in your response to accommodate metadata.\n\n - The [compatibility date](/workers/configuration/compatibility-dates/) must be set to `2022-08-04` or later in your Wrangler file. If not, then the `r2_list_honor_include` compatibility flag must be set. Otherwise it is treated as `include: ['httpMetadata', 'customMetadata']` regardless of what the `include` option provided actually is.\n\n This means applications must be careful to avoid comparing the amount of returned objects against your `limit`. Instead, use the `truncated` property to determine if the `list` request has more data to be returned.\n\n", "char_start": 16635, "char_end": 17405, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "83140fb611c31449", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " \n```js\nconst options = {\n\tlimit: 500,\n\tinclude: [\"customMetadata\"],\n};\n\nconst listed = await env.MY_BUCKET.list(options);\n\nlet truncated = listed.truncated;\nlet cursor = truncated ? listed.cursor : undefined;\n\n// \u274c - if your limit can't fit into a single response or your\n// bucket has less objects than the limit, it will get stuck here.\nwhile (listed.objects.length < options.limit) {\n\t// ...\n}\n\n// \u2705 - use the truncated property to check if there are more\n// objects to be returned\nwhile (truncated) {\n\tconst next = await env.MY_BUCKET.list({\n\t\t...options,\n\t\tcursor: cursor,\n\t});\n\tlisted.objects.push(...next.objects);\n\n", "char_start": 17405, "char_end": 18112, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "04501b699bcc744a", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "\ttruncated = next.truncated;\n\tcursor = next.cursor;\n}\n```\n \n```py\nlimit = 500\ninclude = [\"customMetadata\"]\n\nlisted = await self.env.MY_BUCKET.list(limit=limit, include=include)\n\ntruncated = listed.truncated\ncursor = listed.cursor if truncated else None\n\n# \u274c - if your limit can't fit into a single response or your\n# bucket has less objects than the limit, it will get stuck here.\nwhile len(listed.objects) < limit:\n ...\n\n# \u2705 - use the truncated property to check if there are more\n# objects to be returned\nwhile truncated:\n next_page = await self.env.MY_BUCKET.list(limit=limit, include=include, cursor=cursor)\n listed.objects.extend(next_page.objects)\n\n", "char_start": 18112, "char_end": 18829, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "fa146b94b6e0931c", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " truncated = next_page.truncated\n cursor = next_page.cursor\n```\n \n\n### R2Objects\n\nAn object containing an `R2Object` array, returned by `BUCKET_BINDING.list()`.\n\n- `objects` \" />\n\n - An array of objects matching the `list` request.\n\n- `truncated` boolean\n\n - If true, indicates there are more results to be retrieved for the current `list` request.\n\n- `cursor` \n\n - A token that can be passed to future `list` calls to resume listing from that point. Only present if truncated is true.\n\n- `delimitedPrefixes` \" />\n\n - If a delimiter has been specified, contains all prefixes between the specified prefix and the next occurrence of the delimiter.\n\n", "char_start": 18829, "char_end": 19606, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "252803bb8c27edfa", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " - For example, if no prefix is provided and the delimiter is '/', `foo/bar/baz` would return `foo` as a delimited prefix. If `foo/` was passed as a prefix with the same structure and delimiter, `foo/bar` would be returned as a delimited prefix.\n\n### Conditional operations\n\nYou can pass an `R2Conditional` object to `R2GetOptions` and `R2PutOptions`. If the condition check for `get()` fails, the body will not be returned. This will make `get()` have lower latency.\n\nIf the condition check for `put()` fails, `null` will be returned instead of the `R2Object`.\n\n- `etagMatches` \n\n - Performs the operation if the object's etag matches the given string.\n\n- `etagDoesNotMatch` \n\n", "char_start": 19606, "char_end": 20388, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "30e47f8d492cd022", "doc_id": "r2/api/workers/workers-api-reference.md", "text": " - Performs the operation if the object's etag does not match the given string.\n\n- `uploadedBefore` \n\n - Performs the operation if the object was uploaded before the given date.\n\n- `uploadedAfter` \n\n - Performs the operation if the object was uploaded after the given date.\n\nAlternatively, you can pass a `Headers` object containing conditional headers to `R2GetOptions` and `R2PutOptions`. For information on these conditional headers, refer to [the MDN docs on conditional requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Conditional_requests#conditional_headers). All conditional headers aside from `If-Range` are supported.\n\n", "char_start": 20388, "char_end": 21129, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "a86bb82b39005549", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "For more specific information about conditional requests, refer to [RFC 7232](https://datatracker.ietf.org/doc/html/rfc7232).\n\n### HTTP Metadata\n\nGenerally, these fields match the HTTP metadata passed when the object was created. They can be overridden when issuing `GET` requests, in which case, the given values will be echoed back in the response.\n\n- `contentType` \n\n- `contentLanguage` \n\n- `contentDisposition` \n\n- `contentEncoding` \n\n- `cacheControl` \n\n- `cacheExpiry` \n\n", "char_start": 21129, "char_end": 21909, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "c5e2b281205396b7", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "### Checksums\n\nIf a checksum was provided when using the `put()` binding, it will be available on the returned object under the `checksums` property. The MD5 checksum will be included by default for non-multipart objects.\n\n- `md5` \n\n - The MD5 checksum of the object.\n\n- `sha1` \n\n - The SHA-1 checksum of the object.\n\n- `sha256` \n\n - The SHA-256 checksum of the object.\n\n- `sha384` \n\n - The SHA-384 checksum of the object.\n\n- `sha512` \n\n - The SHA-512 checksum of the object.\n\n", "char_start": 21909, "char_end": 22671, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "78c901d2ea1e9173", "doc_id": "r2/api/workers/workers-api-reference.md", "text": "### `R2UploadedPart`\n\nAn `R2UploadedPart` object represents a part that has been uploaded. `R2UploadedPart` objects are returned from `uploadPart` operations and must be passed to `completeMultipartUpload` operations.\n\n- `partNumber` \n\n - The number of the part.\n\n- `etag` \n\n - The `etag` of the part.\n\n### Storage Class\n\nThe storage class where an `R2Object` is stored. The available storage classes are `Standard` and `InfrequentAccess`. Refer to [Storage classes](/r2/buckets/storage-classes/)\nfor more information.\n", "char_start": 22671, "char_end": 23236, "metadata": {"title": "\u274c - if your limit can't fit into a single response or your", "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", "format": "markdown", "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4"}} +{"chunk_id": "e20ae01deda955f5", "doc_id": "r2/buckets/create-buckets.md", "text": "---\npcx_content_type: how-to\ntitle: Create new buckets\ndescription: Create R2 buckets using the Cloudflare dashboard or Wrangler CLI.\nsidebar:\n order: 1\nproducts:\n - r2\n---\n\nYou can create a bucket from the Cloudflare dashboard or using Wrangler.\n\n:::note\n\nWrangler is [a command-line tool](/workers/wrangler/install-and-update/) for building with Cloudflare's developer products, including R2.\n\nThe R2 support in Wrangler allows you to manage buckets and perform basic operations against objects in your buckets. For more advanced use-cases, including bulk uploads or mirroring files from legacy object storage providers, we recommend [rclone](/r2/examples/rclone/) or an [S3-compatible](/r2/api/s3/) tool of your choice.\n\n:::\n\n", "char_start": 0, "char_end": 731, "metadata": {"title": "create-buckets", "path": "/data/corpora/cloudflare-state-v1/files/r2/buckets/create-buckets.md", "format": "markdown", "raw_hash": "fcb5cebd61d6e44db103ad8cbee20718ee6e48389ec3193ab5297216cce117ac"}} +{"chunk_id": "08bb492f545fe4ad", "doc_id": "r2/buckets/create-buckets.md", "text": "## Bucket-Level Operations\n\nCreate a bucket with the [`r2 bucket create`](/workers/wrangler/commands/r2/#r2-bucket-create) command:\n\n```sh\nwrangler r2 bucket create your-bucket-name\n```\n\n:::note\n\n- Bucket names can only contain lowercase letters (a-z), numbers (0-9), and hyphens (-).\n- Bucket names cannot begin or end with a hyphen.\n- Bucket names can only be between 3-63 characters in length.\n\nThe placeholder text is only for the example.\n\n:::\n\nList buckets in the current account with the [`r2 bucket list`](/workers/wrangler/commands/r2/#r2-bucket-list) command:\n\n```sh\nwrangler r2 bucket list\n```\n\nTo delete a bucket, you must first empty it and then delete it. For detailed instructions, refer to [Delete buckets](/r2/buckets/delete-buckets/).\n\n", "char_start": 731, "char_end": 1485, "metadata": {"title": "create-buckets", "path": "/data/corpora/cloudflare-state-v1/files/r2/buckets/create-buckets.md", "format": "markdown", "raw_hash": "fcb5cebd61d6e44db103ad8cbee20718ee6e48389ec3193ab5297216cce117ac"}} +{"chunk_id": "d6e244894330d2dd", "doc_id": "r2/buckets/create-buckets.md", "text": "## Notes\n\n- Bucket names and buckets are not public by default. To allow public access to a bucket, refer to [Public buckets](/r2/buckets/public-buckets/).\n- For information on controlling access to your R2 bucket with Cloudflare Access, refer to [Protect an R2 Bucket with Cloudflare Access](/r2/tutorials/cloudflare-access/).\n- Invalid (unauthorized) access attempts to private buckets do not incur R2 operations charges against that bucket. Refer to the [R2 pricing FAQ](/r2/pricing/#frequently-asked-questions) to understand what operations are billed vs. not billed.\n", "char_start": 1485, "char_end": 2057, "metadata": {"title": "create-buckets", "path": "/data/corpora/cloudflare-state-v1/files/r2/buckets/create-buckets.md", "format": "markdown", "raw_hash": "fcb5cebd61d6e44db103ad8cbee20718ee6e48389ec3193ab5297216cce117ac"}} +{"chunk_id": "a798a0a6dd569e71", "doc_id": "r2/how-r2-works.md", "text": "---\ntitle: How R2 works\n\npcx_content_type: concept\nsidebar:\n order: 2\ndescription: Find out how R2 works.\nproducts:\n - r2\nhead:\n - tag: title\n content: How R2 works\n---\n\nimport { Render, LinkCard } from \"~/components\";\n\nCloudflare R2 is an S3-compatible object storage service with no egress fees, built on Cloudflare's global network. It is [strongly consistent](/r2/reference/consistency/) and designed for high [data durability](/r2/reference/durability/).\n\nR2 is ideal for storing and serving unstructured data that needs to be accessed frequently over the internet, without incurring egress fees. It's a good fit for workloads like serving web assets, training AI models, and managing user-generated content.\n\n## Architecture\n\nR2's architecture is composed of multiple components:\n\n", "char_start": 0, "char_end": 793, "metadata": {"title": "how-r2-works", "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", "format": "markdown", "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18"}} +{"chunk_id": "cd301146d9e5ce7a", "doc_id": "r2/how-r2-works.md", "text": "- **R2 Gateway:** The entry point for all API requests that handles authentication and routing logic. This service is deployed across Cloudflare's global network via [Cloudflare Workers](/workers/).\n\n- **Metadata Service:** A distributed layer built on [Durable Objects](/durable-objects/) used to store and manage object metadata (e.g. object key, checksum) to ensure strong consistency of the object across the storage system. It includes a built-in cache layer to speed up access to metadata.\n\n- **Tiered Read Cache:** A caching layer that sits in front of the Distributed Storage Infrastructure that speeds up object reads by using [Cloudflare Tiered Cache](/cache/how-to/tiered-cache/) to serve data closer to the client.\n\n", "char_start": 793, "char_end": 1521, "metadata": {"title": "how-r2-works", "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", "format": "markdown", "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18"}} +{"chunk_id": "2d00279e091689ea", "doc_id": "r2/how-r2-works.md", "text": "- **Distributed Storage Infrastructure:** The underlying infrastructure that persistently stores encrypted object data.\n\n![R2 Architecture](public/images/r2/r2-architecture.png)\n\nR2 supports multiple client interfaces including [Cloudflare Workers Binding](/r2/api/workers/workers-api-usage/), [S3-compatible API](/r2/api/s3/api/), and a [REST API](/api/resources/r2/) that powers the Cloudflare Dashboard and Wrangler CLI. All requests are routed through the R2 Gateway, which coordinates with the Metadata Service and Distributed Storage Infrastructure to retrieve the object data.\n\n## Write data to R2\n\nWhen a write request (e.g. uploading an object) is made to R2, the following sequence occurs:\n\n", "char_start": 1521, "char_end": 2222, "metadata": {"title": "how-r2-works", "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", "format": "markdown", "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18"}} +{"chunk_id": "27767af8c752f16e", "doc_id": "r2/how-r2-works.md", "text": "1. **Request handling:** The request is received by the R2 Gateway at the edge, close to the user, where it is authenticated.\n\n2. **Encryption and routing:** The Gateway reaches out to the Metadata Service to retrieve the [encryption key](/r2/reference/data-security/) and determines which storage cluster to write the encrypted data to within the [location](/r2/reference/data-location/) set for the bucket.\n\n3. **Writing to storage:** The encrypted data is written and stored in the distributed storage infrastructure, and replicated within the region (e.g. ENAM) for [durability](/r2/reference/durability/).\n\n", "char_start": 2222, "char_end": 2834, "metadata": {"title": "how-r2-works", "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", "format": "markdown", "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18"}} +{"chunk_id": "1fffe10f75ef08ea", "doc_id": "r2/how-r2-works.md", "text": "4. **Metadata commit:** Finally, the Metadata Service commits the object's metadata, making it visible in subsequent reads. Only after this commit is an `HTTP 200` success response sent to the client, preventing unacknowledged writes.\n\n![Write data to R2](public/images/r2/write-data-to-r2.png)\n\n## Read data from R2\n\nWhen a read request (e.g. fetching an object) is made to R2, the following sequence occurs:\n\n1. **Request handling:** The request is received by the R2 Gateway at the edge, close to the user, where it is authenticated.\n\n2. **Metadata lookup:** The Gateway asks the Metadata Service for the object metadata.\n\n", "char_start": 2834, "char_end": 3460, "metadata": {"title": "how-r2-works", "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", "format": "markdown", "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18"}} +{"chunk_id": "d1c4a70c76dd28f7", "doc_id": "r2/how-r2-works.md", "text": "3. **Reading the object:** The Gateway attempts to retrieve the [encrypted](/r2/reference/data-security/) object from the tiered read cache. If it's not available, it retrieves the object from one of the distributed storage data centers within the region that holds the object data.\n\n4. **Serving to client:** The object is decrypted and served to the user.\n\n![Read data to R2](public/images/r2/read-data-to-r2.png)\n\n## Performance\n\nThe performance of your operations can be influenced by factors such as the bucket's geographical location, request origin, and access patterns.\n\nTo optimize upload performance for cross-region requests, enable [Local Uploads](/r2/buckets/local-uploads/) on your bucket.\n\n", "char_start": 3460, "char_end": 4165, "metadata": {"title": "how-r2-works", "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", "format": "markdown", "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18"}} +{"chunk_id": "e4561ca41f3aa14f", "doc_id": "r2/how-r2-works.md", "text": "To optimize read performance, enable [Cloudflare Cache](/cache/) when using a [custom domain](/r2/buckets/public-buckets/#custom-domains). When caching is enabled, read requests can bypass the R2 Gateway and be served directly from Cloudflare's edge cache, reducing latency. Note that cached data may not reflect the latest version immediately.\n\n![Read data to R2 with Cloudflare Cache](public/images/r2/read-data-to-r2-with-cloudflare-cache.png)\n\n## Learn more\n\n\n\n\n\n", "char_start": 4165, "char_end": 4876, "metadata": {"title": "how-r2-works", "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", "format": "markdown", "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18"}} +{"chunk_id": "d4d7351919bac1f9", "doc_id": "r2/how-r2-works.md", "text": "\n\n\n", "char_start": 4876, "char_end": 5213, "metadata": {"title": "how-r2-works", "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", "format": "markdown", "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18"}} +{"chunk_id": "fc5c1d4b7e63df7d", "doc_id": "r2/index.md", "text": "---\ntitle: Cloudflare R2\n\npcx_content_type: overview\nsidebar:\n order: 1\ndescription: Cloudflare R2 is a cost-effective, scalable object storage solution for cloud-native apps, web content, and data lakes without egress fees.\nproducts:\n - r2\nhead:\n - tag: title\n content: Overview\n---\n\nimport {\n\tCardGrid,\n\tDescription,\n\tFeature,\n\tLinkButton,\n\tLinkTitleCard,\n\tPlan,\n\tRelatedProduct,\n} from \"~/components\";\n\n\n\nObject storage for all your data.\n\n\n\nCloudflare R2 Storage allows developers to store large amounts of unstructured data without the costly egress bandwidth fees associated with typical cloud storage services.\n\nYou can use R2 for multiple scenarios, including but not limited to:\n\n", "char_start": 0, "char_end": 722, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/r2/index.md", "format": "markdown", "raw_hash": "7e6bac2d545167b29be0e3b51617553f991edc15c97276ee890bfeca1ee90560"}} +{"chunk_id": "0f4c410f64ceb2ae", "doc_id": "r2/index.md", "text": "- Storage for cloud-native applications\n- Cloud storage for web content\n- Storage for podcast episodes\n- Data lakes (analytics and big data)\n- Cloud storage output for large batch processes, such as machine learning model artifacts or datasets\n\n\n\tGet started\n\n\n\tBrowse the examples\n\n\n---\n\n## Features\n\n\n\nLocation Hints are optional parameters you can provide during bucket creation to indicate the primary geographical location you expect data will be accessed from.\n\n\n\n\n\n", "char_start": 722, "char_end": 1469, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/r2/index.md", "format": "markdown", "raw_hash": "7e6bac2d545167b29be0e3b51617553f991edc15c97276ee890bfeca1ee90560"}} +{"chunk_id": "049018541a2577eb", "doc_id": "r2/index.md", "text": "Configure CORS to interact with objects in your bucket and configure policies on your bucket.\n\n\n\n\n\nPublic buckets expose the contents of your R2 bucket directly to the Internet.\n\n\n\n\n\nCreate bucket scoped tokens for granular control over who can access your data.\n\n\n\n---\n\n## Related products\n\n\n\nA [serverless](https://www.cloudflare.com/learning/serverless/what-is-serverless/) execution environment that allows you to create entirely new applications or augment existing ones without configuring or maintaining infrastructure.\n\n\n\n", "char_start": 1469, "char_end": 2244, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/r2/index.md", "format": "markdown", "raw_hash": "7e6bac2d545167b29be0e3b51617553f991edc15c97276ee890bfeca1ee90560"}} +{"chunk_id": "cc01c40c714974a6", "doc_id": "r2/index.md", "text": "\n\nUpload, store, encode, and deliver live and on-demand video with one API, without configuring or maintaining infrastructure.\n\n\n\n\n\nA suite of products tailored to your image-processing needs.\n\n\n\n---\n\n## More resources\n\n\n\n\n\t Understand pricing for free and paid tier rates.\n\n\n\n\t Ask questions, show off what you are building, and discuss the platform\n\twith other developers.\n\n\n", "char_start": 2244, "char_end": 2993, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/r2/index.md", "format": "markdown", "raw_hash": "7e6bac2d545167b29be0e3b51617553f991edc15c97276ee890bfeca1ee90560"}} +{"chunk_id": "cdc2220a3277b712", "doc_id": "r2/index.md", "text": "\n\t Learn about product announcements, new tutorials, and what is new in\n\tCloudflare Workers.\n\n\n\n", "char_start": 2993, "char_end": 3200, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/r2/index.md", "format": "markdown", "raw_hash": "7e6bac2d545167b29be0e3b51617553f991edc15c97276ee890bfeca1ee90560"}} +{"chunk_id": "e597e70bb429d0d9", "doc_id": "r2/reference/consistency.md", "text": "---\ntitle: Consistency model\ndescription: R2 provides strong global consistency for reads, writes, deletes, and list operations.\npcx_content_type: concept\nsidebar:\n order: 7\nproducts:\n - r2\n---\n\nThis page details R2's consistency model, including where R2 is strongly, globally consistent and which operations this applies to.\n\nR2 can be described as \"strongly consistent\", especially in comparison to other distributed object storage systems. This strong consistency ensures that operations against R2 see the latest (accurate) state: clients should be able to observe the effects of any write, update and/or delete operation immediately, globally.\n\n## Terminology\n\nIn the context of R2, *strong* consistency and *eventual* consistency have the following meanings:\n\n", "char_start": 0, "char_end": 769, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "6a1f07fd7a59ef10", "doc_id": "r2/reference/consistency.md", "text": "* **Strongly consistent** - The effect of an operation will be observed globally, immediately, by all clients. Clients will not observe 'stale' (inconsistent) state.\n* **Eventually consistent** - Clients may not see the effect of an operation immediately. The state may take a some time (typically seconds to a minute) to propagate globally.\n\n## Operations and Consistency\n\nOperations against R2 buckets and objects adhere to the following consistency guarantees:\n\n\n\n", "char_start": 769, "char_end": 1248, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "af19205850ce8137", "doc_id": "r2/reference/consistency.md", "text": "| Action | Consistency |\n| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Read-after-write: Write (upload) an object, then read it | Strongly consistent: readers will immediately see the latest object globally |\n| Metadata: Update an object's metadata | Strongly consistent: readers will immediately see the updated metadata globa", "char_start": 1248, "char_end": 2048, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "8dbbb7f0df0b0fa4", "doc_id": "r2/reference/consistency.md", "text": "e an object's metadata | Strongly consistent: readers will immediately see the updated metadata globally |\n| Deletion: Delete an object | Strongly consistent: reads to that object will immediately return a \"does not exist\" error |\n| Object listing: List the objects in a bucket | Strongly consistent: the list operation will list all objects at that point in time |\n| IAM: Adding/removing R2 Storage permissions | Eventually consistent: A [new or updated API key](/fundamentals/api/get-started/create-token/", "char_start": 1928, "char_end": 2728, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "076ec620925bd5e1", "doc_id": "r2/reference/consistency.md", "text": "permissions | Eventually consistent: A [new or updated API key](/fundamentals/api/get-started/create-token/) may take up to a minute to have permissions reflected globally |\n\n", "char_start": 2608, "char_end": 2796, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "637b393e8ba0d009", "doc_id": "r2/reference/consistency.md", "text": "\n\nAdditional notes:\n\n", "char_start": 2796, "char_end": 2830, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "cb590e8506f8c808", "doc_id": "r2/reference/consistency.md", "text": "* In the event two clients are writing (`PUT` or `DELETE`) to the same key, the last writer to complete \"wins\".\n* When performing a multipart upload, read-after-write consistency continues to apply once all parts have been successfully uploaded. In the case the same part is uploaded (in error) from multiple writers, the last write will win.\n* Copying an object within the same bucket also follows the same read-after-write consistency that writing a new object would. The \"copied\" object is immediately readable by all clients once the copy operation completes.\n* To delete an R2 bucket, it must be completely empty before deletion is allowed. ", "char_start": 2830, "char_end": 3476, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "960963544eea3054", "doc_id": "r2/reference/consistency.md", "text": "If you attempt to delete a bucket that still contains objects, you will receive an error such as: `The bucket you tried to delete (X) is not empty (account Y)` or `Bucket X cannot be deleted because it isn\u2019t empty.` For instructions on emptying and deleting a bucket, refer to [Delete buckets](/r2/buckets/delete-buckets/).\n\n\n", "char_start": 3476, "char_end": 3802, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "a7296e85a7e3266c", "doc_id": "r2/reference/consistency.md", "text": "## Caching\n\n:::note\n\n\nBy default, Cloudflare's cache will cache common, cacheable status codes automatically [per our cache documentation](/cache/how-to/configure-cache-status-code/#edge-ttl).\n\n\n:::\n\nWhen connecting a [custom domain](/r2/buckets/public-buckets/#custom-domains) to an R2 bucket and enabling caching for objects served from that bucket, the consistency model is necessarily relaxed when accessing content via a domain with caching enabled.\n\nSpecifically, you should expect:\n\n", "char_start": 3802, "char_end": 4292, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "c79a5d2cb115e271", "doc_id": "r2/reference/consistency.md", "text": "* An object you delete from R2, but that is still cached, will still be available. You should [purge the cache](/cache/how-to/purge-cache/) after deleting objects if you need that delete to be reflected.\n* By default, Cloudflare\u2019s cache will [cache HTTP 404 (Not Found) responses](/cache/how-to/configure-cache-status-code/#edge-ttl) automatically. If you upload an object to that same path, the cache may continue to return HTTP 404s until the cache TTL (Time to Live) expires and the new object is fetched from R2 or the [cache is purged](/cache/how-to/purge-cache/).\n* An object for a given key is overwritten with a new object: the old (previous) object will continue to be served to clients until the cache TTL expires (or the object is evicted) or the cache is purged.\n\n", "char_start": 4292, "char_end": 5068, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "176cac8ea586dd12", "doc_id": "r2/reference/consistency.md", "text": "The cache does not affect access via [Worker API bindings](/r2/api/workers/) or the [S3 API](/r2/api/s3/), as these operations are made directly against the bucket and do not transit through the cache.\n", "char_start": 5068, "char_end": 5270, "metadata": {"title": "consistency", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", "format": "markdown", "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf"}} +{"chunk_id": "b4d233d4bb076f4c", "doc_id": "r2/reference/durability.md", "text": "---\ntitle: Durability\ndescription: R2 is designed for 99.999999999% annual durability using replication and erasure coding.\npcx_content_type: concept\nsidebar:\n order: 7\nproducts:\n - r2\n---\n\nR2 is designed to provide 99.999999999% (eleven 9s) of annual durability. This means that if you store 10,000,000 objects on R2, you can expect to lose an object once every 10,000 years on average.\n\n## How R2 achieves eleven-nines durability\n\nR2's durability is built on multiple layers of redundancy and data protection:\n\n", "char_start": 0, "char_end": 516, "metadata": {"title": "durability", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/durability.md", "format": "markdown", "raw_hash": "4837c8a21782dd5eb6ba73f9faf2d44de5460c634aa525f363453cf2858835ba"}} +{"chunk_id": "2a52a85bd5c50f6b", "doc_id": "r2/reference/durability.md", "text": "- **Replication**: When you upload an object, R2 stores multiple \"copies\" of that object through either full replication and/or erasure coding. This ensures that the full or partial failure of any individual disk does not result in data loss. Erasure coding distributes parts of the object across multiple disks, ensuring that even if some disks fail, the object can still be reconstructed from a subset of the available parts, preventing hardware failure or physical impacts to data centers (such as fire or floods) from causing data loss.\n\n", "char_start": 516, "char_end": 1058, "metadata": {"title": "durability", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/durability.md", "format": "markdown", "raw_hash": "4837c8a21782dd5eb6ba73f9faf2d44de5460c634aa525f363453cf2858835ba"}} +{"chunk_id": "6fb713cd2382d6c9", "doc_id": "r2/reference/durability.md", "text": "- **Hardware redundancy**: Storage clusters are comprised of hardware distributed across several data centers within a geographic region. This physical distribution ensures that localized failures\u2014such as power outages, network disruptions, or hardware malfunctions at a single facility\u2014do not result in data loss.\n\n- **Synchronous writes**: R2 returns an `HTTP 200 (OK)` for a write via API or otherwise indicates success only when data has been persisted to disk. We do not rely on asynchronous replication to support underlying durability guarantees. This is critical to R2\u2019s consistency guarantees and mitigates the chance of a client receiving a successful API response without the underlying metadata and storage infrastructure having persisted the change.\n\n", "char_start": 1058, "char_end": 1822, "metadata": {"title": "durability", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/durability.md", "format": "markdown", "raw_hash": "4837c8a21782dd5eb6ba73f9faf2d44de5460c634aa525f363453cf2858835ba"}} +{"chunk_id": "d7a9f199a2d44681", "doc_id": "r2/reference/durability.md", "text": "### Considerations\n\n* Durability is not a guarantee of data availability. It is a measure of the likelihood of data loss.\n* R2 provides an availability [SLA of 99.9%](https://www.cloudflare.com/r2-service-level-agreement/)\n* Durability does not prevent intentional or accidental deletion of data. Use [bucket locks](/r2/buckets/bucket-locks/) and/or bucket-scoped [API tokens](/r2/api/tokens/) to limit access to data.\n* Durability is also distinct from [consistency](/r2/reference/consistency/), which describes how reads and writes are reflected in the system's state (e.g. eventual consistency vs. strong consistency).\n", "char_start": 1822, "char_end": 2444, "metadata": {"title": "durability", "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/durability.md", "format": "markdown", "raw_hash": "4837c8a21782dd5eb6ba73f9faf2d44de5460c634aa525f363453cf2858835ba"}} +{"chunk_id": "c49e826ee2041d54", "doc_id": "workers/get-started/guide.md", "text": "---\ntitle: CLI\ndescription: Set up and deploy your first Cloudflare Worker using Wrangler, the command-line interface.\npcx_content_type: get-started\nsidebar:\n order: 1\nhead:\n - tag: title\n content: Get started - CLI\nproducts:\n - workers\n---\n\nimport { Details, Render, PackageManagers } from \"~/components\";\n\nSet up and deploy your first Worker with Wrangler, the Cloudflare Developer Platform CLI.\n\nThis guide will instruct you through setting up and deploying your first Worker.\n\n## Prerequisites\n\n\n\n", "char_start": 0, "char_end": 550, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "bab5128867e512aa", "doc_id": "workers/get-started/guide.md", "text": "## 1. Create a new Worker project\n\nOpen a terminal window and run C3 to create your Worker project. [C3 (`create-cloudflare-cli`)](https://github.com/cloudflare/workers-sdk/tree/main/packages/create-cloudflare) is a command-line tool designed to help you set up and deploy new applications to Cloudflare.\n\n\n\n\n\nNow, you have a new project set up. Move into that project folder.\n\n```sh\ncd my-first-worker\n```\n\n
\n\nIn your project directory, C3 will have generated the following:\n\n", "char_start": 550, "char_end": 1297, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "66037c9abcd54c8c", "doc_id": "workers/get-started/guide.md", "text": "* `wrangler.jsonc`: Your [Wrangler](/workers/wrangler/configuration/#sample-wrangler-configuration) configuration file.\n* `index.js` (in `/src`): A minimal `'Hello World!'` Worker written in [ES module](/workers/reference/migrate-to-module-workers/) syntax.\n* `package.json`: A minimal Node dependencies configuration file.\n* `package-lock.json`: Refer to [`npm` documentation on `package-lock.json`](https://docs.npmjs.com/cli/v9/configuring-npm/package-lock-json).\n* `node_modules`: Refer to [`npm` documentation `node_modules`](https://docs.npmjs.com/cli/v7/configuring-npm/folders#node-modules).\n\n
\n\n
\n\n", "char_start": 1297, "char_end": 1984, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "1a1b3f78b7188314", "doc_id": "workers/get-started/guide.md", "text": "In addition to creating new projects from C3 templates, C3 also supports creating new projects from existing Git repositories. To create a new project from an existing Git repository, open your terminal and run:\n\n```sh\nnpm create cloudflare@latest -- --template \n```\n\n`` may be any of the following:\n\n- `user/repo` (GitHub)\n- `git@github.com:user/repo`\n- `https://github.com/user/repo`\n- `user/repo/some-template` (subdirectories)\n- `user/repo#canary` (branches)\n- `user/repo#1234abcd` (commit hash)\n- `bitbucket:user/repo` (Bitbucket)\n- `gitlab:user/repo` (GitLab)\n\nYour existing template folder must contain the following files, at a minimum, to meet the requirements for Cloudflare Workers:\n\n", "char_start": 1984, "char_end": 2695, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "0b8bc4f5c9784c69", "doc_id": "workers/get-started/guide.md", "text": "- `package.json`\n- `wrangler.jsonc` [See sample Wrangler configuration](/workers/wrangler/configuration/#sample-wrangler-configuration)\n- `src/` containing a worker script referenced from `wrangler.jsonc`\n\n
\n\n## 2. Develop with Wrangler CLI\n\nC3 installs [Wrangler](/workers/wrangler/install-and-update/), the Workers command-line interface, in Workers projects by default. Wrangler lets you to [create](/workers/wrangler/commands/general/#init), [test](/workers/wrangler/commands/general/#dev), and [deploy](/workers/wrangler/commands/general/#deploy) your Workers projects.\n\n", "char_start": 2695, "char_end": 3280, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "fb401815c1ebd24b", "doc_id": "workers/get-started/guide.md", "text": "After you have created your first Worker, run the [`wrangler dev`](/workers/wrangler/commands/general/#dev) command in the project directory to start a local server for developing your Worker. This will allow you to preview your Worker locally during development.\n\n```sh\nnpx wrangler dev\n```\n\nIf you have never used Wrangler before, it will open your web browser so you can login to your Cloudflare account.\n\nGo to [http://localhost:8787](http://localhost:8787) to view your Worker.\n\n
\n\nIf you have issues with this step or you do not have access to a browser interface, refer to the [`wrangler login`](/workers/wrangler/commands/general/#login) documentation.\n\n
\n\n", "char_start": 3280, "char_end": 3987, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "90de7e68d0fc2814", "doc_id": "workers/get-started/guide.md", "text": "## 3. Write code\n\nWith your new project generated and running, you can begin to write and edit your code.\n\nFind the `src/index.js` file. `index.js` will be populated with the code below:\n\n```js title=\"Original index.js\"\nexport default {\n\tasync fetch(request, env, ctx) {\n\t\treturn new Response(\"Hello World!\");\n\t},\n};\n```\n\n
\n\nThis code block consists of a few different parts.\n\n```js title=\"Updated index.js\" {1}\nexport default {\n\tasync fetch(request, env, ctx) {\n\t\treturn new Response(\"Hello World!\");\n\t},\n};\n```\n\n", "char_start": 3987, "char_end": 4535, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "51c3950ce4a05d22", "doc_id": "workers/get-started/guide.md", "text": "`export default` is JavaScript syntax required for defining [JavaScript modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules#default_exports_versus_named_exports). Your Worker has to have a default export of an object, with properties corresponding to the events your Worker should handle.\n\n```js title=\"index.js\" {2}\nexport default {\n\tasync fetch(request, env, ctx) {\n\t\treturn new Response(\"Hello World!\");\n\t},\n};\n```\n\n", "char_start": 4535, "char_end": 4981, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "e08ed10bbab94f5f", "doc_id": "workers/get-started/guide.md", "text": "This [`fetch()` handler](/workers/runtime-apis/handlers/fetch/) will be called when your Worker receives an HTTP request. You can define additional event handlers in the exported object to respond to different types of events. For example, add a [`scheduled()` handler](/workers/runtime-apis/handlers/scheduled/) to respond to Worker invocations via a [Cron Trigger](/workers/configuration/cron-triggers/).\n\nAdditionally, the `fetch` handler will always be passed three parameters: [`request`, `env` and `context`](/workers/runtime-apis/handlers/fetch/).\n\n```js title=\"index.js\" {3}\nexport default {\n\tasync fetch(request, env, ctx) {\n\t\treturn new Response(\"Hello World!\");\n\t},\n};\n```\n\n", "char_start": 4981, "char_end": 5666, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "4110529b68da97f3", "doc_id": "workers/get-started/guide.md", "text": "The Workers runtime expects `fetch` handlers to return a `Response` object or a Promise which resolves with a `Response` object. In this example, you will return a new `Response` with the string `\"Hello World!\"`.\n\n
\n\nReplace the content in your current `index.js` file with the content below, which changes the text output.\n\n```js title=\"index.js\" {3}\nexport default {\n\tasync fetch(request, env, ctx) {\n\t\treturn new Response(\"Hello Worker!\");\n\t},\n};\n```\n\nThen, save the file and reload the page. Your Worker's output will have changed to the new text.\n\n
\n\nIf the output for your Worker does not change, make sure that:\n\n1. You saved the changes to `index.js`.\n2. You have `wrangler dev` running.\n3. You reloaded your browser.\n\n
\n\n", "char_start": 5666, "char_end": 6451, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "b9d9b0ab45bacaa3", "doc_id": "workers/get-started/guide.md", "text": "## 4. Deploy your project\n\nDeploy your Worker via Wrangler to a `*.workers.dev` subdomain or a [Custom Domain](/workers/configuration/routing/custom-domains/).\n\n```sh\nnpx wrangler deploy\n```\n\nIf you have not configured any subdomain or domain, Wrangler will prompt you during the publish process to set one up.\n\nPreview your Worker at `..workers.dev`.\n\n
\n\nIf you see [`523` errors](/support/troubleshooting/http-status-codes/cloudflare-5xx-errors/error-523/) when pushing your `*.workers.dev` subdomain for the first time, wait a minute or so and the errors will resolve themselves.\n\n
\n\n## Next steps\n\nTo do more:\n\n", "char_start": 6451, "char_end": 7140, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "4645f35b30407012", "doc_id": "workers/get-started/guide.md", "text": "- Push your project to a GitHub or GitLab repository then [connect to builds](/workers/ci-cd/builds/#get-started) to enable automatic builds and deployments.\n- Visit the [Cloudflare dashboard](https://dash.cloudflare.com/) for simpler editing.\n- Review our [Examples](/workers/examples/) and [Tutorials](/workers/tutorials/) for inspiration.\n- Set up [bindings](/workers/runtime-apis/bindings/) to allow your Worker to interact with other resources and unlock new functionality.\n- Learn how to [test and debug](/workers/testing/) your Workers.\n- Read about [Workers limits and pricing](/workers/platform/).\n", "char_start": 7140, "char_end": 7747, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", "format": "markdown", "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8"}} +{"chunk_id": "48c8920f02ae8047", "doc_id": "workers/index.md", "text": "---\ntitle: Cloudflare Workers\ndescription: Build and deploy serverless applications across Cloudflare's global network with Workers.\npcx_content_type: overview\nsidebar:\n order: 1\nhead:\n - tag: title\n content: Overview\nproducts:\n - workers\n---\n\nimport { Description, RelatedProduct, LinkButton } from \"~/components\";\n\n\n\tA serverless platform for building, deploying, and scaling apps across\n\t[Cloudflare's global network](https://www.cloudflare.com/network/) with a\n\tsingle command \u2014 no infrastructure to manage, no complex configuration\n\n\nWith Cloudflare Workers, you can expect to:\n\n", "char_start": 0, "char_end": 617, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workers/index.md", "format": "markdown", "raw_hash": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4"}} +{"chunk_id": "4ce85ac2a4206275", "doc_id": "workers/index.md", "text": "- Deliver fast performance with high reliability anywhere in the world\n- Build full-stack apps with your framework of choice, including [React](/workers/framework-guides/web-apps/react/), [Vue](/workers/framework-guides/web-apps/vue/), [Svelte](/workers/framework-guides/web-apps/sveltekit/), [Next](/workers/framework-guides/web-apps/nextjs/), [Astro](/workers/framework-guides/web-apps/astro/), [React Router](/workers/framework-guides/web-apps/react-router/), [and more](/workers/framework-guides/)\n- Use your preferred language, including [JavaScript](/workers/languages/javascript/), [TypeScript](/workers/languages/typescript/), [Python](/workers/languages/python/), [Rust](/workers/languages/rust/), [and more](/workers/runtime-apis/webassembly/)\n- Gain deep visibility and insight with built-", "char_start": 617, "char_end": 1417, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workers/index.md", "format": "markdown", "raw_hash": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4"}} +{"chunk_id": "c4ee98b7517b4488", "doc_id": "workers/index.md", "text": "/workers/languages/rust/), [and more](/workers/runtime-apis/webassembly/)\n- Gain deep visibility and insight with built-in [observability](/workers/observability/logs/)\n- Get started for free and grow with flexible [pricing](/workers/platform/pricing/), affordable at any scale\n\n", "char_start": 1297, "char_end": 1576, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workers/index.md", "format": "markdown", "raw_hash": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4"}} +{"chunk_id": "c24991a70acd8f11", "doc_id": "workers/index.md", "text": "Get started with your first project:\n\n\n\tDeploy a template\n\n\n\n\tDeploy with Wrangler CLI\n\n\n---\n\n## Build with Workers\n\n
\n#### Front-end applications\n\nDeploy [static assets](/workers/static-assets/) to Cloudflare's [CDN & cache](/cache/) for fast rendering\n
\n\n
\n#### Back-end applications\n\nBuild APIs and connect to data stores with [Smart Placement](/workers/configuration/placement/) to optimize latency\n
\n\n
\n#### Serverless AI inference\n\nRun LLMs, generate images, and more with [Workers AI](/workers-ai/)\n
\n\n
\n#### Background jobs\n\n", "char_start": 1576, "char_end": 2359, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workers/index.md", "format": "markdown", "raw_hash": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4"}} +{"chunk_id": "8f407e170c9f94ec", "doc_id": "workers/index.md", "text": "Schedule [cron jobs](/workers/configuration/cron-triggers/), run durable [Workflows](/workflows/), and integrate with [Queues](/queues/)\n
\n\n
\n#### Observability & monitoring\n\nMonitor performance, debug issues, and analyze traffic with [real-time logs](/workers/observability/logs/) and [analytics](/workers/observability/metrics-and-analytics/)\n
\n\n---\n\n## Integrate with Workers\n\nConnect to external services like databases, APIs, and storage via [Bindings](/workers/runtime-apis/bindings/), enabling functionality with just a few lines of code:\n\n**Storage**\n\n\n\nScalable stateful storage for real-time coordination.\n\n\n\n", "char_start": 2359, "char_end": 3127, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workers/index.md", "format": "markdown", "raw_hash": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4"}} +{"chunk_id": "cd49454e834ddea1", "doc_id": "workers/index.md", "text": "\n\nServerless SQL database built for fast, global queries.\n\n\n\n\n\nLow-latency key-value storage for fast, edge-cached reads.\n\n\n\n\n\nGuaranteed delivery with no charges for egress bandwidth.\n\n\n\n\n\nConnect to your external database with accelerated queries, cached at the edge.\n\n\n\n**Compute**\n\n\n\nMachine learning models powered by serverless GPUs.\n\n\n\n", "char_start": 3127, "char_end": 3880, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workers/index.md", "format": "markdown", "raw_hash": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4"}} +{"chunk_id": "eefa2145b1621aa2", "doc_id": "workers/index.md", "text": "\n\nDurable, long-running operations with automatic retries.\n\n\n\n\n\nVector database for AI-powered semantic search.\n\n\n\n\n\nZero-egress object storage for cost-efficient data access.\n\n\n\n\n\nProgrammatic serverless browser instances.\n\n\n\n**Media**\n\n\n\nGlobal caching for high-performance, low-latency delivery.\n\n\n\n", "char_start": 3880, "char_end": 4616, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workers/index.md", "format": "markdown", "raw_hash": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4"}} +{"chunk_id": "33047525a43dd3b2", "doc_id": "workers/index.md", "text": "\n\nStreamlined image infrastructure from a single API.\n\n\n\n---\n\nWant to connect with the Workers community? [Join our Discord](https://discord.cloudflare.com)\n", "char_start": 4616, "char_end": 4855, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workers/index.md", "format": "markdown", "raw_hash": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4"}} +{"chunk_id": "19ba8a469590f02a", "doc_id": "workers/runtime-apis/bindings/R2.md", "text": "---\npcx_content_type: navigation\ntitle: R2\nexternal_link: /r2/api/workers/workers-api-reference/\nhead: []\ndescription: APIs available in Cloudflare Workers to read from and write to R2\n buckets. R2 is S3-compatible, zero egress-fee, globally distributed object\n storage.\n\nproducts:\n - workers\n---\n", "char_start": 0, "char_end": 301, "metadata": {"title": "R2", "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/R2.md", "format": "markdown", "raw_hash": "2841b8b9a51fa5f4c64c88594a815553940dee47a4188c159ceb45ee97117261"}} +{"chunk_id": "38bea03ddfc9a430", "doc_id": "workers/runtime-apis/bindings/durable-objects.md", "text": "---\npcx_content_type: navigation\ntitle: Durable Objects\nexternal_link: /durable-objects/api/\nhead: []\ndescription: A globally distributed coordination API with strongly consistent storage.\n\nproducts:\n - workers\n---\n", "char_start": 0, "char_end": 216, "metadata": {"title": "durable-objects", "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/durable-objects.md", "format": "markdown", "raw_hash": "8529ae13ce8b7acbdca264566f3b019803c7b75debadeb5a51c51f380264520d"}} +{"chunk_id": "f42c069d24389363", "doc_id": "workers/runtime-apis/bindings/kv.md", "text": "---\npcx_content_type: navigation\ntitle: KV\nexternal_link: /kv/api/\nhead: []\ndescription: Global, low-latency, key-value data storage.\n\nproducts:\n - workers\n---\n", "char_start": 0, "char_end": 161, "metadata": {"title": "kv", "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/kv.md", "format": "markdown", "raw_hash": "1a31963e5b0a455f49a7f1c36fc207bab7c71eac3d352d8ca5a14183d3f29f7e"}} +{"chunk_id": "04135b44ef84b2f5", "doc_id": "workers/runtime-apis/bindings/queues.md", "text": "---\npcx_content_type: navigation\ntitle: Queues\nexternal_link: /queues/configuration/javascript-apis/\nhead: []\ndescription: Send and receive messages with guaranteed delivery.\n\nproducts:\n - workers\n---\n", "char_start": 0, "char_end": 202, "metadata": {"title": "queues", "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/queues.md", "format": "markdown", "raw_hash": "baded9ebba0468d738474f49995b6cf8ee867ddb56af29ccb83656258a46703c"}} +{"chunk_id": "071c350933bf65f3", "doc_id": "workflows/build/rules-of-workflows.md", "text": "---\ntitle: Rules of Workflows\ndescription: Best practices for building resilient Workflows, including idempotency, state management, and error handling.\npcx_content_type: concept\nsidebar:\n order: 10\nproducts:\n - workflows\n---\n\nimport { WranglerConfig, TypeScriptExample } from \"~/components\";\n\nA Workflow contains one or more steps. Each step is a self-contained, individually retryable component of a Workflow. Steps may emit (optional) state that allows a Workflow to persist and continue from that step, even if a Workflow fails due to a network or infrastructure issue.\n\nThis is a small guidebook on how to build more resilient and correct Workflows.\n\n", "char_start": 0, "char_end": 658, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "619fa0451ba2d735", "doc_id": "workflows/build/rules-of-workflows.md", "text": "### Ensure API/Binding calls are idempotent\n\nBecause a step might be retried multiple times, your steps should (ideally) be idempotent. For context, idempotency is a logical property where the operation (in this case a step),\ncan be applied multiple times without changing the result beyond the initial application.\n\nAs an example, let us assume you have a Workflow that charges your customers, and you really do not want to charge them twice by accident. Before charging them, you should\ncheck if they were already charged:\n\n\n\n", "char_start": 658, "char_end": 1225, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "aea3afd781e5627a", "doc_id": "workflows/build/rules-of-workflows.md", "text": "```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\tconst customer_id = 123456;\n\t\t// \u2705 Good: Non-idempotent API/Binding calls are always done **after** checking if the operation is\n\t\t// still needed.\n\t\tawait step.do(\n\t\t\t`charge ${customer_id} for its monthly subscription`,\n\t\t\tasync () => {\n\t\t\t\t// API call to check if customer was already charged\n\t\t\t\tconst subscription = await fetch(\n\t\t\t\t\t`https://payment.processor/subscriptions/${customer_id}`,\n\t\t\t\t).then((res) => res.json());\n\n", "char_start": 1225, "char_end": 1780, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "a489b923f216e84a", "doc_id": "workflows/build/rules-of-workflows.md", "text": "\t\t\t\t// return early if the customer was already charged, this can happen if the destination service dies\n\t\t\t\t// in the middle of the request but still commits it, or if the Workflows Engine restarts.\n\t\t\t\tif (subscription.charged) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// non-idempotent call, this operation can fail and retry but still commit in the payment\n\t\t\t\t// processor - which means that, on retry, it would mischarge the customer again if the above checks\n\t\t\t\t// were not in place.\n\t\t\t\treturn await fetch(\n\t\t\t\t\t`https://payment.processor/subscriptions/${customer_id}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\tbody: JSON.stringify({ amount: 10.0 }),\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t}\n}\n```\n\n\n\n:::note\n\n", "char_start": 1780, "char_end": 2486, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "14f26130e3feb509", "doc_id": "workflows/build/rules-of-workflows.md", "text": "Guaranteeing idempotency might be optional in your specific use-case and implementation, but we recommend that you always try to guarantee it.\n\n:::\n\n### Make your steps granular\n\nSteps should be as self-contained as possible. This allows your own logic to be more durable in case of failures in third-party APIs, network errors, and so on.\n\nYou can also think of it as a transaction, or a unit of work.\n\n- \u2705 Minimize the number of API/binding calls per step (unless you need multiple calls to prove idempotency).\n\n\n\n", "char_start": 2486, "char_end": 3041, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "972462d7d62b4f26", "doc_id": "workflows/build/rules-of-workflows.md", "text": "```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \u2705 Good: Unrelated API/Binding calls are self-contained, so that in case one of them fails\n\t\t// it can retry them individually. It also has an extra advantage: you can control retry or\n\t\t// timeout policies for each granular step - you might not to want to overload http.cat in\n\t\t// case of it being down.\n\t\tconst httpCat = await step.do(\"get cutest cat from KV\", async () => {\n\t\t\treturn await this.env.KV.get(\"cutest-http-cat\");\n\t\t});\n\n\t\tconst image = await step.do(\"fetch cat image from http.cat\", async () => {\n\t\t\treturn await fetch(`https://http.cat/${httpCat}`);\n\t\t});\n\t}\n}\n```\n\n\n\n", "char_start": 3041, "char_end": 3773, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "8aaf40d3fbc093fc", "doc_id": "workflows/build/rules-of-workflows.md", "text": "Otherwise, your entire Workflow might not be as durable as you might think, and you may encounter some undefined behaviour. You can avoid them by following the rules below:\n\n- \ud83d\udd34 Do not encapsulate your entire logic in one single step.\n- \ud83d\udd34 Do not call separate services in the same step (unless you need it to prove idempotency).\n- \ud83d\udd34 Do not make too many service calls in the same step (unless you need it to prove idempotency).\n- \ud83d\udd34 Do not do too much CPU-intensive work inside a single step - sometimes the engine may have to restart, and it will start over from the beginning of that step.\n\n\n\n", "char_start": 3773, "char_end": 4406, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "d390b58e8168fea2", "doc_id": "workflows/build/rules-of-workflows.md", "text": "```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \ud83d\udd34 Bad: you are calling two separate services from within the same step. This might cause\n\t\t// some extra calls to the first service in case the second one fails, and in some cases, makes\n\t\t// the step non-idempotent altogether\n\t\tconst image = await step.do(\"get cutest cat from KV\", async () => {\n\t\t\tconst httpCat = await this.env.KV.get(\"cutest-http-cat\");\n\t\t\treturn fetch(`https://http.cat/${httpCat}`);\n\t\t});\n\t}\n}\n```\n\n\n\n", "char_start": 4406, "char_end": 4977, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "18d6b0d3d91dc33d", "doc_id": "workflows/build/rules-of-workflows.md", "text": "### Do not rely on state outside of a step\n\nWorkflows may hibernate and lose all in-memory state. This will happen when engine detects that there is no pending work and can hibernate until it needs to wake-up (because of a sleep, retry, or event).\n\nThis means that you should not store state outside of a step:\n\n\n\n```ts\nfunction getRandomInt(min, max) {\n\tconst minCeiled = Math.ceil(min);\n\tconst maxFloored = Math.floor(max);\n\treturn Math.floor(Math.random() * (maxFloored - minCeiled) + minCeiled); // The maximum is exclusive and the minimum is inclusive\n}\n\n", "char_start": 4977, "char_end": 5576, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "97c0a86a3aea9b12", "doc_id": "workflows/build/rules-of-workflows.md", "text": "export class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \ud83d\udd34 Bad: `imageList` will be not persisted across engine's lifetimes. Which means that after hibernation,\n\t\t// `imageList` will be empty again, even though the following two steps have already ran.\n\t\tconst imageList: string[] = [];\n\n\t\tawait step.do(\"get first cutest cat from KV\", async () => {\n\t\t\tconst httpCat = await this.env.KV.get(\"cutest-http-cat-1\");\n\n\t\t\timageList.push(httpCat);\n\t\t});\n\n\t\tawait step.do(\"get second cutest cat from KV\", async () => {\n\t\t\tconst httpCat = await this.env.KV.get(\"cutest-http-cat-2\");\n\n\t\t\timageList.push(httpCat);\n\t\t});\n\n", "char_start": 5576, "char_end": 6251, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "39b13e151a10c92c", "doc_id": "workflows/build/rules-of-workflows.md", "text": "\t\t// A long sleep can (and probably will) hibernate the engine which means that the first engine lifetime ends here\n\t\tawait step.sleep(\"\ud83d\udca4\ud83d\udca4\ud83d\udca4\ud83d\udca4\", \"3 hours\");\n\n\t\t// When this runs, it will be on the second engine lifetime - which means `imageList` will be empty.\n\t\tawait step.do(\n\t\t\t\"choose a random cat from the list and download it\",\n\t\t\tasync () => {\n\t\t\t\tconst randomCat = imageList.at(getRandomInt(0, imageList.length));\n\t\t\t\t// this will fail since `randomCat` is undefined because `imageList` is empty\n\t\t\t\treturn await fetch(`https://http.cat/${randomCat}`);\n\t\t\t},\n\t\t);\n\t}\n}\n```\n\n\n\nInstead, you should build top-level state exclusively comprised of `step.do` returns:\n\n\n\n", "char_start": 6251, "char_end": 6981, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "41fbe61f3321f8a4", "doc_id": "workflows/build/rules-of-workflows.md", "text": "```ts\nfunction getRandomInt(min, max) {\n\tconst minCeiled = Math.ceil(min);\n\tconst maxFloored = Math.floor(max);\n\treturn Math.floor(Math.random() * (maxFloored - minCeiled) + minCeiled); // The maximum is exclusive and the minimum is inclusive\n}\n\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \u2705 Good: imageList state is exclusively comprised of step returns - this means that in the event of\n\t\t// multiple engine lifetimes, imageList will be built accordingly\n\t\tconst imageList: string[] = await Promise.all([\n\t\t\tstep.do(\"get first cutest cat from KV\", async () => {\n\t\t\t\treturn await this.env.KV.get(\"cutest-http-cat-1\");\n\t\t\t}),\n\n", "char_start": 6981, "char_end": 7685, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "42f2dbf74a8eaa71", "doc_id": "workflows/build/rules-of-workflows.md", "text": "\t\t\tstep.do(\"get second cutest cat from KV\", async () => {\n\t\t\t\treturn await this.env.KV.get(\"cutest-http-cat-2\");\n\t\t\t}),\n\t\t]);\n\n\t\t// A long sleep can (and probably will) hibernate the engine which means that the first engine lifetime ends here\n\t\tawait step.sleep(\"\ud83d\udca4\ud83d\udca4\ud83d\udca4\ud83d\udca4\", \"3 hours\");\n\n\t\t// When this runs, it will be on the second engine lifetime - but this time, imageList will contain\n\t\t// the two most cutest cats\n\t\tawait step.do(\n\t\t\t\"choose a random cat from the list and download it\",\n\t\t\tasync () => {\n\t\t\t\tconst randomCat = imageList.at(getRandomInt(0, imageList.length));\n\t\t\t\t// this will eventually succeed since `randomCat` is defined\n\t\t\t\treturn await fetch(`https://http.cat/${randomCat}`);\n\t\t\t},\n\t\t);\n\t}\n}\n```\n\n\n\n", "char_start": 7685, "char_end": 8426, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "454fa8925a32452e", "doc_id": "workflows/build/rules-of-workflows.md", "text": "### Avoid doing side effects outside of a `step.do`\n\nIt is not recommended to write code with any side effects outside of steps, unless you would like it to be repeated, because the Workflow engine may restart while an instance is running. If the engine restarts, the step logic will be preserved, but logic outside of the steps may be duplicated.\n\nFor example, a `console.log()` outside of workflow steps may cause the logs to print twice when the engine restarts.\n\nHowever, logic involving non-serializable resources, like a database connection, should be executed outside of steps. Operations outside of a `step.do` might be repeated more than once, due to the nature of the Workflows' instance lifecycle.\n\n", "char_start": 8426, "char_end": 9136, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "8509f3210f0d9951", "doc_id": "workflows/build/rules-of-workflows.md", "text": ":::note\nIf you use [Hyperdrive](/hyperdrive/) in a Workflow, create a new connection inside each `step.do()` and run your queries in that same step. Do not reuse a Hyperdrive-backed connection across steps.\n:::\n\n\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \ud83d\udd34 Bad: creating instances outside of steps\n\t\t// This might get called more than once creating more instances than expected\n\t\tconst badInstance = await this.env.ANOTHER_WORKFLOW.create();\n\n", "char_start": 9136, "char_end": 9704, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "37bf046402786f0f", "doc_id": "workflows/build/rules-of-workflows.md", "text": "\t\t// \ud83d\udd34 Bad: using non-deterministic functions outside of steps\n\t\t// this will produce different results if the instance has to restart, different runs of the same instance\n\t\t// might go through different paths\n\t\tconst badRandom = Math.random();\n\n\t\tif (badRandom > 0) {\n\t\t\t// do some stuff\n\t\t}\n\n\t\t// \u26a0\ufe0f Warning: This log may happen many times\n\t\tconsole.log(\"This might be logged more than once\");\n\n\t\tawait step.do(\"do some stuff and have a log for when it runs\", async () => {\n\t\t\t// do some stuff\n\n\t\t\t// this log will only appear once\n\t\t\tconsole.log(\"successfully did stuff\");\n\t\t});\n\n\t\t// \u2705 Good: wrap non-deterministic function in a step\n\t\t// after running successfully will not run again\n\t\tconst goodRandom = await step.do(\"create a random number\", async () => {\n\t\t\treturn Math.random();\n\t\t});\n\n", "char_start": 9704, "char_end": 10500, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "4e6c75dbb194a353", "doc_id": "workflows/build/rules-of-workflows.md", "text": "\t\t// \u2705 Good: calls that have no side effects can be done outside of steps\n\t\t// For Hyperdrive, create the connection inside each step instead of here.\n\t\tconst db = createDBConnection(this.env.DB_URL, this.env.DB_TOKEN);\n\n\t\t// \u2705 Good: run functions with side effects inside of a step\n\t\t// after running successfully will not run again\n\t\tconst goodInstance = await step.do(\n\t\t\t\"good step that returns state\",\n\t\t\tasync () => {\n\t\t\t\tconst instance = await this.env.ANOTHER_WORKFLOW.create();\n\n\t\t\t\treturn instance;\n\t\t\t},\n\t\t);\n\t}\n}\n```\n\n\n\n### Do not mutate your incoming events\n\nThe `event` passed to your Workflow's `run` method is immutable: changes you make to the event are not persisted across steps and/or Workflow restarts.\n\n\n\n", "char_start": 10500, "char_end": 11286, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "5dc6f60dac9eec3b", "doc_id": "workflows/build/rules-of-workflows.md", "text": "```ts\ninterface MyEvent {\n\tuser: string;\n\tdata: string;\n}\n\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \ud83d\udd34 Bad: Mutating the event\n\t\t// This will not be persisted across steps and `event.payload` will\n\t\t// take on its original value.\n\t\tawait step.do(\"bad step that mutates the incoming event\", async () => {\n\t\t\tlet userData = await this.env.KV.get(event.payload.user);\n\t\t\tevent.payload = userData;\n\t\t});\n\n\t\t// \u2705 Good: persist data by returning it as state from your step\n\t\t// Use that state in subsequent steps\n\t\tlet userData = await step.do(\"good step that returns state\", async () => {\n\t\t\treturn await this.env.KV.get(event.payload.user);\n\t\t});\n\n", "char_start": 11286, "char_end": 12010, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "0de0efaa90c6a5ef", "doc_id": "workflows/build/rules-of-workflows.md", "text": "\t\tlet someOtherData = await step.do(\n\t\t\t\"following step that uses that state\",\n\t\t\tasync () => {\n\t\t\t\t// Access to userData here\n\t\t\t\t// Will always be the same if this step is retried\n\t\t\t},\n\t\t);\n\t}\n}\n```\n\n\n\n### Name steps deterministically\n\nSteps should be named deterministically (that is, not using the current date/time, randomness, etc). This ensures that their state is cached, and prevents the step from being rerun unnecessarily. Step names act as the \"cache key\" in your Workflow.\n\n\n\n", "char_start": 12010, "char_end": 12559, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "b213250d8e36516a", "doc_id": "workflows/build/rules-of-workflows.md", "text": "```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \ud83d\udd34 Bad: Naming the step non-deterministically prevents it from being cached\n\t\t// This will cause the step to be re-run if subsequent steps fail.\n\t\tawait step.do(`step #1 running at: ${Date.now()}`, async () => {\n\t\t\tlet userData = await this.env.KV.get(event.payload.user);\n\t\t\t// Do not mutate event.payload\n\t\t\tevent.payload = userData;\n\t\t});\n\n\t\t// \u2705 Good: give steps a deterministic name.\n\t\t// Return dynamic values in your state, or log them instead.\n\t\tlet state = await step.do(\"fetch user data from KV\", async () => {\n\t\t\tlet userData = await this.env.KV.get(event.payload.user);\n\t\t\tconsole.log(`fetched at ${Date.now()}`);\n\t\t\treturn userData;\n\t\t});\n\n", "char_start": 12559, "char_end": 13338, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "b9b7d2bf09715ff1", "doc_id": "workflows/build/rules-of-workflows.md", "text": "\t\t// \u2705 Good: steps that are dynamically named are constructed in a deterministic way.\n\t\t// In this case, `catList` is a step output, which is stable, and `catList` is\n\t\t// traversed in a deterministic fashion (no shuffles or random accesses) so,\n\t\t// it's fine to dynamically name steps (e.g: create a step per list entry).\n\t\tlet catList = await step.do(\"get cat list from KV\", async () => {\n\t\t\treturn await this.env.KV.get(\"cat-list\");\n\t\t});\n\n\t\tfor (const cat of catList) {\n\t\t\tawait step.do(`get cat: ${cat}`, async () => {\n\t\t\t\treturn await this.env.KV.get(cat);\n\t\t\t});\n\t\t}\n\t}\n}\n```\n\n\n\n", "char_start": 13338, "char_end": 13945, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "0100dc4d89214170", "doc_id": "workflows/build/rules-of-workflows.md", "text": "### Take care with `Promise.race()` and `Promise.any()`\n\nWorkflows allows the usage steps within the `Promise.race()` or `Promise.any()` methods as a way to achieve concurrent steps execution. However, some considerations must be taken.\n\nDue to the nature of Workflows' instance lifecycle, and given that a step inside a Promise will run until it finishes, the step that is returned during the first passage may not be the actual cached step, as [steps are cached by their names](#name-steps-deterministically).\n\n\n\n```ts\n// helper sleep method\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\n", "char_start": 13945, "char_end": 14598, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "705d24f452b96c10", "doc_id": "workflows/build/rules-of-workflows.md", "text": "export class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \ud83d\udd34 Bad: The `Promise.race` is not surrounded by a `step.do`, which may cause undeterministic caching behavior.\n\t\tconst race_return = await Promise.race([\n\t\t\tstep.do(\"Promise first race\", async () => {\n\t\t\t\tawait sleep(1000);\n\t\t\t\treturn \"first\";\n\t\t\t}),\n\t\t\tstep.do(\"Promise second race\", async () => {\n\t\t\t\treturn \"second\";\n\t\t\t}),\n\t\t]);\n\n\t\tawait step.sleep(\"Sleep step\", \"2 hours\");\n\n\t\treturn await step.do(\"Another step\", async () => {\n\t\t\t// This step will return `first`, even though the `Promise.race` first returned `second`.\n\t\t\treturn race_return;\n\t\t});\n\t}\n}\n```\n\n\n\n", "char_start": 14598, "char_end": 15305, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "e539b125734d0deb", "doc_id": "workflows/build/rules-of-workflows.md", "text": "To ensure consistency, we suggest to surround the `Promise.race()` or `Promise.any()` within a `step.do()`, as this will ensure caching consistency across multiple passages.\n\n\n\n```ts\n// helper sleep method\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\n", "char_start": 15305, "char_end": 15620, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "7a65aa39b2826a2f", "doc_id": "workflows/build/rules-of-workflows.md", "text": "export class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \u2705 Good: The `Promise.race` is surrounded by a `step.do`, ensuring deterministic caching behavior.\n\t\tconst race_return = await step.do(\"Promise step\", async () => {\n\t\t\treturn await Promise.race([\n\t\t\t\tstep.do(\"Promise first race\", async () => {\n\t\t\t\t\tawait sleep(1000);\n\t\t\t\t\treturn \"first\";\n\t\t\t\t}),\n\t\t\t\tstep.do(\"Promise second race\", async () => {\n\t\t\t\t\treturn \"second\";\n\t\t\t\t}),\n\t\t\t]);\n\t\t});\n\n\t\tawait step.sleep(\"Sleep step\", \"2 hours\");\n\n\t\treturn await step.do(\"Another step\", async () => {\n\t\t\t// This step will return `second` because the `Promise.race` was surround by the `step.do` method.\n\t\t\treturn race_return;\n\t\t});\n\t}\n}\n```\n\n\n\n", "char_start": 15620, "char_end": 16392, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "9d3416f918c079e9", "doc_id": "workflows/build/rules-of-workflows.md", "text": "### Instance IDs are unique\n\nWorkflow [instance IDs](/workflows/build/workers-api/#workflowinstance) are unique per Workflow. The ID is the unique identifier that associates logs, metrics, state and status of a run to a specific instance, even after completion. Allowing ID re-use would make it hard to understand if a Workflow instance ID referred to an instance that run yesterday, last week or today.\n\nIt would also present a problem if you wanted to run multiple different Workflow instances with different [input parameters](/workflows/build/events-and-parameters/) for the same user ID, as you would immediately need to determine a new ID mapping.\n\n", "char_start": 16392, "char_end": 17047, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "30cdaa0f208aa48e", "doc_id": "workflows/build/rules-of-workflows.md", "text": "If you need to associate multiple instances with a specific user, merchant or other \"customer\" ID in your system, consider using a composite ID or using randomly generated IDs and storing the mapping in a database like [D1](/d1/).\n\n\n\n```ts\n// This is in the same file as your Workflow definition\nexport default {\n\tasync fetch(req: Request, env: Env): Promise {\n\t\t// \ud83d\udd34 Bad: Use an ID that isn't unique across future Workflow invocations\n\t\tlet userId = getUserId(req); // Returns the userId\n\t\tlet badInstance = await env.MY_WORKFLOW.create({\n\t\t\tid: userId,\n\t\t\tparams: payload,\n\t\t});\n\n", "char_start": 17047, "char_end": 17678, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "8dbca06b55417aab", "doc_id": "workflows/build/rules-of-workflows.md", "text": "\t\t// \u2705 Good: use an ID that is unique\n\t\t// e.g. a transaction ID, order ID, or task ID are good options\n\t\tlet instanceId = getTransactionId(); // e.g. assuming transaction IDs are unique\n\t\t// or: compose a composite ID and store it in your database\n\t\t// so that you can track all instances associated with a specific user or merchant.\n\t\tinstanceId = `${getUserId(req)}-${crypto.randomUUID().slice(0, 6)}`;\n\t\tlet { result } = await addNewInstanceToDB(userId, instanceId);\n\t\tlet goodInstance = await env.MY_WORKFLOW.create({\n\t\t\tid: instanceId,\n\t\t\tparams: payload,\n\t\t});\n\n\t\treturn Response.json({\n\t\t\tid: goodInstance.id,\n\t\t\tdetails: await goodInstance.status(),\n\t\t});\n\t},\n};\n```\n\n\n\n", "char_start": 17678, "char_end": 18377, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "b2d60f97b3d0f087", "doc_id": "workflows/build/rules-of-workflows.md", "text": "### `await` your steps\n\nWhen calling `step.do` or `step.sleep`, use `await` to avoid introducing bugs and race conditions into your Workflow code.\n\nIf you don't call `await step.do` or `await step.sleep`, you create a dangling Promise. This occurs when a Promise is created but not properly `await`ed, leading to potential bugs and race conditions.\n\nThis happens when you do not use the `await` keyword or fail to chain `.then()` methods to handle the result of a Promise. For example, calling `fetch(GITHUB_URL)` without awaiting its response will cause subsequent code to execute immediately, regardless of whether the fetch completed. This can cause issues like premature logging, exceptions being swallowed (and not terminating the Workflow), and lost return values (state).\n\n", "char_start": 18377, "char_end": 19157, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "a50f53ce085be2b3", "doc_id": "workflows/build/rules-of-workflows.md", "text": "\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \ud83d\udd34 Bad: The step isn't await'ed, and any state or errors is swallowed before it returns.\n\t\tconst badIssues = step.do(`fetch issues from GitHub`, async () => {\n\t\t\t// The step will return before this call is done\n\t\t\tlet issues = await getIssues(event.payload.repoName);\n\t\t\treturn issues;\n\t\t});\n\n\t\t// \u2705 Good: The step is correctly await'ed.\n\t\tconst goodIssues = await step.do(`fetch issues from GitHub`, async () => {\n\t\t\tlet issues = await getIssues(event.payload.repoName);\n\t\t\treturn issues;\n\t\t});\n\n\t\t// Rest of your Workflow goes here!\n\t}\n}\n```\n\n\n\n", "char_start": 19157, "char_end": 19891, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "1cfc536d49b51c82", "doc_id": "workflows/build/rules-of-workflows.md", "text": "### Use conditional logic carefully\n\nYou can use `if` statements, loops, and other control flow outside of steps. However, conditions must be based on **deterministic values** \u2014 either values from `event.payload` or return values from previous steps. Non-deterministic conditions (such as `Math.random()` or `Date.now()`) outside of steps can cause unexpected behavior if the Workflow restarts.\n\n\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\tconst config = await step.do(\"fetch config\", async () => {\n\t\t\treturn await this.env.KV.get(\"feature-flags\", { type: \"json\" });\n\t\t});\n\n", "char_start": 19891, "char_end": 20586, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "66e9e8bd064dd41f", "doc_id": "workflows/build/rules-of-workflows.md", "text": "\t\t// \u2705 Good: Condition based on step output (deterministic)\n\t\tif (config.enableEmailNotifications) {\n\t\t\tawait step.do(\"send email\", async () => {\n\t\t\t\t// Send email logic\n\t\t\t});\n\t\t}\n\n\t\t// \u2705 Good: Condition based on event payload (deterministic)\n\t\tif (event.payload.userType === \"premium\") {\n\t\t\tawait step.do(\"premium processing\", async () => {\n\t\t\t\t// Premium-only logic\n\t\t\t});\n\t\t}\n\n\t\t// \ud83d\udd34 Bad: Condition based on non-deterministic value outside a step\n\t\t// This could behave differently if the Workflow restarts\n\t\tif (Math.random() > 0.5) {\n\t\t\tawait step.do(\"maybe do something\", async () => {});\n\t\t}\n\n", "char_start": 20586, "char_end": 21187, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "48a61ce8f6577d1a", "doc_id": "workflows/build/rules-of-workflows.md", "text": "\t\t// \u2705 Good: Wrap non-deterministic values in a step\n\t\tconst shouldProcess = await step.do(\"decide randomly\", async () => {\n\t\t\treturn Math.random() > 0.5;\n\t\t});\n\t\tif (shouldProcess) {\n\t\t\tawait step.do(\"conditionally do something\", async () => {});\n\t\t}\n\t}\n}\n```\n\n\n\n", "char_start": 21187, "char_end": 21471, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "5d1fa6dc1cee576a", "doc_id": "workflows/build/rules-of-workflows.md", "text": "### Batch multiple Workflow invocations\n\nWhen creating multiple Workflow instances, use the [`createBatch`](/workflows/build/workers-api/#createBatch) method to batch the invocations together. This allows you to create multiple Workflow instances in a single request, which will reduce the number of requests made to the Workflows API. However, each individual instance in the batch will still count towards the [creation rate limit](/workflows/reference/limits/). Unlike `create`, `createBatch` is idempotent: if an existing instance with the same ID is still within its [retention limit](/workflows/reference/limits/), it will be skipped and excluded from the returned array.\n\n\n\n", "char_start": 21471, "char_end": 22191, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "a4b11e2d0ebd02f7", "doc_id": "workflows/build/rules-of-workflows.md", "text": "```ts\nexport default {\n\tasync fetch(req: Request, env: Env): Promise {\n\t\tlet instances = [\n\t\t\t{ id: \"user1\", params: { name: \"John\" } },\n\t\t\t{ id: \"user2\", params: { name: \"Jane\" } },\n\t\t\t{ id: \"user3\", params: { name: \"Alice\" } },\n\t\t\t{ id: \"user4\", params: { name: \"Bob\" } },\n\t\t];\n\n\t\t// \ud83d\udd34 Bad: Create them one by one, which is more likely to hit creation rate limits.\n\t\tfor (let instance of instances) {\n\t\t\tawait env.MY_WORKFLOW.create({\n\t\t\t\tid: instance.id,\n\t\t\t\tparams: instance.params,\n\t\t\t});\n\t\t}\n\n\t\t// \u2705 Good: Batch calls together\n\t\t// This improves throughput.\n\t\tlet createdInstances = await env.MY_WORKFLOW.createBatch(instances);\n\t\treturn Response.json({ instances: createdInstances });\n\t},\n};\n```\n\n\n\n", "char_start": 22191, "char_end": 22927, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "16e932148923f47b", "doc_id": "workflows/build/rules-of-workflows.md", "text": "### Limit timeouts to 30 minutes or less\n\nWhen setting a [WorkflowStep timeout](/workflows/build/workers-api/#workflowstep), ensure that its duration is 30 minutes or less. If your use case requires a timeout greater than 30 minutes, consider using `step.waitForEvent()` instead.\n\n### Keep non-stream step return values under 1 MiB\n\nA non-stream `step.do()` return value can persist up to 1 MiB (2^20 bytes). If your step returns structured data exceeding this limit, the step will fail. This is a common issue when fetching large API responses or processing large files.\n\nIn JavaScript Workflows, `ReadableStream` is a supported serializable return type for larger binary output. When persisting this kind of output, you should:\n\n", "char_start": 22927, "char_end": 23670, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "cd8c2d27b1b07786", "doc_id": "workflows/build/rules-of-workflows.md", "text": "- Return a new stream from the step callback.\n- Keep individual chunks under 16 MB.\n- Do not return a locked stream or a stream that has already been read.\n- Rely only on streams returned from steps.\n :::note\n Only byte streams are supported - use `ReadableStream`.\n\nBYOB streams and BYOB readers are not supported.\n:::\n\nNote that streamed outputs are still considered part of the Workflow instance storage limit.\n\nIf these storage limits still do not work for you, consider storing your step outputs externally (for example, in [R2](/r2)) and saving a reference to it.\n\n\n\n", "char_start": 23670, "char_end": 24296, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "e2822e1b9e97a58a", "doc_id": "workflows/build/rules-of-workflows.md", "text": "```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// \ud83d\udd34 Bad: Returning a large response that may exceed 1 MiB\n\t\tconst largeData = await step.do(\"fetch large dataset\", async () => {\n\t\t\tconst response = await fetch(\"https://api.example.com/large-dataset\");\n\t\t\treturn await response.json(); // Could exceed 1 MiB\n\t\t});\n\n", "char_start": 24296, "char_end": 24686, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "a3705fad74e9662b", "doc_id": "workflows/build/rules-of-workflows.md", "text": "\t\t// \u2705 Good: Store large structured data externally and return a reference\n\t\tconst dataRef = await step.do(\"fetch and store large dataset\", async () => {\n\t\t\tconst response = await fetch(\"https://api.example.com/large-dataset\");\n\t\t\tconst data = await response.json();\n\t\t\t// Store in R2 and return a reference\n\t\t\tawait this.env.MY_BUCKET.put(\"dataset-123\", JSON.stringify(data));\n\t\t\treturn { key: \"dataset-123\" };\n\t\t});\n\n\t\t// Retrieve the data in a later step when needed\n\t\tconst data = await step.do(\"process dataset\", async () => {\n\t\t\tconst stored = await this.env.MY_BUCKET.get(dataRef.key);\n\t\t\treturn processData(await stored.json());\n\t\t});\n\t}\n}\n```\n\n\n\n", "char_start": 24686, "char_end": 25361, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "831c5a1fa42e4b4f", "doc_id": "workflows/build/rules-of-workflows.md", "text": "## Related resources\n\n- [Workers Best Practices](/workers/best-practices/workers-best-practices/): code patterns for request handling, observability, and security that apply to the Workers triggering your Workflows.\n- [Rules of Durable Objects](/durable-objects/best-practices/rules-of-durable-objects/): best practices for stateful, coordinated applications \u2014 useful when combining Durable Objects with Workflows.\n", "char_start": 25361, "char_end": 25776, "metadata": {"title": "rules-of-workflows", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", "format": "markdown", "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821"}} +{"chunk_id": "2f6b972f88c8d0e8", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "---\ntitle: Sleeping and retrying\ndescription: Configure sleep durations and retry logic for Workflows steps, including relative and absolute sleep timers.\npcx_content_type: concept\nsidebar:\n order: 4\nproducts:\n - workflows\n---\n\nimport { TypeScriptExample } from \"~/components\";\n\nThis guide details how to sleep a Workflow and/or configure retries for a Workflow step.\n\n## Sleep a Workflow\n\nYou can set a Workflow to sleep as an explicit step, which can be useful when you want a Workflow to wait, schedule work ahead, or pause until an input or other external state is ready.\n\n:::note\n\n", "char_start": 0, "char_end": 588, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "6e0a273f152e2e0a", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "A Workflow instance that is resuming from sleep will take priority over newly scheduled (queued) instances. This helps ensure that older Workflow instances can run to completion and are not blocked by newer instances.\n\n:::\n\n### Sleep for a relative period\n\nUse `step.sleep` to have a Workflow sleep for a relative period of time:\n\n```ts\nawait step.sleep(\"sleep for a bit\", \"1 hour\");\n```\n\nThe second argument to `step.sleep` accepts both `number` (milliseconds) or a human-readable format, such as \"1 minute\" or \"26 hours\". The accepted units for `step.sleep` when used this way are as follows:\n\n```ts\n| \"second\"\n| \"minute\"\n| \"hour\"\n| \"day\"\n| \"week\"\n| \"month\"\n| \"year\"\n```\n\n", "char_start": 588, "char_end": 1262, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "07e47c1df7d3b4a6", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "### Sleep until a fixed date\n\nUse `step.sleepUntil` to have a Workflow sleep to a specific `Date`: this can be useful when you have a timestamp from another system or want to \"schedule\" work to occur at a specific time (e.g. Sunday, 9AM UTC).\n\n```ts\n// sleepUntil accepts a Date object as its second argument\nconst workflowsLaunchDate = Date.parse(\"24 Oct 2024 13:00:00 UTC\");\nawait step.sleepUntil(\"sleep until X times out\", workflowsLaunchDate);\n```\n\nYou can also provide a UNIX timestamp (milliseconds since the UNIX epoch) directly to `sleepUntil`.\n\n## Retry steps\n\nEach call to `step.do` in a Workflow accepts an optional `StepConfig`, which allows you define the retry behaviour for that step.\n\nIf you do not provide your own retry configuration, Workflows applies the following defaults:\n\n", "char_start": 1262, "char_end": 2058, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "7e50c88a6fd0902e", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "```ts\nconst defaultConfig: WorkflowStepConfig = {\n\tretries: {\n\t\tlimit: 5,\n\t\tdelay: 10000,\n\t\tbackoff: \"exponential\",\n\t},\n\ttimeout: \"10 minutes\",\n};\n```\n\nWhen providing your own `StepConfig`, you can configure:\n\n- The total number of attempts to make for a step (limited to 10,000 retries per step)\n- The delay between attempts. Use a fixed duration as a `number` in milliseconds or a human-readable string, or use a function that returns the next delay.\n- What backoff algorithm to apply between each attempt: any of `constant`, `linear`, or `exponential`\n- When to timeout (in duration) before considering the step as failed (including during a retry attempt, as the timeout is set per attempt)\n\n", "char_start": 2058, "char_end": 2754, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "46e6298b370a70e4", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "For example, to limit a step to 10 retries and have it apply an exponential delay (starting at 10 seconds) between each attempt, you would pass the following configuration as an optional object to `step.do`:\n\n```ts\nlet someState = await step.do(\n\t\"call an API\",\n\t{\n\t\tretries: {\n\t\t\tlimit: 10, // The total number of attempts\n\t\t\tdelay: \"10 seconds\", // Delay between each retry\n\t\t\tbackoff: \"exponential\", // Any of \"constant\" | \"linear\" | \"exponential\";\n\t\t},\n\t\ttimeout: \"30 minutes\",\n\t},\n\tasync () => {\n\t\t/* Step code goes here */\n\t},\n);\n```\n\n", "char_start": 2754, "char_end": 3295, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "b5efc150000d6cb9", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "### Set a dynamic retry delay\n\nUse a delay function when the next retry delay should depend on the failed attempt or the thrown error. This gives you more control than a fixed delay with `constant`, `linear`, or `exponential` backoff. It is useful for rate limits, downstream provider recovery, and short network failures.\n\nThe delay function receives an object with:\n\n- `ctx` - the current [`WorkflowStepContext`](/workflows/build/step-context/), including `ctx.attempt`.\n- `error` - the error that caused the retry.\n\nReturn a duration string, a number in milliseconds, or a promise that resolves to either value.\n\n\n\n", "char_start": 3295, "char_end": 3932, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "5913f496a5d9d546", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "```ts\nawait step.do(\n\t\"sync customer\",\n\t{\n\t\tretries: {\n\t\t\tlimit: 5,\n\t\t\tdelay: ({ ctx, error }) => {\n\t\t\t\tif (error.message.includes(\"rate limit\")) {\n\t\t\t\t\treturn `${ctx.attempt * 30} seconds`;\n\t\t\t\t}\n\n\t\t\t\treturn \"10 seconds\";\n\t\t\t},\n\t\t},\n\t},\n\tasync () => {\n\t\tawait syncCustomer();\n\t},\n);\n```\n\n\n\n## Force a Workflow instance to fail\n\nYou can also force a Workflow instance to fail and _not_ retry by throwing a `NonRetryableError` from within the step.\n\nThis can be useful when you detect a terminal (permanent) error from an upstream system (such as an authentication failure) or other errors where retrying would not help.\n\n", "char_start": 3932, "char_end": 4573, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "e2fb7c4b90dd645f", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "```ts\n// Import the NonRetryableError definition\nimport {\n\tWorkflowEntrypoint,\n\tWorkflowStep,\n\tWorkflowEvent,\n} from \"cloudflare:workers\";\nimport { NonRetryableError } from \"cloudflare:workflows\";\n\n// In your step code:\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\tawait step.do(\"some step\", async () => {\n\t\t\tif (!event.payload.data) {\n\t\t\t\tthrow new NonRetryableError(\n\t\t\t\t\t\"event.payload.data did not contain the expected payload\",\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n```\n\nThe Workflow instance itself will fail immediately, no further steps will be invoked, and the Workflow will not be retried.\n\n", "char_start": 4573, "char_end": 5245, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "d819331b986bf1b0", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "If earlier steps registered rollback handlers, those handlers will still run before the instance settles into its terminal state.\n\n## Register rollback handlers\n\nYou can attach a rollback handler to `step.do()` to implement saga-style compensation. When the Workflow later fails, Workflows runs registered rollback handlers in reverse `step-start` order.\n\nA failed step with rollback options can also participate in rollback alongside any completed steps which have a rollback handler registered. For example, if a steps throws a `NonRetryableError` after registering rollback, its rollback handler runs with `output` set to `undefined`.\n\n\n\n", "char_start": 5245, "char_end": 5905, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "5636b9e71245aae4", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "```ts\nimport {\n\tWorkflowEntrypoint,\n\ttype WorkflowEvent,\n\ttype WorkflowStep,\n} from \"cloudflare:workers\";\nimport { NonRetryableError } from \"cloudflare:workflows\";\n\nexport class OrderWorkflow extends WorkflowEntrypoint {\n\tasync run(_event: WorkflowEvent, step: WorkflowStep) {\n\t\tawait step.do(\n\t\t\t\"reserve inventory\",\n\t\t\tasync () => {\n\t\t\t\tconst reservation = await reserveInventory();\n\t\t\t\treturn { reservationId: reservation.id };\n\t\t\t},\n\t\t\t{\n\t\t\t\trollback: async ({ output }) => {\n\t\t\t\t\tconst { reservationId } = output as { reservationId: string };\n\t\t\t\t\tawait releaseInventory(reservationId);\n\t\t\t\t},\n\t\t\t\trollbackConfig: {\n\t\t\t\t\tretries: { limit: 3, delay: \"10 seconds\", backoff: \"linear\" },\n\t\t\t\t\ttimeout: \"2 minutes\",\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n", "char_start": 5905, "char_end": 6654, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "b227cb0f91c1ba15", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "\t\tawait step.do(\"charge card\", async () => {\n\t\t\tthrow new NonRetryableError(\"payment processor rejected the charge\");\n\t\t});\n\t}\n}\n```\n\n\n\nRollback handlers receive:\n\n- `error` - the error that caused the Workflow to fail.\n- `output` - the value returned by the forward step, or `undefined` if the step failed before returning\n\nYou can use `rollbackConfig` to control retry behavior for the rollback handler. Throw a `NonRetryableError` from the rollback handler to stop retrying it immediately.\n\n## Catch Workflow errors\n\nAny uncaught exceptions that propagate to the top level, or any steps that reach their retry limit, will cause the Workflow to end execution in an `Errored` state.\n\n", "char_start": 6654, "char_end": 7359, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "f19ed52fc91734cb", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "If you want to avoid this, you can catch exceptions emitted by a `step`. This can be useful if you need to trigger clean-up tasks or have conditional logic that triggers additional steps.\n\nTo allow the Workflow to continue its execution, surround the intended steps that are allowed to fail with a `try...catch` block.\n\n```ts\n...\nawait step.do('task', async () => {\n\t// work to be done\n});\n\ntry {\n await step.do('non-retryable-task', async () => {\n\t\t// work not to be retried\n throw new NonRetryableError('oh no');\n });\n} catch (e) {\n console.log(`Step failed: ${e.message}`);\n await step.do('clean-up-task', async () => {\n // Clean up code here\n });\n}\n\n// the Workflow will not fail and will continue its execution\n\n", "char_start": 7359, "char_end": 8103, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "f8db22e68843d564", "doc_id": "workflows/build/sleeping-and-retrying.md", "text": "await step.do('next-task', async() => {\n\t// more work to be done\n});\n...\n```\n", "char_start": 8103, "char_end": 8180, "metadata": {"title": "sleeping-and-retrying", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", "format": "markdown", "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88"}} +{"chunk_id": "a11698c85f35f69a", "doc_id": "workflows/build/step-context.md", "text": "---\ntitle: Step context\ndescription: Access runtime information in Workflows steps using the WorkflowStepContext object, including step name and retry attempt.\npcx_content_type: concept\nsidebar:\n order: 5\nproducts:\n - workflows\n---\n\nEvery `step.do` callback receives a **context object** (`WorkflowStepContext`) as its first argument. The context gives your step code runtime information about the step itself, the current retry attempt, and the resolved configuration for that step.\n\n## WorkflowStepContext\n\n```ts\ntype WorkflowStepContext = {\n\tstep: {\n\t\tname: string;\n\t\tcount: number;\n\t};\n\tattempt: number;\n\tconfig: WorkflowStepConfig;\n};\n```\n\n", "char_start": 0, "char_end": 647, "metadata": {"title": "step-context", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/step-context.md", "format": "markdown", "raw_hash": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3"}} +{"chunk_id": "ba83f1953f54333c", "doc_id": "workflows/build/step-context.md", "text": "### Properties\n\n| Property | Type | Description |\n| ------------ | ------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |\n| `step.name` | `string` | The name you passed to `step.do`. |\n| `step.", "char_start": 647, "char_end": 1385, "metadata": {"title": "step-context", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/step-context.md", "format": "markdown", "raw_hash": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3"}} +{"chunk_id": "62f8f4a71b4f05dd", "doc_id": "workflows/build/step-context.md", "text": "count` | `number` | How many times `step.do` has been called with this name so far in the current Workflow run. Starts at `1` for the first call with a given name. |\n| `attempt` | `number` | The current attempt number (1-indexed). `1` on the first try, `2` on the first retry, and so on. |\n| `config` | [`WorkflowStepConfig`](/workflows/build/workers-api/#workflowstepconfig) | The resolved retry and timeout configuration for this step, including any defaults applied by the runtime. |\n\n", "char_start": 1385, "char_end": 2092, "metadata": {"title": "step-context", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/step-context.md", "format": "markdown", "raw_hash": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3"}} +{"chunk_id": "58b7e96addb312dd", "doc_id": "workflows/build/step-context.md", "text": "If a step config's `retries.delay` is a function, the dynamic delay is not exposed on `ctx.config.retries.delay`. The delay function receives its own context object with the current step context and the error that caused the retry.\n\n## Access the context\n\nPass a parameter to your `step.do` callback to receive the context object:\n\n```ts\nawait step.do(\"my-step\", async (ctx) => {\n\tconsole.log(ctx.step.name); // \"my-step\"\n\tconsole.log(ctx.step.count); // 1\n\tconsole.log(ctx.attempt); // 1 on first try, 2 on first retry, etc.\n\tconsole.log(ctx.config); // { retries: { limit: 5, ... }, timeout: \"10 minutes\" }\n});\n```\n\nThe context is also available when you pass a custom `WorkflowStepConfig`:\n\n", "char_start": 2092, "char_end": 2786, "metadata": {"title": "step-context", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/step-context.md", "format": "markdown", "raw_hash": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3"}} +{"chunk_id": "c0b64f38dd8c6b6b", "doc_id": "workflows/build/step-context.md", "text": "```ts\nawait step.do(\n\t\"call an API\",\n\t{\n\t\tretries: {\n\t\t\tlimit: 10,\n\t\t\tdelay: \"10 seconds\",\n\t\t\tbackoff: \"exponential\",\n\t\t},\n\t\ttimeout: \"30 minutes\",\n\t},\n\tasync (ctx) => {\n\t\tconsole.log(ctx.config.retries.limit); // 10\n\t\tconsole.log(ctx.config.timeout); // \"30 minutes\"\n\t},\n);\n```\n\nTo configure delay functions, refer to [Set a dynamic retry delay](/workflows/build/sleeping-and-retrying/#set-a-dynamic-retry-delay).\n\n## Examples\n\n### Adjust behavior based on retry attempt\n\nUse `ctx.attempt` to change how your step behaves on retries. For example, you might use a fallback endpoint after a certain number of retries:\n\n", "char_start": 2786, "char_end": 3404, "metadata": {"title": "step-context", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/step-context.md", "format": "markdown", "raw_hash": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3"}} +{"chunk_id": "1fc799e0a979b618", "doc_id": "workflows/build/step-context.md", "text": "```ts\nawait step.do(\n\t\"fetch data\",\n\t{ retries: { limit: 5, delay: \"5 seconds\", backoff: \"linear\" } },\n\tasync (ctx) => {\n\t\tconst url =\n\t\t\tctx.attempt <= 3\n\t\t\t\t? \"https://api.example.com/primary\"\n\t\t\t\t: \"https://api.example.com/fallback\";\n\n\t\tconst response = await fetch(url);\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Request failed with status ${response.status}`);\n\t\t}\n\t\treturn await response.json();\n\t},\n);\n```\n\n### Log step metadata for observability\n\nUse `ctx.step` to add structured metadata to your logs:\n\n```ts\nawait step.do(\"process-order\", async (ctx) => {\n\tconsole.log(\n\t\tJSON.stringify({\n\t\t\tstep: ctx.step.name,\n\t\t\tstepCount: ctx.step.count,\n\t\t\tattempt: ctx.attempt,\n\t\t\tretryLimit: ctx.config.retries?.limit,\n\t\t}),\n\t);\n\n\t// Your step logic here\n});\n```\n", "char_start": 3404, "char_end": 4168, "metadata": {"title": "step-context", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/step-context.md", "format": "markdown", "raw_hash": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3"}} +{"chunk_id": "9c26f403ee852265", "doc_id": "workflows/build/trigger-workflows.md", "text": "---\ntitle: Trigger Workflows\ndescription: Trigger Workflows from Workers bindings, the REST API, or the Wrangler CLI.\npcx_content_type: concept\ntags:\n - Bindings\nsidebar:\n order: 3\nproducts:\n - workflows\n---\n\nimport { TypeScriptExample, WranglerConfig } from \"~/components\";\n\nYou can trigger Workflows both programmatically and via the Workflows APIs, including:\n\n1. With [Workers](/workers) via HTTP requests in a `fetch` handler, or bindings from a `queue` or `scheduled` handler\n2. On a recurring interval by defining `schedules` on a Workflow binding in your Wrangler configuration\n3. Using the [Workflows REST API](/api/resources/workflows/methods/list/)\n4. Via the [wrangler CLI](/workers/wrangler/commands/workflows/#workflows) in your terminal\n\n", "char_start": 0, "char_end": 756, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "bbfc34ac993fd013", "doc_id": "workflows/build/trigger-workflows.md", "text": "## Workers API (Bindings)\n\nYou can interact with Workflows programmatically from any Worker script by creating a binding to a Workflow. A Worker can bind to multiple Workflows, including Workflows defined in other Workers projects (scripts) within your account.\n\nYou can trigger a Workflow:\n\n- Directly over HTTP via the [`fetch`](/workers/runtime-apis/handlers/fetch/) handler\n- From a [Queue consumer](/queues/configuration/javascript-apis/#consumer) inside a `queue` handler\n- On a recurring schedule by defining `schedules` on the Workflow binding in `wrangler.jsonc`\n- From a [Cron Trigger](/workers/configuration/cron-triggers/) inside a `scheduled` handler\n- Within a [Durable Object](/durable-objects/)\n\n:::note\n\n", "char_start": 756, "char_end": 1477, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "91cde61f73ef8f4a", "doc_id": "workflows/build/trigger-workflows.md", "text": "New to Workflows? Start with the [Workflows tutorial](/workflows/get-started/guide/) to deploy your first Workflow and familiarize yourself with Workflows concepts.\n\n:::\n\nTo bind to a Workflow from your Workers code, you need to define a [binding](/workers/wrangler/configuration/) to a specific Workflow. For example, to bind to the Workflow defined in the [get started guide](/workflows/get-started/guide/), you would configure the [Wrangler configuration file](/workers/wrangler/configuration/) with the below:\n\n\n\n", "char_start": 1477, "char_end": 2010, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "78c645befa9c3c33", "doc_id": "workflows/build/trigger-workflows.md", "text": "```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"workflows-tutorial\",\n\t\"main\": \"src/index.ts\",\n\t\"compatibility_date\": \"$today\",\n\t\"workflows\": [\n\t\t{\n\t\t\t// The name of the Workflow\n\t\t\t\"name\": \"workflows-tutorial\",\n\t\t\t// The binding name, which must be a valid JavaScript variable name. This will\n\t\t\t// be how you call (run) your Workflow from your other Workers handlers or\n\t\t\t// scripts.\n\t\t\t\"binding\": \"MY_WORKFLOW\",\n\t\t\t// Must match the class defined in your code that extends the Workflow class\n\t\t\t\"class_name\": \"MyWorkflow\"\n\t\t}\n\t]\n}\n```\n\n\n\n", "char_start": 2010, "char_end": 2600, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "d561b9e63aee5f57", "doc_id": "workflows/build/trigger-workflows.md", "text": "The `binding = \"MY_WORKFLOW\"` line defines the JavaScript variable that our Workflow methods are accessible on, including `create` (which triggers a new instance) or `get` (which returns the status of an existing instance).\n\n### Schedule a Workflow directly\n\nIf you want to create Workflow instances on a recurring interval, add a `schedules` array (up to 100 cron expressions per account) to the Workflow binding in your Wrangler configuration:\n\n\n\n```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"workflows-tutorial\",\n\t\"main\": \"src/index.ts\",\n\t\"compatibility_date\": \"$today\",\n\t\"workflows\": [\n\t\t{\n\t\t\t\"name\": \"workflows-tutorial\",\n\t\t\t\"binding\": \"MY_WORKFLOW\",\n\t\t\t\"class_name\": \"MyWorkflow\",\n\t\t\t\"schedules\": [\"0 * * * *\"]\n\t\t}\n\t]\n}\n```\n\n\n\n", "char_start": 2600, "char_end": 3399, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "b046bbb9698f6690", "doc_id": "workflows/build/trigger-workflows.md", "text": "Each matching cron expression creates a new Workflow instance automatically. Use this when you want to run a Workflow on a schedule without defining top-level `triggers.crons` and a separate `scheduled` handler.\n\nScheduled instances include the matching cron expression and scheduled trigger time on `event.schedule`:\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\tif (event.schedule) {\n\t\t\tconsole.log(event.schedule.cron);\n\t\t\tconsole.log(new Date(event.schedule.scheduledTime));\n\t\t}\n\t}\n}\n```\n\n", "char_start": 3399, "char_end": 3977, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "2bba8373131cb65c", "doc_id": "workflows/build/trigger-workflows.md", "text": "On [Workers Paid](/workers/platform/pricing/#workers), Workflow instances created by `schedules` can run for up to one hour per cron firing without consuming a Workflow concurrency slot. If the instance pauses or sleeps after that window, the instance yields and enters the normal concurrency queue upon resume. It resumes when a concurrency slot is available.\n\nUse the latest Wrangler release when configuring Workflow schedules. If your local Wrangler schema does not recognize `schedules` yet, update Wrangler before deploying.\n\nThe following example shows how you can manage Workflows from within a Worker, including:\n\n- Retrieving the status of an existing Workflow instance by its ID\n- Creating (triggering) a new Workflow instance\n- Returning the status of a given instance ID\n\n", "char_start": 3977, "char_end": 4762, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "8cc782482ebdca53", "doc_id": "workflows/build/trigger-workflows.md", "text": "```ts title=\"src/index.ts\"\ninterface Env {\n\tMY_WORKFLOW: Workflow;\n}\n\nexport default {\n\tasync fetch(req: Request, env: Env) {\n\t\t// Get instanceId from query parameters\n\t\tconst instanceId = new URL(req.url).searchParams.get(\"instanceId\");\n\n\t\t// If an ?instanceId= query parameter is provided, fetch the status\n\t\t// of an existing Workflow by its ID.\n\t\tif (instanceId) {\n\t\t\tlet instance = await env.MY_WORKFLOW.get(instanceId);\n\t\t\treturn Response.json({\n\t\t\t\tstatus: await instance.status(),\n\t\t\t});\n\t\t}\n\n", "char_start": 4762, "char_end": 5267, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "aaede95af448740a", "doc_id": "workflows/build/trigger-workflows.md", "text": "\t\t// Else, create a new instance of our Workflow, passing in any (optional)\n\t\t// params and return the ID.\n\t\tconst newId = crypto.randomUUID();\n\t\tlet instance = await env.MY_WORKFLOW.create({ id: newId });\n\t\treturn Response.json({\n\t\t\tid: instance.id,\n\t\t\tdetails: await instance.status(),\n\t\t});\n\t},\n};\n```\n\n### Inspect a Workflow's status\n\nYou can inspect the status of any running Workflow instance by calling `status` against a specific instance ID. This allows you to programmatically inspect whether an instance is queued (waiting to be scheduled), actively running, paused, or errored.\n\n```ts\nlet instance = await env.MY_WORKFLOW.get(\"abc-123\");\nlet status = await instance.status(); // Returns an InstanceStatus\n```\n\nThe possible values of status are as follows:\n\n", "char_start": 5267, "char_end": 6036, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "cf2ef847d0056ba1", "doc_id": "workflows/build/trigger-workflows.md", "text": "```ts\n status:\n | \"queued\" // means that instance is waiting to be started (see concurrency limits)\n | \"running\"\n | \"paused\"\n | \"errored\"\n | \"terminated\" // user terminated the instance while it was running\n | \"complete\"\n | \"waiting\" // instance is hibernating and waiting for sleep or event to finish\n | \"waitingForPause\" // instance is finishing the current work to pause\n | \"unknown\";\n error?: {\n name: string,\n message: string\n };\n\toutput?: unknown;\n\trollback:\n\t\t| {\n\t\t\t\toutcome: \"complete\" | \"failed\";\n\t\t\t\terror: {\n\t\t\t\t\tname: string,\n\t\t\t\t\tmessage: string,\n\t\t\t\t} | null,\n\t\t }\n\t\t| null;\n```\n\n", "char_start": 6036, "char_end": 6668, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "5933e658628175b4", "doc_id": "workflows/build/trigger-workflows.md", "text": "If your Workflow registers rollback handlers on `step.do()`, inspect `rollback` after the instance finishes to see whether the compensating steps completed successfully. While rollback is actively running, the Workers API continues to return `status: \"running\"`.\n\n### Explicitly pause a Workflow\n\nYou can explicitly pause a Workflow instance (and later resume it) by calling `pause` against a specific instance ID.\n\n```ts\nlet instance = await env.MY_WORKFLOW.get(\"abc-123\");\nawait instance.pause(); // Returns Promise\n```\n\n### Resume a Workflow\n\nYou can resume a paused Workflow instance by calling `resume` against a specific instance ID.\n\n```ts\nlet instance = await env.MY_WORKFLOW.get(\"abc-123\");\nawait instance.resume(); // Returns Promise\n```\n\n", "char_start": 6668, "char_end": 7429, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "5fce0b271eaa9c5f", "doc_id": "workflows/build/trigger-workflows.md", "text": "Calling `resume` on an instance that is not currently paused will have no effect.\n\n:::caution\nIf you have reached the maximum concurrent instances for your Workflow, resuming an instance may not restart it immediately. The instance will be queued until a concurrency slot becomes available.\n:::\n\n### Stop a Workflow\n\nYou can stop/terminate a Workflow instance by calling `terminate` against a specific instance ID.\n\n```ts\nlet instance = await env.MY_WORKFLOW.get(\"abc-123\");\nawait instance.terminate(); // Returns Promise\n```\n\nTo run registered rollback handlers before terminating, pass `rollback: true`:\n\n```ts\nlet instance = await env.MY_WORKFLOW.get(\"abc-123\");\nawait instance.terminate({ rollback: true }); // Returns Promise\n```\n\nYou can also run rollback handlers from Wrangler:\n\n", "char_start": 7429, "char_end": 8228, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "57786eb7238ede9e", "doc_id": "workflows/build/trigger-workflows.md", "text": "```sh\nnpx wrangler workflows instances terminate --rollback\n# For a local Workflows instance during wrangler dev:\nnpx wrangler workflows instances terminate --local --rollback\n```\n\nOnce stopped/terminated, the Workflow instance _cannot_ be resumed.\n\n### Restart a Workflow\n\n```ts\nlet instance = await env.MY_WORKFLOW.get(\"abc-123\");\nawait instance.restart(); // Returns Promise\n```\n\nRestarting an instance will immediately cancel any in-progress steps, erase any intermediate state, and treat the Workflow as if it was run for the first time.\n\nTo restart an instance from a specific step instead of the beginning, refer to [`restart`](/workflows/build/workers-api/#restart) in the Workers API reference.\n\n", "char_start": 8228, "char_end": 8999, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "2be4048994ffc710", "doc_id": "workflows/build/trigger-workflows.md", "text": "### Trigger a Workflow from another Workflow\n\nYou can create a new Workflow instance from within a step of another Workflow. The parent Workflow will not block waiting for the child Workflow to complete \u2014 it continues execution immediately after the child instance is successfully created.\n\n\n\n```ts\nexport class ParentWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// Perform initial work\n\t\tconst result = await step.do(\"initial processing\", async () => {\n\t\t\t// ... processing logic\n\t\t\treturn { fileKey: \"output.pdf\" };\n\t\t});\n\n", "char_start": 8999, "char_end": 9614, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "29a1d7689a494288", "doc_id": "workflows/build/trigger-workflows.md", "text": "\t\t// Trigger a child workflow for additional processing\n\t\tconst childInstance = await step.do(\"trigger child workflow\", async () => {\n\t\t\treturn await this.env.CHILD_WORKFLOW.create({\n\t\t\t\tid: `child-${event.instanceId}`,\n\t\t\t\tparams: { fileKey: result.fileKey },\n\t\t\t});\n\t\t});\n\n\t\t// Parent continues immediately - not blocked by child workflow\n\t\tawait step.do(\"continue with other work\", async () => {\n\t\t\tconsole.log(`Started child workflow: ${childInstance.id}`);\n\t\t\t// This runs right away, regardless of child workflow status\n\t\t});\n\t}\n}\n```\n\n\n\nIf the child Workflow fails to start, the step will fail and be retried according to your retry configuration. Once the child instance is successfully created, it runs independently from the parent.\n\n", "char_start": 9614, "char_end": 10378, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "502ecb95ce963428", "doc_id": "workflows/build/trigger-workflows.md", "text": "## REST API (HTTP)\n\nRefer to the [Workflows REST API documentation](/api/resources/workflows/subresources/instances/methods/create/).\n\n## Command line (CLI)\n\nRefer to the [CLI quick start](/workflows/get-started/guide/) to learn more about how to manage and trigger Workflows via the command-line.\n", "char_start": 10378, "char_end": 10676, "metadata": {"title": "For a local Workflows instance during wrangler dev:", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", "format": "markdown", "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb"}} +{"chunk_id": "eac313e20f21bc76", "doc_id": "workflows/build/workers-api.md", "text": "---\ntitle: Workers API\ndescription: Reference for the Workflows Workers API, including WorkflowEntrypoint, step methods, and instance management.\npcx_content_type: concept\nsidebar:\n order: 2\nproducts:\n - workflows\n---\n\nimport {\n\tMetaInfo,\n\tRender,\n\tType,\n\tTypeScriptExample,\n\tWranglerConfig,\n} from \"~/components\";\n\nThis guide details the Workflows API within Cloudflare Workers, including methods, types, and usage examples.\n\n## WorkflowEntrypoint\n\nThe `WorkflowEntrypoint` class is the core element of a Workflow definition. A Workflow must extend this class and define a `run` method with at least one `step` call to be considered a valid Workflow.\n\n", "char_start": 0, "char_end": 655, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "2e877c5fedf0efe6", "doc_id": "workflows/build/workers-api.md", "text": "```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// Steps here\n\t}\n}\n```\n\n### run\n\n- run(event: WorkflowEvent<T>, step: WorkflowStep): Promise<T>\n - `event` - the event passed to the Workflow, including an optional `payload` containing data (parameters)\n - `step` - the `WorkflowStep` type that provides the step methods for your Workflow\n\n", "char_start": 655, "char_end": 1109, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "8be2a85e73a22404", "doc_id": "workflows/build/workers-api.md", "text": "The `run` method can optionally return data, which is available when querying the instance status via the [Workers API](/workflows/build/workers-api/#instancestatus), [REST API](/api/resources/workflows/subresources/instances/subresources/status/) and the Workflows dashboard. This can be useful if your Workflow is computing a result, returning the key to data stored in object storage, or generating some kind of identifier you need to act on.\n\n```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// Steps here\n\t\tlet someComputedState = await step.do(\"my step\", async () => {});\n\n\t\t// Optional: return state from our run() method\n\t\treturn someComputedState;\n\t}\n}\n```\n\n", "char_start": 1109, "char_end": 1864, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "eaa36eaa10c72fe1", "doc_id": "workflows/build/workers-api.md", "text": "The `WorkflowEvent` type accepts an optional [type parameter](https://www.typescriptlang.org/docs/handbook/2/generics.html#working-with-generic-type-variables) that allows you to provide a type for the `payload` property within the `WorkflowEvent`.\n\nRefer to the [events and parameters](/workflows/build/events-and-parameters/) documentation for how to handle events within your Workflow code.\n\nFinally, any JS control-flow primitive (if conditions, loops, `try...catch` blocks, promises, and more) can be used to manage steps inside the `run` method.\n\n## WorkflowEvent\n\n```ts\nexport type WorkflowCronSchedule = {\n\t/** Cron expression that triggered this event. */\n\tcron: string;\n\t/** Timestamp of the scheduled trigger, in milliseconds since the Unix epoch. */\n\tscheduledTime: number;\n};\n\n", "char_start": 1864, "char_end": 2654, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "f1422d44af850a4c", "doc_id": "workflows/build/workers-api.md", "text": "export type WorkflowEvent = {\n\tpayload: Readonly;\n\ttimestamp: Date;\n\tinstanceId: string;\n\tworkflowName: string;\n\tschedule?: WorkflowCronSchedule;\n};\n```\n\n- The `WorkflowEvent` is the first argument to a Workflow's `run` method.\n - `payload` - a default type of `any` or type `T` if a type parameter is provided.\n - `timestamp` - a `Date` object set to the time the Workflow instance was created (triggered).\n - `instanceId` - the ID of the associated instance.\n - `workflowName` - the name of the associated Workflow.\n - `schedule` - metadata for Workflow instances created by a cron schedule, including the `cron` expression and `scheduledTime` in milliseconds since the Unix epoch.\n\n", "char_start": 2654, "char_end": 3350, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "b68bdb45a6a5e014", "doc_id": "workflows/build/workers-api.md", "text": "Refer to the [events and parameters](/workflows/build/events-and-parameters/) documentation for how to handle events within your Workflow code.\n\n", "char_start": 3350, "char_end": 3495, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "4306b3d78cc44029", "doc_id": "workflows/build/workers-api.md", "text": "## WorkflowStep\n\n### step\n\n{/* prettier-ignore */}\n- step.do(name: string, callback: (ctx: WorkflowStepContext): RpcSerializable): Promise<T>\n- step.do(name: string, callback: (ctx: WorkflowStepContext): RpcSerializable, rollbackOptions?: WorkflowStepRollbackOptions<T>): Promise<T>\n- step.do(name: string, config?: WorkflowStepConfig, callback: (ctx: WorkflowStepContext):\n\tRpcSerializable): Promise<T>\n\t- `name` - the name of the step, up to 256 characters.\n\t- `config` (optional) - an optional `WorkflowStepConfig` for configuring [step specific retry behaviour](/workflows/build/sleeping-and-retrying/).\n\t", "char_start": 3495, "char_end": 4167, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "6708cb3af232559e", "doc_id": "workflows/build/workers-api.md", "text": "- `callback` - an asynchronous function that receives a [`WorkflowStepContext`](/workflows/build/step-context/) and optionally returns serializable state for the Workflow to persist. In JavaScript Workflows, this includes a fresh, unlocked `ReadableStream` for large binary output.\n- step.do(name: string, config?: WorkflowStepConfig, callback: (ctx: WorkflowStepContext):\n\tRpcSerializable, rollbackOptions?: WorkflowStepRollbackOptions<T>): Promise<T>\n\t- `name` - the name of the step, up to 256 characters.\n\t- `config` (optional) - an optional `WorkflowStepConfig` for configuring [step specific retry behaviour](/workflows/build/sleeping-and-retrying/).\n\t", "char_start": 4167, "char_end": 4862, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "481fad976e2f7e8b", "doc_id": "workflows/build/workers-api.md", "text": "- `callback` - an asynchronous function that receives a [`WorkflowStepContext`](/workflows/build/step-context/) and optionally returns serializable state for the Workflow to persist. In JavaScript Workflows, this includes a fresh, unlocked `ReadableStream` for large binary output.\n\t- `rollbackOptions` (optional) - register rollback logic for the step. If the Workflow later fails, registered rollbacks run in reverse step-start order.\n\n", "char_start": 4862, "char_end": 5312, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "0f0160e8822e04ca", "doc_id": "workflows/build/workers-api.md", "text": ":::note[Returning state]\n\nWhen returning state from a `step`, ensure that the object you return is _serializable_.\n\nPrimitive types like `string`, `number`, and `boolean`, along with composite structures such as `Array` and `Object` (provided they only contain serializable values), can be serialized. Any [structured-cloneable](https://developer.mozilla.org/en-US/docs/Web/API/Window/structuredClone) type can be serialized, as long it is no longer than 1 MB.\n\nOn the other hand, objects that include `Function` or `Symbol` types, and objects with circular references, cannot be serialized. The Workflow instance will throw an error if objects with those types is returned.\n\n", "char_start": 5312, "char_end": 5988, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "242c1afa489d38ac", "doc_id": "workflows/build/workers-api.md", "text": "In JavaScript Workflows, `ReadableStream` is a supported serializable return type when a step needs to persist larger binary output than the normal 1 MiB non-stream step-result limit.\n\nReturn a new stream from the callback.\n\n:::caution\nDo not return a locked stream or a stream that has already been read. BYOB streams and BYOB readers are not supported.\n:::\n\nAfter a `ReadableStream` object has been persisted within a step, it should not be reused - rely on the new fresh stream that gets returned from step. The bytes are preserved from the original stream, but the implementation might differ.\n\n:::\n\n\n\n```ts\ntype Env = {\n\tMY_BUCKET: R2Bucket;\n};\n\n", "char_start": 5988, "char_end": 6682, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "cacba8100087e788", "doc_id": "workflows/build/workers-api.md", "text": "export class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(_event: WorkflowEvent, step: WorkflowStep) {\n\t\tconst reportStream = await step.do(\"read report from R2\", async () => {\n\t\t\tconst object = await this.env.MY_BUCKET.get(\"reports/latest.csv\");\n\n\t\t\tif (!object?.body) {\n\t\t\t\tthrow new Error(\"Could not read reports/latest.csv from R2.\");\n\t\t\t}\n\n\t\t\treturn object.body;\n\t\t});\n\n\t\tconst preview = await new Response(reportStream).text();\n\t\treturn { preview };\n\t}\n}\n```\n\n\n\n", "char_start": 6682, "char_end": 7190, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "5eeeea2a638cf348", "doc_id": "workflows/build/workers-api.md", "text": "- step.sleep(name: string, duration: WorkflowDuration): Promise<void>\n - `name` - the name of the step.\n - `duration` - the duration to sleep until, in either seconds or as a `WorkflowDuration` compatible string.\n - Refer to the [documentation on sleeping and retrying](/workflows/build/sleeping-and-retrying/) to learn more about how Workflows are retried.\n\n- step.sleepUntil(name: string, timestamp: Date | number): Promise<void>\n - `name` - the name of the step.\n - `timestamp` - a JavaScript `Date` object or milliseconds from the Unix epoch to sleep the Workflow instance until.\n\n:::note\n\n`step.sleep` and `step.sleepUntil` methods do not count towards the maximum Workflow steps limit.\n\n", "char_start": 7190, "char_end": 7926, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "84bdf449c4280df2", "doc_id": "workflows/build/workers-api.md", "text": "More information about the limits imposed on Workflow can be found in the [Workflows limits documentation](/workflows/reference/limits/).\n\n:::\n\n- step.waitForEvent(name: string, options: ): Promise<void>-\n `name` - the name of the step. - `options` - an object with properties for\n `type` (up to 100 characters [^1]), which determines which event type this\n `waitForEvent` call will match on when calling `instance.sendEvent`, and an\n optional `timeout` property, which defines how long the `waitForEvent` call\n will block for before throwing a timeout exception. The default timeout is 24\n hours.\n\n\n\n", "char_start": 7926, "char_end": 8571, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "d053d36f187472ae", "doc_id": "workflows/build/workers-api.md", "text": "```ts\nexport class MyWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\t// Other steps in your Workflow\n\t\tlet stripeEvent = await step.waitForEvent(\n\t\t\t\"receive invoice paid webhook from Stripe\",\n\t\t\t{ type: \"stripe-webhook\", timeout: \"1 hour\" },\n\t\t);\n\t\t// Rest of your Workflow\n\t}\n}\n```\n\n\n\nReview the documentation on [events and parameters](/workflows/build/events-and-parameters/) to learn how to send events to a running Workflow instance.\n\n## WorkflowStepConfig\n\n```ts\nexport type WorkflowDynamicDelayContext = {\n\tctx: WorkflowStepContext;\n\terror: Error;\n};\n\nexport type WorkflowDelayFunction = (\n\tinput: WorkflowDynamicDelayContext,\n) => string | number | Promise;\n\n", "char_start": 8571, "char_end": 9367, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "694a17fcc77f0d06", "doc_id": "workflows/build/workers-api.md", "text": "export type WorkflowStepConfig = {\n\tretries?: {\n\t\tlimit: number;\n\t\tdelay: string | number | WorkflowDelayFunction;\n\t\tbackoff?: WorkflowBackoff;\n\t};\n\ttimeout?: string | number;\n};\n```\n\n- A `WorkflowStepConfig` is an optional argument to the `do` method of a `WorkflowStep` and defines properties that allow you to configure the retry behaviour of that step.\n- Set `retries.delay` to a fixed duration, or pass a `WorkflowDelayFunction` to calculate the next retry delay from the current step context and thrown error.\n\nRefer to the [documentation on sleeping and retrying](/workflows/build/sleeping-and-retrying/) to learn more about how Workflows are retried.\n\n", "char_start": 9367, "char_end": 10027, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "d6e862cae8c80a5c", "doc_id": "workflows/build/workers-api.md", "text": "## Rollback options\n\n```ts\ntype WorkflowRollbackContext = {\n\tctx: WorkflowStepContext;\n\terror: Error;\n\toutput: T | undefined;\n};\n\ntype WorkflowRollbackHandler = (\n\tctx: WorkflowRollbackContext,\n) => Promise;\n\ntype WorkflowStepRollbackConfig = Pick<\n\tWorkflowStepConfig,\n\t\"retries\" | \"timeout\"\n>;\n\ntype WorkflowStepRollbackOptions = {\n\trollback: WorkflowRollbackHandler;\n\trollbackConfig?: WorkflowStepRollbackConfig;\n};\n```\n\n", "char_start": 10027, "char_end": 10502, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "42bb287d01dfb9f3", "doc_id": "workflows/build/workers-api.md", "text": "- Pass this `WorkflowStepRollbackOptions` object as the final argument to `step.do()` to register a compensating action for a successful step.\n- `rollback` receives the original step context, the error that caused the Workflow to fail, and the step output returned by the forward step.\n- `rollbackConfig` applies retry and timeout settings to the rollback handler itself.\n\n\n\n", "char_start": 10502, "char_end": 10896, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "dd39d591872b9fe7", "doc_id": "workflows/build/workers-api.md", "text": "```ts\nexport class BillingWorkflow extends WorkflowEntrypoint {\n\tasync run(_event: WorkflowEvent, step: WorkflowStep) {\n\t\tawait step.do(\n\t\t\t\"create charge\",\n\t\t\tasync () => {\n\t\t\t\tconst charge = await createCharge();\n\t\t\t\treturn { chargeId: charge.id };\n\t\t\t},\n\t\t\t{\n\t\t\t\trollback: async ({ ctx, output, error }) => {\n\t\t\t\t\tconst { chargeId } = output as { chargeId: string };\n\t\t\t\t\tawait refundCharge(chargeId, {\n\t\t\t\t\t\treason: `${ctx.step.name}: ${error.message}`,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\trollbackConfig: {\n\t\t\t\t\tretries: {\n\t\t\t\t\t\tlimit: 3,\n\t\t\t\t\t\tdelay: \"30 seconds\",\n\t\t\t\t\t\tbackoff: \"linear\",\n\t\t\t\t\t},\n\t\t\t\t\ttimeout: \"5 minutes\",\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t}\n}\n```\n\n\n\n", "char_start": 10896, "char_end": 11575, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "b87fc0e2fce2d8b0", "doc_id": "workflows/build/workers-api.md", "text": "## WorkflowStepContext\n\n```ts\nexport type WorkflowStepContext = {\n\tstep: {\n\t\tname: string;\n\t\tcount: number;\n\t};\n\tattempt: number;\n\tconfig: WorkflowStepConfig;\n};\n```\n\n- The `WorkflowStepContext` is passed as the first argument to the `step.do` callback function. It provides runtime information about the current step.\n - `step.name` - the name of the step as passed to `step.do`.\n - `step.count` - how many times `step.do` has been called with this name in the current Workflow run (1-indexed).\n - `attempt` - the current attempt number (1-indexed). `1` on the first try, `2` on the first retry, and so on.\n - `config` - the resolved `WorkflowStepConfig` for this step, including any defaults applied by the runtime.\n\n", "char_start": 11575, "char_end": 12298, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "5652ccbb131d1061", "doc_id": "workflows/build/workers-api.md", "text": "Refer to the [step context documentation](/workflows/build/step-context/) for usage examples.\n\n## Workflow step limits\n\nEach workflow on Workers Paid supports 10,000 steps by default. You can increase this up to 25,000 steps by configuring `steps` within the `limits` property of your Workflow definition in your Wrangler configuration:\n\n\n\n```toml\n[[workflows]]\nname = \"my-workflow\"\nbinding = \"MY_WORKFLOW\"\nclass_name = \"MyWorkflow\"\n\n[workflows.limits]\nsteps = 25_000\n```\n\n\n\n`step.sleep` does not count towards the maximum steps limit.\n\nNote that Workflows on Workers Free have a limit of 1,024 steps. Refer to [Workflow limits](/workflows/reference/limits/) for more information.\n\n", "char_start": 12298, "char_end": 13013, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "10ab70864d402465", "doc_id": "workflows/build/workers-api.md", "text": "## NonRetryableError\n\n- throw new NonRetryableError(message: , name ): \n - When thrown inside [`step.do()`](/workflows/build/workers-api/#step), this error stops step retries, propagating the error to the top level (the [run](/workflows/build/workers-api/#run) function). Any error not handled at this top level will cause the Workflow instance to fail.\n - Refer to the [documentation on sleeping and retrying](/workflows/build/sleeping-and-retrying/) to learn more about how Workflows steps are retried.\n\n", "char_start": 13013, "char_end": 13640, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "215908352f92c0ae", "doc_id": "workflows/build/workers-api.md", "text": "## Call Workflows from Workers\n\nWorkflows exposes an API directly to your Workers scripts via the [bindings](/workers/runtime-apis/bindings/#what-is-a-binding) concept. Bindings allow you to securely call a Workflow without having to manage API keys or clients.\n\nYou can bind to a Workflow by defining a `[[workflows]]` binding within your Wrangler configuration.\n\nFor example, to bind to a Workflow called `workflows-starter` and to make it available on the `MY_WORKFLOW` variable to your Worker script, you would configure the following fields within the `[[workflows]]` binding definition:\n\n\n\n", "char_start": 13640, "char_end": 14252, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "ec4db1d553d6a9e8", "doc_id": "workflows/build/workers-api.md", "text": "```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"workflows-starter\",\n\t\"main\": \"src/index.ts\",\n\t\"compatibility_date\": \"$today\",\n\t\"workflows\": [\n\t\t{\n\t\t\t// name of your workflow\n\t\t\t\"name\": \"workflows-starter\",\n\t\t\t// binding name env.MY_WORKFLOW\n\t\t\t\"binding\": \"MY_WORKFLOW\",\n\t\t\t// this is class that extends the Workflow class in src/index.ts\n\t\t\t\"class_name\": \"MyWorkflow\",\n\t\t},\n\t],\n}\n```\n\n\n\n### Bind from Pages\n\nYou can bind and trigger Workflows from [Pages Functions](/pages/functions/) by deploying a Workers project with your Workflow definition and then invoking that Worker using [service bindings](/pages/functions/bindings/#service-bindings) or a standard `fetch()` call.\n\n", "char_start": 14252, "char_end": 14977, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "4e0eec76110e0449", "doc_id": "workflows/build/workers-api.md", "text": "Visit the documentation on [calling Workflows from Pages](/workflows/build/call-workflows-from-pages/) for examples.\n\n### Cross-script calls\n\nYou can also bind to a Workflow that is defined in a different Worker script from the script your Workflow definition is in. To do this, provide the `script_name` key with the name of the script to the `[[workflows]]` binding definition in your Wrangler configuration.\n\nFor example, if your Workflow is defined in a Worker script named `billing-worker`, but you are calling it from your `web-api-worker` script, your [Wrangler configuration file](/workers/wrangler/configuration/) would resemble the following:\n\n\n\n", "char_start": 14977, "char_end": 15649, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "db6fea986db05a25", "doc_id": "workflows/build/workers-api.md", "text": "```jsonc\n{\n\t\"$schema\": \"./node_modules/wrangler/config-schema.json\",\n\t\"name\": \"web-api-worker\",\n\t\"main\": \"src/index.ts\",\n\t\"compatibility_date\": \"$today\",\n\t\"workflows\": [\n\t\t{\n\t\t\t// name of your workflow\n\t\t\t\"name\": \"billing-workflow\",\n\t\t\t// binding name env.MY_WORKFLOW\n\t\t\t\"binding\": \"MY_WORKFLOW\",\n\t\t\t// this is class that extends the Workflow class in src/index.ts\n\t\t\t\"class_name\": \"MyWorkflow\",\n\t\t\t// the script name where the Workflow is defined.\n\t\t\t// required if the Workflow is defined in another script.\n\t\t\t\"script_name\": \"billing-worker\",\n\t\t},\n\t],\n}\n```\n\n\n\n\n\n## Workflow\n\n:::note\n\nEnsure you have a compatibility date `2024-10-22` or later installed when binding to Workflows from within a Workers project.\n\n:::\n\n", "char_start": 15649, "char_end": 16438, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "dc1501f7aad671ac", "doc_id": "workflows/build/workers-api.md", "text": "The `Workflow` type provides methods that allow you to create, inspect the status, and manage running Workflow instances from within a Worker script.\nIt is part of the generated types produced by [`wrangler types`](/workers/wrangler/commands/general/#types).\n\n```ts title=\"./worker-configuration.d.ts\"\ninterface Env {\n\t// The 'MY_WORKFLOW' variable should match the \"binding\" value set in the Wrangler config file\n\tMY_WORKFLOW: Workflow;\n}\n```\n\nThe `Workflow` type exports the following methods:\n\n### create\n\nCreate (trigger) a new instance of the given Workflow.\n\n- create(options?: WorkflowInstanceCreateOptions): Promise<WorkflowInstance>\n - `options` - optional properties to pass when creating an instance, including a user-provided ID and payload parameters.\n\n", "char_start": 16438, "char_end": 17224, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "d40a10de39024c71", "doc_id": "workflows/build/workers-api.md", "text": "An ID is automatically generated, but a user-provided ID can be specified (up to 100 characters [^1]). This can be useful when mapping Workflows to users, merchants or other identifiers in your system. You can also provide a JSON object as the `params` property, allowing you to pass data for the Workflow instance to act on as its [`WorkflowEvent`](/workflows/build/events-and-parameters/).\n\n```ts\n// Create a new Workflow instance with your own ID and pass params to the Workflow instance\nlet instance = await env.MY_WORKFLOW.create({\n\tid: myIdDefinedFromOtherSystem,\n\tparams: { hello: \"world\" },\n});\nreturn Response.json({\n\tid: instance.id,\n\tdetails: await instance.status(),\n});\n```\n\nReturns a `WorkflowInstance`.\n\n", "char_start": 17224, "char_end": 17943, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "32e57214bb583fc1", "doc_id": "workflows/build/workers-api.md", "text": "Throws an error if the provided ID is already used by an existing instance that has not yet passed its [retention limit](/workflows/reference/limits/). To re-run a workflow with the same ID, you can [`restart`](/workflows/build/trigger-workflows/#restart-a-workflow) the existing instance.\n\n\n\nTo provide an optional type parameter to the `Workflow`, pass a type argument with your type when defining your Workflow bindings:\n\n```ts\ninterface User {\n\temail: string;\n\tcreatedTimestamp: number;\n}\n\ninterface Env {\n\t// Pass our User type as the type parameter to the Workflow definition\n MY_WORKFLOW: Workflow;\n}\n\n", "char_start": 17943, "char_end": 18622, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "94987b490b392eaf", "doc_id": "workflows/build/workers-api.md", "text": "export default {\n\tasync fetch(request, env, ctx) {\n\t\t// More likely to come from your database or via the request body!\n\t\tconst user: User = {\n\t\t\temail: user@example.com,\n\t\t\tcreatedTimestamp: Date.now()\n\t\t}\n\n\t\tlet instance = await env.MY_WORKFLOW.create({\n\t\t\t// params expects the type User\n\t\t\tparams: user\n\t\t})\n\n\t\treturn Response.json({\n\t\t\tid: instance.id,\n\t\t\tdetails: await instance.status(),\n\t\t});\n\t}\n}\n```\n\n### createBatch\n\nCreate (trigger) a batch of new instance of the given Workflow, up to 100 instances at a time.\n\nThis is useful when you are scheduling multiple instances at once. A call to `createBatch` is treated the same as a call to `create` (for a single instance) and allows you to work within the [instance creation limit](/workflows/reference/limits/).\n\n", "char_start": 18622, "char_end": 19395, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "e44d2bf3721fa386", "doc_id": "workflows/build/workers-api.md", "text": "- createBatch(batch: WorkflowInstanceCreateOptions[]): Promise<WorkflowInstance[]>\n - `batch` - list of Options to pass when creating an instance, including a user-provided ID and payload parameters.\n\nEach element of the `batch` list is expected to include both `id` and `params` properties:\n\n```ts\n// Create a new batch of 3 Workflow instances, each with its own ID and pass params to the Workflow instances\nconst listOfInstances = [\n\t{ id: \"id-abc123\", params: { hello: \"world-0\" } },\n\t{ id: \"id-def456\", params: { hello: \"world-1\" } },\n\t{ id: \"id-ghi789\", params: { hello: \"world-2\" } },\n];\nlet instances = await env.MY_WORKFLOW.createBatch(listOfInstances);\n```\n\nReturns an array of `WorkflowInstance`.\n\n", "char_start": 19395, "char_end": 20123, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "8173c5d43183968b", "doc_id": "workflows/build/workers-api.md", "text": "Unlike [`create`](/workflows/build/workers-api/#create), this operation is idempotent and will not fail if an ID is already in use. If an existing instance with the same ID is still within its [retention limit](/workflows/reference/limits/), it will be skipped and excluded from the returned array.\n\n### get\n\nGet a specific Workflow instance by ID.\n\n- get(id: string): Promise<WorkflowInstance>- `id` - the ID\n of the Workflow instance.\n\nReturns a `WorkflowInstance`. Throws an exception if the instance ID does not exist.\n\n", "char_start": 20123, "char_end": 20667, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "8f4647f44b8765c6", "doc_id": "workflows/build/workers-api.md", "text": "```ts\n// Fetch an existing Workflow instance by ID:\ntry {\n\tlet instance = await env.MY_WORKFLOW.get(id);\n\treturn Response.json({\n\t\tid: instance.id,\n\t\tdetails: await instance.status(),\n\t});\n} catch (e: any) {\n\t// Handle errors\n\t// .get will throw an exception if the ID doesn't exist or is invalid.\n\tconst msg = `failed to get instance ${id}: ${e.message}`;\n\tconsole.error(msg);\n\treturn Response.json({ error: msg }, { status: 400 });\n}\n```\n\n## WorkflowInstanceCreateOptions\n\nOptional properties to pass when creating an instance.\n\n", "char_start": 20667, "char_end": 21198, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "45589e12abca5609", "doc_id": "workflows/build/workers-api.md", "text": "```ts\ninterface WorkflowInstanceCreateOptions {\n\t/**\n\t * An id for your Workflow instance. Must be unique within the Workflow.\n\t */\n\tid?: string;\n\t/**\n\t * The event payload the Workflow instance is triggered with\n\t */\n\tparams?: unknown;\n\t/**\n\t * The retention policy for the Workflow instance.\n\t * Defaults to the maximum retention period available for the owner's account.\n\t */\n\tretention?: {\n\t\t/**\n\t\t * How long to retain instance state after the Workflow completes successfully.\n\t\t */\n\t\tsuccessRetention?: WorkflowRetentionDuration;\n\t\t/**\n\t\t * How long to retain instance state after the Workflow ends in an errored or terminated state.\n\t\t */\n\t\terrorRetention?: WorkflowRetentionDuration;\n\t};\n}\n\ntype WorkflowRetentionDuration = WorkflowSleepDuration;\n```\n\n", "char_start": 21198, "char_end": 21958, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "474dd71e52a6b633", "doc_id": "workflows/build/workers-api.md", "text": "If `retention` is not set, instance state is retained for the maximum retention period available on your account (3 days on the Workers Free plan, 30 days on the Workers Paid plan). Refer to the [retention limit](/workflows/reference/limits/) for more information.\n\nThe following example creates an instance that retains state for 1 day after success and 7 days after an error:\n\n```ts\nlet instance = await env.MY_WORKFLOW.create({\n\tid: myIdDefinedFromOtherSystem,\n\tparams: { hello: \"world\" },\n\tretention: {\n\t\tsuccessRetention: \"1 day\",\n\t\terrorRetention: \"7 days\",\n\t},\n});\n```\n\n## WorkflowInstance\n\nRepresents a specific instance of a Workflow, and provides methods to manage the instance.\n\n", "char_start": 21958, "char_end": 22648, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "71d453895c456f08", "doc_id": "workflows/build/workers-api.md", "text": "```ts\ndeclare abstract class WorkflowInstance {\n\tpublic id: string;\n\t/**\n\t * Pause the instance.\n\t */\n\tpublic pause(): Promise;\n\t/**\n\t * Resume the instance. If it is already running, an error will be thrown.\n\t */\n\tpublic resume(): Promise;\n\t/**\n\t * Terminate the instance. If it is errored, terminated or complete, an error will be thrown.\n\t */\n\tpublic terminate(options?: WorkflowInstanceTerminateOptions): Promise;\n\t/**\n\t * Restart the instance from the beginning, or from a specific step.\n\t */\n\tpublic restart(options?: WorkflowInstanceRestartOptions): Promise;\n\t/**\n\t * Returns the current status of the instance.\n\t */\n\tpublic status(): Promise;\n}\n```\n\n### id\n\nReturn the id of a Workflow.\n\n- id: string\n\n", "char_start": 22648, "char_end": 23411, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "4d174255134f1faa", "doc_id": "workflows/build/workers-api.md", "text": "### status\n\nReturn the status of a running Workflow instance.\n\n- status(): Promise<InstanceStatus>\n\n### pause\n\nPause a running Workflow instance.\n\n- pause(): Promise<void>\n\n### resume\n\nResume a paused Workflow instance.\n\n- resume(): Promise<void>\n\n### restart\n\nRestart a Workflow instance from the beginning, or from a specific step.\n\n- restart(options?: WorkflowInstanceRestartOptions): Promise<void>\n - `options` - optional properties that control from where the instance restarts.\n\n```ts\nlet instance = await env.MY_WORKFLOW.get(\"abc-123\");\n\n// Restart the instance from the beginning.\nawait instance.restart();\n\n", "char_start": 23411, "char_end": 24104, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "6c86cdb1b5323ffa", "doc_id": "workflows/build/workers-api.md", "text": "// Restart the instance from the step named \"aggregate\".\nawait instance.restart({ from: { name: \"aggregate\" } });\n\n// Restart the instance from the third call to a step named \"process\".\nawait instance.restart({ from: { name: \"process\", count: 3 } });\n```\n\nWhen restarting from a specific step, the cached results of every earlier step are reused, while the target step and any steps that follow it run again. The call throws an error if no step matching `from` is found in the instance's execution history.\n\n", "char_start": 24104, "char_end": 24612, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "a04db5934318ecad", "doc_id": "workflows/build/workers-api.md", "text": "#### WorkflowInstanceRestartOptions\n\n```ts\ninterface WorkflowInstanceRestartOptions {\n\t/**\n\t * The step to restart the instance from.\n\t * If omitted, the instance restarts from the beginning.\n\t */\n\tfrom?: {\n\t\t/**\n\t\t * The name of the step.\n\t\t */\n\t\tname: string;\n\t\t/**\n\t\t * The 1-based index of the step, used when multiple steps share the same name and type. Defaults to 1 (the first occurrence).\n\t\t */\n\t\tcount?: number;\n\t\t/**\n\t\t * The step type. Use this to disambiguate when the same name is shared across step types. Defaults to \"do\".\n\t\t */\n\t\ttype?: \"do\" | \"sleep\" | \"waitForEvent\";\n\t};\n}\n```\n\nThe `from` object identifies the step to restart from. Only `name` is required; `count` and `type` are only needed when the same step name appears more than once in the run.\n\n", "char_start": 24612, "char_end": 25384, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "978eb96b060020f2", "doc_id": "workflows/build/workers-api.md", "text": "- `name` - the name of the step.\n- `count` - the 1-based index of the step, used when multiple steps share the same name and type (for example, inside a loop). Defaults to `1` (the first occurrence). Corresponds to `step.count` in the [step context](/workflows/build/step-context/).\n- `type` - the step type (`\"do\"`, `\"sleep\"`, or `\"waitForEvent\"`). Defaults to `\"do\"`. Use this when the same name is shared across different step types.\n\n### terminate\n\nTerminate a Workflow instance.\n\n- terminate(options?: WorkflowInstanceTerminateOptions): Promise<void>\n - `options` - optional properties that control how the instance is terminated.\n\n```ts\nlet instance = await env.MY_WORKFLOW.get(\"abc-123\");\n\n// Terminate without running rollback handlers.\nawait instance.terminate();\n\n", "char_start": 25384, "char_end": 26178, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "aaddaec1bd758c69", "doc_id": "workflows/build/workers-api.md", "text": "// Run registered rollback handlers before terminating.\nawait instance.terminate({ rollback: true });\n```\n\nIf `rollback` is `true`, Workflows runs the rollback handlers registered by completed or eligible steps before the instance reaches the `terminated` state. Steps without rollback handlers are skipped.\n\n#### WorkflowInstanceTerminateOptions\n\n```ts\ninterface WorkflowInstanceTerminateOptions {\n\t/**\n\t * If true, run registered rollback handlers before terminating the instance.\n\t */\n\trollback?: boolean;\n}\n```\n\n### sendEvent\n\n[Send an event](/workflows/build/events-and-parameters/) to a running Workflow instance.\n\n", "char_start": 26178, "char_end": 26799, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "9d2015055b55b90e", "doc_id": "workflows/build/workers-api.md", "text": "- sendEvent(): Promise<void>- `options` - the event `type`\n (up to 100 characters [^1]) and `payload` to send to the Workflow instance.\n The `type` must match the `type` in the corresponding `waitForEvent` call in\n your Workflow.\n\nReturn `void` on success; throws an exception if the Workflow is not running or is an errored state.\n\n\n\n```ts\nexport default {\n\tasync fetch(req: Request, env: Env) {\n\t\tconst instanceId = new URL(req.url).searchParams.get(\"instanceId\");\n\t\tconst webhookPayload = await req.json();\n\n", "char_start": 26799, "char_end": 27360, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "7bad0ee2b3890511", "doc_id": "workflows/build/workers-api.md", "text": "\t\tlet instance = await env.MY_WORKFLOW.get(instanceId);\n\t\t// Send our event, with `type` matching the event type defined in\n\t\t// our step.waitForEvent call\n\t\tawait instance.sendEvent({\n\t\t\ttype: \"stripe-webhook\",\n\t\t\tpayload: webhookPayload,\n\t\t});\n\n\t\treturn Response.json({\n\t\t\tstatus: await instance.status(),\n\t\t});\n\t},\n};\n```\n\n\n\nYou can call `sendEvent` multiple times, setting the value of the `type` property to match the specific `waitForEvent` calls in your Workflow.\n\nThis allows you to wait for multiple events at once, or use `Promise.race` to wait for multiple events and allow the first event to progress the Workflow.\n\n### InstanceStatus\n\nDetails the status of a Workflow instance.\n\n", "char_start": 27360, "char_end": 28072, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "ef55328cfcb12b98", "doc_id": "workflows/build/workers-api.md", "text": "```ts\ntype InstanceStatus = {\n\tstatus:\n\t\t| \"queued\" // means that instance is waiting to be started (see concurrency limits)\n\t\t| \"running\"\n\t\t| \"paused\"\n\t\t| \"errored\"\n\t\t| \"terminated\" // user terminated the instance while it was running\n\t\t| \"complete\"\n\t\t| \"waiting\" // instance is hibernating and waiting for sleep or event to finish\n\t\t| \"waitingForPause\" // instance is finishing the current work to pause\n\t\t| \"unknown\";\n\terror?: {\n\t\tname: string;\n\t\tmessage: string;\n\t};\n\toutput?: unknown;\n\trollback: {\n\t\toutcome: \"complete\" | \"failed\";\n\t\terror: {\n\t\t\tname: string;\n\t\t\tmessage: string;\n\t\t} | null;\n\t} | null;\n};\n```\n\n", "char_start": 28072, "char_end": 28688, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "5f0cf0182993c375", "doc_id": "workflows/build/workers-api.md", "text": "If a Workflow enters rollback, the Workers API continues to report `status: \"running\"` for compatibility while the rollback is executing. After the instance reaches a terminal state, inspect `rollback` to determine whether compensating steps completed successfully or failed.\n\n[^1]: Match pattern: `^[a-zA-Z0-9_][a-zA-Z0-9-_]*$`\n", "char_start": 28688, "char_end": 29017, "metadata": {"title": "workers-api", "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", "format": "markdown", "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535"}} +{"chunk_id": "b573d77dd4c950fa", "doc_id": "workflows/get-started/guide.md", "text": "---\ntitle: Build your first Workflow\ndescription: Create and deploy your first Cloudflare Workflow with durable, multi-step execution on the Workers platform.\npcx_content_type: get-started\nsidebar:\n order: 1\nproducts:\n - workflows\n---\n\nimport {\n\tDetails,\n\tLinkCard,\n\tRender,\n\tPackageManagers,\n\tWranglerConfig,\n\tSteps,\n} from \"~/components\";\n\nWorkflows allow you to build durable, multi-step applications using the Workers platform. A Workflow can automatically retry, persist state, run for hours or days, and coordinate between third-party APIs.\n\n", "char_start": 0, "char_end": 550, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "5d422af059c2b563", "doc_id": "workflows/get-started/guide.md", "text": "You can build Workflows to post-process file uploads to [R2 object storage](/r2/), automate generation of [Workers AI](/workers-ai/) embeddings into a [Vectorize](/vectorize/) vector database, or to trigger user lifecycle emails using [Email Service](/email-service/).\n\n:::note\nThe term \"Durable Execution\" is widely used to describe this programming model.\n\n\"Durable\" describes the ability of the program to implicitly persist state without you having to manually write to an external store or serialize program state.\n:::\n\nIn this guide, you will create and deploy a Workflow that fetches data, pauses, and processes results.\n\n## Quick start\n\nIf you want to skip the steps and pull down the complete Workflow we are building in this guide, run:\n\n", "char_start": 550, "char_end": 1298, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "0b6171dcc96c121c", "doc_id": "workflows/get-started/guide.md", "text": "```sh\nnpm create cloudflare@latest workflows-starter -- --template \"cloudflare/workflows-starter\"\n```\n\nUse this option if you are familiar with Cloudflare Workers or want to explore the code first and learn the details later.\n\nFollow the steps below to learn how to build a Workflow from scratch.\n\n## Prerequisites\n\n\n\n## 1. Create a new Worker project\n\n\n\n1. Open a terminal and run the `create cloudflare` (C3) CLI tool to create your Worker project:\n\n \n\n \n\n", "char_start": 1298, "char_end": 2069, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "7a61b0fcaf3e6ef8", "doc_id": "workflows/get-started/guide.md", "text": "2. Move into your new project directory:\n\n ```sh\n cd my-workflow\n ```\n\n
\n\n In your project directory, C3 will have generated the following:\n - `wrangler.jsonc`: Your [Wrangler configuration file](/workers/wrangler/configuration/#sample-wrangler-configuration).\n - `src/index.ts`: A minimal Worker written in TypeScript.\n - `package.json`: A minimal Node dependencies configuration file.\n - `tsconfig.json`: TypeScript configuration.\n\n
\n\n
\n\n## 2. Write your Workflow\n\n\n\n1. Create a new file `src/workflow.ts`:\n\n ```ts title=\"src/workflow.ts\"\n import { WorkflowEntrypoint, WorkflowStep } from \"cloudflare:workers\";\n import type { WorkflowEvent } from \"cloudflare:workers\";\n\n", "char_start": 2069, "char_end": 2835, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "83a4374621f17737", "doc_id": "workflows/get-started/guide.md", "text": " type Params = { name?: string };\n type IPResponse = { result: { ipv4_cidrs: string[] } };\n\n export class MyWorkflow extends WorkflowEntrypoint {\n \tasync run(event: WorkflowEvent, step: WorkflowStep) {\n \t\tconst data = await step.do(\"fetch data\", async () => {\n \t\t\tconst response = await fetch(\n \t\t\t\t\"https://api.cloudflare.com/client/v4/ips\",\n \t\t\t);\n \t\t\treturn await response.json();\n \t\t});\n\n \t\tawait step.sleep(\"pause\", \"20 seconds\");\n\n \t\tconst result = await step.do(\n \t\t\t\"process data\",\n \t\t\t{ retries: { limit: 3, delay: \"5 seconds\", backoff: \"linear\" } },\n \t\t\tasync () => {\n \t\t\t\treturn {\n \t\t\t\t\tname: event.payload.name ?? \"World\",\n \t\t\t\t\tipCount: data.result.ipv4_cidrs.length,\n \t\t\t\t};\n \t\t\t},\n \t\t);\n\n", "char_start": 2835, "char_end": 3613, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "352e910644c82cee", "doc_id": "workflows/get-started/guide.md", "text": " \t\treturn result;\n \t}\n }\n ```\n\n A Workflow extends `WorkflowEntrypoint` and implements a `run` method. This code also passes in our `Params` type as a [type parameter](/workflows/build/events-and-parameters/) so that events that trigger our Workflow are typed.\n\n", "char_start": 3613, "char_end": 3885, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "8144f819a89a10e9", "doc_id": "workflows/get-started/guide.md", "text": " The [`step`](/workflows/build/workers-api/#step) object is the core of the Workflows API. It provides methods to define durable steps in your Workflow:\n - `step.do(name, callback)` - Executes code and persists the result. If the Workflow is interrupted or retried, it resumes from the last successful step rather than re-running completed work. The callback returns serializable data, including `ReadableStream` for large binary output in JavaScript Workflows.\n - `step.sleep(name, duration)` - Pauses the Workflow for a duration (for example, `\"10 seconds\"`, `\"1 hour\"`).\n\n If you return a stream, return a fresh, unlocked `ReadableStream`. BYOB streams and BYOB readers are not supported.\n\n", "char_start": 3885, "char_end": 4610, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "573e1387e124b88c", "doc_id": "workflows/get-started/guide.md", "text": " You can pass a [retry configuration](/workflows/build/sleeping-and-retrying/) to `step.do()` to customize how failures are handled. See the [full step API](/workflows/build/workers-api/#step) for stream requirements, limits, and additional methods like `sleepUntil` and `waitForEvent`.\n\n When deciding whether to break code into separate steps, ask yourself: \"Do I want all of this code to run again if just one part fails?\" Separate steps are ideal for operations like calling external APIs, querying databases, or reading files from storage - if a later step fails, your Workflow can retry from that point using data already fetched, avoiding redundant API calls or database queries.\n\n", "char_start": 4610, "char_end": 5302, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "8dd28ba8a0669bae", "doc_id": "workflows/get-started/guide.md", "text": " For more guidance on how to define your Workflow logic, refer to [Rules of Workflows](/workflows/build/rules-of-workflows/).\n\n\n\n## 3. Configure your Workflow\n\n\n\n1. Open `wrangler.jsonc`, which is your [Wrangler configuration file](/workers/wrangler/configuration/) for your Workers project and your Workflow, and add the `workflows` configuration:\n\n \n\n ```json title=\"wrangler.jsonc\"\n {\n \t\"$schema\": \"node_modules/wrangler/config-schema.json\",\n \t\"name\": \"my-workflow\",\n \t\"main\": \"src/index.ts\",\n \t\"compatibility_date\": \"$today\",\n \t\"observability\": {\n \t\t\"enabled\": true\n \t},\n \t\"workflows\": [\n \t\t{\n \t\t\t\"name\": \"my-workflow\",\n \t\t\t\"binding\": \"MY_WORKFLOW\",\n \t\t\t\"class_name\": \"MyWorkflow\"\n \t\t}\n \t]\n }\n ```\n\n \n\n", "char_start": 5302, "char_end": 6099, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "8843397ccea4d80e", "doc_id": "workflows/get-started/guide.md", "text": " The `class_name` must match your exported class, and `binding` is the variable name you use to access the Workflow in your code (like `env.MY_WORKFLOW`).\n\n If you want the same Workflow to run automatically on a recurring interval, add `schedules` to the Workflow definition:\n\n \n\n ```jsonc\n {\n \"$schema\": \"node_modules/wrangler/config-schema.json\",\n \"name\": \"my-workflow\",\n \"main\": \"src/index.ts\",\n \"compatibility_date\": \"$today\",\n \"workflows\": [\n {\n \"name\": \"my-workflow\",\n \"binding\": \"MY_WORKFLOW\",\n \"class_name\": \"MyWorkflow\",\n \"schedules\": [\"0 * * * *\"]\n }\n ]\n }\n ```\n\n \n\n", "char_start": 6099, "char_end": 6813, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "7d297d3236c04669", "doc_id": "workflows/get-started/guide.md", "text": " Each matching cron expression creates a new Workflow instance automatically, so you do not need top-level `triggers.crons` and a separate `scheduled` handler for Workflow-specific recurring runs.\n\n Scheduled instances include the matching cron expression and scheduled trigger time on `event.schedule`.\n\n Use the latest Wrangler release when configuring Workflow schedules. If your local Wrangler schema does not recognize `schedules` yet, update Wrangler before deploying.\n\n You can also access [bindings](/workers/runtime-apis/bindings/) (such as [KV](/kv/), [R2](/r2/), or [D1](/d1/)) via `this.env` within your Workflow. For more information on bindings within Workers, refer to [Bindings (env)](/workers/runtime-apis/bindings/).\n\n2. Now, generate types for your bindings:\n\n", "char_start": 6813, "char_end": 7604, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "698677964935b0a9", "doc_id": "workflows/get-started/guide.md", "text": " ```sh\n npx wrangler types\n ```\n\n This creates a `worker-configuration.d.ts` file with the `Env` type that includes your `MY_WORKFLOW` binding.\n\n\n\n## 4. Write your API\n\nNow, you'll need a place to call your Workflow.\n\n\n\n1. Replace `src/index.ts` with a [fetch handler](/workers/runtime-apis/handlers/fetch/) to start and check Workflow instances:\n\n ```ts title=\"src/index.ts\"\n export { MyWorkflow } from \"./workflow\";\n\n export default {\n \tasync fetch(request: Request, env: Env): Promise {\n \t\tconst url = new URL(request.url);\n \t\tconst instanceId = url.searchParams.get(\"instanceId\");\n\n \t\tif (instanceId) {\n \t\t\tconst instance = await env.MY_WORKFLOW.get(instanceId);\n \t\t\treturn Response.json(await instance.status());\n \t\t}\n\n", "char_start": 7604, "char_end": 8381, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "29433ab605547ef2", "doc_id": "workflows/get-started/guide.md", "text": " \t\tconst instance = await env.MY_WORKFLOW.create();\n \t\treturn Response.json({ instanceId: instance.id });\n \t},\n } satisfies ExportedHandler;\n ```\n\n\n\n## 5. Develop locally\n\n\n\n1. Start a local development server:\n\n ```sh\n npx wrangler dev\n ```\n\n2. To start a Workflow instance, open a new terminal window and run:\n\n ```sh\n curl http://localhost:8787\n ```\n\n An `instanceId` will be automatically generated:\n\n ```json output\n { \"instanceId\": \"abc-123-def\" }\n ```\n\n3. Check the status using the returned `instanceId`:\n\n ```sh\n curl \"http://localhost:8787?instanceId=abc-123-def\"\n ```\n\n The Workflow will progress through its steps. After about 20 seconds (the sleep duration), it will complete.\n\n\n\n## 6. Deploy your Workflow\n\n\n\n", "char_start": 8381, "char_end": 9177, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "08951bd97f159c5a", "doc_id": "workflows/get-started/guide.md", "text": "1. Deploy your Workflow:\n\n ```sh\n npx wrangler deploy\n ```\n\n Test in production using the same curl commands against your deployed URL. You can also [trigger a workflow instance](/workflows/build/trigger-workflows/) in production via Workers, Wrangler, or the Cloudflare dashboard.\n\n Once deployed, you can also inspect Workflow instances with the CLI:\n\n ```sh\n npx wrangler workflows instances describe my-workflow latest\n ```\n\n", "char_start": 9177, "char_end": 9622, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "2831e2a63dfaedf4", "doc_id": "workflows/get-started/guide.md", "text": " The output of `instances describe` shows:\n - The status (success, failure, running) of each step\n - Any state emitted by the step. For streamed output, the CLI shows a preview or summary instead of the full contents.\n - Any `sleep` state, including when the Workflow will wake up\n - Retries associated with each step\n - Errors, including exception messages\n\n\n\n## Learn more\n\n\n\n\n\n", "char_start": 9622, "char_end": 10351, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "8259bf9f8ffc5b0d", "doc_id": "workflows/get-started/guide.md", "text": "\n\n\n", "char_start": 10351, "char_end": 10650, "metadata": {"title": "guide", "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", "format": "markdown", "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3"}} +{"chunk_id": "6e1a3ac78c555d19", "doc_id": "workflows/index.md", "text": "---\ntitle: Cloudflare Workflows\ndescription: Build durable, multi-step applications on Cloudflare Workers that automatically retry and persist state.\norder: 0\npcx_content_type: overview\nsidebar:\n order: 1\nhead:\n - tag: title\n content: Overview\nproducts:\n - workflows\n---\n\nimport { AnimatedWorkflowDiagram, CardGrid, Description, Feature, Flex, LinkTitleCard, Plan, RelatedProduct, Tabs, TabItem, LinkButton } from \"~/components\"\n\n\n\nBuild durable multi-step applications on Cloudflare Workers with Workflows.\n\n\n\n\n\nWith Workflows, you can build applications that chain together multiple steps, automatically retry failed tasks,\nand persist state for minutes, hours, or even weeks - with no infrastructure to manage.\n\n", "char_start": 0, "char_end": 775, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workflows/index.md", "format": "markdown", "raw_hash": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297"}} +{"chunk_id": "d77463361d3d956b", "doc_id": "workflows/index.md", "text": "Use Workflows to build reliable AI applications, process data pipelines, manage user lifecycle with automated emails and trial expirations, and implement human-in-the-loop approval systems.\n\n\n
\n\n\n\n
\n
\n\n**Workflows give you:**\n\n", "char_start": 775, "char_end": 1497, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workflows/index.md", "format": "markdown", "raw_hash": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297"}} +{"chunk_id": "2647065cc12a85a0", "doc_id": "workflows/index.md", "text": "- Durable multi-step execution without timeouts\n- The ability to pause for external events or approvals\n- Automatic retries and error handling\n- Built-in observability and debugging\n\n
\n
\n\n## Example\n\nAn image processing workflow that fetches from R2, generates an AI description, waits for approval, then publishes:\n\n```ts\nexport class ImageProcessingWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\tconst imageData = await step.do('fetch image', async () => {\n\t\t\tconst object = await this.env.BUCKET.get(event.payload.imageKey);\n\t\t\treturn await object.arrayBuffer();\n\t\t});\n\n", "char_start": 1497, "char_end": 2129, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workflows/index.md", "format": "markdown", "raw_hash": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297"}} +{"chunk_id": "deb5aa33e5d657aa", "doc_id": "workflows/index.md", "text": "\t\tconst description = await step.do('generate description', async () => {\n\t\t\tconst imageArray = Array.from(new Uint8Array(imageData));\n\t\t\treturn await this.env.AI.run('@cf/llava-hf/llava-1.5-7b-hf', {\n\t\t\t\timage: imageArray,\n\t\t\t\tprompt: 'Describe this image in one sentence',\n\t\t\t\tmax_tokens: 50,\n\t\t\t});\n\t\t});\n\n\t\tawait step.waitForEvent('await approval', {\n\t\t\tevent: 'approved',\n\t\t\ttimeout: '24 hours',\n\t\t});\n\n\t\tawait step.do('publish', async () => {\n\t\t\tawait this.env.BUCKET.put(`public/${event.payload.imageKey}`, imageData);\n\t\t});\n\t}\n}\n```\n\n\n\tGet started\n\n\n\tBrowse the examples\n\n\n***\n\n", "char_start": 2129, "char_end": 2850, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workflows/index.md", "format": "markdown", "raw_hash": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297"}} +{"chunk_id": "85da1510bf9f7609", "doc_id": "workflows/index.md", "text": "## Features\n\n\n\nBreak complex operations into durable steps with automatic retries and error handling.\n\n\n\n\n\nPause workflows for seconds, hours, or days with `step.sleep()` and `step.sleepUntil()`.\n\n\n\n\n\nWait for webhooks, user input, or external system responses before continuing execution.\n\n\n\n\n\n", "char_start": 2850, "char_end": 3604, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workflows/index.md", "format": "markdown", "raw_hash": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297"}} +{"chunk_id": "f886545a90bc59b2", "doc_id": "workflows/index.md", "text": "Trigger, pause, resume, and terminate workflow instances programmatically or via API.\n\n\n\n***\n\n## Related products\n\n\n\nBuild serverless applications and deploy instantly across the globe for exceptional performance, reliability, and scale.\n\n\n\n\n\n\nDeploy dynamic front-end applications in record time.\n\n\n\n\n***\n\n## More resources\n\n\n\n\nLearn more about how Workflows is priced.\n\n\n", "char_start": 3604, "char_end": 4263, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workflows/index.md", "format": "markdown", "raw_hash": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297"}} +{"chunk_id": "535ce805e6c5c611", "doc_id": "workflows/index.md", "text": "\nLearn more about Workflow limits, and how to work within them.\n\n\n\nLearn more about the storage and database options you can build on with Workers.\n\n\n\nConnect with the Workers community on Discord to ask questions, show what you are building, and discuss the platform with other developers.\n\n\n", "char_start": 4263, "char_end": 4877, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workflows/index.md", "format": "markdown", "raw_hash": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297"}} +{"chunk_id": "b9c21fa9df810d6a", "doc_id": "workflows/index.md", "text": "\nFollow @CloudflareDev on Twitter to learn about product announcements, and what is new in Cloudflare Developer Platform.\n\n\n\n", "char_start": 4877, "char_end": 5115, "metadata": {"title": "index", "path": "/data/corpora/cloudflare-state-v1/files/workflows/index.md", "format": "markdown", "raw_hash": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297"}} diff --git a/assets/seed/v2/indexes/cloudflare-state-structural-v1/embeddings.npz b/assets/seed/v2/indexes/cloudflare-state-structural-v1/embeddings.npz new file mode 100644 index 0000000000000000000000000000000000000000..9fed801d39d7a5d824b1c64b7557d50fb3c884cb GIT binary patch literal 859724 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 z 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
+hK_;H1@x7fY3)lw7FTQ^~!z%J(Li!iX<;6rS< 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

oK&@G%#A`EnJX`v)cm&^wh^d^Rp<)lNmifq|& z3eMzL)47|bao~hBlZ=(;;Dco{32<8lJ1?|zhC6L|z%yXJ{Fh2of2464-uJa)GKna4 zHk;%R&w)v*rR3o*E(@f%8(YTG@p~ZWMOH4Q3#yUzx?4yzgR5cHvrSmdame(xPc(I@ zIY!P_PQ*cYKm|3z*<%udV0QkSiHC9|9?+NJ+@$4TekKdd&yBErj}(YIu$2yuhJ)T! zOK9C=Ne_;7vOm1~SkeA%Wcy8F{^7MT?Bm*W%vg{BQ=&c*g@AmlbP1>bdAPHi`aCdO zsga&bpO0#$La8@LTF;wz}smqa|*M`4ivKwY#j)R*d8Le)OmI&dJy?Y=X9KOF%U#f@WRz z!-?Pvo8IMskN-Ys*s==D8k5LnZwASz75lth1WkIAVcW+Q%!bLbkloftP~ zWQ$_Wxku!iKs~Vz(g6{?!5TEhL&aH^Ow`r|k00J(IJA}c2q*LECI-=s4@5AbycPl! zBeB5o7~w7Cv%BS-VLmy6PT{%4%-|vU_S75Pe{fk$lLmG&J|x%7yWolUckuS_B~o&w z*xi+jDdi)evB-@KvD#p_zg)cW!%`4f)<|FEy3stDCuBh7G8Zv>K^J~VB|R%tU`NnB z`Z-e?=XKnp`%aBRL2D_yv_6np?)*fuMC!3A^*HVL{E;l*8U!90>2%!Bi3IS2G2>|? zX2ykr`ORqf#(C1NJv;(Rmk-1Gx36irb338j8Z&e>2(n@|u{X$!R`?++~|u^;nk&*w3w zZOuONf6jEu#3$_R^D(tM(=PL@rn|AGhvHCoxgEHl;hd4}eeA;Hvdnl(DLeFO7ctMN zAYYtrQNxjVR?YeXdu&cS9Iu-}zpv{ek8+|(#ou}u_HiI-d7nr?nIXGyXBdrNZH4Pj z3GlOLh?7S?ZS3sti#VQ|FGy;HkxR|RFsYI2VY>9w(RUNrFpeukY>t7e&;yf2*VXW@ z;|Ta}c1NACrI@g8EW+rQEPO8s!KL4;$Yt&vm+bieI6ZbR2sGpRUO=39CwJMIh zwMIqAU~3j>G5fyAldYo4bo7G`bbe{4mb(S`F24*pFOe(}WNm9Fc)f)*B^8|7s>bol zrqP|fN#wSi3O@V&gS#W0iN50#u{}B)6L#OiXZM4NPyR+`Ad-9d*qZ;6^@?6hubGF@ zTlwc{+4o?!efl!^7XF;9EeQYtPeGiydLQP^sD=_>V76}9f?d55V7%-FY*KQetL_N# zjRc-kQGs7nG+G(+E=aRPDu8i3dmV01{mD$%e8aBqSw_~0xZ&y#a=@D^%Kz*)KwJKl zfK^Wm-E-<3ac=d3G(#zzyDS7#PxFXP+!{3Um4{u2=D@&N6TDb;9$#t<($FnsDF4Ns z9J6G}sgL_Bvh9ZGg$sLNKIhi?F~BDqm%kuQ0nS)`vlT*nA|Uy82)W>A2(`X%N#T-O z+S$wCP7L9TJ`pOV`JJFqSldL6Wd&AII?-$iQA4o)`Jelx6b>!WQ)gaJui&?|^ z)!4mtg{b;qW?b|J>C4^76n%Y8UmcmlJnuIL`ZykEOwvL7@NRli!!b+#v6KB^%1X(@);od@T% zl~Ct$iNrU`v+KVU!$v(nEH@5@y7nm0@a03|j}S&>X%d(#^GS#IDc*Po$JNv6L{_;R z-Y{x7{nBE*J$9E_TDb(BFI>m2->=E~i3}7-Or@Sihe7zaDsDQgf%NbOz@kZ}Kb!6F zN4FlDXAF?k7s)g-nuq#NY~iWbbv9{T9haRcrt#h!+aQ5sk_zavM=zF>?IE{Gg6seq zOnik-7S$m2WFJg04khjhvLGj%K!W4fv7V}zaQT7?h;?nIFZth4FHH}6)RQ3XRu@ry zc%Ke63gCYi`c2xiE2-euP&~EH2z_m~;gh{WusrcJYd$R**bZ^;0I6KD> zk2?;TO#H3Hx1L`Co>`om<^2W-%^YPFmVc)cq*IB@rv?1+W0KTJ{SL96K19sEpCOxv zTA0lrHbb(q3@o`?0IlaWQC7hV7>?7i?=r_|`Y-_$O4RZBn{^n%jej0KgsS% zNwEL!HqhU68zg;V@s8GBG>ulIw`{*NEknzA^WKFryUe@T$~WiOt>qFhfA1L-*vZ|6 z7Pvy?qHmBOUxIUVwV?HGJDc}e?e4u{NkfakKXRT;4>0X zTFj2zKa4}12fnVSo$KJe;kY@wOtiwf81LR9#&cyZgg($AlaC4D*1zh+$}$ip_;T*7 zlU-E*SRJ{2QygO>Ka%}*A zdymj^Ed_W}8vsp)Vzj0F1--@PK}WwufR>#lq% z5~ImBb*wFG3EpO5q~~2r?K7*j5FNG)rRX&f7Mz47Gh|_TX(XBn715h_wbkE-_Hyjl)$H(eDUJkYpnVQ zB|Nf!EvOt-At6}~Ou>X(;O8O@dxm_;-JXNE%*RZ z9EWbX@rY-CXNpUL6~WhEVRLw_6F!* zH3M>*o|45|LqSse5t%O{L)tPf&?Jthv~~A>C~-+eoq{spPj*G4$eHNj8T~(s&cmO} zw~OPlsgzZkBuZtc@V&1?ic&-&ztS=?LZuyL?-epaGLw~3q`0qxQe-vJFhZpyN;{>V z`}qfYMe)7PIiJt_O+SC@qI@<}F)({JaZ*P1K*d4y-_r!jRritkFvi$_tHDv@X%IXr z3*#O^1STosuZ%Zf_&St857)bdh^|i(s~zHb^)HQz8AQMAbnSDmq))u`8iy zEfNVlKX(%UF9%v}qQD3*Q?u>?>j{9U={>(EZb7a zdGP-%)RmBHys}xtbcV}Ro@DDg&{k_Bs|8b`X16i>@UjkM;8qy_@Bwml?o-ic=0N8; z;)8Std|_CIQQdwhSrbIuw67xn$ffFeYlO&w$HBxVtcM)P-ht}<|KYUbl(VV%;Lg-` za-RFh12wH`4&o&h4`ovJbQPmz z(D|YVx0Yv-YH3mODkXymS!A%{XA{AO^QO9gS%EuJL@~>BHp6+AK>-aU?lS3HK? zp1lP+ZbqQ;t#Zz1CXPL)meVi04}s5t07wtGO7gz9;A}xnYVl|?NJ>cHNmWzg=4%aM z3Ve)^UN~thnvX}PrI4NuX*5-i#FT^;=nvaq)mKZ-5tz;Oir2%fwb|s`op3l2qK&_r z3!$TJHfZ_O)7y{7K|xxUDi%j$QGPkq-?xEgzRANX-Ji@}VFy<7RcZB`r7_s%7fo+% zo=+`2j>A&6fqScmlxN#(oxVal+<%gLl z4eLR_j}JS>XX1pT9Rw|FBz6-bxWm+rSKM`rYMmBl+l-E*PUufEE?7kDiZ;VD!K?6V zyA5QnC_wH{HBjxTp!41B!6)$->&TygCAT>?+!ssWUmt^psu{2}aSEm$$!0d)%p`s_ zh1hn3>zp`eL%N*-D5wM7KB_}@%iIEy?*}PX9YXzSd-QK?Yhxi=FKRTo6IF;`B zNRzmkp$`~v9p!mjEru(!f zZJJ!d7^5EZE z+%aHEk1lw^Ua<0K{97n}IV*zBI3NSNC$(aMrXqagG6qY(-eVs7hm*9Kc0h#`pe6ny zd3!g9^KWRSVmQQ&M;a73{3ACV8+JI;G6s`bkHl}X7E0o znN~`7>is3+6$E##NF$wZn+fiAMX$vJki^{&;mSd_L#PUsOZSj6y+`O4I30@rEu`!T zL3BwRB0YNt=(LL|py+Ll^*iz)bK3=05QOl9+I1?mNr(8oZ$$HzyD`qLMKpP&3^tS` zlCvkDkdh6$@aya)=v5AXw*7Dq?h!dDtO{RKO3DxLv2#&t15-{V;rJ3L-+eSK0kOt<>1G z2$SVS@XhfPly#Ax@Z&8xnvo`yu*Df zwZt)IHVky_z-1-UP+mU^i2P9|y)u_`9{OPIyemXlt+1+gstt@>5dia{3v|;RS!ga0 zFfc=XoDq2zEj2getlfFcouVLoRNz9Y7f#TuxmSTbS4$UhT}1<-jof?bA{A$q*wrTU zL1)`{V%%;)&B+{`x5^}7+B^>0>y0Elde^CS#=&%F*`}w@O_eCoCMBF ziy+r-n1-&U*w42Ji`@Q$+Er_)kw7?ve4AHJ`JH%ED)Y(kQjXhG+dy+3sNy2-_u{f$ z9Me2Tf#YlGvG0YSK)lQp(k=I?S}TDI@qP1yBigg8WqQh3YaJ!F|JHWUZ{!iT3kR@o zwYa}wiqh%o1lp;1>e9-a`a#X zOw}kRZOaQ}4Ip@-6MeDijT?9V-oJaU}-6u+80W|k@SatQB>G*s?3!eR+ zgEjlI$s#9XdO_k0)t=%7(sC=9=HwID^7jV`GL3-PdVf&lJkp@&i7V@hXxR)td|RCY zCI08>mLrlVv)C55AIl=olg|>LO+0o^PXPKGHt9Lt7N6G8dbJa3*Us(mK8{}%nWY@qyo&fRIO=PDZE@R@;FW~0xwN&^h z52Jdn(q8Ms*lBu}Xw=2wJIZ~=obdyT6t4GXZ^=}35L*8AiT1e&Vd=q;~Mw5&t=jBgy1-BTgW>K%PwCY1&+`@;SZ+eLhqDAu^l z>4h+E9@J1>Kwd7pPK$kSkXO_8u)dsAC&o1QX3wc<06H;{57o?yp^MaZw2(C3-3M#u z}P}W+*tnVx%n%5=CZ%qlVXThM!&_K1->t1wH{Z8GthM}Z< z3GsS&3&`szdUV<)@<%ojD_o!8V&^;f+;%efnitbng9> z>VJmdyGRQHwkeRUgNa}|^%BTk%LI+OAd-4e8CRy6;Z!je`Lf$dY^4R=;d>d^Zs&F> zAEq!Pj+fw*t}-5DD!4uR9(wWoEY_nqg<31lrB8OoVf&kC6xVxSrT1+y#x`t1>vchq zZOhu}lOFCi>D-BDZ@q;2pN@2uhDx=Q>3MDsT1KvZat7~v6!@xV<3syZpyGRgI9Q%! zHq1VOlLwKD8$etDf-@h?nvbPv+E_7ux zjN|Epd)zG{I}E#id&0drYq3<#mbPuVM{Ct`u(Fuz951>L3iS_Z-EEdG;Rw>+(#m-B zR%rDR{(5paUXa%$HwkM;=VOKJ>*|JX6UNxG=iz-x5ZQK0qkK&&_cL93 zkg(@Y(dMCPpsBwQKWj=d)yB#|e7m4t=N_YYE&+PD8}*i+VO;-oHMHLDp&?fukdZlC zK;0k!&d-m6u|#cj|4+K6$IKS@85zPM@|ESR6WBYk7%Y#R2Zizl%*AF&7@tzX%5x5} zn383<<4_^>86P0y?hY8{Z;4*0jbGiSlZLHfFmNJ=9{#lwTeo@;wG|=oALn_zlATO{ zPwjv`?x950OPlgZWI@Q3a;kMx8N2NG@ZzgsdhCc5jpOIO?(n|q!yYdfiD}k2>s&hO zo|q4Jn$szNcP@FszZ+ikttL;`h=8NcQ`Gy&q8wq+N za9vuDO|MD#x%6srTOQPT?1eO^FJ$6(DbxEe6--vi!QY9C%!AMYcF`$HT92XWIGNqSlKF8W&Mfl=W>NGl1&l8pkaQKMzRu{W4$5Ne;M3^<=CL_#Q1AhqWmrs z^uEx8p_%3wGrxn_X6g|04eH< zNW~ND3t7K^f0z?fZHY)-9L?DCinJb@99ghexVmmZFRd88LjK##WkDLQ!GUc;c&#%Q z0w?dI9kdq%D&@(n$VQCQ)-c$eu83v)9ti5EBh=9L9x!~5tdaJP5{5$`+! z9o$26erW@Jy?q7=Soj~*J8uPt#VbgxVi9|6Pd>a{Fc(TfelptP0&wAQ7<+|P1QFpG z^xdpCMV zlm;)x9)5TFVN)+TIGA_OhfCx`pM@jtgdZ)Ryzsz1RX!Gw1eD~tF&L7%d`mZB}%lKcJ@!LdGc}^2L3mfqvs{Wjard1Snp$+*+e5I*jbq{&{J(L!<~9@b%)BixO>zTy&@cgKl-+Wv}4 zTwM;`BbTTpH}i_W@&Tb1PaHP3K))Lz5NykNo=VT)Zu>Xbq`i>bXbGW{c5n7DSY zpUVq{|KRpd!Zlqhqsfwy0kHf~M}}{kz>=q%(ct_h>|0_0Ds7LjeoX|bJE$0Ro2HVu zgh6ii*rEUTqc2TRS%9l2W{|DBF2krZKQM15*nKVuxc5<GEIZM);w6E#!4^y^vuGs4y|42KIL3=ZbPTGHICT3ANXZ3Dy z`m*`AbD0HgWe_^Z^@&!9kr6I|uND|XO?R%sA7xS;6Ko#-SSt_eLyIUisRhkiVc1(0 zf<@?=l&Mo9d*By!Qsd-cVWJ$LQVLZrKEo%Kp)`e^j#`14 z;P_-I_8CNjmXHc-&+%^O><9pNX?e!)L=OqBZz00NHfh#vhY<$H> z8c*?aJ&Hp1UE6c2;qChLQciHhoe9Ir_rxzTgs zp%}sZK4DmBpa{1szml5oJ=~qMlH(*7bDw9F#?8A8YA@arkB(NZkCi|c%BeHzQ~!{o ze{^|#@809N)z_-GIXW>}U!zb(?FtrHWHK2W1wdFni6$;rfNxQo(fa#2UT{|@@lkUE z@2}Gg>a?Ws1-~hI?_xog+Kb>3-ZHYM-x_^gY@zt_MYJ`S!hw+r#&|HDstwJ@;9HfX z!R{0}w&^0iSe;Hk%(#ycP2KD}mDd>T;=-yGb+Wf-*P+&eQTTj40t$xr!1?rNi72{l{XWAl|T-8k<-` zUW6*}fd^=qWT3syuj=KT*RQ)-(m+#y>&EpgCrqR?E>}Ox(zXZqZaW`UOIJ~tGygR$-lhu`+j2N}Whyn@8%!@8wPZ$)J3!RN1iAqZVDOVCI1h^O zOvVz_)hwiYOtjEy@EQB~q&xxsKXilC1X+?Gj^0^u_@Ge&g1Eh!d#4eearprSigLuj zPz?G#ezJeNQrJL&6mq0SjhS90#O@t4VfjKu;gsB3qSLt$Oh+wnRrv)hEXah@(`Ny% zzm(2#oJ1xsBUrm!qozri;>s8`D*MKrUfPh4Q#y}eYKZ_9FQ^6`hcnu;6W%UzDw1! zMPZ6JK=ZRxu*ZB3t=GE*k`vXWwd_0zHM4?`;)iI4m@ZUDZU=*AH*C&H!yzeYeBCz< zcZ9j)bIUcLn`!|2PB}qj%uk}ZWidIL!EYdSF`wv<+@mVtaoBN~yMGJogVl!RxV)}_ zlqiOPSK>KP(HJC$&j^6nSp2pjLmvt><3aH8@# z4^HUgw2fh8?uHI{y8RRus*cc8eXNz~t|r?&(KY`pbQE#3 z?4k_ZoYnxNvnp6VvtW+h>PkmmY$8mSHLiUz85ie;K>6JnG&6jhiCjmSwQnc0y({cd z>t+drCngaSJ%r7hJF1u86(H|Ur?JE3{%~fJs|i{kYtTHqDdkb^b;NhUecp+N0PL5JfVYc{@sXJs1&>sylXL}H zi+yZb$4Ln98Y2J1(caq3l%LQ(Z&i;<>$=_juK*8>gT( z{~iWgJs|HjW0<*jCxgT}c{p(507fsLfF9d}IPP4@w$*;1Y5VyJPYtRQv4u|d2q!VR z1;qEA8RrI0gTGc>UUZH$JjyCzr@y$*>PFc^)7DRnfBzSO;IHbLRQ}~-j1=<*g*^f2EB=JUzjLDh z{R^Zm9D`z2RWI>Ke?s_*;!)&LLX}YE4P2o95f8r&Lp`1-?i<{SCvt_5t4@NnQxmWC zR37}R{X>Rs^s~?T5{ZZDO_X<&M==#EeDrh|HGkYjF5c0=KgxY1A$u9F(Et=YYKV^- zEnzK{0(*^=>hm88A$j*(UP(qDdKfp;1AXUljaezYQ; zs9PAWZH=S%_4w&K*PYO!`-fZ#O`t0{7QDUC99aI>o?ENL!MOK##*~>0OWj%--gFVJ zLvKz7T3d+dj=M~J!C^2ltz)+tZijX9J5V7$3ZPb^CM-RTzFOQtg{q>dooOQ}ku%^p z;}3BAmJ4X~?i*$u5yws4C3KCq{8or@J`+jz_nc!SBhtXXcpM$-ZdNa-|3ybvJSKu7o4CK*oX9zU+iBJ@jyE4x zhpRaj$6BQ@j;HBO78q!OQS~9XnH&wya^bKheE7v(2g~Ypa27)AC3|%_%nFLJr8R7$shsJ2*G)2RQAQMlP!Uq@Gr1@g6n8 z*|-Z1gx{nO++v}oAPTNs&!;vnRb+qE7!<0^2bdQ@H*x&z$<77z1()%69IYbp`ZK84 zQVI5cv;fI@>WjK^3~nr52toexBs6-I{@$_R#)#lYCQ{Ocz2qbWMDQMM$~{X@y!IpO zt}mu?S@TK9$!_ese~uajG_Z!oxun4=7K8WgqSIg1)7kQz_w3AX>frF0{C+ZrIkuVG zjeLtBHJR_|oYz}1yTBW^x&@(;)m>8Z`~{=08c){D{6fhVS19WjfoD(F!Tk~LEij%! z?!Eg-%Au%TFz8n_GTR48@5|#vOJz2EUoQ-OgSn^}kp#<~9C;*I4j(8zO-W`rpBS=lVeP?@mUgO$=!@9ev|U;we<3rViKJDlf3#7g?B~&L!n*Q z(Nq3B2gH1Bsrwo*v|Uf8btt3EzBqiSoQa2wC(+F%q8L76gUf0P81FE? zny+dF@Mza>vN1Y|-1qrPHgCO5&wQ9q*7K{w_Cps?&%u)JbH768$#%jq(G_s7Y$?su zNuyQq94ksU8Rm>GBVN;U(BsApB3Chw)|}?AdBUeo&#t_Twms{){ZRvHT*8k~JPSPo zn`t`x6Y6`4pug-et3GuenEnwWGvoLmVYU|v><@?I2_Bp;a`g2M2iF7*%ZZUZ+wK4%y>|HTMtJa)5r{MEhzl-9i1lH=$4rK^ti$n{+{(eOtXapqpf7k#2|4wp447*oM{QgX1)<_7URTg2LM zT;yG|mSTo?68Lj(yG+CTtlQfrF@*?Kx~R*8BzDB%tep42NdJJTimJHXG8%MusNti8 z-!!Q3I!IXAn3KZi4`+R&1}| zN7vbCGs~~(!COBSBK-O#`B$h1{Edr<(q2s(w_T;mbaWfe*clD8Hh6>GH7<)1+{t{l zyN~wng>>4{6w3X`-~;L(zw#3IEWyS6^1i-WIlY|2>Ly|Rv)8*r?Y*nDuDuY*?B zqI9O^dgx0RFgUH0!*O2g8MT>D@pI2^`XT%XS$*~#94U#1dk@4(+oXeJ)`~!EOgc{3 zCDp+C=dn>4l&V?!GU=aXXol|{d^-6YU8EcdzXu=Df?M`*Ga{MmQmjK)t4yMQT?O&f z44i5Tc<5&|zPx{!e7I(VkJkSOB3o9$g3NLH>)(FVb9bYOjrY*%&2otUYDNNd4q@gn zA7rYnWG1XvGjNqZ$~xHsQ*77akit>CQcwvux+L+=)d|+r_c^_gv>jr;TfvoBJzQY- zjfN^Klj_x9^`A*9qw?%e^v7IdOamtbn=o8&eTF{!&`x952?AMTL5I#I$&~Q?cv)5EHfA654M+g+=v&^s;0MT@e56GP=pd!k&&;R2N)CQm#otmBmUN z`MHL?&?=(1-G^qYpMama+2o7Oe>7!P_<^G?LQ9 zXUcq3*EpT{i+4~Z<4|&{(i)Ii#$_ahYJ4xfWGA^#LCw^1&>4^i9=|>Nd`A%7XCiE% z(_jv7)Dy}3(?g`qbsH|R9CY;ZoIh5VE>TldD8)-rceVk;fdTe{3Oaq!aW> zg&uRlyBKJ55ZH*?17D{w*pfFDDJ;U%5!>1;?q`O+Rw56S2&+W7joW?TsrI6H_V*P(0YZ( zG(WomRdX`nnVW_mlzh7u#v*Dc*Wuz%}(A= zugzMF9%Dgt=`tnQnKK0MKhLE4lY?kf)lu+toCG-q+AwF$Md}-3Oj^96nD#CUqTpwU zeFbOP=^le@ubLY@wciG%Y(lAyn=A4*y(0btFUd*_O+YeHLu}Y^7t6tWYYJK2pS(a)1d)(7HQGqJ-exD zdKD;t=fU5N*5r=_ABf+#$2XIIv+}cVko|HR*kxuyytZ8>6Lyg>OK}!?t(V9Qxn6`d z51mQs&$HDl?noQ-yy8CRB!svf{Q%kNm`J;h{-kp+U%|f`n+S)6XYO*n(9LKI>0Ach zW=9h4yWWp}-hb&X+bN(mPm}1M)x$7D5rZX-{06J4*3wP-wxG4$8FkLh#S8wQ$qN5y zIDEO65gdI;kBSyk*ZO!gUvmb&e0@L^ep-=?^XE|a^gcW$bC>sNzAnyM|CR8orqh#> zt8woP3Gj5<4eRPlXhUNZEmha$HJEHC1LmQaIkB3o-L(K`pWDE3TxNj5j9}RL`!LCo zyM}rB!MOI%Nvbsc2D7C>h^!Bo1yv6p(&76mIO;h_H2<|nwr|YmT$0@cG7e#B(lqGu z6vc?vvvm8Rso28ZF%48Uv3i03$g4>W)Ok|{`J!IQY~ON`eW1p5C3K5;kJuN~2$AD|D#5kB4exLGL%zN~j~)(k9J_vksu{;nr@9mLr;`Yg z2nuEE=59vvGJ}5L*z_BM)4*-;6RcC$fvD#X$fwtlG{ZidZdf+KY_y}~zDXHzNNL1- znyJK7P7@wf%HI?>J;M3L3$X0>eR^V26pGK8L`R3jF!`}Ah%M)GwRei~dmbM;?mGst z!@jV-uYq+x9|P;(T_H0eoYDiISmmpa7|nDZddZi-hk->fl)wGvGYO92erk-Ol0Fu1 z;Dgp!7ySI>3@m)jz5ALfKzOAj4!%_feaG9B3uwT{&?3AvEKu`inF#TEs|r%9FIQ`= zb>cXQ(63JJqU?OPn3qQ^uXWq&DM+28yKtseGvKBW$p-U2qB^nU+rWBVOVe#SZU36j2 zVSJ>0ha4T83$;(2@s^kjn5Sp4ic9zmnxc})F-wkDV$J0{OJ>wuex(mtsSBv)R&gL- zjrt;5qO!NRx^NXn{BXC_BlCUvJ}m? zOG47V4;X4ah~@p)K)!UCZW2=fwQ*Gp*2}4`OnuFWxjNEWFCIX#*HmndGeI+VbNqd0 z2AW4_Qr2=EbO@iq>sC4B`FoM3=N# z(6IapmC!eWT@gnCI+t^AbQQR9K@u(P|MHSdoY;Rp{va;%fss~G0zRD(a&D$GAva!t zr0f$`Q#BC1ua;rh#|C(UpV23A78d;DcpldyFvh4C$|AyPtE&WRoXn%*9OEYFiwN9V z_l@1wUjqNuWKs6QE?8hwjpKda$*P@6=>LZKstDhElO6`N^ zuXi$+&%NT<0>i}PJl8AvCdYn1J*&!3@f_`z_F$x>gV8y5K1!cRCNn<%rkS2WcyfG< zJm+RUQOnC@@JK1BDOIxU@od~?UqfSW{KF$N#!0g41xPsZA6^SB!Tib+IC=Utk$rO& zGk51up96R3yLEkxOwvsJT3tZ;n#9Qb))e@YEK63`Bv1v83lPyPixvN5Frn=sS#`gg z%m~S13bPX6yiNs~e&2!}kLU%xHT$UQ8wqG1ScaXC@4)6%9moo^h2~em$lIp}BU8rM zghs%Wp$>R?=dGCPdkx5!sb==;juEvv5~#X+5Kh<&;JKPo=r{7FFFze8om&FI=T1F! z@1F$#qt zVxLR5zWz(`cpJ1vhCm-_0&gElRMkmgNwO6coje6@edC9FHknL&wHQk}hN%4=U$Xwp z_eh1vP-4UNL_ZoA;_T`7N%f)0*uQTz4WCm%?F5Wy-tal9&2g!gjPD{%%a*Z+O4gu# ziXePB(gQcX*b|L;TS0)mh}*@?!8-U2)!pep)da4S#Ul%Nmo%*D$_6vs$n9Z&TRx>( z&mJ&#Z{5+x;T)<3j8Thr3*30$8Yl9+xE!GltlAidRy__>$Yh#9mv|h6`VqGFdOT?V zNJO8zZj?r65+BRybWfsKO^{{_oH!u>uIkT8va~zbQAt6gs6W&_??3eS<9IJab+qDn zJd8Ao8O(96!14VWkm@XgQ+{gE8BN1{^n=Wv+Va z&VY~oeYS9e6eKJhV)tZjB|~j1$#d5Pj!TS;rTKmwjky7THVd<2*>dRoIDty5E+L!4 zH)5c4BF^1rfhO+x@G4c9Hu_yB^)wh3TvWw57IL^{%MFyb%|(xkq4dy~{pFn#+won> zPm-mrPE%i8Vv`R3rWzd+=w-c(4vgQS+g2SW(#GpCrT7_LdO({Fn^%I`w43zQ%UV+I zU`jP>7s0dPB~))iEIQZD!q2ai@fw^aR{!*Ub{2EA#!i~X_V-+5CN}|zQ*FmJ@0MR(u&zR*{prH5+@}xHa7pxv&`&UR{ z$CrmBpS@0&NX*1-)^=q6#RD{#%QG5vNE^gQ2T^~Li`Uk@reoI>Xt|0LO+2^~3U6OP ze$hzGdf3B!)}KekCNyfku6Rtt75M0ujp88D-$CZLu*{@)s(5mAH=Je;qSxl*)c)&n z*cSGjcUr&}U$t^`Mub1u9X^fcmT;K?n{RYg89zw-#6gg!AFPve1HliekPz<5N*9o&aPnS{Q$wOqIAdMffvPldPbzlYR7xSsSCTQb_mWNY*a^l&02kk-4nf*l@)n9_RC zY~N2Kg%$9z^9#1^&k$J}!LjdUzOb=dk>~Fg1J~zVWv|2v;=@XZBL+v;a(jy@&M=vYh5Z{Bg6qHEB)6NO>)s*q(JYE6te8#De=Ncm>AhsMvjaDc zUSb^MrSW4J=M#^XXT+rRF?HHODt#=FhBxbx#DsbDGnc#ZIv-2F*(5`s(z&V)b}H=p zt7BAT?OUQKcm-A|G*LtUT;dnmgfFbZQDJi}_r0A(6im2Wi+2nubzFhdzSy%n-pZ5T z2h16XkDnOO(uVxiy>v&LBmAemCc?JKisDQWuK)fD^<+YU_3}p3!8msNdqHA)z!yr( zN_c^3oCDKP0%ylh<*gc71A|}AlRqAx7+U9w0d~T~=N?P(t1?WCW|8sH2KJ4{Gb&OW z2?zhXOgufMF?rqyY`bcWf6LRTvfr9V}laAYT*Z^bLy*5SdUWpMCL3%#=U z^G*I~2l2pCHQ4W2NzFu-8T^<0mW1rphkQpPFqw0LswzL^{gOP)Uiry6$86_d$chN; zu9Ab5oTJSr=P*57`IqvRv=U#Vm+U-^R_@+VjHyrmF?;pr;IHM8tlO(mqQ~9pithQ) zKhpZRTkbfnn)@HVzTjM5XCsNsA!VqTErqOZCaKIlO_J=(aH!3n-nB2rA9Br9*F+yJ z-6ZhS1xl_w4~5NJ=3{xE6`i{EDCS1Skd8Y^c($Y(mn=*{_pCLTZ9GWYxa^z$!ypt{ z??g(I2^fE?hSlW=E*B*@2i9Z!71M~8>F~>_6M3?*9y;CZ_#M6b4gT*+#5M=aS~@US|3r8T4;%g5N_>1ex58iq3c$jm4isOe7x`BZ(lFxi`K zm$ijQa)Hci>11+3MhSQH5vI)1p___bB-54F20BcIm27 zmBR&Y7h71wdsiX~7NL#g;n71xdtM2&yKw%8KXNGadlHlwF?1uJ8~EIB#q2Hd_+)ng z9rA3T_sTLk2ksc0{b3H#FZa=+SyJ#axDp$6rm)gRXNcS8zht9JA8XKI#k_sA7@Xhi zK*y8u%#QSjkaNY6?2y|>?i`?yf2V?mnANk&C(JpXYbg68#Tq5jy)mcsDyyI~!LH}{ zQclIk;n2m$xN+xpe0Hz^g$fk$XR|km&JtuBZp?onbCI;AL!Jgs9+3uW^mD=Q6#lo{#i-YAAjv$!ZEqDko|NR z+y@t9N?9aQD^2Qt^B&CSa_}ncJ7`$gBzilgnU)>6h#t9(q~fDN)zS$ARBLbJjc^RB z^aBg3*FQ->r!FOIta?S4$SPsto|DxD@QKVY51_l2_fx4KTdDctu*lEp*TBO|46U8h z7^QAy5c{KxiHs!9S*{CPx+U@UdQWQcY#j`&+)X#QOs6xy|0Qb&GHLJYGbA@7kj$Ok zOvko-#2--yLCDRjYDY*r8F+i0t?JdL{f}c%)|! z?p0h5+nwD=oqd}U$<^0XK8;O*w6zr@zfLR`4 zbn722%tww_sq&ZJ(kh3EQh(HS%!3Hca3(?}gh|_>z+8-QgNxYZaus{(KK`%5t+Hkr7_Yc1olOXpdMT)0K;J)*Pj(DhE(9u^OzD6mjH6D6RX-F^__hsITiz&L>|?G@_B@ zSKCq91=XZoBp1uB?8f8%>0mx)4tGHwl+L}QH!^0@Tl=nHM@RU7nC1c#Qq?=ZS z&wwGNGidUz0dpG?VLYywp(mTzX8mSfioIb?M6W9-$#>El=8Ygbx09MGClFCjj=gqd zE9i8FLuIQuY}gQihP$gU_t`8^Zc4-G6d5@5F&b5mMli9B~=phYkQ_Wh}ank&w9W&B;*veXFd;)=K%)fH@RnxNU50aQTX6s--o3zk1P zb)kk0>Mvi3PfY}=bzmHswSk|OMUOE<$3)20xx)XW=sf(fdfzy%Y_j)?lvLW8&$%zN zq@+PaNf9a{ZKWl9@0p$Kl6?}|{m$<%!0UOO``p*{`Mlq->t8Z? z*ILUSy1;Svt5-q#1aUGDtqtj8C#lPpbap^H7H&!0AYK_^SeZIN{5ifr$#DU0_B;pm zc_XAHB^UJ9E5qw!((s>oDe>)mN@mJE#ude$FlbOGE;*aPC;ju3Ln@Iw9XZTTF*Wmh z4V#$qp#qR>xq(mDqLIfeeOhZ>O?&F2$ZMIC7_q|~AN;e#4QhS#W?e2h=$%S(yd!|8 zuWcUZrv+P`KH*oXK0a}5AiiR%BsioN7yl^WooRmrfgTL5<92m>uH1rbS7H3kF#(F_ zD?shlMR@H&6B_5mvS$YP7*DpyVOs5K3P23JM{ch7YZ#pojGy~0o zRB0G*CEUJY!EQB;hXRW!V5h&3#C^1A$`txa#7sp$vtAg6vbmU(= zM*~+{(a8nk@S^$_h`EIG&waMUVB)XgV%v< z{@h#37_c&cfTJ_ON!A#iwn^in?Sd$yvlvCMdC+P4zsc${aeQ(81u51r#>t0NAlqO! z>%DRcTGm;^tmiQ(e6JhIUnP-7ssGrCj+|fR=u_lt<LY5FKPCNW4cg>9Veem)$EE z7YAh&%KiY`RE!}OR4jTUTVDPBb)P92h*qL;(W!2uv0(@ZcPfsuMv z&_wL6h{7cw_k(eoPknY@7tNNfBfVB>SkbYZ+43-g7WZ^h6Z830eB?IQCia9b4L?@h zr;PG5C)4whtD(CI`J;y%A>95FElWy-&Y0sQy|#f}Bex$5Op8!Bn!%$^1@yOAW$SFM zUfO?o4(WS;3;OKm6441hpnS=UDgz8UcQd3v`ZxGU6nAHEkxnl)dwjl6Sa1KS;- zSVaMv16Pyt=!&J(2qGU5xMTi?sQy4=fB6sE{w@Jcks{o_IF|jG*9;H*7{;-|9%pe` zHl?f6FhJ}O9FxWmF&B^m38wP zV`dgy#+zFvQeHwB@x1sK0$xj!9SwVlVzfV-nIr!-~Za26*k3xYdPjKd0Js1`E zgoX=JsB}m%-sPC5tGz;4HT^QY;HF6CmQ+*!t-18gg%U7*>4IK;XQ+PSC>@g}Hibvy5B^sA!Tu3F#lB+~H^iWI?;WP2z!Tk%q`<*{#|S&wl9uhGd|_`za%pit zY9H=_v~fV;ROB~FohO~=BtY-#EjlM$!@OL!02tYEoF_?X_Iw$7JFtjk-PA#uE4N9| zG=FeW4FVtKR5~qV1I4>bK>roDyWhEm%XwX*`=oSW!|HwD`85poNGZbj(^@Pn&uvj} zk%Wk~GZ|&B8*2Dt7%n&qfMuaFEEz0e)=P7qn79hk(fODb@g>b4-m4M!Sh^1{91S7s z%PPp*h$xtr76gpceEQKF2`C)mZ$SZI0DWtMQ-z6MC)B zl)8+ZgHpp?ps-MrYEB9Sg?KZRJM)t2KXQTL!?irz#Y3MDqGWHL5x^)5lTs!eug$86QF9kV^VLH216mJeEF~-TdP)|)TZcGfa!UoujPtMSf zwWi=KCuW}9UqoYRD^2dxV#l5?z<7m56nxAl4;Kos*Ig7a=WjHf?%oHVJx`IpdK?#M zixoaywA{3LY$AK?Sv2)Jdk8w5D~W>MZ+fHa3+>Ck6SLfW68sW2CeqV5hQ-vMOrt_5 zF0=__`i^RV((NN?2$3}C+Gz-VF$1Q?3ljY;8`-w0f2fgK4ZTn=0v`X>lKC$`(X4)s zb9ZK#X;>(74B3a5wCWe~n5(^JQ)SPe}rQa|%Du8y=L z`q)Pv$E4Gn&mwW!g_C&Z`)sa{&tr!_OW^Lcg^c#&1$25{1n3N2!~O4M+uWP1Aux@? zg4RdmzVQ{}e@lkm5!l17*nbeMl_IH%(N0YFxByy1HS{~zi#pr=lPdicVONJKF_S~v z$z_i&x?JQhh>6x9nqGi^{B!&xtMh3=Z7|tbyMeUMkH@~KY}82-W-k5hrUB>g(gbs3 zsC=3UTShF=+?zW)`(N{W-%P~v#|DtJ`gr|+Mg#0AZpN%wx07Ctj%TZnRpE^!u5+1j z8dn5NgxrvW@FpY>9p38kq+Sox1^4ceGuy48$;lAxoV~EHL=g1YlXT$y4tzXam3!8S zVB??1z4mBJAC*fxgP6`UZxo!T&NBWoZr%9Z!0;mjbrzhN>cO6-PPB8h+Jn@! zPUtb_LGz<^c%Zru9~h{B^>RLLw0^?g?aIP&&+S~6&4(W4b~-2561ruEJWM&_3pI)# zIGxb|ZIY{l3e#m|Aaf>s(zQe8>kQTp4`3Sk!`SssLDhIZvv>i=iY;)!-vy22T)!w> zGtt0@d5VPe*)j8P3*t|BMWmJ#(W7^{cc~&>u;zK< zkLhs6Ep~-cCjb8URVtP%2KI*rxt&}owEyKgLl*hu#Xn`5JG>lhW?PbykaT-Y51{!E)*R#VI>13@psKTdUaMB9L*_&VlF?q-)<_i{Zu%#&%4FQ zK99qQ=hxuT{59f22GvA;=|}2!rI`Gqi6pl|#r)N%6JPM+9dcww45me;lIo+BSg8k~ z@PAvt_gFE${<94w&L`se7Ex-a>&36sOeLOvrtmuAEBD@I2_>gy;go=%yty@d$j`tW zX4POT^631rr-!l-eRmA> zieKPZAc(>{gEN*tjj15uL*D`_I3B3U0rEPr8Q9~%(C`IIsr!cA9ohxBV zK}^{`W&HKQ0H!ZY#pq+)cYD1c4si1b>re(dw)5$edM-EP^&Q$9Rztjr3Ve(%p!38h zV7Kc`GBGNRzU8%|Ce0j}}6Y zOSUA;^Fy^juTr`LTF zI#!As)ymn_o>(jwt>yaIi73@Q0kuxLg6i{2Y^qrmm&I4%&KQ3X$`)k|c@^O9WKzT#}|~MAMqwai}#1aHNPDx<-;6{lavw;ATelkrWudNrt|8gDk57QqJ^)K;s*i9LCU+uy9wzl|V6k$PK z0*d-v0E+@Su)j4GL{gVQ?vf5x+EN?#ishlTRvVG3i@=%kQmFIwFnY%)^VY{CVD0Z= za#(5(`Nm}gZf7C8L_h>W53D2awO7!% zPL>j(8=b_*@GV*MDUL4T&M%|JA=*9Bj0BuH!5;ZpLX1|%fbNuHsEiJ#gV|2#MC>7F zxQR9!&SnEk9hsEyg)scZA3PLP%sWlL!-V!`dPDXK+0;H4o0S?U24AJ63mssK%WMev z&z8M$qMzs*bMtb+VoELj$Wzm=koNS1xSXsxd?CdsDO*4cU*BUU^eh1(LfNUC*20y( zg=lPWlcc(CfZcPx(>?JDt;zG>(Y{FmXc!wyt4>|QwLfNno3I%;+;%0(pEDT)FFStf zQCnuM=2DUz#HZ(y7c-g1>q$e$753072inyZgVX+gBsZ$cpzYFIvg%zX-O%-(tTWPv zr>kG^*IJ9h37ZL!-d&2VSF2Eh`yTJn=H>vwd9a3#Qs-Hk=qV?Os;=1(X0s3qgO`E* znq*kX^-kGbNr;`}43XWLc(F$r{!9}fj8utCMFuSK<~x%;4N5#!nx^mXi5an?g*VCQ!8cLvfpa* za+(t8p;2*WUEm>ipRnf4!809*de#w`CWSRS$g z_eU>9jjMk6a!{Iz?LSX~9QzrqABVAOcsB;8yl7EVngH^V%5XX{kPesElJQs3tl0YN zJhhzHRUplAV1|2PE>cZibY>1)7pP7D;^n8?T<5g=2aZ${^CdHA<;I<7Fk z0)EGwa6l~>jXX8s1(#oR^lQYDg|Qrm`yC@}xED`;t;A{J4`AM%A3TGo0<8E(K&|{V z$>6#gFFiGAzKL6Xw#6lO)ToUeozY7l8i!Kl{lQRE9gYcRE%g4(Rb=U+O`!6z3hQn> z1M@TTB;t_?Y$zJ1|CY6qq@(Q^uILE$y!Tul%o2wuWODr6TlCn1X>@_>0%Bz_jVFbR zS*zPA_-&z*`2qQNbj1c^@NNpE(DE2vbvlS-T0VHqPlURZD|mF5GvsJWK(=)$QFjag z=c|d>|BvJL?Hr;ZVf*Px>6!Fh$`52!m$2Wjv7DMpQSz=mRu6KF zo%X4akF~62QZwBYv6u>+aRdf?nIRYd>54yb5s!^sz>U{9|c1T0^Ndb7V#j}dkF8=FA-15e@1 zHAiSdfEdorxPsoxZx<@M*6gFWUqFUD zQ}1Lx+o*xT^N(1ra+9_TrBVIR4y-yPjS8xgBrod_nEP-!@|PCy!tOML9Mq%L#}-f> z_t!MZDVfgV7_K`TPEn!UO5VgXrR3@1!6;Nq)mBlD zmFD!zni#q(I}Y3Kf5D|Qk5NI3VBD+shxjB^K+nG>;&4NUu2Oa5iwbgVN6k9Mr9~A9 zWDz%e4|+Q-jN>i8CriI@eP_E9q-l37^r@Bb*ZEH+N&27JYx6v4^%YY%Sdj_^6?^cO z$p9HCbimP53QWL-82r=`0?$_ta{HuVUX{u;2%feMXL@p;t{KlU=PNfJc-<~OvQiRG zJ3qx;A6RA{=ktuX9Scp3rFb$p0ERBk#nLDD7zz7B_+E(yWExMwz&j1Pd%%Gt zJ9xG}{P4>3+F%bluUmm}^9|tWVRP8rn-7Ao4M02IgRFhM7%E9M3Jjg$ToQ|@G#kyU znf!&u4H@FY^I7oWR~^@Z34^5zLur8RE_fGN#s}shgkE)hGXbcu3yFZ2~0+cUm{|Dmk~WEyi8X0|IY^Li_Q{ z*i;iv3_d?4F4x|}gfA1}$sHbC9XW-GSMHPicWWX1ygMX!oX5B4G_W~{bM47ZMu(;G z&~CC9Gis13I%&|+$y#74zX%-rE7_0aKGA&UjBkS0jt`a8+Px@?I0uoRMd@`!O@H2URa;!~d_vg64&rgc07?zQ|TFTOR?bB;Vn zu_lbeZ522tIuqS5=s-5dFw&hT&18Lb!s_iUn89&N_KDBsd}66E)Hs{&lBk6FiY)!; z^M`&6nFL}Ze&`wYlt^ZKW1xCBoQ_$Ji{Grl-Iek*dHV%yoq7S)4}St5jvM8B$cFRA zN1BbvcYqK(Oyb5O>FD7>_S(=3UiHtlxH3M5EF9cWzg#H-ebThq^O;rDzdw`2?yn_! z0o;AZg`0n;6p>u30xq+s%rcR0*!FF|crJYrAoy-8cJhm0RSKU9^1I>5v{B~V#zImz z%tM{!C1`N@CW;M);`Hz0yy^wkm_1*BeJmwm&f8_nrq5ded(O?HHa3)24Yv>jx&_$F zcZs}MI3Bpf?V?>C&PedPljlM!h12`YxFHUnW6T{AS|hQL3%kS^r%A|-VT-K3ex9D?%*L5F-w9~>ZefY(PilLwZVp+%bBj= z684IS1wHbn1>YNF@$UL-;YWiyvR5>gx-J>V8SaniqsgtL_n|4+$^h<=H^SWI66~xU zZX}!QJ)K&|10|Q!_+q*~2F^8OV`b&hTjUar=I3!t@#XZot#GT9vrt>2+bi~u(Ok?d z7sG=A0$?mEM65qERJdFck}kiZ&U*?Osp%qYL-8H7nL11b)NJXo+QBQ8#zHB7M6L$hsqZzV8~$C=Ak@^IVmHqB~ELMzK5 zES#tW+hg2OerqIe)7=HIg%&ExnThoIH( zFn2QzAg=rl+O_;X<;}}sUEl5@u`8STmtQJCPr)?UX~o@hB!jqa%^b)sOClX=4~f5d zF%>vwMYVk=az5)2@D{0s5bYk+J$so1=pT-7`sr-@dtx99|K3k8j>+B%DVLjP*D;1<2c9QWIam4fLGZLb{3>4iC z5tIDYr1acwyzfETw|4d*qvnhKtG5w($A@rfaRrgxIz+wxE{By}kxX+S*BMIFBs0Xr z$*XXQw(rx-vB)BZbVYHl?LCRi`bKSXMQS6?n|~Mgar2M;p$@JoVTMg>KvE&>2a%{8Eu88rll$wVW82`Pb;e@1gA8106C!SXqvJ?B5( zq*)dhhfl}dyMR03{G+u1@>GznvJ`lyNM)NzWtAB?Q?`fk6M{^3+CXA$aNT) z7){H?pAvCjZuT*AFK&%1Mw?Ivu$0W=o~0+?MR^2TYP}}zW(L%I;5%=(oiXm-FVJSN zfXGL9FBHFK|?NIVH-=|_WT5yQd?YmZ8?2X zH%1oT;n-CxqOs%RH{xSDLiYO&(V-QGaZ;3&`FGPuez!l8O9$-9)V;Gw*wR71g_|x6 z5r_IkU0KXx-c720ypb6Un*sMW&V%mk0$Lp{kKyjtxZH6gNZl*s_HNp6Wz%ocCU=_S zL2ckw%DKVpBa85~lRKl~ILM0(qHI@3E*WzT#{pW2hL$|~p|*jqvqKr12CI0RRwY4qwjn?z#C%jlq{geoU7dV!#HugXNBX}d@vr*F?UCfV^4#4 zn+`ij{+&F5uQV+|&T9ic=joFTs-4s<*b!BovQXhb6?l8D#!cE2IIeCnsr{>gkDp7D zb>psZeepgRX}iy{L0-|%T{TQX+CoTjJWj4D)R2{JvADGDARZMLfX2_dbbL<(v+3VM z)O(;s3s2o4Us8^thm-}eUSG|A?OXu?2X}$_vwVKN_+BWWet7?mEA@4rjZ&^ZsLhoN z_)wbLIcp`8ANxbWq_T+4o?b)lOVp6M+u4MFKZ)*&^XFZSTumNVPvOY<#~~oooWzvv z!SSg)A_uM*5fek2HaOt)awF`d73h28Cy^25}BE)a0v3~DiJ$&`K7bc8Q5(kj*bDN_`z`+u*R}rpT?Bcr zMu=|j26*M-0k4_u@I}KEYI95YS_%S0G50+FGR=qODMx9OY8XkX^3Xg7F z3hG{^WFt=tP+A*z?>&KaVm0_#kUJN9#>o0l+pu;@APk)s0W-Br&>E6R59Tbxp6!cp zs5TH9cF#feJK88H*g~EZHu5?bZp4;1y)lwT#zgR46j(h@VqGp&llbR<7@0{nu!zgL zep6pf947^nf^%9h>GMzCuzfkl^NB=pJ&v=|{U1H{dI~NzEd^H9;ED_0 z;N^H2YBmRC$#+ z_#TN8+^*|ajTMY~?cm*vx(t&&6<}R{Bc2rNrdo}k8SljVtjW%uNG&)IW5_b*OLPY~ zW^Q0CmrkbJo~L6$ZUmN>TfmmOIKGRa2qeE=i0Y#ZzE!vm)8;TRZHhT8-(`c36kHda>#!*iY|*(alb_bT|maUo_QoueOL)zrM@KWC=(;!Wr@`8jA*I>-FP#c_5`!&w}# zGp2W}>|pEJ^_bmrjjAO0*2lfqM&T4g{?G#vR1=(s)3)b;jz=i2dK^vf9}gsdejSI~ zma|YTssq$iQ>ifqaO{5(TqP3?7BS`gi8(qD_${3j`FgPRLZ!5=Bn5-la;_Xcmrtj* zSbs7Te{~$9LZ`&d3zG_nfckNG_qdEno}GkFZ#>yu$D3hJcMXY}IuD;Ey`e>}CAelt z5kt8D>9IZ@JbbE48m@<-%pif^x9dpz*lZM)u%mYd&vA~bCzOqkWN@|y_?-Aoi@09I z3OidAOx^^IQ(iG!ChkM;;cOV`{DWfoG2~uJ0R+1&g@u(O)Il$rws{M|_b2Jt<(LF7 zOQeYCy5sQ39N>zs9Whh8Lzn$}NWM34*(tfb`0J<;y_*t4USxz&op=7YY+W#bpBpP*^jG{ zLx8Z}6KB#BTdz zE5VjyhLtgr%0}eAWS1w|BRN&cIliO}P%Gjj?%UaqF*g^`er7VdYN5QXW*u1z5^foC40dgt7;&3F^jeyy zWD&^}DVvb;#nTrEnsI!|v!jw| zCDqLwm0dya_R9T+ryz&d@i=Q>9j6=+ch{fz;qG>GNmUI0SZCD)&S{K}z zPet}bJBX$8TjrtK!WXf7Kg zSvMw=_QT((443!3bh;So;RwdY%0Z9oe+{{Ac!D&Vgmh!!p?DCD zSVs1UJ%Xp#ShBJ{3Aaz}XE(;qF?W{hrP_-nA=S+ndSW8*dCV139E#EJo?AhkXb*GC z>N8zldegL+yX$|JXa%uJ=FHQp1JvhvD7HGe!AtI~GF(0g9Q?mBs27D64wJCkVJ%)? z^9qc%H{rpFUbJ;%0QGaacu-J8+y`bFyzck;G|I{tPqs9$SU&_So z*}}|(@NAsTb7F()JIS7D4hN9DgPDpanbAgnVpiNuFENdHL**GR-SmNdN}9<_gBjo@_?EXpXFJ5q zaA)smGg!0CjWow(;bXN?vg^rrx-9Vz}3GzmX@$LN=|~` zU^=8M3S%!EKa2`zW?}6b2CBB&v$c)K!1RtOEOu)H37JXIaX*Lid;MeOtz4k!_9Oc8 z?v8PjJXCq~mvSm`Tq2Rm?pdj99{s=suU&WHSc)QMdty_tlFNcC zOg#w=U5^;KIL=|`8Hx&957AoA^Cz5JROWB5y7?OYPb;!`C9QM zxXj;OA&x&2_K(@bD}(F9+wp5{Hpf4xqP9v}B(PcHvigYvbKv|;fw5>k}|0w-&z z@K<5_rTH>kzt+ue2@*pCnJX}}H5k^IacucrgGA0S1Ffe=V(`KYco<}Zakp|9qghRG z#rzO1`XPZikEc^hX%Da!I0r3nBAC$zNfgK`g0q+U(RejNPUJ*tXru!sRjS~{BJnxq zh@Z00G5Vpwu&5%84v3Yb*c(AKowk-JC9J_5&cVIlbU3L1ne3 zfOyP5+E^M5aBDKOo#1?z8Kz|Re=EU{8sMMJ-)Z&lb~1&VQG04EqOHGkLAo!Ek=^^A zHZ^PD!JlRD?ra@|hg-4x&TwqfkB#i<+HGiQ6@n#SLs~-=Cqi3j8a1elLmls4y1sl7 zmX$;x**gK>`z#`IKm6&3QFWZM-;OA5GeeWn-(WER1&>{~758)R-__r^{_qMHiZ@qs zo~k(LJ)Vtwp6TGSEqT<46(Vb?DYMyQEg1hi1%~gvAz=GPvOyslzeQXnF{*3Hk}Xfk zJy9<-Ivo$XM+#xZ#^+!a90`lu(n$K}QqsrqM%tBZNX6psxcx^Kw7Q*zYe(mS{lX*g z$m|7wq;WHe`z+lyEzX(mHT}A1&#AlQn71TuOkNBd4OWq)gOkkr#yMxp`%eC1%QswS z?>c*Skth@|Sd0T3?8wI%C(wSTA2sWZ#u*WmFCpUz?QvVc(0?nF`|mSU?u~#Gs;}|b zTtQ;}_y9cpX-olGW@TnB-IJX_J$JsML+2zxudI+J2N66c8-*F7lJG5jI(2;2Ps-NY zpz5tnfA5Mh|h_{x{JkJR`(Gr;K?Np3pL1t`Fzmxjwk$baggdDu*kF`N`+k!=ORB}X7f+bZ-oxm0 zLI*oLu8}jGqxZo9L9p&T#oe*x@iF(D`SAWFTjje9Z$)nDCF!^@@cK+>V{@R+LlX^3^$>ew_^XAbR>tu1nV37SJY|)n7=0Q#!n+LmB zM4^w11-?o@LVa#5#ALO0{QvhO=Hor8kt78Znj?tYl3C>F!9=_glmRY+DRj(t7yY;T zJ3a8hseaTe8Gm!#qYb~U;CziZJR^tD^p!8_dSzdx(_V zW?*s#=;{tt!n^c_eW4pm{MS_CgDN#NJfMnUp)+Xui5x00QIhV+RtI6(^Eg)FgKuVB zhhIKDpfA4!lQ~|0ptmv6==UdExeTp`x{Udkuw(euz6~oQ|B|}QGh}=)612**sFar^ ztb0Ed?IR;u*U}2&*1iiPns?BRO2<*J#hFez?tm@qpVl)%tyrtF9GYHb(Z}kl=5d6(4}QUJdxTwU7Me{GOGU)WPq=V+`BoiQAs9!bqPIl38*Vgi=rA zz@{ShRzM{=Hn*CMv;Ia3?m6J98M*lT#(XB~zV|YbRC~f6yUa0CqmJOB;1%@pxs^E2hVzygxx$(YTwYM`1NmIL zupvomn+-z>;$sN@wr2n53rA2i!93c@DS zFx!FBZGqNY_Q{Q!m$hQ}S_SH>DMJDuEyBv(rnJsoo?~_^fq!EHoo9Ory!jK_{>_XB z-}$G|?!YdTd;5m3>uADQC0(JLmyAP{odA5-;${TS^+ZS_6?%I{`fHP-SauwYqphWd~9LM)^U7S)AK~%uN?z^D4?d?L9FRsh3x2j z*m?RrNv~fE7Z!CxvwSS)mCi)RZ=&>Ui#pMrx{9XuPRG-8;+e3#0+3x+LXS$Ov+gfz ziSH3Ds?7NpjoTZ*G4KTc$-QPG7psW9+}~Z6S%qUp;TXQlfHd6YvvX&DrJKSt=)7mK z7^u4f?Gy*`(KQ|FW!DGQxphQ%pCZn*Tm;ga*TGm!J1+C&*hwboIO~8Ml}i0Z49b<^ z66cl5o9cn@jd#&H?(_SWAOk$u*sxZ?I)0Z(T;9|&ghhJ9%&(-wl4`U%!|Od2OyO2$U&Nx&>KhUi|{PFK#*fV&lH z{L@n2u=A)eBYU}-=&p{#OE2a^PNgn1W=q1Ls21!5Mck0E8Gg>vhyC7N&|~h0sbvLF zx-OJj{SKu^ZhDcIRULHoOad=e-%{a4u3+-&Fcr`dCg&`tQ07`WO*t`-PV@4hFU~o& zwmp16Vz&x|WY;`eSND?6Z{YA;%VWSGU?%4!^&vMKr{nS0he)~Rd~*8HZo1sQ2#cdB z^K+8~ER!yv%F0jaP@pAkGtb1l9c5V7X~GST}RiO!Z!SV!eD`t8OZ z%DygP)D~F6&y*;b#AUhsw#DN`*@t*MaRxROrPBK)A|SA6K5jd_0P@e~(A!yaVD^pE zOewk4PD=A2VP@$%_c`EU{>}~lvEI;50uBKM(#Bd@JSy= z>K}ta+yr{>buX*8wjQ%mztYRS42k;WTz`2;2>sockR)1h zzn_q~=!8D@wudr?2K=MH6yK4J0eeAkg9QldjgznXmPo>;!#R^v#3GzyL(YGRzF$YE z?7b$sbi!sR<+A(PiO%@sz9K}0euey2A^c&YLh89(^;VAaVbSYOR+U=Qkw=-}If>%{ zeBsjxvs&owCKZsDIsv-R)SzN$IU=O(h&%nIjzK1n9k-DB-T1W4-ZBQ!cB zlKgiVq2p`PAm9e!ncL6@k;>b0h(?7og>WhZO^0BLM`)BuY+*SvK?kldcw^$Jy^5j z+sS~6092MF!`ZO~;_mrz;B|i)TKu_6&O{0E7u_2J4jTZ1y@o{NYA1Qp<v_p5Eby{kEj{(i7uj3-aKw!B7DsJ{HKQYRd}9i$efayuH=D@Bpio*^yd4!F9_+VY zMXe3nv1yYz+E(o&l@FCb=h|$%b#e#-iolEFFH=h>AY{i}RlgZhN zYpnghN@}}uJtTY=b4x{XI7$b)NkS>xPc^ve>ICzZzSS}W|NZztyCyv309T{vbL+`_MIwMXyLG zuUbQ2WQ>wSPD}aDMN`rH#$*sWdW%M88q>e?v#9B{2>5e11T$}CK>DlSr1T6WthWXV zuu`x~jPtsbt_3wSA+(FVN)AbFIFFCQ8-!0s&IE`*ZLXB zTUy+Iy`dH#9U$n>dQfEZL5gGEMioTh25~L~uNu7LvYL7{XK*YAeR%O_0=;r> z0o86x!^s}2(9a>5iM*Xp#U4DQ&m0<=FHVijX8~=x(<+E4M_xyr>C5PXEfVIr77Tpe zdY)GC3u#?QEG9l#1d=5;NZRT{Fv?b7Poy2#xBEhW@@e|c<`M*Z*pVNWui)Rj9sH^z zh2%Mj1Y_EOft@wjl;TEzoQy`TJWDvJVuy>T)S&(zWiq&}A3K_LVfsicMBEU;di7{x zxAh~=OwT0cOIo4x)KZYr^2KyF9_p--_C(~rDm#8-RHkp+pgOC1;rR+LuXjyqfbw{kARI94w>{HrPQ5$pO8& zVr_NW6QTOXIO(xjgrBW4aZS;C#<7>{Bdd5p>%K#fQ$2_1#(kx$&&ah!NhZSW>o=&h zMh*ya^D?9TCeVB79u=8-9zDg{;In=n^$+@jlMZkkrg{}q_&8W@!Rl)5nLkJ|6Hx`W#HN+(0sAx3J=6ai}e72vM~Kc*RB^E>FzG z;m~BF6~pat7Gz@Jn&0HJo)4JU>2N)(7QW_gN069ahE=74c(Za1O1<8L^tmaO+z~@2 zW}L;#=C_DP#Zz);l^S}E1d+`ypO{_;2Z)=wop@}@0O@ZPI93@0Dbft*pvc4`^HH+@ zzd(}qJ(UsP*$EvnENO*goRQ#4>#S|yR9iEUoT0VFmkV>1}%Mn*%+o zdz{QU6py#~Z|Kt-tJs6vWntHDS*S6&0B(YIFtyPieSymog#04sBxE?Y&v_cc^^R6) z?SSmq=j1EtB6TIx*n&k`FgJcJ$~q-Nee!kj5odXFFnb4P^!=qmd@Yaq&h6n&5K(d>GCz zq}gg2%tehzil)*i{~;BvYA(QA{eL9*BA@h$z2(Fqs2e7{Xy&ir*8C|;jxdE+xHHJ2SUhc!3CkWTFvnyn zNtCbzlRI&YSv&PTscmydRy>DVymUvNVF0VC6ht>}M0hu*F}fE96>MCxA=uI;WQ zUk4t*^<;uRJ~zo-T{l?wF`vYXa7@xkA=JLZk-kib<+N@o;`YHGkDHBf9acrKj63O^ZcILkTvf0I%DlUkju4~Nk zTV4j28_QsIYZA$^#-HS?j~AWsit7};{+5lg2!i)bdHC?h8#2rF4jGWy3Oj=jlF%3F z^oV>hv$nUBefp%03>Y6k4J@ZWI|tdHnK$t8F@J=0lb}zmfIfUBL)&WI$QM>rV0FKR z)|jpUH?5=8VTz0CA+rRSZQ{nH7OqF0@M_#*EFx&GNhPh#eDL0HNAnDx(~(bnvUP(e zt|_-51Ln&>BEO!VDOHBbCvQ-(GZ*&9>Oz^a0w#Q)4T-g$mx zZu87ELN$#vohydB#T@fDN(4M252KWGEa{$ch!I z(Ty;W(0GI6cQle3^XBS9Lj}x3|5C6mI1J$`N-$%5J{(z9N#D1s(ZVH;*v_73x}?rw z_Pj@=cQ?lbXyh2O>?nPAY7b7_$j$v1(PqU{F=Y!9*&4)1F&29YDs)%vJ#yxg@E0v0{+{x zW3)C~igglCu8iuohS_?Y_V7%D3@+Bhp|dgUo`;U?FWrmSckv_f@Uq-;DY!# zG}Xzb)&Ew3{h7PeN7;`a|2hTrlLJuvR5ua2*TR2R)kT7BDgYC*;rY5yG|TR!5u0tO zMv*C;|H84u_DkW!fB%5n#9+3Y7;}i{NL^>_q563Wa4$)O7%hpT_4^{RaMu*-WjUUt zC!26An?qq8VK zrNNiPUMxTA1*5x7@i9Cg>L&lufdl5aW_==9rrbae{V8N$wL7z9UI?@nDFgp$GW9IF zi|Kinaopk6#EsJ-YC6=>>pbT}>O9FB?er$W_WGduJ&Qji=Zf7+|B$v^JruLLj9H;+ zIGfY2k12LxVfJHK#!mv~#6?)#a23@Q-SEkiEZRE17XG%~V_WC@qnGtmD7d-?CJEKj zH@0oznzf3s{f-Z4DaE6Wp*g2&tS4=?2cW0*J$X5_0NmfcqJH90tAK?7aNb&X{Q22g8{Pn=Wb6B*!q9e*aQg80V|h)>=laz+0(Px~O} z6SGWb7Co>*^A}2F@O~hU2J1mpNAx22Z2(px{$%gkD*B$&pG@2{XjO9(&T(Eq`sq7%>>hv}Wv- z55v|}6H>J7Did+Go!*`JfcDjALFu|WbTv!kow@&kVT}_AN-2>}m&A2l*03Vf7oHyFSaEWkSL1^UYc0`?hGl25_lE~PEa_4{n2><` zw}_Kl-@Vu&;Vqyo{fSOAyNtaimNavJIhBfUfKT(bplaALymz{gXD)dPr0#~}*Y=}a zKbIywu{{RXJx?N=IZduR>m0WJd`iro8L@KhAvpJFCu4SPBbhONB205X3CnXFVW*oe z^rrb^o98#$x;B_Jn(hFG)81DV1Y)wG6Ykxn3j4~R)8hJO*fR8n2xer$Z1-gH_}(~r z$up5eG!Ns_%4nivHwQBeKNH_0+ZlVM9S|3L3QyJiM+3+CBi3$(3x1UPnA_k@ooTTD zQ70~X@P*iph~W2fb?Du>oIYuMMR(qk#H#Q2a6+gqd9NMMm>(ptHen6M%!y);{fZ%S z0mJ0_qeq10&bJ~DhLN?I3v>4J(RS<`yS`unj9+3x0%smY>5}I(AX5_N?z)bq@&x8y zCHUdaK1k;{UWVhYlcsbz>{x71hwt1&G0`kAvCf7T!%a{bCBcT@e1l*WKvtHxuu~X) zI5j*D9ZxKR?yL96x8MS@baw@myM{y5_OlpqOcLv~Rmgp}TR5*|6}h-47i~3PqHhtx zv_Bd6(Bl`+D*rK6H*Dd@RWE}uWdqXDPzuRzk}$hy5-6F}q0$v^5^06lkUf!}0S34I zcYrATNPszSzR}Hxgz=n47p$Ms$^N%R3YPUmkobx*vX{RcR0_q>-(OfD`sWV+O1>uh zS#>6!(U!wUXML!2*Gc@4zXrUu77-;AaY%U*0bcIg;nU$gc)FYOga}fwhp$O1zfB{K zVd?C_@OLy$_XK1wa)T2$D$(N7H)6$Q;uWW+QBP}0WIdLH-|v;=a9SB`+x(g@_&1Yw z{>$ZZlY4MHqlktd4nui;1}$`ufwDj;_*32v-y@_@YX4mH7ukU)tB#POoK##f<005v zZHL{DpAdt)0mO1+2+vqlK(07S<7=NR=vojdakEN?e1m2(_-O*w_@N4ox>;~@vK5gx zeguJ=4q&ui4zsRQ8*IeR@}IuzC4T%g{FS>JPwOY)XAfU=Ni<|fQ)5`)HJp#MM+^ES z@*&dh9^Zl=PLKaPM&fivn25K0eEh%~rzJdt`foGQuIW5uQDOlis>v)yRLanFk)yzFr}4n;~HLYUk0h;cix!yWcjWccrn@vd6t{Vf9Lk$ zhEJDC%E>T#=GhZ8Sowyztl5D3jQVlq=|nCIydKh@gg~@RJ4Wr%!cXIR*bCirpkQej z@xA27UWZ^Pcw!9f6jg$^YQm+$@<6NUBK@bg0{^S~$_^$jCi16JiJr1BT$O8}9vy$k z+%t*fa8(l--SnP0y)lLwa15=6OE-v}iZ3KREQ0LU9{BxLFS!hBXU@pv4Zix~$oZ~S4)%(MJI!X}t*B#Mu(aK4zVZ!~^eF?u>pA`Yz3@)5lB-OU1wH4^rki^rTF=;C169Ah#Lr@|~j4U!c>(6pf$k5B#w z%HJf}hGGpc{fJ@KzZGux`%H6#(kryYYs?g~`W-5iwr0;rj3JvPQqLVbf&vLTbpRyLbsw#p^0 z(`O0+znkzlDSqWbO;c)8;(&D}9dH|O&h?-CLAOLYJh zJLv#f)?HAsz%l&!gmi{4stS-obMe>9l3j%dSn zp@r1`?gO|VQcm7HktTCBYl+0xk0_&0Y1s}j)M>K?!Mv?hkr|~TCJd_SKcyam61*Gx z3_NQ37dKxH!0%oIY{eg699jK{Zak5|Gkr$j2`>uO^JA!!(tMm*;fY2q^C9)&Hquj; zM=o&R-xX`Vn$DW7&PGlwB@X->;N`yuUxr>s$=2~0aypIEoK6zkNE29=UP^^xg|Ka> zIJwCE{v*3K6!w}4szIx1ekC{a$~1u*jbw)F=%UXpHo6C;XEo0yOIt=$FNb`I?r{Iw5SGv+{2OPVa z#r43n5G}VNTwR>NU9%eKE0o2z)zkQ9+)R(%as-xI1cQ_3B6z<;&dfgDj#R`gfcf1o z@a^^S=;&XAXTHer47>B_t&3*-`9JdM1O7~UeT_e9yLk;V3`R&q?*MC0$I}_%4!p%V zubILQUFt504n$aClgB4w5*tcwpM`LqQ*8*zQCyt+dp;?jtq)OmR)c3vCo^XL zm+Gl*KnFi}!rM5AkZB4$^D2C?Qrj4% zE54JP_5Y~+@53OHUJnr$K0(utHthH(hg!08=n<=JaPZMuEUylyK4W5L!Vb}R=IT0D zk^Ux2zb&L5Rg<|~?@=Oo#*?~rdE*4Ng|vJ}IXO1d8P_ST#U;Lp5b%5h?Y<+7>C!obvy(iwk`($S*X z+#F&B$ar-!O0(+V_k}zr=j(XfWWE%1Yc}Dj{3smD5KlRd->D{2EeUU9~1pMxu3jw>&gJF>azE}M(d>(iIc&{X2WoA0w)#)Nv z6~uw=EG7?k9Auqmy9aJdcuU(`I(KesSzDozV=R60*=N(0! z$1Ly`^~LYC6-0O9AQ?R0f{9+1^mkbTjS-1~>mgBa$4;3>&ihbprn?E7GSjJ@WidKO zSmU1Um#L}BRIvGNh8=e|Gc#RPVTacX;`-GPKC0{ksf|ADs@84a52{_DUFW&a0(w z?^MwRt8(diu^Q-9;{2r_S71aErMWfhaN4B-qLuiaTt0aPlrmNl^S!G4!m9gJVBSD2 z@9u`4i!7SA#IRPsAEGKV&MfH%rxBT+rCY9Rv%mKpp|bP*FnKVJ1ZGu{q0!0c7Lx)q z>-0H>V+96`yO4^hT^11hE)G9i=w%Dvv5#S-Jy+>G>PwcN2iFv~!jHmP65 zeHPD2yIleM`N(6~yXXfEi&#t_os4CrR~Ez6*fF|~cM@p$0NZtLfUpu~Pf=WAb6kCPi^J~avT*m za(KNF*D)GHuGTtWuzV#wQ1_G5G992xZ6=l5H4B@Xm%#LH2?47;9)8^qr^A=IH9K1i zPY6xMqC7n;*?IxhJ`IsIhdFqf!vXLIGdv*rolNwJWIr964)xmNxZ{^AE*`ApxH*|* z-RF7OG-3fKIYvoQbOo^~)x%s(FPQ5X36ak;5VsB!#YeJO{cH}G^Ohn8+V^OQvKTS7 zv83HxhPU+QQLw2H(D@Y!4eu4ey2niT~B`lYN| zEdsL}QDD>4giA!4@Z)PKSo%4GM&1x3UY6(aeZ2si4;a$d(%$%qjiHG_=jq{>rtEq5 zeEM;{A5Y!h5{h?=;RV?ga#JT1Gj}vFAsf6gd(sVlM^PywH*+#IIIGW&?&XnnM~cDx z`87B)6i!5S-||rI3@a6^3X)eAp>@rA+-l!JZ0c-rFGbWi$|O9YGNvb;?P{ zG=yUt^obh6U`He96l%lG79DK;t_u3UEXZW}K5P_;#i)z#NW?`qIzu`SmUh*{OV4cL zvOEw^adXphY@q#3$#_rH0qke*AmF`}k&T=~Z``%Rou>o9(c}ZY{i>CM$4(N1mF&_< z8APqX36kSagPHqGyr-N-`B@*R>Y8@yc`XulWjq0))|cQGGMD4_2XovJF3Y(^D zpmrKx8Bd3~V&=A`{GgaaSdbDzJ|@djHO@oU*A!1ojz&XVWfML6`#Bx2(n2n7Tf~$% z?V43 zipwNd7gK@GS#Uh?8jcVFkO3SoSE9g>-cN^An`5zM?M9|BLkFmPdE;S&kGS_%5}N+~OaJbDjUpD? z@lRJR^;uqwM^x0!ocBjTV63>=VSLQa;xhf?9O9X0-1$7`N;Xz*yvOq^*9P~W&R9q} zU+;eR@JjA_UF!%X!_9B#m$@70K;}Gj6uc)Mmak|}#t2({KnTWFUnN&fx8SOG8(~1a zoJb#vpf`4HgFo@TZ1wdKS`>K|C$;>7f3jgzTj+_YXPyY1Q?&w%TzH^4CIQdZ&V+#3 z%VCMkE~t%@1*g;zdf07{4Le_nAG<}#4~{W1{pT-wR^c7(^IcC$Z@9r4Jrgq2BZp5q z&9V245sF+8!qI_3{P8#j^U~+ibHP%$b-`;$iB2c7!dsdCAV<*bT!x_oN&>y{Q$apl z3}3&HAtkmM_-9QLuJ|GW^`jrihed=O@jX;cS4YCsL)Te)IG0>HT#r+H|3kxF?U-u3 z6Q<=YA*=3Yk+TZAtdu2(`aHJ>6AlcJ4bc>Do?Zlfp>0^P^$GkM_)1Sd`$hA(v&_CF zDWv&&IraW4LNtY5vJ)a!(1-Q;Q1c}lgr|DJo^K`4@a!ltQVrsRl>?RAq)rd5Uss+w z*%|wT+v$f-skrIwb#NT}Mg$fgsprWQdMnL}39)km+u+S)`rFsUXL1LVpuw@0XU>C+ zRTp9Znj+Fr!tpIi<)nFuEuN9m5i@nEezLJD7-f`Qz5>K#2s_tXLuL3l5*I+<_pob&|s4< zwlT*yJ}2wG45F_7F|=tWSa1D=CW1XAHg}WQ^9gwNxG~%co`dqW@$}a;RocA60B0pg4L?~*y_5q@L-xFxKu3S_^AHn@KLM1M?wj?+%_A$U;&PB<=u=El#+7QXwSUMVojHogw>kx3TauWVU&he2-jCxoFNIN8W!&hiN$)RA<-CPL z@bAM%dQh(gT;z+0qsD*yEQ>iLG4=^)mA8U>F?_=M=9d6+y;<=t%Fz`mRKhGSFS5kA9HeJnx)x)dQiAs&+3M(9$lXI!UEK6-gS zrlWb@FsFDt=GQVbTV)O`>;I4I3*LlsSLZ^3jy}2XJ{`>kBCsVjfZ1iW6>MUCd1?~+ zbo|T9)G7T0oLU`*M(ZabG5$pR9xjEGW8=ZABo0EYn?Zye#I&2T7!*utXL%Eot11lQ z`l@E5ZV51D;(qAfG70|c=UCSBmXPg6+wo2NB?t&<5x+b0E3NiAhD(V8J=!yoq}Bw( zE2;+>GG9sRST5b&T8xX_j|1qmhKT0FQ1QHSD#ZKmtaFd2=8{Adfqaj^U4@l$3cDdjvW9Tk6QfzuK=%x;6zGWA?P zLoo7pE#M7L+)Q`nyvN8%YnT!zGn^FEh)w%8fNqsJv=*y^9VX!TQX3Sx|BiGxhLf`| zyz%^S3-3O6*7dvH&h&8eJHxL*;X>0m9`f*KDtD!guOrb1QkwyO@4i9k!If~wiHDEZ zio@iC_epYi9V3XF#rqx!Aic?s3||R_2aT~LSP~)cyA(XFiy;O>?kIMol8x!+;liwI z>~95YP|%CRnBdb8<9vji4Sh>8IsL=@a~9nqTSyxdPvD(~543Qv8fxvYC-ZwGsqpAN z$gt1{4UJl+d6x|4Pg@HIrd;4{cp?t|5{_(np$0$Bpq{R?_oTg>C5V2^W}H9cIF6+C zvWI@lPtjX7x? zL?_s2(A0K{!^d9YsOWXBcQYQE-*dj-<42h}1>dQVRV0}p*~9jYdquarnggO4lLYtI zQOMCh#vJkPCM^SdiKFg1pq~xVFhv?YCB(q+$}nGH+Z!4*Xa#u{p)kEh1RgvHz_B$l z`0PJ*R9E`VcTrnbUToLOMr?S`ew`UY(_0t8io5f$=(HRD?0Q2d<`%MRcO3+|kCy0v zxdl#55=T0{45SYVL(PBbFzI*zT043I*UO0qrfkCuejtimUV!eh-KqSd0cI4FVw@PiH)dh z!YelmK+sf1okxVx_z&liU6F_9U;Jb2-w>*1ZU%dm%Wzh>HVNVMaE1I5j_tJ&hWIjI zTlbKB-mgRVtH$y#mDONr^JG%m)C1E-E6_1gUNG1m#y;n`hljhlTwO>NX}9I!p07@L z{o^{iX4faWEH)7Nh8<$~-1Xr)I$XU2kB~fD_zWyqUy= z?ZEb`UuQ{O#1&}}H3X_w&B?BDkI+|vNlA8o?b$A<8bsvFT9s$iwLS=-$njzM*Ia;)>chipSSMj>$c0A^#LU`#go@?I-B-+h}U51tF(_uxwCXD~p%tZh7z*NV>#7b1abco%d8Qgbl?ko-=;BuGh&#>ma zN@rp5pDFmab1GT4A{-W{m4Mc*m$ZGZE@t&Uq*p(tvws6r(atS_Ui!&p(Kg1R^m$qS z?z!`rB}z4H-{}OD($Rxmv6Dg7GM8wTDUkWs7LfHf0&sSsJI+f9z@%mBF#7Be6$^Pw zd;k2UiKYE`QmBq@sd`PO>??tPFK&V0NjBLTa{&T$?|?ryAClWs2xGayH2i5Ke7ZK9 zjHv? zwdpzaY>uLGGe486I1#g{k-GTPO99jOBDnwKGIDn+sZ-O%@SUTLdD%4_G+^yuUhtn}rBTTQJ$|gP@+= z+3yCkFLCp{wkWP6=qvL*KM2eJ#ZeDiU5sS2!0Fq6jNjNiqU$;fjqjzQ`mSZvs5Af- zwRdC8Ok1oH_J`vAxirDhfwmi!FQM?WZawF1nZ6Z@9Nm%FULtc< zG>M*NJibtV#%6QxlS@|vZ1)j`!q6LJ{lDep=O-PAt-DSe)-9(CEviX2NT64}5Sf3w zgOIgZux^(f9C8w&EfU%INm&*@M$e|H({`5AUt4gV{yV;R@;k<^e-&&!|DA5z^Bsp9 z7=BgPYw8p)4MIC!QF5@KJXz<%aU{OLlPTSF%8I3MUM>ekYUb0J-IFoQ=^9-=HxZ@B z9mSNuCVIHf9K$?jkdG$f_~ubEx%4g@Cj8=Zyr1i#d95mSDq+#J@f`Dd#S;=G-Am3H zchN%%@u)Cg(X{_w5Aoz?n%lmFz?qAlkUg$}O!}jS%N?_cMgC#5&&#rJ;>3MwVC?{l{HDWy<1SOT886WL_60Ck zC_w%zj#(pLz@Bu1s&gLMxs;{2eQg&f&T}Tv$;TjbF8>5l_64-(1?c;xX$icFLE$|>u%n* z7UrF~2$~C9@l?bGESee!{PF8?cJ3Bpv{RR{)=I@|pXx~aDMy^Av;fY{4njRIF5|DW z9`>iNpqW|P^ykcEQrfc#Ztu`zx0(l%AG1zVPdz>no!3o=#XI5017%QAy-#lOg}|{s z075S;hN;H4$=CgwurTQ-Q~c%_oS(G;O_Cy!t-VL<%3ibQk`tJPcNW4(xjM7!#9OqA zUIs4>n(59H&9owk0f8mACm)-DQLCPiZ%fj#;%hA5dHg2u6jwy8KXQ=&x2MV}R~has zl)w+2$#C1@A(549rFlVn`4|aW{>3R zLxJQ{$hp6o$s8_)n3?&gJls#`PrXm&#tPWX6`7!x+YA|7li>YMV|X2H1inu=p0SK6 z{I=v%#S`LY6YpLZop{#~{n*o}zJDItuUCWaS_NW%MH|-E<&oc#w#4qHoFHvgI&@8Y zXj-@>gLXgVnEjz~*cw&Fgl`XK3?`lccb$hk&58@W{qaF?FXlSTY98Z>^7?rjCNvS* z0Bgo?RT&*!lgOG|YQv6)T>g`r!zG;A0{`de$6XqwA30W({0~+5bY?s*Y_4<762g?V3tNvJX;i>t>8l z+X&ALGBAvP4zE1O0ohllNOpS&m6uzOBBxYQ&nz7LtwKR@2~eFSB~(?>4^Ey_=NM^c z(9T;UJWX%{cDJ9Tt7a);_24h47fGY_d47b3+$7J7#guh^OET6ur( zzafg9gz&$a5C!c3x^7gKG!^dTd{PgRrmiA>o-r7ESCv&N*GIKO z8_0ZTH@e@ig6>?F%=L9P)05X?KpneC+uO+~0lSIoMQ5^jnl>xD?4bZpvtGXL^c`hAmts-2$>A9&*hXm|sz*;bH~XHDSm3d9afx3X9n_LFbm=f$)SnOup_{k%zH7mqRQrFlwJarg!bH)BFQCu)dkGd9277SK;0Dt;!3aJsO8)Z&% z8?CY4*q;@mtFdyiI;^RPokhYn3#d?5fAjD$0){aQH21mLXVM(F&U z&E-tfz}`p`){dy-)YFO7e_$Ec+bxeVCHp|A#-92|O0%+4T*&Lba~wOt5c0!&sp|w; zIAj`*1_ccCE{>oV9uKjN6`UdvB>}q_29F$_i_1<1f|b-QTo*mcoRp}e+TwL671l~z zxL&DYgF153Sqd$qH_`s3O(dRK2KoLXW(6&8NS%EqNt${T4>JCwYj*-RNBI+(@s{+F z&r`ZJMjNHC9cP^0`ZETifq=Vp!Q!YTT$@GN6F$?xxjB!_TjN4ELir%r~Kv^%n4g@!<7ayRb>fA_>I7n zuxi*X&b`ko72&7VOk8jAfPC8&hFg4YL&KPjgwB5s#N)~<%)GY{6K=}TKLh#jv}6Mu znI;3VB%a^n1+(aAHi>9tV>Gze)&p-OJ8ohJd8 zTRHzre*@@j{6>gvB4BeT{EPj=%|5Td%k4F+5*~!$Q}Pg2v=Z6q0N^hw$PGe@A$?2fgr}^2?8D+Cw&UH z=uwy5uv~v4ozNs92ngfhj8`1DRA>knb6s`DpQ>5G=`v`te?_I zJ2&M{M9ZLL2zWCWG$yIjsi#W94J^$-<%obef^zuRW;qPMk%rDKo1yKNI&3;CiJNP= z>{IC`Fn72>gt>iG)dLe4Hq?TY_r`E<*F@gZ&+2A+VWVWs+ZB3D+o+0sAOtR7Lo_-} z@uH(7UQwHjc6OmKj~WoAN4Lo&G8fseiTJFmoF3gBj&n`4@Ob%FRA(a~COeL<>d4|7 zY5rh79!{plnmttHmjzrg^1-)WABf8753IZOdAk1V3UIA@nEd z3*_=M{JR)*QJTJK4*{KtA3)}1Bg-%2JU>mGCYlsPE*?uGWlFhNGUpmK-4uW(Ya78! zW$L73vOSNyhaHdX9VDppoxrX`!IR?^8w7B zR|0BPm{!NiYxyprDGApZbEVbf$G|3(Z?#07u?);! zXbuB6S5nK)Vp{jnjL-kC4Zqb>HaDh%dwQ>|6O{Qgl-~o5|*C;_Fw^wA=w<+Z2k|Op(;YIp0>O9+TVTGQr zbIFYj`Dl174?ipN$(cK6;L7O?{Bn65G=95{3A5MHvcKl=B`yzs54<8Gk`rLrE+goj z8w%df9k6D{61v~yJbAWr3e??CB8=KJuNSBh+kZP; zwu+^Z=5rup+dS;wq-5rDSBa)ra~-KqrSRRrT6B2FqE&bte2TwKQ+{WWxmF5XpU7c) z;EV|tayh8q5>}++{A%huvKiOLS)kKxf2>^@%8uVSfnL(Fr7FMnkQBuQ&}vu3wqCtT zSATfVK7%jdRZhT2TM0J`i{Xbsa|pfmhtAvm4d&(=q0qENc!<9Nl$Scw#Tx45Vze#y z43rT^X?5=2r@~g%N2YDseoTOa8;Uq8(WHKD+{u`r&_i2Be*RO!kKG8ij0-G1TS-}4;~T!XJ?6AoGUts)RL4HcW}=;PY6HYNP9hMnSBjnI3TqH^OpNUK&cOWG>oMh z!wT&FJzTGC`xWf#amI$AesWorL{Wf+^3Z(r$|( zVo;w;%olQJWP^$1d5;kuG&_p5SEquf#uL`+pD*VAh=PS5uAqziIJhg)j(r5cO#+fizCy!*0iNFlMRNlxDJ^b(AXZAP9!{M)6>APf(u^PJ^CbX1en)*#D zJA4qwDx-13r9pCEaT{r$v;dFV&c&~sc0c2I0=$Tjf@xO$B>!v*EUZ$3)fzXUcTFN4 zyzmxYwnYMaA(Rw_pC-NkT=Db`Rea)5WNM#efYmGNsbyOaFK%iin|4)^35pf4gRv=C zd2$}O%<3U8nl}-TMY=?9S1q_{)Z>$BQRu(W2zQMoq0i;5Xd9+WR&g4;&kO^qt(}L( ziyWzCVJ_{TG>Ctfjpw+^IjDI=f}HkyK_~lZp+xo&@mn@RuA9n(6`rS$I4|?(idYzZ z)D3Z2|48cJ`(T$)&F&sDrp}Z8AyfB-o|kk-;f-eH9S7rCld(LQ;@eC`e5|nMV>Pun z*oc=B+|jl%3x)!3!4!5T>b_dep3o7(XKOgGPox%Bh-(o0Sxq!WZiIUEanFz2Z1QmA zIsd796p`(7pmtoxUF8;Yc2>xCob!xN?@p2oUf%06dVja~d~xw{ltP12Z{OJ{Z0 zv-htRprZ=sTbUY2mnJ3A4JpsK9#(5mQT|Qh9;K4da$6987KYBE1+coqmR`;OPW1B5 z0@a-WX6N&0$p?Z{rex7r5r4X3gBh(kQ-FIe?j|lKm*7ZwEonQY4?h@+Gr0HNKW-CF zb`r*s0S&n8w~5oqDe?53!1tT7IPZWcX?s7O}h%s0tp-yKTHJgb?J4FB>3@Z?MC)2{S zsA{@sOtjYMaQ(X@Opw@Wyz4ZXeaV}Qfy-^NeEJ@Gpnet}|9KMk+X7)s42jW>SZe3t zNdk7=qO9a)nw7Kx9vcUe>4k`8D-Hb9)b&9)#bIhNRMkfwv?T>i>s4(P7x;K?k|CCA)vF|z~3Fk@CKrhM+__mXZp z{!cxeGZ7_uHk{|gVjI5eJwsR2E}9uuyNd=} zdwe>*e{m8xrDVIS;g7^g&yK5VNwv2EKZ}qxPW1v28xmh8=Qv z^Fl3v!dxuiSUMg#eK>8w0urGdN8z&x zYeDmuiKyz80iSnngGUpRXj-Qid^-4+C|=u1^u{H?@cT!s%xDbjzt@oCnb<=3tvX~p z#IdyA9E=A~!6_RaJ(l7CEu{_k^`3uaKe3q|m1u!%h1e46o^5{$Dmt-)Sp zoZ$Vo<8b<%s=)nH1zo`tA~QRe65j{T#HRNp-sC#3-k!QdH)sOD@HWU_a~O9GNMYIp ze|pR5Dp|eL5MO2~lTxE}5dZH7{VHk!Ne)-&_uo}?Bz`U)Iv)u0VhZT7GF|#O>^Wws z?;-NtP3R{!1m7f2QG2Pk(5n-VZ~PnR6XQ(&wYF6-_$7`SJ&fk-I7^ejI1#wo7f+tc zJPki~M+DDJmjE3>7hN`eKZ(c^W+q2e(a7pLa8vnd>hDHyZt)P&6gfa=3bj!m1CDiH zV@u_uWWny|P1@AX@tKT|(37L7VEy1I{y{JDxI>BK>Wbi^|2`A`Ujgm>uN6#A>SL{2 z1sz|Sj49o&sPe&%E;>B}8*RL~@7)ZXpgWG1sd!`N=qk*QZU*mxjqu|8QKE+hbnUS% zpm(f=xqNOr`6Id#4@R{U#j$j_CMco8V=-`Xy%(GPRzRg-fGuuOMz8BT&>f?e#2=92bglx9wp> zL8x&z^H5XoPAofgU5 z!4RXv)Urp0_N~ky1@BwftHI$I^imWXM;9`e3PqXBs3q_wY#Ed_h7#xd+h{y>=gt56 zg>{@{L*nC>u;Xr9a6DT>@`B5u2Ia?7w}s1a@}*8PaZ~_4rzhgs&&Sa{Es)f%PsA{F zCs;EUguDK`&b$%g7zSMo{i3=PA2`e5Odm`d_qHI1J8y5rZ}T*4PmJ7Weg!gBJ?(=*pf& zpk1;B7FE}xuNLPAU-gIhScXxr@in~eLR&5?R0E0!#uMYROnOo0GvR6GQ+a29_UmOJ zUg4rB-nf>S{|ZHi!|@RC!VP}Cjm8i6?y}Nbr9kz31Mch$<}y@`%vX1zxY?))lhFNIV>u8 z^mY~5t-KoLzuRLRchB#6=@I9fG4N)sHTZUKV4mE4M_;@mu)ZjpZtK5*&KKgzqv@m6 z&94@_4t9WU3+JKsJV6^yOOwo@3uO7%*-*YRgBDeMV>KW6Fb5}<6YJ|2Aj3Bnnosnz zi{>Mh*9k@24;}4BUT|M_oMjL$T}#DsCA9ZQno` z)3^a=d+(E9hcaRC=m39V8xMYD1VQQ^R|&b6_2B9z&Mr8kLX_wgYUp$xQga$fg1s!b z3A&gUM;jS6%OgzGB2`SkpAS0cQrVZij~IiTX8g4JH%<4o=Kr;pg53kDaNyAnSgxc= z9WR{3u3MZhuRx5pUOoiF*0Put9z}bsr^7`9MIyR4g6elK2l-8&%<3>BUT;$v969O9 zn)4_1VV39Z;&Rt|%yE|ALk?JdH`|Bs^c{^#m_<9L+4q6m>9DKn$+ zKKCV>N@$2gW}*_66eW8mTgr?yNJu2!=f04Tl%gf2&{WZ`Po?oa-#@?)?}sz)b6v03 z^9g3HSI{z{fJUe3V*~ZX=)qCQs2L|lzY}Pz#S41kUJ@Y&)=gT5N|4}W&{Smml-RF` zC&uN+NpjmGdPu4Z&313VmlB(BOG`b+^qE9PWxCjy!X#|nF%4zvH_?a3jPXH*96RL} zAB1Yf;l|z!2rP1>lDn3(RqwXrg3$eB$@pwsJDy87i|Nu&-ZqqBj&b?6O1S@18wYB% zEz+4f>H%5dUnBGXwMY>~w?=pDybPlY}HiG#fgc_Wdp}%&= zv)8ObL5bTx<%MeEyT96?)F^=?k-qHn)~VE7stn}(6i~^>lK$=U#6zN~SpHfR?MNB^ zDOJHEN$=?)qs>HVVGiD_U5D3b@8w2*<3I>9V7uWb9BZf9AqlL5->WTwNi%)ntb8b_oZCQ&#t!Ugh{HIeN7P?LkLbAVg66H4*__H3RMu@V={y`r ze%!tcSCzkW!|DUHY>7yd#;ycVk>{=l@6%N3Ry^s+W*}03Ilag2m-Af@pnyOGu{}P@ z%lN*Bbba9%?{!&x$t^FKTmL3BZHxSZS|iPLd(+NZg@Busd|b}HoT!D(pAM6ZsWx=u zsXUx8Q;jal86l^t_c8(d2%_jJw!UBj)qZo4fi-fN)wm1ZPdCKxooVb{T*U5sx&S9y z?I7>#Pmq6tYM?9O&q#+l;x$7R@^oVz$uZ@_IqNm7%ONBI0s+KAz72OS&!q3U?@sA| zlR@*d2IKI&jP2=h$EUohOuw@i`K^w`E5Z!qD$~fU1(IyW3nf^dTEm2B<@2=83Gv7I zr)XiM09eLo!KFo0>Dl0348LCqEg_3Qswf2i8Vr)vZr+frBHW}dlMkzoE=8%$yCHw< zC6&3chFHfn()8~IxO(>$;@dopJlPQn)svIS^F?ha7S@l6!uQFF4XrxNw39Bax?~ak@7h>UU5$C4z?`3QR zE6^u)2WEFH$CIY=pnf`sZ1Il<;g$oWMxhn2S8-X!=WjV?Qx2Ff@+6ukRY>y695Ovg z6H>Ed;L8*>>hf3}|CD60h4Sm5V9^?^`_avx%*||mADE6}n_jWr2V%$|4| z5Fb~EGXWQ9ps^Z0{my-pUtWP8+IhU9v~jBDs)_65JaKsL1!kk$N9KS{JjVJY(uSz_ zd?T|I{5!V>`;2#@rIZ>3-8;+fZT!wFK5YgP9%pgwHf?s_9|>smEdf{lebAYv53amp zAn~jnlr9zHU4I6Ow#MSypZyI_Ld-BeUJ;f328oHoQ5s{!;t%jf{q!^JhVfw95VVkK zT(k)*j8Z{=`gN|WagT_sN?|*H>Os*K33i$T56o4zK}41T-GgiC$Dtgw-hPM|o>!S{M{40Rg9%aE|MI7U?@;j4WEf3ZA|KZC^l5j<`0{`-k zf@nw{J-%Is=Kl6zzLrQ(={bu*!A1pR7NucbvNWif$HUmR1X?CG7cVZjLj<#gz|cJx zZFe4r^9jl*Z!^xkI-fvOG7b@<6o?mkec<5S!^G`{BhJs;K`;JmCe^D3$@Qu}W^na? z?55v-%)8m5D0Ex|AN_7*-9?djYksD4#H#RK#9eZKcO#k2?xRQ)+u4$bA`U_^gR@FQ23k)j@8&Ho|(2@gv)|8*kn87{`av3CP)n_M-=&TozjflZ9}&lhht9abG=avQ?||5@ zgTRYxr+4i4qIA(*qB8J~?Q=Flr8n`UPZZE1%Nig0>A~5<2^6lphpErp$)viU&FsSSdV!VDDA+9PH54aj#PgF9Fb`wk@gedv#Az2_r4z=%c#LT zi7B8e{uU(7kw%RzBegr?NL}+0Iw!mWaz>UykDUt*c8f+|`2}27RJ^I;c{DjDS&wrw zH=xf3?i*e^8>deVrQVw~I46h&1RTtR(_ZQP(%+$+f4-FdwQ>WYk$boZD2X|J1$#Wc z(mtVJw8)socD;E=3}*7F^#V6!6vychL` z*B4g7_D+3Eqa^f*)OHOj%lR39{_}(0Nn)U*)JcxsXamvp6Bxnkt@QqnAm~zmKwo;* z;l&F%)a0)ty?={y?L~cr@&OSD&yUAd_9sY$XD(gll}6@#cBJ*8SZ4*lkWX=nbQkmlRd;g?%+x_mBXNnSU@P(^%iR41{#)EY2<(1MC2lO zmiyBJz2ACa?Ry=NIgmnZ%4$f)a3+a6po)G+PJ!?95i#w`LbB(bGd-DD!OmN$0Q>b% zK#`0oIccr~cPIB^u4yJulRK+E%G-18Z#|>@h&n(2PDj)dwMlO?;+`ewl^&hmNW)PO$?xvn;VpRC*Q=%bcNyWZg zA#=A!vL!!`5+Qrrp)@-G-8#~Du^I*B3}HrzC0QhN5+`MH zY=qeyo7+UqBDP8zE>F>b|8B*=px;aQdms;u-6vXz_D1uSouuH;_bjsAG@mj4bqLy} zHL>!y4wl>uW8Yf!)0F7r&>en|d}HcycmG;8`x1dMlU^Fm%|k67O#uD(x%8TJ3Oq6! zgtxU{$(nwa_T6)YDt$X5a^oAOURi*_k1A1X`7T^Ky&D3yEP=kQ&*AIGjVK#!gVA;7 zWYOzbQ1-OpSdhpJY)PhDyTs{{JCkr#lH}p%#){DI;m6#DejICwB|A5X=AVReIJgjZy_e1|KrR0pJkU=Ct*>~Jre$GFP;Bg6My}=M%J%1 zhqI5?;e&N{tlk<)c+Kr=s+^7*x)9Fy-nz7`c?RWg^ttCOQ}bb}(*D$O7PTJ?1M3mM!UUJpLI^)dGP z9-=3gi?i?ig|!2Z$vjhCDl#PxX5eXdiIWA&&t46Tu@)q9d6=(PYRIKLJ@|WMC5)d} zp=~QX@W#=2cHJcIH*=YiL5YA`9~%pt{BaiS((%U}Zf7n^w_%S}BF?jTLOb_*Ans5H zb)z_(Ty_xOmvdPp$tbuxfg$}VJ3+4JI0|yiK4-oXbUe+(saEZHOrGPg=-;Fro%iX> zsPFWKW(FPD@rx0jcnz`_R1n#R^QoM_E~@H8qvGsH;%k*eJ=h)eyo^42+`UO9>vNzZ z+YA|*7LNOKhKz`wfS#tg(6|0H@xNM13W5}x%DCN;l8`PVa9o=0~NSMT7`@HS`lL>5m^bF|AQ^zam^YI7A{=BtO0E-_!;C%6QG-1XSe(Cyq#NhH_ zX3ybjy8D0z>bEq&^thEYKl%x_e|SsF-dkaxR6das=mfUd9n^R}SR40`DVW>MJLYqO z3EU)3OScXZsX!r;6Xg%W$x9(HISF(4^Wds+8`V=-f?CH5NZ7kY@Vf93`MzTuI&(uw z&7667>98!U>*%C^Jx_p>+bhf}EQclWT#wLC6E?N}CZ9{E!IJ$PpGU2OMstqYS=UF! z)(UEJP69zJFSBBzr?oK8PNu@wo~^h#F%lL$G(_8Zr+`g$G2gUP5@kkn$kf^!Sjo;n zt?a$%Gdvmh`g6{S%)`_p`VVQRbzr`42&P}Ti$QLRIP>QkdVT95lG=Zn%T`i)Z_PFM zG%XEZBr4G0aR&I)a%s4*2{dRZLg~X4dVg&Voqa(LpSn4a<6)2JaaTj^DjjCr)Kf^C zVKFA=h%rWdFI3nm)D%5S7O%cjrG>h&Frpbk?-%Qn*b*l=+S&sVYsxXMhy|sbIGiFi zo%C0_GJ&49=(x25wioV0K~|B>>C;BPfiMyXj!=EooT(5>#!J$aQOv)|KBejAXj$e=L=x@Edf7DGI(q;L&K!Y+ zSy6EOl|OpQKcf1Z#L)dqEBSN&H0Kk_=etHe1r2FU$n@x=FMf(1j>$Vf3LdY3(N{}x z-yH#3_Q{!P8v0G5YOR4k^&Z_f@EilVb;*o|r;r z#7>3Jp+*>#eGp@^k3+zv)kON287-aZi#wd-FyTWstME&K*%AAev=zS%MJ=*+AE7l|55?Zfo@`w(NXJLtlQ##RGAkPng8P|7 z6dvZzs6zoz>&wDnwQMSPUjYkM^7#9&X`qL44sClBRQvEz6}FFChXQy*Pp zd_OznKJI$z)#CNn_BqS>&s;A;txG zHS*0Qh|zI(Y&~`l?|mDf2YP10{@C3p6}^evh$*F7J0zOk-lEVxWgVkose>bD$Jz1n z`8cGt2@F%Z$cf1&&@Fh3|M&AN`e{I>Df)~W7H@ulw$COM%EY-hnt_qSxP z#us+tiqoVcLJjUVBoVve8AM&wg?*a|pg&wl-V8dhrNx^dpx782yeTHnS_x@iPh!I; z56veZptIW}X{d=hRIW6Hw=zHIb_QoPQV_POh^&7)zmWII*pqzev8B(S2gATG+e@XZ{qRwJ#Dvy}dWgQUimS(fMT<{h^)g zPj@C-r(V%^%Zr%v#~gGge_%AzB(b7B1+CAg;y?Wd#Jn+us&V|Eg9U5x{QfS8c6d+E zH?@I|c@8ad5rSeBOB^$-q|U_>U|?Z`*>ziC+P*S+$3>MU_}}2|O-RA>#}i0A4`AiH z25f3zG0i{&lz8sw*Xz%nxlOoUCZF2tEQRpf^T1Q5h`xOKm@(CVLEdkSBg$>ZkZ&7F zEbFSt^v5x{Y)A~+eN|!F-Wqt|XN1PZs-U#D8twn)fYSXUmbqWdw8y2xt>#DI_cj`w zry3>cx_#q68T->{d1@v8aFbx7f3M{o9ytoi*$o_1m%$TUpSj&Sg*qDD=X_Hu;NQfx zcwy%eK#yxo&&;VP^^yBNXp_PpU(P`#$AR(*)4&tcXTbyV1l>E`K)%lrGgS&;>ZONt zUXTYI-Rs7B=XX-azye+`nTSg+zo2cxN}$%f3#ug5nkK6(r2ES^!_H1g82kH*8Hrs1 zN3xn|vdlN8W>yhtJ}CztpL~d)>taXskhzNiV4~~z>F;6djr_LGy zXuNR|*;IWFnYm?Da4-nhUpJwD2kW5iOEmDjMu>Q=98``}QE4S}obP-F=LZJVE*ff~ zLr+}LfB9_a8{P}^8?LfP40$x&b4C^%kLs|&z9r%kAI1bwE^C8koxY|S*M~*xpLzypW+ih-c zzwa&@e{F-@7gqGE)e2Jcy^(V(ML_tkQ`qc!1KcW3GNYGuVajP!D8E>Oj-NO`_=pkx zyDOD*^4!H)S5MF*t@Y%6e>XAcLe|WQhpg0k81zUbiY*sVs^Bc= zXi1?XYin`+5>HS%B+`^UnWACvFsm2tOLS!u;Gkzdls5aoc8fRM%>EqMY`4V|zK4+g z(!>i@IEe_k@h;A8^dyhbPmYM{|QH^I&*@2n^o<{k$`k|SKMYj9h4(om`^u&kv_i`D& zeYza}oq9oT1YTiv$GP3GZY0Zp-_Ff7%t?IgJ`iaANrVEpIpgPgkl3Px&sI0mzm?y} z2GvTMWp4srZpC!8?kx0_50S5~)nK&Ul!+Phq0fW%W7wNSG(4b8C;T$OUy5lgtg6Hw z@&vv+$HKYW;oSRY27UB?DUNIGMB9aX=<{ve^zK6o_9azAo=_#R_|i+Fr^zvTy;IPn z$e6Jl%V%7|V=?-xIbGXe&h4sg=%Z)fx&3lH?(lU4LzPz$mpzfJ`Qe7?9A{PEoB93?8R_!zX{#jDh($jC7N7BLP5OQ0mc75 zg_{dD(0y6UVBU`pB=lMnZ>NJZ2LF7FqMyDI$-fcwb?y&(`(`1S7@TKfFI}dNC_uG8O0HO8dLa#m5q0M>kQ8I1yC*=0vI@ z|6}KxPGLHNnqWa$9<$YtJCh0Wz{P@dL+t4!T}$3G!$+Hl-HAF1p6O&$+yK0xnmF@} zCl^tNBH}sTa-Hl!8UyRnT%s4@8iq7!9q)RkT-wYQ%Aiz790W&9Mz+hS$d;jaa&jX5{jmI&L&Gt^=!?c$8;9* zkL$EBR|DG6d7(Ni`FjsH$gKree^0jDag@%GEF`ae5$+vpBTsjf(6qB#VEz4Qe6~pq zrp;Hyn&lEy$U2&7JTgQN*`-rmy{V{oa|-8ZHN^$rcEK%KJ8HZo82_JhJ9<|TTrOwP zN8cZTPH7Y^@;XI%BbxAZb_#X4;zPdNeh=5KO=LWiQt++aPogX`8y|7^_L!X|i9BJ8 z>rCxn&CX01)0D&fiNSP3gAM6L9n_m_gS#cUPRnC+uG9Dh_Mhm03lUPF8F>OjbHm_H z-4vM6CeBx~U4Us3%Phtykb^%6+qb zziCf`uZdc8eEvmtjcY;4>vZZ@7)uSfj*XPhOCoA_ih9^g!=RxO(l5#G^K0_+r3^2hHl@WxokN2 zR{TWG;1d{=br$MUqTX=%Mm#{Px!6cf{T6)la->b zjPK|ts+O$*tim|6pvx9VCLpoivyU`2{UoA>I!YuarQXoe4Z!mP*rKuVY@v9Oan}*^t8%e=<(@CSvK# z=j4UA1KeA(icFu9i%Ju1Q9oG|Ye%~AmRKD<+WncDR{g-G8|}dTX(?u-H2QtLL?rF2 zNS%W?$m_^L*Va6;M2_266=>rwdnFtXoXNQe-RV#FGAOttK@-g-nLeXTQrq!}m^hg* zgO>|w^WP~@Z`F*ZD*A9CvWn%oM9>@RvCuM49+E>A(z|=@ap@ulMrF-odSO!?i5IX3 zk9rA_gC+@)JFfRK%?m)JzDk9k`V>I?+ z6pmgxj~fDI=s+vi>$y_F^dHNi1uC2~HE1?5vOdrMXemjacF*R0+Qj*%+=QW6V3?ns zHxDD3eA*Q3z~${j8MmB=u&QDf?mr|5r#hPHoi!YX+}{&o_XyzR3qde`Uz)gywG*TE z`FKpT9636T`Sr9J*s<9kT3^PX>ti|Wd_d^-CH1^WKO>O0KToY)i?OuwDK%(UN4>BO z=xJDl~-$L;VR=EE~ z1U{=Lkd`t^o=r94p0zsUR$3S;9a;m8pHmoVJ2j}yI>=7=tONJ&`oc5aZ}iJ<4~Uy6 zU?H_P8^36-$HOgA@av8@)?4o6M@xTVLWURN3K11JeRl(P={zA@-h`vrIwdysU?jZi z>82lc93qjsjmWQ?w|OOjs&s^jVWnk%aGZZGQ!bN(VH1KtVAD6cja1SJ6>H$wYGv>a zO@sR6)1)W)DLGdhg&R9gv6q8R;EKab(CtV)<9#=cr0q{f{^@&Uc}NbGO_+-M!xQK( zOK$)6b1r5Jg~89g4zM6$8SZ&7NW9|y@`|?2$En{=kVBn2>BQ=bB>8t5NS%*^c4bPn zB#yGL9VXJU$J=T22WzUjNfpV!Tli{MNABk+l8*whjhbz;u>PSVX2|VDne}nd)vW}l ze~!cB%2#A@mniI&%))jhKINyRutIv;Xm$QCJAc2t#g@ki>x1_}LxByPnj{L1ofnzO zKJjF`t0ru5_$ekul)>>xG!YX6&NssO+dA!`;f@HH8cRV|(^7h6*GKkY*D|atxro7L zFUTVGE^2T$nbxV;;!?>dymagjv9@?eP6U+^)w56GzF{8`)=EX-{CRm#CCH?w8T98lkd{X-px?=ZiHA}#CkXLFp*D^jOn`Kwe7K(I$BBkQUg~h{NVkXeLRzM5Z+ou zZcdgXZ_}f3x!rB@6+Y9WUy8xyXf5h13qo9O0BaC$LUncI;8yQ>+LWCL5(=B}$l6}k z{LU5n`ojSXSuTsobLOMK0xe8@qE611sj#^VJkWF`iWx3cvA8_83T{MPCEXmy=S%xq zVm4zU{xyvyJ_b6t;`ul$GJOu*8_uTV&t>88fFln(yhw1o2u>OJgijWB&<@xCnBVF` zO=s^(kyCOrn$EAQ1oh!Vi|1*iVIBp z`yMibIp^MoGc;Y#lgw@GCM!Kh$m5bj*ygFjwEGD+B|-~yP3|CE2@xOWmcbqQ_pGYY z8*<|L8|L=v4ticPiij7ifMYW^z}UE;g-^RWo%CTj2NUhZzr$A=)y2&)F+8yLcUbiMcWEmlCPq z^H5ZBI)|$^#W0I{14*rK0;rQyG`jC9{;;USs%}R(Fxe5-X5Jz9+E+rE zTep(9e07}dJqv&8KcQQ=chU>@0)H;)~0KHfNK`f(VvO9RK%^O4tdhrFKP4Tp+F=!C$ZWI^g3yrevt zwin!hJllIH7?uM65@wNme;T;C;B+YZy#o*Zl^|m=qA)P^A$>ON!E7!Yp=E8kh_93A z@9p!^tR;rk4ZljZO<#x;=B&kMLBGhFQfrX(wKc>?WYKiX zbgT(J$GORF0sqHpbl{$&hINZUJR%M5+|htKQzy`^R0glhaqwEN0DVP}teL5csL~Cm zjf5>gp#;7!c0za844VA$3GtnG2#;^<1l76E#lC00qsk{YQ+~q&IN*7QG-R)ZwcB1( zgTce#y4sL$5R=MtTUSlgcjsfJ@?EMZV~aD{x$I)$rI_p@k9om4kbUR~N$1&-m~F=3 z?d}Bo@5(i)cF)D_^*0D}KbtDIaNO)G)$~g-4{APcLP=>Mvf}bnO1QpRhGG|EDPBl- z1VqA?^HsR!pboRTNfy~iBN}ibj?4Y7#{Et1ut)wp%>fzk-*VI_pplrgFI4Ofkl^2>l zlm*MGgDC%QF1AV6V9xp*r1<$>{9Im2(+eE&^uGu2s51$a3;nU$Vj?bcNXF=M*I>zt z`M4pXg;CRQ7^;GYfZ*f?MC@QKz>#J?{W=g4bg_2e>Q)6q#fHmk5FGkVEPRdEaZ zIi+Cq`#V$el5?6add=Qgw4T;Huj6=J{e16P=c#>?Jv=!lgX+;QVJvC^YPSiXKlgrl zHgtzR@0|^)jf-)^u|#P2=#7lkMe<+Jcb?jR2eGc~3f=YbC$;X}f%W>Tm=S)Q<6hsP z)}xKo><=zq>5X5p##No&U(EXH$e zUEnXGv(?93rcaRWG~xUkQgflcMjg)?dXZmsBbXL89k;AN+MO+fGQ7*o_qs^<(c%IJ z`0`LJWI{=oG;Om~1hr@CpjLSdinvU}#RCR-Tx@{YDyBkpN)4mu)k3AuB;m2~8(3|< zoXhO+;r{8n+!%6|Cofdv}W zR)c7$J+Ahi4>>m@$P8{j0?!+;t(_s=xk)(9tSKnesjAzDEPX ztiN;2BOiEDr%G)&n%nA?*J)al8A>R0@~&?vL*pqoK#cqQU#|_R?dduy`b`O|c1%M5 zK_!^9LKh03PiQi@)=tw@`nk;3DON8>9(hv|fPBBn|8lQ}8dwOEohFrN9iKtu9T%hD ziC-k&JDpin^PSnV_X(}n+yyJ%%|YouQ@H2zC?1@<01ATM;e&4<>0|f1yn44Jwv``@ z*M3!!`duY-&!Y)V=h{-?0k>QKWuwY!5A7vaIKlIvu_^3bG6|hI7i@^fdRY8Bp8e4C z|6HUu?aSSR-LWr-tFAEIQ)YD;*>e!w~l}+4U|6Bs~*WHXq_ueOQ@0H-S zZyW7U2!(JzMdUr$fJKw%Ls+FCl zVY1VDm}E!%B

%VQN%7>D^!j8`jrQ58GFC_3#RiS=fSyx7m|NLPzjZ-Y5E6e>Dch z6=Ax&BQg7W9tKKIlhW&xz)f)p*HHo7o?SxquJw}LSx6_$hwo?l~ynjx==59nhlS*D1b)!YweQLR<7DLAZ8%E@ovD-NghJwrj zvNTr=Gj==CW9OE`hw2RIxZwjvOSZw=S)=sabaf(gHJQ4poniG-YsmH^x~QO=0jJkG zpfYb8=r~5<)jjrj=XME}bJ>68p(0pgw-4nLGa$+B5X^sh6S}t_puKGYShw84d~%jB zxh^1#YxW0XvCng2U*(LMw;qti){gK?ZD^NO$VfR{-WhD7jV*g@!Cs|QJjvM8;q2#>FPBbS`He#iAs zZ0Yyupdhpiek!L@m6lF=diHN_=l6tf_-GFlNiD3szC8*b{mWzigv>z!VF!3IBauRQ z0BS!zf?tk0fP^5zP;CYlU0ed}H)VWmyN$$5yhdVf*@51bT)Zavo_KZc#R-|KF>5T3 z^MNcNoy3hM+8KfN=9?sB^K$Z@yRKHw?E}w!La4cSK7F&(50@=O`r@q&p`4#Vec3hW zuJpjB;lr4->kcC+`J}|c_h_M*m6@ za0_Nlm>hNTy-%;l?j||2BC)M-g2mMOJTm&M9B=QvN^j&I!*|A$Fz}TTIh$(@D`hm< z(o@oOmzWSHlrO<8SCc`tRD@S1eu|_GCsO+$AKZV>5|^zqh0w*zp#9S~R#>7G&Hjs` zRpc7B#BIZ)v6j$P?@eNOD~O*%#>Pot+_l( zKh4714(3=k=?pQctY(}{FH)c7E>LyxDkh%I1Sj)1Dx@2%xqS#n}o_V+U64Ha~X}Y)z@HSN7J-K3VJ5)e(%(p=E zWd{06eQ|chHPZ2{jp%<0VZuZVFzas|{WaW*8z7{jZd)c^E>T zI?m#rDIzFYD}iGRo7v2}7s>TQ8^NY82@c%w1+AP$%&Fk=Mvkw^-s!`fhtHj6C0<~e z*w4(YJsjuA$cEJa>||m?L~u?<6cy91!Pqr%^uvmNEcC90fXG-7H2g_+|JFhUApzi7 zSZtT55?bz5`V)Ky#LAotvY8y^Trv_qxpu=IPSdq#uMCgp5k#kZ93NQjlI|* z0_$hT;ymlgWYp*%*vc-#JBC$6N0!o5+avV93=fEI9wskJ%81nS)o9GmCq@rntLot&cqvsT&Q1y4hWEqhIWhi$;s4@~IO8(ccZBoW+At)Xe_3KHQH3hH{9 zaC$)zro4I%qnCovO1v2E&F8MkD@8=(-5q$f?GApQ;)Y+mhUqVk>93M@7?kaBy&EPAQNy8$4 zF|rY}aGGxy3EMtOw;hwRfP^girf?Nhi6r5nsk5-jwujx(e~6^Lt|Iag3sG@{0jU1e z#HNK-B;xaYd|;D-=Q;jkN3jOp+!ltGlGL%yLcoGq`~=q91=3fCYhZfF zY0`9eHT~(I0lPPSr<+#B(ZY+;M0>Fcyn5dVQ?;6CgLMr0S%;&Wf;H7oG=TeWSJq}N z?ZW=SXMAyq+cZFRI(_kv(DGBWvFU?+qsX5D@+9yetc|jwlRjv_R@qN5|?JS0zI*24w0n4O{=s9~KnjPALv_zIK_C^jI89P|}G?6`f_5p2Js!c9c zJ|PaVEyUO;1$DO+u@`e4uw3yN%zdNDm(9>>{Lwd$UVOlLj=bYIhxQ*5>}Q3CI(6xa zDGFGl!QzFMWw^zE18(9fLT=%8WZJ+KEb*I7j@wViT?g&K_~S8l?PkueBz=&oRZYil zg{Lr7{~5Ro|1sC=8zY}vTu^MX1DTXAjbpCXXsN*M5l&_kl^jB(O7n^7)f5bz;DVty ziwO-~h~gGnP%-Hj*Q>csrQb`zZVjr?R})d_5)G>J)2`+7?S^7lS!C~RFl^R zSNL*O5Z}(}V0CMi;DO3U`tn03vpYNkMt~v z0_>rZpkrbIA0vwh5FSeBchQ-m^U++tjU*dJ;g{P3)cE-VEN`4jSvOfYeM64utEQ4q zhYdkw&jHYJ=Ul`2TJ-9;C=qPqSh%6YuI;=>-PmZk`{GJZeBf$A0I|w+w30j*fC6Y-Q>}87o6yQ=VEMMp2hie{*vFn zx8S-~NxH^Ni=}ed9Pn$W~TVMnq{)*10c2LsOchMT(YDp~xQD zipWSr3xz`A+!x6xp_CF0Ar+Al>KDrY{2zJb!T0;(ocq46&*%O2yUFbz{h^n~h`4;C zr2e@$s0+M+%A5|OxW9@hW^#Ff(K-}uc|fbO7Lq!N>SyhYa{rfe*Rq2D}c zrMHfL%r^vstFyuCkqA`{k%xr=2GG(voyc`BhZhO9$g}nvbsTyEb3X2;uC;t5&-XW@ zS|$g3bPwVCjhi9h{58HNwZJ#3ok4}Z3J!WC@;lwQ9SB1W=NbWjM=3{GRCur+#Q zU&U7Lyq&Ny!)TFVC^`g5;n=TST%Y-jo1w`NTF--TQl8P}%}wO(_gNU}IYhyPdsYc5 zfr+Og3Y(w8`c=t5yQZT8dyhOjdYSHyaiKG3rs28PDWGlT2kpn}ae+Y^)mEyfsV^Qf zUw+rq(3acmM~6%!&IL{aQIy!p!mAK#lnedrq)opdKEawq77 z{23y_NMiLrc{rDR2EU~yk)5jD=gIv}!1^9lg!^t>9eDX=&xU z{1<7xt32uI>x9I`Psk7E3H|=Jflj@&kNG$!oQf42;z0L&`aB|xDbYF)*0)1ZSa~7& z@h6rh91W$>v4V7H+Yj>aPz0mIU51Y@(gqjPZV=Y7=hz3T_yMeNP;~lI6_+^yC{^LUE^*V|`Y#32a;5gSuZj)Qb zrkKoa+{fJFvx7ysf+#H(fL3Z%)OmLlO#atI8@vK&eeNmT8S9S=N4^@1sHrh3C){C% z&SA74Peh67#bp12Vtj9907u;T(Nv{?72)0m)7BedV8?p)-hvUXpIwW4ml|R|5yHvs zO<<~JVH`hdNn-o@i1+5>kpE{Y*G(=Yi#Z3z!nrX_N>3Q5H&(K))0?P^g&FL+7Kg#Z z-k^=LSf^XauK%vd&GLijPjz$L(7p>S=Z53K+&83iC>J*lx5JJ#+0Y)d0N;d5!OhqU z#NS^8n;f#(d(U3c39lZyYWW51-}{@ygm#wsVk0g*%K2A6)e(U@S>$m(N23~|A!=0| zG+r!%SL?dy+P(Z>(i4em6W%lHKDZKv&+EbK{y|vtTOD7fNr6XEE+f`iL{rL>sB#ZC zyV^3F*fu1R;;c9vso*i5va1fG)@i~-(`{l8`b5BiK|M#xu_Bsrp4V3#-|3ICVe{!l zCIwXX`hs+i5eP|!0?)l}M)Fe#y)!z>?V*jJxh<8L>!h-}O&fvv#EXsn=ZW+DArhnL zLr2d~!3^_Yj)Q4O{{5&RN+}C*X;3kkrj*dzZ=*;hsbDWpKA~)(Hq;tCCdP&UM=~^# ze7Ou8jP77h?K1i*#*_8____34R2Xes(@Ku-F~{tXeDJhf2-znVl<&x`A^WfL;|rw& zWVWgb%H%|$nXz=le+MHVuOp+Z-ufHoTg!swsu$t)iP*6^I6=M(DdU4Y88r4chR>T9 zbGhnQFz4}HI3ukD0vDgse|i$|FP`(wt~S9Ok*OqQBR{b@kxKo(R)EENf1EdipX`y} zK~;u|ahjVm-CvwUL!GjyX^|8Co-qr^#ueOoa*&2}oHcfhn_^=A{9f7M-Ph!Y_irY@ ztsjCozANx2kO?JEJmnum?UJI&oU~h1O`;5rZxN;$?Guy)reJi|bh2%`5y$6|LY}Ji z_7Lv4aApPEgRdk(>>v!SjKj%$l9((bPWQ`LGcQ|>=+z<>l-?AC z9@?MD()PWy)p83vbia|cz2OGyeqALZng(duSc2t$V_}WH3oP24MKfD>z*>$ocYRoq zR-~Cn7;ah&zasC_;-9PN%+n1pJ@yytVEKZ3PD){y+IB2-9wZBTchHEdtME|9O(ymC zFxzO)eZC||>boTy7jJjN!HIIbmwugn_<{4nDRZA;(gHNoUeKIuQ&9UDNR9OP3IDEU z&Y9SWH^$0|R?JBpwSGhOzOTpamkvPtpC2@!B7kIl(#F59GH~kl=cMCK5bQ$E`IRGN zk`*&a3_@l@&GoNj<=SvIpUZ{l#~R~UZ2-!p?jlc*%)o7nKNH7x;fkIO4p`BhjUS7e zh(bsP^hr9yk&l*%&(Iv2UO+z|)i)n8Phuvwr@vw|KeHnBZ z4~xjc@{ed-Ss?*4jXOwN+(t63YKT!jtW1?t{-8@&AYqvxtTKrqtFr3w-ItX`|1MoY z(ean0McvVOIxV3_DPQT_pBkjMLlyMy*g*NnTau`3%(1}3XliwvVV}Q035jW?k2|-6 z(~XTNx^#2r6Tw+R;q;>ZHu}C$9rUiNz%f5T@Cb?n`Q2CG$fG1S z;`Lb=RnWw(5BGro-8s~=l-EdUwikvD&4sv2f%tRA1FAgB5l*e#Ly8Rx8Hd`t#MJ6C z=Y9<)+3GW(zNd@0{Mv_1Y!opzeSy#YeYt0-4>~{8r)fodnGZXJO#CFKQ@+wg5MUn% zt7D>YD^EK(glpq2+p|#k_yauNd=B=jltJS@6Fha82MwD?NJst_$S}W63~3mM?+}CE z&z94Dv&+fK^MUwk$xZy-zZtrkqiMW+dUTd{v{Zs6Yj`SVYX*aKbqSIB%FDi9w+__BHWEkk-RRqx3}2kp@yg80G=o2h z2>66RYF8@pFKH#JVwpHzU&)AmYKA{Fg~lCtjtvh+%1=I@%?vth!UG)B^xX^53fEiQ z8Lx-y>iC+Wq!E`bk(IzTS`%bk%pANUQsMCPSx}lZL@c%2p;Nb?^1Ea)`OaaedR8Bf zCRS13yFH{x>=(S<{2GsbcA!mk4GkaS_OBMgI7RFTZC~VxKhpWgZa!B`Du}_Q!g27s zt^+026mXb-Do)*^gAo$zP~yOC_V@*sd@2tn?b8iGD!Lh({%OEwvmEGnWQKkRR^#zi z59roqi@;Pz20;#f%e5_j7mqU*3`A``9&RJpTy{KEA>R$#Q%Wjd1en zkb#l)>oPbLpaLfc454i%Pers7HzSW}#XzY(^2{Mn_*VaE)Z{u*2VSJ&c+WGa`IiW? zW3l)pEfpSX1d<-p5S;LfgNI|Y@YJ+ixYqFiPbi8*L(v6X^K%RO3(kN!tK;C{fH?Uq zq7QN}pF?8>w-@l*Lj?1l8f3W3(;!C!jC?gnH+~8r?OOBcW>pRRJ1?Z%DI$wR#2h6t z{pzH0aFkko48oyL6*Oq>U8BRp&E#C@E9x{7zR<8o9{Wj26 zKOe=?9q4*{e~buIgsH*&@H$Ty-Cu0R&5eGvdsz||wD41dW9LC@n>QPKTNs!(fnX-x zNCdu!Vy9aW&L4b5wUb3zvnF47^K}WD9K1m%A11P*jc)L2ARO;E=%WL3h>ocgplL)4 ztE+Jst4B)kBz1)~vHysOg9g4d$GLetV$hXvAg@)MKq{gY4ytTc{`mFJW zSobsJc-+-;#g|v$gm5%@+txyFT-r%rhb$#}v0sUn6dC*6Zd~rp#E4By5_8dsF}C0L24c*Y767z4({IUya_y2kAdsP z&9o^$g>`1mQme0L38oE@L#})#t~{KxX@xo05sznr)BQ1JrYzI1TgQAdt)lbhonTy7 z8>8Kz2=S>k!UK1*sAJGK+H$ap#KrfKEax;bSHF}pBJrqmv){a zWW9(fH8I!Y&lh6_B+w5lggr*hSOq znBEN>qc^sTzSgRQ$B#y6_S`l`FEfOqMpe0y&0^qv`<#q_)vFku9>iI<1o83Li;&c` zpNJLG^Hpi1K3?}-q)#a(bc4G?1tC;1kk9>X{S3L`f%rzO3<6Tc>?Q+n`Vku2w z6li$vVF(M@N4i`Hv93x+=f_JiMN0=pUhKjGol0Ckb2F?;TTbo#PjDVSJ22y0MnC_Q z!I+kCdLn%>5#0O$_w-zaC;a^6hRY}Tm358G;a6a_UvLhK_ze2)ur%~rPe8|^U>Lj~ zh&2YwL2OGT^?8!b{H_jUHay%2{LEp<5f6Y;ulsoT*>VUS{0PB|>S?-=9wt5x#WsO1 z%AYkI7c0r2>p^vt94o<7zMT+fKSnE-*OuOy6M|;e&R}-wG8`&Ng@&!6@L=kHOnl)r zcoIZ0uf7sLx#rNR&#D+c@mF;9pX_qYQC^6sxQDSFd#SW6w`G0dP5fe4(Qs=MOwK7F z>jL>et@}LMcx6y|g-dW*z`*G2yVK0}PePP8cMZx-Prw_kY3zU2%SlqHHgWoPkX&o2 zhSxg!(7$ChT(CaLkVTu|*`I7OahwOo4xgo6lBF=N5=~pQ&XH;3kstvoXl-^3v$i8? zUe`~k`w7r6@Frs3znCD`E-IBDPd-_lraQbdNwUm*`uSB9=g!f_4m~H>a_%(Dyr%>M zOAbQsqH{!ZjvyE;;Ac;Y=E8@(lQ78}0V~d|gZp#lRaiQ<5`mABxHEM*%=7XP4%~X3 z_^;cJstS&%OSiF$y*=Q<+u68Hcak2Xi6GqknCyHr6~2qz!Vbv?#N;+FsvTK|CBava z|ItI*!j}R94pYH$>q2tmVKu4YK8qEXDW=O6Nh6mXoJ&TiSo<(NGmt_0R!GC6$TVvG zI-K0@c*vf2d&rI*vgXd5i=ZyfoM?*4k&;s) z&cKBhN_e&J5x#MXA|`&#L^vb|j?TITq7~fTYrO=taCc6R)j}0@Sw`jAXJk=s{Xwoj zTMW6Pis<^6^UKZVn5vcfIJx{8p?*d%)@2U0(>)s)fnU%%2;9C1yM79oywb~}`Gp@@CD}mgl`G5s@Jxnn z)f&+2y@_Vub-^%yj(xpH90qQ;(<8zs*{9pZKsj97SbnUZl++fNUAnOy3w!{hC6>{Q zi_);dZx8J|9s}3fylFMRI<8uFjXeLfn;wZjf%<`hw8{GlZRXz&{7*KJxv&4Sv4S5U z_*y8(jPS*o8aKf0-Zkt96oYQdW!NyB$~F$}$6Swp^whEmws6roXFzsrKQ8H7@8o`1M(wgvQ#nbQ}mJc9-nQl;>K@@(c5f%PIW34^K z$iz<=k5rW4gU%spsSr+c>w~HJwJj{s7KPR&W^m%mDv%l}!0(*v`mu8@*`C3`L7Ss+ zSgIN;=j^~lF&;W;qFLVF>I%`qy0F1E3#vT>(eT%Klyl~|x+a(Kkkxuz?Cyolg0c`1 zRe~`i-27*vmgcvMQbBoee}z%Ih?H%uK5rBk<* zJaVJ`H(et`;H#(?=!a@@3?wahlX4fcO6$n$%uSptC!NgZTpEL(m*LCVI2v79&0g!- z06hBzaN1L@XKZJQTi2^l0d-R>(#@yB3vSRGJ-<*@`3oGoW<(8UD{`5`V6+r<2J6}i zu$*!Z?k~3omHv7noBkYv2IgaNNffQx@|Zd)$&iW3K`MJVmg(!Mf&A2YI5t#8Pn->d z$sRAT;Lc4C>xA%g_-T@{ojZ3Ia16cqowTbv1V%=+apNVdtHZS75o$@utZ~H9h z$=`#9IyJJeX1I~e`f74T`+Fqs9C;1SNTGa}k(8vg{@Dy+p;{5!-_<^5FJ;xbh|J4|b~+#*^E zQS@R)E6fYZH8Oqmfq2UtgM|`EdLMehqiLa(@3Ag;`};zB8|UqKWCdq_^HvCiO#{B; zo%CMsIGLi=A{=u+n3jE6LpPk5>>|563n`Oz7h=l&(Lf*fIWlqVYebHE<8|Hz=vQZk{q z8aF-CL84ztT)Vd55%W#d{-+S^t}#c?O>xB6u7P$wXaiFhX;8e=2IAKGpgpn=yj}=a zR9>znd%Dc<%lAvfmEVq-1~0(7;0&E7mVwQk_c;HnH#Jp!PD_hTp!&-oi9Y9nf32ix z%%io`uj>tUbvFmG+s0t?cP4vryq=sZiKn+Ztzr7Vr|@NP5$aC0r3wxswEfFH*!xTw zgeqL{V7Mvr6vn{n4NBx>r5&1-yMv8T9=0D7K&Qk+ydvU^VN>?O$)o&mTJk>Kx$sMb zrg8+_v2sJ6U7N8zK@RewW*0^f@ZkYR-AK4d2=!S-~aO(G0`uxWxeCG2Ef80tX5+0vf1CA0uC;mP8C(ivp zFStrdR1V-)U16GVq6)>eg^e$4E?|y?2SW|#yFaLKhs{xJCb?hsL(3i?HY&y*Qgv%d zu#yP|how>8vgh=%>PvW@EM}rDFKw0M^c34sTe7(rw8PNT$mI;x@~; zJhIZCy!h6F2g{Xl(yEcfZxP7d^Zz*aEylJn3IZcTTx$63e_ziv!No1 zq~dWg>_4y0`2#PZ`-98y*mIa&Iim#g%v0bM%|PWTFA0yDA5B`7K`e{aQS~vG%WC+K z6c4Y%;6u(Jy;_=th4K(SS$>oJsY}r*TpVlp6!80a7B)-g64TALgb(%x&PWE-4eR^eW?RUmGfN?&gYgn!oMxGP}->aY8wUc@@6dpH%p z?@(r~`(&VPRFm||y++EFH#wjq6#U4PaIv^Ej4WMDruO!LB5 zJ8#i^uVDH}zlqrJ3PH}aX&7^x>$M)gN=~7l%e^>}eNdVwQr-*f35Q zePA`nY~p5fj)_ZiVTv!z#@gX_>JjqJXon&lYLF_-*1as>?37wOIUD0ro$xq9Wfq z$itCYZ1k%NI(ZveE8iFz?4Lys4H^Ss=RrTXGgluR!A_?fnvyxea3k#r^W@hNe> zqZlH%W&!%1%O!JR&#h!4W%UZfd`V88io(3j* z6b1@w=${9(QN277=35DyG+tQCIxI`2Yc}@MJ#)-p?mAfTJrDQZ z>Z8v7GVm?xCB1BGKv&+gWyD*>>GjZTcJ@;{_|&os4!?X1Z?~L5CGALd$AdOfw#<~i zmpO>X{dJ+T(*g|sb3oPjn@nEa3{tit8_63-8cNI9n8I?nw0IWC#?~8;%y7p=x!$lW zPLZknv6OD^u_QYWY@pMoN`Qq@H_Z5B3^iZ4d%gEQ$Q&4C{g<^d6HhMyZ7l@f)>3Bg z`3}h6mq>J+!cbgEkytVbxL-I70{N1K4@w5%fc|`vuOLGQbWRYr&BXwjg*1D+Bq%TO z$F2#EvttqffkwkrDsdXRS#Rc8?f2+;10gJ{dxuLdm%#Fy3Xsm-VMo_KAxCZm0v+eA z@Om}E&iQzm{QnLo9cYRHjmfmig}}^^eOMfRoX+Y)uy?P4nT9p!+V-4o6K>>OftT@L zxg>jpJ2w`~N5GMF%hB~X#WM~%P~G2+BPF>|{kVqS|IF?1404!%oIko~zbU*4KLIa? z|B|@gFj(*Kll1R=jkmHnW~|gEv_G0p0+SQ~N3>Apy_8AeG$U~Q=YijLawO*lZQ_yL zMcz;SNluL<;lJ0-^x2~-a&RPqSf3vt7GiI%niEhaxuJaN znnTz|YVp#hD3mEyqHET!!SW}CMD4>6*mtfhKeq8RHR6@Q!Dt^`o%oclKN*Ype&%H- zG}l7&a3IkYUWWz~!4Y@QT7lHtH&m%=F&vFeg+s3@7;AS)_GxPX*<^YK=Dht5;upF6 z1=r$u;R^307@3qn{BVlMNF;OYB{zH$a)EO) zYEk9;H{j^>SEO!}3|{mV!_rOvq5CU&oQ_U7SKfz&?AZecyhO-PSD<;^S$Lj`h>3up z4j8OhMdTJroA6cyK#Q;}O3QP(|5kl$ci01O_6L%-fHgGdy${X-S(Kc7UtTuX3{S;` z8_DRtC7)kDVY+%=)6YBr2`AIh$h?mhkuzlBiAox)sfjlSmzex;je?CFtE}qT7shG* zb>w@cOB9^v!N$b~gbPUR>v{g55~K6-$7Y-z!6T*Z8^FQBvM= z6RZvou{QhzEOFk8HvC(#{k$xGs(H`!OmefLiU@o&Y-@aKu{a)!p23RTKMluI=76yU zfd_N9QMxpqY;aU0>lejh>B(q1?ROlO%_0z?_LpYQ+kh5>^BMIGNZ%^iU`vq|xq1I0 z(N5=bhY>mS#Ox+C?zm-Cm-CI33(m!+`{~R;_D!0;W*#29KC{A5LIf&aYcN_e0Izsc za8HU7)ic_JY0`6O?)GUg`#RG8>$mCcpnCGP#~NFf8nVy$D9G?d(!Da9QMG$IG}w5s zpXU@}VP+D?e-ywS+f0d=>@UWsM-pT1T)N~_=FrRW^he2x zKq) ziN3|W_w1uzm?$XNf05lF=S7^^02Go6DDTRA1=)5zQw z`1&qP-!pD388%K$X*m(Fx(e^)&Y-KRAvLU64Rwm0Q1{6T3M{r`N9=a6|N4v!EIf+T z&I)UZ8u_DC#Jo*sao9bbI53WMVq*4>BU;r(FzOB4e$qCs-Jf#%+* zWTu@n0yD$uP+6M-UF(ER%D%0Jf1f64_*f*U0}o!YOoi~uH$q=O6w(xBQSx;A3H)2T z22Z^?368e$s=(FH;vm=8tf?eWeM;e_n{b!444d-W3bJ7BDt8QJ^vJ zCNM6eC=ko#rQGI0e(xN-Xnc`OpP>eivk%g!Im_^xc_x|$N&)*#pyF^W=X6PMK~ME! zG)|bpb$oWwdg<>Zsg05*TVWXBe+jXgx0s$o?{I2+D-?4bw7mFsaxwb}JKU{I;G;F?;rfq*g8gowQnpH1 zu!a{;#djI|J&D84Iu*>H4aPx73@|an9AD*XM(|F_g#$BJB5&(m`UGgpj1m{>Cjc(uk_@M`ECVmf7D|MILk6mGhC&=ykXrPJA?{ z62sNZR`~!FdufCVMk+{`Wg&YsF$;v2*3&z0Wl2!hOsJ{5kGikl(Fwl{%u0C3syx3* z=$!@NYyXyQJmd#2;&@E1ds`4+!zs9i?*#;SC}C@4D&_eTMZZP-puyVtDOngU})Hlx%u%2(&zhjhmO3l3E^qqp`+^ zIA2Z+eJ_bu7(T9pe_Gn)N8vJzG+zbO;V$EBItPyMtC1T+4X|?LClzrx#_j(SVb!s@ z@W7$J+`$c=akX4S&d{MiF;8gaNdNd6W}57h(2?TB7qWo zj6mfBl04{xxnJ}_(szP*%5hxI_i==8{z7UMY>h`*FXHX&US6+T#(d8;pzA7}aP`n# zrfDFJSwC1q{oJx?1YbR=O{j)rS42R$-;NyXy@Jc;K1IITXu4s$9Gsea6wG3|tmC{8 zY#sbT6lW|YfeYJ+Wh6he&zc9}@dfn6)r+KOu{bPG^1(BfvY5Ag1%Cbfo+;=pAcusy z7{$08s#ecXedA;lO0xtxj!|0U@SX7-`cuANejHbFvrt99b6}VGi+r-EELX`>XXKUU zVTbNLOzmAwk_Rq<>z*X|H^mztl`bIH6237qV=_>8OarLGK|FN=(0y(S+qFsy8~!?B z-tW(J>n=5{$P&f5YgO0*L*aYXZ5|MN^kb4ov%(to%=J-5)xcTln zyjpvM=C65G-kzfbKQF#Rw+tPcoXt=n~ILU80-wUJrrG_dW?hqcuQ z;rs?2YEq@mah8)va$iRI^E(Xqs^y~Ja!ojRYz{82TnxTp7h!1rN;>Sk1%vJ6;Kf#6 zlgxR&WbBm|6F4Oi7waE^d5i4vLa-RxwaF5l#BhAJe=d?8p73e@J0{T}8P&aFXr0Ad z5-*xY^7mSilz~`S5;8%=NiEbotweLX!+4;%jD*iTOYJYKK&^)}782Me84c(AsN=&c+<{`^Paw8R@P z_mx8P(xXC`H%6l3_%otzwh1dbHA!nWkIAO*@pQm-6;%A)UjA9!8jEf6nXk?~^pdnA zxojGQ>&412*zy7y)9Nx(q~_FGXK?$*ak9nE5v{f4QTLn> z*j=8EVPiV%eV^&{bbA~=x|BxlWNu+h&U3kHoj_E4avnFfbMKGeEAjd9UU*bz$6WV* zN6+-%qFS4$RPg*AXBRE;#EpN2NX#u~u;?#?73DqTiLxE>IdF_)seUILZn_z%4F7_z z>lQ!@{~8-58DpdLDpu~xP2wct17jTT`SHD}MB>R>;(KmBz3+1nx33=MdJaE{k9!8W zTU1L2cXC9zeZx4KEQ~MCorBp4H?gJ63Lh^PH}QS0^q^#nF z|8?#r_3N+V>`xN->%B4j?i8cSGxKOj?LH!WtWfNLM z+wQnv^WVzy9b#V@!$egkk@p5}n=X$djqhmxrw2si%~o0*dm82bYi3-6>p%fIji`6|9<_ZsP7OV;F(S4FGzKSUa zI0la1LfUlCgE>Et1S)=hXruao{#9|n>U=NUIxmPiO5!0@zw=4(|jPQ-@ND?AIqpnC#e*Z0z0{(S7B zGl}S&WDn_fJ5eShfC$XZq+zw(4z^zlsxFJb(HGpzA(q>IjH-aOn>p8Ys3Bpx+c2kM z12L<6P2D$d0+Y}?VDxeZN;4De2adDj-!Q|ZkNXaXnCsL_(FVVTy1>4^IJD>P@WH`7 zB$Q_(e*3!<*LYrIm#_&!gG&hbr)&-WejR$bXHu{)2anIlD`4UjG=`1c6odQGLPPXIaL)!KymY9C+HIlp@3I*OAWA?`y zH1z7E%0d<}kh%@MZl<#5gtmb>uQqUQY-ZcJX6VusB3W{re``#e*z#J_iK$T}tvi$E zZytgfa}!`uuNQp%$`9J&UZ{9J5vG)>Vf-ZLH2LKwoU}8Jwu&Bxh8Z*HX|8iI^=2(3 z@x_yk$pG1fuJ}zimEPsvC9jN9srcwtCc`2Ee?;Cu+m=5XkP&@%%76P-cH+w7B7XdN|)DUo~9z0b~PEQ6?`Q+f)?bIpAX%T z9K~@#wb45x1+&D9XzJq?^kSPmJu#_>6c<`(MhF*Zi{ee{|KA*d%5sPv~mZ8lnW)ZXL!C?H~D=Ic(1AAAyE{@PwLa&Tyxz=+;p32=WCKvf&F=)+1Y(B#hk+nO9`!0BwFFg=M8 zjn<^nVxkx&kU^4GZ=i2|XA|w)r(nXt66bz9!7gYDg{mdIct^6HsF#>g?Z_Bt2{?%{ zb2YfG&pqI`$iRPh@4}jc*T_`u6?kl$GVV4Ps`&Fk4epK@F&{jQDX-Hi(o?n{UZE^I73eoNif-=+1!4XuT9&JY^AZB- z#lckiwJZSd6)Mq3@}}frSS*#2EGN60{XuYDC+@hEM1PIBF`+V2s3FUB+W{u)7+MP?BP&Y7^Rw!HL5MHaoG_kt{P^<#c>jvi@J462b)%uJmNbk;8w zEarG8Pbvo)=ZN1_U*<$njQL88ld_`kxPE3yz&MTH!`+#`33Fbbo%HTf6Er;&0l{28 z?z+qO^8Ye(Y2Dj!khr{?Vecn^hLkeiaMyy&o&-il$As43KwK&Ql74>liyR%;&qU4) zB{{4xT1~1zqf##ny$pp*VXKIS;w5aftVFHIJ!n0;mrdi@;L zCT(P``wU`jb^&Iq-X?D1?&Yl>`RufJAzVkm9yRk#G3f~(2!hrbfE*B6NO_4Y27C-Criug;_Hdk zm^nN7xZAi-vKG};i-GS&5Zpg{j`IoWQGvaaO z`h|dibs4^AOG((bH+VP69G7uDl$l$i&^-GV{XBCzbcuTC$7DJ7f+A+g!*- zW+p6SL@PX3UZw&&UZ7mjMF<_5q-~~ascMA>`Tg7npEUrEe*Q!3V{)J*`ZgJ^FJSg> z^1_J7v*7O*O@vx(=;Eiv?3{!Qda*a2N=_)S@@>nA{Y^bQF#QgR;+{n@qMhvZ)dgfY zNR1r&WkP)`>R}|=3{UE0u1$A7p0bU*mK%RgASlwJlqwh50f`WeL`ub~V8MFy+ ztMt;L(nNM<^9*n{*Ce7UTwcb?8~FL&fX;rN3jJ3v*^3)vsr_A1MmMjPo(h#Q4ykJ= zUGKw)vt%N9UiOUkJI%$&}nA!U7<|GbW6R*ce`?LSF+vo`JKW5A zlju(k#mq-Sa27~6HM%*6sa=Jonqt4R}Jci`9>^yo-{B%hixfuu_Me0 z4Bxwb@^J20`4NA8u zqo=`tOR8G`#NAHo)S8HW3T^K?td5pLP`-f=f^QE6wF zTZO>GyF&D?v>N=<;ls%-smMDpNx%7DCY{`_yYjOLYGtXyn1%-`Sx*HYA6ZZoSD@OL zgQ>@vbl~ya$9PwMDz&+?n?$7+5RZ4x=rdgvs=E)M)*COJH^AVBns|AFd7}Im|DD*%d{wrgV!df_Tsflb&MjV= z-DgC9JnSYOCoe&AZ96po&_bHsh0@D*Q!9Bv{OM3lr%k!SF|}IIcy~WJf9Nh*(XtV8 zOLRe}FCD~Bhq9eZ73t2VAXxbQ4GroVCm-EYNLI`~^md+wOV8MF>>4HHOWg=l|HYD! z!33fcnT4ZlKk*4E0mbuLm=Jaq$5yHu8y{K?+Lbo=KH@hca%CZDsqCdS3x1&NtdnHm z<}}V($mPEkxE|#Cdr z=)&+zs=y(yDE8pb?c`BJD3!Wy!0fO)Ow666VDC3`7*b0o>WAfErO-#RbEiCfU0{O| z|K74EuiPiOeBDI!qe=Ncy%u{+Ti5&s7Tt&j zMzalW?VOLNWVX>(nYri}ZvYSWh70p()-ry*VYqkN0-V_Wj?{kX1~2(klC`>#?nyq5 zjK(l#R?|Uip(C-_4aMl-o?mLH#yeCPBh$JoFeHKr04y~r?HcYSi0QAJl zf_0o5m|mPtb{~ERUOV!z)N2!*jL^Y33+!l+mI0nQCQk#W#zE_go8?xmJ{Twe8I^PH zQN^K16p!$r$s6LR*v0?o*ZE#3bn+4o>xI&w)!J}_RYS)Oh4A#zCkT6corur1F@808 z2Bl=RKxL#1O$HyaW&;`M-f|u1PZ6U51E=7@M?EeN!nqVO^w3vR6z|LtrXQQD=&bhX znDM<76pz+}=5b?cKPD8p+wwA9JU&jYUMj$~`;1^eZou>WA;ijxvIDd7NRRIu#_U^t=Rk`P82z+6vO>*MUss*H=_{oSOsMo}_B?3&4(JJ3o&x#mygM zV2#>7R9z7O%Pkv-ce^`eefdd>BO)+naRChEr=zFDHReXF7359JCYj~k)GnJBtrEh@ z6voo2)Eg7}t3MrHH;O`Z{b#!Jp)tf8VDWT3%Q0(=ozyFdB5Cd zLY90q){~kC!Uu#=uj4amt^W=qE~4DsE)5;|lF0Vjqu6`LidOq{!q1kA)H2u&P4zlh zr5}Q5%ee&au09J}HasTYw^oAbQX%lIlEORcshr~@5Ng&>lDn0Ybl$@i6(x-cAe(xL zp8TPL>lW6~TlJoV*KiB&S+?JJfXmcQuZ~24!hZ7R&r71fcNA3a6Zq(t&GCr+@phOZ zrns!dqL__E9U5-j*;SC3ehO)6i^ zHeU^drQH+c?V}TLdcOiw<y(Yfvf{>YVfcVsR;P=;-K^tZQ85rkDYrusTZ9N*O*(hGnr%fc$GoXhxPc5d#6vk?E_kz|Dtr3EjZ_> zP`!PAaN_MzCh(3G3dG%lEn?F#;g1tN%fkylGQ#lk$O8P7$4^7%&%)*s7d&4rid!S* zplbD9ydo?>0?i4WGb^DYS5m-WI0nzI`^WyZJCB`TS)$pd#Cg$A8fhx8CcdAd==%GB z4-<7kWSIoi?#O{}7y78+L47)5)=t9C+OpF`f5Gf7ZOC()po=ek;utWTTUU4^+HxM! zx}jJs+@Op#Ndxd(KAOz%_Mn~1L)Z^m(d1!Yq4B$)0g&dN4PSP03<#_BM02SP+6#(s zZl(?tbJ2qG!@5|({mytDOaJDXo-eqiFZrC{uWy|_(E0EapjU<_{)^gQC`OaAJx{-7(qyyOPgr)6L` z(V!Dd4KC+8DZjGa;q-HTsA<{+jKgC#{=5wS_734P-q%2-aIr|`+&8SGQyseI{$sWK zZc?Q^TTHxj9I>=f2Igm`<5Z^~bn{U{N@hmkcXotc=ek8h+a$2?juEQf3*@>VSHNXq zG4$4P-u2IWpySdR$S)_Ti~=Y(BaQ0YPJx+2|1r7^Np#{*0Bk;<%UU|mB!yigWXvU) zjD;=Zn3x9W|1E?rQHaHxaRn&v`Hs4{oX2V=5U2Ofg4#%KR{6k{%Ph8%x`VH9R3!+j zdG>%)Mhg9*HU`C!TUO{Y()VU2nSQhSe-xc}Tu$#B$J;|`Xi!Ln z29>B(&$+LNhN4AQgi?v3NMy8!hW4Z(S_&DF>fBdEC~c8Y6f!cuDKg@Bet%Z~JkP7= zIp;d}_4&Ntn< zcjEYHG0|YY5W@$GobTQjeH4dy2fj?l)N4kh=0`vC%rTL8sy2}$&Neu(dH}Aeb`iPN z;UMZ%Lxa00ewOE_4-Jhm>)~dMnsx;u1s9NyMpy7zODT=Af74YvkpsPWT(A zPF9KT#nU~;I3UtOq-3T;@<=}B8g)h$>ctP z*`m+jq}l++RdS50#-6%pS$_Itr!~i}9EE$Io|2%}GvL!QOn<3IW8Cg2Cg}4LQa|$= zXoz@Gi-U!b;LL;Hcm9y}|MXzDL?!Kc(@JFn7vUX|5|DHBV-^J`;E#q&bbyfuLl|dA z;+~LSf{SR2&ry<=_K}p{I6}&zsWfNqVdziY2mC4<=-Pk!9E;BnpGv;q z)ddNIYJv|DJE#jEx=8U}d2za9S44+Raq+|nUB>tL;O`g{w z=~xPL^$s6nD0-2WBypUCPeRl>cnTWj9D_wZEW7iZF16-5ybqP;fe`1!YbkW6A#eZC zcimHKV-H@1wH;HSNmL1iAN?a5pHkqf_et<=QAYo*G5B`27>M8MrZ0r&;;4W$+~PPW zZcIM5-KZogv;Wclga4tgi4W&!=k{$2E|CX+mXj4_^YCH49x=Ld3ih0=#LABr*p)8~ zRx?sfB$XCXe<9A-o%NMeZ7-rP*2ZJ$XC011n?i3%@t{Oe0pi2?V6|){adaAFwm!Sh zt1!9-HjUx1J4ynnEW(&84PX$0p@*1m;iiz@y_lICnXj4i0F+s+V85 z?!Z^#vWtguYIBIspYL^Sj250Sw`G)mO~!rP3>Q;Ak5!4E#eSZ&9X1It#KGz{&&_la zbXIB7$y=t=Ba7zXmS^9oxAh$w>E%YJe!Gf2zjuPxtJ`?fR*jS?H8Xe3dU4e$7qHwJ zgd1w(;p5aOc$p5grAP+q4|C7w4NGzTSuP9P7lg}K1dw*KSupk~k#glDvKX$Djj0m# zT_+kbYrQp!9V(;KKh9v963%1gqPck6WQ_B4nqqv1G-|!tO_G17uz{r&p6(Bk?U^1CC8=*K~L)gC`qiP)m_olKS_!VMqVKW zSF@?(5cLd21kO zXM{j~U?~3eh@qZy_(3&s672b}flRZPB9A@J&;swqI^||Qv|pSDSy7$Ddv6%HnaQBo znOe44_%yIHuVCU90khdR%PAl5(G}@ABzSQt=9mUS-H1B={52W;_Gf~}qAaLz+KSRP z9$0)Y7{sJz(3<;GQJc>V5pH_R)eqGW7>J5g3&q^LNkT( z=wRpzvbPXu!~*9k(+lUWO}#2fyJWOq?ACE()MBJZ8e;;)(Hd72*JscS=7H|Ay043EZlDw#l-uS z;U>8#xL6c}fBMJiXwzccs{e`F*{#CK!->?`=K^dQDaLC``(c}lB(9clLXpGuNO#rXSnnCYee}|80+v&2)gWZNY5-MYLWSw ztuFV4(0hYS-9wH^F`~rq-yNc3CdXjv9znBw^(%Oj$){Og?lOXZc4Er5Rczs=tq^%3 zpWT*WiP8Oy`2CVP5xzA8-n*tl_BA=ITf70zefUiMV)e+}+!|(Z?==I?Mu2o!*uKBCLaGw?Rc$P>$+a0D3JV&rQlLALwzSQ0HJOg^}4=7)g zFL^4Nh4@u~opIy{nr)v)a?lo)AFIM`yG97q3}g*oD56K|Co(nuH;gqYfy3Hydg!Al zp6~m@`MIo7%YLM$wjr7c)>6b{bzJ9HzX~>YhH*JmL;R!YO8*V!(bw+|LFEb+uvBtF zdPtk5$n%+r3J&5t<@0z;R);-c{DWG#z9W9a-GFbBSU%H7Jmbt$)I-1(741ChcE%`z z&uRmDPTH}~E$=tA@^&S`Vi6=Zb}!sqy^iWEQlhs^(Lvoz9C0-w(IgSD4$!u|(; z7$rYhFbmXz);~osdu1Lzkc@};##9iy9K+>X^1+$oa{r8)1nMi@P|$TVh!)O@%QzPc z!`!w0=GaU~Q~AN@ufGMh#R5#b{3Z~~UC+(oaS-)x88KD-Kw7tn;*UALDA8~cYc+$Y z$YxjE_&N`o<#yq^H#Cy!dC==hQ2*u3cz`+#%pIOX|s z`}(8AW5@5hNLK;++pe6pumEQgR-)UYGiWSXj9q9?xs|BL*} zEXyrm^uy&y!8;{@j3lC+&R4(LJqAtmvY=b#A2BFYqxN$)V2ejL6}xtVYHq%d%k^jD zPyck*-C6~1=9oa*T07`9sv)%+v*Dp-K3abjClgC+@u&juYPThz+NBH(HWHv$f0pug zC#OJ4-cfYON@N3%%HqTA8ldn{l5F_d!9rgrF?s%;+|AksGjEIt5AoK))q+p#&EAW& z$5$N>%{@=A>@OrsH8>WX3qQ(N3X)EjeB8g>0Au^j*y)o_5~ZLz5DylnyS@xC@Y4!f z<<~;je;-H)h`{gU95T2n2Fp}n30+)~?y-ItET)YA&+5ZXl(K6TWUd|QZob<*Jd znCsN30Jl5WrFEx%!<&>CbPJF`2bEcH`g#Z5&t*M6t0aNBYj#~}k1zH8UR@h`shF7= zw3{C7r(|FKVC{;>shIG7m`3z(aHF_4_S{vi=SV@|*>sV1-&zZ^s<>yc`Uxt3e?DuI6h=K+B`ybY2seC` zqoHOi=oR%$Lliwh(Ds6~tTj*T1OMVjJe^pCP+B@N+o2&5L$VH|| z;s!Rq5<>I-Mlz@$4&lqxam|!;a`$KeZYewq0&-3yWvdvV{*#H7M74K?vcKUbYD_(iLmx-#LS71+O-!kz z7kXBc4{rWQouAGVw&$TMpX9I;Kfx7;NaauC{r$E#!FcZ^OsD;1KCaN zf{IdFj(w;+JVtV(0RrX+f|vGL>Yh@HH;Zqxz8NQ34;RkQ6f_BCZ;uiWRTIb)31Kgd zq`+vtyg4`RQK~yELh@~F znGnAlWRBbmc%hcXRLdok6J#aoZO8`WkODkmYlof(R>GRins7#@lZaftMx863(qY$9 zs?TM2&bDU|xD`UT@*ROwT^5w;Xx0V`R-$I87YN2a;_e4==&n{nj%hh#37X>ZE!^xN zqKCrqo)Br53{5p!#q{lwPb`dlu~3XsZ5mGq^<$kr&In z;C_J!wco|yEXkit=?rdH7$pP;6xHy@0VgKlESFbu%O)CH;W(~xmezC(&_ZiT&bKLy z8&|l&qOw7-I{A*xnw3P>R;q*gq?HgBBtb7pgo5#1S+j=1Mu?hGNKPN|rSlbj6B)1l z*q+lz{-#LAhdSJX`vbaEaV+HwyqXW^pjhT81`!WLdCki+ zQL#t|<;)6b@rz81+|!2Q`&FSUIS7vvJDekOiTT@qm#FKgpmRwst>Lb7QS)R#S(4+j zFXDEzK6AlVum%?iykhv4-D3=-ZqT7uF%^&&msP~^lNPF!K50`!+3Gc&*R>C)SW_KiN zB{#yWvjLc)AkI@G2|4t1SRXsTNaEE%G03agLf1tNlV=9{^hAvqt-G)Urn#k) z4$mOED}6Z{ZmX_JWVWs zqBSEtx5RB?N;DeP$w$b zj%0hhb2lDJ?nKwQ?KuFNy1|%y$C>b{)e;Nl82WwWLwWP3t9c z8$c3@zc3PO(vf|C1VhIrfnx3$BP-QOi@jCB?U@pjK5~@qn5@F^M)^=n?g(}ctFoSg zA#`U;KGPpOg{Vbc#{H*lL1M=Mz2c7K!9XFr*trqz39JH}eM4||QwU!E&_;R-T1lE# z41Dnupt3W=S%*;xG)kuAa;2bIU=erzvtuJZn$*qg+XztnhhmD|cA8>*0@r#?M~6+W z@J>Sor!DBLT~cesJ37x5ENl+b$S6<9jpacmJ4)JrKZb-!6*ST04}qp(Y-XIp9a8*3Euc|m!pvM{#E9sXP53Tdds^f_*0t;@3@)NCU*cC)yi=ZKqw z+Nnx(3C8(f0Na`0>8iOLKeXKxPjG(nq>2f8c#;Ku+2BoM@1?^EKR#%h!BPjKE%fwc zDXOi`gFB}p$p_sc$enxyxj+fYs;`Flg6R+>d75;5Ehat%0vL6nko0lPjg0sm$z0UK?q8@nhCz!4610WsS$9e$(%9oR>K1FFoO@3LiS|kZFdl zwJ&nwk=6y16*6sXc%dBT9GQa~j&eP33q$s4jSt;atd5nB_u?W|&foKO5;r&Wk_$dp zV9&d+?71`z@^fu19Lw#1Ty25+&yxhf_h}_I-Q!_Vg%8a4dqRrmAAw=NSZ2*;DaPxf z6CU(vCEr)%aemrva__M`zP>UUE7V=cJmr4Mmo)_w3lboBI);ibL9;_Fy4z*YQI3zfBIq@VFxw4I`c2gGNikZOMPpF-EOa@d zgsxTF(L`Pg+ZxZn1;fdB$w?+&MgA$_%_P{{yoDU8k%uaOePXog4b3$zCx3-6ab8q! zuod3J?5k`5^39rVsk}%6ZY46Ar7~c+>;P!3IF2IG@9FJ#wxIvn96wK_uS; z7rxuWon7y_UUMYCrFyVha*Z`>xe5_mPvVqaGVrBgKlOh+7r*BW0+VMC@rA|ItL_Xv zHF*K7SbCE^-gB28@oxZqv%PSkKnJBSZ6R3}F}V6|Jk9@d1N<5mlilBAc!ky%@%arT z4%<&tAw_QtJiQe3*Ym?osQ}n~;~iwkhM~{GPL#;C!pWjCxM@Wf+1Q%~?k3|*tcKP9 z-JQ_+pF5V}bt?T)05kvS;h)DlS$8=Zm=N%%Q`Tw|%U4El=HL{ZTeE?wu;|B@m|QSF zaGX5Qjv;QXmDvAF4@LEg*g%&X6DgGA zj-HmU8zgRbR#vU<6{=sc^CHdg2tr*$bJX2O>U!)WscLN%sW~;N&UVLcW~xCrwrF0V z8t3`(gsUDz7W^X4zm2go!UGlOxKlTw*|6%}Fqxuw2kk8)P^+^NRiiWEnr$&}{;oW_ z<$(jomZ*R`ewSdg%QL3Ic@6y$u@Y;%HL&$W0ef<+8YUWQaC|hGKDA&-pFe?TPW5p3 zLpCOPIg_|-LF{m}#V60_k`g&j%-nvB5wUHGfKQXsmCZIpus zUQ=Wq;x^h49uGHljsx#uc5Qsr54tm88K}K!WxbmJ@JuYPv#0HHaP)yEEB`bF`!;{0 zxsrwKs=N?f_{J8O&)t9rqVllcJQofA-;KAKNmVlW$gdCcVb%Uh(tUQ2oO}3++E>4T z3;Uz7L?w(&+Tsqc$z{g-wGuu&#dX|>F_@Hg;Fe3#Om9y%{j4F4jgs}uuUYnN-TNro z)f5G%2l(+BI~VwyzR|N9)(qdCI9zJUX-@^}k?u&rvs-&{U-~$^+G|~*vW@;q?+iN@#PRUU$6Fx>}33)EQ|Y>Xn}?FX&i0Xg;~1Y zG&1Zk%G|ifoC`b6%C+x@((n2ZG(*EoXId$9;CvjKgwCJ>*(-4D)qQFmDhpCk^Ue|=8JxL(K(Y3|&0 zb~Wcr7!_T)%@K@SpnCf#Lt>kOKEkFrj>L&JqP8uWYwTRxhECo2w%&aX_;`rl}K}%a7 zogO@(>njUjsZ1D<^gl$I<4%RFJA+fr?6AxCC>G3GhenEApXNpc{g$PUX8&CR@0g|d zWR?oNLRqXl-i3yKlTpd}4xUcY!N`dZblE*=jJR5iZ?xZ0K5K=9#fz81>$!^Lee`jV ze3wglxXiBqB^lJ+tH*BM_>4A9c7O&0De7bMhFP=q8>6q3h9bqU=>?Bp?FL7uGq~02GJbq71|mo2LF7p-n*3pmhH)LJ z{SyN$QznZa*Cv8N`K)^PM;SO_Eob%sX26NHs??n8pTBS|g2&6AGA|{SpwCJfuPoVx zCcHe}vazkEtqL!g73U4G`eG_I;<|};x=GmUGDh!pdjeiEq5C_L>$K0quT4fcJa7`_ zv|?G+!$Ndnhber&d>Mx2YavNC6||CWpdj@_%>@o9^1K#TT8h>8o3xRs<3I7~&dC_$ zBEYn|DS?>JGHN)MOA5c(67w6$;E=Bh{?^yntGX)KcX}<|^865}{GFg)J{0+bb1^`8 z3+Pp@pxdq0>012(YTwmKbOs-=kzJG7l2zB~;qtRpwO!|Nlp`Ph8<)qmH||kYD$Wsr zI1q-@0*K?jBlF6+yz1?E`fR@y(Viy`uk$(>dM<|j-5ZPY4s9HF^%z=>n$Y)4-M+koR&*T0->z5D5qYrGRf>$Oe2KLfcAqI> ze{lH@$ANI-L7i}XQ3`Q9z)z=UZiX0+OM#^>*c>+(CzcD6c)^t*G;kBY=>DcJi~o`l z89|t~a3NYnNMS=4kJ)K<5KGH;DgG%Zuc+9nm~@roeUar@xu zmS*r7n$9Sgsnh*+yT}hNJAOR*G+A})2<&~&v3Peb#O;6Apq$ey8kzZ!6rJ>;XJ?Dn zzvy*@lw}Q&VI)Heax+QK`F*(0po{VP&kJi`a-Yff-6kGtw&Z{+opw*Jg z___5H9g$Ume*P31{J4~Os1%dlmHeO=INNNSvOPZ9=7gU6^XRtv81y>G)5nP_7@N~htfZ;iO5sj)BP;Rj8ol>L2Ym*G!O_KubS+WGALe&G}>0FZm*oxp1CiPEN+j?`q-En-*q-OvfiSb#Prb4}SJ?_XeA@v@P{J zITu zd7lCMF*%&Yabwi{PT{GAbBXm-SJ)7Fg{nzRK+%emY?dO&O}&2;?=q>x$p17nJFfsN zH$*cvOW1q%3E5Sx4jOsoM4{CkIzPly*M(;pt3(5`tC5EdZ_h&c=u*7h9)s<9lrFg> zLqDgSq(>BnC^sCVh~OBRr+5+eSh1}52``jQc#M5wVfbU#IB9g^!$;g$0cCD!( z{?~UkZf);!dj8f$+BlfOq7FixS`tjooq|QXr$UsJIEsg+ zlILGvGq)cdBC4H&xGpFg6C8xmPUth~QCtTTF_lz*pqOTwnBnfn+o5y8Cj2Uv4=aN| zlLBJRIX?Ca_lQ z3s?HzlM@q(B)yL%@0u)7Cweh?y?+L5s+)}qPwdCO>W_Ho(K5QT-4`{ZX5-8M(%|R% zoVvlbY_cZxDVa|*Xw1};xPEUgiLWt7c5ySwUd4iYZz%{h?x0&YxsijBIXJ|;;^n?c zq}kOnu+Dyh>MJ}i($Z@&dbvdqeA3j@O!sT?rL95vd6Yia$L)S&| zHJ5igBXX6T+5VdmYg7W`b`~mT&jiW28X&%Wf?c;u48LXc()tVSjHp;GJ*H|~HFkB7 ze)@-0=jCbY;>|e|7DdCm%YpY-zF`Cy(ZgZ#y-NXk(U+C8Q~ zWS%yi=k~%Ewx6kI%9GH0AJv zFUNv6RKkczYuar#mv~J?l7wu3Ow*Y{Z(iGi1-m1tF8^(q=JA2@zt1O8%CXc`Vg)(0 z)}JhXz6N8=WQhDW{`%>2teMwaI(X+SBhg7k0-G%6gQB?$FU=?q1dXRs%ccnO(Cr>0 zzb*?+s}x}M!OL}Z0v0f28OIi62tf1Q>BK{(8qeKW0VS`!NzmRrkkSccOf&}A*hD!9 zis2lR?>2$z!36AyenHI^oTO~)adtqcguXNb6FlG|}H|pyl2r>Fsz{s==HlII6Kit?wTQ(kpDyuY96BMMucb%AB?Z+@S zWh=bDw+YW3-vtF+w^d~WLngj!z^GUT1Oz65pL-m9(3t_p%N)@)@g&m`aSK~!aPDwJ zKE|f_8|$G~56|CD!?y*Tqf$KyVw`4!K<+)VsR(F)feP`{ng<~b3G{(r4^_H2PP+WI z&{rBx_@ini+Hai&O8;7DNyH(h@rDGlQCgg1yp3buIl$y|c~m|l3SvHuQ>Dcjbi>>L zJd&^hO+Say(2ohQ_xoyEvqq9$XT?c9)j;LQKH7Qq5G^F(|FL(-tCX9@~%jM^PqKOy`_DM`DZLzL#F!sAnqsiQ;^UCJ`VJFzLpMOlf%O@tDmxBaPSnozPw<3*YD7CwG!PFy~z)Z8zJ6RfaR`^EI#0jj5B# zx9aD_<5@fzdb|yK9c0XkjHiO>?pOG7bO{Vq8{=2U0^VFkpZso>M7z%%lhsWTbbqeF zfLXfuLD38p+Dc)sUmv+yXob_b4&k04FV1HcOaEl-VN`f!#MIpY3#=FLL|xmU`cfLb zl5mRcKf8pmol$7XUyB_Jf|-q9WYFu?YmCwDh0HsX;nTGh@Z{H2(!cL7)xB$m>DRcN zb`;~AHg z-%j}MFetRkhyC8LkJR#q^2&mH$T{;%jHtUvy{CgG)Ar>aGg4DYMjsZCh}t5M`WnI0 zdvTfb^}51}@3FY7#+zMsI3LPh2*GRN3MM-4Hz~U(jH}$bh~ea1vfe=x!`>?6rZT||m2`14=lA}h2}TLuY0~pr$PT~3IYs(RpOrN-n>EJR z4RV)JZl)cqX1Yicaj81Cbraq_$-RH=B2>RQ8)HLwaA5LlGDG7y*pgA^cj;8}ez63N zEi7fe8^31$c59o>zjL1Y?p}-qE$*lgnT7jO57h3mOs@+(Ad0Haz$iSFz;(xNvclo7 zIj52p_Dl@2NnPz=s}T>IHX6`2t86-1MY6v8$z9HMqRsvpKL~RdOsW4;GsLLlG*CHu zmIU2N1G`BN>Djmq@ag3dZZ6tH#qB;2@7i1F0>E6ZsUpa(yL<*Hi}I#61}CPKTz}-6Z-p+W6|xPqZ}b zA}zcEa?9~F#LZuaiVyG8AdA%~#!e$5eog?X({S4a=VG-i;DX@uuyS!a+fuI%He4^D z^t~S@ZBvC8!s%?yx{D}qPa1C24zf%9Cm8eCUUG_^gW3*Y#))^# z8-`4-pyvjMg357OwIX-@IK?V_-9=`PvEUjbjOjc{6wHhO2eSaK^AJV!hjQ6Bxj#(} zIwgP&;<%U2TXCoLKT`BxKdsWxN7WhyNSV0B4sx6m%K1FnpFC#<)i!f%yIoM@#O<(b zro%w)0oZdq6I0$Oku-@~^5CyAwpC>C;-YMzF4uuf<@)0LHGSz5Elm`h`-Ns{^VJ29 z<}oYJT_E9!J7BqwAnkSz$LN!M&}yqj$Cv!0yXrka^XNVr_hf>+${B(|nfaWb>U()%45mOe6o9*1URWg5>bI`@UA8rjuvs8m4D^vmC_A6y{f3cUJ?Y5W-8D(Scv(;h~ zMEi0ezEZvpIm@%*>E&+pQxwIXUVi%Tp%YA>uLooMgK^qjDO@!!0)3WQ?2X+jaP{mk z(f@OnTqxc^9gHntn@tRpxxo+S&FH2{bDS|M{Sm$p*Z>AqJJD(61(y8V0K2`aL26z& zotan2R!SC7%bNs^8gi*_c{KVTzC<4_m;u^~Z|KbeO*9KPkCPTZ3f@0MajBCEu6#>i z!iDA8NnK%|7l?q{?qt|IR|EQi&)Jggo*kAff4iB|{b34KrrryR9uvF?*PgQO9{7sOvr_hnFiODl|g zdYe72$(={MONK4kNWxCV68(EmV0*`Na?N)&RrEGA3vEfG;djLFi@h;j-RQ`D=QP>b z9K*%JSeUUB%EXaKLO+U3hA-a7@&39m%%m|&#>S}>+o+1dy>?2EEv+?u&R+2K11n<0d0KeiFBHpqW^0uC#3RO4B z*qw)@b$K}syIA2T^MBZ49tQKbNCF$JizS{8?E1bvJExR3Jqw8ykppr54Ek ztKj(lVHjgE9oEb%Bd4F)fWR0(dCYo2U6d>Fo${4daoOGMJyz(Z>V$HV|Its?+2r}R zH>B4%nT}p-qqEKw5|<1o^trA~PNwTq)}@DjJu;hGp16$)k51Ef5s9QiPY6@x3mCg! zGIYRkJ5DAq@ghkEw}cXMyw(fWe#oO5;Ep90bvW|T78vi_WY|8E$b^Pr?Zf$XbInJo z;-*}}_(p?_sUWL)b`9#9^wo(}JL3mE9lT{92PGYMSV>t~pb6am(m9$f7@tm4IA5T2 z^DXST_m}*4x0)yw7Lg_Mj4)B)F`mBgglt{(o!vQU1#||!<`_@vc>PNZxb!|@4!ah> z0)uj}obP~tm&am52@6V>T5-<{ZVu5i#d|+zVf^N&Ake|1(JxcU*^DN7PEQVOWAunZ z1;@TVc$oDUt|xmu-_dzC_IS;IJ#05utZ#hOL3vK%cxOwB$$>+M$aC`}xa-AK8VToM z;Pf<5+&9c>JRYKFgSwgHj$Q1|zhRi|z`5D#CCHw!Glv{sQMrtx^p(OT zsxZ?44*hdsRb{2%$@e$h?wf%l{tSJu9D~zOCNWndWJqX@1vVEdfNM`Fv55%>Q=K+y zmhVF|oYI+|(Fe4Onu2h@Bgxr3K{9W>CA>%vW>6;&Efn%ebD|@iZ@C@+8JvMpE+@bJ z>{)oPe-s`cR|NatQB*814*HFSF<^rs7Ts;6bV@U2c>M+r92$_4pt9(yobl^d=G) zP!R~-vkPngc44k}0S=kuU}x(k5N+II+T`mFWiiR{Ekc#c@gBtuV(}!y;~yF0ey5pv zn6|UW=nI_=*wgk4ACJYccLWiHo#jc#{ZBObr8peR_XhQi*Kt(Ii&5MDlO*V6;+}q8 zoVwD-8wm(M*W{EgJrco3o1+5o^B^ zj@$km!!&=v-LODdx~3MS`Lt=O=M6eqS-?KMrUvdGIJfaV|GKOGZ6xi*3)Vy-3>S&L zj|*AN^_XnaaX8{R{i6K3?oQD%O!m4#8-M$N>70BBS-l1xN@&A<5mD&9^OJRu-$aCd z1;T%B$*j4|9q``}1^dTjF@N|ZScx9PdydCIyV-~7d)b2K51I)qPRGjc`(TsV6lmv* zp-Y56vvP;dYb(i7m;vhWOIE{)uwgPzj zi54^m$_;fS78Vf;rz^sYLMBs1fC^xtdISU zcrE@a(R2{6e^P&mt>y9P*x?>}wND7Oe_tUfZ{&zr&{{69{GGb*uflN=Pg)wXiwQON zfUjxg%yvn)y6Z1_45Oh6mYcu8jVbB)=j2j6*?k#{@5jOdne*`S^L$*~J)g{P`oWfz zHjs~dnusUog`0c3i1vQ2fU8<|u*5&pl>a)CmFKL{+V}=e#A<^~9Fpv5d#man<=|LB z7+LGN0T=$dM(#_+!RHwo;F0;0Xy~7#k9MS!JD-zLLyP35v|%bZ26MgRW^wk!4;`A2+d?e9 z#gKJJuQICLKBUFa5^jAs2R7CL^guR0N}Y5h6J2^_)bu^>P&;BoAomJYwK zE7bjx7)O(&CHTI!3JQHah_~Q$YVt@G#^Sd!3o#$GaxUPN$J&r!d>?)Mm%?Q`T@>$) z!#0H}?9vM44twHg(T2z143i$Dw<3s5f zp<(h({A|ndn2t*mBdG}JIduettqf}es1Dd9Iu~}dM1tr3CD>sQg%7f7Va@bs%v3Q$c<8K14OS13zy8JW zecD4Jxi*^IGWEojiYDMQdV!8UDF!9OLh&1n2UJ-qqs!!3q|Ig;cx(E>su+sKJIdhb zxEQzV_F{hC_(`PYccX6i5D3)G#j;3Ie7ZUgy%V{9xce*;!Fxo^wq%kW=}vG%WVuSD8Bj^lE{ls$Sal{^>|t}AkKBwA0q$#S15q(?pu-WVPxg0HGgcaZrcReB#@ zd2WEx&pzSR6MZcI!3TTFz z4*T$d%mJ{{6$4As1cgSq$dk(@azEm6QC=7?HRU#yeozb+Ba5JV^J;wOFM_vq9x={* zkI5?`AlNVF(F8Q72p<2|!c%|8IENjuYEFM_|zi-_%VYev4p z6YFQB5P=U0Flpf^(RO+f_uZT!H&$GtpA$qV1P_vcgc3&N>jnC6_#Sn=x&qW*h=NAG z96kK3o|zMJm6|9!VEFWz%y9uh%*|7#63;qJ4e#4v=wohA^2?g;Q}$=p+cs18UqYCo z96=X_i!$Bo3t*X(AIvzV1YZx&#LjFzP;BnR5}$PZrejWyuFi)>}MW%V0M;H3kW1Vn_tqb)BaTchcO%rm`fjB*g(|VRM@A6nvgto zh-%~*L(XDC6^6M?K-1H@(N{H)vMr3nSEsX&<`~r<+#LWJ^HecNR>SOE%vbV5Jebs| z1(L?Rsn8*!3Hwb;;OP28?CZr+crY)R<|K;~em8Nj-z`JkZxrBr{x?)WkO8mlrrU{i8l9+W0+VIsS}shQbvl z@HS}~e$!kG4=V$iBf>ZELsJfMICURAbQ#QfeU|M1zM0#<`_e1(?d$*8^Pwk};sS%2 zu;joaCL<#T6?7EoRn@07t1pw$&b@Fo)9DYxC;92II z8^0PTlUo%-sOptZ`+l7wr8*oJXO{wqSG~fVE8JPh2N_tYegZzwMADxb2Qfp!;N2oc z>u%=Yf0dKSl_eVZbLnL`-}Re#d+sJL6UAZ2^)zCU#~Z+BTAac5|BAGZPwO*3hKC8zIum z1T%JX-S{tY=*u|;X3h~J^~L9?;P^xO;dvfXYwrKF(11JFnuOCo$rGy&FKE$*RvP|f zIY!Dm(U14DsryS2a&Vaqu5Q*rsrySgW=9})hyosV+5*yndXP1F7q(t20h=!~=x2Uw zh+iRQ<{B8l3g7Bt{fC@T@{STFc2wbxG8ue;hsYH_F{aZ_7x>gp(nB@#;NhnLK)HcTx)B6?5p90t$41DJ9?}uA>GH!)nGw8$Q7K9*sE(xlqu46=ojmYrsGelN?4$00sMS3+Nc~{;h z;Dg5otfXl&HxpkV;?0I|&1Qt^N&H8e&E_y-BigjjGBhsLe+vHlPZHq{*Ap9ah4cK= zQ7Xk0y$`)+2ckUL=lZH3csZ9f5J^N?FEt|a)eyZj;u-mG$}nE?hHm@tlBLID@OrHP z`mU|0J)XXr=sHOe^Pyn+TXqiaN-v+Wf6Lpl*8qVFQE3=M0A^8iuyHwn23BG>{@LP zAKXV+;SKKmo}5Aw>+Q)d5t?AWm})Y-a1JKh#9_X(7U=vOVg8Da1I8x@E7uZ8Jxpq1uVWF17*vrsO_{c6q*=?&JMh1OXzahaA2s{S_>C}y2+ypgBHq`@r$`%kt?y611s%u9ZFlL7%lFaX^$(_M zY=}(JjliAG+zycAh5dXuhfEezp~~+(;LwFqvf68eSRM(a!j27OXXrClUEK)IRIR`d z-faL!`e$cy4&vEYepmXUM6BaL^_m#)kXcrrUZSFiNjOajI$xU2Seh$G_N5csi;Yk(g~HQ>sycF-LzBjo3_*vNVAC zWVQm{`*GisIri}S<}lq>r_GFgb*J5*FM+eNHfYK`r&ByV@wwkVNIr5JAI+Z$-;X`S zBO2F1?!Y#pANqrw<@ifMewuj1&ydXeR6}F7MAD5vE{a(;J^`(pZuGwJL{=4rO`bZY zgJP=+x^+y1nV%=(H9uig^x6zI8uldXX$Z{ttVi>&FQJuF4F%hUwjjUjHf_H(8_!Y` z_UC#t2;AYyII8e)j`BY|RhtNT!F41GQNh*n4h zA)h^xHuVaB;dJ za50mytEaKg>1X@w%0J>7Aan7JJkz_O2g2GD-IG2)# zvyS8MtT)76-j#+1Z6s5Bf{EC6SDaR4!P6WfWY*qA7~ ze{MMb?F_=*V%Frvw^mT7u|sR=ldvo=hdBHb(DBB}%=Seqsh-hp+G%SGbyCR~rR0O> zugKx((BP^K}4!@HRQ{&$Pa`@^=cvNbJ8-~^Ci%u4< zEbD`o!BiYh2*9tu14!Y%RwC{5hW)o?A~jx>hoV}SLE>&EQBoyfx9l6d4*i2gI&ScO zsStkRTn0^dHxLhZJsRIDAO_FcyHGj6J=45O3dWfFPVkE zoLBkW=mMH_BJh$I|a>x%k<|S58CKsD6qGegt6a|`1EEA zY*mWlTvg&kZCpOBUZhROi8$bxg%CWQEkkS^vdQD=lVR!03)K0%BJpsFpqzae&E(VQ zL%mkUde{ymQ&$mj6C(%+nGL_h%}~^99x}_1(|twPNYwN`x^ZI=wdCpHkxvTT_i!26 z>%N;!G%o=)k7hDdC{FK7?S&5;b)j^g2aY!Tkbr+jG5_UV{I1#$*J6G!$7^F)f!%GK z>~Vq4P#vP01Kj5}uz{eG3; z{?Hvt9vNb_jXBO;J{1)vD+mUhHn8rkWhBTYf!@BLO}?0hVcdtSe7TI{yc#n}$hU8% z3bW6_^%7IO=cP-vlQ{-MZx_9!U`s=S&VylO0ST9tCAzK=@J+0lY*$zZ`A<^dtMgSR zZ}WYWjk2U&$5jQ&YqIc7wgkEj7vkiq7FctvimDC?@PYV?`rJ<$%tFry8keF8t<%PF zT?}2|b33z*UNf<>C!QSr)kHO`qe$6JFDyt%!7Vn%xV1D0=hs=&n@63=ws=*jar;c( zevrq9iak{Al)q%R` z%zFa96^n4|;~u)B_5+BSNuru>JvvUPz;P$u;)!#as2aG2Y$-cHnvMh@-CqX@ZIRr$ zDHJAayAb`x>9}!r1?11#3{GAj$#k8Kz}wJA?T>F_&%cbKXFOFQGQox}ca}17Jyb`2 zd3zpC7Z5tOpnLi%+X{ez;WDsr#pyL zNl%NAG=2rUE^Ngh=@sz!`%TC=#fP*acT4k*XdJl2q8KL zf>)=n>d;P9b(==CwjP0e+pGK^S6Hyp z(n90=dF4z?@a96 zzR|ouY0z!i3Jx7(tnaQe_`9kF3}ywBliRp69JlW}e`9B-&HC#Ba$8Ky}|Of zrjbJ;XTX1<3pw56i7q#s!0Egvn>TSiiFEwL_^(T0mPh-t<5zSu-?b%?b*c)lJ2jd6 z++UN=qweVJ5d{Nl$9QRj+fZI#g>1GyPEDr0CdyCzxUSwLsNB=XiwjpoiRC*;z;i?H z`jST~k~ydC)p5+b}1x zv-CF5(XPXNClYDq+)7fp6XEPtD{iiJ7qj2k;qG#7kE(kBX8z}hGt_^u%Ty&mkNb|e z&2{4O_%$@dN(NW!9)jQc2KC4L=Hrol));kWBcAWl!p=DoXc)DgeklAz>KI!P=(NEf z{}P02hBUwb8hkaX;jcA74-&Pr^?zq_xIBdfOK9Mc0da@4Xa=)?uQpDhL+KPVcc z$>X0SE38{yO8I|vpzM`2yf_;Lwn0ycWSa@ZL>~jmmJI&2`e=qsd&+-n`iFMRF{1{O zkAY|7L9(Bnz^m&^VA*_0tn$c&{bgJ~VWgD&$L&TWxa_js_e7)nPIhRzV2n3dvzp^c zN7BdMHT=fxhje_j2j)wj!;PR0$^Nb6Pw+kRrgRpZPu2v9`ZvTcjm0S&Y^bE64RcFI zm%(B`dO0u(Hboxb?}btFOWc%J-5etRS{~qO!1ead<&s-lB3OxnJEX>Z0u?spI&=Mr z*cv|pGoSq=^5w4V`>;K!?7f@X=aoM{j@y`GOux&)$@x% za)t)zRHVc5OX1MFP!4?Ws6*IX?woK%jf6VO3S6#tqWsQ9;OKt^OMH5vU?OEMEPaH5 zLqYg?Qqc4O&4`J5A{QKW6}e1;^-|#Uqu2KU#

K7R;yFE63^w;b4fbTPDQh~UxL9+;&ego9q4 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 z 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\n\n\n\nAnswer:", + "answer": "Use KV for configuration that is read globally and benefits from low-latency replicated reads, while accounting for its eventual-consistency behavior. Use R2 for mutable file or object content, where object storage and its consistency/durability model match the application's file lifecycle.", + "citations": [ + "59a31d96cc6c8e46", + "6a1f07fd7a59ef10" + ], + "latency_by_stage": { + "embed": 0.03717029100516811, + "retrieve": 0.00019749999046325684, + "prompt_assembly": 0.0 + }, + "reranker": "none", + "rerank_top_n": null, + "verdict": null, + "context_pack": { + "selected": [ + "59a31d96cc6c8e46", + "6a1f07fd7a59ef10" + ], + "omitted": [ + "6c3d0f5418ebf692", + "e597e70bb429d0d9", + "6fb713cd2382d6c9" + ], + "estimated_tokens": 361, + "budget": 492, + "counter_name": "char" + } + }, + "evidence": [ + { + "chunk_id": "59a31d96cc6c8e46", + "doc_id": "kv/concepts/how-kv-works.md", + "title": "how-kv-works", + "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", + "text": "KV is not ideal for applications where you need support for atomic operations or where values must be read and written in a single transaction.\nIf you need stronger consistency guarantees, consider using [Durable Objects](/durable-objects/).\n:::\n\nAn approach to achieve write-after-write consistency is to send all of your writes for a given KV key through a corresponding instance of a Durable Object, and then read that value from KV in other Workers. This is useful if you need more control over writes, but are satisfied with KV's read characteristics described above.\n\n## Guidance\n\nWorkers KV is an eventually-consistent edge key-value store. That makes it ideal for **read-heavy**, highly cacheable workloads such as:\n\n", + "rank": 1, + "score": 0.6361836791038513, + "score_semantics": "cosine_similarity[-1,1]", + "score_components": { + "dense_score": 0.6361836791038513, + "dense_rank": 1.0 + }, + "selected_for_context": true, + "pre_rerank_rank": null, + "pre_rerank_score": null + }, + { + "chunk_id": "6c3d0f5418ebf692", + "doc_id": "kv/concepts/how-kv-works.md", + "title": "how-kv-works", + "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", + "text": "- Serving static assets\n- Storing application configuration\n- Storing user preferences\n- Implementing allow-lists/deny-lists\n- Caching\n\nIn these scenarios, Workers are invoked in a data center closest to the user and Workers KV data will be cached in that region for subsequent requests to minimize latency.\n\nIf you have a **write-heavy** [Redis](https://redis.io)-type workload where you are updating the same key tens or hundreds of times per second, KV will not be an ideal fit.\nIf you can revisit how your application writes to single key-value pairs and spread your writes across several discrete keys, Workers KV can suit your needs.\nAlternatively, [Durable Objects](/durable-objects/) provides a key-value API with higher writes per key rate limits.\n\n", + "rank": 2, + "score": 0.5948389768600464, + "score_semantics": "cosine_similarity[-1,1]", + "score_components": { + "dense_score": 0.5948389768600464, + "dense_rank": 2.0 + }, + "selected_for_context": false, + "pre_rerank_rank": null, + "pre_rerank_score": null + }, + { + "chunk_id": "e597e70bb429d0d9", + "doc_id": "r2/reference/consistency.md", + "title": "consistency", + "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", + "text": "---\ntitle: Consistency model\ndescription: R2 provides strong global consistency for reads, writes, deletes, and list operations.\npcx_content_type: concept\nsidebar:\n order: 7\nproducts:\n - r2\n---\n\nThis page details R2's consistency model, including where R2 is strongly, globally consistent and which operations this applies to.\n\nR2 can be described as \"strongly consistent\", especially in comparison to other distributed object storage systems. This strong consistency ensures that operations against R2 see the latest (accurate) state: clients should be able to observe the effects of any write, update and/or delete operation immediately, globally.\n\n## Terminology\n\nIn the context of R2, *strong* consistency and *eventual* consistency have the following meanings:\n\n", + "rank": 3, + "score": 0.5874968767166138, + "score_semantics": "cosine_similarity[-1,1]", + "score_components": { + "dense_score": 0.5874968767166138, + "dense_rank": 3.0 + }, + "selected_for_context": false, + "pre_rerank_rank": null, + "pre_rerank_score": null + }, + { + "chunk_id": "6a1f07fd7a59ef10", + "doc_id": "r2/reference/consistency.md", + "title": "consistency", + "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", + "text": "* **Strongly consistent** - The effect of an operation will be observed globally, immediately, by all clients. Clients will not observe 'stale' (inconsistent) state.\n* **Eventually consistent** - Clients may not see the effect of an operation immediately. The state may take a some time (typically seconds to a minute) to propagate globally.\n\n## Operations and Consistency\n\nOperations against R2 buckets and objects adhere to the following consistency guarantees:\n\n\n\n", + "rank": 4, + "score": 0.5488367080688477, + "score_semantics": "cosine_similarity[-1,1]", + "score_components": { + "dense_score": 0.5488367080688477, + "dense_rank": 4.0 + }, + "selected_for_context": true, + "pre_rerank_rank": null, + "pre_rerank_score": null + }, + { + "chunk_id": "6fb713cd2382d6c9", + "doc_id": "r2/reference/durability.md", + "title": "durability", + "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/durability.md", + "text": "- **Hardware redundancy**: Storage clusters are comprised of hardware distributed across several data centers within a geographic region. This physical distribution ensures that localized failures\u2014such as power outages, network disruptions, or hardware malfunctions at a single facility\u2014do not result in data loss.\n\n- **Synchronous writes**: R2 returns an `HTTP 200 (OK)` for a write via API or otherwise indicates success only when data has been persisted to disk. We do not rely on asynchronous replication to support underlying durability guarantees. This is critical to R2\u2019s consistency guarantees and mitigates the chance of a client receiving a successful API response without the underlying metadata and storage infrastructure having persisted the change.\n\n", + "rank": 5, + "score": 0.5456305742263794, + "score_semantics": "cosine_similarity[-1,1]", + "score_components": { + "dense_score": 0.5456305742263794, + "dense_rank": 5.0 + }, + "selected_for_context": false, + "pre_rerank_rank": null, + "pre_rerank_score": null + } + ], + "query_vector": [ + -0.07294192910194397, + -0.020775074139237404, + -0.031530365347862244, + 0.016889620572328568, + 0.026989640668034554, + -0.07673313468694687, + -0.11231733858585358, + 0.043038081377744675, + -0.008856629021465778, + -0.006661688443273306, + 0.004143760073930025, + 0.04034986346960068, + 0.013119357638061047, + 0.03878660127520561, + -0.027104495093226433, + -0.0316128171980381, + 0.06343631446361542, + 0.023084595799446106, + -0.03284158930182457, + 0.033698346465826035, + -0.016572676599025726, + -0.021396605297923088, + 0.00671815313398838, + -0.012985503301024437, + 0.02017737179994583, + 0.05415540933609009, + -0.009796340949833393, + 0.012327359057962894, + 0.01923648826777935, + -0.06491604447364807, + -0.02932402305305004, + 0.05991004779934883, + -0.11242958903312683, + 0.05782230570912361, + 0.023062074556946754, + 0.03871830552816391, + -0.010812206193804741, + -0.0614214688539505, + -0.04828900843858719, + 0.011072365567088127, + 0.013178166933357716, + 0.06682862341403961, + -0.0380692183971405, + -0.0037083823699504137, + -0.036614350974559784, + 0.0025999757926911116, + 0.07763868570327759, + -0.0631149560213089, + -0.0783599391579628, + -0.0945238471031189, + -0.010523700155317783, + -0.06134172901511192, + 0.054613903164863586, + 0.08886568993330002, + 0.09147058427333832, + 0.04235396906733513, + 0.03795381635427475, + -0.00014227943029254675, + -0.013278080150485039, + 0.00938193965703249, + 0.05551685020327568, + -0.022408198565244675, + 0.008740805089473724, + -0.02646280825138092, + 0.04703078791499138, + 0.00018132150580640882, + 0.05563444271683693, + 0.0157919991761446, + -0.020219596102833748, + 0.017524102702736855, + -0.05822794511914253, + 0.06935643404722214, + -0.022671420127153397, + 0.005529171321541071, + 0.008581185713410378, + 0.03379390388727188, + -0.032055146992206573, + -0.006692826282233, + 0.04680021107196808, + -0.050358690321445465, + 0.0030547729693353176, + -0.04154500737786293, + -0.007391295395791531, + -0.006775022018700838, + -0.0036076747346669436, + -0.069797083735466, + 0.08914071321487427, + 5.17614216732909e-06, + 0.006547773256897926, + -0.033360306173563004, + 0.05982338264584541, + 0.021093888208270073, + 0.1100870817899704, + -0.026677193120121956, + -0.04361863061785698, + -0.0065328930504620075, + 0.08777783811092377, + 0.0836743488907814, + 0.05717528238892555, + -0.03562544286251068, + 0.0023717605508863926, + 0.018138781189918518, + 0.10155201703310013, + 0.0016442171763628721, + 0.015094543807208538, + -0.026690511032938957, + 0.007868300192058086, + -0.011561263352632523, + -0.0468260757625103, + -0.040530379861593246, + 0.03249552473425865, + 0.04778965190052986, + -0.10350626707077026, + -0.026179948821663857, + 0.00425173994153738, + 0.06575755029916763, + -0.017708605155348778, + 0.03977498039603233, + -0.051758069545030594, + 0.03907884657382965, + -0.017632553353905678, + -0.047388602048158646, + -0.011831795796751976, + -0.014227704145014286, + -0.019338317215442657, + 0.009069097228348255, + -0.008898794651031494, + 3.284403766239436e-34, + -0.011760557070374489, + -0.09429604560136795, + -0.0370747409760952, + 0.07256617397069931, + 0.027465328574180603, + -0.0204590056091547, + 0.01854568161070347, + 0.04575188457965851, + 0.04871439188718796, + -0.04738953709602356, + -0.035129889845848083, + 0.06343859434127808, + -0.012023169547319412, + 0.014585288241505623, + 0.06277778744697571, + 0.015886351466178894, + 0.004743302706629038, + 0.05954806134104729, + -0.003998734522610903, + 0.07906369864940643, + 0.08189279586076736, + -0.01244263257831335, + -0.014145913533866405, + 0.017999444156885147, + 0.0695386603474617, + 0.01615954004228115, + 0.11424869298934937, + -0.08209144324064255, + 0.023359838873147964, + 0.013073376379907131, + -0.010188897140324116, + 0.009986353106796741, + 0.04966030642390251, + 0.12886740267276764, + -0.06652802228927612, + 0.02644793689250946, + -0.028892626985907555, + -0.01108056865632534, + -0.03227551281452179, + -0.08977288752794266, + 0.08969391137361526, + 0.07511263340711594, + -0.009151156060397625, + -0.04674949869513512, + 0.013604833744466305, + -0.04748626798391342, + 0.012232138775289059, + 0.004863486159592867, + 0.0025654372293502092, + 0.05513308197259903, + 0.03173220157623291, + 0.11063771694898605, + -0.005290688946843147, + 0.011678042821586132, + 0.10346129536628723, + -0.03882865235209465, + 0.018256761133670807, + -0.04277326539158821, + 0.012938294559717178, + 0.027707040309906006, + -0.0420953594148159, + -0.026884421706199646, + -0.052833233028650284, + 0.06730212271213531, + 0.0342399887740612, + 0.07914693653583527, + -0.053850073367357254, + -0.05995848402380943, + 0.006864928174763918, + 0.016811799257993698, + 0.009405004791915417, + -0.026524553075432777, + -0.028001457452774048, + -0.04599247872829437, + -0.003702949732542038, + -0.024076975882053375, + -0.04186918959021568, + -0.0599384531378746, + -0.006449750624597073, + -0.06602703034877777, + -0.0926770493388176, + 0.0884699821472168, + -0.015820492058992386, + 0.016782591119408607, + -0.05452810227870941, + -0.08413171768188477, + 0.015273695811629295, + 0.032510191202163696, + -0.035788435488939285, + 0.08142652362585068, + 0.04348716884851456, + -0.015155905857682228, + 0.0643092542886734, + -0.05752839148044586, + -0.026562655344605446, + 2.4761317843153677e-34, + 0.05230295658111572, + -0.0392824225127697, + -0.07439599931240082, + 0.15101462602615356, + 0.04449564591050148, + 0.06501694768667221, + -0.0755804032087326, + -0.07324027270078659, + -0.0015393906505778432, + -0.034668151289224625, + -0.059048235416412354, + -0.03897882252931595, + -0.05502931401133537, + -0.008123541250824928, + 0.0020829730201512575, + -0.025415757670998573, + -0.019293734803795815, + -0.0862303078174591, + 0.00817672349512577, + -0.019171396270394325, + 0.10471951216459274, + -0.028013266623020172, + 0.10499797761440277, + 0.07515647262334824, + 0.05042741820216179, + 0.008332154713571072, + -0.11793924123048782, + -0.04758391156792641, + -0.03380082547664642, + -0.037114985287189484, + -0.048949260264635086, + -0.03378031775355339, + -0.04979180172085762, + -0.06506640464067459, + -0.04917203634977341, + -0.07290162891149521, + -0.024852372705936432, + 0.04893617704510689, + -0.031934142112731934, + 0.033947598189115524, + -0.0056577264331281185, + 0.04193387180566788, + -0.1614365577697754, + 0.024770449846982956, + -0.02980465069413185, + -0.012946492992341518, + -0.03416929021477699, + -0.03084377944469452, + -0.018680375069379807, + -0.03954717889428139, + -0.016801072284579277, + -0.04246190935373306, + 0.013782540336251259, + -0.06417840719223022, + -0.03672412782907486, + 0.057600997388362885, + -0.03097529150545597, + 0.007746811490505934, + -0.06952447444200516, + 0.0481119379401207, + 0.09720180928707123, + -0.06185758113861084, + 0.027643997222185135, + 0.061353448778390884, + -0.11385797709226608, + 0.034639716148376465, + 0.0995059385895729, + 0.014162718318402767, + -0.016919780522584915, + 0.034898705780506134, + -0.003901073709130287, + -0.059120599180459976, + -0.01136266440153122, + 0.027194466441869736, + -0.0005821902304887772, + -0.017434876412153244, + 0.03611381724476814, + -0.10411309450864792, + 0.07745049893856049, + -0.013816887512803078, + -0.06527747213840485, + 0.05678178369998932, + 0.018889540806412697, + 0.05521358922123909, + 0.05156410112977028, + 0.0010706224711611867, + -0.013402638956904411, + -0.0028424549382179976, + 0.03128274530172348, + -0.0036056803073734045, + -0.04886377230286598, + -0.023499976843595505, + -0.10335395485162735, + -0.0019722168799489737, + -0.013407682068645954, + -2.126321874129644e-08, + -0.021246109157800674, + 0.009313746355473995, + -0.05305086448788643, + 0.10310807824134827, + -0.010608683340251446, + -0.06577619165182114, + -0.02509772963821888, + 0.08795923739671707, + 0.08043283969163895, + 0.15765920281410217, + 0.05997071415185928, + -0.06283816695213318, + -0.024141592904925346, + -0.0487927608191967, + 0.018400361761450768, + 0.10817693918943405, + 0.0469975546002388, + 0.020294807851314545, + -0.09299022704362869, + 0.009648419916629791, + 0.08079959452152252, + 0.06933087855577469, + -0.01758597046136856, + 0.05933835729956627, + 0.037138983607292175, + 0.05169161036610603, + 0.02901259995996952, + 0.06586135178804398, + 0.0237229336053133, + 0.03536306694149971, + 0.015451080165803432, + 0.003901737742125988, + 0.0611855648458004, + 0.05166716128587723, + -0.05427918955683708, + -0.01741981692612171, + 0.033126261085271835, + 0.08234428614377975, + 0.032767847180366516, + -0.04378438740968704, + 0.029328705742955208, + 0.013573229312896729, + -0.017670240253210068, + 0.038508955389261246, + 0.02184251695871353, + -0.04874550551176071, + -0.10833343863487244, + 0.03948338329792023, + -0.07242564111948013, + -0.004675009753555059, + -0.05747905746102333, + 0.04343621805310249, + -0.07571437954902649, + 0.124123215675354, + 0.0181212667375803, + -0.0024818601086735725, + 0.030536241829395294, + -0.04495702683925629, + 0.023182986304163933, + -0.008735407143831253, + 0.01984136924147606, + -0.06389240175485611, + -0.0744156539440155, + 0.003995122388005257 + ], + "config": { + "retriever": "dense", + "top_k": 5, + "context_budget": 492, + "answer_provenance": "recorded_lesson_result" + }, + "catalog_check": null, + "source_snapshot": { + "corpus_id": "cloudflare-state-v1", + "source_revision": "3dcb728cb29f4239e08ba894f0a40650d51ba4f6", + "source_repository": "cloudflare/cloudflare-docs", + "source_license": "CC BY 4.0", + "corpus_digest": "c2f8e2022e9435ddb885fa5c9bbfaaa53279c11a8f00f6c358e02bcb875851f9", + "index_id": "cloudflare-state-structural-v1", + "index_digest": "312547a9f355456de3f2a87563e01eb21f0cba30ba74b5aaee852ee8cd556d23" + }, + "created_at": "2026-07-14T16:13:52.218073+00:00", + "mode": "saved_lesson", + "run_id": "lesson-cloudflare-kv-r2-choice-v1", + "schema_version": "1.0", + "error": null + } +} \ No newline at end of file diff --git a/assets/seed/v2/lessons/cloudflare-state-coordination-v1/cloudflare-queues-retries-v1.json b/assets/seed/v2/lessons/cloudflare-state-coordination-v1/cloudflare-queues-retries-v1.json new file mode 100644 index 0000000..47eeeba --- /dev/null +++ b/assets/seed/v2/lessons/cloudflare-state-coordination-v1/cloudflare-queues-retries-v1.json @@ -0,0 +1,799 @@ +{ + "lesson": { + "id": "cloudflare-queues-retries-v1", + "order": 2, + "title": "Inspect retry and batching decisions", + "question": "If a queue consumer fails while processing a message, how should retries and batching be considered?", + "focus": "Retrieval candidates versus context selection for delivery behavior.", + "required_supporting_document_ids": [ + "queues/configuration/batching-retries.md" + ], + "answer": "Treat a failed delivery as a retry decision rather than assuming exactly-once processing. Configure the consumer's batch size and timeout for the work it performs, then use retry and dead-letter settings to bound repeated failures. Consumer code should be safe when a message is delivered again.", + "package_id": "cloudflare-state-coordination-v1", + "answer_supporting_chunk_ids": [ + "87b293b226ac5739" + ], + "retrieval_configuration": { + "retriever": "dense", + "top_k": 5, + "context_budget": 323 + }, + "answer_provenance": "recorded_lesson_result", + "source_snapshot": { + "corpus_id": "cloudflare-state-v1", + "source_revision": "3dcb728cb29f4239e08ba894f0a40650d51ba4f6", + "source_repository": "cloudflare/cloudflare-docs", + "source_license": "CC BY 4.0", + "corpus_digest": "c2f8e2022e9435ddb885fa5c9bbfaaa53279c11a8f00f6c358e02bcb875851f9", + "index_id": "cloudflare-state-structural-v1", + "index_digest": "312547a9f355456de3f2a87563e01eb21f0cba30ba74b5aaee852ee8cd556d23" + } + }, + "run": { + "operation": "ask", + "index": { + "index_id": "cloudflare-state-structural-v1", + "manifest": { + "schema_version": "2.0", + "corpus_root": "/data/corpora/cloudflare-state-v1/files", + "created_at": "2026-07-13T14:41:52.323002+00:00", + "document_count": 40, + "chunk_count": 537, + "chunk_size": 800, + "chunk_overlap": 120, + "chunking_strategy": "structural", + "chunking_params": {}, + "index_backend": "numpy", + "distance_metric": "cosine", + "backend_identity": "numpy", + "source_corpus_id": "cloudflare-state-v1", + "embedding_backend": "SentenceTransformerEmbedder", + "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + "embedding_dim": 384, + "corpus_files": [ + { + "doc_id": "durable-objects/api/alarms.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", + "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f" + }, + { + "doc_id": "durable-objects/api/state.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", + "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5" + }, + { + "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", + "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518" + }, + { + "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", + "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9" + }, + { + "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", + "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126" + }, + { + "doc_id": "durable-objects/concepts/what-are-durable-objects.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", + "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25" + }, + { + "doc_id": "durable-objects/examples/build-a-counter.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", + "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4" + }, + { + "doc_id": "durable-objects/platform/storage-options.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/platform/storage-options.md", + "raw_hash": "33e8840fac344dafaf1d71dcbb6037a09674c1b004fbe840317e11db755fd98c" + }, + { + "doc_id": "kv/concepts/how-kv-works.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", + "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321" + }, + { + "doc_id": "kv/concepts/kv-bindings.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md", + "raw_hash": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78" + }, + { + "doc_id": "kv/concepts/kv-namespaces.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-namespaces.md", + "raw_hash": "2f64b8fb39ce55bc43d5a6f7e36d5af10e672f9e9ec64d1f1e918258ad7ddbfc" + }, + { + "doc_id": "kv/examples/cache-data-with-workers-kv.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", + "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87" + }, + { + "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", + "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc" + }, + { + "doc_id": "kv/index.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", + "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761" + }, + { + "doc_id": "queues/configuration/batching-retries.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", + "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce" + }, + { + "doc_id": "queues/configuration/consumer-concurrency.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", + "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08" + }, + { + "doc_id": "queues/examples/use-queues-with-durable-objects.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md", + "raw_hash": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288" + }, + { + "doc_id": "queues/get-started.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", + "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a" + }, + { + "doc_id": "queues/index.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/index.md", + "raw_hash": "7ca76e34b7712d7ea2fb558cd572d8994848a8e4cecfdf412ae59aa6082aa778" + }, + { + "doc_id": "queues/reference/delivery-guarantees.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/delivery-guarantees.md", + "raw_hash": "ed989b394791a8bf6c450e1f8f7fcfa3d13a0e1a4d43586a84edbe7087a2f222" + }, + { + "doc_id": "queues/reference/how-queues-works.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", + "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c" + }, + { + "doc_id": "r2/api/workers/workers-api-reference.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", + "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4" + }, + { + "doc_id": "r2/buckets/create-buckets.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/buckets/create-buckets.md", + "raw_hash": "fcb5cebd61d6e44db103ad8cbee20718ee6e48389ec3193ab5297216cce117ac" + }, + { + "doc_id": "r2/how-r2-works.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", + "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18" + }, + { + "doc_id": "r2/index.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/index.md", + "raw_hash": "7e6bac2d545167b29be0e3b51617553f991edc15c97276ee890bfeca1ee90560" + }, + { + "doc_id": "r2/reference/consistency.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", + "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf" + }, + { + "doc_id": "r2/reference/durability.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/durability.md", + "raw_hash": "4837c8a21782dd5eb6ba73f9faf2d44de5460c634aa525f363453cf2858835ba" + }, + { + "doc_id": "workers/get-started/guide.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", + "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8" + }, + { + "doc_id": "workers/index.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/index.md", + "raw_hash": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4" + }, + { + "doc_id": "workers/runtime-apis/bindings/R2.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/R2.md", + "raw_hash": "2841b8b9a51fa5f4c64c88594a815553940dee47a4188c159ceb45ee97117261" + }, + { + "doc_id": "workers/runtime-apis/bindings/durable-objects.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/durable-objects.md", + "raw_hash": "8529ae13ce8b7acbdca264566f3b019803c7b75debadeb5a51c51f380264520d" + }, + { + "doc_id": "workers/runtime-apis/bindings/kv.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/kv.md", + "raw_hash": "1a31963e5b0a455f49a7f1c36fc207bab7c71eac3d352d8ca5a14183d3f29f7e" + }, + { + "doc_id": "workers/runtime-apis/bindings/queues.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/queues.md", + "raw_hash": "baded9ebba0468d738474f49995b6cf8ee867ddb56af29ccb83656258a46703c" + }, + { + "doc_id": "workflows/build/rules-of-workflows.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", + "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821" + }, + { + "doc_id": "workflows/build/sleeping-and-retrying.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", + "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88" + }, + { + "doc_id": "workflows/build/step-context.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/step-context.md", + "raw_hash": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3" + }, + { + "doc_id": "workflows/build/trigger-workflows.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", + "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb" + }, + { + "doc_id": "workflows/build/workers-api.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", + "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535" + }, + { + "doc_id": "workflows/get-started/guide.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", + "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3" + }, + { + "doc_id": "workflows/index.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/index.md", + "raw_hash": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297" + } + ] + }, + "document_count": 40, + "chunk_count": 537 + }, + "trace": { + "query": "If a queue consumer fails while processing a message, how should retries and batching be considered?", + "retriever": "dense", + "top_k": 5, + "chunks": [ + { + "rank": 3, + "chunk_id": "87b293b226ac5739", + "doc_id": "queues/configuration/batching-retries.md", + "title": "TODO: do something with the message", + "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", + "score": 0.7568231821060181, + "text_preview": "class Default(WorkerEntrypoint): async def queue(self, batch): for msg in batch.messages: # TODO", + "pre_rerank_rank": null, + "pre_rerank_score": null + } + ], + "prompt": "You are a retrieval-augmented assistant. Answer the question using only the\nprovided context.\n\nIf the context is insufficient, say that the provided context does not contain\nenough information to answer. Do not use outside knowledge.\n\nCite every factual claim with the source marker for the context block that\nsupports it.\n\nQuestion:\nIf a queue consumer fails while processing a message, how should retries and batching be considered?\n\nContext:\n[Source: 87b293b226ac5739]\nTitle: TODO: do something with the message\nPath: /data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md\n\nclass Default(WorkerEntrypoint):\n async def queue(self, batch):\n for msg in batch.messages:\n # TODO: do something with the message that fails\n msg.retry()\n```\n\n\n\nYou can also acknowledge or negatively acknowledge messages at a batch level with `ackAll()` and `retryAll()`. Calling `ackAll()` on the batch of messages (`MessageBatch`) delivered to your consumer Worker has the same behaviour as a consumer Worker that successfully returns (does not throw an error).\n\nNote that calls to `ack()`, `retry()` and their `ackAll()` / `retryAll()` equivalents follow the below precedence rules:\n\n\n\nAnswer:", + "answer": "Treat a failed delivery as a retry decision rather than assuming exactly-once processing. Configure the consumer's batch size and timeout for the work it performs, then use retry and dead-letter settings to bound repeated failures. Consumer code should be safe when a message is delivered again.", + "citations": [ + "87b293b226ac5739" + ], + "latency_by_stage": { + "embed": 0.10699558403575793, + "retrieve": 0.00019945896929129958, + "prompt_assembly": 0.0 + }, + "reranker": "none", + "rerank_top_n": null, + "verdict": null, + "context_pack": { + "selected": [ + "87b293b226ac5739" + ], + "omitted": [ + "4827c1665fe27f41", + "e9c58ba2cf2a5baa", + "e7b7842e41e68385", + "93da65582b8306e0" + ], + "estimated_tokens": 198, + "budget": 323, + "counter_name": "char" + } + }, + "evidence": [ + { + "chunk_id": "4827c1665fe27f41", + "doc_id": "queues/configuration/batching-retries.md", + "title": "TODO: do something with the message", + "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", + "text": "Messages that reach the configured maximum retries will be deleted from the queue, or if a [dead-letter queue](/queues/configuration/dead-letter-queues/) (DLQ) is configured, written to the DLQ instead.\n\n:::note\n\nEach retry counts as an additional read operation per [Queues pricing](/queues/platform/pricing/).\n\n:::\n\nWhen a single message within a batch fails to be delivered, the entire batch is retried, unless you have [explicitly acknowledged](#explicit-acknowledgement-and-retries) a message (or messages) within that batch. For example, if a batch of 10 messages is delivered, but the 8th message fails to be delivered, all 10 messages will be retried and thus redelivered to your consumer in full.\n\n:::caution[Retried messages and consumer concurrency]\n\n", + "rank": 1, + "score": 0.7980872392654419, + "score_semantics": "cosine_similarity[-1,1]", + "score_components": { + "dense_score": 0.7980872392654419, + "dense_rank": 1.0 + }, + "selected_for_context": false, + "pre_rerank_rank": null, + "pre_rerank_score": null + }, + { + "chunk_id": "e9c58ba2cf2a5baa", + "doc_id": "queues/configuration/consumer-concurrency.md", + "title": "where `N` is a positive integer between 1 and 250", + "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", + "text": "Where possible, Queues will optimize for keeping your backlog from growing exponentially, in order to minimize scenarios where the backlog of messages in a queue grows to the point that they would reach the [message retention limit](/queues/platform/limits/) before being processed.\n\n:::note[Consumer concurrency and retried messages]\n\n[Retrying messages with `retry()`](/queues/configuration/batching-retries/#explicit-acknowledgement-and-retries) or calling `retryAll()` on a batch will **not** count as a failed invocation.\n\n:::\n\n### Example\n\nIf you are writing 100 messages/second to a queue with a single concurrent consumer that takes 5 seconds to process a batch of 100 messages, the number of messages in-flight will continue to grow at a rate faster than your consumer can keep up.\n\n", + "rank": 2, + "score": 0.7819869518280029, + "score_semantics": "cosine_similarity[-1,1]", + "score_components": { + "dense_score": 0.7819869518280029, + "dense_rank": 2.0 + }, + "selected_for_context": false, + "pre_rerank_rank": null, + "pre_rerank_score": null + }, + { + "chunk_id": "87b293b226ac5739", + "doc_id": "queues/configuration/batching-retries.md", + "title": "TODO: do something with the message", + "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", + "text": "class Default(WorkerEntrypoint):\n async def queue(self, batch):\n for msg in batch.messages:\n # TODO: do something with the message that fails\n msg.retry()\n```\n\n\n\nYou can also acknowledge or negatively acknowledge messages at a batch level with `ackAll()` and `retryAll()`. Calling `ackAll()` on the batch of messages (`MessageBatch`) delivered to your consumer Worker has the same behaviour as a consumer Worker that successfully returns (does not throw an error).\n\nNote that calls to `ack()`, `retry()` and their `ackAll()` / `retryAll()` equivalents follow the below precedence rules:\n\n", + "rank": 3, + "score": 0.7568231821060181, + "score_semantics": "cosine_similarity[-1,1]", + "score_components": { + "dense_score": 0.7568231821060181, + "dense_rank": 3.0 + }, + "selected_for_context": true, + "pre_rerank_rank": null, + "pre_rerank_score": null + }, + { + "chunk_id": "e7b7842e41e68385", + "doc_id": "queues/configuration/batching-retries.md", + "title": "TODO: do something with the message", + "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", + "text": "Retrying messages with `retry()` or calling `retryAll()` on a batch will **not** cause the consumer to autoscale down if consumer concurrency is enabled. Refer to [Consumer concurrency](/queues/configuration/consumer-concurrency/) to learn more.\n\n:::\n\n## Delay messages\n\nWhen publishing messages to a queue, or when [marking a message or batch for retry](#explicit-acknowledgement-and-retries), you can choose to delay messages from being processed for a period of time.\n\nDelaying messages allows you to defer tasks until later, and/or respond to backpressure when consuming from a queue. For example, if an upstream API you are calling to returns a `HTTP 429: Too Many Requests`, you can delay messages to slow down how quickly you are consuming them before they are re-processed.\n\n", + "rank": 4, + "score": 0.7363911867141724, + "score_semantics": "cosine_similarity[-1,1]", + "score_components": { + "dense_score": 0.7363911867141724, + "dense_rank": 4.0 + }, + "selected_for_context": false, + "pre_rerank_rank": null, + "pre_rerank_score": null + }, + { + "chunk_id": "93da65582b8306e0", + "doc_id": "queues/configuration/batching-retries.md", + "title": "TODO: do something with the message", + "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", + "text": "For example, a `max_batch_size = 30` and a `max_batch_timeout = 10` means that if 30 messages are written to the queue, the consumer will receive a batch of 30 messages. However, if it takes longer than 10 seconds for those 30 messages to be written to the queue, then the consumer will get a batch of messages that contains however many messages were on the queue at the time (somewhere between 1 and 29, in this case).\n\n:::note[Empty queues]\n\nWhen a queue is empty, a push-based (Worker) consumer's `queue` handler will not be invoked until there are messages to deliver. A queue does not attempt to push empty batches to a consumer and thus does not invoke unnecessary reads.\n\n", + "rank": 5, + "score": 0.7048906683921814, + "score_semantics": "cosine_similarity[-1,1]", + "score_components": { + "dense_score": 0.7048906683921814, + "dense_rank": 5.0 + }, + "selected_for_context": false, + "pre_rerank_rank": null, + "pre_rerank_score": null + } + ], + "query_vector": [ + -0.046869438141584396, + -0.010531957261264324, + -0.00411020964384079, + 0.03834206238389015, + -0.0543401800096035, + -0.05230259150266647, + 0.053390178829431534, + -0.06582542508840561, + -0.022359952330589294, + -0.001400908106006682, + 0.052541133016347885, + 0.010046055540442467, + 0.02530570514500141, + -0.059031978249549866, + -0.012492270208895206, + -0.05266406759619713, + 0.1596382111310959, + -0.035327162593603134, + -0.018178248777985573, + -0.01976454257965088, + -0.027840405702590942, + 0.04421844705939293, + -0.04287581145763397, + 0.050469715148210526, + -0.10252013057470322, + 0.0184183269739151, + -0.07878577709197998, + -0.04889606684446335, + -0.04558470472693443, + -0.04914116859436035, + -0.01020418107509613, + -0.012669838964939117, + -0.05502348393201828, + 0.017117077484726906, + 0.11164908856153488, + 0.042239997535943985, + 0.011990089900791645, + -0.057352423667907715, + -0.016695348545908928, + -0.007417682558298111, + 0.05960230529308319, + -0.034532878547906876, + -0.11546146124601364, + 0.06306131184101105, + 0.059872109442949295, + -0.05030184984207153, + -0.044819481670856476, + 0.01944435015320778, + -0.01919674500823021, + 0.015703797340393066, + -0.03387979045510292, + 0.007577175740152597, + -0.01789391040802002, + 0.07750163227319717, + 0.057136170566082, + 0.044102031737565994, + 0.04869937524199486, + 0.024156911298632622, + -0.024975236505270004, + -0.014347586780786514, + 0.0009337012306787074, + -0.0344964861869812, + -0.03773471713066101, + 0.008262325078248978, + 0.062083203345537186, + 0.005314781330525875, + -0.007022952660918236, + -0.021256152540445328, + 0.0521727055311203, + 0.04290560632944107, + 0.018377739936113358, + -0.04290194809436798, + -0.0811677947640419, + 0.06880345195531845, + -0.03804992511868477, + 0.031683675944805145, + 0.030417626723647118, + -0.070726178586483, + -0.07534871250391006, + 0.002435878850519657, + -0.04128323495388031, + -0.0669022798538208, + -0.010839419439435005, + -0.04614455625414848, + 0.05360417440533638, + -0.05897689610719681, + -0.05813112482428551, + -0.028933461755514145, + 0.047857943922281265, + -0.040761858224868774, + 0.01904142275452614, + 0.0549481175839901, + 0.06931634992361069, + 0.021624546498060226, + 0.020123224705457687, + 0.0675547793507576, + -0.006656206212937832, + 0.013545326888561249, + 0.022030433639883995, + 0.010899712331593037, + 0.04315192252397537, + 0.0011891118483617902, + 0.04686769098043442, + -0.041032079607248306, + -0.028019387274980545, + -0.04081521928310394, + -0.02510247379541397, + 0.01486625149846077, + -0.04455404356122017, + -0.0220979955047369, + -0.003194084158167243, + 0.02686629816889763, + 0.11582837253808975, + 0.04135841876268387, + 0.06864073127508163, + -0.010771139524877071, + 0.028578413650393486, + -0.020189624279737473, + -0.031378064304590225, + 0.0070034656673669815, + -0.0417729914188385, + 0.0034244901034981012, + 0.03815128654241562, + -0.0988931804895401, + 0.03802649676799774, + 0.030392900109291077, + 0.10332386195659637, + -2.8306939872197345e-33, + -0.08742585778236389, + -0.023257585242390633, + -0.013109227642416954, + -0.04004437103867531, + 0.06457168608903885, + 0.014157320372760296, + 0.02766926772892475, + -0.046485044062137604, + 0.04807691648602486, + -0.122626893222332, + -0.002737464616075158, + -0.10582824796438217, + -0.0014368616975843906, + 0.0017340657068416476, + -0.0673896074295044, + -0.04536156356334686, + -0.02164655737578869, + 0.0631658062338829, + 0.025648975744843483, + 0.011847290210425854, + -0.028096629306674004, + -0.004552655853331089, + 0.0005401336238719523, + 0.04833783209323883, + -0.056628696620464325, + -0.0008172985981218517, + 0.01111223828047514, + -0.023166831582784653, + 0.013312880881130695, + 0.025415103882551193, + 0.042871005833148956, + 0.09156984835863113, + 0.025158531963825226, + 0.03697438910603523, + -0.07274693250656128, + 0.03564254194498062, + 0.01852324604988098, + -0.015218240208923817, + 0.004476283211261034, + -0.07920295000076294, + -0.10701820254325867, + 0.03780660033226013, + -0.044954814016819, + 0.02883133478462696, + -0.06542214751243591, + -0.04443119093775749, + 0.030910726636648178, + -0.06093267723917961, + -0.004983226303011179, + -0.044542182236909866, + 0.04812655597925186, + -0.015263707377016544, + 0.08996480703353882, + 0.036238592118024826, + 0.022872233763337135, + -0.0182342566549778, + 0.040037818253040314, + -0.01614021137356758, + -0.03487067297101021, + 0.01633371412754059, + 0.045135729014873505, + -0.015208611264824867, + -0.02073337323963642, + -0.005199363920837641, + 0.14867982268333435, + 0.019053803756833076, + 0.010295660234987736, + -0.09308955073356628, + -0.05550234019756317, + -0.030823448672890663, + 0.04276854917407036, + -0.02199317142367363, + 0.030432524159550667, + 0.027723083272576332, + 0.011978876776993275, + -0.024137398228049278, + 0.019807932898402214, + 0.017921028658747673, + -0.0025292823556810617, + -0.02466697059571743, + -0.004426808562129736, + -0.062327541410923004, + -0.06743355095386505, + -0.01526043564081192, + -0.0072379340417683125, + 0.017869194969534874, + -0.004163827281445265, + 0.003072198946028948, + 0.0024166591465473175, + -0.002273283898830414, + -0.05754958093166351, + 0.00087102031102404, + 0.04291823133826256, + 0.05027845501899719, + 0.0808170884847641, + 7.24238737684164e-34, + -0.03542383015155792, + -0.009802332147955894, + -0.020615367218852043, + 0.1054927334189415, + -0.06640274822711945, + -0.012245196849107742, + -0.06711388379335403, + -0.047337234020233154, + 0.0027645262889564037, + -0.041635602712631226, + -0.15268006920814514, + -0.018728651106357574, + 0.004994077607989311, + 0.088737353682518, + -0.05170808732509613, + -0.08545488864183426, + 0.03490837290883064, + -0.06354290246963501, + 0.003028909210115671, + 0.034647610038518906, + 0.051620155572891235, + -0.03306528180837631, + -0.08034971356391907, + 0.10010689496994019, + -0.017599526792764664, + 0.07040039449930191, + 0.006073232274502516, + -0.05115194246172905, + 0.03711581602692604, + -0.150852769613266, + 0.05504050850868225, + -0.10849525779485703, + 0.04158663749694824, + 0.04804060608148575, + 0.11043532937765121, + -0.001021261909045279, + -0.003295119386166334, + 0.09224238991737366, + -0.036790888756513596, + 0.09996345639228821, + 0.06304015964269638, + 0.05483793094754219, + -0.09059450030326843, + 0.004632328171283007, + 0.023467592895030975, + 0.004886148497462273, + 0.04409494623541832, + -0.06926441937685013, + -0.09553514420986176, + 0.00913390051573515, + -0.02324114367365837, + -0.0350131131708622, + 0.010617724619805813, + 0.12984730303287506, + -0.035358358174562454, + 0.033653970807790756, + 0.08150854706764221, + -0.01096461620181799, + -0.052499279379844666, + 0.020741794258356094, + -0.04751390591263771, + -0.02923247031867504, + 0.08418066054582596, + -0.04849811643362045, + 0.023748409003019333, + 0.013978477567434311, + 0.09227730333805084, + -0.00800856202840805, + 0.07265211641788483, + -0.030323252081871033, + 0.15783892571926117, + 0.061399251222610474, + -0.029595933854579926, + -0.00479719415307045, + 0.026830505579710007, + 0.019883031025528908, + -0.07128109782934189, + -0.07518371194601059, + -0.034431181848049164, + -0.013256664387881756, + -0.0712876096367836, + 0.007909388281404972, + -0.003220614977180958, + 0.10653026401996613, + 0.022363096475601196, + -0.02432318776845932, + 0.07864726334810257, + -0.07184018194675446, + 0.023819880560040474, + -0.05587784945964813, + 0.001027985941618681, + -0.00894969142973423, + 0.008946049027144909, + 0.023552635684609413, + -0.0476512610912323, + -2.1746073386452736e-08, + -0.07261709868907928, + -0.05406145006418228, + 0.039586737751960754, + 0.07010538130998611, + 0.09580051153898239, + -0.0009057477000169456, + 0.010591487400233746, + -0.07031460851430893, + -0.0026541338302195072, + 0.002360993530601263, + 0.034802112728357315, + -0.07029382884502411, + 0.05363218113780022, + -0.012956565245985985, + 0.050093892961740494, + -0.022761452943086624, + 0.017792070284485817, + 0.03667943924665451, + -0.03980852663516998, + 0.015388647094368935, + 0.017216434702277184, + 0.053787097334861755, + 0.0021648460533469915, + 0.03863732889294624, + -0.04786152020096779, + 0.02496948279440403, + 0.10454756021499634, + 0.021345986053347588, + -0.04460936784744263, + -0.07817630469799042, + -0.05841558054089546, + -0.024411680176854134, + 0.10094933956861496, + 0.0019385922932997346, + -0.07771407812833786, + -0.028227638453245163, + 0.08928639441728592, + -0.06445129215717316, + 0.02612338215112686, + -0.08943435549736023, + 0.015175613574683666, + 0.010779954493045807, + -0.013913948088884354, + 0.039572473615407944, + 0.08125941455364227, + 0.015188446268439293, + -0.0681513100862503, + 0.037428613752126694, + -0.0429362878203392, + 0.0009883081074804068, + -0.04514896869659424, + -0.00863033439964056, + 0.011592740193009377, + 0.04863497614860535, + -0.010462172329425812, + -0.07364552468061447, + 0.05308670178055763, + -0.008152374066412449, + 0.04514423757791519, + 0.07068735361099243, + 0.07152087986469269, + 0.02324257791042328, + -0.02260231226682663, + -0.039745014160871506 + ], + "config": { + "retriever": "dense", + "top_k": 5, + "context_budget": 323, + "answer_provenance": "recorded_lesson_result" + }, + "catalog_check": null, + "source_snapshot": { + "corpus_id": "cloudflare-state-v1", + "source_revision": "3dcb728cb29f4239e08ba894f0a40650d51ba4f6", + "source_repository": "cloudflare/cloudflare-docs", + "source_license": "CC BY 4.0", + "corpus_digest": "c2f8e2022e9435ddb885fa5c9bbfaaa53279c11a8f00f6c358e02bcb875851f9", + "index_id": "cloudflare-state-structural-v1", + "index_digest": "312547a9f355456de3f2a87563e01eb21f0cba30ba74b5aaee852ee8cd556d23" + }, + "created_at": "2026-07-14T16:13:52.178461+00:00", + "mode": "saved_lesson", + "run_id": "lesson-cloudflare-queues-retries-v1", + "schema_version": "1.0", + "error": null + } +} \ No newline at end of file diff --git a/assets/seed/v2/lessons/cloudflare-state-coordination-v1/cloudflare-workflows-resume-v1.json b/assets/seed/v2/lessons/cloudflare-state-coordination-v1/cloudflare-workflows-resume-v1.json new file mode 100644 index 0000000..32a6818 --- /dev/null +++ b/assets/seed/v2/lessons/cloudflare-state-coordination-v1/cloudflare-workflows-resume-v1.json @@ -0,0 +1,813 @@ +{ + "lesson": { + "id": "cloudflare-workflows-resume-v1", + "order": 4, + "title": "Pause and resume durable work", + "question": "How can a long-running multi-step process pause, retry, and resume safely?", + "focus": "Prompt construction, saved grounded answer, and citations.", + "required_supporting_document_ids": [ + "workflows/get-started/guide.md", + "workflows/build/sleeping-and-retrying.md" + ], + "answer": "Model the process as a Workflow with durable steps. Put retryable work in steps, use the Workflow sleep mechanism for waits, and keep state at step boundaries so the runtime can resume from completed progress instead of replaying the entire process after an interruption.", + "package_id": "cloudflare-state-coordination-v1", + "answer_supporting_chunk_ids": [ + "573e1387e124b88c", + "7e50c88a6fd0902e" + ], + "retrieval_configuration": { + "retriever": "dense", + "top_k": 5, + "context_budget": 530 + }, + "answer_provenance": "recorded_lesson_result", + "source_snapshot": { + "corpus_id": "cloudflare-state-v1", + "source_revision": "3dcb728cb29f4239e08ba894f0a40650d51ba4f6", + "source_repository": "cloudflare/cloudflare-docs", + "source_license": "CC BY 4.0", + "corpus_digest": "c2f8e2022e9435ddb885fa5c9bbfaaa53279c11a8f00f6c358e02bcb875851f9", + "index_id": "cloudflare-state-structural-v1", + "index_digest": "312547a9f355456de3f2a87563e01eb21f0cba30ba74b5aaee852ee8cd556d23" + } + }, + "run": { + "operation": "ask", + "index": { + "index_id": "cloudflare-state-structural-v1", + "manifest": { + "schema_version": "2.0", + "corpus_root": "/data/corpora/cloudflare-state-v1/files", + "created_at": "2026-07-13T14:41:52.323002+00:00", + "document_count": 40, + "chunk_count": 537, + "chunk_size": 800, + "chunk_overlap": 120, + "chunking_strategy": "structural", + "chunking_params": {}, + "index_backend": "numpy", + "distance_metric": "cosine", + "backend_identity": "numpy", + "source_corpus_id": "cloudflare-state-v1", + "embedding_backend": "SentenceTransformerEmbedder", + "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + "embedding_dim": 384, + "corpus_files": [ + { + "doc_id": "durable-objects/api/alarms.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/alarms.md", + "raw_hash": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f" + }, + { + "doc_id": "durable-objects/api/state.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/api/state.md", + "raw_hash": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5" + }, + { + "doc_id": "durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", + "raw_hash": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518" + }, + { + "doc_id": "durable-objects/best-practices/rules-of-durable-objects.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/best-practices/rules-of-durable-objects.md", + "raw_hash": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9" + }, + { + "doc_id": "durable-objects/concepts/durable-object-lifecycle.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/durable-object-lifecycle.md", + "raw_hash": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126" + }, + { + "doc_id": "durable-objects/concepts/what-are-durable-objects.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/concepts/what-are-durable-objects.md", + "raw_hash": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25" + }, + { + "doc_id": "durable-objects/examples/build-a-counter.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/examples/build-a-counter.md", + "raw_hash": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4" + }, + { + "doc_id": "durable-objects/platform/storage-options.md", + "path": "/data/corpora/cloudflare-state-v1/files/durable-objects/platform/storage-options.md", + "raw_hash": "33e8840fac344dafaf1d71dcbb6037a09674c1b004fbe840317e11db755fd98c" + }, + { + "doc_id": "kv/concepts/how-kv-works.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/how-kv-works.md", + "raw_hash": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321" + }, + { + "doc_id": "kv/concepts/kv-bindings.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-bindings.md", + "raw_hash": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78" + }, + { + "doc_id": "kv/concepts/kv-namespaces.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/concepts/kv-namespaces.md", + "raw_hash": "2f64b8fb39ce55bc43d5a6f7e36d5af10e672f9e9ec64d1f1e918258ad7ddbfc" + }, + { + "doc_id": "kv/examples/cache-data-with-workers-kv.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/cache-data-with-workers-kv.md", + "raw_hash": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87" + }, + { + "doc_id": "kv/examples/distributed-configuration-with-workers-kv.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/examples/distributed-configuration-with-workers-kv.md", + "raw_hash": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc" + }, + { + "doc_id": "kv/index.md", + "path": "/data/corpora/cloudflare-state-v1/files/kv/index.md", + "raw_hash": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761" + }, + { + "doc_id": "queues/configuration/batching-retries.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/batching-retries.md", + "raw_hash": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce" + }, + { + "doc_id": "queues/configuration/consumer-concurrency.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/configuration/consumer-concurrency.md", + "raw_hash": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08" + }, + { + "doc_id": "queues/examples/use-queues-with-durable-objects.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/examples/use-queues-with-durable-objects.md", + "raw_hash": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288" + }, + { + "doc_id": "queues/get-started.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/get-started.md", + "raw_hash": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a" + }, + { + "doc_id": "queues/index.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/index.md", + "raw_hash": "7ca76e34b7712d7ea2fb558cd572d8994848a8e4cecfdf412ae59aa6082aa778" + }, + { + "doc_id": "queues/reference/delivery-guarantees.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/delivery-guarantees.md", + "raw_hash": "ed989b394791a8bf6c450e1f8f7fcfa3d13a0e1a4d43586a84edbe7087a2f222" + }, + { + "doc_id": "queues/reference/how-queues-works.md", + "path": "/data/corpora/cloudflare-state-v1/files/queues/reference/how-queues-works.md", + "raw_hash": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c" + }, + { + "doc_id": "r2/api/workers/workers-api-reference.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/api/workers/workers-api-reference.md", + "raw_hash": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4" + }, + { + "doc_id": "r2/buckets/create-buckets.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/buckets/create-buckets.md", + "raw_hash": "fcb5cebd61d6e44db103ad8cbee20718ee6e48389ec3193ab5297216cce117ac" + }, + { + "doc_id": "r2/how-r2-works.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/how-r2-works.md", + "raw_hash": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18" + }, + { + "doc_id": "r2/index.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/index.md", + "raw_hash": "7e6bac2d545167b29be0e3b51617553f991edc15c97276ee890bfeca1ee90560" + }, + { + "doc_id": "r2/reference/consistency.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/consistency.md", + "raw_hash": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf" + }, + { + "doc_id": "r2/reference/durability.md", + "path": "/data/corpora/cloudflare-state-v1/files/r2/reference/durability.md", + "raw_hash": "4837c8a21782dd5eb6ba73f9faf2d44de5460c634aa525f363453cf2858835ba" + }, + { + "doc_id": "workers/get-started/guide.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/get-started/guide.md", + "raw_hash": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8" + }, + { + "doc_id": "workers/index.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/index.md", + "raw_hash": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4" + }, + { + "doc_id": "workers/runtime-apis/bindings/R2.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/R2.md", + "raw_hash": "2841b8b9a51fa5f4c64c88594a815553940dee47a4188c159ceb45ee97117261" + }, + { + "doc_id": "workers/runtime-apis/bindings/durable-objects.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/durable-objects.md", + "raw_hash": "8529ae13ce8b7acbdca264566f3b019803c7b75debadeb5a51c51f380264520d" + }, + { + "doc_id": "workers/runtime-apis/bindings/kv.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/kv.md", + "raw_hash": "1a31963e5b0a455f49a7f1c36fc207bab7c71eac3d352d8ca5a14183d3f29f7e" + }, + { + "doc_id": "workers/runtime-apis/bindings/queues.md", + "path": "/data/corpora/cloudflare-state-v1/files/workers/runtime-apis/bindings/queues.md", + "raw_hash": "baded9ebba0468d738474f49995b6cf8ee867ddb56af29ccb83656258a46703c" + }, + { + "doc_id": "workflows/build/rules-of-workflows.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/rules-of-workflows.md", + "raw_hash": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821" + }, + { + "doc_id": "workflows/build/sleeping-and-retrying.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", + "raw_hash": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88" + }, + { + "doc_id": "workflows/build/step-context.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/step-context.md", + "raw_hash": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3" + }, + { + "doc_id": "workflows/build/trigger-workflows.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/trigger-workflows.md", + "raw_hash": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb" + }, + { + "doc_id": "workflows/build/workers-api.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", + "raw_hash": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535" + }, + { + "doc_id": "workflows/get-started/guide.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", + "raw_hash": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3" + }, + { + "doc_id": "workflows/index.md", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/index.md", + "raw_hash": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297" + } + ] + }, + "document_count": 40, + "chunk_count": 537 + }, + "trace": { + "query": "How can a long-running multi-step process pause, retry, and resume safely?", + "retriever": "dense", + "top_k": 5, + "chunks": [ + { + "rank": 1, + "chunk_id": "573e1387e124b88c", + "doc_id": "workflows/get-started/guide.md", + "title": "guide", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", + "score": 0.5870048999786377, + "text_preview": "You can pass a [retry configuration](/workflows/build/sleeping-and-retrying/) to `step.do()` to customize how failure", + "pre_rerank_rank": null, + "pre_rerank_score": null + }, + { + "rank": 2, + "chunk_id": "7e50c88a6fd0902e", + "doc_id": "workflows/build/sleeping-and-retrying.md", + "title": "sleeping-and-retrying", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", + "score": 0.5193436145782471, + "text_preview": "```ts const defaultConfig: WorkflowStepConfig = { \tretries: { \t\tlimit: 5, \t\tdelay: 10000, \t\tbackoff: \"exponential\", \t},", + "pre_rerank_rank": null, + "pre_rerank_score": null + } + ], + "prompt": "You are a retrieval-augmented assistant. Answer the question using only the\nprovided context.\n\nIf the context is insufficient, say that the provided context does not contain\nenough information to answer. Do not use outside knowledge.\n\nCite every factual claim with the source marker for the context block that\nsupports it.\n\nQuestion:\nHow can a long-running multi-step process pause, retry, and resume safely?\n\nContext:\n[Source: 573e1387e124b88c]\nTitle: guide\nPath: /data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md\n\n You can pass a [retry configuration](/workflows/build/sleeping-and-retrying/) to `step.do()` to customize how failures are handled. See the [full step API](/workflows/build/workers-api/#step) for stream requirements, limits, and additional methods like `sleepUntil` and `waitForEvent`.\n\n When deciding whether to break code into separate steps, ask yourself: \"Do I want all of this code to run again if just one part fails?\" Separate steps are ideal for operations like calling external APIs, querying databases, or reading files from storage - if a later step fails, your Workflow can retry from that point using data already fetched, avoiding redundant API calls or database queries.\n\n\n\n[Source: 7e50c88a6fd0902e]\nTitle: sleeping-and-retrying\nPath: /data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md\n\n```ts\nconst defaultConfig: WorkflowStepConfig = {\n\tretries: {\n\t\tlimit: 5,\n\t\tdelay: 10000,\n\t\tbackoff: \"exponential\",\n\t},\n\ttimeout: \"10 minutes\",\n};\n```\n\nWhen providing your own `StepConfig`, you can configure:\n\n- The total number of attempts to make for a step (limited to 10,000 retries per step)\n- The delay between attempts. Use a fixed duration as a `number` in milliseconds or a human-readable string, or use a function that returns the next delay.\n- What backoff algorithm to apply between each attempt: any of `constant`, `linear`, or `exponential`\n- When to timeout (in duration) before considering the step as failed (including during a retry attempt, as the timeout is set per attempt)\n\n\n\nAnswer:", + "answer": "Model the process as a Workflow with durable steps. Put retryable work in steps, use the Workflow sleep mechanism for waits, and keep state at step boundaries so the runtime can resume from completed progress instead of replaying the entire process after an interruption.", + "citations": [ + "573e1387e124b88c", + "7e50c88a6fd0902e" + ], + "latency_by_stage": { + "embed": 0.03175475000170991, + "retrieve": 0.0002044169814325869, + "prompt_assembly": 0.0 + }, + "reranker": "none", + "rerank_top_n": null, + "verdict": null, + "context_pack": { + "selected": [ + "573e1387e124b88c", + "7e50c88a6fd0902e" + ], + "omitted": [ + "c0b64f38dd8c6b6b", + "694a17fcc77f0d06", + "2647065cc12a85a0" + ], + "estimated_tokens": 412, + "budget": 530, + "counter_name": "char" + } + }, + "evidence": [ + { + "chunk_id": "573e1387e124b88c", + "doc_id": "workflows/get-started/guide.md", + "title": "guide", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/get-started/guide.md", + "text": " You can pass a [retry configuration](/workflows/build/sleeping-and-retrying/) to `step.do()` to customize how failures are handled. See the [full step API](/workflows/build/workers-api/#step) for stream requirements, limits, and additional methods like `sleepUntil` and `waitForEvent`.\n\n When deciding whether to break code into separate steps, ask yourself: \"Do I want all of this code to run again if just one part fails?\" Separate steps are ideal for operations like calling external APIs, querying databases, or reading files from storage - if a later step fails, your Workflow can retry from that point using data already fetched, avoiding redundant API calls or database queries.\n\n", + "rank": 1, + "score": 0.5870048999786377, + "score_semantics": "cosine_similarity[-1,1]", + "score_components": { + "dense_score": 0.5870048999786377, + "dense_rank": 1.0 + }, + "selected_for_context": true, + "pre_rerank_rank": null, + "pre_rerank_score": null + }, + { + "chunk_id": "7e50c88a6fd0902e", + "doc_id": "workflows/build/sleeping-and-retrying.md", + "title": "sleeping-and-retrying", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/sleeping-and-retrying.md", + "text": "```ts\nconst defaultConfig: WorkflowStepConfig = {\n\tretries: {\n\t\tlimit: 5,\n\t\tdelay: 10000,\n\t\tbackoff: \"exponential\",\n\t},\n\ttimeout: \"10 minutes\",\n};\n```\n\nWhen providing your own `StepConfig`, you can configure:\n\n- The total number of attempts to make for a step (limited to 10,000 retries per step)\n- The delay between attempts. Use a fixed duration as a `number` in milliseconds or a human-readable string, or use a function that returns the next delay.\n- What backoff algorithm to apply between each attempt: any of `constant`, `linear`, or `exponential`\n- When to timeout (in duration) before considering the step as failed (including during a retry attempt, as the timeout is set per attempt)\n\n", + "rank": 2, + "score": 0.5193436145782471, + "score_semantics": "cosine_similarity[-1,1]", + "score_components": { + "dense_score": 0.5193436145782471, + "dense_rank": 2.0 + }, + "selected_for_context": true, + "pre_rerank_rank": null, + "pre_rerank_score": null + }, + { + "chunk_id": "c0b64f38dd8c6b6b", + "doc_id": "workflows/build/step-context.md", + "title": "step-context", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/step-context.md", + "text": "```ts\nawait step.do(\n\t\"call an API\",\n\t{\n\t\tretries: {\n\t\t\tlimit: 10,\n\t\t\tdelay: \"10 seconds\",\n\t\t\tbackoff: \"exponential\",\n\t\t},\n\t\ttimeout: \"30 minutes\",\n\t},\n\tasync (ctx) => {\n\t\tconsole.log(ctx.config.retries.limit); // 10\n\t\tconsole.log(ctx.config.timeout); // \"30 minutes\"\n\t},\n);\n```\n\nTo configure delay functions, refer to [Set a dynamic retry delay](/workflows/build/sleeping-and-retrying/#set-a-dynamic-retry-delay).\n\n## Examples\n\n### Adjust behavior based on retry attempt\n\nUse `ctx.attempt` to change how your step behaves on retries. For example, you might use a fallback endpoint after a certain number of retries:\n\n", + "rank": 3, + "score": 0.5186032056808472, + "score_semantics": "cosine_similarity[-1,1]", + "score_components": { + "dense_score": 0.5186032056808472, + "dense_rank": 3.0 + }, + "selected_for_context": false, + "pre_rerank_rank": null, + "pre_rerank_score": null + }, + { + "chunk_id": "694a17fcc77f0d06", + "doc_id": "workflows/build/workers-api.md", + "title": "workers-api", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/build/workers-api.md", + "text": "export type WorkflowStepConfig = {\n\tretries?: {\n\t\tlimit: number;\n\t\tdelay: string | number | WorkflowDelayFunction;\n\t\tbackoff?: WorkflowBackoff;\n\t};\n\ttimeout?: string | number;\n};\n```\n\n- A `WorkflowStepConfig` is an optional argument to the `do` method of a `WorkflowStep` and defines properties that allow you to configure the retry behaviour of that step.\n- Set `retries.delay` to a fixed duration, or pass a `WorkflowDelayFunction` to calculate the next retry delay from the current step context and thrown error.\n\nRefer to the [documentation on sleeping and retrying](/workflows/build/sleeping-and-retrying/) to learn more about how Workflows are retried.\n\n", + "rank": 4, + "score": 0.5054621696472168, + "score_semantics": "cosine_similarity[-1,1]", + "score_components": { + "dense_score": 0.5054621696472168, + "dense_rank": 4.0 + }, + "selected_for_context": false, + "pre_rerank_rank": null, + "pre_rerank_score": null + }, + { + "chunk_id": "2647065cc12a85a0", + "doc_id": "workflows/index.md", + "title": "index", + "path": "/data/corpora/cloudflare-state-v1/files/workflows/index.md", + "text": "- Durable multi-step execution without timeouts\n- The ability to pause for external events or approvals\n- Automatic retries and error handling\n- Built-in observability and debugging\n\n\n\n\n## Example\n\nAn image processing workflow that fetches from R2, generates an AI description, waits for approval, then publishes:\n\n```ts\nexport class ImageProcessingWorkflow extends WorkflowEntrypoint {\n\tasync run(event: WorkflowEvent, step: WorkflowStep) {\n\t\tconst imageData = await step.do('fetch image', async () => {\n\t\t\tconst object = await this.env.BUCKET.get(event.payload.imageKey);\n\t\t\treturn await object.arrayBuffer();\n\t\t});\n\n", + "rank": 5, + "score": 0.48867106437683105, + "score_semantics": "cosine_similarity[-1,1]", + "score_components": { + "dense_score": 0.48867106437683105, + "dense_rank": 5.0 + }, + "selected_for_context": false, + "pre_rerank_rank": null, + "pre_rerank_score": null + } + ], + "query_vector": [ + -0.06794319301843643, + -0.02724863961338997, + 0.010037641040980816, + -0.01349231880158186, + 0.027911871671676636, + -0.021999230608344078, + -0.11059276014566422, + -0.007262648548930883, + 0.0034028899390250444, + -0.004004070069640875, + -0.03332521393895149, + 0.07804957777261734, + -0.03342011570930481, + -0.10985685884952545, + -0.06358876079320908, + -0.052776504307985306, + -0.038990993052721024, + 0.033453382551670074, + -0.02686384506523609, + -0.04479655995965004, + -0.019678011536598206, + 0.005510772578418255, + 0.013964282348752022, + 0.04955587163567543, + -0.10010423511266708, + 0.029341835528612137, + -0.019679278135299683, + -0.00992943998426199, + 0.029007093980908394, + -0.04432031884789467, + 0.01446453109383583, + -0.02536763623356819, + -0.0618315115571022, + 0.006560106296092272, + 0.027309222146868706, + 0.1364043951034546, + -0.01919342763721943, + -0.006771504878997803, + -0.05594354867935181, + 0.00034868225338868797, + 0.013407178223133087, + -0.06792095303535461, + -0.08522476255893707, + 0.03819552809000015, + 0.07295964658260345, + -0.04387328401207924, + -0.032643117010593414, + -0.09143524616956711, + 0.03842686116695404, + -0.021708404645323753, + -0.054561059921979904, + 0.007435296196490526, + -0.017392387613654137, + 0.07145040482282639, + 0.05403405800461769, + 0.012091091834008694, + 0.06013159081339836, + 0.00122407719027251, + -0.028634853661060333, + 0.028133386746048927, + -0.02558242902159691, + -0.00694062327966094, + -0.08384878188371658, + 0.011836704798042774, + 0.014394739642739296, + 0.1489170342683792, + -0.02532121352851391, + -0.047753285616636276, + 0.06356506794691086, + 0.05505400523543358, + -0.03227919712662697, + -0.05034659802913666, + -0.07646709680557251, + 0.039076510816812515, + -0.07134747505187988, + -0.03334865719079971, + 0.025115255266427994, + -0.056721534579992294, + -0.055133018642663956, + 0.005848699249327183, + 0.028070274740457535, + -0.031865328550338745, + 0.0005321634234860539, + -0.04210420697927475, + 0.017195813357830048, + 0.05713092163205147, + 0.007169553078711033, + 0.011432157829403877, + 0.10151190310716629, + 0.004073557909578085, + -0.04318277910351753, + 0.02636141888797283, + 0.027944184839725494, + -0.03501320257782936, + 0.025255098938941956, + 0.004263900686055422, + -0.003969606477767229, + -0.015501008369028568, + 0.042787451297044754, + -0.044466860592365265, + 0.07662128657102585, + 0.006842297967523336, + 0.03160562366247177, + -0.03591563552618027, + -0.017356185242533684, + -0.08846784383058548, + 0.07427274435758591, + 0.06109931319952011, + -0.023869918659329414, + -0.0247415192425251, + 0.015618523582816124, + 0.001857744180597365, + 0.035712264478206635, + 0.08326469361782074, + 0.05036155879497528, + 0.10032860189676285, + -0.0918835699558258, + -0.021969866007566452, + 0.027734505012631416, + 0.019624434411525726, + 0.06931845843791962, + 0.0594157800078392, + 0.0811246708035469, + -0.0810055136680603, + -0.02785360813140869, + -0.03561868891119957, + 0.08250852674245834, + -4.414592911742102e-33, + -0.03163983300328255, + -0.005520280450582504, + -0.04009344056248665, + 0.021602826192975044, + 0.0022605748381465673, + 0.019313596189022064, + -0.029895789921283722, + 0.006642516702413559, + -0.0115659786388278, + 0.04056290164589882, + 0.03330281749367714, + -0.00295127066783607, + -0.024538442492485046, + -0.04780392348766327, + -0.03519247844815254, + -0.06678693741559982, + 0.04792339354753494, + 0.1046428233385086, + -0.03687074035406113, + 0.03625258803367615, + 0.11543743312358856, + -0.10983539372682571, + -0.023201609030365944, + 0.07774679362773895, + 0.010221069678664207, + 0.004385730251669884, + -0.05425809696316719, + 0.049343883991241455, + 0.04994482547044754, + 0.017539132386446, + -0.02140256203711033, + 0.06119437515735626, + -0.08091800659894943, + -0.007320057135075331, + -0.01809798926115036, + -0.06252405792474747, + -0.03747416287660599, + -0.022269615903496742, + 0.062115900218486786, + -0.03123238869011402, + -0.054135531187057495, + 0.01121971383690834, + 0.028028937056660652, + -0.007089933846145868, + -0.011966241523623466, + -0.14367547631263733, + -0.04959578812122345, + -0.0017344594234600663, + -0.09062838554382324, + 0.012230319902300835, + 0.06317884474992752, + 0.10336301475763321, + 0.0438397079706192, + -0.030452651903033257, + -0.07122238725423813, + 0.025623992085456848, + -0.005907021462917328, + -0.02163228578865528, + -0.06499355286359787, + 0.10173194110393524, + 0.0014586499892175198, + 0.03123234212398529, + -0.06569822877645493, + 0.043364815413951874, + 0.030864980071783066, + 0.0676630511879921, + -0.025404242798686028, + -0.0005550491041503847, + 0.0051345801912248135, + -0.00018125530914403498, + -0.011272178031504154, + -0.05764235556125641, + 0.06996769458055496, + -0.047774773091077805, + 0.03610963001847267, + -0.011519121006131172, + 0.0016015386208891869, + -0.020411226898431778, + -0.027326837182044983, + -0.029373029246926308, + 0.06978153437376022, + -0.03586163371801376, + -0.047846030443906784, + -0.05510232597589493, + 0.06993259489536285, + -0.03268998861312866, + -0.08776036649942398, + -0.049137648195028305, + -0.09581173956394196, + 0.00034813303500413895, + -0.06005048006772995, + 0.04886128380894661, + 0.042724400758743286, + 0.03093884326517582, + -0.007714599370956421, + 2.2817447375414496e-33, + 0.10443820804357529, + -0.09616946429014206, + 0.012121016159653664, + 0.034625615924596786, + 0.017290543764829636, + 0.03052767552435398, + -0.015299280174076557, + 0.041696298867464066, + -0.027603739872574806, + -0.08516950905323029, + -0.08554244041442871, + -0.06526358425617218, + 0.01572849228978157, + 0.07086369395256042, + 0.009950308129191399, + -0.02195732854306698, + 0.10060703754425049, + 0.06502245366573334, + 0.04167759418487549, + 0.048427481204271317, + 0.06514651328325272, + -0.05681349337100983, + -0.03342418745160103, + -0.02128729037940502, + -0.07010839879512787, + 0.06333230435848236, + -0.05703640729188919, + -0.04250306636095047, + 0.02118312381207943, + -0.007518481463193893, + 0.050690148025751114, + -0.04339844733476639, + 0.0166718028485775, + 0.002804649295285344, + 0.039737995713949203, + 0.006693701259791851, + -0.04885605722665787, + 0.023109206929802895, + 0.02984936721622944, + -0.03992439806461334, + 0.21624553203582764, + 0.03775813803076744, + 0.0008697159355506301, + -0.02129833959043026, + 0.03594537079334259, + 0.024813931435346603, + -0.00576647836714983, + -0.005053929053246975, + -0.09975533932447433, + 0.012587616220116615, + -0.025353755801916122, + -0.009136442095041275, + -0.008962994441390038, + 0.04107866808772087, + 0.008905468508601189, + -0.03791968151926994, + -0.002951868111267686, + -0.0348973385989666, + -0.12455765902996063, + -0.022491902112960815, + 0.04028026759624481, + -0.029431896284222603, + 0.06381034851074219, + 0.08286258578300476, + 0.1505352407693863, + 0.049680981785058975, + 0.0526883527636528, + -0.0402807891368866, + -0.025302015244960785, + -0.012239191681146622, + 0.05959499627351761, + 0.07156120985746384, + -0.029911262914538383, + 0.021169623360037804, + -0.003994212951511145, + -0.007994096726179123, + -0.06604927033185959, + -0.10912427306175232, + 0.010377250611782074, + 0.015893764793872833, + -0.03332612290978432, + -0.012644384987652302, + -0.04560861364006996, + 0.04446668550372124, + -0.028802448883652687, + -0.0031162539962679148, + -0.03615693375468254, + 0.008817431516945362, + 0.1072370633482933, + -0.07855338603258133, + 0.023926882073283195, + 0.02445175126194954, + 0.0314711257815361, + 0.016641885042190552, + 0.03347219154238701, + -2.1484373391444933e-08, + 0.009510336443781853, + -0.02898995205760002, + 0.018692802637815475, + 0.018870027735829353, + 0.036419644951820374, + -0.019051948562264442, + -0.018221231177449226, + 0.019571611657738686, + 0.021602172404527664, + -0.03288743272423744, + 0.03598206490278244, + -0.011574862524867058, + 0.08410602807998657, + 0.02925180457532406, + -0.050124816596508026, + -0.014439960941672325, + 0.008856859989464283, + 0.03533845394849777, + 0.010971548035740852, + -0.015878530219197273, + 0.01372029073536396, + -0.02906484715640545, + 0.03171597421169281, + 0.014686410315334797, + -0.04303443804383278, + 0.02021467313170433, + 0.11778789758682251, + 0.020466748625040054, + 0.01851658895611763, + -0.0840386375784874, + -0.06628233194351196, + -0.038626234978437424, + 0.022780131548643112, + 0.08374328911304474, + -0.04258611425757408, + 0.012671910226345062, + 0.08566561341285706, + 0.05994730815291405, + 0.11176060885190964, + -0.0741557702422142, + 0.011860973201692104, + 0.1039145216345787, + -0.015645243227481842, + 0.030133970081806183, + 0.03797278553247452, + -0.036359161138534546, + -0.1270906776189804, + 0.035402748733758926, + -0.012649168260395527, + 0.03534373268485069, + -0.07309724390506744, + -0.0014231152599677444, + 0.03493054211139679, + 0.05909589305520058, + 0.03896057978272438, + 0.006683242507278919, + -0.017577143386006355, + -0.04321228340268135, + 0.03201641887426376, + 0.05015556514263153, + 0.053613193333148956, + -0.05937794968485832, + -0.0387512743473053, + -0.017843596637248993 + ], + "config": { + "retriever": "dense", + "top_k": 5, + "context_budget": 530, + "answer_provenance": "recorded_lesson_result" + }, + "catalog_check": null, + "source_snapshot": { + "corpus_id": "cloudflare-state-v1", + "source_revision": "3dcb728cb29f4239e08ba894f0a40650d51ba4f6", + "source_repository": "cloudflare/cloudflare-docs", + "source_license": "CC BY 4.0", + "corpus_digest": "c2f8e2022e9435ddb885fa5c9bbfaaa53279c11a8f00f6c358e02bcb875851f9", + "index_id": "cloudflare-state-structural-v1", + "index_digest": "312547a9f355456de3f2a87563e01eb21f0cba30ba74b5aaee852ee8cd556d23" + }, + "created_at": "2026-07-14T16:13:52.252474+00:00", + "mode": "saved_lesson", + "run_id": "lesson-cloudflare-workflows-resume-v1", + "schema_version": "1.0", + "error": null + } +} \ No newline at end of file diff --git a/assets/seed/v2/lessons/cloudflare-state-coordination-v1/manifest.json b/assets/seed/v2/lessons/cloudflare-state-coordination-v1/manifest.json new file mode 100644 index 0000000..f3320c9 --- /dev/null +++ b/assets/seed/v2/lessons/cloudflare-state-coordination-v1/manifest.json @@ -0,0 +1,34 @@ +{ + "id": "cloudflare-state-coordination-v1", + "schema_version": 1, + "lessons": [ + { + "id": "cloudflare-do-coordinator-v1", + "order": 1, + "title": "Route one entity to one coordinator", + "question": "How can a Worker use a Durable Object namespace, stable ID, and stub to send requests for the same entity to one stateful coordinator?", + "focus": "Document-to-chunk provenance, Durable Object identity/stubs, and rank ordering." + }, + { + "id": "cloudflare-queues-retries-v1", + "order": 2, + "title": "Inspect retry and batching decisions", + "question": "If a queue consumer fails while processing a message, how should retries and batching be considered?", + "focus": "Retrieval candidates versus context selection for delivery behavior." + }, + { + "id": "cloudflare-kv-r2-choice-v1", + "order": 3, + "title": "Choose KV or R2 from access semantics", + "question": "What is the tradeoff between Workers KV eventual consistency for global configuration and R2 object storage for mutable files?", + "focus": "Multi-document evidence and a constrained context pack." + }, + { + "id": "cloudflare-workflows-resume-v1", + "order": 4, + "title": "Pause and resume durable work", + "question": "How can a long-running multi-step process pause, retry, and resume safely?", + "focus": "Prompt construction, saved grounded answer, and citations." + } + ] +} \ No newline at end of file diff --git a/assets/seed/v2/seed-manifest.json b/assets/seed/v2/seed-manifest.json new file mode 100644 index 0000000..3a140ec --- /dev/null +++ b/assets/seed/v2/seed-manifest.json @@ -0,0 +1,4849 @@ +{ + "schema_version": 1, + "seed_version": "v2", + "assets": [ + { + "id": "cloudflare-state-v1", + "path": "corpora/cloudflare-state-v1", + "target": "corpora/cloudflare-state-v1", + "files": [ + { + "path": "corpus.json", + "sha256": "d75432ccda82af1be1d6de474929e93e7270f1fa0084019298cd7286fd4effd7" + }, + { + "path": "evaluation-manifest.json", + "sha256": "15b2541878229bcfbf583b11c9b9abdc9c368f72f085e9836d64a3a975fbf6ae" + }, + { + "path": "files/durable-objects/api/alarms.md", + "sha256": "063f8929d14c667be965d3834e7aecdaa1f91cca11f4537fda4587ecd5737b3f" + }, + { + "path": "files/durable-objects/api/state.md", + "sha256": "6c632f536f2a288f4ac240764543587d8ed323cd3d86f665b032ec5c50a156f5" + }, + { + "path": "files/durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md", + "sha256": "c07b6d64e9a2c785c9554bc007070241ce50f0ee6d1bba28479213920b961518" + }, + { + "path": "files/durable-objects/best-practices/rules-of-durable-objects.md", + "sha256": "3ed978576f738399ef03524cc3d39eebcd443e529e6fb7273d35c96055cbebc9" + }, + { + "path": "files/durable-objects/concepts/durable-object-lifecycle.md", + "sha256": "af31e45a935651c3ddc7304ceefe8e52322859095f18f666d54dde111d132126" + }, + { + "path": "files/durable-objects/concepts/what-are-durable-objects.md", + "sha256": "fbe7af26b9e82b681625051fca7f74fb3bb1a7ab051d44efd4e6978fbebdcf25" + }, + { + "path": "files/durable-objects/examples/build-a-counter.md", + "sha256": "230f4451f61befd0171d39b64b33c9f8fbb16e4f4cc920f6fa67cf6e9c5d5bd4" + }, + { + "path": "files/durable-objects/platform/storage-options.md", + "sha256": "33e8840fac344dafaf1d71dcbb6037a09674c1b004fbe840317e11db755fd98c" + }, + { + "path": "files/kv/concepts/how-kv-works.md", + "sha256": "625231b9623c31fa6182dfd0cb28f639fca55425c6cc48374f42b91c0de3a321" + }, + { + "path": "files/kv/concepts/kv-bindings.md", + "sha256": "4b2e3aab23c1fd867578d7704c16f19cdc8231d4ebe1e8623e32022799144d78" + }, + { + "path": "files/kv/concepts/kv-namespaces.md", + "sha256": "2f64b8fb39ce55bc43d5a6f7e36d5af10e672f9e9ec64d1f1e918258ad7ddbfc" + }, + { + "path": "files/kv/examples/cache-data-with-workers-kv.md", + "sha256": "9778396309a311641b5ba383e4c8a7e1f845e5c95b8c364305ab38dcb2770a87" + }, + { + "path": "files/kv/examples/distributed-configuration-with-workers-kv.md", + "sha256": "6b710f0c40f7008ad75ecd695275ea19a9d6085ebacbfba1a43493c8035f94dc" + }, + { + "path": "files/kv/index.md", + "sha256": "a81a34094b9c21adc877b4d2beff4c5f49f4298f48af98b0d3cd6210c13ab761" + }, + { + "path": "files/queues/configuration/batching-retries.md", + "sha256": "08c6bb19d1da1e14f6ca92a887d48dfdcec1a08d5ae6e5903a64782ce680d2ce" + }, + { + "path": "files/queues/configuration/consumer-concurrency.md", + "sha256": "38840a0c80ab54537d097fd83bfc3cf857281518f1954457f23410587fc58a08" + }, + { + "path": "files/queues/examples/use-queues-with-durable-objects.md", + "sha256": "87d96a040e3d09162fd56b45734cd9200d94443bbd53ef0c153a826192aa1288" + }, + { + "path": "files/queues/get-started.md", + "sha256": "1d76fd7578dca3ae85f01f0966b9eb54f3d6d1765c8bf08459d88bc4e222bc6a" + }, + { + "path": "files/queues/index.md", + "sha256": "7ca76e34b7712d7ea2fb558cd572d8994848a8e4cecfdf412ae59aa6082aa778" + }, + { + "path": "files/queues/reference/delivery-guarantees.md", + "sha256": "ed989b394791a8bf6c450e1f8f7fcfa3d13a0e1a4d43586a84edbe7087a2f222" + }, + { + "path": "files/queues/reference/how-queues-works.md", + "sha256": "4e3366cdcb99727ddcb513527be60f1ae229b15158a3221894a38b6d8903450c" + }, + { + "path": "files/r2/api/workers/workers-api-reference.md", + "sha256": "0f224d0db2410eca79296590c6d1b23444ae54170d9b66609fb5358f49b46ee4" + }, + { + "path": "files/r2/buckets/create-buckets.md", + "sha256": "fcb5cebd61d6e44db103ad8cbee20718ee6e48389ec3193ab5297216cce117ac" + }, + { + "path": "files/r2/how-r2-works.md", + "sha256": "2a30a4e06f6f754bcfa17f613e78721ede05769d39b1d3440f534ef48e6f2c18" + }, + { + "path": "files/r2/index.md", + "sha256": "7e6bac2d545167b29be0e3b51617553f991edc15c97276ee890bfeca1ee90560" + }, + { + "path": "files/r2/reference/consistency.md", + "sha256": "9a81de17feab5f955b8eb8269769e3ad1a9a936d17e967e2590d2c9c3c32f2cf" + }, + { + "path": "files/r2/reference/durability.md", + "sha256": "4837c8a21782dd5eb6ba73f9faf2d44de5460c634aa525f363453cf2858835ba" + }, + { + "path": "files/workers/get-started/guide.md", + "sha256": "d92c9804e58a9eb747b4780d13543069c39cbc1a33c8dbcb1056826b1e2ccca8" + }, + { + "path": "files/workers/index.md", + "sha256": "e131fc9d83bde1cdc8073f3a7f9b25082b3a153c67989c5d321e971333e99ff4" + }, + { + "path": "files/workers/runtime-apis/bindings/R2.md", + "sha256": "2841b8b9a51fa5f4c64c88594a815553940dee47a4188c159ceb45ee97117261" + }, + { + "path": "files/workers/runtime-apis/bindings/durable-objects.md", + "sha256": "8529ae13ce8b7acbdca264566f3b019803c7b75debadeb5a51c51f380264520d" + }, + { + "path": "files/workers/runtime-apis/bindings/kv.md", + "sha256": "1a31963e5b0a455f49a7f1c36fc207bab7c71eac3d352d8ca5a14183d3f29f7e" + }, + { + "path": "files/workers/runtime-apis/bindings/queues.md", + "sha256": "baded9ebba0468d738474f49995b6cf8ee867ddb56af29ccb83656258a46703c" + }, + { + "path": "files/workflows/build/rules-of-workflows.md", + "sha256": "c4afdb4d4c69060d6e922eac7614c7761b0ee8146d3bd19d225baa8dfc695821" + }, + { + "path": "files/workflows/build/sleeping-and-retrying.md", + "sha256": "ac769f4c35114837e37e45c92506a5fbfd6c50add67e54fc29748d9a9f5e5c88" + }, + { + "path": "files/workflows/build/step-context.md", + "sha256": "a934968a160eee5c0b0e967ebc029fd9af9ea65b1dbc9579c30874772b2cdfc3" + }, + { + "path": "files/workflows/build/trigger-workflows.md", + "sha256": "f7ce1c403648fa892e9ca7770d9909e2c328978ec71912569adfcf5e431d3fcb" + }, + { + "path": "files/workflows/build/workers-api.md", + "sha256": "278a4d46ae81252043c3a52a84cfcda69e1b475f5f514f85093e76317c680535" + }, + { + "path": "files/workflows/get-started/guide.md", + "sha256": "27a68cf2a46cd3cd09f2ab5d5899d2abdf5601e028d88ccf95af58af1b018bd3" + }, + { + "path": "files/workflows/index.md", + "sha256": "e5085051e7fbe06c7d8e499f7931496f213a53d9af57e9a42e11324e1defb297" + }, + { + "path": "retrieval-questions.jsonl", + "sha256": "53dcbd1bd6eb14cc87510ad482032e357b53b6e61e9141d11af1722531981a36" + }, + { + "path": "source-manifest.json", + "sha256": "26d9e69e294058e6cffb55073f9dba22ddffd1ca7e3917a48e46d89f4d344eb2" + } + ] + }, + { + "id": "watsonxdocsqa-v1", + "path": "corpora/watsonxdocsqa-v1", + "target": "corpora/watsonxdocsqa-v1", + "files": [ + { + "path": "corpus.json", + "sha256": "2970bb70fcfb18ffe35e929d76364503d30e0907b7a334fdb7eae11d1a14d0d6" + }, + { + "path": "dataset-manifest.json", + "sha256": "927257eaab2d8ac103fbdf0379e869ce260027022eb3d9f21d8cc9d44516e8d4" + }, + { + "path": "files/docs/00205c92c52fa28db619ee1f9c8d76fe8564db88.md", + "sha256": "27550d1f9d3ba230222a26054e214075bc3b7741aa920beb33caafba55b732ed" + }, + { + "path": "files/docs/0093065541aa4c3e90e47e3ace89596155ea1735.md", + "sha256": "448cb53331097691bde8235f6c3a72ff43071c1ae6093e5c9b0f03b03480f3d1" + }, + { + "path": "files/docs/0108f00736882ac35e3c56cd3ce0d91bcb5798a8.md", + "sha256": "d1854d99aeb66e2026f4656e5c50426ffd26a1d67508726d7380f9f03f5f32eb" + }, + { + "path": "files/docs/015755c65c274f262396747d3f32a59ae74c08d7.md", + "sha256": "cac28c366cd558c2da04e98b43f3bc31bdbd417f42f69c645309aa81423200fd" + }, + { + "path": "files/docs/01800e00bdfb7cfe0e751fa6c616160c48e6ed21.md", + "sha256": "7e3554003ed9d136e43d42eb49c6cd4112bc2923feef2349dc4ad41a01208ca5" + }, + { + "path": "files/docs/01c8222216b795904018497993cc5e44d51a3b35.md", + "sha256": "7b7d181e8829bf64d9f0c76557ae76a87aa17223e1c2e5e5daab0cb27ce44a26" + }, + { + "path": "files/docs/02244f39be9a15fa55c94c9f2775606247969a61.md", + "sha256": "d240c38a6738dfd6304353d0726afcee97bbda12b97917b02d316be1e54d806d" + }, + { + "path": "files/docs/02326495f914d005bde7360f0826e8c140816613.md", + "sha256": "9140ddd40df21b04ae8cebd9ee2afcdb177431f729e735e29eafebef390d0956" + }, + { + "path": "files/docs/0294ab8c0fbc393f5c227a0f8bebccdc67b78b1d.md", + "sha256": "7ec1e5c68b25c9f9c49011c61b470f7bb3485163187902878ef60eb85a1f0ef8" + }, + { + "path": "files/docs/02c5718919d676e7ea14d16ac226407cc675c95e.md", + "sha256": "0b8f421f2c5bffc74704f931a9a93d3534cdc53517698bbbc207b3f2c641284e" + }, + { + "path": "files/docs/02d819d225558542a49ab6e43f94fe062a509ea5.md", + "sha256": "d9f2476a59efde912b4fa282ccc6e805c0422859154049d35664965afda96b91" + }, + { + "path": "files/docs/0301d6611a36e44c345083f6e2c3bde58de59982.md", + "sha256": "02b6971a6cb627739475738b2c21d038e66eb09d9d0c58c44a6f963c271e5b33" + }, + { + "path": "files/docs/0310b7fb9072e7f7e5d73f5af90ede62faa81286.md", + "sha256": "fdd5b23c834ab795ef60c4a2cb3e9dec73bcb170db185b7b68a623ba3d874cc0" + }, + { + "path": "files/docs/033e2b1cd9e006383c2d2c045b8834bfbbab0f09.md", + "sha256": "7aee58c08c8123f122f824713253526d7f9973cf80647a5edc27aa385a98c23c" + }, + { + "path": "files/docs/033f114bff6d5479c2b4be7c1542a4c778aba53e.md", + "sha256": "f1f80b29af07dc91fb5ecf274ba2ebbd5bc532b156f84b330caca667b6269920" + }, + { + "path": "files/docs/035430afac1e73483636073c5bf48bcf8b4f5e1d.md", + "sha256": "d2c8b2fdda7c2bc9ef5fffdd4a37c685f77929f3d1671adcd62e8edddfa16f43" + }, + { + "path": "files/docs/035ef4a1d7c465e8a72acc1c5c98198b4e95068b.md", + "sha256": "aeb7397184595cb5b6833e19e827fffb3fa2054c789fa6b79c1eac68548b8af6" + }, + { + "path": "files/docs/03a70c271775c3b15541b86e53e467844ef87296.md", + "sha256": "1ce9ec537dbee8229d89ff4b203189a47965294b6b27a86008ab300fe2ebbb66" + }, + { + "path": "files/docs/03c28b0a536906ca3597b4d382759bd791d0cfec.md", + "sha256": "7551b85bb5faaa20c36f02e3aaa6afefdd1455bb84bed71e0aad409c02ff89e2" + }, + { + "path": "files/docs/03da4d2d23a65c146ba5afd8f7175908f868f3eb.md", + "sha256": "07bb7eee000e16baf9988127d1b6f37802cf286ae751090fd58e60e2aae1fa0d" + }, + { + "path": "files/docs/03ff997603b065d2df1fbb49934ca8c348765acf.md", + "sha256": "fbb6a0dba5faea7744dc517368020159bba66975e2251190928779d38cb90c41" + }, + { + "path": "files/docs/049829eea8eecd997e6ca05584cde2d9bae92218.md", + "sha256": "c3e382e136207ea2c8dd278ba2e9d07b2ba55984cd05a120730cca478ece9f34" + }, + { + "path": "files/docs/049dc7fc73042985f3258ef2cf3bb05114f7f175.md", + "sha256": "2af1d7cf5ee752f4b780136834d47a1cf37477c7961438cbf4825021f75b0787" + }, + { + "path": "files/docs/04b717fd06c5d906268e8530f4b521686065c6d5.md", + "sha256": "06a2570fceb77f965b628d3fc149ba9ccf7cb83310e7684577cccd65ab381bc4" + }, + { + "path": "files/docs/05275f4ec521878b13ad7dce825e167b2fc7ef93.md", + "sha256": "e4b89f63d25bb18f5957163c2f2b1c36155b4d7032152b9c84f674c70cb5275e" + }, + { + "path": "files/docs/055727fba02274a87d30da162e6f5eca3ace233d.md", + "sha256": "3dac822a1b14545dce182f0982b9df7dd017ddbb0fda247c6b7a0412c187e190" + }, + { + "path": "files/docs/0563fc6874b43fa0bca09ae54805fe98bfa33042.md", + "sha256": "16b7ef2bc6f9f67bd26021ea3e1429b8f811511c362b73a18d550d5a872602c2" + }, + { + "path": "files/docs/056e37762231e9e32f0f443987c32acf7bf1aed4.md", + "sha256": "8c87b0e7f921268dba2f4b25d5b73433308f4330bb153573ef17f8f173dacb9f" + }, + { + "path": "files/docs/05d687fc92fd17804374e20e7f330edae142f725.md", + "sha256": "260432f4f3fc7e99ad78d0eae2f24892222ffd4f87336124c452749dd1d22a08" + }, + { + "path": "files/docs/05f38627c9ec286ca7c379a31aa27392a65411ab.md", + "sha256": "20f2369f3f10ac25410d6d01a8548bf62faecc8d654de587f73584a7b5a325e7" + }, + { + "path": "files/docs/063d5e4c6e2094f964752d376b5ff49ffd47433b.md", + "sha256": "41644be445287ac140105cd3d1e85034ff022ed6a7ca1d9bce9344af6daa4a36" + }, + { + "path": "files/docs/0721692d3f363b864a241fc4644d7d57b2dff881.md", + "sha256": "f404b14a1ac448c730d96724b857ab6b731b036b3cab34633091331871208e73" + }, + { + "path": "files/docs/074c9baeb0177e3cf57bac36e5fcbd13063498a1.md", + "sha256": "e5f6b46580b848006be59d66cc41929578eee9752fc9ee02ebec0919828fc699" + }, + { + "path": "files/docs/077afc6b667f6747ff066182e2f04af486c13368.md", + "sha256": "11b7b95566e196ed03f07b5fca37b037ae4577ed1795e098f406cd5a5e9ed508" + }, + { + "path": "files/docs/07a75b90684d731c6b33fc552585d391e86a2a35.md", + "sha256": "2d9ae44c1d892cf9886024de58785b0f8dbb15b72f902d4a686ac8dff8276d29" + }, + { + "path": "files/docs/082349f7c1e486d18bca3bb7569d4de25a8e81a7.md", + "sha256": "95f7fb80489501ace051998e2a24ef17699add47ac45e7b77ae1418d53d2e62d" + }, + { + "path": "files/docs/093bffcb43c46f1068a59a6b6338c955bf20aabf.md", + "sha256": "c5dd77360a29f1875213602fba3dc0bfecb7608aa8390861b70eadbaa1f75165" + }, + { + "path": "files/docs/09897dcf1128d66144d2b165564c228c16cd5ec5.md", + "sha256": "5505a623d4b1861baa15c0fda3825ffd9b0b6eec031a27906fd75ea61999a830" + }, + { + "path": "files/docs/0999f59bb8e2e2ab7722d57cdbc051a0984abe45.md", + "sha256": "5189713020252529d315e7415e420be7fe37b99f22b98d2cfa6d9b1acfe16bf4" + }, + { + "path": "files/docs/09bb38fb6df4c562a478d6d3dc54d22823f922fb.md", + "sha256": "32d23d18c32e18002dae315d2a3a5bcc63bf4c021fd742f525a9712ac827c860" + }, + { + "path": "files/docs/0a507ff5262bad7a3fb3f3c478388cff78949941.md", + "sha256": "be24d7acfd8d8f547a51c2b5fe5d15b4cdc41af482a1aaaa1d2929de5891e911" + }, + { + "path": "files/docs/0a5c26b7b5b7c1e3afd8901d8b91f2e3c527da3e.md", + "sha256": "1cc425a22a2807a7d95424cde0abb9751ea685971b68e1b921d62b287344e9f1" + }, + { + "path": "files/docs/0a6d8500dac43a18ec5dd8fcc3d31c2a31546554.md", + "sha256": "826b767b80e8ad814cc2873c5676f94bc96e74ae16cdc6a52fd692934c1c914d" + }, + { + "path": "files/docs/0b14841af65a8855e9d497ef05270b54b245daf8.md", + "sha256": "e21a0c67bfc957b96881efb9e067e73a519357b5daf7919cfeb9bed4cc40aa1c" + }, + { + "path": "files/docs/0b35e778b109957ee1cc48fa8e46ed7a1633e380.md", + "sha256": "b741cf6a31021933d523a8f05130dac20b72601ad97884f4492ccd124590452a" + }, + { + "path": "files/docs/0b4e34a88c9328ec6e0cc8a690b466f441e5efc6.md", + "sha256": "f91ca61b76a8454c11361dc9a629e2c2ae0c5bc7f8ee56c9d9d5e08ceb61251c" + }, + { + "path": "files/docs/0b54763a8146178f9f4809da458e4ddbd9e28b39.md", + "sha256": "96d3b2a99d194c56a3b23aee178a58a28fd7d7ce1cc7493c7368ccb45e5ef71f" + }, + { + "path": "files/docs/0b5c4d75ea0a1cd2ade09184ee2b159e23033cae.md", + "sha256": "74bab568bfe2c58777b0d6693f1256f3b84c18e0a2255eef65816e00b782c3c1" + }, + { + "path": "files/docs/0bd226c12cb659bf7711fe30c594e548525dbbd2.md", + "sha256": "c5582ce4f7815b6bc278eead4803e4a247025ac65b1a4d5c40f97e9f0184ad37" + }, + { + "path": "files/docs/0c836867dd758509b908532f35cfc5e160d81a19.md", + "sha256": "981ed1f25b3858419e531f1113a45d2f521ba725344678758461614c70e2fa8d" + }, + { + "path": "files/docs/0cb42f245df436af2bccb54b612786ca493b917b.md", + "sha256": "d8631c13f716f5f629ac046b6177760cbcb8b289ed071ed1a2961582ab4f9b87" + }, + { + "path": "files/docs/0e5c87704e816097ff9e649620a1818798b5db3f.md", + "sha256": "66599307eb9020c80127f9c92da9fda96a7e1a485893779d5f212c4acf939433" + }, + { + "path": "files/docs/0e6365d1dd3ec522c4da68b662f05a0120617593.md", + "sha256": "a820fdcdb34317691d55de2b18c76407da0713cfc7155a4268bbe02783d593bf" + }, + { + "path": "files/docs/0e7ff3238a69fa701a2067672493ccb1b9698cc1.md", + "sha256": "d4b895ad2c3ebce070335b354413d89da7e6c47a6fd5582fe2c7616f811d1f77" + }, + { + "path": "files/docs/0ea3470872bf545059b23b040ab1eb393630a29d.md", + "sha256": "49ce527ed3efdee7e9895fb74e798f26336b75c8856d75cd5a09cc1184eda5bb" + }, + { + "path": "files/docs/0eceac44da213d067b5b5ea66694e6283457a441.md", + "sha256": "a9a91eb0fb4086dc14fa7df01470d363e9ce12e5b0956890bd47e829682d8989" + }, + { + "path": "files/docs/0efc1aa12637c84918cef9fa5de5da424822330c.md", + "sha256": "4d248134a7988b4d24ac922d1fb33079fbac986d41ba810bcc1b488ed3c3b924" + }, + { + "path": "files/docs/0f13adfc739d217925ddcebb152284565bd43de8.md", + "sha256": "347ea01f8f1681298336493991dede61dee286bc5134cf44b232d6edb86d74df" + }, + { + "path": "files/docs/0f58073f0d5b237c3241126e98851a9e0c912792.md", + "sha256": "0beafa19d3d3e76cbf5186492197508ec88674070fa9c812fc513f997cf0b7c8" + }, + { + "path": "files/docs/0f686bf5943844896a5385e01d440548081d2688.md", + "sha256": "07962d64d3e1e0216a17c179705228ca7e92208c7b0a6ea8d516365c31cff76c" + }, + { + "path": "files/docs/0faf8791603eb1a93adc49ea8f9e5859d1e3360f.md", + "sha256": "5da037627ff8504dc69b65ce3f128f256c9e574ac73557af06d11e66f0fbad4f" + }, + { + "path": "files/docs/102d3d188e3edc4a4aa55f731966ebb22c827822.md", + "sha256": "92a3fc465449b99288c5ea9e4a52ab7fdef04d37df0ae8464efddf34868a42f7" + }, + { + "path": "files/docs/1093c3d02f71f4fba221375302d20bc761e70aef.md", + "sha256": "ea8126ce4161cb0e28b696ed71330d99f5b3c9a635c71dd6d8d94e3b4a205db2" + }, + { + "path": "files/docs/114ebf33612531c5020fd739010049e5126e0e5b.md", + "sha256": "0024854d37b859cd1f8073068025fbc077b9f78d12b5ae6a2f63c057d368a3bb" + }, + { + "path": "files/docs/116575c57d15c410ac921aebfaf607e2f86e6c05.md", + "sha256": "701b17ede1bbbb0c952e3e8b46081e3bda9331af25f8e69d0b3d101d1e0e7387" + }, + { + "path": "files/docs/11a093cb8f1d24ea066663b3991084a84fc32bf2.md", + "sha256": "f428b4310111c9b1119f79a68784f1061d60d3fd155aeb2dd23ced703052be5e" + }, + { + "path": "files/docs/120cae8361ae4e0b6fe4d6f0d32eee9517f11190.md", + "sha256": "40c6dfe3dcb5cf07fe7b9c89df62c495527fe28fa69649702ed2708a72e22f50" + }, + { + "path": "files/docs/123987d173c0db88d8e1f59af46a8d9313a8e601.md", + "sha256": "9e5353c7b3d9470947f4d47df1080ba96dcbba427a6a9c566176147d594547e1" + }, + { + "path": "files/docs/1243d4c8499cc9be45cd9c1f6eb34254f1b9b4d7.md", + "sha256": "d13f4c156e56978c8fefab25b9845771df8bfaa6cd63e1c00ff74f0997745e41" + }, + { + "path": "files/docs/134eb5d79038b55a3a6ac019016a21ec2b6a1917.md", + "sha256": "2e0f09260d0e382b2f5f6a220c32e8e3e6a49854bc8c225171e4a50ba4dad71c" + }, + { + "path": "files/docs/135ad82faaa11fd4fec7ce7a31516e98ee3d0ea5.md", + "sha256": "2e05b9e4aa0feec4dc21e426a71e1ed3a2a160c02ff8ff3dfb201bfa9ebb56ab" + }, + { + "path": "files/docs/1399cd9c09634e30c0f099c0fae66a756153dab1.md", + "sha256": "6cfe5d7f52c45748eff266059821d5326f66e74dc928a38a84299059a66e14c0" + }, + { + "path": "files/docs/13a1ff3338f4ac1eb2cf3ff6781283b49ac8b5a6.md", + "sha256": "593f7937bf8cf620b98a359b2c32968efdde0c1df55a3b4c1bcc0c432e85cf23" + }, + { + "path": "files/docs/13d83af5ccd616f312472fbab4ac7d7a56d0f41d.md", + "sha256": "286aad347146c00de6fe7cdca587735c9bf2bbdd6fc2a24e0d6ed5d1e9492539" + }, + { + "path": "files/docs/13f7c9c7b52ec7152f2b3d81b6eb42db0319a6f4.md", + "sha256": "4db2ca8f53990406d36c3ca627e3e395c467964f9ae9f71b792a69d19250ed48" + }, + { + "path": "files/docs/14005f26f286b03f8ac692d42e9f3dfce1f66962.md", + "sha256": "7c4ba4812ff9b41cfa03d96761aa813f713c43bac448ee39fb998353640e1b95" + }, + { + "path": "files/docs/14416203d840c788359110b18cfd9ce922de0d67.md", + "sha256": "836318d5f6178e950866405483789f97d116f8d4da754f75efce5f42d9fa1366" + }, + { + "path": "files/docs/1453d1cad565842eea24c8d92963bd73338ef0f1.md", + "sha256": "9f01eea036220574474129024cdda5adc5060b4319e1546f77a747f605b790ea" + }, + { + "path": "files/docs/1483016be71021f31b8193239d319f34d8e01c9c.md", + "sha256": "af6dcff496591029a2f3e0e16872b382cce22dd0f47ac2d6e99e09d0f282be53" + }, + { + "path": "files/docs/14a06de43e6b08188a7672b5be8068a572de5b7c.md", + "sha256": "323831c997f8c7d0687128d42db00101432ed0ba090996da06f664f50e984a8d" + }, + { + "path": "files/docs/14f850b810e969ce2646d5641300fb407a6c49c5.md", + "sha256": "e7dfe5974fc598e3fb52ee800036f5c2f327a05bd0635a91eed6ce39e77a82bd" + }, + { + "path": "files/docs/156f8a58809d3a4d8f80d02481e5adde513edeaa.md", + "sha256": "49d03087a87cb55909e17a346a8db5eced55bcd3687ad3701b972eb2b8853b61" + }, + { + "path": "files/docs/15a014c514b00ff78c689585f393e21bae922db2.md", + "sha256": "4d51a841d117b9fa30ffe3ff7bced5c7939c2222adf49c39f9f08e0e92f576ce" + }, + { + "path": "files/docs/15d57c8193b99b8525bc2999ef82ef1cd7eae8ad.md", + "sha256": "fc9da808d4f309729e0ad193b0a4cf9be23a46cecf590d860e990332761c57b0" + }, + { + "path": "files/docs/16048584b029b9be5da50d7f9d9ae85ffe740718.md", + "sha256": "1cee4b40df92335f6bb32167096eb47830acf50b3720be58999aaa5e7b2cce8a" + }, + { + "path": "files/docs/163eeb3dbaff3b01d831f717eeb7487642c93080.md", + "sha256": "abfaba9056311f3a300a88ef2efe2e9da8cd9de70664f25607374d500435ee97" + }, + { + "path": "files/docs/167d5677958594ba275e34b8748f7e8091782560.md", + "sha256": "1f0e70fc66623934bdf1681919a925b47ac0a795ec494e0cce4ed00c6f5b3bd9" + }, + { + "path": "files/docs/17470065afc59337b207721ab539b4622bbb3055.md", + "sha256": "ed465b499743f793d2e01d906d77f678bd74c958737cb624703f873c24720924" + }, + { + "path": "files/docs/174d6fdf73627d7b2258d7f351c3d0156c06d1dc.md", + "sha256": "8a7db21f7a3f62ce47a12fe873dcc1ae66e099419000e30b551586aeae44f452" + }, + { + "path": "files/docs/179bdefa68b788a2c197f0094c43979d9265ba77.md", + "sha256": "9af9f30a9e640793028fd55240281ca25fe9a1195eafad07ed58baf1f014f75e" + }, + { + "path": "files/docs/17ac1becae0867381bc236d4c0cc8fc4b8921a0a.md", + "sha256": "754fbae22d238a2284e676999a2e57d37d0fea4381d05de8f025be1bfb91f450" + }, + { + "path": "files/docs/17e39c164e92d0646c4dddadfdf178bf3b5e2ad0.md", + "sha256": "5392c20e3bc5b641bfcfcc363300047767e70772f8b6ed2b829e8d741c84c2c6" + }, + { + "path": "files/docs/185c42ab06de9ff515dcd03213f5c4608c6faebf.md", + "sha256": "9503b606f71440eb9164127189bbb77e147fb1fb419566cf77eec782272b8f5c" + }, + { + "path": "files/docs/189f970cf3b162e67b98b2a928b36193169e3caf.md", + "sha256": "64b18290c9181b68e16849b058d57222cb3a0edbdfb5d7948d4e4af16c915156" + }, + { + "path": "files/docs/18a7a354c4b46e26df8304755c8be954bb922b04.md", + "sha256": "d6af3a46e077b45027e239370f90c5293694e30d81cd707c588221135fd6af57" + }, + { + "path": "files/docs/18c44d2a29b576f708bc515cede91227b6b4fc4e.md", + "sha256": "a4525a8948b3b1ee0b178ed10500ed6a80a07a501bc9bce53f356712110bd6be" + }, + { + "path": "files/docs/1924ae74643c2d9d416204693c9bb84d5212e3b0.md", + "sha256": "4c8133cdcb1fb1314c39706ac1c6881bfeb744329458609041d9cbeca4b79199" + }, + { + "path": "files/docs/198246e6e7f694d36936989d23b2255b15c2a92b.md", + "sha256": "033c710608d6ae2c70854f541318c22e483a1db5626498953bfc5fac5b1bcdda" + }, + { + "path": "files/docs/19ae3adcf2da2ffe5186553229fef07cb2b55043.md", + "sha256": "3aca59ec551afd8085cf8b81c92f2ed29b3f447f86afa176ee215c7af20fc7c5" + }, + { + "path": "files/docs/19ba0bfc40b6212b42f38487f1533bb65647850e.md", + "sha256": "76649590f551977f7db17d67e6acd176e1c935dbe09635c52241d3baa8bceea2" + }, + { + "path": "files/docs/1a548d934dfe57dd0f12195461f2ddb348eae68c.md", + "sha256": "e5ae6ed7a2895d43fc247f5417d31a82a14149684e27a0ee2f1ea7276554f5c2" + }, + { + "path": "files/docs/1a5f15e64aabdca9e2785588e76f3ebe22a1c426.md", + "sha256": "d7936194997b1818e4caf09648a10501e16cab38205e5d9c7b6f5c6dbe7912ff" + }, + { + "path": "files/docs/1acf5ed461253f09db844c2d84c1ae21277bc1e6.md", + "sha256": "43038e8be5b307edcdfd42a782c2e9695ba42f2fc37e761ec8c88cf111780caf" + }, + { + "path": "files/docs/1b0ab9084c7dd9546bdc2f376b58e32c0ecfee85.md", + "sha256": "1a19e81cc12e07033d439cc8c676e6fed99fdb6d9b17681c3b785736c46beb12" + }, + { + "path": "files/docs/1b83fe669cb3776d00a1a78e4764f115dfd5a40a.md", + "sha256": "d0baf1fdfbe5768ad38748a7d4998d25aaedea79c5b5a41fe92d9d15f0b6fff9" + }, + { + "path": "files/docs/1bb1684259f93d91580690d898140d98f12611ed.md", + "sha256": "3c32061f6833a68b108182bf9f972864451812ef7f0358d8b55b6c646dfbb067" + }, + { + "path": "files/docs/1bc1fe73146c70fa2a76241470314a4732efd918.md", + "sha256": "c2ed6750fda84e29f3320d53aeb959c7a7b2f84a1693087c453034f0deac6a92" + }, + { + "path": "files/docs/1bd28f052373c2e70130c7539d399d76f9d2aafe.md", + "sha256": "c33992da2bd94e9d9fbc74cd13ced508918ce1991dd43d4e189f93c8be639fa3" + }, + { + "path": "files/docs/1bed610a414085e625bd32aae5ffac81b41f97e0.md", + "sha256": "36a70173c85d6028fea8dc5256d01cfd0a3b6239685d679a13abd005a2dafe12" + }, + { + "path": "files/docs/1c19733ed0d3400baf6ff05317475a6518b5ba1a.md", + "sha256": "8dbe45a80ddc6ba09b11af389ce4acc79c8a8af9d68f84ed489f7c7d89ca688b" + }, + { + "path": "files/docs/1c20bd9f24d670dd18b6bc28e020fbb23c742682.md", + "sha256": "10aaa61d93816f627bb0c9077d5105bd5245aa335de17dac39a6c5666ca53ef7" + }, + { + "path": "files/docs/1c42359bdf665ebca2bae4b9b3d5108f8097bf34.md", + "sha256": "b46da753136994698c92b43bd4bad1d9a376b4c63e9524d2db6456127de9f42b" + }, + { + "path": "files/docs/1c863b2624ab2712318442337c917143c19e7ddd.md", + "sha256": "9c66abbb4381e06b6e2be9db3db21de49ccc8cfd996d5cc3f00bcfda518e78f4" + }, + { + "path": "files/docs/1d1659b46a454170a597b0450fd99c16eec5b1ad.md", + "sha256": "47b35358b9448172a125d9459c1cc754689f29481c6703e53df5fd3ec2ad89a0" + }, + { + "path": "files/docs/1d1783967cbf46a0b75539badbaa1d601bc9f412.md", + "sha256": "84bebf252d0f1f1ebc924c65ec90660deebefb81c2d965fc3cccc44f144784da" + }, + { + "path": "files/docs/1d21c3dd339c26916f6df1ef3124c9d2d39c9acc.md", + "sha256": "c138c87894683fbfe229bb9ed881b9bb71ca8e71a5c01c6b6c6ea8a8c56e9b9d" + }, + { + "path": "files/docs/1d393a73ebc623578dd6da2c09c20e97fae074d4.md", + "sha256": "b28f8a70bbf8e7218af2c175d8b4125fd4db6386d49d2175ce25812577bdd079" + }, + { + "path": "files/docs/1d46d1240377aea562f14a560cb9f24df33edf88.md", + "sha256": "ba26e0d8c21218a8a2047539853c0ca22321253e70ac4e8f1a52b5ef3c2e3de5" + }, + { + "path": "files/docs/1d5d80dff65ee4195713eeeb43f1291b79779a6b.md", + "sha256": "50b211ed97faeb9b8c62ffa4f97732c77add5fe6b936a2ee5b246a75635c8466" + }, + { + "path": "files/docs/1dd1ed59e93da4f6576e7eb1e420213ab34dd1dd.md", + "sha256": "1987dc0ee5efd0e50bcda4e4ed810cc169c61243537880b85a600b84c0cb50bb" + }, + { + "path": "files/docs/1e28b88cde98715bcd89dcf48a459002fcda1e0e.md", + "sha256": "75b5bf54afa4f62c33fc7400ae506916b4ede1e90c5c4d62b96620f325a61f10" + }, + { + "path": "files/docs/1ec0aabfa78901776901cb2c57aff822855b6b5e.md", + "sha256": "b119ad345ccd58198fce727eb67a40ba43545e1305a533df649f1b2d965afac4" + }, + { + "path": "files/docs/1f14865c04b28b02ee0760d7099554a916e26926.md", + "sha256": "43fc883891b649f962f305f84083bbb83811aef93ee26c67b403ac3b1da53ff6" + }, + { + "path": "files/docs/1f781da5779dafefbb53038f71a18bbe2649117b.md", + "sha256": "abefdc0e953e74e8aa9f5fd3254ff4880b0c4f9141ad9507eb50f1f836294fbd" + }, + { + "path": "files/docs/1fefe3c6f1a20841fa1ae6afaa85cc7ff36778ac.md", + "sha256": "07e09cfd9bef91328306922b43eedb31e10f6c8d5e4887d39d04c059ded2a266" + }, + { + "path": "files/docs/204f36069ee071b185a1bce8370946a50bddcdd5.md", + "sha256": "949a12b8faecd2d4b69db2919bc599c74ef0dccea85b82196a2b90ca71673806" + }, + { + "path": "files/docs/20cfe34d5494ab0ae2ef8b6f65396edbf667f688.md", + "sha256": "8b69a685bb1e8bffd6e42a3fdd3057cae2c7964a130f72d68290404544867d91" + }, + { + "path": "files/docs/20d6b2732be17c12226f186559fbea647799f3b8.md", + "sha256": "f1414fc46b69935cc4de6ea1de0e5fc8859d278d868d5dac4c06c1f00991ac4c" + }, + { + "path": "files/docs/21db0146b79b8256259507c62876e01ada143bd6.md", + "sha256": "ac4f0c5014a6cd176bb6a678a62096f7bda0b6e371946064cd0eb9461b820301" + }, + { + "path": "files/docs/2200315ea9da921edff8a3322417bb211f15b4eb.md", + "sha256": "e186c48dcbc4c7368c472ce8ea9d714d2a79a921b6660f60e44daa0cda2917fa" + }, + { + "path": "files/docs/220e465dbc0c22ff06f80df18b25044dd1ebc787.md", + "sha256": "bee61d73c430faf24c3fd613aab571b3e889b38c03bc02ec3240b17e71e19ca8" + }, + { + "path": "files/docs/221f46d0a3c2c3d3a623be815b45e8b90af61340.md", + "sha256": "a4cb193a4788a44599793cf101d423043e3e46d34f4e166b05b0760f91ec3eeb" + }, + { + "path": "files/docs/2245768521f36e6f2df594e1bf3111dd63cc824a.md", + "sha256": "df1da741ca6f62c8690ae4a1c2f3e91cafc1356d8b60d7a9008e3ed901e0e161" + }, + { + "path": "files/docs/225192bb81696d14887cc55070a6dfa14b3315f7.md", + "sha256": "698610d415abc3a22d14674e3ae41550d4ea1af522641961d0b08489621e3d89" + }, + { + "path": "files/docs/22a8f7539d1374784e9bf247b1370c430910f43d.md", + "sha256": "4072b15830c429afa499b4df92c8d50a6436723e31c2e9737099e2500cfb21ac" + }, + { + "path": "files/docs/22b8136f68ac74838b9c2b9eaf3996ccfaa14921.md", + "sha256": "35f2a7421a3b20839c48b036a2f8aeb962ce1d595dcf62fc662454173fb0fab2" + }, + { + "path": "files/docs/22d15f386dc333bc069eea8671e895c97956e754.md", + "sha256": "19e3e326b7b53b4dc5d33897086ef52722856c4104d79e67cee8cdc4759c409c" + }, + { + "path": "files/docs/23060b35041c9abd00099b1e0b1d83daff453c6d.md", + "sha256": "61f10753100b0e4167acac7bf85c1dfe208de24da0f014f01c20c8244e487d67" + }, + { + "path": "files/docs/23080e48c7b666c07e92a6e4f4bb256d77be49b4.md", + "sha256": "b5b851ec31c655fe3a351a4863c912d578f44d17beec30d3f00aa48434ef50cb" + }, + { + "path": "files/docs/23296aad76933152d5d3e9dd875ebbd3fb7575ea.md", + "sha256": "979c6ec60b2d4a351955acc588ba244beefa7453dd88ed44d1772d2935831f59" + }, + { + "path": "files/docs/2339deef952ecf06246f2a5daed6925e00f52d64.md", + "sha256": "131ea6bf66d8b4d52d8b04b3b47ea37940972778edd519ab1833b761aacdc7eb" + }, + { + "path": "files/docs/2353ffc21b5b117f70eeec0e71c9d6fb2f6dc022.md", + "sha256": "bb5d677342c20be2f99ca00bd7e3d4b430dd2831448ff599d237b3aa34f43f22" + }, + { + "path": "files/docs/2372aeeeb4da6a3e94273cb46224ed09cd84cd9e.md", + "sha256": "8692631007ba3689c259efd573f809e3e929636039f94a4821cc0305d94365f6" + }, + { + "path": "files/docs/2413c64687e434b4b2095163a5106c0c62aa3f59.md", + "sha256": "e5e952ac464c6328e3dacca706eb06048a0b273010047ae4eff5d426be41d11d" + }, + { + "path": "files/docs/24d2987869b1c8c34efa1204903a7a8f3e35d459.md", + "sha256": "15a23ebd5f3c55a99aa79f3695ee4248e38b91f5caf7e9dcee779ad96572c5d5" + }, + { + "path": "files/docs/256ed6ca079a147359a51199dc333b23c2708b42.md", + "sha256": "ae2dff8fc8c204e43eafd7a31dbb66a12b0e37c8261973fd7ee8636e162739b1" + }, + { + "path": "files/docs/2581dd8f04f917ba91f1201137ae0efea1f82e26.md", + "sha256": "8261fc09f21822e9d8252818eba6aa78ffb571d744022b334591a9e6b8015596" + }, + { + "path": "files/docs/259e5a974f6170cbfdf7b0014cc1a0a0111423de.md", + "sha256": "ad0d7f27f2b66d6eddb1093369288ef6ce1f69a7e412b880d46375ed45d17e8d" + }, + { + "path": "files/docs/262c45d286c9b8a7edba8635e636824f2b043d73.md", + "sha256": "c8b1b4378bdef68a5d2b6a235a5a6af9987ebf629a32074569d67e36a994ca29" + }, + { + "path": "files/docs/265714702b012f1010ce06d97ec16623360f4e2b.md", + "sha256": "2b9795c5cd119bf62057b29262e6da78de4194c8042cb7b3e036239ee801f9f7" + }, + { + "path": "files/docs/26fb8b86499454efd078384d70b02917d1c7dae1.md", + "sha256": "1b8af588fafcb6e7fdb20a27f3e790b331c27a73f688e05ed3e2972561f473b7" + }, + { + "path": "files/docs/270242015183da2517df613fd951623042268bee.md", + "sha256": "f7da9f8f44660b8f29d4252cfbfc5e0f66f769e25168fa51494937e2b4c7d98e" + }, + { + "path": "files/docs/27091a60ba512e180c699261ecffdc3a621418a5.md", + "sha256": "ed40c1439cffb2e795a9ffbe6939669bfe76e7244e47e0b5395de8043d3296cd" + }, + { + "path": "files/docs/2746f2e53d41f5810d92d843af8c0ab2b36a0d47.md", + "sha256": "d762ccbf8c2935149b4d7f31a3dec5aae385f9636cb8784748c69d14ff8517a7" + }, + { + "path": "files/docs/2756dead36ac092838f80acffe6ecee13a22a376.md", + "sha256": "b749dfc90d5f1896a273d5f6811f48e92b02035b2310a106f20013e459c26107" + }, + { + "path": "files/docs/2757f7f9b9e4975b9e53da5b4508ff9d7a41a0a4.md", + "sha256": "244d69549b1c11f4305de8e9583e37b996c64158ae7ebf5f0f643610ad8fb24d" + }, + { + "path": "files/docs/2779271745a02f4de48bd92ab93a7a4be4a73d38.md", + "sha256": "a33cf727cea9a0ac806ea3686af5364127b269dac924538fdaf914ebbd8cadbb" + }, + { + "path": "files/docs/277c8cb678caf766466ede03c506eb0a822fd400.md", + "sha256": "4b37e6d9eb5593f1658651f0f47cf27564dbd53c8da345f4eb50c96530198850" + }, + { + "path": "files/docs/27963df2327fbe202b836ac5905258d063a8770d.md", + "sha256": "9e0b9c7d1899f145b9ca4f592249016032c94c7da535fea11ed0242f8a19d366" + }, + { + "path": "files/docs/27a861059a73e83bc02c633ee194dac6f8ace374.md", + "sha256": "eec946de1790955d2743a5c8aa0471ad13bc96a29bb0af04da1680fcc2d9b28d" + }, + { + "path": "files/docs/27db2218237b89f557d3702f4270288e4460e9cb.md", + "sha256": "58d3d45eefed0071041be489b617cc8791c5fb9928921c297476bcc1f0fccca8" + }, + { + "path": "files/docs/27e7ad16129a9dc8ac8ce2ee79c9b584d441f0de.md", + "sha256": "7a3f1d933c4c3eb1aae7d602f6d103dc197e8f19a4327210f1b266be855115e6" + }, + { + "path": "files/docs/27fcab0041feb8b819e329a319b12d2f4167318a.md", + "sha256": "5904ea38d53f21790282924d6a487a1b1cc838522b7b0a45c2c01a5b1e7fd346" + }, + { + "path": "files/docs/28243d1c0b8bcf04fe3556990d40d1a31f4cb58d.md", + "sha256": "d81b30c8b52df633d7932c038737743a83472c3b5f53255d381eb2f59e22c71a" + }, + { + "path": "files/docs/2828fd5943abba08aa260f1080b850c90fc4efbe.md", + "sha256": "03b4103d9e5c307c3104a4b6465ef84c1248ce84fce1ca82ac401867bb3e7e01" + }, + { + "path": "files/docs/28c4d682b46e9723f538988bb2bdb1eb65618e5e.md", + "sha256": "8218dece18e2e1b391a04aa39225d5d8ac68595ea42aa560ddf7d0f66eb6fd25" + }, + { + "path": "files/docs/28f15ac17715506bb29327874de7f76cb9fb2908.md", + "sha256": "c35c96ebe95b4c836ac1468d81ca490bbd770c550cac75a5d66666ec28ab02c9" + }, + { + "path": "files/docs/2904e26946523bb3e78975f68a822f5f2a32b9f5.md", + "sha256": "32d6d1e918550bfc6d53081afc368bee8463eb7c321daa5b1905ae02f8e1f6a4" + }, + { + "path": "files/docs/2910b7c4cd65f8e4add1607791dd22bed468b61d.md", + "sha256": "007d9ed20e466af794ad7abbfc4b705d980637fa3d4e2f55272e76081e72b4fb" + }, + { + "path": "files/docs/292c0e87b8e56b15991c954508ab125a8fb80972.md", + "sha256": "73e0d124ae947d71093022a85e2d6e89ea730fd6b5c909b5b7b14f456fdebd57" + }, + { + "path": "files/docs/292d19849e8fbe48869f5e3a50439964563a90d1.md", + "sha256": "82700d398d96e836756296d138a16ec5b910d375692722b797ab97ea41b0b796" + }, + { + "path": "files/docs/2939716bfa6089c8b6373ed7c6397af71389a5c8.md", + "sha256": "7a5ef4550865afbeaefe92d00cb359a948edbc978b230ca776c575b48b957960" + }, + { + "path": "files/docs/299cee894dff422aac8bf49b53cac700de1b172d.md", + "sha256": "938a49598355bb3f627408393d9433995d49152af04bf9b323947cef2641cbc4" + }, + { + "path": "files/docs/29a9834843b2d6e7417c09a5385b83bcb13d814c.md", + "sha256": "fc8ef5529cd6e9332c81516ca147131ad7f61e19d09db9166aa6136892045881" + }, + { + "path": "files/docs/29af55b95d387be39d4e9d328936b95cad5beb67.md", + "sha256": "35fd82b50f4bb11d218f69d70fe2ad10617e3e398e8f1c2ef8df4efdcca520bc" + }, + { + "path": "files/docs/29dcfc3fb6ee0ccba63e0ff3a797936da9e0c874.md", + "sha256": "8f86863b15a226d591caf29e4f0b5a21b80d43402c902d33ffc463eef2d55150" + }, + { + "path": "files/docs/29deec30687f805460a83dd924d2f119274d25f8.md", + "sha256": "b56a2c089ad04035b1aad2b525869ec3ee8b4d08a66c3fa6aebf91ba3694a2b1" + }, + { + "path": "files/docs/2a3f647a7f4eb8fb4270d4e78245f18bfde29ad8.md", + "sha256": "59bd7dd0ddb0e40a22b1fc64c33befad0f1b93d98f5d0285812cc1c6483e0cbf" + }, + { + "path": "files/docs/2a95f85cd3f7250fcba52d8fdd82d1502fc617d6.md", + "sha256": "a37e650800d20628d0a5b4597c14134c25795156d9f2c2e35fed5c4b07468a86" + }, + { + "path": "files/docs/2aec614e6cbe5d4963d53dec7e22877d5a1bede8.md", + "sha256": "0f52880ba5cd2c53714196416c5e865aaea23a725aa0d425b74b5ce2de9b75a6" + }, + { + "path": "files/docs/2b2899a3878e20a4b73b0f11cfc4fd815a81e13f.md", + "sha256": "ac34a273ca8642eadbfebca6e74fb7918575bd0933295eee4faa2e135f55025e" + }, + { + "path": "files/docs/2b4d4ca6a91c05d12f5c7942e73abae74bf08472.md", + "sha256": "78f5c9f95a2bdbf40dd612d186a9dc8982d1fb2e2d72351b8892cfcaf3068d64" + }, + { + "path": "files/docs/2b5427922d2d03f0fddfe73bbde7e8b8dcda6a60.md", + "sha256": "af8e1c762863a9313a64032961c015858893a8beeea072b545612eb91142a058" + }, + { + "path": "files/docs/2b67d1eb41065cf9da0eb68d429b69803d49eaa1.md", + "sha256": "571b9bcf8c5081bb2f1b7592d9b6a7e82e04246bfce62ca401478c374164aed5" + }, + { + "path": "files/docs/2b6dc49f4afde44dd385ae09caab02a3f1db4259.md", + "sha256": "f7e2a59b2e7ec3d33ad86308ea070b89b4f3eab4c854321adc9e4154a015c505" + }, + { + "path": "files/docs/2baf01b064f3005647a010df369cc49c6534ffb3.md", + "sha256": "5a37150f826d836459c21cc522ce50ef0c414d5f29752c144a0ee831b6081379" + }, + { + "path": "files/docs/2bb452b4c9e3458bc02a9d392961e9c643e402de.md", + "sha256": "b780c204724b771d33003e914f28ddbb9d079a401237cc59fe1637008f2132bc" + }, + { + "path": "files/docs/2bcbd3d61cc24296ea38b26b10306b7f50ce4988.md", + "sha256": "976ec649283c09ba332615d4044088f3d2f8fcd0403e291a4c7e74ae96c22785" + }, + { + "path": "files/docs/2bcc4276ea71978ffa874621715be92a9667390f.md", + "sha256": "34ab1c176cfec5013c004c02914a0da0abb2af07820d2e966db0698f4da2d4f8" + }, + { + "path": "files/docs/2bd7112457a8b916f3b4701580570c85ae1b520e.md", + "sha256": "790810bff97f699ee20dcd29a2812b5e97701666ebd7e855532a041c4b00c747" + }, + { + "path": "files/docs/2c0ebf0ccb497f41c14a5895ef97c01864bfc3d2.md", + "sha256": "18a384f38dd7d08f83d319dd63225dfcc881e6f0141c332229e0c544dd4bccc2" + }, + { + "path": "files/docs/2c17e0a9e72fe65317838e81acf1fa77620e0c6c.md", + "sha256": "8255f5f3cc4d6daea9cdf3890572025467ae1a98d1a71169edfbe587f0ec8ee4" + }, + { + "path": "files/docs/2c1e91540bd58780f781f8a06e2b5c62035ca84b.md", + "sha256": "2b8b9d896e4c5e4f9329bb026455664dc2e287cf4e62406db0b8d259804de3a4" + }, + { + "path": "files/docs/2c669e0145dac26a7517d9402874bac048e46e82.md", + "sha256": "085df7668ac064983148dce9e541775a2e85fdd9b7a61b49fe7767a980be4c80" + }, + { + "path": "files/docs/2c6b0f77c4ca0cafb52e1fe3e10800d56015cadf.md", + "sha256": "352cd6efda8285b754e4926a55dd3d4cad63c39e212e323935d721f9ba5bacf7" + }, + { + "path": "files/docs/2c991135b30b24a268fc9d847e3f43522543a96b.md", + "sha256": "95b9d6942e2e870f24adda2a0c6054a49a9c0a6670f4c51396b32c52470eee3e" + }, + { + "path": "files/docs/2c9d0d0309e01ff2ee0d298a16011857de068038.md", + "sha256": "f13314131b3944fe5c9e5959f58c246c3c74c24f40a35d30b90adbfcdf36fe6e" + }, + { + "path": "files/docs/2d08edd168fbee078290f386f7ec3eb1998adf02.md", + "sha256": "701c7bd15f891c22324210b7ea750f38c32d11e02bf07ddeaa5cd1c684fb9871" + }, + { + "path": "files/docs/2d3a398b8394671d9383f214ff5e69a00391bb22.md", + "sha256": "a30b0c6d4fc5d0fb3af04904d4d0c959801cdaef047ea24883af196f8437d3cd" + }, + { + "path": "files/docs/2d3f7f5efb161e0d88ae69c4710d70aa99db0bde.md", + "sha256": "f0704cb1511a94c2148ef05b2c59cc5491aa29da0164bdc0ffb7fbf8c956809a" + }, + { + "path": "files/docs/2d5b33f1352d8ba7cef029d1979ccf0d44aad63e.md", + "sha256": "e5b4830a63d7398ea8c6717a68cee30143ce5a0ea7bc7667ac3be31a6a82eaf0" + }, + { + "path": "files/docs/2d81fcd3e78a5cc7b435198a59522ae6bf8640ed.md", + "sha256": "322f9add775ec0dc898e99819d4d2dda6c7efc9097e7745898115ba6bb00add2" + }, + { + "path": "files/docs/2d9ace87f4859bf7ef8cdf4ebbf8307c51034471.md", + "sha256": "cd87552f1860752114113b57c7c37bd3b1ac7e04624f1f95b647fcf94b535a71" + }, + { + "path": "files/docs/2e1f6d5703ce75af284903c20e5dbdfa1ae706b4.md", + "sha256": "5a48b546fed01ca5bb500c4f980e8df95941a735c033a5d295c777a0b17290e1" + }, + { + "path": "files/docs/2e2a2be1cb20ef0c663e591532d71cfb5637e57f.md", + "sha256": "42f78510257b1c2515661911bc3952c226120e9a8da5b552c78486c3f67a4b8a" + }, + { + "path": "files/docs/2ec85cf6ab5e5a276da78f1129ad3f1f5c92f5bb.md", + "sha256": "b57627130c9a929f9565b3933fafb4072f4a68ae4b576aee199e7eb2e29c29c8" + }, + { + "path": "files/docs/2ed4d7860687b2ef6f85ff81b6af4cfd2c6ea839.md", + "sha256": "a4d16436e7c5ba8ce954f598a14aee22fa7ac4e58f494c5ad9ac8ccced1869ec" + }, + { + "path": "files/docs/2ee7bf839ffa16ec1a7f9ed82662efe539fd29c2.md", + "sha256": "68998f477ca021e40aa9271fda92522e4374c5f338d7e2ddb9f236500d9edd3f" + }, + { + "path": "files/docs/2ef8007555bc60cd700ba44ecc0fafaa024f4bc0.md", + "sha256": "ab4d3538f852db9a2755fb56205dde0191188d2fcfd450850e7af24dd8f48252" + }, + { + "path": "files/docs/2f88cc7897776ead3f1a7052a740701b8e1a6969.md", + "sha256": "7173ce8126ecda202e8d20db57aa248b8c4834c9522e9775eb6c40c5d7332c4b" + }, + { + "path": "files/docs/3094e343d06da6ae0d0d5d4865c7b0d806dc61a1.md", + "sha256": "a335dae587eff85c061f5ed2215b2aac1b420992c57a290a3eb69856e931c13b" + }, + { + "path": "files/docs/30a8256a4972314da32827a081b7541138b454a9.md", + "sha256": "64da33ffee569bdc4334c07591f81b528baaaf91670cadaa88105d901f7ae3ac" + }, + { + "path": "files/docs/312e91752782553d39c335d0daaf189025739bb4.md", + "sha256": "9859ca5a7187253b333741f614e9d874048148e6bd2262d9e33c523bee3ff211" + }, + { + "path": "files/docs/315971ae6c6a4eede13e9e1449b2a36f548b928f.md", + "sha256": "39e309880fcfddba057cda03f7bd5fb1181a503b7e38a3aa16e4dfd63b046eeb" + }, + { + "path": "files/docs/316974f0a70ee2199bf6cd912e62bfb53d200f0a.md", + "sha256": "85bec6d91697149e6286ccad3760b45e2beac7f63048f7fd99396b40194459e9" + }, + { + "path": "files/docs/31a670d6b3f0d7ab4ead7dae3795589f161249de.md", + "sha256": "4bb28a7baaf8a7eb3bc8c86c63bf9ee5324965dc733bdbada18a92111f1d67b6" + }, + { + "path": "files/docs/32217f5f0dee4a95c64b2bd92c25366706cc7e0c.md", + "sha256": "36989309c43d3a6b416eb89a8df86296d68f1e3f4ecbef3328dec43c7abdcf7c" + }, + { + "path": "files/docs/322e404e76067637f1d0afdf44cbe309c2a53221.md", + "sha256": "f280c41a700efff474bd9b6db2ffb869b1e20cbb918a6f3927b3545bc533ff30" + }, + { + "path": "files/docs/323360f59c9e5c3d6be4b7cd36927c23c0dfa268.md", + "sha256": "94874818466a0c7a675eeb31f47a1297e738d21a1b3daac90a0912b478eac326" + }, + { + "path": "files/docs/323d19f0757433758d1743b0a62dacc98d286ec5.md", + "sha256": "250813c1c6980ec7b51de744046e84e226667d9f6ca8b0e07e1367f33aec5708" + }, + { + "path": "files/docs/3259e737315294c6380ed46645ab8d073a5ed861.md", + "sha256": "dfb48113427f80f862a75b5b92f983b9884b86837ee8cd3669259c2d3744da9b" + }, + { + "path": "files/docs/32a79d23c94fb1920db500d2dd9464c1316c62a5.md", + "sha256": "a96a86a7bb624bc2893f5ff1e0f453f2a6f43bd5c76bc385ae9d3bdd83e6c6e0" + }, + { + "path": "files/docs/32afafa1c90d43ba1d3330a64491039f63d9feb5.md", + "sha256": "ea9301cbe2f3278d9a3044388a01f931727cbf7715f0d247205f7d5b8e608092" + }, + { + "path": "files/docs/3334dccdb9872c1e7f698751b138aa5af6cc8335.md", + "sha256": "4981c8c65b41fd034f14dbd4f931ae52e43d1e8ca012df53a950a25c1fffd129" + }, + { + "path": "files/docs/337cc5401082dfd6c8c79d49cd97f7bc197c7303.md", + "sha256": "fdaf5c2ef3927faca206539f7ac182c4c536b90907f69694d599fa460c3d947d" + }, + { + "path": "files/docs/338f12b976b522389f5fabe438280565490fb280.md", + "sha256": "70db01c046401fd44236e2268489c566d94b208ce6a562fa56203a87cb39d6a8" + }, + { + "path": "files/docs/33923fe20855d3ea3850294c0fb447ec3f1b7bdf.md", + "sha256": "7dee132fefd071b9be6849911f4c8064cdca2aa0f026a37a1d7f65f7e3787cb7" + }, + { + "path": "files/docs/339c9129c24aab66eeaf55a9f003f6501f72b81b.md", + "sha256": "b29718b3b44e0a6a1cad3168cf5737ec12ab2e52f2a7ee0017096e68cd471fc4" + }, + { + "path": "files/docs/339f2ebdad7cd0a3445bdf69c69ab7b28b4353c4.md", + "sha256": "2511d4e71dfd88c19c4d04456ca615c2cbaeae876d385215d5f8c267e1185d40" + }, + { + "path": "files/docs/33fe18d89140517ab2a75d6fc64a4a3db962b88b.md", + "sha256": "523316422a2a91ebb1fd38a6a0b3073dc3d5246649a16dadd86188bdf80b42b0" + }, + { + "path": "files/docs/3426fb738655136d42fa32bd6cfbfd979a3d5574.md", + "sha256": "9698d1e8e7df4879733b893402515245bbba1c3081f3217ddaca4b9743ef2a8b" + }, + { + "path": "files/docs/342ad3abfeeca87987ed595047cc869e15f148bf.md", + "sha256": "065e580889c1ebfa4c1f6bcbf6d778c7c0f27a889b70cf295207adb78735fe32" + }, + { + "path": "files/docs/3491f666270894ee4be071fd4a8551df94cb9889.md", + "sha256": "7925469c722395afd36dcbc8a7af7d17ad490043f83314bf28a6faa1164065b3" + }, + { + "path": "files/docs/34974dee293ba190cfa1b3383eb2417d0fd4b601.md", + "sha256": "1157e3d3c012a8b53cddc730213f0887cff671314b96dabaa72ac0969d16562b" + }, + { + "path": "files/docs/34bc2f43f99778ffa7e2c3e414c3cfb32509276d.md", + "sha256": "f4b46831cd90d5e9a65742bdfb91dcdbfe4f791370334c36791dc2f4edaf3aa6" + }, + { + "path": "files/docs/34ffe04319ce15e4451729b183c35f288a58a1b7.md", + "sha256": "066eb4667bea22a32c1db063a7a352a13721c9934bd88d817fded694a9b7689f" + }, + { + "path": "files/docs/3508f0dda4ccbdbb07bd583218f4e4260dc01c0d.md", + "sha256": "f7c5de649fdad842d781a8c89ae983a4a1a0e8b760b38dca93ec79ce9f52afe9" + }, + { + "path": "files/docs/355ea8bd00a0246eacfef090af6a6b6f2bd92d4f.md", + "sha256": "4dec778f9778b22e696ba48ef0498449a2f1f6b3c61c972fb4e3c772668c254d" + }, + { + "path": "files/docs/356dd425ad5be4ee255f2f95f7860b6fdfe3bcc0.md", + "sha256": "9f3948b5757db9f52282c51a472412989f038fed5464c621eb9e6331c13ca273" + }, + { + "path": "files/docs/35a87caedb1f1b6739159b9c7a31cce7c8978431.md", + "sha256": "ed17e83599b8bb307c61d537f7eb43673da0707c9d4cd01192055e031c9e1c64" + }, + { + "path": "files/docs/35f4c4a97cf58fa0642d88e501314f3d75ff9e01.md", + "sha256": "3d8719995a621114e3707a35fdd06765077d00ff80ee60549602688a373d8fd5" + }, + { + "path": "files/docs/3602c22051ea1148b07446605dd3c57bf7830c3a.md", + "sha256": "70fd7cee174800fd982c75218a3249438d914f1ed0dbcf9cfb861781470fb510" + }, + { + "path": "files/docs/36c8af3bbafff1c227cf611d7327afa8e378d6ec.md", + "sha256": "a1961fb2aa85f21ed64607e6419d2fd513b8136d7fc1842a3b365ed94cc702bc" + }, + { + "path": "files/docs/36d7217bc75c917100ae7df27dc14fdb919d1609.md", + "sha256": "22f7503fec6aa17b0ea433540f71f570e811f08d4a37b6933bd58a2ee3a5d9d6" + }, + { + "path": "files/docs/3721517369cf4ea8476bcbb39040542ba2a212d8.md", + "sha256": "028636fc8ed3f508e730501740dde04a3388a1580b57539d7b2a16738c855237" + }, + { + "path": "files/docs/378f6a8306234029de1642cbff8e44ed6848bf74.md", + "sha256": "8d912d0229b687e50f9110735506bf2c4c7cad4b3889ca7377ba2eb6fa6f7ac6" + }, + { + "path": "files/docs/37d9428bd2e4a45ca968dad59d1005fb5fc4de9c.md", + "sha256": "4c4a08ee63de859035886f0d49cce71734b8b1dcdce8067e50ef9fc8f0c25eb9" + }, + { + "path": "files/docs/37dc9376a7fb6eb772d242b85909a023c43c2417.md", + "sha256": "6804540b5330927097fece1f1dc9bb53e4936bdae270f3dcb8c2f28b37ba4aef" + }, + { + "path": "files/docs/381d767decd07ef388611fd22c3f08fb89ba73ec.md", + "sha256": "5b02db7f58c342b1f072b5efb3bd629f4f2b2c2c7ae0fa444c3c377b8b847252" + }, + { + "path": "files/docs/384eb2033ad74ea7044afc8bf1ddb06ff392cb08.md", + "sha256": "012c4c990d598ba503e592ca76ca7dd00c7f1126c687509114a2639c499b57df" + }, + { + "path": "files/docs/385dec32600a9ded58fede3e98568fed789a400a.md", + "sha256": "789821cad83386a5c9c2c5c7e1534a68d6c038be380c8d157dacd9560d7ab32c" + }, + { + "path": "files/docs/3873a285dcb38ef4b4ed663bfa0df4047ab7692d.md", + "sha256": "f1393c99c63ed3c7f7431ad49d7af157897192019521e360e28afc5781dbfaf2" + }, + { + "path": "files/docs/3874aaf67ef04bb4d623fff07e1cdb4c25b3b33e.md", + "sha256": "58d8f0c7ba882af1c0134286662aee265860eb30081e5ed62897338807ab9c96" + }, + { + "path": "files/docs/38d24508b131beb6138652c2fd1e0380a001bb54.md", + "sha256": "c9c23a51bd44a6ca1fe48ae75e3f3a22bc09c35388dd2e3f4ee5972d54922b68" + }, + { + "path": "files/docs/38dbe0e16434502696281563802b76f3e38b25d2.md", + "sha256": "18ede0d93f85f4eac4c7af2c171cef0dfcf1ea86f168f46745d242eff0164cb6" + }, + { + "path": "files/docs/38fb0908b90954d96ceff54ba975de832286a0a7.md", + "sha256": "2c171cd6a78cf34e666317f0bbdc26ba0d9085a69d3f41acc49e7e4eb04e76f4" + }, + { + "path": "files/docs/391dbd504569f02ccc48b181e3b953198c8f3c8a.md", + "sha256": "e94852e3452dbd483099e2671a03f5ae2522871d8630d75cbbeabc55cb7204cd" + }, + { + "path": "files/docs/398a23291331968098b47496d504743991855a61.md", + "sha256": "ab35e8c46963fa3bd20f161e4272d68ee2caca7229b2d7a6b70b80dbb71a4fb8" + }, + { + "path": "files/docs/39ad64c9004e83507a968c5c0b1c8ef952b3eace.md", + "sha256": "77968fe2fa494cd29f1448025c38f481bef9b758f303636cb4838c313402cc75" + }, + { + "path": "files/docs/3a81b302ee01fdc0ac111cff3abfdb96e3a0cdd6.md", + "sha256": "18dd98d65be51ed4cddec39c72e0606fa5488bf8b8b91883a34dc3fa79705377" + }, + { + "path": "files/docs/3a9dc582441c2474e183da0e7dac20fb182842c2.md", + "sha256": "89115c0e4f5d846bd0f2fd83aea99ae9fbdc4e2ddfd002ad21e633977f39b7c6" + }, + { + "path": "files/docs/3acf4aabd6be9c3bc0e0a363c3bfffdd4a37b442.md", + "sha256": "11c7577366990823df48a6758d3c0f4fa8cd3e99c0792c046f42fac327e70d5e" + }, + { + "path": "files/docs/3af15cb9e302a9e0d7de22de648ef7b3dca1d865.md", + "sha256": "9ac88b490c68442d5876bb8d50041693d91de5268c4e90b522da02e8b986cb88" + }, + { + "path": "files/docs/3b2719c3b56d1bd40fa0d8c6853ddd078fd13d94.md", + "sha256": "23458caf0ffccaee90d018bf3da80b69cb9a22534561497009fb461bb8008093" + }, + { + "path": "files/docs/3b763ffd1393292f4c3ca9d236440065b6660e8e.md", + "sha256": "711506368c488d5a602efc8d9ed9831dc3fd6de77e6424b148559830348586d4" + }, + { + "path": "files/docs/3ba46a09cf64ce6120be65c44614995b50b67da1.md", + "sha256": "d7daa4734a2ba6273c37128a64c7a53d6b849b938b3b06fd93c9d05fc42dcef3" + }, + { + "path": "files/docs/3bb91ebacc556700f955c3e6e01d90e5256207cf.md", + "sha256": "820e2841a2c6d074d64c996a689e8b342d08e85150c4a016a3d8ad2b08cce0f3" + }, + { + "path": "files/docs/3beb81a5a5953cd570fa673b2496f8af98725438.md", + "sha256": "b7ba6343a71288e282616cc36cde54fad0beb426b386476ca98f296e0b7e97fe" + }, + { + "path": "files/docs/3c1d83e94ddc08d7a6229aedc49c895e86e660bf.md", + "sha256": "c6121a35e7f24f1a3d364df3d3836a21437a1ac689d789725fa300fe8a0cea8a" + }, + { + "path": "files/docs/3c307031346d4fd7dd1a66e2a2f919713582b075.md", + "sha256": "26c94d9a5e385538fd0026ec937c5fc0481425e9318781dc66feb217516021b7" + }, + { + "path": "files/docs/3ca99c6ef4745121c9865ab4119f3ab1b1a3bdb1.md", + "sha256": "bf41e0022e3447f8ec510257db0b746407706cf5fb6469d0db0cd93023d62ec7" + }, + { + "path": "files/docs/3cf77633a489e42b01086588d6613d65bfd51f7f.md", + "sha256": "47fd3bfca703b365f2bd03ab742a1c272bfe2503c1259efc9134c6a330f3daad" + }, + { + "path": "files/docs/3d1b3c707202f30f8995025f356f82abbe685b93.md", + "sha256": "1cd1d9a9ced391f857d39e8ed4e91711060e7e8de7b767bf63ff2139fa41560a" + }, + { + "path": "files/docs/3d999c84c01328a45ebf0ecad358d858c634df5b.md", + "sha256": "d4a1c452db29918e3fca38a6d8ca921c172757db732b3dbff5a47e1745e8e77b" + }, + { + "path": "files/docs/3d9fb046d583a2d0177ecb4da25eeaeb4febcca9.md", + "sha256": "55bba4c5f7d2d179987be466d31a9446f1b5eafa6fce5d05f5c62dc15ed9323b" + }, + { + "path": "files/docs/3dc76ac891e282badf1d7845b2b8a9b3a26de3d2.md", + "sha256": "7873d4204e029b716c711140ef26b004188f1fa631c70acff8b2db3ebd8c0aa2" + }, + { + "path": "files/docs/3df4040f4f2e5704ef44e6742585ee853a2f2a37.md", + "sha256": "d662a99bdb8c39eb0419d20eb522cb7ab37009ba267ce9aa61eeacf9ebd39ecb" + }, + { + "path": "files/docs/3e0860fd12fa0bb5be75c68fbd34d69a631f2324.md", + "sha256": "f12c1e5f009e95c2161418eb86657d337b225fc5b6de9af2073553fbdaae0525" + }, + { + "path": "files/docs/3e24051d290e000441a4fdb326d73bb81505bd05.md", + "sha256": "508a0ebde2ba683b52b5cc75a7d6794644fb4d8445fd65b098bb733d03e1b59b" + }, + { + "path": "files/docs/3e791f66ad3d5fd3da45d85f27d6a1a7621a4cd3.md", + "sha256": "f480cf6305c3898d30f3bc949673fcc9d7ec417c5fcd0dd5867729b0c7db6957" + }, + { + "path": "files/docs/3eaafddade769d3b0300be1401bb3d7e68b312dd.md", + "sha256": "4bd0611a86e12827030dbb3f0897fff629b68e2bdcfc43bb29a855270fae1e7c" + }, + { + "path": "files/docs/3f0b3a581945a1c7fe243340843cc4671a4e32c6.md", + "sha256": "e48f522616fb9d280b9a1f41d65e6832a64027e2edde3d60b4c49175d4857c94" + }, + { + "path": "files/docs/3f3162bcd9976ed764717aa7004d9a755648b465.md", + "sha256": "2fe7db14f91669a9745b7daac65294951d125b706b643acfba498882f62f836b" + }, + { + "path": "files/docs/3f5d0fd7e429fedbfc62dfc9bab41b3cc5fb4e4f.md", + "sha256": "6fec9dce6dff83a6ace4930bef8b5a31e00f173e33d138c8d7a1bf2364aa7aff" + }, + { + "path": "files/docs/400e9e780d8a149530df21e38b256b71bda12d83.md", + "sha256": "b0e776355ad67e848c117d77cbbb5f77eefe7dff868300ae1f19384dbfd8fed2" + }, + { + "path": "files/docs/4058d0b5222f1c34abf1737a10da705e27480606.md", + "sha256": "51f6c731f18d15307d98c3824b7343c00bcd00616d7f3d0f6636370a818ebb8c" + }, + { + "path": "files/docs/408fdab4f452ab2c207ee3416332d315598e3456.md", + "sha256": "4229d7a94713e6e836b0e4ca8c45a4993a04327d7923fd8d9f9f2c1220db269a" + }, + { + "path": "files/docs/40d279ada16512e67b7fb78fdac4ada9cfe5c645.md", + "sha256": "bf0a4d1431926558ec6f8c5d944d0b52b810e3936aa88503eb41332ff454acaa" + }, + { + "path": "files/docs/40defbe604b3629caf8855a6d00ec14a0a6c92f3.md", + "sha256": "d72e4fd1fc4e4ba99a3bc4b748d5687bac74b0792300932158d97c57ab60f658" + }, + { + "path": "files/docs/41167e3ad363b416d508b03a300e5acfaf83f042.md", + "sha256": "985b486cb262a989efbfb8a28e6480bb0ccf715d637f6a0b8f5dc553795ff11e" + }, + { + "path": "files/docs/41ad83283a66cc3c467f70ea638b9c1c6681a160.md", + "sha256": "598e68d3a97c75177171b550f8c4b25917422f562fac059134a9be48daf1c229" + }, + { + "path": "files/docs/420946ca7e893cc5a2b3d1a8f47a7a2c7059d7f6.md", + "sha256": "45a2f34448609209bba5d22ff0cbe26a89bce51762fc901caba87f95577fa41a" + }, + { + "path": "files/docs/422554c1dcebabc93cb859b4a896908da48a540d.md", + "sha256": "673ac44d9da371697d2edfa40bd5ac4138fbbcfb55d81bece6b24f2bda3c23b9" + }, + { + "path": "files/docs/4292721e4524ac59fa259576d39665946db8849d.md", + "sha256": "18709b367856c4dd893367fb55ca43eb6189bdda2e288870442b207b45c66c98" + }, + { + "path": "files/docs/42ae491240ef740e6a8c5cf32b817e606f554e49.md", + "sha256": "23412031a31fe288da85d1208ad243dcc4ec387b6b2a415bcbf3a7101d5d820b" + }, + { + "path": "files/docs/42e228e8218a4fdef9f2ca0db53b5b594a475b88.md", + "sha256": "af5b411c614424cc4d9155724e21c6a97a690d133c2290cb3266c150d78b1c0f" + }, + { + "path": "files/docs/42f34465dd884e8110bb08a708a138532999714f.md", + "sha256": "92de5f257fdf18900277f9e0f0a6715540a66ed36b071b3333101f62277b2428" + }, + { + "path": "files/docs/43071778b4e33375953afb1ab743b342d3cc906a.md", + "sha256": "73718c79b043855f87a2a8aad5c247a03a9b678184c937b0e043fd7a4ee02bb9" + }, + { + "path": "files/docs/433775834ea8ae82cbfa6077fc361c3c52a99e42.md", + "sha256": "3e4b17f759e3fa9384737ba77d0bc8e2968b7ed7bfd55ffaa4e73ec2793352d3" + }, + { + "path": "files/docs/43785386700cf73e37a8f76adc4ef9fb01ee0aeb.md", + "sha256": "6124e96b5885b566e0dbc0261a8e07522b486476929d50436ad3f9b0087ae3e0" + }, + { + "path": "files/docs/438b5abac4d30492c2f192ea551e9514df877831.md", + "sha256": "ce79289e0d2970391c81464489c4aad0d773080f6b096048621df7f57f99799f" + }, + { + "path": "files/docs/4451c208e0350c4c480f50929bd6735588b6f2bc.md", + "sha256": "b483b89d79425463e03e91132ec5b650e7ad75ec260f2a1ef80bd7d5719d8b3c" + }, + { + "path": "files/docs/445b99372919de6b2c3e6a7e2c3f4caab0bf174c.md", + "sha256": "ed841ac2732b908b1f5856d27a93d3899d0351958522b081a97c7fe8295df8b3" + }, + { + "path": "files/docs/448502b5d06cd5bcaa58f569aa43aa2e0394a794.md", + "sha256": "4c032610eab90b303cbdd97f47e32929f98ce608bbeda05b5c8207c9c709268e" + }, + { + "path": "files/docs/44ba508199b214448cb22b7658127e16dd4e7abf.md", + "sha256": "7a35bd2102c47acd82a9eb704c17768fe5a2279158fdab08ec1619ebe20c3283" + }, + { + "path": "files/docs/450caaacd51abdedab940cafb4bc47ebfbcbba67.md", + "sha256": "ef0b135fcb8abed555dda1e33718d1ac9e81f0f5577d44d455b7e6af8b408a7f" + }, + { + "path": "files/docs/451244d4e0cd8a3e96cd15ffaf0f3bda526cced2.md", + "sha256": "711d06a55184e812320545a010b73d8090983c7e1dceba349a44b1ccef718db9" + }, + { + "path": "files/docs/4517071b8cdd91311a13decdd9d0a7fd761aa616.md", + "sha256": "87e0e4dcdb23a082fe2b071ab50d9e7a1a203df209acb54856fc0cb10f49c32a" + }, + { + "path": "files/docs/4562c632e1cfaaedde1374b29bdd1a1cce5ece86.md", + "sha256": "38c450267717112f4123f2587e6f009da6c1667ec843027293c9d27df0c9f0b5" + }, + { + "path": "files/docs/456a228a64c2ad85e66f1fe0de558b4a426b197c.md", + "sha256": "ba1f58cc20d762597e83b1abbbd49b87601df4c77773990574769360a34118c1" + }, + { + "path": "files/docs/45a1c384d8d6a730d73357e2bb3216edbd2f7ff2.md", + "sha256": "a988f0a0a16369f65ff67c65ff21c2579d03600cdf2e1ae50814572ba9f91b93" + }, + { + "path": "files/docs/461d1a8f855174f44550531ef8be6e67c29d3e3b.md", + "sha256": "ecd203da717d91534a02dc015fb76021fb69a89e5ba4e5cba48ec1dcd055b19d" + }, + { + "path": "files/docs/462a5ba596aadf9c38762611ca2578398f234bd4.md", + "sha256": "7133143c3e1d2afe8a667f3b5d091a2a3c5ad6c439da2cf67db2b52ae98bc848" + }, + { + "path": "files/docs/46915afe957ca00c5b825c5f2bdc618bfea43de8.md", + "sha256": "92334d47ce03157b793f5f2bab80496a9f64e06c6bc7df23acf49c10c03a866a" + }, + { + "path": "files/docs/46b746b11cf60709bcea7f7c2c0aa1ec0ada5bc9.md", + "sha256": "0fd140e0817736a422020fe4f5a0cb4da6462ce5614dfc7214d376695c150814" + }, + { + "path": "files/docs/47b819e4861856fab3c5627661edd8e59fbed8a2.md", + "sha256": "8e99d5483757000a66e08dc5036f13b18167050b93672185e31d363cf534d59c" + }, + { + "path": "files/docs/47cc4851c049d805f02bd2058cd5c2ffa157981c.md", + "sha256": "3c7f64e8972d165c878f640a554cb026cff84a91915e9b927e9e5f1cd1130c0d" + }, + { + "path": "files/docs/4800c7e7c443ec310d775747125585f4671534fc.md", + "sha256": "7326b4a64f281cfdcc97ca418607bfabb1a7785a300b790611df339c7762b4a0" + }, + { + "path": "files/docs/484af9baf43ac6bcfdfaf7b0d353ccdf119033df.md", + "sha256": "9cca700dccc77ddacfc9d8077411a8e5539fc69ffe264c245978f8bbdcb6d5ac" + }, + { + "path": "files/docs/48cca78ceb92570bce08f4e1a5677e8cd7936095.md", + "sha256": "e42cdfe77293b2c791d799b740806e6152d3676d0d01f12914aea5170a7080a4" + }, + { + "path": "files/docs/496c8703eba5c4c6bcd6d65ee60d3e768f1bf071.md", + "sha256": "004b748ec192f0805128ec6e516c1804c37a61703354d6369864d1b77e3166e5" + }, + { + "path": "files/docs/497007d0d0abac3202bbf912a15bfc389066ebda.md", + "sha256": "4989a9b8108cc9fa30899ed31f441e6d1c2a9c5c3a7bbd1fffcf128736310bbf" + }, + { + "path": "files/docs/49724d4b7690d4b215fe6f1c0a49c8b347f0c9a1.md", + "sha256": "71eaea4d5f516e141dc73281c1584a90c2a8854e295e62b8aa3280b1f396081b" + }, + { + "path": "files/docs/499553788712e55abe1345c61ccdb15d1ce04e83.md", + "sha256": "20fa2a95b401071e2b6961033be32537b03cf07881387958d8bda8fbcf717b16" + }, + { + "path": "files/docs/4a7f60f563f15cc32060c5f17cb44699a221ad5e.md", + "sha256": "6b26c6ad67f7d2d6098a89d54244b8be0a66d537ab58767671196db3649890e1" + }, + { + "path": "files/docs/4b16740c786c0846194987998dad887250be95bf.md", + "sha256": "5e9c65951b2079a572307db1ac8111e9c563285893eabf3897bde89a74df7f60" + }, + { + "path": "files/docs/4b48ef3d089f3142b1ed604a32873217f89e052f.md", + "sha256": "589b6c3e6a67d934e17f956178671d333b5e92b691576bea8440dee00ce24dac" + }, + { + "path": "files/docs/4b74e9409284f77897db58b77271337a4493a410.md", + "sha256": "493e609ac539c6c8805c9ed054ffd76b0341cdb30c23dd79e439745d33bf69f2" + }, + { + "path": "files/docs/4b8ebfdf4ea9e571d53720fe09a2ce610aecbcb9.md", + "sha256": "8b1aca2924130b560433223c2859cde850835058dc97924169a07e3df178abc3" + }, + { + "path": "files/docs/4bfeb479bcb6bbd28dd18ec423fdc5fb9c39b4b6.md", + "sha256": "1cf79e0f6cf2cf7f6ca01b1e39eb4918fd8f853ea816ba083a28bb09a6a3d0b8" + }, + { + "path": "files/docs/4c6242d9f2b3e125780fdf188f994270a6e2340d.md", + "sha256": "dc4c88a200bfc8ce289e432ac6298a33506d1e633d4b2e94fc6aa0f7c99080d4" + }, + { + "path": "files/docs/4c83f9c21ca1e70077c8004bd26fe5fb0fc947eb.md", + "sha256": "793c2c3da94fee35446abffe32eb60a5d3b741c6c2dd7e2d8e0cbdbf8c82a9d9" + }, + { + "path": "files/docs/4ca6000dc674cb2486d905f8531fc19bc88f887a.md", + "sha256": "47a85aaa785a3d7b32be429ce3ba05da70d6849e9e405d28fa41de5d773859ed" + }, + { + "path": "files/docs/4cd539b8153216f80b26729a35ad4cd04a9c27db.md", + "sha256": "e6e17f673508963192118c853d3e54d7b02efb43fbfac744a8670ab0f094099d" + }, + { + "path": "files/docs/4d299efff5b982097a5b9d48ea16041e4820a8bb.md", + "sha256": "238105c5ce814555689691f1f790f863def568e3455c0bca0e19531a7bb74d49" + }, + { + "path": "files/docs/4d8b25691c26b2ba05f7e8a96b99fd3f15a124c6.md", + "sha256": "e44b2fa54a2edac806e9088e08bc52b65bf54a3aca3b530fbf9efb96dc5ead47" + }, + { + "path": "files/docs/4dd17198b8e7413469c1837ffdbaf109b307078c.md", + "sha256": "94cc88f76897efee6f8e138912e057c05a353401c5d768dda1324e8922dc8ab8" + }, + { + "path": "files/docs/4deafac111cf37f37a2f20cff35606827d940390.md", + "sha256": "fba65c0e8ead9df7acc8316ceca4fcee93c7c60480c74336c2a893d189c4b70d" + }, + { + "path": "files/docs/4e571695fb4e12489157704d87f89df5dad1a580.md", + "sha256": "ba1489694cd09d35c174f5f7788c5346e92b7715b7bb1cc03cd6d8ded947b1e6" + }, + { + "path": "files/docs/4e83416b551f557d5bda600450e6ccb7742eb51d.md", + "sha256": "22500ba51e3441e6e1b4b3aa50db004f6b29d3ecb3abda55b9fe9e3d7c64ad0b" + }, + { + "path": "files/docs/4ef4409d11dd4d5360d711eea8e1e71dac4c0bd7.md", + "sha256": "e3b31b8288b55cd8204bbff9708ae26979cde3ad44cd32c8c5ab556159a2e757" + }, + { + "path": "files/docs/4f0098ce544ba8ac594f98af8df26b7911399750.md", + "sha256": "01b1cccddbda64abe863d415b6788ba2535eb944ddf851a2ba908ba09399d978" + }, + { + "path": "files/docs/4f733928b0f749ffddf2e6daef646a0524c54d67.md", + "sha256": "d88b1847339eeed3fe31ccbc92dff0ddccfbb336385f89d754927c46e80b251b" + }, + { + "path": "files/docs/4f89e6b2b76e64b9618f799611dd1b053d045222.md", + "sha256": "6389133c7b78e84ffdfaabaec2ef887c2205876b5b088cb426cabca70d765d04" + }, + { + "path": "files/docs/5042fbfb0c15aeded02ff805c4869ac838910c7a.md", + "sha256": "aaaba3c764d4fa49209790661a089b0a482db36c968165425ed4f6c94d925d05" + }, + { + "path": "files/docs/5062008d59b761c5cf7f32f131021ea81a03b048.md", + "sha256": "a59561777e3d6460203f584e32a391690eae50ef7b1394fa3423a64e1d8eb523" + }, + { + "path": "files/docs/50636405c61e0af7d2ee0ee31256c4cd0f6c5ded.md", + "sha256": "7fb64add0555ae9fad9d844f291a7333cc40d82295f32243c914bfbdc1e666a3" + }, + { + "path": "files/docs/510bb82156702471c527d6ef7e51fe69ef746004.md", + "sha256": "5119f613ddb72822ae5415a68691f87bb484136856ae392031d905f9694a96c0" + }, + { + "path": "files/docs/51389b2d808c1f7d81df9ec75f053528ae1bc128.md", + "sha256": "4e6e93a24a7380be9ccfe37cd2c62c96073263b78dc81ac3be9d56d379c68cc0" + }, + { + "path": "files/docs/51426dcf985b97af6172727afcf353a481591560.md", + "sha256": "2172041e2249ec8b340dbe11ca69dc61bb2583c674159a731a4cb624bacc0c6f" + }, + { + "path": "files/docs/51747f17f413f1f34cfd73d170de392d874d03dd.md", + "sha256": "9b15590ce545e6dc54b9ca82ad1c67d2fc7ed7908cf4eda38040e0a96af933e2" + }, + { + "path": "files/docs/52507fe59c92ef1667e463b2c5d709c139673f4d.md", + "sha256": "45a9eca54dc44166d9e35afd85b9f6fe6c81d7cca05d498c5a028d2b920766e0" + }, + { + "path": "files/docs/5287ef2a9e06aaec6a8fe651feba2d46d2f07502.md", + "sha256": "a3533cb2f30a8b9ef856b74071a9779225a1e22bf5c67f72bc444549151f43dc" + }, + { + "path": "files/docs/53019dd52edb5790460dff9a02363856b83cafb7.md", + "sha256": "9420b378c00aae414a9545827e7f0953244bbbbcc7b18eb4204b0186857128cb" + }, + { + "path": "files/docs/536ef493ab96990de8e237edb8a97db989ef15c8.md", + "sha256": "ba366b7a4f66ab69074a3b7eac97240112e1157f4666e920f39f1aa6ee02b487" + }, + { + "path": "files/docs/538ecae0b5aa21e499f39c2637764a05bff7b6b6.md", + "sha256": "ac29a2e78042faf0f24a4ee9b9615ed8249bf7539b680c0b2c9a64b52b8e28ca" + }, + { + "path": "files/docs/53ee442d78abe20aaa100dda3ff139e566842c2e.md", + "sha256": "58f1d23a37a8ef616f6461dd8ba0f17e102ded0151c994f42ff23319cdacef78" + }, + { + "path": "files/docs/54029dd42bae3a23d68d928ac3b6c04d0c735dec.md", + "sha256": "e726d33c9d540179846ba2a54b2b0710c6ba6af40a222b5ddd86b5e0a6923485" + }, + { + "path": "files/docs/542f90ca456dccc3d79dbf6dc9e8a6755b3ba69e.md", + "sha256": "0acf956d90f7d7d48a65c8197292d6bc7efa8937bf09f9d2cde382d8488c13d9" + }, + { + "path": "files/docs/5466d9a71e87bb01000dc957683e9cd3c10ad8bc.md", + "sha256": "5aeabc731bc142e3505e93e5f41827c9aa485c9467e47284326fb6e279f5e27f" + }, + { + "path": "files/docs/54ee0bb6fbd2e35c46c41d0065c299408f5ab0a5.md", + "sha256": "7d44468e4a87a4bd00e4ed224a3e75ebb78059f7aec235fa22013a69911964c5" + }, + { + "path": "files/docs/56dc9cabda3980a4d5d41aa5b3e5612e727b289a.md", + "sha256": "8b1aa30de1c78f1008597c798dee5eafd64f521118b8a359ec09c160cc93c098" + }, + { + "path": "files/docs/56ea4620b049a9e291bf198e71d0c58c2018686d.md", + "sha256": "90cdfb0243ef5a3499aeb7a423f8af35e51b5396eb2c1244cb2f46d0cfa4b0cd" + }, + { + "path": "files/docs/570af2aaf268a3df1d959d54a5be1790dc43ead5.md", + "sha256": "7141b1cd9c42b64a01019e5e54de329d29b3aed40cd6752262ee684c4170e8f6" + }, + { + "path": "files/docs/577964b0c132f5ea793054c3ff67417dda6511d3.md", + "sha256": "1fcede5e820c93d4b57d9f1e963df25181061a0f77755435c3c436c56bec9294" + }, + { + "path": "files/docs/5788d38721aeae446cfad7d9288b6bab33fa1ef9.md", + "sha256": "bcbd397130f02be1f5480d632991bfdb417d64417cf5aa3ee0f8dd0ea2b0c262" + }, + { + "path": "files/docs/57ab3726fa10435d26878c626f61988f7305b9e8.md", + "sha256": "6520635cb06fc7dc208064485a4522b66205f8b8ea03ff4bbf7b14ee4569e3ba" + }, + { + "path": "files/docs/57d441ef305442bcdbbe48b980b87d47b825fff9.md", + "sha256": "ba6eae65b32c679ced32b5f6abbd736c2b875e79178d9363d250bd1fe8205b55" + }, + { + "path": "files/docs/57ed2f2e8eaa8dab5b26c3759fd1bd102d03b975.md", + "sha256": "4c6a099c419bdea53ab889d29fcefa227d29e6f261f54cccbf83f0d895f6766f" + }, + { + "path": "files/docs/581f43aa02d6c6861d2fdf220617cf3fbb903ae5.md", + "sha256": "3e49e3986fd21f6289232b81814766c162f6438ae002683f406eb11538ba3128" + }, + { + "path": "files/docs/5890d52d3dde4c249ad06c5a4dfe25542723f1c1.md", + "sha256": "4458fcf6488bc7c08726fc144e2347a1b917632f9b478a252cc63ddff68b4783" + }, + { + "path": "files/docs/589d9b0a7150af5485e6f7452eb39d15addb35f9.md", + "sha256": "1c9f4c28a83c179ba98f4b07d8aebf471cdf2ee85961b208b1aa40879173195a" + }, + { + "path": "files/docs/58b70fac914f72c4ae9116de6e26880e1cedcff4.md", + "sha256": "88eab0d1cfb01e1fe070be21baa4de9a902b1d50a3706bdc744511b62d94ea13" + }, + { + "path": "files/docs/58c6d0a1c6dad01e3f0f1748dc472c3ddcc07e43.md", + "sha256": "fce234d334fa98eb3680e55571c231a949e2e46d2c764f7b663eaa29ae4b7b06" + }, + { + "path": "files/docs/595bb1738027c777c1eb5a69631587923690abc4.md", + "sha256": "364489f0ac857c79fcfb5b66e5e6947277144fdacca1ee0ff3a607808627fe32" + }, + { + "path": "files/docs/59cdbabc75e7ec8987a3c464f3277923f444a724.md", + "sha256": "705b7c1adec13431609b9ea353fb1598711b7283a7d065a5085ef4df46c1d3ad" + }, + { + "path": "files/docs/59df73d502b5f62e3837464e81ac6bc9fdf07014.md", + "sha256": "6f8251e4d114ad06c97e75fc9aec43f7369138a936186fc6c5bc0b5ca684963d" + }, + { + "path": "files/docs/5a328cf6319859f041c48974e44046bcfcea3b87.md", + "sha256": "cc1b4fef40c9740b3815934e07ad174c17b27ed67a0d74cfe638a7d6e14ea803" + }, + { + "path": "files/docs/5a6081124d93acd0a12843f64984257a02bb3871.md", + "sha256": "fc28ad5836fd5202333ed40102a3a351a3416f2165cd8482d554e981d7964867" + }, + { + "path": "files/docs/5a812008b8370853f0c151fde4dfeda4a39193cb.md", + "sha256": "c660d2756497ad72d71de4fdfaae6c5652d5cb7e58ff3aa5a67602244226abef" + }, + { + "path": "files/docs/5a8aa187972ba8a711ac91447f668b233e580c8c.md", + "sha256": "dfda16ab0a4d0496195ef44fe9ff4270c8973afc949524c94eeeaf312fa98b6a" + }, + { + "path": "files/docs/5ae2f0d8bd974c7393bc5ffa773b90fd0a2229b0.md", + "sha256": "bbca19e5a3ab38466d85fb2633c3dfc5e5369da4e25fd90e8655097cb935196f" + }, + { + "path": "files/docs/5b0b25c87c4c2d91e8376d2aff3726e4ca355f36.md", + "sha256": "bf1254fea518d542815726d8819c96d6c4622150afcc823fb52a95489caa9303" + }, + { + "path": "files/docs/5b37710fe7bbd6efb842feb7b49b036302e18f81.md", + "sha256": "c080e6e62e994c2ad6bdc93114c1b83d037efbd9faf7987f14636cd7ea28df1c" + }, + { + "path": "files/docs/5b3fb712903b0d1044610c93e6fcde6a41be1cf6.md", + "sha256": "70bb87bc9e3ef0ae94f0ccfcd28fd81cedb732b2b19c274ca754ace970fd1a5c" + }, + { + "path": "files/docs/5b66f4f408827fe62b0584882d7f25fb9c6ca839.md", + "sha256": "b9d7c92242b0f59e5bf841a8e6fc3c557da8176b954915f7c7be924f7f7bdfd8" + }, + { + "path": "files/docs/5b85770138782723e09d9ed65f8655484d03be44.md", + "sha256": "27f3b557355c36b26a466a92fe43971ab6b809c8a3ade65e3b6ac7a4ac3711ff" + }, + { + "path": "files/docs/5bc1631d896899d03e7d8dd2296c21656dd169ff.md", + "sha256": "8275704c3b619f69ddd871ea366f29eb4525561ce5db6488d6c9e519d5077cc2" + }, + { + "path": "files/docs/5bc48ab9a35e2e8baea5204c4406835154e2b836.md", + "sha256": "e7542ed9fccf472899c3988a0c050af4653f197fdaec4fe9058d224ca2696fb1" + }, + { + "path": "files/docs/5c2296329a2d24b1a22a3848731708d78949e74c.md", + "sha256": "695211420f74cb6f727d988b7b093180e30978cfa2e7897c5e6915f51b7db6de" + }, + { + "path": "files/docs/5c2f280e5c4326883f7b3623ef1b64fe4dde7c05.md", + "sha256": "8699d32581fb5b8848b57fe3895b6b83d6c006cb47aa6819fa38253b28589d4f" + }, + { + "path": "files/docs/5c597f82ec8484220a6fb3193dc78b878e8698f6.md", + "sha256": "289dd81d3ab32e7dfdf5d263090e99ab9d2e1685d4d0be1076e1ce701cf195ea" + }, + { + "path": "files/docs/5c95f2d19465dda8969d0498d1b96d870bd02a1f.md", + "sha256": "3cea789a3e5d08d246f4e0ac413a3bb6b0969f942b2c6be27166684c22a1776e" + }, + { + "path": "files/docs/5cc48263b0c282ca1d65accb46d73d7ea3c8a665.md", + "sha256": "84388821eaff407f9273f622ed4a5b1b469b345f039feb068201d21cb20d7375" + }, + { + "path": "files/docs/5cf2fe478862fcaa1745d5b0770ce6486b3b71f8.md", + "sha256": "832cd01d37db1073003a16ea271351967d919f7b2dd75aca5f31c5ba264a0802" + }, + { + "path": "files/docs/5d043091b2f2398611a819743fc83688d7658b22.md", + "sha256": "662d87d5447de5fbe429ed40c90423b3b910c24d10e5090bdfe43853ea6315d3" + }, + { + "path": "files/docs/5d193c88d3e3235ea441bb82cceeaae20bb3efcc.md", + "sha256": "c06acee451b8aa56a9a9d519195c6689e7ba69a8eea90ca0d5461311c614aa56" + }, + { + "path": "files/docs/5d1bca52e974c3f4de54366a242df751e73acbd2.md", + "sha256": "0ca4ccc3e2e7839218a93f145c9f1cc191f7788ba9b049e1f209d4dcf1b70e2b" + }, + { + "path": "files/docs/5d9039607c167566ced9a4d7cc9f30f2b0c58554.md", + "sha256": "1495811f89a0723632f397609d8feb33a7a7f35c4e02526129d3f06b926fab0f" + }, + { + "path": "files/docs/5dcc543a106ec708ff97817aa0cfdef8cb89894d.md", + "sha256": "9ac14a59c78a6f94ed3b0cd2e8fd994493fe1e435d3d30bf3a022460ce2cfc2c" + }, + { + "path": "files/docs/5e1ce04d915b9a758f234f859dffefab46484c97.md", + "sha256": "1c80416dc404deeeb87e6e9b767527cb91b673ca187907bde2c9799179ec527d" + }, + { + "path": "files/docs/5e2a4b92c4f5f84b3dde2ead6827c7fa89eb0565.md", + "sha256": "53cd235fd08bca0641b7a16bafd071ddff83b7b60c90c9b6f60faa95b0a31976" + }, + { + "path": "files/docs/5e4d2166bb8c2b95e515591e014e7ca00b87bca2.md", + "sha256": "70d5408da4231437243db79084bf00042cfec4ab3e7eb00cd7fc5b95da26ae9c" + }, + { + "path": "files/docs/5ed78e19c7780c6856e1fa05d4b8a3f671fc878b.md", + "sha256": "9eb96e91a28ce3a117cde70877d6ea476f6a3ed7508cecdd6ff277e3428944b9" + }, + { + "path": "files/docs/5edda143971ce5735307fede23fb0cd7e963264c.md", + "sha256": "1cd4aa6f3f3d9c00a350d2ec848279da20b6e810109375193c9be819e3aca424" + }, + { + "path": "files/docs/5ee63fcc911ba90930d413b58e1310efe0e24243.md", + "sha256": "a137a6c314070d94bb6edca4347436edb2d8915fca261d47ca5c4800053a4dbe" + }, + { + "path": "files/docs/5f0fc43f57ab9af130dea6a795e1e81a6aa95acc.md", + "sha256": "f7df1ebbb0ed8ea423757ed8d75ad96778d6fe5c5f9a770c9cc6d2a24d24d01a" + }, + { + "path": "files/docs/5f398f2a5f6a2e75b9376b755c3ecf4b7f18b149.md", + "sha256": "376ac663516c372b9a900d9b7b1aef940472f81f5221c7fff93a8f241261ad02" + }, + { + "path": "files/docs/5f584aeed890d6efb4c9faf133a26bd9f9e4f219.md", + "sha256": "4cd1c6daaa34548d22034813ed6288c60e4e3d5df700196ecef72c1c2536c513" + }, + { + "path": "files/docs/5fe3de32efb5dea4094dca22cbc77e24d23ef67a.md", + "sha256": "a7af4a0bf8d5305d3478b761617a589de9facd0e64701d1df0888e62d27de7cb" + }, + { + "path": "files/docs/6008cee94719e6b3caabfba9bff1973b9125e02f.md", + "sha256": "ec24a909c92551235bbf7c8c64202ec8438a59fb74724ca8f429d8a958a30f91" + }, + { + "path": "files/docs/6049d5aa5de41309e6281534a464abd6898a758c.md", + "sha256": "0deb2a5dbded46e593e293a236ce746b60a1e9bc82f9c5cf1fa0d7838601c5ac" + }, + { + "path": "files/docs/6068b2555e5014d386397335d0ed56b430082ff7.md", + "sha256": "5b25d5aa3223e18fcb487480e73a783bfa5b84647c0875c6f38d744f227aa15b" + }, + { + "path": "files/docs/606ef22cf35af0edc961776fb893b07a880f11d4.md", + "sha256": "22db513b4eefc9d03964731bcf8d5e60a094ccf55e75a637206d04f9d046c695" + }, + { + "path": "files/docs/60cc59b176b08462143ea591dac074060ad988c7.md", + "sha256": "8be82ce79aed163efc239c58465f4343ae1f2b5e75c0ec0891a9ad485cddee4e" + }, + { + "path": "files/docs/6153f9f311cd2bb2df31c6a4a1cb76d64e36bfe6.md", + "sha256": "ace9a0f3483ac2e13532b4f77e7dd552386dbc09e547188264c922a4f35cbd3d" + }, + { + "path": "files/docs/6199bbb097894542ea31c726d8ef4a3357eed1e2.md", + "sha256": "e303227bafa232fc17e847a4f620411e37ec956a1c7ecd2ff500a9e363c39fb5" + }, + { + "path": "files/docs/61e8df28e1a79b4bba03cda39f350be5e55dac7b.md", + "sha256": "62854cc15575745bc8355700905682cd59642df64716dd5a9e15ce5b06acefb3" + }, + { + "path": "files/docs/61f714f5629ad260b0d9776fc53cda2eaa10df24.md", + "sha256": "51ecf3c99002dff8a59affa65c948bd9856848acce3f160cc2da69dd49f498c2" + }, + { + "path": "files/docs/621083eb36cf3896b77d22edbcc23fd2716f6b4a.md", + "sha256": "f022dd3a1a24ff72b20738c69d772cd938b908d4b50b946083f82a4e2b19cc52" + }, + { + "path": "files/docs/622526f6c171ced140394f3dd707b612778b661e.md", + "sha256": "e7bcb77a3f5eee4f1b86857d78e467725b52361cde3eefd10aac11e3f8a336dc" + }, + { + "path": "files/docs/628354b3f2fa792b938756225315e3b4024dcc0e.md", + "sha256": "7a4a79b700912ff3c01a92a23df0e0bc4e465c9aeb685eadba148aca6cd38bc9" + }, + { + "path": "files/docs/62bf74e391cfe1696e5218b3df0926b735a4788f.md", + "sha256": "dfbfe6f280117e1b548d065f23306347fc1db107b24b34d7f93192a18ca21f26" + }, + { + "path": "files/docs/631559e8401c52c3aac6d64e1f9da0f765fc4846.md", + "sha256": "f33375841349cfdaca26415c227df5dd4a2b743c77a07f47c3ebd2782611cc63" + }, + { + "path": "files/docs/6349e43ea9b4ac5775db122e0f6c365d5db810bf.md", + "sha256": "76c51367d877df55cbad8cc4db02414e66de174fc06762d8e572514e5b4a597b" + }, + { + "path": "files/docs/63c0dfb695860e1da7981d86959d998bebc2dd03.md", + "sha256": "cf6173326a119dd6dcdc56547d7b747a116d854720bc6e3a6de6e86daccaeb9a" + }, + { + "path": "files/docs/6402316febfad11a582d9c567811003f4bee596a.md", + "sha256": "f231335a71244a78e422d8e6e4c085c1324ec265c4b1bdd18f55c6889bda8056" + }, + { + "path": "files/docs/64057aa641f9259654e5f08d996209ef8027a3af.md", + "sha256": "c354e6e257e72d21cf801e8135cb0a7064428b030b349eb3d3403c877eaf1f4f" + }, + { + "path": "files/docs/6406a3bcb4e9210a9fb00af248f11f392af5c205.md", + "sha256": "197ad39ab0c70c10e1a8522a433e49f1f3bca4d99e2b28ffc42bf06c8f1d6b42" + }, + { + "path": "files/docs/640f57e8262f846da7884e43f6f2f6c04cd15667.md", + "sha256": "36eb9ec3b178d1c5a7c38708aa281f27856b732ab3802e35b1167edbe72490e9" + }, + { + "path": "files/docs/641b0015a5a634bfc40f10ae59873ca784232f14.md", + "sha256": "98b7103b70bd51f51a5f2779f8a69cf11aebc93faeebe56838c4585c4de28edb" + }, + { + "path": "files/docs/648122bed05213950c23287cb4845fa56660232b.md", + "sha256": "3d5846fe33428cd13963747ea098489acaa8e0157f54ec6844a95b4916f8a42f" + }, + { + "path": "files/docs/649119a6ef3f5aa2b1b0c63e0973532d4c950f48.md", + "sha256": "b3521c150ce994323ad23d98208dcaffbdc0696c5e0f98a5953b4380181f32ab" + }, + { + "path": "files/docs/6524dfdeabf32bae384acb9bb21637ade3b4ac4f.md", + "sha256": "626c9c239665f7eae6c107293dc03df0fcbb70e9aec31b8ead5e855a96b2456a" + }, + { + "path": "files/docs/653f494ee7f3d688fcaeb05aff303354d718eab5.md", + "sha256": "c2d39ae45fd05eaad7a6114c12e4b7c534f8324df876afa5e8db6e3c79f013e1" + }, + { + "path": "files/docs/653ffedfac00f360750f776a3a60f6aad38ed954.md", + "sha256": "a2a97e7afae9c2088928072fca3fbe32780538fcb4ff0f69d5092f51ede87af0" + }, + { + "path": "files/docs/6576530ec5d705b8bf323f6c459c32a87ae3f9a4.md", + "sha256": "773219a330191091941f6da4a4c97f8485f4cc4177d78bf097168373b4783ae1" + }, + { + "path": "files/docs/658967520625fac8039485004a1e80c32992077e.md", + "sha256": "25ebb1ea3b97a7e040948c4cb4dbf0b0adb0c775ce10a0c548de75758565636f" + }, + { + "path": "files/docs/65998cb8747b70477477179e023332fd410e72d6.md", + "sha256": "681ec730dad321be4942aae7b3cd05e2cce59151c9b5031ddba675bf13ad5df0" + }, + { + "path": "files/docs/659e43ba12550aa1e885baec945b7b1b25fd18e2.md", + "sha256": "fb75a1b0eb376322b3fda86cc18022d9f0f413de49a987b73adfd61777cd3d86" + }, + { + "path": "files/docs/65ffb2e27eacd57bcadc6c1646eb280212d3b2c2.md", + "sha256": "6ad5a60363fe5985e2efa87d665236865a8a0bf5a674fac877ef16844ffad183" + }, + { + "path": "files/docs/6601b619d597c89f715bc2fafd703452d64f21cd.md", + "sha256": "35f32305aae200133d2c54a359da9cdae0fffd3ffcb17322ef98f879b8c1ca58" + }, + { + "path": "files/docs/6638b9f61f15821f7a92d9c30fc6c24c029b78dc.md", + "sha256": "6156cbf91af5cb50900e9ba4d33b0b5bb99f6c4b9f740864bf863da61b3df7ed" + }, + { + "path": "files/docs/6644eaa4a383f7ed21c0ca1adae80a634867870a.md", + "sha256": "4dd30db79dc6d245f3a5409b0c693bc5a50bedec061810d9a184becd73b6a7a7" + }, + { + "path": "files/docs/6647035446fc3a28586ebabc619d10db5fe3f4fd.md", + "sha256": "ba2ea67adb7a6cb4537ae0e67397fb0e41ba62b232cfdfc4e255e73c638aadfe" + }, + { + "path": "files/docs/665b81fcf30212ba535dedffc35e22901ed3e3b6.md", + "sha256": "b0a5dfbe3def55a566f02179d22848408b094df579a0fff5e1108388e13a0fdf" + }, + { + "path": "files/docs/66e7b1f986535fce165f0cb5c553a6305339204e.md", + "sha256": "848e494929fbc8ecdff52bbc876fc86c9a23e1e752ae51fc854e7f0da0e0cbc3" + }, + { + "path": "files/docs/67241853fc2471c6c0719f1b98e40625358b2e19.md", + "sha256": "c585c4c3c1f2cbe76a961319f5f2f60b690e500065ee385d7ab50d86dca55f2a" + }, + { + "path": "files/docs/679f2f7a79672580b5fb797d9c5280b1a83806ef.md", + "sha256": "77ed5e8f1c1d639573068619a023b25a277993719d12ca9c9955e0bd59408c26" + }, + { + "path": "files/docs/67b99e436854f015a9db19c775639ba4bb4d5f9b.md", + "sha256": "77b953b1cfaac9b1e7d0e324f82a8ad98b402091b732b9a7e4ea2307bfde7339" + }, + { + "path": "files/docs/67c56aac7da2232e4da2b8aedec41b9d8755e22a.md", + "sha256": "3f08f3b27e1a49174e570c27fdf263ed7326a9bb792a9b4d03944c450ff64b7b" + }, + { + "path": "files/docs/67fbc6967ed56285cc4eb1ff12d0e2e23b2f7bd5.md", + "sha256": "a0485ca3f2f7478745b378f3d2a3def67e388e0ee872bd8aad6c55db7ffee396" + }, + { + "path": "files/docs/68061cdeda9e9e83180ca7513620b5988266cebf.md", + "sha256": "14ee6b4c62453081f845a5646b972dff66ea940584e4a3de69d2b9afdaeb931e" + }, + { + "path": "files/docs/6903d3dd91aaa7af3f53d389677d92632e24aef1.md", + "sha256": "3ad0d1f0dd2eec811f3c9001b2fe41b338b9a60b0e43054d19831f61144cfc01" + }, + { + "path": "files/docs/6922b4d2cb89eb1ef4aa112af8b7922327062b95.md", + "sha256": "38f1c773324c74d85fb0314f1c2f53cccdf1bae8757f6f941a37702e44f1f7a2" + }, + { + "path": "files/docs/693bc91eaadeae664982aa88a372590a6758f294.md", + "sha256": "9807f83ad1ec7b8731d32324058bce15a7f8474566f237ac09f10e5a847dbe7d" + }, + { + "path": "files/docs/69eaabe17802ed870302f2d2789b3b476dfdd11f.md", + "sha256": "e34e92704c6adfbd5b6509d2301fbd07a50763c866cbe6c7cbfae38cc0a0e210" + }, + { + "path": "files/docs/69ed00abb6b920d1fe4f5b5675afda422f04e8d8.md", + "sha256": "99867384e4834bf7878d254f5b3891a713ca3c3caec6ace828f8704988e563e3" + }, + { + "path": "files/docs/6a186d2c83108a0288bdfe3d4cea201ac0837503.md", + "sha256": "573b214dab00936c073ca045d770a4cff40784ad0a1f4d78b7d5c99710843b77" + }, + { + "path": "files/docs/6a32659df809f04f9a670634129fc75cc9140729.md", + "sha256": "7e28e94793f9007713775e22539fbbe2c98f0bd70f6f2fd6fda8624bfa0ff0e7" + }, + { + "path": "files/docs/6ac4a29febf419002bdba62d99d997cf55e9fcf2.md", + "sha256": "b879a1c6039b04d075df5f4e5b61b6ecacd62992d6f1f632ce77f959fe36abb4" + }, + { + "path": "files/docs/6ace7c519d2c4fca9fc0498bce82f75ffa05cffd.md", + "sha256": "8b08e6004d11af840c7fb18a46394882713bab91e6c6ee1f448564b16ee1e5b3" + }, + { + "path": "files/docs/6b4213fc5352021865e77592ebc27242e746b5aa.md", + "sha256": "b5f7f094667b43b58661fbd0bd60a52e0d7d88ae9a9761cea17073ed006bc5d5" + }, + { + "path": "files/docs/6b6d315ffd086296183de20086ee752a6a2b88c8.md", + "sha256": "dfad844b3c11eed0cc4de14660d54555eb82043f254e1dbc73a6ef1778eb9223" + }, + { + "path": "files/docs/6b6f04aa6bbd6be14b11ea62aa0d844979bdfcdf.md", + "sha256": "4336803cbbf6ca1a7eea84efde1c7fbcf0c5118b1ec8eedeb744b307292bab70" + }, + { + "path": "files/docs/6b81f2288b810e3ffdd2de5ace4e13e3a90e1e10.md", + "sha256": "2b92eed91f13668392f0b5ad81369c7ced9ab42794bcf76848e3a0fdb2de62d4" + }, + { + "path": "files/docs/6bc478053fefd091742c6775dfac9eb5b8c4923f.md", + "sha256": "aa5918e22ef18cadb45e51c3821dab5e3988cb28e9d9bad2734daae8f3692e6d" + }, + { + "path": "files/docs/6bff9c4db2bb43376a2a2cd681714ed3273e991e.md", + "sha256": "bdeb09d562bb3cf02aaddf74eed1546098342c9bfd9d339184a6e4323b40c865" + }, + { + "path": "files/docs/6cb2797ab2ef876f05a39f4cee08eee4249716d8.md", + "sha256": "29ca45b46edfe430e2396750843d729a8d3ad82ce6347e1591a72d60fab551b2" + }, + { + "path": "files/docs/6cd7b46e0c35165bfe21be4967b68481e9be840f.md", + "sha256": "08d790b4062e590885b965dfe0869810bd4f280cbdd4f348250e5c8b1ff6a476" + }, + { + "path": "files/docs/6d7b948346f167b5390a0e56e1b6de83ae31a19a.md", + "sha256": "981268a8567c47d98c9df54f21757bc49cb33caf587221f5dbec5ae0b4262669" + }, + { + "path": "files/docs/6dbd14399b24f78cafec6225b77dafae357ddee5.md", + "sha256": "bf718198d118cbbc60cf2dd221bf5de0d7543d1b482e1adf358e67076b7c1073" + }, + { + "path": "files/docs/6e25d98279484e1d63cdeefdd1d6a9f1917f1ba8.md", + "sha256": "3473ce29bbc16bc1f29bc287c26a924d83f075ff52e620f5edb52d259d6d520d" + }, + { + "path": "files/docs/6e50438308b85e969b79ded22cc5e15f6872ee85.md", + "sha256": "569a6c0bbb78a780dbf4c2dc26eb7a2ebdd9bd06f19b8bc51aef8395b29fd415" + }, + { + "path": "files/docs/6f2cb7c072a05f7be0c6ce2eca39fc9a1ba5e107.md", + "sha256": "7945fac7ed76fb8444f6cb3bac9b528cd221d0f2c24af93f2b14d4b7cd6bfb64" + }, + { + "path": "files/docs/6f35b89192b6c9a233b859cf66fcc435f3f9e650.md", + "sha256": "cb1ac0bb9c1e5a12ba7542b62fe0d6f2a28f556922fd8770a132bf0f7f8a1041" + }, + { + "path": "files/docs/6f51a9033343574aee2d292cb23f09d542456389.md", + "sha256": "2415a579fe8464cfc675f4e778ab51faa951c76b1eadd571e7d97d7a4daa5243" + }, + { + "path": "files/docs/6f544922de2638796837398f7ec15a4afe6b0781.md", + "sha256": "5604e81edb073b1a581f8b44c195db9aa043234de413a3f7f38c2f3491f43b0e" + }, + { + "path": "files/docs/6f55360d336a77a06f2c4235b286a869cff0986c.md", + "sha256": "8341f297e8f4c644b3fc8f5ba4ec3aa1268b9d5d58eda306e0aca8e15dc2e630" + }, + { + "path": "files/docs/6f900078fd88e14400807e571e1f3a24c633c2dc.md", + "sha256": "6d49d57b2d98a760026758dec67a6c4eb1230ff466beda4f887930f965b4d22b" + }, + { + "path": "files/docs/6fc8a7d53d6951306e0fd23667a802538a81d6ff.md", + "sha256": "6cea26fc0c427abc471740c681395d6c14bc953ebd7b7a36c8c83143cadeb18d" + }, + { + "path": "files/docs/6fd8a950f1ebe6b021ea9d4c775a5ca8660a1101.md", + "sha256": "7e9566ef1ad625c251636a32a6ffac8d4b83b6a70cda6e71bcf5dbfd79690175" + }, + { + "path": "files/docs/71479786e864b942786028481e30dfb35e422ba8.md", + "sha256": "542f9eb2ce5ed93bcf252e3a7b9f7f9f90bde6961215c5e4d824454a0cc6f09b" + }, + { + "path": "files/docs/715abfb108ed8f6361d07762656dbd0443c57904.md", + "sha256": "2dad4eded3713a64cf92be4e05e409684293041eada209944aca728045c7430f" + }, + { + "path": "files/docs/717b697e0045b5d7dff6acc93ad5dec98e27ebdc.md", + "sha256": "4cd9bd3c0815f5ef754f9cba7795fa93d14bb942158f60d68e4be51e9c51ee58" + }, + { + "path": "files/docs/718cd1a731e0f4e5abfd77519ed254b5ccc670fb.md", + "sha256": "23fc51df35e0f202cd0130c5a9b07b1d2edf8ffdb352afc485c12b255a7f144f" + }, + { + "path": "files/docs/71a4244c07321f32f283e49cfd6d6afa19639744.md", + "sha256": "1a6eddbb4a7319de7ff33055b5f025633d1fc6ae07750ebacb3f5d4e3f35e64f" + }, + { + "path": "files/docs/71c98b1ae9bb65177c030cf1de6760d41b7d7df5.md", + "sha256": "36161411d74fcfe8df8ac131be991e35990e5129ad6a2d24be93fe9d9e028cf3" + }, + { + "path": "files/docs/720712d40bfdef5974c7c025a6ac0d0649124b79.md", + "sha256": "5ac30267455468797c8b7f479dbc700464c7bbc8fa6a95e45547950077862d95" + }, + { + "path": "files/docs/722d44681192f1766a0b1bacc328e719526e8de2.md", + "sha256": "6203252a5cdf3e24532afa66bef14644c4977204d3c8291c11d6c254314c3c27" + }, + { + "path": "files/docs/723fd865c01f3ac097e03b74f7d81d574a1a13d4.md", + "sha256": "f755417f9a7365a1bc6e29637ae4ebda568e700fac5238bad3bc9a1f7866d9ca" + }, + { + "path": "files/docs/726175290d457b10a02c27f08eca1f6546e64680.md", + "sha256": "37bd1660e0e6ed9ac8329689c7fa33032006c8cd90c60bd8ac2251b7955c02e3" + }, + { + "path": "files/docs/7292de7c0036b9064a85d1da77a860bd989ea638.md", + "sha256": "35f3b43eb99540f2670e96bf5f7c9d77c251b3b061a6da67f93076e0a5094f02" + }, + { + "path": "files/docs/72b9ec702c95ac86de08e0fb8f8c3404b1228b5f.md", + "sha256": "79470fa6b76fd0c13ad38d596071bfe666f752c2e54291b3f42488a6e07dffe9" + }, + { + "path": "files/docs/731b218e6e141e88f850b673227ab3c4df19392e.md", + "sha256": "f63bae11c406366399ea53556a2de888d4da70060026b15ae1c5a0a07d83824c" + }, + { + "path": "files/docs/7394b97da7b0846274940f439675051521a7dd7c.md", + "sha256": "90d78eb75e9937c856b570e98ae5b8d6af209599bb3b85a1cf4304587f64f6d7" + }, + { + "path": "files/docs/73defa42948bbe878834ca4b7c9b0395f44b9b90.md", + "sha256": "031c1973e732dc8e6a487384ca54f348291bbd72319d37670e499839ee5c27ba" + }, + { + "path": "files/docs/73f96a06142ee17a6c55e5700580f33250552a00.md", + "sha256": "f0325194266958ed4e52b572ee8cd30079f5536a686694c89c7fdb20df03ecbc" + }, + { + "path": "files/docs/7434988303bf295c1586c5ee42100e8af244859c.md", + "sha256": "08ce81902ce0d5ee67978f8aed3ff79102af48307b079c1386f8950bd972cebd" + }, + { + "path": "files/docs/7436f8933ca1dd44e05cd59f8e2cb13052763643.md", + "sha256": "60d3e3976b21599848e0776dd5b795c64643699c9c72b362d4f4043b013e52ac" + }, + { + "path": "files/docs/74706148818bd2ace30029492dd8ad7d47283edc.md", + "sha256": "40b1f9d130da11fd5e1ca5ebc5167244f9c1c9be751173aa1170f910800c74d1" + }, + { + "path": "files/docs/751abcab00f67c93c253ec74d686e2cfcc0062ad.md", + "sha256": "787a86bfbbf215776cf4f7b6a25046d33a6e488f383045b9fad6f1d394a00e05" + }, + { + "path": "files/docs/752d982c2f694ffee2a312cea6adf22c2384d4b2.md", + "sha256": "5def79610705e4543d1f87f4a5eaf6bcb847bccaa50185003c522968d585e1a5" + }, + { + "path": "files/docs/7551cb2bcd77b26ae0e05154a3e8cc51c070d707.md", + "sha256": "7a95c46493fbacc59e6f175970282fb0bc21bab1713b8ab1e47fa5fa99ae5ec6" + }, + { + "path": "files/docs/7566f3896a5ac6f89f4e7e18dc21b4a6a63864b4.md", + "sha256": "a31bb1e2b78bc72b233cc9424e801008cfaa1cc34c07ae70b90bb7aa9a110f51" + }, + { + "path": "files/docs/75891659ab1df929d219741c3f2d69384a01835c.md", + "sha256": "66832a3aa7f221f1b57cbf4899e1360518f364498eb67c3839844ac01205e576" + }, + { + "path": "files/docs/759b6927189fea6be3124bf79fa527873cb84ea6.md", + "sha256": "eaa958abd5c5f60be6baceff503400bec1b07b86c97a020c3f60b70e1d8343d2" + }, + { + "path": "files/docs/7623f4fa0f93db33077a8b64f7a7b27fbc84e9e4.md", + "sha256": "0e5a07ba35580828fe8fca1d1768dd1c0bf1313207c4e75a9a3f47f3ebc5aafe" + }, + { + "path": "files/docs/76910487c819d14f9fefcbc6252f25652af1e65b.md", + "sha256": "a9353ef013370bb4688b7f72e362c7c24c939efa50de39fff2a98ffe932b1a41" + }, + { + "path": "files/docs/76b3f98c842554781d96b8dde05a74d4d78b4e7a.md", + "sha256": "05d01690c2b9a880c793e6871fd430c77ace2110e93d62202011da8c0d823fe7" + }, + { + "path": "files/docs/76ec742bc2d093c10c6a5b85456bfbb6571c416d.md", + "sha256": "75215ef8341f489d11526926eb05aa17aa4d2abf22cd826548fb85d187d44f70" + }, + { + "path": "files/docs/77393f760a3a3f834809aca1078bdf229331c2fd.md", + "sha256": "f182e2b17b622c5028d1dc10839a9c1b369f0c337f7ae93ca93987905a25272f" + }, + { + "path": "files/docs/773f81dd69d3adbbe1998ff5974ca83347effc76.md", + "sha256": "9f69c776633828e0ef06625a929c39435a9b8ef42456b64eb769ad6369b151cb" + }, + { + "path": "files/docs/773fa6558f9fd3115f36af9e4b11f67c1f501432.md", + "sha256": "7ff9088e65abaf84dc8b5084f961e328cfe8fd5b3c78a9c0da3512de027145ac" + }, + { + "path": "files/docs/774fd49c617dac62f48eb31e08757e0aec3d1282.md", + "sha256": "f213d5407efaff023d4b6256d021b6a197956da5ecd7a9bb037e3b2831e3dca2" + }, + { + "path": "files/docs/777f72f32fd20e96c4a5f0cca461fe9a79334e96.md", + "sha256": "4fc069d3edb9faf850cf030c8191bdf6c3bb1b055df36fb0583cdddfbb14f67e" + }, + { + "path": "files/docs/784686da695f28f867bc35c4416cb8d767d58b7a.md", + "sha256": "0e4c52d48619ac7a8772737a130233b930fa54253b3d11ff9e702e84b541254d" + }, + { + "path": "files/docs/78488a77cb39bdd413dbb7682f1dbe2675b3e3a0.md", + "sha256": "165d7be63ebcd2851d0b8e189bd8a065248a8082de5bb22e28f6846fa911f159" + }, + { + "path": "files/docs/78a4d6515faa2766feb3a03ca6a378846cf33d83.md", + "sha256": "2c3ac1ef86c132556ced9f2167c5211251e4ba16b4a5644fb14353b03fb65b44" + }, + { + "path": "files/docs/78a8c07b83df1b01276353d098e84f12304636e2.md", + "sha256": "e7570bae9792b7faad898af58092cd035489ff7509a8787e2013aab3d30fd3e7" + }, + { + "path": "files/docs/7935b285f3e7dbbdcda940a70cf92dc0e2ed6512.md", + "sha256": "ba740e7364b74fbcc30993c99fd56e48cf2b7a33dc4426f584cf3ee56ee354c0" + }, + { + "path": "files/docs/7946dcf2f69a7420490a7b5ca677c2273de5764b.md", + "sha256": "6004998a0b7c512fd19dd0da418c5ce882f3fb6fc7f15127f6299cf98ab4598e" + }, + { + "path": "files/docs/7985570f01d50d057ebd4fafcf8c8a1bcacb3006.md", + "sha256": "55ab24b8c98dd93502b1e4a3438cc66597d72a5ca730f51baae9ea6896dd35d3" + }, + { + "path": "files/docs/799ce322c90ecad9cc4bacad45f9749ec21e912e.md", + "sha256": "608ecfc860026f0e330a0ffbeb6b47f3e2c29fbfb42024a1b1d3c5f8c2828215" + }, + { + "path": "files/docs/7a9f4cdf362d1f06c3644edbd634b2a77ddc6005.md", + "sha256": "82eb1585452b3a084ae067c4e1eb7ef0ee49a1eb3e5cec6cd988b78ecde4c843" + }, + { + "path": "files/docs/7b3616d29e7ac720b73ef3e24c9c807da05c4da3.md", + "sha256": "449e9b977b347432191fab6d76c244007c732701f4bf256da78d47d2f4145d69" + }, + { + "path": "files/docs/7b586e10794f26ea2654a7f7c34ec9ea48c8bfd4.md", + "sha256": "a3a84baf88f893b16119c2798dd798deee9922b55fcb0d120bb9192affb1fb72" + }, + { + "path": "files/docs/7b8b04b66e56fa847f1aca3218eb99f3e568eec7.md", + "sha256": "1ed7c012092e4eb934dc2470c581bf1ccc7a64b8728ee756a85b5773345755d3" + }, + { + "path": "files/docs/7b9348596e2f005f89842d1b997fa09bdcbe8f06.md", + "sha256": "060aa794b48bb2de8792d25461055b458e2812fb32278e325d83950118d1e16c" + }, + { + "path": "files/docs/7bab40e15d18920009e4168c32265a950a8afe38.md", + "sha256": "492b44c46f459736f9c07cf906b4455c81027c8d57ecf13befaf804a0782d4c1" + }, + { + "path": "files/docs/7bf4b8f1f49406eec43be3b7350092f9165b0757.md", + "sha256": "d0f3e68c7a01f36dfdcd5cac348148245c7e110dbca2696eb46ecad72a497e77" + }, + { + "path": "files/docs/7c4f082004dba0b946d64aa6c0127041f4622c7b.md", + "sha256": "fe83f5c59ff556745bc2e36876689829e357c14630f4a99ae508316f01b508d0" + }, + { + "path": "files/docs/7c8bcafbd032e30dcc7c39e28a2b5de1e340da6b.md", + "sha256": "6692163ee9e3c0fdbcf3922a464003053035d09425ea43a71bf8f4e6384e127b" + }, + { + "path": "files/docs/7cef749c4ed4703d00346fcdef795d0431bc7c26.md", + "sha256": "296b95c534dd53893626078a8b18227dbe47b3e9028e4a924a54efa75df490de" + }, + { + "path": "files/docs/7d1e61ef82bc5dc1029d55c8f5c2ebb56082cdac.md", + "sha256": "b1ce41ab18e5d4dbfc306856ca7c27da5c7fbc2cd1476cac665e3f9f2c0ddf21" + }, + { + "path": "files/docs/7d385692a31e1e88e675af0b91f98f55797bc02d.md", + "sha256": "416235e8cd445d4a1c35044812b49b8178f7f5ad7d0dc6e436cc0d38266198fb" + }, + { + "path": "files/docs/7e30541b3a12f403adcb02f90bc96134ce6b6386.md", + "sha256": "26aa322424cd7ca8f20d6d26d1805d3ce35bdc2c1ddc19aa87b015520ed398b8" + }, + { + "path": "files/docs/7e8d1f67fd96a81ff6d9459c1310919908000cbf.md", + "sha256": "2b1e46614caa704e3077099a5acb22118795849406ca28c162059d8b76cef98f" + }, + { + "path": "files/docs/7e9a5f54713ce7cb98ea4bcb223a40c4952f0083.md", + "sha256": "789c75284910d5fb218ec96dc2ebabc34cabd41f757b8fdb3eb42ed1a6473906" + }, + { + "path": "files/docs/7ec3f9527921fb3f713dd6ae1d8035e6c81753c4.md", + "sha256": "5237f8aea7f27fb80b39d379a6dcd9d7ae05f2242a5284d79d1239c8f2ea18b1" + }, + { + "path": "files/docs/7f2731c1ebb3f492687a336e1369cd6232512118.md", + "sha256": "9dede8da39bec19c938a68ce612138d2461a2d1278e1aff79f0f84be4d9580c5" + }, + { + "path": "files/docs/7f4648fd3e7f8564c98cf142e0e09e23e8097a9e.md", + "sha256": "eeeb4d7948c3bc0e405487e998e4d7da5999ba7f4561624f3165ea16db70b6aa" + }, + { + "path": "files/docs/7f4719a688d4c15d72918ebbe43b908300138d2c.md", + "sha256": "305f20ffdf00591c843bd95d0252f4e148d043711e638bbb4c08016d12d18b73" + }, + { + "path": "files/docs/7f755b81ab25cbd0950d528a240b12262fe6ca08.md", + "sha256": "6f48db6e61643a1be592fc3b2ccde25192d911712c76e5fcc9a8bd9585419d71" + }, + { + "path": "files/docs/7fe671db2b6972a1cfb04e0902f8d82dc979d42a.md", + "sha256": "3c92f37dc2172bb32cbc43f3923fc6647a834bd470912cd384bab804b7f5f811" + }, + { + "path": "files/docs/7feb0313c4aa5133f215a847f2abaa025e83bb38.md", + "sha256": "df8a4b6dd024324f19527dd65f26765fca48768c3108c4db34a3c2636968b38c" + }, + { + "path": "files/docs/8023ac0a48264db31f3c9da92fd84f947bfd4047.md", + "sha256": "d61d2c6fe693e1f52b66ae011e7ab5154895be61da5e70f687c415d9b63358c5" + }, + { + "path": "files/docs/807d82c6eeebd0513a794637ebd90caa19f318e7.md", + "sha256": "e0bdd71d464cb95a73288ba0bdab8d66018ce8a8f3f717f05f81dbae432de6fe" + }, + { + "path": "files/docs/80ae02dc6e3e4ff10c8fd97e1c3f5a5e87270d57.md", + "sha256": "2d51b7a0b1c1e01ce9fbc1edfdbe747af6b841641575115cbf4974d9eef7223d" + }, + { + "path": "files/docs/80ccb2cf7a994d218d5c47bbf7f8bbb0d479e399.md", + "sha256": "24af84944ba54c7ca4a817438a0b57ab599f22590f772b28723280591b3ef5ba" + }, + { + "path": "files/docs/81045ed1b34827b3bd74d2546185c3bd3163b37e.md", + "sha256": "606bd317d2b450787050d50fdcc0f1f9afa728584b0a0c03c77ef63ebebb09a0" + }, + { + "path": "files/docs/8109b6380043ce464115025dd32a7a821fd56db7.md", + "sha256": "41728333421f1415004a1e42b52ad6183ea2f33f547f1d8b8a5c6c8bc93ba664" + }, + { + "path": "files/docs/812c39cf410f9fe3f0d0e7c62ed1bc015370c849.md", + "sha256": "b5b8dfed2e6123a60a3b535954e173211773b4151fbde6e42eeffa94b7b8f7b9" + }, + { + "path": "files/docs/81d740cef3967c20721612b7866072ef240484e9.md", + "sha256": "5590aae5f55d410b5e51c9d166a7e10d26b119febcb9d6e1fface5af044dc466" + }, + { + "path": "files/docs/81f297b28d1978eb0d0b1985d6f44b45dfe53542.md", + "sha256": "791f93cff14ba430ccd8ef3e497f2c4190fe7302bfc50521515733f391bab1a9" + }, + { + "path": "files/docs/82199291da8dbb7656b03232f5be43ba4d343654.md", + "sha256": "f43119b8e27f116ec062988b840b3af9ed1eb4b0d118f67a0381ed5ca4a7cf39" + }, + { + "path": "files/docs/823d9660b5b41b7c85904d0eb88a8d40ac57383f.md", + "sha256": "64208d6e4cc18409776c4602f119db29cfd4cc0052db828c9b411f2f371decd2" + }, + { + "path": "files/docs/823eb607207dfd62d80671af48451cce1c44153f.md", + "sha256": "47bf0c8322bd7488805c8295b331e5400e9917668d272d230bfd292199f961ce" + }, + { + "path": "files/docs/82512a3915bf43df08d9106027a67d5e059b2719.md", + "sha256": "11f7987be7637cc997e50a48f485745ac1dd596c6edac75a5b8e5a419cf677c2" + }, + { + "path": "files/docs/82546b72edbfb76f571cfd06a7009e01615fa054.md", + "sha256": "f262e965c9b9b300a126ac1b23248286d89a0a216d9a4de36e2eeeaa00c42d29" + }, + { + "path": "files/docs/8279c6c73a8db1a593945e5ea339f9efde96a61e.md", + "sha256": "f0877aad0b537389fe38b1e2ed74b4b278f31413262de4a234d6e882133d4cbd" + }, + { + "path": "files/docs/82b2c3e8a59998daa1bc70938a0155ec8c9ed3a1.md", + "sha256": "a50a9b470959efc7afb4512cb97c2bd3b729b63f39169c2ba191992bc0a324c1" + }, + { + "path": "files/docs/83198577cac405ad1a9bf68be7a5caeb020d57d4.md", + "sha256": "07a1a38b9a27831e80bd73633b606012ee72f2cf40b9c4f7826e7d05e26c8b72" + }, + { + "path": "files/docs/8322c981206a5c7eeec48c32c9ddcec9fce98aee.md", + "sha256": "33a3a2bf2c6359986ef5b20fc925c48d2d02e45d9d1e42ce8a2333ced2b88489" + }, + { + "path": "files/docs/83579304f7f59126fe983b1ed44bbbb1ac8bfcb2.md", + "sha256": "df06ecdbb4b81197fbba917de347641a7d585ca462a8c03fc4202dd3b400dbab" + }, + { + "path": "files/docs/835b998310e6e268f648d4aa28528190ebbb48ca.md", + "sha256": "081708bac8bc2468317ac93c9982871b883c2b12f137bff2e9476fab73533471" + }, + { + "path": "files/docs/839b16ac73c000ece7bac7d50baf6f7e37f2cad9.md", + "sha256": "9dac51ded029625a739f2b8668ce328542e339060896cffa3021dd35a6abe3e8" + }, + { + "path": "files/docs/83a5fc83aa65717942a3437217f2114454552144.md", + "sha256": "2a121d296d009b3adda80c8df721880ae1b6b4f1a41f1a8d25b12c4dd101ce90" + }, + { + "path": "files/docs/83cd92cdb99db6263492fad998e932f50f0f8e99.md", + "sha256": "7e8b7f2040e92c1e4bc548e7c0ac02ff0d879153933385c9d10be4b61ec8f69a" + }, + { + "path": "files/docs/841465ad74b0afdbec9eaff7b038afc4c000e96c.md", + "sha256": "590842306113cbea6bbf76c9eb8ab0bcf6e256ad2ac2c8ac6765291fa9917066" + }, + { + "path": "files/docs/8435d88b7dc8317b982e1eaa57fa55b8391d00cf.md", + "sha256": "2c76dca832220c5063b0c146c2c22b7df25524cc489b50e1b2c6083ce683541b" + }, + { + "path": "files/docs/84573d3fda739326819c7303ea21db6ddf2acc21.md", + "sha256": "0cd7f8d99d9ee4b87797ff1068ed0bdaf2825ffe9792eb87cbd72b6836b6a411" + }, + { + "path": "files/docs/84d42e162fefc977ae807af123cedfdf400e403a.md", + "sha256": "66d6773303009dd6cda5890a0e667682b7ab60346a30a44770a354a7fec19279" + }, + { + "path": "files/docs/84e8928d464d412b225638bcc41f2837f98aef43.md", + "sha256": "69cfb8966923835c82845441476fd795fc21835a9ec6c0175050d4cdf3174918" + }, + { + "path": "files/docs/85381b4df6f42b35ca5097709523038abdcdc555.md", + "sha256": "3455925e411c379b0f2f87b6b7c5277cc0eb60428f815213b7e598d473618f74" + }, + { + "path": "files/docs/857c8c3489ac9b2891ed1ae9c81ea881cf1ced80.md", + "sha256": "3ac66fac9cd93541637ba286c972a4d08520da3c82a716488d69fc480365e54c" + }, + { + "path": "files/docs/85a8f36d819b12b355508090e787f4a182686394.md", + "sha256": "82a3d1bfdfbd4cc132834e6596b901134ec081fe1d4952571541dfd2e1a3008b" + }, + { + "path": "files/docs/85c99b52bbbc96007bd819861e675c61d7b742ca.md", + "sha256": "ba159a87938479858a0a48eaee63d486083685306d4083e0090a2c3be984fb6b" + }, + { + "path": "files/docs/85dfc4b40da36a5d66892b5b231c9743c67d7e71.md", + "sha256": "70760c73406986d0c8f6c7398c1d92526e9050352d79c2df84e4d53f8d78d188" + }, + { + "path": "files/docs/85e9cac1f581e61092cff1f6be38570ee734c115.md", + "sha256": "47af8fecc2d994289069ee0148ff738a7e145c68c9718e015ef1eceae7a60a3e" + }, + { + "path": "files/docs/85f8b4292483c5747ab2436a2d5d5377f1f6cab9.md", + "sha256": "198f91ccfe06a4099d602df5565261025f3ddedd7c2e36770e8c3a38efb3b4cb" + }, + { + "path": "files/docs/863fd4eee7625cf4012bc9e37b5b66cd25554b8a.md", + "sha256": "c670d7b6786556d18d77b5d22674e9b343625c8b4ebd5768cc738b0867475331" + }, + { + "path": "files/docs/8654d0cbb99ee82483f99972ef5247401eb8e8d9.md", + "sha256": "35f710c435919b567091834bff79f5dad4399ca20852ffdb720208a61ba4b338" + }, + { + "path": "files/docs/866bbcabef2c6e3eddf66300dc2639c938d815f4.md", + "sha256": "fe8959a143ebf0e9f1be7c4c2d78c03b6933a2313a3a02f968f094a6435258c6" + }, + { + "path": "files/docs/8672a0aef022cd97d9e834ab2fd3a607fbdaed4d.md", + "sha256": "389df2a9238eeb490f979eac9b02737af69a63debebd19e6a535ed550969edc4" + }, + { + "path": "files/docs/868801ec73691d31b90c8611e934aa5dd3b17ea7.md", + "sha256": "bd607ffb11c89f69337e8ba8765bf3212289b26c49e8e59db302a3838253f77a" + }, + { + "path": "files/docs/870bf64e17feb1bbdae7b35e9941db781f26ad6b.md", + "sha256": "916ece9ffb4d53876e9af7126698ad0ce9338d302657a6be77192f6ba781165a" + }, + { + "path": "files/docs/8745fb7bf19f0e2b0a78c3cd43aa4bf79a25dbce.md", + "sha256": "00dc8192ad80c6ca62fccf984859b5e7884eaefba9ec777157aa4adadfa4fb15" + }, + { + "path": "files/docs/87d2ff4289edcbf7fcfa7fc7fd460deb02ecc71b.md", + "sha256": "496a4fc5109b89951b16b9c2ad946b73028bdc1c0bbef0a3231162cd5aa2184c" + }, + { + "path": "files/docs/883359c27f09c3368292819b64149182441721e1.md", + "sha256": "fcea1bf5dce2522b22e880063e20fbef67bbc213b56ae6513276ed5cfa3b7da9" + }, + { + "path": "files/docs/88467827811ed045a648a3c215f5b91d43eb49cd.md", + "sha256": "478fb36c82b8d3898609c9328a0946402d823854c94a05140e6e9998c41c4018" + }, + { + "path": "files/docs/8892a757ecb2c4a02806a7b262712ff2e30ce044.md", + "sha256": "87e812624f9aed1c0c547da18935d9258dcb3cca4ed7ec9b223af247c8f61b33" + }, + { + "path": "files/docs/88a9f08917918d1d74c1c2ca702e999747eeb422.md", + "sha256": "e8ff61f70f269a3e8d322ebd2db214bf33aa516409e1403a30b2a52607fbce19" + }, + { + "path": "files/docs/88bac0da2ccb09c93c0013a209147cc5a5dcee68.md", + "sha256": "3d0b74c993b045a16bed7864c6c9c3a2cab41af85569a0643df03da917a31537" + }, + { + "path": "files/docs/88e4e066b89d0a6993f31ea337930d962b76d6d1.md", + "sha256": "cf893c004bf5a1d261135bc1f5c7f2b3c1c7314547d365deb9eaaa49dab51995" + }, + { + "path": "files/docs/8937db13972e4dedbcc542303ef3a783287fd10b.md", + "sha256": "cafa31459b7b226116b213207cc0419a62f2935614b21db7f927684a2e7f34d6" + }, + { + "path": "files/docs/895cd261c9f06f272286bcca3555846fb1ed8aa3.md", + "sha256": "67c191e67c8619d985906c6720ba6eda56fe31a07c61085866ae212252c491be" + }, + { + "path": "files/docs/89f9e0463d14ded51b14392a4fd7a69bb53fa1bf.md", + "sha256": "1716974a57065321f5c408afbbba5cd8ccb86d30f59a8fc195983fe8de1c2cd7" + }, + { + "path": "files/docs/8a411252b81f0e159c1f63ee64f63a987d1bef9f.md", + "sha256": "6f9bbf7a0ca6478dacb66c5685c6ccf14434d5299052e213fc1f0da62eb38c8f" + }, + { + "path": "files/docs/8a69dd7bead4adb82c87a200309cd63ecbd625d8.md", + "sha256": "c081cace62c72dd36c204f4f2a789074ee27ba37812d688989db7d83765512e6" + }, + { + "path": "files/docs/8b32eb4742d88b5cec2e1c9616958bd7f8986785.md", + "sha256": "97ce96ee6d69fab9022342e5be147d12c9673a6bbfe9f37fad34732f1eaf37af" + }, + { + "path": "files/docs/8b34ded3493e5181b1d19f6d14a9598cfeaa5997.md", + "sha256": "2a5299fb91363d328dda68cf1f53fa66625c8af490a0068da13eb596750d9ae3" + }, + { + "path": "files/docs/8b5211bc5ac76b26c8c102e576f0af560dfbcbc2.md", + "sha256": "bb650f17c4ba9e60382a3a52b8e559352d041ba83a177e7ca53cdd9c996035bf" + }, + { + "path": "files/docs/8b9532adfc4fe3d9213bbe56da3323c759426287.md", + "sha256": "b57d5da5e8db526fda602b2052941deed70f1a2d3b493c18fa0e2dd672fa0e66" + }, + { + "path": "files/docs/8bad741cd92f2db6ab2ce3a3c2d35d000235bfe9.md", + "sha256": "46c4630c6d4ca1b65eafbe270c8be3864b4dcbc076de70cd8cde9404364da638" + }, + { + "path": "files/docs/8bc347015fd7ce2af13b17de4d287471cb994f38.md", + "sha256": "713df29511d03352d7a855024aef37c34d149726303c69ec729be30ee3b9e543" + }, + { + "path": "files/docs/8be1a39cdbaaa858051954548474dd3e307b20cb.md", + "sha256": "436e174ff6f50f230414649629de5a227924a636faab233c587ee5250284c55d" + }, + { + "path": "files/docs/8c53bd47030c9bf4e7dbf1ea482cded9cc8abad4.md", + "sha256": "b7b2bcb2ddaa6d6cd11e5991219eee65190623b72ec10a9df275c3a9e4cc8301" + }, + { + "path": "files/docs/8c953b2300b547ad82edd9697cab8a5985f5ead3.md", + "sha256": "dff810f44511fcb9ca133aa7e026cb7442feff759473b777fe81632d52c6a249" + }, + { + "path": "files/docs/8ccc5cd4a9c103249435fc0a7fb18874b447de3d.md", + "sha256": "e28062200d8736dcefbb91199fa61fdfa64284084a97441e6b0c3840d84b1ee3" + }, + { + "path": "files/docs/8cd81c0f5f84dfe58834aeb8b71e6d7780b8dead.md", + "sha256": "774d485cf597214838807a37472a672f03d378097cece0ca56c8a24e40a6a79b" + }, + { + "path": "files/docs/8ce325d8afc27359968a8799d58ef4bf0c57d68e.md", + "sha256": "99ed1a74294c8ec0772362bf1bb0f41a8c2748f78d195d762009ff01404d0494" + }, + { + "path": "files/docs/8ce361c94fab69503049ea703fd6d5a53cd81057.md", + "sha256": "039e2f4ff2106350705d4ac1597154a4281e3ede34b21886d25a6164178a5b6f" + }, + { + "path": "files/docs/8cf8260d0474ad73d9878ccd361c83102b724733.md", + "sha256": "4f4fef569c84a14de9093e49cda7010c0a2ec08985b1b81f36a3efa5aa7409f3" + }, + { + "path": "files/docs/8d2b29253c00ae6a20730d0c9ad3284dc0fcabf5.md", + "sha256": "b1a81a016f7b7d267860b62aa7368a62e3db28e0ab5a88d5d6a77246990313f0" + }, + { + "path": "files/docs/8d328fc36822024d739f83a36fef66e5abe61128.md", + "sha256": "7efb3096bc4dfec289689dc9ef5b08c4bd817156aaa753af6d368c1363a0ca19" + }, + { + "path": "files/docs/8daa2c34d27a7e09c0ab837c191e87f320790f75.md", + "sha256": "91ecf93ff769d6a45c93490f1f77205b9f9b881566bd628ab24a74664e9d65b9" + }, + { + "path": "files/docs/8e56f0efd08ff4a97e439ea3b8de2b7af1a302c9.md", + "sha256": "b2b9d798355546ace32cefe3457eefcb17a9ad9b88274b06a6c2911cc74cf03e" + }, + { + "path": "files/docs/8ea57ca1ae730686e86fc3b2aabd71c9f8ea9823.md", + "sha256": "8aba6046d7a0b02160f7b770402230c71ae8f60ad5803eefb30c48847080ad26" + }, + { + "path": "files/docs/8ed36d5e1ccdfb0139d9d3db3aea2b90ae1b405e.md", + "sha256": "bc9ab7b94d8901601c5a9c40d396ff4678ea1bc1bc6c2f5fc14a493ab33d4827" + }, + { + "path": "files/docs/8f42bd98be9767332ce949506a9e193393da73fa.md", + "sha256": "d09f9eb8c3b4d1f9d655b7c9cf3c73cd391a6f5b0e00bab9d4d18740202d8c37" + }, + { + "path": "files/docs/8f5ea4dc23caee3b6887b07ae9d319bfe5e39ca8.md", + "sha256": "2fd9b298ea093f9f26788591816d56e98927a166695a7054412cbd147860731c" + }, + { + "path": "files/docs/8f64225936d78b691574900d641c0cb7c3ce78ef.md", + "sha256": "d0759b38714c090e75a407fe917e047e531a176bec2e625cbf22182f2863bba4" + }, + { + "path": "files/docs/8fddca5b0d9d19db5b349ab7f72625b8c6d5744c.md", + "sha256": "6d1791714c021c6640650e7040838e924a4a6d2e8cecd8463ac67211d43f0475" + }, + { + "path": "files/docs/8ffe1fb9caf854ded9ca52190d4874d8280d26b0.md", + "sha256": "c802884894c7331bb98e2ed9e7a5038eb52f4d15217be523b40b2281ef55b251" + }, + { + "path": "files/docs/908121c9993cbedb4916c19d84605a9728fd27e5.md", + "sha256": "09b0174094e2d1f7e3218a05c27d0ade8f63781c0cb0c95d29ad85645e52df72" + }, + { + "path": "files/docs/9087b2b5302fd4b7c8343c568c7c8a925544bb40.md", + "sha256": "4e8a9b91f94c7b3f3370e15f4cff51b1019590229eedad8def9dac3e5393579e" + }, + { + "path": "files/docs/909b04011f4c2211d6d945ec82217e3f89a79bd7.md", + "sha256": "275a1fe24a233ed7ccb332f3559107896dfc6edc607a95430fa5f7399be82ddc" + }, + { + "path": "files/docs/90fafe76840267470228854a202752832d54a787.md", + "sha256": "bbed35723c6ebde27b4452a4ba4e97136aa5ce645a1fb2ab8f8760f78053b939" + }, + { + "path": "files/docs/916c197a1a18fbe44382a30782b1ff7c13dbfeec.md", + "sha256": "52d12d4fdb0498e3ff07349901b018e1851b93362ae0d408b0d98141afd19ed0" + }, + { + "path": "files/docs/916f0a90d0b8383f2353b3320628e23e38b380b5.md", + "sha256": "7a3233a50dad8fda2930f7abf1674ee661f4872b66106ec9a5defc977a37c849" + }, + { + "path": "files/docs/91838636de3442e218fd7beccde866113d10ddf3.md", + "sha256": "be274283dff9f11e53f3fb2e6947cf01b8af49ed5097752b76b383548844f503" + }, + { + "path": "files/docs/91b834e69c2153740973c59cf6b4d66260640342.md", + "sha256": "1841bc07a3ca6313bd26f2684b67529960b4f6ce6bf4c8b9072547cc23139d44" + }, + { + "path": "files/docs/91eeb0303c78ec7eaa6dab7921e7173c68ff7769.md", + "sha256": "77321cfd09b92ea7d4608c61176b6fae0a884d991af9384effefaac2f0aea2e6" + }, + { + "path": "files/docs/92442d67350644bfcaec2b2a47b98f4ede943dc3.md", + "sha256": "87437358f3cb1b68de2402bc664a5eff4594d14832004f0ba555e48b17dcf767" + }, + { + "path": "files/docs/924550083a3a6acd177024df788c02d236874893.md", + "sha256": "4c39d793cd4e81bf4a7157eb10b1d9cbb03b6974692419818eb20f4b4d0989f2" + }, + { + "path": "files/docs/925108d09cfc6f2b5193d0d7414bfc83748111a9.md", + "sha256": "29dedf039473b261b4bfefc6223c58f47e57c88a2c29001959803236f959ddb4" + }, + { + "path": "files/docs/9288d1e76019a9d1f08873e515b9798906cc1c4b.md", + "sha256": "d3a2ea11ec42f916e0046e1bde7f751781fe267bf8965866d58b6fedf05a688c" + }, + { + "path": "files/docs/92b00bee2e48f01962bbbbac49cf87587710f35f.md", + "sha256": "c0e88d89c244716cc0409c14da05b782a9a374cd1300f835243e9ad2388d70c1" + }, + { + "path": "files/docs/92bd6d892feb4829f9c49afcf79cdc323be66cc4.md", + "sha256": "82e83e07c72314bf1dd607ad6ad2e37fd10cf55f1509fe0def7a29ebe35e8af5" + }, + { + "path": "files/docs/92c74e7245dfe20bf93f1d73039ed4df95375c6f.md", + "sha256": "9902a175271a29e32cd4b0ba2316b47d8846c80be805175def482ed597962636" + }, + { + "path": "files/docs/92fe6b199a3b4773c5b57ededba80500e6c66faf.md", + "sha256": "7c685cb7b21f7a3e0131f0aad4d159dba3507c200d27764fb67f16020b94e082" + }, + { + "path": "files/docs/9346a72cfcd74dfda05213a2a321bf9cfb823358.md", + "sha256": "d2687b1b3d144285621ae5a9ab2dee43eca6281f53c5d559c925c6a48fdce620" + }, + { + "path": "files/docs/9370eeef3d5414148efc5cc390b4efbe3020f23d.md", + "sha256": "37845b27e223ae959030439cc4ff64df843c99781a40da04ce9aaf26911bebc7" + }, + { + "path": "files/docs/939233f807850ae8d28246ade7fdccda66e9df03.md", + "sha256": "1dadab698e6e39e1d84f084576978d3b5feb7316e128d2b9d9b5211e5d394148" + }, + { + "path": "files/docs/93a3a5e1a633eb2ab616759dfb76dc433abd4d38.md", + "sha256": "91426fbbde81c1c86c0b95a7690a4431d39f1c1edf7bcf2977d6d8a15be764b0" + }, + { + "path": "files/docs/9455a31e5d6c749f3028f9f5e5f758f713c09973.md", + "sha256": "9343037ce373c327b9ed325c8be7ba90312c670a740d5a7c900393d71341f71f" + }, + { + "path": "files/docs/949025c4deea46fd131c7b8d89978d75fcc440c4.md", + "sha256": "82981096daca5e839e19e27e31a43a6fc97319de03ee76b0af291d44f181071b" + }, + { + "path": "files/docs/94fe9993a8201bdbd9d383cc4cc4ca4f2dddb47d.md", + "sha256": "f9795718056c2863f3d23b4384b73f113be02a02adad21b2786881b43fafe784" + }, + { + "path": "files/docs/9555087b12b80060fb337f8974fea9261174115e.md", + "sha256": "8615fab8095aa16bb5df7b523083584ecef3fba6125836e06a8fd5123903cd93" + }, + { + "path": "files/docs/95689297b729a4186914e81a59ffb3a09289f8d8.md", + "sha256": "471b2fcd8ebfcf38f48d224efaa6118c8f7d373e786c66a2d64af0d160ce8db1" + }, + { + "path": "files/docs/95c10fdc6d0c3b142da650044e1a0581d04ef8e4.md", + "sha256": "ddd612dbff79fdd977ceff7a59401d743169eca6ae801820cffef7cb06008828" + }, + { + "path": "files/docs/96597f608c26e68bfc4bdca45061400d63793523.md", + "sha256": "ad3a579acd251e6c5d6544501092868460ad589b74a2706f4ec803b729645389" + }, + { + "path": "files/docs/96b0df7161ff334810f77fe93235bd4d548164a7.md", + "sha256": "2e63f2f4bd5132f19629e0d69b5f930479b72c64389b671df510ddd44f5b0f1a" + }, + { + "path": "files/docs/96c0566da4eb3450616c3f358c32837bfd4de6c8.md", + "sha256": "102997c4dc636d8c4bc7cefe42345505fcf5b5e9912fc0a9ee390e5a3bf07e0d" + }, + { + "path": "files/docs/97050c74e0c144e4f16aa808d275a9a472489efb.md", + "sha256": "f228c9ea0417d2739adcff0108620e80b6e39991853d6be977cbeccf880d6174" + }, + { + "path": "files/docs/971ae69d7d2a527c25f31a6c8d8d64ee68b48519.md", + "sha256": "16dccbd31c11555e908ee72f005f3f6e4f05f3bb999467bfd065dc443fa967ea" + }, + { + "path": "files/docs/97492a97f355a95d56bcf768a62ca7fd75718086.md", + "sha256": "2788d605eabbe2e41b05083989e599492775dc14d41b34e3822e5685c2d87f54" + }, + { + "path": "files/docs/977988398efbdcd10db4aced047d8d864883614a.md", + "sha256": "83e7f6e48d005bfc3db42c8ec5ba6f75006ef1f1cd1964fbf88d53078ed0c11b" + }, + { + "path": "files/docs/977c81385f7825613f1edbd3c0dbf44c259ba8d7.md", + "sha256": "06df7eb6892d5a652c6fbf0a1e592a5aa896ac4cf1cd5f97fa0cecdc500107ee" + }, + { + "path": "files/docs/9789f3a8936ad06c653c1c7aeb421c70ffd7c3e1.md", + "sha256": "43a888d464ec177c9c079de8747d48cf2710931ec8f79fb2e9c8fb87e82a1135" + }, + { + "path": "files/docs/97b722619afc616f13beb20cd7a8fbc29cff50d1.md", + "sha256": "bf6a212d15c6383fc73ef331fee0707a315a8a1b3dd2d144cd8664dd43c1db14" + }, + { + "path": "files/docs/97c26f347fd5a13fbc5b24fc567fcf7adf8ce0c3.md", + "sha256": "63504068d243bf28f333501ad12a6d4a9d7eb3edb51dc69e50c3f0aca920dc5a" + }, + { + "path": "files/docs/97fa49d526786021cf325ff9aff15646a8270b48.md", + "sha256": "9ff0fab46827823cac026c210a38d37505b578db8d2c5f70175982f7dbc6ec2b" + }, + { + "path": "files/docs/981bcfc7f5817524cb8e0c9fe04e3f267a268926.md", + "sha256": "69930c53debc95372bbc6600282d3549011b142502cd701a53a13372bfefd1a3" + }, + { + "path": "files/docs/984b203b8a0054a07f5be3eb99438c7fbcb6ce85.md", + "sha256": "7eaa968748dd590ee5aaa111b0f185649f4f86739af2322a02634ce462f02e7c" + }, + { + "path": "files/docs/98aa3e34d14723232d266a85cbb9e2b1816b1aa5.md", + "sha256": "e800aead2d05e4851457969b576e945dd76a7b729d0b3d82505076089c92882f" + }, + { + "path": "files/docs/98ac4398e3ea902007d99e5bdb0686aef04a4daa.md", + "sha256": "2825c605dcffc178dc605f0598ee34090e680f588b5aad0e46fb02ac32cb6ace" + }, + { + "path": "files/docs/98b447b5af1cd17524e2ba82fed83b8966ddfefb.md", + "sha256": "1166a1d2e71f514dd7114a5023721290fc14afa57d11e65b97b255e10368665b" + }, + { + "path": "files/docs/98fc8e9a3380e4593d9bf08b78ce6a7797c0204b.md", + "sha256": "7fe94a9edbea60025fa44d0efcceba684eb3859f40f932d7e0a4aaca19534077" + }, + { + "path": "files/docs/9933646421686556c9ae8459ee2e51ed9dab1c33.md", + "sha256": "7212c700b05200c5ed0accacd55a60edd36cb927901e489b8d5bc889341cc7b3" + }, + { + "path": "files/docs/99675d0ddd35d743f2f0becf008d9cbed68c0534.md", + "sha256": "f82b7eb691c11f70973f55e494efb6eb8c30ee23954e9e48b774930a1a71f4b7" + }, + { + "path": "files/docs/99843122c08d0d70ed3694a57482595e35fb0d8b.md", + "sha256": "92d2ada7f4ebce9be7fa1b166eab42382f8dc464eeb78ecfece2cfdb1508d13e" + }, + { + "path": "files/docs/99b0c1c962e0642e5b877747ed37e9bb27238664.md", + "sha256": "d9abd3f4b0ebff5a81b5959d7ef50b4ceb75588dc6cd4928d0af292af56b89b7" + }, + { + "path": "files/docs/9a1025416cda5ea57e6b2d9525bdfc7f1ae58692.md", + "sha256": "8677c8eda57b323b2a1984e69a07b5bed9b5bf5caf2d2aa9912cdb0f76327c1c" + }, + { + "path": "files/docs/9a5011652c8fad610ef217b82b7f28c8256dce8b.md", + "sha256": "e973050fe2e4fa12144d7aecd254e7c376b3e862c0491743cc63627a0105b43e" + }, + { + "path": "files/docs/9a83a33abb4c6a12a7457d3711c2511eb3982b2c.md", + "sha256": "50f7259bdb3d32d2b795c84faacfce8f7127169c7ee2a42f67eb528a9ec94c31" + }, + { + "path": "files/docs/9aa00a347bd6f7725014c840f3d39bc0ddf26599.md", + "sha256": "aca2aa0c7152113257cfb1103f7aa37412605fac996d93e36a6410122667bd2c" + }, + { + "path": "files/docs/9b120ff1f8482eb617e16738d5160c966c6edf3d.md", + "sha256": "7baaf146a7742157787bf7f359a85057029d8356630f1b633ac903d93358d719" + }, + { + "path": "files/docs/9b6386c6c291665aca0892481681a94a70185e9d.md", + "sha256": "90689e8e60417c3b4d4d1e0f81626a8d40066ca866ab6aaac37c33164a50deaa" + }, + { + "path": "files/docs/9b89a3b2d7e1868f15a28eacf6d5c6214f7f12b7.md", + "sha256": "00f9705584c013306c4e43f17180ad8440c641058486f40a61b610ac57af0771" + }, + { + "path": "files/docs/9bea57d80c215d963cb0c54046136fb3e88c7d5c.md", + "sha256": "1dd73cf15dcf8e86d427ad44369f26f4389fd6b67bdf48ddeffed8f12543a80a" + }, + { + "path": "files/docs/9c03418999e6b01345837d9dd0f8e0410ed5cb7d.md", + "sha256": "93a0d02bd92143694b5593e45c2c9c69da77b09b56208eaf8816153c6300361f" + }, + { + "path": "files/docs/9cad0018634ff820d32f3fe714194d4bd42c5386.md", + "sha256": "2fa15bd379db7ec602d2a32ebeea1c0c8d97aa6e25ede8b1c74839368458ac45" + }, + { + "path": "files/docs/9cfb0a5fa276072e73c152485022c9a3eafcc233.md", + "sha256": "40d13b043cf91a2d21e0dc139fee655a83a1deb1641b747fd95d0be7f98bc43c" + }, + { + "path": "files/docs/9d9188e6383db5f7038b98a688cb2dc9cf5a336c.md", + "sha256": "c01ef6e3f521d757208cd28dfbe743422158694ec03e3997a731b99abe1119f9" + }, + { + "path": "files/docs/9d9c67189be5d6db22575cf01a75bd5826b92074.md", + "sha256": "9cff0dfd60015e1c91c16f110226bbf496c0946e49c13b7387decc1d49b6d657" + }, + { + "path": "files/docs/9da0d100a88228ab463cb9b1b6cf1c051253911a.md", + "sha256": "3f266b7af322dd7ae9571c14a700d6dae6be333caca125765b2c5eee11ca593a" + }, + { + "path": "files/docs/9da9a2809d484a6caa70a66a3548cf4a537950fc.md", + "sha256": "c746f7022c9ca80fde7ab5429099360184bcf301dd7b935009264c11e1700519" + }, + { + "path": "files/docs/9dae797269714235c8d9287b5d358bcf72e2c9f5.md", + "sha256": "4a96c35c031ed094130cebe5340d8ef613dccbfed39a7d8aebc81697c26d379c" + }, + { + "path": "files/docs/9deac0e5b403baedeabe9c76a295651289e6416c.md", + "sha256": "f49483f9f969833d68e44e707e0e0b7a2994cba157aca1a1d44d61de587f365f" + }, + { + "path": "files/docs/9df72c2325ce5baca0cc7d2a884695d115557c40.md", + "sha256": "9b616dca0546d4dda1e44331efd7be7719e801239b994ac68ee51dc44b21626b" + }, + { + "path": "files/docs/9dff39b0fb5fe6195aa75e50040b6d669fce2bb6.md", + "sha256": "948f607acb859f67f143dd919efee611f2698deb05867e22cbcaef64eef68188" + }, + { + "path": "files/docs/9e15d946edfb82ef911d36032c073cf1736b39da.md", + "sha256": "0673484588f57ae7cad812305a012b126af99384cb6c4fc82e742320b09df22a" + }, + { + "path": "files/docs/9e1cdb994e758d43d9d8cdc5d88e2b5c7e0088d7.md", + "sha256": "a0b1e254804c16e3a3d315683974a9c51126c61107cbc5cf4269b96897c3deaa" + }, + { + "path": "files/docs/9e2277ec0ed75ec2871c8bccb4b9af3f78350c9b.md", + "sha256": "ecb262f69317637ef956088dc92e40971df5dee9c551e13298817aafd4fd14d3" + }, + { + "path": "files/docs/9e71f112f9af39e61a59914d87689b4b8db13f50.md", + "sha256": "e33243c70b66be22f0333d38ed7f22e6136f320148a320c81d34536139e4380a" + }, + { + "path": "files/docs/9e77548af396e9e9474371705bcfff55684c5760.md", + "sha256": "941e403da8e4fc8561dd2918f975f1fb5568f262baa52e0a1c2bd86b3dade27a" + }, + { + "path": "files/docs/9ee303cb0d99042537564dcdfc134b592bf0a3fe.md", + "sha256": "16eae0cc26c34648578c8e466e50a913a95393072c4790b396d4238f5b7076a0" + }, + { + "path": "files/docs/9f06df311976f336cb3164b08d5da7d6f93419e2.md", + "sha256": "c69cbfde3ed4a0f652837893a9ee431b078d5d8e07cabbf608a383282194937f" + }, + { + "path": "files/docs/9f27a4650b0b0bf36223937d0cf60e460b66a723.md", + "sha256": "33e9c8d1373ff747aa389db063e753416a3f2626d12217b5cd92c36274039f07" + }, + { + "path": "files/docs/9f5d44b3a96f8418be317ad258e4932e468551be.md", + "sha256": "765b5913b582dee72dca70f84c97736b579ad4e774b2720ede22eec4e0fc02d8" + }, + { + "path": "files/docs/9f78eec8e37db19f2c3220f8e43029b2c5370b5d.md", + "sha256": "3b8d5b9a15ab9995571483340e91251899a97770d98829940714e1805ded394e" + }, + { + "path": "files/docs/9f878a46b28c19b951157a5f31bb7a1a9920a89e.md", + "sha256": "5640150d9ddbb246dadc118764759ed1ac4bce50248c962587cf1e5b1a508b87" + }, + { + "path": "files/docs/9fa71067981e4fc0d6f68a14c91c694dc4c2af25.md", + "sha256": "6fa49ceb7e4fffd868fac6c5e960dbf7fe8ee11ca0f75fa85c18356d3e6815fa" + }, + { + "path": "files/docs/9fd50170823ef108e2cf4ebf083b0085845fc3be.md", + "sha256": "8bfe527a57581f1b1ff001cacd68a6fc5f27d558ce6b7c6ea4ef83cabdd43b9e" + }, + { + "path": "files/docs/a10de0e026ba0cf397108621d5927e16436acf58.md", + "sha256": "68e17f15d94d211d8e6c00ad2cc3f018b2ffff8c03a700e1459af86202a9defd" + }, + { + "path": "files/docs/a11374b50b49477362fa00bbb32a277776f7e8e2.md", + "sha256": "2ae01eb680c89a911ec75d9cd6da3220b56a7768c02aadde3cfd4ceedffe934c" + }, + { + "path": "files/docs/a1365cd1e2acbee6e9bf025dd493feb17a0d428f.md", + "sha256": "e7f3dff4a7634193b76dcebf869126be5f4e54fa734d5666ea268e6de30121d3" + }, + { + "path": "files/docs/a148122da72ad9ff05b3483d6f50975c50b4ab33.md", + "sha256": "054b8ed5e94a56a88f3b39fa98acc105fee5aad447000c5f1f485e108349d6d0" + }, + { + "path": "files/docs/a152f3047c3b41f06773051ea4b5b6b14dde709e.md", + "sha256": "1b3eaff6dba6d5316e2f680351205220d0ee0532bf5af68e8dcca6461dd18984" + }, + { + "path": "files/docs/a187344eb767bac8e4d674651bedafa33f70bfa1.md", + "sha256": "ef4eb74dd8fc3eb346ffb7d4ba91027c928607ec6ce46f9830f93570ec8a2e04" + }, + { + "path": "files/docs/a1fe4b06db60f8a9c916fbeaf5c7482155bd62e3.md", + "sha256": "abf4851908406078831ef59164899d7060f40d8a865b780e336cbbf9a3d5c070" + }, + { + "path": "files/docs/a20fcf106ba3053c247daf57a4a396f073d1e4e2.md", + "sha256": "b5b1524399371eda1a8e477024a3856695889ea09c7fec338c6075b4c0714aaf" + }, + { + "path": "files/docs/a255bb890ca287c5a91765b71832daa45ba4132b.md", + "sha256": "cfb49c54275e6876e83a041ce0a6f0377f6cc5650c4aa859f550fb3be22a8949" + }, + { + "path": "files/docs/a2b0db014389285d9abca9fe0d4035f85de6d102.md", + "sha256": "66d1bbdc78be4f5a11d8e6926505cdca7f92b4efb11d4d6e8388c5854e000d2b" + }, + { + "path": "files/docs/a3022ff9db2732f0ab3091884b428763d3879fd2.md", + "sha256": "7d931f7331ac48406e97c875a37aa62d83b0fe5a7c81fa72578bd0299be9f29c" + }, + { + "path": "files/docs/a304b9e82543c150236ecad30f1594e1b832b8b1.md", + "sha256": "6775a32d22e872e3f6d30034c764d8b20d96bfa6f28bc164bd6b7f07de265ead" + }, + { + "path": "files/docs/a392bddead4f42155dc83fba8512775db313fc53.md", + "sha256": "0ed017a4d8b6dc5501e0def06c39c4dca8e93baba19a793df4577df510b80c44" + }, + { + "path": "files/docs/a3ae0828d8e261dbc23b466d22ab46c1dd65b710.md", + "sha256": "02b4113a3e4a0211237084b9fee8c62cb6e87ff29b30d44b551ac0b8f6cc3528" + }, + { + "path": "files/docs/a447ec7366d2eb328bce8e44a73b3a825a9b757b.md", + "sha256": "3df7a1abf4967ae0151285f047f46d46cb30ccf5904e26990932414339436543" + }, + { + "path": "files/docs/a4799f6bdea1b1508528fc647dad5d1b2ef777aa.md", + "sha256": "c30c9d23d7d428d08a9acffa55b554f553ccc1a4640591f0d2e5003ab6655e15" + }, + { + "path": "files/docs/a4cea84825e512a73c509437103b89b6ef363d5b.md", + "sha256": "fc925d51435d300715437cb3f5b73fdfbc3df5e5aedecb540d4c21d05f8f7b44" + }, + { + "path": "files/docs/a4e9fae09be2f3c0191cbc14a56085b0773a2585.md", + "sha256": "a3dac4631c0c541fe627b669147929f88c343321b6f2e9688b2dc487862c42ed" + }, + { + "path": "files/docs/a56686454e771e5fdda0315dd38313f9fcb31aac.md", + "sha256": "b4a374090fa9ad8449b35d7b030f91faa59e2c5b807d64db4888af61ccfbf0cd" + }, + { + "path": "files/docs/a56c821c7ee483d01e4338397f62ddd6cb6d5e9f.md", + "sha256": "26a2fdcb90c3b90b72124a93e6fab9b0e2d4773b9f768a6204a88de06e0d81ec" + }, + { + "path": "files/docs/a5c7cf086b303923d48f8ad63cf85a6bccbbe3f5.md", + "sha256": "0991f2665d0e877f39cceb152036ac77d4c4d2bfdb90bde493ca2bb7ec2a17a9" + }, + { + "path": "files/docs/a5d736b45ec8ec0b906e183de5daa8bfa4c1f2d6.md", + "sha256": "0aa6fd46cf3c4221abd38c6aaec1d322b05fd4b75b4aadb35445ba9c12d28219" + }, + { + "path": "files/docs/a62a258bb486fbe7e7fc91c611dc2bc400e32308.md", + "sha256": "87e333f1f8d34469fc6e2eafb5da3a248634bc6d34497cd586ffa9d216511ee0" + }, + { + "path": "files/docs/a6587cbe69b6227ce1d087cc141ccf13669f2060.md", + "sha256": "357c3e7c0fae468eca8d51e88d23acdca2d3227f1ec2aaa91cf1fbf0d0ce7aee" + }, + { + "path": "files/docs/a67ea42903bf8be22aeb379891b7e1ca3eb2e4d1.md", + "sha256": "b5cacf7702c7d05d5d4ccf4238ee7762ed85c44ea5438ce01e248fbf03f004cb" + }, + { + "path": "files/docs/a69da07f8ee0529080646a4b1eab45c1074ab683.md", + "sha256": "7fa5e5c7e72410ad8e4771ab46a07339d4862fa8d6f9f3a825dd6c1863eb5865" + }, + { + "path": "files/docs/a6d3281cf9382fa606cf60727452a304a5ccdfa5.md", + "sha256": "f46799771b5f74e25df74d3d823cc285ce9295c6cd4af2ab36c17751c0f7b992" + }, + { + "path": "files/docs/a6ff5c1e6cf7c4ba30f191df892dc3296f9b8ce3.md", + "sha256": "260caa3b9190d67840b180f8d1de0e7fc985fe65740cb66cf720d0f3ad5efc12" + }, + { + "path": "files/docs/a724f6e91162b52c519f6887f06df40626c0f698.md", + "sha256": "0a7be45915ca2894630fffd3002dcc7287fa864eacd14481d9c168d7c88ee6c6" + }, + { + "path": "files/docs/a73ca4f67523dbb58fd3521ae9bff83aee634607.md", + "sha256": "47e923f7b26e61ffef1403fe545c2d7d367708822af51f05ab951b44614c7e05" + }, + { + "path": "files/docs/a7845d8c3e419cedd06e8c447adf41e6e3d860c8.md", + "sha256": "44e03fdc7d9409248e050dacac07b8c064a278312e21cef90e365f739fb076e2" + }, + { + "path": "files/docs/a7f2612ad7178c8afa4c8b7c2f210a10dd7ee5cc.md", + "sha256": "1448e38b703a5940bf3b76127e13fc26c0a233905a7e0e780475deb0a91a146f" + }, + { + "path": "files/docs/a82cb1ababcf08e9fd361f13050d47850af8768a.md", + "sha256": "1c81947f5d4be1e39076e2b464dab0610777bda030a3ad9c1d9884ae32e5ce82" + }, + { + "path": "files/docs/a85e898f28ac27daa8961337a9b468004c1b8b21.md", + "sha256": "8b4cb48bf3f667206a5b0b611cb2c28d0668ce9d834cacceec3ba09752d9e2ac" + }, + { + "path": "files/docs/a8a2d53661eb9ef173f7cc4794096a134123daca.md", + "sha256": "811ee382003c8cd37382d77116328a876fa6947f460c5b67d86eb6b81a375b41" + }, + { + "path": "files/docs/a957adc1e11b5dc6aa15dc17ef6293c40f89fc20.md", + "sha256": "4f98a13e125f2e8efea71df7a5eafc2923ae7c08004b55349d955a44354e1b81" + }, + { + "path": "files/docs/a967430da16338281405cf73a802c233911b6a13.md", + "sha256": "29d54ba6ae4b82e568d049b77c1f2ae968592a67b90c5bb99ceae8213f9463f5" + }, + { + "path": "files/docs/a99d0a49cdc1c3c38eff43a6b1b51b0a177e5573.md", + "sha256": "f678b083478a42121820febbd91265a4f3d9ff3f08002239c3bf367871d5433d" + }, + { + "path": "files/docs/a9e9d62e92156cebc0d4619cde322af48cace913.md", + "sha256": "d47ba93c2aff3dfb6cbe46390740219766e4660a516211e53eb4c2dbf2f17abf" + }, + { + "path": "files/docs/a9fa1d31f4cc6018daf5b927908210846b082675.md", + "sha256": "54eda4e50becd3993bc41fa6f3c31bdcd4ca90f116b4435e8f87aae35d87c424" + }, + { + "path": "files/docs/aa1c79d72d6a7d37ce1e72735b6dcfca2b546dce.md", + "sha256": "79f5a0745d50d982c0efd01709ae33298ceb22c628cd9494eaf421c54dcb5b32" + }, + { + "path": "files/docs/aa213d259727545c26401ad5cfb4916b6efbd18d.md", + "sha256": "8a8c8e79fcacfe7e58a319ce185a383b2360744110ac9e0ce20eaf984cfc8c29" + }, + { + "path": "files/docs/aac63365f37f6b307ba343f45706e388d24245d4.md", + "sha256": "b5f9431ad8ab9b0cb31a2331039e2a5c462c08702fc89ff51b8c979783d758d2" + }, + { + "path": "files/docs/aac6535cab0b4600a9683433fcab805b2c4eaa53.md", + "sha256": "95928b55b2327debafc083ecb63720762e3037b955c5a4d08de84d65e3828d64" + }, + { + "path": "files/docs/aae40f1cc335a650c1eb806e404394da596fb433.md", + "sha256": "4b760515d125734245a0004237a5a811ede7b814e2b3f1f2c1f263a45fd6ad01" + }, + { + "path": "files/docs/ab42ff6b754a2e29fcb56b0137eeddf17f8ee271.md", + "sha256": "3be267924e59955f76af60faa2caeb9de23bcb24fe27c14cb0fb3cd19ef76f6a" + }, + { + "path": "files/docs/abca967cd96ab805be518e8a52ef984499c62f6c.md", + "sha256": "74caec194dbdc65b95bcc161c5995b2520b5e568024aad014ba397066cb2e017" + }, + { + "path": "files/docs/abd445ce46b0329348e6ad464735bdb1d525edaa.md", + "sha256": "4104691c1e58a1264991103e0f8e2f92c41ef601c869c442e331029c756812aa" + }, + { + "path": "files/docs/abfaaf84948b090c8ea099ff44cc8cd878371073.md", + "sha256": "7207b4e9e4ca8eeaeb46453438a0ea1589bcc2a6b612abdb2cff3ac4943234f4" + }, + { + "path": "files/docs/ac040f5709ab00ab3ed8275862fa2328d20842b2.md", + "sha256": "2cb581cb4660c80f3360873945e7f3ea74878dfa34803273cab0ceb3f1032e8c" + }, + { + "path": "files/docs/ac97ce4d4df6402240f1a6a67dfb9462bc1fafac.md", + "sha256": "b0bd0a3056ee97509355529ab58314c1876354d1beadb00ee523635ca5c9ceb8" + }, + { + "path": "files/docs/ad5b9969c7557bfc4cfbb32cca67f40c52ff824b.md", + "sha256": "3c0468b31ab47f340b774d4ebb8677841196aff1738a227039673270078942e9" + }, + { + "path": "files/docs/ad61bc1b395a071d8850bc2405a8c311cfdc931f.md", + "sha256": "6d78b771947057350c60e756e0ce79ddcc1b55ab6348138111c500b6f2100687" + }, + { + "path": "files/docs/ad76780ea50a0fb37454a3a03ff08ca0ad39ef19.md", + "sha256": "a82797137306e18d5b88c64f9db7af71918f7dea8639c20cfb83b400b25c0f3f" + }, + { + "path": "files/docs/adb2d2b53c7f2a464a38f7de5d7a74a39e697528.md", + "sha256": "37e7fbb4a5a0ce73055214fc421641bf277efc838e2d717a90f205afee5fd91b" + }, + { + "path": "files/docs/adbd308eeb761b4a1516d49f68c880eaf3f08d78.md", + "sha256": "32220c7665cb93f206f2bc403ef4ad0a62886c10b3e7afc366c8cb0702859c94" + }, + { + "path": "files/docs/adbef9d5635eb271a8bd78b23064dcba1a1915a6.md", + "sha256": "3e4dc91b195ae526d9cde4e5e40ddee2d4fac38684756d91b319e580896468e7" + }, + { + "path": "files/docs/adeb3c4ba4949f2c87919d5493b71b67028b76ee.md", + "sha256": "ece63832fb2a0a2953fa748ba0dfe69a3e375765aef4da1129fb4620d29f548b" + }, + { + "path": "files/docs/adf96f4dc435ccf7e702eeac6fcaa9f7decd1dcb.md", + "sha256": "5ba3a0c47c3d8ad2c03fc2ffb59de06e653ca4ae0e932ff89aba3c2bd97f1f47" + }, + { + "path": "files/docs/ae3f5b72354288cc106bb10263673ebc80b2d544.md", + "sha256": "f93e0154e1a970a7a9e1c05cceb248b72adcf987c3cda608b54afa30688580c5" + }, + { + "path": "files/docs/ae57c56703b39c9097516d1466b70a3de57aa1c4.md", + "sha256": "088775d6106b6664995b163e8c515b4ce8c29e1f9391246f5c206f0384331e29" + }, + { + "path": "files/docs/aee1a739f2ea11f815ec571163ba99c9b2a97245.md", + "sha256": "16187643d24cc74317d00c0e1ba472f90db8a13661a01934967413d1961f93fc" + }, + { + "path": "files/docs/af0f7c335a10c372c36a0ccec76057c41b93731b.md", + "sha256": "df2a4819414c2be5ad31f7b55d2181fcd4a4707150cd0719771c0e7e81056a30" + }, + { + "path": "files/docs/af19b6a59e167d486d94f4bbb3724ce1deae5feb.md", + "sha256": "a03721c73a5d29d535763e6faf211b59e81022de221ba680ef19dbfcae8f88cd" + }, + { + "path": "files/docs/af2ac67b66d3a2db0d4f2af2d6743f903f1385d7.md", + "sha256": "c1d7e4d4e6225ef9a9784d8d9f28c0b0f67acd3c22bd7ca099c42e3492bc49df" + }, + { + "path": "files/docs/af3da662099bd616b642f69925aec7c8afc84611.md", + "sha256": "e2fd19c5ed1c96e7a3de7f284c619a91e0f3cb3b7a05076ceaae0cab032f31c8" + }, + { + "path": "files/docs/b00beb80e522d712dc9062f835ad10e787b8c5fc.md", + "sha256": "28f1a7c48a909b0cb5ea04270b0f699837af2150a2585d1b5a7bc45bbd1af505" + }, + { + "path": "files/docs/b019692a5844a9a72292a35b8953aa67836f8201.md", + "sha256": "0187c9cbbbfd8887ab125484406c0e050256137f6bbea5722800986b85e0c9ac" + }, + { + "path": "files/docs/b08a6b7a0f11fd3ab62a14f44fd4e1a771174c61.md", + "sha256": "988f09b2f1bcbdd49858b8089b266320ba45d86ed184537ee08ad59e5cf37510" + }, + { + "path": "files/docs/b0b1665f022c9e781ce1ae94fa885266391fbcfe.md", + "sha256": "8e35e9df7d0c699125c6a80ebce53750f6084c43aedf99bf4caa6ade5ab9afc5" + }, + { + "path": "files/docs/b0b80eb59e769546eedf8ca32a493bf38c6a9707.md", + "sha256": "0c7d95f3697e7e707a464f44543502af39cd1e897b08414fa52fe5031d3d784f" + }, + { + "path": "files/docs/b0da6cd45bfd0d3a91f0b3c4e7615de23fe4f350.md", + "sha256": "0a22bf8afe49969c5bf4db7de74e634a846cd37f50cc99abbdd6500a0e555f06" + }, + { + "path": "files/docs/b193a2795bdef17a5d204cdd18188a767e2fe7b7.md", + "sha256": "db39d56dda6d07b57430dc2ab318479a90574d21368448a376923ca03fea9e09" + }, + { + "path": "files/docs/b1af301f18e6444da2842cc71f9ac38505ee5e1f.md", + "sha256": "caec1414e277c43086cd6153d20ca1612084437ecd7adb5398d65952b884411b" + }, + { + "path": "files/docs/b2117b2cd0fea469149b23facb6a9f7f32905afd.md", + "sha256": "80ca82bb93d3c55cdf1277575447b2df5b12595dfc5dded258b83dc1860c85d0" + }, + { + "path": "files/docs/b2250c2a2e20f6f123c6d1091bfd635dc74ee4fe.md", + "sha256": "7c8ecf4e94ef147e9151319dc3f5f7acc01cfd8457b29738c163a298fa56a151" + }, + { + "path": "files/docs/b23f48a4757500fea641245cffa69cb3b72ae0e8.md", + "sha256": "8ef023f5d6da9800d115aa35386566a40cee108bf94a109db5d9a61c587c3058" + }, + { + "path": "files/docs/b2593108fa446c4b4b0ef5adc2cd5d9585b0b63c.md", + "sha256": "b404b7de235617fa38157f076457cd346f1842c8508286230922e7dec0cfb11e" + }, + { + "path": "files/docs/b2ca734ae719ba79ab4b5f877cf044f47090faec.md", + "sha256": "1f68e30edf93622cdd479429d1077e953517b7ea50603bb45fbc31508392e9af" + }, + { + "path": "files/docs/b32394103127310af0f4bf240cfd0b26399b685d.md", + "sha256": "823913da505784aa272d7da7117847310fe70b93cd15509d9ebd38fabfb165f7" + }, + { + "path": "files/docs/b3f8fb433fc6730284e636b068a5de98c002dabd.md", + "sha256": "8c7760768ae5bc4ad7b4f4d40b18774e937561c81633271778ec40093f7649ea" + }, + { + "path": "files/docs/b3ffe77064106ee619c664233b7b7a9aba75c30a.md", + "sha256": "9a3ef2e5c3f7466227827d0a26ae36fa13a98aa3acd19d2af4b385da24607a2d" + }, + { + "path": "files/docs/b416f3605adf246170e1b462ee0f2cfcdf5e591b.md", + "sha256": "c2ecbba145d281ebb32160da5f2fa0849688860167e0075273f76b7f234de677" + }, + { + "path": "files/docs/b481bde61eeba2cc6b2a0c1d9c43d8dd56ab2a08.md", + "sha256": "51804db22f7e89676733217a8dd39cabed1c898a62b2cb8090ca3e3ff3627bca" + }, + { + "path": "files/docs/b49f37bd511123a94fcad3c6e826e60fc61db446.md", + "sha256": "f5d2579860962c20c0775a23ab611df01e281f02cef8c05c4492ac0299a9323a" + }, + { + "path": "files/docs/b4b2e864e1abd4ea20845750e9567225bb3f417e.md", + "sha256": "6fff676a531d59c42a8308012b438ec916dc5c8b06634c235c3217d5d47e5b11" + }, + { + "path": "files/docs/b508da024ee4722c3919c4d1118cf0410713a9c5.md", + "sha256": "999aa2675dc88496490f34ef3f4d6596badbd22642971c9be19f86486385f3fe" + }, + { + "path": "files/docs/b518a7a2d4aa3b05564c965889116f6a6151a34b.md", + "sha256": "ff5b8eb02fcc6df40dbf3846e03be68cd4a878b3a7c8a658e12fdd8fd4eebd2b" + }, + { + "path": "files/docs/b51ff1fba515035a93290f353d20ad9d54bc043c.md", + "sha256": "f30b4b6a6cdf36bce25598f5bf97d224355d0dc37da3f3fdbc65650f5ca785b0" + }, + { + "path": "files/docs/b523ebe64275bee04d480b55ccaeac3017a36980.md", + "sha256": "e9fa65bd23e8e76a63ee932e5ef5820acceba70320fd3fbac5a46c822268cb72" + }, + { + "path": "files/docs/b561f461842bb0d185f097e0adb8d3ac13266172.md", + "sha256": "1898a13b86e8beac6c6c7b9522ff85d42efad3f8073b9e9ba8f0eacea13b4a9b" + }, + { + "path": "files/docs/b57a4b94bfafdd0cd6edbdfa4aba1f708286e918.md", + "sha256": "65b857975fb25f4c7277e5596db5a757df67518772e6ec01f09d7b21a61f9511" + }, + { + "path": "files/docs/b5873013457aaddcc20db880b3fc9d9bfb7bd348.md", + "sha256": "3e3b6190c2cb8f60943af072a2947ac0073b3e03bfde8451ac50dfe3aceffe22" + }, + { + "path": "files/docs/b61649df5425dea0c1f16942bde0eec79b3e4f80.md", + "sha256": "8c301db48b75ca0da8a0a40596234375c3cefea7c003eac9f0ff2b1e43ce6044" + }, + { + "path": "files/docs/b648a5dee55d7dbf258b7b088830f18c040c61d5.md", + "sha256": "4ff27a5a0e18d0884743417f9954f0b76a7881c6b9364ca785d48822819b69d8" + }, + { + "path": "files/docs/b69246113e589f088e8e1302b32b57720bd27720.md", + "sha256": "5d9b3f0f0b7ac2f3dee0b9b916529dc8a1efc158bb9edfbe3c6c15c101d28e4a" + }, + { + "path": "files/docs/b6dc074f83f9e8984b9cd3a3bf5b392bc4a61844.md", + "sha256": "68c7e63af157307762074c141b03b5c5660275a54ba2e7d216553d8ee9f64312" + }, + { + "path": "files/docs/b6dc15d9f3f199c8bab5f85eda67d50627bb3e08.md", + "sha256": "c88b968405254bf0bda9057f58e4f982d61f58596d1001cf671551fbbdac0e14" + }, + { + "path": "files/docs/b6ec6454711b4946dbc663324dc478953723b1dd.md", + "sha256": "8b531fda591d57b78fb74bd7622861bc458e4ce95cf3359e3024526f77ce1302" + }, + { + "path": "files/docs/b741fe5cdd06d606f869b15deb2173c1f134d22d.md", + "sha256": "d3f5c321e32542a2d37ef27dc8cbd3803409360785667bf87b8252cc2f334697" + }, + { + "path": "files/docs/b7bafad14d0bf628c14fe0821af01aee98a0ae62.md", + "sha256": "f4afe32a8691e4388a6e96a1a9a1296fb1df7bd28272b523e037948500ac1360" + }, + { + "path": "files/docs/b7cac3027eb08d3e2cfbfab0f0af2acf4dd0f990.md", + "sha256": "e0d7c7a6305fa99a746d3257ebe0f5830a8a3a9d94d9c1ee6ab815b8eea89127" + }, + { + "path": "files/docs/b7e56bebf29f9aa59a9abc9e299f19613e5859da.md", + "sha256": "e63f03fff846624053edf1a89debcdec13e12fba6e5a1bf5ad1ef0257b83b09a" + }, + { + "path": "files/docs/b8044b03933e3fcea5bcf6362199ed083ec2f20f.md", + "sha256": "2d52c020e1c360ce42a0587598291a51f6bbb94e065ef6c0825fe57eeabfc8e9" + }, + { + "path": "files/docs/b851271c134a1b282412bd7a667c1c9813b4e8b2.md", + "sha256": "32fd628726e45cedad08d6fca3efc73f78eef30c7b99dd02ef7ed3a8c12b9385" + }, + { + "path": "files/docs/b8522e9801281dd4118a5012acf885a7ec2354e4.md", + "sha256": "bec37a516bad667c8b13dfe36a74e1910585541d801bae53b782bfd6b2ba754e" + }, + { + "path": "files/docs/b8581c38346f1fe8900d18db8fcef8145f5965bc.md", + "sha256": "11d4ceeebb7f786ced823e0243bd8d02732c43cb7898ad7d5bedb21780718224" + }, + { + "path": "files/docs/b8aa7399868c0ae8dd698c9048ebd50c3f17ef12.md", + "sha256": "d1fd4ba8bc8256f8c3dbe6c9a57c095af2beb175bc544dae9e1416da33898fe1" + }, + { + "path": "files/docs/b8c3b95fc688c347d679f81711781b29578cfc19.md", + "sha256": "306cfea8f553bf760c544f11f3405b557534cb370570a3fda7d8c61f6046dea8" + }, + { + "path": "files/docs/b924d359f00db1671f86aca7a3ee226206dfbed1.md", + "sha256": "f6cf889cff61e5e04794211f57b0c0914dce687132fbc4be58677ece69f6e5d5" + }, + { + "path": "files/docs/b92f42609b54b82bfe38a69b781052e876258c2c.md", + "sha256": "cfb24f464476c0d09988be0de4d419f0fd8ddca3ff96953376938c4cb86ee8df" + }, + { + "path": "files/docs/b93f8a3a1ced22cf84c45b552d5040a4a17fdb60.md", + "sha256": "2e330b7406f40e6bb6046d92d4601d5b00525e258c503c2e0bf61c31eae39d5d" + }, + { + "path": "files/docs/b98506eb96c587bdfd06cbf67617e25d9dae8e60.md", + "sha256": "eaba2d2d4e1a86d7621d5aecdc6a228b06fe0b225847beaed2f0de5ae97466ad" + }, + { + "path": "files/docs/b9d44bbcf205103bf01619d31cfebe31a725ba5a.md", + "sha256": "8180d4c420cba5b1f703ab566adc71192342761e133e26a44b0ccb365e4453dd" + }, + { + "path": "files/docs/ba4ad6d42d951b1247e54e312c04749fd8ea2fd1.md", + "sha256": "93c47ea8ee4a4ac625e29309ae394c4769e479a055c03442b4404e674e7336b5" + }, + { + "path": "files/docs/ba78048bad0ee0f455762254f562704769ea4149.md", + "sha256": "ead4c0f759d1f69ada96510a6de33de65a087f8270065924610c607eb5e3addb" + }, + { + "path": "files/docs/ba8a6820b3dbfaa703679b19be070f7bd0cca3d1.md", + "sha256": "8a0387056add7b97c6ea8d6742f5413abb8e735d58026bff1858213ee1a510e6" + }, + { + "path": "files/docs/bab82891ca84875b6eec64974558fc838197c99a.md", + "sha256": "6ebd0c1e8ea40041bfee764125a0a06e69cf2d52e19c8cc4d79c270834d626d2" + }, + { + "path": "files/docs/bacaf30043e33912e3d7f174b3f8cf858cb3093a.md", + "sha256": "9873ce4fdd7289f94a4b72e0586bbaa1767d73fdae56d5e79a0430dd80599503" + }, + { + "path": "files/docs/bad5210d0f8114cd4e9b1db05eb92f0eabc6e233.md", + "sha256": "2e61f68f7501e73e950284330818252d7a771a511ead0fbfb0b399e9b85ec88f" + }, + { + "path": "files/docs/bae3302fc87e1bbfa604baa2d003069e4233a517.md", + "sha256": "5d7ae79bca188705baf07220af7e9269e6cea456e6d7136fd6351bd82ccf11ea" + }, + { + "path": "files/docs/bb659d7b00db3096c4082bb93c7fdb933738b013.md", + "sha256": "d56b20a0673a8f55dd1beca4ffb89a59682300d1fc3478c09a9e2d2bc87ae6fe" + }, + { + "path": "files/docs/bb832bb5ce4b3e6e6272967d547d652b1daf2c4d.md", + "sha256": "0b0e9063d3c8d6736984698497877dd56fa9c8a7da7b524b54011c2b9edc9d20" + }, + { + "path": "files/docs/bb961ab67f88b50475329fcd1ee2f64137480426.md", + "sha256": "8de88dc64f400194d8b92c6abb41efa6ad8da327bb02b585e55ebf3ca1842f95" + }, + { + "path": "files/docs/bbb6fc842a370135b8488d9a2e09fcf17341954b.md", + "sha256": "0070248b83b02fd68101e708db37d4bf535bddad1bf03577629734f3c1598e12" + }, + { + "path": "files/docs/bbd1f022a8393101199abb731534c10be99cf1e4.md", + "sha256": "1d1904324fc109b31b870eb263717ecfa745c462905029504bcd07116ee8ec15" + }, + { + "path": "files/docs/bbdeda771a051a9b1871f9bec9589d91421e7c0c.md", + "sha256": "9d9ebdfd510625921d4c104da9cb0caea2570aa15d616b1c48714a12b9f04d6f" + }, + { + "path": "files/docs/bc1ad7048032258f29e1d4081a2eec98b36d13cf.md", + "sha256": "f80f486d5fc3557949969ca0a4f885956dbf47013a3bb58a81f943f8a1cfedbd" + }, + { + "path": "files/docs/bc314650433831859c400bffefe5f919ed8735ea.md", + "sha256": "a8ecd94f6f13221628b11f42b08c0cab791e599cd0aff6799fca85c205a76c30" + }, + { + "path": "files/docs/bc3d88e89001bb639e418ae5971b209535603a18.md", + "sha256": "75d7480acb724313c487b01a6120258166bcb5d6c5aa0cba7a15e0a8f84879de" + }, + { + "path": "files/docs/bc75f4741f871360b8e3ce356754c329323306f7.md", + "sha256": "1af08189d11be4ed2372cc5de23cefe6c4d7c5ab8c90776738cf8f2255d89707" + }, + { + "path": "files/docs/bc8e9394d23a5320bfce0ebe7f208ca18cb6b65c.md", + "sha256": "0071b142116fb7be95ed1bcb50254b0beafca449418a0bf69dc6a3ac419884d6" + }, + { + "path": "files/docs/bca763bf5f62bdc635ac2e0e7c9c6a47b04745a4.md", + "sha256": "fa4468109b8e31fc6ca617592dccb51a2542d947e00e8e92981063c5bb170c73" + }, + { + "path": "files/docs/bcae38614c57f1abb775c4c9372dc02531830659.md", + "sha256": "d65dfa7f6f29b1574849da5025779267530aa51855a374949df7582487430ca6" + }, + { + "path": "files/docs/bd995b62f35ec624da9e86f9a3383b73b54d9ed7.md", + "sha256": "b101516b1d6e0c5aa77cd98c98db2ab222816be65102f840babcac00b5550710" + }, + { + "path": "files/docs/bdb3689801d81676ae642f1ebff81d27c07f1f3c.md", + "sha256": "4a67e90138923993bbfde802ef934e5310dcf2f014c8a08e52b304b29f68f714" + }, + { + "path": "files/docs/bdc1b4283563848e2c775804fc0857dbde8843af.md", + "sha256": "d7c4263775c447ceb21ff4cffca559e2019de90c0992c4fa163cffe571c1d4a8" + }, + { + "path": "files/docs/be1c1c3648cb7f6f6c394334554b1ecedc3504dd.md", + "sha256": "929c49e0a50a754b890cd2b6790dea92c668a6031b888ca12e1dbe56ecc6ccb9" + }, + { + "path": "files/docs/be6a4c0bb6bcc7166ff88d60fd433c220962730d.md", + "sha256": "0514e6a8302f466ffd6c8f3e5b108d897421d5d65a86e02ec69b33e74f5cab10" + }, + { + "path": "files/docs/be7f45c3e17998a50b8414d623007ed668b37c04.md", + "sha256": "4d003219f0550b3cb90ecb61aa33cf18b5541eab18491131490d67a02ce7acce" + }, + { + "path": "files/docs/becca4c839a0bcf01adcb6a5ce31a3b1168d3548.md", + "sha256": "906a86f075d88f66c5424e59210f040e3eb7e34d5da69db57b5f8392ed2a3bf9" + }, + { + "path": "files/docs/beda84e76e7f8fa5594f63e640dc17b4f6cb3e5e.md", + "sha256": "4e2a157dc75069370a2025655e519f8837eaee62c5c8c0db7ecdd7535ed8cb7f" + }, + { + "path": "files/docs/bf6a65f061558b6aed8a438a887b6474a0fdffc3.md", + "sha256": "cd9841076fd8a3f016a6b3e455be4386db88b73ca0b583c271ccdd76ee0f4d24" + }, + { + "path": "files/docs/bf75f233fdffdca8a25d191e1df4df7f51e30823.md", + "sha256": "559ff232f1201f4975bbbc8790b283ee7cda12958579df4105f377427d36d963" + }, + { + "path": "files/docs/c038ba342a00562bcb7a569e4e2acb7349c9cef9.md", + "sha256": "783372636aebfdd21ff8daec5bc7075cc4ee444d61b46bbd2913cff410bb1470" + }, + { + "path": "files/docs/c07cd6df8c92edd0f2638573bfdce7bf18aa2eb0.md", + "sha256": "cca90993707f49aad2cf0f05258830c758051d68f6f2c32c3f36d97ec3010504" + }, + { + "path": "files/docs/c0cc7ae4029730b9846b6a05f4160643d3a8c393.md", + "sha256": "d66b1a3a7a070932ee72ce89d753f55e86c09335a033c5c50c26e0ae65bb64ad" + }, + { + "path": "files/docs/c0e0c248b3934e34883814b5f9ceb792d734042a.md", + "sha256": "dd82e066c89800c0be64f4d6169ea704fad6a6546025401aed74b6445c579fd6" + }, + { + "path": "files/docs/c119b8d62c156451a8b8665e8969422803527df3.md", + "sha256": "fe1e7703ff05cc928a09ebccf378959594425a5ac1873406401c0e65bcedc9d3" + }, + { + "path": "files/docs/c11e8deedbabe64f4789061d10e55aea415fd51e.md", + "sha256": "0647352da7fe70c68c2f3fd74d3119ac460fae0ce24230bff7dae75a80de49a6" + }, + { + "path": "files/docs/c122739764b1ec75b64e1b740f493bad8616a9db.md", + "sha256": "6b075299ab3bbf886cd6bedebcd01521c9a91016e5c187baab1478368adbb4cb" + }, + { + "path": "files/docs/c1324a359a58b4d399c10bc59ae94e7e0723836d.md", + "sha256": "dd25cc1240885249e869f52cf10fb5819d1d9a6fe71b860fcd0ccf3dfcbe4d8d" + }, + { + "path": "files/docs/c143a9f5185d9303301630d3fc53b604d3dced2e.md", + "sha256": "a4b7561b72291ec22c0d46c8b807d344c1c1ccd9b42c06df68404a9931819573" + }, + { + "path": "files/docs/c1ca39ff2c12cc12697e62a37c7c52a256248af7.md", + "sha256": "c410adf1b558f0fec377cc1a02503fc24ba48dac9aee5c970b3f008d6c567b08" + }, + { + "path": "files/docs/c2185a8c9156c6b38d76bd3fd29a833d96a5762b.md", + "sha256": "c1b26b6bfeeac7ed84495eb54e355852f78154c84c9b23965b5fc7459d7f8dff" + }, + { + "path": "files/docs/c24646ed4724e2a2d856392dda9c1b9b05145e11.md", + "sha256": "e60eb31a83a57b17e35fed6f77e99bcefb9d4e1626d191789aa4e089e3ef63b9" + }, + { + "path": "files/docs/c2da4bde14d0a2da1e0e2d795e7dc7469f422db9.md", + "sha256": "6f3d83eac2f9deef7ce3eef463b75d264f11319549a9770bcde7f701f3ff6696" + }, + { + "path": "files/docs/c2f1ff7794524db18ee5fadfaa7232d0a94f8b4c.md", + "sha256": "833fbcf89d6cfae4d0db9f5a8cbbd0c27e4fc5a3af0ff0dfe871a0d25d3fe189" + }, + { + "path": "files/docs/c324305e8f756140b7b96492d73d35bb32794119.md", + "sha256": "c6b3f9e0d284f9f5e58590e6319ff720b8d355c737602b4a83b56bbae8441f9a" + }, + { + "path": "files/docs/c32fe380cf3083b6d85554063b5acb153fc1c8be.md", + "sha256": "fbe6ad71fdf82a0932a993246ec14d65bbdf4808c2d3dc4838fd673fa81af05a" + }, + { + "path": "files/docs/c3552c5e0f334c8bc3557960821dc5ef931851a1.md", + "sha256": "74327281f4d2b57925e0f0c2b403c3dc63c3682e023cc7c653d05c33ff5bbb73" + }, + { + "path": "files/docs/c41c78f27bb2f48542141ea85eda7ad333e3fd0b.md", + "sha256": "4e0bb2b7effc19c9b505171edbfb15a9de0a9ee6bfe41dcfbcf0fbbc5409e18b" + }, + { + "path": "files/docs/c471b8b14614c985391115ec1ed53e0b56d2e27e.md", + "sha256": "db47746506ec8df39ac151c97e3d44a1810820fd6364c74bb760e5c25b850340" + }, + { + "path": "files/docs/c4773ef8b0935e8de084c1a6285efe11e2a5f80a.md", + "sha256": "c83007a242d53611ca35b4d10adc5cc87bfba179ebd9cf377671efc2733b3b0d" + }, + { + "path": "files/docs/c48e63f001dfae875e1c82b5d163b7a2c9961ce2.md", + "sha256": "34f61500bfd78d17622d6a1dd7c99fec50a58467918852f11dafa84ebb67ec51" + }, + { + "path": "files/docs/c4bb814768f5d91d2c6aa90b34fddd944aa1eb91.md", + "sha256": "00058a850a55586e4c0824074dd1226f8494dcec90ade125c42da761a84e40e1" + }, + { + "path": "files/docs/c4e83640891ea5d02eae76027d05fdefe2c4effe.md", + "sha256": "e8799a78d5ee6a010a34a5cc627502311444861b52f49f93c60f1a042e18db91" + }, + { + "path": "files/docs/c528d240892080aece146d29fb3496ddd0f1fd48.md", + "sha256": "ff7b25c3c8f19e397afd7d3924053496eab2d6ce35845590c08a7f6403facfe9" + }, + { + "path": "files/docs/c52d7d525c33eb8fa5b5acc8b16243223d78ac68.md", + "sha256": "f81fd94c0299bd5a270ccaf005b6acb699ab3118c52cfb6274987937f74dca12" + }, + { + "path": "files/docs/c535650c17cde010eacbf5b6bf85fd8e593b77d6.md", + "sha256": "f3761576fdf4e7b81f0e335b7d57a30934aab5d9c4c8216d385fa844615b0db4" + }, + { + "path": "files/docs/c53bd428f2955b76bf24620a21a6461a1cc19f11.md", + "sha256": "8171f0e97e921fe03e3d64c8ce0cf59da141ccc420bf193adb889e1829a1ce17" + }, + { + "path": "files/docs/c562415979d3b38aa74c27fd68f13d54ffe47fe5.md", + "sha256": "5a18c2d9e11d168be3a390b5d8a9ceffb2baa7642f7fa38c2ec895e1125f4cbb" + }, + { + "path": "files/docs/c5673e6023d99f8354e9b61da2d2f1b58fbc970f.md", + "sha256": "8d34ce495f3a6071643e8d7b40aa12a6432537743d72c9e90bd121df01620115" + }, + { + "path": "files/docs/c5f5acc006cd6f06be3266ee98f89fabf4f6fbaf.md", + "sha256": "f2bac611c03607d7f0a3efc1cee563a541c541e499081bf57d5065fbcc122fd6" + }, + { + "path": "files/docs/c61d407536d31a069aa857469a0eebfef1c0e1b8.md", + "sha256": "a6681e3017bb204fa6aca703b8afaf017b75274ecdc18d2598c66b5c8608be62" + }, + { + "path": "files/docs/c6223eeb52369b6b2baa2b489c9da41c882154b9.md", + "sha256": "560bfd49cd102d210aedca7694857c7f5cf634675f415c96e6e70c8a723b799e" + }, + { + "path": "files/docs/c6379e4acdd7b1c335e9944b8d9dbb08db220420.md", + "sha256": "82c4d8be98d6ddc703a6c8456a081f1ee9468b1ee90ebcc42dc41c560c7fc2c3" + }, + { + "path": "files/docs/c64a69ebc1360788037b11e8b0dc5bb74d913819.md", + "sha256": "448e92e845ea1aba824cc13a417c4ef3f6a52d79a853cd48f2dda7c35e3ee5c0" + }, + { + "path": "files/docs/c6b0055426c9e91760f4923ed42be91d64fca6c8.md", + "sha256": "c7411601761e4f412e7c0a9c17f69dff9fa2ea7721735071a483374506e809fc" + }, + { + "path": "files/docs/c6b9bd6294c9a3ef6cd7e45e1b3765c061d92cc3.md", + "sha256": "7b67145fd23648ec5169a7d113e29398103940ebe640b318d7b2b29c14918ed0" + }, + { + "path": "files/docs/c6ee4cacfc1e29bafbb8ed5d98521ea68388d0cb.md", + "sha256": "c02a758784a3a442608e35913f2ec5015a2c9f97cb6c09cb9f1e70fc9d20c2c3" + }, + { + "path": "files/docs/c7049b7393149edc2256a9d4edb1d6e5a6e24b72.md", + "sha256": "5b8aa35f5f37a632c972cc3acb0eb7656fc74c96b443f3bc4d5f3354336a189c" + }, + { + "path": "files/docs/c709b8079f21daa0ee315823a6713b556ac2789b.md", + "sha256": "2088d856a305bc086d62fadbee5083296a87b8c7365f1293d0b49ae657c5e71e" + }, + { + "path": "files/docs/c70bb33e4e6792511dc4e7d88536017e64bcd0f1.md", + "sha256": "794a3b0c829e209ec512a00f87544fdad3248c652a6ffec3b03df12d59cda7f8" + }, + { + "path": "files/docs/c81beea067ccc7fed12806f3ff0f20519092f2e4.md", + "sha256": "76aa559fab265888291c338f8dbea7a988e532efb4b74c4e6b9fb2bb5547445d" + }, + { + "path": "files/docs/c832eb23963c0f4bcddb2dd45c8e67001aee8f4f.md", + "sha256": "bd664f5f2b516ddd1d7adeaafbcbf13015515195e6e0e9805438caa17f4a0918" + }, + { + "path": "files/docs/c8816bf425ef039884dbf6a7282f8d7adb7c5d04.md", + "sha256": "c4eb2c86fad03b6eb38620910e0661c1ccdd4ea975f84b15a09ee32f3ad36bf4" + }, + { + "path": "files/docs/c89753519b91f85dc9e0ed54a3248cd82d5f2a9e.md", + "sha256": "177232ca8d2ed8b2a9107bcd37dd14e90b8c505d8d99f0a433854061cf2df234" + }, + { + "path": "files/docs/c8b4a993cb8642bc87432fcb305eee744c16a154.md", + "sha256": "9dc1a7f99203850c54519cacd5f1457aa7763781f55af46ee36b4a339aff57fa" + }, + { + "path": "files/docs/c926dfb3758881e6698f630e496f3817101e4176.md", + "sha256": "16a80db9150778556769b896caa7cbf890112ef4f9024029789fbf1ae19a4aa7" + }, + { + "path": "files/docs/c9769e4047faf3c5f55b2a7bd5fcce3e321870e6.md", + "sha256": "d0ca85ff7791c7c812d31150a0e56d1fbe22edf8faf41f4fb8eed80e36c00080" + }, + { + "path": "files/docs/c9857afef4c7e7c2ad0b764277b90a2bce51adc8.md", + "sha256": "7ec923b2da49c9af0714ca6573c16c2c5077f3dac4df5cd7271835780561f15d" + }, + { + "path": "files/docs/c9fb652c433a0a0bc419cbfe4ecc3680252d2fe3.md", + "sha256": "19e217c7b88db407b2a8ae55dc1758fb04e4ce7b37d88c3da7372593c0ee1c47" + }, + { + "path": "files/docs/ca6f118dbe9a1782053fe1f5f4697dda07a7a365.md", + "sha256": "c426771b24c40033057448eca258ce71a3ecab7bb165e651fcdb9e2d7879095d" + }, + { + "path": "files/docs/caaa2e09b5b6f7ac550e936268b45d3cb7a412a1.md", + "sha256": "ff6ff06bb8b5098e5bdb7a924232de3f5192fd72eb1d74d5f71aa208a39dc216" + }, + { + "path": "files/docs/cad5f0781542a67a581819b52bb1b6b4bb9ece74.md", + "sha256": "51d5aa7b33b0b675618ef5159e0f764d3afed397f917777e4161344b3e23fa42" + }, + { + "path": "files/docs/cb130d4e1ae505ce39cbd49bf9d22359b9ec80ab.md", + "sha256": "40eb4dbbf13630d930c92e756f9c33f30241bda055621cd2e7a479ef7b3cd529" + }, + { + "path": "files/docs/cb81643be8ee3b3dc2f6bccdb77bd2cec32c8926.md", + "sha256": "cc0d03c1ef6973c7633dbb2733a9a9945f4d7990a7813c35a6732cd686eee71a" + }, + { + "path": "files/docs/cbc6bda4ec8356f2ce95dd4548406abee1ec5b76.md", + "sha256": "ec894c622365d9cd0b0cb38acdeae233db97f85bf57bdcc78c092addfa5aa028" + }, + { + "path": "files/docs/cbdd718bcee7b1ffde95191be1749d57b9a1a60d.md", + "sha256": "2e271d363ffc50f45dcfa09b03fac9a2e07066f9a13a20684594378aec71ba4c" + }, + { + "path": "files/docs/cc0adf041f1628221cac49a1baec1d497d762dc4.md", + "sha256": "8935b2210aa917137cae695dbb545eadb1c512afc2dece78c60f228d136f1be8" + }, + { + "path": "files/docs/cc60febf8e5d1907ce0ccf3868cd9e4b494aa1bf.md", + "sha256": "849c56e07785b4599b7bddf88946cf1702acfcfb5c7edb817ed926338f621121" + }, + { + "path": "files/docs/cccf5ec3e34e81e3e25ffe29317cdac2ed1c936d.md", + "sha256": "9553d04024c2307ffcf1d918fbfde34413fb71bbe4feaf790d92ad35d1ba6c2f" + }, + { + "path": "files/docs/ccdf1d5375060fcde288a920a6f3c1b48454c6db.md", + "sha256": "ec3d312b88463a7b7d1330f535a8de23de88d6b4d9f7414ab79e1d44aea1aa1e" + }, + { + "path": "files/docs/cd0745062372b6a66356728dea39ee6d8237d0de.md", + "sha256": "c520973450a93c01821d3c676e848d8b514b89b8c242119f7a3d60e14da04c61" + }, + { + "path": "files/docs/cd1c58ad8e180ab922890fa8182ff7f51c589962.md", + "sha256": "c8a1a5c5a550fe06faf74c22e52323f2e0682684f548f32da829930a60d1cd08" + }, + { + "path": "files/docs/cd27e36e95ae5324468c33cf3a112dc1611ca74c.md", + "sha256": "d6890bb7f35a762e530e00f6323ad13dc08b557ae435448df43be4cf3dd06723" + }, + { + "path": "files/docs/cda0897d49b56ee521bf16e52014da5e2e1d2710.md", + "sha256": "05b1757e9f33e65ad55610a5333383fde787cdc39ff5b63fae5d3b44e48e95e7" + }, + { + "path": "files/docs/cdf460b2bb910f74723297bcb8e940bf370c6ffd.md", + "sha256": "aa0ab3a136b0112f1804edf045cdd028a7900ddddc68eb21a8b6ac37397a0330" + }, + { + "path": "files/docs/ce13ae6812f1e2ca6ad429d4b01af25f9f398148.md", + "sha256": "5c87a30ce908984c28a516bdd44592683b826dd9ba32cb23565464e2e7338121" + }, + { + "path": "files/docs/ce14b5eff03a17683c6aa16d02f62e1ebad0d7f2.md", + "sha256": "33ebab25ee5945f26900d0886b15ffa6ecad5dbe720b3fc8f07e204fa70669fb" + }, + { + "path": "files/docs/ce1b598a354c454f2d201039a2bb6d69babbf840.md", + "sha256": "de34691e83072b53fd902198a4a02f5905a66948a6c2babb49c1a764eac33e98" + }, + { + "path": "files/docs/ce40b0cef1449476821a1ebd8d0cf339c866d16a.md", + "sha256": "ea2cdd4d6e0d858268c4ca0be4a1df19a9f283373c43a959ac82f0bfe6494150" + }, + { + "path": "files/docs/ce7976afe82e2d17ee1fa308570afa42e0e91667.md", + "sha256": "5a94e52b5189c00e7d9e2e786a96e55f12a72074c0453d238760d4b5d894b6af" + }, + { + "path": "files/docs/cebdc984a6e14e7dc6b7526324bf06a0ce6ffe34.md", + "sha256": "06dd1d0ba54833898dfd0c8bd87bd1efe01d287da5a49fe0181b41eeb83db887" + }, + { + "path": "files/docs/cee9ef1f47611f6a9c00bb76c91b94b7da2a62ff.md", + "sha256": "0f34542ef1a62ab2f47841da7b801293dbdb5ac79c439e3e19529ace48883b01" + }, + { + "path": "files/docs/cf4254ce9e6d890ccaa2564da3e9b57071ade342.md", + "sha256": "c4c533c678bf5fca4840b1cdcf8a0379418b69c75d5568c708acc92d0ddb3d4c" + }, + { + "path": "files/docs/cf6fe4e4058c24f0beb94d379fb9e820c09456d2.md", + "sha256": "e88f616094d48728e173d451d73ccb6a884ad92a41af9e30a0ebd1ad474e2e88" + }, + { + "path": "files/docs/cf88bcc09a32b2d6d65f2c2a831e2960aca1e347.md", + "sha256": "b396619156962d35172e4c08afb1c8b013b09798ce8cc50122247c3d78c071f2" + }, + { + "path": "files/docs/cfc54bb4cea29104bd4f9793b51abe558aa0250d.md", + "sha256": "04876530742215992867cc215deb3c8fb53abff9906312d8f4d3879ca21355d0" + }, + { + "path": "files/docs/d0142ffcd3063427101ccc165c5e5f2b0fa286db.md", + "sha256": "80554ed26b2d65a683fa31656cfc30d493c660f8569980170ede4b16bb399489" + }, + { + "path": "files/docs/d04178dde54f21a248daff3f1582eb4bf1e9ac43.md", + "sha256": "69b7ce963a08cc75e1daca75df3f7dab8f281fd0ddfdb78bc59b39ce86539145" + }, + { + "path": "files/docs/d05d9570cd32acccf91588c5886a1c4f5da56d01.md", + "sha256": "d9fadf988d39e035fd89b81bd2e84dac723757c39d1bd128a5a3721edc742074" + }, + { + "path": "files/docs/d05f366afc5726dc1a258edc3689067381efdecc.md", + "sha256": "dd4c4e51324138b3a43e1a4aa14f341bdd18f9e764e6851281ce5cc98877c4c6" + }, + { + "path": "files/docs/d0907278ca0ea55b0e0ed9e834810d502a817af0.md", + "sha256": "b3f5c8e3811d6d4b05261546f4275d0aa76d07313eb0267f71478b1ed5d8382d" + }, + { + "path": "files/docs/d0dece55336bc8393593243d829b9d4b1e6159fd.md", + "sha256": "0a19a3e34691798fee9898fefe96b372d5393400473186109e74a1a0922ebd25" + }, + { + "path": "files/docs/d11a81e7333f63092fcf2c047744f2f3c18c1903.md", + "sha256": "061bc835a1cf921dfdbeebb69fd1812b0ca522458636c8cf7582c717841363b4" + }, + { + "path": "files/docs/d171fcf10d8a1699fd8ac67e44053bbf6405631c.md", + "sha256": "b6ccc268b4299b652f0e8358358c9733feef5868bd02852b48d71aec6e0ecbfd" + }, + { + "path": "files/docs/d174298e1dd7898c08771488715d83fc7a7740ae.md", + "sha256": "c335c61a038ccbc46d6a6713fe60a4f26af1b58ca71d9a4ef952cca45c46302c" + }, + { + "path": "files/docs/d1908d2f2c1701d4a9ac3354e42dff295c06b40d.md", + "sha256": "274d13eddd37d828957709e6e13e54f2762a366092b831a28c174ddbd66166a2" + }, + { + "path": "files/docs/d1afa9bb4e0475a56190dc8254e004308bea484d.md", + "sha256": "61dfb818d6aa5bfb761e006416dbcc14d95e41c4d8c7a0f9c4fdcda8dafb0d3c" + }, + { + "path": "files/docs/d1b1e93ad61d2b095bf8a00e9739fcf7d1dc974c.md", + "sha256": "fe142670de3b2ab26e3e8712b9faddb3decd6ede69c822c1c99091e5e59d1656" + }, + { + "path": "files/docs/d1c3f3db7837f7c5803f52829a542f6ba8b4837d.md", + "sha256": "93a7cc2192ebf76ec7dfaa9f4ea4f9a81de9c159445ed53b2bd8d0136b754383" + }, + { + "path": "files/docs/d1cde4ff34352a6e5cdc9914fd26cf72574e2d59.md", + "sha256": "1816dcfff500c36f846b267264d1e3596936e44f50a7c2eccb236c7c90ae2b12" + }, + { + "path": "files/docs/d1db4f3b084cb401795c925f280207cbcb3d94aa.md", + "sha256": "41b92e3455d45d597860e012a5120a04dafcabdff42a6c7f8406a655093c5609" + }, + { + "path": "files/docs/d1fafa3a73f77b401f49cc641be44d61bc9c0689.md", + "sha256": "b42bfea5eb3944b87e369f5be733b8015b4994e1574f18779302f1cd6cd4b81b" + }, + { + "path": "files/docs/d1fef8c7f5be28316caa952ccc76281e6f3fe12f.md", + "sha256": "fef21128233648aef3bc97063ae94aabc7d979009c1f2520257e2ed4864a051d" + }, + { + "path": "files/docs/d21cd926ca1fe170c8c1645ca0ec65aedddb4aef.md", + "sha256": "3f26157528d28b053ccb73949ca4af08fdafc5ab75c878611824950c63cc8350" + }, + { + "path": "files/docs/d2d9f4e05cabc566b2021116ed28ef413fa96779.md", + "sha256": "5b58bc0e48ecd1c9a91d0ef12d5df1ade6d57df17380f228d12780377f90fe6a" + }, + { + "path": "files/docs/d2ea86e13b810569e718e9dca4c00da28a2e1c9a.md", + "sha256": "fd686980b8e9c8434661e1871177f768de19a7b3002c0707d99b49e3de6e5aa0" + }, + { + "path": "files/docs/d2f4f71189d7f5c92ddc2ccb38f2bce1efd4bc65.md", + "sha256": "9ed06ae583f8f2cdc51552d669a162cd7f96cbc3c8e1797604258bc3f2243d63" + }, + { + "path": "files/docs/d3084bfb07d425ebace9f538d800e08daea97594.md", + "sha256": "cca9530d1f7bf4510bc04bd1a24e53af2cfa1f48e043554e98a4f883d6ed5f2a" + }, + { + "path": "files/docs/d377da7cf67645f321593fa8b1536be2f0753333.md", + "sha256": "5f43c39fd95a2d9b879c343c6eadec7f80bd57ceaa9ced7f1d1f415fe9ba086a" + }, + { + "path": "files/docs/d43de202e6d3eee211893585616bda7eb09211c4.md", + "sha256": "3ba4625456180b185e6b9b0de09643bfc08e597e01d9b9062468e5e865f914d2" + }, + { + "path": "files/docs/d476f3e93d23f52ef1d5079343d92db793e3ad5e.md", + "sha256": "031a65c2d6f1e43b2057d731636e127f1ced7db817d0e96c97f9216177d4a62f" + }, + { + "path": "files/docs/d487db53087c5fd4cd2a25112f1f8a8e496efc72.md", + "sha256": "ee2c9ce04e03006e6baac7520bb4b031b4457188768158ab0d7490d8a4409868" + }, + { + "path": "files/docs/d51ad51e5407bf4efae5c97fe7e031db56cf8733.md", + "sha256": "3bad178dd198ae8b63c3c4b36fbca287568bb8a5a7acabe25d32a5f8465a25ba" + }, + { + "path": "files/docs/d5521b8ec8ced84a2e383b3b6d5bc20795ef87b7.md", + "sha256": "035a3b4a13575c1d648e5c973ee1ce41aa3abaa1cb1c6f66bad268e67f648764" + }, + { + "path": "files/docs/d579aba442c4652bac088173107ecfebbf4d8290.md", + "sha256": "891233181c0801641f1af885d063e90a26686ea64d83d49bde98993a283df18a" + }, + { + "path": "files/docs/d5863a9857f07023885a810210dfb819ad692ed7.md", + "sha256": "3444cf23f74733e006342fd517721134836cf98c3b2e05dffec0e950e1454341" + }, + { + "path": "files/docs/d59300b05666e072ea812effa009e2dd4b60a508.md", + "sha256": "000c228b7ab228bf0ea03abacbdaed3ba6252e368f1382772b8e8d7cf200228f" + }, + { + "path": "files/docs/d5d31fda0eebfcdd87005ed54ebedfd164fa073b.md", + "sha256": "cd2aba14eb073ca2b4136d7c170741c9558a52ded82eea3c136c0470411f470b" + }, + { + "path": "files/docs/d5d7bd00bd17efe339c848f46345f2192fda5c11.md", + "sha256": "a09c8a1dfd508999ca2c3273f2e3dd52cfcf27ec218f9d21a69a90d82fbc3014" + }, + { + "path": "files/docs/d5fafc625d1a1d0793d9521351e9b59a04af00e9.md", + "sha256": "1de21242950a659c512af6c8eee4eab1e229e9885a45ba4baaf69b58fc241fb0" + }, + { + "path": "files/docs/d64140c0b8d4187b49046528ff61a54d77a99223.md", + "sha256": "de997bb80dd49f740e4873047c0b1055282771c728952971c079dfd88269095c" + }, + { + "path": "files/docs/d669435b8d1c91d913bd24768e52644b95c675ae.md", + "sha256": "1cce16beb7c3c3db264d431c580714c319a0154a5ffef0553c8d53971270bf69" + }, + { + "path": "files/docs/d69f33671e13df29fe56579ac4654ebc54a11f12.md", + "sha256": "d565930f4fc85162ad06a856d515dca0eab3a8d21b328f5bfd725faf6f0d2429" + }, + { + "path": "files/docs/d6a347cb86df46925701892180f4d8a5b8e14508.md", + "sha256": "d06ffc42b4bfcc174ef6856658563ecd071284b0d5937f1713defddca962daa2" + }, + { + "path": "files/docs/d6db1fbf1b0a11fd3423b6f057182019496ff3f5.md", + "sha256": "6a313b0b2b10d9661c1c8278137923d42902262946b7e5e622049de0402b8695" + }, + { + "path": "files/docs/d71261b71a4cf5a1ad5e148ede7751b630060bdf.md", + "sha256": "cf82e6ca366759dde9a6699ccc3c412c071158ff8c98419b64d79c92e8ca75df" + }, + { + "path": "files/docs/d733288343a1790788e8069eb55908f9d12566a9.md", + "sha256": "0fd76ad2f4d3c5cb76ad2df5db72510a18adc6c733016a8e636fc3a57db06514" + }, + { + "path": "files/docs/d73c52b16ec33caa6d1f51effa5a6e37052d6110.md", + "sha256": "716b3e5dcdf08c9e640d321bbb43a8979a50dccbffeb957777603de64aac10e8" + }, + { + "path": "files/docs/d778df3dc8ef2d3ab4ec511b8d20d35778794b93.md", + "sha256": "beb5eae653bac42865d208f3efdebcbb692bd746262c824353a3d096f2e4f2b8" + }, + { + "path": "files/docs/d7fd91bac6be16abd9b158c6b118e5e09e047c6d.md", + "sha256": "4815a85bfaad03a98c42ec276c75df309a4d7f2b21f9879f24ebd7df3cfcbc63" + }, + { + "path": "files/docs/d83baae9c79e5df9ca904ab1886ac4826447b495.md", + "sha256": "76af8962f855e6e5a206d21d0c19b24e9e3b87d4064c8f06223ba7bae6409d7f" + }, + { + "path": "files/docs/d872c74770b5729e037e841679f741cf3d8c20ad.md", + "sha256": "716adfb87a9e253a620bea0ee924447c1f1e10b671717b229ef496747af79906" + }, + { + "path": "files/docs/d8bd7c30f776f7218860187f535c6b72d1a8dc74.md", + "sha256": "dd8fc33c666e15a14c1056261838b9e57a5dfdda31c022b8a864561e5a8d2e38" + }, + { + "path": "files/docs/d91044a492d05f87613bba485cd2fae1f54764db.md", + "sha256": "1581ee57f782ad14dd7b9dab715a9ca26673b4ac699203ebef1c2300b490f517" + }, + { + "path": "files/docs/d92a34a349cee727b017af7d40b880b232220959.md", + "sha256": "7e257f6844a33841f2a2f14f121d37309349681e78efc6f39f7532653c7ec7aa" + }, + { + "path": "files/docs/d9304450e79dc05b5ecc4fe98d48fecef76a852e.md", + "sha256": "850e0468c77891fdba2880223c253a84d99745b7659a288429b0d1b024f423b1" + }, + { + "path": "files/docs/d96c3a08a5607bdcb1bc85e0bedd8743ea0b3dc5.md", + "sha256": "9722215973587ae2dda3f2712d69d77033d4d431efa0ea27cdec3470d4cf0358" + }, + { + "path": "files/docs/d9b02a6929162af5f13e95c700ce0e548f6a9ee3.md", + "sha256": "92e41b8fe37a04dfd64d07f0d1c0ce57aaf0b9e32f2b50f073908334a81eaadd" + }, + { + "path": "files/docs/da0357b0ade596e1a23f676f76ff4304b97aef2b.md", + "sha256": "12a12c1537f52f4083cb3795385dbbf1111d790c224c809c2dc45c0692ee306d" + }, + { + "path": "files/docs/da3d295da633cd271fb3970ad2ed4b31bdcb6247.md", + "sha256": "37b1492adc3984019edc7fceb52bb07b8dcd069d88deac8af14ebe1b3df13cbd" + }, + { + "path": "files/docs/da7407d415b3eff25ca3dd588bba677cc8cd3494.md", + "sha256": "58bf938438a98b66224ed70a12adc7af3a992ea8b20e1038d0862f2c14b38e15" + }, + { + "path": "files/docs/dac8a5e350d74e41c1738f4e2a02258fecf9d20d.md", + "sha256": "fdd7555a39b0af932c1a59358dae52fe7090230d96d759982e8e6f2cd8f99ab2" + }, + { + "path": "files/docs/dad2ede59535330241f2febdf9bf99e21deb4393.md", + "sha256": "da404e15f64f12e30175e3c0a9d99d291923eb47836d43ae15458cd23405bf1d" + }, + { + "path": "files/docs/dafb63017668c5dd34a07a1850ce9e9a37d0f525.md", + "sha256": "0aff6eb0080203ea64ec69b219e12035ec3e36e69f9f5ae95c32412ea95c468e" + }, + { + "path": "files/docs/db504727c8688251caab0c18e12bde9dc625ecd1.md", + "sha256": "9eb2b4586b6edcbf1568336dd1cde5b9fa2ea4f9685883dfab0a638c3a478353" + }, + { + "path": "files/docs/dcb8fb91999d79190f3e5d54de32b1b7f1401779.md", + "sha256": "a1852578f71afedd9c69c23b779fedbe1ab3d86979bf1535887a21b1905ecc4d" + }, + { + "path": "files/docs/dce29488a4d041b77f6e9b1b514f41335fae0696.md", + "sha256": "6b7676a368bd13c87f1d66d8fbf8ef28d60623cece70c938ad72caccbea5e8c8" + }, + { + "path": "files/docs/dce39ca6c888ca6d5cf3f9b9d18d06fd3bd2dfbe.md", + "sha256": "b4fd0b71a17535e94c20e76953c78683e7b10bd23da8d2b83fc8cb842cba5fd3" + }, + { + "path": "files/docs/dd88591c39c90f2cf211c3ee3330b7e7939c3472.md", + "sha256": "42715d1fdc5b2d866737a7c6e28c5d2fb586825dae069e8422fb44f4f3efdff2" + }, + { + "path": "files/docs/de0c1913d6d770641762ed518fefe8fffc5a1f13.md", + "sha256": "5f2a5759930a0cb7f43c5f145375e759095fbc0abfafa610ef7d630d15db8117" + }, + { + "path": "files/docs/de359e77f61c11b6f759e8dfe8ea69aac3d0514a.md", + "sha256": "dedcc6039e3b7ee091838c0d84667609de71f3116bacb44e991cb2b17f3c9a0b" + }, + { + "path": "files/docs/de60e212953766b4698982b3b631d1a25a019f2e.md", + "sha256": "1cfe88e57369c3863cd87739ed17307f0322ee385ed8d740a99d5555011ef812" + }, + { + "path": "files/docs/de6c4cb72844fc59fd80fc0b26acc8c94a3ba994.md", + "sha256": "c4b59e2489473885834f56feb245fa2fa01e7e32307b310700018a3a11c9055f" + }, + { + "path": "files/docs/de79f406db76b8d50a2b8ab35d4a385983aa5f54.md", + "sha256": "dead2502db212497a78f538a67fd0a7d9ad9f9161af277d6830e6ceca822b43e" + }, + { + "path": "files/docs/de9ce5d0599d0d181890911721738ba3dee01e34.md", + "sha256": "adc91de53fcb7d2551212f47f7012349b388823140d01ea18e4ee5102072bd20" + }, + { + "path": "files/docs/deb599f49c3e459a08e8bf25304b063b50caa294.md", + "sha256": "401884e48bd1af2c3b34baab4d34155d70cb11e05ba8b804b1f3a961c77b9346" + }, + { + "path": "files/docs/decca51bacc7be33f484d36177b24c4bd0fe4cfd.md", + "sha256": "66f11bdb9cfd4f0f8f57b776b41eb66625946c61b8515ac9687d90775285ee35" + }, + { + "path": "files/docs/dedc196b72e081228279b523ba3585aed93c2370.md", + "sha256": "28da72f7bd7e74ba6d7c59de1b8e9ba5447aea3c8485377610c05013a17c93c9" + }, + { + "path": "files/docs/e008266c010adfef841c513ae7bcb91436f9ae9c.md", + "sha256": "8ebdc2524c641a06654a8fffc9576eb7596d19ff1cdd5e7e204d17eac4d30c8c" + }, + { + "path": "files/docs/e01184bcba866d676b5a236d6638e78d3f55c794.md", + "sha256": "db2a401f23d0d0cb7ac20b5c2bdb56bfca08f976d6cc296b58d6c539b341309a" + }, + { + "path": "files/docs/e01c7d12e53747c7ed71d615d7e9dcd8f17638ed.md", + "sha256": "4ae4c89d0b9dd9afd4645dbe4bcdf42f37e47ddb45a7bba7188fc6a8dacc3976" + }, + { + "path": "files/docs/e03dd29f683c4f22a7084c9ab8f1488c380170f0.md", + "sha256": "60a4cbf2a67313bc4b3c2266cee9b7d89ab1cf0825cc6134d022a377a73ab581" + }, + { + "path": "files/docs/e0b0b51cd757048207eefe4ec8f1e98e967d9e69.md", + "sha256": "2352cf727ff0cb84c32bae8b2bcf52239d90196261fa9624f8d554ae7a605843" + }, + { + "path": "files/docs/e0d36a6f5028fc5ed005e87faf9f65f976e62a37.md", + "sha256": "682a851eeaaf82457c1eb6389f91fb1bc1af49b1b60f4bac68081b596785bd18" + }, + { + "path": "files/docs/e0e5646ea00a170bb595e9e0bbccb69f702ffc7c.md", + "sha256": "cf4791d01e6e135fe5177e66d454580c17c783ab2f592c70376fa22eda8b0848" + }, + { + "path": "files/docs/e0f6fbca52d2ee44ac2e0795fa11fb53e3054c47.md", + "sha256": "51f4957f9de3073d0332db6963d03e437bf15572ccbad6d6e72c5037bfd1065b" + }, + { + "path": "files/docs/e1074d5c232cb13e3cd1fb6e832753626d2fe30e.md", + "sha256": "2ce9584ff9fb95b35be616203a3a08811036fb99e2964fc48e40cd412a8673a9" + }, + { + "path": "files/docs/e10cebbd89f23e057645097b776a51dea0c1555f.md", + "sha256": "0dfef9f57fe7aae863482e9d125735943ba3634521604f3e676c10714cbbd04d" + }, + { + "path": "files/docs/e1232c341b3f590c23e9e81ddd157bc99ff77191.md", + "sha256": "bc5b001d5cd228463dada31f5b69500a22ca5b9158893f153d8c5fe20c7f031c" + }, + { + "path": "files/docs/e14741f9a90592b67437aaed4b7042cd3dc268a8.md", + "sha256": "d2a71688441aaf2c71fa215ef608264184b1c938419b63acadc1e812a495a042" + }, + { + "path": "files/docs/e14c56a78f56157e862de99906254b291f5b3321.md", + "sha256": "e9086e93dc297589dd45cadae7abb8390bd3968d84184693da94e890c8f53d24" + }, + { + "path": "files/docs/e176531ba95036356a7e5dca50a8df728c78ce79.md", + "sha256": "a38d00d34b714e36c57c6b9f9096601b7d5489ae0880f848a4351ec56b9530bc" + }, + { + "path": "files/docs/e2089a0f2315f9897f6e3dde50e4fc3ebd2e65aa.md", + "sha256": "7eea536718e2313582e4f15ee86f48ea3f9c4519169f7d0f6a89226779f6dcfa" + }, + { + "path": "files/docs/e334a64775ae571c661cdcc847669f0e20c207ff.md", + "sha256": "c76d4efb1634b479aef485257cbd221c8aa906436be745f811714ce816a7548d" + }, + { + "path": "files/docs/e3526b694c68c40edc206e216b454e63b83f3eba.md", + "sha256": "5bfe493dcb431e3ad3621d750c606c6a0a5f3a821cc317dcceb6b2671f90987a" + }, + { + "path": "files/docs/e399a5b6fa720c6f21337792f822f20f20f98910.md", + "sha256": "39698b8112a598e7c9c50a8ebc907719f74073c632af8aad9067b12dffa6f0f9" + }, + { + "path": "files/docs/e3b9f33c36e5636808b137cfa4745e39f3b48d62.md", + "sha256": "7ce32e8736c44dd772df081bb9a735d4076f88035be606c974f7b635bf53d69d" + }, + { + "path": "files/docs/e3e5fa98908eee308d960761e9f29cf7a8aad690.md", + "sha256": "99c829d0cce19bfa35a9163cd130ae4f43a79cd1531f1f0ff561af88b674af99" + }, + { + "path": "files/docs/e3efb6106ae81db5a8b3379c3edcf86e31f95ab0.md", + "sha256": "9d668888d23334b9d5839ac4b1f3214b4e6e730f12b7acc4f58b2753a35b6064" + }, + { + "path": "files/docs/e45c894cb0df39ad55a35183d62a6cbd570076ca.md", + "sha256": "d7c0ba61b5a47bac22f5496c927d46c0d509db4af85b6446013434cc65f329b0" + }, + { + "path": "files/docs/e45eeb80195e54d02a6f6cb7505f1fb73b4d4dab.md", + "sha256": "57dde8dcb565f763c64deddd8be9fff3f233f6b3058fb9d926e6e131ffe586a6" + }, + { + "path": "files/docs/e45f37bddb38d6656992642fbea2707fe34e942a.md", + "sha256": "3e6c92e0a4a1de499b3ce814912d356ebafa7d283de92e32a9fefeb21bec01a7" + }, + { + "path": "files/docs/e4eca1e5e22f94051d1c8e115d9d874658b5697a.md", + "sha256": "fabb60451d38c7c12c47d98e42e7f9d66462280d42130131fc7d03de86eead73" + }, + { + "path": "files/docs/e54340e1ef02d2436758a56105b3182481ff1783.md", + "sha256": "2be11c6e8f2d99b38dc1f29b80249a423ef00fd0177d7d6fbb9a9db64942d7bb" + }, + { + "path": "files/docs/e5895bc081edbf0cd7340015decd0d0180aac44a.md", + "sha256": "21960b87eb9781cf40916e47652dd43d5d5414802913b70d3e1947837bd1eda4" + }, + { + "path": "files/docs/e59b59312d1eb3b2ba78d7e78993883bb3784c2b.md", + "sha256": "a2fcf4eb3e4dc7f0cceca9e8b81977ef92fd581bee03a3e1b3318c7b4aa41acd" + }, + { + "path": "files/docs/e5d702e67e93752155510b56a3b2f464e190eba2.md", + "sha256": "3f8e843820484cdafa80d98c0e5df8fab5cab14b7a97845e95cbd965285d0ef4" + }, + { + "path": "files/docs/e5e1d00dc75181ede4fc66bdc17bf3c07eb314ec.md", + "sha256": "775c999b4af714159fbf57c8598daed8c82e5e25cd41e972033b64407c65a1c4" + }, + { + "path": "files/docs/e5ea38444d60150c0fd2eb498bf33793dde5fed2.md", + "sha256": "7e39d3d293653e1e63b4358db1559d64fd101c430db1231a83393e7f5d3b9688" + }, + { + "path": "files/docs/e61658d2ba7d0d13e5a6008e28670d1b1f6cb7bb.md", + "sha256": "d1a6d8c9ecb3bb31a6b05a134388459e7fcdaa81c9a5a3ddbb7f27d7b672ab1f" + }, + { + "path": "files/docs/e64b1811e55868cf510b06bfd1a24ba4ac3008f1.md", + "sha256": "7338ec412eb7d73836dea0575b0093680a5eddaae8e6b53d1507d486e0170752" + }, + { + "path": "files/docs/e6a2ef28a33aa6a8c8b2321133a8816257cd1612.md", + "sha256": "edd9968311ee9629cf162621a7e87386a8c57d0d09d68671380c3f5de4f61d98" + }, + { + "path": "files/docs/e6a30655cbd3745acbcbf18e79b4c3979ca6b35b.md", + "sha256": "6fb15059d2f0e8607ae80c92f58667bdd19468c9d6d96a921d6da55f573a333e" + }, + { + "path": "files/docs/e6b5ead096e68a255c5526add4c828534891c090.md", + "sha256": "d54b13ca9d132e0a49b519e916ec6295fe60fe116c945c362aa32c7b299bcae2" + }, + { + "path": "files/docs/e700c898ec2efe96c76c2cac042e063529b23d3b.md", + "sha256": "ca814da89a0db83945e5a83352501ac5093c474d885d803ed55fe0b6b845ecfa" + }, + { + "path": "files/docs/e70109f320a53829d66f6e07ee0a9b79b59aee13.md", + "sha256": "f9d64cad24f65787c6ccabadead4b5cea09f6e9fa529ee992fede7cf10041599" + }, + { + "path": "files/docs/e73062f1e8466ab5604358a0ad0d66f31c81507c.md", + "sha256": "06f6b157eaa0a7a50d92e7830a9f6d293d3cea9a5d822523abbc0753096d1e19" + }, + { + "path": "files/docs/e732dfb3c4f38abecba99da31750fb6291560db5.md", + "sha256": "a89028981e20ac14655778d8e480d4d7dc3942cf063441deba3ee3c375dac081" + }, + { + "path": "files/docs/e76a86b7ee87a78fa06482285bad02694abcc3ca.md", + "sha256": "78998f13b0fb7f7f045fe00bd23facedbcfadedb701c68bbd6c6ab84d4bd85dc" + }, + { + "path": "files/docs/e777a9c7d0450d572431f168374224179c1ae7c4.md", + "sha256": "5ffcb6f4413cbea69b6dc00b5fd1237fe2f9972777b99e67db4fd2f7d8796685" + }, + { + "path": "files/docs/e778331bf398f2db0f6477ef689d0dd6a2aaa81e.md", + "sha256": "4c43944b7d128c054ce734d25cd80fb5cea675c562a5d4847db14aa090039b19" + }, + { + "path": "files/docs/e7b64045af2c3ff02183fb1ccc036327cee5e971.md", + "sha256": "9de533089bba7ed61d4cb7881605df669f7d5280f2fea4fd7f9f96cfb09f02d0" + }, + { + "path": "files/docs/e7fac7868f0d237efbfcc625d8c265aeebca3e7d.md", + "sha256": "a553260ac33f6a55ff7d3b038a742dd43e3d644c982bfb526dabb09fa67a28c9" + }, + { + "path": "files/docs/e81f1fd08e472af1516e6c6b0c936a2dca55cc20.md", + "sha256": "177cf1ebc59164a0513b69c611e14a158e8913d9b1e844e7c61388bae33ec0a7" + }, + { + "path": "files/docs/e85352e9588726771a8cd594a268eca7d04379bd.md", + "sha256": "9a93e32b5c417641ee381bc14063cd20d605e0a89261629f4c9e54680e8c30be" + }, + { + "path": "files/docs/e88edbb9a31f8b7c70fb3ba48136d9c3cd6767ac.md", + "sha256": "030a25a5a168bed09f440b950964f2e801478cc1bd187a1f73a006c7a2bdc94c" + }, + { + "path": "files/docs/e8b776685a4c1ffcdc8f90c57c3ad7243a43b2b3.md", + "sha256": "d7697b765c45be27ecd04019ca4c8e2445fec5cab52e8436f9429d2dfdacadab" + }, + { + "path": "files/docs/e933c12c1df97e13cba40bcd54e4f4b8133da10c.md", + "sha256": "7d9745b82a3356f1dbb104f1bc2ca2316ecec784c77b5491b75067786fdcc45e" + }, + { + "path": "files/docs/e990e009903e315fa6752e7e82c2634af4a425b9.md", + "sha256": "97a18e43eb7f8715c895527f5a2162a12784c18c390209cb4702a7f49cdddcdc" + }, + { + "path": "files/docs/e9e9556ca0c7b258d910bb31222a78beabb46a48.md", + "sha256": "902c4caf265180ee2889124289a07c7d1d55c03cd3cc914215ec690db676a8d3" + }, + { + "path": "files/docs/ea3e8b5797ee8a3fd8aa34ea9a1eeb6d81b6a779.md", + "sha256": "efa0d848a11e9a1f3026a1b4ef75c24e4f8c2b4e5f81563f97c7cfafb584f106" + }, + { + "path": "files/docs/ea4cb9cd97ffb8c956b4f5d28d2759c0ed832bb5.md", + "sha256": "8492eef2331bd5436b2269181e143b1114a1a77bbf368c21bc0359e37fc8ce21" + }, + { + "path": "files/docs/eaef856f725cd9a9605000f3ae98cbe61a9f50f0.md", + "sha256": "55ccf7fa3b80931d51a6675914297e8c035e66e7999d58ffd86f137aae573389" + }, + { + "path": "files/docs/eba93b500af79fe9bc96ff2ffc71078766532a86.md", + "sha256": "2e8b02b0aa22a7e3a0041707333d82c187d3f478400577f6526e5c77ad7c9845" + }, + { + "path": "files/docs/ebb83f528ac02840efe18510ed95979d2cda5641.md", + "sha256": "942439b679272a1abdee765bb1381b911bf453e24835c3f61d0c6e302d5ab27f" + }, + { + "path": "files/docs/ec03e18490e47db0efbd6a00bda7ddb85b0a14d7.md", + "sha256": "bfadc9b02326d41fce1428ffd6e9b08618f73debcf5cc3940b376d8c3078f070" + }, + { + "path": "files/docs/ec10ac085ba8a12ba0d8af2dc66adfbe759b3183.md", + "sha256": "2fc7077629626bf65456ef3531d08e75b221129a779a1ff7730c771f89a0cd67" + }, + { + "path": "files/docs/ec154ae6f7fe894644424bfa90c6ca31e13a4b71.md", + "sha256": "ec178fa98a9587d65b2243dcf8c836631bfcfed58142b7173b9d86c77732289a" + }, + { + "path": "files/docs/ec284ab3dc23241975f76e0519b531407042aef1.md", + "sha256": "cb63a218e6ca18f43efe5013c784d00a3260cfcc9aa85684ce7a7e0196979cab" + }, + { + "path": "files/docs/ec433541f7f0c2dc7620ff10cf44884f96ef7aa5.md", + "sha256": "df3223859a75937cb17d78fc9c29ca99141f4ba4977bc7cd3dcc0198acfa02e7" + }, + { + "path": "files/docs/ec7fcf477e212945eab7bb85c2279f37d62d4b49.md", + "sha256": "8562f167ffa0c348383bf4e8d9c872ac28882a23b766b0eded45a385a850a48f" + }, + { + "path": "files/docs/ed7afe85422b1db8eaed166840d275dddb63cafa.md", + "sha256": "91ee3397c5d3e311e68d57409f0133ee9818f3df0e020bc7190a4f167cd5e0e0" + }, + { + "path": "files/docs/edb1038f1d71a450556d13ae34a416e46d7213fe.md", + "sha256": "db5438ad0438d09548f7f9c4678c12acf26e86283ac6043116168d5eaabc9291" + }, + { + "path": "files/docs/ee838ea978f9a0b0265a8d2b35ff2f64d00a1738.md", + "sha256": "5194158fcab0f98fa0c99265b990da75fc64e2280bea6dd8c55edf99ecfc2ae3" + }, + { + "path": "files/docs/eec0eb0502def7b7adb112f8d7d4c38e1f6d9170.md", + "sha256": "a8f4740969cdfb4fc4d79f9396b1978dceaaad44b34195d7c644c7e527b4b494" + }, + { + "path": "files/docs/eed64f79ebfdd957deebec6261b3a70a248f3d35.md", + "sha256": "856fd187ba74a70260a537269333a659fa546ca9189da952ac9079686586e90f" + }, + { + "path": "files/docs/eed66538a3e4854d56210ab1d6ac49016f1e40a2.md", + "sha256": "827bd7d6a0edc11c38e80a8c8cf89e8ff2d8d7a5b3ad5dcafad1b2a1c38fc47e" + }, + { + "path": "files/docs/eee6714a8cf20e18ea398651b41e0278071ee42b.md", + "sha256": "a9996f27f9078a49f75a3256822bec5b797b9b8d3dee2fa3df266080b7b8f153" + }, + { + "path": "files/docs/eef0f3c3dc121f5c389e547bd20f2aa807074028.md", + "sha256": "328fbe24510853c836296abe6eafda560761710af3d1696674cf390b43c234c2" + }, + { + "path": "files/docs/efae4449ceb6f88aa4545f33bd886ec3080171b4.md", + "sha256": "0569e1691d0273eb2b4e105f44f4d4aba0ca817a26ebab5aa402012d39332715" + }, + { + "path": "files/docs/efd36f1bf92225311b684d6aa0d05a597f00d707.md", + "sha256": "ca8ae6c81ba13357546229b932ec13126304547600ff1ad6a299d6aa1abd1264" + }, + { + "path": "files/docs/effb546fc8c21e2c0e9bb87b259bd34b91d4f0dd.md", + "sha256": "5e6f083f36b20586ad96ebde04e5b15063528cbd1e55164ded3e293f72a1e38e" + }, + { + "path": "files/docs/f003581774d3028ef53e61a002c20a6d36ba8e00.md", + "sha256": "ab05824e4a68b105e84e5b92bdc414404d3191f32c3b3ac9a8e9cf0065e6b72d" + }, + { + "path": "files/docs/f05134c8c952a7585b82a042b14bcf1234af9329.md", + "sha256": "73bcb2c750e940f544c05a51ed50e9899c94599807597462dce80d558a4bbe4c" + }, + { + "path": "files/docs/f0b03ce62e6dc8ac7598a8b8316c4bf8cea132d5.md", + "sha256": "a234436c3b621e9a2d80d30753d109fe18c1f09e1325f1fda69e7bbd09a3ebb7" + }, + { + "path": "files/docs/f0db4483c93a5d14dbf8076c4dd42d22a4f8542d.md", + "sha256": "332f33a8629f568bfa7746bc3df69b7609699e0f668dac8f77a20f2d3d3f6639" + }, + { + "path": "files/docs/f0ef147dbc0554f53b331e7b6d5715d0269ffba8.md", + "sha256": "f3acbe4b2f300774887c05c4711b93c5e932221db8ce652423ac33a37362ed30" + }, + { + "path": "files/docs/f127eff442d2c1d1a1ea01b23e8135b502ef2e79.md", + "sha256": "2438d96df18ab2bda42f4e4a55cce9b2d697f175e91fa6b6e27378b85225bdec" + }, + { + "path": "files/docs/f140f179614d126e483732933a5ca8dcf0a32876.md", + "sha256": "d7ed1f9e13aa3e59ebcdf2c1e9b1d6941242f239a43987fbaa01efbccff18f25" + }, + { + "path": "files/docs/f161a94239c1dc6696dbb583ec46bc64f3aa8906.md", + "sha256": "d864c4730b69f54535ac81f8399a5c04c5428f4bdaee00ddc7082c7590c495ed" + }, + { + "path": "files/docs/f1b21b1232720492424bb07cd73c93df2b9cd229.md", + "sha256": "d124a67e3a19cfdaba9008419e2b0b3410ed384b6c90c4b38f74dccf5e68c618" + }, + { + "path": "files/docs/f1cdb96ad5a56206f662bb3025b93f6d5820242b.md", + "sha256": "751bdf181352833b0c949d5c6a6c5a8960c5f9e4f435050773bf0079bcf52ab3" + }, + { + "path": "files/docs/f24c445f7ab9052a92e411b826c60dee2df78448.md", + "sha256": "106cd0c826a6dd7ef54b5d08888e22182434fbbaef17bf57630fd3fe69d8396c" + }, + { + "path": "files/docs/f290d0c61b4a664e303de559bbc559015fd375f9.md", + "sha256": "42544f11f18a4c0b0a1022baadeb6f6e8567c7c50f8abe272ad6abfdd5ab7a94" + }, + { + "path": "files/docs/f2d3c76d5eabbbf72a0314f29374527c8339591a.md", + "sha256": "5a168cdb40010121217074916a7009a51a03d0311dad5efdf28262e9f40b57ed" + }, + { + "path": "files/docs/f30cf59adffcbe4164483b5a63260724a1dfc7ca.md", + "sha256": "a3b5c16563f4134f1c63fd4a78cb0e2cc0fae9d82f9c3bf9bdfc7257985c705c" + }, + { + "path": "files/docs/f31a520a8c2c1b9c7f80b14ebcd096bb1121d53d.md", + "sha256": "14fd28e70f90785b73c03e8d489d740826bf91d66015d9a1af2829d76541fec1" + }, + { + "path": "files/docs/f37bd72c28f0dac8d9478eceaba4f077abcde0c9.md", + "sha256": "42d8987f1e3f71313d34d654964af126178f291d5a30aaa4edc6b4bda36a4f5b" + }, + { + "path": "files/docs/f3ba8ccb1e55bb6535944cb5acdb19efaeb1c3f9.md", + "sha256": "4caebada87f3946a4f0638c04a9f0c1bfda9753ddabfe08b914d69a5d5e6299a" + }, + { + "path": "files/docs/f3c0ad81bbf56463510440f7f81eb146a6c0015c.md", + "sha256": "91211a570d455253b77af8cfacf517dc585e2681c3c4eee43d868580b56f4222" + }, + { + "path": "files/docs/f3dd7962cb3aa07c8c469ede0c7852993ac3f290.md", + "sha256": "62efec55fa4b90ba8a24a9ff9e7d6ab0a627eb6f50a932dc13f5d8de96ee4e01" + }, + { + "path": "files/docs/f43870b5b6ce4d191950fdaae6aafc36f05360c9.md", + "sha256": "bd815ba9cfa06c38f644393b39dda0e9a0ad01731ba549165bb1c8ac0129583c" + }, + { + "path": "files/docs/f495f5206c908fb1a31f18a8ab3ce9465164564c.md", + "sha256": "fe13eb448ca5043a25691c25fd28ebdcd82e4cedb8ac9c46577a9f3aa838638d" + }, + { + "path": "files/docs/f4a482326d45dc729eb8d1a6735cefacd7ae5578.md", + "sha256": "c71b724354f3509948843e3bdd6f196f23ad9f957d5460bebac8e6efcacba70d" + }, + { + "path": "files/docs/f4f623d5a7c8913e227e962bd1f347b36aab7b51.md", + "sha256": "2200d0847c5050ab85c56ba6ae99be92fe3c9a06b29ecb308e58477e88800a9e" + }, + { + "path": "files/docs/f5086d0b6258fef503cb3219f427ffbff73135e1.md", + "sha256": "861d5f1a7cf3ee930f3e6f3ff3203fce95bf92e6b17e55677a3f991cf8ffbc19" + }, + { + "path": "files/docs/f585df82f7a94309af9fb51196f188b4fa212118.md", + "sha256": "9d0b18e65d649d5e470d48790f19ede0768cc452dc918e8a77bcc1493e864901" + }, + { + "path": "files/docs/f5a6d2ae83a7989e17704e69f0a640368c676594.md", + "sha256": "c040764cae1b2679bbf7d6e6ce5af678d671ad815883aa4495754be0ccecf59b" + }, + { + "path": "files/docs/f5af4bcc2d0168d2698beb2a858c24f81a476610.md", + "sha256": "17bb2c1862b153bddc4931618a5b6a0e7a6623c863adf81e437a63d487edcaf4" + }, + { + "path": "files/docs/f64414c7f435b4b5e5a681a5f561c07780037836.md", + "sha256": "ca3c7fa0114c5966b7241d0721e4d8b35ce9a785cf614532175c33a658b5db7d" + }, + { + "path": "files/docs/f650943069620aa0bd7652df1abdce2c076de464.md", + "sha256": "0c8600825f059f7549143b8bbe3bff16e06b961ae4b084166f017cca4af68a4e" + }, + { + "path": "files/docs/f6670b3b49f00e4ee1f44e8b1c09e24afedd2529.md", + "sha256": "d147d4e2189a0e969615bdb4731fc716e949aeb0eb6220a927482f4ee209bee5" + }, + { + "path": "files/docs/f67e458a29cf154c33221a8889789241725fe5c7.md", + "sha256": "f808887b3af5d9ede6a4a22b3c558d94cbc5306b2844f52df94324e727188b57" + }, + { + "path": "files/docs/f6cc81e55c6aad12849a56837f14538576f5a42c.md", + "sha256": "cdce6f05106c771780ca27515a085b9526f63f7b29dd71ab5e9b624dac65812c" + }, + { + "path": "files/docs/f7b2dd759b6fc618d53ad49053c24ef8d35105c5.md", + "sha256": "53548275d54ec567ba131d859d13f3fd3526749d61119281fb5f87376b0679ba" + }, + { + "path": "files/docs/f7d94e6cd13f36eb9b1fe7653c436dc5745250b1.md", + "sha256": "ca805b0a7599fea965d66e938f7a6e18542082d49b29fbb5328c602cb9cc6e4e" + }, + { + "path": "files/docs/f7d95a9fcca49861b0d4b7dce677d4e6eff1f7c1.md", + "sha256": "7d91dfa8ada916bbff0c2ddaa939536c502a00617f78d8cc875b6a529671cfaa" + }, + { + "path": "files/docs/f7e8527824e15b4194a3fd12ceee049f910016db.md", + "sha256": "e2dcaed701148fb6b32f6d9cc8b94206ea96d9225c66d497dd1400eefa6d0e14" + }, + { + "path": "files/docs/f8026e82645eb65bd5e2741bc4df0e63da748b47.md", + "sha256": "5100317e6bcc9b4dea22d68a4e5d9ca8ed06ce009354b1ac50eacfbe8c9d72b2" + }, + { + "path": "files/docs/f837935a2fefed20e2cac93656e376f9868cc515.md", + "sha256": "8853c18996a9cd5e808bb289355651a1731e8f5fd0b209dc0d5e30376ed957bf" + }, + { + "path": "files/docs/f837e34ed0ad4739783010d9ffd3684c37fd465c.md", + "sha256": "a25b7441e6e6d976b86afc574755c21666d554c1c058ae82f80a0beb4a448568" + }, + { + "path": "files/docs/f839cd35991df790f17239c9c63bfcae701f3d65.md", + "sha256": "d5b016fa8740d4f82aa11f84aa72d04c0ad7a2f654f2a118e42a1bcc0839460d" + }, + { + "path": "files/docs/f870af12bc30438b0dab4ff5365b5279f2f9a93a.md", + "sha256": "da6a17197584ea929557141ec0299225cdc6f7b4abd6fe9998bb2fc0e52e1bfd" + }, + { + "path": "files/docs/f8e12f246225210b8c984d447b3e15867d2e8869.md", + "sha256": "c8f0fd7f5de74350461fb43a3946fc19db4b9522dd2aed93a85298b38c9cc08f" + }, + { + "path": "files/docs/f8ebee6125bee635dd8af7bf2f6340d58ce99958.md", + "sha256": "087438c7c9b77375e86e7446bdf51990b3365ed365120cc0b5044216b2dac617" + }, + { + "path": "files/docs/f908a5f1d788e2597335215a464817436a3d3ed1.md", + "sha256": "14b9541a90fbce85ea4c867da85319b6ad6da30d5a91e153ce20a74f4a14ccc0" + }, + { + "path": "files/docs/f964efda57733a3b39890b30ff22bd5c47eed893.md", + "sha256": "cfa1f4bd692ca9dae7382d3b23c6f1e072f4adfecd63860d95f7e6c29e891c77" + }, + { + "path": "files/docs/f965be0f67b8b3c26be38939a33fa8ab74aea4cc.md", + "sha256": "248e7b324b003847095f2f27c0c848f436060581ebaa96d7747a3d72a02cc01c" + }, + { + "path": "files/docs/f975b9964d088181cf34a1341083bc82053812d8.md", + "sha256": "ab7410926d25034a02813128ed04a1485cbb494aa0bf5e44f880a59f2998684d" + }, + { + "path": "files/docs/f976e639bde8a2b880e46d94f4c832b6ed9a9303.md", + "sha256": "0ca862d792299e126dbc41dbe100a35ce066a687b8da54323f671c919696c685" + }, + { + "path": "files/docs/fa15a8a5795baec1d8933a768407294110203e03.md", + "sha256": "8ffc4b0aa2eabcc90f47b6875b33ab9c77762342e2530b8d329e5a565f26df2c" + }, + { + "path": "files/docs/fa4acdc5db590992630c704d00defb142f2f0489.md", + "sha256": "a143b2a48c57287cae4fd27fac9c892a0374c5ec3161cfbf81149c11fc3e2e51" + }, + { + "path": "files/docs/fae139f839dab4c6eb794d689dacceff869c718f.md", + "sha256": "4b2115f09048a226ab0a532318455a992026618d292ea0fbdc24635bdc217867" + }, + { + "path": "files/docs/fb7f7b9a220c66f7e3407ca9553d974cd4a14402.md", + "sha256": "dcb10d6699d1e1fc79af9b5a54d7ade8176efd7d346e25a1bf9b8afae042ddfd" + }, + { + "path": "files/docs/fb9d913b400e9f00e6aa6eff7a7c8a84f5762dc9.md", + "sha256": "6b8c0e6ab96df97632ec359b671acdad8f53c5d5fd7bd87f882ea78729fcd72e" + }, + { + "path": "files/docs/fbc3c5f81d060cd996489b772abac886f12130a3.md", + "sha256": "8c63b53d3cda97f32bede4298638cac7e1d9a7e22b7d770513b92ada99db044b" + }, + { + "path": "files/docs/fbd84cb5a6901ddaf7412396f4c6cc190e1b7328.md", + "sha256": "eb28cb5c7c68bde5fa4813d6af3cbf8fba71d4091e75ab41338afaf8b060d613" + }, + { + "path": "files/docs/fc8006009802ae14770be53062787d8a392b0070.md", + "sha256": "b9924e81f41b376dfc127c98d9b1a3b8e5e15dc75292193eab62a363f1aad547" + }, + { + "path": "files/docs/fc8dbf139a485e98914cbb73b8ba684b283ae983.md", + "sha256": "0ac34f74a5adb0af60f041206d072b11dddc66697fc5c779952c0ab88bfa3a04" + }, + { + "path": "files/docs/fcbdbfd3e4bebefe552fad012509948faba34b44.md", + "sha256": "88701b8dfe1007a5eb2a238e78ba2e05fc1ecf8cba4a08ceadda2d74c42681e0" + }, + { + "path": "files/docs/fd0ba49bf07fcc9caf384a50b3012f98e4f1d81e.md", + "sha256": "5cc19a41656095a650b064b509079ab47e288293f8b56cd225b2f31526dae2a6" + }, + { + "path": "files/docs/fd32e17ff88251cdfc3fa01a1ad8eebda98eda06.md", + "sha256": "7112b0894645dd7944caad9eabfd515d548ccd7dda03faa39df2c26987592735" + }, + { + "path": "files/docs/fd3b0e405075464c05c52e5bb0c414a870b06334.md", + "sha256": "6e8807fe8f950b34d480a164b76f5635980fed9af0e326c07413eebb968258aa" + }, + { + "path": "files/docs/fd45693344e2b3cc3bdb7d1aa209ad9fbacb5309.md", + "sha256": "7cc56b7eec347547950042667626dfde8d66c5e2d53e5a7f040aec94419a77e5" + }, + { + "path": "files/docs/fd48879c34d316981b4f67c2b82c8179e0042f74.md", + "sha256": "a9f6df66b95896bc6ff76daea600933779733f1a7088264f64d019575bc01aa3" + }, + { + "path": "files/docs/fd903f9a58632df14be5c98eeda32e1fc2f46f4b.md", + "sha256": "b18d00e2d7bf099deedd8c3c584f41f245af7b6a0307dcc5eb67907f3e247f1d" + }, + { + "path": "files/docs/fd94481e337829121072f5e46cc39b6290e43b44.md", + "sha256": "b36ffc4933331b5593aba68130b60dc70d27f830e760847ed4dc59b32bade273" + }, + { + "path": "files/docs/fe207218ce0d1148aa57d10ed8848cd7e6ffd87e.md", + "sha256": "90980189b40095019bd9536132f3c9aed69906859b2f45d795a61bfb2965128d" + }, + { + "path": "files/docs/fe2254205e6dd1ee2a4ec62036ab86bc5e084f5d.md", + "sha256": "aab8ee11a93947f33bc5c88c43abec955ff04a62cd3cc82fb9906d7288f6a097" + }, + { + "path": "files/docs/fe88457ca86ffe3be30873156a7a0a4fd12975af.md", + "sha256": "65e6fe5ffd5af668c1054a7ea3af089274d5b7f3f36038f902f7eb9007fb247e" + }, + { + "path": "files/docs/fe9ff9f5cc449798c00d008182f55bdaa91e546c.md", + "sha256": "333211e4814ee9ff1e3c8e2a287adbb9e1029c3f96005233f890221cb9c93243" + }, + { + "path": "files/docs/fecb1c7b603627e1cf1386ad0ebdfe57fa485f93.md", + "sha256": "d86f63d01d5abd2c21bf935f53e1f1bc56d6ad0dff6fa73270e52bae1e09f4f5" + }, + { + "path": "files/docs/ff69e780bd8feceaf7a0add24c159679f7359f81.md", + "sha256": "18186a069bc4575ae6bfccbf8259cb756cc25f40c7b9bc10c2a8d729125268e9" + }, + { + "path": "files/docs/ff6c435adbd62de03c06ce4f90343d3cd04f9e8f.md", + "sha256": "df8e0cfd82b2a89985b20e9372a88746f16f56425b6e86ff3eef59913f4d3d8b" + }, + { + "path": "questions.jsonl", + "sha256": "25e08797791311dba61ecc5f29065090c64fe0ad8099b3bf56bb95a3c90893f8" + } + ] + }, + { + "id": "cloudflare-state-structural-v1", + "path": "indexes/cloudflare-state-structural-v1", + "target": "indexes/cloudflare-state-structural-v1", + "files": [ + { + "path": "chunks.jsonl", + "sha256": "11960c4f72360fdb4dd7fea1f43fbec4dd36a9214e3256bdcffc36ad3aee1f41" + }, + { + "path": "embeddings.npz", + "sha256": "c944c09db6e42fbdac3ec3e25dc74c6e6ea8b23802d612705ec6be512fa29604" + }, + { + "path": "manifest.json", + "sha256": "9aac05686ba51fa09b0c579e6b03238ffc4c572097695f208452ea97fdeb091e" + } + ] + }, + { + "id": "cloudflare-state-fixed-v1", + "path": "indexes/cloudflare-state-fixed-v1", + "target": "indexes/cloudflare-state-fixed-v1", + "files": [ + { + "path": "chunks.jsonl", + "sha256": "7c557719593ca6faa4e5347c2798d375862b056cc5f9cbe16043376a080f907e" + }, + { + "path": "embeddings.npz", + "sha256": "4f81ab8993e7c65c8804c62d8c074d9290d043cf2af701bbced145215ff742cd" + }, + { + "path": "manifest.json", + "sha256": "a8343a4418d1c7ba71e799b6253e8624f0a76374797912b0f0e50dc7c715fff4" + } + ] + }, + { + "id": "cloudflare-state-coordination-v1", + "path": "lessons/cloudflare-state-coordination-v1", + "target": "lessons/cloudflare-state-coordination-v1", + "files": [ + { + "path": "cloudflare-do-coordinator-v1.json", + "sha256": "68ca2c8cc79c476f4669feefb782bfdab377c6025506bcaecde83def3f4be922" + }, + { + "path": "cloudflare-kv-r2-choice-v1.json", + "sha256": "6e0843fa17cbf5f41153f416409fb174485ddd3be6d058d9a1a632a2fd164fec" + }, + { + "path": "cloudflare-queues-retries-v1.json", + "sha256": "b99003a1923c8324fc1d35b0ec61b324d588c505a02036001956a669619b3a63" + }, + { + "path": "cloudflare-workflows-resume-v1.json", + "sha256": "61608dbbc8bcf14c698e7b70d2fe503ac4ab132791f5ad55f28a18407984f975" + }, + { + "path": "manifest.json", + "sha256": "8be7bbf70be0aed5d7224a21c5da89217a95dbdf122b71659b78bce39abe2854" + } + ] + } + ] +} \ No newline at end of file diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 1dac7a3..3a27e85 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -5,9 +5,11 @@ set -eu # images use the mounted data volume so an explicit user download survives a # container recreation. if [ "${LAB_IMAGE_VARIANT:-full}" = "slim" ]; then - export SENTENCE_TRANSFORMERS_HOME=/data/models + export HF_HOME=/data/models + export HF_HUB_CACHE=/data/models/hub else - export SENTENCE_TRANSFORMERS_HOME=/opt/tiny-rag-models + export HF_HOME=/opt/tiny-rag-models + export HF_HUB_CACHE=/opt/tiny-rag-models/hub fi exec "$@" diff --git a/docs/phases/README.md b/docs/phases/README.md index bc847a6..3ba22e3 100644 --- a/docs/phases/README.md +++ b/docs/phases/README.md @@ -16,6 +16,7 @@ root documentation. | Phase | Delivered focus | Record | |---|---|---| +| 3.4 | Interactive retrieval mechanics | [record](phase-3.4-interactive-retrieval.md) | | 3.3 | Local bilingual Learning Guides docsite | [record](phase-3.3-local-learning-docsite.md) | | 3.2 | Real-corpus guided learning | [record](phase-3.2-real-corpus-guided-learning.md) | | 3.0 | Local visual RAG lab | [record](phase-3.0-local-visual-rag-lab.md) | diff --git a/docs/phases/phase-3.4-content-manifest.md b/docs/phases/phase-3.4-content-manifest.md new file mode 100644 index 0000000..85c7009 --- /dev/null +++ b/docs/phases/phase-3.4-content-manifest.md @@ -0,0 +1,75 @@ +# Phase 3.4 Curated Retrieval Content Manifest + +**Status:** Active content contract — owner accepted and independent +architecture review signed off 2026-07-16. + +## Dataset Contract + +- Corpus: bundled Cloudflare technical documentation selected in Phase 3.2. +- Index: bundled `cloudflare-state-structural-v1` NumPy index. +- Language: questions and source artifacts remain English; surrounding Studio + teaching copy is English/Simplified Chinese. +- Size: exactly 16 reviewed questions, four per teaching category. +- Gold paths refer to corpus-relative Markdown documents and may contain more + than one relevant document when the question intentionally crosses concepts. +- Expected observations guide lesson copy and regression assertions. They do + not encode a permanent claim that one retrieval strategy always wins. + +## Lexical Search + +| ID | Question | Gold path(s) | Teaching purpose | Expected observation | +|---|---|---|---|---| +| `cf-lex-block-concurrency` | What does `blockConcurrencyWhile` prevent during Durable Object initialization? | `durable-objects/api/state.md` | Inspect how an exact API identifier becomes tokens and contributes to BM25. | Exact terms strongly identify the state API document; punctuation/token boundaries remain visible. | +| `cf-lex-batch-limits` | How do `max_batch_size` and `max_batch_timeout` trigger queue batch delivery? | `queues/configuration/batching-retries.md` | Compare two rare configuration terms and their individual BM25 contributions. | Both identifiers concentrate lexical evidence in the batching-and-retries document. | +| `cf-lex-retry-limit` | What does `max_retries` control for a queue consumer, and what happens after the limit? | `queues/configuration/batching-retries.md` | Connect an exact option to surrounding retry and dead-letter behavior. | The identifier contributes strongly while common explanatory words contribute less. | +| `cf-lex-alarm-method` | What does `setAlarm` schedule for a Durable Object? | `durable-objects/api/alarms.md` | Expose the strengths and limitations of the lab's intentionally simple tokenizer. | The explanation makes casing/backtick/token-boundary effects understandable instead of hiding a miss. | + +## Dense Retrieval + +| ID | Question | Gold path(s) | Teaching purpose | Expected observation | +|---|---|---|---|---| +| `cf-dense-kv-cache` | How does Workers KV trade immediate global updates for fast repeated reads? | `kv/concepts/how-kv-works.md` | Retrieve a paraphrase of the consistency/cache tradeoff without relying on exact wording. | Semantic similarity ranks the KV concepts document near the top. | +| `cf-dense-delivery-safety` | Why should a queue consumer make repeated message processing safe? | `queues/reference/delivery-guarantees.md` | Connect “safe repeated processing” with idempotency and at-least-once delivery. | Dense retrieval bridges the learner's paraphrase to the delivery-guarantee terminology. | +| `cf-dense-stale-edge` | Why can a key-value update be visible nearby but delayed elsewhere? | `kv/concepts/how-kv-works.md` | Inspect a natural-language description of eventual global propagation. | The relevant KV document ranks highly despite few product-specific tokens. | +| `cf-dense-workflow-recovery` | How can a long-running multi-step process pause and recover after failures? | `workflows/build/sleeping-and-retrying.md`; `workflows/build/rules-of-workflows.md` | Show semantic retrieval across two complementary workflow documents. | Both sleep/retry and durable-execution evidence should appear in the candidate set. | + +## Hybrid Retrieval + +| ID | Question | Gold path(s) | Teaching purpose | Expected observation | +|---|---|---|---|---| +| `cf-hybrid-r2-properties` | How do R2 consistency and durability differ? | `r2/reference/consistency.md`; `r2/reference/durability.md` | Combine exact R2 vocabulary with semantically related durability language. | Dense and BM25 favor different relevant documents; RRF retains evidence from both. | +| `cf-hybrid-queue-policy` | How should retry limits, dead-letter handling, and at-least-once delivery shape a queue consumer? | `queues/configuration/batching-retries.md`; `queues/reference/delivery-guarantees.md` | Join configuration terms with a broader reliability concept. | Each retriever contributes complementary queue evidence to the fused list. | +| `cf-hybrid-workflow-state` | How can durable steps sleep, retry, and preserve progress without relying on memory? | `workflows/build/sleeping-and-retrying.md`; `workflows/build/rules-of-workflows.md` | Mix exact workflow actions with a semantic durability requirement. | BM25 and dense surface complementary gold paths and their RRF contributions are inspectable. | +| `cf-hybrid-storage-choice` | When do KV caching semantics suit configuration while R2 consistency suits updates that must become globally visible immediately? | `kv/concepts/how-kv-works.md`; `r2/reference/consistency.md` | Compare concepts across two storage products in one query. | The fused list preserves relevant KV and R2 evidence that is split across source rankings. | + +## Reranking + +| ID | Question | Gold path(s) | Teaching purpose | Expected observation | +|---|---|---|---|---| +| `cf-rerank-named-stub` | What does `getByName` return for a Durable Object namespace? | `durable-objects/best-practices/create-durable-object-stubs-and-send-requests.md` | Observe a precise API answer move within a broader hybrid candidate pool. | The cross-encoder promotes the create-stubs document toward the final top results. | +| `cf-rerank-alarm-without-request` | How can a stateful coordinator schedule work even if no new request arrives? | `durable-objects/api/alarms.md` | Rerank a semantic alarm description that first-stage retrieval scatters. | The alarm document moves substantially upward from the hybrid candidate pool. | +| `cf-rerank-exhausted-delivery` | What happens to queue messages after they exhaust delivery attempts? | `queues/configuration/batching-retries.md` | Separate the final retry/dead-letter answer from generally related queue documents. | Reranking promotes the batching-and-retries evidence to or near first place. | +| `cf-rerank-workflow-sleep` | What do `step.sleep` and `step.sleepUntil` do in a Workflow? | `workflows/build/sleeping-and-retrying.md` | Compare first-stage lexical/semantic relevance with cross-encoder query-passage relevance. | The sleeping-and-retrying document moves to the first position or remains the strongest final evidence. | + +## Preset Comparison Contract + +All 16 questions participate in every browser evaluation preset. Category +labels are teaching annotations used to group results; they do not restrict a +question to one retriever. + +| Preset | Configuration A | Configuration B | Primary lesson | +|---|---|---|---| +| BM25 vs Dense | BM25, top 5, no reranker | Dense, top 5, no reranker | Exact-token evidence versus semantic similarity. | +| Dense vs Hybrid | Dense, top 5, no reranker | Hybrid, top 5, no reranker | Whether lexical and semantic signals complement one another. | +| Hybrid vs Hybrid + cross-encoder | Hybrid, top 5, no reranker | Hybrid candidate depth 20, cross-encoder, final top 5 | Candidate generation versus final relevance ordering. | + +## Content Acceptance Checks + +1. Every stable question ID is unique and all gold paths exist in the pinned + bundled corpus. +2. Each category contains exactly four questions and the evaluation set totals + 16. +3. The default cached embedding and cross-encoder models can reproduce the + stated observations within deliberately non-brittle rank assertions. +4. Lesson text distinguishes an expected insight from a guaranteed model win. +5. Seed generation preserves the exact reviewed wording and gold paths. diff --git a/docs/phases/phase-3.4-interactive-retrieval.md b/docs/phases/phase-3.4-interactive-retrieval.md new file mode 100644 index 0000000..179af7c --- /dev/null +++ b/docs/phases/phase-3.4-interactive-retrieval.md @@ -0,0 +1,339 @@ +# Phase 3.4: Interactive Retrieval Mechanics + +**Status:** Complete — owner preview accepted and independent final review +signed off 2026-07-17 in the [taskboard](phase-3.4-taskboard.md). + +## Goal + +Turn the retrieval half of RAG into a live, inspectable course inside the +Studio. Learners should be able to move from lexical matching through dense +similarity, vector-database storage, hybrid fusion, reranking, and browser-side +evaluation without treating any library or database as a black box. + +This phase adds a dedicated **Retrieval** / **检索** area. It complements the +existing end-to-end lessons and Explore workflow rather than replacing them: + +- **Learn** keeps the four guided, saved RAG replays. +- **Retrieval** teaches retrieval mechanics through live experiments over a + reviewed Cloudflare question set. +- **Explore** remains the free-question end-to-end workspace and gains an + optional reranking control. + +No LLM provider is required for the Retrieval area. + +## Product Principles + +- Show the calculation before the abstraction: tokens, term contributions, + vector values, cosine similarity, reciprocal-rank fusion, and rank movement + remain visible. +- Use real retrieval results from the bundled Cloudflare corpus. Do not add + simulated or saved retrieval replays. +- Keep NumPy/local-file retrieval as the canonical teaching path. Qdrant is a + substantial comparison module, not a mandatory dependency or a replacement + for inspectable local mechanics. +- Use curated questions to teach a concept intentionally. Keep unrestricted + questions in Explore. +- Prefer small typed contracts and project-owned calculations over framework + orchestration. + +## User Journey + +The Studio navigation becomes: + +1. Home +2. Learn +3. Retrieval +4. Explore +5. Build & Inspect +6. Failure Lab +7. Settings + +Retrieval opens on Lexical Search. All six modules remain directly selectable; +the order is a recommended learning path, not a lock: + +1. **Lexical Search** — query tokens, matching terms, document frequencies, + BM25 components, per-term contributions, and final scores. +2. **Dense Retrieval** — query/chunk vector previews, norms, dot products, + cosine similarity, and final ordering. +3. **From local vectors to a vector database** — the same stored vectors and + queries through NumPy and optional Qdrant, including payloads and filters. +4. **Hybrid Retrieval** — dense and BM25 ranks, reciprocal-rank-fusion + contributions, and fused ordering. +5. **Reranking** — a larger first-stage candidate pool, cross-encoder scores, + rank movement, dropped candidates, and the final top-k. +6. **Evaluation** — two editable retrieval configurations compared across the + 16-question reviewed browser set with aggregate and per-question evidence. + +Module completion may be remembered for the current browser session only. It +must not become a new persisted learning-progress system. + +## Curated Content Contract + +The exact Phase 3.4 question set is defined in +[phase-3.4-content-manifest.md](phase-3.4-content-manifest.md). + +- Exactly 16 English questions ship in the versioned seed asset. +- Four questions are assigned to each of Lexical, Dense, Hybrid, and Reranking. +- Each entry has stable ID, category, question, gold document path or paths, + teaching purpose, and expected observation. +- The content is an educational/evaluation contract, not a claim that one + retriever always wins. +- The UI shell and explanations remain bilingual. Corpus questions, source + text, and retrieval artifacts remain in their original English. + +## Retrieval Explanation Contract + +### Shared result data + +Every live retrieval response must identify the query, index, retriever, +requested candidate depth, final top-k, chunk ID, document metadata, source +path, scores, and stable ordering. Existing stored traces remain loadable. + +The web API may add typed optional explanation and candidate-pool fields to a +run artifact. Existing `LabRun.evidence` keeps its current meaning: the final +retrieved list after optional reranking but before context packing, with +`selected_for_context` identifying the packed subset for Ask runs. The larger +pre-rerank pool is stored in a separate optional field so older clients and +replay data do not change meaning. + +Phase 3.4 increments the lab-run schema from `1.0` to `1.1`. New fields are +additive and optional. Readers must continue to accept `1.0` artifacts and +treat missing candidate/explanation fields as unavailable; they must not +recompute historical explanations from a later model or index. + +### Lexical + +The project owns the explanation math around the existing BM25 implementation. +The response exposes normalized query tokens and, for each candidate and query +term, match frequency, document frequency, inverse-document-frequency value, +length normalization inputs, contribution, and total score. Explanations must +use the same tokenization and parameters as ranking. + +### Dense + +The response exposes bounded query and chunk vector previews, dimensions, +norms, dot product, and cosine similarity. Bar charts must preserve sign rather +than silently converting values to absolute magnitude. + +### Qdrant comparison + +The module always teaches the local NumPy path first. When Qdrant is absent, it +shows that the module is optional and the exact local launch command: + +```bash +docker compose --profile qdrant up -d +``` + +When Qdrant is ready, one idempotent action prepares a deterministic derived +index named `cloudflare-state-structural-qdrant-local`. Preparation copies the +existing structural index's exact chunks and vectors; it must not re-chunk or +re-embed the corpus. A source fingerprint covers ordered chunk IDs, canonical +float32 source-vector bytes, vector dimension, and cosine distance. That SHA is +a local provenance identity stored with the derived index and Qdrant payloads; +it is not recomputed from remote bytes because Qdrant cosine collections +normalize vectors during upload. A prepared collection is reused only when its +provenance value, complete ordered chunk-ID set, point count, dimension, and +every returned vector match the normalized source vector within `1e-6`. A +missing or mismatched collection is rebuilt under a fingerprint-derived +physical name, verified, and then published through the stable collection +alias; an incomplete staging collection is never published. + +The parity experiment uses Qdrant's exact-search option, never approximate HNSW +search. It compares the unfiltered NumPy and Qdrant lists by chunk ID with a +score tolerance of `1e-5`. Chunks whose scores differ within that tolerance are +treated as one tie group, so their internal order is reported as equivalent +rather than falsely presented as a mismatch. Filter demonstrations are shown +separately and do not make a parity claim. + +New Qdrant collections store inspectable payload fields for `chunk_id`, +`doc_id`, `title`, `path`, `source_group`, and `source_fingerprint`. Existing +collections containing only `chunk_id` remain searchable, but their filters are +explicitly reported as unavailable. The teaching module may filter the newly +prepared Cloudflare collection by Durable Objects, Queues, KV, R2, or +Workflows. + +Qdrant is excluded from browser evaluation quality comparisons. The module +teaches index storage, filtering, payloads, and operational tradeoffs—not a +different semantic scoring concept. + +### Hybrid + +Hybrid explanations show the independent dense and BM25 lists plus reciprocal +rank fusion using the existing constant: + +```text +contribution = 1 / (60 + rank) +``` + +Each fused result exposes both source ranks, each available contribution, the +sum, and the final order. + +### Reranking + +The default lesson retrieves 20 first-stage candidates and reranks them to a +final top 5. It exposes first-stage rank and score, reranker score, final rank, +rank delta, and whether a candidate moved, stayed, or was dropped. + +The default cross-encoder is `cross-encoder/ms-marco-MiniLM-L-6-v2`. Studio +runtime loading is local-only. Network access is allowed only through the +explicit model-download action in Settings. + +Explore adds reranker and rerank-depth controls. Retrieval and Live Ask use the +same selected reranking configuration so the visible context and generated +answer cannot silently diverge. + +## Browser Evaluation Contract + +Evaluation always uses the bundled Cloudflare structural NumPy index and the +16 reviewed questions. It does not accept uploaded corpora, arbitrary indexes, +Qdrant, or free-form questions in this phase. + +The initial presets are: + +- BM25 vs Dense +- Dense vs Hybrid +- Hybrid vs Hybrid + cross-encoder + +After choosing a preset, learners may edit each side's retriever, top-k, +reranker, and rerank candidate depth. Identical configurations are rejected as +non-instructive. + +Each comparison reports hit rate, mean reciprocal rank, context precision, and +context recall separately. It must not collapse them into a composite winner. +Aggregate differences and complete per-question result inspection are both +required. + +Evaluation runs as a background job with persisted progress, active-job +discovery after navigation or refresh, terminal error details, and cooperative +cancellation. Cancellation moves from `cancel_requested` to `cancelled` after +the current embedding, retrieval, or cross-encoder call returns and before the +next question begins; the UI must not imply that an in-flight model call can be +forcefully interrupted. Progress/result publication uses atomic file +replacement, and cancelled or failed jobs never publish a complete comparison. +Only one resource-heavy local job may run at a time, consistent with the +current Studio job policy. + +## API And Artifact Direction + +The implementation may add these public web contracts, with final naming kept +small and typed: + +- extend retrieve/ask requests with optional `reranker` and + `rerank_top_n` fields; +- retrieval-material endpoints for curated questions and module defaults; +- live explanation responses for lexical, dense, hybrid, and reranked runs; +- Qdrant prepare, status, payload/filter, and NumPy comparison operations; +- background evaluation comparison create/status/detail operations; +- model status/download support for the reranker; and +- background-job progress, active discovery, and cancellation where needed. + +The core engine remains the source of retrieval and evaluation calculations. +Web routes validate and serialize; React components present the returned +artifacts. + +## Model And Image Contract + +- The default embedding snapshot is + `sentence-transformers/all-MiniLM-L6-v2` revision + `1110a243fdf4706b3f48f1d95db1a4f5529b4d41`. +- The default reranker snapshot is + `cross-encoder/ms-marco-MiniLM-L-6-v2` revision + `c5ee24cb16019beea0893ab7796b1df96625c6b8`. +- The **full** Studio image bundles the default embedding model and default + cross-encoder so dense, hybrid, and reranking work offline after build. +- The **slim** image starts without either model and presents separate explicit + downloads in Settings. Both downloads request the exact revisions above. +- Both variants stay CPU-only. Installing the models must not pull CUDA/NVIDIA + wheels or require a GPU. +- Missing models disable only the affected operations and explain the exact + next action. Lexical learning remains available. +- A failed or interrupted download produces a recoverable state; it must not + falsely report the model as ready. + +## Seed, Documentation, And CI Contract + +- Promote immutable bundled assets to a new versioned seed tree. Preserve + conflict-safe upgrade behavior and existing user-created data. +- The evaluation asset has an immutable bundle manifest containing the + question JSONL SHA-256, chunks JSONL SHA-256, embeddings NPZ SHA-256, + canonical source-vector fingerprint, document/chunk counts, distance metric, + embedding dimension, and both pinned model revisions. The current reviewed + structural artifacts are anchored by chunks SHA-256 + `11960c4f72360fdb4dd7fea1f43fbec4dd36a9214e3256bdcffc36ad3aee1f41` + and embeddings SHA-256 + `c944c09db6e42fbdac3ec3e25dc74c6e6ea8b23802d612705ec6be512fa29604`. + Seed generation records the final question and canonical-vector hashes after + serializing the accepted manifest. Evaluation refuses to start if any + fingerprint, count, metric, dimension, or model revision differs. +- Add the reviewed retrieval material manifest to the Cloudflare corpus and + regenerate any bundled artifacts whose stable content depends on the seed + version. +- Add paired English and Simplified-Chinese learning-guide coverage for + reranking, and update retrieval/evaluation guides, navigation, and roadmap. +- Update README and landing-page wording as an integrated project capability, + not as a phase changelog. Add a representative screenshot only after owner + preview acceptance. +- Add GitHub Actions coverage for Python tests, web tests/build, and Learning + Guides build/dead-link validation. +- Align package versions at `0.5.0` only after implementation and owner preview + are accepted. + +## Out Of Scope + +- Generation lessons, prompt engineering, answer judging, agentic RAG, or a + new LLM-provider contract. +- A second vector database, hosted Qdrant, public multi-user deployment, or + making Qdrant a Compose hard dependency. +- Saved retrieval replays, persisted course progress, user-authored evaluation + sets, uploaded-corpus evaluation, or arbitrary evaluation indexes. +- Learned sparse retrieval, metadata-filter authoring beyond the curated + Qdrant source groups, approximate-index tuning benchmarks, or performance + leaderboards. +- A replacement for the existing four Learn lessons or a redesign of the core + RAG planes. + +## Required Verification + +- Unit tests proving explanation values reproduce actual BM25, cosine, RRF, + and reranking order. +- API compatibility tests for old run artifacts and pre-Phase-3.4 indexes. +- Qdrant parity tests using exact search and copied vectors, cosine-upload + normalization, provenance plus complete remote-vector verification, + tolerance/tie behavior, atomic repair, payload/filter tests, absent service + behavior, and legacy minimal payloads with filters disabled. +- Evaluation metric, progress, cancellation, refresh-recovery, and per-question + detail tests. +- Full/slim model readiness and explicit download tests, including checks that + CPU-only dependencies do not pull NVIDIA packages. +- Bilingual web tests, responsive production build, Learning Guides build, and + complete Python regression suite. +- Fresh full and slim Compose smoke tests with clean teardown and no stale + containers, networks, volumes, jobs, or model states. +- Owner preview of every module, Qdrant absent/present paths, reranked Explore, + evaluation A/B flow, both languages, and responsive layouts. +- Independent architecture/code/test review with all blocking findings fixed. + +## Acceptance Criteria + +1. A learner can inspect lexical, dense, hybrid, and reranking calculations + from live results over a reviewed real corpus without an LLM provider. +2. Qdrant has a substantial hands-on module that compares the same vectors with + NumPy while remaining optional and conceptually secondary to visible math. +3. The 16-question browser evaluation compares two meaningful configurations, + reports four metrics, and exposes every question's evidence. +4. Explore can retrieve and ask with a selected reranker using one consistent + candidate-to-context path. +5. Full and slim images honor the offline/explicit-download contract on CPU. +6. Existing indexes, traces, lessons, CLI workflows, custom corpora, and the + no-Qdrant deployment continue to work. +7. English/Chinese UI and guides, automated CI, package documentation, owner + preview, and independent sign-off are complete for version `0.5.0`. + +## Sign-off Record + +The owner accepted the staged roadmap and explicitly approved a dedicated, +substantial Qdrant module while retaining NumPy as the canonical learning path +on 2026-07-16. `/root/phase34_scope_review` independently reviewed the +candidate, requested reproducibility, compatibility, cancellation, task-split, +and Qdrant-normalization clarifications, then signed off the revised scope with +no remaining findings on 2026-07-16. The phase was activated the same day. diff --git a/docs/phases/phase-3.4-manual-preview-checklist.md b/docs/phases/phase-3.4-manual-preview-checklist.md new file mode 100644 index 0000000..431cd80 --- /dev/null +++ b/docs/phases/phase-3.4-manual-preview-checklist.md @@ -0,0 +1,233 @@ +# Phase 3.4 Manual Preview Checklist + +**Status:** Owner accepted the remediated Studio experience on 2026-07-16. No +commit was created before acceptance. + +Checked items below preserve what the owner actually exercised. Unchecked +Browser A/B evaluation items and explicitly noted optional/accessibility items +remain unchecked; automated and independent review coverage is recorded in the +taskboard, not presented here as owner verification. Original `comments:` are +retained, with resolution notes added after the corresponding remediation. + +Use the current source preview at . Complete the +checklist in several sessions if preferred. Add feedback immediately below an +item with the prefix `comments:` so it can be collected without changing the +checklist wording. + +The updated project landing page is separately available at +. + +## 1. Entry point and course shape + +- [√] Open the Studio and confirm the navigation order is Home, Learn, + Retrieval, Explore, Build & Inspect, Failure Lab, Settings. +- [√] Open **Retrieval**. Confirm that it starts on **01 Lexical Search** and + presents six directly selectable modules. +- [√] Confirm the page explains that these are live retrieval experiments and + does not imply that an LLM provider is required. +- [√] Switch to 简体中文 and back to English. Confirm the shell and teaching + copy change language while Cloudflare questions/source text remain English. + +## 2. Lexical Search + +- [√] Select the question containing `max_retries` and run live retrieval. +- [√] Confirm query tokens are visible. +- [√] Confirm each result shows BM25 score and per-term contribution details, + including term frequency, document frequency, IDF, and length inputs. + - comment: BM25 section shows for each chunk card, but there's layout/rendering issue, that the table seems not obey the max width, in maximum window, the last column get exceeds the right boundary of chunk card, and if resize window size, the last two columns all exceed the right boundary of chunk card. only if the windows size is narrow enough, BM25 section doesn't sit right of chunk details but at the bottom, then it looks obey the card boundary. + - resolution: Fixed with a bounded table region that scrolls internally at + narrower widths; the owner accepted the result. +- [√] Confirm the individual contributions explain the displayed final score + rather than presenting BM25 as a black box. +- [√] Open **Read the learning guide** and confirm it opens the local + Retrieval Mechanics guide in the selected UI language. + +## 3. Dense Retrieval + +- [√] Select a paraphrase-oriented dense question and run it. +- [√] Confirm the query vector preview, result vector preview, dimensions, + norms, dot product, cosine similarity, and final rank are visible. +- [√] Confirm negative vector components extend in the opposite direction from + positive components; bar height must not silently use absolute values. + - comments: the bars of both query vector and chunk vector render incorrectly, some of bars look in the right place (perhaps) but some of bars are flying in the air, you could see the screenshot, i put it under `.polish/cosine_cal_bar.png`. + - resolution: Fixed with one signed scale, an explicit zero axis, and a + non-wrapping column count derived from the returned 12-value preview. The + owner accepted the transparent value and zero labels. +- [√] Confirm long source text remains bounded/expandable rather than making + every result card arbitrarily tall. + +## 4. From local vectors to a vector database + +- [√] Open module 03. Confirm it first explains NumPy as the inspectable local + path and Qdrant as a second index backend, not a different conceptual flow. + - comments: there's no certain wordings to explain that 'there's no different concepture flow'. just explained numpy is able to inspect chunks and vectors, and Qdrant is an optional index for the same vectors, and payloads. + - resolution: Strengthened the teaching copy to state that chunks, vectors, + query, distance metric, and ranking concept remain the same while the + storage/search backend changes. +- [√] Confirm Qdrant is shown as available but not prepared. +- [√] Click **Prepare Qdrant comparison**. This copies existing chunks/vectors; + it should not show re-chunking or re-embedding work. +- [√] After preparation, confirm 537 points, 384 dimensions, exact search, and + a source fingerprint are visible. +- [√] Run an unfiltered backend comparison. Confirm NumPy and Qdrant result + cards appear side by side and parity is reported as equivalent. +- [√] Confirm Qdrant result payloads expose useful learner-facing fields such + as chunk ID, document path/title, and source group. + - comments: only the results/cards of Qdrant-exact has a expandable 'Inspect stored payload' but NumPy card doesn't have.Not sure if this was expected. + - resolution: Kept this intentional contrast and explained it in the module: + local NumPy exposes arrays/files directly, while Qdrant adds stored payload + metadata to the same vectors. +- [√] Choose a source-group filter such as `r2` or `queues`. Confirm filtered + Qdrant results are presented separately and are not described as a NumPy + parity comparison. +- [√] Repeat preparation once. Confirm it safely reuses the verified prepared + collection rather than duplicating or rebuilding it unnecessarily. + - comments: i didn't find out how to repeat the preparation module, if i clicked 'Dense' for example, and clicked back to 'Vector database', there's no 'Prepare Qdrant comparison' again. + - resolution: Added an explicit repeat-verification action; repeated prepare + reports reuse of the already verified 537-point collection. + +## 5. Hybrid Retrieval + +- [√] Open module 04 and use a question with more than one gold document, such + as the R2 consistency/durability question. + - comments: i can the 'How do R2 consistency and durability differ?' question in dropdown list, but not sure how to check if it has more than 1 gold document. + - resolution: Gold document paths are now shown alongside reviewed questions. +- [√] Confirm separate Dense and BM25 rankings are visible. +- [√] Confirm each result exposes the available `1 / (60 + rank)` contribution + from both lists and the summed RRF score. + - comments: there're 2 ranking items only have 'BM25 ranking' contribution card, you can check the screenshot `.polish/fused_ranking.png`. + - resolution: Every fused row now shows both source contributions; a missing + source is explicitly represented as `+0` rather than omitted. +- [√] Confirm the fused ordering matches the displayed contributions. + +## 6. Reranking + +- [√] Open module 05 and run a curated reranking question. +- [√] Confirm the flow identifies 20 first-stage candidates and a final top 5. +- [√] Confirm the complete audit table includes first rank/score, + cross-encoder score, final rank, rank delta, and moved/unchanged/dropped + outcome. +- [√] Confirm dropped candidates remain inspectable rather than disappearing. +- [√] Open **Read the learning guide** and confirm it opens the local Reranking + guide, not the generic Retrieval Mechanics page. + +## 7. Browser A/B evaluation + +- [√] Open module 06. Confirm the fixed index identity and 16 reviewed + questions are clear. +- [√] Run the **BM25 vs Dense** preset. +- [√] Confirm queued/running progress is visible and the finished comparison + reports hit rate, MRR, context precision, and context recall separately. + - comments: the progress bar is not good looking. + - resolution: Replaced the native browser progress element with a compact + status header, current/total counter, descriptive message, and a rounded + themed meter. The counter now names its unit explicitly (`16 of 16 + questions` / `16 / 16 个问题`), and the owner accepted the result. +- [√] Confirm there is no composite winner. +- [√] Inspect several individual questions. Confirm each shows the question, + gold document paths, per-side metrics, and complete retrieved evidence. +- [√] Confirm the displayed delta is clearly defined as B minus A. +- [√] Edit one side and try two identical configurations. Confirm the lab + rejects the non-instructive comparison with a clear message. +- [ ] Run **Hybrid vs Hybrid + cross-encoder** when time permits and inspect + whether aggregate changes agree with per-question evidence. +- [ ] While a comparison is running, navigate away and return. Confirm the + active job and its exact configuration recover. +- [ ] Optional: request cancellation. Confirm it explains that cancellation + occurs after the current model/retrieval operation and does not publish a + complete result. +- [√] Open **Read the learning guide** and confirm it opens Evaluating + Retrieval in the selected language. + +## 8. Explore with reranking + +- [√] Open Explore and select `cloudflare-state-structural-v1`. +- [√] Choose Hybrid, enable the cross-encoder reranker, retain final top-k 5, + and use candidate depth 20. +- [√] Ask one of the curated reranking questions and click **Retrieve**. + - comments: i don't know which is a curated reranking question, so i just ask a random question - 'what's R2 service?' + - resolution: Replaced the competing reviewed/free controls with one + question field whose suggestions identify the reviewed reranking set + while still accepting free questions. +- [√] Confirm Explore shows the same candidate-to-final audit vocabulary as + the Retrieval course. + - comments: maybe due to i asked a not exact curated question, so i got a not exactly same candidate-to-final result table. + - resolution: Explore now reuses the candidate, pre-rank, reranker score, + final rank, movement, and dropped-result vocabulary from Retrieval. +- [√] Change candidate depth and confirm it remains greater than or equal to + final top-k. +- [x] Optional provider check: if a tested OpenAI-compatible provider is + already configured, use **Live Ask** with the same settings and confirm the + retrieved/reranked evidence is the evidence passed to generation. + - comments: not sure how to check if the retrieved/reranked evidence is the evidence passed to generation. because i only see some 'selected context evidence' cards. no more candidate-to-final result. + - resolution: Live Ask now preserves the same reranking audit and marks the + final evidence selected for context, so the retrieval-to-generation + boundary remains inspectable. + +## 9. Models and Settings + +- [√] Open Settings. Confirm both pinned model identities and revisions are + visible: the MiniLM embedding model and the MS MARCO MiniLM cross-encoder. +- [√] Confirm both show ready in this full/native preview. + - comments: 'Ready locally...' text may need to align vertically in center, because i saw it almost in the top space of left 'green bar' indicator. you can check the screenshot `.polish/settings_model_ready.png`. and the 'OpenAI compatible provider' section is too close with 'Pinned model' section, there's no space, you can check the same screenshot. + - resolution: Corrected model-state alignment and section spacing. +- [√] Confirm the surrounding explanation distinguishes which operations need + embeddings and which additionally need the reranker. + - comments: i didn't find any surrounding explanation. you can check the screenshot `.polish/settings_model_ready.png`. + - resolution: Added distinct operation roles for the embedding and + cross-encoder models. +- [√] Confirm no GPU or CUDA requirement is suggested. + - comments: i didn't find any hint like this. you can check the screenshot `.polish/settings_model_ready.png`. + - resolution: Added explicit CPU-only guidance; full and slim image smokes + also confirmed no CUDA runtime or NVIDIA packages. + +The slim-image download lifecycle will be presented as a separate isolated +verification after the main Studio experience is accepted; it does not need to +block this first walkthrough. + +## 10. Learning Guides and public wording + +- [√] From Retrieval, open the Retrieval Mechanics, Reranking, and Evaluating + Retrieval guide targets through their corresponding modules. +- [√] In each guide, switch English/简体中文 and confirm the paired page exists. + - comments: not sure if all sans fonts are better on docsite. now there're both serif and sans fonts mixed together shown in docsite, a little bit disharmony. + - resolution: Aligned the Learning Guides on the accepted sans-serif system. +- [√] Confirm the guide navigation places Reranking between Retrieval Mechanics + and Evaluating Retrieval. +- [√] Open . Confirm the landing page presents the live + retrieval course as an integrated Studio capability, not as a Phase 3.4 + changelog. +- [√] Confirm the landing page still communicates one core with two learning + entry points: visual Studio and direct CLI. + - comments: the wording in the landing page is visual workspace and direct CLI. + +## 11. Responsive and accessibility pass + +- [√] Resize the Studio through wide desktop, narrow desktop/tablet, and mobile + widths. Confirm the six-module rail, controls, comparison columns, tables, + vector charts, and evidence cards remain usable. + - comments: i've reported the layout/render issue above. +- [√] Confirm wide audit tables scroll inside their own area instead of + widening the whole page. +- [√] Navigate the Retrieval module rail, form controls, and guide link by + keyboard. Confirm focus remains visible. + - comments: didn't verified completely. +- [x] If reduced motion is enabled at OS/browser level, confirm no essential + information depends on animation. + - comments: not verified, i think modern devices no need 'motion-reduced' mode. + +## 12. Overall acceptance + +- [√] The recommended order from lexical search through evaluation is clear, + but modules are not artificially locked. +- [√] Calculations are visible before backend abstractions. +- [√] Qdrant feels substantial and educational while remaining optional. +- [√] A learner can distinguish candidate generation, fusion, reranking, final + evidence, and evaluation. + - comments: i guess yes, assume i'm a learner. +- [√] The experience feels like part of tiny-rag-lab rather than a separate + dashboard or a clone of another learning project. +- [√] No blocking or high-priority finding remains before final review. + - comments: see findings above. + - resolution: The findings above were remediated through successive owner + previews; the owner then accepted the final result on 2026-07-16. diff --git a/docs/phases/phase-3.4-taskboard.md b/docs/phases/phase-3.4-taskboard.md new file mode 100644 index 0000000..a0343d1 --- /dev/null +++ b/docs/phases/phase-3.4-taskboard.md @@ -0,0 +1,31 @@ +# Phase 3.4 Taskboard: Interactive Retrieval Mechanics + +**Status:** Complete — owner preview accepted and independent final sign-off +recorded 2026-07-17. + +| ID | Task | Status | Owner | Notes | +|---|---|---|---|---| +| P3.4-T01 | Review the phase architecture, exact 16-question content manifest, API/artifact direction, model/image contract, and acceptance gates; activate the signed-off phase. | done | codex | Reviewed by `/root/phase34_scope_review` 2026-07-16; revised scope signed off with no remaining findings. | +| P3.4-T02 | Add compatible engine contracts for BM25/dense/hybrid explanations, candidate pools, rerank audit, and lab-run schema 1.1. | done | codex | Reviewed by `/root/phase34_t02_review` 2026-07-16; 77 focused tests and randomized equivalence checks passed; no findings. | +| P3.4-T03 | Add web API contracts for live retrieval/reranking and the bilingual Retrieval shell plus Lexical and Dense modules. | done | codex | Reviewed by `/root/phase34_t03_review` 2026-07-16; five findings remediated; 63 focused Python and 11 web tests passed; no remaining findings. | +| P3.4-T04 | Build “From local vectors to a vector database”: exact-vector fingerprinting, atomic Qdrant prepare/repair, payload/filter inspection, exact NumPy parity, and absent-service guidance. | done | codex | Signed off by `/root/phase34_t04_review` 2026-07-16 after six findings were remediated; 45 focused Python and 14 web tests passed with no remaining findings. | +| P3.4-T05 | Build live Hybrid and Reranking modules and add consistent reranker controls to Explore retrieve/ask flows. | done | codex | Signed off by `/root/phase34_t05_review` 2026-07-16; 67 focused Python and 17 web tests passed with no findings. | +| P3.4-T06 | Add atomic background-job progress, active discovery, cooperative cancellation, and comparison artifact persistence. | done | codex | Signed off by `/root/phase34_t06_review` 2026-07-16 after publication-race, restart-cleanup, and partial-Qdrant-build findings were fixed; 48 focused tests passed. | +| P3.4-T07 | Build the fingerprint-gated 16-question browser A/B evaluation with presets, editable valid configs, four metrics, and per-question inspection. | done | codex | Signed off by `/root/phase34_t07_review` 2026-07-16 after immutable identity, pinned revision, recovery, integration coverage, and localization findings were fixed; 71 focused Python and 20 web tests passed. | +| P3.4-T08 | Promote versioned seed/evaluation assets and implement pinned full/slim embedding and reranker model lifecycle plus Settings UI. | done | codex | Signed off by `/root/phase34_t08_review` 2026-07-16 after slim cache persistence, partial-snapshot readiness, and interrupted-promotion findings were fixed; 96 focused Python and 22 web tests passed. | +| P3.4-T09 | Add paired EN/ZH guides; update README/landing integration and version metadata; add Python/web/guides GitHub Actions. | done | codex | Signed off by `/root/phase34_t09_review` 2026-07-16 after paired documentation-accuracy findings were fixed; guides/dead links, 22 web tests/build, lock/image contracts, and diff check passed. | +| P3.4-T10 | Run full regression, full/slim Compose and Qdrant smoke tests, complete owner preview/remediation, obtain independent final review, and close the phase. | done | codex | Signed off by `/root/phase34_t09_review` 2026-07-17 with no remaining findings; the owner accepted the complete Studio experience including Browser A/B evaluation; 855 Python tests, 24 web tests, both production builds, full/slim/Qdrant runtime smokes, CPU-only image checks, explicit slim model downloads, and isolated-state cleanup passed. | + +## Review Gates + +- **Gate A — scope activation:** independent architecture reviewer signs off + T01 before any runtime task is claimed. +- **Gate B — engine/API:** T02 must be signed off before T03–T05 depend on its + public contracts; T06 must be signed off before browser evaluation depends + on its job lifecycle. +- **Gate C — owner experience preview:** the owner previews the Retrieval + journey, Qdrant comparison, Explore reranking, and evaluation before public + documentation or screenshots are finalized. +- **Gate D — release closeout:** all code tasks have non-owner sign-off, all + required tests pass, owner findings are resolved, and runtime cleanup is + recorded before T10 or the phase can be marked complete. diff --git a/docs/roadmap.md b/docs/roadmap.md index fdd48fe..cd77d30 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -20,6 +20,8 @@ Status: Phase 1, Phase 1.5, Phase 1.6, Phase 1.7, Phase 1.8, Phase 1.9, Phase 2.0, Phase 2.1, and Phase 2.2 are complete under `docs/phases/`. Phase 3.0 — Local Visual RAG Lab — is complete; its implementation contract is `docs/phases/phase-3.0-local-visual-rag-lab.md`. +Phase 3.4 — Interactive Retrieval Mechanics — is complete; its implementation +contract is `docs/phases/phase-3.4-interactive-retrieval.md`. ## Phase 1: Naive Classic RAG @@ -294,6 +296,25 @@ Expected capabilities: Status: Complete; see `docs/phases/phase-3.3-local-learning-docsite.md` and `docs/phases/phase-3.3-taskboard.md`. +## Phase 3.4: Interactive Retrieval Mechanics + +Goal: make lexical, dense, vector-database, hybrid, reranking, and evaluation +mechanics directly inspectable through live browser experiments. + +Expected capabilities: + +- a dedicated bilingual Retrieval course over 16 reviewed Cloudflare questions +- calculation-level BM25, cosine, reciprocal-rank-fusion, and reranking views +- a substantial optional Qdrant module comparing exact copied vectors with the + canonical local NumPy index +- fixed browser A/B evaluation with aggregate and per-question evidence +- reranking controls shared by Explore retrieve and live generation +- pinned CPU-only embedding and reranker model lifecycle for full/slim images + +Status: Complete; see +`docs/phases/phase-3.4-interactive-retrieval.md` and +`docs/phases/phase-3.4-taskboard.md`. + ## Later: Reporting, Artifacts, And Agentic RAG After the near-term quality roadmap is clearer, consider broader observability diff --git a/learning_materials/.vitepress/config.ts b/learning_materials/.vitepress/config.ts index ab8d282..345a377 100644 --- a/learning_materials/.vitepress/config.ts +++ b/learning_materials/.vitepress/config.ts @@ -8,6 +8,7 @@ const englishGuides: Guide[] = [ { text: "Retrieval and Generation", slug: "retrieval-and-generation" }, { text: "Persistence and Testing", slug: "persistence-and-testing" }, { text: "Retrieval Mechanics", slug: "retrieval-mechanics" }, + { text: "Reranking", slug: "reranking" }, { text: "Evaluating Retrieval", slug: "evaluating-retrieval" }, { text: "Observability and Debugging", slug: "observability-and-debugging" }, { text: "RAG Failure Lab", slug: "rag-failure-lab" }, @@ -22,6 +23,7 @@ const chineseGuides: Guide[] = [ { text: "检索与生成", slug: "retrieval-and-generation" }, { text: "持久化与测试", slug: "persistence-and-testing" }, { text: "检索机制", slug: "retrieval-mechanics" }, + { text: "重排序", slug: "reranking" }, { text: "评估检索质量", slug: "evaluating-retrieval" }, { text: "可观测性与调试", slug: "observability-and-debugging" }, { text: "RAG 失败实验室", slug: "rag-failure-lab" }, @@ -48,6 +50,7 @@ export default defineConfig({ cleanUrls: false, title: "tiny-rag-lab Learning Guides", description: "Concept-focused guides for understanding the inspectable classic RAG pipeline.", + head: [["link", { rel: "icon", type: "image/svg+xml", href: "/docs/favicon.svg" }]], locales: { en: { label: "English", diff --git a/learning_materials/.vitepress/theme/custom.css b/learning_materials/.vitepress/theme/custom.css index d54f533..07a91a1 100644 --- a/learning_materials/.vitepress/theme/custom.css +++ b/learning_materials/.vitepress/theme/custom.css @@ -34,9 +34,9 @@ body { .vp-doc h3, .language-entry h1 { color: #183242; - font-family: ui-serif, Georgia, serif; - font-weight: 500; - letter-spacing: -.035em; + font-family: var(--vp-font-family-base); + font-weight: 650; + letter-spacing: -.025em; } .vp-doc p, diff --git a/learning_materials/en/evaluating-retrieval.md b/learning_materials/en/evaluating-retrieval.md index b597488..de60908 100644 --- a/learning_materials/en/evaluating-retrieval.md +++ b/learning_materials/en/evaluating-retrieval.md @@ -308,6 +308,42 @@ The `_make_embedder` factory is the same one used by `cmd_retrieve` and --- +## Compare two configurations in the browser + +The Studio's **Retrieval → Evaluation** module runs a fixed, reviewed set of 16 +Cloudflare questions against the bundled structural NumPy index. It keeps the +corpus, chunks, embedding snapshot, and questions fixed so the retrieval +configuration is the intentional variable. + +Three presets provide useful starting comparisons: + +- BM25 vs Dense +- Dense vs Hybrid +- Hybrid vs Hybrid + cross-encoder + +You may edit retriever, `top_k`, reranker, and candidate depth on either side. +The lab rejects identical configurations because they teach nothing through an +A/B comparison. + +Each side reports hit rate, MRR, context precision, and context recall +separately. There is no composite winner. A positive change in recall may come +with lower precision, and a better aggregate can still hide regressions on +individual questions. Always open the per-question evidence and check: + +1. which gold document or documents were expected; +2. where each side first retrieved a gold document; +3. which distractors occupied the remaining top-k positions; and +4. whether reranking promoted useful evidence or merely changed the order. + +The comparison runs as a recoverable background job. You may leave the page, +return to its current progress, or request cancellation. Cancellation takes +effect between questions; an in-flight embedding or cross-encoder call is not +forcefully interrupted. + +The browser set is a teaching fixture, not a leaderboard. It is deliberately +restricted to one pinned corpus and index so learners can reason about the +evidence rather than wonder whether the underlying assets changed. + ## What This Teaches Evaluation answers the question your Phase 1 pipeline left open: **is the diff --git a/learning_materials/en/learning-roadmap.md b/learning_materials/en/learning-roadmap.md index 78a7c92..c7e774e 100644 --- a/learning_materials/en/learning-roadmap.md +++ b/learning_materials/en/learning-roadmap.md @@ -13,13 +13,14 @@ directory. Start at the top and work down. | 2 | [The Indexing Plane](the-indexing-plane.md) | How documents become searchable vectors | | 3 | [Retrieval and Generation](retrieval-and-generation.md) | How queries find chunks and become answers | | 4 | [Persistence and Testing](persistence-and-testing.md) | The on-disk format, round-trip integrity, and fake backends | -| 5 | [Retrieval Mechanics](retrieval-mechanics.md) | BM25 keyword retrieval, hybrid search, and Reciprocal Rank Fusion | -| 6 | [Evaluating Retrieval](evaluating-retrieval.md) | Metrics that tell you whether the retriever works | -| 7 | [Observability and Debugging](observability-and-debugging.md) | Per-run traces that explain one retrieve or ask command | -| 8 | [RAG Failure Lab](rag-failure-lab.md) | Curated failure cases that compare baseline and intervention retrieval | -| 9 | [Answer Quality Judging](answer-quality-judging.md) | Measuring generated answers and answer-side failures with a fakeable judge | -| 10 | [Context Budget and Structured Answers](context-budget-and-structured-answers.md) | Token-budget context packing, inspectable omitted chunks, and JSON answer output | -| 11 | [Structural and Semantic Chunking](structural-and-semantic-chunking.md) | Three-tier structural chunking, embedding-based semantic chunking, and strategy dispatch | +| 5 | [Retrieval Mechanics](retrieval-mechanics.md) | BM25, dense similarity, local vectors, Qdrant comparison, and hybrid RRF | +| 6 | [Reranking](reranking.md) | How a cross-encoder reorders a larger candidate pool into final evidence | +| 7 | [Evaluating Retrieval](evaluating-retrieval.md) | Metrics and browser A/B comparisons that test whether retrieval improved | +| 8 | [Observability and Debugging](observability-and-debugging.md) | Per-run traces that explain one retrieve or ask command | +| 9 | [RAG Failure Lab](rag-failure-lab.md) | Curated failure cases that compare baseline and intervention retrieval | +| 10 | [Answer Quality Judging](answer-quality-judging.md) | Measuring generated answers and answer-side failures with a fakeable judge | +| 11 | [Context Budget and Structured Answers](context-budget-and-structured-answers.md) | Token-budget context packing, inspectable omitted chunks, and JSON answer output | +| 12 | [Structural and Semantic Chunking](structural-and-semantic-chunking.md) | Three-tier structural chunking, embedding-based semantic chunking, and strategy dispatch | --- @@ -164,6 +165,7 @@ quality. `diagnose` studies curated failure cases. | Retrieval and Generation | Cosine search, prompt assembly, LLM call | `retrieval.py`, `prompting.py`, `generation.py` | | Persistence and Testing | Save/load index, round-trip integrity, fake backends | `index_writer.py`, `index_loader.py`, test suite | | Retrieval Mechanics | BM25 keyword retrieval, hybrid search, RRF fusion | `bm25.py`, `hybrid.py`, `retrieval.py` | +| Reranking | Candidate generation, cross-encoder scoring, rank movement | `reranker.py`, `retrieval.py`, `trace.py` | | Evaluating Retrieval | Retrieval quality metrics | `eval.py` | | Observability and Debugging | Per-run trace records and JSON artifacts | `trace.py`, `cli.py` | | RAG Failure Lab | Failure case diagnosis | `failure.py`, `cli.py` | diff --git a/learning_materials/en/reranking.md b/learning_materials/en/reranking.md new file mode 100644 index 0000000..7e67951 --- /dev/null +++ b/learning_materials/en/reranking.md @@ -0,0 +1,103 @@ +# Reranking — From Candidates to Final Evidence + +Retrieval and reranking solve different problems. A first-stage retriever must +search the whole index cheaply enough to produce a useful candidate pool. A +reranker spends more computation on that much smaller pool and decides which +candidates deserve the final evidence positions. + +```text +all chunks -> first-stage retriever -> 20 candidates + -> cross-encoder reranker -> final top 5 +``` + +The first stage protects recall: the relevant chunk cannot be promoted if it +never enters the candidate pool. The second stage improves ordering and often +precision: fewer distractors reach context packing. + +## Bi-encoder and cross-encoder scoring + +Dense retrieval is a **bi-encoder** path. It embeds the query and every chunk +separately, then compares two stored vectors. Chunk vectors can be computed +once and reused, which makes whole-index search practical. + +A cross-encoder instead reads the query and one candidate together: + +```text +score = cross_encoder(query, candidate_text) +``` + +Joint attention can notice fine-grained query–passage relationships that a +single cosine similarity misses. The cost is that the model must run once per +candidate, so it is unsuitable as the first pass over hundreds or thousands of +chunks in this lab. + +## The candidate-depth contract + +`top_k` and `rerank_top_n` have different meanings: + +- `rerank_top_n` is the number of first-stage candidates sent to the + cross-encoder. +- `top_k` is the number of reranked results retained as final evidence. +- `rerank_top_n` must be greater than or equal to `top_k`. + +Increasing candidate depth may recover evidence that the first stage ranked +too low, but it also increases cross-encoder work. Reranking cannot repair a +missing corpus document, a damaging chunk boundary, or a relevant chunk below +the candidate cutoff. + +## Reading the rank-movement audit + +The Studio's **Retrieval → Reranking** module shows every candidate before and +after the second pass: + +| Field | Meaning | +|---|---| +| First rank and score | The candidate's position and score from dense, BM25, or hybrid retrieval | +| Reranker score | The cross-encoder's query–candidate relevance score | +| Final rank | Its position after reranking, if it remains in the final top-k | +| Movement | Promoted, demoted, unchanged, or dropped | + +Do not compare a BM25, cosine, RRF, and cross-encoder score as if they shared a +scale. The useful evidence is the ordering each scorer produced and how that +ordering changed. + +## One path for retrieval and generation + +Explore applies the selected reranker to both **Retrieve** and **Live Ask**. +That consistency matters: the evidence a learner inspects must be the evidence +packed for generation. Otherwise the answer could be grounded in a different +candidate order from the one visible on screen. + +The same idea is available through the CLI: + +```bash +rag retrieve "What happens after queue delivery attempts are exhausted?" \ + --retriever hybrid --top-k 5 \ + --reranker cross-encoder --rerank-top-n 20 + +rag ask "What happens after queue delivery attempts are exhausted?" \ + --retriever hybrid --top-k 5 \ + --reranker cross-encoder --rerank-top-n 20 +``` + +## What to inspect + +1. Start with a curated Reranking question in the Studio. +2. Find the gold source in the first-stage pool. +3. Compare its first rank with its final rank. +4. Inspect which candidates were dropped from the final top five. +5. In Evaluation, compare Hybrid with Hybrid + cross-encoder across all 16 + reviewed questions. Check per-question evidence before interpreting the + aggregate metrics. + +Reranking is valuable when it produces a better final evidence set—not merely +when rows move. + +## Related guides + +- [Retrieval Mechanics](retrieval-mechanics.md) — BM25, dense, RRF, and the + first-stage candidate lists. +- [Evaluating Retrieval](evaluating-retrieval.md) — metrics for checking + whether rank changes improved retrieval quality. +- [Context Budget and Structured Answers](context-budget-and-structured-answers.md) + — how final evidence is selected for the prompt. diff --git a/learning_materials/en/retrieval-mechanics.md b/learning_materials/en/retrieval-mechanics.md index f5c275c..7fee3c7 100644 --- a/learning_materials/en/retrieval-mechanics.md +++ b/learning_materials/en/retrieval-mechanics.md @@ -1,9 +1,10 @@ -# Retrieval Mechanics — Dense, BM25, and Hybrid Search +# Retrieval Mechanics — Lexical, Dense, Vector, and Hybrid Search -Phase 1 delivered one retriever: dense cosine-similarity search. Phase 1.5 adds -two more — keyword-based BM25 and a hybrid that fuses dense + BM25 via -Reciprocal Rank Fusion. Two new modules do this work: `bm25.py` (keyword -retrieval) and `hybrid.py` (fusion logic). +The lab owns three first-stage retrieval strategies: BM25 keyword search, +dense cosine-similarity search, and a hybrid that fuses both lists with +Reciprocal Rank Fusion. The Studio exposes the calculations behind each one, +then uses the same stored vectors to compare the local NumPy index with optional +Qdrant. --- @@ -21,6 +22,25 @@ has no understanding of synonyms or paraphrases. Hybrid retrieval combines both: dense catches the semantics, BM25 catches the exact terms, and Reciprocal Rank Fusion merges their ranked lists into one. +## Follow the live retrieval course + +Open **Retrieval** in the Studio to move through six directly selectable +modules: + +1. **Lexical Search** — query tokens, document frequency, BM25 term + contributions, and final score. +2. **Dense Retrieval** — vector previews, norms, dot products, cosine + similarity, and ordering. +3. **From local vectors to a vector database** — exact same chunks and vectors + through NumPy and optional Qdrant. +4. **Hybrid Retrieval** — dense and BM25 ranks plus each RRF contribution. +5. **Reranking** — first-stage candidates, cross-encoder scores, and rank + movement. +6. **Evaluation** — two configurations compared over 16 reviewed questions. + +These are live experiments over the bundled Cloudflare corpus, not saved +replays. No LLM provider is needed. + --- ## BM25 Keyword Retrieval (`bm25.py`) @@ -187,14 +207,46 @@ This function: from `retrieval.py`. 3. **Runs BM25 retrieval**: calls `bm25_retriever.retrieve(query, top_k=top_k)`. 4. **Fuses results**: calls `reciprocal_rank_fusion([dense_results, bm25_results], top_k=top_k)`. -5. **Returns** exactly `top_k` results with fused RRF scores and re-assigned - 1-indexed ranks. +5. **Returns** up to `top_k` results with fused RRF scores and re-assigned + 1-indexed ranks. A small or empty corpus can produce fewer. The returned `RetrievalResult.score` is the fused RRF score — a small positive number, not a cosine similarity. --- +## From local vectors to a vector database + +The NumPy index is the canonical teaching path because every vector, chunk ID, +and cosine calculation remains easy to inspect. Qdrant is a second storage and +search backend—not a different embedding concept. + +The Studio's vector-database module deliberately copies the structural +index's exact chunks and vectors. It does not re-chunk or re-embed. An exact +Qdrant query and the local NumPy query should therefore return equivalent +unfiltered results, allowing for tiny floating-point differences and ties. + +When Qdrant is running, inspect: + +- the common source fingerprint that identifies the ordered chunk/vector set; +- point payloads such as chunk ID, document path, title, and source group; +- the NumPy and Qdrant result lists side by side; and +- a separate metadata-filter demonstration for Durable Objects, Queues, KV, + R2, or Workflows. + +The filter result is not a parity test because it intentionally searches a +subset. The unfiltered comparison is the one that asks whether both backends +searched the same vectors equivalently. + +Qdrant remains optional: + +```bash +docker compose --profile qdrant up -d +``` + +If it is absent, lexical, dense, hybrid, reranking, evaluation, Explore, and +the local NumPy index continue to work. + ## CLI Usage ### `rag retrieve` with retriever selection @@ -216,7 +268,7 @@ entirely — BM25 does not use embeddings. ### `rag eval` with retriever selection ```bash -rag eval --qa-file qa.jsonl --retriever dense # Phase 1 baseline +rag eval --qa-file qa.jsonl --retriever dense # semantic baseline rag eval --qa-file qa.jsonl --retriever bm25 # keyword-only rag eval --qa-file qa.jsonl --retriever hybrid # combined ``` @@ -249,9 +301,9 @@ case-by-case within a single diagnosis run. | `tiny_rag_lab/hybrid.py` | `reciprocal_rank_fusion()`, `retrieve_hybrid()` | | `tiny_rag_lab/retrieval.py` | `retrieve()`, `retrieve_by_vector()` — dense path used by hybrid | -No changes were needed to `models.py`, `index_loader.py`, or `index_writer.py` -— the `RetrievalResult` and `Chunk` dataclasses already support all three -retrievers without modification. +All three retrievers return the shared `RetrievalResult` and `Chunk` contracts. +The current index reader/writer also carries the model and backend provenance +needed by the Studio's live explanations and vector-backend comparison. --- @@ -265,9 +317,10 @@ After reading this document, the most useful experiments are: 2. **Check the eval numbers.** Run `rag eval` with all three retrievers on the same QA set. Look at which questions each retriever gets right — it tells you which types of queries benefit from keyword vs. semantic search. -3. **Trace a hybrid run.** Add `--retriever hybrid` to `rag retrieve` and - inspect the trace output. The dense and BM25 scores are visible separately - in the trace before RRF fuses them. +3. **Explain a hybrid run.** Add `--retriever hybrid` to `rag retrieve` to + inspect the final fused chunks and RRF scores. Then open **Retrieval → + Hybrid Retrieval** in the Studio to see the separate dense/BM25 rankings + and each contribution before fusion. --- @@ -276,4 +329,6 @@ After reading this document, the most useful experiments are: - [Retrieval and Generation](retrieval-and-generation.md) — the dense cosine retrieval path explained in detail. - [Evaluating Retrieval](evaluating-retrieval.md) — how to measure which - retriever works best. \ No newline at end of file + retriever works best. +- [Reranking](reranking.md) — how a cross-encoder turns first-stage candidates + into final evidence. diff --git a/learning_materials/package-lock.json b/learning_materials/package-lock.json index 2a5066f..bde73c3 100644 --- a/learning_materials/package-lock.json +++ b/learning_materials/package-lock.json @@ -1,12 +1,12 @@ { "name": "tiny-rag-lab-learning-guides", - "version": "0.4.0", + "version": "0.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "tiny-rag-lab-learning-guides", - "version": "0.4.0", + "version": "0.5.0", "devDependencies": { "vitepress": "1.6.4", "vue": "3.5.39" diff --git a/learning_materials/package.json b/learning_materials/package.json index e275f3a..7e577f9 100644 --- a/learning_materials/package.json +++ b/learning_materials/package.json @@ -1,7 +1,7 @@ { "name": "tiny-rag-lab-learning-guides", "private": true, - "version": "0.4.0", + "version": "0.5.0", "type": "module", "scripts": { "dev": "vitepress dev --host 127.0.0.1 --port 4173", diff --git a/learning_materials/public/favicon.svg b/learning_materials/public/favicon.svg new file mode 100644 index 0000000..f8bb27d --- /dev/null +++ b/learning_materials/public/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/learning_materials/zh/evaluating-retrieval.md b/learning_materials/zh/evaluating-retrieval.md index 1247fa2..a0c0512 100644 --- a/learning_materials/zh/evaluating-retrieval.md +++ b/learning_materials/zh/evaluating-retrieval.md @@ -288,6 +288,36 @@ def cmd_eval(args): --- +## 在浏览器中比较两种配置 + +Studio 的**检索 → 评估**模块会让固定的 16 道已审核 Cloudflare 问题运行在内置结构化 +NumPy 索引上。语料、文本块、嵌入快照与问题保持不变,因此检索配置才是有意改变的 +变量。 + +三个预设提供有意义的起点: + +- BM25 对比 Dense +- Dense 对比 Hybrid +- Hybrid 对比 Hybrid + 交叉编码器 + +你可以编辑任意一侧的检索器、`top_k`、重排序器与候选深度。实验室会拒绝完全相同的 +两种配置,因为这样的 A/B 对比没有教学价值。 + +每一侧都会分别报告命中率、MRR、上下文精确率与上下文召回率,不会合并成一个综合 +“赢家”。召回率提高可能伴随精确率下降;更好的汇总指标也可能隐藏某些问题上的退步。 +因此应始终打开逐题证据并检查: + +1. 预期的标准文档有哪些; +2. 每一侧第一次检索到标准文档的位置; +3. 其余 top-k 位置被哪些干扰项占据; +4. 重排序是否提升了有用证据,还是仅仅改变顺序。 + +对比会作为可恢复的后台任务运行。你可以离开页面、返回后继续查看当前进度,或请求 +取消。取消发生在两道问题之间;正在执行的嵌入或交叉编码器调用不会被强制中断。 + +浏览器题集是教学夹具,而不是排行榜。它刻意限定在一个固定语料和索引上,让学习者 +能够推理证据,而不是怀疑底层资产是否发生变化。 + ## 本文的学习要点 评估回答了 Phase 1 流水线留下的问题:**检索器是否真的在正常工作?** diff --git a/learning_materials/zh/learning-roadmap.md b/learning_materials/zh/learning-roadmap.md index 54a33ff..b555968 100644 --- a/learning_materials/zh/learning-roadmap.md +++ b/learning_materials/zh/learning-roadmap.md @@ -12,13 +12,14 @@ | 2 | [索引平面](the-indexing-plane.md) | 文档如何变成可搜索的向量 | | 3 | [检索与生成](retrieval-and-generation.md) | 查询如何找到相关片段并生成答案 | | 4 | [持久化与测试](persistence-and-testing.md) | 索引的磁盘格式、往返完整性以及假后端测试模式 | -| 5 | [检索机制](retrieval-mechanics.md) | BM25 关键词检索、混合搜索与 Reciprocal Rank Fusion | -| 6 | [评估检索质量](evaluating-retrieval.md) | 用指标回答"检索器到底好不好用" | -| 7 | [可观测性与调试](observability-and-debugging.md) | 用单次运行 trace 解释一次 retrieve 或 ask 命令 | -| 8 | [RAG 失败实验室](rag-failure-lab.md) | 用策划好的失败案例比较 baseline 和 intervention 检索 | -| 9 | [答案质量评判](answer-quality-judging.md) | 用可替换的 judge 衡量生成答案和答案侧失败 | -| 10 | [上下文预算与结构化答案](context-budget-and-structured-answers.md) | Token 预算打包、结构化 JSON 输出 | -| 11 | [结构化与语义分块](structural-and-semantic-chunking.md) | 三层结构化分块、基于嵌入的语义分块与策略分发 | +| 5 | [检索机制](retrieval-mechanics.md) | BM25、稠密相似度、本地向量、Qdrant 对比与混合 RRF | +| 6 | [重排序](reranking.md) | 交叉编码器如何把较大的候选池重排为最终证据 | +| 7 | [评估检索质量](evaluating-retrieval.md) | 用指标与浏览器 A/B 对比判断检索是否真的改善 | +| 8 | [可观测性与调试](observability-and-debugging.md) | 用单次运行 trace 解释一次 retrieve 或 ask 命令 | +| 9 | [RAG 失败实验室](rag-failure-lab.md) | 用策划好的失败案例比较 baseline 和 intervention 检索 | +| 10 | [答案质量评判](answer-quality-judging.md) | 用可替换的 judge 衡量生成答案和答案侧失败 | +| 11 | [上下文预算与结构化答案](context-budget-and-structured-answers.md) | Token 预算打包、结构化 JSON 输出 | +| 12 | [结构化与语义分块](structural-and-semantic-chunking.md) | 三层结构化分块、基于嵌入的语义分块与策略分发 | --- @@ -156,6 +157,7 @@ rag diagnose --cases-file tests/fixtures/failure/cases.jsonl --index-dir .tiny-r | 检索与生成 | 余弦搜索、提示词组装、LLM 调用 | `retrieval.py`, `prompting.py`, `generation.py` | | 持久化与测试 | 索引读写、往返完整性、假后端模式 | `index_writer.py`, `index_loader.py`, 测试套件 | | 检索机制 | BM25 关键词检索、混合搜索、RRF 融合 | `bm25.py`, `hybrid.py`, `retrieval.py` | +| 重排序 | 候选生成、交叉编码器评分与排名移动 | `reranker.py`, `retrieval.py`, `trace.py` | | 评估检索质量 | 检索质量指标 | `eval.py` | | 可观测性与调试 | 单次运行 trace 记录和 JSON 产物 | `trace.py`, `cli.py` | | RAG 失败实验室 | 失败案例诊断 | `failure.py`, `cli.py` | diff --git a/learning_materials/zh/reranking.md b/learning_materials/zh/reranking.md new file mode 100644 index 0000000..94250a8 --- /dev/null +++ b/learning_materials/zh/reranking.md @@ -0,0 +1,88 @@ +# 重排序 —— 从候选结果到最终证据 + +检索与重排序解决的是两个不同问题。第一阶段检索器需要以足够低的成本搜索整个索引, +生成一个有用的候选池;重排序器则在这个小得多的候选池上投入更多计算,决定哪些候选 +应该进入最终证据。 + +```text +全部文本块 -> 第一阶段检索器 -> 20 个候选 + -> 交叉编码器重排序 -> 最终 top 5 +``` + +第一阶段保护召回率:如果相关文本块从未进入候选池,重排序器就无法提升它。第二阶段 +改善排序,并经常提高精确率:进入上下文打包的干扰项更少。 + +## 双编码器与交叉编码器评分 + +稠密检索采用**双编码器**路径。查询和每个文本块分别生成嵌入向量,再比较两个向量。 +文本块向量可以预先计算并反复使用,因此适合搜索整个索引。 + +交叉编码器会同时读取查询与一个候选: + +```text +score = cross_encoder(query, candidate_text) +``` + +联合注意力能够识别单一余弦相似度可能忽略的细粒度查询—段落关系。代价是模型必须对 +每个候选运行一次,因此在本实验室中不适合直接对数百或数千个文本块进行第一遍搜索。 + +## 候选深度契约 + +`top_k` 与 `rerank_top_n` 的含义不同: + +- `rerank_top_n` 是送入交叉编码器的第一阶段候选数量。 +- `top_k` 是重排序后保留为最终证据的结果数量。 +- `rerank_top_n` 必须大于或等于 `top_k`。 + +增加候选深度可能找回第一阶段排位较低的证据,但也会增加交叉编码器计算量。重排序 +无法修复语料中缺失的文档、有破坏性的分块边界,或排在候选截断线之后的相关文本块。 + +## 读懂排名移动审计 + +Studio 的 **检索 → 重排序** 模块会展示第二阶段前后的每个候选: + +| 字段 | 含义 | +|---|---| +| 第一阶段排名与得分 | 候选在稠密、BM25 或混合检索中的位置和得分 | +| 重排序器得分 | 交叉编码器对查询—候选相关性的评分 | +| 最终排名 | 如果仍在最终 top-k 中,它在重排序后的位置 | +| 移动情况 | 上升、下降、不变或被丢弃 | + +不要把 BM25、余弦、RRF 和交叉编码器得分当成同一量纲直接比较。真正有用的信息是每种 +评分器产生的顺序,以及这个顺序如何发生变化。 + +## 检索与生成使用同一条路径 + +Explore 会把选定的重排序器同时应用于 **Retrieve** 和 **Live Ask**。这种一致性很 +重要:学习者检查的证据必须就是打包给生成阶段的证据,否则答案可能基于屏幕上没有 +展示的另一套候选顺序。 + +CLI 也提供相同机制: + +```bash +rag retrieve "What happens after queue delivery attempts are exhausted?" \ + --retriever hybrid --top-k 5 \ + --reranker cross-encoder --rerank-top-n 20 + +rag ask "What happens after queue delivery attempts are exhausted?" \ + --retriever hybrid --top-k 5 \ + --reranker cross-encoder --rerank-top-n 20 +``` + +## 建议检查什么 + +1. 在 Studio 中从一道策划好的重排序问题开始。 +2. 在第一阶段候选池中找到标准来源。 +3. 比较它的第一阶段排名与最终排名。 +4. 检查哪些候选被排除在最终 top 5 之外。 +5. 在评估模块中,使用全部 16 道已审核问题比较 Hybrid 与 Hybrid + 交叉编码器; + 解读汇总指标前先检查逐题证据。 + +重排序的价值在于产生更好的最终证据集合,而不只是让表格中的行发生移动。 + +## 相关指南 + +- [检索机制](retrieval-mechanics.md) —— BM25、稠密检索、RRF 与第一阶段候选列表。 +- [评估检索质量](evaluating-retrieval.md) —— 检查排名变化是否真正改善检索质量。 +- [上下文预算与结构化答案](context-budget-and-structured-answers.md) + —— 最终证据如何被选入提示词。 diff --git a/learning_materials/zh/retrieval-mechanics.md b/learning_materials/zh/retrieval-mechanics.md index afa6ed6..269e3fe 100644 --- a/learning_materials/zh/retrieval-mechanics.md +++ b/learning_materials/zh/retrieval-mechanics.md @@ -1,8 +1,8 @@ -# 检索机制 —— Dense、BM25 与混合检索 +# 检索机制 —— 词法、稠密、向量数据库与混合检索 -Phase 1 只提供一种检索器:dense 余弦相似度搜索。Phase 1.5 在此基础上增加了两种: -基于关键词的 BM25,以及通过 Reciprocal Rank Fusion 将 dense 和 BM25 融合的混合 -检索。两个新模块完成这项工作:`bm25.py`(关键词检索)和 `hybrid.py`(融合逻辑)。 +实验室提供三种第一阶段检索策略:BM25 关键词检索、稠密余弦相似度检索,以及通过 +Reciprocal Rank Fusion 融合两份列表的混合检索。Studio 会暴露每种方法背后的计算, +然后用完全相同的已存储向量比较本地 NumPy 索引与可选 Qdrant。 --- @@ -18,6 +18,21 @@ BM25 会提升该文档的排名。但它完全不理解同义词和改写。 混合检索结合了二者:dense 捕捉语义,BM25 捕捉关键词,Reciprocal Rank Fusion 将 两个排序列表合并为一个。 +## 跟随实时检索课程 + +在 Studio 中打开**检索**,可以依次学习六个可直接选择的模块: + +1. **词法检索** —— 查询 token、文档频率、BM25 逐词贡献与最终得分。 +2. **稠密检索** —— 向量预览、范数、点积、余弦相似度与最终顺序。 +3. **从本地向量到向量数据库** —— 让完全相同的文本块与向量经过 NumPy 和可选 + Qdrant。 +4. **混合检索** —— 稠密与 BM25 排名,以及各自的 RRF 贡献。 +5. **重排序** —— 第一阶段候选、交叉编码器得分与排名移动。 +6. **评估** —— 在 16 道已审核问题上比较两种配置。 + +这些是在内置 Cloudflare 语料上运行的实时实验,不是已保存回放,也不需要 LLM +服务商。 + --- ## BM25 关键词检索 (`bm25.py`) @@ -169,12 +184,41 @@ def retrieve_hybrid( 2. **运行 dense 检索**:调用 `retrieval.py` 中的 `retrieve(query, index, embedder, top_k=top_k)`。 3. **运行 BM25 检索**:调用 `bm25_retriever.retrieve(query, top_k=top_k)`。 4. **融合结果**:调用 `reciprocal_rank_fusion([dense_results, bm25_results], top_k=top_k)`。 -5. **返回**恰好 `top_k` 个结果,score 为融合后的 RRF 分数,rank 从 1 重新编号。 +5. **返回**最多 `top_k` 个结果,score 为融合后的 RRF 分数,rank 从 1 重新编号。 + 对于较小或空语料,结果可能更少。 返回的 `RetrievalResult.score` 是融合后的 RRF 分数——一个小正数,而非余弦相似度。 --- +## 从本地向量到向量数据库 + +NumPy 索引是规范的教学路径,因为每个向量、文本块 ID 与余弦计算都容易检查。 +Qdrant 是第二种存储与搜索后端,而不是另一套嵌入概念。 + +Studio 的向量数据库模块会直接复制结构化索引中的相同文本块和向量,不会重新分块或 +重新嵌入。因此,Qdrant 精确查询与本地 NumPy 查询的未过滤结果应该等价,只允许很小 +的浮点差异和平局顺序变化。 + +启动 Qdrant 后,建议检查: + +- 标识有序文本块/向量集合的共同来源指纹; +- 文本块 ID、文档路径、标题与来源分组等 point payload; +- NumPy 与 Qdrant 的并排结果列表; +- 针对 Durable Objects、Queues、KV、R2 或 Workflows 的独立元数据过滤演示。 + +过滤结果不是一致性对比,因为它有意只搜索一个子集。未过滤对比才是在检查两个后端 +是否等价地搜索了同一组向量。 + +Qdrant 始终是可选项: + +```bash +docker compose --profile qdrant up -d +``` + +即使没有 Qdrant,词法、稠密、混合、重排序、评估、Explore 和本地 NumPy 索引仍然 +可以使用。 + ## CLI 使用方式 ### `rag retrieve` 选择检索器 @@ -195,7 +239,7 @@ rag retrieve "what is watson assistant?" --retriever hybrid ### `rag eval` 选择检索器 ```bash -rag eval --qa-file qa.jsonl --retriever dense # Phase 1 基线 +rag eval --qa-file qa.jsonl --retriever dense # 语义基线 rag eval --qa-file qa.jsonl --retriever bm25 # 纯关键词 rag eval --qa-file qa.jsonl --retriever hybrid # 组合检索 ``` @@ -227,8 +271,8 @@ Context Recall : 0.667 | `tiny_rag_lab/hybrid.py` | `reciprocal_rank_fusion()`、`retrieve_hybrid()` | | `tiny_rag_lab/retrieval.py` | `retrieve()`、`retrieve_by_vector()` —— hybrid 使用的 dense 路径 | -`models.py`、`index_loader.py` 和 `index_writer.py` 无需任何修改——`RetrievalResult` -和 `Chunk` 数据类原生支持所有三种检索器。 +三种检索器都返回共享的 `RetrievalResult` 与 `Chunk` 契约。当前索引读写器还会携带 +Studio 实时解释和向量后端对比所需的模型与后端来源信息。 --- @@ -241,12 +285,14 @@ Context Recall : 0.667 其中一个。 2. **检查评估数据。** 在同一个 QA 集上分别用三种检索器运行 `rag eval`。看看每种 检索器答对了哪些问题——它会告诉你哪些类型的查询更依赖关键词,哪些更依赖语义。 -3. **追踪一次混合检索运行。** 在 `rag retrieve` 中加上 `--retriever hybrid`,查看 - trace 输出。dense 和 BM25 各自的得分在 RRF 融合之前是分开可见的。 +3. **解释一次混合检索运行。** 在 `rag retrieve` 中加上 `--retriever hybrid`,检查 + 最终融合后的文本块与 RRF 得分;再打开 Studio 的**检索 → 混合检索**,查看融合前 + 各自的 dense/BM25 排名与每一项贡献。 --- ## 相关文档 - [检索与生成](retrieval-and-generation.md) —— dense 余弦检索路径的详细说明。 -- [评估检索质量](evaluating-retrieval.md) —— 如何衡量哪种检索器效果最好。 \ No newline at end of file +- [评估检索质量](evaluating-retrieval.md) —— 如何衡量哪种检索器效果最好。 +- [重排序](reranking.md) —— 交叉编码器如何把第一阶段候选变成最终证据。 diff --git a/pyproject.toml b/pyproject.toml index e6f93eb..ceecc8e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "tiny-rag-lab" -version = "0.4.0" +version = "0.5.0" description = "A learning-first RAG engine and laboratory" readme = "README.md" requires-python = ">=3.11" diff --git a/scripts/build_cloudflare_seed_indexes.py b/scripts/build_cloudflare_seed_indexes.py index 4f8b561..01784bc 100644 --- a/scripts/build_cloudflare_seed_indexes.py +++ b/scripts/build_cloudflare_seed_indexes.py @@ -41,6 +41,7 @@ def build(corpus_dir: Path, indexes_dir: Path) -> None: write_index( target, docs, chunks, embeddings, corpus_root=runtime_corpus_root, embedding_backend=type(embedder).__name__, embedding_model=embedder.model_name, + embedding_revision=embedder.revision, embedding_dim=embedder.dim, chunk_size=chunk_size, chunk_overlap=overlap, chunking_strategy=strategy, index_backend="numpy", source_corpus_id=CORPUS_ID, ) @@ -49,8 +50,8 @@ def build(corpus_dir: Path, indexes_dir: Path) -> None: def main() -> None: parser = argparse.ArgumentParser() - parser.add_argument("--corpus-dir", type=Path, default=Path("assets/seed/v1/corpora/cloudflare-state-v1")) - parser.add_argument("--indexes-dir", type=Path, default=Path("assets/seed/v1/indexes")) + parser.add_argument("--corpus-dir", type=Path, default=Path("assets/seed/v2/corpora/cloudflare-state-v1")) + parser.add_argument("--indexes-dir", type=Path, default=Path("assets/seed/v2/indexes")) args = parser.parse_args() build(args.corpus_dir, args.indexes_dir) diff --git a/tests/test_browser_eval.py b/tests/test_browser_eval.py new file mode 100644 index 0000000..dec948a --- /dev/null +++ b/tests/test_browser_eval.py @@ -0,0 +1,325 @@ +import hashlib +import json +from pathlib import Path +import threading + +from fastapi.testclient import TestClient +import numpy as np +import pytest + +from tiny_rag_lab.browser_eval import ( + BUNDLED_EVALUATION_IDENTITY, + BrowserEvaluationCancelled, + BrowserEvaluationError, + RetrievalConfiguration, + run_browser_comparison, + sha256_file, + validate_evaluation_bundle, +) +from tiny_rag_lab.index_loader import load_index +from tiny_rag_lab.index_writer import write_index +from tiny_rag_lab.models import Chunk, Document, make_chunk_id +from tiny_rag_lab.qdrant_backend import source_vector_fingerprint +from tiny_rag_lab.web_api import create_app + + +class _Embedder: + calls = [] + + def __init__(self, *_args, **_kwargs): + self.calls.append((_args, _kwargs)) + self.dim = 2 + + def embed(self, texts): + return np.asarray([ + [1.0, 0.0] if "alpha" in text.lower() else [0.0, 1.0] + for text in texts + ], dtype=np.float32) + + +def test_release_identity_matches_reviewed_repository_assets(): + index_dir = Path("assets/seed/v1/indexes/cloudflare-state-structural-v1") + questions = Path("assets/seed/v2/corpora/cloudflare-state-v1/retrieval-questions.jsonl") + index = load_index(index_dir) + + assert sha256_file(questions) == BUNDLED_EVALUATION_IDENTITY["questions_sha256"] + assert sha256_file(index_dir / "chunks.jsonl") == BUNDLED_EVALUATION_IDENTITY["chunks_sha256"] + assert sha256_file(index_dir / "embeddings.npz") == BUNDLED_EVALUATION_IDENTITY["embeddings_sha256"] + assert source_vector_fingerprint(index) == BUNDLED_EVALUATION_IDENTITY["source_vector_fingerprint"] + + +def _bundle(root: Path): + index_dir = root / "indexes" / "cloudflare-state-structural-v1" + corpus_dir = root / "corpora" / "cloudflare-state-v1" + corpus_dir.mkdir(parents=True, exist_ok=True) + documents = [] + chunks = [] + vectors = [] + for name, text, vector in [ + ("alpha.md", "alpha queue delivery details", [1.0, 0.0]), + ("beta.md", "beta object storage details", [0.0, 1.0]), + ("mixed.md", "alpha and beta coordination", [0.7, 0.7]), + ("other.md", "unrelated worker runtime", [-1.0, 0.0]), + ]: + raw_hash = hashlib.sha256(text.encode()).hexdigest() + document = Document(name, name, name, "markdown", text, text, raw_hash) + chunk = Chunk( + make_chunk_id(name, 0, text), name, text, 0, len(text), + {"title": name, "path": name, "format": "markdown", "raw_hash": raw_hash}, + ) + documents.append(document) + chunks.append(chunk) + vectors.append(vector) + write_index( + index_dir, documents, chunks, np.asarray(vectors, dtype=np.float32), + corpus_root=corpus_dir / "files", embedding_backend="test", + embedding_model="test-embedder", embedding_dim=2, + chunk_size=800, chunk_overlap=120, chunking_strategy="structural", + source_corpus_id="cloudflare-state-v1", + ) + index_manifest = json.loads((index_dir / "manifest.json").read_text()) + index_manifest["embedding_revision"] = "test-revision" + (index_dir / "manifest.json").write_text(json.dumps(index_manifest)) + + questions = [] + for category in ("lexical", "dense", "hybrid", "reranking"): + for number in range(4): + alpha = number % 2 == 0 + questions.append({ + "question_id": f"{category}-{number}", + "category": category, + "question": f"{'alpha' if alpha else 'beta'} details {number}", + "gold_doc_ids": ["alpha.md" if alpha else "beta.md"], + }) + questions_path = corpus_dir / "retrieval-questions.jsonl" + questions_path.write_text("".join(json.dumps(item) + "\n" for item in questions)) + index = load_index(index_dir) + manifest = { + "questions_sha256": sha256_file(questions_path), + "chunks_sha256": sha256_file(index_dir / "chunks.jsonl"), + "embeddings_sha256": sha256_file(index_dir / "embeddings.npz"), + "source_vector_fingerprint": source_vector_fingerprint(index), + "document_count": 4, + "chunk_count": 4, + "distance_metric": "cosine", + "embedding_dimension": 2, + "embedding_model": "test-embedder", + "embedding_revision": "test-revision", + "reranker_model": "cross-encoder/ms-marco-MiniLM-L-6-v2", + "reranker_revision": "c5ee24cb16019beea0893ab7796b1df96625c6b8", + "question_count": 16, + } + manifest_path = corpus_dir / "evaluation-manifest.json" + manifest_path.write_text(json.dumps(manifest)) + return index_dir, questions_path, manifest_path + + +def _validate(paths): + manifest = json.loads(paths[2].read_text()) + return validate_evaluation_bundle(*paths, trusted_identity=manifest) + + +def test_bundle_validation_accepts_exact_reviewed_assets(tmp_path): + index, questions, manifest = _validate(_bundle(tmp_path)) + + assert len(index.chunks) == 4 + assert len(questions) == 16 + assert manifest["question_count"] == 16 + + +def test_bundle_validation_rejects_fingerprint_drift(tmp_path): + index_dir, questions_path, manifest_path = _bundle(tmp_path) + questions_path.write_text(questions_path.read_text() + "\n") + + with pytest.raises(BrowserEvaluationError, match="questions_sha256"): + validate_evaluation_bundle( + index_dir, questions_path, manifest_path, + trusted_identity=json.loads(manifest_path.read_text()), + ) + + +def test_bundle_validation_rejects_rewritten_artifact_and_manifest(tmp_path): + index_dir, questions_path, manifest_path = _bundle(tmp_path) + trusted = json.loads(manifest_path.read_text()) + chunks_path = index_dir / "chunks.jsonl" + chunks_path.write_text(chunks_path.read_text() + "\n") + rewritten = json.loads(manifest_path.read_text()) + rewritten["chunks_sha256"] = sha256_file(chunks_path) + manifest_path.write_text(json.dumps(rewritten)) + + with pytest.raises(BrowserEvaluationError, match="chunks_sha256"): + validate_evaluation_bundle( + index_dir, questions_path, manifest_path, trusted_identity=trusted, + ) + + +def test_comparison_keeps_metrics_and_full_evidence_separate(tmp_path): + index, questions, _manifest = _validate(_bundle(tmp_path)) + + result = run_browser_comparison( + questions, index, + RetrievalConfiguration("bm25", top_k=2), + RetrievalConfiguration("dense", top_k=2), + embedder=_Embedder(), + ) + + assert result["question_count"] == 16 + assert set(result["left"]["metrics"]) == { + "n_questions", "hit_rate", "mrr", "context_precision", "context_recall", + } + assert len(result["right"]["questions"]) == 16 + assert len(result["right"]["questions"][0]["evidence"]) == 2 + assert result["right"]["questions"][0]["evidence"][0]["doc_id"] == "alpha.md" + + +def test_comparison_rejects_effectively_identical_sides(tmp_path): + index, questions, _manifest = _validate(_bundle(tmp_path)) + + with pytest.raises(BrowserEvaluationError, match="different"): + run_browser_comparison( + questions, index, + RetrievalConfiguration("bm25", rerank_top_n=10), + RetrievalConfiguration("bm25", rerank_top_n=40), + embedder=_Embedder(), + ) + + +def test_comparison_cooperatively_cancels_between_sides(tmp_path): + index, questions, _manifest = _validate(_bundle(tmp_path)) + boundaries = [] + + with pytest.raises(BrowserEvaluationCancelled): + run_browser_comparison( + questions, index, + RetrievalConfiguration("bm25"), RetrievalConfiguration("dense"), + embedder=_Embedder(), + checkpoint=lambda current, total, side: boundaries.append((current, total, side)) or False, + ) + + assert boundaries == [(0, 16, "left")] + + +def test_evaluation_api_runs_job_and_publishes_result(tmp_path, monkeypatch): + _Embedder.calls.clear() + monkeypatch.setattr("tiny_rag_lab.web_api.SentenceTransformerEmbedder", _Embedder) + client = TestClient(create_app(tmp_path)) + paths = _bundle(tmp_path) + monkeypatch.setattr( + "tiny_rag_lab.browser_eval.BUNDLED_EVALUATION_IDENTITY", + json.loads(paths[2].read_text()), + ) + + status = client.get("/api/evaluations/status") + response = client.post("/api/evaluations", json={ + "left": {"retriever": "bm25", "top_k": 2}, + "right": {"retriever": "dense", "top_k": 2}, + }) + + assert status.json()["ready"] is True + assert response.status_code == 202 + job_id = response.json()["id"] + assert client.get(f"/api/jobs/{job_id}").json()["status"] == "complete" + result = client.get(f"/api/jobs/{job_id}/result").json() + assert result["question_count"] == 16 + assert result["bundle"]["index_id"] == "cloudflare-state-structural-v1" + assert any(options.get("revision") == "test-revision" for _args, options in _Embedder.calls) + + +def test_evaluation_api_rejects_identical_configs(tmp_path, monkeypatch): + monkeypatch.setattr("tiny_rag_lab.web_api.SentenceTransformerEmbedder", _Embedder) + client = TestClient(create_app(tmp_path)) + paths = _bundle(tmp_path) + monkeypatch.setattr( + "tiny_rag_lab.browser_eval.BUNDLED_EVALUATION_IDENTITY", + json.loads(paths[2].read_text()), + ) + + response = client.post("/api/evaluations", json={ + "left": {"retriever": "bm25", "top_k": 5, "rerank_top_n": 10}, + "right": {"retriever": "bm25", "top_k": 5, "rerank_top_n": 30}, + }) + + assert response.status_code == 422 + assert "different" in response.json()["detail"] + + +def test_evaluation_api_persists_progress_and_cancels_without_result(tmp_path, monkeypatch): + monkeypatch.setattr("tiny_rag_lab.web_api.SentenceTransformerEmbedder", _Embedder) + scheduled = [] + monkeypatch.setattr( + "tiny_rag_lab.web_api.BackgroundTasks.add_task", + lambda _self, function, *args, **kwargs: scheduled.append((function, args, kwargs)), + ) + client = TestClient(create_app(tmp_path)) + paths = _bundle(tmp_path) + monkeypatch.setattr( + "tiny_rag_lab.browser_eval.BUNDLED_EVALUATION_IDENTITY", + json.loads(paths[2].read_text()), + ) + checkpoint_reached = threading.Event() + release = threading.Event() + + def controlled_comparison(*_args, checkpoint, **_kwargs): + assert checkpoint(3, 16, "right") is True + checkpoint_reached.set() + assert release.wait(timeout=2) + if not checkpoint(3, 16, "left"): + raise BrowserEvaluationCancelled() + raise AssertionError("cancellation was not accepted") + + monkeypatch.setattr("tiny_rag_lab.web_api.run_browser_comparison", controlled_comparison) + response = client.post("/api/evaluations", json={ + "left": {"retriever": "bm25", "top_k": 2}, + "right": {"retriever": "dense", "top_k": 2}, + }) + job_id = response.json()["id"] + active = client.get("/api/jobs/active?kind=evaluation").json()["items"] + assert active[0]["left"] == { + "retriever": "bm25", "top_k": 2, "reranker": "none", "rerank_top_n": 20, + } + assert active[0]["right"]["retriever"] == "dense" + function, args, kwargs = scheduled.pop() + worker = threading.Thread(target=function, args=args, kwargs=kwargs) + worker.start() + assert checkpoint_reached.wait(timeout=2) + state = client.get(f"/api/jobs/{job_id}").json() + assert state["status"] == "running" + assert state["progress"]["current"] == 3 + + assert client.post(f"/api/jobs/{job_id}/cancel").json()["status"] == "cancel_requested" + release.set() + worker.join(timeout=2) + + assert client.get(f"/api/jobs/{job_id}").json()["status"] == "cancelled" + assert client.get(f"/api/jobs/{job_id}/result").status_code == 404 + + +def test_evaluation_api_failure_is_terminal_and_has_no_result(tmp_path, monkeypatch): + monkeypatch.setattr("tiny_rag_lab.web_api.SentenceTransformerEmbedder", _Embedder) + scheduled = [] + monkeypatch.setattr( + "tiny_rag_lab.web_api.BackgroundTasks.add_task", + lambda _self, function, *args, **kwargs: scheduled.append((function, args, kwargs)), + ) + client = TestClient(create_app(tmp_path)) + paths = _bundle(tmp_path) + monkeypatch.setattr( + "tiny_rag_lab.browser_eval.BUNDLED_EVALUATION_IDENTITY", + json.loads(paths[2].read_text()), + ) + monkeypatch.setattr( + "tiny_rag_lab.web_api.run_browser_comparison", + lambda *_args, **_kwargs: (_ for _ in ()).throw(RuntimeError("secret detail")), + ) + response = client.post("/api/evaluations", json={ + "left": {"retriever": "bm25"}, "right": {"retriever": "dense"}, + }) + job_id = response.json()["id"] + function, args, kwargs = scheduled.pop() + function(*args, **kwargs) + + state = client.get(f"/api/jobs/{job_id}").json() + assert state["status"] == "failed" + assert state["error"] == "Evaluation failed. Check local model readiness and the server logs, then try again." + assert "secret detail" not in state["error"] + assert client.get(f"/api/jobs/{job_id}/result").status_code == 404 diff --git a/tests/test_embeddings.py b/tests/test_embeddings.py index 39407dc..41b37d2 100644 --- a/tests/test_embeddings.py +++ b/tests/test_embeddings.py @@ -1,8 +1,10 @@ """Tests for T08 — embedding interface and fake embedder.""" +import sys +from types import SimpleNamespace import numpy as np import pytest -from tiny_rag_lab.embeddings import Embedder, FakeEmbedder +from tiny_rag_lab.embeddings import Embedder, FakeEmbedder, SentenceTransformerEmbedder # --------------------------------------------------------------------------- @@ -113,3 +115,21 @@ def test_fake_embedder_enables_fixture_retrieval(): scores = corpus_vecs @ query_vec[0] # dot product = cosine (unit vecs) top = int(np.argmax(scores)) assert top == 0 # exact match should score highest + + +def test_default_sentence_transformer_snapshot_is_revision_pinned(monkeypatch): + calls = [] + + class Model: + def __init__(self, model_name, **options): + calls.append((model_name, options)) + + monkeypatch.setitem(sys.modules, "sentence_transformers", SimpleNamespace(SentenceTransformer=Model)) + + embedder = SentenceTransformerEmbedder(local_files_only=True) + + assert embedder.revision == SentenceTransformerEmbedder.DEFAULT_REVISION + assert calls == [(SentenceTransformerEmbedder.DEFAULT_MODEL, { + "local_files_only": True, + "revision": SentenceTransformerEmbedder.DEFAULT_REVISION, + })] diff --git a/tests/test_image_contract.py b/tests/test_image_contract.py new file mode 100644 index 0000000..d183495 --- /dev/null +++ b/tests/test_image_contract.py @@ -0,0 +1,45 @@ +from pathlib import Path + + +def test_studio_image_is_cpu_only_and_uses_seed_v2(): + dockerfile = Path("Dockerfile").read_text() + + assert "https://download.pytorch.org/whl/cpu" in dockerfile + assert "torch==2.7.1+cpu" in dockerfile + assert "COPY assets/seed/v2 /opt/tiny-rag-lab/seeds/v2" in dockerfile + assert "nvidia-" not in dockerfile.lower() + + +def test_full_bundles_both_pinned_models_while_slim_defers_them(): + dockerfile = Path("Dockerfile").read_text() + + assert 'if [ "$LAB_IMAGE_VARIANT" = "full" ]' in dockerfile + assert "SentenceTransformerEmbedder()" in dockerfile + assert "CrossEncoderReranker.ensure_default_model(local_files_only=False)" in dockerfile + assert dockerfile.count('if [ "$LAB_IMAGE_VARIANT" = "full" ]') == 1 + + +def test_slim_model_downloads_use_the_persistent_data_volume(): + entrypoint = Path("docker-entrypoint.sh").read_text() + + assert "export HF_HOME=/data/models" in entrypoint + assert "export HF_HUB_CACHE=/data/models/hub" in entrypoint + assert "SENTENCE_TRANSFORMERS_HOME" not in entrypoint + + +def test_model_layer_precedes_frequently_changed_runtime_assets(): + dockerfile = Path("Dockerfile").read_text() + + model_layer = dockerfile.index("CrossEncoderReranker.ensure_default_model") + assert model_layer < dockerfile.index("COPY assets/seed/v2") + assert model_layer < dockerfile.index("COPY --from=web-build") + assert model_layer < dockerfile.index("COPY --from=guides-build") + assert model_layer < dockerfile.index("COPY docker-entrypoint.sh") + + +def test_python_ci_installs_cpu_only_torch_without_syncing_cuda_lock_entries(): + workflow = Path(".github/workflows/ci.yml").read_text() + + assert "https://download.pytorch.org/whl/cpu" in workflow + assert "torch==2.7.1+cpu" in workflow + assert "uv run --no-sync pytest" in workflow diff --git a/tests/test_jobs.py b/tests/test_jobs.py new file mode 100644 index 0000000..d337685 --- /dev/null +++ b/tests/test_jobs.py @@ -0,0 +1,100 @@ +import json + +import pytest + +from tiny_rag_lab.jobs import ( + JobConflictError, + JobNotFoundError, + LocalJobStore, + atomic_write_json, +) + + +def test_atomic_json_replace_leaves_no_temporary_files(tmp_path): + path = tmp_path / "job.json" + atomic_write_json(path, {"status": "queued"}) + atomic_write_json(path, {"status": "running", "progress": {"current": 1}}) + + assert json.loads(path.read_text()) == { + "status": "running", "progress": {"current": 1}, + } + assert list(tmp_path.glob("*.tmp")) == [] + + +def test_store_admits_only_one_active_job_and_discovers_it(tmp_path): + store = LocalJobStore(tmp_path) + job = store.admit("evaluation", preset="dense-vs-hybrid") + + assert store.active() == [job] + assert store.active(kind="evaluation") == [job] + assert store.active(kind="index") == [] + with pytest.raises(JobConflictError, match=job["id"]): + store.admit("index") + + +def test_queued_and_running_cancellation_become_terminal_at_checkpoint(tmp_path): + queued_store = LocalJobStore(tmp_path / "queued") + queued = queued_store.admit("evaluation") + assert queued_store.request_cancel(queued["id"])["status"] == "cancel_requested" + assert queued_store.start(queued["id"], total=16) is False + assert queued_store.read(queued["id"])["status"] == "cancelled" + + running_store = LocalJobStore(tmp_path / "running") + running = running_store.admit("evaluation") + assert running_store.start(running["id"], total=16) + running_store.request_cancel(running["id"]) + assert running_store.progress( + running["id"], 1, total=16, message="Finished current question", + ) is False + assert running_store.read(running["id"])["status"] == "cancelled" + + +def test_only_complete_job_publishes_a_readable_result(tmp_path): + store = LocalJobStore(tmp_path) + job = store.admit("evaluation") + store.start(job["id"], total=2) + store.progress(job["id"], 1, total=2, message="Question 1 of 2") + completed = store.complete(job["id"], result={"metrics": {"hit_rate": 1.0}}) + + assert completed["status"] == "complete" + assert completed["result_available"] is True + assert store.result(job["id"]) == {"metrics": {"hit_rate": 1.0}} + + failed = store.admit("evaluation") + store.start(failed["id"]) + store.fail(failed["id"], "failed safely") + with pytest.raises(JobNotFoundError): + store.result(failed["id"]) + + +def test_publication_boundary_rejects_late_cancellation(tmp_path): + store = LocalJobStore(tmp_path) + job = store.admit("evaluation") + store.start(job["id"], total=1) + store.progress(job["id"], 1, total=1, message="Work complete") + + assert store.begin_publish(job["id"], message="Publishing comparison") is True + assert store.request_cancel(job["id"])["status"] == "publishing" + completed = store.complete(job["id"], result={"questions": []}) + + assert completed["status"] == "complete" + assert store.result(job["id"]) == {"questions": []} + + +def test_restart_recovery_fails_work_but_honors_requested_cancellation(tmp_path): + store = LocalJobStore(tmp_path) + running = store.admit("index") + store.start(running["id"], total=5) + # Seed a second record directly to simulate state recovered from another + # process; admission correctly prevents creating it through the API. + cancelled = { + "id": "evaluation-cancel", "kind": "evaluation", + "status": "cancel_requested", + } + atomic_write_json(tmp_path / "evaluation-cancel.json", cancelled) + + store.recover_interrupted() + + assert store.read(running["id"])["status"] == "failed" + assert "restarted" in store.read(running["id"])["error"] + assert store.read("evaluation-cancel")["status"] == "cancelled" diff --git a/tests/test_lab_trace.py b/tests/test_lab_trace.py index 415b4fe..9441fdc 100644 --- a/tests/test_lab_trace.py +++ b/tests/test_lab_trace.py @@ -1,6 +1,7 @@ import json from tiny_rag_lab.lab_trace import ( + LAB_TRACE_SCHEMA_VERSION, EvidenceSnapshot, build_lab_run, load_lab_run, @@ -47,6 +48,14 @@ def test_lab_run_is_json_safe_and_keeps_full_evidence(tmp_path): score_semantics="cosine_similarity[-1,1]", ) ], + candidates=[ + EvidenceSnapshot( + chunk_id="chunk-2", doc_id="other.md", title="Other", + path="/corpus/other.md", text="A pre-rerank candidate.", + rank=2, score=0.4, score_semantics="cosine_similarity[-1,1]", + ) + ], + explanations={"dense": {"dimension": 2}}, ) path = tmp_path / "run.json" @@ -56,5 +65,24 @@ def test_lab_run_is_json_safe_and_keeps_full_evidence(tmp_path): assert raw["operation"] == "retrieve" assert raw["query_vector"] == [0.1, 0.2] assert raw["evidence"][0]["text"] == "Use the full runbook text." + assert raw["candidates"][0]["chunk_id"] == "chunk-2" + assert raw["explanations"]["dense"]["dimension"] == 2 + assert raw["schema_version"] == LAB_TRACE_SCHEMA_VERSION == "1.1" assert "api_key" not in json.dumps(raw).lower() assert load_lab_run(path)["run_id"] == run.run_id + + +def test_schema_1_0_run_loads_without_phase_3_4_fields(tmp_path): + path = tmp_path / "legacy.json" + path.write_text(json.dumps({ + "schema_version": "1.0", + "run_id": "legacy-run", + "operation": "retrieve", + "evidence": [], + }), encoding="utf-8") + + loaded = load_lab_run(path) + + assert loaded["schema_version"] == "1.0" + assert "candidates" not in loaded + assert "explanations" not in loaded diff --git a/tests/test_qdrant_backend.py b/tests/test_qdrant_backend.py index 45e5f03..d1803cf 100644 --- a/tests/test_qdrant_backend.py +++ b/tests/test_qdrant_backend.py @@ -1,9 +1,15 @@ import numpy as np import pytest +from qdrant_client import QdrantClient from tiny_rag_lab.index_loader import LoadedIndex -from tiny_rag_lab.models import Chunk -from tiny_rag_lab.qdrant_backend import QdrantBackendError, QdrantIndexBackend +from tiny_rag_lab.models import Chunk, RetrievalResult +from tiny_rag_lab.qdrant_backend import ( + QdrantBackendError, + QdrantIndexBackend, + compare_exact_rankings, + source_vector_fingerprint, +) def _index() -> LoadedIndex: @@ -17,6 +23,32 @@ def _index() -> LoadedIndex: ) +def _teaching_index() -> LoadedIndex: + chunks = [ + Chunk( + chunk_id="queues", doc_id="queues/retries.md", text="queue retries", + char_start=0, char_end=13, + metadata={"title": "Queue retries", "path": "/source/queues/retries.md"}, + ), + Chunk( + chunk_id="kv", doc_id="kv/cache.md", text="kv cache", + char_start=0, char_end=8, + metadata={"title": "KV cache", "path": "/source/kv/cache.md"}, + ), + ] + return LoadedIndex( + manifest={"backend_identity": "teaching"}, chunks=chunks, + embeddings=np.array([[2.0, 0.0], [0.0, 3.0]], dtype=np.float32), + chunk_ids=[chunk.chunk_id for chunk in chunks], + ) + + +def _memory_backend() -> QdrantIndexBackend: + backend = object.__new__(QdrantIndexBackend) + backend._client = QdrantClient(":memory:") + return backend + + def test_qdrant_connection_failure_becomes_actionable_backend_error(): class _UnavailableClient: def query_points(self, **_kwargs): @@ -43,3 +75,185 @@ def query_points(self, **_kwargs): with pytest.raises(QdrantBackendError, match="does not match"): backend.search(np.array([1.0, 0.0]), _index(), top_k=1) + + +def test_source_vector_fingerprint_covers_ids_order_and_float32_vectors(): + index = _teaching_index() + original = source_vector_fingerprint(index) + assert original == source_vector_fingerprint(index) + + changed = _teaching_index() + changed.embeddings[0, 0] += np.float32(0.01) + assert source_vector_fingerprint(changed) != original + + reordered = _teaching_index() + reordered.chunk_ids.reverse() + assert source_vector_fingerprint(reordered) != original + + +def test_prepare_teaching_collection_is_verified_and_idempotent(): + backend = _memory_backend() + index = _teaching_index() + + first = backend.prepare_teaching_collection("course", index) + second = backend.prepare_teaching_collection("course", index) + + assert first.verified is True and first.reused is False + assert second.verified is True and second.reused is True + assert first.collection == second.collection + assert first.source_fingerprint == source_vector_fingerprint(index) + records = backend._client.retrieve( + "course", ids=[0, 1], with_payload=True, with_vectors=True, + ) + assert records[0].vector == pytest.approx([1.0, 0.0]) + assert records[0].payload == { + "chunk_id": "queues", + "doc_id": "queues/retries.md", + "title": "Queue retries", + "path": "queues/retries.md", + "source_group": "queues", + "source_fingerprint": first.source_fingerprint, + } + + +def test_prepare_repairs_mismatched_payload_before_reuse(): + backend = _memory_backend() + index = _teaching_index() + first = backend.prepare_teaching_collection("course", index) + backend._client.set_payload( + first.collection, payload={"source_fingerprint": "stale"}, points=[0], + ) + + repaired = backend.prepare_teaching_collection("course", index) + + assert repaired.reused is False + assert backend.teaching_status("course", index) is not None + + +def test_prepare_rejects_extra_points_and_keeps_alias_live_until_cutover(): + from qdrant_client.models import PointStruct + + backend = _memory_backend() + index = _teaching_index() + first = backend.prepare_teaching_collection("course", index) + backend._client.upsert( + first.collection, + points=[PointStruct(id=99, vector=[1.0, 0.0], payload={"chunk_id": "unexpected"})], + wait=True, + ) + assert backend.teaching_status("course", index) is None + + original_create = backend._client.create_collection + original_upsert = backend._client.upsert + observed_alias_targets = [] + + def assert_old_alias_then(callable_, *args, **kwargs): + aliases = {item.alias_name: item.collection_name for item in backend._client.get_aliases().aliases} + observed_alias_targets.append(aliases.get("course")) + assert aliases.get("course") == first.collection + return callable_(*args, **kwargs) + + backend._client.create_collection = lambda *args, **kwargs: assert_old_alias_then(original_create, *args, **kwargs) + backend._client.upsert = lambda *args, **kwargs: assert_old_alias_then(original_upsert, *args, **kwargs) + repaired = backend.prepare_teaching_collection("course", index) + + assert repaired.reused is False + assert repaired.collection != first.collection + assert observed_alias_targets == [first.collection, first.collection] + assert backend.teaching_status("course", index) is not None + assert backend._client.get_collection("course").points_count == len(index.chunks) + assert backend.prepare_teaching_collection("course", index).reused is True + + +def test_prepare_repairs_every_field_used_by_payload_inspection_and_filters(): + backend = _memory_backend() + index = _teaching_index() + first = backend.prepare_teaching_collection("course", index) + backend._client.set_payload( + first.collection, + payload={"doc_id": "wrong.md", "path": "wrong.md", "source_group": "wrong"}, + points=[1], + ) + + assert backend.teaching_status("course", index) is None + repaired = backend.prepare_teaching_collection("course", index) + filtered = backend.search_exact( + "course", np.array([0.0, 1.0], dtype=np.float32), index, top_k=2, + source_group="kv", + ) + + assert repaired.reused is False + assert [hit.result.chunk.chunk_id for hit in filtered] == ["kv"] + assert filtered[0].payload["doc_id"] == "kv/cache.md" + assert filtered[0].payload["path"] == "kv/cache.md" + + +def test_exact_search_supports_separate_source_group_filter(): + backend = _memory_backend() + index = _teaching_index() + backend.prepare_teaching_collection("course", index) + + unfiltered = backend.search_exact( + "course", np.array([1.0, 0.0], dtype=np.float32), index, top_k=2, + ) + filtered = backend.search_exact( + "course", np.array([1.0, 0.0], dtype=np.float32), index, top_k=2, + source_group="kv", + ) + + assert [hit.result.chunk.chunk_id for hit in unfiltered] == ["queues", "kv"] + assert [hit.result.chunk.chunk_id for hit in filtered] == ["kv"] + assert filtered[0].payload["source_group"] == "kv" + + +def test_legacy_minimal_payload_remains_searchable_but_disables_filters(): + from qdrant_client.models import Distance, PointStruct, VectorParams + + backend = _memory_backend() + index = _index() + backend._client.create_collection( + "collection", vectors_config=VectorParams(size=2, distance=Distance.COSINE), + ) + backend._client.upsert( + "collection", points=[PointStruct(id=0, vector=[1.0, 0.0], payload={"chunk_id": "known"})], + wait=True, + ) + + results = backend.search(np.array([1.0, 0.0], dtype=np.float32), index, top_k=1) + + assert results[0].result.chunk.chunk_id == "known" + assert backend.payload_filters_available("collection", index) is False + + +def test_exact_parity_treats_near_equal_score_reordering_as_tied(): + first, second = _teaching_index().chunks + numpy_results = [ + RetrievalResult(first, score=0.500000, rank=1), + RetrievalResult(second, score=0.499996, rank=2), + ] + qdrant_results = [ + RetrievalResult(second, score=0.500001, rank=1), + RetrievalResult(first, score=0.499999, rank=2), + ] + + report = compare_exact_rankings(numpy_results, qdrant_results, tolerance=1e-5) + + assert report.equivalent is True + assert all(item.equivalent for item in report.items) + + +def test_exact_parity_reports_real_rank_mismatch(): + first, second = _teaching_index().chunks + numpy_results = [ + RetrievalResult(first, score=0.9, rank=1), + RetrievalResult(second, score=0.2, rank=2), + ] + qdrant_results = [ + RetrievalResult(second, score=0.8, rank=1), + RetrievalResult(first, score=0.3, rank=2), + ] + + report = compare_exact_rankings(numpy_results, qdrant_results) + + assert report.equivalent is False + assert not all(item.equivalent for item in report.items) diff --git a/tests/test_reranker.py b/tests/test_reranker.py index ce3aa9f..64d0123 100644 --- a/tests/test_reranker.py +++ b/tests/test_reranker.py @@ -10,11 +10,13 @@ import dataclasses import json +from pathlib import Path import pytest from tiny_rag_lab.models import Chunk, RetrievalResult from tiny_rag_lab.reranker import ( + CrossEncoderReranker, FakeReranker, RerankResult, apply_reranker, @@ -293,3 +295,84 @@ def test_chunk_traces_text_preview_truncates_to_120_chars(): results = [RetrievalResult(chunk=chunk, score=0.5, rank=1)] traces = chunk_traces_from_rerank(results, None) assert len(traces[0].text_preview) == 120 + + +def test_cross_encoder_pins_only_the_default_model(monkeypatch): + calls = [] + + class _Model: + def __init__(self, model_name, **kwargs): + calls.append((model_name, kwargs)) + + def predict(self, _pairs): + return [0.5] + + monkeypatch.setattr("sentence_transformers.CrossEncoder", _Model) + candidate = _result("a", rank=1, score=0.1) + + CrossEncoderReranker(local_files_only=True).rerank("query", [candidate]) + CrossEncoderReranker(model_name="custom/model", local_files_only=True).rerank( + "query", [candidate], + ) + + assert calls[0] == ( + CrossEncoderReranker.DEFAULT_MODEL, + { + "local_files_only": True, + "revision": CrossEncoderReranker.DEFAULT_REVISION, + }, + ) + assert calls[1] == ("custom/model", {"local_files_only": True}) + + +def _fake_complete_reranker_snapshot(root: Path) -> Path: + root.mkdir(parents=True) + for name in ("config.json", "tokenizer_config.json", "model.safetensors", "tokenizer.json"): + (root / name).write_text("{}", encoding="utf-8") + return root + + +def test_default_reranker_readiness_checks_pinned_snapshot_without_network(monkeypatch, tmp_path): + calls = [] + snapshot = _fake_complete_reranker_snapshot(tmp_path / "model") + monkeypatch.setattr( + "huggingface_hub.snapshot_download", + lambda **kwargs: calls.append(kwargs) or str(snapshot), + ) + + assert CrossEncoderReranker.default_model_available() is True + assert calls == [{ + "repo_id": CrossEncoderReranker.DEFAULT_MODEL, + "revision": CrossEncoderReranker.DEFAULT_REVISION, + "local_files_only": True, + }] + + +def test_default_reranker_download_requests_exact_snapshot(monkeypatch, tmp_path): + calls = [] + snapshot = _fake_complete_reranker_snapshot(tmp_path / "model") + monkeypatch.setattr( + "huggingface_hub.snapshot_download", + lambda **kwargs: calls.append(kwargs) or str(snapshot), + ) + + assert CrossEncoderReranker.ensure_default_model(local_files_only=False) == str(snapshot) + assert calls == [{ + "repo_id": CrossEncoderReranker.DEFAULT_MODEL, + "revision": CrossEncoderReranker.DEFAULT_REVISION, + "local_files_only": False, + }] + + +def test_default_reranker_rejects_an_incomplete_cached_snapshot(monkeypatch, tmp_path): + snapshot = tmp_path / "partial-model" + snapshot.mkdir() + (snapshot / "config.json").write_text("{}", encoding="utf-8") + monkeypatch.setattr( + "huggingface_hub.snapshot_download", + lambda **_kwargs: str(snapshot), + ) + + assert CrossEncoderReranker.default_model_available() is False + with pytest.raises(RuntimeError, match="snapshot is incomplete"): + CrossEncoderReranker.ensure_default_model(local_files_only=False) diff --git a/tests/test_retrieval_explanations.py b/tests/test_retrieval_explanations.py new file mode 100644 index 0000000..6e84a81 --- /dev/null +++ b/tests/test_retrieval_explanations.py @@ -0,0 +1,138 @@ +"""Calculation-level contracts used by the Phase 3.4 Retrieval UI.""" + +import json + +import numpy as np +import pytest + +from tiny_rag_lab.bm25 import BM25Retriever +from tiny_rag_lab.hybrid import reciprocal_rank_fusion_with_explanation +from tiny_rag_lab.index_loader import LoadedIndex +from tiny_rag_lab.models import Chunk, RetrievalResult +from tiny_rag_lab.reranker import RerankResult, explain_rerank +from tiny_rag_lab.retrieval import explain_dense_results, retrieve_by_vector + + +def _chunk(chunk_id: str, text: str) -> Chunk: + return Chunk( + chunk_id=chunk_id, + doc_id=f"{chunk_id}.md", + text=text, + char_start=0, + char_end=len(text), + metadata={}, + ) + + +def _result(chunk: Chunk, rank: int, score: float) -> RetrievalResult: + return RetrievalResult(chunk=chunk, rank=rank, score=score) + + +def test_bm25_explanation_reproduces_ranked_scores(): + retriever = BM25Retriever([ + _chunk("first", "rare term appears twice rare"), + _chunk("second", "common words only"), + _chunk("third", "rare once"), + ]) + + results, explanation = retriever.retrieve_with_explanation("rare rare term", top_k=3) + + assert explanation.query_tokens == ["rare", "rare", "term"] + assert explanation.corpus_size == 3 + assert [candidate.chunk_id for candidate in explanation.candidates] == [ + result.chunk.chunk_id for result in results + ] + for candidate in explanation.candidates: + assert sum(term.contribution for term in candidate.terms) == pytest.approx( + candidate.score, abs=1e-12, + ) + rare = next(term for term in explanation.candidates[0].terms if term.term == "rare") + assert rare.query_frequency == 2 + assert rare.term_frequency == 2 + assert rare.document_frequency == 2 + + +def test_bm25_empty_explanation_is_still_typed(): + results, explanation = BM25Retriever([]).retrieve_with_explanation("term") + assert results == [] + assert explanation.query_tokens == ["term"] + assert explanation.candidates == [] + + +def test_dense_explanation_reproduces_cosine_and_preserves_sign(): + chunks = [_chunk("positive", "positive"), _chunk("negative", "negative")] + index = LoadedIndex( + manifest={}, + chunks=chunks, + embeddings=np.asarray([[1.0, -1.0], [-1.0, 1.0]], dtype=np.float32), + chunk_ids=[chunk.chunk_id for chunk in chunks], + ) + query = np.asarray([2.0, -2.0], dtype=np.float32) + results = retrieve_by_vector(query, index, top_k=2) + + explanation = explain_dense_results(query, index, results, preview_dimensions=2) + + assert explanation[0].chunk_id == "positive" + assert explanation[0].dot_product == pytest.approx(4.0) + assert explanation[0].cosine_similarity == pytest.approx(results[0].score) + assert explanation[0].query_vector_preview == [2.0, -2.0] + assert explanation[0].chunk_vector_preview == [1.0, -1.0] + assert explanation[1].cosine_similarity == pytest.approx(-1.0) + + +def test_dense_explanation_rejects_wrong_dimension(): + chunk = _chunk("one", "one") + index = LoadedIndex( + manifest={}, chunks=[chunk], + embeddings=np.asarray([[1.0, 0.0]], dtype=np.float32), + chunk_ids=["one"], + ) + with pytest.raises(ValueError, match="dimension"): + explain_dense_results( + np.asarray([1.0], dtype=np.float32), index, + [_result(chunk, 1, 1.0)], + ) + + +def test_rrf_explanation_reproduces_fused_score(): + first, second = _chunk("first", "first"), _chunk("second", "second") + dense = [_result(first, 1, 0.8), _result(second, 2, 0.7)] + bm25 = [_result(second, 1, 4.0), _result(first, 2, 3.0)] + + fused, explanation = reciprocal_rank_fusion_with_explanation( + [dense, bm25], top_k=2, source_names=["dense", "bm25"], + ) + + assert [item.chunk_id for item in explanation] == [item.chunk.chunk_id for item in fused] + for candidate in explanation: + assert sum(source.contribution for source in candidate.sources) == pytest.approx( + candidate.score, + ) + assert {source.source for source in candidate.sources} == {"dense", "bm25"} + assert explanation[0].sources[0].contribution == pytest.approx(1 / 61) + + +def test_rrf_explanation_requires_one_name_per_list(): + with pytest.raises(ValueError, match="source_names"): + reciprocal_rank_fusion_with_explanation([[]], top_k=1, source_names=[]) + + +def test_rerank_explanation_marks_movement_and_dropped_candidates(): + audit = [ + RerankResult("a", pre_rank=1, post_rank=3, pre_score=0.9, post_score=0.1), + RerankResult("b", pre_rank=2, post_rank=1, pre_score=0.8, post_score=0.9), + RerankResult("c", pre_rank=3, post_rank=2, pre_score=0.7, post_score=0.8), + RerankResult("d", pre_rank=4, post_rank=4, pre_score=0.6, post_score=0.0), + ] + + explanation = explain_rerank(audit, final_top_k=3) + + assert [item.outcome for item in explanation] == [ + "moved_down", "moved_up", "moved_up", "dropped", + ] + assert explanation[0].rank_delta == -2 + assert explanation[1].rank_delta == 1 + assert explanation[3].final_rank is None + assert explanation[3].rank_delta is None + # The explanation remains directly JSON-safe for API artifacts. + json.dumps([item.__dict__ for item in explanation]) diff --git a/tests/test_seed_assets.py b/tests/test_seed_assets.py index 7eade3e..17d7e78 100644 --- a/tests/test_seed_assets.py +++ b/tests/test_seed_assets.py @@ -4,7 +4,8 @@ import pytest -from tiny_rag_lab.seed_assets import SeedAssetError, seed_bundled_assets +from tiny_rag_lab.browser_eval import validate_evaluation_bundle +from tiny_rag_lab.seed_assets import SeedAssetError, load_seed_manifest, seed_bundled_assets, verify_asset def _digest(path: Path) -> str: @@ -91,6 +92,29 @@ def test_seed_upgrades_a_matching_prior_managed_version(tmp_path: Path): assert (data / "corpora/cloudflare-state-v1/source.md").read_text() == "v2" +def test_seed_recovers_when_publish_finished_before_state_update(tmp_path: Path): + root = _seed(tmp_path, version="v1", text="v1") + data = tmp_path / "data" + seed_bundled_assets(data, root) + _seed(tmp_path, version="v2", text="v2") + + # Reproduce the durable state immediately after an interrupted promotion: + # the v2 directory is published, but .seed-state.json still owns v1. + target = data / "corpora/cloudflare-state-v1" + (target / "source.md").write_text("v2", encoding="utf-8") + backup = target.with_name(".cloudflare-state-v1.seed-backup") + backup.mkdir() + (backup / "source.md").write_text("v1", encoding="utf-8") + + result = seed_bundled_assets(data, root)[0] + + assert result.status == "recovered" + assert not backup.exists() + state = json.loads((data / ".seed-state.json").read_text()) + assert state["assets"]["cloudflare-state-v1"]["seed_version"] == "v2" + assert seed_bundled_assets(data, root)[0].status == "ready" + + def test_seed_preserves_modified_managed_target_and_extra_user_file(tmp_path: Path): root = _seed(tmp_path) data = tmp_path / "data" @@ -128,3 +152,23 @@ def test_bundled_cloudflare_indexes_reference_promoted_data_paths(): assert all(entry["path"].startswith(manifest["corpus_root"] + "/") for entry in manifest["corpus_files"]) first_chunk = json.loads((seed_root / "indexes" / index_id / "chunks.jsonl").read_text().splitlines()[0]) assert first_chunk["metadata"]["path"].startswith(manifest["corpus_root"] + "/") + + +def test_v2_seed_manifest_verifies_and_promotes_reviewed_evaluation_bundle(tmp_path): + seed_root = Path(__file__).parents[1] / "assets" / "seed" / "v2" + manifest = load_seed_manifest(seed_root) + assert manifest["seed_version"] == "v2" + for asset in manifest["assets"]: + verify_asset(seed_root / asset["path"], asset) + + results = seed_bundled_assets(tmp_path / "data", seed_root) + assert all(result.status == "seeded" for result in results) + index, questions, evaluation = validate_evaluation_bundle( + tmp_path / "data/indexes/cloudflare-state-structural-v1", + tmp_path / "data/corpora/cloudflare-state-v1/retrieval-questions.jsonl", + tmp_path / "data/corpora/cloudflare-state-v1/evaluation-manifest.json", + ) + assert len(index.chunks) == 537 + assert len(questions) == 16 + assert evaluation["question_count"] == 16 + assert index.manifest["embedding_revision"] == "1110a243fdf4706b3f48f1d95db1a4f5529b4d41" diff --git a/tests/test_web_api.py b/tests/test_web_api.py index 2dfdfd3..9f80e2a 100644 --- a/tests/test_web_api.py +++ b/tests/test_web_api.py @@ -4,9 +4,13 @@ from fastapi.testclient import TestClient import numpy as np +import pytest from tiny_rag_lab.index_writer import write_index +from tiny_rag_lab.jobs import LocalJobStore from tiny_rag_lab.models import Chunk, Document, make_chunk_id +from tiny_rag_lab.qdrant_backend import QdrantBackendError, QdrantIndexBackend +from tiny_rag_lab.reranker import FakeReranker from tiny_rag_lab.web_api import create_app @@ -49,6 +53,54 @@ def _write_catalog_index(root, *, source_corpus_id="watsonxdocsqa-v1", index_id= ) +def _write_retrieval_materials( + root, *, category="lexical", question="What does catalog evidence explain?", +): + target = root / "corpora" / "cloudflare-state-v1" + target.mkdir(parents=True, exist_ok=True) + item = { + "question_id": "cf-lex-test", + "category": category, + "question": question, + "gold_doc_ids": ["doc.md"], + "teaching_note": {"en": "Inspect the term.", "zh": "检查词项。"}, + "expected_observation": {"en": "Exact terms contribute.", "zh": "精确词项会贡献分数。"}, + } + (target / "retrieval-questions.jsonl").write_text(json.dumps(item) + "\n") + return item + + +def _write_teaching_index(root, *, index_backend="numpy", backend_identity=None): + documents = [] + chunks = [] + vectors = [] + for path, text, vector in [ + ("r2/how-r2-works.md", "catalog evidence for object storage", [0.0, 1.0]), + ("queues/retries.md", "alpha queue retry evidence", [1.0, 0.0]), + ]: + raw_hash = hashlib.sha256(text.encode()).hexdigest() + document = Document( + doc_id=path, path=path, title=Path(path).stem.replace("-", " ").title(), + format="markdown", raw_text=text, normalized_text=text, raw_hash=raw_hash, + ) + chunk = Chunk( + chunk_id=make_chunk_id(path, 0, text), doc_id=path, text=text, + char_start=0, char_end=len(text), + metadata={"title": document.title, "path": path, "format": "markdown", "raw_hash": raw_hash}, + ) + documents.append(document) + chunks.append(chunk) + vectors.append(vector) + write_index( + root / "indexes" / "cloudflare-state-structural-v1", + documents, chunks, np.asarray(vectors, dtype=np.float32), + corpus_root=root / "corpora" / "cloudflare-state-v1" / "files", + embedding_backend="test", embedding_model="test-embedder", embedding_dim=2, + chunk_size=800, chunk_overlap=120, source_corpus_id="cloudflare-state-v1", + index_backend=index_backend, backend_identity=backend_identity, + ) + + def test_health_and_provider_status_are_non_secret(tmp_path): client = TestClient(create_app(tmp_path)) assert client.get("/api/health").json()["status"] == "ok" @@ -67,6 +119,96 @@ def test_backend_status_reports_numpy_and_optional_qdrant_readiness(tmp_path, mo ] +def test_qdrant_course_reports_optional_service_without_hiding_launch_step(tmp_path, monkeypatch): + _write_teaching_index(tmp_path) + monkeypatch.setattr("tiny_rag_lab.web_api.qdrant_is_available", lambda _url: False) + client = TestClient(create_app(tmp_path)) + + status = client.get("/api/retrieval/qdrant/status") + prepare = client.post("/api/retrieval/qdrant/prepare") + + assert status.status_code == 200 + assert status.json()["available"] is False + assert status.json()["prepared"] is False + assert status.json()["launch_command"] == "docker compose --profile qdrant up -d" + assert prepare.status_code == 409 + assert "profile qdrant" in prepare.json()["detail"] + + +def test_qdrant_course_prepares_exact_copy_and_compares_payload_filter(tmp_path, monkeypatch): + from qdrant_client import QdrantClient + + _write_teaching_index(tmp_path) + material = _write_retrieval_materials(tmp_path) + backend = QdrantIndexBackend.__new__(QdrantIndexBackend) + backend._client = QdrantClient(location=":memory:") + monkeypatch.setattr("tiny_rag_lab.web_api.qdrant_is_available", lambda _url: True) + monkeypatch.setattr("tiny_rag_lab.web_api.QdrantIndexBackend", lambda _url: backend) + monkeypatch.setattr("tiny_rag_lab.web_api.SentenceTransformerEmbedder", _Embedder) + client = TestClient(create_app(tmp_path)) + + before = client.get("/api/retrieval/qdrant/status").json() + first = client.post("/api/retrieval/qdrant/prepare") + second = client.post("/api/retrieval/qdrant/prepare") + comparison = client.post("/api/retrieval/qdrant/compare", json={ + "retrieval_material_id": material["question_id"], "top_k": 2, + "source_group": "r2", + }) + + assert before["prepared"] is False + assert first.status_code == 201 + assert first.json()["verified"] is True + assert first.json()["reused"] is False + assert second.json()["reused"] is True + assert comparison.status_code == 200 + body = comparison.json() + assert body["parity"]["equivalent"] is True + assert [item["chunk_id"] for item in body["numpy"]] == [ + item["chunk_id"] for item in body["qdrant"] + ] + assert body["qdrant"][0]["payload"]["source_fingerprint"] == first.json()["source_fingerprint"] + assert {item["payload"]["source_group"] for item in body["filtered_qdrant"]} == {"r2"} + + backend.search_exact = lambda *_args, **_kwargs: (_ for _ in ()).throw( + QdrantBackendError( + "Exact Qdrant search is unavailable. Prepare the teaching collection again." + ) + ) + failed = client.post("/api/retrieval/qdrant/compare", json={ + "retrieval_material_id": material["question_id"], "top_k": 2, + }) + assert failed.status_code == 503 + assert failed.json()["detail"] == "Exact Qdrant search is unavailable. Prepare the teaching collection again." + + +def test_legacy_qdrant_index_reports_payload_filters_unavailable(tmp_path, monkeypatch): + from qdrant_client import QdrantClient + from qdrant_client.models import Distance, PointStruct, VectorParams + + _write_teaching_index(tmp_path, index_backend="qdrant", backend_identity="legacy") + backend = QdrantIndexBackend.__new__(QdrantIndexBackend) + backend._client = QdrantClient(location=":memory:") + backend._client.create_collection( + "legacy", vectors_config=VectorParams(size=2, distance=Distance.COSINE), + ) + backend._client.upsert( + "legacy", + points=[ + PointStruct(id=0, vector=[0.0, 1.0], payload={"chunk_id": make_chunk_id("r2/how-r2-works.md", 0, "catalog evidence for object storage")}), + PointStruct(id=1, vector=[1.0, 0.0], payload={"chunk_id": make_chunk_id("queues/retries.md", 0, "alpha queue retry evidence")}), + ], + wait=True, + ) + monkeypatch.setattr("tiny_rag_lab.web_api.backend_from_manifest", lambda *_args, **_kwargs: backend) + + detail = TestClient(create_app(tmp_path)).get( + "/api/indexes/cloudflare-state-structural-v1" + ) + + assert detail.status_code == 200 + assert detail.json()["capabilities"] == {"payload_filters": False} + + def test_starter_run_is_an_offline_replay_artifact(tmp_path): run = TestClient(create_app(tmp_path)).get("/api/starter-run").json() assert run["mode"] == "replay" @@ -162,6 +304,233 @@ def test_catalog_question_rejects_wrong_or_legacy_index_but_free_query_remains_v assert free.json()["catalog_check"] is None +def test_retrieval_materials_drive_server_resolved_explained_run(tmp_path, monkeypatch): + client = _seeded_client(tmp_path, monkeypatch) + material = _write_retrieval_materials(tmp_path) + _write_catalog_index( + tmp_path, source_corpus_id="cloudflare-state-v1", + index_id="retrieval-course-index", + ) + + listing = client.get("/api/retrieval/materials") + assert listing.status_code == 200 + assert listing.json()["items"] == [material] + + run = client.post("/api/runs/retrieve", json={ + "index_id": "retrieval-course-index", + "retrieval_material_id": material["question_id"], + "query": "browser text is ignored", + "retriever": "bm25", + "top_k": 1, + "explain": True, + }) + + assert run.status_code == 201 + payload = run.json() + assert payload["trace"]["query"] == material["question"] + assert payload["schema_version"] == "1.1" + assert payload["explanations"]["kind"] == "bm25" + candidate = payload["explanations"]["bm25"]["candidates"][0] + assert sum(term["contribution"] for term in candidate["terms"]) == pytest.approx(candidate["score"]) + + +def test_retrieval_material_rejects_non_cloudflare_index(tmp_path, monkeypatch): + client = _seeded_client(tmp_path, monkeypatch) + material = _write_retrieval_materials(tmp_path) + _write_catalog_index(tmp_path, index_id="wrong-course-index") + + response = client.post("/api/runs/retrieve", json={ + "index_id": "wrong-course-index", + "retrieval_material_id": material["question_id"], + "retriever": "bm25", + }) + + assert response.status_code == 409 + assert "bundled Cloudflare index" in response.json()["detail"] + + +def test_hybrid_explanation_exposes_source_lists_and_exact_rrf_contributions(tmp_path, monkeypatch): + monkeypatch.setattr("tiny_rag_lab.web_api.SentenceTransformerEmbedder", _Embedder) + material = _write_retrieval_materials( + tmp_path, category="hybrid", question="How does alpha evidence relate to catalog evidence?", + ) + _write_teaching_index(tmp_path) + response = TestClient(create_app(tmp_path)).post("/api/runs/retrieve", json={ + "index_id": "cloudflare-state-structural-v1", + "retrieval_material_id": material["question_id"], + "retriever": "hybrid", "top_k": 2, "explain": True, + }) + + assert response.status_code == 201 + explanation = response.json()["explanations"] + assert explanation["kind"] == "hybrid" + assert len(explanation["hybrid"]["dense"]) == 2 + assert len(explanation["hybrid"]["bm25"]) == 2 + for candidate in explanation["hybrid"]["candidates"]: + assert candidate["score"] == pytest.approx( + sum(source["contribution"] for source in candidate["sources"]) + ) + + +def test_reranker_model_status_reports_the_pinned_local_snapshot(tmp_path, monkeypatch): + monkeypatch.setattr( + "tiny_rag_lab.web_api.CrossEncoderReranker.default_model_available", + lambda: True, + ) + + status = TestClient(create_app(tmp_path)).get("/api/models/reranker/status") + + assert status.status_code == 200 + assert status.json() == { + "ready": True, + "model": "cross-encoder/ms-marco-MiniLM-L-6-v2", + "revision": "c5ee24cb16019beea0893ab7796b1df96625c6b8", + } + + +def test_web_reranking_keeps_candidate_pool_separate_from_final_evidence(tmp_path, monkeypatch): + monkeypatch.setattr("tiny_rag_lab.web_api.SentenceTransformerEmbedder", _Embedder) + monkeypatch.setattr( + "tiny_rag_lab.web_api.CrossEncoderReranker", + lambda **_kwargs: FakeReranker(name="cross-encoder"), + ) + client = TestClient(create_app(tmp_path)) + corpus = client.post( + "/api/corpora/upload", + files=[ + ("files", ("alpha.md", b"alpha evidence", "text/markdown")), + ("files", ("beta.md", b"beta evidence", "text/markdown")), + ], + ).json() + job = client.post("/api/indexes", json={"corpus_id": corpus["id"]}).json() + index_id = client.get(f"/api/jobs/{job['id']}").json()["index_id"] + + response = client.post("/api/runs/retrieve", json={ + "index_id": index_id, + "query": "alpha", + "retriever": "dense", + "top_k": 1, + "reranker": "cross-encoder", + "rerank_top_n": 2, + "explain": True, + }) + + assert response.status_code == 201 + run = response.json() + assert len(run["evidence"]) == 1 + assert len(run["candidates"]) == 2 + assert run["explanations"]["reranking"]["candidate_count"] == 2 + assert run["trace"]["chunks"][0]["pre_rerank_rank"] == 1 + assert run["config"]["reranker"] == "cross-encoder" + assert run["config"]["rerank_top_n"] == 2 + assert run["trace"]["reranker"] == "cross-encoder" + assert run["trace"]["rerank_top_n"] == 2 + + +def test_web_reranking_rejects_candidate_depth_below_final_top_k(tmp_path, monkeypatch): + monkeypatch.setattr("tiny_rag_lab.web_api.SentenceTransformerEmbedder", _Embedder) + client = _seeded_client(tmp_path, monkeypatch) + _write_catalog_index(tmp_path, index_id="rerank-index") + + response = client.post("/api/runs/retrieve", json={ + "index_id": "rerank-index", + "query": "alpha", + "top_k": 5, + "reranker": "cross-encoder", + "rerank_top_n": 2, + }) + + assert response.status_code == 422 + assert "rerank_top_n" in response.json()["detail"] + + +@pytest.mark.parametrize("generation_fails", [False, True]) +def test_reranked_ask_preserves_pre_rerank_trace_on_success_and_failure( + tmp_path, monkeypatch, generation_fails, +): + class _Generator: + def __init__(self, **_kwargs): + pass + + def generate(self, _prompt): + if generation_fails: + raise RuntimeError("provider failed") + return "Grounded answer" + + monkeypatch.setattr("tiny_rag_lab.web_api.SentenceTransformerEmbedder", _Embedder) + monkeypatch.setattr("tiny_rag_lab.web_api.OpenAIGenerator", _Generator) + monkeypatch.setattr( + "tiny_rag_lab.web_api.CrossEncoderReranker", + lambda **_kwargs: FakeReranker(name="cross-encoder"), + ) + client = TestClient(create_app(tmp_path)) + corpus = client.post( + "/api/corpora/upload", + files=[ + ("files", ("alpha.md", b"alpha evidence", "text/markdown")), + ("files", ("beta.md", b"beta evidence", "text/markdown")), + ], + ).json() + job = client.post("/api/indexes", json={"corpus_id": corpus["id"]}).json() + index_id = client.get(f"/api/jobs/{job['id']}").json()["index_id"] + + response = client.post("/api/runs/ask", json={ + "index_id": index_id, + "query": "alpha", + "top_k": 1, + "reranker": "cross-encoder", + "rerank_top_n": 2, + "provider": {"base_url": "http://local-provider/v1"}, + }) + + assert response.status_code == 201 + run = response.json() + assert run["trace"]["chunks"][0]["pre_rerank_rank"] == 1 + assert run["trace"]["chunks"][0]["pre_rerank_score"] is not None + assert run["trace"]["reranker"] == "cross-encoder" + assert run["trace"]["rerank_top_n"] == 2 + assert bool(run["error"]) is generation_fails + + +@pytest.mark.parametrize( + ("failure", "expected_status", "expected_text"), + [ + (OSError("not cached"), 409, "Download the default reranker model"), + (RuntimeError("inference exploded"), 500, "Cross-encoder reranking failed"), + ], +) +def test_web_reranker_distinguishes_missing_model_from_runtime_failure( + tmp_path, monkeypatch, failure, expected_status, expected_text, +): + class _FailingReranker: + def __init__(self, **_kwargs): + pass + + def rerank(self, _query, _candidates): + raise failure + + monkeypatch.setattr("tiny_rag_lab.web_api.SentenceTransformerEmbedder", _Embedder) + monkeypatch.setattr("tiny_rag_lab.web_api.CrossEncoderReranker", _FailingReranker) + client = TestClient(create_app(tmp_path)) + corpus = client.post( + "/api/corpora/upload", + files=[("files", ("alpha.md", b"alpha evidence", "text/markdown"))], + ).json() + job = client.post("/api/indexes", json={"corpus_id": corpus["id"]}).json() + index_id = client.get(f"/api/jobs/{job['id']}").json()["index_id"] + + response = client.post("/api/runs/retrieve", json={ + "index_id": index_id, + "query": "alpha", + "top_k": 1, + "reranker": "cross-encoder", + "rerank_top_n": 1, + }) + + assert response.status_code == expected_status + assert expected_text in response.json()["detail"] + + def test_slim_model_gate_keeps_bm25_available_but_blocks_dense_and_hybrid(tmp_path, monkeypatch): class _MissingEmbedder: def __init__(self, **_kwargs): @@ -200,6 +569,28 @@ def test_restart_marks_inflight_job_failed_and_retryable(tmp_path): assert "restarted" in job["error"] +def test_job_api_discovers_cancels_and_reads_only_complete_results(tmp_path): + client = TestClient(create_app(tmp_path)) + store = LocalJobStore(tmp_path / "jobs") + job = store.admit("evaluation", preset="dense-vs-hybrid") + store.start(job["id"], total=16) + + active = client.get("/api/jobs/active", params={"kind": "evaluation"}) + cancelled = client.post(f"/api/jobs/{job['id']}/cancel") + + assert active.status_code == 200 + assert [item["id"] for item in active.json()["items"]] == [job["id"]] + assert cancelled.status_code == 202 + assert cancelled.json()["status"] == "cancel_requested" + assert client.get(f"/api/jobs/{job['id']}/result").status_code == 404 + + assert store.progress(job["id"], 1, total=16, message="Checkpoint") is False + complete_job = store.admit("evaluation") + store.start(complete_job["id"], total=1) + store.complete(complete_job["id"], result={"questions": []}) + assert client.get(f"/api/jobs/{complete_job['id']}/result").json() == {"questions": []} + + def test_live_ask_requires_an_effective_provider_not_an_empty_override(tmp_path): client = TestClient(create_app(tmp_path)) payload = {"index_id": "unused", "query": "question"} @@ -270,6 +661,46 @@ def __init__(self, **_kwargs): assert "already-queued" in response.json()["detail"] +def test_reranker_download_verifies_exact_snapshot_before_ready(tmp_path, monkeypatch): + readiness = iter([False, True]) + calls = [] + monkeypatch.setattr( + "tiny_rag_lab.web_api.CrossEncoderReranker.default_model_available", + lambda: next(readiness), + ) + monkeypatch.setattr( + "tiny_rag_lab.web_api.CrossEncoderReranker.ensure_default_model", + lambda *, local_files_only: calls.append(local_files_only) or "/cached/model", + ) + client = TestClient(create_app(tmp_path)) + + queued = client.post("/api/models/reranker/download") + state = client.get(f"/api/jobs/{queued.json()['id']}").json() + + assert queued.status_code == 202 + assert calls == [False] + assert state["status"] == "complete" + + +def test_reranker_download_never_reports_partial_snapshot_ready(tmp_path, monkeypatch): + monkeypatch.setattr( + "tiny_rag_lab.web_api.CrossEncoderReranker.default_model_available", + lambda: False, + ) + monkeypatch.setattr( + "tiny_rag_lab.web_api.CrossEncoderReranker.ensure_default_model", + lambda *, local_files_only: "/partial/model", + ) + client = TestClient(create_app(tmp_path)) + + queued = client.post("/api/models/reranker/download") + state = client.get(f"/api/jobs/{queued.json()['id']}").json() + + assert state["status"] == "failed" + assert "network" in state["error"] + assert client.get("/api/models/reranker/status").json()["ready"] is False + + def test_index_and_retrieve_persist_a_replayable_run(tmp_path, monkeypatch): monkeypatch.setattr("tiny_rag_lab.web_api.SentenceTransformerEmbedder", _Embedder) client = TestClient(create_app(tmp_path)) @@ -294,6 +725,152 @@ def test_index_and_retrieve_persist_a_replayable_run(tmp_path, monkeypatch): assert inspection["chunk_count"] == 1 +def test_index_job_honors_cancellation_after_inflight_embedding_call(tmp_path, monkeypatch): + store = LocalJobStore(tmp_path / "jobs") + + class _CancellingEmbedder(_Embedder): + def embed(self, texts): + job = store.active(kind="index")[0] + store.request_cancel(job["id"]) + return super().embed(texts) + + monkeypatch.setattr("tiny_rag_lab.web_api.SentenceTransformerEmbedder", _CancellingEmbedder) + client = TestClient(create_app(tmp_path)) + corpus = client.post( + "/api/corpora/upload", + files=[("files", ("alpha.md", b"alpha evidence", "text/markdown"))], + ).json() + + queued = client.post("/api/indexes", json={"corpus_id": corpus["id"]}).json() + job = client.get(f"/api/jobs/{queued['id']}").json() + + assert job["status"] == "cancelled" + assert list((tmp_path / "indexes").iterdir()) == [] + + +def test_index_job_does_not_publish_when_cancel_arrives_after_final_checkpoint(tmp_path, monkeypatch): + original_progress = LocalJobStore.progress + + def cancel_after_checkpoint(self, job_id, current, **kwargs): + accepted = original_progress(self, job_id, current, **kwargs) + if accepted and current == 5: + self.request_cancel(job_id) + return accepted + + monkeypatch.setattr("tiny_rag_lab.web_api.SentenceTransformerEmbedder", _Embedder) + monkeypatch.setattr(LocalJobStore, "progress", cancel_after_checkpoint) + client = TestClient(create_app(tmp_path)) + corpus = client.post( + "/api/corpora/upload", + files=[("files", ("alpha.md", b"alpha evidence", "text/markdown"))], + ).json() + + queued = client.post("/api/indexes", json={"corpus_id": corpus["id"]}).json() + job = client.get(f"/api/jobs/{queued['id']}").json() + + assert job["status"] == "cancelled" + assert list((tmp_path / "indexes").iterdir()) == [] + + +def test_qdrant_index_failure_after_build_deletes_unpublished_collection(tmp_path, monkeypatch): + built = [] + deleted = [] + + class _Backend: + def build(self, collection, _index): + built.append(collection) + + def delete(self, collection): + deleted.append(collection) + + original_progress = LocalJobStore.progress + + def fail_after_build(self, job_id, current, **kwargs): + if current == 5: + raise RuntimeError("publication checkpoint failed") + return original_progress(self, job_id, current, **kwargs) + + monkeypatch.setattr("tiny_rag_lab.web_api.SentenceTransformerEmbedder", _Embedder) + monkeypatch.setattr("tiny_rag_lab.web_api.qdrant_is_available", lambda _url: True) + monkeypatch.setattr("tiny_rag_lab.web_api.backend_from_manifest", lambda *_args, **_kwargs: _Backend()) + monkeypatch.setattr(LocalJobStore, "progress", fail_after_build) + client = TestClient(create_app(tmp_path)) + corpus = client.post( + "/api/corpora/upload", + files=[("files", ("alpha.md", b"alpha evidence", "text/markdown"))], + ).json() + + queued = client.post("/api/indexes", json={ + "corpus_id": corpus["id"], "index_backend": "qdrant", + }).json() + job = client.get(f"/api/jobs/{queued['id']}").json() + + assert job["status"] == "failed" + assert deleted == built and len(deleted) == 1 + assert list((tmp_path / "indexes").iterdir()) == [] + + +def test_partial_qdrant_build_failure_still_deletes_owned_collection(tmp_path, monkeypatch): + built = [] + deleted = [] + + class _Backend: + def build(self, collection, _index): + built.append(collection) + raise RuntimeError("failed after remote collection creation") + + def delete(self, collection): + deleted.append(collection) + + monkeypatch.setattr("tiny_rag_lab.web_api.SentenceTransformerEmbedder", _Embedder) + monkeypatch.setattr("tiny_rag_lab.web_api.qdrant_is_available", lambda _url: True) + monkeypatch.setattr("tiny_rag_lab.web_api.backend_from_manifest", lambda *_args, **_kwargs: _Backend()) + client = TestClient(create_app(tmp_path)) + corpus = client.post( + "/api/corpora/upload", + files=[("files", ("alpha.md", b"alpha evidence", "text/markdown"))], + ).json() + + queued = client.post("/api/indexes", json={ + "corpus_id": corpus["id"], "index_backend": "qdrant", + }).json() + job = client.get(f"/api/jobs/{queued['id']}").json() + + assert job["status"] == "failed" + assert deleted == built and len(deleted) == 1 + + +def test_restart_recovers_published_artifact_and_cleans_unpublished_ownership(tmp_path, monkeypatch): + jobs = tmp_path / "jobs" + jobs.mkdir(parents=True) + (tmp_path / "indexes" / ".dead.staging").mkdir(parents=True) + (tmp_path / "corpora" / ".watsonxdocsqa.staging").mkdir(parents=True) + (tmp_path / "indexes" / "published-index").mkdir(parents=True) + (jobs / "index-dead.json").write_text(json.dumps({ + "id": "index-dead", "kind": "index", "status": "running", + "artifact": {"kind": "index", "id": "missing-index", "staging_name": ".dead.staging", "qdrant_collection": "orphan"}, + })) + (jobs / "index-published.json").write_text(json.dumps({ + "id": "index-published", "kind": "index", "status": "publishing", + "artifact": {"kind": "index", "id": "published-index", "staging_name": ".published.staging", "qdrant_collection": "owned"}, + })) + deleted = [] + monkeypatch.setattr("tiny_rag_lab.web_api.qdrant_is_available", lambda _url: True) + monkeypatch.setattr( + "tiny_rag_lab.web_api.QdrantIndexBackend", + lambda _url: type("Backend", (), {"delete": lambda _self, collection: deleted.append(collection)})(), + ) + + client = TestClient(create_app(tmp_path)) + + assert client.get("/api/jobs/index-dead").json()["status"] == "failed" + assert client.get("/api/jobs/index-dead").json()["cleanup_pending"] is False + assert client.get("/api/jobs/index-published").json()["status"] == "complete" + assert deleted == ["orphan"] + assert not (tmp_path / "indexes" / ".dead.staging").exists() + assert not (tmp_path / "corpora" / ".watsonxdocsqa.staging").exists() + + def test_qdrant_search_failure_is_a_non_secret_service_error(tmp_path, monkeypatch): from tiny_rag_lab.qdrant_backend import QdrantBackendError diff --git a/tiny_rag_lab/bm25.py b/tiny_rag_lab/bm25.py index 66bedd7..49d123f 100644 --- a/tiny_rag_lab/bm25.py +++ b/tiny_rag_lab/bm25.py @@ -1,3 +1,6 @@ +from collections import Counter +from dataclasses import dataclass + from rank_bm25 import BM25Okapi from tiny_rag_lab.models import Chunk, RetrievalResult @@ -7,14 +10,45 @@ def _tokenize(text: str) -> list[str]: return text.lower().split() +@dataclass(frozen=True) +class BM25TermExplanation: + """One query term's contribution to one candidate's BM25 score.""" + + term: str + query_frequency: int + term_frequency: int + document_frequency: int + inverse_document_frequency: float + contribution: float + + +@dataclass(frozen=True) +class BM25CandidateExplanation: + chunk_id: str + rank: int + score: float + document_length: int + average_document_length: float + terms: list[BM25TermExplanation] + + +@dataclass(frozen=True) +class BM25Explanation: + query_tokens: list[str] + corpus_size: int + k1: float + b: float + candidates: list[BM25CandidateExplanation] + + class BM25Retriever: def __init__(self, chunks: list[Chunk]) -> None: self._chunks = chunks - tokenized = [_tokenize(c.text) for c in chunks] + self._tokenized = [_tokenize(c.text) for c in chunks] # Guard: if all chunks tokenize to empty lists, BM25Okapi raises ZeroDivisionError. # Treat that the same as an empty corpus — _bm25 stays None. - if chunks and any(tokens for tokens in tokenized): - self._bm25 = BM25Okapi(tokenized) + if chunks and any(tokens for tokens in self._tokenized): + self._bm25 = BM25Okapi(self._tokenized) else: self._bm25 = None @@ -30,3 +64,67 @@ def retrieve(self, query: str, top_k: int = 5) -> list[RetrievalResult]: for rank, (idx, score) in enumerate(ranked[:top_k], start=1): results.append(RetrievalResult(chunk=self._chunks[idx], score=float(score), rank=rank)) return results + + def retrieve_with_explanation( + self, query: str, top_k: int = 5, + ) -> tuple[list[RetrievalResult], BM25Explanation]: + """Rank once and expose the exact BM25 components used for that rank.""" + results = self.retrieve(query, top_k=top_k) + tokens = _tokenize(query) + if self._bm25 is None or not tokens: + return results, BM25Explanation( + query_tokens=tokens, + corpus_size=len(self._chunks), + k1=float(getattr(self._bm25, "k1", 1.5)), + b=float(getattr(self._bm25, "b", 0.75)), + candidates=[], + ) + + query_counts = Counter(tokens) + document_frequency = { + term: sum(1 for frequencies in self._bm25.doc_freqs if term in frequencies) + for term in query_counts + } + position_by_id = {chunk.chunk_id: position for position, chunk in enumerate(self._chunks)} + candidates: list[BM25CandidateExplanation] = [] + for result in results: + position = position_by_id[result.chunk.chunk_id] + frequencies = self._bm25.doc_freqs[position] + document_length = self._bm25.doc_len[position] + normalizer = self._bm25.k1 * ( + 1.0 - self._bm25.b + + self._bm25.b * document_length / self._bm25.avgdl + ) + terms: list[BM25TermExplanation] = [] + for term, query_frequency in query_counts.items(): + term_frequency = frequencies.get(term, 0) + inverse_document_frequency = float(self._bm25.idf.get(term, 0.0)) + per_occurrence = 0.0 + if term_frequency: + per_occurrence = inverse_document_frequency * ( + term_frequency * (self._bm25.k1 + 1.0) + / (term_frequency + normalizer) + ) + terms.append(BM25TermExplanation( + term=term, + query_frequency=query_frequency, + term_frequency=int(term_frequency), + document_frequency=document_frequency[term], + inverse_document_frequency=inverse_document_frequency, + contribution=float(per_occurrence * query_frequency), + )) + candidates.append(BM25CandidateExplanation( + chunk_id=result.chunk.chunk_id, + rank=result.rank, + score=result.score, + document_length=int(document_length), + average_document_length=float(self._bm25.avgdl), + terms=terms, + )) + return results, BM25Explanation( + query_tokens=tokens, + corpus_size=len(self._chunks), + k1=float(self._bm25.k1), + b=float(self._bm25.b), + candidates=candidates, + ) diff --git a/tiny_rag_lab/browser_eval.py b/tiny_rag_lab/browser_eval.py new file mode 100644 index 0000000..c48a866 --- /dev/null +++ b/tiny_rag_lab/browser_eval.py @@ -0,0 +1,271 @@ +"""Fingerprint-gated retrieval comparison for the local browser course.""" +from __future__ import annotations + +import hashlib +import json +from dataclasses import asdict, dataclass +from pathlib import Path +from typing import Callable, Literal + +from tiny_rag_lab.bm25 import BM25Retriever +from tiny_rag_lab.eval import ( + context_precision_at_k, + context_recall_at_k, + hit_at_k, + reciprocal_rank, +) +from tiny_rag_lab.hybrid import reciprocal_rank_fusion +from tiny_rag_lab.index_loader import LoadedIndex, load_index +from tiny_rag_lab.qdrant_backend import source_vector_fingerprint +from tiny_rag_lab.reranker import CrossEncoderReranker, apply_reranker +from tiny_rag_lab.retrieval import retrieve_by_vector + + +class BrowserEvaluationError(RuntimeError): + """A non-secret evaluation asset or configuration error.""" + + +class BrowserEvaluationCancelled(RuntimeError): + """Cooperative cancellation was accepted at a question boundary.""" + + +# This identity is owned by the application release, not by the mutable bundle +# manifest beside the assets. Local metadata therefore cannot redefine which +# reviewed questions, chunks, vectors, or model revisions evaluation accepts. +BUNDLED_EVALUATION_IDENTITY = { + "questions_sha256": "53dcbd1bd6eb14cc87510ad482032e357b53b6e61e9141d11af1722531981a36", + "chunks_sha256": "11960c4f72360fdb4dd7fea1f43fbec4dd36a9214e3256bdcffc36ad3aee1f41", + "embeddings_sha256": "c944c09db6e42fbdac3ec3e25dc74c6e6ea8b23802d612705ec6be512fa29604", + "source_vector_fingerprint": "b4e7cd9f2a4dff45661dfea67ab4dfe265cce119fe731b39ab01ff8065965ff5", + "document_count": 40, + "chunk_count": 537, + "distance_metric": "cosine", + "embedding_dimension": 384, + "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + "embedding_revision": "1110a243fdf4706b3f48f1d95db1a4f5529b4d41", + "reranker_model": "cross-encoder/ms-marco-MiniLM-L-6-v2", + "reranker_revision": "c5ee24cb16019beea0893ab7796b1df96625c6b8", + "question_count": 16, +} + + +@dataclass(frozen=True) +class RetrievalConfiguration: + retriever: Literal["bm25", "dense", "hybrid"] + top_k: int = 5 + reranker: Literal["none", "cross-encoder"] = "none" + rerank_top_n: int = 20 + + def validate(self) -> None: + if not 1 <= self.top_k <= 20: + raise BrowserEvaluationError("top_k must be between 1 and 20") + if not 1 <= self.rerank_top_n <= 50: + raise BrowserEvaluationError("rerank_top_n must be between 1 and 50") + if self.reranker != "none" and self.rerank_top_n < self.top_k: + raise BrowserEvaluationError("rerank_top_n must be greater than or equal to top_k") + + def effective_identity(self) -> tuple[str, int, str, int | None]: + """Ignore candidate depth when no reranker can consume it.""" + return ( + self.retriever, self.top_k, self.reranker, + self.rerank_top_n if self.reranker != "none" else None, + ) + + +EVALUATION_PRESETS = [ + { + "id": "bm25-vs-dense", + "left": asdict(RetrievalConfiguration("bm25")), + "right": asdict(RetrievalConfiguration("dense")), + }, + { + "id": "dense-vs-hybrid", + "left": asdict(RetrievalConfiguration("dense")), + "right": asdict(RetrievalConfiguration("hybrid")), + }, + { + "id": "hybrid-vs-reranked", + "left": asdict(RetrievalConfiguration("hybrid")), + "right": asdict(RetrievalConfiguration( + "hybrid", reranker="cross-encoder", rerank_top_n=20, + )), + }, +] + + +def sha256_file(path: Path) -> str: + digest = hashlib.sha256() + with Path(path).open("rb") as source: + for block in iter(lambda: source.read(1024 * 1024), b""): + digest.update(block) + return digest.hexdigest() + + +def load_reviewed_questions(path: Path) -> list[dict]: + items = [] + for line in Path(path).read_text(encoding="utf-8").splitlines(): + if line.strip(): + items.append(json.loads(line)) + ids = [item.get("question_id") for item in items] + categories = [item.get("category") for item in items] + if len(items) != 16 or len(set(ids)) != 16: + raise BrowserEvaluationError("The reviewed evaluation set must contain 16 unique questions") + if any(not item.get("question") or not item.get("gold_doc_ids") for item in items): + raise BrowserEvaluationError("Every reviewed question needs text and gold document IDs") + if {category: categories.count(category) for category in set(categories)} != { + "lexical": 4, "dense": 4, "hybrid": 4, "reranking": 4, + }: + raise BrowserEvaluationError("The reviewed evaluation set must contain four questions per category") + return items + + +def validate_evaluation_bundle( + index_dir: Path, questions_path: Path, manifest_path: Path, + *, trusted_identity: dict | None = None, +) -> tuple[LoadedIndex, list[dict], dict]: + """Validate every immutable input before browser evaluation starts.""" + try: + manifest = json.loads(Path(manifest_path).read_text(encoding="utf-8")) + index = load_index(index_dir) + questions = load_reviewed_questions(questions_path) + except (OSError, json.JSONDecodeError, ValueError) as exc: + raise BrowserEvaluationError("The bundled evaluation assets are unavailable or invalid") from exc + + actual = { + "questions_sha256": sha256_file(questions_path), + "chunks_sha256": sha256_file(Path(index_dir) / "chunks.jsonl"), + "embeddings_sha256": sha256_file(Path(index_dir) / "embeddings.npz"), + "source_vector_fingerprint": source_vector_fingerprint(index), + "document_count": index.manifest.get("document_count"), + "chunk_count": len(index.chunks), + "distance_metric": index.manifest.get("distance_metric"), + "embedding_dimension": int(index.embeddings.shape[1]), + "embedding_model": index.manifest.get("embedding_model"), + "embedding_revision": index.manifest.get("embedding_revision"), + "reranker_model": CrossEncoderReranker.DEFAULT_MODEL, + "reranker_revision": CrossEncoderReranker.DEFAULT_REVISION, + "question_count": len(questions), + } + mismatches = [key for key, value in actual.items() if manifest.get(key) != value] + trusted = BUNDLED_EVALUATION_IDENTITY if trusted_identity is None else trusted_identity + mismatches.extend( + key for key, expected in trusted.items() + if actual.get(key) != expected or manifest.get(key) != expected + ) + if index.manifest.get("index_backend") != "numpy": + mismatches.append("index_backend") + known_documents = {chunk.doc_id for chunk in index.chunks} + if any( + not set(question["gold_doc_ids"]).issubset(known_documents) + for question in questions + ): + mismatches.append("gold_doc_ids") + if mismatches: + raise BrowserEvaluationError( + "The bundled evaluation assets do not match their immutable manifest: " + + ", ".join(sorted(set(mismatches))) + ) + return index, questions, manifest + + +def _serialize_results(results) -> list[dict]: + return [ + { + "chunk_id": result.chunk.chunk_id, + "doc_id": result.chunk.doc_id, + "title": result.chunk.metadata.get("title", ""), + "path": result.chunk.metadata.get("path", result.chunk.doc_id), + "text": result.chunk.text, + "rank": result.rank, + "score": result.score, + } + for result in results + ] + + +def _metrics(question: dict, results) -> dict: + retrieved = [result.chunk.doc_id for result in results] + gold = list(question["gold_doc_ids"]) + return { + "hit": hit_at_k(retrieved, gold), + "reciprocal_rank": reciprocal_rank(retrieved, gold), + "context_precision": context_precision_at_k(retrieved, gold), + "context_recall": context_recall_at_k(retrieved, gold), + } + + +def _aggregate(items: list[dict]) -> dict: + count = len(items) + if count == 0: + raise BrowserEvaluationError("The evaluation set cannot be empty") + return { + "n_questions": count, + "hit_rate": sum(float(item["metrics"]["hit"]) for item in items) / count, + "mrr": sum(item["metrics"]["reciprocal_rank"] for item in items) / count, + "context_precision": sum(item["metrics"]["context_precision"] for item in items) / count, + "context_recall": sum(item["metrics"]["context_recall"] for item in items) / count, + } + + +def run_browser_comparison( + questions: list[dict], index: LoadedIndex, + left: RetrievalConfiguration, right: RetrievalConfiguration, + *, embedder, reranker_factory: Callable[[], object] | None = None, + checkpoint: Callable[[int, int, str], bool] | None = None, +) -> dict: + """Run two configurations and preserve every final evidence list.""" + left.validate() + right.validate() + if left.effective_identity() == right.effective_identity(): + raise BrowserEvaluationError("Choose two different retrieval configurations") + bm25 = BM25Retriever(index.chunks) + factory = reranker_factory or ( + lambda: CrossEncoderReranker(local_files_only=True) + ) + rerankers = { + "left": factory() if left.reranker == "cross-encoder" else None, + "right": factory() if right.reranker == "cross-encoder" else None, + } + + def run_one(question: dict, config: RetrievalConfiguration, reranker): + retrieval_k = config.rerank_top_n if reranker is not None else config.top_k + if config.retriever == "bm25": + results = bm25.retrieve(question["question"], retrieval_k) + else: + query_vector = embedder.embed([question["question"]])[0] + dense = retrieve_by_vector(query_vector, index, retrieval_k) + if config.retriever == "hybrid": + lexical = bm25.retrieve(question["question"], retrieval_k) + results = reciprocal_rank_fusion([dense, lexical], retrieval_k) + else: + results = dense + if reranker is not None: + results, _audit = apply_reranker( + question["question"], results, reranker, config.top_k, + ) + return results + + left_items = [] + right_items = [] + total = len(questions) + for position, question in enumerate(questions, start=1): + left_results = run_one(question, left, rerankers["left"]) + if checkpoint is not None and not checkpoint(position - 1, total, "left"): + raise BrowserEvaluationCancelled() + right_results = run_one(question, right, rerankers["right"]) + base = { + "question_id": question["question_id"], + "question": question["question"], + "gold_doc_ids": list(question["gold_doc_ids"]), + "category": question["category"], + } + left_items.append({**base, "metrics": _metrics(question, left_results), "evidence": _serialize_results(left_results)}) + right_items.append({**base, "metrics": _metrics(question, right_results), "evidence": _serialize_results(right_results)}) + if checkpoint is not None and not checkpoint(position, total, "right"): + raise BrowserEvaluationCancelled() + + return { + "question_count": total, + "left": {"config": asdict(left), "metrics": _aggregate(left_items), "questions": left_items}, + "right": {"config": asdict(right), "metrics": _aggregate(right_items), "questions": right_items}, + } diff --git a/tiny_rag_lab/embeddings.py b/tiny_rag_lab/embeddings.py index b971b9b..b3c6327 100644 --- a/tiny_rag_lab/embeddings.py +++ b/tiny_rag_lab/embeddings.py @@ -13,6 +13,10 @@ import numpy as np +DEFAULT_EMBEDDING_MODEL = "sentence-transformers/all-MiniLM-L6-v2" +DEFAULT_EMBEDDING_REVISION = "1110a243fdf4706b3f48f1d95db1a4f5529b4d41" + + class Embedder(ABC): """Interface contract for all embedding backends. @@ -67,12 +71,23 @@ class SentenceTransformerEmbedder(Embedder): FakeEmbedder and with cosine retrieval via dot product. """ - DEFAULT_MODEL = "sentence-transformers/all-MiniLM-L6-v2" + DEFAULT_MODEL = DEFAULT_EMBEDDING_MODEL + DEFAULT_REVISION = DEFAULT_EMBEDDING_REVISION - def __init__(self, model_name: str = DEFAULT_MODEL, local_files_only: bool = False) -> None: + def __init__( + self, model_name: str = DEFAULT_MODEL, *, revision: str | None = None, + local_files_only: bool = False, + ) -> None: from sentence_transformers import SentenceTransformer # deferred import self.model_name = model_name - self._model = SentenceTransformer(model_name, local_files_only=local_files_only) + self.revision = ( + revision if revision is not None + else self.DEFAULT_REVISION if model_name == self.DEFAULT_MODEL else None + ) + options = {"local_files_only": local_files_only} + if self.revision is not None: + options["revision"] = self.revision + self._model = SentenceTransformer(model_name, **options) @property def dim(self) -> int: diff --git a/tiny_rag_lab/hybrid.py b/tiny_rag_lab/hybrid.py index b3361da..75fc739 100644 --- a/tiny_rag_lab/hybrid.py +++ b/tiny_rag_lab/hybrid.py @@ -1,3 +1,5 @@ +from dataclasses import dataclass + from tiny_rag_lab.bm25 import BM25Retriever from tiny_rag_lab.embeddings import Embedder from tiny_rag_lab.index_loader import LoadedIndex @@ -5,6 +7,22 @@ from tiny_rag_lab.retrieval import retrieve +@dataclass(frozen=True) +class RRFSourceExplanation: + source: str + rank: int + score: float + contribution: float + + +@dataclass(frozen=True) +class RRFCandidateExplanation: + chunk_id: str + rank: int + score: float + sources: list[RRFSourceExplanation] + + def reciprocal_rank_fusion( results_lists: list[list[RetrievalResult]], top_k: int, @@ -19,15 +37,43 @@ def reciprocal_rank_fusion( Tie-breaking: Python stable sort preserves original order; dense list wins because it is always passed first. """ + fused, _ = reciprocal_rank_fusion_with_explanation( + results_lists, top_k=top_k, k=k, + ) + return fused + + +def reciprocal_rank_fusion_with_explanation( + results_lists: list[list[RetrievalResult]], + top_k: int, + k: int = 60, + source_names: list[str] | None = None, +) -> tuple[list[RetrievalResult], list[RRFCandidateExplanation]]: + """Fuse ranked lists and expose every contribution used in each score.""" + if top_k < 0: + raise ValueError(f"top_k must be non-negative, got {top_k}") + if source_names is None: + source_names = [f"source_{position + 1}" for position in range(len(results_lists))] + if len(source_names) != len(results_lists): + raise ValueError("source_names must match results_lists") + scores: dict[str, float] = {} first_seen: dict[str, RetrievalResult] = {} + contributions: dict[str, list[RRFSourceExplanation]] = {} - for results in results_lists: + for source, results in zip(source_names, results_lists): for result in results: cid = result.chunk.chunk_id - scores[cid] = scores.get(cid, 0.0) + 1.0 / (k + result.rank) + contribution = 1.0 / (k + result.rank) + scores[cid] = scores.get(cid, 0.0) + contribution if cid not in first_seen: first_seen[cid] = result + contributions.setdefault(cid, []).append(RRFSourceExplanation( + source=source, + rank=result.rank, + score=result.score, + contribution=contribution, + )) ranked = sorted(scores.keys(), key=lambda cid: scores[cid], reverse=True) fused = [] @@ -37,7 +83,16 @@ def reciprocal_rank_fusion( score=scores[cid], rank=rank, )) - return fused + explanation = [ + RRFCandidateExplanation( + chunk_id=result.chunk.chunk_id, + rank=result.rank, + score=result.score, + sources=contributions[result.chunk.chunk_id], + ) + for result in fused + ] + return fused, explanation def retrieve_hybrid( diff --git a/tiny_rag_lab/index_writer.py b/tiny_rag_lab/index_writer.py index 695f5c0..8c2b71f 100644 --- a/tiny_rag_lab/index_writer.py +++ b/tiny_rag_lab/index_writer.py @@ -30,6 +30,7 @@ def write_index( corpus_root: Path, embedding_backend: str, embedding_model: str, + embedding_revision: str | None = None, embedding_dim: int, chunk_size: int, chunk_overlap: int, @@ -65,6 +66,7 @@ def write_index( corpus_root=corpus_root, embedding_backend=embedding_backend, embedding_model=embedding_model, + embedding_revision=embedding_revision, embedding_dim=embedding_dim, chunk_size=chunk_size, chunk_overlap=chunk_overlap, @@ -87,6 +89,7 @@ def _write_manifest( corpus_root: Path, embedding_backend: str, embedding_model: str, + embedding_revision: str | None = None, embedding_dim: int, chunk_size: int, chunk_overlap: int, @@ -120,6 +123,8 @@ def _write_manifest( "embedding_dim": embedding_dim, "corpus_files": corpus_files, } + if embedding_revision is not None: + manifest["embedding_revision"] = embedding_revision manifest_path = index_dir / "manifest.json" manifest_path.write_text(json.dumps(manifest, indent=2), encoding="utf-8") diff --git a/tiny_rag_lab/jobs.py b/tiny_rag_lab/jobs.py new file mode 100644 index 0000000..13452b4 --- /dev/null +++ b/tiny_rag_lab/jobs.py @@ -0,0 +1,237 @@ +"""Small, inspectable persistence for local background work. + +Jobs are JSON files because the lab is single-user and local. Atomic replace +keeps browser polling from observing partial JSON, while explicit states make +restart and cooperative cancellation behavior visible to learners. +""" +from __future__ import annotations + +import json +import os +import tempfile +import threading +from datetime import datetime, timezone +from pathlib import Path +from uuid import uuid4 + + +ACTIVE_STATUSES = {"queued", "running", "cancel_requested", "publishing"} +TERMINAL_STATUSES = {"complete", "failed", "cancelled"} + + +class JobConflictError(RuntimeError): + """Another resource-heavy local job is still active.""" + + +class JobNotFoundError(FileNotFoundError): + """The requested persisted job does not exist.""" + + +def utc_now() -> str: + return datetime.now(timezone.utc).isoformat() + + +def atomic_write_json(path: Path, value: dict) -> None: + """Write JSON completely, then atomically replace the destination.""" + path = Path(path) + path.parent.mkdir(parents=True, exist_ok=True) + temporary = None + try: + with tempfile.NamedTemporaryFile( + mode="w", encoding="utf-8", dir=path.parent, + prefix=f".{path.name}.", suffix=".tmp", delete=False, + ) as output: + temporary = Path(output.name) + json.dump(value, output, indent=2) + output.flush() + os.fsync(output.fileno()) + os.replace(temporary, path) + finally: + if temporary is not None and temporary.exists(): + temporary.unlink() + + +class LocalJobStore: + """Persist and coordinate one local resource-heavy job at a time.""" + + def __init__(self, root: Path) -> None: + self.root = Path(root) + self.results_dir = self.root / "results" + self.root.mkdir(parents=True, exist_ok=True) + self.results_dir.mkdir(parents=True, exist_ok=True) + self._lock = threading.Lock() + + def _path(self, job_id: str) -> Path: + return self.root / f"{job_id}.json" + + def _result_path(self, job_id: str) -> Path: + return self.results_dir / f"{job_id}.json" + + def read(self, job_id: str) -> dict: + path = self._path(job_id) + if not path.exists(): + raise JobNotFoundError(job_id) + return json.loads(path.read_text(encoding="utf-8")) + + def active(self, *, kind: str | None = None) -> list[dict]: + items = [] + for path in sorted(self.root.glob("*.json")): + try: + job = json.loads(path.read_text(encoding="utf-8")) + except (OSError, json.JSONDecodeError): + continue + if job.get("status") in ACTIVE_STATUSES and (kind is None or job.get("kind") == kind): + items.append(job) + return items + + def all(self) -> list[dict]: + items = [] + for path in sorted(self.root.glob("*.json")): + try: + items.append(json.loads(path.read_text(encoding="utf-8"))) + except (OSError, json.JSONDecodeError): + continue + return items + + def admit(self, kind: str, **fields) -> dict: + with self._lock: + active = self.active() + if active: + current = active[0] + raise JobConflictError( + f"Local job {current.get('id', 'unknown')} is {current['status']}. " + "Wait for it or cancel it before starting another job." + ) + job_id = f"{kind}-{uuid4().hex[:12]}" + job = { + "id": job_id, "kind": kind, "status": "queued", + "created_at": utc_now(), + "progress": {"current": 0, "total": None, "message": "Queued"}, + **fields, + } + atomic_write_json(self._path(job_id), job) + return job + + def update(self, job_id: str, **changes) -> dict: + with self._lock: + job = self.read(job_id) + job.update(changes) + atomic_write_json(self._path(job_id), job) + return job + + def start(self, job_id: str, *, total: int | None = None, message: str = "Running") -> bool: + with self._lock: + job = self.read(job_id) + if job["status"] == "cancel_requested": + job.update(status="cancelled", completed_at=utc_now()) + atomic_write_json(self._path(job_id), job) + return False + if job["status"] != "queued": + return False + job.update( + status="running", started_at=utc_now(), + progress={"current": 0, "total": total, "message": message}, + ) + atomic_write_json(self._path(job_id), job) + return True + + def progress( + self, job_id: str, current: int, *, total: int | None = None, + message: str, + ) -> bool: + """Publish progress and return False when cancellation was accepted.""" + with self._lock: + job = self.read(job_id) + if job["status"] == "cancel_requested": + job.update(status="cancelled", completed_at=utc_now()) + atomic_write_json(self._path(job_id), job) + return False + if job["status"] != "running": + return False + previous = job.get("progress", {}) + job["progress"] = { + "current": current, + "total": total if total is not None else previous.get("total"), + "message": message, + } + atomic_write_json(self._path(job_id), job) + return True + + def request_cancel(self, job_id: str) -> dict: + with self._lock: + job = self.read(job_id) + if job["status"] in TERMINAL_STATUSES or job["status"] == "publishing": + return job + job["status"] = "cancel_requested" + job["cancel_requested_at"] = utc_now() + atomic_write_json(self._path(job_id), job) + return job + + def begin_publish(self, job_id: str, *, message: str = "Publishing result") -> bool: + """Claim the short, non-cancellable final publication boundary.""" + with self._lock: + job = self.read(job_id) + if job["status"] == "cancel_requested": + job.update(status="cancelled", completed_at=utc_now()) + atomic_write_json(self._path(job_id), job) + return False + if job["status"] != "running": + return False + job["status"] = "publishing" + progress = job.get("progress", {}) + job["progress"] = {**progress, "message": message} + atomic_write_json(self._path(job_id), job) + return True + + def complete(self, job_id: str, *, result: dict | None = None, **fields) -> dict: + """Publish a result first, then expose the terminal complete state.""" + with self._lock: + job = self.read(job_id) + if job["status"] == "cancel_requested": + job.update(status="cancelled", completed_at=utc_now()) + atomic_write_json(self._path(job_id), job) + return job + if job["status"] not in {"running", "publishing"}: + return job + if result is not None: + atomic_write_json(self._result_path(job_id), result) + fields["result_available"] = True + job.update( + status="complete", completed_at=utc_now(), + progress={ + "current": job.get("progress", {}).get("total"), + "total": job.get("progress", {}).get("total"), + "message": "Complete", + }, + **fields, + ) + atomic_write_json(self._path(job_id), job) + return job + + def fail(self, job_id: str, error: str) -> dict: + with self._lock: + job = self.read(job_id) + if job["status"] == "cancel_requested": + job.update(status="cancelled", completed_at=utc_now()) + elif job["status"] not in TERMINAL_STATUSES: + job.update(status="failed", error=error, completed_at=utc_now()) + atomic_write_json(self._path(job_id), job) + return job + + def result(self, job_id: str) -> dict: + job = self.read(job_id) + path = self._result_path(job_id) + if job.get("status") != "complete" or not job.get("result_available") or not path.exists(): + raise JobNotFoundError(f"No complete result for {job_id}") + return json.loads(path.read_text(encoding="utf-8")) + + def recover_interrupted(self) -> None: + """Make process-bound work terminal after a local server restart.""" + for job in self.active(): + if job["status"] == "cancel_requested": + self.update(job["id"], status="cancelled", completed_at=utc_now()) + else: + self.update( + job["id"], status="failed", completed_at=utc_now(), + error="The local server restarted before this job completed. Please start it again.", + ) diff --git a/tiny_rag_lab/lab_trace.py b/tiny_rag_lab/lab_trace.py index 6254aa7..08c6ba1 100644 --- a/tiny_rag_lab/lab_trace.py +++ b/tiny_rag_lab/lab_trace.py @@ -16,7 +16,7 @@ from tiny_rag_lab.trace import AskTrace, RetrieveTrace, trace_to_dict -LAB_TRACE_SCHEMA_VERSION = "1.0" +LAB_TRACE_SCHEMA_VERSION = "1.1" @dataclass @@ -51,6 +51,12 @@ class LabRun: index: IndexSnapshot trace: dict[str, Any] evidence: list[EvidenceSnapshot] + # Optional Phase 3.4 pre-rerank pool. `evidence` retains its established + # meaning: final retrieval order before context packing. + candidates: list[EvidenceSnapshot] | None = None + # Calculation-level artifacts. Older 1.0 runs omit this rather than being + # recomputed with a potentially different model or index. + explanations: dict[str, Any] | None = None query_vector: list[float] | None = None config: dict[str, Any] = field(default_factory=dict) # Present only for a catalog-backed run. Keeping this server-produced @@ -75,6 +81,8 @@ def build_lab_run( manifest: dict[str, Any], document_count: int, evidence: list[EvidenceSnapshot], + candidates: list[EvidenceSnapshot] | None = None, + explanations: dict[str, Any] | None = None, query_vector: list[float] | None = None, config: dict[str, Any] | None = None, catalog_check: dict[str, Any] | None = None, @@ -92,6 +100,8 @@ def build_lab_run( ), trace=trace_to_dict(trace), evidence=evidence, + candidates=candidates, + explanations=explanations, query_vector=query_vector, config=config or {}, catalog_check=catalog_check, diff --git a/tiny_rag_lab/qdrant_backend.py b/tiny_rag_lab/qdrant_backend.py index 9d47008..3ed333e 100644 --- a/tiny_rag_lab/qdrant_backend.py +++ b/tiny_rag_lab/qdrant_backend.py @@ -5,8 +5,11 @@ """ from __future__ import annotations +from dataclasses import dataclass +import hashlib from pathlib import Path from urllib.request import urlopen +from uuid import uuid4 import numpy as np @@ -19,6 +22,116 @@ class QdrantBackendError(RuntimeError): """A non-secret failure that a local-lab learner can act on.""" +@dataclass(frozen=True) +class QdrantPreparationReport: + alias: str + collection: str + source_fingerprint: str + point_count: int + dimension: int + reused: bool + verified: bool + + +@dataclass(frozen=True) +class QdrantExactHit: + result: RetrievalResult + payload: dict + + +@dataclass(frozen=True) +class ParityItem: + chunk_id: str + numpy_rank: int | None + qdrant_rank: int | None + numpy_score: float | None + qdrant_score: float | None + equivalent: bool + + +@dataclass(frozen=True) +class ParityReport: + equivalent: bool + score_tolerance: float + items: list[ParityItem] + + +def source_vector_fingerprint(index: LoadedIndex) -> str: + """Fingerprint ordered IDs and canonical source float32 vector bytes.""" + embeddings = np.asarray(index.embeddings, dtype=" str: + """Return the curated top-level Cloudflare source group.""" + return chunk.doc_id.split("/", 1)[0] + + +def compare_exact_rankings( + numpy_results: list[RetrievalResult], + qdrant_results: list[RetrievalResult], + *, + tolerance: float = 1e-5, +) -> ParityReport: + """Compare exact results while treating near-equal score ties as groups.""" + if tolerance < 0: + raise ValueError("tolerance must be non-negative") + + def tie_groups(results: list[RetrievalResult]) -> list[set[str]]: + groups: list[set[str]] = [] + anchor: float | None = None + for result in results: + if anchor is None or abs(result.score - anchor) > tolerance: + groups.append(set()) + anchor = result.score + groups[-1].add(result.chunk.chunk_id) + return groups + + numpy_groups = tie_groups(numpy_results) + qdrant_groups = tie_groups(qdrant_results) + numpy_group_by_id = { + chunk_id: position for position, group in enumerate(numpy_groups) for chunk_id in group + } + qdrant_group_by_id = { + chunk_id: position for position, group in enumerate(qdrant_groups) for chunk_id in group + } + numpy_by_id = {result.chunk.chunk_id: result for result in numpy_results} + qdrant_by_id = {result.chunk.chunk_id: result for result in qdrant_results} + ordered_ids = list(numpy_by_id) + ordered_ids.extend(chunk_id for chunk_id in qdrant_by_id if chunk_id not in numpy_by_id) + items = [] + for chunk_id in ordered_ids: + numpy_result = numpy_by_id.get(chunk_id) + qdrant_result = qdrant_by_id.get(chunk_id) + equivalent = ( + numpy_result is not None + and qdrant_result is not None + and numpy_group_by_id[chunk_id] == qdrant_group_by_id[chunk_id] + and abs(numpy_result.score - qdrant_result.score) <= tolerance + ) + items.append(ParityItem( + chunk_id=chunk_id, + numpy_rank=numpy_result.rank if numpy_result else None, + qdrant_rank=qdrant_result.rank if qdrant_result else None, + numpy_score=numpy_result.score if numpy_result else None, + qdrant_score=qdrant_result.score if qdrant_result else None, + equivalent=equivalent, + )) + return ParityReport( + equivalent=(numpy_groups == qdrant_groups and all(item.equivalent for item in items)), + score_tolerance=tolerance, + items=items, + ) + + def qdrant_is_available(url: str) -> bool: """Return whether the optional local service can answer a small request. @@ -51,6 +164,7 @@ def open(self, index_dir: Path) -> LoadedIndex: def build(self, collection: str, index: LoadedIndex) -> None: from qdrant_client.models import Distance, PointStruct, VectorParams + fingerprint = source_vector_fingerprint(index) if self._client.collection_exists(collection): self._client.delete_collection(collection) self._client.create_collection( @@ -63,13 +177,276 @@ def build(self, collection: str, index: LoadedIndex) -> None: PointStruct( id=position, vector=[float(value) for value in index.embeddings[position]], - payload={"chunk_id": chunk.chunk_id}, + payload=self._teaching_payload( + chunk, source_fingerprint=fingerprint, + ), ) for position, chunk in enumerate(index.chunks) ], wait=True, ) + def delete(self, collection: str) -> None: + """Remove an unpublished collection during cooperative cancellation.""" + if self._client.collection_exists(collection): + self._client.delete_collection(collection) + + @staticmethod + def _teaching_payload(chunk, *, source_fingerprint: str) -> dict: + return { + "chunk_id": chunk.chunk_id, + "doc_id": chunk.doc_id, + "title": chunk.metadata.get("title", ""), + "path": chunk.doc_id, + "source_group": chunk_source_group(chunk), + "source_fingerprint": source_fingerprint, + } + + def _verify_teaching_collection( + self, + collection: str, + index: LoadedIndex, + source_fingerprint: str, + *, + vector_tolerance: float = 1e-6, + ) -> bool: + from qdrant_client.models import Distance + + try: + info = self._client.get_collection(collection) + vectors = info.config.params.vectors + if isinstance(vectors, dict): + return False + if vectors.size != index.embeddings.shape[1] or vectors.distance != Distance.COSINE: + return False + if info.points_count != len(index.chunks): + return False + records = self._client.retrieve( + collection_name=collection, + ids=list(range(len(index.chunks))), + with_payload=True, + with_vectors=True, + ) + except Exception: + return False + if len(records) != len(index.chunks): + return False + by_id = {int(record.id): record for record in records} + if set(by_id) != set(range(len(index.chunks))): + return False + for position, chunk in enumerate(index.chunks): + record = by_id[position] + payload = record.payload or {} + expected_payload = self._teaching_payload( + chunk, source_fingerprint=source_fingerprint, + ) + if any(payload.get(key) != value for key, value in expected_payload.items()): + return False + remote = np.asarray(record.vector, dtype=np.float32) + source = np.asarray(index.embeddings[position], dtype=np.float32) + norm = float(np.linalg.norm(source)) + normalized = source / norm if norm else source + if remote.shape != normalized.shape: + return False + if not np.allclose(remote, normalized, atol=vector_tolerance, rtol=0.0): + return False + return True + + def prepare_teaching_collection( + self, + alias: str, + index: LoadedIndex, + ) -> QdrantPreparationReport: + """Idempotently publish a verified exact-vector teaching collection.""" + from qdrant_client.models import ( + CreateAlias, + CreateAliasOperation, + DeleteAlias, + DeleteAliasOperation, + Distance, + PointStruct, + VectorParams, + ) + + fingerprint = source_vector_fingerprint(index) + canonical = f"{alias}__{fingerprint[:16]}" + aliases = { + item.alias_name: item.collection_name + for item in self._client.get_aliases().aliases + } + previous = aliases.get(alias) + + # Reuse the published collection even when it carries a repair suffix. + # A repair must remain idempotent on the next call rather than being + # rebuilt only to recover the canonical name. + physical = previous or canonical + reused = bool(previous and self._verify_teaching_collection( + previous, index, fingerprint, + )) + if not reused and canonical != previous and self._client.collection_exists(canonical): + if self._verify_teaching_collection(canonical, index, fingerprint): + physical = canonical + reused = True + else: + self._client.delete_collection(canonical) + if not reused: + # If the corrupted collection is currently published, build under + # a distinct name. The alias continues serving the old collection + # until the replacement has been fully populated and verified. + physical = ( + f"{canonical}__repair_{uuid4().hex[:8]}" + if previous == canonical + else canonical + ) + self._client.create_collection( + collection_name=physical, + vectors_config=VectorParams( + size=index.embeddings.shape[1], distance=Distance.COSINE, + ), + ) + self._client.upsert( + collection_name=physical, + points=[ + PointStruct( + id=position, + vector=[float(value) for value in index.embeddings[position]], + payload=self._teaching_payload( + chunk, source_fingerprint=fingerprint, + ), + ) + for position, chunk in enumerate(index.chunks) + ], + wait=True, + ) + if not self._verify_teaching_collection(physical, index, fingerprint): + self._client.delete_collection(physical) + raise QdrantBackendError( + "Qdrant did not preserve the complete teaching collection. Try preparing it again." + ) + + if previous != physical: + operations = [] + if previous: + operations.append(DeleteAliasOperation( + delete_alias=DeleteAlias(alias_name=alias), + )) + operations.append(CreateAliasOperation( + create_alias=CreateAlias(collection_name=physical, alias_name=alias), + )) + self._client.update_collection_aliases(operations) + if previous and previous.startswith(f"{alias}__") and previous != physical: + self._client.delete_collection(previous) + return QdrantPreparationReport( + alias=alias, + collection=physical, + source_fingerprint=fingerprint, + point_count=len(index.chunks), + dimension=index.embeddings.shape[1], + reused=reused, + verified=True, + ) + + def payload_filters_available( + self, collection: str, index: LoadedIndex, + ) -> bool: + """Report whether every point has the source-group teaching payload. + + Older Phase 3.0 Qdrant collections stored only ``chunk_id``. They stay + searchable, but callers must not offer payload filtering for them. + """ + try: + records = self._client.retrieve( + collection_name=collection, + ids=list(range(len(index.chunks))), + with_payload=True, + with_vectors=False, + ) + except Exception: + return False + if len(records) != len(index.chunks): + return False + return all( + isinstance((record.payload or {}).get("source_group"), str) + and bool((record.payload or {}).get("source_group")) + for record in records + ) + + def teaching_status( + self, alias: str, index: LoadedIndex, *, raise_on_error: bool = False, + ) -> QdrantPreparationReport | None: + fingerprint = source_vector_fingerprint(index) + try: + aliases = { + item.alias_name: item.collection_name + for item in self._client.get_aliases().aliases + } + physical = aliases.get(alias) + if not physical or not self._verify_teaching_collection( + physical, index, fingerprint, + ): + return None + except Exception as exc: + if raise_on_error: + raise QdrantBackendError( + "Qdrant status is unavailable. Check the local service and try again." + ) from exc + return None + return QdrantPreparationReport( + alias=alias, + collection=physical, + source_fingerprint=fingerprint, + point_count=len(index.chunks), + dimension=index.embeddings.shape[1], + reused=True, + verified=True, + ) + + def search_exact( + self, + collection: str, + query_vector: np.ndarray, + index: LoadedIndex, + top_k: int, + *, + source_group: str | None = None, + ) -> list[QdrantExactHit]: + from qdrant_client.models import FieldCondition, Filter, MatchValue, SearchParams + + query_filter = None + if source_group: + query_filter = Filter(must=[FieldCondition( + key="source_group", match=MatchValue(value=source_group), + )]) + try: + response = self._client.query_points( + collection_name=collection, + query=[float(value) for value in query_vector], + query_filter=query_filter, + search_params=SearchParams(exact=True), + limit=top_k, + with_payload=True, + ) + except Exception as exc: + raise QdrantBackendError( + "Exact Qdrant search is unavailable. Prepare the teaching collection again." + ) from exc + by_id = {chunk.chunk_id: chunk for chunk in index.chunks} + hits = [] + for rank, point in enumerate(response.points, start=1): + payload = dict(point.payload or {}) + chunk_id = str(payload.get("chunk_id", "")) + if chunk_id not in by_id: + raise QdrantBackendError( + "Qdrant collection does not match the local teaching index." + ) + hits.append(QdrantExactHit( + result=RetrievalResult( + chunk=by_id[chunk_id], score=float(point.score), rank=rank, + ), + payload=payload, + )) + return hits + def search(self, query_vector: np.ndarray, index: LoadedIndex, top_k: int) -> list[VectorSearchHit]: collection = index.manifest.get("backend_identity") if not collection: diff --git a/tiny_rag_lab/reranker.py b/tiny_rag_lab/reranker.py index 059989b..858b6ad 100644 --- a/tiny_rag_lab/reranker.py +++ b/tiny_rag_lab/reranker.py @@ -17,7 +17,8 @@ from __future__ import annotations from dataclasses import dataclass, field -from typing import Protocol +from pathlib import Path +from typing import Literal, Protocol from tiny_rag_lab.models import RetrievalResult from tiny_rag_lab.trace import ChunkTrace @@ -46,6 +47,17 @@ class RerankResult: post_score: float +@dataclass(frozen=True) +class RerankCandidateExplanation: + chunk_id: str + pre_rank: int + final_rank: int | None + pre_score: float + reranker_score: float + rank_delta: int | None + outcome: Literal["moved_up", "moved_down", "stayed", "dropped"] + + class Reranker(Protocol): """Second-pass reranker over a pre-retrieved candidate set. @@ -154,13 +166,74 @@ class CrossEncoderReranker: """ DEFAULT_MODEL = "cross-encoder/ms-marco-MiniLM-L-6-v2" + DEFAULT_REVISION = "c5ee24cb16019beea0893ab7796b1df96625c6b8" name: str - def __init__(self, model_name: str | None = None) -> None: + def __init__( + self, + model_name: str | None = None, + *, + revision: str | None = None, + local_files_only: bool = False, + ) -> None: self._model_name = model_name or self.DEFAULT_MODEL + self._revision = ( + revision + if revision is not None + else self.DEFAULT_REVISION if self._model_name == self.DEFAULT_MODEL else None + ) + self._local_files_only = local_files_only self._model = None # lazy — no I/O in __init__ self.name = "cross-encoder" + @classmethod + def ensure_default_model(cls, *, local_files_only: bool) -> str: + """Resolve and validate the exact default snapshot. + + ``snapshot_download`` may return an interrupted or otherwise partial + cache directory. Treating that directory as ready makes the Settings + status lie and defers the real failure until a learner tries to + rerank. Check the small set of files CrossEncoder needs before + publishing readiness. + """ + from huggingface_hub import snapshot_download + + snapshot = snapshot_download( + repo_id=cls.DEFAULT_MODEL, + revision=cls.DEFAULT_REVISION, + local_files_only=local_files_only, + ) + cls._validate_default_snapshot(Path(snapshot)) + return snapshot + + @staticmethod + def _validate_default_snapshot(snapshot: Path) -> None: + required = (snapshot / "config.json", snapshot / "tokenizer_config.json") + weight_candidates = (snapshot / "model.safetensors", snapshot / "pytorch_model.bin") + tokenizer_candidates = ( + snapshot / "tokenizer.json", + snapshot / "vocab.txt", + snapshot / "sentencepiece.bpe.model", + ) + missing = [path.name for path in required if not path.is_file()] + if not any(path.is_file() for path in weight_candidates): + missing.append("model weights") + if not any(path.is_file() for path in tokenizer_candidates): + missing.append("tokenizer vocabulary") + if missing: + raise RuntimeError( + "Pinned reranker snapshot is incomplete; missing " + ", ".join(missing) + ) + + @classmethod + def default_model_available(cls) -> bool: + """Check the pinned local snapshot without downloading or loading it.""" + try: + cls.ensure_default_model(local_files_only=True) + except Exception: + return False + return True + def rerank( self, query: str, @@ -172,7 +245,10 @@ def rerank( if self._model is None: from sentence_transformers import CrossEncoder - self._model = CrossEncoder(self._model_name) + model_options = {"local_files_only": self._local_files_only} + if self._revision is not None: + model_options["revision"] = self._revision + self._model = CrossEncoder(self._model_name, **model_options) pairs = [(query, c.chunk.text) for c in candidates] scores = self._model.predict(pairs) @@ -253,6 +329,39 @@ def apply_reranker( return reordered, audit +def explain_rerank( + audit: list[RerankResult], final_top_k: int, +) -> list[RerankCandidateExplanation]: + """Turn the full reranker audit into learner-facing rank movements.""" + if final_top_k < 0: + raise ValueError("final_top_k must be non-negative") + explanations: list[RerankCandidateExplanation] = [] + for result in sorted(audit, key=lambda item: item.pre_rank): + if result.post_rank > final_top_k: + final_rank = None + rank_delta = None + outcome: Literal["moved_up", "moved_down", "stayed", "dropped"] = "dropped" + else: + final_rank = result.post_rank + rank_delta = result.pre_rank - result.post_rank + if rank_delta > 0: + outcome = "moved_up" + elif rank_delta < 0: + outcome = "moved_down" + else: + outcome = "stayed" + explanations.append(RerankCandidateExplanation( + chunk_id=result.chunk_id, + pre_rank=result.pre_rank, + final_rank=final_rank, + pre_score=result.pre_score, + reranker_score=result.post_score, + rank_delta=rank_delta, + outcome=outcome, + )) + return explanations + + def chunk_traces_from_rerank( results: list[RetrievalResult], rerank_audit: list[RerankResult] | None, diff --git a/tiny_rag_lab/retrieval.py b/tiny_rag_lab/retrieval.py index 3342bd8..9003081 100644 --- a/tiny_rag_lab/retrieval.py +++ b/tiny_rag_lab/retrieval.py @@ -18,6 +18,8 @@ """ from __future__ import annotations +from dataclasses import dataclass + import numpy as np from tiny_rag_lab.embeddings import Embedder @@ -27,6 +29,22 @@ DEFAULT_TOP_K = 5 +@dataclass(frozen=True) +class DenseCandidateExplanation: + """Visible vector math for one candidate returned by cosine retrieval.""" + + chunk_id: str + rank: int + score: float + dimension: int + query_norm: float + chunk_norm: float + dot_product: float + cosine_similarity: float + query_vector_preview: list[float] + chunk_vector_preview: list[float] + + def retrieve( query_text: str, index: LoadedIndex, @@ -81,3 +99,48 @@ def retrieve_by_vector( ) for rank, idx in enumerate(top_indices, start=1) ] + + +def explain_dense_results( + query_vector: np.ndarray, + index: LoadedIndex, + results: list[RetrievalResult], + *, + preview_dimensions: int = 12, +) -> list[DenseCandidateExplanation]: + """Explain the same dot/norm/cosine calculation used by retrieval.""" + if preview_dimensions < 0: + raise ValueError("preview_dimensions must be non-negative") + query = np.asarray(query_vector, dtype=np.float32) + if query.ndim != 1: + raise ValueError("query_vector must be one-dimensional") + if index.embeddings.ndim != 2 or index.embeddings.shape[1] != len(query): + raise ValueError("query_vector dimension does not match the index") + + position_by_id = {chunk.chunk_id: position for position, chunk in enumerate(index.chunks)} + query_norm = float(np.linalg.norm(query)) + explanations: list[DenseCandidateExplanation] = [] + for result in results: + position = position_by_id.get(result.chunk.chunk_id) + if position is None: + raise ValueError(f"Result chunk {result.chunk.chunk_id!r} is not in the index") + vector = index.embeddings[position].astype(np.float32) + chunk_norm = float(np.linalg.norm(vector)) + dot_product = float(np.dot(query, vector)) + cosine = ( + dot_product / (query_norm * chunk_norm) + if query_norm and chunk_norm else 0.0 + ) + explanations.append(DenseCandidateExplanation( + chunk_id=result.chunk.chunk_id, + rank=result.rank, + score=result.score, + dimension=len(query), + query_norm=query_norm, + chunk_norm=chunk_norm, + dot_product=dot_product, + cosine_similarity=float(cosine), + query_vector_preview=[float(value) for value in query[:preview_dimensions]], + chunk_vector_preview=[float(value) for value in vector[:preview_dimensions]], + )) + return explanations diff --git a/tiny_rag_lab/seed_assets.py b/tiny_rag_lab/seed_assets.py index ec502b8..5d6af99 100644 --- a/tiny_rag_lab/seed_assets.py +++ b/tiny_rag_lab/seed_assets.py @@ -93,22 +93,37 @@ def seed_bundled_assets(data_root: Path, seed_root: Path | None) -> list[SeedRes if not target.exists(): _promote(source, target, asset, staging_root) state.setdefault("assets", {})[asset["id"]] = _state_entry(manifest, asset) + _write_state(state_path, state) results.append(SeedResult(asset["id"], "seeded")) continue - local_status = _managed_status(target, prior) - if local_status == "matches": - if prior.get("files") == asset["files"] and prior.get("seed_version") == manifest["seed_version"]: + # A process can stop after the verified directory is published but + # before its ownership state is replaced. Only recover a target that + # was already managed and exactly matches the incoming manifest; an + # unmanaged lookalike remains a conflict by design. + if prior and _files_status(target, asset["files"]) == "matches": + incoming = _state_entry(manifest, asset) + if prior == incoming: results.append(SeedResult(asset["id"], "ready")) else: - _promote(source, target, asset, staging_root) - state.setdefault("assets", {})[asset["id"]] = _state_entry(manifest, asset) - results.append(SeedResult(asset["id"], "upgraded")) + state.setdefault("assets", {})[asset["id"]] = incoming + _write_state(state_path, state) + shutil.rmtree(target.with_name(f".{target.name}.seed-backup"), ignore_errors=True) + results.append(SeedResult(asset["id"], "recovered")) + continue + + local_status = _managed_status(target, prior) + if local_status == "matches": + _promote(source, target, asset, staging_root) + state.setdefault("assets", {})[asset["id"]] = _state_entry(manifest, asset) + _write_state(state_path, state) + results.append(SeedResult(asset["id"], "upgraded")) continue if local_status == "missing_files": _promote(source, target, asset, staging_root) state.setdefault("assets", {})[asset["id"]] = _state_entry(manifest, asset) + _write_state(state_path, state) results.append(SeedResult(asset["id"], "repaired")) continue @@ -132,7 +147,11 @@ def _validate_asset(asset: dict[str, Any]) -> None: def _managed_status(target: Path, prior: dict[str, Any] | None) -> str: if not prior: return "unmanaged_target" - expected = prior.get("files", []) + return _files_status(target, prior.get("files", [])) + + +def _files_status(target: Path, expected: list[dict[str, Any]]) -> str: + """Compare one directory with an explicit manifest file set.""" expected_paths = {entry["path"] for entry in expected} actual_paths = { path.relative_to(target).as_posix() diff --git a/tiny_rag_lab/web_api.py b/tiny_rag_lab/web_api.py index 4125161..8993056 100644 --- a/tiny_rag_lab/web_api.py +++ b/tiny_rag_lab/web_api.py @@ -25,18 +25,49 @@ from pydantic import BaseModel, Field from tiny_rag_lab.bm25 import BM25Retriever +from tiny_rag_lab.browser_eval import ( + BrowserEvaluationCancelled, + BrowserEvaluationError, + EVALUATION_PRESETS, + RetrievalConfiguration, + run_browser_comparison, + validate_evaluation_bundle, +) from tiny_rag_lab.chunking import chunk_documents_with_strategy from tiny_rag_lab.context import FakeTokenCounter, pack_context from tiny_rag_lab.documents import load_documents -from tiny_rag_lab.embeddings import SentenceTransformerEmbedder +from tiny_rag_lab.embeddings import ( + DEFAULT_EMBEDDING_MODEL, + DEFAULT_EMBEDDING_REVISION, + SentenceTransformerEmbedder, +) from tiny_rag_lab.generation import OpenAIGenerator -from tiny_rag_lab.hybrid import reciprocal_rank_fusion +from tiny_rag_lab.hybrid import reciprocal_rank_fusion_with_explanation from tiny_rag_lab.index_backend import NumpyIndexBackend, backend_from_manifest from tiny_rag_lab.index_loader import load_index from tiny_rag_lab.index_writer import write_index from tiny_rag_lab.lab_trace import EvidenceSnapshot, build_lab_run, load_lab_run, write_lab_run +from tiny_rag_lab.jobs import ( + JobConflictError, + JobNotFoundError, + LocalJobStore, + atomic_write_json, +) from tiny_rag_lab.prompting import assemble_prompt, extract_source_citations -from tiny_rag_lab.qdrant_backend import qdrant_is_available +from tiny_rag_lab.qdrant_backend import ( + QdrantBackendError, + QdrantIndexBackend, + compare_exact_rankings, + qdrant_is_available, + source_vector_fingerprint, +) +from tiny_rag_lab.retrieval import explain_dense_results +from tiny_rag_lab.reranker import ( + CrossEncoderReranker, + apply_reranker, + chunk_traces_from_rerank, + explain_rerank, +) from tiny_rag_lab.seed_assets import SeedAssetError, seed_bundled_assets from tiny_rag_lab.trace import AskTrace, ChunkTrace, RetrieveTrace @@ -67,12 +98,39 @@ class RunRequest(BaseModel): index_id: str query: str | None = Field(default=None, min_length=1) catalog_question_id: str | None = None + retrieval_material_id: str | None = None retriever: Literal["dense", "bm25", "hybrid"] = "dense" top_k: int = Field(default=5, ge=1, le=50) + reranker: Literal["none", "cross-encoder"] = "none" + rerank_top_n: int = Field(default=20, ge=1, le=50) context_budget: int = Field(default=0, ge=0) + explain: bool = False provider: ProviderOverride | None = None +class QdrantCompareRequest(BaseModel): + retrieval_material_id: str + top_k: int = Field(default=5, ge=1, le=20) + source_group: Literal[ + "durable-objects", "queues", "kv", "r2", "workflows", + ] | None = None + + +class EvaluationConfigurationRequest(BaseModel): + retriever: Literal["bm25", "dense", "hybrid"] + top_k: int = Field(default=5, ge=1, le=20) + reranker: Literal["none", "cross-encoder"] = "none" + rerank_top_n: int = Field(default=20, ge=1, le=50) + + def engine_config(self) -> RetrievalConfiguration: + return RetrievalConfiguration(**self.model_dump()) + + +class EvaluationRequest(BaseModel): + left: EvaluationConfigurationRequest + right: EvaluationConfigurationRequest + + def _safe_id(value: str, kind: str) -> str: if not value or value != Path(value).name or value in {".", ".."}: raise HTTPException(422, f"Invalid {kind} identifier") @@ -80,8 +138,7 @@ def _safe_id(value: str, kind: str) -> str: def _write_json(path: Path, value: dict) -> None: - path.parent.mkdir(parents=True, exist_ok=True) - path.write_text(json.dumps(value, indent=2), encoding="utf-8") + atomic_write_json(path, value) def _read_json(path: Path) -> dict: @@ -127,7 +184,8 @@ def create_app(data_root: Path | None = None, static_dir: Path | None = None) -> jobs_dir = root / "jobs" for directory in (corpora_dir, indexes_dir, runs_dir, jobs_dir): directory.mkdir(parents=True, exist_ok=True) - seed_root = Path(os.environ.get("TINY_RAG_LAB_SEED_DIR", "/opt/tiny-rag-lab/seeds/v1")) + job_store = LocalJobStore(jobs_dir) + seed_root = Path(os.environ.get("TINY_RAG_LAB_SEED_DIR", "/opt/tiny-rag-lab/seeds/v2")) try: seed_results = seed_bundled_assets(root, seed_root) except SeedAssetError as exc: @@ -135,21 +193,45 @@ def create_app(data_root: Path | None = None, static_dir: Path | None = None) -> # health makes an image-seed problem explicit instead of hiding it. logger.exception("Bundled seed assets are unavailable") seed_results = [{"status": "error", "detail": str(exc)}] - # FastAPI BackgroundTasks are process-bound. A persisted queued/running - # record after restart cannot resume safely, so expose a clear retryable - # failure instead of leaving the local UI polling forever. - for job_path in jobs_dir.glob("*.json"): - try: - job = _read_json(job_path) - except (OSError, json.JSONDecodeError): + # Recover the short publication boundary before failing other process-bound + # work. A final artifact proves publication won; otherwise staging and any + # unpublished Qdrant ownership are cleaned before the job becomes terminal. + for job in job_store.all(): + artifact = job.get("artifact") or {} + artifact_kind = artifact.get("kind") + artifact_id = artifact.get("id") + final_path = ( + corpora_dir / artifact_id if artifact_kind == "corpus" and artifact_id + else indexes_dir / artifact_id if artifact_kind == "index" and artifact_id + else None + ) + if job.get("status") == "publishing" and final_path is not None and final_path.exists(): + fields = {"corpus_id": artifact_id} if artifact_kind == "corpus" else {"index_id": artifact_id} + job_store.complete(job["id"], **fields) continue - if job.get("status") in {"queued", "running"}: - job["status"] = "failed" - job["error"] = "The local server restarted before this job completed. Please start it again." - _write_json(job_path, job) + collection = artifact.get("qdrant_collection") + if collection and (final_path is None or not final_path.exists()): + if qdrant_is_available(os.environ.get("QDRANT_URL", "http://127.0.0.1:6333")): + try: + QdrantIndexBackend( + os.environ.get("QDRANT_URL", "http://127.0.0.1:6333") + ).delete(collection) + job_store.update(job["id"], cleanup_pending=False) + except Exception: + logger.exception("Failed to clean recovered Qdrant collection %s", collection) + job_store.update(job["id"], cleanup_pending=True) + else: + job_store.update(job["id"], cleanup_pending=True) + for parent in (corpora_dir, indexes_dir): + for staging in parent.glob(".*.staging"): + if staging.is_dir(): + shutil.rmtree(staging, ignore_errors=True) + + # Other process-bound tasks cannot resume after restart. Persist a + # terminal, actionable state so the browser never polls forever. + job_store.recover_interrupted() app = FastAPI(title="tiny-rag-lab local API", docs_url=None, redoc_url=None) - job_admission_lock = threading.Lock() # The packaged browser client uses the same origin. This only helps native # development and deliberately does not open the server beyond loopback. app.add_middleware( @@ -184,35 +266,54 @@ def provider_status() -> dict: "default_model": getattr(OpenAIGenerator, "DEFAULT_MODEL", "gpt-4o-mini"), } + def run_config(request: RunRequest) -> dict: + config = { + "retriever": request.retriever, + "top_k": request.top_k, + "context_budget": request.context_budget, + } + if request.reranker != "none": + config.update({ + "reranker": request.reranker, + "rerank_top_n": request.rerank_top_n, + }) + return config + + def ask_chunk_traces(results, retrieve_trace: RetrieveTrace) -> list[ChunkTrace]: + """Keep retrieval/rerank audit fields when Ask selects its context.""" + by_chunk_id = {chunk.chunk_id: chunk for chunk in retrieve_trace.chunks} + return [ + by_chunk_id.get(result.chunk.chunk_id, _chunk_trace(result)) + for result in results + ] + def model_status() -> dict: try: SentenceTransformerEmbedder(local_files_only=True) except Exception: - return {"ready": False, "variant": os.environ.get("LAB_IMAGE_VARIANT", "native")} - return {"ready": True, "variant": os.environ.get("LAB_IMAGE_VARIANT", "native")} + ready = False + else: + ready = True + return { + "ready": ready, + "variant": os.environ.get("LAB_IMAGE_VARIANT", "native"), + "model": DEFAULT_EMBEDDING_MODEL, + "revision": DEFAULT_EMBEDDING_REVISION, + "dimension": 384, + } def save_run(run) -> dict: path = runs_dir / f"{run.run_id}.json" write_lab_run(run, path) return load_lab_run(path) - def admit_job(kind: str, **fields: str) -> tuple[str, Path]: + def admit_job(kind: str, **fields) -> str: """Persist one visible queued job or reject a concurrent request.""" - with job_admission_lock: - for existing_path in jobs_dir.glob("*.json"): - try: - existing = _read_json(existing_path) - except (OSError, json.JSONDecodeError): - continue - if existing.get("status") in {"queued", "running"}: - raise HTTPException( - 409, - f"Local job {existing.get('id', existing_path.stem)} is {existing['status']}. Wait for it before starting another job.", - ) - job_id = f"{kind}-{uuid4().hex[:12]}" - job_path = jobs_dir / f"{job_id}.json" - _write_json(job_path, {"id": job_id, "status": "queued", "kind": kind, **fields}) - return job_id, job_path + try: + job = job_store.admit(kind, **fields) + except JobConflictError as exc: + raise HTTPException(409, str(exc)) from exc + return job["id"] def resolve_index(index_id: str): index_id = _safe_id(index_id, "index") @@ -229,6 +330,30 @@ def resolve_index(index_id: str): raise HTTPException(409, str(exc)) from exc return index_id, index, backend + def resolve_teaching_index(): + index_id = "cloudflare-state-structural-v1" + path = indexes_dir / index_id + if not path.exists(): + raise HTTPException(409, "The bundled structural index is not available") + return index_id, NumpyIndexBackend().open(path) + + def evaluation_paths() -> tuple[Path, Path, Path]: + corpus = corpora_dir / "cloudflare-state-v1" + return ( + indexes_dir / "cloudflare-state-structural-v1", + corpus / "retrieval-questions.jsonl", + corpus / "evaluation-manifest.json", + ) + + def evaluation_bundle(): + try: + return validate_evaluation_bundle(*evaluation_paths()) + except BrowserEvaluationError as exc: + raise HTTPException(409, str(exc)) from exc + + def qdrant_url() -> str: + return os.environ.get("QDRANT_URL", "http://127.0.0.1:6333") + def load_catalog_question(corpus_id: str, question_id: str) -> dict: questions_path = corpora_dir / corpus_id / "questions.jsonl" if not questions_path.exists(): @@ -241,8 +366,27 @@ def load_catalog_question(corpus_id: str, question_id: str) -> dict: return item raise HTTPException(404, "Catalog question not found") + def load_retrieval_material(question_id: str) -> dict: + questions_path = corpora_dir / "cloudflare-state-v1" / "retrieval-questions.jsonl" + if not questions_path.exists(): + raise HTTPException(409, "The bundled retrieval course is not available") + for line in questions_path.read_text(encoding="utf-8").splitlines(): + if not line.strip(): + continue + item = json.loads(line) + if item.get("question_id") == question_id: + return item + raise HTTPException(404, "Retrieval course question not found") + def resolve_run_question(request: RunRequest, index) -> tuple[str, dict | None]: """Resolve catalog IDs on the server, never from browser-provided gold.""" + if request.retrieval_material_id: + if request.catalog_question_id: + raise HTTPException(422, "Choose one question source") + if index.manifest.get("source_corpus_id") != "cloudflare-state-v1": + raise HTTPException(409, "Retrieval course questions require the bundled Cloudflare index") + material = load_retrieval_material(request.retrieval_material_id) + return material["question"], material if not request.catalog_question_id: if request.query is None: raise HTTPException(422, "Provide a query or catalog_question_id") @@ -277,10 +421,19 @@ def run_retrieval(request: RunRequest): query_vector: list[float] | None = None latency: dict[str, float] = {} semantics = "cosine_similarity[-1,1]" + explanations: dict | None = None + if request.reranker != "none" and request.rerank_top_n < request.top_k: + raise HTTPException(422, "rerank_top_n must be greater than or equal to top_k") + retrieval_k = request.rerank_top_n if request.reranker != "none" else request.top_k score_components: dict[str, dict[str, float]] = {} if request.retriever == "bm25": - results = BM25Retriever(index.chunks).retrieve(query, request.top_k) + bm25 = BM25Retriever(index.chunks) + if request.explain: + results, bm25_explanation = bm25.retrieve_with_explanation(query, retrieval_k) + explanations = {"kind": "bm25", "bm25": asdict(bm25_explanation)} + else: + results = bm25.retrieve(query, retrieval_k) semantics = "bm25_score" score_components = { result.chunk.chunk_id: {"bm25_score": result.score, "bm25_rank": float(result.rank)} @@ -294,17 +447,47 @@ def run_retrieval(request: RunRequest): latency["embed"] = time.perf_counter() - t0 t0 = time.perf_counter() try: - dense_hits = vector_backend.search(query_vec, index, request.top_k) + dense_hits = vector_backend.search(query_vec, index, retrieval_k) except Exception as exc: from tiny_rag_lab.qdrant_backend import QdrantBackendError if isinstance(exc, QdrantBackendError): raise HTTPException(503, str(exc)) from exc raise dense_results = [hit.result for hit in dense_hits] + if request.explain and request.retriever == "dense": + explanations = { + "kind": "dense", + "dense": { + "dimension": len(query_vec), + "candidates": [ + asdict(item) + for item in explain_dense_results(query_vec, index, dense_results) + ], + }, + } semantics = dense_hits[0].score_semantics if dense_hits else vector_backend.score_semantics if request.retriever == "hybrid": - bm25_results = BM25Retriever(index.chunks).retrieve(query, request.top_k) - results = reciprocal_rank_fusion([dense_results, bm25_results], request.top_k) + bm25_results = BM25Retriever(index.chunks).retrieve(query, retrieval_k) + results, hybrid_explanation = reciprocal_rank_fusion_with_explanation( + [dense_results, bm25_results], retrieval_k, + source_names=["dense", "bm25"], + ) + if request.explain: + explanations = { + "kind": "hybrid", + "hybrid": { + "rrf_k": 60, + "dense": [ + {"chunk_id": result.chunk.chunk_id, "rank": result.rank, "score": result.score} + for result in dense_results + ], + "bm25": [ + {"chunk_id": result.chunk.chunk_id, "rank": result.rank, "score": result.score} + for result in bm25_results + ], + "candidates": [asdict(item) for item in hybrid_explanation], + }, + } semantics = "reciprocal_rank_fusion" dense_by_id = {result.chunk.chunk_id: result for result in dense_results} bm25_by_id = {result.chunk.chunk_id: result for result in bm25_results} @@ -326,11 +509,71 @@ def run_retrieval(request: RunRequest): if request.retriever == "bm25": latency["retrieve"] = time.perf_counter() - t0 + candidate_results = list(results) + candidate_semantics = semantics + rerank_audit = None + if request.reranker == "cross-encoder": + t0 = time.perf_counter() + try: + results, rerank_audit = apply_reranker( + query, + candidate_results, + CrossEncoderReranker(local_files_only=True), + request.top_k, + ) + except OSError as exc: + logger.info("Pinned local reranker snapshot is unavailable: %s", exc) + raise HTTPException( + 409, + "Download the default reranker model before using cross-encoder reranking", + ) from exc + except Exception as exc: + logger.exception("Cross-encoder reranking failed") + raise HTTPException( + 500, + "Cross-encoder reranking failed. Check the local server logs and try again.", + ) from exc + latency["rerank"] = time.perf_counter() - t0 + semantics = "cross_encoder_relevance" + audit_by_id = {item.chunk_id: item for item in rerank_audit} + score_components = { + result.chunk.chunk_id: { + **score_components.get(result.chunk.chunk_id, {}), + "reranker_score": result.score, + "pre_rerank_score": audit_by_id[result.chunk.chunk_id].pre_score, + "pre_rerank_rank": float(audit_by_id[result.chunk.chunk_id].pre_rank), + } + for result in results + } + if request.explain: + explanations = { + **(explanations or {}), + "kind": "reranking", + "reranking": { + "candidate_count": len(candidate_results), + "final_top_k": request.top_k, + "candidates": [ + asdict(item) for item in explain_rerank(rerank_audit, request.top_k) + ], + }, + } trace = RetrieveTrace( query=query, retriever=request.retriever, top_k=request.top_k, - chunks=[_chunk_trace(result) for result in results], latency_by_stage=latency, + chunks=( + chunk_traces_from_rerank(results, rerank_audit) + if rerank_audit is not None else [_chunk_trace(result) for result in results] + ), + latency_by_stage=latency, + reranker=request.reranker, + rerank_top_n=( + request.rerank_top_n if request.reranker != "none" else None + ), + ) + return ( + index_id, index, results, trace, query_vector, semantics, + score_components, catalog_question, explanations, candidate_results, + candidate_semantics, ) - return index_id, index, results, trace, query_vector, semantics, score_components, catalog_question @app.get("/api/health") def health(): @@ -390,21 +633,56 @@ def test_provider(override: ProviderOverride | None = None): def get_model_status(): return model_status() + @app.get("/api/models/reranker/status") + def get_reranker_model_status(): + return { + "ready": CrossEncoderReranker.default_model_available(), + "model": CrossEncoderReranker.DEFAULT_MODEL, + "revision": CrossEncoderReranker.DEFAULT_REVISION, + } + @app.post("/api/models/default/download", status_code=202) def download_default_model(background_tasks: BackgroundTasks): if model_status()["ready"]: return {"id": "embedding-model-ready", "status": "complete"} - job_id, job_path = admit_job("embedding-model") + job_id = admit_job("embedding-model") def download_job(): with _job_lock: - _write_json(job_path, {"id": job_id, "status": "running", "kind": "embedding-model"}) + if not job_store.start(job_id, total=1, message="Downloading embedding model"): + return try: SentenceTransformerEmbedder() - _write_json(job_path, {"id": job_id, "status": "complete", "kind": "embedding-model"}) + if not job_store.progress(job_id, 1, total=1, message="Embedding model downloaded"): + return + job_store.complete(job_id) except Exception: logger.exception("Embedding-model job %s failed", job_id) - _write_json(job_path, {"id": job_id, "status": "failed", "kind": "embedding-model", "error": "Model download failed. Check your network and try again."}) + job_store.fail(job_id, "Model download failed. Check your network and try again.") + + background_tasks.add_task(download_job) + return {"id": job_id, "status": "queued"} + + @app.post("/api/models/reranker/download", status_code=202) + def download_reranker_model(background_tasks: BackgroundTasks): + if CrossEncoderReranker.default_model_available(): + return {"id": "reranker-model-ready", "status": "complete"} + job_id = admit_job("reranker-model") + + def download_job(): + with _job_lock: + if not job_store.start(job_id, total=1, message="Downloading reranker model"): + return + try: + CrossEncoderReranker.ensure_default_model(local_files_only=False) + if not CrossEncoderReranker.default_model_available(): + raise RuntimeError("Downloaded reranker snapshot could not be verified") + if not job_store.progress(job_id, 1, total=1, message="Reranker model downloaded"): + return + job_store.complete(job_id) + except Exception: + logger.exception("Reranker-model job %s failed", job_id) + job_store.fail(job_id, "Reranker download failed. Check your network and try again.") background_tasks.add_task(download_job) return {"id": job_id, "status": "queued"} @@ -461,6 +739,230 @@ def get_lesson(lesson_id: str): return _read_json(path) raise HTTPException(404, "Lesson not found") + @app.get("/api/retrieval/materials") + def retrieval_materials(): + """Return the reviewed question set without inventing browser copies.""" + path = corpora_dir / "cloudflare-state-v1" / "retrieval-questions.jsonl" + items = [] + if path.exists(): + for line in path.read_text(encoding="utf-8").splitlines(): + if line.strip(): + items.append(json.loads(line)) + return { + "corpus_id": "cloudflare-state-v1", + "index_id": "cloudflare-state-structural-v1", + "items": items, + } + + @app.get("/api/retrieval/qdrant/status") + def retrieval_qdrant_status(): + index_id, index = resolve_teaching_index() + available = qdrant_is_available(qdrant_url()) + report = None + if available: + report = QdrantIndexBackend(qdrant_url()).teaching_status( + "tiny_rag_cloudflare_state_structural_qdrant_local", index, + ) + return { + "available": available, + "prepared": report is not None, + "launch_command": "docker compose --profile qdrant up -d", + "index_id": index_id, + "source_fingerprint": source_vector_fingerprint(index), + "collection": asdict(report) if report else None, + "filters": ["durable-objects", "queues", "kv", "r2", "workflows"], + } + + @app.post("/api/retrieval/qdrant/prepare", status_code=201) + def prepare_retrieval_qdrant(): + if not qdrant_is_available(qdrant_url()): + raise HTTPException( + 409, + "Qdrant is not ready. Run docker compose --profile qdrant up -d, then try again.", + ) + _index_id, index = resolve_teaching_index() + try: + report = QdrantIndexBackend(qdrant_url()).prepare_teaching_collection( + "tiny_rag_cloudflare_state_structural_qdrant_local", index, + ) + except Exception as exc: + logger.exception("Qdrant teaching collection preparation failed") + from tiny_rag_lab.qdrant_backend import QdrantBackendError + if isinstance(exc, QdrantBackendError): + raise HTTPException(503, str(exc)) from exc + raise HTTPException( + 500, "Qdrant preparation failed. Check the local server logs and try again." + ) from exc + return asdict(report) + + @app.post("/api/retrieval/qdrant/compare") + def compare_retrieval_qdrant(request: QdrantCompareRequest): + if not qdrant_is_available(qdrant_url()): + raise HTTPException(409, "Qdrant is not ready") + _index_id, index = resolve_teaching_index() + try: + backend = QdrantIndexBackend(qdrant_url()) + status = backend.teaching_status( + "tiny_rag_cloudflare_state_structural_qdrant_local", index, + raise_on_error=True, + ) + except (QdrantBackendError, RuntimeError, OSError) as exc: + logger.exception("Qdrant comparison setup failed") + raise HTTPException( + 503, "Qdrant became unavailable. Check the local service and try again." + ) from exc + if status is None: + raise HTTPException(409, "Prepare the Qdrant teaching collection before comparing it") + if not model_status()["ready"]: + raise HTTPException(409, "Download the default embedding model before comparing vector search") + material = load_retrieval_material(request.retrieval_material_id) + embedder = SentenceTransformerEmbedder( + index.manifest.get("embedding_model"), local_files_only=True, + ) + query_vector = embedder.embed([material["question"]])[0] + numpy_hits = NumpyIndexBackend().search(query_vector, index, request.top_k) + try: + qdrant_hits = backend.search_exact( + status.alias, query_vector, index, request.top_k, + ) + except QdrantBackendError as exc: + raise HTTPException(503, str(exc)) from exc + parity = compare_exact_rankings( + [hit.result for hit in numpy_hits], + [hit.result for hit in qdrant_hits], + ) + filtered_hits = [] + if request.source_group: + try: + filtered_hits = backend.search_exact( + status.alias, query_vector, index, request.top_k, + source_group=request.source_group, + ) + except QdrantBackendError as exc: + raise HTTPException(503, str(exc)) from exc + + def serialized(result, payload=None): + return { + "chunk_id": result.chunk.chunk_id, + "doc_id": result.chunk.doc_id, + "title": result.chunk.metadata.get("title", ""), + "path": result.chunk.doc_id, + "text": result.chunk.text, + "rank": result.rank, + "score": result.score, + "payload": payload, + } + + return { + "question_id": material["question_id"], + "question": material["question"], + "collection": asdict(status), + "numpy": [serialized(hit.result) for hit in numpy_hits], + "qdrant": [serialized(hit.result, hit.payload) for hit in qdrant_hits], + "parity": asdict(parity), + "source_group": request.source_group, + "filtered_qdrant": [ + serialized(hit.result, hit.payload) for hit in filtered_hits + ], + } + + @app.get("/api/evaluations/status") + def evaluation_status(): + try: + _index, questions, manifest = validate_evaluation_bundle(*evaluation_paths()) + except BrowserEvaluationError as exc: + return { + "ready": False, + "reason": str(exc), + "question_count": 0, + "presets": EVALUATION_PRESETS, + } + return { + "ready": True, + "reason": None, + "question_count": len(questions), + "source_vector_fingerprint": manifest["source_vector_fingerprint"], + "presets": EVALUATION_PRESETS, + } + + @app.post("/api/evaluations", status_code=202) + def create_evaluation(request: EvaluationRequest, background_tasks: BackgroundTasks): + index, questions, manifest = evaluation_bundle() + left = request.left.engine_config() + right = request.right.engine_config() + try: + left.validate() + right.validate() + except BrowserEvaluationError as exc: + raise HTTPException(422, str(exc)) from exc + if left.effective_identity() == right.effective_identity(): + raise HTTPException(422, "Choose two different retrieval configurations") + needs_embedding = left.retriever != "bm25" or right.retriever != "bm25" + needs_reranker = left.reranker != "none" or right.reranker != "none" + if needs_embedding and not model_status()["ready"]: + raise HTTPException(409, "Download the default embedding model before running this comparison") + if needs_reranker and not CrossEncoderReranker.default_model_available(): + raise HTTPException(409, "Download the default reranker model before running this comparison") + + job_id = admit_job( + "evaluation", left=asdict(left), right=asdict(right), + question_count=len(questions), + source_vector_fingerprint=manifest["source_vector_fingerprint"], + ) + + def evaluation_job(): + with _job_lock: + if not job_store.start( + job_id, total=len(questions), message="Preparing retrieval comparison", + ): + return + try: + embedder = ( + SentenceTransformerEmbedder( + index.manifest.get("embedding_model"), + revision=manifest["embedding_revision"], + local_files_only=True, + ) + if needs_embedding else None + ) + + def checkpoint(current: int, total: int, side: str) -> bool: + return job_store.progress( + job_id, current, total=total, + message=( + f"Question {current + 1} of {total}: first configuration complete" + if side == "left" else f"Compared {current} of {total} questions" + ), + ) + + result = run_browser_comparison( + questions, index, left, right, + embedder=embedder, + reranker_factory=lambda: CrossEncoderReranker(local_files_only=True), + checkpoint=checkpoint, + ) + if not job_store.begin_publish(job_id, message="Publishing comparison result"): + return + job_store.complete(job_id, result={ + **result, + "bundle": { + "index_id": "cloudflare-state-structural-v1", + "question_count": len(questions), + "source_vector_fingerprint": manifest["source_vector_fingerprint"], + }, + }) + except BrowserEvaluationCancelled: + return + except Exception: + logger.exception("Evaluation job %s failed", job_id) + job_store.fail( + job_id, + "Evaluation failed. Check local model readiness and the server logs, then try again.", + ) + + background_tasks.add_task(evaluation_job) + return {"id": job_id, "status": "queued"} + @app.get("/api/failure-lessons") def failure_lessons(): from tiny_rag_lab.failure_lessons import FAILURE_LESSONS @@ -505,12 +1007,21 @@ def list_indexes(): @app.get("/api/indexes/{index_id}") def get_index(index_id: str): - index_id, index, _ = resolve_index(index_id) + index_id, index, backend = resolve_index(index_id) + capabilities = None + if isinstance(backend, QdrantIndexBackend): + collection = index.manifest.get("backend_identity") + capabilities = { + "payload_filters": bool(collection) and backend.payload_filters_available( + collection, index, + ), + } return { "id": index_id, "manifest": index.manifest, "document_count": index.manifest.get("document_count", 0), "chunk_count": index.manifest.get("chunk_count", len(index.chunks)), + "capabilities": capabilities, "chunks": [ { "chunk_id": chunk.chunk_id, "doc_id": chunk.doc_id, @@ -560,26 +1071,49 @@ def import_watsonxdocsqa(background_tasks: BackgroundTasks): corpus_id = "watsonxdocsqa" if (corpora_dir / corpus_id / "corpus.json").exists(): return {"id": "watsonxdocsqa-ready", "status": "complete", "corpus_id": corpus_id} - job_id, job_path = admit_job("watsonxDocsQA") + job_id = admit_job("watsonxDocsQA") def import_job(): with _job_lock: - _write_json(job_path, {"id": job_id, "status": "running", "kind": "watsonxDocsQA"}) + if not job_store.start(job_id, total=2, message="Preparing corpus download"): + return + staging_root = corpora_dir / f".{corpus_id}.staging" + published = False try: - destination = corpora_dir / corpus_id / "files" + shutil.rmtree(staging_root, ignore_errors=True) + destination = staging_root / "files" destination.mkdir(parents=True, exist_ok=True) script = Path(__file__).resolve().parent.parent / "scripts" / "prepare_watsonx_docsqa.py" subprocess.run( [sys.executable, str(script), "--output-dir", str(destination)], check=True, capture_output=True, text=True, ) + if not job_store.progress(job_id, 1, total=2, message="Corpus downloaded"): + shutil.rmtree(staging_root, ignore_errors=True) + return file_count = len(list(destination.rglob("*.md"))) corpus = {"id": corpus_id, "name": "watsonxDocsQA", "kind": "catalog", "file_count": file_count} - _write_json(corpora_dir / corpus_id / "corpus.json", corpus) - _write_json(job_path, {"id": job_id, "status": "complete", "kind": "watsonxDocsQA", "corpus_id": corpus_id}) + _write_json(staging_root / "corpus.json", corpus) + if not job_store.progress(job_id, 2, total=2, message="Publishing corpus"): + shutil.rmtree(staging_root, ignore_errors=True) + return + job_store.update(job_id, artifact={ + "kind": "corpus", "id": corpus_id, + "staging_name": staging_root.name, + }) + if not job_store.begin_publish(job_id, message="Publishing corpus"): + shutil.rmtree(staging_root, ignore_errors=True) + return + os.replace(staging_root, corpora_dir / corpus_id) + published = True + job_store.complete(job_id, corpus_id=corpus_id) except Exception: logger.exception("watsonxDocsQA import job %s failed", job_id) - _write_json(job_path, {"id": job_id, "status": "failed", "kind": "watsonxDocsQA", "error": "Corpus import failed. Check the local server logs and try again."}) + shutil.rmtree(staging_root, ignore_errors=True) + if published: + job_store.complete(job_id, corpus_id=corpus_id) + else: + job_store.fail(job_id, "Corpus import failed. Check the local server logs and try again.") background_tasks.add_task(import_job) return {"id": job_id, "status": "queued"} @@ -599,13 +1133,21 @@ def create_index(request: IndexRequest, background_tasks: BackgroundTasks): 409, "Qdrant is not ready. Start the optional Qdrant service, then try building again.", ) - job_id, job_path = admit_job("index", corpus_id=corpus_id) + job_id = admit_job("index", corpus_id=corpus_id) def index_job(): with _job_lock: - _write_json(job_path, {"id": job_id, "status": "running", "kind": "index", "corpus_id": corpus_id}) + if not job_store.start(job_id, total=5, message="Loading documents"): + return + staging_dir = None + vector_backend = None + collection = None + qdrant_built = False + published = False try: docs = load_documents(corpus_path) + if not job_store.progress(job_id, 1, total=5, message="Chunking documents"): + return embedder = SentenceTransformerEmbedder(local_files_only=True) chunks = chunk_documents_with_strategy( docs, strategy=request.chunking_strategy, chunk_size=request.chunk_size, @@ -613,13 +1155,23 @@ def index_job(): embedder=embedder if request.chunking_strategy == "semantic" else None, similarity_threshold=request.semantic_similarity_threshold, ) + if not job_store.progress(job_id, 2, total=5, message="Embedding chunks"): + return embeddings = embedder.embed([chunk.text for chunk in chunks]) + if not job_store.progress(job_id, 3, total=5, message="Writing local index"): + return index_id = f"index-{uuid4().hex[:12]}" collection = f"tiny_rag_{index_id.replace('-', '_')}" staging_dir = indexes_dir / f".{index_id}.staging" + job_store.update(job_id, artifact={ + "kind": "index", "id": index_id, + "staging_name": staging_dir.name, + "qdrant_collection": collection if request.index_backend == "qdrant" else None, + }) write_index( staging_dir, docs, chunks, embeddings, corpus_root=corpus_path, embedding_backend=type(embedder).__name__, embedding_model=embedder.model_name, + embedding_revision=getattr(embedder, "revision", None), embedding_dim=embedder.dim, chunk_size=request.chunk_size, chunk_overlap=request.chunk_overlap, chunking_strategy=request.chunking_strategy, chunking_params={"similarity_threshold": request.semantic_similarity_threshold} @@ -628,44 +1180,94 @@ def index_job(): backend_identity=collection if request.index_backend == "qdrant" else "numpy", source_corpus_id=corpus_id, ) + if not job_store.progress(job_id, 4, total=5, message="Publishing vector backend"): + shutil.rmtree(staging_dir, ignore_errors=True) + return staged_index = load_index(staging_dir) vector_backend = backend_from_manifest( staged_index.manifest, qdrant_url=os.environ.get("QDRANT_URL", "http://127.0.0.1:6333"), ) if request.index_backend == "qdrant": + # Ownership begins before build: Qdrant may create a + # partial collection and then raise. + qdrant_built = True vector_backend.build(collection, staged_index) + if not job_store.progress(job_id, 5, total=5, message="Publishing index"): + if request.index_backend == "qdrant": + vector_backend.delete(collection) + shutil.rmtree(staging_dir, ignore_errors=True) + return + if not job_store.begin_publish(job_id, message="Publishing index"): + if qdrant_built: + vector_backend.delete(collection) + shutil.rmtree(staging_dir, ignore_errors=True) + return staging_dir.replace(indexes_dir / index_id) - _write_json(job_path, {"id": job_id, "status": "complete", "kind": "index", "index_id": index_id}) + published = True + job_store.complete(job_id, index_id=index_id, corpus_id=corpus_id) except Exception: logger.exception("Index job %s failed", job_id) - shutil.rmtree(locals().get("staging_dir", indexes_dir / ".missing"), ignore_errors=True) - error = ( - "Qdrant could not build this index. Confirm the local Qdrant service is still running, then try again." - if request.index_backend == "qdrant" - else "Indexing failed. Check the local server logs and try again." - ) - _write_json(job_path, {"id": job_id, "status": "failed", "kind": "index", "error": error}) + if staging_dir is not None: + shutil.rmtree(staging_dir, ignore_errors=True) + if qdrant_built and not published: + try: + vector_backend.delete(collection) + except Exception: + logger.exception("Failed to clean unpublished Qdrant collection %s", collection) + job_store.update(job_id, cleanup_pending=True) + if published: + job_store.complete(job_id, index_id=index_id, corpus_id=corpus_id) + else: + error = ( + "Qdrant could not build this index. Confirm the local Qdrant service is still running, then try again." + if request.index_backend == "qdrant" + else "Indexing failed. Check the local server logs and try again." + ) + job_store.fail(job_id, error) background_tasks.add_task(index_job) return {"id": job_id, "status": "queued"} + @app.get("/api/jobs/active") + def active_jobs(kind: str | None = None): + return {"items": job_store.active(kind=kind)} + @app.get("/api/jobs/{job_id}") def get_job(job_id: str): - path = jobs_dir / f"{_safe_id(job_id, 'job')}.json" - if not path.exists(): - raise HTTPException(404, "Job not found") - return _read_json(path) + try: + return job_store.read(_safe_id(job_id, "job")) + except JobNotFoundError as exc: + raise HTTPException(404, "Job not found") from exc + + @app.post("/api/jobs/{job_id}/cancel", status_code=202) + def cancel_job(job_id: str): + try: + return job_store.request_cancel(_safe_id(job_id, "job")) + except JobNotFoundError as exc: + raise HTTPException(404, "Job not found") from exc + + @app.get("/api/jobs/{job_id}/result") + def get_job_result(job_id: str): + try: + return job_store.result(_safe_id(job_id, "job")) + except JobNotFoundError as exc: + raise HTTPException(404, "Complete job result not found") from exc @app.post("/api/runs/retrieve", status_code=201) def retrieve(request: RunRequest): - index_id, index, results, trace, query_vector, semantics, components, question = run_retrieval(request) + index_id, index, results, trace, query_vector, semantics, components, question, explanations, candidates, candidate_semantics = run_retrieval(request) return save_run(build_lab_run( trace, index_id=index_id, manifest=index.manifest, document_count=index.manifest.get("document_count", 0), evidence=[_evidence(result, semantics, score_components=components.get(result.chunk.chunk_id)) for result in results], query_vector=query_vector, - config={"retriever": request.retriever, "top_k": request.top_k, "context_budget": request.context_budget}, + candidates=( + [_evidence(result, candidate_semantics) for result in candidates] + if request.reranker != "none" else None + ), + explanations=explanations, + config=run_config(request), catalog_check=catalog_check(question, results), )) @@ -685,7 +1287,7 @@ def ask(request: RunRequest): # never stored in a run, job, or response. if base_url and not api_key: api_key = "local-provider-no-key" - index_id, index, results, retrieve_trace, query_vector, semantics, components, question = run_retrieval(request) + index_id, index, results, retrieve_trace, query_vector, semantics, components, question, explanations, rerank_candidates, candidate_semantics = run_retrieval(request) query = retrieve_trace.query candidate_results = list(results) if request.context_budget: @@ -708,9 +1310,11 @@ def ask(request: RunRequest): logger.exception("Live generation failed for index %s", index_id) failed_trace = AskTrace( query=query, retriever=request.retriever, top_k=request.top_k, - chunks=[_chunk_trace(result) for result in results], prompt=prompt, + chunks=ask_chunk_traces(results, retrieve_trace), prompt=prompt, latency_by_stage={**retrieve_trace.latency_by_stage, "generate": time.perf_counter() - t0}, context_pack=packed, + reranker=retrieve_trace.reranker, + rerank_top_n=retrieve_trace.rerank_top_n, ) return save_run(build_lab_run( failed_trace, index_id=index_id, manifest=index.manifest, @@ -724,7 +1328,12 @@ def ask(request: RunRequest): for result in candidate_results ], query_vector=query_vector, - config={"retriever": request.retriever, "top_k": request.top_k, "context_budget": request.context_budget}, + candidates=( + [_evidence(result, candidate_semantics) for result in rerank_candidates] + if request.reranker != "none" else None + ), + explanations=explanations, + config=run_config(request), catalog_check=catalog_check(question, candidate_results), error="Live generation failed. Check your provider settings and try again.", )) @@ -735,10 +1344,12 @@ def ask(request: RunRequest): citations = [citation for citation in extract_source_citations(answer) if citation in available_citations] trace = AskTrace( query=query, retriever=request.retriever, top_k=request.top_k, - chunks=[_chunk_trace(result) for result in results], prompt=prompt, + chunks=ask_chunk_traces(results, retrieve_trace), prompt=prompt, answer=answer, citations=citations, latency_by_stage={**retrieve_trace.latency_by_stage, "generate": time.perf_counter() - t0}, context_pack=packed, + reranker=retrieve_trace.reranker, + rerank_top_n=retrieve_trace.rerank_top_n, ) return save_run(build_lab_run( trace, index_id=index_id, manifest=index.manifest, @@ -752,7 +1363,12 @@ def ask(request: RunRequest): for result in candidate_results ], query_vector=query_vector, - config={"retriever": request.retriever, "top_k": request.top_k, "context_budget": request.context_budget}, + candidates=( + [_evidence(result, candidate_semantics) for result in rerank_candidates] + if request.reranker != "none" else None + ), + explanations=explanations, + config=run_config(request), catalog_check=catalog_check(question, candidate_results), )) diff --git a/uv.lock b/uv.lock index c510283..60ab576 100644 --- a/uv.lock +++ b/uv.lock @@ -2336,7 +2336,7 @@ wheels = [ [[package]] name = "tiny-rag-lab" -version = "0.4.0" +version = "0.5.0" source = { editable = "." } dependencies = [ { name = "datasets" }, diff --git a/web/index.html b/web/index.html index f9f55b1..34772fb 100644 --- a/web/index.html +++ b/web/index.html @@ -3,6 +3,7 @@ + tiny-rag-lab diff --git a/web/package-lock.json b/web/package-lock.json index 5ab823d..a3ca568 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "tiny-rag-lab-web", - "version": "0.4.0", + "version": "0.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "tiny-rag-lab-web", - "version": "0.4.0", + "version": "0.5.0", "dependencies": { "@vitejs/plugin-react": "latest", "react": "latest", diff --git a/web/package.json b/web/package.json index 7526cc1..d180a31 100644 --- a/web/package.json +++ b/web/package.json @@ -1,7 +1,7 @@ { "name": "tiny-rag-lab-web", "private": true, - "version": "0.4.0", + "version": "0.5.0", "type": "module", "scripts": { "dev": "vite", diff --git a/web/public/favicon.svg b/web/public/favicon.svg new file mode 100644 index 0000000..f8bb27d --- /dev/null +++ b/web/public/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/web/src/components/BuildInspectView.tsx b/web/src/components/BuildInspectView.tsx index 9a20d7a..1bb1b19 100644 --- a/web/src/components/BuildInspectView.tsx +++ b/web/src/components/BuildInspectView.tsx @@ -59,7 +59,9 @@ function IndexInspection({ detail, t }: { detail: any; t: Copy }) {
{t.documents}
{detail.document_count ?? manifest.document_count ?? "—"}
{t.chunks}
{detail.chunk_count ?? manifest.chunk_count ?? detail.chunks?.length ?? "—"}
{t.embeddingModel}
{String(manifest.embedding_model || "—")}
+ {detail.capabilities &&
{t.payloadFilters}
{detail.capabilities.payload_filters ? t.filtersAvailable : t.filtersUnavailable}
} + {detail.capabilities && !detail.capabilities.payload_filters &&

{t.legacyFiltersUnavailable}

}

{t.chunks}

{(detail.chunks || []).slice(0, 8).map((chunk: any, index: number) =>
#{String(index + 1).padStart(2, "0")}{chunk.metadata?.title || chunk.doc_id}{t.source}: {chunk.doc_id}
)}
diff --git a/web/src/components/ExploreView.tsx b/web/src/components/ExploreView.tsx index 01f5985..25c4d0e 100644 --- a/web/src/components/ExploreView.tsx +++ b/web/src/components/ExploreView.tsx @@ -1,28 +1,33 @@ import { learningMaterialUrl, type Copy } from "../copy"; -import type { CatalogQuestion, Evidence, IndexItem, LabRun, Stage } from "../types"; +import type { CatalogQuestion, Evidence, IndexItem, LabRun, RetrievalMaterial, Stage } from "../types"; import { EvidenceCard } from "./EvidenceCard"; import { CitationList } from "./CitationList"; import { Pipeline } from "./Pipeline"; import { RawArtifact } from "./RawArtifact"; +import { RerankingResult } from "./RetrievalView"; import { VectorPreview } from "./BuildInspectView"; export function ExploreView({ - indexes, indexId, question, catalogQuestions, catalogQuestionId, retriever, topK, contextBudget, run, activeStage, lang, running, testingProvider, providerReady, onIndex, onQuestion, onCatalogQuestion, onRetriever, onTopK, onContextBudget, onStage, onRun, t, + indexes, indexId, question, catalogQuestions, catalogQuestionId, rerankingMaterials, retriever, topK, reranker, rerankTopN, rerankerReady, contextBudget, run, activeStage, lang, running, testingProvider, providerReady, onIndex, onQuestion, onCatalogQuestion, onRetriever, onTopK, onReranker, onRerankTopN, onContextBudget, onStage, onRun, t, }: { - indexes: IndexItem[]; indexId: string; question: string; catalogQuestions: CatalogQuestion[]; catalogQuestionId: string; retriever: "dense" | "bm25" | "hybrid"; topK: number; contextBudget: number; run: LabRun | null; activeStage: Stage; lang: "en" | "zh"; running: "retrieve" | "ask" | null; testingProvider: boolean; providerReady: boolean; - onIndex: (value: string) => void; onQuestion: (value: string) => void; onCatalogQuestion: (value: string) => void; onRetriever: (value: "dense" | "bm25" | "hybrid") => void; onTopK: (value: number) => void; onContextBudget: (value: number) => void; onStage: (value: Stage) => void; onRun: (kind: "retrieve" | "ask") => void; t: Copy; + indexes: IndexItem[]; indexId: string; question: string; catalogQuestions: CatalogQuestion[]; catalogQuestionId: string; rerankingMaterials: RetrievalMaterial[]; retriever: "dense" | "bm25" | "hybrid"; topK: number; reranker: "none" | "cross-encoder"; rerankTopN: number; rerankerReady: boolean | null; contextBudget: number; run: LabRun | null; activeStage: Stage; lang: "en" | "zh"; running: "retrieve" | "ask" | null; testingProvider: boolean; providerReady: boolean; + onIndex: (value: string) => void; onQuestion: (value: string) => void; onCatalogQuestion: (value: string) => void; onRetriever: (value: "dense" | "bm25" | "hybrid") => void; onTopK: (value: number) => void; onReranker: (value: "none" | "cross-encoder") => void; onRerankTopN: (value: number) => void; onContextBudget: (value: number) => void; onStage: (value: Stage) => void; onRun: (kind: "retrieve" | "ask") => void; t: Copy; }) { + const rerankBlocked = reranker === "cross-encoder" && (rerankerReady !== true || rerankTopN < topK); return
{t.areas.explore}

{t.areas.explore}

{t.exploreIntro}

+ + {reranker !== "none" && }
- {catalogQuestions.length > 0 && } - -
+ {reranker !== "cross-encoder" && catalogQuestions.length > 0 && } + + {rerankerReady === false &&

{t.rerankerDownloadRequired}

} +

{providerReady ? t.providerUnlocked : t.provider}

{run ?
{run.catalog_check && activeStage >= 3 &&
{t.goldCheck}: {run.catalog_check.hit ? t.hit : t.miss}
{t.expectedSources}
{run.catalog_check.expected_document_ids.join(", ") || "—"}
{t.retrievedSources}
{run.catalog_check.retrieved_document_ids.join(", ") || "—"}
}
:

{t.noIndex}

}
; @@ -36,10 +41,10 @@ function StageView({ run, activeStage, lang, t }: { run: LabRun; activeStage: St if (activeStage === 0) return <>
{t.documents}
{run.index.document_count ?? "—"}
{t.chunks}
{run.index.chunk_count ?? run.index.manifest?.chunk_count ?? "—"}
{t.backend}
{String(run.index.manifest?.index_backend || "numpy")}
{learningLink}; if (activeStage === 1) return <>{learningLink}; if (activeStage === 2) return

{t.vector}

{learningLink}
; - if (activeStage === 3) return <>{learningLink}; + if (activeStage === 3) return <>{run.explanations?.reranking && }{learningLink}; if (activeStage === 4) return <>{learningLink}; const abstained = typeof trace.answer === "string" && trace.answer.toLowerCase().includes("does not contain enough information"); - return
{run.error ?

{t.generationFailed}

{run.error}

: <>{trace.answer && (abstained ?
{t.abstention}

{t.noSupportedAnswer}

{t.abstained}

:

{t.answer}

{trace.answer}

)}{Array.isArray(trace.citations) && trace.citations.length > 0 && }}

{t.selectedEvidence}

{learningLink}
; + return
{run.error ?

{t.generationFailed}

{run.error}

: <>{trace.answer && (abstained ?
{t.abstention}

{t.noSupportedAnswer}

{t.abstained}

:

{t.answer}

{trace.answer}

)}{Array.isArray(trace.citations) && trace.citations.length > 0 && }}{run.explanations?.reranking &&

{t.generationRetrievalAudit}

{t.generationRetrievalAuditHint}

}

{t.selectedEvidence}

{learningLink}
; } function EvidenceList({ evidence, t, compact = false }: { evidence: Evidence[]; t: Copy; compact?: boolean }) { diff --git a/web/src/components/RetrievalView.tsx b/web/src/components/RetrievalView.tsx new file mode 100644 index 0000000..b95710b --- /dev/null +++ b/web/src/components/RetrievalView.tsx @@ -0,0 +1,375 @@ +import { useEffect, useRef, useState } from "react"; +import { learningMaterialUrl, type Copy } from "../copy"; +import type { Evidence, LabRun, Lang, RetrievalMaterial, RetrievalModule } from "../types"; +import { EvidenceCard } from "./EvidenceCard"; +import { RawArtifact } from "./RawArtifact"; + +const modules: RetrievalModule[] = ["lexical", "dense", "vector-db", "hybrid", "reranking", "evaluation"]; + +export function RetrievalView({ + module, materials, materialId, run, running, modelReady, rerankerReady, lang, onModule, onMaterial, onRun, t, +}: { + module: RetrievalModule; + materials: RetrievalMaterial[]; + materialId: string; + run: LabRun | null; + running: boolean; + modelReady: boolean | null; + rerankerReady: boolean | null; + lang: Lang; + onModule: (module: RetrievalModule) => void; + onMaterial: (id: string) => void; + onRun: () => void; + t: Copy; +}) { + const category = ["lexical", "dense", "hybrid", "reranking"].includes(module) + ? module as "lexical" | "dense" | "hybrid" | "reranking" + : null; + const choices = category ? materials.filter((item) => item.category === category) : []; + const selected = materials.find((item) => item.question_id === materialId); + const ready = module === "lexical" + || ((module === "dense" || module === "hybrid") && modelReady === true) + || (module === "reranking" && modelReady === true && rerankerReady === true); + const guidePage = module === "reranking" + ? "reranking.md" + : module === "evaluation" ? "evaluating-retrieval.md" : "retrieval-mechanics.md"; + + return
; +} + +type QdrantStatus = { + available: boolean; + prepared: boolean; + launch_command: string; + source_fingerprint: string; + collection: { alias: string; collection: string; point_count: number; dimension: number; reused: boolean; verified: boolean } | null; + filters: string[]; +}; + +type EvaluationConfig = { retriever: "bm25" | "dense" | "hybrid"; top_k: number; reranker: "none" | "cross-encoder"; rerank_top_n: number }; +type EvaluationPreset = { id: string; left: EvaluationConfig; right: EvaluationConfig }; +type EvaluationStatus = { ready: boolean; reason: string | null; question_count: number; source_vector_fingerprint?: string; presets: EvaluationPreset[] }; +type EvaluationJob = { id: string; status: string; progress: { current: number; total: number | null; message: string }; error?: string; left?: EvaluationConfig; right?: EvaluationConfig }; +type EvaluationQuestion = { question_id: string; question: string; category: string; gold_doc_ids: string[]; metrics: { hit: number; reciprocal_rank: number; context_precision: number; context_recall: number }; evidence: Evidence[] }; +type EvaluationSide = { config: EvaluationConfig; metrics: { n_questions: number; hit_rate: number; mrr: number; context_precision: number; context_recall: number }; questions: EvaluationQuestion[] }; +type EvaluationResult = { question_count: number; left: EvaluationSide; right: EvaluationSide; bundle: { index_id: string; source_vector_fingerprint: string } }; + +function EvaluationModule({ lang, t }: { lang: Lang; t: Copy }) { + const [status, setStatus] = useState(null); + const [presetId, setPresetId] = useState(""); + const [left, setLeft] = useState(null); + const [right, setRight] = useState(null); + const [job, setJob] = useState(null); + const [result, setResult] = useState(null); + const [questionId, setQuestionId] = useState(""); + const [error, setError] = useState(""); + const timer = useRef(null); + const mounted = useRef(true); + + const request = async (path: string, options?: RequestInit): Promise => { + const response = await fetch(`/api${path}`, options); + const body = await response.json().catch(() => ({})); + if (!response.ok) throw new Error(body.detail || body.error || response.statusText); + return body; + }; + const applyPreset = (preset: EvaluationPreset) => { + setPresetId(preset.id); setLeft({ ...preset.left }); setRight({ ...preset.right }); setResult(null); setQuestionId(""); setError(""); + }; + const loadResult = async (jobId: string) => { + const value = await request(`/jobs/${jobId}/result`); + if (!mounted.current) return; + setResult(value); setQuestionId(value.left.questions[0]?.question_id || ""); + }; + const poll = async (jobId: string) => { + try { + const value = await request(`/jobs/${jobId}`); + if (!mounted.current) return; + setJob(value); + if (value.status === "complete") await loadResult(jobId); + else if (["queued", "running", "cancel_requested", "publishing"].includes(value.status) && mounted.current) timer.current = window.setTimeout(() => void poll(jobId), 700); + } catch (reason: any) { if (mounted.current) setError(reason.message); } + }; + + useEffect(() => { + mounted.current = true; + let active = true; + const initialize = async () => { + try { + const value = await request("/evaluations/status"); + if (!active) return; + setStatus(value); + if (value.presets[0]) applyPreset(value.presets[0]); + const activeJobs = await request<{ items: EvaluationJob[] }>("/jobs/active?kind=evaluation"); + if (active && activeJobs.items[0]) { + const recovered = activeJobs.items[0]; + setJob(recovered); + if (recovered.left && recovered.right) { + setLeft({ ...recovered.left }); setRight({ ...recovered.right }); + const matching = value.presets.find((preset) => JSON.stringify(preset.left) === JSON.stringify(recovered.left) && JSON.stringify(preset.right) === JSON.stringify(recovered.right)); + setPresetId(matching?.id || ""); + } + void poll(recovered.id); + } + } catch (reason: any) { if (active) setError(reason.message); } + }; + void initialize(); + return () => { active = false; mounted.current = false; if (timer.current !== null) window.clearTimeout(timer.current); }; + }, []); + + const start = async () => { + if (!left || !right) return; + setError(""); setResult(null); setQuestionId(""); + try { + const value = await request<{ id: string; status: string }>("/evaluations", { + method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ left, right }), + }); + const next = { id: value.id, status: value.status, progress: { current: 0, total: status?.question_count || 16, message: lang === "en" ? "Queued" : "已排队" } }; + setJob(next); void poll(value.id); + } catch (reason: any) { setError(reason.message); } + }; + const cancel = async () => { + if (!job) return; + try { setJob(await request(`/jobs/${job.id}/cancel`, { method: "POST" })); } + catch (reason: any) { setError(reason.message); } + }; + const busy = !!job && ["queued", "running", "cancel_requested", "publishing"].includes(job.status); + const selectedLeft = result?.left.questions.find((item) => item.question_id === questionId); + const selectedRight = result?.right.questions.find((item) => item.question_id === questionId); + + if (!status) return

{error || (lang === "en" ? "Checking the reviewed evaluation bundle…" : "正在检查评审过的评估包……")}

; + if (!status.ready) return

{status.reason}

; + return
+
{lang === "en" ? "Compare retrieval choices over the same fixed index and 16 reviewed questions. Each metric answers a different question; there is no composite winner." : "在同一个固定索引和 16 个评审问题上比较检索选择。每项指标回答不同问题,这里不会给出综合赢家。"}
+
{t.index}
cloudflare-state-structural-v1
{lang === "en" ? "Reviewed set" : "评审题集"}
{status.question_count} {lang === "en" ? "questions" : "个问题"}
{t.sourceIdentity}
{status.source_vector_fingerprint?.slice(0, 16)}…
+
{status.question_count} {lang === "en" ? "reviewed questions" : "个评审问题"}
+ {left && right &&
} +
{busy && }
+ {job &&
+
{job.progress.total && {lang === "en" ? `${job.progress.current} of ${job.progress.total} questions` : `${job.progress.current} / ${job.progress.total} 个问题`}}
+

{job.error || jobProgressLabel(job, lang)}

+ {job.progress.total &&
} +
} + {error &&

{error}

} + {result && } +
; +} + +function EvaluationConfigEditor({ label, value, disabled, onChange, lang, t }: { label: string; value: EvaluationConfig; disabled: boolean; onChange: (value: EvaluationConfig) => void; lang: Lang; t: Copy }) { + const field = (key: K, next: EvaluationConfig[K]) => onChange({ ...value, [key]: next }); + const topK = (next: number) => onChange({ ...value, top_k: next, rerank_top_n: Math.max(next, value.rerank_top_n) }); + return
{label}
; +} + +function EvaluationResults({ result, questionId, onQuestion, leftQuestion, rightQuestion, lang, t }: { result: EvaluationResult; questionId: string; onQuestion: (id: string) => void; leftQuestion?: EvaluationQuestion; rightQuestion?: EvaluationQuestion; lang: Lang; t: Copy }) { + const metrics = [{ key: "hit_rate", label: lang === "en" ? "Hit rate" : "命中率" }, { key: "mrr", label: "MRR" }, { key: "context_precision", label: lang === "en" ? "Context precision" : "上下文精确率" }, { key: "context_recall", label: lang === "en" ? "Context recall" : "上下文召回率" }] as const; + return

{lang === "en" ? "Aggregate results" : "汇总结果"}

{metrics.map(({ key, label }) =>
{label}A {format(result.left.metrics[key])}B {format(result.right.metrics[key])}Δ {format(result.right.metrics[key] - result.left.metrics[key])}
)}

{lang === "en" ? "A delta is B minus A. Inspect the questions below before interpreting an aggregate change." : "差值为 B 减 A。解读汇总变化前,请先检查下方的逐题结果。"}

{leftQuestion && rightQuestion && <>
{categoryLabel(leftQuestion.category, lang)}

{leftQuestion.question}

{lang === "en" ? "Gold documents" : "标准文档"}: {leftQuestion.gold_doc_ids.join(", ")}

}
; +} + +function EvaluationQuestionSide({ label, item, lang, t }: { label: string; item: EvaluationQuestion; lang: Lang; t: Copy }) { + return

{label}

{item.metrics.hit ? (lang === "en" ? "Hit" : "命中") : (lang === "en" ? "Miss" : "未命中")}RR {format(item.metrics.reciprocal_rank)}P {format(item.metrics.context_precision)}R {format(item.metrics.context_recall)}
{item.evidence.map((evidence) => )}
; +} + +function presetLabel(id: string, lang: Lang) { + const labels: Record = { "bm25-vs-dense": ["BM25 vs Dense", "BM25 对比语义检索"], "dense-vs-hybrid": ["Dense vs Hybrid", "语义检索对比混合检索"], "hybrid-vs-reranked": ["Hybrid vs Hybrid + cross-encoder", "混合检索对比混合检索 + 交叉编码器"] }; + return labels[id]?.[lang === "en" ? 0 : 1] || id; +} + +function jobStatusLabel(status: string, lang: Lang) { + const labels: Record = { queued: ["Queued", "已排队"], running: ["Running", "运行中"], cancel_requested: ["Stopping", "正在停止"], publishing: ["Publishing", "正在发布"], complete: ["Complete", "已完成"], failed: ["Failed", "失败"], cancelled: ["Cancelled", "已取消"] }; + return labels[status]?.[lang === "en" ? 0 : 1] || status; +} + +function jobProgressLabel(job: EvaluationJob, lang: Lang) { + if (lang === "en") return job.progress.message; + if (job.status === "queued") return "等待本地评估开始"; + if (job.status === "cancel_requested") return "将在当前模型或检索操作返回后停止"; + if (job.status === "publishing") return "正在原子发布比较结果"; + if (job.status === "complete") return "比较已完成"; + if (job.status === "cancelled") return "比较已取消,未发布结果"; + return `已比较 ${job.progress.current} / ${job.progress.total || 16} 个问题`; +} + +function categoryLabel(category: string, lang: Lang) { + if (lang === "en") return category; + return ({ lexical: "词法检索", dense: "语义检索", hybrid: "混合检索", reranking: "重排" } as Record)[category] || category; +} +type VectorDbHit = Evidence & { payload?: Record | null }; +type QdrantComparison = { + question: string; + numpy: VectorDbHit[]; + qdrant: VectorDbHit[]; + parity: { equivalent: boolean; score_tolerance: number; items: Array<{ chunk_id: string; numpy_rank: number | null; qdrant_rank: number | null; equivalent: boolean }> }; + source_group: string | null; + filtered_qdrant: VectorDbHit[]; +}; + +function QdrantModule({ materials, lang, t }: { materials: RetrievalMaterial[]; lang: Lang; t: Copy }) { + const questions = materials.filter((item) => item.category === "dense"); + const [status, setStatus] = useState(null); + const [materialId, setMaterialId] = useState(questions[0]?.question_id || ""); + const [sourceGroup, setSourceGroup] = useState(""); + const [comparison, setComparison] = useState(null); + const [busy, setBusy] = useState<"prepare" | "compare" | null>(null); + const [error, setError] = useState(""); + + const request = async (path: string, options?: RequestInit): Promise => { + const response = await fetch(`/api${path}`, options); + const body = await response.json().catch(() => ({})); + if (!response.ok) throw new Error(body.detail || body.error || response.statusText); + return body; + }; + const refresh = async () => setStatus(await request("/retrieval/qdrant/status")); + useEffect(() => { void refresh().catch((reason: Error) => setError(reason.message)); }, []); + useEffect(() => { if (!materialId && questions[0]) setMaterialId(questions[0].question_id); }, [materialId, questions]); + + const prepare = async () => { + setBusy("prepare"); setError(""); + try { await request("/retrieval/qdrant/prepare", { method: "POST" }); await refresh(); } + catch (reason: any) { setError(reason.message); } + finally { setBusy(null); } + }; + const compare = async () => { + setBusy("compare"); setError(""); + try { + setComparison(await request("/retrieval/qdrant/compare", { + method: "POST", headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ retrieval_material_id: materialId, top_k: 5, source_group: sourceGroup || null }), + })); + } catch (reason: any) { setError(reason.message); } + finally { setBusy(null); } + }; + + if (!status) return

{error || t.vectorDbChecking}

; + return
+
01NumPy

{t.numpyRole}

02Qdrant

{t.qdrantRole}

+

{t.sameRetrievalFlowTitle}{t.sameRetrievalFlow}

+ {!status.available ?

{t.qdrantNotRunning}

{t.qdrantOptional}

{status.launch_command}
: !status.prepared ?

{t.qdrantReadyToPrepare}

{t.qdrantCopyExact}

: <> +
{t.vectorPointCount}
{status.collection?.point_count ?? "—"} {t.vectorPoints}
{t.vectorDimension}
{status.collection?.dimension ?? "—"}D
{t.backend}
Qdrant · exact
{t.sourceIdentity}
{status.source_fingerprint.slice(0, 16)}…
+

{t.qdrantPreparedState}

+
+ {comparison && } + } + {error &&

{error}

} +
; +} + +function VectorDbComparison({ comparison, t }: { comparison: QdrantComparison; t: Copy }) { + return
+
{comparison.parity.equivalent ? t.parityMatch : t.parityMismatch}{t.parityTolerance} {comparison.parity.score_tolerance}
+
+ {comparison.source_group &&

{t.filteredResults}: {comparison.source_group}

{t.filterSeparate}

} +
; +} + +function VectorResultList({ title, description, items, t, showPayload = false }: { title: string; description?: string; items: VectorDbHit[]; t: Copy; showPayload?: boolean }) { + return

{title}

{description &&

{description}

}{items.map((item) =>
#{item.rank}
{item.title || item.doc_id}{item.path}{item.chunk_id}
{format(item.score)}{showPayload && item.payload && }
)}
; +} + +function RetrievalResult({ module, run, lang, t }: { module: "lexical" | "dense" | "hybrid" | "reranking"; run: LabRun; lang: Lang; t: Copy }) { + const explanation = run.explanations || {}; + return
+

{t.exactArtifacts}

+ {module === "lexical" ? + : module === "dense" ? + : module === "hybrid" ? + : } + +
; +} + +function HybridResult({ run, explanation, t }: { run: LabRun; explanation: any; t: Copy }) { + if (!explanation) return null; + const evidence = new Map(run.evidence.map((item) => [item.chunk_id, item])); + const sourceList = (title: string, items: any[]) =>

{title}

    {items.map((item) =>
  1. #{item.rank}{item.chunk_id}{format(item.score)}
  2. )}
; + return <> +
RRF{t.rrfFormula.replace("{k}", String(explanation.rrf_k))} {t.rrfMissingSource}
+
{sourceList(t.denseRanking, explanation.dense)}{sourceList(t.lexicalRanking, explanation.bm25)}
+

{t.fusedRanking}

{explanation.candidates.map((candidate: any) => { + const sourceByName = new Map(candidate.sources.map((source: any) => [source.source, source])); + return
#{candidate.rank}
{evidence.get(candidate.chunk_id)?.title || evidence.get(candidate.chunk_id)?.doc_id || candidate.chunk_id}{candidate.chunk_id}
{format(candidate.score)}
{(["dense", "bm25"] as const).map((sourceName) => { + const source: any = sourceByName.get(sourceName); + return source ? {sourceName === "dense" ? t.denseRanking : t.lexicalRanking}#{source.rank} · 1 / ({explanation.rrf_k} + {source.rank})+{format(source.contribution)} : {sourceName === "dense" ? t.denseRanking : t.lexicalRanking}{t.notInSourceRanking}+0; + })}
; + })}
+ ; +} + +export function RerankingResult({ run, lang, t, compact = false }: { run: LabRun; lang: Lang; t: Copy; compact?: boolean }) { + const explanation = run.explanations?.reranking; + if (!explanation) return null; + const candidates = new Map((run.candidates || []).map((item) => [item.chunk_id, item])); + return
+
{explanation.candidate_count} {t.firstStageCandidates}{explanation.final_top_k} {t.finalEvidence}
+
+ {t.areas.retrieval} +

{lang === "en" ? "How retrieval decides" : "检索如何作出选择"}

+

{t.retrievalIntro}

+ +
    + {modules.map((id, index) =>
  1. + +
  2. )} +
+ +
+
{t.retrievalModules[module].title}

{t.retrievalModules[module].description}

+ {module === "vector-db" ? : module === "evaluation" ? : category ? <> + {choices.length > 0 ?
+ + +
:

{t.courseUnavailable}

} + {module !== "lexical" && modelReady === false &&

{t.modelDownloadRequired}

} + {module === "reranking" && rerankerReady === false &&

{t.rerankerDownloadRequired}

} + {selected?.teaching_note &&
{selected.teaching_note[lang]}
} + {selected &&
{t.reviewedSources}{selected.gold_doc_ids.join(", ")}
} + {run && category && } + :

{t.moduleComing}

} +
+
{t.learn} +
{explanation.candidates.map((item: any) => { const candidate = candidates.get(item.chunk_id); return ; })}
{t.candidateToFinal}
{t.candidate}{t.firstRank}{t.firstScore}{t.rerankerScore}{t.finalRank}{t.movement}
{candidate?.title || candidate?.doc_id || item.chunk_id}{item.chunk_id}#{item.pre_rank}{format(item.pre_score)}{format(item.reranker_score)}{item.final_rank ? `#${item.final_rank}` : "—"}{t.rerankOutcomes[item.outcome as keyof typeof t.rerankOutcomes]}{item.rank_delta ? ` · ${item.rank_delta > 0 ? "+" : ""}${item.rank_delta}` : ""}
+ {!compact &&

{lang === "en" ? "Dropped candidates remain visible here for audit, but they do not enter the final context." : "被丢弃的候选仍保留在这里供检查,但不会进入最终上下文。"}

} + ; +} + +function LexicalResult({ run, explanation, t }: { run: LabRun; explanation: any; t: Copy }) { + if (!explanation) return null; + return <> +

{t.questionTokens}

{explanation.query_tokens.map((token: string, index: number) => {token})}

BM25 · k1={format(explanation.k1)} · b={format(explanation.b)} · N={explanation.corpus_size}

{t.bm25Meaning}

{t.bm25Formula}
+
{run.evidence.map((evidence) => { + const candidate = explanation.candidates.find((item: any) => item.chunk_id === evidence.chunk_id); + return
+ + {candidate &&

{t.termContributions}

{t.bm25Columns.documentLength}{candidate.document_length}{t.bm25Columns.averageDocumentLength}{format(candidate.average_document_length)}{t.score}{format(candidate.score)}
{candidate.terms.map((term: any) => )}
{t.termContributions}
{t.bm25Columns.term}{t.bm25Columns.queryCount}{t.bm25Columns.termFrequency}{t.bm25Columns.documentFrequency}{t.bm25Columns.inverseDocumentFrequency}{t.bm25Columns.contribution}
{term.term}{term.query_frequency}{term.term_frequency}{term.document_frequency}{format(term.inverse_document_frequency)}{format(term.contribution)}
} +
; + })}
+ ; +} + +function DenseResult({ run, explanation, t }: { run: LabRun; explanation: any; t: Copy }) { + if (!explanation) return null; + return
{run.evidence.map((evidence) => { + const candidate = explanation.candidates.find((item: any) => item.chunk_id === evidence.chunk_id); + return
+ + {candidate &&

{t.vectorMath}

{t.queryNorm}{format(candidate.query_norm)}{t.chunkNorm}{format(candidate.chunk_norm)}{t.dotProduct}{format(candidate.dot_product)}{t.cosine}{format(candidate.cosine_similarity)}

{t.vectorReadingGuide}

} +
; + })}
; +} + +function SignedVector({ values, label }: { values: number[]; label: string }) { + const maximum = Math.max(...values.map((value) => Math.abs(value)), 0.000001); + const chartStyle = { "--component-count": Math.max(values.length, 1) } as React.CSSProperties; + return
{label}
{values.map((value, index) => {formatSigned(value)})}
; +} + +function format(value: number) { + return Number(value).toFixed(4).replace(/0+$/, "").replace(/\.$/, ""); +} + +function formatSigned(value: number) { + return value > 0 ? `+${format(value)}` : format(value); +} diff --git a/web/src/components/SettingsView.tsx b/web/src/components/SettingsView.tsx index 95554e5..3ed21af 100644 --- a/web/src/components/SettingsView.tsx +++ b/web/src/components/SettingsView.tsx @@ -1,11 +1,17 @@ import type { Copy } from "../copy"; -export function SettingsView({ modelReady, downloadingModel, providerUrl, providerModel, providerKey, providerReady, testing, generating, onDownload, onTest, onProviderUrl, onProviderModel, onProviderKey, t }: { - modelReady: boolean | null; downloadingModel: boolean; providerUrl: string; providerModel: string; providerKey: string; providerReady: boolean; testing: boolean; generating: boolean; onDownload: () => void; onTest: () => void; onProviderUrl: (value: string) => void; onProviderModel: (value: string) => void; onProviderKey: (value: string) => void; t: Copy; +export function SettingsView({ modelReady, downloadingModel, rerankerReady, downloadingReranker, providerUrl, providerModel, providerKey, providerReady, testing, generating, onDownload, onDownloadReranker, onTest, onProviderUrl, onProviderModel, onProviderKey, t }: { + modelReady: boolean | null; downloadingModel: boolean; rerankerReady: boolean | null; downloadingReranker: boolean; providerUrl: string; providerModel: string; providerKey: string; providerReady: boolean; testing: boolean; generating: boolean; onDownload: () => void; onDownloadReranker: () => void; onTest: () => void; onProviderUrl: (value: string) => void; onProviderModel: (value: string) => void; onProviderKey: (value: string) => void; t: Copy; }) { const providerControlsLocked = testing || generating; + const modelDownloadLocked = downloadingModel || downloadingReranker; return
{t.areas.settings}

{t.areas.settings}

{t.settingsIntro}

-

{t.embeddingSettings}

{modelReady ? <>all-MiniLM-L6-v2 · 384 dimensions · ready locally : downloadingModel ? t.modelDownloadInProgress : t.modelMissing}

{!modelReady && }
+
+

{t.cpuModelRuntime}

{t.providerSettings}

{!providerReady &&

{t.provider}

}

{t.providerTestHint}

; } + +function ModelSetting({ title, role, model, revision, ready, downloading, locked, readyText, missingText, downloadText, downloadingText, revisionLabel, onDownload }: { title: string; role: string; model: string; revision: string; ready: boolean | null; downloading: boolean; locked: boolean; readyText: string; missingText: string; downloadText: string; downloadingText: string; revisionLabel: string; onDownload: () => void }) { + return

{title}

{role}

{model}{revisionLabel}: {revision.slice(0, 12)}…

{ready ? readyText : downloading ? downloadingText : missingText}

{!ready && }
; +} diff --git a/web/src/copy.ts b/web/src/copy.ts index 2ed808e..db169f1 100644 --- a/web/src/copy.ts +++ b/web/src/copy.ts @@ -4,7 +4,22 @@ export const copy = { en: { title: "tiny-rag-lab", subtitle: "See classic RAG, step by step.", - areas: { home: "Home", learn: "Learn", build: "Build & Inspect", explore: "Explore", failure: "Failure Lab", settings: "Settings" } satisfies Record, + areas: { home: "Home", learn: "Learn", retrieval: "Retrieval", build: "Build & Inspect", explore: "Explore", failure: "Failure Lab", settings: "Settings" } satisfies Record, + retrievalIntro: "Follow a live retrieval result from words to vectors, fusion, reranking, and evaluation. No LLM provider is needed.", + retrievalModules: { + lexical: { title: "Lexical", description: "Which query terms earned this BM25 score?" }, + dense: { title: "Dense", description: "How do vectors become cosine similarity?" }, + "vector-db": { title: "Vector database", description: "Move the same vectors from NumPy to Qdrant." }, + hybrid: { title: "Hybrid", description: "Combine lexical and semantic ranks with RRF." }, + reranking: { title: "Reranking", description: "Reorder a broad candidate pool for final relevance." }, + evaluation: { title: "Evaluation", description: "Compare two retrieval configurations over 16 questions." }, + }, + curatedQuestion: "Reviewed question", reviewedSources: "Reviewed source documents", runLesson: "Run live retrieval", runningLesson: "Retrieving and explaining…", questionTokens: "Query tokens", termContributions: "BM25 term contributions", vectorMath: "Cosine calculation", vectorReadingGuide: "Read from the zero line: blue positive values extend upward, coral negative values extend downward, and length shows magnitude within this vector preview.", candidateVector: "Chunk vector", queryNorm: "Query norm", chunkNorm: "Chunk norm", dotProduct: "Dot product", cosine: "Cosine similarity", formula: "Calculation", courseUnavailable: "The reviewed retrieval materials are not installed yet.", moduleComing: "This live module is implemented in the next task of the active milestone.", exactArtifacts: "The values below are returned by the same engine calculation that produced the rank.", + bm25Meaning: "BM25 adds each query term’s contribution. A term matters more when it appears in this chunk but is uncommon across the corpus; length normalization prevents long chunks from winning only because they contain more words.", + bm25Formula: "score = Σ query count × IDF × tf(k1 + 1) / (tf + k1(1 − b + b × dl / avgdl))", + bm25Columns: { term: "Query term", queryCount: "Query count", termFrequency: "Frequency in chunk", documentFrequency: "Chunks containing term", inverseDocumentFrequency: "Inverse document frequency", contribution: "Score contribution", documentLength: "Chunk length", averageDocumentLength: "Average chunk length" }, + rrfFormula: "Each source contributes 1 / ({k} + rank). The fused score is their sum.", rrfMissingSource: "If a chunk is outside one source’s candidate list, that source contributes 0.", notInSourceRanking: "Outside this source’s candidate list", denseRanking: "Dense ranking", lexicalRanking: "BM25 ranking", fusedRanking: "Fused ranking", firstStageCandidates: "first-stage candidates", finalEvidence: "final results", candidateToFinal: "Candidate-to-final ordering", candidate: "Candidate", firstRank: "First-stage rank", firstScore: "First-stage score", rerankerScore: "Cross-encoder score", finalRank: "Final rank", movement: "Movement", rerankOutcomes: { moved_up: "Moved up", moved_down: "Moved down", stayed: "Stayed", dropped: "Dropped" }, + vectorDbChecking: "Checking the optional local Qdrant service…", numpyRole: "The inspectable source of chunks and vectors.", qdrantRole: "An operational index for the same vectors, payloads, and filters.", sameRetrievalFlowTitle: "The retrieval flow does not change. ", sameRetrievalFlow: "The query is embedded once, searched against the same vectors, ranked by cosine similarity, and returned as evidence. Only vector storage and lookup move behind a different backend.", numpyMetadataSource: "NumPy has no database payload object. Its equivalent path, title, and chunk metadata come from the local chunk records.", qdrantPayloadSource: "Qdrant stores the same learner-facing metadata beside each vector as a database payload.", qdrantNotRunning: "Qdrant is not running", qdrantOptional: "The rest of the Retrieval course still works. Start the optional service when you want to compare index backends.", qdrantReadyToPrepare: "Qdrant is ready", qdrantCopyExact: "Prepare a verified collection by copying the bundled chunks and vectors—without re-chunking or re-embedding.", qdrantPrepare: "Prepare teaching collection", qdrantPreparing: "Copying and verifying vectors…", qdrantPreparedState: "The prepared collection is verified and reusable. Run the check again to see the idempotent reuse path.", qdrantVerifyAgain: "Verify prepared collection again", vectorPointCount: "Vector points", vectorDimension: "Vector dimension", vectorPoints: "points", payloadFilter: "Payload filter", payloadFilters: "Payload filters", filtersAvailable: "Available", filtersUnavailable: "Unavailable", legacyFiltersUnavailable: "This older Qdrant index remains searchable, but its minimal payload does not support source-group filters.", noFilter: "No filter · parity experiment", compareBackends: "Compare exact search", comparing: "Comparing…", parityMatch: "Exact-search parity verified", parityMismatch: "The backend rankings differ", parityTolerance: "Score tolerance:", filteredResults: "Separate filter demonstration", filterSeparate: "Filtering changes the candidate set, so this result is not labeled as NumPy/Qdrant parity.", storedPayload: "Inspect stored payload", buildViews: { build: "Build index", inspect: "Inspect index" }, upload: "Add Markdown or text files", build: "Build index", question: "Ask a question", retrieve: "Retrieve", retrieving: "Retrieving…", ask: "Live ask", testing: "Testing connection…", generating: "Generating answer…", testConnection: "Test connection", noIndex: "Choose an index to begin exploring.", @@ -19,12 +34,12 @@ export const copy = { "Read the answer with its cited sources, then match each citation to the evidence below.", ], evidence: "Evidence", prompt: "Grounded prompt", answer: "Answer", vectors: "Vector preview", manifest: "Index manifest", - provider: "Live ask needs an OpenAI-compatible provider configured for this local lab.", providerTestHint: "Verifies this provider before it is used for Live ask.", providerUnlocked: "Live ask is unlocked by your verified provider connection.", generationFailed: "Live generation failed. Check provider settings and try again.", selectedEvidence: "Selected context evidence", abstention: "Grounded abstention", noSupportedAnswer: "No supported answer in this corpus", abstained: "This question is outside the selected corpus’s coverage. The model found no support in its context, so it declined to invent an answer.", showFull: "Show full text", scenarioQuestion: "Question", + provider: "Live ask needs an OpenAI-compatible provider configured for this local lab.", providerTestHint: "Verifies this provider before it is used for Live ask.", providerUnlocked: "Live ask is unlocked by your verified provider connection.", generationFailed: "Live generation failed. Check provider settings and try again.", selectedEvidence: "Selected context evidence", generationRetrievalAudit: "Retrieval path used for generation", generationRetrievalAuditHint: "This candidate-to-final audit produced the evidence below. Only the selected evidence is packed into the generation prompt.", rerankingQuestionHint: "Choose a reviewed reranking example from the suggestions, or type your own question.", abstention: "Grounded abstention", noSupportedAnswer: "No supported answer in this corpus", abstained: "This question is outside the selected corpus’s coverage. The model found no support in its context, so it declined to invent an answer.", showFull: "Show full text", scenarioQuestion: "Question", quick: "Follow one complete, recorded RAG lesson first. Then use Explore to run your own retrievals over the same real corpus.", replay: "Start guided lesson", watson: "Download watsonxDocsQA", backend: "Vector index backend", index: "Index", providerUrl: "Provider API URL", providerModel: "Model", providerKey: "API key (this session only)", - modelReady: "Default embedding model is ready: all-MiniLM-L6-v2 (384 dimensions)", modelMissing: "Download the default embedding model before building an index", modelDownloadRequired: "Dense and Hybrid retrieval need the default embedding model. Open Settings, download it, then retry.", modelDownloading: "Downloading default embedding model…", modelDownloadInProgress: "Download in progress. This page will update when the model is ready.", downloadModel: "Download default embedding model", - retriever: "Retriever", topK: "Top-k", contextBudget: "Context budget (0 = unlimited)", + modelReady: "Ready locally · 384 dimensions", modelMissing: "Not available locally. Download it to build indexes and run Dense or Hybrid retrieval.", modelDownloadRequired: "Dense and Hybrid retrieval need the default embedding model. Open Settings, download it, then retry.", modelDownloading: "Downloading embedding model…", modelDownloadInProgress: "Download in progress. This page will update when the model is ready.", downloadModel: "Download embedding model", rerankerSettings: "Pinned reranker model", rerankerReady: "Ready locally · cross-encoder reranking is available", rerankerMissing: "Not available locally. Download it to inspect or use cross-encoder reranking.", rerankerDownloading: "Downloading reranker model…", downloadReranker: "Download reranker model", pinnedRevision: "Pinned revision", + retriever: "Retriever", topK: "Final top-k", reranker: "Reranker", noReranker: "None", crossEncoder: "Cross-encoder", candidateDepth: "Candidate depth", rerankerDownloadRequired: "Cross-encoder reranking needs the pinned local reranker model. Its download control is provided in Settings.", contextBudget: "Context budget (0 = unlimited)", selected: "Selected for context", omitted: "Not selected for context", vector: "Query vector", timings: "Stage timings", baseline: "Baseline", intervention: "Intervention", learn: "Read the learning guide", raw: "Inspect raw artifact", source: "Source", score: "Score", chunkReference: "Chunk ID", citationReference: "Source reference", scoreDetails: "Score details", citations: "Sources cited in the answer", indexFacts: "Index facts", chunks: "Chunks", documents: "Documents", embeddingModel: "Embedding model", @@ -32,12 +47,12 @@ export const copy = { inspectIntro: "Review the saved index facts, chunks, and a numeric vector preview without leaving the lab.", exploreIntro: "Run retrieval or a live grounded answer, then follow the same artifacts through each pipeline stage.", failureIntro: "Compare a known failure with an intervention using the project’s curated trace artifacts.", - settingsIntro: "Check the bundled local embedding model and configure an optional OpenAI-compatible provider.", + settingsIntro: "Check the two pinned local retrieval models and configure an optional OpenAI-compatible provider.", replayDetail: "Recorded offline lesson · no model download or provider required.", buildPath: "Build a small index", buildPathDetail: "Upload a small corpus, inspect its chunks, then ask your own question.", rawVector: "First 8 dimensions only — these values are a numeric preview, not human-readable concepts.", bundledCorpus: "Use a bundled corpus", customCorpus: "Bring a small corpus", chooseUploadedCorpus: "Choose an uploaded corpus", noUploadedCorpus: "No uploaded corpus yet", or: "or", - qdrantReady: "Qdrant — ready", qdrantUnavailable: "Qdrant — unavailable", qdrantUnavailableHint: "Start the optional Qdrant service to use this backend.", embeddingSettings: "Bundled embedding model", providerSettings: "OpenAI-compatible provider", runConfiguration: "Run configuration", + qdrantReady: "Qdrant — ready", qdrantUnavailable: "Qdrant — unavailable", qdrantUnavailableHint: "Start the optional Qdrant service to use this backend.", embeddingSettings: "Pinned embedding model", embeddingModelRole: "Required for Dense and Hybrid retrieval, query vectors, and vector index building.", rerankerModelRole: "Additionally required only when cross-encoder reranking is selected.", cpuModelRuntime: "Both models run locally on CPU. No GPU, CUDA, or NVIDIA runtime is required.", providerSettings: "OpenAI-compatible provider", runConfiguration: "Run configuration", corpusAdded: "Corpus added.", indexing: "Indexing locally…", indexReady: "Index ready.", watsonStatus: "watsonxDocsQA", myCorpus: "My corpus", retrieverOptions: { dense: "Dense", bm25: "BM25", hybrid: "Hybrid (RRF)" }, learnIntro: "Follow a saved lesson over pinned technical documentation. Each step exposes the actual artifact the RAG system used.", lesson: "Guided lesson", recorded: "Saved teaching result — no live model call", continueLesson: "Continue", loadingLesson: "Loading lesson…", expectedSources: "Expected", retrievedSources: "Retrieved", catalogQuestion: "Catalog question", freeQuestion: "Free question", goldCheck: "Gold-source check", hit: "A gold source was retrieved", miss: "No gold source was retrieved", sourceIdentity: "Pinned source identity", @@ -45,7 +60,22 @@ export const copy = { zh: { title: "tiny-rag-lab", subtitle: "循序看见经典 RAG 如何工作。", - areas: { home: "主页", learn: "学习", build: "构建与检查", explore: "探索", failure: "失败实验室", settings: "设置" } satisfies Record, + areas: { home: "主页", learn: "学习", retrieval: "检索", build: "构建与检查", explore: "探索", failure: "失败实验室", settings: "设置" } satisfies Record, + retrievalIntro: "沿着一次实时检索,从词语、向量、融合、重排一路走到评估;无需配置大语言模型服务。", + retrievalModules: { + lexical: { title: "词法检索", description: "哪些查询词贡献了这个 BM25 分数?" }, + dense: { title: "语义检索", description: "向量如何得到余弦相似度?" }, + "vector-db": { title: "向量数据库", description: "把同一批向量从 NumPy 移到 Qdrant。" }, + hybrid: { title: "混合检索", description: "使用 RRF 融合词法和语义排名。" }, + reranking: { title: "重排", description: "把较大的候选集重新排序为最终相关结果。" }, + evaluation: { title: "评估", description: "用 16 个问题比较两种检索配置。" }, + }, + curatedQuestion: "评审过的问题", reviewedSources: "评审过的标准来源文档", runLesson: "运行实时检索", runningLesson: "正在检索并解释…", questionTokens: "查询词元", termContributions: "BM25 词项贡献", vectorMath: "余弦计算", vectorReadingGuide: "从零线开始读图:蓝色正值向上延伸,珊瑚色负值向下延伸;长度表示该数值在当前向量预览中的相对幅度。", candidateVector: "分块向量", queryNorm: "查询向量范数", chunkNorm: "分块向量范数", dotProduct: "点积", cosine: "余弦相似度", formula: "计算过程", courseUnavailable: "评审过的检索课程材料尚未安装。", moduleComing: "这个实时模块将在当前里程碑的下一个任务中实现。", exactArtifacts: "以下数值来自实际产生本次排名的同一套引擎计算。", + bm25Meaning: "BM25 会把每个查询词项的贡献相加。某个词既出现在当前分块、又在整个语料中较少见时,它更重要;长度归一化则避免长分块仅仅因为词更多就胜出。", + bm25Formula: "分数 = Σ 查询次数 × IDF × tf(k1 + 1) / (tf + k1(1 − b + b × dl / avgdl))", + bm25Columns: { term: "查询词项", queryCount: "查询中出现次数", termFrequency: "分块内出现次数", documentFrequency: "包含该词的分块数", inverseDocumentFrequency: "逆文档频率", contribution: "分数贡献", documentLength: "分块长度", averageDocumentLength: "平均分块长度" }, + rrfFormula: "每个来源贡献 1 / ({k} + 排名),融合分数是所有贡献之和。", rrfMissingSource: "若分块不在某个来源的候选列表中,该来源贡献为 0。", notInSourceRanking: "不在此来源的候选列表中", denseRanking: "语义检索排名", lexicalRanking: "BM25 排名", fusedRanking: "融合后排名", firstStageCandidates: "个第一阶段候选", finalEvidence: "个最终结果", candidateToFinal: "候选到最终结果的排序变化", candidate: "候选", firstRank: "第一阶段排名", firstScore: "第一阶段分数", rerankerScore: "交叉编码器分数", finalRank: "最终排名", movement: "变化", rerankOutcomes: { moved_up: "上升", moved_down: "下降", stayed: "不变", dropped: "丢弃" }, + vectorDbChecking: "正在检查可选的本地 Qdrant 服务……", numpyRole: "可直接检查的分块和向量来源。", qdrantRole: "为同一批向量提供工程化索引、载荷与过滤。", sameRetrievalFlowTitle: "检索流程不会改变。", sameRetrievalFlow: "查询只嵌入一次,再对同一批向量执行搜索,按余弦相似度排序并返回为证据;只有向量的存储和查找交给了不同后端。", numpyMetadataSource: "NumPy 没有数据库载荷对象;等价的路径、标题和分块元数据来自本地分块记录。", qdrantPayloadSource: "Qdrant 把同样的学习用元数据作为数据库载荷,和每个向量存放在一起。", qdrantNotRunning: "Qdrant 尚未运行", qdrantOptional: "检索课程的其他内容仍可使用。需要比较索引后端时,再启动可选服务。", qdrantReadyToPrepare: "Qdrant 已就绪", qdrantCopyExact: "复制随附索引中的分块和向量,完成验证后建立课程集合;不会重新分块或重新嵌入。", qdrantPrepare: "准备课程集合", qdrantPreparing: "正在复制并验证向量……", qdrantPreparedState: "课程集合已经验证并可以复用。再次检查可观察幂等复用路径。", qdrantVerifyAgain: "再次验证已准备的集合", vectorPointCount: "向量点数", vectorDimension: "向量维度", vectorPoints: "个向量点", payloadFilter: "载荷过滤", payloadFilters: "载荷过滤", filtersAvailable: "可用", filtersUnavailable: "不可用", legacyFiltersUnavailable: "这个旧版 Qdrant 索引仍可检索,但其精简载荷不支持来源分组过滤。", noFilter: "不过滤 · 一致性实验", compareBackends: "比较精确检索", comparing: "正在比较……", parityMatch: "已验证精确检索一致性", parityMismatch: "两个后端的排名不同", parityTolerance: "分数容差:", filteredResults: "独立的过滤演示", filterSeparate: "过滤会改变候选集合,因此这里不会标记为 NumPy/Qdrant 一致性结果。", storedPayload: "检查存储的载荷", buildViews: { build: "构建索引", inspect: "检查索引" }, upload: "添加 Markdown 或文本文件", build: "构建索引", question: "输入问题", retrieve: "检索", retrieving: "正在检索…", ask: "实时问答", testing: "正在测试连接…", generating: "正在生成答案…", testConnection: "测试连接", noIndex: "选择一个索引后即可开始探索。", @@ -60,24 +90,24 @@ export const copy = { "将答案与其引用来源一起阅读,再把每条引用对应到下方证据。", ], evidence: "证据", prompt: "基于证据的提示词", answer: "答案", vectors: "向量预览", manifest: "索引清单", - provider: "实时问答需要为本地实验室配置 OpenAI 兼容的模型服务。", providerTestHint: "先验证模型服务,才能用于实时问答。", providerUnlocked: "已验证的模型服务已解锁实时问答。", generationFailed: "实时生成失败。请检查模型服务设置后重试。", selectedEvidence: "选入上下文的证据", abstention: "基于证据的拒答", noSupportedAnswer: "当前语料中没有可支持的答案", abstained: "这个问题超出了当前所选语料的覆盖范围。模型在上下文中找不到支持证据,因此拒绝编造答案。", showFull: "展开完整文本", scenarioQuestion: "问题", + provider: "实时问答需要为本地实验室配置 OpenAI 兼容的模型服务。", providerTestHint: "先验证模型服务,才能用于实时问答。", providerUnlocked: "已验证的模型服务已解锁实时问答。", generationFailed: "实时生成失败。请检查模型服务设置后重试。", selectedEvidence: "选入上下文的证据", generationRetrievalAudit: "生成实际使用的检索路径", generationRetrievalAuditHint: "这份候选到最终结果的记录生成了下方证据;只有被选中的证据会装入生成提示词。", rerankingQuestionHint: "可从建议中选择一道评审过的重排问题,也可以直接输入自己的问题。", abstention: "基于证据的拒答", noSupportedAnswer: "当前语料中没有可支持的答案", abstained: "这个问题超出了当前所选语料的覆盖范围。模型在上下文中找不到支持证据,因此拒绝编造答案。", showFull: "展开完整文本", scenarioQuestion: "问题", quick: "先沿着一次完整、已记录的 RAG 课程学习,再用探索页在同一真实语料上运行自己的检索。", replay: "开始引导课程", watson: "下载 watsonxDocsQA", backend: "向量索引后端", index: "索引", providerUrl: "模型服务 API 地址", providerModel: "模型", providerKey: "API 密钥(仅当前会话)", - modelReady: "默认嵌入模型已就绪:all-MiniLM-L6-v2(384 维)", modelMissing: "构建索引前需要下载默认嵌入模型", modelDownloadRequired: "语义检索和混合检索需要默认嵌入模型。请前往设置下载模型后重试。", modelDownloading: "正在下载默认嵌入模型…", modelDownloadInProgress: "下载正在进行中。模型就绪后此页面会自动更新。", downloadModel: "下载默认嵌入模型", - retriever: "检索器", topK: "Top-k", contextBudget: "上下文预算(0 = 不限)", selected: "已选入上下文", omitted: "未选入上下文", vector: "查询向量", timings: "阶段耗时", + modelReady: "已在本地就绪 · 384 维", modelMissing: "本地尚未提供。下载后即可构建索引并运行语义或混合检索。", modelDownloadRequired: "语义检索和混合检索需要默认嵌入模型。请前往设置下载模型后重试。", modelDownloading: "正在下载嵌入模型…", modelDownloadInProgress: "下载正在进行中。模型就绪后此页面会自动更新。", downloadModel: "下载嵌入模型", rerankerSettings: "固定版本的重排模型", rerankerReady: "已在本地就绪 · 可以使用交叉编码器重排", rerankerMissing: "本地尚未提供。下载后即可检查或使用交叉编码器重排。", rerankerDownloading: "正在下载重排模型…", downloadReranker: "下载重排模型", pinnedRevision: "固定版本", + retriever: "检索器", topK: "最终 Top-k", reranker: "重排器", noReranker: "不使用", crossEncoder: "交叉编码器", candidateDepth: "候选深度", rerankerDownloadRequired: "交叉编码器重排需要固定版本的本地重排模型;可在设置页使用对应下载控件。", contextBudget: "上下文预算(0 = 不限)", selected: "已选入上下文", omitted: "未选入上下文", vector: "查询向量", timings: "阶段耗时", baseline: "基线", intervention: "干预", learn: "阅读学习指南", raw: "查看原始产物", source: "来源", score: "分数", chunkReference: "分块 ID", citationReference: "来源引用", scoreDetails: "分数详情", citations: "答案引用的来源", indexFacts: "索引事实", chunks: "分块", documents: "文档", embeddingModel: "嵌入模型", buildIntro: "使用随附的语料库,或带入自己的小型语料库。接着选择本地向量后端,并构建可检查的索引。", inspectIntro: "无需离开实验室,即可检查已保存的索引事实、分块和数值化向量预览。", exploreIntro: "运行检索或实时的基于证据问答,并沿着每个管道阶段查看同一批产物。", failureIntro: "使用项目精心设计的 trace 产物,对比一个已知失败案例和干预措施。", - settingsIntro: "检查随实验室提供的本地嵌入模型,并配置可选的 OpenAI 兼容模型服务。", + settingsIntro: "检查两种固定版本的本地检索模型,并配置可选的 OpenAI 兼容模型服务。", replayDetail: "已记录的离线课程 · 无需下载模型或配置模型服务。", buildPath: "构建小型索引", buildPathDetail: "上传一个小型语料库,检查它的分块,再提出自己的问题。", rawVector: "仅显示前 8 个维度——这些数值是预览,不对应人类可读的概念。", bundledCorpus: "使用随附的语料库", customCorpus: "带入小型语料库", chooseUploadedCorpus: "选择已上传的语料库", noUploadedCorpus: "尚未上传语料库", or: "或", - qdrantReady: "Qdrant — 已就绪", qdrantUnavailable: "Qdrant — 不可用", qdrantUnavailableHint: "启动可选的 Qdrant 服务后即可使用此后端。", embeddingSettings: "随附的嵌入模型", providerSettings: "OpenAI 兼容模型服务", runConfiguration: "运行配置", + qdrantReady: "Qdrant — 已就绪", qdrantUnavailable: "Qdrant — 不可用", qdrantUnavailableHint: "启动可选的 Qdrant 服务后即可使用此后端。", embeddingSettings: "固定版本的嵌入模型", embeddingModelRole: "语义检索、混合检索、查询向量和构建向量索引需要此模型。", rerankerModelRole: "只有选择交叉编码器重排时,才额外需要此模型。", cpuModelRuntime: "两个模型都在本地 CPU 上运行,不需要 GPU、CUDA 或 NVIDIA 运行时。", providerSettings: "OpenAI 兼容模型服务", runConfiguration: "运行配置", corpusAdded: "已添加语料库。", indexing: "正在本地构建索引…", indexReady: "索引已就绪。", watsonStatus: "watsonxDocsQA", myCorpus: "我的语料库", retrieverOptions: { dense: "语义检索", bm25: "BM25", hybrid: "混合(RRF)" }, learnIntro: "沿着一条固定技术文档上的已保存课程学习。每一步都展示 RAG 系统实际使用的产物。", lesson: "引导课程", recorded: "保存的教学结果——未调用实时模型", continueLesson: "继续", loadingLesson: "正在加载课程…", expectedSources: "标准来源", retrievedSources: "检索到的来源", catalogQuestion: "题库问题", freeQuestion: "自由问题", goldCheck: "标准来源检查", hit: "已检索到标准来源", miss: "未检索到标准来源", sourceIdentity: "固定来源标识", diff --git a/web/src/main.test.tsx b/web/src/main.test.tsx index 7c11d36..6288b50 100644 --- a/web/src/main.test.tsx +++ b/web/src/main.test.tsx @@ -16,21 +16,92 @@ const citationMismatchLesson = { baseline: { config: { retriever: "dense", top_k: 3 }, trace: { evidence: [{ rank: 1, score: 0.77, doc_id: "subdir/nested.md", text: "Nested document is in a subdirectory." }], context_pack: { selected: ["nested"], omitted: [] }, answer: "The nested document lives in the root directory.", citations: ["with_h1.md"], outcome_label: "citation_mismatch" } }, intervention: { config: { retriever: "dense", top_k: 3 }, trace: { evidence: [{ rank: 1, score: 0.77, doc_id: "subdir/nested.md", text: "Nested document is in a subdirectory." }], context_pack: { selected: ["nested"], omitted: [] }, answer: "The nested document lives in a subdirectory.", citations: ["subdir/nested.md"], outcome_label: "no_failure" } }, }; +const retrievalMaterials = [ + { question_id: "lex-1", category: "lexical", question: "What does max_retries control?", gold_doc_ids: ["queues.md"], teaching_note: { en: "Watch the exact term.", zh: "观察精确词项。" } }, + { question_id: "dense-1", category: "dense", question: "Why can an update arrive later elsewhere?", gold_doc_ids: ["kv.md"], teaching_note: { en: "Compare vector direction.", zh: "比较向量方向。" } }, + { question_id: "hybrid-1", category: "hybrid", question: "How does a queue retry become delayed?", gold_doc_ids: ["queues.md"], teaching_note: { en: "Follow both ranks.", zh: "观察两种排名。" } }, + { question_id: "rerank-1", category: "reranking", question: "What does getByName return?", gold_doc_ids: ["durable.md"], teaching_note: { en: "Watch candidates move.", zh: "观察候选移动。" } }, +]; +const lexicalRun = { + ...starterRun, + explanations: { kind: "bm25", bm25: { query_tokens: ["what", "max_retries"], corpus_size: 40, k1: 1.5, b: .75, candidates: [{ chunk_id: "alpha", rank: 1, score: .98, document_length: 12, average_document_length: 20, terms: [{ term: "max_retries", query_frequency: 1, term_frequency: 2, document_frequency: 1, inverse_document_frequency: 2.3, contribution: .98 }] }] } }, +}; +const denseRun = { + ...starterRun, + explanations: { kind: "dense", dense: { candidates: [{ chunk_id: "alpha", rank: 1, score: .7057, query_norm: 1, chunk_norm: 1, dot_product: .7057, cosine_similarity: .7057, query_vector_preview: [-.0351, -.0221, -.0106, .0356, -.0287, -.0344, -.0643, -.0263, .0525, .0315, .0629, .0537], chunk_vector_preview: [.0076, -.0087, -.0522, .0459, -.0343, -.0343, -.0444, .0389, .0941, -.0022, .0181, .0905] }] } }, +}; +const hybridRun = { + ...starterRun, + explanations: { kind: "hybrid", hybrid: { rrf_k: 60, dense: [{ chunk_id: "alpha", rank: 2, score: .7 }], bm25: [{ chunk_id: "alpha", rank: 1, score: 3.2 }, { chunk_id: "beta", rank: 3, score: 2.1 }], candidates: [{ chunk_id: "alpha", rank: 1, score: .0325, sources: [{ source: "dense", rank: 2, score: .7, contribution: .0161 }, { source: "bm25", rank: 1, score: 3.2, contribution: .0164 }] }, { chunk_id: "beta", rank: 2, score: .0159, sources: [{ source: "bm25", rank: 3, score: 2.1, contribution: .0159 }] }] } }, +}; +const rerankRun = { + ...hybridRun, + evidence: [{ ...starterRun.evidence[0], rank: 1, score: 2.4 }], + candidates: [{ ...starterRun.evidence[0], chunk_id: "alpha", rank: 1, score: .0325 }, { ...starterRun.evidence[0], chunk_id: "beta", doc_id: "beta.md", title: "Beta", rank: 2, score: .03 }], + explanations: { ...hybridRun.explanations, kind: "reranking", reranking: { candidate_count: 20, final_top_k: 5, candidates: [{ chunk_id: "alpha", pre_rank: 2, final_rank: 1, pre_score: .0325, reranker_score: 2.4, rank_delta: 1, outcome: "moved_up" }, { chunk_id: "beta", pre_rank: 1, final_rank: null, pre_score: .03, reranker_score: -.2, rank_delta: null, outcome: "dropped" }] } }, +}; +const qdrantReady = { + available: true, prepared: true, launch_command: "docker compose --profile qdrant up -d", + source_fingerprint: "1234567890abcdef1234567890abcdef", filters: ["r2", "queues"], + collection: { alias: "teaching", collection: "teaching__1234", point_count: 522, dimension: 384, reused: true, verified: true }, +}; +const qdrantComparison = { + question: retrievalMaterials[1].question, + numpy: [{ ...starterRun.evidence[0], payload: null }], + qdrant: [{ ...starterRun.evidence[0], payload: { chunk_id: "alpha", source_group: "r2", source_fingerprint: qdrantReady.source_fingerprint } }], + parity: { equivalent: true, score_tolerance: .00001, items: [{ chunk_id: "alpha", numpy_rank: 1, qdrant_rank: 1, equivalent: true }] }, + source_group: "r2", + filtered_qdrant: [{ ...starterRun.evidence[0], payload: { chunk_id: "alpha", source_group: "r2" } }], +}; +const evaluationConfigA = { retriever: "bm25", top_k: 5, reranker: "none", rerank_top_n: 20 }; +const evaluationConfigB = { retriever: "dense", top_k: 5, reranker: "none", rerank_top_n: 20 }; +const evaluationQuestion = { question_id: "eval-1", question: "How are queue messages delivered?", category: "lexical", gold_doc_ids: ["queues.md"], metrics: { hit: 1, reciprocal_rank: 1, context_precision: .2, context_recall: 1 }, evidence: starterRun.evidence }; +const evaluationResult = { + question_count: 16, + bundle: { index_id: "cloudflare-state-structural-v1", source_vector_fingerprint: "1234" }, + left: { config: evaluationConfigA, metrics: { n_questions: 16, hit_rate: .75, mrr: .6, context_precision: .2, context_recall: .75 }, questions: [evaluationQuestion] }, + right: { config: evaluationConfigB, metrics: { n_questions: 16, hit_rate: .875, mrr: .72, context_precision: .24, context_recall: .875 }, questions: [evaluationQuestion] }, +}; function response(body: unknown) { return Promise.resolve(new Response(JSON.stringify(body), { status: 200, headers: { "Content-Type": "application/json" } })); } -function mockApi({ corpora = [], indexes = [], lessons = [], guided = [guidedLesson.lesson] }: { corpora?: unknown[]; indexes?: unknown[]; lessons?: unknown[]; guided?: unknown[] } = {}) { - vi.stubGlobal("fetch", vi.fn((input: RequestInfo | URL) => { +function mockApi({ corpora = [], indexes = [], catalog = [], lessons = [], guided = [guidedLesson.lesson], qdrant = qdrantReady, indexDetail = {}, providerConfigured = false, evaluationActive = [], evaluationState, modelReady = true, rerankerReady = true, activeJob = null, modelJobState }: { corpora?: unknown[]; indexes?: unknown[]; catalog?: unknown[]; lessons?: unknown[]; guided?: unknown[]; qdrant?: unknown; indexDetail?: unknown; providerConfigured?: boolean; evaluationActive?: any[]; evaluationState?: any; modelReady?: boolean; rerankerReady?: boolean; activeJob?: any; modelJobState?: any } = {}) { + vi.stubGlobal("fetch", vi.fn((input: RequestInfo | URL, options?: RequestInit) => { const path = String(input); if (path.endsWith("/corpora")) return response({ items: corpora }); + if (/\/corpora\/[^/]+\/questions$/.test(path)) return response({ items: catalog }); if (path.endsWith("/indexes")) return response({ items: indexes }); + if (path.includes("/indexes/")) return response(indexDetail); if (path.endsWith("/backends")) return response({ items: [{ id: "numpy", available: true }, { id: "qdrant", available: true }] }); - if (path.endsWith("/models/default/status")) return response({ ready: true }); + if (path.endsWith("/models/default/status")) return response({ ready: modelReady }); + if (path.endsWith("/models/reranker/status")) return response({ ready: rerankerReady }); + if (path.endsWith("/models/default/download")) return response({ id: "embedding-model-ready", status: "complete" }); + if (path.endsWith("/models/reranker/download")) return response({ id: "reranker-model-ready", status: "complete" }); + if (path.endsWith("/jobs/active")) return response({ items: activeJob ? [activeJob] : [] }); + if (activeJob && path.endsWith(`/jobs/${activeJob.id}`)) return response(modelJobState || activeJob); + if (path.endsWith("/provider-status")) return response({ configured: providerConfigured }); + if (path.endsWith("/provider/test")) return response({ message: "Provider connection verified" }); if (path.endsWith("/failure-lessons")) return response({ items: lessons }); if (path.endsWith("/lessons")) return response({ items: guided }); + if (path.endsWith("/retrieval/materials")) return response({ index_id: "cloudflare-state-structural-v1", items: retrievalMaterials }); + if (path.endsWith("/retrieval/qdrant/status")) return response(qdrant); + if (path.endsWith("/retrieval/qdrant/prepare")) return response(qdrantReady.collection); + if (path.endsWith("/retrieval/qdrant/compare")) return response(qdrantComparison); + if (path.endsWith("/evaluations/status")) return response({ ready: true, reason: null, question_count: 16, presets: [{ id: "bm25-vs-dense", left: evaluationConfigA, right: evaluationConfigB }, { id: "dense-vs-hybrid", left: evaluationConfigB, right: { ...evaluationConfigB, retriever: "hybrid" } }] }); + if (path.endsWith("/jobs/active?kind=evaluation")) return response({ items: evaluationActive }); + if (path.endsWith("/evaluations")) return response({ id: "evaluation-1", status: "queued" }); + if (path.endsWith("/jobs/evaluation-1/result")) return response(evaluationResult); + if (path.endsWith("/jobs/evaluation-1")) return response(evaluationState || { id: "evaluation-1", status: "complete", progress: { current: 16, total: 16, message: "Complete" } }); + if (evaluationActive.some((item) => path.endsWith(`/jobs/${item.id}`))) return response(evaluationState || evaluationActive.find((item) => path.endsWith(`/jobs/${item.id}`))); if (path.includes("/lessons/")) return response(guidedLesson); if (path.endsWith("/starter-run")) return response(starterRun); - if (path.endsWith("/runs/retrieve")) return response(starterRun); + if (path.endsWith("/runs/retrieve") || path.endsWith("/runs/ask")) { + const body = JSON.parse(String(options?.body || "{}")); + if (body.reranker === "cross-encoder") return response(rerankRun); + if (body.retriever === "hybrid") return response(hybridRun); + if (body.retriever === "dense") return response(denseRun); + return response(lexicalRun); + } return response({}); })); } @@ -61,7 +132,7 @@ describe("field-guide visual foundation", () => { it("offers newcomers a replay path and a build-your-own path from Home", async () => { mockApi(); const user = userEvent.setup(); render(); - expect(Array.from(screen.getByRole("navigation", { name: "Lab areas" }).querySelectorAll("button")).map((button) => button.textContent)).toEqual(["Home", "Learn", "Explore", "Build & Inspect", "Failure Lab", "Settings"]); + expect(Array.from(screen.getByRole("navigation", { name: "Lab areas" }).querySelectorAll("button")).map((button) => button.textContent)).toEqual(["Home", "Learn", "Retrieval", "Explore", "Build & Inspect", "Failure Lab", "Settings"]); await user.click(screen.getByRole("button", { name: "Build a small index" })); expect(await screen.findByRole("heading", { name: "Build index", level: 2 })).toBeInTheDocument(); }); @@ -73,6 +144,31 @@ describe("field-guide visual foundation", () => { expect(screen.getByRole("button", { name: "开始引导课程" })).toBeInTheDocument(); }); + it("shows two independently pinned model lifecycles in Settings", async () => { + mockApi({ modelReady: false, rerankerReady: false }); const user = userEvent.setup(); render(); + await user.click(screen.getByRole("button", { name: "Settings" })); + expect(await screen.findByText("sentence-transformers/all-MiniLM-L6-v2")).toBeInTheDocument(); + expect(screen.getByText("cross-encoder/ms-marco-MiniLM-L-6-v2")).toBeInTheDocument(); + expect(screen.getAllByText(/Pinned revision/)).toHaveLength(2); + expect(screen.getByText(/Required for Dense and Hybrid retrieval/)).toBeInTheDocument(); + expect(screen.getByText(/Additionally required only when cross-encoder reranking/)).toBeInTheDocument(); + expect(screen.getByText(/No GPU, CUDA, or NVIDIA runtime is required/)).toBeInTheDocument(); + expect(screen.getByRole("button", { name: "Download embedding model" })).toBeInTheDocument(); + await user.click(screen.getByRole("button", { name: "Download reranker model" })); + expect(await screen.findAllByText("Ready locally · cross-encoder reranking is available")).toHaveLength(2); + expect(vi.mocked(fetch).mock.calls.some(([path]) => String(path).endsWith("/models/reranker/download"))).toBe(true); + await user.click(screen.getByRole("button", { name: "中文" })); + expect(screen.getByText("固定版本的重排模型")).toBeInTheDocument(); + expect(screen.getByText("已在本地就绪 · 可以使用交叉编码器重排")).toBeInTheDocument(); + }); + + it("recovers an active reranker download after refresh", async () => { + mockApi({ rerankerReady: false, activeJob: { id: "reranker-model-1", kind: "reranker-model" }, modelJobState: { id: "reranker-model-1", kind: "reranker-model", status: "complete" } }); + const user = userEvent.setup(); render(); + await user.click(screen.getByRole("button", { name: "Settings" })); + expect(await screen.findByText("Ready locally · cross-encoder reranking is available")).toBeInTheDocument(); + }); + it("opens a complete recorded lesson with inspectable evidence", async () => { mockApi(); const user = userEvent.setup(); render(); await user.click(screen.getByRole("button", { name: "Start guided lesson" })); @@ -114,6 +210,221 @@ describe("field-guide visual foundation", () => { expect(vi.mocked(fetch).mock.calls.some(([path]) => String(path).endsWith("/runs/retrieve"))).toBe(true); }); + it("preserves catalog and free-question behavior when reranking is not selected", async () => { + const indexes = [{ id: "catalog-index", manifest: { source_corpus_id: "catalog-corpus" } }]; + const catalog = [{ id: "catalog-1", question: "What is the catalog answer?", featured: true }]; + mockApi({ indexes, catalog }); const user = userEvent.setup(); render(); + await user.click(screen.getByRole("button", { name: "Explore" })); + await user.selectOptions(screen.getByRole("combobox", { name: "Index" }), "catalog-index"); + const catalogPicker = await screen.findByRole("combobox", { name: "Catalog question" }); + expect(screen.getByRole("combobox", { name: "Reranker" })).toHaveValue("none"); + expect(screen.getByLabelText("Ask a question")).not.toHaveAttribute("list"); + await user.selectOptions(catalogPicker, "catalog-1"); + expect(screen.getByLabelText("Ask a question")).toBeDisabled(); + await user.click(screen.getByRole("button", { name: "Retrieve" })); + const request = vi.mocked(fetch).mock.calls.find(([path]) => String(path).endsWith("/runs/retrieve")); + expect(JSON.parse(String((request?.[1] as RequestInit).body))).toMatchObject({ catalog_question_id: "catalog-1", reranker: "none" }); + }); + + it("runs a reviewed lexical lesson and renders engine-owned BM25 math", async () => { + mockApi(); const user = userEvent.setup(); render(); + await user.click(screen.getByRole("button", { name: "Retrieval" })); + expect(await screen.findByRole("heading", { name: "How retrieval decides" })).toBeInTheDocument(); + expect(screen.getByRole("option", { name: retrievalMaterials[0].question })).toBeInTheDocument(); + await user.click(screen.getByRole("button", { name: "Run live retrieval" })); + expect(await screen.findByRole("heading", { name: "BM25 term contributions", level: 4 })).toBeInTheDocument(); + expect(screen.getAllByText("max_retries").length).toBeGreaterThan(0); + expect(screen.getByRole("columnheader", { name: "Frequency in chunk" })).toBeInTheDocument(); + expect(screen.getByText(/score = Σ query count/)).toBeInTheDocument(); + await user.click(screen.getByRole("button", { name: "中文" })); + expect(screen.getByRole("columnheader", { name: "分块内出现次数" })).toBeInTheDocument(); + expect(screen.getByText(/BM25 会把每个查询词项的贡献相加/)).toBeInTheDocument(); + const request = vi.mocked(fetch).mock.calls.find(([path]) => String(path).endsWith("/runs/retrieve")); + expect(JSON.parse(String((request?.[1] as RequestInit).body))).toMatchObject({ retrieval_material_id: "lex-1", retriever: "bm25", explain: true }); + }); + + it("anchors positive and negative vector components to opposite sides of one baseline", async () => { + mockApi(); const user = userEvent.setup(); const { container } = render(); + await user.click(screen.getByRole("button", { name: "Retrieval" })); + await user.click(screen.getByRole("button", { name: /02Dense/ })); + await user.click(screen.getByRole("button", { name: "Run live retrieval" })); + expect(await screen.findByRole("img", { name: "Query vector" })).toBeInTheDocument(); + const charts = container.querySelectorAll(".signed-vector-chart"); + expect(charts).toHaveLength(2); + expect(charts[0].style.getPropertyValue("--component-count")).toBe("12"); + expect(charts[0].querySelectorAll(".vector-component")).toHaveLength(12); + expect(container.querySelectorAll(".signed-vector-chart .vector-zero-axis")).toHaveLength(2); + expect(container.querySelectorAll(".signed-vector-chart .vector-component.negative").length).toBeGreaterThan(0); + expect(container.querySelectorAll(".signed-vector-chart .vector-component.positive").length).toBeGreaterThan(0); + expect(screen.getByText(/blue positive values extend upward/)).toBeInTheDocument(); + expect(screen.getAllByText("+0.0459").length).toBeGreaterThan(0); + expect(screen.getByText("Reviewed source documents").nextSibling).toHaveTextContent("kv.md"); + }); + + it("shows both source rankings and engine-owned RRF contributions", async () => { + mockApi(); const user = userEvent.setup(); render(); + await user.click(screen.getByRole("button", { name: "Retrieval" })); + await user.click(screen.getByRole("button", { name: /04Hybrid/ })); + await user.click(screen.getByRole("button", { name: "Run live retrieval" })); + expect(await screen.findByRole("heading", { name: "Dense ranking", level: 4 })).toBeInTheDocument(); + expect(screen.getByRole("heading", { name: "BM25 ranking", level: 4 })).toBeInTheDocument(); + expect(screen.getByText(/1 \/ \(60 \+ 2\)/)).toBeInTheDocument(); + expect(screen.getByText("+0.0161")).toBeInTheDocument(); + expect(screen.getByText(/outside one source’s candidate list/)).toBeInTheDocument(); + expect(screen.getByText("Outside this source’s candidate list")).toBeInTheDocument(); + expect(screen.getByText("+0")).toBeInTheDocument(); + const request = vi.mocked(fetch).mock.calls.find(([path]) => String(path).endsWith("/runs/retrieve")); + expect(JSON.parse(String((request?.[1] as RequestInit).body))).toMatchObject({ retrieval_material_id: "hybrid-1", retriever: "hybrid", reranker: "none", explain: true }); + }); + + it("keeps the complete candidate-to-final reranking audit visible", async () => { + mockApi(); const user = userEvent.setup(); render(); + await user.click(screen.getByRole("button", { name: "Retrieval" })); + await user.click(screen.getByRole("button", { name: /05Reranking/ })); + expect(screen.getByRole("link", { name: "Read the learning guide" })).toHaveAttribute("href", "/docs/en/reranking.html"); + await user.click(screen.getByRole("button", { name: "Run live retrieval" })); + expect(await screen.findByText("20 first-stage candidates")).toBeInTheDocument(); + expect(screen.getByRole("columnheader", { name: "Cross-encoder score" })).toBeInTheDocument(); + expect(screen.getByText("Moved up · +1")).toBeInTheDocument(); + expect(screen.getByText("Dropped")).toBeInTheDocument(); + const request = vi.mocked(fetch).mock.calls.find(([path]) => String(path).endsWith("/runs/retrieve")); + expect(JSON.parse(String((request?.[1] as RequestInit).body))).toMatchObject({ retrieval_material_id: "rerank-1", retriever: "hybrid", top_k: 5, reranker: "cross-encoder", rerank_top_n: 20, explain: true }); + }); + + it("runs the fixed evaluation comparison and exposes four metrics plus per-question evidence", async () => { + mockApi(); const user = userEvent.setup(); render(); + await user.click(screen.getByRole("button", { name: "Retrieval" })); + await user.click(screen.getByRole("button", { name: /06Evaluation/ })); + expect(screen.getByRole("link", { name: "Read the learning guide" })).toHaveAttribute("href", "/docs/en/evaluating-retrieval.html"); + expect(await screen.findByText("16 reviewed questions")).toBeInTheDocument(); + await user.click(screen.getByRole("button", { name: "Run comparison" })); + expect(await screen.findByRole("heading", { name: "Aggregate results" })).toBeInTheDocument(); + expect(screen.getByText("Hit rate")).toBeInTheDocument(); + expect(screen.getByText("Context precision")).toBeInTheDocument(); + expect(screen.getAllByText("How are queue messages delivered?")).toHaveLength(2); + expect(screen.getAllByText("alpha evidence")).toHaveLength(2); + const request = vi.mocked(fetch).mock.calls.find(([path]) => String(path).endsWith("/evaluations")); + expect(JSON.parse(String((request?.[1] as RequestInit).body))).toEqual({ left: evaluationConfigA, right: evaluationConfigB }); + await user.click(screen.getByRole("button", { name: "中文" })); + expect(screen.getByText("已完成")).toBeInTheDocument(); + expect(screen.getAllByText("词法检索")).toHaveLength(2); + expect(screen.getAllByText("命中")).toHaveLength(2); + }); + + it("restores an active custom evaluation configuration after navigation", async () => { + const recovered = { id: "evaluation-recovered", status: "running", progress: { current: 7, total: 16, message: "Compared 7 of 16 questions" }, left: { ...evaluationConfigB, retriever: "hybrid", top_k: 7 }, right: { retriever: "hybrid", top_k: 4, reranker: "cross-encoder", rerank_top_n: 24 } }; + mockApi({ evaluationActive: [recovered] }); const user = userEvent.setup(); render(); + await user.click(screen.getByRole("button", { name: "Retrieval" })); + await user.click(screen.getByRole("button", { name: /06Evaluation/ })); + expect(await screen.findByRole("option", { name: "Recovered custom comparison" })).toBeInTheDocument(); + const retrievers = screen.getAllByRole("combobox", { name: "Retriever" }); + expect(retrievers[0]).toHaveValue("hybrid"); + expect(retrievers[1]).toHaveValue("hybrid"); + expect(screen.getByText("Compared 7 of 16 questions")).toBeInTheDocument(); + expect(screen.getByRole("progressbar", { name: "Evaluation progress" })).toHaveAttribute("aria-valuenow", "7"); + expect(screen.getByRole("progressbar", { name: "Evaluation progress" })).toHaveAttribute("aria-valuemax", "16"); + expect(screen.getByText("7 of 16 questions")).toBeInTheDocument(); + }); + + it("presents a terminal evaluation failure without publishing a result", async () => { + mockApi({ evaluationState: { id: "evaluation-1", status: "failed", error: "Evaluation failed safely.", progress: { current: 3, total: 16, message: "Stopped" } } }); + const user = userEvent.setup(); render(); + await user.click(screen.getByRole("button", { name: "Retrieval" })); + await user.click(screen.getByRole("button", { name: /06Evaluation/ })); + await user.click(await screen.findByRole("button", { name: "Run comparison" })); + expect(await screen.findByText("Evaluation failed safely.")).toBeInTheDocument(); + expect(screen.queryByRole("heading", { name: "Aggregate results" })).not.toBeInTheDocument(); + }); + + it("uses one reranker configuration for Explore Retrieve and Live ask", async () => { + mockApi({ indexes: [{ id: "course", manifest: {} }], providerConfigured: true }); + const user = userEvent.setup(); render(); + await user.click(screen.getByRole("button", { name: "Settings" })); + await user.click(screen.getByRole("button", { name: "Test connection" })); + await user.click(screen.getByRole("button", { name: "Explore" })); + await user.selectOptions(screen.getByRole("combobox", { name: "Index" }), "course"); + await user.selectOptions(screen.getByRole("combobox", { name: "Reranker" }), "cross-encoder"); + const questionInput = screen.getByLabelText("Ask a question"); + expect(questionInput).toHaveAttribute("list", "reviewed-reranking-questions"); + expect(document.querySelector('datalist option[value="What does getByName return?"]')).toBeInTheDocument(); + expect(screen.getByText(/Choose a reviewed reranking example from the suggestions/)).toBeInTheDocument(); + await user.type(questionInput, "What does getByName return?"); + await user.clear(screen.getByRole("spinbutton", { name: "Candidate depth" })); + await user.type(screen.getByRole("spinbutton", { name: "Candidate depth" }), "20"); + await user.click(screen.getByRole("button", { name: "Retrieve" })); + await user.click(screen.getByRole("button", { name: "Live ask" })); + expect(await screen.findByRole("heading", { name: "Retrieval path used for generation" })).toBeInTheDocument(); + expect(screen.getByText(/Only the selected evidence is packed into the generation prompt/)).toBeInTheDocument(); + const requests = vi.mocked(fetch).mock.calls.filter(([path]) => /\/runs\/(retrieve|ask)$/.test(String(path))); + expect(requests).toHaveLength(2); + for (const request of requests) expect(JSON.parse(String((request[1] as RequestInit).body))).toMatchObject({ reranker: "cross-encoder", rerank_top_n: 20, explain: true }); + await user.click(screen.getByRole("button", { name: "04Retrieve" })); + expect(await screen.findByText("20 first-stage candidates")).toBeInTheDocument(); + }); + + it("locks Retrieval module identity while a live run is pending", async () => { + mockApi(); + const normalFetch = vi.mocked(fetch).getMockImplementation()!; + let finishRun!: (value: Response) => void; + vi.mocked(fetch).mockImplementation((input: RequestInfo | URL, options?: RequestInit) => { + if (String(input).endsWith("/runs/retrieve")) return new Promise((resolve) => { finishRun = resolve; }); + return normalFetch(input, options); + }); + const user = userEvent.setup(); render(); + await user.click(screen.getByRole("button", { name: "Retrieval" })); + await user.click(screen.getByRole("button", { name: "Run live retrieval" })); + const dense = screen.getByRole("button", { name: /02Dense/ }); + expect(dense).toBeDisabled(); + await user.click(dense); + finishRun(new Response(JSON.stringify(lexicalRun), { status: 200, headers: { "Content-Type": "application/json" } })); + expect(await screen.findByRole("heading", { name: "BM25 term contributions", level: 4 })).toBeInTheDocument(); + expect(screen.getByRole("button", { name: /01Lexical/ })).toHaveClass("active"); + }); + + it("keeps Qdrant optional and shows the exact local launch command", async () => { + mockApi({ qdrant: { ...qdrantReady, available: false, prepared: false, collection: null } }); + const user = userEvent.setup(); render(); + await user.click(screen.getByRole("button", { name: "Retrieval" })); + await user.click(screen.getByRole("button", { name: /03Vector database/ })); + expect(await screen.findByRole("heading", { name: "Qdrant is not running", level: 4 })).toBeInTheDocument(); + expect(screen.getByText("docker compose --profile qdrant up -d")).toBeInTheDocument(); + expect(screen.getByText(/rest of the Retrieval course still works/)).toBeInTheDocument(); + }); + + it("compares NumPy and Qdrant exact search while separating payload filtering", async () => { + mockApi(); const user = userEvent.setup(); render(); + await user.click(screen.getByRole("button", { name: "Retrieval" })); + await user.click(screen.getByRole("button", { name: /03Vector database/ })); + expect(await screen.findByText("522 points")).toBeInTheDocument(); + expect(screen.getByText(/retrieval flow does not change/)).toBeInTheDocument(); + expect(screen.getByText("Vector points")).toBeInTheDocument(); + expect(screen.getByText("Vector dimension")).toBeInTheDocument(); + await user.selectOptions(screen.getByRole("combobox", { name: "Payload filter" }), "r2"); + await user.click(screen.getByRole("button", { name: "Compare exact search" })); + expect(await screen.findByText("Exact-search parity verified")).toBeInTheDocument(); + expect(screen.getByText(/NumPy has no database payload object/)).toBeInTheDocument(); + expect(screen.getByText(/Qdrant stores the same learner-facing metadata/)).toBeInTheDocument(); + expect(screen.getByRole("heading", { name: "Separate filter demonstration: r2", level: 4 })).toBeInTheDocument(); + expect(screen.getByText(/Filtering changes the candidate set/)).toBeInTheDocument(); + expect(screen.getAllByText("alpha").length).toBeGreaterThan(1); + await user.click(screen.getByRole("button", { name: "Verify prepared collection again" })); + expect(vi.mocked(fetch).mock.calls.filter(([path]) => String(path).endsWith("/retrieval/qdrant/prepare"))).toHaveLength(1); + const request = vi.mocked(fetch).mock.calls.find(([path]) => String(path).endsWith("/retrieval/qdrant/compare")); + expect(JSON.parse(String((request?.[1] as RequestInit).body))).toMatchObject({ retrieval_material_id: "dense-1", top_k: 5, source_group: "r2" }); + }); + + it("keeps a legacy Qdrant index searchable while visibly disabling payload filters", async () => { + const indexes = [{ id: "legacy-qdrant", manifest: { index_backend: "qdrant" } }]; + mockApi({ indexes, indexDetail: { id: "legacy-qdrant", manifest: indexes[0].manifest, document_count: 1, chunk_count: 1, chunks: [], capabilities: { payload_filters: false } } }); + const user = userEvent.setup(); render(); + await user.click(screen.getByRole("button", { name: "Build & Inspect" })); + await user.click(screen.getByRole("tab", { name: "Inspect index" })); + await user.selectOptions(screen.getByRole("combobox", { name: "Inspect index" }), "legacy-qdrant"); + expect(await screen.findByText("Payload filters")).toBeInTheDocument(); + expect(screen.getByText("Unavailable")).toBeInTheDocument(); + expect(screen.getByText(/older Qdrant index remains searchable/)).toBeInTheDocument(); + }); + it("uses the static motion path when the user prefers reduced motion", async () => { vi.stubGlobal("matchMedia", vi.fn().mockReturnValue({ matches: true, addEventListener: vi.fn(), removeEventListener: vi.fn() })); mockApi(); render(); diff --git a/web/src/main.tsx b/web/src/main.tsx index 82a9f1b..0fe0ff5 100644 --- a/web/src/main.tsx +++ b/web/src/main.tsx @@ -6,8 +6,9 @@ import { ExploreView } from "./components/ExploreView"; import { FailureLabView } from "./components/FailureLabView"; import { HomeView } from "./components/HomeView"; import { LearnView } from "./components/LearnView"; +import { RetrievalView } from "./components/RetrievalView"; import { SettingsView } from "./components/SettingsView"; -import type { Area, BackendAvailability, BuildView, CatalogQuestion, Corpus, FailureLesson, GuidedLesson, GuidedLessonSummary, IndexItem, LabRun, Lang, Stage } from "./types"; +import type { Area, BackendAvailability, BuildView, CatalogQuestion, Corpus, FailureLesson, GuidedLesson, GuidedLessonSummary, IndexItem, LabRun, Lang, RetrievalMaterial, RetrievalModule, Stage } from "./types"; import "./styles.css"; async function api(path: string, options?: RequestInit): Promise { @@ -39,6 +40,8 @@ export function App() { const [catalogQuestions, setCatalogQuestions] = useState([]); const [catalogQuestionId, setCatalogQuestionId] = useState(""); const [retriever, setRetriever] = useState<"dense" | "bm25" | "hybrid">("dense"); + const [reranker, setReranker] = useState<"none" | "cross-encoder">("none"); + const [rerankTopN, setRerankTopN] = useState(20); const [topK, setTopK] = useState(5); const [contextBudget, setContextBudget] = useState(0); const [backend, setBackend] = useState<"numpy" | "qdrant">("numpy"); @@ -52,10 +55,18 @@ export function App() { const [running, setRunning] = useState<"retrieve" | "ask" | null>(null); const [testingProvider, setTestingProvider] = useState(false); const [modelReady, setModelReady] = useState(null); + const [rerankerReady, setRerankerReady] = useState(null); const [downloadingModel, setDownloadingModel] = useState(false); + const [downloadingReranker, setDownloadingReranker] = useState(false); const [lessons, setLessons] = useState([]); const [guidedLessons, setGuidedLessons] = useState([]); const [guidedLesson, setGuidedLesson] = useState(null); + const [retrievalMaterials, setRetrievalMaterials] = useState([]); + const [retrievalIndexId, setRetrievalIndexId] = useState("cloudflare-state-structural-v1"); + const [retrievalModule, setRetrievalModule] = useState("lexical"); + const [retrievalMaterialId, setRetrievalMaterialId] = useState(""); + const [retrievalRun, setRetrievalRun] = useState(null); + const [retrievalRunning, setRetrievalRunning] = useState(false); const [lessonProgress, setLessonProgress] = useState>({}); const [lessonId, setLessonId] = useState(""); const [activeStage, setActiveStage] = useState(3); @@ -75,17 +86,20 @@ export function App() { }; useEffect(() => { void refresh().catch((error: Error) => setMessage(error.message)); }, []); - useEffect(() => { localStorage.setItem("tiny-rag-lab-lang", lang); document.documentElement.lang = lang === "zh" ? "zh-CN" : "en"; }, [lang]); + useEffect(() => { localStorage.setItem("tiny-rag-lab-lang", lang); document.documentElement.lang = lang === "zh" ? "zh-CN" : "en"; setMessage(""); }, [lang]); useEffect(() => { localStorage.setItem("tiny-rag-lab-provider-url", providerUrl); localStorage.setItem("tiny-rag-lab-provider-model", providerModel); }, [providerUrl, providerModel]); useEffect(() => { setMessage(""); }, [area]); useEffect(() => { if (indexId) void api(`/indexes/${indexId}`).then(setDetail).catch((error: Error) => setMessage(error.message)); }, [indexId]); useEffect(() => { const corpusId = indexes.find((item) => item.id === indexId)?.manifest.source_corpus_id; setCatalogQuestionId(""); if (typeof corpusId === "string") void api<{ items: CatalogQuestion[] }>(`/corpora/${corpusId}/questions`).then((data) => setCatalogQuestions(data.items)).catch(() => setCatalogQuestions([])); else setCatalogQuestions([]); }, [indexId, indexes]); useEffect(() => { void api<{ ready: boolean }>("/models/default/status").then((status) => setModelReady(status.ready)).catch((error: Error) => setMessage(error.message)); }, []); + useEffect(() => { void api<{ ready: boolean }>("/models/reranker/status").then((status) => setRerankerReady(status.ready)).catch(() => setRerankerReady(false)); }, []); + useEffect(() => { void api<{ items: Array<{ id: string; kind: string }> }>("/jobs/active").then(({ items }) => { const active = items[0]; if (active?.kind === "embedding-model") { setDownloadingModel(true); void pollModelJob(active.id, "embedding"); } else if (active?.kind === "reranker-model") { setDownloadingReranker(true); void pollModelJob(active.id, "reranker"); } }).catch(() => undefined); }, []); useEffect(() => { void api<{ items: BackendAvailability[] }>("/backends").then((status) => setQdrantAvailable(status.items.some((item) => item.id === "qdrant" && item.available))).catch(() => setQdrantAvailable(false)); }, []); useEffect(() => { void api<{ configured: boolean }>("/provider-status").then((status) => setEnvironmentProviderReady(status.configured)).catch(() => setEnvironmentProviderReady(false)); }, []); useEffect(() => { void api<{ items: FailureLesson[] }>("/failure-lessons").then((data) => { setLessons(data.items); setLessonId(data.items[0]?.id || ""); }).catch((error: Error) => setMessage(error.message)); }, []); const openLesson = async (id: string, navigate = true) => { try { setGuidedLesson(await api(`/lessons/${id}`)); setActiveStage(0); if (navigate) setArea("learn"); } catch (error: any) { setMessage(error.message); } }; useEffect(() => { void api<{ items: GuidedLessonSummary[] }>("/lessons").then((data) => { const items = data.items || []; setGuidedLessons(items); if (items[0]) void api(`/lessons/${items[0].id}`).then(setGuidedLesson).catch((error: Error) => setMessage(error.message)); }).catch((error: Error) => setMessage(error.message)); }, []); + useEffect(() => { void api<{ index_id: string; items: RetrievalMaterial[] }>("/retrieval/materials").then((data) => { setRetrievalIndexId(data.index_id); setRetrievalMaterials(data.items); setRetrievalMaterialId(data.items.find((item) => item.category === "lexical")?.question_id || ""); }).catch((error: Error) => setMessage(error.message)); }, []); useEffect(() => () => { runAbort.current?.abort(); providerTestAbort.current?.abort(); }, []); const upload = async (event: ChangeEvent) => { @@ -117,7 +131,7 @@ export function App() { runAbort.current = controller; setRunning(kind); try { - const nextRun = await api(`/runs/${kind}`, { method: "POST", headers: { "Content-Type": "application/json" }, signal: controller.signal, body: JSON.stringify({ index_id: indexId, query: question || undefined, catalog_question_id: catalogQuestionId || undefined, retriever, top_k: topK, context_budget: contextBudget, provider: kind === "ask" ? { base_url: providerUrl || undefined, model: providerModel || undefined, api_key: providerKey || undefined } : undefined }) }); + const nextRun = await api(`/runs/${kind}`, { method: "POST", headers: { "Content-Type": "application/json" }, signal: controller.signal, body: JSON.stringify({ index_id: indexId, query: question || undefined, catalog_question_id: catalogQuestionId || undefined, retriever, top_k: topK, reranker, rerank_top_n: rerankTopN, context_budget: contextBudget, explain: reranker !== "none", provider: kind === "ask" ? { base_url: providerUrl || undefined, model: providerModel || undefined, api_key: providerKey || undefined } : undefined }) }); if (controller.signal.aborted || requestId !== runRequestId.current) return; setRun(nextRun); setActiveStage(kind === "ask" ? 5 : 3); setArea("explore"); } catch (error: any) { @@ -146,25 +160,60 @@ export function App() { } finally { if (requestId === providerTestRequestId.current) { providerTestAbort.current = null; setTestingProvider(false); } } }; const replayStarter = () => { if (guidedLessons[0]) void openLesson(guidedLessons[0].id); else setArea("learn"); }; + const chooseRetrievalModule = (next: RetrievalModule) => { + setRetrievalModule(next); setRetrievalRun(null); + if (["lexical", "dense", "hybrid", "reranking"].includes(next)) setRetrievalMaterialId(retrievalMaterials.find((item) => item.category === next)?.question_id || ""); + else setRetrievalMaterialId(""); + }; + const runRetrievalLesson = async () => { + if (retrievalRunning || !retrievalMaterialId) return; + setRetrievalRunning(true); + try { + const isReranking = retrievalModule === "reranking"; + const next = await api("/runs/retrieve", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ index_id: retrievalIndexId, retrieval_material_id: retrievalMaterialId, retriever: retrievalModule === "lexical" ? "bm25" : retrievalModule === "dense" ? "dense" : "hybrid", top_k: 5, reranker: isReranking ? "cross-encoder" : "none", rerank_top_n: isReranking ? 20 : 5, explain: true }) }); + setRetrievalRun(next); + } catch (error: any) { setMessage(error.message === "Download the default embedding model before dense or hybrid retrieval" ? t.modelDownloadRequired : error.message); } + finally { setRetrievalRunning(false); } + }; + const pollModelJob = async (jobId: string, kind: "embedding" | "reranker"): Promise => { + try { + const state = await api<{ status: string; error?: string }>(`/jobs/${jobId}`); + if (state.status === "complete") { + if (kind === "embedding") { setModelReady(true); setDownloadingModel(false); setMessage(t.modelReady); } + else { setRerankerReady(true); setDownloadingReranker(false); setMessage(t.rerankerReady); } + return; + } + if (state.status === "failed" || state.status === "cancelled") { + if (kind === "embedding") setDownloadingModel(false); else setDownloadingReranker(false); + setMessage(state.error || (kind === "embedding" ? "Embedding model download stopped." : "Reranker model download stopped.")); + return; + } + window.setTimeout(() => { void pollModelJob(jobId, kind); }, 700); + } catch (error: any) { + if (kind === "embedding") setDownloadingModel(false); else setDownloadingReranker(false); + setMessage(error.message); + } + }; const downloadModel = async () => { if (downloadingModel) return; try { const job = await api<{ id: string; status: string }>("/models/default/download", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({}) }); if (job.status === "complete") { setModelReady(true); setMessage(t.modelReady); return; } setDownloadingModel(true); setMessage(t.modelDownloading); - const poll = async (): Promise => { - try { - const state = await api<{ status: string; error?: string }>(`/jobs/${job.id}`); - if (state.status === "complete") { setModelReady(true); setDownloadingModel(false); setMessage(t.modelReady); return; } - if (state.status === "failed") { setDownloadingModel(false); setMessage(state.error || "Model download failed."); return; } - window.setTimeout(() => { void poll(); }, 700); - } catch (error: any) { setDownloadingModel(false); setMessage(error.message); } - }; - void poll(); + void pollModelJob(job.id, "embedding"); + } catch (error: any) { setMessage(error.message); } + }; + const downloadReranker = async () => { + if (downloadingReranker) return; + try { + const job = await api<{ id: string; status: string }>("/models/reranker/download", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({}) }); + if (job.status === "complete") { setRerankerReady(true); setMessage(t.rerankerReady); return; } + setDownloadingReranker(true); setMessage(t.rerankerDownloading); + void pollModelJob(job.id, "reranker"); } catch (error: any) { setMessage(error.message); } }; const navigation = useMemo>(() => [ - ["home", t.areas.home], ["learn", t.areas.learn], ["explore", t.areas.explore], ["build", t.areas.build], ["failure", t.areas.failure], ["settings", t.areas.settings], + ["home", t.areas.home], ["learn", t.areas.learn], ["retrieval", t.areas.retrieval], ["explore", t.areas.explore], ["build", t.areas.build], ["failure", t.areas.failure], ["settings", t.areas.settings], ], [t]); return
@@ -173,10 +222,11 @@ export function App() { {message &&

{message}

} {area === "home" && { setBuildView("build"); setArea("build"); }} t={t} />} {area === "learn" && void openLesson(id)} onStage={setActiveStage} onAdvance={(stage) => { if (guidedLesson) setLessonProgress((current) => ({ ...current, [guidedLesson.lesson.id]: Math.max(current[guidedLesson.lesson.id] ?? 0, stage) as Stage })); }} lang={lang} t={t} />} + {area === "retrieval" && { setRetrievalMaterialId(id); setRetrievalRun(null); }} onRun={() => void runRetrievalLesson()} t={t} />} {area === "build" && } - {area === "explore" && { setQuestion(value); setCatalogQuestionId(""); }} onCatalogQuestion={(id) => { setCatalogQuestionId(id); const found = catalogQuestions.find((item) => item.id === id); setQuestion(found?.question || ""); }} onRetriever={setRetriever} onTopK={setTopK} onContextBudget={setContextBudget} onStage={setActiveStage} onRun={execute} t={t} />} + {area === "explore" && item.category === "reranking")} retriever={retriever} topK={topK} reranker={reranker} rerankTopN={rerankTopN} rerankerReady={rerankerReady} contextBudget={contextBudget} run={run} activeStage={activeStage} lang={lang} running={running} testingProvider={testingProvider} providerReady={providerVerified} onIndex={setIndexId} onQuestion={(value) => { setQuestion(value); setCatalogQuestionId(""); }} onCatalogQuestion={(id) => { setCatalogQuestionId(id); const found = catalogQuestions.find((item) => item.id === id); setQuestion(found?.question || ""); }} onRetriever={setRetriever} onTopK={setTopK} onReranker={setReranker} onRerankTopN={setRerankTopN} onContextBudget={setContextBudget} onStage={setActiveStage} onRun={execute} t={t} />} {area === "failure" && } - {area === "settings" && { setProviderVerified(false); setProviderUrl(value); }} onProviderModel={(value) => { setProviderVerified(false); setProviderModel(value); }} onProviderKey={(value) => { setProviderVerified(false); setProviderKey(value); }} t={t} />} + {area === "settings" && { setProviderVerified(false); setProviderUrl(value); }} onProviderModel={(value) => { setProviderVerified(false); setProviderModel(value); }} onProviderKey={(value) => { setProviderVerified(false); setProviderKey(value); }} t={t} />}
; } diff --git a/web/src/styles.css b/web/src/styles.css index db1ea89..13aed22 100644 --- a/web/src/styles.css +++ b/web/src/styles.css @@ -50,6 +50,101 @@ nav button.active, .subnav button.active { color: #123d4d; background: #d7eeea; .lesson-rail button { display: grid; gap: .25rem; min-height: 86px; color: #39575e; text-align: left; } .lesson-rail button.active { border-color: #14726f; background: #e1f1ec; box-shadow: inset 0 -2px #14726f; } .lesson-rail small { color: #16827d; font-size: .68rem; font-weight: 800; letter-spacing: .1em; } +.retrieval-module-rail { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: .45rem; margin: 1.5rem 0; padding: 0; list-style: none; } +.retrieval-module-rail button { display: grid; align-content: start; gap: .28rem; width: 100%; min-height: 124px; padding: .8rem; text-align: left; } +.retrieval-module-rail button.active { border-color: #14726f; background: #e1f1ec; box-shadow: inset 0 -2px #14726f; } +.retrieval-module-rail small { color: #16827d; font-size: .65rem; font-weight: 800; letter-spacing: .1em; } +.retrieval-module-rail strong { color: #294d59; font-size: .83rem; } +.retrieval-module-rail span { color: #6a7d7e; font-size: .73rem; line-height: 1.4; } +.retrieval-workbench { margin-top: 1.25rem; padding: 1.2rem; border: 1px solid #d8ddd4; border-radius: .65rem; background: #fbfaf4; } +.retrieval-workbench > header h3 { margin: .35rem 0 0; font-family: ui-serif, Georgia, serif; font-size: 1.25rem; } +.retrieval-controls { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: end; gap: .85rem; margin-top: 1.2rem; } +.retrieval-controls select { width: 100%; } +.course-empty { margin: 1rem 0 0; padding: .8rem 1rem; } +.teaching-note { margin: 1rem 0; padding: .15rem 0 .15rem .85rem; border-left: 2px solid #9bbcb5; color: #5a7173; font-family: ui-serif, Georgia, serif; line-height: 1.55; } +.retrieval-result { margin-top: 1.4rem; padding-top: 1.2rem; border-top: 1px solid #d5ddd6; } +.evaluation-module { display: grid; gap: 1rem; margin-top: 1.2rem; } +.evaluation-preset { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: end; gap: 1rem; } +.evaluation-preset select, .evaluation-question-picker select { width: 100%; } +.evaluation-preset > span { padding: .65rem .8rem; border-radius: 999px; background: #edf3ef; color: #365c5c; font-size: .8rem; font-weight: 700; } +.evaluation-configs { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; } +.evaluation-config { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .8rem; margin: 0; padding: 1rem; border: 1px solid #ccd8d2; border-radius: .55rem; background: #fff; } +.evaluation-config legend { padding: 0 .35rem; color: #294d59; font-family: ui-serif, Georgia, serif; font-weight: 700; } +.evaluation-config label { min-width: 0; } +.evaluation-config select, .evaluation-config input { width: 100%; } +.evaluation-actions { display: flex; flex-wrap: wrap; gap: .65rem; } +.evaluation-progress { display: grid; gap: .55rem; padding: .85rem 1rem .95rem; border-left-width: 4px; } +.evaluation-progress-head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; } +.evaluation-progress-head > div { display: flex; align-items: center; gap: .5rem; } +.evaluation-progress-head > div > span { width: .55rem; height: .55rem; border-radius: 50%; background: currentColor; box-shadow: 0 0 0 4px #ffffff80; } +.evaluation-progress-head strong { font-size: .8rem; letter-spacing: .035em; text-transform: uppercase; } +.evaluation-progress-head output { min-width: 8.2rem; padding: .22rem .58rem; border: 1px solid #aac7c3; border-radius: 999px; background: #fffdf7b8; color: #315c60; font-size: .72rem; font-weight: 750; text-align: center; } +.evaluation-progress > p { margin: 0; color: inherit; font-size: .82rem; line-height: 1.45; } +.evaluation-progress-meter { height: .62rem; overflow: hidden; border: 1px solid #b8cbc6; border-radius: 999px; background: #dce8e4; box-shadow: inset 0 1px 2px #254b481c; } +.evaluation-progress-meter > span { display: block; width: 0; height: 100%; border-radius: inherit; background: linear-gradient(90deg, #14726f, #4fa59b); box-shadow: 0 0 8px #278f8466; transition: width 320ms ease; } +.evaluation-progress[data-status="complete"] .evaluation-progress-meter > span { background: linear-gradient(90deg, #2e795e, #63a982); } +.evaluation-progress[data-status="failed"] .evaluation-progress-meter > span { background: #b85b55; } +.evaluation-results { display: grid; gap: 1rem; padding-top: 1rem; border-top: 1px solid #d5ddd6; } +.evaluation-results > h3 { margin: 0; } +.metric-comparison { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: .7rem; } +.metric-comparison article { display: grid; gap: .4rem; padding: .85rem; border: 1px solid #d6ded8; border-radius: .5rem; background: #fff; } +.metric-comparison article > strong { color: #294d59; font-size: .78rem; } +.metric-comparison article > span { display: flex; justify-content: space-between; font-size: .82rem; } +.metric-comparison article > small { padding-top: .35rem; border-top: 1px solid #e5e9e5; color: #647575; } +.evaluation-question-picker { display: grid; gap: .35rem; } +.evaluation-question-head { padding: .85rem 1rem; border-left: 3px solid #d39a35; background: #fbf4e5; } +.evaluation-question-head span { color: #8a6425; font-size: .7rem; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; } +.evaluation-question-head h4 { margin: .3rem 0; } +.evaluation-question-head p { margin: 0; color: #6b6a60; font-size: .8rem; } +.evaluation-evidence > section { min-width: 0; } +.evaluation-evidence > section > h4 { margin: 0 0 .6rem; } +.question-metrics { display: flex; flex-wrap: wrap; gap: .35rem; margin-bottom: .7rem; } +.question-metrics span { padding: .25rem .45rem; border-radius: .3rem; background: #e9f1ee; color: #315b59; font-size: .72rem; font-weight: 700; } +.evaluation-evidence-list { display: grid; gap: .7rem; } +.settings-models { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; } +.settings-models .section-block { margin: 0; } +.model-setting { display: grid; align-content: start; gap: .55rem; } +.model-setting h3, .model-setting p { margin: 0; } +.model-role { color: #607576; font-size: .8rem; line-height: 1.5; } +.model-setting .model-name { overflow-wrap: anywhere; color: #294d59; } +.model-setting > code { color: #667877; font-size: .72rem; overflow-wrap: anywhere; } +.model-readiness { display: flex; align-items: center; min-height: 2.8em; padding-left: .7rem; border-left: 3px solid #d39a35; } +.model-readiness.ready { border-left-color: #16827d; } +.model-runtime-note { margin: .75rem 0 0; padding: .65rem .8rem; border-left: 2px solid #8cafaa; color: #5d7375; background: #f3f7f2; font-size: .82rem; } +.model-runtime-note + .section-block { margin-top: 1rem; } +.token-panel { margin-bottom: 1rem; padding: 1rem; border: 1px solid #d4dfd8; border-radius: .55rem; background: #f6faf6; } +.token-panel p { margin: .75rem 0 0; color: #657778; font-size: .8rem; } +.token-list { display: flex; flex-wrap: wrap; gap: .4rem; }.token-list code { padding: .25rem .45rem; border: 1px solid #bed4cf; border-radius: .3rem; background: #e8f3ef; color: #235c5a; } +.retrieval-candidates { display: grid; gap: 1rem; } +.explained-candidate { display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(320px, .85fr); gap: .8rem; padding: .8rem; border: 1px solid #d5ddd7; border-radius: .65rem; background: #fffefa; } +.explained-candidate > .evidence-card { border: 0; background: transparent; } +.calculation-panel { min-width: 0; padding: .85rem; border-left: 1px solid #d6dfd8; color: #506a6c; } +.calculation-panel h4 { color: #2c5a67; font-size: .82rem; } +.calculation-facts { display: flex; flex-wrap: wrap; gap: .45rem; margin-bottom: .7rem; } +.calculation-facts span { display: grid; gap: .15rem; padding: .4rem .5rem; background: #f0f5ef; font-size: .7rem; }.calculation-facts strong { color: #265463; font-size: .82rem; } +.bm25-formula { display: block; overflow-x: auto; margin-top: .7rem; padding: .55rem; background: #eaf2ed; color: #285966; font-size: .72rem; white-space: nowrap; } +.term-table-wrap { max-width: 100%; overflow-x: auto; } +.term-table { width: 100%; min-width: 580px; border-collapse: collapse; font-size: .68rem; }.term-table caption { padding-bottom: .35rem; color: #586f72; text-align: left; font-weight: 700; }.term-table th, .term-table td { padding: .38rem .4rem; border-bottom: 1px solid #e0e5df; text-align: right; }.term-table thead th { color: #637679; font-weight: 650; vertical-align: bottom; }.term-table th:first-child { text-align: left; }.term-table code { color: #236965; }.term-table strong { color: #1f5966; } +.vector-pair { display: grid; gap: .65rem; } +.reviewed-sources { display: flex; flex-wrap: wrap; gap: .35rem .65rem; margin: .8rem 0 1rem; color: #657778; font-size: .78rem; }.reviewed-sources strong { color: #315d62; }.reviewed-sources span { font-family: "SFMono-Regular", Consolas, monospace; overflow-wrap: anywhere; } +.concept-shift { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: center; gap: .8rem; margin: 1rem 0; }.concept-shift article { padding: .9rem; border: 1px solid #d4ddd7; border-radius: .55rem; background: #fffefa; }.concept-shift article > span { color: #188079; font-size: .65rem; font-weight: 800; letter-spacing: .1em; }.concept-shift article > strong { display: block; margin-top: .25rem; color: #28525e; }.concept-shift p { margin: .35rem 0 0; color: #647778; font-size: .82rem; line-height: 1.45; }.concept-shift > span { color: #4c908b; font-size: 1.5rem; } +.backend-continuity { margin: 0 0 1rem; padding: .75rem .85rem; border-left: 3px solid #5f9e98; background: #edf6f2; color: #4f696b; font-size: .82rem; line-height: 1.55; }.backend-continuity strong { color: #285b5d; } +.vector-db-state { display: grid; gap: .7rem; margin-top: 1rem; padding: 1rem; }.vector-db-state h4, .vector-db-state p { margin: 0; }.vector-db-state code { width: fit-content; padding: .45rem .6rem; background: #fffdf8; color: inherit; }.vector-db-state button { width: fit-content; } +.vector-db-facts { margin-top: 1rem; }.vector-db-facts code { font-size: .72rem; }.vector-db-maintenance { display: flex; align-items: center; justify-content: space-between; gap: .8rem; margin: -.65rem 0 1rem; padding: .65rem .75rem; border: 1px solid #d8dfd8; border-radius: .45rem; background: #f5f7f2; }.vector-db-maintenance p { margin: 0; color: #607476; font-size: .78rem; line-height: 1.45; }.vector-db-maintenance button { flex: none; }.vector-db-controls { grid-template-columns: minmax(0, 1fr) minmax(190px, .4fr) auto; }.parity-result { display: flex; align-items: center; justify-content: space-between; gap: .7rem; margin: 1rem 0; padding: .75rem .9rem; }.parity-result span { font-size: .75rem; }.vector-result-list { min-width: 0; padding: .8rem; border: 1px solid #d6ded8; border-radius: .55rem; background: #fffefa; }.vector-result-list > p { margin: -.25rem 0 .45rem; color: #687b7d; font-size: .72rem; line-height: 1.45; }.vector-result { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: start; gap: .55rem; padding: .65rem 0; border-bottom: 1px solid #e1e5df; }.vector-result:last-child { border-bottom: 0; }.vector-result small, .vector-result code { display: block; margin-top: .15rem; color: #6d7c7e; font-size: .65rem; overflow-wrap: anywhere; }.vector-result > b { color: #285d68; font-size: .75rem; }.vector-result .raw-artifact { grid-column: 2 / -1; margin-top: .25rem; }.filtered-results { margin-top: 1rem; padding-top: 1rem; border-top: 1px solid #d4ddd6; } +.rrf-intro { display: flex; align-items: center; gap: .7rem; margin: 1rem 0; padding: .75rem .9rem; }.rrf-intro span { font-size: .82rem; }.hybrid-source-lists { margin-top: 0; }.source-ranking { min-width: 0; padding: .85rem; border: 1px solid #d5ddd7; border-radius: .55rem; background: #fffefa; }.source-ranking ol { display: grid; gap: .35rem; margin: 0; padding: 0; list-style: none; }.source-ranking li { display: grid; grid-template-columns: 2.2rem minmax(0, 1fr) auto; gap: .45rem; padding: .38rem 0; border-bottom: 1px solid #e1e5df; font-size: .72rem; }.source-ranking code { overflow-wrap: anywhere; }.source-ranking b { color: #285d68; }.rrf-results { margin-top: 1.2rem; }.rrf-candidate { margin-bottom: .65rem; padding: .75rem; border: 1px solid #d5ddd7; border-radius: .55rem; background: #fffefa; }.rrf-candidate header { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: .6rem; align-items: start; }.rrf-candidate header code { display: block; margin-top: .15rem; color: #718083; font-size: .65rem; overflow-wrap: anywhere; }.rrf-contributions { display: flex; flex-wrap: wrap; gap: .45rem; margin: .65rem 0 0 2.7rem; }.rrf-contributions span { display: grid; gap: .1rem; min-width: 145px; padding: .4rem .5rem; border-left: 2px solid #7faeaa; background: #f2f7f2; font-size: .7rem; }.rrf-contributions span.missing { border-left-color: #bdc5c0; background: #f5f4ef; }.rrf-contributions small { color: #687b7d; }.rrf-contributions span.missing small, .rrf-contributions span.missing b { color: #7c8584; }.rrf-contributions b { color: #245c67; } +.rerank-flow { display: flex; align-items: center; justify-content: center; gap: .8rem; margin: 1rem 0; padding: .8rem; border: 1px solid #cddbd5; border-radius: .55rem; background: #f1f7f3; color: #315b65; }.rerank-flow span { color: #31827b; font-size: 1.25rem; }.rerank-table-wrap { overflow-x: auto; border: 1px solid #d5ddd7; border-radius: .55rem; }.rerank-table { width: 100%; border-collapse: collapse; background: #fffefa; font-size: .75rem; }.rerank-table caption { padding: .65rem .75rem; color: #315b65; text-align: left; font-weight: 750; }.rerank-table th, .rerank-table td { padding: .55rem .6rem; border-top: 1px solid #e0e5df; text-align: right; white-space: nowrap; }.rerank-table th:first-child { min-width: 220px; text-align: left; white-space: normal; }.rerank-table th code { display: block; margin-top: .15rem; color: #708083; font-size: .62rem; overflow-wrap: anywhere; }.rerank-table tr.dropped { background: #f5f3ed; color: #788183; }.movement { display: inline-block; padding: .2rem .35rem; border-radius: .3rem; background: #edf3ef; color: #466a69; }.movement.moved_up { background: #e5f3ea; color: #286243; }.movement.moved_down, .movement.dropped { background: #f7eee6; color: #765136; }.rerank-audit.compact { margin-bottom: 1rem; }.rerank-audit.compact .rerank-table tbody tr:nth-child(n+11) { display: none; } +.signed-vector > strong { display: block; margin-bottom: .3rem; color: #516c70; font-size: .7rem; } +.vector-reading-guide { margin: 0 0 .75rem; color: #5b7073; font-size: .74rem; line-height: 1.5; } +.signed-vector-chart { position: relative; display: grid; grid-template-columns: repeat(var(--component-count), minmax(0, 1fr)); grid-template-rows: 1fr; gap: .2rem; height: 124px; padding: 0 .35rem 0 1.6rem; border: 1px solid #d1dad5; border-radius: .35rem; background: linear-gradient(to bottom, #eef6f8 0 50%, #fbf0ed 50% 100%); overflow: hidden; } +.vector-zero-axis { position: absolute; z-index: 2; top: 50%; right: 0; left: 0; height: 0; border-top: 2px solid #49686c; } +.vector-zero-axis b { position: absolute; top: -.72rem; left: .35rem; padding: 0 .18rem; color: #294c55; background: transparent; font-size: .58rem; line-height: 1.2; } +.vector-component { position: relative; min-width: 0; height: 100%; } +.vector-component i { position: absolute; z-index: 1; left: 12%; width: 76%; height: var(--height); background: #397cab; } +.vector-component.positive i { bottom: 50%; } +.vector-component.negative i { top: 50%; background: #b6675c; } +.vector-component small { position: absolute; z-index: 3; left: 50%; padding: 0 .08rem; color: #294b55; background: transparent; font-size: .53rem; font-weight: 650; transform: translateX(-50%); white-space: nowrap; } +.vector-component.positive small { bottom: calc(50% + var(--height) + .15rem); } +.vector-component.negative small { top: calc(50% + var(--height) + .15rem); } .learn-view .lesson-intro h3 { margin-top: .45rem; font-family: ui-serif, Georgia, serif; font-size: 1.35rem; } .catalog-check { margin: 1rem 0; padding: .75rem .9rem; }.catalog-check dl { display: grid; gap: .35rem; margin: .65rem 0 0; font-size: .82rem; }.catalog-check dl div { display: grid; grid-template-columns: 82px 1fr; gap: .5rem; }.catalog-check dt { font-weight: 750; }.catalog-check dd { margin: 0; overflow-wrap: anywhere; } .primary-action { border-color: #146f6d; background: #146f6d; color: #fff; font-weight: 700; } @@ -162,6 +257,7 @@ select, input { min-width: 190px; padding: .72rem .8rem; } .config-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .5rem; margin: 0 0 1rem; } .raw-artifact { margin-top: 1.25rem; color: #476971; }.raw-artifact summary { cursor: pointer; font-size: .85rem; font-weight: 700; }.raw-artifact pre { overflow: auto; max-height: 320px; margin: .65rem 0 0; padding: .85rem; border: 1px solid #d2ddd7; background: #f2f5ef; color: #24414e; font-size: .78rem; line-height: 1.45; } .settings-fields { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: .85rem; margin-bottom: .9rem; }.settings-fields input { width: 100%; min-width: 0; } +.question-suggestion-hint { color: #687b7d; font-size: .76rem; font-weight: 500; line-height: 1.45; } .app-footer { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-top: 1.2rem; padding: 1.45rem .15rem .25rem; border-top: 1px solid #cbd4cf; color: #647577; font-size: .86rem; }.app-footer div { display: flex; flex-wrap: wrap; gap: .65rem; }.app-footer strong { color: #264958; }.footer-links { gap: 1rem !important; }.app-footer a { color: #156e78; font-weight: 700; text-decoration: none; }.app-footer a:hover { text-decoration: underline; } @@ -171,5 +267,6 @@ select, input { min-width: 190px; padding: .72rem .8rem; } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { scroll-behavior: auto !important; animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; } } .app-shell[data-motion="reduced"] *, .app-shell[data-motion="reduced"] *::before, .app-shell[data-motion="reduced"] *::after { scroll-behavior: auto !important; animation: none !important; transition: none !important; } -@media (max-width: 760px) { .app-shell { width: min(100% - 1.2rem, 1180px); padding-top: 1.3rem; }.app-header { align-items: flex-start; }.home-view, .build-layout, .comparison, .settings-fields, .corpus-source-choices { grid-template-columns: 1fr; }.corpus-source-or { min-height: 1.2rem; }.home-pipeline { justify-items: start; }.path-action { grid-template-columns: 1fr; gap: .45rem; }.fact-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }.chunk-grid { grid-template-columns: 1fr; }.lesson-rail { grid-template-columns: repeat(2, minmax(0, 1fr)); }.app-footer { align-items: flex-start; flex-direction: column; } } -@media (max-width: 480px) { .app-header { flex-direction: column; }.language-toggle { align-self: flex-end; margin-top: -2.4rem; }nav { gap: .1rem; }nav button { padding-inline: .65rem; }.view { min-height: 0; padding: 1.15rem; }.pipeline { gap: .35rem; }.pipeline-item { flex: 1 1 44%; }.pipeline-stage { width: 100%; min-width: 0; }.pipeline-arrow { display: none; }.control-row, .action-row { align-items: stretch; }.control-row label, .control-row input, .control-row select, .action-row button { width: 100%; }.fact-grid, .config-list { grid-template-columns: 1fr; }.evidence-card header { grid-template-columns: auto 1fr; }.evidence-state { grid-column: 2; max-width: none; text-align: left; }.score-details { width: 100%; margin-left: 0; } } +@media (max-width: 900px) { .retrieval-module-rail { grid-template-columns: repeat(3, minmax(0, 1fr)); }.explained-candidate { grid-template-columns: 1fr; }.calculation-panel { border-top: 1px solid #d6dfd8; border-left: 0; }.metric-comparison { grid-template-columns: repeat(2, minmax(0, 1fr)); } } +@media (max-width: 760px) { .app-shell { width: min(100% - 1.2rem, 1180px); padding-top: 1.3rem; }.app-header { align-items: flex-start; }.home-view, .build-layout, .comparison, .settings-fields, .settings-models, .corpus-source-choices, .retrieval-controls, .vector-db-controls, .evaluation-configs, .evaluation-preset { grid-template-columns: 1fr; }.vector-db-maintenance { align-items: stretch; flex-direction: column; }.vector-db-maintenance button { width: 100%; }.corpus-source-or { min-height: 1.2rem; }.home-pipeline { justify-items: start; }.path-action { grid-template-columns: 1fr; gap: .45rem; }.fact-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }.chunk-grid { grid-template-columns: 1fr; }.lesson-rail { grid-template-columns: repeat(2, minmax(0, 1fr)); }.app-footer { align-items: flex-start; flex-direction: column; } } +@media (max-width: 480px) { .app-header { flex-direction: column; }.language-toggle { align-self: flex-end; margin-top: -2.4rem; }nav { gap: .1rem; }nav button { padding-inline: .65rem; }.view { min-height: 0; padding: 1.15rem; }.pipeline { gap: .35rem; }.pipeline-item { flex: 1 1 44%; }.pipeline-stage { width: 100%; min-width: 0; }.pipeline-arrow { display: none; }.control-row, .action-row { align-items: stretch; }.control-row label, .control-row input, .control-row select, .action-row button { width: 100%; }.fact-grid, .config-list { grid-template-columns: 1fr; }.evidence-card header { grid-template-columns: auto 1fr; }.evidence-state { grid-column: 2; max-width: none; text-align: left; }.score-details { width: 100%; margin-left: 0; }.retrieval-module-rail { grid-template-columns: repeat(2, minmax(0, 1fr)); }.concept-shift { grid-template-columns: 1fr; }.concept-shift > span { justify-self: center; transform: rotate(90deg); } } diff --git a/web/src/types.ts b/web/src/types.ts index 1122f81..ca5e3b5 100644 --- a/web/src/types.ts +++ b/web/src/types.ts @@ -1,7 +1,8 @@ export type Lang = "en" | "zh"; -export type Area = "home" | "learn" | "build" | "explore" | "failure" | "settings"; +export type Area = "home" | "learn" | "retrieval" | "build" | "explore" | "failure" | "settings"; export type BuildView = "build" | "inspect"; export type Stage = 0 | 1 | 2 | 3 | 4 | 5; +export type RetrievalModule = "lexical" | "dense" | "vector-db" | "hybrid" | "reranking" | "evaluation"; export type Corpus = { id: string; name: string; kind: string; file_count: number }; export type BackendAvailability = { id: "numpy" | "qdrant"; available: boolean }; @@ -21,6 +22,8 @@ export type Evidence = { export type LabRun = { trace: Record; evidence: Evidence[]; + candidates?: Evidence[] | null; + explanations?: Record | null; index: { index_id?: string; manifest: Record; document_count?: number; chunk_count?: number }; query_vector?: number[] | null; run_id: string; @@ -30,6 +33,14 @@ export type LabRun = { catalog_check?: { question_id: string; expected_document_ids: string[]; retrieved_document_ids: string[]; hit: boolean } | null; source_snapshot?: Record | null; }; +export type RetrievalMaterial = { + question_id: string; + category: "lexical" | "dense" | "hybrid" | "reranking"; + question: string; + gold_doc_ids: string[]; + teaching_note?: { en: string; zh: string }; + expected_observation?: { en: string; zh: string }; +}; export type GuidedLessonSummary = { id: string; package_id: string; order: number; title: string; question: string; focus: string }; export type GuidedLesson = { lesson: GuidedLessonSummary & { answer_provenance: string; source_snapshot: Record }; run: LabRun }; export type CatalogQuestion = { id: string; question: string; featured: boolean }; diff --git a/website/index.html b/website/index.html index 7cea9e4..a5b942d 100644 --- a/website/index.html +++ b/website/index.html @@ -4,7 +4,7 @@ tiny-rag-lab — An Inspectable Classic RAG Learning Lab - + @@ -13,11 +13,11 @@ - + - + @@ -53,7 +53,7 @@

A LEARNING-FIRST RAG LAB

tiny-rag-lab

See classic RAG actually run — real documents, real retrieval, real citations.

-

RAG is the backbone of most AI assistants and agents today. Most tutorials hide it behind a framework call — this one builds it by hand, so you understand it completely before you reach for agentic RAG.

+

Most tutorials hide retrieval behind a framework call. This lab keeps the calculations, candidate movement, evidence, and generation boundary visible so you can reason about each result.

Run the local lab ↓ View source on GitHub @@ -105,7 +105,7 @@

Learn the mechanic

START HERE

Visual workspace

-

Replay real-corpus lessons, inspect every decision, and run your own retrieval, index, and provider experiments.

+

Replay real-corpus lessons, follow a live retrieval course, and run your own index, reranking, evaluation, and provider experiments.

Explore the learning workspace →
@@ -125,8 +125,8 @@

Direct CLI

Local Learning Entrypoints

- 3 - Retrieval Strategies + 6 + Interactive Retrieval Modules
3 @@ -137,7 +137,7 @@

Direct CLI

Real evidence, not a toy demo

-

Four guided lessons replay real retrieval over 40 real Cloudflare docs — not a synthetic one-file example.

+

Four guided replays and six live retrieval modules use 40 real Cloudflare docs — not a synthetic one-file example.

One core, two ways in

@@ -281,7 +281,7 @@

The artifacts are the lesso

A rich local workspace for learning RAG

-

Learn through real documents: start with four guided replays, inspect every artifact, then run retrieval experiments of your own.

+

Learn through real documents: start with guided replays, inspect retrieval math live, then run experiments of your own.

@@ -290,13 +290,13 @@

Start with a replay

-

Inspect the mechanics

-

Examine chunks, embedding components, ranked evidence, context packing, prompts, citations, and stage timings.

+

Make retrieval visible

+

Follow six live modules through BM25 math, cosine similarity, NumPy and Qdrant, hybrid fusion, reranking, and evaluation.

Learn from comparisons

-

Start with bundled Cloudflare lessons, then build watsonxDocsQA or a small upload, compare NumPy with optional Qdrant, and study curated failures.

+

Compare two retrieval configurations over 16 reviewed questions, inspect every result, then carry reranking into free-form Explore.