Metadata-Version: 2.4
Name: agentvis
Version: 0.1.7
Summary: Framework-agnostic reasoning trace visualization tool for AI agents.
Author: Nitesh Kumar
License: Apache License 2.0
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Requires-Dist: bm25s==0.3.0
Requires-Dist: pydantic>=2.0.0
Provides-Extra: langchain
Requires-Dist: langchain>=0.1.0; extra == "langchain"

# agentvis

<p align="center">
  <picture align="center">
    <img align="center" alt="agentvis logo" src="https://raw.githubusercontent.com/kumarniteshpersonal-beep/agentvis/968caea6e04577583d7d16f7015b9925362d5f53/packages/ui/public/agentvis_logo.svg" width="560">
  </picture>
</p>


*agentvis* visualizes an agent’s reasoning trace and run, giving you clear insight into what’s happening behind the scenes and why the agent chose a particular path or triggered a specific tool call. By surfacing behavior that is often opaque, it helps reveal the factors that may have influenced the LLM to select a particular action or tool.

By exposing the influence flow behind each decision, it transforms opaque agent behavior into something understandable and actionable — so you can confidently refine and improve your prompts, which is often the hardest part of building reliable agents. 🧠✨

## *agentvis* reasoning visualization example - [link](https://agentvis.vercel.app/?view=eJztfetuG0mW5qsk1IO2JDBlkSIl0n8WKqtqSrNll9dydQ_QLhjBzKCY7WQmO5MpmS4UMK-xwC4wzzKPMk-y5xLXvJG6VPf0bP-psshkZFxOnOt3zvnlYFGIlSwPXv3pl4Msj9W_kvjg1cF4dDqT41kUTibDYTiO5_NwNjuFP0-np7PJxXgopsODwcFmu5bw9PfVSmRvZFmKWwmfxmIjDl79chDl2UZmG3jgfik2gShksFnKYCWSLIjy1TrP4NsyqEoZB5scPv8s4fPqdhmU26JaByKLg9vkDn4hg1huRJLCgyIr72URLPIikCJa2oEOfv31518HjZWk0aeiysLwdDiLolhG4Xgmp-HFIhqF0_lsEg7jeDwdn8-GE3kanto1XV73LAgGV48VUpR5lmS38Jj996uD4-MruUjwj-A1LemGlnSd3RYyTnDdx8cfs4_Z9YtVEFVFAZ-kW1hVRLuRZ7RTziblC3drTmCgZJOINCilKKKlLGl3qyyWxb3YDmjrcOi8uBVZ8hWngQMmGezbSmwSeAHuYJSKItlsYbgXaRpkkg-C95q3NzETPgk-wAiZ_LIJyo1cB_cJ_GQu8QfrQq716cov61Rk9IryBFf4MTvAY9m5X9cxvCRZbHGuHZuFE8DRg6SEhcOMvkuKcjOglVYl_lCoDaHVGWKziyhpFdnA0lMh1S9oPYs8TfN73H9c_QAXJ7OygrWJ4DbPY3d5vCG3OZwCzAfevM3gjWVCh4XvhvOP4dWlmQycbWH25Od2ep2PZ7Oz0XAczicCiFWIcTg7ncJ_FuJsvBhFo-no3FLphzxP-y7eT2v4jE41zoM0KTe4oj_98kI98eJV8OLGblj9ZvpE92IQvCg3YlOV-LMk-7QuctjXsnzx6yDwhnyv91RRUvOy-mOtJW1UY5wbtaNffcpF4ob3wkhxxzg_4w7B1nzKgMEh_wEql59wE0r9jShuS9wr_hC3n8eBp52lwdN2M_feKSJ4M5yalTfU7h2iMZx379wKGL_xSiSy_bjiZBafhRez2TCcyskolMOzxdlUTM7OJ-JZueK3X8RqT7aYwUUkhohPK47o3GTcqlWeEdcExhfQgVjhgXtUpYoPEYco5F0i7zUrhJkmEVxdEW1QxNC-wzAlbWmSuR_TEQNPTVb045z5LGw2PAlDJUVQ5KnEtwRiFSQOH8MXrYtkJYotXn6iEzrmsprj7yNcEfOp5MsuznAmp4uLYSzC89NIhmN5ehbOR9MYeMR0MV-cx1EUDffnDL98PPhLJYvtx4NXwceDfnr-eDCAZ5g3fqrWn-CHJW0s_jir0hS_ZsHsfgLrvpX0zJ9-xr-BUKt0wx_A66si5ZcvN5t1-erly_v7-5MinydAw3DmJzCdlzSJMMrTOIxgYrJ4GRfbkD9dASFESSZDhyhe8lQ3ySaVPPgfUfW4VMLpkk_VITfcf4cS_0cQBu_NFHgwtWc8nP0y-B72ahu8TW5h_gmoKDzM1ZsTZ4TgJl9sgtdLeR_8kANB4AQ07XvPvV4maQxawH_-2_8u1cg83u_x18C3X8PPedfrr_B-Wp8OvjVUb8Xf_XEpYSOKYJtXRt7fyk1QJDEeughgf9XRA0sSaQqXBiQIirckq8pgKUUMBCwH7gyAW8ZVBJsJ_7gD-g_WOZDCokrhzqWJXJzAZPCuehc08Q4hSqsYtbwvmyJfwRTzYr0UzN9uK5EsZAbMD-T2vNrgSW6DDfCVTRAni4VE5QkGXa03-aqkJYLI3yA5w42D9dEk7nAHYNUFT2Kw812sr97nwWd4mz9ZtQ5NgDAhmAocNLz3Pi8-wztveZdRfRCldN7rzPPqX9-g4tCipeAr8jtZhPAdEjsSfnD444fXR2oQs-FlBcxElP_x785pDEdAQFUBDMueg701fCJm7j4l0eC4Dw2aM2_E24Czneeb5e49hA3gg6LHnTOSwVLcyf_49yTb0MhAiaWEJQtUQ-897g0sushL4Emwh_MC37DOiw1woyQvB3y-K9gtoFf48btvXaVNzToQdyBkxTxJQdllxRfGrVbAxO0MmZPrKQYCKV1rcqPT0fgl_GcSICsaaBJapBXqm6USxKQJ8wXANcC08DhZouCCSndmMl-nvAlBvlbaMrGbMsoL4l2nJxcX43OwTIh3ivtPDiNCFovaUgcXFQu0PTZbWEO6WQInPfkqXq7ychNKuC_EBEOWcC7zhH8rIqEb2uSlb2CE4Fs9Qhs3vfa4KTDTSzWT4HuaSgtHfe3yBLQGK-A6cEqgjgNR3CdEZhFTomBBnIkU_koi3lr4MFmCaouKBUrh74EhsEY-L5DU53C8n-P8PuPTzOE-Kunu3mocicxU4i5491Hfbx7JeHwxnp0__Ej4KFK8cijY-M-XwOjDDFm2u_GNff8ReAwxdndzXwV0HFcCdqbIq9I7h98DF9y2bPZ__tv_aR3sP__t_wb3AvgJkLdWSVLk-8Pp6WnJ9iSxVLr8aIanUb7MQcxHIsvgZsEz0TLNixwJnZ9fIU_A9TY28Xw8m55Ph2cP38U_r2W8jE7ArH0pik0SpfLlzekUtNbJaDw5PL04Oj0dn1-Ew5fA9NINcKfGXr5bClCe4Rrnt1skCIfn4drfKL5YtlKqUjgVO4H7CzxZsWQcAZkDc1bFuTSzlAmJA9Rk4efAf1jbmieZUuM9Eh9oUVGt12iE0EcelQ_QDoVbCCyPv2sS6tnp5Gw0nk4evse8gBRYWAnGkdgSvardLl8Oz4fTYWNXX3fuwSvNJpzLNkDtWyLJiErpkY3NvjSX_BXa2aU0SoKIJO1CvkZBr5RwsBaysAQ5mScxavWwW8DOFqlYgaWUg04TFxVY4odvby6vr8ojkJnrpECFIplXwLQX6BPAoTIBf32Bccs8TqpVk3ZHp7PJ9Gx00bWvWtMFTboEkxM0Mf7ddMxfkO78KYl5lUMxPR_L4TyU8P9wPB4Nw_lYTsLp6ZmYXQzH8Wg-_3jwa82cTVAhyOTmExuRdZOW9Hp4bJeRuqdpeB4P0TQcn4azxXASLuKpOBvNYnk2O_uNTEOXk71OgWGnW2UWooHVZhdaPTBKRaksrRYu32UztlEuWo3w87m8rTJWM4zN7ms9A19F7ZRWg1ZxdR3gcbL6gCPifGCCknZDsrnIakgpH-RQ-wFe4u9m8BpY-m0OUlGZ2W-2jkMvIf0kQmVIEkdSHjJyGylFqLml6AWDX9JD6oayThuZd2mtKA7mW_pK7aOyB9k6Nyeasf8NOF-U4MnDRJQjteaQfFGS3U0qQv9B7jCsxQWYz3Cvw4vzaAHm9FiEYjidhfMh2Ntn50MphPiv4HLDx1IJY-_lcKtT6dPcdw6FP20g73bUnDZPG9m_WM88tNE4Hzvs38iXaWjmCZ7Mfrdlnc5cP6TrSfV8ol0u1h2k9_hB-sju8aP2ktxThu0gt92O5T38xPs7hS_m8jS8GM_PQlDWF2E8mg1np4vx5PRi-ps5hRUhBt9VWUTcuy1OJrNbeB3JbxRUILxiFkvAajHoAtIGrEiHrJUsTyhqtnGcDUaogyGeVXyGa1Gg4wuMG5I4TlBOBCWo3ckiiezY5G-YVwnIHEGfFhL00hLnY_3EpKosGt5iIJ8oWaO8JfFuXpVkd-h3uVVmBIWmKFa32KoxFmp7BLk0SK9Yr9OGxNtHT3id50VMlghM0pDj5a31xoOawGG37C5PYWaw5es0Jw_3AtdpN_GWN_tbYQNqsKLurbM-dfglHMhGupE59PNwxM540XW4DX8hyKhCisMXeDsyAPkfATNKyhWqXc7WsBK2zpE6KYCK7hr2ipRgFZR5xARCjgc_JLNLjzgfDRez8_NJOB5N5uF4BnrE7PRsFJ5PzqLxdHwxHc8X--sRv7Nn8Z524lVwVXe3HV7965sjnNPvfhd8-0VGFWlnN9UK9wo_b_8Fe0fuYeXplsPvHd5Gq0SpA0jw8q3w8NEHUBLF10zV4BDJmjyKd_IIyHzjhkeB4Im95bcsaWKJSu68Qlog30sh1rLCp0CUoYmYiugzK5SGKzK5xzA1Wi6w1bUE8xT1Tg7qoIleO8l8nYBlqLyu6KQtURkV7BjX4XbYeHZAFnfoUCm3oBevSPUXoIqqkDwud7OExS5BzURvMxCrol58cSkWoJKiZUobC3sUJ6DKwkQG5EGBMwCrF0a7g92ktzgEqB0tZbBKSnwIhAEeDe4F_TRFpyRMiNiXDNiLRN5MNCyzSPLVD8NQUcUQoQLsYsVjbKUJjFjDISgVH92Eyk5qs6CAP3Y5PdieoZg8XjlQ-q3K_93VJf50CMYz7cMSNgYY2i1SIFx0OGUZG3IQfODEOUXBJpMiqCCuCHKAe2R8mfBeFbdbqbfiKQBfRMsejwdIC84A1gQSE74l0tKUaSzBDB3CeCKu83mgjBokExLBSJL5V4m6BPov1mDCSHVusK80PvrYye0PR7hGUUDjcHyg5vhh2iQ-5m5ymnyWTTvS1TUUG0PljcMbIGhO1JmPToz05DuqHH32jhowheKq7r3TfBTpoeHfZ84LtwIYEnMD9XZ4C3pglMMdD-owLrYqXnESXNa_ZfpRlEfxkziHC5zlG-W0B0KsSHQUwXqZyluwEGEm7JisslsbPzk-hh8dH1tqYLgFmrGMCGm89dC8k_4ug2rNLzsa4H5pXkZHTvEV9Tu8gPDNHaonxAvglAsl2UWCwBs4lvtlEi2Z42Uywu2G_V0vt0AFwPQo5AwTwi-AlOnXETAvPkf0SbG3CnQ3GVlRDod6dhK80SINX3jZfZ_lFxixpCvi3hzeIORdvPf4tTrpXv53-PrtzZGaBs5jGLxTZHPpjG4mx5RFbhjFqomjlMlthtIfJYSRzXRUCfllyPvtSBE124TXwTy0Nt_jY3UuFBk2kXQZV2kKKsE8hesDYhVoQ7G2OfDxDNfExCNY5AcYt7oFfQjZFk10JcJhcPhPHz_Svz8N_-kI2Ydcw9Ewn1kJkB1pmav4Dd3fFVBZyqen1QmaEaygkLcKL5SYPTfkCnfo-JgEDHM9I1sMbIhXWchFKr8cH6NqIzIFdoKDR_c__CMBlgVnRm_7SwXbxQ6lIrnF74W-iNfORTNxL1ZUU1LoWDipDVP3RZ7cngAjLMDyJLaFTFG5VuGvIwrKlsB7iR3g3eWVVMDeyaVEr7YENAp-pB1zXPF0L5iky48Zy1QSg3yYxVZvG6wP47Ecw3M1D5pWG78CBuC_J90GbBV_gTNLQWlSPiR4EvZwk4QblEsbLTxwz0p1xi4R84TMjceI0SovUBlO5R0-oKSUL9-t4kmG3hw2m1k5v8BlxBXpP8qn9gq37zgIgFbevgFZ-l7RI95BJt7VKyB0ImulQijhDbsh5jkoxVLvj3JaCrxQJTFm3A9Qzeh5oQfEIZg83oa4pds0vApFCdbRBvX0Q5yHvRiKulVAuxQr6Vxz5YxleRQnSjfjt4GAI7VQSb3P7NyXtIx3r9-B7GjVC-liWSaB9uNKpAwQgGkvEwzQ4v6S0sC_Ab0DFSiWYeg1LqrbF40JxXCr07QCdSYHtQ7eqA7vRB_ADagJG7Sf6OG3cOhrmPB6WeC038tqvUEk63W2TOYJLtocjOY3wb0Un0GHU8OEmT9EoYdIeAg45cObt--vj-weGyJDKrI0hQsid3JhqHNNkRvgTHC_adFFUn7GAzGvR808xlvDaiurJ0ZvZrrnZ2VxiwfAkRRmCjc376_hLW8uf7wuj-wOKR5qqdSS6Ddym6uYjcu-B4HDb112W0iloinBlTMCJACp5HNUIj18YsNMB4RZAtRg1EW7TZmswGaAJSmFQbvlwazV4scaFai8uCpbm1qEAwDTzZIYz-9Q8EGQiqHOUOE81F3kK6FNMdCNQ6Mva6ZPzHmFqgY8uS5lFefzKp0LYBpM9Iegp-Ea85RDkamApZM2AqyxQF6uhXYwNgCcn0qFR_jO0XG7jAKRkuSWX4ADlSypyKbRU1RYCYG3UsFKcHMKsL6XYLWRNGEFq2aNGWb2gUHODA1KY_7wu7QKDlHAgEHzVRzxhzeIPoLbVPKfLECA9cN_Xb1pg4TvaE_6NUWOAHRY9xwEZrREIrDijPxLbKWawC55lu4EqgRFIShSjGaPhsGYDWVACrpm4UqwJGBFX4d-SUvtVPrpLh0ZJo-TdeBnNPkrmcJGB4efM4QwaIVpOAqXCIhp2ByO8aK27g8JWtBXYvu_qiR9-Zb-x9-8QSYHYvDqTXDoX3svoEUqpQk3q1Ff5wVYfDHi4L55x7sXFTCekmwewKYgqxXO-uPBFV6M75ATfjwAkp3LFLU5d2ubAMsuuIaC0hjABuo0Hw_ivIIDDIHlw_PwkpzPAC1p2nLH1038DjgtUiqJfoTk1ANHcH8mJ8E7wzxuUJ4zCIZuzh_VIBiLZs7kmpotkqtNSbH-g3uZpuEG9BJ0hsUnwff5PRp3A99RhaZIHkVVYdSqCejliibdGQaHH5wZXOEMjkhDRxRMIR2PyYo8mBm6RtNFmCarBO0nc1Wvivy-RMtT3amr5OtX58-3qDYK-v1dzj9VFxc5BNwKMlXRmy9QaUUZhdFJlFlJCdsFNLNRI7H1QTZ9Trd7AxZ2ya_Sax0FP-D3asHw2HtcjH809PbPaFiJktCMySZamnm9zrNFVarbz4OeBTfsVvE2EJf0o_LBwM4xtdBRuuogbCCqHKTCicwjgUM0QZGEwablSww6wMeDIp_nIKHWa0WmBeIMPiebTUofkGRASpErCoIamA_5XBxXEFoBqI8BhwLi91UZQcpVmQh4gVUylfNIQ90c1RJkql43imq1HeLW6P1r0OeigVGQhFUyRJYnApEraluBYGXyFe4nfF1uqnVeDJS7aCWMnvBaFHGSA5slBcV99QegmW2EX4vgEOg3idHZVWwCvBZHrKVtUUKzfyU4xN0PwOTL44CEOLzZ6iPvHRHhvITtDKQuLYXo8ByHofG-wSrgX3zI6vRZgjsePVcQKVWCplamcIdjPOFyk4PIigmShkHrWztFlmjO5N6C9S1uV3Dih-R3r0CeoG25RTvjTqJqcARbm2JQJEbnusSElZSQkuhZ1U79XCFbeLvgJSvcUkNPinCDeR5vybGDjEdtnr4Y44DY9rWjWH7MQCsCAUqGm_K2Ic-Hm1MIq47JmsFjybihqp7wPpAmGRy-ybOc7YAfvyQxCrZrrQyXR0wgdBHJnUvnVWggAGJ276X8zHk4_BicEQ7sHJYIFmJDASClPoKtglORRfKV3Za0LQtmvg5ZtxDaQPFNpnc48IZqXT_nG1ehxs2lI39NMthbltKvUf1Howdk7jZKya_iqqvoXixclULrnojmQEekmRCYDaBP0D6QA8M80m8anLgc4sq-t2PWBh04BxUuhzv8lewbd5qgSBKX4rkQBKbE8FZs5IyBdulptd8vLaTPUSfLSFXt9nMLx_HCwkqkFSl8GEjfodm2uTBLdg9oR6o1eU2sDF07OhekFj1ohiDIQ_Wi9CwjHWOgyEKbJ3ugXGjs01i7AEd0FZXa3y5gLnD9yKDoiH_Bjtgr2mNIOirsutxGS5BkwDAjHz71hmMYyhpXXJNuX6llUMP03uRfHIsbDYRCwqlIMt5h0ypUUlJ0tWLuIZkjNBeFJESvRkScj4KKrGCy89AG_5hE70FjYCVj0WdBn9TgFxtRfq7jLspqTpHPTybWyoG7kD7F6J4sgVkSzNsP-fsUCmqmwo-LehjUCUPgYS88_34LXLTF9zLQQo4OQDv13HAOBziO-kKkJwgbHGjg1GQ0AaKchudnYhKOLyaLcDpcTMLThYjj8fhsGp_JJwU8_9maIX1RTuexp4U22Wu9SFRw07N7-KLDxscCZS_68atijYE5DoosZbrmkICKXJh4hYkNrIRrFJO30OEnjNHQqSoRZWBEJgODXLegFGGwpWTvF4XWkoxYr7VrSwkcXSVOUGCLGLziQEkRoCqxktptuRARZkWAUlVqdAJmU8A4Ok5As4WfN0OdvqlSC2-SOeExFxQn6GWyAI2WYKUXuMrguM3-1w8abnaOybWkAtPBsfcBpZ9Rs53zqwEJ3DCXf9DqPOFkVjkjM2BUYMuCWWftcCkY5R1FAtcvreYFkpfyhCtfA6cb-84KvmzuMVBo88u6So10u9bp4BlC2uuiMElT5GMeCpUzKXQMAJTNV0aA1zJ7SJfCZGUpUxXLQuy8FcCYKkB_qfiKIkxBw6MAwzBxVGmnA4cOkugzb5RRHK4zK3gpHkm6wyXaLJiEyPaPchvBn1pSuoHBsoowbobT2_beNNq0b7b9983fL7y9yldBwUccLSeIEGgFBQfXtwYcRxt1h8YeZto5kWel88JOMEBVWbZOZLYliPcKjXy83h9g4BK9MlWpI7RGDLQ50-FftTPHbeL9US4UUFPZJ54QXc85Wkt0walq6pZrPBRMfUnSFQsygObGgCMOYKrYpQZb1MiQXW-W-xj7YXRCIATDhm70I8EfiBXR_r3Hbcdv_4DugDLZbHn97IEES2ieJuXS24dEabneFih1ls8hrzbrih2oHEI-LOHvanVUcwU6kzYBMsVhzb25oQgbx5Rx7D-IW6A8dFZIJOSaCHIc0SrMgvoncQGODJEbBDSdO3FLRohyd2u2DB9UhfK5atCa0V4J587hQF_PL4PbFFZGtrRZU_12aMC2DoQIu2v6it_Zc7kXG_KZkZA2EBHvZpuju4zR1-DAMW6qAhibDD6wkU7e_21NImESHdjZqdjCe9zx_fup44rIHO80iQSHxGnwfUcKFOTM4BD4G7IT_FYtGkuMlPYVbPoDSWcUJFDP3-rwUMpWjYa-M29hzyNMXxUhIZYIvBtsaqANsBrhuZAiWXDAwGnIIlT7qoY44suFHs1NUK1BEY3d2wJM4pq4Cb4cmEFOw8MNe40sD5PGVYhde2xVFAzmqQ8ydo8wluZDs3H1jVALwrgJvoRFJS8LRTqxTjdiDZc9K0kv5ZA1iD68mzRWtVZe0DpvQJyksoFQL6s26lQ0HiJxBPfKWXek1-1s0hlYewxXgNmo_OY3VQmPAitJxRdSGBz_Tj0q68p7rQoMWD8pNxWlbZbVLcpIjwz9wH9kZqCsuBXPoFAzcLjloGbocQoPvNjEozJTNwT2LSP0ahHbiB9y9sSxNDlpxJ6-B3px0VlGgbRAEicY1Ko-k6dLGQt-VvJKAIn3J71pXJVWP3RKrAYNbbVFTXxJB4hwoJrG28DwaRkFj8QJJ5c5rkueLibxIZ95bxRpS-QE0iXqNOnaaC2u0Kkp2Y5KY8PWLiOMHX7DQmKTkLryPWgJikGw_rGhijdEvfyOtc5mVuAe4q4WK2GRKFr2bKq5dLUkFfYKDr9LK3J0Xaoc_DajoLFFiqE6gVgVNgsO6Z-O4ndkPaDWADIcDV80sDotL854jcjWIaVYlQVYC7LrmI3x-Sd43FrcZaxJ16T18fEeWBQL3_HQKEClCRKDifUZqGkJFolaivLj6DIENhzaHc6pXQZr7WjvpkIXsnT0LCATT5KZi_s84XcYHwsVauLbxapZM5gzRpXJBjfcWIc_XxvI0XnTJoyDrMqCR5gc_rkWfCE_M0VuBiZsg-56G7IZwDJEUSylddq_RW6lsDQEbdCRoIFTHcK68U54QSDVWmI01xidKRDbqsAuxjSk-SOXLhLEtVIpCvKWaoctZRz7LluzziuJiQ_uJE0gCB24qKcfVujOAqoX7Ol-xzo7n4-IQVQy-6JAZgoqnALbRoKtiAV7H5ECFxyCdCcLXFJ5uBCfAYp4UpIC5YOBMCalkwKYuMGM3XC9KBK5FI64CGLyHnA9izmYSPzL0uFeZIkpXzWv0n-vPpjf0pvl3OxHOrIyP625zeQ5XIKplGyIM5UGtek4tvZ2Xsnz0XgeT6ahjIUIx_P5NJzNRuNwPLm4OIsn8elQnj7AedUK16_lHDkJ9_qmN8HZ7m-IFq1zw08tr2ey9lYMMZKafXzameP6_RwxoBBw2tYdsNyni-rgGEzEHggiuc0cb4ONppt6GiWaT7AqSTGnk6C5UMWsOKgZx-jKDDJRUjZ3rOSMFX3aUmqX47gqhRTf-BiTgeYkKhpRaglpmK9xQcGeWjXiLc3Eis86hNrzJ3nYbeVPchwLJcoNx7TgVWoZGhzy36gCl8CduKCNoOsM4y-FVlV0hR61GNIrKC4F_K3EKI8yO3g4Zc3MMXqAjveURNYhukrh6OASoUWolBtXZRmY6Q5ch6JR99eGfpWyqtJ69ds_HoBCvVgoH4_aFkQRscPpBE3CQpuQZHXb9_lZe6R1bHLF5X9cY47FutXDCgzCWjQcbJXG1UFbkpc6psW21k4_H9GJ0dSuM5buBvFqIOLaLbbOyw1vfAy8EqkVpYGnKy5SkJEBVSahswPOriliQ4gli7nlNZE_jhG9jP91kcGGfls9TH8QoCgC30CnQzuv8dxBwhhlCA6BFR0f39VGOD4mK5HZwvExXnTYZlAiVojmBJFLrliLViYZCd-CCNeYHqsPq19TepAPP6eXgHzsibCVjmvGJJlZBKGiw3KVYw0iZaLBe927EtzDMpkFgOZFTg2NXESTVxgYp7dlwAmZW6HrgZ9D3QHjSkpVMW4dy1uPj0W6Xoqw7Tl4w6FeAduV9OjQPoH3NI_o6uqQYfeVZw4CqxrRmm54B5SZ_BrBg3wK2gcszFpNxQFnH5HHo2LW3MyyKgqUQtrc8qekwZgwOkzljKZSJ0eeQVKaJykiz6HC1hEzUEpBEzg0g6AWNz4x_ijYn2_oN99hPU9yRimugq-qv96DrYsVyk9LIXhN6QJmSprw5oLIKCtZNtxpxt-CZ6GcW1J8Rq5imIlaiMkWgUOrCn8WntVIArBVaKgjpuNjxqvC3Dmwx04RY3jF_4Q72aemsB_6Pm9LDvOZs1VD2ET3lA6_nBcq0ARoleuljAsN9sZyLttUgaD9yBDHht75PyKtvTYOuS8w2pxunUA_TckTyWSKoiSdS52pp7LERYxnelW1wIZJLeeYtrpmCZxIBIwZ1KNqIcjZx3oajL-CSelqPZQHIFLJ0O3bimWv9qeQvlYkFu2v79FPWYLP3VBcSIuQRBu5MYjWuVwmFkyNWh-IWbQp0RuASGlBIBWtrp94vhL0_7zCDN8AP0XoqYU6ELk4joYuZWopjN1hoB1NWK7RUk7aXlZX7ZgaFLbG-cWPpOoZQvt4cAWLxcS3RDnP-DVb1jNqpZiU2-A1VTxOsvBqQJ6V20LgP2-qGGz62MJ02oSou1V1wmvJJcpVkTzm4RxyAIpoZfwcXFZZTkaeKW2yU1xoMnS3mhmC5p11oc1RZHZg6kQEOCvtQc66Z6h5lQs9VEgektMteRLtThZvG9HjpdVJ5tfv1LkbicDJw07iDawnkgXopZJEJVeLo5pa1nlAzjAgoVB-UVVwXLQgs0sz7_om0Ro55VeVLSw3eaqS2eJEqL98DNiJu6j3DmiVa3FnZb7KEkE6hOUtruai_UO9yXjeWzyM5HvCSH5PGMn3hJGELXkHtKOwm-WJv-8fMM5fEMT2X5IN-lDIWeM_5GBx4bpkXxKJqfXwE-Pzqf3gKlksECS02QY_FaqmAK75nQseQr4nFcwSbf6MEoFxK3OCsnqLvAKafgOcbHnCtQhcmQBqzTtXaJBEcD9gWWhw33WppT2GCi5i0f8NU5oMHx2Fnv9ZcjRjozOdkLeT4aNJiHhBTcg1Eo6J-a_zNcXrOPVMOyyJfREwIK3AcvsLaBEa-YvlXFiA9zPzD3V_ew9bx9eVnjnpnMElsgvlzbfp9ZjfSqOVa8yPUOz1rczDm63OZDqie0noXVZbU3LUGW-sfsNPXPMCdJYlCM4U7yTINy4NRwXpyVjlQHS1TtLmT-Gq3MmM4azGCYGan39JKRNDpduqMnfAWjaVLyOM616jpx8gFhrUZ2uwKnyPUCE0UACVeqItgqFrOygpglbWtcmJ1tpIk2W16P18wVRi3D4svrUCww5uHhz-CFyKYgl7sfQbMACR3DEw5F-PGn6I4nWo_dShthxaZ_bpSx7X_56z077Lg8-BX95LcrLW76rLgr7XztNO5kgZCA7Pb3DFdm6ppULt4_dyTizCKb97-IGvHtJ78GOWbmnHr13dnu-hDrz5LuSzcKKcyN4eCxtK03Z-sSS4QamuByLdgJS07tnirFL-JHqXde6oCg6EpgQdA-XMYuG5mODdW2WIxxIrGaHj3A93Ctd5qy0Q0uXRnjCE-S2KHBFtCf4LikFwiMUm3mGgW4e5rrPgBmhcrubAy0enozNKasLHyNOfq3AnykFahXZEUo0ArjoUlFFChd3xYmDJGQeWtDaRcL8kBUyZputZNi7v9GwSFf8yVS_qOF_ts00Q_IFlu0oKRA10LQzeBMUIzDbxZt5rGadLtyNeT58GySFu47EgQK-v2iIp-RaUjSb_roG5dm3CdYrhcscnk3NmnetE9jzQc-16pkKAnb5f5XjyPFZ1jjhQLgLyeXa7SAwdWw-tMbTZ22nNcH0A5pAHrB_uNGbhchVoBVmAvWZcfjyIrGsgKdBBto6ftc4BlZMTFrHiK0xU36oCa2FnC8WoyLn2GERUa8u9CLmu_sveSENY7cSMZkS5TBYbznULEH9UgpIiOVEiRfQgTraxRwp9ojLmE1a7cHyuho2-XzBqNtLYzr5-9dvCsl0iVgW5XELVikJDgnl7c7RfFGzj1fMKTEEXewXcoEdrTKxO-_tHxCwMvJ3YjryQ2SyKo4upGIVyhB0ohmIezsViFkbyYjoW4_EkPr3YP2SmggW0HQokUro7hUo4duxghK5XaK-39QeaqlzOwTAeU4UsTvCIltu4sEUGqG41fpzwh4a1oYC20Tk2Py79ifQE6KzH1wPiOhXma9gNq3sHTcCvxyYpvN-0F5y3D9jd7oXVCGaRByZwofMFdBxBNVfQ_RKkCaptufiRmjZj2zIpv1KIpqgykB4YTxlYwCClqZUu0IbwDbzOpnuozpZqp01sUYFwN70Rz11ux48HC6xOFapicyi0DhqFlWw9D5tyzZdUdxCgMrmYaGdc0yEl7gRz4PMJ-sIcRYdEBP_eVa5JrqHmZMoCepFqS4MtJofthuWmI9yLrfLZ1_aP5CTnCxwfw3QZ5GgecMMPTgTke_P9e04tZ9-FRjU18BiqrLkufa10PDyGu6SodHwyj7cvEBu0qjLtgQlU6joR4hLFIvI8VkfNJE0QwwRmvuHuWgTLMlPdoAWAYRkS6Mo_5Fg4XnRlEHzvRlbcwEoEKoDVFIi4dUiO8J9bMow4lnGj7uAHjswZx9U8URER_lxVRVZ1kcx1Mm5L3Smi5mJ9VQvGdodfg0N7FzEz1FxRLghDuc8mSOLxMc7sxLpWKhTzXe2W1CmK65PtwUs1-rmrwAw7UYBa3JNQ6p2Orm2WbhTKOLZVrEopQkRehcTAK1fo8kmcIi9isxG0C6paGyIzFQzFSThLyqAW2y0tBN7UKrJkjjzOqypTZWukZ-E2pbHX2TQRIM9FTZzUgi9oeupeFrYcd55_1rYCprq6IRksGr5mVYkUfRm_Ms6y42O411f-mTEjqX1YqwcINIigQ1PIy82tqnPTGp3Y4o9d9QSNG6zByjW4xI2JaP9-i1__G5mJuNimlBKNBWFFEivNpy4p2-Aw1p1mE5DIAm_3rcH9UVP5PbeN4GAGXp1vHZS0EqRlh7hUd9KE6HIu-OgyGnwE-JQrVC3EwI297Aq8DAJTTMywFs_J4dcIJHZyg3owmKJbByrqQpDZnCtrKMtBgzGQpbzOsSx_yTLPLUt36Nd-w6R4Dzdt_D1BUjb9NjGTAhWPrCVBmjKKtSRLd9Wcja3O1_XM84Yay4zfLhxPqAY65UQspUpDIAgjGZFEhIeJ8vConEogdYwDa6vMFQLvRPEZn864IBWyeIcq9wqlXPmp0zeUYe3E1nWzKbzFmN2WUKFlg2NlbcfRQuj6orfIr3ORgE6IyhBQ1sbL03bUI7CH7rh66Zqr-q6I8wIRe9uP7C9a5tgVh3QJp_xBnSmRoUnl7oh63F-51MLKm0l7Jm2Hl00ge8pbID9PQX1EtqkaqB7G99TdVzxnPW8MSawwJDFw9F6-tf6D36jiDGBZk3_E_e412mtY-7nxDQVOyG2_YYkcHMY2rFLpsMpRk4697WsB5cI8ByYNkyC3wD5tEA3NKNVL7ohresSYjY3O4y-RCiOdOPIEFLLXNXnPAqX-qRuGUZe3X3J4QqZd0VfxES0SbGEmFjm5HyvuKL_UUlioWXpVCYs6d3m4zNCKohUW39eRCoJ7LGFRr6bR5coOX7tj-cAShcWEX5bA9S54liRDEykHM8DGU9qX7OcQa8eYeueJ78O2rX5gRT-5BcIaKR_k-uowfx1p1ivHWnTkxzNKnPIPLcrsoKnJqoi6BbYjktQTTnitMCG09HIFyAUGh0yii6tekM4qmt4IkOktGdJ7sUs3rO9Vqaz9xHc4WtUq7uZpLQLTLVOj0gdukzjW24JIB4_1OfqvSttXVf0z5W3n0iqPtzJcP0edxh1Yc64lMIkrZh0qWU-T5WG7ruZoYEes8zsOCeMoMZBMtjeYOB1nNRywsb_B4mkxwfexY5ASld1T2pm3eKfZr1BxiYKGu8lWA-nxQtfKsdTJSbsR-ag0DZ0EfjYF1-twkipMQTjdoJELdWBuBWcv71MDbtDh09R1pgoC08Q5OiD3cRd3eINrRNnjDt7JQ57BI6zlXT-9HnU4ivucPw93GlvaOML93eFud_zIo_PT08n4dBEu4jgOx8PzKJxPh3E4j-LheDway4vTaH8_couNrLaUJLJppbLLaez2FGv2mDN94gwva-R7XHptW1xDPji8bAx4rQc8YmdeqzPc7yfiesTR9NdWtdthrHvirmfTYV66TUHiF_nvzCaph-6MKW1UMBez2Z5M8U6o4rkmd_w7lPxUtoEgc92roOl7CpO9HJT7xoUL2OqgooOHtnEE_-7IKjX4K1I6uGvFelsQBF09V88aX9lyUdw6CWQJp9saVcSAdmziC7foddTwkuPy1spXMGr8VpVEIWGvZ83SVoG0t04zCr9UOC0WFCe8zxwrUskQTlBQKSFZya44DPrCr070G-0O1N4pGDqCL11ugSssRSpWNacuCq4VIbioJQ4WvSsI32WQHLUScycukKujuD3LNG42TKVdVAkczCciIInKNtHCzrZ9cYtOc6UpkKXRxuyvuX9KfXLqyRhHrar6tX9fyRN7rW2XEVUCWKN6SZKhnYxhnW2U5vmXLXBIRIwfvv7xX48CmX3dUj1ZLxUAvkKEEFoY8K8RESfKf_20KKT2SiaaQh0Rq8CkjLGjMhGJX7wcy6ob9zt62AT5W6mqgOuA5qxQInO8OJS_Y-SKN7xq-VJic1h7f00lh95RzS1wOQGfVKl7A7bKuIRQlWnaWgpFW4eNMihWR9RFBDshmCBFC82-nEz9I6xMaep_YiboeqlwRxrYkXCVziT7c1VsaSqco0vUQeWGi0TYKhtwzOpwg0P0niWojwk6_TNYBHXaPdIxCpqTPk7jxbDBAmIOll9Yq84c408ZKXFuP1SPC6NlQYUBqHi5XWDLnXAdMjYjSziSyiiTmt9g6JExP5uikh33zDIMv4gBi1srmN4pSUQB2x2iBNOPVWV07u3b2vJGUHtaoy2cgKVscp9IX276G7AY36DhfG7JniTdV1nN-BYrRAbwmo8HKpGY8Pa6UBL1jKbiQ2z_HnTeF9_zVxi7WSea3efkg_emyYDTvmiqwbJaPcIrIK08ZlqqKF8vGYzoXNORZy-jv-6oPTqxg3i4IjWKDlM3QK0aneGDMfwZWY2-NlpDwSZKTWLt0d1b1bfvc4qY6bc1isWpcZ0cajvCtzqqozsgf4BlZXnKoYffU8F0rmWpOkrBu2TIlcmxFwgoLVI7rBqSjwWsIVx2DXpKnqPUGJpV070Eky4N3FiIOQR2ch0NXMe9KSlSo7djJrhj324nRurxIE11RMcq8ddgtglWx-C5FMNX2rSkZBC3tvmfK0rOkI2-SwM2Y_3sXctzestGNPWUQvb2AiN8BuPCEBVWeukM7KLUjb9wBaAtZtwTpFM0WoL7IUGN9gM6b6lK0vdyDUx0o_4-0ul-HDnURXw1joydAx7XVE14rDWIAAhCkCrelNILY7FCU1sl8gkP9CEyu55Dql2z4eoJCDqPIkxC3oj0SJfxdReMrMoWELUxRY2xMB1rBFVs4bksgCxsVkZoC-_6XkEurVFKvjhUjINptFFtXd-9TPm7_CIZuuyyWFOYW_nPTNWFoFbnQlfgpqIUup5FrQ5I_abaldSreASHqsj6UXBNOYlUNoZykUgtdbSvF6UXL_aLvzIUTzUvVlhUXiQjIfl9nPLoNmT3twKurtzozwZctXteYb7OraAqFjbuMdAZNVxgJPgjnjxq4SEo3KugKi0ovLVOMfEBfXicjqngSWpGwBdkTL6RKgXi1l4NWYAs0-GMfvpQETDyrTKhxR2RleBzEmeSlB947apeMZeK0_UlKKmfu1gopSF2F2rmkuiEa_jM9cWL_LP0WIlffVdfL2-TO7C8uzQnv5CysYH9TsI7vQVOZqGPsNICea2VbRWFUOqq6YuQeL0nNhSgVa5R8w6_RDDjJMkRlKrcXgKrk6cwwA5hRRWZI3hR1g7SrWs0l1xIWKtTHw-WSQy8DGFl3vYhOMrsni6n1xCEbg8McYf15y1vNPyzLRNPXwJmfofUW8p9_5GqPk-3gr42szliZdWW77pkd63x0aouHYRT8qAX27ziHhJCV83b6bP9LWG7jquvx0nrbYvDGZ_BN-tTqnEt7VGMuRahtNiX3U5YPnHndJkPMnB3jy7PcTg_H8rwQkzPwqkQi3B6Np-N5yI-PYvGz9rlGXs7J6m-bVfUmY9bO2PPxiTj-p76tPVz5JYwTOVVw0oY-L1q9miaaekEezBTIb96z2H0dVHvX3gr3H8EugC3z-9Za0OPgTm_vt7CIsbsZOmiy5xmyTB7jsxgesZKFJ9ZRdQd208e0sMZnYXbr3rPTBdt1b_5LZaXDQTYn7pAID61IN3B-GhOgjdee2WU97eFzrujlBdTv2DB19o02jatmq9fII_A3mXcmsdUftMFP0gs8NYuVJ0DJ6DDEX2WdqRabFRtLNpqVW-bW2ev-EE8C8V8TDsgavW07axxz52CZGw2uKOd89nofCEW58NweBaPw_F0PAvnw_M4jCaRPD8_Hcnz8XT_KMVP61hpVnEOl7Yk8fGnX16oJ168Cl7cMF2wazlpylLDy14MghfcBR5_pgkmfvHrIPAGbOstX78_TxnLuXlPm1KtAMUzLVU0wJXPNrAb6HnEoDfq0n2lOh954ZT5YBdu7I-UZJ9AJtyiz-TFrz_XZOg9WHDyE9JVWRel_CFSNI8FT5tJwbOWOvcmPWJHOwbbh-xonP6fONSF0cXmOx89lW5y22NavVT1rBPtJLPaLHdTkzsth5aI9e2nJEQX51F4MZOjcDYBdWEym11cyGgxm5xfPKuSYAUZQRj1yvADDrOWWmlY6cxMTGVRpZa1aFOFv-eO6gDmWMWgKtQo1mg-lzWBZqTYZQA6PVXPKeSt4G4ira5bnCOrx4VyRtxj6GFu0SjKG2KkbIAaLz_FuQpKDmNifIvEx_Qf3F38HxYZ_F3wRrCz27meFGnu_pUtOPjai3c7RqJvhfj9z3UjQ45PSI5btaExSKrb9E0n_UoNzPoP8RecqLYQ9UpAMHcvwqn06zqUg8NGb3NuD0WgrkYHoENsuWmCXk61DQ7pbPKeXbRh11oXH5uIXPPz0hz-2dVO-cVO7UqGJH3WzYTqPQrM0N3zanjG6a318jRYC8R1h-uplPjX5_0TZNkk99KA7aH00KDnbeezqeG6YIZ12KieJEUXHchK01u_D4aLijj0nG_gxtxhDMIoMGQBlPiXBFBgvIIsHBq7rJv513W8Rb8jw69p0jO_K22jfAO85jNVDYT78y1eOsMOXOTF7mvScT-auNZXfQRoCo0kbsZDrVfWYVxsjzSRtxWt9opKYeiLdqorrcE2eLUNG46PQavH6IquJN0z5XqN6R31PYBYn7X9_KDZFKyP8ehOD5rf1Go4tTUtd6Gd1C9cw7xs9tWKI9i61dvLHU2onZKrra3O0cbqWYTbYaylB_pJezWb4Dsdl8qwmSx6uLxWscoHYlvmDlS73IHtets9KacfLggFjid1Y8VdL9ZOtLHTLnXgeoyzrmLbPVvHbvXMLcXkNkXt7LPmegf3aLYWHNZ7kpoWkATQcaVbj5yu9-xqcBIqol_-1p2y6v2PGk_1bDhHO6x7WzX627cGkCmAk-zf7IZDcqZnjK4LxvrGnbjtni1sH5KG_Ot1jmH1ZbO0fWCclfuNS3oUglpLEwVVcNqIJOVD26zYviqqqYrK81zLtIu_XPaQwZO6YGjWpFpsA395cj-MPfSXbn70U6PjQD2guav-_6A98uUU-nfROZ5a2jNrtU3v6pU0PG21XSVRypgqSPuQktoN9MgOZtCoP7M_K2grdHvJOdG1ism6XrJbE7CvVnD3nFHj2LvmcUfFYLca1c5yuirgv7tab_ecbR3fgRM-8arn1svxmArwa6n4UaPIrXfnDYwGB6LCtwmzxKiRqVUjx379t5HE1Sg3qzuwtRWBVeHPriqztrIsAZz9wrLeOXk3hpA99aqGyLFoWt2L8SbcXSKL6wZxSbVH1cqyOfemXxhXLSa85SNqY_Xchh2c8bqj9A32bW8pO9peZ8mtLnrk62eoinMS8CDY9HY1x_7OVJTT0_a6V4Y2kirJaVizB1eqVRdQvPaqjl2r290t7LZH4TPNlqRtSLJ1UlVqtrmGw_9mFWR6eHPvKty79I1J0nKKoCi-u099jN1VL46P2_O_qASLnUj3jG0yqUJ3q-56puqIrqyxX-kMk2_WXzTD6T6wb1kS1Rzd5o7uWlmNXddzN33qxVX_2ChWsaMuRaNoxAkXOaXkyXzVZ8e6lQucXpiqPqyG-QlbhMIvslC7aaQNPCQxetACNPaM1Z6pN8zYHam_D7JylTOBKw4Eh36NgaNBZ-Jgj0rQSEnVKTN-bmkdUlbV0-cdM3ZyEjzAxdezlz3pXF26qmKRD89Rgh91pyjVnWk9c6652QyoV12GjvwkNzdp_zq4YAl2z8SFH1_uk1-j0muOtM1KDin0-LWlz8CgKiVmYPNSdiXCAMV2Zbz0yd9a1sqRd9lbU1e89rUP7ta7T5pKDwVwAssgMNkkTmZSX_oJmksm-tGZSaKRedebx-WKKOLqs2u6vIN-_MpPomhPmYBPbcmIyzra2U2UgOG9fAhVMejRCmcviezEbsMzbhmXOnq7F0XeQxk-vty5xe5d3QN5jA1sdsGA66Dco_7InzqHkxYobg1xG7jtqfbAydZiL9gJSiE7b8QCA51v4QxftWYWKTcex3x_wAhwaTpf9i3FR6nuA491oassZH30ajts9ZtuXKofs3WAwn2ZwxqP2qcZPQap6uAWd6BQPx5coST4DqO2sIrnBaV2rkpRSDdGLFrM47mchMPJ-Dwci_FpKM7Gk1Cewb_nk5mQi_N_YMT-gRH7K2DEnJH--yDEHjGOCxvbjebqBYN1grn-eyPEnGntiQ-T4Wk8HYYXcjwMZ5NIhFE8j2cyAq54IR-BD6s7BNzax8jbt7oPyaPbkVKXTt1EEztmW2ySQ9kouLBlPXDl21x3Ga7lADAy6ZgaNrsYi26hQqR26OIzjkxFX9PN2Z2-wNI62GsrslHREyeFT2X01it2qGqgqDAeH-P16p5SEwWiagE3LdnfCO5h-rD2-zu7MSHUNrCODEksLsT65-nmuPFklYacZwo9riZerVWD4Vazt9c74IR6nHKyTwaO0JrIFCtbCoBYbBqHeG3vTaFKJ8o-G4ADTxx5xbTupNA0SD4_XdvKIm76-7b7XdvRqC0TIEe_qG5V3KoGRDhyS5C23_HchIf42EULgtGgxzT_KpHfD7CTUlmlOikExqRoQqiKUQdlVa7Zn28d5wQt6YCK9GxsO4ikq9JgrYTu80NNmoCSviuXF-1oE6ztqU3LFqyJbThRUoWAyO9u6EFRTN2uJfB0jPy52TTuFY-lLk7LvOnYgaX0s9td_LXODHTDG21N6E7Yhic8lP06Wglw1n6Dowsyg_fkb4yawUF6KL2JmtnN_Tlrew7sKVoi_9ddpkEqyOyreB7YzY4AfxcgBz2DambNqpgWO8MKwR0DfLCIoxPCVwCeOkzH9ot1cpuVJKAAmEkS1Z1X8cy7l9EM2ePLL2PU-jjCiit6oytZKRLicspFzqBamHb02caOdMdwNQFFZcwt24A5GnyT9OgZGpnTBxpqhwZpbwnQkWoItaotxnb8plvSCflR5NdLxk9D-wRXbwa1ohNtxU12MPaeCb59GmYH7R4ftnN8XMfsdHFMpfL1TK67b5NBbHDpDhUsTmRpdYvXtUL23Fy81mgHThGHh89dzEOnxqpwQjtCIw9GEOVtDegT1U2el677yWue9rCm8Tt9zB1o5T9S4bFnb-XOunFLB_ddG9vZ2x2X7ASjexrd7t3rXKXbPL1V-cAts7qyIKY-LJvTjDxQBR1Z1bWNxPleKFIbmC7du9FLzZjHft1De-bb1le0kTliamn3dZxWICaFatI3PZW1ZmEtrVb3wAM8HLrzvACcNpiNrlzSLMt-AuymJ_RJp-foU7UyOarDquY21NPxyNToOD5ugHrqbNpUQd6ZJIO3uQ8tUAfdCKWvPQjA08XQ43ofEsXQ62W0enXlnij7377hxg6bqqYG_8bl2nvFRd_d-4b7J7QClXqbKZ08S6so2xrKQcCopDDd5On77tk7Exo8A3Tpb9EWac_FPanp0U5Js0cDnTqqsE-7dhupNMBSzwk56q5XrpmYxRj1KbS1gvi7EEj4ZAOFpBi4h0Dah3m3Zg322IEdDNeL7hp2ayK8PbrzI3BLvclsOxFNtkr_M9dVfjou1INDfPNMBYMdRJOJT3eXB-6eq1M4uF4r2M3ce3iN4MdWBuad2yW__24q_Pbt_G9Y-9cv8Ot20M6Ch9T3ve7T9p4C2OoWHE-vgtsz5YfVx92J8eqpgGt6xPXJpr15SIPeGfG1MYivpY_4ejzea2cRzT6v6H7lNQOumvi81TJbOW5_IKgJTCs1ME3VhdTi4slFKn9wSyd21qbsjbPtW5zyCdUnTxRk6WeCEGQqJmoD-PPxbHY2Go7D-URE4ViIcTg7ncJ_FuJsvBhFo-noPDyT08XFMBbh-Sn2e5anZ-F8NI3h8elivjiPoygaInAgr4pI7jkobgSlqiN6ar_xHaCAWoguDYiAqg85_vfAXecnhkgwwIVe9kmDXvCjv1TA6eDXO3Es8ASYgzKGX3-WtHv0G3qX_hX9gQn8sA_0M9jxEsQFTO_0ZHx-OpoNz0bnp-PJbOZ0QNlr-8UFbMLodBZenEcLBJeJUAynWIUMdu3sfCiFEE_Z_j3Hf-7tV5Cjgz_90opeGgSPw7s9HdjmVdnC0dq_8ie4C_P2pIF6UW9PGrkf9_bEobuQb7Vh15L8sPUT3417-_Xn9supEEwWNQWXg6Z3MNjj4ro_00UakfxpZRYfNfAqaHV-_Kix-n9Un-5_wUHUkfpHYA6U3mKOlMcm8JnlmUOHSe4jHsLz0XAxOz-fhOPRZB6OZ8DEZqdno_B8chaNp-OL6Xi-cJnknjLHMMk9x39uJtlR47bRzHavorVoWhqfojDRNred5R5FalWME-60DYayanzUV6j2pP2uNuCeQDy8FJe-7AT57q6IbPJNZB56AumIyWgiFnIanp8JON-LySKcDheT8HQh4ng8PpvGZ_IppLPn-H8l0nGE0iOpJqNaGqoGTEeHOSySm2zcEmf795XroBS_DqQlEmcyljieQA7yfDSex5NpKGMhwvF8Pg1ns9E4HE8uLs7iSXw6lKdPIYc9x_-rcRJXtegpmL2ul-ao9VV5ctnsev-WDsqqB60f3q8w6QgXHnWyKLeGSVPqWVKk5ZE8U4viA9Klhp6DOmdRHF1MxSiUI3xoKObhXCxmYSRBBInxGOjn4inUuef4fyXq_EfTzb2abraSrb93D6Zbvchnodo9O30-mmr3HP-vRrX_6EDgdSBoJ0-9SS2k6e0NmgvG_beb3Srl0MVk049oIR1EvI8LJNyzELwh4j39KtYNtt_4f09-mN0D7uWeec4Ew8dOaZcH5jdLMHzchHd4X56vCP0uD0wzh-2B3pgdY7X5JVqMyv4ftNaY99_4qGn0K479v94pv59rmr2c-EH-mw43UofisAe7C_dMrLaKw57NOgzP3W_8_1957uPGavi9_-6Suv-r8VwvqfvvhOM-YhSfDT-NuT6KEf49c1z7ep_f_vzr_wNHF_8P)

![flow_diagram](https://raw.githubusercontent.com/kumarniteshpersonal-beep/agentvis/refs/heads/main/packages/py/images/vis.png)

## Installation

Install core:

```bash
pip install agentvis
```

With LangChain support:

```bash
pip install agentvis[langchain]
```


## How to generate an agent reasoning graph 

### 1. Define your LangChain / LangGraph agent

```python
from langchain_tavily import TavilySearch
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain.agents import create_agent
from langchain.messages import HumanMessage
import os

os.environ["TAVILY_API_KEY"] = "<your-tavily-api-key>"

tavily_search = TavilySearch(
    max_results=5,
    search_depth="basic",
)

llm = ChatGoogleGenerativeAI(
    model="gemini-2.5-flash-lite",
    temperature=0.7,
    google_api_key="<your-google-api-key>",
)

agent = create_agent(
    llm,
    [tavily_search],
    system_prompt=(
        "You are a helpful web search agent. "
        "Use the Tavily tool when you need fresh information from the web."
    ),
)

result = agent.invoke(
    {"messages": [HumanMessage("Top warm countries and weather of each.")]}
)
messages = result["messages"]
```

### 2. Build the reasoning graph with *agentvis* and get a shareable link in exchange of messages produced by agent

```python
from agentvis.framework.langchain import LangChainAdapter
from agentvis.core.export import ExportFactory
from agentvis.core import AgentVis

graph = AgentVis.build_agent_graph(messages=LangChainAdapter().convert(messages))
link = ExportFactory.export_graph(graph=graph, export_strategy="link")  # export_strategy = "link" | "json"
print(link)
```

> Open the printed `link` in your browser to inspect the full reasoning trace of your agent. 

## How to generate an agent reasoning graph in multi agent case

### 1. Define your LangChain / LangGraph deep agent(which implements multi agent system)

```python
from tavily import TavilyClient
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain.agents import create_agent
from langchain.messages import HumanMessage
from deepagents import create_deep_agent
import os

os.environ["TAVILY_API_KEY"] = "<your-tavily-api-key>"
tavily_client = TavilyClient(api_key=os.environ["TAVILY_API_KEY"])
def internet_search(
    query: str,
    max_results: int = 5,
    topic: Literal["general", "news", "finance"] = "general",
    include_raw_content: bool = False,
):
    """Run a web search"""
    return tavily_client.search(
        query,
        max_results=max_results,
        include_raw_content=include_raw_content,
        topic=topic,
    )

llm = ChatGoogleGenerativeAI(
    model="gemini-2.5-flash-lite",
    temperature=0.7,
    google_api_key="<your-google-api-key>",
)

research_subagent = {
    "name": "research-agent",
    "description": "Used to research more in depth questions",
    "system_prompt": "You are a great researcher",
    "tools": [internet_search],
    "model": llm,
}
subagents = [research_subagent]
agent = create_deep_agent(model=llm,subagents=subagents)
```

### 2. Fetch messages and subagent messages from langchain streaming mode

```python
messages = []
subagent_messages = defaultdict(list)
namespace_to_tool_mapping = {}

for chunk in agent.stream(
    {"messages": [{"role": "user", "content": "what are the main components used to make cough syrup and give me detailed answer for each component"}]},
    stream_mode=["updates", "tasks"],
    subgraphs=True,
):
    if not (isinstance(chunk, tuple) and len(chunk) == 3):
        continue
    namespace, event_type, payload = chunk
    is_subagent = bool(namespace)

    if event_type == "tasks" and isinstance(payload, dict):
        if payload.get("name") != "tools":
            continue
        task_id = payload.get("id", "")
        tool_call = (payload.get("input") or {}).get("tool_call")
        if not task_id or not isinstance(tool_call, dict):
            continue
        tool_call_id = tool_call.get("id")
        if not tool_call_id:
            continue
        namespace_to_tool_mapping[f"tools:{task_id}"] = tool_call_id
    elif event_type == "updates" and isinstance(payload, dict):
        if is_subagent:
            tool_call_id = next(s for s in namespace if s.startswith("tools:"))
            for _, data in payload.items():
                if data and "messages" in data:
                    if hasattr(data["messages"], "value"):
                        new_msgs = data["messages"].value
                    else:
                        new_msgs = data["messages"]
                    subagent_messages[tool_call_id].extend(new_msgs)
        else:
            for _, data in payload.items():
                if data and "messages" in data:
                    if hasattr(data["messages"], "value"):
                        new_msgs = data["messages"].value
                    else:
                        new_msgs = data["messages"]
                    messages.extend(new_msgs)

old_keys = list(subagent_messages.keys())
for key in old_keys:
    new_key = namespace_to_tool_mapping[key]
    subagent_messages[new_key] = subagent_messages.pop(key)

```

### 3. Build the reasoning graph with *agentvis* and get a shareable link in exchange of messages produced by agent

```python
from agentvis.framework.langchain import LangChainAdapter
from agentvis.core.export import ExportFactory
from agentvis.core import AgentVis

graph = AgentVis.build_agent_graph(messages=LangChainAdapter().convert(messages,subagent_msgs))
link = ExportFactory.export_graph(graph=graph, export_strategy="link")  # export_strategy = "link" | "json"
print(link)
```

> Open the printed `link` in your browser to inspect the full reasoning trace of your agent. 

### Multi agent reasoning visualization example - [link](https://agentvis.vercel.app/?view=eJztfety3EaW5qsg2LEtklEoou5Vmphw0KRscVsXrii1u7flUCSARBVaKKAGCZAq9zhi_u8T7L95i_3fjzJPsueSmUjUhSzK1rZ7Qx1uu4hLXk6ePPmd75xM_O0oKcVSqqOnf_nbUV7E-lcaHz09GgRCzMZy6o-mIvKHYTjxp6PR1E_kaCLHvaA_iaOjzlG1Xkl4-nm9FPlLqZSYS7gai0ocPf3bUVTklcwreOBuISpPlNKrFtJbijT3omK5KnK4q7xaydirCrj-UcL1er7w1LqsV57IY2-e3sIb0otlJdIMHhS5upOllxSlJ0W0aAo6-vnnH3_ubPUkiz6Ude77QW8WxX0582U8GPiTWTDwp73ZxI96g344nsWj3iz2g6ZP51f3dWhPZbNglgxmcuwnQdDzh5Nw6IskEH4wDJKJFJNR2Js0Vbwtiuy-Si4aWSiSHnR6WWeiAjHcpdXCE96tKFNZrb0icSVaobjvivIjiHUuQeYlyreUWSpvtYgVSVcoVUQpFajWy1VVLFXXe7uQCp4SuRdKLywLEWdr-LOS86JMf4JH0xxKE1GFQ4OlpLn-I83npYxTbEP3ff4-Pz095xtXzY2np6e6BqMPmw1fCCwXb5ViJesqjTyZJDKqqGmeWskoTeDidqUglSxDmaxBX1Yyj-GeV-RUC8qcxYRCxSusZKnC_sCzrIRVKQVUdFEsl_DijirSPMrqWD6l_nmeB33Mq7SqlYInlXfMg3ZTr1YlDi28ctJ0udVWHJ9w7Sn9KLaVxYEFlDLJ5Keud47iwabIT2K5yiS29_T0Un6qymIJQ1uUqwWM1PHln16enJ52vLtFCpMCHmKRYetxqsTlugOCjT5iLawAXdP-Z59AolVRitbouE1dyGxFwlnAzMURz4pCydxb1lGNEqF2i7S8E2vVwXmMtaQVTFCVsu5xp-oVD-GyUFXTL1s79-37WqSJzCUI5PTUNvJSwryYS1WZVt5A911rAQqdqcIMD-hP7Lzhqr_wVFUnydrLoQ-scUuxhqFGPRQ5_OJiu1DrtZJ1XMjVQsZlmkuoNsWJYwcD9KldUddVikUK15bwHjX4KnGGF4qJBBk-0ACRZbKcpxJk1zzB2oktQ4MgSPDwj1Nqu1Ng5HLdJxwhlUv5EwyDnodXZorunInuWMcFFHLPJPTCmk05qCy8kIqMFAwbbsxTCsNaJM0co0Ff75g5N9THb4WS3Baci2rHGtEqjU2OwgmdRiC6NTwc01Coei5K5WUprCOqjkqQRcebZ3VEP6CRKMGyQuOBzYZ1RMLEl6UdNGhB9BGv8IA5UqEylyKrwN7D1MPRABGYlYsWKcekwAvRQpQgclnCaIHsKiwZR1LB3zKP1rbO7zJxC3YVJsz5fNs-ijg2i6P6SFXUOSieUKTUAsoystlhqlBQtKg2TVsWUOhKwCCJMJO2EddggGR5K7CIfS0AI3WLY4GFzcviDtYfqDrkTgqqLKnzeUq_4HmZq7p0614IRZMPa_YU2JQExJo0jfgBlpgSK6cfOMQkX36ryKhyo2oFLWrueoPLKqynH3KANLB2gmw-mkuinCtcWWGpjsp0hfoJT_xwHyaxCwU1_RsoSdWhwAH6oBdvlJgoo4VPV49-dp6oU6xtP7gKAVTJKA79UTQAlDBIRv5UTkN_ksRREotBPOiFjwBXj-rIgSApGQ9ifxL3en44jmf-NBqH06EIhwibfilIErPheDadxn4cRDF0X_Sh-72ZH4bxOByCIEaT5HCQ9Lf3R_9Wy3L9_uip9_7o_u6_P-rAMzBycFvJD1W6lPharzvu442kyLLi7kO9-gAlKlQThbfzOsvwNiNP90q6hFbRM3_5UZdcZxVfgHbVZcatWlTVSj09O4sBwq6XMu7m2bKbp4vuvLi1F89g6PH_l2U9_5PKulGy_EbJKo3_tT8d9QdBPPZnY8Dhw1CE_nQwBOg6CXuBGESBDMPfo7j-NU7VKhNr7iegkkxyAy5ev_v-uXfz5zfvrj3fu8QaX8qYH9Oi3HoQsMfF26s_PvOuXn3_5tnl1bNXb2-84-fX725OT556F7AAAvgQ3uBPHW8QXHS88xLWgzSql955FsK_6eK35brIwTrAJcFXLtEsw3tviqoGgAYyT_WdKwACIqpFvtAX_iCyFCoqw4LK5eaqCEwYNjboIn6f9ScjEr24--D0BEfo5463axDu7u66yyryayW6oClniCdjeXsG1-DSGdrBNJLq7A_hNcCU68vvukKtPn2zgoEYBOMt0f4FnvjR06iP7Jy7bpznIluDzcdl_vn1iwuQ_vlq9aoAu-17L99eeO9uzncNQ5HFZEdZeZ2FVbUhAXR0GYIlbON_WPwWZDcdZNoFjLiBGk86LewC4HUD73Q8B4yddLYHIBgMeoPe4-VfFiE3LKchoF76EXTaj6AAWZ4BXvX5KswMWK5z6TvG_mxrFMgGnmsbuO10IEZ1hugbEP4b24Qd8m9ues9BpmvvVTqH9oO90MVcvuw6JQAYTSrvYiHvvBcFruTQAPjPBcNI57mLRZrFpcz_6z_-t9Ilc3m_x7cBFF_waCCC2qii9epmc7BWX9eK7_2wYK9vXdQeAEEGKbLyyjTWmLVca91CWAT48xa9QFxo07xGwC9icK5BAZwWrMoiriMQJvy4TQFyrQqwh0mdMQpNrNfkAtgdrpMXb3ov5Og3mtYhjFkhZiR3zAMzkcgS1__GS4Uu5uhjgP6A22WhMEoAel1yIzoP1sUL513hfSSE2tIY7odRQHYVYKCh3i3fGhCZdOp12gmOWQvUNnVgFcWtLH24h8qOiu8dv357caILsQLX8_nv_-mMRq8PClSXHRgzOw7NrOERsW1vaxIVjnLY0jlbozEwIQCth2Vo_GZ-3BkjSX7E3_8TPGwqGXkGQJEloO8cJkvLrgkE7LBigwzDEmtYFWWFy0OBfhGO7xKkBfoKL18_6zgQU7faE7ewsIkwzdJqTUgR8Xa9BDjftBBknZa2iZ5ATTcQuh_0h2fwr5GHpqhjVCjJami1UEVuoK2ZANgHaBYOJ6Nt7JByWyYLdBPJmSoIeILbvWlFJ5PhdDIYfcYyFgNUUGRBiyo66_Vmw6CnjSnNPj9edhfVMtvGA85ydfnSO6anT7z_KaX3ElUGRHyVRwgVTA07F6lWIf_iGFzvFWDfjncDMs_noBL_4t28vrx699K7uHr75vztM7zw7uLN-YvXN_j7B7j0Bv57_eb19Z9fPHv1zPv-xZ8vXr_YIasRYKHp7DNkpVLwIEoYRJJXrc4ArIGuRdLPUtC3cn0mVqsMuo6jBPMHtU-dadXCS0ViVqT0UwWDq3wYcR_mQ7kUEXnIImOxqy15X9tiUNdcwaHWXLfK8G5qgCTgKBL83JL6f_3H_3pbijjFwuDhDRtl2rZJF4oS7EuM9p1rrbxxAMM7Gf03nCS46Jbst1v-iJzqBKZ940q7_q_jWKc5CLbikrcxwmQ0mg0Hs30DpnEzAe4Pacx97EXDcdiTA38wnAb-UI7ADQll5MtJb5IEvb4cydn7o583XD6k8cpcVh_YMdv0_shLgMfudxHuc-R-7OBQ5JIGki78fJA7JfwgiAN_IqOeL8LZ0B9OZpOhHMvRYDg62J2CwvVjFQwBvoT_-coSf2WJv7LEX1niryzxV5b4K0v8MEsM6zX88_kreU_Opv5knMBKPhwmftgbD2IRiMlsMPnFxOhwKMJoMEv8YV9KfzhOZr6YRYEfjqYzkYx6SW8UHk6MOhaS7JExpc18gRtLNGVbTqhrMLvec3C9nygyYToGD9Y4E7mdwoviDu04LlWK5u3vfvc78CNAufNULfGJcxI03tpsVQ5D6hh3sOXeFVEM6RIXaNAVhs0puVW0xESg2aVeVchPXGRyvmSs6iwxWBC3CaynY07AsSlxydEL6W2RgYuIjUReOAUYXEC9SsJDpBw0xwHdVimDKrY8c-h_TIsaOf3uqxXOaO0losvLswmcyDS2SvxGwh3bghTgskKf9ZgMAAhHnWCDqIvW5uEc1WaPuo7LLBghXmnhFWxi9HFNpvzbNd_GKpqV2FRI77e4PV14sxjjDELyyC7KcEsb1aImS0v9zmAqExZMiRWKsBnw82Ne3OU4JfUi7xAjJIz3R8avuoWJfWRU5q0GXwyOQOhvEWapHWpj0B0Zdmzr6emdrNB4NwVrAIMa1dgpjWrvwC4QX0MANpEyw3cXqFdam8zIRkiRkCqh7im-GBbxGmYEzIC6ND4Y9pPhGAot1MPe4CsAEKS4DYAzrAuN2JXGNbCqwoA_CMsYkcRF_qSyeoZTmYa2awR6XVR68b1BuuIZlbpLnnNczkiYtPjEIB0AByKRZhm9k1nmVwUgEHIDAI4QOmN-A0xEcYe0TodXQGoI0QjYvQ6xdCBmAgsKARnWoPuo3NGpVc1LdarpbwQ224Dge1jRygLxOMgPneBUqZpWpPe5h0_A_18hbhLN338slinSo82VG_BjMIFoBSCiuXqZirJc4Jtc1wW5xkhXlbcFzDq1htV0aRrfqvIy_eknhHGqufRc86gW7zGGi0BTBK893nEJPT9pFXQDA-2VQi2cgnDJZT0BxUuXyE5oxIqY86MHw5Czh3dH6-Id0qMVT7_vXWpVkOVQPCKE2NEi2NFih6Otu9la40NkgwDwQPm69dTs9_kPC1gWWvYEV_G80IYgTkuEhMhWkRdl3kbNeKI0pQrLUgjS0z4rr9xNsxw-lsMioCCGeet636IjCugTByhloGM5QYT7GhsjkRoiAI-knkCErqFhxZ2ikevY0EkkSw2nXYTuFXZxdFw31voIFnOiWs8zXH5wiGNqSiZCsC_c7BwDhMYt19wRlI7lxgWugdh-tEvk9vLwbcmCRuNc6WK2JhuINERel2x3q0LQ66xaRII50wTdSSKRdJ2M5qG8GvzcMltj5fwKFsSUE4iIX5fzHBWwQLYWFo0KjCg60oSg08Q1-Wiv0TpIss8AmwncVo-P2F9r2nU_EnFVUCjjo2lkaYFPF8lN8v8Qgy9doMKaiQ4ycsUtMgCsGLn9KAEkRUBOK2tfWxbtV84WmA2icDyc-XI0FP4wjKd-KIcRgNDJLAmSgUiC4SOyBf5phHggIB_0gpk_6c8Cf9YbxH7SHwTT8QyUMQh_MSDv9XuDvhCRP4Ai_eFgMvLD6awH0Lwvot60l0yC0edmKrTQ1y7paQoKyu60JMMM6xfPVfi3Ov0pkxWx5b1g1Ov1B_3-6MwJ-_hgO5Vv2050ODbU1w31kwzWMB_MTbwjYuv0_6n3TiGtYV0GVg4Xs3jfYVlUlPfv3v_gtu1gxykObNiBbal6xy9fn59sKPk3iO4QLvNrFoPv9wkse6XBGPvLLqTdIMFn8L_JZDh5XNhiXlCEJxT5RxoGCvecXX4bBNPJ8BCBXrUW2x0eGcgS1_RvoYYdwtwAiS65KzTB1bBytJ4KHCoAhzKHmqyDAx7Dip0GDa6PFfxdL09omMOyyKMFzX8rYPCJiDFzHTURA04E6dLQwIu7hIyJMp-RDSLWRZSleRp1i3LOYvZxgc8AYWC6gav0GH_0S-iSPHNWJ3hp7veDYDyd9IP7hsY7pgAmFXDi-azkesJ4vwcQgOYDc0OgTd4FNWrHyDiebePoNa5h4boxBEEcP83GitD95ogpgDeK3O6JRuMoEYKgRZ1xyhO1S_7j0fiROo7yv5PhMnY03BH3_aJ8iU60_ORmKbDpIMikTsw8aFmSbre7Q6K_8x5VMozQdtH8xEsQSNdD98sYIzdUTmQVOHXfbLjfa0aqobRPaNzXIC-cdLBmy3JJOBmGnsbDIDSN6nBxL7l-8Mo8tShqwMpXnqrQSM1ds2fbaJMHHcbdXXJw6rbe3LAMxm_b8BKJYXaLwXqQNuYqutsNULIkEH9v5fxWYbqGBSKKbz3zdsvF0bx0u7Au8u0bcFsAnIfFj4P5G893qCYkiKOoxk7CbBKqJqc-lpg3RiwsXZNmuihXHex4VCArb7neOXygBklB_jAW3OoYBmKIZnlJnj6SQyLDCN5-ZTCl6f652tgC_hpxaF8hKyrLQXW9P-8tnIJpsBhTQejvmUJ1Tyuklt0678hZbDkNxAGUUuuH9hpdTxG6UN1J8BJbmTtmOlqTpnYJOi6wRVfeMlVEYmLsY0Oldpqy_nT6OFO2WkbdPArTVnYnRhKiTKqz65cXo0l_2J9Nt7HQmyLbbJOx3IDmYUFY6vBGtCgxF9KsmVXKDOhuk9Z2-3EkC03_o5nt2MW6IQd3RepMfOAeuOMxeWUNl04-Qi5CVvzSLgkPxoPp8IG8gI1MXXhvuDNhAGD_bBzFPvhEfX8oZOAL0Zv40SwZj8dJfzbrTz87YeCzkfqXySUYJNHUByw58GeTXs9Pxr3JTAyG4-GvkJodjEE_gz6U2uuDrzmMen7YkxN_JEUfHM9kLMWv4vBs-zM7hprn3xd3dNQ6Fyuw0SvwSuEX4RA9a8_Qg_XBKhEoavk2ReLfB1Paq9rGatbyPXzvmiv2brghO8HJ4eUxF5dW99O6OE1rjHfeR9gyO7ZJ1qLNYfGw7Y9lRhFFivxjUiiAJYrd7V_DO7Qs68gABx8FWjxccaGFAPxTZKY8EWKwIeU9ol3vdW7jmIRUEjIDeQX943wtGd9XK0lkkzqOMfiyhIqrbgvVYP8FQwYMb_E6Q_CUhmEpK2hcphNdqEkYFID5D6tNRTm6UVlTANmh4Zwlur2I8pIJr22yfsgxGh8DYf0WQndpQU58QaotZSq4JQzqEWJMzqZtZWDYID2iF1hhKg7_uImSiOWk_KgrzMAdI7izSR1SNlmJjbmCaV4vMYrX0Wv-xlgI0B9QnrUO4GJOqdVXUlKHlbbLCiX4UlDGiaB0tL4jFET4YrRmD7VkGNoHhyXRhCWSpOz2cqfbsWtqa72FKjogVgxTUX8OYHUpAoVivI993UEt9AJYAfqP97rmRRGXn8jcOa1u-bquxftGlSrD3SjnyfLb18Xqsrx-8Wwdzm6L5Xfn7-rr4E_T7I8iDV7dXfmzb__6PH39dt1brvOrWVz997_-IF5s2cjhTpfrpO2tAfD0bhjK_QHB5TmahB0m8qDCYMyaQry__x-v17UhGoV_97s6cIR_DLpNSAf_HnZtdKjLiUU6vRdpkDKVoPgwt3T4aGuYguGg35t8BjvRJPmq5NPe4dmd5-vKxJXEU526Bv4rMfMd3rfwFnzLB5J-X6AwtIuIcxI1umVmQFBGCPzbkaDZVkC_KREOfuQscCjsVsfo8KoyMTD6ww3VbW1CmY1Ho2BvgulX2uEr7fCVdvhKO_wz0A7T_mA0CT5jPx2KKC14Lx1xxiID9ySNMdR9gHXDe989e-WGDlq26_feJfPS_47LJdS0w5Jdbkb3OSsVvGV4DyE0KYqLdyjTAKPFnJClFbdM1UeyQ7smJUNcegTh7a5pe2wi-ArcxjO1EOg-0rgjUT7vmFh0E_Q_s2vUCbU5lLZJMacTGNZc2FQ00K7czVSwG6eaTGFKPNjILzDhcmoKvgSOEiXT46x02HVm8G12wD70uLlBTF8uVmkBhgRXyyZhQecAl46EdMYCeGNraCL8VeTyBFaTLCoWRYYOQpn-tRa58I7BpuUiTBVuGSUniEYok3LFGbOfaH-BLVlkq1L8VGRiCR5mAT_lCn_ClRWM1RJKWdYKPUholfjEe09tq6BWVWDXsA3ROsqKUOY_iRXmVp_oDN1WUkbzqqzSMv2J-hSnq4XMsWf01EnX-46YBJJeSQ4MXIdCShv4pt2Pc2jVIPCxmnHgL-d25q7aWd5aaAvoHqofJvfmOixGxasiq1ldwJnUeze9sd_re2uJ-cdY31ziNrYKnkbnkfPDcMp6d1BQgnm7mMcqctYq6-OiEYqR04Cxws10c1o_CNP2gu4Amz7r9r3lizPoYV0hTi29j6D6JXkkOqWHphL73FavcVFz9zlE6G9i5nnj1tdkHjilh-OK4KNy9g3-sZXkQ-MVo-LZOdqBekpjKcFzCykbDkai5lrTnOaaTrvXnpUAfUbaoc5EqWtR5HqBEFagLaAe-AoeC9VKnoOJs2sbWR8B-fhRu5JmoeglmH6RxLPQH47EwJ-Opok_iKPeMBoHsj8YP5pkrGCyRvCYdn3h9i7a8cuzisNISn8SDwf-LOxP_ECI0UyE0RBPqPilO5S-ZiJ_zUT-mon8NRP5ayby10zkr5nIXzORf3uZyHt2hT0iDdQ_MHTKZw48IrcUgKKsDg_NOqBMd-SDE619W-C_j9x-fmAsxWCUKvtgAOq-IPgmGgX_ASxLDO-BV4xyO3LIBuwzPA__MW-AmAmKHz0FIN4bjsf96XA2Cwa9YDwhuPozAlaS_ChIJpPpKARQGvT9YTIQ8Gs89MP-tD8U_Wg8HsrD49Ht3ba8b9Fg0faxLIeAUTY1dEoN6yHixBTWDDY1tAcRUQMhH7K2axtO6-hzSGhFUcZL3G1UUGvjWvLOajq8xGxtt0xlE4DUCMiFxTpIi4OsC9iZxMA7MHW0rzl7h8nlPYG0BxD2hrzNVvYwKxhAmA2pGrubJzFZBfRpSWHGlTk3hjIdwWFdLutc6sUPlnu7zTlFO5dp0ib3TD4Bio2lL3PlcHdpWaa0S5w7yPFD_RL5uTh-pAbbY8c4gGCW3U7dsXupuUBa-9aeXEsOhWqghR4Re7P6cJnGqQXNAWfIPWxB20rSBn1Mk94A3l4LWpFGSrjNYoRASVqqymdERVLefE0TsCqd54RhUfmXK3Qa8CwggFW5UBgjL9MVjfV161LblxPaT9fHBiBOLZCtVgwAJNPH7DBYB4kLWwmas4pKxb3ld1qhAWiagH-1KAvURh63yqqPk6RUlel8Lksm09vnI3x3vySsIADMkZ8CQ7IoMrhFEInV3ZyasJQi1zOkQS4FnahVrxyvSKcFtLsICAGTFRyfSyzRulgnq8MlZxSSNwkVjtDt2Q1wsy7z5uwu1ZwK0N0Nz_LCUCoEu6DB2AYdoKCxxDOwSj7pSG-h3m2j2iYwl3eobQoPOIjvEbJoeSGJ1ehmarHGJ1hey9BooehRWiIwupPgJ5Z7hor3lnBwp-QoBPmlLR_IjkJbwKxKi9ZEbKSK1u7GtJacQhnj9bcLaZkC3RudEd-WQVuE1Matc0V4LE5P-cHmAIh2O9mb5LMQGLduWg7WB820bJgQskkiZiTFR0Q4OqltE_5sawlarnaHbFYJzQNtsU5PG8MIPiRK9PTU2Ec6ruMhr_CBCdtpDmtxgofkgdd01MzmYmpDNQwamyUaxcsWozlJcZdTuO37XTasPu1WkTG11D2jQni3kg7a2wxtuosO9kRPurvFmtec1okl2mdItWXamFGE6XlHxvuj3JwL-P7InLMBPXinkPbHh7WixLcp6hSyvey20blqXrEipxqR9i02JFrgtIIVMCEiWphFe9mctwJ3XxZ1BcrybC31WvqqMCd1YG7MUu6bpEwclAhxYCpszEKrVxk5LwXOe4okMz9A2TigmyR-JwGraZlxgdEv5EvGBW6ufJvVJfILf6R0s-b6ZZokuCiDG_sO1hNabti_5IBhqo-RwQMumAmhpCfNwZOnhQcyYszc0NcPrsU0dZiTqGrCfaqeEy9D2tkgsAydbBOYZBPdro031jkxLBMviwpY5zkBWGKYkB-NKbs4FRtYBGNHCCN0qIHm7KWFoUruwYRcO2glL916RZUYtMXARrOsWFtsh9CAZUYQ7fSpJobCU19LdQ9Eb0977bbvn0bWgsYy5AyCZWEdzi0fVZl8Z2G8a5zfTsik5ejujOe1I-M44fEkQdd3dvpOVkp3_kvsmd19StT_N9tnxUz2Z4NB4IcimYLfPAv86SgI_ZEIZr2wP5b9IPhVt8_-9uR5aGJ5ICN_IgcYAkJ2YTQRsicmwSgY_uLE8n7c7w2CnvDHk17gDwejwBez0cSPZNIb9SM5iZNHOPLvVjHN06qIYYFImWH6y9-e6CeePPWefIlxetLxnoDRqGqFNaT5BzALc6TenmBqhlv7AwO6UZI-g26rlGfYYEpd2T_6Bxb1AoV0j44cVsobsONgqOgQp5RzYjnJqZHsvpJ-3LBcd-DGyQ84gGo7JIoXUXW4HAqiWlkzefUFZ-MRqm9TxUNDidbKNFP3dqOEg4ZxXzFbF93uPzSqD5dwyIgiO_olQs7jaRSDvQloI8vI740m4yEYnaDfn_3ikPOeYXcZiwcOYt7nQBwQhUZVKXFL134ts8HpPQ3VOsPO5dYz1A21zqG9lQ49Wp6MqqjJh2VXsuX0VhIZAeYpnXz6hrPhSLhzcHyHCA-9UYCD2G63muCD8er20oHQsSd74-madCLCA2CooX3CUqQ6_QXHHKTq8ByW3nmuQflW-F8f2Ee0Nr_4LRYIzeDI7gWdNn96-pScFbdQ2vDONWYN-whaUGeZ8IoQITcoY0fnpbTay9QkHvxtN2mn7VB_tQChLVCvzFF17bpzpmgAegp3nwYgSLMtgb1GJ8ir2S_ZhPZfvbw8997ISK4QgZ4D-p0XmPCE3X2dk0OVSc6nyeStzDrUZGJnWVavfNS5deZf-kJhL9E5PMZiTxD1UrnW-9JsBQmUWK64wFargqKuRC9ojgrpRrA0JAo6gZbTaQEcE3_J_bDnazZRPX2SuqGGWYM1DtA5bxTIg5olpzKZeHRlPFGMsPqN3lsCvbQ-EnIikT4JmeOW6DBXWt4O0neOvMQMMdWoP-WBtjMILrFFJo3gGz0ZttIHLBPUjh1QLD73m3yCTnN8v8sCmTmpA_IbMrAx-eZ0AGryd0gLeW7hcOH90R0er2GIoCZJwWYuYMvwpEjmLA2HsmUUOCCpO4vNcWSIx9ZuJkkYQmQjrwEcLVo03bQFQ_0a5nQXud-1R-zyW3wgqLMAI83QMAxhDW4W9IonM-59c478YN41Im2FeW3oWSdCaUOTKEJTKtrjzDqhJI5VLmvcZSUwJ7EtfSPxjcM16LWN7VNEh6g6pZMyKZqemtQQcwhvQ0bbQz5b5-1iFVmjuPvpuB-cuaB0FF3GHTOwG_u2KHSyMylj78ZCJ6jChvtUn63stgQMlzHqDfmm_24yHpqcC-r1rU232E61wCsXmHmYroRZpU5PaYvL_dXDSwlx4ro6Tslo6n8jVYWMc3PlilSSv01gBX4eGr7mNYgHzUiTgNOi7sG-izsm8HRMwIwUyhpHQYS0RdIZKBh_MkzMly_S-cJkkzpzkIfQ5sSs1DpamF3i20PjYTY10sTmkw3E9WDSEmUHJJ6s8aNAKS-LlFwRcaINcpJIlSSSCDecbchXlkVYgMFfregM4iMOGhIWM1m3pnkggRhTyctCa7OZXyYJXKcHcAKOzZ6wI_ZGrNKY8qrABsGiwVefg1RwxSti2mmJ2ye0nsj0JzxH3w6nTaqLJduTwqrCUhgwB2qhYyX7YZve89icvIKdaTDaxp5HAgsas62djfWUiNVeFVwUZ3HHfceGW94UMUt3z8ZhmtC0FJpjdpvZn96vqPt3YNoYC666aitwsUyVmRdGFeyOGZsZYneDcyYM7zrVDCwvR3vIP9CojrtTRLQ3gz6QoNIi8kziyLazM5r0p2EUDvzJQPb8YSQwhaE_8IMwCGeDUZDE_fifjO-ghUxCM34h27G_nM_gO_YX9jjGY385j-c8nLI-i_X4wvSGQzTYlraJguZy5zFEyAFlHEaFtOmTB0mOvR16JM2xu5wvw32I2VD4k2mv74s4GvoyHIQRGIypiPuHc62vSXYlWkfjAf-amnI_RfEU0PulqetZU9eula_TBGhFGJacsECLCRnj7bMANk-pP5ihMSchaCbjYJIEN59E5Gu03Uq7RSqkIwUat4rWoaqJcIpsDsA88o7bLuYJb38hn_KWlpKVLCuM7jlrassr2vQm95Mprs_nuFwdjk3azPc2ndPe1LDriMTUJpRFuzOOjy9e3ZyQiIWTfeb6__bwosPpEuxTr0ufeyB6gJN7QSFNTJ2Q7eau0Q61zVAKHONW9AUAzDDavyFiV4PX-stjKabB96kpzzJ52-QasSv_1lA32KgWxyNbT99P8fDxGClaGbgpyyUzF3bzg8P0NO3iDJE2PYLDYJVSVQVnINlsLEqZ0ylTRW7V2KVjtKvtJsylOPkH3ftIJOz9eWWi8hXoEe06dZkkphKpgONdVFJDIqGC6nLNCTNWF-8s95dC4_lTf_TpDP7MmYNvHXDZwUmFLg_Ppg69EacaZ5ovEhlvppjjh0udyfmrcDm8h60ZflrdzEFeSOrsxfAuqYNvfkxz-kZda-PFI2ke_fGMxZqeTnbSDt_gmG5TMseizQedsInQuWQhEjLKckHO2ZM2y8_dm_NZ_E6aJ7zGctrMbnZnuz_GcdQLhnO7ldOaYWZZuUzqzLAoLivEQyfIRW24JvdczZ3UkGgZHtuBrk0iwQwA9kMoQZcTEBIcaVInsw3B5PDanQhp-xuVS_BZUt-knEXmu7H4zcJmVwKvhs5xSbBIlTbBtE01HW9yTSemf21uafMDT5an3jEO7U0cjyWcDiBf9zFRlInb2jB04A6hHUdf7aWl9NaTNi1F-yh2kVIdy0gR02qONqlXCmbYIxkpp-b9jBSx21t81Bs8WgU3SFSY5TXnelqb_s83vHLiSi6JUUKxEnelG2AMoCV6iI1i00cswA5aySPr9RA_pT_j6UIcnEUbmY_38kpgtojRVh_TqsqYaOLOcPVtCrik8wqcwwU2TUXDQt3LX-o8MmfFQeeC8uLOXcYM4Xq0WFrMAnYVd83gdnCsucTjFqomre15i4CjL5xJyVvaidzSNDda5MqccEJpfmhybCnPNE3XZLydzzVE4P7iNvTCvX9lk8kaCo1Pb26RZ80LLwqlP61YlLFub3P3RifewZIJyMG5fidtsp2p2GzZiQRNdKWZuY7GRLFY0j56TmUT1aKrdbKWBiq02VLSzQ7nWRoqx6SA4xdmyQD7DmFkT1kI5SLVxJVeUrhanbVHSdhUTCbuCFCBCvI3mbEVSmR8TAsAjtKYkytLnl3o7Y52ZN1M0-3NbpYYNdvY9uxW28jqQ09AM5jNfrGX56-vlHcM1qXgvRTFpzQWlPS6SEM8DE7xIdA3N2_wQQVIl-cyTJKiAtyGUxCgOgUYmnea3FnnOID2dDOzrAmdIHyizwSbksGFi9GZtNp7oZk6QYeRaJLu2iHp9EbpJkVvzya0z8zNa-jwe3cIuV8oZqbUPafAIvvWCXsEBcwhDM2o0m6krX2I7c15nOa1bwvbIflX_oGkpd3CdmhSl9nCdmD5v_YWNs2sHf2DCdNdNzreo3jUA8s5jEf9jRKmO_cTGs6rc6QPgEI10cOGOwuboulGe9zw0qclaQyIABWYPvTbObID11B_zo-mTp37D7_sqMBvHpTdb0geAUPkNVWz8FvPIp-PxeVr7J6R_fa2yZ0VlSRs-GFEvSUN_VKz6bKn91gexFPGw2jsT6ZJ4E9jiV8ilL2hiMLRKPjlx4JcOHPITczasqrkyKwbKKgs6aeYzmrnkkMxUu8xEy0vSs-kje9f8o4o2njTssW7vlfMDzdbXejbmmDoJX11W--VtF_J1O4eRXq3vqtKsc4dX-Pc_txx-wPV3m_l68cOPtlNEBPU3c4IOXbYyBPPfoSaKDTBcOkeStESYUxhcQoGmHx7PojxdikB4eDTK1ocij587np37NJ8O9jdq289PVYBPtLSkZD7bRYUy45Pp9zvXT_y88kbB7LfyaqzfR6JeazxmduuMrOFjTecbydVYLNUcxKq0-ONbyKzMrQ_tszH5eGZEUq7Ebe46zHbs3XSGXSFDTUnyjjHl7j93vstZz4eMq-V9Vp0fiGfr7j5eecHtMD1rLf0oNmC03aTHDltfwG6OYSEnVtdk7OrTe8LO-TDzpuHEDfTave3pfVHmD9rq7aJpdht2DGfUClyU35z2oj9dvrDUwvDFLzFjFw8I2FrWnd9tJrSaHbZ7y_x3er_l1-qRmflsG9V_2O-Vv0b-V71b-SL1V_2m9Uas82CWTKYybGfBADKhpNw6IskEH4wDJKJFJNR2Jv4B35a2rp2hxTqunYHlv9ru3b_pN-HPODMlPt8lcYfaXkXbYjfeYx6HHjOymerx4Hl_6PV4ze4dW-XpnyWg3uQ0vz48_8FIFx5bQ)

![multi_agentvis_image](https://raw.githubusercontent.com/kumarniteshpersonal-beep/agentvis/refs/heads/main/packages/py/images/multi-agent.png)

## Current Capabilities

1. Currently, **agentvis** generates reasoning graphs for both single-agent and multi-agent systems. Multi-agent setups can provide deeper insights, especially as many modern AI applications are increasingly moving toward autonomous agent architectures.

2. At the moment, we also attempt to surface certain connections that help explain what may have influenced the LLM to choose a particular tool call. These insights can help identify shortcomings or missing context in prompts or tool outputs.

## Current Limitations

1. As of now in **agentvis** we are only supporting *langchain* framework.
2. Our *why tool call* capability is currently intended to provide an initial indication of what may have influenced a tool invocation. It is an early feature and can be further improved if there is strong demand for deeper insights.

## License

This project is licensed under the Apache License 2.0.
