<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Eli Ostreicher</title>
    <description>The latest articles on DEV Community by Eli Ostreicher (@pythonperfection).</description>
    <link>https://dev.to/pythonperfection</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F805953%2Fbf224dd5-efa5-4327-9eaa-0bf0e696c8ee.jpeg</url>
      <title>DEV Community: Eli Ostreicher</title>
      <link>https://dev.to/pythonperfection</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pythonperfection"/>
    <language>en</language>
    <item>
      <title>Tune VS Code like a BOSS</title>
      <dc:creator>Eli Ostreicher</dc:creator>
      <pubDate>Sat, 12 Mar 2022 10:11:53 +0000</pubDate>
      <link>https://dev.to/pythonperfection/tune-vs-code-like-a-boss-4lg4</link>
      <guid>https://dev.to/pythonperfection/tune-vs-code-like-a-boss-4lg4</guid>
      <description>&lt;h3&gt;
  
  
  14 Kick-Ass Extensions You Don’t Wanna Miss!
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5GaUz2AV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r7r7l5ux7tmeez7sgrk5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5GaUz2AV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r7r7l5ux7tmeez7sgrk5.png" alt="Python for Ukraine" width="880" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They say that with Visual Studio Code, Microsoft redeemed themselves amongst the developer community.&lt;/p&gt;

&lt;p&gt;Many old time programmers carried a grudge against the Redmond tech giant given their outspoken anti open source stance.&lt;br&gt;&lt;br&gt;
Former Microsoft CEO Steve Ballmer even infamously called the open source operating system Linux “&lt;a href="https://www.linux.com/news/microsofts-ballmer-linux-cancer/"&gt;a cancer&lt;/a&gt;.”&lt;/p&gt;

&lt;p&gt;Today, &lt;a href="https://www.zdnet.com/article/visual-studio-code-how-microsofts-any-os-any-programming-language-any-software-plan-is-paying-off/"&gt;14 million&lt;/a&gt; developers call VS Code ‘home’. Given that the number of devs worldwide - according to Statista - is around 24 million, thats an insane number!&lt;/p&gt;

&lt;p&gt;While VS Code is 100% free, it is also a totally brilliant marketing strategy into Microsoft’s &lt;a href="https://azure.microsoft.com/"&gt;Azure&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As an ex Google Cloud and AWS user, I'd say it's highly doubtful whether without VS Code, Azure would have gotten to be part of ‘the big 3’. Now however, with GitHub and VS Code combined, they pretty much own us all.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---po8m0YO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2AIIlfPsOkwsuH9oQL.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---po8m0YO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2AIIlfPsOkwsuH9oQL.jpg" width="728" height="400"&gt;&lt;/a&gt;&lt;/p&gt;
Microsoft invests more than $10 Billion In data centers annually and is on pace to build between &lt;a href="https://www.zdnet.com/article/microsoft-were-on-pace-to-build-50-to-100-new-datacenters-each-year"&gt;50 and 100 new data centers each year&lt;/a&gt; for the foreseeable future.


  

&lt;p&gt;&lt;br&gt;Enough with the politics. Let’s dive into the juicy parts. The following VS Code extensions are a ‘must’:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bear in mind, given how lightweight VS Code is, there is really never a worry about having ‘too many’ extensions. So just knock yourself out!&lt;br&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://marketplace.visualstudio.com/items?itemName=sourcery.sourcery"&gt;Sourcery&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Sourcery runs in the background and suggests real-time refactoring improvements. It's actually really fun seeing Sourcery in action #solid&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w_ZaYlpy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1200/0%2A_kLzO5AHohuJLZfj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w_ZaYlpy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1200/0%2A_kLzO5AHohuJLZfj.gif" width="600" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;a href="https://marketplace.visualstudio.com/items?itemName=sourcery.sourcery"&gt;&lt;b&gt;Sourcery&lt;/b&gt;&lt;/a&gt; Real time Python refactoring







&lt;h3&gt;
  
  
  &lt;a href="https://marketplace.visualstudio.com/items?itemName=alefragnani.Bookmarks"&gt;Bookmarks&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Bookmarks helps you to navigate your code, and moves between important positions easily and quickly. It also supports a set of selection commands, which allows you to easily select bookmarked lines and regions.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pXBQPUtU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1400/0%2A1S1Ujd-X57LMSunu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pXBQPUtU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1400/0%2A1S1Ujd-X57LMSunu.gif" width="880" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;a href="https://marketplace.visualstudio.com/items?itemName=alefragnani.Bookmarks"&gt;&lt;b&gt;Bookmarks:&lt;/b&gt;&lt;/a&gt; Mark and Jump





&lt;h3&gt;
  
  
  &lt;a href="https://marketplace.visualstudio.com/items?itemName=rangav.vscode-thunder-client"&gt;Thunder Client&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Thunder Client is a lightweight Rest API Client with a simple and clean design; you’ll never need Postman again. Super fast too!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AEOquZOx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AUH2bmeq7kd_D8cXri5b5jg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AEOquZOx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AUH2bmeq7kd_D8cXri5b5jg.png" width="880" height="483"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=rangav.vscode-thunder-client"&gt;&lt;b&gt;Thunder Client:&lt;/b&gt;&lt;/a&gt; an API client done right







&lt;h3&gt;
  
  
  &lt;a href="https://marketplace.visualstudio.com/items?itemName=bierner.docs-view"&gt;Docs View&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Automatically displays documentation for the function at the cursor position.&lt;/li&gt;
&lt;li&gt;  The “Documentation” view shows in the panel by default, move it any panel by just dragging.&lt;/li&gt;
&lt;li&gt;  Supports syntax highlighting and markdown rendering in the docs view.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For imported functions that have lots of args, this is a lifesaver.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---m140qWA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A1WAco6pZgJPRKKYoE-ptLg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---m140qWA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A1WAco6pZgJPRKKYoE-ptLg.png" width="880" height="568"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=bierner.docs-view"&gt;&lt;b&gt;Docs View:&lt;/b&gt;&lt;/a&gt; Display documentation in the sidebar







&lt;h3&gt;
  
  
  &lt;a href="https://marketplace.visualstudio.com/items?itemName=sourcegraph.sourcegraph"&gt;Sourcegraph&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Sourcegraph allows you to search millions of open source repositories right from VS Code. Super fast too!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BDZR3Yor--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1400/0%2A3-T1lc9GItcAE0kn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BDZR3Yor--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1400/0%2A3-T1lc9GItcAE0kn.gif" width="880" height="555"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=bierner.docs-view"&gt;&lt;b&gt;Sourcegraph:&lt;/b&gt;&lt;/a&gt; Search millions of repositories







&lt;h3&gt;
  
  
  &lt;a href="https://marketplace.visualstudio.com/items?itemName=mintlify.document"&gt;AI Doc Writer&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Writing documentation is no fun, this AI takes care of it. Just highlight the code and hit ⌘ + . The makers of this one are actually on top of their game and constantly keep perfecting. Kudos!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ifD9JPrF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1400/0%2AjxlxlOOTxqlEBjvw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ifD9JPrF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1400/0%2AjxlxlOOTxqlEBjvw.gif" width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=mintlify.document"&gt;&lt;b&gt;Mintlify:&lt;/b&gt;&lt;/a&gt; AI Doc Writer







&lt;h3&gt;
  
  
  &lt;a href="https://marketplace.visualstudio.com/items?itemName=zh9528.file-size"&gt;file-size&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Shows the current file size in the status bar. I know this sounds 'basic' but it really is super helpful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ktiblNdy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2Aj_YrSlSWO8tmwLvBrth7Tg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ktiblNdy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2Aj_YrSlSWO8tmwLvBrth7Tg.png" width="726" height="78"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;a href="https://marketplace.visualstudio.com/items?itemName=zh9528.file-size"&gt;&lt;b&gt;file-size:&lt;/b&gt;&lt;/a&gt; a simple/great extension







&lt;h3&gt;
  
  
  &lt;a href="https://marketplace.visualstudio.com/items?itemName=krinql.krinql-vscode"&gt;Krinql&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Based on OpenAI’s powerful GPT-3, Krinql explains the highlighted code in plain English, plus some other Codex features.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YHHqS3eZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2ALHeWnXqXKqGURGk_" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YHHqS3eZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2ALHeWnXqXKqGURGk_" width="880" height="166"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=krinql.krinql-vscode"&gt;&lt;b&gt;Krinql:&lt;/b&gt;&lt;/a&gt; Code explainer







&lt;h3&gt;
  
  
  &lt;a href="https://marketplace.visualstudio.com/items?itemName=vsls-contrib.gistfs"&gt;GistPad&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bonus:&lt;/strong&gt; Comes with a really useful scratchpad (for note taking etc.) One of my favs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m9wTR3Ow--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b3ioyp1yjywj22uoo6hu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m9wTR3Ow--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b3ioyp1yjywj22uoo6hu.png" width="880" height="536"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=vsls-contrib.gistfs"&gt;&lt;b&gt;GistPad:&lt;/b&gt;&lt;/a&gt; Browse &amp;amp; edit Gists without leaving VS Code







&lt;h3&gt;
  
  
  &lt;a href="https://marketplace.visualstudio.com/items?itemName=adpyke.codesnap"&gt;CodeSnap&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Just right click a code selection and click &lt;code&gt;CodeSnap&lt;/code&gt;, basically a built-in 'Carbon'.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VdsFt4uU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2Al1jMqHcTS3_NNY1z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VdsFt4uU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2Al1jMqHcTS3_NNY1z.png" width="880" height="423"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=adpyke.codesnap"&gt;&lt;b&gt;CodeSnap:&lt;/b&gt;&lt;/a&gt; 📷 Take beautiful screenshots of your code.







&lt;h3&gt;
  
  
  &lt;a href="https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode-completions"&gt;IntelliCode Completions&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;From our friends at Microsoft, this experimental extension predicts up to a whole line of code based on your current context. Predictions appear as grey-text to the right of your cursor.&lt;br&gt;&lt;br&gt;
I’ve head a really great experience using it so far (couple months now)! Mostly I love how conservative it is vs making silly guesses. If it doesn't know, it says nothing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DgKb_-ZE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1400/0%2A8nYnG8xBRhW8dNZh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DgKb_-ZE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1400/0%2A8nYnG8xBRhW8dNZh.gif" width="880" height="289"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode-completions"&gt;&lt;b&gt;IntelliCode Completions:&lt;/b&gt;&lt;/a&gt; AI-driven code auto-completion







&lt;h3&gt;
  
  
  &lt;a href="https://marketplace.visualstudio.com/items?itemName=almenon.arepl"&gt;AREPL&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wDZt301U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1400/0%2Aac6y8D7fSoXH5eWW.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wDZt301U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1400/0%2Aac6y8D7fSoXH5eWW.gif" width="880" height="384"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=almenon.arepl"&gt;&lt;b&gt;AREPL:&lt;/b&gt;&lt;/a&gt; automatically evaluates python code in real-time as you type




&lt;p&gt;&lt;br&gt;Similar to AREPL, &lt;a href="https://marketplace.visualstudio.com/items?itemName=traBpUkciP.wolf"&gt;Wolf&lt;/a&gt; uncovers variables and objects inline:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U3XcTpus--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2AQo_MY2t8lhGcGZrS.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U3XcTpus--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2AQo_MY2t8lhGcGZrS.png" width="880" height="676"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=traBpUkciP.wolf"&gt;&lt;b&gt;Wolf:&lt;/b&gt;&lt;/a&gt; outputs variables inline




&lt;p&gt;&lt;br&gt;While the above are both too cluttering for everyday, they do have their perfect use cases (i.e. a complex code block etc.).  &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-python.gather"&gt;Gather&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Again from the awesome peeps at Microsoft, when called from within a notebook cell, Gather magically figures out its dependencies. A game changer for Dataframers &amp;amp; Plotters.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FXuQ4Xqb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hqubmnu4zwcpzs72c0w4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FXuQ4Xqb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hqubmnu4zwcpzs72c0w4.png" alt="Pandas baby!" width="728" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oeNgXFod--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1242/0%2A2vZOgoo4z1pX_LnV.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oeNgXFod--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1242/0%2A2vZOgoo4z1pX_LnV.PNG" width="621" height="323"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-python.gather"&gt;&lt;b&gt;Gather:&lt;/b&gt;&lt;/a&gt; Jupyter notebook dependencies







&lt;blockquote&gt;
&lt;p&gt;Make sure to hit that unicorn please if you enjoyed this post 🦄&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>productivity</category>
      <category>python</category>
      <category>vscode</category>
    </item>
    <item>
      <title>Hello Codex: an OpenAI Telegram Bot</title>
      <dc:creator>Eli Ostreicher</dc:creator>
      <pubDate>Sun, 06 Mar 2022 18:49:37 +0000</pubDate>
      <link>https://dev.to/pythonperfection/hello-codex-an-openai-telegram-bot-55d4</link>
      <guid>https://dev.to/pythonperfection/hello-codex-an-openai-telegram-bot-55d4</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1tild3v0ys7jbr4lokas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1tild3v0ys7jbr4lokas.png" alt="Python for Ukraine"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tired of waiting for a Github Copilot invite, I decided to take matters into my own hands 🙈&lt;/p&gt;

&lt;p&gt;OpenAI’s Codex is a a GPT-3 powerhouse that converts plain english into runnable code. It can also do many other tasks related to Code, like translate code from one language to another, generate docstrings and explain already written code in plain english.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftechcrunch.com%2Fwp-content%2Fuploads%2F2021%2F08%2Fopenai-plot.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftechcrunch.com%2Fwp-content%2Fuploads%2F2021%2F08%2Fopenai-plot.gif" alt="Codex"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are the steps to creating your very own personal Codex Telegram bot.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prerequisite:&lt;/strong&gt; For Codex API access you need to get an invite from OpenAI. This is free and I got approved after around one week. Join the waitlist &lt;a href="https://openai.com/blog/openai-codex/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you haven’t already done so, &lt;a href="https://telegram.org/" rel="noopener noreferrer"&gt;download&lt;/a&gt; Telegram, they also offer a great desktop app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request a Bot&lt;/strong&gt;&lt;br&gt;
For this, you talk to &lt;a href="https://t.me/botfather" rel="noopener noreferrer"&gt;BotFather&lt;/a&gt;. He is your go-to for all things bot, from creation to settings etc.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0v4geey4cj0xenws7ech.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0v4geey4cj0xenws7ech.png" alt="Botfather"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Type &lt;code&gt;/newbot&lt;/code&gt; to begin.&lt;/p&gt;

&lt;p&gt;The BotFather will ask you to pick a bot name (which must be universally unique) and a username, it then generates an authentication token for your new bot.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;strong&gt;Codex Key&lt;/strong&gt;&lt;br&gt;
Next, go ahead and &lt;a href="https://beta.openai.com/account/api-keys" rel="noopener noreferrer"&gt;grab your API key&lt;/a&gt; from OpenAI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0gkrz3ak8ygbqeyaxcl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0gkrz3ak8ygbqeyaxcl.png" alt="Codex API key"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Take note of the 2 keys you just got, we’re going to need them soon.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Dealing with secrets across environments can be a hassle. The folks at &lt;a href="https://www.doppler.com/" rel="noopener noreferrer"&gt;Doppler&lt;/a&gt; offer a great (and free) product to handle it all.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br&gt;&lt;strong&gt;Python Code&lt;/strong&gt;&lt;br&gt;
Fire up your favorite editor (&lt;a href="https://code.visualstudio.com/download" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt; in my case) and lets have some fun!&lt;/p&gt;

&lt;p&gt;&lt;br&gt;To start, we pip install the following two libraries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;openai
pip &lt;span class="nb"&gt;install &lt;/span&gt;pyTelegramBotAPI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Begin like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;environ&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt; &lt;span class="c1"&gt;# if you dont have dotenv yet: pip install python-dotenv
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;telebot&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;

&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;telebot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;
&lt;span class="n"&gt;telebot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;telebot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TeleBot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BOT_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enabling logging is always a great idea when working with API’s. Eventually we’ll want to host this somewhere and so the more we log, the less in the dark we are.&lt;/p&gt;

&lt;p&gt;Notice how I’m importing environ from os. Using &lt;code&gt;env[‘BOT_API_KEY’]&lt;/code&gt; is just prettier/neater than os.environ 🤷‍♂️&lt;/p&gt;

&lt;p&gt;Now, let’s establish the communiqué between our shiny new bot and Codex.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@bot.message_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_codex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Completion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;code-davinci-001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'"""&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;{}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"""'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;top_p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;frequency_penalty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;presence_penalty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'"""'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;```python&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;choices&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;```&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;parse_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Markdown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;infinity_polling&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Above, we first establish the bot’s decorator to pass on our message to the function below it.&lt;/p&gt;

&lt;p&gt;We set &lt;code&gt;max_tokens&lt;/code&gt; to &lt;code&gt;1200&lt;/code&gt; this is because while Codex allows for a max of 4,096 tokens (including your prompt) per call, Telegram bots are capped at 4,096 UTF-8 characters per message. One token is equivalent to roughly 4 characters.&lt;/p&gt;

&lt;p&gt;Learn more about the various &lt;code&gt;openai.Completion.create&lt;/code&gt; parameters &lt;a href="https://beta.openai.com/docs/api-reference/completions/create" rel="noopener noreferrer"&gt;here&lt;/a&gt;, their docs are awesome.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;bot.send_message&lt;/code&gt; we take advantage of the fact that Telegram offers great Markdown support so the code displays nicely and also allows for tap-to-copy.&lt;/p&gt;

&lt;p&gt;Finally, &lt;code&gt;bot.infinity_polling()&lt;/code&gt; keeps a constant open ear for incoming messages.&lt;br&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There are lots of other cool things a Telegram bot can do and pyTelegramBotAPI &lt;a href="https://github.com/eternnoir/pyTelegramBotAPI" rel="noopener noreferrer"&gt;breaks it all down&lt;/a&gt; in much detail.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br&gt;Before running the script, create a .env file in your current directory like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BOT_API_KEY = bot-key-here
OPENAI_API_KEY = openai-key-here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is what your full script should look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;environ&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt; &lt;span class="c1"&gt;# if you dont have dotenv yet: pip install python-dotenv
&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;telebot&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;


    &lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;telebot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;
    &lt;span class="n"&gt;telebot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;telebot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TeleBot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BOT_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="nd"&gt;@bot.message_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_codex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Completion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;code-davinci-001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'"""&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;{}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"""'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;top_p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;frequency_penalty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;presence_penalty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'"""'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;```python&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;choices&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;```&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;parse_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Markdown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;infinity_polling&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Congrats! You now have your very own Codex always at your fingertips.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For your bot to be always accessible you’ll want to host it in the cloud. Whether AWS or Heroku, go with your favorite; bear in mind though that &lt;code&gt;bot.infinity_polling()&lt;/code&gt; will need a server setup (i.e. Flask) to run correctly.&lt;br&gt;
&lt;br&gt;To avoid constant compute minutes we can set a webhook instead of polling. In the next article I’ll show you how I did this as an Azure Function app.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>python</category>
      <category>bot</category>
      <category>azure</category>
    </item>
  </channel>
</rss>
