<?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: Maggie fu</title>
    <description>The latest articles on DEV Community by Maggie fu (@maggie_fu_4a8ab2f510f1987).</description>
    <link>https://dev.to/maggie_fu_4a8ab2f510f1987</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%2F4208356%2F4d755a38-8889-449a-ac21-48e12d0b3d3e.png</url>
      <title>DEV Community: Maggie fu</title>
      <link>https://dev.to/maggie_fu_4a8ab2f510f1987</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maggie_fu_4a8ab2f510f1987"/>
    <language>en</language>
    <item>
      <title>How to Use HefuAI with the OpenAI Python SDK</title>
      <dc:creator>Maggie fu</dc:creator>
      <pubDate>Tue, 27 Oct 2026 07:20:35 +0000</pubDate>
      <link>https://dev.to/maggie_fu_4a8ab2f510f1987/how-to-use-hefuai-with-the-openai-python-sdk-287f</link>
      <guid>https://dev.to/maggie_fu_4a8ab2f510f1987/how-to-use-hefuai-with-the-openai-python-sdk-287f</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;You want to try Kimi, DeepSeek, Claude, GPT. Each provider means a new account, a new API key, a new billing setup, and sometimes a whole new SDK. By the time you've evaluated three vendors, you've spent an afternoon on signup forms instead of your actual project.&lt;/p&gt;

&lt;p&gt;HefuAI is an API gateway that puts 130+ models behind one OpenAI-compatible endpoint. What actually sold me: &lt;strong&gt;I didn't have to learn anything new&lt;/strong&gt;. If you've called the OpenAI API before, you already know how to call this one. Two lines change.&lt;/p&gt;

&lt;p&gt;Everything below goes from an empty file to a working streaming chat call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.9+&lt;/li&gt;
&lt;li&gt;A free HefuAI account (sign up at hefu.hk — new accounts get $0.5 bonus credit for API usage)&lt;/li&gt;
&lt;li&gt;An API key from &lt;strong&gt;Console → API Keys&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ One heads-up: HefuAI keys are stored irreversibly and the plaintext is &lt;strong&gt;shown only once&lt;/strong&gt; at creation. Copy it somewhere safe immediately. I learned this the hard way.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 1: Install the SDK
&lt;/h2&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 python-dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the official OpenAI SDK. No special client needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Store Your API Key
&lt;/h2&gt;

&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; file in your project root (and add it to &lt;code&gt;.gitignore&lt;/code&gt; &lt;strong&gt;before&lt;/strong&gt; your first commit):&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="nv"&gt;HEFUAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-your-key-here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# quickstart.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&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="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Never hardcode the key in source files. A leaked key means someone else's API bill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Point the Client at HefuAI
&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;openai&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;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&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;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HEFUAI_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;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.hefu.hk/v1&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only &lt;code&gt;api_key&lt;/code&gt; and &lt;code&gt;base_url&lt;/code&gt; differ from a standard OpenAI setup. Request shapes, response objects, error types: all the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Make Your First Request
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&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="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&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;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;deepseek-v4-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&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;role&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;user&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;content&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;Explain what an API gateway is in one sentence.&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&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="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example output (yours will vary)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;An API gateway is a single entry point that receives requests, routes them to the
appropriate backend service, and handles cross-cutting concerns like auth and rate
limiting.
Usage(prompt_tokens=..., completion_tokens=..., total_tokens=...)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your text and token counts change between runs. The structure doesn't: the answer is in &lt;code&gt;resp.choices[0].message.content&lt;/code&gt;, the token counts in &lt;code&gt;resp.usage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Want another model? Swap &lt;code&gt;"deepseek-v4-flash"&lt;/code&gt; for &lt;code&gt;"kimi-k3"&lt;/code&gt; or &lt;code&gt;"claude-sonnet-5-5"&lt;/code&gt; and run it again. Same code, same key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Add Streaming (Do This Early)
&lt;/h2&gt;

&lt;p&gt;Add streaming early. Reasoning models can sit for tens of seconds before they return anything, and a spinner that long reads as broken. With streaming, the first token arrives in seconds, at least for reasoning models that stream their thinking.&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="n"&gt;stream&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="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&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;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;deepseek-v4-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&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;role&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;user&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;content&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;Write a haiku about API keys.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;stream&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="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&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="n"&gt;delta&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&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;flush&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;print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Want real token counts at the end of a stream? Pass &lt;code&gt;stream_options={"include_usage": True}&lt;/code&gt;. A usage chunk arrives after the last content chunk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The &lt;code&gt;/v1&lt;/code&gt; in the base URL.&lt;/strong&gt; &lt;code&gt;https://api.hefu.hk&lt;/code&gt; on its own doesn't route. It has to be &lt;code&gt;https://api.hefu.hk/v1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keys that end up in git.&lt;/strong&gt; Use &lt;code&gt;.env&lt;/code&gt; with &lt;code&gt;python-dotenv&lt;/code&gt;, and fix &lt;code&gt;.gitignore&lt;/code&gt; before the first commit, not after.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trailing whitespace in the key.&lt;/strong&gt; Copying out of a dashboard drags a newline along more often than you'd expect. It's the usual reason behind a 401.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No &lt;code&gt;max_tokens&lt;/code&gt; cap.&lt;/strong&gt; Chatty models will run long and the bill follows. Set a cap per scenario.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model ID typos.&lt;/strong&gt; A wrong ID gives you a 404 and nothing else. Check the console's model list before you start debugging your own code.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Beyond Chat Completions
&lt;/h2&gt;

&lt;p&gt;The same key also covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/v1/messages&lt;/code&gt; — the Anthropic Messages protocol, if you prefer the &lt;code&gt;anthropic&lt;/code&gt; SDK&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/v1/responses&lt;/code&gt; — the Responses API for codex-style coding models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Existing OpenAI-SDK code runs as-is once &lt;code&gt;base_url&lt;/code&gt; and &lt;code&gt;api_key&lt;/code&gt; change, and LangChain-style stacks pick it up without extra wiring.&lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://hefu.hk/docs" rel="noopener noreferrer"&gt;hefu.hk/docs&lt;/a&gt; · Model list: &lt;a href="https://hefu.hk/models" rel="noopener noreferrer"&gt;hefu.hk/models&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;Next post takes this further: &lt;strong&gt;calling several models through one API from a single script&lt;/strong&gt;, which is what you need for evaluation and A/B testing before you commit to one model in production.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: this tutorial series uses HefuAI as its example gateway. All code patterns apply to any OpenAI-compatible endpoint.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>openai</category>
      <category>llm</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
