{"id":1479,"date":"2024-05-15T19:34:37","date_gmt":"2024-05-15T19:34:37","guid":{"rendered":"https:\/\/www.nicekj.com\/?p=1479"},"modified":"2024-05-15T19:34:53","modified_gmt":"2024-05-15T19:34:53","slug":"aizhengzaigaibianshijie-net-cbetalgoopenai-duijie-openai-shixian","status":"publish","type":"post","link":"https:\/\/www.nicekj.com\/aizhengzaigaibianshijie-net-cbetalgoopenai-duijie-openai-shixian.html","title":{"rendered":"\u3010AI\u6b63\u5728\u6539\u53d8\u4e16\u754c\u3011 .NET C#\uff08Betalgo.OpenAI\uff09 \u5bf9\u63a5 OpenAI \u5b9e\u73b0\u6d41\u5f0f\u54cd\u5e94\uff0c\u63d0\u9ad8\u7528\u6237\u4f53\u9a8c ~"},"content":{"rendered":"<h1 data-id=\"heading-0\">\u524d\u8a00<\/h1>\n<p>\u672c\u6587\u4e3b\u8981\u8bb0\u5f55\u6211\u81ea\u8eab\u4f7f\u7528 C# \u5bf9\u63a5 OpenAI \u5bf9\u63a5\u63a5\u53e3\u7684\u4e00\u4e9b\u7b80\u8981\u6b65\u9aa4\uff0c\u5e0c\u671b\u5bf9\u5927\u5bb6\u6709\u6240\u5e2e\u52a9\u3002<\/p>\n<h1 data-id=\"heading-1\">Betalgo.OpenAI<\/h1>\n<p>gitHub Betalgo.Open \u5f00\u6e90\u5730\u5740<\/p>\n<p><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fbetalgo%2Fopenai\" target=\"_blank\" title=\"https:\/\/github.com\/betalgo\/openai\" ref=\"nofollow noopener noreferrer\" rel=\"noopener\">betalgo\/openai: OpenAI .NET sdk &#8211; ChatGPT  (github.com)<\/a><\/p>\n<h1 data-id=\"heading-2\">\u8be6\u7ec6\u6b65\u9aa4<\/h1>\n<h2 data-id=\"heading-3\">1\u3001\u914d\u7f6e\u4f60\u7684 OpenAI key \u7531\u5b98\u7f51\u63d0\u4f9b<\/h2>\n<p>OpenAI API \u5b98\u7f51\u5730\u5740<\/p>\n<p><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fplatform.openai.com%2Fapi-keys\" target=\"_blank\" title=\"https:\/\/platform.openai.com\/api-keys\" ref=\"nofollow noopener noreferrer\" rel=\"noopener\">API keys &#8211; OpenAI API<\/a><\/p>\n<p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.nicekj.com\/wp-content\/uploads\/replace\/ea81bc9c8d563a79798175122f1bea3f.png\" alt=\"image.png\" \/><\/figure>\n<\/p>\n<p>\u53ef\u80fd\u9700\u8981\u4f60\u5145\u4e00\u70b9 Money<\/p>\n<p>\u8fd9\u91cc\u5c31\u662f\u4f60\u7684\u6bcf\u65e5\u8d39\u7528\u7edf\u8ba1\u3002<\/p>\n<p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.nicekj.com\/wp-content\/uploads\/replace\/07ebd757a6b20bf7872ad4319b54322b.png\" alt=\"image.png\" \/><\/figure>\n<\/p>\n<h2 data-id=\"heading-4\">2\u3001OpenAI API \u4ecb\u7ecd<\/h2>\n<p>\u4f60\u5b8c\u5168\u53ef\u4ee5\u9009\u62e9 Http \u8c03\u7528\uff0cOpenAI \u7ed9\u4e86\u4f60\u4f20\u7edfRestful\u63a5\u53e3\u7684\u8c03\u7528\u65b9\u6cd5\u3002<\/p>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">arduino<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-arduino code-block-extension-codeShowNum\" lang=\"arduino\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\">curl https:<span class=\"hljs-comment\">\/\/api.openai.com\/v1\/chat\/completions <\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">  -H \"Content-Type: application\/json\" <\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\">  -H \"Authorization: Bearer $OPENAI_API_KEY\" <\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">  -d '{<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">     <span class=\"hljs-string\">\"model\"<\/span>: <span class=\"hljs-string\">\"gpt-3.5-turbo\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">     <span class=\"hljs-string\">\"messages\"<\/span>: [{<span class=\"hljs-string\">\"role\"<\/span>: <span class=\"hljs-string\">\"user\"<\/span>, <span class=\"hljs-string\">\"content\"<\/span>: <span class=\"hljs-string\">\"Say this is a test!\"<\/span>}],<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\">     <span class=\"hljs-string\">\"temperature\"<\/span>: <span class=\"hljs-number\">0.7<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"8\">   }'<\/span>\n<\/code><\/pre>\n<blockquote>\n<p>OpenAI\u7684\u8bb0\u4f4f\u5bf9\u8bdd\u529f\u80fd:<\/p>\n<ul>\n<li>\u5176\u5b9e\u5c31\u662f\u7528 <code>role<\/code> \u548c <code>content<\/code> \u6765\u5b9e\u73b0\u7684:\nrole \u6307\u5b9a\u89d2\u8272<\/li>\n<\/ul>\n<\/blockquote>\n<p>\u8fd9\u662f\u4e00\u4e2a\u4f7f\u7528curl\u547d\u4ee4\u5411OpenAI API\u53d1\u9001\u8bf7\u6c42\u7684\u793a\u4f8b\u3002\u8be5\u8bf7\u6c42\u4f7f\u7528POST\u65b9\u6cd5\u53d1\u9001JSON\u6570\u636e\u5230<a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fapi.openai.com%2Fv1%2Fchat%2Fcompletions%25E7%25AB%25AF%25E7%2582%25B9%25E3%2580%2582\" target=\"_blank\" title=\"https:\/\/api.openai.com\/v1\/chat\/completions%E7%AB%AF%E7%82%B9%E3%80%82\" ref=\"nofollow noopener noreferrer\" rel=\"noopener\">api.openai.com\/v1\/chat\/com\u2026<\/a><\/p>\n<p>\u5728\u8bf7\u6c42\u4e2d\uff0c\u4f7f\u7528\u4e86\u4e24\u4e2a\u81ea\u5b9a\u4e49\u7684HTTP\u6807\u5934\uff1a<\/p>\n<ol>\n<li><code>\"Content-Type: application\/json\"<\/code>\u6307\u5b9a\u4e86\u8bf7\u6c42\u7684\u5185\u5bb9\u7c7b\u578b\u4e3aJSON\u3002<\/li>\n<li><code>\"Authorization: Bearer $OPENAI_API_KEY\"<\/code>\u5305\u542b\u4e86\u4e00\u4e2aBearer\u4ee4\u724c\uff0c\u7528\u4e8e\u8eab\u4efd\u9a8c\u8bc1\u548c\u6388\u6743\u3002<code>$OPENAI_API_KEY<\/code> \u4e3a\u4f60\u7b2c\u4e00\u6b65\u6ce8\u518c\u7684 key\u3002<\/li>\n<\/ol>\n<p>\u8bf7\u6c42\u7684\u4e3b\u4f53\u662f\u4e00\u4e2aJSON\u5bf9\u8c61\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u5b57\u6bb5\uff1a<\/p>\n<ol>\n<li>&#8220;model&#8221;\u6307\u5b9a\u4e86\u8981\u4f7f\u7528\u7684\u6a21\u578b\u7684\u540d\u79f0\uff0c\u8fd9\u91cc\u662f&#8221;gpt-3.5-turbo&#8221;\u3002<\/li>\n<li>&#8220;messages&#8221;\u662f\u4e00\u4e2a\u5305\u542b\u4e86\u7528\u6237\u6d88\u606f\u7684\u6570\u7ec4\uff0c\u6bcf\u6761\u6d88\u606f\u90fd\u5305\u542b\u4e86&#8221;role&#8221;\u548c&#8221;content&#8221;\u5b57\u6bb5\uff0c\u6307\u5b9a\u4e86\u6d88\u606f\u7684\u89d2\u8272\u548c\u5185\u5bb9\u3002<\/li>\n<li>&#8220;temperature&#8221;\u6307\u5b9a\u4e86\u7528\u4e8e\u751f\u6210\u56de\u590d\u7684\u591a\u6837\u6027\u53c2\u6570\uff0c\u503c\u4e3a0.7\u3002<\/li>\n<\/ol>\n<p><strong>\u8fd9\u79cd\u65b9\u5f0f\u975e\u5e38\u7b80\u5355\uff0c\u4f46\u662f\u5f0a\u7aef\u5c31\u662f\u54cd\u5e94\u901f\u5ea6\u975e\u5e38\u975e\u5e38\u7684\u6162\uff0c\u7279\u522b\u662f\u4f60\u7684\u56de\u7b54\u7684\u5185\u5bb9\u5b57\u6570\u975e\u5e38\u591a\u65f6\u5019\uff0c\u54cd\u5e94\u901f\u5ea6\u4ee4\u4eba\u53d1\u6307\u3002\u8fd9\u79cd\u65b9\u5f0f\u80af\u5b9a\u6709\u80fd\u7528\u5230\u7684\u5730\u65b9\uff0c\u4f46\u662f\u57fa\u4e8e\u76ee\u524d\u7684\u9700\u6c42\uff0c\u6211\u4eec\u8fd8\u662f\u9009\u62e9\u53e6\u4e00\u79cd\u8bf7\u6c42\u65b9\u5f0f-\u6d41\u5f0f\u54cd\u5e94\u3002<\/strong><\/p>\n<h2 data-id=\"heading-5\">3\u3001OpenAI \u6d41\u5f0f\u54cd\u5e94<\/h2>\n<p>\u53ea\u9700\u8981\u5728\u6d88\u606f\u4f53json\u4e2d\u52a0\u5165<code>stream=True<\/code>\u3002<\/p>\n<p>\u6d41\u5f0f\u54cd\u5e94\u534f\u8bae SSE \u5177\u4f53\u8bf7\u770b\u6211\u7684\u53e6\u4e00\u7bc7\u6587\u7ae0\uff1a<\/p>\n<p><a href=\"https:\/\/juejin.cn\/post\/7307451430595657743\" target=\"_blank\" title=\"https:\/\/juejin.cn\/post\/7307451430595657743\" rel=\"noopener\">\u804a\u5929\u65e0\u969c\u788d\uff1aOpenAI SSE \u534f\u8bae\u7684\u6d41\u5f0f\u54cd\u5e94 &amp; Chatgpt\u5e26\u7ed9\u6211\u7684\u53cd\u601d &#8211; \u6398\u91d1 (juejin.cn)<\/a><\/p>\n<p>\u867d\u7136\u5b98\u65b9\u7ed9\u51fa\u4e86\u6d41\u5f0f\u54cd\u5e94\u7684\u793a\u4f8b\uff0c\u4f46\u662f\u53ea\u6709 python \u548c js \u7684\u3002C#\u5b98\u65b9\u6ca1\u6709\u7ed9\u51fa\uff0c\u8bf7\u770b\u4e0b\u6587\u3002<\/p>\n<h2 data-id=\"heading-6\">4\u3001\u52a0\u5165 Betalgo.OpenAI \u4f9d\u8d56<\/h2>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">xml<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-xml code-block-extension-codeShowNum\" lang=\"xml\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ItemGroup<\/span>&gt;<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">PackageReference<\/span> <span class=\"hljs-attr\">Include<\/span>=<span class=\"hljs-string\">\"Betalgo.OpenAI\"<\/span> <span class=\"hljs-attr\">Version<\/span>=<span class=\"hljs-string\">\"7.4.1\"<\/span> \/&gt;<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\"><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">ItemGroup<\/span>&gt;<\/span><\/span>\n<\/code><\/pre>\n<p>\u6216\u8005\u76f4\u63a5 NuGet \u641c\u7d22 Betalgo.OpenAI \u641c\u7d22\u4e0b\u8f7d\u3002<\/p>\n<p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.nicekj.com\/wp-content\/uploads\/replace\/750ebeea735f19e703ef853243908ded.png\" alt=\"image.png\" \/><\/figure>\n<\/p>\n<h2 data-id=\"heading-7\">5\u3001\u5c06 OpenAIService \u63a5\u53e3\u6ce8\u5165IOC<\/h2>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\">builder.Services.AddOpenAIService(<span class=\"hljs-attr\">settings<\/span> =&gt;<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">    {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\">        <span class=\"hljs-attr\">settings.ApiKey<\/span> = options.ApiKey<span class=\"hljs-comment\">;<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">        <span class=\"hljs-attr\">settings.BaseDomain<\/span> = options.BaseDomain<span class=\"hljs-comment\">;<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">    })<span class=\"hljs-comment\">;<\/span><\/span>\n<\/code><\/pre>\n<h2 data-id=\"heading-8\">6\u3001\u63a5\u53e3\u5b9e\u4f8b<\/h2>\n<p>\u4e00\u4e2a\u6574\u5957\u7684C#\u6d41\u5f0f\u54cd\u5e94\u7684\u8fc7\u7a0b\uff0c\u4ec5\u4f9b\u53c2\u8003~<\/p>\n<p>Controller \u5c42<\/p>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">c#<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-c# code-block-extension-codeShowNum\" lang=\"c#\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\">[<span class=\"hljs-meta\">HttpPost(<span class=\"hljs-string\">\"text\"<\/span>, Name = <span class=\"hljs-string\">\"ChatText\"<\/span>)<\/span>]<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">async<\/span> Task&lt;IActionResult&gt; <span class=\"hljs-title\">ChatText<\/span>(<span class=\"hljs-params\">[FromBody] List&lt;ChatMessage&gt; messages<\/span>)<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\">{<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">    <span class=\"hljs-keyword\">try<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">    {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">        HttpContext.Response.ContentType = <span class=\"hljs-string\">\"text\/event-stream\"<\/span>;<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\">        HttpContext.Response.Headers.Add(<span class=\"hljs-string\">\"Cache-Control\"<\/span>, <span class=\"hljs-string\">\"no-cache\"<\/span>);<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"8\">        HttpContext.Response.Headers.Add(<span class=\"hljs-string\">\"Connection\"<\/span>, <span class=\"hljs-string\">\"keep-alive\"<\/span>);<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"9\">        <\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"10\">        <span class=\"hljs-keyword\">await<\/span> <span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> s <span class=\"hljs-keyword\">in<\/span> _chatOpenAIService.ChatOpenAI(messages))<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"11\">        {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"12\">            <span class=\"hljs-keyword\">await<\/span> HttpContext.Response.WriteAsync(s);<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"13\">            <span class=\"hljs-keyword\">await<\/span> HttpContext.Response.Body.FlushAsync();<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"14\">        }<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"15\">    }<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"16\">    <span class=\"hljs-keyword\">catch<\/span> (Exception e)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"17\">    {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"18\">        Log.Error(e,<span class=\"hljs-string\">\"\"<\/span>);<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"19\">    }<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"20\">    <\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"21\">    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> EmptyResult();<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"22\">}<\/span>\n<\/code><\/pre>\n<p>IService \u5c42<\/p>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">c#<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-c# code-block-extension-codeShowNum\" lang=\"c#\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">IChatOpenAIService<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">{<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\">    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> IAsyncEnumerable&lt;<span class=\"hljs-built_in\">string<\/span>&gt; <span class=\"hljs-title\">ChatOpenAI<\/span>(<span class=\"hljs-params\">List&lt;ChatMessage&gt; messages<\/span>)<\/span>;<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">    <\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> Task&lt;AIName&gt; <span class=\"hljs-title\">getAIName<\/span>(<span class=\"hljs-params\"><span class=\"hljs-built_in\">long<\/span> id<\/span>)<\/span>;<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">}<\/span>\n<\/code><\/pre>\n<p>Service \u5c42<\/p>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">c#<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-c# code-block-extension-codeShowNum\" lang=\"c#\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">async<\/span> IAsyncEnumerable&lt;<span class=\"hljs-built_in\">string<\/span>&gt; <span class=\"hljs-title\">ChatOpenAI<\/span>(<span class=\"hljs-params\">List&lt;ChatMessage&gt; messages<\/span>)<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">{<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\">    <span class=\"hljs-keyword\">var<\/span> completionResult = _openAiService.ChatCompletion.CreateCompletionAsStream(<span class=\"hljs-keyword\">new<\/span> ChatCompletionCreateRequest<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">    {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">        Messages = messages,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">        Model = Models.ChatGpt3_5Turbo,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\">        MaxTokens = <span class=\"hljs-number\">1000<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"8\">    });<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"9\">    <\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"10\">    <span class=\"hljs-keyword\">await<\/span> <span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> completion <span class=\"hljs-keyword\">in<\/span> completionResult)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"11\">    {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"12\">        <span class=\"hljs-keyword\">if<\/span> (completion.Successful)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"13\">        {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"14\">            Console.Write(completion.Choices.First().Message.Content);<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"15\">            <span class=\"hljs-keyword\">yield<\/span> <span class=\"hljs-keyword\">return<\/span> completion.Choices.First().Message.Content;<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"16\">        }<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"17\">        <span class=\"hljs-keyword\">else<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"18\">        {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"19\">            <span class=\"hljs-keyword\">if<\/span> (completion.Error == <span class=\"hljs-literal\">null<\/span>)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"20\">            {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"21\">                <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> Exception(<span class=\"hljs-string\">\"Unknown Error\"<\/span>);<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"22\">            }<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"23\"><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"24\">            Console.WriteLine(<span class=\"hljs-string\">$\"<span class=\"hljs-subst\">{completion.Error.Code}<\/span>: <span class=\"hljs-subst\">{completion.Error.Message}<\/span>\"<\/span>);<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"25\">        }<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"26\">    }<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"27\">}<\/span>\n<\/code><\/pre>\n<h1 data-id=\"heading-9\">\u603b\u7ed3<\/h1>\n<p>\u4e00\u5b9a\u8981\u591a\u601d\u8003\uff0c\u5982\u679c\u4eba\u6c38\u8fdc\u5f85\u5728\u8212\u9002\u5708\u7684\u8bdd\uff0c\u4eba\u6c38\u8fdc\u4e0d\u4f1a\u6210\u957f\u3002\u5171\u52c9<\/p>\n<blockquote>\n<p>\u89c9\u5f97\u4f5c\u8005\u5199\u7684\u4e0d\u9519\u7684\uff0c\u503c\u5f97\u4f60\u4eec\u501f\u9274\u7684\u8bdd\uff0c\u5c31\u8bf7\u70b9\u4e00\u4e2a\u514d\u8d39\u7684\u8d5e\u5427\uff01\u8fd9\u4e2a\u5bf9\u6211\u6765\u8bf4\u771f\u7684\u5f88\u91cd\u8981\u3002\u0aee(\u02f6\u1d54 \u1d55 \u1d54\u02f6)\u10d0<\/p>\n<\/blockquote>","protected":false},"excerpt":{"rendered":"<p>\u524d\u8a00 \u672c\u6587\u4e3b\u8981\u8bb0\u5f55\u6211\u81ea\u8eab\u4f7f\u7528 C# \u5bf9\u63a5 OpenAI \u5bf9\u63a5\u63a5\u53e3\u7684\u4e00\u4e9b\u7b80\u8981\u6b65\u9aa4\uff0c\u5e0c\u671b\u5bf9\u5927\u5bb6\u6709\u6240\u5e2e\u52a9\u3002 Betalgo.OpenAI gitHub Betalgo.Open \u5f00\u6e90\u5730\u5740 betalgo\/o<\/p>\n","protected":false},"author":1,"featured_media":9030,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"rank_math_title":"","rank_math_description":"","rank_math_focus_keyword":"","views":"9","footnotes":""},"categories":[3],"tags":[126,127,128,129,136],"collection":[],"class_list":["post-1479","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fenlei2","tag-gpt","tag-ai","tag-128","tag-129","tag-136"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/posts\/1479","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/comments?post=1479"}],"version-history":[{"count":0,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/posts\/1479\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/media\/9030"}],"wp:attachment":[{"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/media?parent=1479"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/categories?post=1479"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/tags?post=1479"},{"taxonomy":"collection","embeddable":true,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/collection?post=1479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}