<?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: Samrat Dutta</title>
    <description>The latest articles on DEV Community by Samrat Dutta (@samratduttaofficial).</description>
    <link>https://dev.to/samratduttaofficial</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4160410%2Face6907c-23a9-4406-9d3a-1dea81fca8e2.jpg</url>
      <title>DEV Community: Samrat Dutta</title>
      <link>https://dev.to/samratduttaofficial</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/samratduttaofficial"/>
    <language>en</language>
    <item>
      <title>Rewrite: a free AI rewriter, paraphrasing tool and document editor for Windows, macOS and Linux</title>
      <dc:creator>Samrat Dutta</dc:creator>
      <pubDate>Mon, 26 Oct 2026 10:11:04 +0000</pubDate>
      <link>https://dev.to/samratduttaofficial/i-built-a-free-editor-that-rewrites-text-and-edits-word-latex-and-pdf-3dpb</link>
      <guid>https://dev.to/samratduttaofficial/i-built-a-free-editor-that-rewrites-text-and-edits-word-latex-and-pdf-3dpb</guid>
      <description>&lt;p&gt;I write research papers in LaTeX and reports in Word. For years my routine was the same: draft a paragraph, paste&lt;br&gt;
it into a web paraphraser, hit the word limit, paste half of it again, copy the result back, then fix the LaTeX&lt;br&gt;
commands the tool had mangled. I built Rewrite so that all of that happens inside one desktop app that also opens the&lt;br&gt;
files I actually work in.&lt;/p&gt;

&lt;p&gt;Rewrite is free. There is no account and no word limit. This post walks through everything it does.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8x1fhr8dj88p0hkhkxpf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8x1fhr8dj88p0hkhkxpf.png" alt="Rewrite with word alternatives open" width="799" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  An AI rewriter that makes drafts read as human
&lt;/h2&gt;

&lt;p&gt;If you start from an AI draft, the text has a recognisable sound: the same openers, the same padded phrases, the&lt;br&gt;
same sentence shapes. Rewrite's Auto-rewrite goes through a selection or the whole document and changes that.&lt;/p&gt;

&lt;p&gt;You choose how far it goes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Light&lt;/strong&gt; rewords wordy phrases and swaps a few words, about 15% of them. The meaning stays where it was.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium&lt;/strong&gt; also replaces about 30% of the eligible words with synonyms that fit the context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strong&lt;/strong&gt; changes up to half of the eligible words and rephrases whole sentences.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also pick the kinds of change: rewording wordy phrases, swapping words, and rephrasing whole sentences. Then&lt;br&gt;
Rewrite shows every change one at a time. Accept it, reject it, or pick a different alternative before you move on.&lt;br&gt;
Nothing is applied behind your back.&lt;/p&gt;

&lt;p&gt;In my own tests, text that went through Auto-rewrite passed AI detectors and plagiarism checkers. Test it on your&lt;br&gt;
own writing; detectors change often.&lt;/p&gt;

&lt;p&gt;One honest note, which is also in the app: rewording someone else's text does not make it your own work. Cite your&lt;br&gt;
sources.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4t1m7c0m1reqjlpf5msu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4t1m7c0m1reqjlpf5msu.png" alt="Reviewing an auto-rewrite, one change at a time" width="799" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A paraphrasing tool you can steer word by word
&lt;/h2&gt;

&lt;p&gt;Auto-rewrite is the fast path. Most of the time I work more slowly, one spot at a time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Click a word&lt;/strong&gt; and the side panel lists alternatives, ranked by how well each one fits that exact sentence. Each&lt;br&gt;
has a fit bar and a tag that says whether it is a synonym, a related word or a word that fits the context. Many come&lt;br&gt;
with a short definition, so you can tell "rapid" from "hurried" without leaving the page. Alt+1 to Alt+9 applies the&lt;br&gt;
first nine without touching the mouse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Select a phrase&lt;/strong&gt; to reword it as a unit. Rewrite also highlights wordy phrases on its own. "Due to the fact that"&lt;br&gt;
gets a peach highlight, and clicking it offers "because" (keeps 97% of the meaning) or "as".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Press Ctrl+E&lt;/strong&gt; for new versions of the whole sentence under the cursor. Every version shows two numbers: how much&lt;br&gt;
of the meaning it keeps and how much of the wording it changed. A rewrite that keeps 98% of the meaning while&lt;br&gt;
changing 60% of the words is usually the one you want; one that keeps 85% deserves a second look.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpz94qcza8wtjaiebvwx3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpz94qcza8wtjaiebvwx3.png" alt="New versions of a sentence, each with a meaning score" width="799" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Spelling and grammar
&lt;/h2&gt;

&lt;p&gt;Spelling slips get a red underline and grammar slips a blue one. Click either for the fix. It works in every file&lt;br&gt;
type Rewrite opens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Word documents, without Word
&lt;/h2&gt;

&lt;p&gt;Rewrite opens and saves .docx, .doc, .odt, .fodt and .rtf with their formatting intact: styles, lists, pictures,&lt;br&gt;
tables, charts, formulas, footnotes and links. A formatting toolbar handles the everyday edits, with Ctrl+B, Ctrl+I,&lt;br&gt;
Ctrl+U and Ctrl+K for a link. Ctrl+P shows the document as it will print.&lt;/p&gt;

&lt;p&gt;So you can open a report someone emailed you, rewrite three paragraphs, fix the grammar and send it back as .docx,&lt;br&gt;
and the other person sees their own styles and tables.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8zknffnzdfm7g7qdksz5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8zknffnzdfm7g7qdksz5.png" alt="A Word document open in Rewrite" width="799" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  LaTeX, with the PDF beside it
&lt;/h2&gt;

&lt;p&gt;Open a .tex file and Rewrite shows the typeset PDF next to the source, built with your own LaTeX installation&lt;br&gt;
(MiKTeX, MacTeX or TeX Live). F5 rebuilds it. When you rewrite, commands, maths and \cite keys are never changed;&lt;br&gt;
only the prose moves. That was the reason I started the project, and it is still the part I use most.&lt;/p&gt;

&lt;p&gt;Markdown gets the same treatment, with a rendered preview as you type. HTML tags and source code are left alone too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvjsv1d4bmrhux1i2og57.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvjsv1d4bmrhux1i2og57.png" alt="A LaTeX paper with its PDF" width="799" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  PDF editing
&lt;/h2&gt;

&lt;p&gt;PDFs open in their own view. You can highlight, underline, strike out, add notes, draw, white out an area, add text&lt;br&gt;
and pictures, and change a line of text in place. Pages can be turned, moved, deleted, inserted or merged from&lt;br&gt;
another PDF.&lt;/p&gt;

&lt;p&gt;Rewrite can also turn a PDF into an editable document with its headings, lists, tables and pictures, mending the&lt;br&gt;
words that were broken across line ends. That is useful when the only copy of something is a PDF.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fre56x2za0oydwo19q04f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fre56x2za0oydwo19q04f.png" alt="Marking up a PDF" width="799" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Export and convert
&lt;/h2&gt;

&lt;p&gt;Anything Rewrite opens can be written out as PDF, Word, OpenDocument, RTF, HTML, Markdown, LaTeX or plain text&lt;br&gt;
(Ctrl+Shift+E). A Markdown draft can become a Word file for a supervisor; a Word report can become LaTeX for a&lt;br&gt;
journal template.&lt;/p&gt;

&lt;h2&gt;
  
  
  The small things
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Find and replace with Ctrl+F and Ctrl+H, and F3 for the next match.&lt;/li&gt;
&lt;li&gt;Open a file with Ctrl+O, or drop it on the window.&lt;/li&gt;
&lt;li&gt;A dark theme for late nights.&lt;/li&gt;
&lt;li&gt;F1 opens the full guide inside the app.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Price, account, privacy
&lt;/h2&gt;

&lt;p&gt;Rewrite is free, with no account and no word limit. On first start it offers a one-time download of about 400 MB&lt;br&gt;
for its best suggestions; after that it works offline. If you skip the download it runs in Lite mode with a&lt;br&gt;
built-in thesaurus.&lt;/p&gt;

&lt;h2&gt;
  
  
  Download
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Windows 10 and 11 (Intel, AMD, ARM)&lt;/td&gt;
&lt;td&gt;Setup .exe, no admin rights needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;macOS 15 or later (Apple Silicon and Intel)&lt;/td&gt;
&lt;td&gt;.dmg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debian and Ubuntu (x64 and ARM)&lt;/td&gt;
&lt;td&gt;.deb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Any Linux (x64 and ARM)&lt;/td&gt;
&lt;td&gt;AppImage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Get it at &lt;a href="https://samratduttaofficial.github.io/Rewrite/" rel="noopener noreferrer"&gt;https://samratduttaofficial.github.io/Rewrite/&lt;/a&gt; . The source is on GitHub at&lt;br&gt;
&lt;a href="https://github.com/SamratDuttaOfficial/Rewrite" rel="noopener noreferrer"&gt;https://github.com/SamratDuttaOfficial/Rewrite&lt;/a&gt; . The Windows installer is not signed yet, so SmartScreen may ask you&lt;br&gt;
to confirm the first time.&lt;/p&gt;

&lt;p&gt;For the curious: Rewrite is written in Rust with GTK 4, and one GitHub Actions workflow builds all six installers.&lt;/p&gt;

&lt;p&gt;If a suggestion is bad or a file opens wrong, open an issue on GitHub and tell me. That is the fastest way it gets&lt;br&gt;
better.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>productivity</category>
      <category>writing</category>
      <category>tools</category>
    </item>
    <item>
      <title>WaterSheep: an open-source alternative to Jev</title>
      <dc:creator>Samrat Dutta</dc:creator>
      <pubDate>Sat, 10 Oct 2026 10:02:26 +0000</pubDate>
      <link>https://dev.to/samratduttaofficial/watersheep-an-open-source-alternative-to-jev-5458</link>
      <guid>https://dev.to/samratduttaofficial/watersheep-an-open-source-alternative-to-jev-5458</guid>
      <description>&lt;p&gt;TypeSafe's Jev made a simple idea popular: a model that doesn't write text, only makes decisions. You send some state and typed questions, and you get back choices, scores and probabilities your code can act on. Jev itself is closed, and you pay per token.&lt;/p&gt;

&lt;p&gt;When it launched, I saw everyone hyping it up and thought: I can build an open one. So I did. &lt;strong&gt;WaterSheep&lt;/strong&gt; is an open-source alternative to Jev. It answers the same kinds of questions about any text:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;noul&lt;/strong&gt;: yes/no, with the probability of yes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;choice&lt;/strong&gt;: one of your options&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;score&lt;/strong&gt;: a rating scale, with the expected level&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;multi&lt;/strong&gt;: every option that applies (Jev doesn't have this one)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every answer includes a probability for every option.&lt;/p&gt;

&lt;h2&gt;
  
  
  Already using Jev? Keep your code
&lt;/h2&gt;

&lt;p&gt;Run WaterSheep as a local server:&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;git+https://github.com/SamratDuttaOfficial/WaterSheep
watersheep &lt;span class="nt"&gt;--model&lt;/span&gt; samratduttaofficial/WaterSheep &lt;span class="nt"&gt;--serve&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It answers &lt;code&gt;POST /v1/systemone&lt;/code&gt; with the same request and response shape as Jev, so TypeSafe's own Python SDK works against it. Point the SDK at it and run your code as usual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;TYPESAFE_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:8766
python triage.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bitldo6qdsilsbzcnjg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bitldo6qdsilsbzcnjg.gif" alt="Jev's Python SDK running unchanged against WaterSheep" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The script is plain Jev code:&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;from&lt;/span&gt; &lt;span class="n"&gt;typesafe_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Noul&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TypeSafeClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TypeSafeClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# or TypeSafeClient(base_url="http://127.0.0.1:8766")
&lt;/span&gt;
&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;system_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;state&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="s"&gt;ticket&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I was charged twice for order #4411. Refund the duplicate today.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;questions&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="s"&gt;refund&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Noul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Does the customer ask for a refund?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;team&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Which team should handle this?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;criteria&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="s"&gt;billing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shipping&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;technical&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;urgency&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;How urgent is this?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;criteria&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="s"&gt;low&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;answers&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;refund:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;refund&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;noul&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                               &lt;span class="c1"&gt;# 0.9451
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;team:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;team&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;team&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;probabilities&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;# billing {'billing': 0.8817, ...}
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;urgency:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;urgency&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;urgency&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;# 1.4805 {0: 'low', 1: 'medium', 2: 'high'}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any API key value works locally. I tested this with &lt;code&gt;typesafe-sdk&lt;/code&gt; 0.7.2; Jev's JavaScript SDK is untested so far.&lt;/p&gt;

&lt;h2&gt;
  
  
  No SDK? It's plain HTTP
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://127.0.0.1:8766/v1/systemone &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "state": "My card was charged twice and the box arrived crushed.",
  "questions": {
    "team": {"type": "choice", "instructions": "Which team should handle this?",
             "criteria": {"billing": "payments, refunds", "shipping": "delivery, damage"}},
    "issues": {"type": "multi", "instructions": "Which problems are reported?",
               "criteria": ["double charge", "damaged item", "late delivery"]}
  }
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;multi&lt;/code&gt; question returns both problems, each with its own probability. A single &lt;code&gt;choice&lt;/code&gt; has to pick one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Python without a server
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;transformers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt;

&lt;span class="n"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;samratduttaofficial/WaterSheep&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;trust_remote_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I was charged twice.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Which team should handle this?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&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="s"&gt;billing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shipping&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;support&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;It also runs as ONNX, and the &lt;a href="https://samratduttaofficial.github.io/WaterSheep/" rel="noopener noreferrer"&gt;live demo&lt;/a&gt; lets you try it without installing anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  How good is it?
&lt;/h2&gt;

&lt;p&gt;On the in-distribution test split it gets 77.8% accuracy; on held-out datasets it never saw, 61.2%. The probabilities are calibrated (expected calibration error 0.026 and 0.043), so you can set thresholds on them: act automatically when the model is confident, and send the rest to a person. Per-benchmark results, including the weak ones, are in the &lt;a href="https://github.com/SamratDuttaOfficial/WaterSheep#evaluation" rel="noopener noreferrer"&gt;README&lt;/a&gt;, and the details are in the &lt;a href="https://doi.org/10.13140/RG.2.2.28606.45122" rel="noopener noreferrer"&gt;paper&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Limits: English only, long inputs are truncated, rating questions are the weakest type, and it isn't meant for high-stakes decisions on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open all the way down
&lt;/h2&gt;

&lt;p&gt;Code, weights and the training pipeline are Apache 2.0, and you can retrain it on your own data with one script. WaterSheep is independent and not affiliated with TypeSafe.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/SamratDuttaOfficial/WaterSheep" rel="noopener noreferrer"&gt;https://github.com/SamratDuttaOfficial/WaterSheep&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Hugging Face: &lt;a href="https://huggingface.co/samratduttaofficial/WaterSheep" rel="noopener noreferrer"&gt;https://huggingface.co/samratduttaofficial/WaterSheep&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd love feedback, especially examples where it gets things wrong.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>machinelearning</category>
      <category>python</category>
    </item>
  </channel>
</rss>
