Merge branch 'master' into agentic-finance

This commit is contained in:
Agus 2025-03-25 17:44:14 +01:00 committed by GitHub
commit dce8ed57a3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
124 changed files with 2102 additions and 579 deletions

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
eNqdVWtwE9cVtuNp0k6Tockw01KaYVFfbmFXu9LqacRElsEPYcu2ZAIhhFzt3tWutS/vQ5YEbgslmQxxpl3qoUxnwrTYSK1wHMw7wUD+kLrDo2nSDDjNBFI6LUkaMk2YptPQ0rtrKdgDv7o/pHvPPfc8vu+cc7eVc1DTBUWuHxdkA2qAMdBGt7aVNThgQt3YXpKgwSvsWHcimRo1NWHm+7xhqHrY7QaqQCgqlIFAMIrkzlFuhgeGG61VETpmxtIKW3irfuNmlwR1HWSg7gpjGza7GAX5kg20cbVBUVRcyzGXpojQFpg61FxDG5FEUlgo2qKMauC0gkuCLNiaMpJR6F83NAgktOGAqEMkMKCkohQMU7MtkUTAlimKWPVqFFTHA2fKTpa2rc/XYWyzSwaSo6BBQxNgDtoKLNQZTVCrOq7e6hEmyJyiScCWYxoUgQFZzFAwgCHUtAJhX1WBhgwiUHXHuqohsDRDgLNbR89Z1eJC+QhyxjU0ZKOB0Bc0yNqRV1VtSGqqSrofMgZSHdo4VOYhYJGTn4zxim5YE/NpeREwDET4QZlRWGTeeiFTFNTlGAs5O+gKokKGDgRWJQuhigNRyMHS7C3rAFBVUWCcNN39uiKPV6nD7UjuPK7Y7OGIaNmwDidQENF2d3cB1Y+MUYTPQ3gO5HHdAIIsonrARYDiKanO+Ym5BypgssgIXq1NqzR7eWKujqJb+zoBk0jOMwk0hrf2AU3y04fmyjVTNgQJWuVY953uqoe33XkJiiICk/MM6wWZsfY5pXZs3mVUEQWcUZAN61fkRA0fEcoZg7dGvXTo1xrUVdQN8McldM0w9W1jiAt4brpc7Yq9iXiNxHfqvjrWgnixTqZMVNIeP9al5DAP6aExig57fWFfCGvtTI3Hqm5Sd6VhMqUBWecQFatqtJcZ3pSzkK3E7kr4SZtwlI0dPupEHOZVRYd4NSprfB3eOzsP8PaWQ7PVhStaBshC0XFrnXSYHyzmB1nGZFk+NyiRoSLtFdLQZLjD1SuoB2w3KCBc0q0xigpSE9WjGvgVlCyJUyROUi/ncdTNUBQkAQHq/FanErrrI0ny+J0KhpKFaH6VadL5Ts3V0KCEWLOd3zZDh0Khqbsr1Ux5kUooOD8aRCmcGw3lkfTjdypUTewl9fF8TRsXWGvmW2izieE8rNeTZkM0RwJvMEgHWZJOk8GgPwC5EAdfsicCg6zYbKqKZuA6ZNAINgrWzHIJ5O1Gi3gpn9ePMm1CI4kRTRYmzXSLYuegN2EqGk0KYF+MrcZjgOEhnnQK0Cq3rO+KdrbHKkkUZExRsgLc+VZ9wyYU0qa0FCn0re0SYxrvXbVJSic8rZLQqvf1Uon+fDLD+Qa5XvoxNpof0P3BKE4FvB6/lwr4QjhFkARFUDgRzHVIq1JGrK+zlZdMMq2vH+B8cKC7o8DIzVxeZ1Y3M2tIqVOLd/fFi/6uvEapYoIhusR8V8LsiA+kmntSWSD1d/MkE1+7pmcgXoiibIDBR9xNGCpONBv1SLVFcNQiuN0gvjBZa5AmjHUwiBDzx2ET1oZer4QsFpqwpA0mRP9oSicFA0a6FBnOjCAMzJzARqgkoWRi7XBdtkMKyWx0sDkEPR3BHsCubSnyrL9YFB9NtXUSj9L6HBBo2o+TVRz8JB10qvB26P9nVEfX4XM7Hk+os890WVZ0WeC4UhJqqIGsCiMqJosmuwZLiPPe6HrrcBAGQSgNAqjQAkEu7cOb0cysWft8PozZz0IZiKjGcox1iPdGXGGa9rqaMAlEgn7UTs5jvrU0+0qdqd+15Nkv1jlfw3DvWflP5FemPlh2dMWGp9imyT/Hf/rEL/bs2Btd0njP1qUXH1q84+zOZX9cfeWH7saZXc+VHnGHz/19mLt3y+/qtv8h/UDzkZ19f5N+8OmHF//5SceRx1ekXu979+yJj5acfmfFaffR/777s93f/kLkPy1nWt/csOr5Y9NPv922/0c7qZd27T9zs9gzMVHZeq1ttPPgq/qpsSnvhb98kj517tm+J9beZ8ZXg4XZf1n1dVP3Xx55Q3h7h2/hoW++DoYPRidXPlz/zCP+pc2v8q74b9N+a8c3RhfvvTx65Ma9198LNL53pWH4nks9C9Y8dl3+/VP1gaGR70198ELkymfJh+LPLbixcMHNL13+Wia94b4R6/F/Z9mP009+uuiVq68dP924dMsvL+jnbwwTi4ifjz6/O7dn+uMDTz+ZFr578/3Gl9X9voO0fw/+nZEU/n576PyyzdK14ekL4VsP/9X30eSxgfO3LiW2915bZH7Y0D9KfDmRqX9j2c2LM8LVpQeeOTF96c3FV79+/8rd/3hA3HLytXUX9leOn3pwZuVnDXV1t2411F0/98pvHkTr/wHLVNhg
eNqdVWtwE9cVtgemdBpCX3nUbV02miTNJF55pV1JSK4mMfIDAXqr8iNDndXdK2vR7t71PmRLxlOgpJMQJnQT0o4bhjbYSK1wHBy7IXUKTEmYUCalJUxoDBP3R1rSMCTUpT9oJwm9qwexB351Z6Xdu+dxv3O+c87dXsxCReWRVD/BSxpUWKDhhWpsLypwQIeqtqMgQi2NuPFwKBYf0xV+7sG0psmqp7mZlXkrkqHE8laAxOasrRmkWa0Zv8sCLLsZTyIud77+gWGLCFWV7YeqxfPosAUgvJWkWTyWdVAQkKXJoiAB4qWuQsUysqnJIiIOCvhDv6yRDCJFXuKxlqopkBUtnhQrqLDJoiEkVBxqOdk0T+lSGT5WvfHqGbZIrGhKFagpPMxCLOWgChRerihYolUBwUsppIis+ZlQoMBqkCM0RLAEzoSSs2JDmVWwM5wn1XQsKzh8ReNheVVWMl+qaDBaXuq3jIzg8HAueQVyGGxVDcdYVUPJzRBoWG1k00gxDVkOO989nkaqZkwuzfBLLAAQJwRKAHHYtfFif56XmwgOpkysJZxWCZajNkoZCGWSFfgsLFSsjEOsLAs8KEfXvFlF0kSVBtIEcrO4ZJJBYs4kzZgJYRCt/uZwDpeCRNisTqfVfmiIVDWWlwRMLSmwGE9BLstfWyyQWZDBTshqmRmFivHkYh2kGgcCLAjFlrhkFZA2DrCK6GSmF39XdEnjRWgUfeGbt6sKb2xXpK02G76nlnhWcxIwDpTL6PASa1wJORIg7MR4gZqsJUiAUr+WNsbsbuevFKjKuLLhjwrYTNPV7eOYDPjWyWK1wveHNtRYnK+7e7wNE2McibFaE2G3EwFWIeyU3UHYnB7ahW+iMxCf8FW3id+Sh6m4wkpqCnPRXuO9CNK6lIFcyXdLxo+YjONoTPi4sUg4JCMVklVUxkQ3Ga30Nulvm66UF4mUflbi8+VtjSNl6gfzQ4Mc0DkunR0UKXeeofkk1EFqpmqCq9/cBgMiRdUYc9psk1VJLfklHCtF2iiSss0OkQpOhcCLPM5n+b86YFRj3EFR1Ks3K2goA/EoKjJU+Tq6WEOBIibN3PtzN4zb7f7drZVqrmi3eTlml2qpcDEam11UX71ZoepiP6VODNW0SZ4z5u7Fiz6GAzTltrscbofbRTPJNa6Ug4b4kUw63S4O/NacBgB7McmUkaKRKgR4mmo5Y65JZIfMRvPSNgftxJG24EkEBJ2DMT3ZhswY1BZCxhMJsdxLIEUCFqQhWak/o9jWE2wN+H2lGAbpQyjDw2fO13+jrw+k+pKiN5lQOyFHBTYHab2L6drAyKFoJNjT1RuB6UB4IDTgSAE2FxwcSGZIm4uxO502xuEibVbKivuGdPp62qSNyTTrttlla1pL9m0Yas37Y628VeoKMEzCQUXXu3q5lFVQkmKYbk/0ZiJBuq0dMHJaifiRNZKXsyGuryeTCzrDGg06rF3ieocjAeLWfhRPBSi+py8S72AADpHV0t7mFgIXLJ6WqrfaNiRuG9JsGpeHqjVNC8GVE+O1Lp2RLcQ6fDqFJCHXQsTMDEP8xCM7xmvQG0QSnNuDE6Nnec7bJ4L2pCB0CszafIJx5ZS4P+P0A5++1iqEYoFgaKNKDUUVF6V/f1FmnBRDUrXkUMyacml+Dv3/RPVKN7l4CpAhuXIMFyWkSnwqVYhBBXeVUQIC0jk87hVY8HWQ0dYeY8ZtZ1w2zuF2sna7m3Jw5Fo8SGvebsyMcfOsKLICLrwsMKbTtNfiYRja0kKIrHeNE/dY+bDeVqgcWyfqp1c/9cW68rUM/65f3/VMK7pArXz8ymd37j298NiK7LMXozPv3uO77TJ1mbnjx01nn/b03HFvflP4b8e+/PLZd9/zPHb36msLZ65EtvjrdkhvrNrhWZc4Qn/4XvGDF0+c3/L74dOnPv3oddfR6Z6Pj83Pv7ZiaueXSr8ILxy8NLZ/voELZI+fGuN2xa4Gpo7OnnpKobfv+yYTOecO3rZ+WNRnT59r/7n49pbhxOp1D61Mrvjr1+u2/mzhWyPnv/DDJxu5g39Zv/uek6tOfPz2cuJ7o91ftS9v7O6962DDgy/vys4c7QT/WHb5w4Y9M/9suL/+23xdoeM76Kdrd3/0FY5BK8Bdj/RuaALXzvzr/dG91vtv10/HGj/7yc7Eo42rnutsONnh2/aHJ419X9v65kDD689vOZ671Ni18WH5k02Rje+/8cly+q2rNJfkL+Z7JudHE46T0ecPdRfC0cZDo89dvfj3P6d7t3LGfxB95Y/7lMyFT/90reGBx5+e+vXeNzsOHt72gXP3wiPX38nOLaS7l//74d8c3+n477VVt7+iUGfnnpBX7hp5Z/OFFwZ/EDp8drY0f+7S7J7RuMV937F6k5lldb+MfveMH9P0P8WT3G8=

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
eNrtVU9vG0UUF/BFRiMkJOS119613S7qIYqqFrWhoAYk1Ear8ezz7jS7M9uZWTtu5AOlVw7LJwASJVXUAgfEBSpx5MAXKJ+GN7t2E9KgVj2BRKTIzvv7m/d+75eHxzPQRij51hMhLWjGLf5hvn54rOF+BcY+OirAZio5uHZ1+6DS4vm7mbWliXo9VoquKYTNujmTKc+YkF2uip6QU3U4Ucnit+MMWILlH518akB7GylIW//kops8r1z0/G6/2w/GP2xwDqX1rkquEiHT+mn6QJQdksA0ZxaOWnf9IyvLXHDmMPbuGSVPNpWU0GCuT3YBSo/lYgaPNZgSnwFfHhnLbGUeHmJd+OP34wKMYSl8d+vGGtxX32MNi8i8myBTm9UHI3/4hK9sdlHCy21/dXiM8VymVrm3kedq7l1vC9bfvn/wmWD1Cb6MpEqlORwm+Ij62XYFHTIYkY/UjAz8QUj6YRT6URCSa1vbxxu59W7PeP28mwVXaBSGAf2AFOzKYHh54Pt+Jwu8weULHL9cCOaWFqmQ9TcXQ91qduqgPicXBmxqSPD9guWmPrS6gp/PhW2xPbdQNy3/KWc8A4+3rvqxVF5jeXYu5+peqQycmdMR0gL5Vx9XM8GVlg1tvsCdaeTAn2/v7NMVO2lE/e6lbhjSDsVNAK42hr1S6GYnsRUF0EhWed6hE2Z5FmM+kjdGSFOR0mifVphRVLkVJdM2BpmUCglPI/e2DjWc5RBXZXzfiAcQY/80BU2jvhv8qVfaTCN4E+cCCYzu0dqZqLmMJRSlXZxmh+h15dbRTa0XhniysGBoNPAvj/vDgb/sUCGRrpJDjKxPjYONJ4NHaSFmIsZ71AuEziY5JGvkSqcxR1DNHBJhVs4pLg69JY5PSZbHGGZedptMzWNr87gS63oWJQAHIEDHSbUab8IWDZhcydSdFxYIm7dkStuVoR8ifgNM4/DPQZwrvWtKV9ZwVYLDgvuZieb1ayRBbKzSeJrnsye5mrymDwmPNKC3A2QJ7LGizMH8belnkpfLf5a4K6+SOPxFq+npvOhhb6/UCjffc1Jl7H9a+y6F4f/a9y/Qvndu7tOWZXHGTIasHvphOGDTfhDAqD8cj2AcDoMRHw2HIw5T6E8Z74djzhI/GEzDYDyejHweBiMY8YRPRoA3UTAppshQd8sC7+AOfUFr9LYkNvgNLRY/NvHj48a4jcLmuEh3UH45HjvqBJIDUeG7EXHF8QYxY3fOdKtbK67h9zuv1et6heC22qQ37dkWfdXjVlEd+qZt7Dojop+rijANhEnCjBFOvC2ZKk0aXcGL8Zg0c3AbJZaZXdMlqAbEZoBRjmvOUQpAphA1JRpw+YBySpoT3LPEKtJWaHLWVbvkwylZYO9Eyfcs2ZVq3vjb0A65VxlLDFugkdlzgWsEGoAYcIfumhdsTxRVgRUS4qTkTDmHhQsD3bvyk1X/iOyvoSzJXbnZgkXrCrYzbjTJEXX/1MrKxjOmhZNfxwi6znb7b1Pc+NeDjXGCBbIiolOvPQe6xJ+d1y61XJ7qP8bsLP8CjYUUZA==
eNrVVk9v3EQU58+NI59gZCEhofWud9e7bhb1EIWqLTRqUUNV1FbW7PjZnsaecWfGSbbRHig9I5lP0JIoqaKWooK4QCWOHPgC4cBn4Y13nbbblFTlAlGi3bx/85v3fu9n39nfAKW5FG8/5MKAoszgP/rbO/sKbpWgzd29HEwqo52zZ9Z2SsUPP0iNKfSo06EFb+ucm7SdUZGwlHLRZjLvcBHL3bGMJr/tp0AjLH/34AsNyl1OQJjqJxtd57nFpOO1u+2uHzxeZgwK454RTEZcJNWj5DYvWiSCOKMG9mbu6gdaFBln1GLs3NRSHKxIIaDGXB2sAxQuzfgGPFCgC7wGfL2nDTWlvrOLdeGP3/dz0Jom8N3Fzxpwf731/pOr7ifU0Egm7hp2ANzzUXVIuv0oGPtR7I0DFvS84FTEguBUwOIx+AMPxr9aUFq7CMEombnLWSY33XOzqtX9j54u+M9sFVLDcwGPVihLofFXT4pyjJdrkZxuuYjx9NDbucJpdYAdIomUSQa7V6iaVHsXFU+42LukaJLT6oGQLrOVHl917ZH1SRw7UN339puvT9fSskW8LvmUCtJdCjzieaP6l5xdXdvF60P19DI1LdLrkVWqSM/rDUh3OPK9kd+1MYfk2PuuKIhwrJxmuto1qoSfF8JW8TY4+Wpn6HkPrRGj3bVJAS9P8/iOrtb8sw37cY3nSI65fdaF6t7+cmbcyxusOmyn/dPOyPf7zsfYxNO9wVLP87xW2nd7S8c4fjn2uKbs9w3WCyASkyL+oFfT+ivklEIYf75zb9uZb48zcrz2UjsInJbDBXJOMAiRuol2RtvOOJPjUBuJ84IQBB1nEDkj26zWog+PBix2uY+FIuSkBhPCFs2LDHSYl5nhBVVmscjJEbh6uNwGQspD3Gs1WQyQKgmZgnoYYcT13BnjXNFb0EmOvVhMKvD2UtAsxGz9cpbuv+rWGqhi6UvWVG6GxmRhyRuTsfsYGg4qjEo1R0cndVszKRK77Zjv45htujJzQ9eftpxNqdZ1YQtoJguwKEMuNrgBfYTxtjZRiLJV4JbYSb6ICYuMqUGkOG8UQwwUMU/s4aWGF7odFRIF9OgmjGYQlkV4S/PbiB85lYBCWF4NtPEKk2LLIx1mSGxM7g4bZyQ3RSggL8zkWbaPXluuia5rHRnC8aS+WM9bCrqDnjedvvdqFT99korjH1p1R2V5ByfoFgp7ZDpWjbX5H8n7N/9epmtxddlcpo/kdlGc97AJKAfVfrnBmVTidQXzIZsLjTlWFP9JT3ejk3X7vy2qp3z/RVF998K2M+NemFKdohYOPN/v0bjb78OwOwiGEPiD/pANB4Mhgxi6MWVIMUYjr9+L/X4QjIce8/tDGLKIjYeASppTwWPkrV1cjqt9zTkiO3pn1Nb4DS0GP1bw41JtXMMNtAx1brScjOHKoSLhlBAVDg0Rlwz1DTPWN6maaf2cgfj92mudda5EcKuzpDc9c1b0pMvNo1rOmx5jmoyR86UsCVVA8GWComzaB54hsVSkVhukrkuF3gQ7UYIPsXXdJqgRxKSAUZYR1lFwQKoQGRMFOHxA4Sb1LmwZYiSZVahzmqptcj4mEzw7kuJDQ9aF3Kz9s9AWuVlqQzSdoJGahcAGgQIgGiwL7eH4rsXzMscKEbEC81w5i4VxDe3r4vP5+SOy3UCZkutiZQYWrXPY1rhcJ4/qF4GiNOEGVdw+USwjnCbbzn+WYtvfNDbEDubIipETu7N1cKb4c+O1S02nz94FMObG9G9f2m1A

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
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

View File

@ -1 +1 @@
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

View File

@ -1 +1 @@
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

View File

@ -1 +1 @@
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

View File

@ -1 +1 @@
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

View File

@ -1 +1 @@
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

View File

@ -1 +0,0 @@
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

View File

@ -1 +1 @@
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

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
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

File diff suppressed because one or more lines are too long

View File

@ -16,23 +16,29 @@
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 1,
"id": "161f5898-9976-4a75-943d-03eda1a40a60",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'token_usage': {'completion_tokens': 164,\n",
" 'prompt_tokens': 17,\n",
" 'total_tokens': 181},\n",
" 'model_name': 'gpt-4-turbo',\n",
" 'system_fingerprint': 'fp_76f018034d',\n",
"{'token_usage': {'completion_tokens': 110,\n",
" 'prompt_tokens': 16,\n",
" 'total_tokens': 126,\n",
" 'completion_tokens_details': {'accepted_prediction_tokens': 0,\n",
" 'audio_tokens': 0,\n",
" 'reasoning_tokens': 0,\n",
" 'rejected_prediction_tokens': 0},\n",
" 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}},\n",
" 'model_name': 'gpt-4o-mini-2024-07-18',\n",
" 'system_fingerprint': 'fp_b8bc95a0ac',\n",
" 'id': 'chatcmpl-BDrISvLar6AqcZngBmhajFZXVc2u9',\n",
" 'finish_reason': 'stop',\n",
" 'logprobs': None}"
]
},
"execution_count": 2,
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
@ -40,8 +46,8 @@
"source": [
"from langchain_openai import ChatOpenAI\n",
"\n",
"llm = ChatOpenAI(model=\"gpt-4-turbo\")\n",
"msg = llm.invoke([(\"human\", \"What's the oldest known example of cuneiform\")])\n",
"llm = ChatOpenAI(model=\"gpt-4o-mini\")\n",
"msg = llm.invoke(\"What's the oldest known example of cuneiform\")\n",
"msg.response_metadata"
]
},
@ -55,21 +61,25 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 2,
"id": "61c43496-83b5-4d71-bd60-3e6d46c62a5e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'id': 'msg_01CzQyD7BX8nkhDNfT1QqvEp',\n",
" 'model': 'claude-3-sonnet-20240229',\n",
"{'id': 'msg_01JHnvPqgERY7MZwrvfkmq52',\n",
" 'model': 'claude-3-5-sonnet-20241022',\n",
" 'stop_reason': 'end_turn',\n",
" 'stop_sequence': None,\n",
" 'usage': {'input_tokens': 17, 'output_tokens': 296}}"
" 'usage': {'cache_creation_input_tokens': 0,\n",
" 'cache_read_input_tokens': 0,\n",
" 'input_tokens': 17,\n",
" 'output_tokens': 221},\n",
" 'model_name': 'claude-3-5-sonnet-20241022'}"
]
},
"execution_count": 7,
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
@ -77,8 +87,8 @@
"source": [
"from langchain_anthropic import ChatAnthropic\n",
"\n",
"llm = ChatAnthropic(model=\"claude-3-sonnet-20240229\")\n",
"msg = llm.invoke([(\"human\", \"What's the oldest known example of cuneiform\")])\n",
"llm = ChatAnthropic(model=\"claude-3-5-sonnet-latest\")\n",
"msg = llm.invoke(\"What's the oldest known example of cuneiform\")\n",
"msg.response_metadata"
]
},
@ -92,7 +102,7 @@
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 3,
"id": "39549336-25f5-4839-9846-f687cd77e59b",
"metadata": {},
"outputs": [
@ -102,23 +112,41 @@
"{'is_blocked': False,\n",
" 'safety_ratings': [{'category': 'HARM_CATEGORY_HATE_SPEECH',\n",
" 'probability_label': 'NEGLIGIBLE',\n",
" 'blocked': False},\n",
" 'probability_score': 0.046142578125,\n",
" 'blocked': False,\n",
" 'severity': 'HARM_SEVERITY_NEGLIGIBLE',\n",
" 'severity_score': 0.07275390625},\n",
" {'category': 'HARM_CATEGORY_DANGEROUS_CONTENT',\n",
" 'probability_label': 'NEGLIGIBLE',\n",
" 'blocked': False},\n",
" 'probability_score': 0.05419921875,\n",
" 'blocked': False,\n",
" 'severity': 'HARM_SEVERITY_NEGLIGIBLE',\n",
" 'severity_score': 0.03955078125},\n",
" {'category': 'HARM_CATEGORY_HARASSMENT',\n",
" 'probability_label': 'NEGLIGIBLE',\n",
" 'blocked': False},\n",
" 'probability_score': 0.083984375,\n",
" 'blocked': False,\n",
" 'severity': 'HARM_SEVERITY_NEGLIGIBLE',\n",
" 'severity_score': 0.029296875},\n",
" {'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT',\n",
" 'probability_label': 'NEGLIGIBLE',\n",
" 'blocked': False}],\n",
" 'citation_metadata': None,\n",
" 'probability_score': 0.054931640625,\n",
" 'blocked': False,\n",
" 'severity': 'HARM_SEVERITY_NEGLIGIBLE',\n",
" 'severity_score': 0.03466796875}],\n",
" 'usage_metadata': {'prompt_token_count': 10,\n",
" 'candidates_token_count': 30,\n",
" 'total_token_count': 40}}"
" 'candidates_token_count': 193,\n",
" 'total_token_count': 203,\n",
" 'prompt_tokens_details': [{'modality': 1, 'token_count': 10}],\n",
" 'candidates_tokens_details': [{'modality': 1, 'token_count': 193}],\n",
" 'cached_content_token_count': 0,\n",
" 'cache_tokens_details': []},\n",
" 'finish_reason': 'STOP',\n",
" 'avg_logprobs': -0.5702065976790196,\n",
" 'model_name': 'gemini-1.5-flash-001'}"
]
},
"execution_count": 8,
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
@ -126,8 +154,8 @@
"source": [
"from langchain_google_vertexai import ChatVertexAI\n",
"\n",
"llm = ChatVertexAI(model=\"gemini-pro\")\n",
"msg = llm.invoke([(\"human\", \"What's the oldest known example of cuneiform\")])\n",
"llm = ChatVertexAI(model=\"gemini-1.5-flash-001\")\n",
"msg = llm.invoke(\"What's the oldest known example of cuneiform\")\n",
"msg.response_metadata"
]
},
@ -141,27 +169,35 @@
},
{
"cell_type": "code",
"execution_count": 16,
"execution_count": 4,
"id": "1e4ac668-4c6a-48ad-9a6f-7b291477b45d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'model_id': 'anthropic.claude-v2',\n",
" 'usage': {'prompt_tokens': 19, 'completion_tokens': 371, 'total_tokens': 390}}"
"{'ResponseMetadata': {'RequestId': 'ea0ac2ad-3ad5-4a49-9647-274a0c73ac31',\n",
" 'HTTPStatusCode': 200,\n",
" 'HTTPHeaders': {'date': 'Sat, 22 Mar 2025 11:27:46 GMT',\n",
" 'content-type': 'application/json',\n",
" 'content-length': '1660',\n",
" 'connection': 'keep-alive',\n",
" 'x-amzn-requestid': 'ea0ac2ad-3ad5-4a49-9647-274a0c73ac31'},\n",
" 'RetryAttempts': 0},\n",
" 'stopReason': 'end_turn',\n",
" 'metrics': {'latencyMs': [11044]}}"
]
},
"execution_count": 16,
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from langchain_aws import ChatBedrock\n",
"from langchain_aws import ChatBedrockConverse\n",
"\n",
"llm = ChatBedrock(model_id=\"anthropic.claude-v2\")\n",
"msg = llm.invoke([(\"human\", \"What's the oldest known example of cuneiform\")])\n",
"llm = ChatBedrockConverse(model=\"anthropic.claude-3-sonnet-20240229-v1:0\")\n",
"msg = llm.invoke(\"What's the oldest known example of cuneiform\")\n",
"msg.response_metadata"
]
},
@ -175,21 +211,22 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 5,
"id": "deb41321-52d0-4795-a40c-4a811a13d7b0",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'token_usage': {'prompt_tokens': 19,\n",
" 'total_tokens': 141,\n",
" 'completion_tokens': 122},\n",
" 'model': 'mistral-small',\n",
"{'token_usage': {'prompt_tokens': 13,\n",
" 'total_tokens': 219,\n",
" 'completion_tokens': 206},\n",
" 'model_name': 'mistral-small-latest',\n",
" 'model': 'mistral-small-latest',\n",
" 'finish_reason': 'stop'}"
]
},
"execution_count": 7,
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
@ -197,7 +234,7 @@
"source": [
"from langchain_mistralai import ChatMistralAI\n",
"\n",
"llm = ChatMistralAI()\n",
"llm = ChatMistralAI(model=\"mistral-small-latest\")\n",
"msg = llm.invoke([(\"human\", \"What's the oldest known example of cuneiform\")])\n",
"msg.response_metadata"
]
@ -212,27 +249,27 @@
},
{
"cell_type": "code",
"execution_count": 1,
"execution_count": 6,
"id": "744e14ec-ff50-4642-9893-ff7bdf8927ff",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'token_usage': {'completion_time': 0.243,\n",
" 'completion_tokens': 132,\n",
" 'prompt_time': 0.022,\n",
" 'prompt_tokens': 22,\n",
" 'queue_time': None,\n",
" 'total_time': 0.265,\n",
" 'total_tokens': 154},\n",
" 'model_name': 'mixtral-8x7b-32768',\n",
" 'system_fingerprint': 'fp_7b44c65f25',\n",
"{'token_usage': {'completion_tokens': 184,\n",
" 'prompt_tokens': 45,\n",
" 'total_tokens': 229,\n",
" 'completion_time': 0.245333333,\n",
" 'prompt_time': 0.002262803,\n",
" 'queue_time': 0.19315161,\n",
" 'total_time': 0.247596136},\n",
" 'model_name': 'llama-3.1-8b-instant',\n",
" 'system_fingerprint': 'fp_a56f6eea01',\n",
" 'finish_reason': 'stop',\n",
" 'logprobs': None}"
]
},
"execution_count": 1,
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
@ -240,53 +277,8 @@
"source": [
"from langchain_groq import ChatGroq\n",
"\n",
"llm = ChatGroq()\n",
"msg = llm.invoke([(\"human\", \"What's the oldest known example of cuneiform\")])\n",
"msg.response_metadata"
]
},
{
"cell_type": "markdown",
"id": "7cdeec00-8a8f-422a-8819-47c646578b65",
"metadata": {},
"source": [
"## TogetherAI"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "a984118e-a731-4864-bcea-7dc6c6b3d139",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'token_usage': {'completion_tokens': 208,\n",
" 'prompt_tokens': 20,\n",
" 'total_tokens': 228},\n",
" 'model_name': 'mistralai/Mixtral-8x7B-Instruct-v0.1',\n",
" 'system_fingerprint': None,\n",
" 'finish_reason': 'eos',\n",
" 'logprobs': None}"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import os\n",
"\n",
"from langchain_openai import ChatOpenAI\n",
"\n",
"llm = ChatOpenAI(\n",
" base_url=\"https://api.together.xyz/v1\",\n",
" api_key=os.environ[\"TOGETHER_API_KEY\"],\n",
" model=\"mistralai/Mixtral-8x7B-Instruct-v0.1\",\n",
")\n",
"msg = llm.invoke([(\"human\", \"What's the oldest known example of cuneiform\")])\n",
"llm = ChatGroq(model=\"llama-3.1-8b-instant\")\n",
"msg = llm.invoke(\"What's the oldest known example of cuneiform\")\n",
"msg.response_metadata"
]
},
@ -300,23 +292,23 @@
},
{
"cell_type": "code",
"execution_count": 31,
"execution_count": 7,
"id": "6ae32a93-26db-41bb-95c2-38ddd5085fbe",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'token_usage': {'prompt_tokens': 19,\n",
" 'total_tokens': 219,\n",
" 'completion_tokens': 200},\n",
" 'model_name': 'accounts/fireworks/models/mixtral-8x7b-instruct',\n",
"{'token_usage': {'prompt_tokens': 25,\n",
" 'total_tokens': 352,\n",
" 'completion_tokens': 327},\n",
" 'model_name': 'accounts/fireworks/models/llama-v3p1-70b-instruct',\n",
" 'system_fingerprint': '',\n",
" 'finish_reason': 'length',\n",
" 'finish_reason': 'stop',\n",
" 'logprobs': None}"
]
},
"execution_count": 31,
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
@ -324,17 +316,17 @@
"source": [
"from langchain_fireworks import ChatFireworks\n",
"\n",
"llm = ChatFireworks(model=\"accounts/fireworks/models/mixtral-8x7b-instruct\")\n",
"msg = llm.invoke([(\"human\", \"What's the oldest known example of cuneiform\")])\n",
"llm = ChatFireworks(model=\"accounts/fireworks/models/llama-v3p1-70b-instruct\")\n",
"msg = llm.invoke(\"What's the oldest known example of cuneiform\")\n",
"msg.response_metadata"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "poetry-venv-2",
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "poetry-venv-2"
"name": "python3"
},
"language_info": {
"codemirror_mode": {
@ -346,7 +338,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.1"
"version": "3.10.4"
}
},
"nbformat": 4,

View File

@ -60,18 +60,10 @@
},
{
"cell_type": "code",
"execution_count": 1,
"id": "c91edeb2-9978-4665-9fdb-fc96cdb51caa",
"execution_count": null,
"id": "c9bed5ea-8aee-4d43-a717-77a431a02d2e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"outputs": [],
"source": [
"pip install -qU langchain-openai"
]
@ -102,7 +94,7 @@
" ToolMessage,\n",
" trim_messages,\n",
")\n",
"from langchain_openai import ChatOpenAI\n",
"from langchain_core.messages.utils import count_tokens_approximately\n",
"\n",
"messages = [\n",
" SystemMessage(\"you're a good assistant, you always respond with a joke.\"),\n",
@ -124,8 +116,8 @@
" strategy=\"last\",\n",
" # highlight-start\n",
" # Remember to adjust based on your model\n",
" # or else pass a custom token_encoder\n",
" token_counter=ChatOpenAI(model=\"gpt-4o\"),\n",
" # or else pass a custom token_counter\n",
" token_counter=count_tokens_approximately,\n",
" # highlight-end\n",
" # Most chat models expect that chat history starts with either:\n",
" # (1) a HumanMessage or\n",
@ -220,7 +212,7 @@
"source": [
"## Advanced Usage\n",
"\n",
"You can use `trim_message` as a building-block to create more complex processing logic.\n",
"You can use `trim_messages` as a building-block to create more complex processing logic.\n",
"\n",
"If we want to allow splitting up the contents of a message we can specify `allow_partial=True`:"
]
@ -228,7 +220,7 @@
{
"cell_type": "code",
"execution_count": 4,
"id": "8bcca1fe-674c-4713-bacc-8e8e6d6f56c3",
"id": "0265eba7-c8f3-4495-bcbb-17cd7ede3ece",
"metadata": {},
"outputs": [
{
@ -249,7 +241,7 @@
" messages,\n",
" max_tokens=56,\n",
" strategy=\"last\",\n",
" token_counter=ChatOpenAI(model=\"gpt-4o\"),\n",
" token_counter=count_tokens_approximately,\n",
" include_system=True,\n",
" allow_partial=True,\n",
")"
@ -286,7 +278,7 @@
" messages,\n",
" max_tokens=45,\n",
" strategy=\"last\",\n",
" token_counter=ChatOpenAI(model=\"gpt-4o\"),\n",
" token_counter=count_tokens_approximately,\n",
")"
]
},
@ -317,6 +309,45 @@
}
],
"source": [
"trim_messages(\n",
" messages,\n",
" max_tokens=45,\n",
" strategy=\"first\",\n",
" token_counter=count_tokens_approximately,\n",
")"
]
},
{
"cell_type": "markdown",
"id": "0625c094-380f-4485-b2d2-e5dfa83fe299",
"metadata": {},
"source": [
"## Using `ChatModel` as a token counter\n",
"\n",
"You can pass a ChatModel as a token-counter. This will use `ChatModel.get_num_tokens_from_messages`. Let's demonstrate how to use it with OpenAI:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "9ef35359-1b7a-4918-ab41-30bec69fb3dc",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[SystemMessage(content=\"you're a good assistant, you always respond with a joke.\", additional_kwargs={}, response_metadata={}),\n",
" HumanMessage(content=\"i wonder why it's called langchain\", additional_kwargs={}, response_metadata={})]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from langchain_openai import ChatOpenAI\n",
"\n",
"trim_messages(\n",
" messages,\n",
" max_tokens=45,\n",
@ -337,25 +368,17 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 8,
"id": "d930c089-e8e6-4980-9d39-11d41e794772",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"outputs": [],
"source": [
"pip install -qU tiktoken"
]
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 9,
"id": "1c1c3b1e-2ece-49e7-a3b6-e69877c1633b",
"metadata": {},
"outputs": [
@ -366,7 +389,7 @@
" HumanMessage(content='what do you call a speechless parrot', additional_kwargs={}, response_metadata={})]"
]
},
"execution_count": 8,
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
@ -451,17 +474,17 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 10,
"id": "96aa29b2-01e0-437c-a1ab-02fb0141cb57",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"AIMessage(content='A polygon! Because it\\'s a \"poly-gone\" quiet!', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 13, 'prompt_tokens': 32, 'total_tokens': 45, 'completion_tokens_details': {'reasoning_tokens': 0}}, 'model_name': 'gpt-4o-2024-05-13', 'system_fingerprint': 'fp_057232b607', 'finish_reason': 'stop', 'logprobs': None}, id='run-4fa026e7-9137-4fef-b596-54243615e3b3-0', usage_metadata={'input_tokens': 32, 'output_tokens': 13, 'total_tokens': 45})"
"AIMessage(content='A \"polly-no-wanna-cracker\"!', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 11, 'prompt_tokens': 32, 'total_tokens': 43, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_90d33c15d4', 'finish_reason': 'stop', 'logprobs': None}, id='run-b1f8b63b-6bc2-4df4-b3b9-dfc4e3e675fe-0', usage_metadata={'input_tokens': 32, 'output_tokens': 11, 'total_tokens': 43, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})"
]
},
"execution_count": 9,
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
@ -509,7 +532,7 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": 11,
"id": "1ff02d0a-353d-4fac-a77c-7c2c5262abd9",
"metadata": {},
"outputs": [
@ -520,7 +543,7 @@
" HumanMessage(content='what do you call a speechless parrot', additional_kwargs={}, response_metadata={})]"
]
},
"execution_count": 10,
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
@ -569,8 +592,6 @@
" return chat_history\n",
"\n",
"\n",
"llm = ChatOpenAI(model=\"gpt-4o\")\n",
"\n",
"trimmer = trim_messages(\n",
" max_tokens=45,\n",
" strategy=\"last\",\n",
@ -629,7 +650,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.4"
"version": "3.12.3"
}
},
"nbformat": 4,

View File

@ -655,6 +655,266 @@
"response.additional_kwargs"
]
},
{
"cell_type": "markdown",
"id": "82b2cfbe-a019-4c6b-a323-a5d7c158cb0d",
"metadata": {},
"source": [
"#### Computer use\n",
"\n",
"`ChatOpenAI` supports the `\"computer-use-preview\"` model, which is a specialized model for the built-in computer use tool. To enable, pass a [computer use tool](https://platform.openai.com/docs/guides/tools-computer-use) as you would pass another tool.\n",
"\n",
"Currently, tool outputs for computer use are present in `AIMessage.additional_kwargs[\"tool_outputs\"]`. To reply to the computer use tool call, construct a `ToolMessage` with `{\"type\": \"computer_call_output\"}` in its `additional_kwargs`. The content of the message will be a screenshot. Below, we demonstrate a simple example.\n",
"\n",
"First, load two screenshots:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "0fab26a6-f041-4d40-8d7c-51ae8a1ad698",
"metadata": {},
"outputs": [],
"source": [
"import base64\n",
"\n",
"\n",
"def load_png_as_base64(file_path):\n",
" with open(file_path, \"rb\") as image_file:\n",
" encoded_string = base64.b64encode(image_file.read())\n",
" return encoded_string.decode(\"utf-8\")\n",
"\n",
"\n",
"screenshot_1_base64 = load_png_as_base64(\n",
" \"/path/to/screenshot_1.png\"\n",
") # perhaps a screenshot of an application\n",
"screenshot_2_base64 = load_png_as_base64(\n",
" \"/path/to/screenshot_2.png\"\n",
") # perhaps a screenshot of the Desktop"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "ff26e977-1bf2-467d-a853-719c1132bb43",
"metadata": {},
"outputs": [],
"source": [
"from langchain_openai import ChatOpenAI\n",
"\n",
"# Initialize model\n",
"llm = ChatOpenAI(\n",
" model=\"computer-use-preview\",\n",
" model_kwargs={\"truncation\": \"auto\"},\n",
")\n",
"\n",
"# Bind computer-use tool\n",
"tool = {\n",
" \"type\": \"computer_use_preview\",\n",
" \"display_width\": 1024,\n",
" \"display_height\": 768,\n",
" \"environment\": \"browser\",\n",
"}\n",
"llm_with_tools = llm.bind_tools([tool])\n",
"\n",
"# Construct input message\n",
"input_message = {\n",
" \"role\": \"user\",\n",
" \"content\": [\n",
" {\n",
" \"type\": \"text\",\n",
" \"text\": (\n",
" \"Click the red X to close and reveal my Desktop. \"\n",
" \"Proceed, no confirmation needed.\"\n",
" ),\n",
" },\n",
" {\n",
" \"type\": \"input_image\",\n",
" \"image_url\": f\"data:image/png;base64,{screenshot_1_base64}\",\n",
" },\n",
" ],\n",
"}\n",
"\n",
"# Invoke model\n",
"response = llm_with_tools.invoke(\n",
" [input_message],\n",
" reasoning={\n",
" \"generate_summary\": \"concise\",\n",
" },\n",
")"
]
},
{
"cell_type": "markdown",
"id": "714bce19-6360-4c09-ba44-59034050527f",
"metadata": {},
"source": [
"The response will include a call to the computer-use tool in its `additional_kwargs`:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "e4a12d04-d1ab-4bd5-b93d-7028f9c818fb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'reasoning': {'id': 'rs_67ddb381c85081919c46e3e544a161e8051ff325ba1bad35',\n",
" 'summary': [{'text': 'Closing Visual Studio Code application',\n",
" 'type': 'summary_text'}],\n",
" 'type': 'reasoning'},\n",
" 'tool_outputs': [{'id': 'cu_67ddb385358c8191bf1a127b71bcf1ea051ff325ba1bad35',\n",
" 'action': {'button': 'left', 'type': 'click', 'x': 17, 'y': 38},\n",
" 'call_id': 'call_Ae3Ghz8xdqZQ01mosYhXXMho',\n",
" 'pending_safety_checks': [],\n",
" 'status': 'completed',\n",
" 'type': 'computer_call'}]}"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"response.additional_kwargs"
]
},
{
"cell_type": "markdown",
"id": "f54e95aa-715e-4ebe-acbd-681ea832abb0",
"metadata": {},
"source": [
"We next construct a ToolMessage with these properties:\n",
"\n",
"1. It has a `tool_call_id` matching the `call_id` from the computer-call.\n",
"2. It has `{\"type\": \"computer_call_output\"}` in its `additional_kwargs`.\n",
"3. Its content is either an `image_url` or an `input_image` output block (see [OpenAI docs](https://platform.openai.com/docs/guides/tools-computer-use#5-repeat) for formatting)."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "003626d2-82d9-41c2-995e-e9f8c1520d30",
"metadata": {},
"outputs": [],
"source": [
"from langchain_core.messages import ToolMessage\n",
"\n",
"tool_call_id = response.additional_kwargs[\"tool_outputs\"][0][\"call_id\"]\n",
"\n",
"tool_message = ToolMessage(\n",
" content=[\n",
" {\n",
" \"type\": \"input_image\",\n",
" \"image_url\": f\"data:image/png;base64,{screenshot_2_base64}\",\n",
" }\n",
" ],\n",
" # content=f\"data:image/png;base64,{screenshot_2_base64}\", # <-- also acceptable\n",
" tool_call_id=tool_call_id,\n",
" additional_kwargs={\"type\": \"computer_call_output\"},\n",
")"
]
},
{
"cell_type": "markdown",
"id": "ffa2bc27-389d-4c3a-b646-a9c7eedc2cb7",
"metadata": {},
"source": [
"We can now invoke the model again using the message history:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "ad10a31a-9b81-4dde-8a37-1a656543345a",
"metadata": {},
"outputs": [],
"source": [
"messages = [\n",
" input_message,\n",
" response,\n",
" tool_message,\n",
"]\n",
"\n",
"response_2 = llm_with_tools.invoke(\n",
" messages,\n",
" reasoning={\n",
" \"generate_summary\": \"concise\",\n",
" },\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "fb3a7251-890a-467c-ab59-ae0331221964",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'Done! The Desktop is now visible.'"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"response_2.text()"
]
},
{
"cell_type": "markdown",
"id": "a2759df1-317c-4dd9-823a-4aab65e41939",
"metadata": {},
"source": [
"Instead of passing back the entire sequence, we can also use the [previous_response_id](#passing-previous_response_id):"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "6a40d11b-2426-48ec-bb5e-19e0b36fd74c",
"metadata": {},
"outputs": [],
"source": [
"previous_response_id = response.response_metadata[\"id\"]\n",
"\n",
"response_2 = llm_with_tools.invoke(\n",
" [tool_message],\n",
" previous_response_id=previous_response_id,\n",
" reasoning={\n",
" \"generate_summary\": \"concise\",\n",
" },\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "687d2f05-38b7-42a5-b640-bfd6b4753719",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'The Visual Studio Code terminal has been closed and your desktop is now visible.'"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"response_2.text()"
]
},
{
"cell_type": "markdown",
"id": "6fda05f0-4b81-4709-9407-f316d760ad50",

View File

@ -173,6 +173,41 @@
"response.content"
]
},
{
"cell_type": "markdown",
"id": "a7f8f61b",
"metadata": {},
"source": [
"## Using Perplexity-specific parameters through `ChatPerplexity`\n",
"\n",
"You can also use Perplexity-specific parameters through the ChatPerplexity class. For example, parameters like search_domain_filter, return_images, return_related_questions or search_recency_filter using the extra_body parameter as shown below:"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "73960f51",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"Sure, here's a cat joke for you:\\n\\nWhy are cats bad storytellers?\\n\\nBecause they only have one tale. (Pun alert!)\\n\\nSource: OneLineFun.com [4]\""
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"chat = ChatPerplexity(temperature=0.7, model=\"llama-3.1-sonar-small-128k-online\")\n",
"response = chat.invoke(\n",
" \"Tell me a joke about cats\", extra_body={\"search_recency_filter\": \"week\"}\n",
")\n",
"response.content"
]
},
{
"cell_type": "markdown",
"id": "13d93dc4",
@ -216,13 +251,56 @@
],
"source": [
"chat = ChatPerplexity(temperature=0.7, model=\"llama-3.1-sonar-small-128k-online\")\n",
"prompt = ChatPromptTemplate.from_messages(\n",
" [(\"human\", \"Give me a list of famous tourist attractions in Pakistan\")]\n",
")\n",
"chain = prompt | chat\n",
"for chunk in chain.stream({}):\n",
"\n",
"for chunk in chat.stream(\"Give me a list of famous tourist attractions in Pakistan\"):\n",
" print(chunk.content, end=\"\", flush=True)"
]
},
{
"cell_type": "markdown",
"id": "397c43de",
"metadata": {},
"source": [
"## `ChatPerplexity` Supports Structured Outputs for Tier 3+ Users"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "1bae9b80-394a-4340-9c30-612c136b742a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"AnswerFormat(first_name='Michael', last_name='Jordan', year_of_birth=1963, num_seasons_in_nba=15)"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from pydantic import BaseModel\n",
"\n",
"\n",
"class AnswerFormat(BaseModel):\n",
" first_name: str\n",
" last_name: str\n",
" year_of_birth: int\n",
" num_seasons_in_nba: int\n",
"\n",
"\n",
"chat = ChatPerplexity(temperature=0.7, model=\"sonar-pro\")\n",
"structured_chat = chat.with_structured_output(AnswerFormat)\n",
"response = structured_chat.invoke(\n",
" \"Tell me about Michael Jordan. Return your answer \"\n",
" \"as JSON with keys first_name (str), last_name (str), \"\n",
" \"year_of_birth (int), and num_seasons_in_nba (int).\"\n",
")\n",
"response"
]
}
],
"metadata": {
@ -241,7 +319,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.12"
"version": "3.10.4"
}
},
"nbformat": 4,

View File

@ -6,22 +6,54 @@
"source": [
"# Contextual AI\n",
"\n",
"Contextual AI is a platform that offers state-of-the-art Retrieval-Augmented Generation (RAG) technology for enterprise applications. Our platformant models helps innovative teams build production-ready AI applications that can process millions of pages of documents with exceptional accuracy.\n",
"Contextual AI provides state-of-the-art RAG components designed specifically for accurate and reliable enterprise AI applications. Our LangChain integration exposes standalone API endpoints for our specialized models:\n",
"\n",
"- Grounded Language Model (GLM): The world's most grounded language model, engineered to minimize hallucinations by prioritizing faithfulness to retrieved knowledge. GLM delivers exceptional factual accuracy with inline attributions, making it ideal for enterprise RAG and agentic applications where reliability is critical.\n",
"\n",
"- Instruction-Following Reranker: The first reranker that follows custom instructions to intelligently prioritize documents based on specific criteria like recency, source, or document type. Outperforming competitors on industry benchmarks, our reranker resolves conflicting information challenges in enterprise knowledge bases.\n",
"\n",
"Founded by the inventors of RAG technology, Contextual AI's specialized components help innovative teams accelerate the development of production-ready RAG agents that deliver responses with exceptional accuracy.\n",
"\n",
"## Grounded Language Model (GLM)\n",
"\n",
"The Grounded Language Model (GLM) is specifically engineered to minimize hallucinations in RAG and agentic applications. The GLM achieves:\n",
"The Grounded Language Model (GLM) is engineered specifically to minimize hallucinations in enterprise RAG and agentic applications. The GLM delivers:\n",
"\n",
"- State-of-the-art performance on the FACTS benchmark\n",
"- Responses strictly grounded in provided knowledge sources\n",
"- Strong performance with 88% factual accuracy on the FACTS benchmark ([See benchmark results](https://venturebeat.com/ai/contextual-ais-new-ai-model-crushes-gpt-4o-in-accuracy-heres-why-it-matters/))\n",
"- Responses strictly grounded in provided knowledge sources with inline attributions ([Read product details](https://contextual.ai/blog/introducing-grounded-language-model/))\n",
"- Precise source citations integrated directly within generated responses\n",
"- Prioritization of retrieved context over parametric knowledge ([View technical overview](https://contextual.ai/blog/platform-benchmarks-2025/))\n",
"- Clear acknowledgment of uncertainty when information is unavailable\n",
"\n",
"GLM serves as a drop-in replacement for general-purpose LLMs in RAG pipelines, dramatically improving reliability for mission-critical enterprise applications.\n",
"\n",
"## Instruction-Following Reranker\n",
"\n",
"The world's first Instruction-Following Reranker revolutionizes document ranking with unprecedented control and accuracy. Key capabilities include:\n",
"\n",
"- Natural language instructions to prioritize documents based on recency, source, metadata, and more ([See how it works](https://contextual.ai/blog/introducing-instruction-following-reranker/))\n",
"- Superior performance on the BEIR benchmark with a score of 61.2, outperforming competitors by significant margins ([View benchmark data](https://contextual.ai/blog/platform-benchmarks-2025/))\n",
"- Intelligent resolution of conflicting information from multiple knowledge sources\n",
"- Seamless integration as a drop-in replacement for existing rerankers\n",
"- Dynamic control over document ranking through natural language commands\n",
"\n",
"The reranker excels at handling enterprise knowledge bases with potentially contradictory information, allowing you to specify exactly which sources should take precedence in various scenarios.\n",
"\n",
"## Using Contextual AI with LangChain\n",
"\n",
"See details [here](/docs/integrations/chat/contextual).\n",
"\n",
"This integration allows you to easily incorporate Contextual AI's GLM into your LangChain workflows. Whether you're building applications for regulated industries or security-conscious environments, Contextual AI provides the grounded and reliable responses your use cases demand.\n",
"This integration allows you to easily incorporate Contextual AI's GLM and Instruction-Following Reranker into your LangChain workflows. The GLM ensures your applications deliver strictly grounded responses, while the reranker significantly improves retrieval quality by intelligently prioritizing the most relevant documents.\n",
"\n",
"Get started with a free trial today and experience the most grounded language model for enterprise AI applications."
"Whether you're building applications for regulated industries or security-conscious environments, Contextual AI provides the accuracy, control, and reliability your enterprise use cases demand.\n",
"\n",
"Get started with a free trial today and experience the most grounded language model and instruction-following reranker for enterprise AI applications."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Grounded Language Model"
]
},
{
@ -43,6 +75,7 @@
}
],
"source": [
"# Integrating the Grounded Language Model\n",
"import getpass\n",
"import os\n",
"\n",
@ -81,6 +114,74 @@
"\n",
"print(ai_msg.content)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Instruction-Following Reranker"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import getpass\n",
"import os\n",
"\n",
"from langchain_contextual import ContextualRerank\n",
"\n",
"if not os.getenv(\"CONTEXTUAL_AI_API_KEY\"):\n",
" os.environ[\"CONTEXTUAL_AI_API_KEY\"] = getpass.getpass(\n",
" \"Enter your Contextual API key: \"\n",
" )\n",
"\n",
"\n",
"api_key = \"\"\n",
"model = \"ctxl-rerank-en-v1-instruct\"\n",
"\n",
"compressor = ContextualRerank(\n",
" model=model,\n",
" api_key=api_key,\n",
")\n",
"\n",
"from langchain_core.documents import Document\n",
"\n",
"query = \"What is the current enterprise pricing for the RTX 5090 GPU for bulk orders?\"\n",
"instruction = \"Prioritize internal sales documents over market analysis reports. More recent documents should be weighted higher. Enterprise portal content supersedes distributor communications.\"\n",
"\n",
"document_contents = [\n",
" \"Following detailed cost analysis and market research, we have implemented the following changes: AI training clusters will see a 15% uplift in raw compute performance, enterprise support packages are being restructured, and bulk procurement programs (100+ units) for the RTX 5090 Enterprise series will operate on a $2,899 baseline.\",\n",
" \"Enterprise pricing for the RTX 5090 GPU bulk orders (100+ units) is currently set at $3,100-$3,300 per unit. This pricing for RTX 5090 enterprise bulk orders has been confirmed across all major distribution channels.\",\n",
" \"RTX 5090 Enterprise GPU requires 450W TDP and 20% cooling overhead.\",\n",
"]\n",
"\n",
"metadata = [\n",
" {\n",
" \"Date\": \"January 15, 2025\",\n",
" \"Source\": \"NVIDIA Enterprise Sales Portal\",\n",
" \"Classification\": \"Internal Use Only\",\n",
" },\n",
" {\"Date\": \"11/30/2023\", \"Source\": \"TechAnalytics Research Group\"},\n",
" {\n",
" \"Date\": \"January 25, 2025\",\n",
" \"Source\": \"NVIDIA Enterprise Sales Portal\",\n",
" \"Classification\": \"Internal Use Only\",\n",
" },\n",
"]\n",
"\n",
"documents = [\n",
" Document(page_content=content, metadata=metadata[i])\n",
" for i, content in enumerate(document_contents)\n",
"]\n",
"reranked_documents = compressor.compress_documents(\n",
" query=query,\n",
" instruction=instruction,\n",
" documents=documents,\n",
")"
]
}
],
"metadata": {

View File

@ -12,10 +12,15 @@ Please refer to [NCP User Guide](https://guide.ncloud-docs.com/docs/clovastudio-
- Get a CLOVA Studio API Key by [issuing it](https://api.ncloud-docs.com/docs/ai-naver-clovastudio-summary#API%ED%82%A4) and set it as an environment variable (`NCP_CLOVASTUDIO_API_KEY`).
- If you are using a legacy API Key (that doesn't start with `nv-*` prefix), you might need to get an additional API Key by [creating your app](https://guide.ncloud-docs.com/docs/en/clovastudio-playground01#create-test-app) and set it as `NCP_APIGW_API_KEY`.
- Install the integration Python package with:
Naver integrations live in two packages:
- `langchain-naver-community`: a dedicated integration package for Naver. It is a community-maintained package and is not officially maintained by Naver or LangChain.
- `langchain-community`: a collection of [third-party integrations](https://python.langchain.com/docs/concepts/architecture/#langchain-community),
including Naver. **New features should be implemented in the dedicated `langchain-naver-community` package**.
```bash
pip install -U langchain-community
pip install -U langchain-community langchain-naver-community
```
## Chat models
@ -37,3 +42,41 @@ See a [usage example](/docs/integrations/text_embedding/naver).
```python
from langchain_community.embeddings import ClovaXEmbeddings
```
## Tools
### Naver Search
The Naver Search integration allows your LangChain applications to retrieve information from Naver's search engine. This is particularly useful for Korean language queries and getting up-to-date information about Korean topics.
To use the Naver Search tools, you need to:
1. Sign in to the [Naver Developers portal](https://developers.naver.com/main/)
2. Create a new application and enable the Search API
3. Obtain your **NAVER_CLIENT_ID** and **NAVER_CLIENT_SECRET** from the "Application List" section
4. Set these as environment variables in your application
```python
from langchain_naver_community.tool import NaverSearchResults
from langchain_naver_community.utils import NaverSearchAPIWrapper
# Set up the search wrapper
search = NaverSearchAPIWrapper()
# Create a tool
tool = NaverSearchResults(api_wrapper=search)
```
See a [usage example](/docs/integrations/tools/naver_search) for more details.
### Specialized Search Tools
The package also provides specialized search tools for different types of content:
```python
from langchain_naver_community.tool import NaverNewsSearch # For news articles
from langchain_naver_community.tool import NaverBlogSearch # For blog posts
from langchain_naver_community.tool import NaverImageSearch # For images
```
Each of these can be used within LangChain agents to provide more targeted search capabilities.

View File

@ -0,0 +1,190 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Contextual AI Reranker\n",
"\n",
"Contextual AI's Instruction-Following Reranker is the world's first reranker designed to follow custom instructions about how to prioritize documents based on specific criteria like recency, source, and metadata. With superior performance on the BEIR benchmark (scoring 61.2 and outperforming competitors by significant margins), it delivers unprecedented control and accuracy for enterprise RAG applications.\n",
"\n",
"## Key Capabilities\n",
"\n",
"- **Instruction Following**: Dynamically control document ranking through natural language commands\n",
"- **Conflict Resolution**: Intelligently handle contradictory information from multiple knowledge sources\n",
"- **Superior Accuracy**: Achieve state-of-the-art performance on industry benchmarks\n",
"- **Seamless Integration**: Drop-in replacement for existing rerankers in your RAG pipeline\n",
"\n",
"The reranker excels at resolving real-world challenges in enterprise knowledge bases, such as prioritizing recent documents over outdated ones or favoring internal documentation over external sources.\n",
"\n",
"To learn more about our instruction-following reranker and see examples of it in action, visit our [product overview](https://contextual.ai/blog/introducing-instruction-following-reranker/).\n",
"\n",
"For comprehensive documentation on Contextual AI's products, please visit our [developer portal](https://docs.contextual.ai/).\n",
"\n",
"This integration requires the `contextual-client` Python SDK. Learn more about it [here](https://github.com/ContextualAI/contextual-client-python).\n",
"\n",
"## Overview\n",
"\n",
"This integration invokes Contextual AI's Grounded Language Model.\n",
"\n",
"### Integration details\n",
"\n",
"| Class | Package | Local | Serializable | JS support | Package downloads | Package latest |\n",
"| :--- | :--- | :---: | :---: | :---: | :---: | :---: |\n",
"| [ContextualRerank](https://python.langchain.com/api_reference/en/latest/chat_models/langchain_contextual.rerank.ContextualRerank.html) | [langchain-contextual](https://python.langchain.com/api_reference/en/latest/contextual_api_reference.html) | ❌ | beta | ❌ | ![PyPI - Downloads](https://img.shields.io/pypi/dm/langchain-contextual?style=flat-square&label=%20) | ![PyPI - Version](https://img.shields.io/pypi/v/langchain-contextual?style=flat-square&label=%20) |\n",
"\n",
"## Setup\n",
"\n",
"To access Contextual's reranker models you'll need to create a/an Contextual AI account, get an API key, and install the `langchain-contextual` integration package.\n",
"\n",
"### Credentials\n",
"\n",
"Head to [app.contextual.ai](https://app.contextual.ai) to sign up to Contextual and generate an API key. Once you've done this set the CONTEXTUAL_AI_API_KEY environment variable:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import getpass\n",
"import os\n",
"\n",
"if not os.getenv(\"CONTEXTUAL_AI_API_KEY\"):\n",
" os.environ[\"CONTEXTUAL_AI_API_KEY\"] = getpass.getpass(\n",
" \"Enter your Contextual API key: \"\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Installation\n",
"\n",
"The LangChain Contextual integration lives in the `langchain-contextual` package:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%pip install -qU langchain-contextual"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Instantiation\n",
"\n",
"The Contextual Reranker arguments are:\n",
"\n",
"| Parameter | Type | Description |\n",
"| --- | --- | --- |\n",
"| documents | list[Document] | A sequence of documents to rerank. Any metadata contained in the documents will also be used for reranking. |\n",
"| query | str | The query to use for reranking. |\n",
"| model | str | The version of the reranker to use. Currently, we just have \"ctxl-rerank-en-v1-instruct\". |\n",
"| top_n | Optional[int] | The number of results to return. If None returns all results. Defaults to self.top_n. |\n",
"| instruction | Optional[str] | The instruction to be used for the reranker. |\n",
"| callbacks | Optional[Callbacks] | Callbacks to run during the compression process. |"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from langchain_contextual import ContextualRerank\n",
"\n",
"api_key = \"\"\n",
"model = \"ctxl-rerank-en-v1-instruct\"\n",
"\n",
"compressor = ContextualRerank(\n",
" model=model,\n",
" api_key=api_key,\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Usage\n",
"\n",
"First, we will set up the global variables and examples we'll use, and instantiate our reranker client."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from langchain_core.documents import Document\n",
"\n",
"query = \"What is the current enterprise pricing for the RTX 5090 GPU for bulk orders?\"\n",
"instruction = \"Prioritize internal sales documents over market analysis reports. More recent documents should be weighted higher. Enterprise portal content supersedes distributor communications.\"\n",
"\n",
"document_contents = [\n",
" \"Following detailed cost analysis and market research, we have implemented the following changes: AI training clusters will see a 15% uplift in raw compute performance, enterprise support packages are being restructured, and bulk procurement programs (100+ units) for the RTX 5090 Enterprise series will operate on a $2,899 baseline.\",\n",
" \"Enterprise pricing for the RTX 5090 GPU bulk orders (100+ units) is currently set at $3,100-$3,300 per unit. This pricing for RTX 5090 enterprise bulk orders has been confirmed across all major distribution channels.\",\n",
" \"RTX 5090 Enterprise GPU requires 450W TDP and 20% cooling overhead.\",\n",
"]\n",
"\n",
"metadata = [\n",
" {\n",
" \"Date\": \"January 15, 2025\",\n",
" \"Source\": \"NVIDIA Enterprise Sales Portal\",\n",
" \"Classification\": \"Internal Use Only\",\n",
" },\n",
" {\"Date\": \"11/30/2023\", \"Source\": \"TechAnalytics Research Group\"},\n",
" {\n",
" \"Date\": \"January 25, 2025\",\n",
" \"Source\": \"NVIDIA Enterprise Sales Portal\",\n",
" \"Classification\": \"Internal Use Only\",\n",
" },\n",
"]\n",
"\n",
"documents = [\n",
" Document(page_content=content, metadata=metadata[i])\n",
" for i, content in enumerate(document_contents)\n",
"]\n",
"reranked_documents = compressor.compress_documents(\n",
" query=query,\n",
" instruction=instruction,\n",
" documents=documents,\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Use within a chain\n",
"\n",
"Examples coming soon."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## API reference\n",
"\n",
"For detailed documentation of all ChatContextual features and configurations head to the Github page: https://github.com/ContextualAI//langchain-contextual"
]
}
],
"metadata": {
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

View File

@ -0,0 +1,262 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "245a954a",
"metadata": {},
"source": [
"# Naver Search\n",
"\n",
"## Overview\n",
"\n",
"### Integration details\n",
"\n",
"| Class | Package | Serializable | JS support | Package latest |\n",
"| :--- | :--- | :---: | :---: | :---: |\n",
"| NaverSearchResults | [langchain-naver-community](https://pypi.org/project/langchain-naver-community/) | ❌ | ❌ | ![PyPI - Version](https://img.shields.io/pypi/v/langchain-naver-community?style=flat-square&label=%20) |\n",
"\n",
"### Tool features\n",
"\n",
"**Search** : The Naver Search Tool provides a simple interface to search Naver and get results.\n",
"\n",
"## Setup\n",
"### Setting Up API Credentials\n",
"To use Naver Search, you need to obtain API credentials. Follow these steps:\n",
"\n",
"Sign in to the [Naver Developers portal](https://developers.naver.com/main/).\n",
"Create a new application and enable the Search API.\n",
"Obtain your **NAVER_CLIENT_ID** and **NAVER_CLIENT_SECRET** from the \"Application List\" section.\n",
"\n",
"### Setting Up Environment Variables\n",
"After obtaining the credentials, set them as environment variables in your script:"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a2998f9c",
"metadata": {},
"outputs": [],
"source": [
"%pip install --upgrade --quiet langchain-naver-community"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "30692b20",
"metadata": {},
"outputs": [],
"source": [
"import getpass\n",
"import os\n",
"\n",
"if not os.environ.get(\"NAVER_CLIENT_ID\"):\n",
" os.environ[\"NAVER_CLIENT_ID\"] = getpass.getpass(\"Enter your Naver Client ID:\\n\")\n",
"\n",
"if not os.environ.get(\"NAVER_CLIENT_SECRET\"):\n",
" os.environ[\"NAVER_CLIENT_SECRET\"] = getpass.getpass(\n",
" \"Enter your Naver Client Secret:\\n\"\n",
" )"
]
},
{
"cell_type": "markdown",
"id": "c43917d5",
"metadata": {},
"source": [
"## Instantiation"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3d2be578",
"metadata": {},
"outputs": [],
"source": [
"from langchain_naver_community.utils import NaverSearchAPIWrapper\n",
"\n",
"search = NaverSearchAPIWrapper()"
]
},
{
"cell_type": "markdown",
"id": "c97b3f7a",
"metadata": {},
"source": [
"## Invocation"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "ac4910f8",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[{'title': 'Seoul shares rise for 4th day on tech gains; won at 2-week low',\n",
" 'link': 'https://n.news.naver.com/mnews/article/001/0015277717?sid=104',\n",
" 'description': 'stocks-summary Seoul shares rise for 4th day on tech gains; won at 2-week low SEOUL, March 20 (Yonhap) -- Seoul shares extended their winning streak to a fourth day Thursday on the back of gains... ',\n",
" 'pubDate': 'Thu, 20 Mar 2025 16:09:00 +0900'},\n",
" {'title': \"Seoul Mayor Oh's residence, office raided over alleged ties to shadowy po...\",\n",
" 'link': 'https://n.news.naver.com/mnews/article/640/0000067073?sid=100',\n",
" 'description': 'Prosecutors on Thursday raided Seoul Mayor Oh Se-hoons official residence and the City Hall... The raid came as part of the Seoul Central District Prosecutors Offices probe into... ',\n",
" 'pubDate': 'Thu, 20 Mar 2025 19:12:00 +0900'},\n",
" {'title': 'Education can heal divides: Seoul schools chief',\n",
" 'link': 'https://n.news.naver.com/mnews/article/044/0000267866?sid=104',\n",
" 'description': 'Jung Keun-sik, Superintendent of Seoul Metropolitan Office of Education speaks during an interview with The Korea Herald at his office on March 13. (Lim Se-jun/ The Korea Herald) Seoul education... ',\n",
" 'pubDate': 'Thu, 20 Mar 2025 14:35:00 +0900'}]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"search.results(\"Seoul\")[:3]"
]
},
{
"cell_type": "markdown",
"id": "2511982a",
"metadata": {},
"source": [
"## Tool Usage"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "e17126e7",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[{'title': \"2025 is here. Here's what to watch out for\",\n",
" 'link': 'https://n.news.naver.com/mnews/article/044/0000265707?sid=104',\n",
" 'description': 'The trend was predicted in &quot;Trend Korea 2025,&quot; written by Kim Ran-do, a professor of consumer science at Seoul National University, and his team. The annually published book also predicts that... ',\n",
" 'pubDate': 'Sat, 18 Jan 2025 16:01:00 +0900'},\n",
" {'title': '[INTERVIEW] Korea to overhaul weather prediction model against climate ch...',\n",
" 'link': 'https://www.koreatimes.co.kr/www/nation/2023/06/371_353628.html?utm_source=na',\n",
" 'description': 'western Seoul to protest its confusing weather predictions, false forecasting is hardly accepted compared to what Yoo saw in Oklahoma. The administrator hopes the Korean public would understand... ',\n",
" 'pubDate': 'Sun, 25 Jun 2023 17:22:00 +0900'}]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from langchain_naver_community.tool import NaverSearchResults\n",
"from langchain_naver_community.utils import NaverSearchAPIWrapper\n",
"\n",
"search = NaverSearchAPIWrapper()\n",
"\n",
"tool = NaverSearchResults(api_wrapper=search)\n",
"\n",
"tool.invoke(\"what is the weather in seoul?\")[3:5]"
]
},
{
"cell_type": "markdown",
"id": "74295cb5",
"metadata": {},
"source": [
"## Use within an agent\n",
"\n",
"The Naver Search tool can be integrated into LangChain agents for more complex tasks. Below we demonstrate how to set up an agent that can search Naver for current information.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "386e19b0",
"metadata": {},
"outputs": [],
"source": [
"from langchain_openai import ChatOpenAI\n",
"\n",
"llm = ChatOpenAI(model=\"gpt-4o-mini\")\n",
"\n",
"system_prompt = \"\"\"\n",
"You are a helpful assistant that can search the web for information.\n",
"\"\"\""
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "70da8682",
"metadata": {},
"outputs": [],
"source": [
"from langchain_naver_community.tool import NaverNewsSearch\n",
"from langgraph.prebuilt import create_react_agent\n",
"\n",
"tools = [NaverNewsSearch()]\n",
"\n",
"agent_executor = create_react_agent(\n",
" llm,\n",
" tools,\n",
" prompt=system_prompt,\n",
")"
]
},
{
"cell_type": "markdown",
"id": "4b73dbaf",
"metadata": {},
"source": [
"Now we can run the agent with a query."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "726e575a",
"metadata": {},
"outputs": [],
"source": [
"query = \"What is the weather in Seoul?\"\n",
"result = agent_executor.invoke({\"messages\": [(\"human\", query)]})\n",
"result[\"messages\"][-1].content"
]
},
{
"cell_type": "markdown",
"id": "d566a4c0",
"metadata": {},
"source": [
"## API reference\n",
"\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

View File

@ -28,21 +28,21 @@ export default function VectorStoreTabs(props) {
{
value: "Chroma",
label: "Chroma",
text: `from langchain_chroma import Chroma\n${useFakeEmbeddings ? fakeEmbeddingsString : ""}\n${vectorStoreVarName} = Chroma(embedding_function=embeddings)`,
text: `from langchain_chroma import Chroma\n${useFakeEmbeddings ? fakeEmbeddingsString : ""}\n${vectorStoreVarName} = Chroma(\n collection_name="example_collection",\n embedding_function=embeddings,\n persist_directory="./chroma_langchain_db", # Where to save data locally, remove if not necessary\n)`,
packageName: "langchain-chroma",
default: false,
},
{
value: "FAISS",
label: "FAISS",
text: `from langchain_community.vectorstores import FAISS\n${useFakeEmbeddings ? fakeEmbeddingsString : ""}\n${vectorStoreVarName} = FAISS(embedding_function=embeddings)`,
text: `import faiss\nfrom langchain_community.docstore.in_memory import InMemoryDocstore\nfrom langchain_community.vectorstores import FAISS\n\nembedding_dim = len(embeddings.embed_query("hello world"))\nindex = faiss.IndexFlatL2(embedding_dim)\n${useFakeEmbeddings ? fakeEmbeddingsString : ""}\n${vectorStoreVarName} = FAISS(\n embedding_function=embeddings,\n index=index,\n docstore=InMemoryDocstore(),\n index_to_docstore_id={},\n)`,
packageName: "langchain-community",
default: false,
},
{
value: "Milvus",
label: "Milvus",
text: `from langchain_milvus import Milvus\n${useFakeEmbeddings ? fakeEmbeddingsString : ""}\n${vectorStoreVarName} = Milvus(embedding_function=embeddings)`,
text: `from langchain_milvus import Milvus\n\nURI = "./milvus_example.db"\n${useFakeEmbeddings ? fakeEmbeddingsString : ""}\n${vectorStoreVarName} = Milvus(\n embedding_function=embeddings,\n connection_args={"uri": URI},\n index_params={"index_type": "FLAT", "metric_type": "L2"},\n)`,
packageName: "langchain-milvus",
default: false,
},

View File

@ -29,7 +29,7 @@ langchain = "langchain_cli.cli:app"
langchain-cli = "langchain_cli.cli:app"
[dependency-groups]
dev = ["pytest<8.0.0,>=7.4.2", "pytest-watch<5.0.0,>=4.2.0"]
dev = ["pytest<8.0.0,>=7.4.2", "pytest-watcher<1.0.0,>=0.3.4"]
lint = ["ruff<1.0,>=0.5", "mypy<2.0.0,>=1.13.0"]
test = ["langchain-core", "langchain"]
typing = ["langchain"]

View File

@ -212,12 +212,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
]
[[package]]
name = "docopt"
version = "0.6.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491", size = 25901 }
[[package]]
name = "exceptiongroup"
version = "1.2.2"
@ -413,7 +407,7 @@ wheels = [
[[package]]
name = "langchain"
version = "0.3.20"
version = "0.3.21"
source = { editable = "../langchain" }
dependencies = [
{ name = "async-timeout", marker = "python_full_version < '3.11'" },
@ -431,6 +425,7 @@ requires-dist = [
{ name = "async-timeout", marker = "python_full_version < '3.11'", specifier = ">=4.0.0,<5.0.0" },
{ name = "langchain-anthropic", marker = "extra == 'anthropic'" },
{ name = "langchain-aws", marker = "extra == 'aws'" },
{ name = "langchain-azure-ai", marker = "extra == 'azure-ai'" },
{ name = "langchain-cohere", marker = "extra == 'cohere'" },
{ name = "langchain-community", marker = "extra == 'community'" },
{ name = "langchain-core", editable = "../core" },
@ -520,7 +515,7 @@ typing = [
[[package]]
name = "langchain-cli"
version = "0.0.35"
version = "0.0.36"
source = { editable = "." }
dependencies = [
{ name = "gitpython" },
@ -534,7 +529,7 @@ dependencies = [
[package.dev-dependencies]
dev = [
{ name = "pytest" },
{ name = "pytest-watch" },
{ name = "pytest-watcher" },
]
lint = [
{ name = "mypy" },
@ -561,7 +556,7 @@ requires-dist = [
[package.metadata.requires-dev]
dev = [
{ name = "pytest", specifier = ">=7.4.2,<8.0.0" },
{ name = "pytest-watch", specifier = ">=4.2.0,<5.0.0" },
{ name = "pytest-watcher", specifier = ">=0.3.4,<1.0.0" },
]
lint = [
{ name = "mypy", specifier = ">=1.13.0,<2.0.0" },
@ -576,7 +571,7 @@ typing = [{ name = "langchain", editable = "../langchain" }]
[[package]]
name = "langchain-core"
version = "0.3.41"
version = "0.3.48"
source = { editable = "../core" }
dependencies = [
{ name = "jsonpatch" },
@ -634,7 +629,7 @@ typing = [
[[package]]
name = "langchain-text-splitters"
version = "0.3.6"
version = "0.3.7"
source = { editable = "../text-splitters" }
dependencies = [
{ name = "langchain-core" },
@ -1026,16 +1021,17 @@ wheels = [
]
[[package]]
name = "pytest-watch"
version = "4.2.0"
name = "pytest-watcher"
version = "0.4.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama" },
{ name = "docopt" },
{ name = "pytest" },
{ name = "tomli", marker = "python_full_version < '3.11'" },
{ name = "watchdog" },
]
sdist = { url = "https://files.pythonhosted.org/packages/36/47/ab65fc1d682befc318c439940f81a0de1026048479f732e84fe714cd69c0/pytest-watch-4.2.0.tar.gz", hash = "sha256:06136f03d5b361718b8d0d234042f7b2f203910d8568f63df2f866b547b3d4b9", size = 16340 }
sdist = { url = "https://files.pythonhosted.org/packages/72/72/a2a1e81f1b272ddd9a1848af4959c87c39aa95c0bbfb3007cacb86c47fa9/pytest_watcher-0.4.3.tar.gz", hash = "sha256:0cb0e4661648c8c0ff2b2d25efa5a8e421784b9e4c60fcecbf9b7c30b2d731b3", size = 10386 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/5b/3a/c44a76c6bb5e9e896d9707fb1c704a31a0136950dec9514373ced0684d56/pytest_watcher-0.4.3-py3-none-any.whl", hash = "sha256:d59b1e1396f33a65ea4949b713d6884637755d641646960056a90b267c3460f9", size = 11852 },
]
[[package]]
name = "pyyaml"

View File

@ -73,7 +73,6 @@ pyjwt>=2.8.0,<3
pymupdf>=1.22.3,<2
pypdf>=3.4.0,<5
pypdfium2>=4.10.0,<5
pyspark>=3.4.0,<4
rank-bm25>=0.2.2,<0.3
rapidfuzz>=3.1.1,<4
rapidocr-onnxruntime>=1.3.2,<2

View File

@ -103,7 +103,7 @@ class CassandraChatMessageHistory(BaseChatMessageHistory):
Args:
message: A message to write.
"""
this_row_id = uuid.uuid1()
this_row_id = uuid.uuid4()
self.table.put(
partition_id=self.session_id,
row_id=this_row_id,
@ -113,7 +113,7 @@ class CassandraChatMessageHistory(BaseChatMessageHistory):
async def aadd_messages(self, messages: Sequence[BaseMessage]) -> None:
for message in messages:
this_row_id = uuid.uuid1()
this_row_id = uuid.uuid4()
await self.table.aput(
partition_id=self.session_id,
row_id=this_row_id,

View File

@ -134,6 +134,8 @@ def _convert_delta_to_message_chunk(
content = _dict.get("content") or ""
if _dict.get("function_call"):
additional_kwargs = {"function_call": dict(_dict["function_call"])}
elif _dict.get("reasoning_content"):
additional_kwargs = {"reasoning_content": _dict["reasoning_content"]}
else:
additional_kwargs = {}

View File

@ -74,21 +74,92 @@ def _create_usage_metadata(token_usage: dict) -> UsageMetadata:
class ChatPerplexity(BaseChatModel):
"""`Perplexity AI` Chat models API.
Setup:
To use, you should have the ``openai`` python package installed, and the
environment variable ``PPLX_API_KEY`` set to your API key.
Any parameters that are valid to be passed to the openai.create call can be passed
in, even if not explicitly saved on this class.
Any parameters that are valid to be passed to the openai.create call
can be passed in, even if not explicitly saved on this class.
Example:
.. code-block:: bash
pip install openai
export PPLX_API_KEY=your_api_key
Key init args - completion params:
model: str
Name of the model to use. e.g. "llama-3.1-sonar-small-128k-online"
temperature: float
Sampling temperature to use. Default is 0.7
max_tokens: Optional[int]
Maximum number of tokens to generate.
streaming: bool
Whether to stream the results or not.
Key init args - client params:
pplx_api_key: Optional[str]
API key for PerplexityChat API. Default is None.
request_timeout: Optional[Union[float, Tuple[float, float]]]
Timeout for requests to PerplexityChat completion API. Default is None.
max_retries: int
Maximum number of retries to make when generating.
See full list of supported init args and their descriptions in the params section.
Instantiate:
.. code-block:: python
from langchain_community.chat_models import ChatPerplexity
chat = ChatPerplexity(
llm = ChatPerplexity(
model="llama-3.1-sonar-small-128k-online",
temperature=0.7,
)
"""
Invoke:
.. code-block:: python
messages = [
("system", "You are a chatbot."),
("user", "Hello!")
]
llm.invoke(messages)
Invoke with structured output:
.. code-block:: python
from pydantic import BaseModel
class StructuredOutput(BaseModel):
role: str
content: str
llm.with_structured_output(StructuredOutput)
llm.invoke(messages)
Invoke with perplexity-specific params:
.. code-block:: python
llm.invoke(messages, extra_body={"search_recency_filter": "week"})
Stream:
.. code-block:: python
for chunk in llm.stream(messages):
print(chunk.content)
Token usage:
.. code-block:: python
response = llm.invoke(messages)
response.usage_metadata
Response metadata:
.. code-block:: python
response = llm.invoke(messages)
response.response_metadata
""" # noqa: E501
client: Any = None #: :meta private:
model: str = "llama-3.1-sonar-small-128k-online"

View File

@ -1508,6 +1508,11 @@ class AmazonTextractPDFParser(BaseBlobParser):
This helps most LLMs to achieve better accuracy when
processing these texts.
``Document`` objects are returned with metadata that includes the ``source`` and
a 1-based index of the page number in ``page``. Note that ``page`` represents
the index of the result returned from Textract, not necessarily the as-written
page number in the document.
"""
def __init__(

Some files were not shown because too many files have changed in this diff Show More