diff --git a/.gitignore b/.gitignore index 01a4098..f914a3c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.pyc -data/* \ No newline at end of file +data/* +*.log diff --git a/Dockerfile b/Dockerfile index e0523a2..80f9d26 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.9-slim as base +FROM python:3.10-slim as base # Setup env ENV LANG C.UTF-8 diff --git a/Pipfile b/Pipfile index 348a614..939b1e0 100644 --- a/Pipfile +++ b/Pipfile @@ -15,4 +15,4 @@ nbconvert = "*" [dev-packages] [requires] -python_version = "3.9" +python_version = "3.10" diff --git a/Pipfile.lock b/Pipfile.lock index 48c9c34..52cd986 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "a13ec867d74bd7728ac100e6be1358b74285ef7f14780710f23111b5dd6062bf" + "sha256": "ea1904553bf293473d66bde1e9b73a823f8a6761f05eba4c5e84e61c813fa414" }, "pipfile-spec": 6, "requires": { - "python_version": "3.9" + "python_version": "3.10" }, "sources": [ { @@ -95,7 +95,6 @@ "sha256:feeb18a801aacb098220e2c3eea59a512362eb408d4afd0c242044c33ad6d542", "sha256:ff30218887e62209942f91ac1be902cc80cddb86bf00fbc6783b7a43b2bea26f" ], - "markers": "python_version >= '3.8'", "version": "==3.9.3" }, "aiosignal": { @@ -159,7 +158,7 @@ "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8" ], - "markers": "python_version >= '3.7'", + "markers": "python_version >= '3.7' and python_version < '4.0'", "version": "==2.2.1" }, "bcrypt": { @@ -449,11 +448,11 @@ }, "fastapi": { "hashes": [ - "sha256:2c9bab24667293b501cad8dd388c05240c850b58ec5876ee3283c47d6e1e3a4d", - "sha256:f3817eac96fe4f65a2ebb4baa000f394e55f5fccdaf7f75250804bc58f354f73" + "sha256:266775f0dcc95af9d3ef39bad55cff525329a931d5fd51930aadd4f428bf7ff3", + "sha256:87a1f6fb632a218222c5984be540055346a8f5d8a68e8f6fb647b1dc9934de4b" ], "markers": "python_version >= '3.8'", - "version": "==0.109.2" + "version": "==0.110.0" }, "fastjsonschema": { "hashes": [ @@ -821,16 +820,16 @@ "sha256:1231cf92d825c9e03cfc4da076a16de6422c863558229ea0b22b675657463443", "sha256:f0afba6205ad8f8947c7d338b5342d5db2afbfd82f9cbef7879a9539cc12eb9b" ], - "markers": "python_version < '3.10'", + "markers": "python_version >= '3.8'", "version": "==6.11.0" }, "importlib-resources": { "hashes": [ - "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a", - "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6" + "sha256:308abf8474e2dba5f867d279237cd4076482c3de7104a40b41426370e891549b", + "sha256:9a0a862501dc38b68adebc82970140c9e4209fc99601782925178f8386339938" ], "markers": "python_version >= '3.8'", - "version": "==6.1.1" + "version": "==6.1.2" }, "jinja2": { "hashes": [ @@ -1548,33 +1547,33 @@ }, "onnxruntime": { "hashes": [ - "sha256:16d26badd092c8c257fa57c458bb600d96dc15282c647ccad0ed7b2732e6c03b", - "sha256:1ec485643b93e0a3896c655eb2426decd63e18a278bb7ccebc133b340723624f", - "sha256:461fa0fc7d9c392c352b6cccdedf44d818430f3d6eacd924bb804fdea2dcfd02", - "sha256:4b038324586bc905299e435f7c00007e6242389c856b82fe9357fdc3b1ef2bdc", - "sha256:5632077c3ab8b0cd4f74b0af9c4e924be012b1a7bcd7daa845763c6c6bf14b7d", - "sha256:5a06ab84eaa350bf64b1d747b33ccf10da64221ed1f38f7287f15eccbec81603", - "sha256:5d3d11db2c8242766212a68d0b139745157da7ce53bd96ba349a5c65e5a02357", - "sha256:61a12732cba869b3ad2d4e29ab6cb62c7a96f61b8c213f7fcb961ba412b70b37", - "sha256:6f1273bebcdb47ed932d076c85eb9488bc4768fcea16d5f2747ca692fad4f9d3", - "sha256:7466724e809a40e986b1637cba156ad9fc0d1952468bc00f79ef340bc0199552", - "sha256:83c35809cda898c5a11911c69ceac8a2ac3925911854c526f73bad884582f911", - "sha256:90c0890e36f880281c6c698d9bc3de2afbeee2f76512725ec043665c25c67d21", - "sha256:93d39b3fa1ee01f034f098e1c7769a811a21365b4883f05f96c14a2b60c6028b", - "sha256:ac2f286da3494b29b4186ca193c7d4e6a2c1f770c4184c7192c5da142c3dec28", - "sha256:b4c87d83c6f58d1af2675fc99e3dc810f2dbdb844bcefd0c1b7573632661f6fc", - "sha256:b7b337cd0586f7836601623cbd30a443df9528ef23965860d11c753ceeb009f2", - "sha256:bb1bf1ee575c665b8bbc3813ab906e091a645a24ccc210be7932154b8260eca1", - "sha256:cb60fd3c2c1acd684752eb9680e89ae223e9801a9b0e0dc7b28adabe45a2e380", - "sha256:d2b22a25a94109cc983443116da8d9805ced0256eb215c5e6bc6dcbabefeab96", - "sha256:d47bee7557a8b99c8681b6882657a515a4199778d6d5e24e924d2aafcef55b0a", - "sha256:dba55723bf9b835e358f48c98a814b41692c393eb11f51e02ece0625c756b797", - "sha256:ee48422349cc500273beea7607e33c2237909f58468ae1d6cccfc4aecd158565", - "sha256:f34cc46553359293854e38bdae2ab1be59543aad78a6317e7746d30e311110c3", - "sha256:fa464aa4d81df818375239e481887b656e261377d5b6b9a4692466f5f3261edc", - "sha256:fbb9faaf51d01aa2c147ef52524d9326744c852116d8005b9041809a71838878" - ], - "version": "==1.17.0" + "sha256:2dff1a24354220ac30e4a4ce2fb1df38cb1ea59f7dac2c116238d63fe7f4c5ff", + "sha256:36fd6f87a1ecad87e9c652e42407a50fb305374f9a31d71293eb231caae18784", + "sha256:40f08e378e0f85929712a2b2c9b9a9cc400a90c8a8ca741d1d92c00abec60843", + "sha256:45c6a384e9d9a29c78afff62032a46a993c477b280247a7e335df09372aedbe9", + "sha256:4e19f966450f16863a1d6182a685ca33ae04d7772a76132303852d05b95411ea", + "sha256:53e4e06c0a541696ebdf96085fd9390304b7b04b748a19e02cf3b35c869a1e76", + "sha256:55b5e92a4c76a23981c998078b9bf6145e4fb0b016321a8274b1607bd3c6bd35", + "sha256:5e3716b5eec9092e29a8d17aab55e737480487deabfca7eac3cd3ed952b6ada9", + "sha256:606a7cbfb6680202b0e4f1890881041ffc3ac6e41760a25763bd9fe146f0b335", + "sha256:617ebdf49184efa1ba6e4467e602fbfa029ed52c92f13ce3c9f417d303006381", + "sha256:6226a5201ab8cafb15e12e72ff2a4fc8f50654e8fa5737c6f0bd57c5ff66827e", + "sha256:7a9539935fb2d78ebf2cf2693cad02d9930b0fb23cdd5cf37a7df813e977674d", + "sha256:835d38fa1064841679433b1aa8138b5e1218ddf0cfa7a3ae0d056d8fd9cec713", + "sha256:96621e0c555c2453bf607606d08af3f70fbf6f315230c28ddea91754e17ad4e6", + "sha256:99a8bddeb538edabc524d468edb60ad4722cff8a49d66f4e280c39eace70500b", + "sha256:9dae9071e3facdf2920769dceee03b71c684b6439021defa45b830d05e148924", + "sha256:ac79da6d3e1bb4590f1dad4bb3c2979d7228555f92bb39820889af8b8e6bd472", + "sha256:ae9ba47dc099004e3781f2d0814ad710a13c868c739ab086fc697524061695ea", + "sha256:cd0c07c0d1dfb8629e820b05fda5739e4835b3b82faf43753d2998edf2cf00aa", + "sha256:d43ac17ac4fa3c9096ad3c0e5255bb41fd134560212dc124e7f52c3159af5d21", + "sha256:e2ae712d64a42aac29ed7a40a426cb1e624a08cfe9273dcfe681614aa65b07dc", + "sha256:ebbcd2bc3a066cf54e6f18c75708eb4d309ef42be54606d22e5bdd78afc5b0d7", + "sha256:f7e9f7fb049825cdddf4a923cfc7c649d84d63c0134315f8e0aa9e0c3004672c", + "sha256:fbb98cced6782ae1bb799cc74ddcbbeeae8819f3ad1d942a74d88e72b6511337", + "sha256:fd7fddb4311deb5a7d3390cd8e9b3912d4d963efbe4dfe075edbaf18d01c024e" + ], + "version": "==1.17.1" }, "openai": { "hashes": [ @@ -1586,139 +1585,139 @@ }, "opentelemetry-api": { "hashes": [ - "sha256:15ae4ca925ecf9cfdfb7a709250846fbb08072260fca08ade78056c502b86bed", - "sha256:43621514301a7e9f5d06dd8013a1b450f30c2e9372b8e30aaeb4562abf2ce034" + "sha256:14a766548c8dd2eb4dfc349739eb4c3893712a0daa996e5dbf945f9da665da9d", + "sha256:cc03ea4025353048aadb9c64919099663664672ea1c6be6ddd8fee8e4cd5e774" ], - "markers": "python_version >= '3.7'", - "version": "==1.22.0" + "markers": "python_version >= '3.8'", + "version": "==1.23.0" }, "opentelemetry-exporter-otlp-proto-common": { "hashes": [ - "sha256:3f2538bec5312587f8676c332b3747f54c89fe6364803a807e217af4603201fa", - "sha256:71ae2f81bc6d6fe408d06388826edc8933759b2ca3a97d24054507dc7cfce52d" + "sha256:2a9e7e9d5a8b026b572684b6b24dcdefcaa58613d5ce3d644130b0c373c056c1", + "sha256:35e4ea909e7a0b24235bd0aaf17fba49676527feb1823b46565ff246d5a1ab18" ], - "markers": "python_version >= '3.7'", - "version": "==1.22.0" + "markers": "python_version >= '3.8'", + "version": "==1.23.0" }, "opentelemetry-exporter-otlp-proto-grpc": { "hashes": [ - "sha256:1e0e5aa4bbabc74942f06f268deffd94851d12a8dc30b02527472ef1729fe5b1", - "sha256:b5bcadc129272004316a455e9081216d3380c1fc2231a928ea6a70aa90e173fb" + "sha256:40f9e3e7761eb34f2a1001f4543028783ac26e2db27e420d5374f2cca0182dad", + "sha256:aa1a012eea5342bfef51fcf3f7f22601dcb0f0984a07ffe6025b2fbb6d91a2a9" ], - "markers": "python_version >= '3.7'", - "version": "==1.22.0" + "markers": "python_version >= '3.8'", + "version": "==1.23.0" }, "opentelemetry-instrumentation": { "hashes": [ - "sha256:0ff1334d7e359e27640e9d420024efeb73eacae464309c2e14ede7ba6c93967e", - "sha256:c3755da6c4be8033be0216d0501e11f4832690f4e2eca5a3576fbf113498f0f6" + "sha256:79560f386425176bcc60c59190064597096114c4a8e5154f1cb281bb4e47d2fc", + "sha256:8213d02d8c0987b9b26386ae3e091e0477d6331673123df736479322e1a50b48" ], - "markers": "python_version >= '3.7'", - "version": "==0.43b0" + "markers": "python_version >= '3.8'", + "version": "==0.44b0" }, "opentelemetry-instrumentation-asgi": { "hashes": [ - "sha256:1f593829fa039e9367820736fb063e92acd15c25b53d7bcb5d319971b8e93fd7", - "sha256:3f6f19333dca31ef696672e4e36cb1c2613c71dc7e847c11ff36a37e1130dadc" + "sha256:0d95c84a8991008c8a8ac35e15d43cc7768a5bb46f95f129e802ad2990d7c366", + "sha256:72d4d28ec7ccd551eac11edc5ae8cac3586c0a228467d6a95fad7b6d4edd597a" ], - "markers": "python_version >= '3.7'", - "version": "==0.43b0" + "markers": "python_version >= '3.8'", + "version": "==0.44b0" }, "opentelemetry-instrumentation-fastapi": { "hashes": [ - "sha256:2afaaf470622e1a2732182c68f6d2431ffe5e026a7edacd0f83605632b66347f", - "sha256:b79c044df68a52e07b35fa12a424e7cc0dd27ff0a171c5fdcc41dea9de8fc938" + "sha256:4441482944bea6676816668d56deb94af990e8c6e9582c581047e5d84c91d3c9", + "sha256:67ed10b93ad9d35238ae0be73cf8acbbb65a4a61fb7444d0aee5b0c492e294db" ], - "markers": "python_version >= '3.7'", - "version": "==0.43b0" + "markers": "python_version >= '3.8'", + "version": "==0.44b0" }, "opentelemetry-proto": { "hashes": [ - "sha256:9ec29169286029f17ca34ec1f3455802ffb90131642d2f545ece9a63e8f69003", - "sha256:ce7188d22c75b6d0fe53e7fb58501613d0feade5139538e79dedd9420610fa0c" + "sha256:4c017deca052cb287a6003b7c989ed8b47af65baeb5d57ebf93dde0793f78509", + "sha256:e6aaf8b7ace8d021942d546161401b83eed90f9f2cc6f13275008cea730e4651" ], - "markers": "python_version >= '3.7'", - "version": "==1.22.0" + "markers": "python_version >= '3.8'", + "version": "==1.23.0" }, "opentelemetry-sdk": { "hashes": [ - "sha256:45267ac1f38a431fc2eb5d6e0c0d83afc0b78de57ac345488aa58c28c17991d0", - "sha256:a730555713d7c8931657612a88a141e3a4fe6eb5523d9e2d5a8b1e673d76efa6" + "sha256:9ddf60195837b59e72fd2033d6a47e2b59a0f74f0ec37d89387d89e3da8cab7f", + "sha256:a93c96990ac0f07c6d679e2f1015864ff7a4f5587122dd5af968034436efb1fd" ], - "markers": "python_version >= '3.7'", - "version": "==1.22.0" + "markers": "python_version >= '3.8'", + "version": "==1.23.0" }, "opentelemetry-semantic-conventions": { "hashes": [ - "sha256:291284d7c1bf15fdaddf309b3bd6d3b7ce12a253cec6d27144439819a15d8445", - "sha256:b9576fb890df479626fa624e88dde42d3d60b8b6c8ae1152ad157a8b97358635" + "sha256:2e997cb28cd4ca81a25a9a43365f593d0c2b76be0685015349a89abdf1aa4ffa", + "sha256:7c434546c9cbd797ab980cc88bf9ff3f4a5a28f941117cad21694e43d5d92019" ], - "markers": "python_version >= '3.7'", - "version": "==0.43b0" + "markers": "python_version >= '3.8'", + "version": "==0.44b0" }, "opentelemetry-util-http": { "hashes": [ - "sha256:3ff6ab361dbe99fc81200d625603c0fb890c055c6e416a3e6d661ddf47a6c7f7", - "sha256:f25a820784b030f6cb86b3d76e5676c769b75ed3f55a210bcdae0a5e175ebadb" + "sha256:75896dffcbbeb5df5429ad4526e22307fc041a27114e0c5bfd90bb219381e68f", + "sha256:ff018ab6a2fa349537ff21adcef99a294248b599be53843c44f367aef6bccea5" ], - "markers": "python_version >= '3.7'", - "version": "==0.43b0" + "markers": "python_version >= '3.8'", + "version": "==0.44b0" }, "orjson": { "hashes": [ - "sha256:0572f174f50b673b7df78680fb52cd0087a8585a6d06d295a5f790568e1064c6", - "sha256:06fb40f8e49088ecaa02f1162581d39e2cf3fd9dbbfe411eb2284147c99bad79", - "sha256:08e722a8d06b13b67a51f247a24938d1a94b4b3862e40e0eef3b2e98c99cd04c", - "sha256:135d518f73787ce323b1a5e21fb854fe22258d7a8ae562b81a49d6c7f826f2a3", - "sha256:19cdea0664aec0b7f385be84986d4defd3334e9c3c799407686ee1c26f7b8251", - "sha256:1f7b6f3ef10ae8e3558abb729873d033dbb5843507c66b1c0767e32502ba96bb", - "sha256:20837e10835c98973673406d6798e10f821e7744520633811a5a3d809762d8cc", - "sha256:236230433a9a4968ab895140514c308fdf9f607cb8bee178a04372b771123860", - "sha256:23d1528db3c7554f9d6eeb09df23cb80dd5177ec56eeb55cc5318826928de506", - "sha256:26280a7fcb62d8257f634c16acebc3bec626454f9ab13558bbf7883b9140760e", - "sha256:29512eb925b620e5da2fd7585814485c67cc6ba4fe739a0a700c50467a8a8065", - "sha256:2eefc41ba42e75ed88bc396d8fe997beb20477f3e7efa000cd7a47eda452fbb2", - "sha256:3014ccbda9be0b1b5f8ea895121df7e6524496b3908f4397ff02e923bcd8f6dd", - "sha256:449bf090b2aa4e019371d7511a6ea8a5a248139205c27d1834bb4b1e3c44d936", - "sha256:4dc1c132259b38d12c6587d190cd09cd76e3b5273ce71fe1372437b4cbc65f6f", - "sha256:58b36f54da759602d8e2f7dad958752d453dfe2c7122767bc7f765e17dc59959", - "sha256:5bf597530544db27a8d76aced49cfc817ee9503e0a4ebf0109cd70331e7bbe0c", - "sha256:6f39a10408478f4c05736a74da63727a1ae0e83e3533d07b19443400fe8591ca", - "sha256:6f52ac2eb49e99e7373f62e2a68428c6946cda52ce89aa8fe9f890c7278e2d3a", - "sha256:7183cc68ee2113b19b0b8714221e5e3b07b3ba10ca2bb108d78fd49cefaae101", - "sha256:751250a31fef2bac05a2da2449aae7142075ea26139271f169af60456d8ad27a", - "sha256:75fc593cf836f631153d0e21beaeb8d26e144445c73645889335c2247fcd71a0", - "sha256:7913079b029e1b3501854c9a78ad938ed40d61fe09bebab3c93e60ff1301b189", - "sha256:793f6c9448ab6eb7d4974b4dde3f230345c08ca6c7995330fbceeb43a5c8aa5e", - "sha256:814f288c011efdf8f115c5ebcc1ab94b11da64b207722917e0ceb42f52ef30a3", - "sha256:90903d2908158a2c9077a06f11e27545de610af690fb178fd3ba6b32492d4d1c", - "sha256:917311d6a64d1c327c0dfda1e41f3966a7fb72b11ca7aa2e7a68fcccc7db35d9", - "sha256:95c03137b0cf66517c8baa65770507a756d3a89489d8ecf864ea92348e1beabe", - "sha256:978f416bbff9da8d2091e3cf011c92da68b13f2c453dcc2e8109099b2a19d234", - "sha256:9a1af21160a38ee8be3f4fcf24ee4b99e6184cadc7f915d599f073f478a94d2c", - "sha256:a2591faa0c031cf3f57e5bce1461cfbd6160f3f66b5a72609a130924917cb07d", - "sha256:a603161318ff699784943e71f53899983b7dee571b4dd07c336437c9c5a272b0", - "sha256:a6bc7928d161840096adc956703494b5c0193ede887346f028216cac0af87500", - "sha256:a88cafb100af68af3b9b29b5ccd09fdf7a48c63327916c8c923a94c336d38dd3", - "sha256:ab90c02cb264250b8a58cedcc72ed78a4a257d956c8d3c8bebe9751b818dfad8", - "sha256:abcda41ecdc950399c05eff761c3de91485d9a70d8227cb599ad3a66afe93bcc", - "sha256:ac0c7eae7ad3a223bde690565442f8a3d620056bd01196f191af8be58a5248e1", - "sha256:ac650d49366fa41fe702e054cb560171a8634e2865537e91f09a8d05ea5b1d37", - "sha256:b7c11667421df2d8b18b021223505dcc3ee51be518d54e4dc49161ac88ac2b87", - "sha256:ba3518b999f88882ade6686f1b71e207b52e23546e180499be5bbb63a2f9c6e6", - "sha256:c19009ff37f033c70acd04b636380379499dac2cba27ae7dfc24f304deabbc81", - "sha256:ce6f095eef0026eae76fc212f20f786011ecf482fc7df2f4c272a8ae6dd7b1ef", - "sha256:d2cf1d0557c61c75e18cf7d69fb689b77896e95553e212c0cc64cf2087944b84", - "sha256:d450a8e0656efb5d0fcb062157b918ab02dcca73278975b4ee9ea49e2fcf5bd5", - "sha256:df3266d54246cb56b8bb17fa908660d2a0f2e3f63fbc32451ffc1b1505051d07", - "sha256:df76ecd17b1b3627bddfd689faaf206380a1a38cc9f6c4075bd884eaedcf46c2", - "sha256:e2450d87dd7b4f277f4c5598faa8b49a0c197b91186c47a2c0b88e15531e4e3e", - "sha256:ea890e6dc1711aeec0a33b8520e395c2f3d59ead5b4351a788e06bf95fc7ba81", - "sha256:f75823cc1674a840a151e999a7dfa0d86c911150dd6f951d0736ee9d383bf415", - "sha256:fca33fdd0b38839b01912c57546d4f412ba7bfa0faf9bf7453432219aec2df07" + "sha256:001f4eb0ecd8e9ebd295722d0cbedf0748680fb9998d3993abaed2f40587257a", + "sha256:05a1f57fb601c426635fcae9ddbe90dfc1ed42245eb4c75e4960440cac667262", + "sha256:10c57bc7b946cf2efa67ac55766e41764b66d40cbd9489041e637c1304400494", + "sha256:12365576039b1a5a47df01aadb353b68223da413e2e7f98c02403061aad34bde", + "sha256:2973474811db7b35c30248d1129c64fd2bdf40d57d84beed2a9a379a6f57d0ab", + "sha256:2b5c0f532905e60cf22a511120e3719b85d9c25d0e1c2a8abb20c4dede3b05a5", + "sha256:2c51378d4a8255b2e7c1e5cc430644f0939539deddfa77f6fac7b56a9784160a", + "sha256:2d99e3c4c13a7b0fb3792cc04c2829c9db07838fb6973e578b85c1745e7d0ce7", + "sha256:2f256d03957075fcb5923410058982aea85455d035607486ccb847f095442bda", + "sha256:34cbcd216e7af5270f2ffa63a963346845eb71e174ea530867b7443892d77180", + "sha256:4228aace81781cc9d05a3ec3a6d2673a1ad0d8725b4e915f1089803e9efd2b99", + "sha256:4feeb41882e8aa17634b589533baafdceb387e01e117b1ec65534ec724023d04", + "sha256:57d5d8cf9c27f7ef6bc56a5925c7fbc76b61288ab674eb352c26ac780caa5b10", + "sha256:5bb399e1b49db120653a31463b4a7b27cf2fbfe60469546baf681d1b39f4edf2", + "sha256:62482873e0289cf7313461009bf62ac8b2e54bc6f00c6fabcde785709231a5d7", + "sha256:67384f588f7f8daf040114337d34a5188346e3fae6c38b6a19a2fe8c663a2f9b", + "sha256:6ae4e06be04dc00618247c4ae3f7c3e561d5bc19ab6941427f6d3722a0875ef7", + "sha256:6f7b65bfaf69493c73423ce9db66cfe9138b2f9ef62897486417a8fcb0a92bfe", + "sha256:6fc2fe4647927070df3d93f561d7e588a38865ea0040027662e3e541d592811e", + "sha256:71c6b009d431b3839d7c14c3af86788b3cfac41e969e3e1c22f8a6ea13139404", + "sha256:7413070a3e927e4207d00bd65f42d1b780fb0d32d7b1d951f6dc6ade318e1b5a", + "sha256:76bc6356d07c1d9f4b782813094d0caf1703b729d876ab6a676f3aaa9a47e37c", + "sha256:7f6cbd8e6e446fb7e4ed5bac4661a29e43f38aeecbf60c4b900b825a353276a1", + "sha256:8055ec598605b0077e29652ccfe9372247474375e0e3f5775c91d9434e12d6b1", + "sha256:809d653c155e2cc4fd39ad69c08fdff7f4016c355ae4b88905219d3579e31eb7", + "sha256:82425dd5c7bd3adfe4e94c78e27e2fa02971750c2b7ffba648b0f5d5cc016a73", + "sha256:87f1097acb569dde17f246faa268759a71a2cb8c96dd392cd25c668b104cad2f", + "sha256:920fa5a0c5175ab14b9c78f6f820b75804fb4984423ee4c4f1e6d748f8b22bc1", + "sha256:92255879280ef9c3c0bcb327c5a1b8ed694c290d61a6a532458264f887f052cb", + "sha256:946c3a1ef25338e78107fba746f299f926db408d34553b4754e90a7de1d44068", + "sha256:95cae920959d772f30ab36d3b25f83bb0f3be671e986c72ce22f8fa700dae061", + "sha256:9cf1596680ac1f01839dba32d496136bdd5d8ffb858c280fa82bbfeb173bdd40", + "sha256:9fe41b6f72f52d3da4db524c8653e46243c8c92df826ab5ffaece2dba9cccd58", + "sha256:b17f0f14a9c0ba55ff6279a922d1932e24b13fc218a3e968ecdbf791b3682b25", + "sha256:b3d336ed75d17c7b1af233a6561cf421dee41d9204aa3cfcc6c9c65cd5bb69a8", + "sha256:b66bcc5670e8a6b78f0313bcb74774c8291f6f8aeef10fe70e910b8040f3ab75", + "sha256:b725da33e6e58e4a5d27958568484aa766e825e93aa20c26c91168be58e08cbb", + "sha256:b72758f3ffc36ca566ba98a8e7f4f373b6c17c646ff8ad9b21ad10c29186f00d", + "sha256:bcef128f970bb63ecf9a65f7beafd9b55e3aaf0efc271a4154050fc15cdb386e", + "sha256:c8e8fe01e435005d4421f183038fc70ca85d2c1e490f51fb972db92af6e047c2", + "sha256:d61f7ce4727a9fa7680cd6f3986b0e2c732639f46a5e0156e550e35258aa313a", + "sha256:d6768a327ea1ba44c9114dba5fdda4a214bdb70129065cd0807eb5f010bfcbb5", + "sha256:e18668f1bd39e69b7fed19fa7cd1cd110a121ec25439328b5c89934e6d30d357", + "sha256:e88b97ef13910e5f87bcbc4dd7979a7de9ba8702b54d3204ac587e83639c0c2b", + "sha256:ea0b183a5fe6b2b45f3b854b0d19c4e932d6f5934ae1f723b07cf9560edd4ec7", + "sha256:ede0bde16cc6e9b96633df1631fbcd66491d1063667f260a4f2386a098393790", + "sha256:f541587f5c558abd93cb0de491ce99a9ef8d1ae29dd6ab4dbb5a13281ae04cbd", + "sha256:fbbeb3c9b2edb5fd044b2a070f127a0ac456ffd079cb82746fc84af01ef021a4", + "sha256:fdfa97090e2d6f73dced247a2f2d8004ac6449df6568f30e7fa1a045767c69a6", + "sha256:ff0f9913d82e1d1fadbd976424c316fbc4d9c525c81d047bbdd16bd27dd98cfc" ], "markers": "python_version >= '3.8'", - "version": "==3.9.14" + "version": "==3.9.15" }, "overrides": { "hashes": [ @@ -1738,38 +1737,38 @@ }, "pandas": { "hashes": [ - "sha256:159205c99d7a5ce89ecfc37cb08ed179de7783737cea403b295b5eda8e9c56d1", - "sha256:20404d2adefe92aed3b38da41d0847a143a09be982a31b85bc7dd565bdba0f4e", - "sha256:2707514a7bec41a4ab81f2ccce8b382961a29fbe9492eab1305bb075b2b1ff4f", - "sha256:30b83f7c3eb217fb4d1b494a57a2fda5444f17834f5df2de6b2ffff68dc3c8e2", - "sha256:38e0b4fc3ddceb56ec8a287313bc22abe17ab0eb184069f08fc6a9352a769b18", - "sha256:3de918a754bbf2da2381e8a3dcc45eede8cd7775b047b923f9006d5f876802ae", - "sha256:52826b5f4ed658fa2b729264d63f6732b8b29949c7fd234510d57c61dbeadfcd", - "sha256:57abcaeda83fb80d447f28ab0cc7b32b13978f6f733875ebd1ed14f8fbc0f4ab", - "sha256:5a946f210383c7e6d16312d30b238fd508d80d927014f3b33fb5b15c2f895430", - "sha256:736da9ad4033aeab51d067fc3bd69a0ba36f5a60f66a527b3d72e2030e63280a", - "sha256:761cb99b42a69005dec2b08854fb1d4888fdf7b05db23a8c5a099e4b886a2106", - "sha256:7ea3ee3f125032bfcade3a4cf85131ed064b4f8dd23e5ce6fa16473e48ebcaf5", - "sha256:8108ee1712bb4fa2c16981fba7e68b3f6ea330277f5ca34fa8d557e986a11670", - "sha256:85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88", - "sha256:8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b", - "sha256:9f66419d4a41132eb7e9a73dcec9486cf5019f52d90dd35547af11bc58f8637d", - "sha256:a146b9dcacc3123aa2b399df1a284de5f46287a4ab4fbfc237eac98a92ebcb71", - "sha256:a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5", - "sha256:a20628faaf444da122b2a64b1e5360cde100ee6283ae8effa0d8745153809a2e", - "sha256:a41d06f308a024981dcaa6c41f2f2be46a6b186b902c94c2674e8cb5c42985bc", - "sha256:a626795722d893ed6aacb64d2401d017ddc8a2341b49e0384ab9bf7112bdec30", - "sha256:bde2bc699dbd80d7bc7f9cab1e23a95c4375de615860ca089f34e7c64f4a8de7", - "sha256:cfd6c2491dc821b10c716ad6776e7ab311f7df5d16038d0b7458bc0b67dc10f3", - "sha256:e60f1f7dba3c2d5ca159e18c46a34e7ca7247a73b5dd1a22b6d59707ed6b899a", - "sha256:eb1e1f3861ea9132b32f2133788f3b14911b68102d562715d71bd0013bc45440", - "sha256:eb61dc8567b798b969bcc1fc964788f5a68214d333cade8319c7ab33e2b5d88a", - "sha256:f5be5d03ea2073627e7111f61b9f1f0d9625dc3c4d8dda72cc827b0c58a1d042", - "sha256:f9670b3ac00a387620489dfc1bca66db47a787f4e55911f1293063a78b108df1", - "sha256:fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9" + "sha256:04f6ec3baec203c13e3f8b139fb0f9f86cd8c0b94603ae3ae8ce9a422e9f5bee", + "sha256:06cf591dbaefb6da9de8472535b185cba556d0ce2e6ed28e21d919704fef1a9e", + "sha256:0ab90f87093c13f3e8fa45b48ba9f39181046e8f3317d3aadb2fffbb1b978572", + "sha256:0f573ab277252ed9aaf38240f3b54cfc90fff8e5cab70411ee1d03f5d51f3944", + "sha256:101d0eb9c5361aa0146f500773395a03839a5e6ecde4d4b6ced88b7e5a1a6403", + "sha256:11940e9e3056576ac3244baef2fedade891977bcc1cb7e5cc8f8cc7d603edc89", + "sha256:1ba21b1d5c0e43416218db63037dbe1a01fc101dc6e6024bcad08123e48004ab", + "sha256:4aa1d8707812a658debf03824016bf5ea0d516afdea29b7dc14cf687bc4d4ec6", + "sha256:4acf681325ee1c7f950d058b05a820441075b0dd9a2adf5c4835b9bc056bf4fb", + "sha256:53680dc9b2519cbf609c62db3ed7c0b499077c7fefda564e330286e619ff0dd9", + "sha256:739cc70eaf17d57608639e74d63387b0d8594ce02f69e7a0b046f117974b3019", + "sha256:76f27a809cda87e07f192f001d11adc2b930e93a2b0c4a236fde5429527423be", + "sha256:7d2ed41c319c9fb4fd454fe25372028dfa417aacb9790f68171b2e3f06eae8cd", + "sha256:88ecb5c01bb9ca927ebc4098136038519aa5d66b44671861ffab754cae75102c", + "sha256:8df8612be9cd1c7797c93e1c5df861b2ddda0b48b08f2c3eaa0702cf88fb5f88", + "sha256:94e714a1cca63e4f5939cdce5f29ba8d415d85166be3441165edd427dc9f6bc0", + "sha256:9bd8a40f47080825af4317d0340c656744f2bfdb6819f818e6ba3cd24c0e1397", + "sha256:9d1265545f579edf3f8f0cb6f89f234f5e44ba725a34d86535b1a1d38decbccc", + "sha256:a935a90a76c44fe170d01e90a3594beef9e9a6220021acfb26053d01426f7dc2", + "sha256:af5d3c00557d657c8773ef9ee702c61dd13b9d7426794c9dfeb1dc4a0bf0ebc7", + "sha256:c2ce852e1cf2509a69e98358e8458775f89599566ac3775e70419b98615f4b06", + "sha256:c38ce92cb22a4bea4e3929429aa1067a454dcc9c335799af93ba9be21b6beb51", + "sha256:c391f594aae2fd9f679d419e9a4d5ba4bce5bb13f6a989195656e7dc4b95c8f0", + "sha256:c70e00c2d894cb230e5c15e4b1e1e6b2b478e09cf27cc593a11ef955b9ecc81a", + "sha256:df0c37ebd19e11d089ceba66eba59a168242fc6b7155cba4ffffa6eccdfb8f16", + "sha256:e97fbb5387c69209f134893abc788a6486dbf2f9e511070ca05eed4b930b1b02", + "sha256:f02a3a6c83df4026e55b63c1f06476c9aa3ed6af3d89b4f04ea656ccdaaaa359", + "sha256:f821213d48f4ab353d20ebc24e4faf94ba40d76680642fb7ce2ea31a3ad94f9b", + "sha256:f9d3558d263073ed95e46f4650becff0c5e1ffe0fc3a015de3c79283dfbdb3df" ], "markers": "python_version >= '3.9'", - "version": "==2.2.0" + "version": "==2.2.1" }, "pandocfilters": { "hashes": [ @@ -2019,96 +2018,95 @@ }, "pydantic": { "hashes": [ - "sha256:0b6a909df3192245cb736509a92ff69e4fef76116feffec68e93a567347bae6f", - "sha256:4fd5c182a2488dc63e6d32737ff19937888001e2a6d86e94b3f233104a5d1fa9" + "sha256:37a5432e54b12fecaa1049c5195f3d860a10e01bdfd24f1840ef14bd0d3aeab3", + "sha256:a09be1c3d28f3abe37f8a78af58284b236a92ce520105ddc91a6d29ea1176ba7" ], - "markers": "python_version >= '3.8'", - "version": "==2.6.1" + "version": "==2.6.2" }, "pydantic-core": { "hashes": [ - "sha256:02906e7306cb8c5901a1feb61f9ab5e5c690dbbeaa04d84c1b9ae2a01ebe9379", - "sha256:0ba503850d8b8dcc18391f10de896ae51d37fe5fe43dbfb6a35c5c5cad271a06", - "sha256:16aa02e7a0f539098e215fc193c8926c897175d64c7926d00a36188917717a05", - "sha256:18de31781cdc7e7b28678df7c2d7882f9692ad060bc6ee3c94eb15a5d733f8f7", - "sha256:22c5f022799f3cd6741e24f0443ead92ef42be93ffda0d29b2597208c94c3753", - "sha256:2924b89b16420712e9bb8192396026a8fbd6d8726224f918353ac19c4c043d2a", - "sha256:308974fdf98046db28440eb3377abba274808bf66262e042c412eb2adf852731", - "sha256:396fdf88b1b503c9c59c84a08b6833ec0c3b5ad1a83230252a9e17b7dfb4cffc", - "sha256:3ac426704840877a285d03a445e162eb258924f014e2f074e209d9b4ff7bf380", - "sha256:3b052c753c4babf2d1edc034c97851f867c87d6f3ea63a12e2700f159f5c41c3", - "sha256:3fab4e75b8c525a4776e7630b9ee48aea50107fea6ca9f593c98da3f4d11bf7c", - "sha256:406fac1d09edc613020ce9cf3f2ccf1a1b2f57ab00552b4c18e3d5276c67eb11", - "sha256:40a0bd0bed96dae5712dab2aba7d334a6c67cbcac2ddfca7dbcc4a8176445990", - "sha256:41dac3b9fce187a25c6253ec79a3f9e2a7e761eb08690e90415069ea4a68ff7a", - "sha256:459c0d338cc55d099798618f714b21b7ece17eb1a87879f2da20a3ff4c7628e2", - "sha256:459d6be6134ce3b38e0ef76f8a672924460c455d45f1ad8fdade36796df1ddc8", - "sha256:46b0d5520dbcafea9a8645a8164658777686c5c524d381d983317d29687cce97", - "sha256:47924039e785a04d4a4fa49455e51b4eb3422d6eaacfde9fc9abf8fdef164e8a", - "sha256:4bfcbde6e06c56b30668a0c872d75a7ef3025dc3c1823a13cf29a0e9b33f67e8", - "sha256:4f9ee4febb249c591d07b2d4dd36ebcad0ccd128962aaa1801508320896575ef", - "sha256:55749f745ebf154c0d63d46c8c58594d8894b161928aa41adbb0709c1fe78b77", - "sha256:5864b0242f74b9dd0b78fd39db1768bc3f00d1ffc14e596fd3e3f2ce43436a33", - "sha256:5f60f920691a620b03082692c378661947d09415743e437a7478c309eb0e4f82", - "sha256:60eb8ceaa40a41540b9acae6ae7c1f0a67d233c40dc4359c256ad2ad85bdf5e5", - "sha256:69a7b96b59322a81c2203be537957313b07dd333105b73db0b69212c7d867b4b", - "sha256:6ad84731a26bcfb299f9eab56c7932d46f9cad51c52768cace09e92a19e4cf55", - "sha256:6db58c22ac6c81aeac33912fb1af0e930bc9774166cdd56eade913d5f2fff35e", - "sha256:70651ff6e663428cea902dac297066d5c6e5423fda345a4ca62430575364d62b", - "sha256:72f7919af5de5ecfaf1eba47bf9a5d8aa089a3340277276e5636d16ee97614d7", - "sha256:732bd062c9e5d9582a30e8751461c1917dd1ccbdd6cafb032f02c86b20d2e7ec", - "sha256:7924e54f7ce5d253d6160090ddc6df25ed2feea25bfb3339b424a9dd591688bc", - "sha256:7afb844041e707ac9ad9acad2188a90bffce2c770e6dc2318be0c9916aef1469", - "sha256:7b883af50eaa6bb3299780651e5be921e88050ccf00e3e583b1e92020333304b", - "sha256:7beec26729d496a12fd23cf8da9944ee338c8b8a17035a560b585c36fe81af20", - "sha256:7bf26c2e2ea59d32807081ad51968133af3025c4ba5753e6a794683d2c91bf6e", - "sha256:7c31669e0c8cc68400ef0c730c3a1e11317ba76b892deeefaf52dcb41d56ed5d", - "sha256:7e6231aa5bdacda78e96ad7b07d0c312f34ba35d717115f4b4bff6cb87224f0f", - "sha256:870dbfa94de9b8866b37b867a2cb37a60c401d9deb4a9ea392abf11a1f98037b", - "sha256:88646cae28eb1dd5cd1e09605680c2b043b64d7481cdad7f5003ebef401a3039", - "sha256:8aafeedb6597a163a9c9727d8a8bd363a93277701b7bfd2749fbefee2396469e", - "sha256:8bde5b48c65b8e807409e6f20baee5d2cd880e0fad00b1a811ebc43e39a00ab2", - "sha256:8f9142a6ed83d90c94a3efd7af8873bf7cefed2d3d44387bf848888482e2d25f", - "sha256:936a787f83db1f2115ee829dd615c4f684ee48ac4de5779ab4300994d8af325b", - "sha256:98dc6f4f2095fc7ad277782a7c2c88296badcad92316b5a6e530930b1d475ebc", - "sha256:9957433c3a1b67bdd4c63717eaf174ebb749510d5ea612cd4e83f2d9142f3fc8", - "sha256:99af961d72ac731aae2a1b55ccbdae0733d816f8bfb97b41909e143de735f522", - "sha256:9b5f13857da99325dcabe1cc4e9e6a3d7b2e2c726248ba5dd4be3e8e4a0b6d0e", - "sha256:9d776d30cde7e541b8180103c3f294ef7c1862fd45d81738d156d00551005784", - "sha256:9da90d393a8227d717c19f5397688a38635afec89f2e2d7af0df037f3249c39a", - "sha256:a3b7352b48fbc8b446b75f3069124e87f599d25afb8baa96a550256c031bb890", - "sha256:a477932664d9611d7a0816cc3c0eb1f8856f8a42435488280dfbf4395e141485", - "sha256:a7e41e3ada4cca5f22b478c08e973c930e5e6c7ba3588fb8e35f2398cdcc1545", - "sha256:a90fec23b4b05a09ad988e7a4f4e081711a90eb2a55b9c984d8b74597599180f", - "sha256:a9e523474998fb33f7c1a4d55f5504c908d57add624599e095c20fa575b8d943", - "sha256:aa057095f621dad24a1e906747179a69780ef45cc8f69e97463692adbcdae878", - "sha256:aa6c8c582036275997a733427b88031a32ffa5dfc3124dc25a730658c47a572f", - "sha256:ae34418b6b389d601b31153b84dce480351a352e0bb763684a1b993d6be30f17", - "sha256:b0d7a9165167269758145756db43a133608a531b1e5bb6a626b9ee24bc38a8f7", - "sha256:b30b0dd58a4509c3bd7eefddf6338565c4905406aee0c6e4a5293841411a1286", - "sha256:b8f9186ca45aee030dc8234118b9c0784ad91a0bb27fc4e7d9d6608a5e3d386c", - "sha256:b94cbda27267423411c928208e89adddf2ea5dd5f74b9528513f0358bba019cb", - "sha256:cc6f6c9be0ab6da37bc77c2dda5f14b1d532d5dbef00311ee6e13357a418e646", - "sha256:ce232a6170dd6532096cadbf6185271e4e8c70fc9217ebe105923ac105da9978", - "sha256:cf903310a34e14651c9de056fcc12ce090560864d5a2bb0174b971685684e1d8", - "sha256:d5362d099c244a2d2f9659fb3c9db7c735f0004765bbe06b99be69fbd87c3f15", - "sha256:dffaf740fe2e147fedcb6b561353a16243e654f7fe8e701b1b9db148242e1272", - "sha256:e0f686549e32ccdb02ae6f25eee40cc33900910085de6aa3790effd391ae10c2", - "sha256:e4b52776a2e3230f4854907a1e0946eec04d41b1fc64069ee774876bbe0eab55", - "sha256:e4ba0884a91f1aecce75202473ab138724aa4fb26d7707f2e1fa6c3e68c84fbf", - "sha256:e6294e76b0380bb7a61eb8a39273c40b20beb35e8c87ee101062834ced19c545", - "sha256:ebb892ed8599b23fa8f1799e13a12c87a97a6c9d0f497525ce9858564c4575a4", - "sha256:eca58e319f4fd6df004762419612122b2c7e7d95ffafc37e890252f869f3fb2a", - "sha256:ed957db4c33bc99895f3a1672eca7e80e8cda8bd1e29a80536b4ec2153fa9804", - "sha256:ef551c053692b1e39e3f7950ce2296536728871110e7d75c4e7753fb30ca87f4", - "sha256:ef6113cd31411eaf9b39fc5a8848e71c72656fd418882488598758b2c8c6dfa0", - "sha256:f685dbc1fdadb1dcd5b5e51e0a378d4685a891b2ddaf8e2bba89bd3a7144e44a", - "sha256:f8ed79883b4328b7f0bd142733d99c8e6b22703e908ec63d930b06be3a0e7113", - "sha256:fe56851c3f1d6f5384b3051c536cc81b3a93a73faf931f404fef95217cf1e10d", - "sha256:ff7c97eb7a29aba230389a2661edf2e9e06ce616c7e35aa764879b6894a44b25" + "sha256:00ee1c97b5364b84cb0bd82e9bbf645d5e2871fb8c58059d158412fee2d33d8a", + "sha256:0d32576b1de5a30d9a97f300cc6a3f4694c428d956adbc7e6e2f9cad279e45ed", + "sha256:0df446663464884297c793874573549229f9eca73b59360878f382a0fc085979", + "sha256:0f56ae86b60ea987ae8bcd6654a887238fd53d1384f9b222ac457070b7ac4cff", + "sha256:13dcc4802961b5f843a9385fc821a0b0135e8c07fc3d9949fd49627c1a5e6ae5", + "sha256:162e498303d2b1c036b957a1278fa0899d02b2842f1ff901b6395104c5554a45", + "sha256:1b662180108c55dfbf1280d865b2d116633d436cfc0bba82323554873967b340", + "sha256:1cac689f80a3abab2d3c0048b29eea5751114054f032a941a32de4c852c59cad", + "sha256:21b888c973e4f26b7a96491c0965a8a312e13be108022ee510248fe379a5fa23", + "sha256:287073c66748f624be4cef893ef9174e3eb88fe0b8a78dc22e88eca4bc357ca6", + "sha256:2a1ef6a36fdbf71538142ed604ad19b82f67b05749512e47f247a6ddd06afdc7", + "sha256:2a72fb9963cba4cd5793854fd12f4cfee731e86df140f59ff52a49b3552db241", + "sha256:2acca2be4bb2f2147ada8cac612f8a98fc09f41c89f87add7256ad27332c2fda", + "sha256:2f583bd01bbfbff4eaee0868e6fc607efdfcc2b03c1c766b06a707abbc856187", + "sha256:33809aebac276089b78db106ee692bdc9044710e26f24a9a2eaa35a0f9fa70ba", + "sha256:36fa178aacbc277bc6b62a2c3da95226520da4f4e9e206fdf076484363895d2c", + "sha256:4204e773b4b408062960e65468d5346bdfe139247ee5f1ca2a378983e11388a2", + "sha256:4384a8f68ddb31a0b0c3deae88765f5868a1b9148939c3f4121233314ad5532c", + "sha256:456855f57b413f077dff513a5a28ed838dbbb15082ba00f80750377eed23d132", + "sha256:49d5d58abd4b83fb8ce763be7794d09b2f50f10aa65c0f0c1696c677edeb7cbf", + "sha256:4ac6b4ce1e7283d715c4b729d8f9dab9627586dafce81d9eaa009dd7f25dd972", + "sha256:4df8a199d9f6afc5ae9a65f8f95ee52cae389a8c6b20163762bde0426275b7db", + "sha256:500960cb3a0543a724a81ba859da816e8cf01b0e6aaeedf2c3775d12ee49cade", + "sha256:519ae0312616026bf4cedc0fe459e982734f3ca82ee8c7246c19b650b60a5ee4", + "sha256:578114bc803a4c1ff9946d977c221e4376620a46cf78da267d946397dc9514a8", + "sha256:5c5cbc703168d1b7a838668998308018a2718c2130595e8e190220238addc96f", + "sha256:6162f8d2dc27ba21027f261e4fa26f8bcb3cf9784b7f9499466a311ac284b5b9", + "sha256:704d35ecc7e9c31d48926150afada60401c55efa3b46cd1ded5a01bdffaf1d48", + "sha256:716b542728d4c742353448765aa7cdaa519a7b82f9564130e2b3f6766018c9ec", + "sha256:72282ad4892a9fb2da25defeac8c2e84352c108705c972db82ab121d15f14e6d", + "sha256:7233d65d9d651242a68801159763d09e9ec96e8a158dbf118dc090cd77a104c9", + "sha256:732da3243e1b8d3eab8c6ae23ae6a58548849d2e4a4e03a1924c8ddf71a387cb", + "sha256:75b81e678d1c1ede0785c7f46690621e4c6e63ccd9192af1f0bd9d504bbb6bf4", + "sha256:75f76ee558751746d6a38f89d60b6228fa174e5172d143886af0f85aa306fd89", + "sha256:7ee8d5f878dccb6d499ba4d30d757111847b6849ae07acdd1205fffa1fc1253c", + "sha256:7f752826b5b8361193df55afcdf8ca6a57d0232653494ba473630a83ba50d8c9", + "sha256:86b3d0033580bd6bbe07590152007275bd7af95f98eaa5bd36f3da219dcd93da", + "sha256:8d62da299c6ecb04df729e4b5c52dc0d53f4f8430b4492b93aa8de1f541c4aac", + "sha256:8e47755d8152c1ab5b55928ab422a76e2e7b22b5ed8e90a7d584268dd49e9c6b", + "sha256:9091632a25b8b87b9a605ec0e61f241c456e9248bfdcf7abdf344fdb169c81cf", + "sha256:936e5db01dd49476fa8f4383c259b8b1303d5dd5fb34c97de194560698cc2c5e", + "sha256:99b6add4c0b39a513d323d3b93bc173dac663c27b99860dd5bf491b240d26137", + "sha256:9c865a7ee6f93783bd5d781af5a4c43dadc37053a5b42f7d18dc019f8c9d2bd1", + "sha256:a425479ee40ff021f8216c9d07a6a3b54b31c8267c6e17aa88b70d7ebd0e5e5b", + "sha256:a4b2bf78342c40b3dc830880106f54328928ff03e357935ad26c7128bbd66ce8", + "sha256:a6b1bb0827f56654b4437955555dc3aeeebeddc47c2d7ed575477f082622c49e", + "sha256:aaf09e615a0bf98d406657e0008e4a8701b11481840be7d31755dc9f97c44053", + "sha256:b1f6f5938d63c6139860f044e2538baeee6f0b251a1816e7adb6cbce106a1f01", + "sha256:b29eeb887aa931c2fcef5aa515d9d176d25006794610c264ddc114c053bf96fe", + "sha256:b3992a322a5617ded0a9f23fd06dbc1e4bd7cf39bc4ccf344b10f80af58beacd", + "sha256:b5b6079cc452a7c53dd378c6f881ac528246b3ac9aae0f8eef98498a75657805", + "sha256:b60cc1a081f80a2105a59385b92d82278b15d80ebb3adb200542ae165cd7d183", + "sha256:b926dd38db1519ed3043a4de50214e0d600d404099c3392f098a7f9d75029ff8", + "sha256:bd87f48924f360e5d1c5f770d6155ce0e7d83f7b4e10c2f9ec001c73cf475c99", + "sha256:bda1ee3e08252b8d41fa5537413ffdddd58fa73107171a126d3b9ff001b9b820", + "sha256:be0ec334369316fa73448cc8c982c01e5d2a81c95969d58b8f6e272884df0074", + "sha256:c6119dc90483a5cb50a1306adb8d52c66e447da88ea44f323e0ae1a5fcb14256", + "sha256:c9803edf8e29bd825f43481f19c37f50d2b01899448273b3a7758441b512acf8", + "sha256:c9bd22a2a639e26171068f8ebb5400ce2c1bc7d17959f60a3b753ae13c632975", + "sha256:cbcc558401de90a746d02ef330c528f2e668c83350f045833543cd57ecead1ad", + "sha256:cf6204fe865da605285c34cf1172879d0314ff267b1c35ff59de7154f35fdc2e", + "sha256:d33dd21f572545649f90c38c227cc8631268ba25c460b5569abebdd0ec5974ca", + "sha256:d89ca19cdd0dd5f31606a9329e309d4fcbb3df860960acec32630297d61820df", + "sha256:d8f99b147ff3fcf6b3cc60cb0c39ea443884d5559a30b1481e92495f2310ff2b", + "sha256:d937653a696465677ed583124b94a4b2d79f5e30b2c46115a68e482c6a591c8a", + "sha256:dcca5d2bf65c6fb591fff92da03f94cd4f315972f97c21975398bd4bd046854a", + "sha256:ded1c35f15c9dea16ead9bffcde9bb5c7c031bff076355dc58dcb1cb436c4721", + "sha256:e3e70c94a0c3841e6aa831edab1619ad5c511199be94d0c11ba75fe06efe107a", + "sha256:e56f8186d6210ac7ece503193ec84104da7ceb98f68ce18c07282fcc2452e76f", + "sha256:e7774b570e61cb998490c5235740d475413a1f6de823169b4cf94e2fe9e9f6b2", + "sha256:e7c6ed0dc9d8e65f24f5824291550139fe6f37fac03788d4580da0d33bc00c97", + "sha256:ec08be75bb268473677edb83ba71e7e74b43c008e4a7b1907c6d57e940bf34b6", + "sha256:ecdf6bf5f578615f2e985a5e1f6572e23aa632c4bd1dc67f8f406d445ac115ed", + "sha256:ed25e1835c00a332cb10c683cd39da96a719ab1dfc08427d476bce41b92531fc", + "sha256:f4cb85f693044e0f71f394ff76c98ddc1bc0953e48c061725e540396d5c8a2e1", + "sha256:f53aace168a2a10582e570b7736cc5bef12cae9cf21775e3eafac597e8551fbe", + "sha256:f651dd19363c632f4abe3480a7c87a9773be27cfe1341aef06e8759599454120", + "sha256:fc4ad7f7ee1a13d9cb49d8198cd7d7e3aa93e425f371a68235f784e99741561f", + "sha256:fee427241c2d9fb7192b658190f9f5fd6dfe41e02f3c1489d2ec1e6a5ab1e04a" ], "markers": "python_version >= '3.8'", - "version": "==2.16.2" + "version": "==2.16.3" }, "pydeck": { "hashes": [ @@ -2737,11 +2735,11 @@ }, "setuptools": { "hashes": [ - "sha256:850894c4195f09c4ed30dba56213bf7c3f21d86ed6bdaafb5df5972593bfc401", - "sha256:c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6" + "sha256:02fa291a0471b3a18b2b2481ed902af520c69e8ae0919c13da936542754b4c56", + "sha256:5c0806c7d9af348e6dd3777b4f4dbb42c7ad85b190104837488eab9a7c945cf8" ], "markers": "python_version >= '3.8'", - "version": "==69.1.0" + "version": "==69.1.1" }, "six": { "hashes": [ @@ -2761,11 +2759,11 @@ }, "sniffio": { "hashes": [ - "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", - "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" + "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", + "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" ], "markers": "python_version >= '3.7'", - "version": "==1.3.0" + "version": "==1.3.1" }, "soupsieve": { "hashes": [ @@ -3150,11 +3148,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", - "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" + "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475", + "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" ], "markers": "python_version >= '3.8'", - "version": "==4.9.0" + "version": "==4.10.0" }, "typing-inspect": { "hashes": [ diff --git a/README.md b/README.md index 78c83ba..dcd8685 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Ingest files for retrieval augmented generation (RAG) with open-source Large Lan ### Pre-Requisites - A pre-existing Ollama instance -- Python 3.9+ +- Python 3.10+ ### Setup @@ -36,7 +36,8 @@ Docker: - Once complete, ask questions based on your documents! ### To Do -- [x] Refactor +- [x] Refactor into modules +- [ ] Refactor file processing logic - [x] Migrate Chat Stream to Llama-Index - [x] Implement Llama-Index Chat Engine with Memory - [x] Swap to Llama-Index Chat Engine @@ -49,15 +50,21 @@ Docker: - [ ] chunk_overlap - [x] Allow Switching of Embedding Model & Settings - [x] Delete Files after Index Created/Failed -- [ ] Function to Handle GitHub Repo Ingestion -- [ ] Support for JSON Files +- [x] Support Additional Import Options + - [x] GitHub Repos + - [ ] Websites +- [ ] Remove File Type Limitations for Uploads - [x] Show Loaders in UI (File Uploads, Conversions, ...) - [x] Export Data (Uploaded Files, Chat History, ...) - [x] View and Manage Imported Files - [x] About Tab in Sidebar - [x] Docker Support -- [ ] Implement Log Library +- [x] Implement Log Library +- [ ] Improve Logging - [ ] Re-write Docstrings +- [ ] Additional Error Handling + - [x] Starting a chat without an Ollama model set + - [ ] Incorrect GitHub repos ### Known Issues & Bugs - [ ] Refreshing the page loses all state (expected Streamlit behavior; need to implement local-storage) diff --git a/components/chatbox.py b/components/chatbox.py index 0bb3128..f2888f7 100644 --- a/components/chatbox.py +++ b/components/chatbox.py @@ -6,9 +6,9 @@ def chatbox(): if prompt := st.chat_input("How can I help?"): # Prevent submission if Ollama endpoint is not set - if not st.session_state["ollama_endpoint"]: + if not st.session_state["query_engine"]: st.warning( - "Please set an Ollama Endpoint under Settings before continuing." + "Please confirm settings and upload files before proceeding." ) st.stop() diff --git a/components/page_state.py b/components/page_state.py index 72ac119..0530055 100644 --- a/components/page_state.py +++ b/components/page_state.py @@ -33,7 +33,7 @@ def set_initial_state(): st.session_state["messages"] = [ { "role": "assistant", - "content": "Hello! Import some files or ingest a GitHub repo and we can get started.", + "content": "Welcome to Local RAG! To begin, please either import some files or ingest a GitHub repo. Once you've completed those steps, we can continue the conversation and explore how I can assist you further.", } ] @@ -65,14 +65,14 @@ def set_initial_state(): st.session_state["advanced"] = False if "system_prompt" not in st.session_state: - st.session_state[ - "system_prompt" - ] = "You are a sophisticated virtual assistant designed to assist users in comprehensively understanding and extracting insights from a wide range of documents at their disposal. Your expertise lies in tackling complex inquiries and providing insightful analyses based on the information contained within these documents." + st.session_state["system_prompt"] = ( + "You are a sophisticated virtual assistant designed to assist users in comprehensively understanding and extracting insights from a wide range of documents at their disposal. Your expertise lies in tackling complex inquiries and providing insightful analyses based on the information contained within these documents." + ) if "top_k" not in st.session_state: - st.session_state[ - "top_k" - ] = 3 # Default is 2; increasing to 5 will result in more documents being retrieved + st.session_state["top_k"] = ( + 3 # Default is 2; increasing to 5 will result in more documents being retrieved + ) if "embedding_model" not in st.session_state: st.session_state["embedding_model"] = None diff --git a/components/sidebar.py b/components/sidebar.py index ece56b6..10cd52d 100644 --- a/components/sidebar.py +++ b/components/sidebar.py @@ -2,7 +2,6 @@ from components.tabs.about import about from components.tabs.file_upload import file_upload -from components.tabs.github_repo import github_repo from components.tabs.settings import settings diff --git a/components/tabs/file_upload.py b/components/tabs/file_upload.py index ed30d53..7fcda89 100644 --- a/components/tabs/file_upload.py +++ b/components/tabs/file_upload.py @@ -6,6 +6,8 @@ import utils.ollama as ollama import utils.llama_index as llama_index +from components.tabs.github_repo import github_repo + def file_upload(): st.title("Directly import your files") @@ -14,19 +16,43 @@ def file_upload(): # Force users to confirm Settings before uploading files if st.session_state["selected_model"] is not None: - uploaded_files = st.file_uploader( - "Select Files", - accept_multiple_files=True, - type=("csv", "docx", "epub", "ipynb", "json", "md", "pdf", "ppt", "pptx",), - ) + file_upload_container = st.container(border=True) + with file_upload_container: + uploaded_files = st.file_uploader( + "Select Files", + accept_multiple_files=True, + type=( + "csv", + "docx", + "epub", + "ipynb", + "json", + "md", + "pdf", + "ppt", + "pptx", + ), + ) else: st.warning("Please configure Ollama settings before proceeding!", icon="⚠️") - uploaded_files = st.file_uploader( - "Select Files", - accept_multiple_files=True, - type=("csv", "docx", "epub", "ipynb", "json", "md", "pdf", "ppt", "pptx",), - disabled=True, - ) + file_upload_container = st.container(border=True) + with file_upload_container: + uploaded_files = st.file_uploader( + "Select Files", + accept_multiple_files=True, + type=( + "csv", + "docx", + "epub", + "ipynb", + "json", + "md", + "pdf", + "ppt", + "pptx", + ), + disabled=True, + ) if len(uploaded_files) > 0: st.session_state["file_list"] = uploaded_files @@ -120,7 +146,9 @@ def file_upload(): if error is not None: status.update( - label="File processing failed.", state="error", expanded=True, + label="File processing failed.", + state="error", + expanded=True, ) st.error(error) else: @@ -131,4 +159,4 @@ def file_upload(): ) with st.expander("GitHub Repo", expanded=False): - st.write(":grey[Coming Soon™]") + github_repo() diff --git a/components/tabs/github_repo.py b/components/tabs/github_repo.py index 9728810..d0206d1 100644 --- a/components/tabs/github_repo.py +++ b/components/tabs/github_repo.py @@ -1,25 +1,136 @@ +import os +import shutil + import streamlit as st import utils.helpers as func +import utils.ollama as ollama +import utils.llama_index as llama_index +import utils.logs as logs def github_repo(): - st.header("Import files from a GitHub repo") - st.caption("Convert a GitHub repo to embeddings for utilization during chat") - - github_container = st.container(border=True) - with github_container: + # st.header("Import files from a GitHub repo") + # st.caption("Convert a GitHub repo to embeddings for utilization during chat") + if st.session_state["selected_model"] is not None: st.text_input( - "GitHub repo", + "Select a GitHub.com repo", placeholder="jonfairbanks/local-rag", key="github_repo", - value=st.session_state.github_repo, - on_change=func.process_github_repo, - args=(st.session_state.github_repo,), + ) + + repo_processed = None + repo_processed = st.button( + "Process Repo", + on_click=func.clone_github_repo, + args=(st.session_state["github_repo"],), + ) # TODO: Should this be with st.button? + + with st.spinner("Processing..."): + if repo_processed is True: + error = None + + ###################################### + # Create Llama-Index service-context # + # to use local LLMs and embeddings # + ###################################### + + try: + llm = ollama.create_ollama_llm( + st.session_state["selected_model"], + st.session_state["ollama_endpoint"], + ) + st.caption("✔️ LLM Initialized") + + # resp = llm.complete("Hello!") + # print(resp) + + # Determine embedding model to use + + embedding_model = st.session_state["embedding_model"] + hf_embedding_model = None + + if embedding_model == None: + logs.log.info("No embedding model set; using defaults...") + hf_embedding_model = "BAAI/bge-large-en-v1.5" + + if embedding_model == "Default (bge-large-en-v1.5)": + logs.log.info("Using default embedding model...") + hf_embedding_model = "BAAI/bge-large-en-v1.5" + + if embedding_model == "Large (Salesforce/SFR-Embedding-Mistral)": + logs.log.info( + "Using the Salesforce embedding model; RIP yer VRAM..." + ) + hf_embedding_model = "Salesforce/SFR-Embedding-Mistral" + + if embedding_model == "Other": + logs.log.info("Using a user-provided embedding model...") + hf_embedding_model = st.session_state["other_embedding_model"] + + service_context = llama_index.create_service_context( + llm, + st.session_state["system_prompt"], + hf_embedding_model, + st.session_state["chunk_size"], + ) + st.caption("✔️ Context Created") + except Exception as err: + logs.log.error(f"Setting up Service Context failed: {err}") + error = err + + ####################################### + # Load files from the data/ directory # + ####################################### + + try: + save_dir = os.getcwd() + "/data" + documents = llama_index.load_documents(save_dir) + st.session_state["documents"] = documents + st.caption("✔️ Processed File Data") + except Exception as err: + logs.log.error(f"Document Load Error: {err}") + error = err + + ########################################### + # Create an index from ingested documents # + ########################################### + + try: + llama_index.create_query_engine(documents, service_context) + st.caption("✔️ Created File Index") + except Exception as err: + logs.log.error(f"Index Creation Error: {err}") + error = err + + ##################### + # Remove data files # + ##################### + + try: + save_dir = os.getcwd() + "/data" + shutil.rmtree(save_dir) + st.caption("✔️ Removed Temp Files") + except Exception as err: + logs.log.error(f"Failed to delete data files: {err}") + error = err + + ##################### + # Show Final Status # + ##################### + + if error is not None: + st.exception(error) + else: + st.write("Your files are ready. Let's chat! 😎") + + else: + st.text_input( + "Select a GitHub.com repo", + placeholder="jonfairbanks/local-rag", + disabled=True, ) st.button( "Process Repo", - on_click=func.process_github_repo, - args=(st.session_state.github_repo,), disabled=True, ) diff --git a/components/tabs/settings.py b/components/tabs/settings.py index 8ab2418..21104f3 100644 --- a/components/tabs/settings.py +++ b/components/tabs/settings.py @@ -21,10 +21,13 @@ def settings(): on_change=ollama.get_models, ) st.selectbox( - "Model", st.session_state["ollama_models"], key="selected_model", + "Model", + st.session_state["ollama_models"], + key="selected_model", ) st.button( - "Refresh", on_click=ollama.get_models, + "Refresh", + on_click=ollama.get_models, ) if st.session_state["advanced"] == True: st.select_slider( diff --git a/data/.gitkeep b/data/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/demo.gif b/demo.gif index b03e51f..00a8ab2 100644 Binary files a/demo.gif and b/demo.gif differ diff --git a/main.py b/main.py index 40371d2..e288605 100644 --- a/main.py +++ b/main.py @@ -1,3 +1,5 @@ +import time + import streamlit as st from components.chatbox import chatbox @@ -7,6 +9,11 @@ from components.page_config import set_page_config from components.page_state import set_initial_state +def generate_welcome_message(msg): + for char in msg: + time.sleep(0.025) # This is blocking :( + yield char + ### Page Setup set_page_config() set_page_header() @@ -16,6 +23,7 @@ for msg in st.session_state["messages"]: st.chat_message(msg["role"]).write(msg["content"]) + #st.chat_message(msg["role"]).write_stream(generate_welcome_message(msg['content'])) ### Sidebar sidebar() diff --git a/utils/helpers.py b/utils/helpers.py index 266341c..d84026b 100644 --- a/utils/helpers.py +++ b/utils/helpers.py @@ -1,7 +1,11 @@ import os +import requests +import subprocess import streamlit as st +import utils.logs as logs + ################################### # # Save File Upload to Disk @@ -17,25 +21,57 @@ def save_uploaded_file(uploaded_file: bytes, save_dir: str): uploaded_file (BytesIO): The uploaded file content. save_dir (str): The directory where the file will be saved. """ - with open(os.path.join(save_dir, uploaded_file.name), "wb") as f: - f.write(uploaded_file.getbuffer()) + try: + if not os.path.exists(save_dir): + os.makedirs(save_dir) + with open(os.path.join(save_dir, uploaded_file.name), "wb") as f: + f.write(uploaded_file.getbuffer()) + except Exception as e: + logs.log.info(f"Error saving upload to disk: {e}") + + +################################### +# +# Confirm a GitHub Repo Exists +# +################################### + + +def validate_github_repo(repo: str): + repo_endpoint = "https://github.com/" + repo + ".git" + resp = requests.head(repo_endpoint) + if resp.status_code() == 200: + return True + else: + return False ################################### # -# Process GitHub Repo +# Clone a GitHub Repo # ################################### -def process_github_repo(repo: str): +def clone_github_repo(repo: str): """ - Processes a GitHub repository. + Clones a GitHub repository. Parameters: repo (str): The name of the GitHub repository. """ - print(repo) # Doesn't work? - github_endpoint = "https://github.com/" + st.session_state.github_repo - print(github_endpoint) - return + repo_endpoint = "https://github.com/" + repo + ".git" + if repo_endpoint is not None: + save_dir = os.getcwd() + "/data" + clone_command = f"git clone -q {repo_endpoint} {save_dir}/{repo}" + try: + subprocess.run(clone_command, shell=True) + logs.log.info(f"Cloned {repo} repo") + return True + except Exception as e: + Exception(f"Error cloning {repo} GitHub repo: {e}") + return False + + else: + Exception(f"Failed to process GitHub repo {st.session_state['github_repo']}") + return False diff --git a/utils/llama_index.py b/utils/llama_index.py index 7b82b51..bc5014f 100644 --- a/utils/llama_index.py +++ b/utils/llama_index.py @@ -47,7 +47,7 @@ def create_service_context( ) # Note: this may be redundant since service_context is returned - set_global_service_context(service_context) + set_global_service_context(service_context) return service_context @@ -102,7 +102,7 @@ def create_query_engine(documents, service_context): Parameters: - documents (VectorStoreIndex): A list of Document objects containing the raw text data to be indexed. - - service_context (ServiceContext): A ServiceContext object providing any + - service_context (ServiceContext): A ServiceContext object providing any necessary configuration or authentication information for the underlying index implementation. diff --git a/utils/logs.py b/utils/logs.py new file mode 100644 index 0000000..357cc32 --- /dev/null +++ b/utils/logs.py @@ -0,0 +1,27 @@ +import logging +import sys + + +def setup_logger(log_file="local-rag.log", level=logging.INFO): + logger = logging.getLogger(__name__) + logger.setLevel(level) + + file_handler = logging.FileHandler(log_file) + file_handler.setLevel(level) + + console_handler = logging.StreamHandler(stream=sys.stdout) + console_handler.setLevel(level) + + log_format = logging.Formatter( + "%(asctime)s - %(module)s - %(levelname)s - %(message)s" + ) + file_handler.setFormatter(log_format) + console_handler.setFormatter(log_format) + + logger.addHandler(file_handler) + logger.addHandler(console_handler) + + return logger + + +log = setup_logger()