{"id":18711,"date":"2025-01-18T11:42:36","date_gmt":"2025-01-18T03:42:36","guid":{"rendered":"https:\/\/www.aisharenet.com\/?p=18711"},"modified":"2025-01-18T11:46:21","modified_gmt":"2025-01-18T03:46:21","slug":"liyong-qwen-chat-huo","status":"publish","type":"post","link":"https:\/\/www.kdjingpai.com\/pt\/liyong-qwen-chat-huo\/","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 <a href=\"https:\/\/www.kdjingpai.com\/en\/qwen-chat\/\">Qwen Chat<\/a> \uff0c\u53d7\u5230\u5e7f\u6cdb\u597d\u8bc4\u3002Qwen Chat \u5229\u7528\u4e8c\u6b21\u5f00\u53d1\u7684\u00a0<a href=\"https:\/\/www.kdjingpai.com\/openwebui\/\">Open WebUI<\/a> \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><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-18712\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API-1\" src=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/42c02541118d07b.png\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API-1\" width=\"508\" height=\"390\" srcset=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/42c02541118d07b.png 508w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/42c02541118d07b-300x230.png 300w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/42c02541118d07b-16x12.png 16w\" sizes=\"auto, (max-width: 508px) 100vw, 508px\" \/><\/p>\n<p>&nbsp;<\/p>\n<h2>\u5982\u4f55\u4f7f\u7528 Qwen Chat\u00a0\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 loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-18713\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API-1\" src=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/a3f41a23e579467.png\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API-1\" width=\"717\" height=\"253\" srcset=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/a3f41a23e579467.png 717w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/a3f41a23e579467-300x106.png 300w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/a3f41a23e579467-18x6.png 18w\" sizes=\"auto, (max-width: 717px) 100vw, 717px\" \/><\/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 loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-18714\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API-1\" src=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/5547d0822575760.png\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API-1\" width=\"756\" height=\"711\" srcset=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/5547d0822575760.png 756w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/5547d0822575760-300x282.png 300w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/5547d0822575760-13x12.png 13w\" sizes=\"auto, (max-width: 756px) 100vw, 756px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>3.\u83b7\u53d6 <a href=\"https:\/\/www.kdjingpai.com\/en\/tokenization\/\">Token<\/a> ,\u5b8c\u6574\u590d\u5236\u4ee5\u4e0b\u5185\u5bb9<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-18715\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API-1\" src=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/732a26c0f2a1fb9.png\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API-1\" width=\"479\" height=\"146\" srcset=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/732a26c0f2a1fb9.png 479w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/732a26c0f2a1fb9-300x91.png 300w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/732a26c0f2a1fb9-18x5.png 18w\" sizes=\"auto, (max-width: 479px) 100vw, 479px\" \/><\/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\r\n\/\/ \u7f13\u5b58\u5bf9\u8c61\r\nlet modelsCache = {\r\ndata: null,\r\ntimestamp: 0\r\n};\r\n\r\n\/\/ \u5e76\u53d1\u8ba1\u6570\r\nlet currentRequests = 0;\r\n\r\nasync function sleep(ms) {\r\nreturn new Promise(resolve =&gt; setTimeout(resolve, ms));\r\n}\r\n\r\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\r\nconst response = await fetchWithRetry(QWEN_MODELS_URL, {\r\nheaders: { 'Authorization': authHeader }\r\n});\r\n\r\nconst data = await response.text();\r\nmodelsCache = {\r\ndata,\r\ntimestamp: now\r\n};\r\nreturn data;\r\n}\r\n\r\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\r\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\r\nconst responseClone = response.clone();\r\nconst responseText = await responseClone.text();\r\nconst contentType = response.headers.get('content-type') || '';\r\n\r\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\r\nif (i &lt; retries - 1) {\r\nawait sleep(RETRY_DELAY * Math.pow(2, i)); \/\/ \u6307\u6570\u9000\u907f\r\n<a href=\"https:\/\/www.kdjingpai.com\/en\/continue\/\">continue<\/a>;\r\n}\r\n}\r\n\r\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\r\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\r\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\r\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\r\nconst content = await response.text();\r\nconst encoder = new TextEncoder();\r\nconst bytes = encoder.encode(content);\r\n\r\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\r\nreturn response;\r\n}\r\n\r\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\r\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\r\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\r\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\r\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\r\nconst { done, value } = await reader.read();\r\n\r\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\r\nlastProcessTime = Date.now();\r\nconst chunk = new TextDecoder().decode(value);\r\nbuffer += chunk;\r\n\r\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\r\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\r\n\/\/ \u5904\u7406\u5b8c\u6574\u7684\u884c\r\nconst lines = buffer.split('\\n');\r\nbuffer = lines.pop() || '';\r\n\r\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\r\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\r\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\r\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\r\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\r\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\r\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\r\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\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\r\nconst requestData = await request.json();\r\nconst { messages, stream = false, model, max_tokens } = requestData;\r\n\r\nif (!model) {\r\nthrow {\r\ntype: ERROR_TYPES.VALIDATION,\r\nstatus: 400,\r\nmessage: 'Model parameter is required'\r\n};\r\n}\r\n\r\n\/\/ \u6784\u5efa\u8bf7\u6c42\r\nconst qwenRequest = {\r\nmodel,\r\nmessages,\r\nstream\r\n};\r\n\r\nif (max_tokens !== undefined) {\r\nqwenRequest.max_tokens = max_tokens;\r\n}\r\n\r\n\/\/ \u8bbe\u7f6e\u8d85\u65f6\r\nconst controller = new AbortController();\r\nconst timeoutId = setTimeout(() =&gt; controller.abort(), TIMEOUT_DURATION);\r\n\r\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\r\nclearTimeout(timeoutId);\r\n\r\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\r\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\r\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\r\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 loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-18716\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API-1\" src=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/562ad32579e0e26.png\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API-1\" width=\"831\" height=\"618\" srcset=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/562ad32579e0e26.png 831w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/562ad32579e0e26-300x223.png 300w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/562ad32579e0e26-768x571.png 768w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/562ad32579e0e26-16x12.png 16w\" sizes=\"auto, (max-width: 831px) 100vw, 831px\" \/><\/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 loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-18717\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API-1\" src=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/224fce9ec5638b3.png\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API-1\" width=\"1089\" height=\"482\" srcset=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/224fce9ec5638b3.png 1089w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/224fce9ec5638b3-300x133.png 300w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/224fce9ec5638b3-1024x453.png 1024w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/224fce9ec5638b3-768x340.png 768w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/224fce9ec5638b3-18x8.png 18w\" sizes=\"auto, (max-width: 1089px) 100vw, 1089px\" \/><\/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 loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-18718\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API-1\" src=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/61403ed692a1595.png\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API-1\" width=\"405\" height=\"218\" srcset=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/61403ed692a1595.png 405w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/61403ed692a1595-300x161.png 300w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/61403ed692a1595-18x10.png 18w\" sizes=\"auto, (max-width: 405px) 100vw, 405px\" \/><\/p>\n<p>&nbsp;<\/p>\n<h3>\u5728\u5ba2\u6237\u7aef\u4e2d\u914d\u7f6eQwen API<\/h3>\n<p>\u4ee5 <a href=\"https:\/\/www.kdjingpai.com\/roo-cline\/\">Roo Cline<\/a> \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 loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-18719\" title=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API-1\" src=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/0bc12c28165e714.png\" alt=\"\u5229\u7528 Qwen Chat \u83b7\u53d6\u6240\u6709\u5f00\u6e90\/\u95ed\u6e90\u6a21\u578b\u514d\u8d39API-1\" width=\"548\" height=\"456\" srcset=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/0bc12c28165e714.png 548w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/0bc12c28165e714-300x250.png 300w, https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/01\/0bc12c28165e714-14x12.png 14w\" sizes=\"auto, (max-width: 548px) 100vw, 548px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>\u66f4\u591aChat2API\uff1a<a href=\"https:\/\/www.kdjingpai.com\/nixiangapi\/\">\u6536\u96c6\u514d\u8d39\u5bf9\u8bdd\u5927\u6a21\u578b\u9006\u5411\u8f6cAPI\u63a5\u53e3<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u6bb5\u65f6\u95f4\u53d1\u5e03\u4e86\u6d77\u5916\u7248\u5343\u95ee Qwen Chat \uff0c\u53d7\u5230\u5e7f\u6cdb\u597d\u8bc4\u3002Qwen Chat \u5229\u7528\u4e8c\u6b21\u5f00\u53d1\u7684\u00a0Open WebUI \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&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[182],"tags":[255],"class_list":["post-18711","post","type-post","status-publish","format-standard","hentry","category-shicao","tag-mianfeidamoxingapi"],"_links":{"self":[{"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/posts\/18711","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/comments?post=18711"}],"version-history":[{"count":0,"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/posts\/18711\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/media?parent=18711"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/categories?post=18711"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kdjingpai.com\/pt\/wp-json\/wp\/v2\/tags?post=18711"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}