{"id":55781,"date":"2025-02-19T14:09:25","date_gmt":"2025-02-19T06:09:25","guid":{"rendered":"https:\/\/fwq.ai\/blog\/55781\/"},"modified":"2025-02-19T14:09:25","modified_gmt":"2025-02-19T06:09:25","slug":"%e5%88%a9%e7%94%a8-qwen-chat-%e8%8e%b7%e5%8f%96%e6%89%80%e6%9c%89%e5%bc%80%e6%ba%90-%e9%97%ad%e6%ba%90%e6%a8%a1%e5%9e%8b%e5%85%8d%e8%b4%b9api","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/55781\/","title":{"rendered":"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API"},"content":{"rendered":"<p>\u524d\u6bb5\u65f6\u95f4\u53d1\u5e03\u4e86\u6d77\u5916\u7248\u5343\u95ee  \uff0c\u53d7\u5230\u5e7f\u6cdb\u597d\u8bc4\u3002Qwen Chat \u5229\u7528\u4e8c\u6b21\u5f00\u53d1\u7684&nbsp; \u804a\u5929\u754c\u9762\u63a5\u5165\u4e86\u5343\u95ee\u5168\u7cfb\u5217\u5927\u6a21\u578b\uff0cQwen2.5-plus \u95ed\u6e90\u6a21\u578b\u80fd\u529b\u5341\u5206\u51fa\u8272\uff0c\u53ef\u4ee5\u80dc\u4efb\u5404\u7c7b\u4efb\u52a1\u3002<\/p>\n<p>\u6ce8\u610f\uff1aQVQ\u548cQWQ\u7c7b\u4f3c o1 \u4e0d\u652f\u6301\u591a\u8f6e\u5bf9\u8bdd\u3002<\/p>\n<p> <\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.aisharenet.com\/wp-content\/uploads\/2025\/01\/42c02541118d07b.png\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe\" \/><\/p>\n<p>&nbsp;<\/p>\n<h2>\u5982\u4f55\u4f7f\u7528 Qwen Chat&nbsp;\u6240\u6709\u6a21\u578bAPI<\/h2>\n<h3>\u83b7\u53d6 Qwen API \u6d41\u7a0b<\/h3>\n<p>1.\u8fdb\u884c\u4e00\u8f6e\u5bf9\u8bdd<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"\/\/www.w3.org\/2000\/svg'%20viewBox='0%200%20717%20253'%3E%3C\/svg%3E\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe1\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe1\" \/> <img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.aisharenet.com\/wp-content\/uploads\/2025\/01\/a3f41a23e579467.png\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe2\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe2\" \/> <\/p>\n<p>&nbsp;<\/p>\n<p>2.\u6253\u5f00\u6d4f\u89c8\u5668\u5f00\u53d1\u8005\u5de5\u5177\uff0c\u9009\u62e9\u5e94\u7528-\u672c\u5730\u5b58\u50a8\u7a7a\u95f4-\u7f51\u5740<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"\/\/www.w3.org\/2000\/svg'%20viewBox='0%200%20756%20711'%3E%3C\/svg%3E\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe3\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe3\" \/> <img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.aisharenet.com\/wp-content\/uploads\/2025\/01\/5547d0822575760.png\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe4\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe4\" \/> <\/p>\n<p>&nbsp;<\/p>\n<p>3.\u83b7\u53d6  ,\u5b8c\u6574\u590d\u5236\u4ee5\u4e0b\u5185\u5bb9<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"\/\/www.w3.org\/2000\/svg'%20viewBox='0%200%20479%20146'%3E%3C\/svg%3E\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe5\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe5\" \/> <img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.aisharenet.com\/wp-content\/uploads\/2025\/01\/732a26c0f2a1fb9.png\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe6\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe6\" \/> <\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>4.\u5b8c\u6574API\u5730\u5740<\/p>\n<p>URL\uff1ahttps:\/\/chat.qwenlm.ai\/api<\/p>\n<p>KEY\uff1aeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjRjZTBhNWIwLTgzYTUtNGQ3My04MmEzLWIyNmExMTcyZjY5MiIsImV4cCI6MTczOTA3ODEyOX0.PE5hjIPUa7XhcegjRRLtwlNjsIWR5MG32mIF0Pr1GoQ<\/p>\n<p>&nbsp;<\/p>\n<p>5.\u53ef\u9009\u6a21\u578b<\/p>\n<p>\u4f7f\u7528\u5343\u95ee\u6a21\u578b\u6807\u51c6\u578b\u53f7\uff0c\u4f8b\u5982\uff1aqwen-plus-latest\u3001qwen2.5-coder-32b-instruct<\/p>\n<p>&nbsp;<\/p>\n<h3>\u642d\u5efaQwen\u4e2d\u8f6cAPI<\/h3>\n<p>\u8ba9\u63a5\u53e3\u517c\u5bb9OpenAI\u683c\u5f0f\uff0c\u5e76\u907f\u514d\u4f7f\u7528\u539f\u59cb\u5730\u5740\u7684\u5404\u7c7b\u5f02\u5e38\u3002\u4f9d\u8d56cloudflare\u7684worker\u4e2d\u8f6c\uff0c\u5177\u4f53\u6ce8\u518c\u4f7f\u7528\u6d41\u7a0b\u7565\u8fc7\u3002<\/p>\n<p>1.\u4fdd\u5b58\u4ee5\u4e0b\u4ee3\u7801<\/p>\n<pre>\/\/ Qwen API \u914d\u7f6e\r\nconst QWEN_API_URL = 'https:\/\/chat.qwenlm.ai\/api\/chat\/completions';\r\nconst QWEN_MODELS_URL = 'https:\/\/chat.qwenlm.ai\/api\/models';\r\nconst MAX_RETRIES = 3;\r\nconst RETRY_DELAY = 1000; \/\/ 1\u79d2\r\nconst TIMEOUT_DURATION = 30000; \/\/ 30\u79d2\u8d85\u65f6\r\nconst MAX_BUFFER_SIZE = 1024 * 1024; \/\/ 1MB \u7f13\u51b2\u533a\u9650\u5236\r\nconst MAX_CONCURRENT_REQUESTS = 100; \/\/ \u6700\u5927\u5e76\u53d1\u8bf7\u6c42\u6570\r\nconst MODELS_CACHE_TTL = 3600000; \/\/ \u6a21\u578b\u7f13\u5b58\u65f6\u95f4 1\u5c0f\u65f6\r\n\n\/\/ \u7f13\u5b58\u5bf9\u8c61\r\nlet modelsCache = {\r\ndata: null,\r\ntimestamp: 0\r\n};\r\n\n\/\/ \u5e76\u53d1\u8ba1\u6570\r\nlet currentRequests = 0;\r\n\nasync function sleep(ms) {\r\nreturn new Promise(resolve =&gt; setTimeout(resolve, ms));\r\n}\r\n\n\/\/ \u83b7\u53d6\u6a21\u578b\u5217\u8868\uff08\u5e26\u7f13\u5b58\uff09\r\nasync function getModels(authHeader) {\r\nconst now = Date.now();\r\nif (modelsCache.data &amp;&amp; (now - modelsCache.timestamp) &lt; MODELS_CACHE_TTL) {\r\nreturn modelsCache.data;\r\n}\r\n\nconst response = await fetchWithRetry(QWEN_MODELS_URL, {\r\nheaders: { 'Authorization': authHeader }\r\n});\r\n\nconst data = await response.text();\r\nmodelsCache = {\r\ndata,\r\ntimestamp: now\r\n};\r\nreturn data;\r\n}\r\n\nasync function fetchWithRetry(url, options, retries = MAX_RETRIES) {\r\nconst controller = new AbortController();\r\nconst timeoutId = setTimeout(() =&gt; controller.abort(), TIMEOUT_DURATION);\r\noptions.signal = controller.signal;\r\n\nlet lastError;\r\nfor (let i = 0; i &lt; retries; i++) {\r\ntry {\r\nconst response = await fetch(url, {\r\n...options,\r\nsignal: controller.signal\r\n});\r\n\nconst responseClone = response.clone();\r\nconst responseText = await responseClone.text();\r\nconst contentType = response.headers.get('content-type') || '';\r\n\nif (contentType.includes('text\/html') || response.status === 500) {\r\nlastError = {\r\nstatus: response.status,\r\ncontentType,\r\nresponseText: responseText.slice(0, 1000),\r\nheaders: Object.fromEntries(response.headers.entries())\r\n};\r\n\nif (i &lt; retries - 1) {\r\nawait sleep(RETRY_DELAY * Math.pow(2, i)); \/\/ \u6307\u6570\u9000\u907f\r\n;\r\n}\r\n}\r\n\nclearTimeout(timeoutId);\r\nreturn new Response(responseText, {\r\nstatus: response.status,\r\nheaders: {\r\n'Content-Type': contentType || 'application\/json',\r\n'Cache-Control': 'no-cache',\r\n'Connection': 'keep-alive'\r\n}\r\n});\r\n} catch (error) {\r\nlastError = error;\r\nif (i &lt; retries - 1) {\r\nawait sleep(RETRY_DELAY * Math.pow(2, i));\r\ncontinue;\r\n}\r\n}\r\n}\r\n\nclearTimeout(timeoutId);\r\nthrow new Error(JSON.stringify({\r\nerror: true,\r\nmessage: 'All retry attempts failed',\r\nlastError,\r\nretries\r\n}));\r\n}\r\n\n\/\/ \u54cd\u5e94\u538b\u7f29\r\nasync function compressResponse(response, request) {\r\nconst acceptEncoding = request.headers.get('Accept-Encoding') || '';\r\nconst contentType = response.headers.get('Content-Type') || '';\r\n\n\/\/ \u53ea\u5bf9\u6587\u672c\u548c JSON \u54cd\u5e94\u8fdb\u884c\u538b\u7f29\r\nif (!contentType.includes('text\/') &amp;&amp; !contentType.includes('application\/json')) {\r\nreturn response;\r\n}\r\n\nconst content = await response.text();\r\nconst encoder = new TextEncoder();\r\nconst bytes = encoder.encode(content);\r\n\nif (acceptEncoding.includes('br')) {\r\n\/\/ \u4f7f\u7528 Brotli \u538b\u7f29\r\nconst compressed = new Uint8Array(bytes.buffer);\r\nreturn new Response(compressed, {\r\nheaders: {\r\n...Object.fromEntries(response.headers),\r\n'Content-Encoding': 'br',\r\n'Content-Type': contentType\r\n}\r\n});\r\n}\r\n\nreturn response;\r\n}\r\n\nasync function processLine(line, writer, previousContent) {\r\nconst encoder = new TextEncoder();\r\ntry {\r\nconst data = JSON.parse(line.slice(6));\r\nif (data.choices?.[0]?.delta?.content) {\r\nconst currentContent = data.choices[0].delta.content;\r\nlet newContent = currentContent;\r\nif (currentContent.startsWith(previousContent) &amp;&amp; previousContent.length &gt; 0) {\r\nnewContent = currentContent.slice(previousContent.length);\r\n}\r\n\nconst newData = {\r\n...data,\r\nchoices: [{\r\n...data.choices[0],\r\ndelta: {\r\n...data.choices[0].delta,\r\ncontent: newContent\r\n}\r\n}]\r\n};\r\n\nawait writer.write(encoder.encode(`data: ${JSON.stringify(newData)}\\n\\n`));\r\nreturn currentContent;\r\n} else {\r\nawait writer.write(encoder.encode(`data: ${JSON.stringify(data)}\\n\\n`));\r\nreturn previousContent;\r\n}\r\n} catch (e) {\r\nawait writer.write(encoder.encode(`${line}\\n\\n`));\r\nreturn previousContent;\r\n}\r\n}\r\n\n\/\/ \u5904\u7406\u6d41\r\nasync function handleStream(reader, writer, previousContent, timeout) {\r\nconst encoder = new TextEncoder();\r\nlet buffer = '';\r\nlet lastProcessTime = Date.now();\r\n\ntry {\r\nwhile (true) {\r\n\/\/ \u68c0\u67e5\u8d85\u65f6\r\nif (Date.now() - lastProcessTime &gt; TIMEOUT_DURATION) {\r\nthrow new Error('Stream processing timeout');\r\n}\r\n\nconst { done, value } = await reader.read();\r\n\nif (done) {\r\nclearTimeout(timeout);\r\nif (buffer) {\r\nconst lines = buffer.split('\\n');\r\nfor (const line of lines) {\r\nif (line.trim().startsWith('data: ')) {\r\nawait processLine(line, writer, previousContent);\r\n}\r\n}\r\n}\r\nawait writer.write(encoder.encode('data: [DONE]\\n\\n'));\r\nawait writer.close();\r\nbreak;\r\n}\r\n\nlastProcessTime = Date.now();\r\nconst chunk = new TextDecoder().decode(value);\r\nbuffer += chunk;\r\n\n\/\/ \u68c0\u67e5\u7f13\u51b2\u533a\u5927\u5c0f\r\nif (buffer.length &gt; MAX_BUFFER_SIZE) {\r\nconst lines = buffer.split('\\n');\r\nbuffer = lines.pop() || '';\r\n\nfor (const line of lines) {\r\nif (line.trim().startsWith('data: ')) {\r\nconst result = await processLine(line, writer, previousContent);\r\nif (result) {\r\npreviousContent = result;\r\n}\r\n}\r\n}\r\n}\r\n\n\/\/ \u5904\u7406\u5b8c\u6574\u7684\u884c\r\nconst lines = buffer.split('\\n');\r\nbuffer = lines.pop() || '';\r\n\nfor (const line of lines) {\r\nif (line.trim().startsWith('data: ')) {\r\nconst result = await processLine(line, writer, previousContent);\r\nif (result) {\r\npreviousContent = result;\r\n}\r\n}\r\n}\r\n}\r\n} catch (error) {\r\nclearTimeout(timeout);\r\nawait writer.write(encoder.encode(`data: {\"error\":true,\"message\":\"${error.message}\"}\\n\\n`));\r\nawait writer.write(encoder.encode('data: [DONE]\\n\\n'));\r\nawait writer.close();\r\n}\r\n}\r\n\n\/\/ \u9519\u8bef\u5904\u7406\r\nconst ERROR_TYPES = {\r\nTIMEOUT: 'timeout_error',\r\nNETWORK: 'network_error',\r\nAUTH: 'auth_error',\r\nRATE_LIMIT: 'rate_limit_error',\r\nVALIDATION: 'validation_error'\r\n};\r\n\nasync function handleError(error, request) {\r\nconst errorContext = {\r\ntype: error.type || ERROR_TYPES.NETWORK,\r\ntimestamp: Date.now(),\r\nurl: request.url,\r\nheaders: Object.fromEntries(request.headers),\r\nmessage: error.message\r\n};\r\n\nreturn new Response(JSON.stringify({\r\nerror: true,\r\nerror_type: errorContext.type,\r\nmessage: error.message\r\n}), {\r\nstatus: error.status || 500,\r\nheaders: {\r\n'Content-Type': 'application\/json',\r\n'Cache-Control': 'no-cache'\r\n}\r\n});\r\n}\r\n\nasync function handleRequest(request) {\r\n\/\/ \u5e76\u53d1\u63a7\u5236\r\nif (currentRequests &gt;= MAX_CONCURRENT_REQUESTS) {\r\nreturn new Response(JSON.stringify({\r\nerror: true,\r\nerror_type: ERROR_TYPES.RATE_LIMIT,\r\nmessage: 'Too Many Requests'\r\n}), {\r\nstatus: 429,\r\nheaders: {\r\n'Content-Type': 'application\/json',\r\n'Retry-After': '5',\r\n'Cache-Control': 'no-cache'\r\n}\r\n});\r\n}\r\n\ncurrentRequests++;\r\ntry {\r\n\/\/ \u5904\u7406\u83b7\u53d6\u6a21\u578b\u5217\u8868\u7684\u8bf7\u6c42\r\nif (request.method === 'GET' &amp;&amp; new URL(request.url).pathname === '\/v1\/models') {\r\nconst authHeader = request.headers.get('Authorization');\r\nif (!authHeader || !authHeader.startsWith('Bearer ')) {\r\nthrow {\r\ntype: ERROR_TYPES.AUTH,\r\nstatus: 401,\r\nmessage: 'Unauthorized'\r\n};\r\n}\r\n\ntry {\r\nconst modelsResponse = await getModels(authHeader);\r\nreturn await compressResponse(new Response(modelsResponse, {\r\nheaders: {\r\n'Content-Type': 'application\/json',\r\n'Cache-Control': 'no-cache',\r\n'Connection': 'keep-alive'\r\n}\r\n}), request);\r\n} catch (error) {\r\nthrow {\r\ntype: ERROR_TYPES.NETWORK,\r\nstatus: 500,\r\nmessage: error.message\r\n};\r\n}\r\n}\r\n\nif (request.method !== 'POST') {\r\nthrow {\r\ntype: ERROR_TYPES.VALIDATION,\r\nstatus: 405,\r\nmessage: 'Method not allowed'\r\n};\r\n}\r\n\nconst authHeader = request.headers.get('Authorization');\r\nif (!authHeader || !authHeader.startsWith('Bearer ')) {\r\nthrow {\r\ntype: ERROR_TYPES.AUTH,\r\nstatus: 401,\r\nmessage: 'Unauthorized'\r\n};\r\n}\r\n\nconst requestData = await request.json();\r\nconst { messages, stream = false, model, max_tokens } = requestData;\r\n\nif (!model) {\r\nthrow {\r\ntype: ERROR_TYPES.VALIDATION,\r\nstatus: 400,\r\nmessage: 'Model parameter is required'\r\n};\r\n}\r\n\n\/\/ \u6784\u5efa\u8bf7\u6c42\r\nconst qwenRequest = {\r\nmodel,\r\nmessages,\r\nstream\r\n};\r\n\nif (max_tokens !== undefined) {\r\nqwenRequest.max_tokens = max_tokens;\r\n}\r\n\n\/\/ \u8bbe\u7f6e\u8d85\u65f6\r\nconst controller = new AbortController();\r\nconst timeoutId = setTimeout(() =&gt; controller.abort(), TIMEOUT_DURATION);\r\n\ntry {\r\nconst response = await fetch(QWEN_API_URL, {\r\nmethod: 'POST',\r\nheaders: {\r\n'Authorization': authHeader,\r\n'Content-Type': 'application\/json'\r\n},\r\nbody: JSON.stringify(qwenRequest),\r\nsignal: controller.signal\r\n});\r\n\nclearTimeout(timeoutId);\r\n\nif (!response.ok) {\r\nthrow {\r\ntype: ERROR_TYPES.NETWORK,\r\nstatus: response.status,\r\nmessage: `Qwen API error: ${response.status}`\r\n};\r\n}\r\n\nif (stream) {\r\nconst { readable, writable } = new TransformStream();\r\nconst writer = writable.getWriter();\r\nconst reader = response.body.getReader();\r\nconst streamTimeout = setTimeout(() =&gt; controller.abort(), TIMEOUT_DURATION);\r\n\nhandleStream(reader, writer, '', streamTimeout);\r\nreturn new Response(readable, {\r\nheaders: {\r\n'Content-Type': 'text\/event-stream',\r\n'Cache-Control': 'no-cache',\r\n'Connection': 'keep-alive'\r\n}\r\n});\r\n} else {\r\nconst responseData = await response.text();\r\nreturn await compressResponse(new Response(responseData, {\r\nheaders: {\r\n'Content-Type': 'application\/json',\r\n'Cache-Control': 'no-cache',\r\n'Connection': 'keep-alive'\r\n}\r\n}), request);\r\n}\r\n} catch (error) {\r\nclearTimeout(timeoutId);\r\nthrow {\r\ntype: error.name === 'AbortError' ? ERROR_TYPES.TIMEOUT : ERROR_TYPES.NETWORK,\r\nstatus: 500,\r\nmessage: error.message\r\n};\r\n}\r\n} catch (error) {\r\nreturn handleError(error, request);\r\n} finally {\r\ncurrentRequests--;\r\n}\r\n}\r\n\naddEventListener('fetch', event =&gt; {\r\nevent.respondWith(handleRequest(event.request));\r\n});<\/pre>\n<p>&nbsp;<\/p>\n<p>2.\u65b0\u5efaworker.js\u7c98\u8d34\u4ee3\u7801\u540e\u4fdd\u5b58<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"\/\/www.w3.org\/2000\/svg'%20viewBox='0%200%20831%20618'%3E%3C\/svg%3E\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe7\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe7\" \/> <img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.aisharenet.com\/wp-content\/uploads\/2025\/01\/562ad32579e0e26.png\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe8\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe8\" \/> <\/p>\n<p>&nbsp;<\/p>\n<p>3.\u5927\u5bb6\u90fd\u77e5\u9053cloudflare\u57df\u540d\u56fd\u5185\u65e0\u6cd5\u76f4\u63a5\u8bbf\u95ee\uff0c\u6240\u4ee5\u8981\u7ed1\u5b9a\u4e00\u4e2a\u57df\u540d<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"\/\/www.w3.org\/2000\/svg'%20viewBox='0%200%201089%20482'%3E%3C\/svg%3E\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe9\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe9\" \/> <img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.aisharenet.com\/wp-content\/uploads\/2025\/01\/224fce9ec5638b3.png\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe10\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe10\" \/> <\/p>\n<p>&nbsp;<\/p>\n<p>4.\u6253\u5f00\u540e\u663e\u793a\u5982\u4e0b\u4fe1\u606f\uff0c\u8868\u793a\u4e2d\u8f6cAPI\u90e8\u7f72\u6210\u529f<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"\/\/www.w3.org\/2000\/svg'%20viewBox='0%200%20405%20218'%3E%3C\/svg%3E\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe11\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe11\" \/> <img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.aisharenet.com\/wp-content\/uploads\/2025\/01\/61403ed692a1595.png\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe12\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe12\" \/> <\/p>\n<p>&nbsp;<\/p>\n<h3>\u5728\u5ba2\u6237\u7aef\u4e2d\u914d\u7f6eQwen API<\/h3>\n<p>\u4ee5  \u4e3a\u4f8b\uff1a<\/p>\n<p>URL\u4e5f\u53ef\u4ee5\u5199\uff1ahttps:\/\/qwenapi.aishare.us.kg\/v1<\/p>\n<p>\u6c89\u6d78\u5f0f\u7ffb\u8bd1URL\u586b\u5199\u683c\u5f0f\uff1ahttps:\/\/qwenapi.aishare.us.kg\/v1\/chat\/completions<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"\/\/www.w3.org\/2000\/svg'%20viewBox='0%200%20548%20456'%3E%3C\/svg%3E\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe13\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe13\" \/> <img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.aisharenet.com\/wp-content\/uploads\/2025\/01\/0bc12c28165e714.png\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe14\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API\u63d2\u56fe14\" \/> <\/p>\n<p>&nbsp;<\/p>\n<p>\u66f4\u591aChat2API\uff1a<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u6bb5\u65f6\u95f4\u53d1\u5e03\u4e86\u6d77\u5916\u7248\u5343\u95ee \uff0c\u53d7\u5230\u5e7f\u6cdb\u597d\u8bc4\u3002Qwen Chat \u5229\u7528\u4e8c\u6b21\u5f00\u53d1\u7684&nbsp; \u804a\u5929\u754c\u9762\u63a5\u5165\u4e86\u5343\u95ee\u5168\u7cfb\u5217\u5927\u6a21\u578b\uff0cQwen2.5-plus \u95ed\u6e90\u6a21\u578b\u80fd\u529b\u5341\u5206\u51fa\u8272\uff0c\u53ef\u4ee5\u80dc\u4efb\u5404\u7c7b\u4efb\u52a1\u3002 \u6ce8\u610f\uff1aQVQ\u548cQWQ\u7c7b\u4f3c o1 \u4e0d\u652f\u6301\u591a\u8f6e\u5bf9\u8bdd\u3002 &nbsp; \u5982\u4f55\u4f7f\u7528 Qwen Chat&nbsp;\u6240\u6709\u6a21\u578bAPI \u83b7\u53d6 Qwen API \u6d41\u7a0b 1.\u8fdb\u884c\u4e00\u8f6e\u5bf9\u8bdd &nbsp; 2.\u6253\u5f00\u6d4f\u89c8\u5668\u5f00\u53d1\u8005\u5de5\u5177\uff0c\u9009\u62e9\u5e94\u7528-\u672c\u5730\u5b58\u50a8\u7a7a\u95f4-\u7f51\u5740 &nbsp; 3.\u83b7\u53d6 ,\u5b8c\u6574\u590d\u5236\u4ee5\u4e0b\u5185\u5bb9 &nbsp; &nbsp; 4.\u5b8c\u6574API\u5730\u5740 URL\uff1ahttps:\/\/chat.qwenlm.ai\/api KEY\uff1aeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjRjZTBhNWIwLTgzYTUtNGQ3My04MmEzLWIyNmExMTcyZjY5MiIsImV4cCI6MTczOTA3ODEyOX0.PE5hjIPUa7XhcegjRRLtwlNjsIWR5MG32mIF0Pr1GoQ &nbsp; 5.\u53ef\u9009\u6a21\u578b \u4f7f\u7528\u5343\u95ee\u6a21\u578b\u6807\u51c6\u578b\u53f7\uff0c\u4f8b\u5982\uff1aqwen-plus-latest\u3001qwen2.5-coder-32b-instruct &nbsp; \u642d\u5efaQwen\u4e2d\u8f6cAPI \u8ba9\u63a5\u53e3\u517c\u5bb9OpenAI\u683c\u5f0f\uff0c\u5e76\u907f\u514d\u4f7f\u7528\u539f\u59cb\u5730\u5740\u7684\u5404\u7c7b\u5f02\u5e38\u3002\u4f9d\u8d56cloudflare\u7684worker\u4e2d\u8f6c\uff0c\u5177\u4f53\u6ce8\u518c\u4f7f\u7528\u6d41\u7a0b\u7565\u8fc7\u3002 1.\u4fdd\u5b58\u4ee5\u4e0b\u4ee3\u7801 \/\/ Qwen API \u914d\u7f6e const QWEN_API_URL = &#8216;https:\/\/chat.qwenlm.ai\/api\/chat\/completions&#8217;; const QWEN_MODELS_URL = &#8216;https:\/\/chat.qwenlm.ai\/api\/models&#8217;; const MAX_RETRIES = 3; const RETRY_DELAY = 1000; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-55781","post","type-post","status-publish","format-standard","hentry","category-ai"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/55781","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/comments?post=55781"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/55781\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=55781"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=55781"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=55781"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}