@robota-sdk/agent-provider 3.0.0-beta.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/browser/index.d.ts +1104 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +7 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/loggers/index.cjs +1 -0
- package/dist/loggers/index.d.ts +151 -0
- package/dist/loggers/index.d.ts.map +1 -0
- package/dist/loggers/index.js +2 -0
- package/dist/loggers/index.js.map +1 -0
- package/dist/node/anthropic/index.cjs +1 -0
- package/dist/node/anthropic/index.d.ts +158 -0
- package/dist/node/anthropic/index.d.ts.map +1 -0
- package/dist/node/anthropic/index.js +1 -0
- package/dist/node/anthropic--1vgLC-e.js +5 -0
- package/dist/node/anthropic--1vgLC-e.js.map +1 -0
- package/dist/node/anthropic-BFQ6DSCP.cjs +4 -0
- package/dist/node/bytedance/index.cjs +1 -0
- package/dist/node/bytedance/index.d.ts +74 -0
- package/dist/node/bytedance/index.d.ts.map +1 -0
- package/dist/node/bytedance/index.js +1 -0
- package/dist/node/bytedance-C_0sF_pJ.js +2 -0
- package/dist/node/bytedance-C_0sF_pJ.js.map +1 -0
- package/dist/node/bytedance-DVPxqEiC.cjs +1 -0
- package/dist/node/chunk-Bmb41Sf3.cjs +1 -0
- package/dist/node/deepseek/index.cjs +1 -0
- package/dist/node/deepseek/index.d.ts +2 -0
- package/dist/node/deepseek/index.js +1 -0
- package/dist/node/deepseek-_8Ixx7rA.js +2 -0
- package/dist/node/deepseek-_8Ixx7rA.js.map +1 -0
- package/dist/node/deepseek-oA2Y6bD0.cjs +1 -0
- package/dist/node/gemini/index.cjs +1 -0
- package/dist/node/gemini/index.d.ts +173 -0
- package/dist/node/gemini/index.d.ts.map +1 -0
- package/dist/node/gemini/index.js +1 -0
- package/dist/node/gemini-Bh2U87MY.js +4 -0
- package/dist/node/gemini-Bh2U87MY.js.map +1 -0
- package/dist/node/gemini-DSaNCxZj.cjs +3 -0
- package/dist/node/gemma/index.cjs +1 -0
- package/dist/node/gemma/index.d.ts +2 -0
- package/dist/node/gemma/index.js +1 -0
- package/dist/node/gemma-Dp_AfCUR.js +2 -0
- package/dist/node/gemma-Dp_AfCUR.js.map +1 -0
- package/dist/node/gemma-G-Pf_PnX.cjs +1 -0
- package/dist/node/google/index.cjs +1 -0
- package/dist/node/google/index.d.ts +14 -0
- package/dist/node/google/index.d.ts.map +1 -0
- package/dist/node/google/index.js +2 -0
- package/dist/node/google/index.js.map +1 -0
- package/dist/node/index-B6PnlDMd.d.ts +82 -0
- package/dist/node/index-B6PnlDMd.d.ts.map +1 -0
- package/dist/node/index-B7UvPJcI.d.ts +315 -0
- package/dist/node/index-B7UvPJcI.d.ts.map +1 -0
- package/dist/node/index-BLPOTNb5.d.ts +98 -0
- package/dist/node/index-BLPOTNb5.d.ts.map +1 -0
- package/dist/node/index-BqixM_XD.d.ts +231 -0
- package/dist/node/index-BqixM_XD.d.ts.map +1 -0
- package/dist/node/index-C3beaqKO.d.ts +231 -0
- package/dist/node/index-C3beaqKO.d.ts.map +1 -0
- package/dist/node/index-Cp2XRh9G.d.ts +82 -0
- package/dist/node/index-Cp2XRh9G.d.ts.map +1 -0
- package/dist/node/index-DSv5xruI.d.ts +98 -0
- package/dist/node/index-DSv5xruI.d.ts.map +1 -0
- package/dist/node/index-w0bV1uaP.d.ts +315 -0
- package/dist/node/index-w0bV1uaP.d.ts.map +1 -0
- package/dist/node/index.cjs +1 -0
- package/dist/node/index.d.ts +8 -0
- package/dist/node/index.js +1 -0
- package/dist/node/openai/index.cjs +1 -0
- package/dist/node/openai/index.d.ts +2 -0
- package/dist/node/openai/index.js +1 -0
- package/dist/node/openai-CRQjg4xF.js +2 -0
- package/dist/node/openai-CRQjg4xF.js.map +1 -0
- package/dist/node/openai-compatible-BYfyY5lb.cjs +1 -0
- package/dist/node/openai-compatible-Dm4Sof9e.js +2 -0
- package/dist/node/openai-compatible-Dm4Sof9e.js.map +1 -0
- package/dist/node/openai-xWC6pY7r.cjs +1 -0
- package/dist/node/qwen/index.cjs +1 -0
- package/dist/node/qwen/index.d.ts +2 -0
- package/dist/node/qwen/index.js +1 -0
- package/dist/node/qwen-ChUZobTL.js +2 -0
- package/dist/node/qwen-ChUZobTL.js.map +1 -0
- package/dist/node/qwen-CjT71vSM.cjs +1 -0
- package/package.json +157 -0
- package/src/anthropic/__tests__/abort-streaming.test.ts +199 -0
- package/src/anthropic/__tests__/model-catalog-refresh.test.ts +92 -0
- package/src/anthropic/__tests__/provider-definition.test.ts +55 -0
- package/src/anthropic/__tests__/provider.test.ts +1357 -0
- package/src/anthropic/__tests__/response-parser.test.ts +326 -0
- package/src/anthropic/index.ts +22 -0
- package/src/anthropic/message-converter.ts +181 -0
- package/src/anthropic/model-catalog-refresh.ts +128 -0
- package/src/anthropic/parsers/response-parser.ts +184 -0
- package/src/anthropic/provider-definition.ts +93 -0
- package/src/anthropic/provider.ts +290 -0
- package/src/anthropic/streaming-handler.ts +204 -0
- package/src/anthropic/types/api-types.ts +158 -0
- package/src/anthropic/types.ts +79 -0
- package/src/bytedance/http-client.test.ts +288 -0
- package/src/bytedance/http-client.ts +163 -0
- package/src/bytedance/index.ts +2 -0
- package/src/bytedance/provider.spec.ts +320 -0
- package/src/bytedance/provider.ts +171 -0
- package/src/bytedance/status-mapper.test.ts +299 -0
- package/src/bytedance/status-mapper.ts +141 -0
- package/src/bytedance/types.ts +68 -0
- package/src/deepseek/defaults.ts +4 -0
- package/src/deepseek/index.ts +22 -0
- package/src/deepseek/model-catalog-refresh.test.ts +57 -0
- package/src/deepseek/model-catalog-refresh.ts +105 -0
- package/src/deepseek/model-catalog.ts +55 -0
- package/src/deepseek/provider-definition.test.ts +109 -0
- package/src/deepseek/provider-definition.ts +132 -0
- package/src/deepseek/provider.test.ts +324 -0
- package/src/deepseek/provider.ts +298 -0
- package/src/deepseek/types.ts +37 -0
- package/src/gemini/execution-helpers.ts +233 -0
- package/src/gemini/genai-transport.test.ts +208 -0
- package/src/gemini/image-operations.test.ts +448 -0
- package/src/gemini/image-operations.ts +261 -0
- package/src/gemini/index.ts +11 -0
- package/src/gemini/message-converter.test.ts +616 -0
- package/src/gemini/message-converter.ts +140 -0
- package/src/gemini/model-catalog-refresh.test.ts +107 -0
- package/src/gemini/model-catalog-refresh.ts +92 -0
- package/src/gemini/provider-definition.test.ts +70 -0
- package/src/gemini/provider-definition.ts +78 -0
- package/src/gemini/provider-extended.test.ts +898 -0
- package/src/gemini/provider.spec.ts +216 -0
- package/src/gemini/provider.ts +279 -0
- package/src/gemini/request-converter.ts +226 -0
- package/src/gemini/tool-schema-converter.ts +78 -0
- package/src/gemini/types/api-types.ts +235 -0
- package/src/gemini/types.ts +121 -0
- package/src/gemma/index.ts +5 -0
- package/src/gemma/message-factory.ts +38 -0
- package/src/gemma/provider-definition.test.ts +43 -0
- package/src/gemma/provider-definition.ts +84 -0
- package/src/gemma/provider-projection.ts +49 -0
- package/src/gemma/provider.test.ts +628 -0
- package/src/gemma/provider.ts +308 -0
- package/src/gemma/pseudo-command-envelope.ts +58 -0
- package/src/gemma/pseudo-tool-call-projector.ts +243 -0
- package/src/gemma/pseudo-tool-call-tag-parser.ts +153 -0
- package/src/gemma/pseudo-tool-call-types.ts +31 -0
- package/src/gemma/reasoning-projector.test.ts +52 -0
- package/src/gemma/reasoning-projector.ts +144 -0
- package/src/gemma/streaming-projection.ts +79 -0
- package/src/gemma/tool-call-argument-parser.ts +126 -0
- package/src/gemma/tool-call-projector.test.ts +227 -0
- package/src/gemma/tool-call-projector.ts +264 -0
- package/src/gemma/types.ts +27 -0
- package/src/google/index.ts +11 -0
- package/src/google/provider-compat.test.ts +19 -0
- package/src/google/provider-definition.ts +6 -0
- package/src/google/provider.ts +10 -0
- package/src/google/types.ts +5 -0
- package/src/index.ts +9 -0
- package/src/openai/adapter.test.ts +494 -0
- package/src/openai/adapter.ts +145 -0
- package/src/openai/chat-completions-chat.ts +189 -0
- package/src/openai/executor-integration.test.ts +206 -0
- package/src/openai/index.ts +21 -0
- package/src/openai/interfaces/payload-logger.ts +48 -0
- package/src/openai/loggers/console-payload-logger.test.ts +173 -0
- package/src/openai/loggers/console-payload-logger.ts +94 -0
- package/src/openai/loggers/console.ts +9 -0
- package/src/openai/loggers/file-payload-logger.test.ts +238 -0
- package/src/openai/loggers/file-payload-logger.ts +112 -0
- package/src/openai/loggers/file.ts +9 -0
- package/src/openai/loggers/index.ts +12 -0
- package/src/openai/loggers/sanitize-openai-log-data.test.ts +89 -0
- package/src/openai/loggers/sanitize-openai-log-data.ts +14 -0
- package/src/openai/message-converter.ts +22 -0
- package/src/openai/model-catalog-refresh.test.ts +92 -0
- package/src/openai/model-catalog-refresh.ts +115 -0
- package/src/openai/openai-request-format.ts +92 -0
- package/src/openai/parsers/response-parser.test.ts +407 -0
- package/src/openai/parsers/response-parser.ts +47 -0
- package/src/openai/provider-definition.test.ts +75 -0
- package/src/openai/provider-definition.ts +132 -0
- package/src/openai/provider.test.ts +1402 -0
- package/src/openai/provider.ts +237 -0
- package/src/openai/responses-chat.ts +258 -0
- package/src/openai/responses-converter.ts +112 -0
- package/src/openai/responses-parser.ts +285 -0
- package/src/openai/responses-stream-utils.ts +45 -0
- package/src/openai/responses-types.ts +195 -0
- package/src/openai/streaming/stream-assembler.ts +3 -0
- package/src/openai/streaming/stream-handler.test.ts +367 -0
- package/src/openai/streaming/stream-handler.ts +119 -0
- package/src/openai/types/api-types.ts +112 -0
- package/src/openai/types.ts +194 -0
- package/src/qwen/defaults.ts +26 -0
- package/src/qwen/index.ts +5 -0
- package/src/qwen/model-catalog-refresh.test.ts +91 -0
- package/src/qwen/model-catalog-refresh.ts +97 -0
- package/src/qwen/provider-capabilities.ts +34 -0
- package/src/qwen/provider-definition.test.ts +139 -0
- package/src/qwen/provider-definition.ts +173 -0
- package/src/qwen/provider-streaming-assembly.ts +40 -0
- package/src/qwen/provider.test.ts +640 -0
- package/src/qwen/provider.ts +293 -0
- package/src/qwen/responses-chat.ts +194 -0
- package/src/qwen/responses-converter.ts +104 -0
- package/src/qwen/responses-parser.ts +299 -0
- package/src/qwen/responses-stream-utils.ts +38 -0
- package/src/qwen/types.ts +228 -0
- package/src/shared/openai-compatible/endpoint-probe.test.ts +52 -0
- package/src/shared/openai-compatible/endpoint-probe.ts +43 -0
- package/src/shared/openai-compatible/index.ts +6 -0
- package/src/shared/openai-compatible/message-converter.test.ts +111 -0
- package/src/shared/openai-compatible/message-converter.ts +84 -0
- package/src/shared/openai-compatible/native-payload-observer.test.ts +43 -0
- package/src/shared/openai-compatible/native-payload-observer.ts +26 -0
- package/src/shared/openai-compatible/response-parser.test.ts +172 -0
- package/src/shared/openai-compatible/response-parser.ts +180 -0
- package/src/shared/openai-compatible/stream-assembler.test.ts +266 -0
- package/src/shared/openai-compatible/stream-assembler.ts +248 -0
- package/src/shared/openai-compatible/types.ts +59 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{randomUUID as e}from"node:crypto";import{SilentLogger as t}from"@robota-sdk/agent-core";function n(e){return e.map(e=>i(e))}function r(e){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))}function i(e){if(e.role===`user`)return{role:`user`,content:e.content||``};if(e.role===`assistant`)return a(e);if(e.role===`system`)return{role:`system`,content:e.content||``};if(e.role===`tool`){if(!e.toolCallId||e.toolCallId.trim().length===0)throw Error(`Tool message missing toolCallId: ${JSON.stringify(e)}`);return{role:`tool`,content:e.content||``,tool_call_id:e.toolCallId}}throw Error(`Unsupported message role: ${JSON.stringify(e)}`)}function a(e){return e.toolCalls&&e.toolCalls.length>0?{role:`assistant`,content:e.content===``?null:e.content||null,tool_calls:e.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.function.name,arguments:e.function.arguments}}))}:{role:`assistant`,content:e.content===null?null:e.content||``}}var o=class{logger;textProjector;toolCallTextProjector;constructor(e={}){this.logger=e.logger??t,this.textProjector=e.textProjector,this.toolCallTextProjector=e.toolCallTextProjector}parseResponse(e){try{let t=e.choices?.[0];if(!t)throw Error(`No choices found in OpenAI-compatible response`);return this.parseChoice(t,e.usage)}catch(e){let t=e instanceof Error?e.message:`OpenAI-compatible response parsing failed`;throw this.logger.error(`Response parsing failed`,{error:t}),Error(`OpenAI-compatible response parsing failed: ${t}`)}}parseChoice(t,n){let r=t.message,i=this.projectToolCallText(r.content||``),a=this.toolCallTextProjector?.flush(),o=this.parseNativeToolCalls(r),s=[...i.toolCalls,...a?.toolCalls??[]],c=[...o,...s];return{id:e(),state:`complete`,role:`assistant`,content:this.projectText(i.visibleText+(a?.visibleText??``)),timestamp:new Date,...c.length>0&&{toolCalls:c},...n&&{usage:this.parseUsage(n)},metadata:{finishReason:t.finish_reason||void 0,...this.buildToolTextMetadata(i,a)}}}parseNativeToolCalls(e){return e.tool_calls?.map(e=>({id:e.id,type:`function`,function:{name:e.function.name,arguments:e.function.arguments}}))||[]}parseUsage(e){return{promptTokens:e.prompt_tokens,completionTokens:e.completion_tokens,totalTokens:e.total_tokens}}parseStreamingChunk(t){try{let n=t.choices?.[0];if(!n)return null;let r=n.finish_reason,i=n.delta.tool_calls?.map(e=>({id:e.id||``,type:`function`,function:{name:e.function?.name||``,arguments:e.function?.arguments||``}}));return i?{id:e(),state:`complete`,role:`assistant`,content:``,timestamp:new Date,toolCalls:i,metadata:{isStreamChunk:!0,isComplete:r===`stop`||r===`tool_calls`}}:{id:e(),state:`complete`,role:`assistant`,content:this.projectText(n.delta.content||``),timestamp:new Date,metadata:{isStreamChunk:!0,isComplete:r===`stop`||r===`tool_calls`}}}catch(e){let t=e instanceof Error?e.message:`OpenAI-compatible chunk parsing failed`;throw this.logger.error(`Chunk parsing failed`,{error:t}),Error(`OpenAI-compatible chunk parsing failed: ${t}`)}}projectText(e){return this.textProjector?this.textProjector(e):e}projectToolCallText(e){return this.toolCallTextProjector?.project(e)??{visibleText:e,toolCalls:[],removedToolCallText:!1}}buildToolTextMetadata(e,t){let n=[e.rawToolCallText,t?.rawToolCallText].filter(e=>typeof e==`string`&&e.length>0).join(``);return{...(e.removedToolCallText||(t?.removedToolCallText??!1))&&{toolCallTextProjected:!0},...n.length>0&&{rawToolCallText:n}}}};async function s(e){let t={textParts:[],toolCallParts:new Map,projectedToolCalls:[],rawToolCallTextParts:[],toolCallTextProjected:!1,model:``,finishReason:null};for await(let n of v(e.stream,e.signal))c(t,n,e);return d(t,e),h(t,e.metadata)}function c(e,t,n){t.model&&(e.model=t.model);let r=t.choices?.[0];r&&(e.finishReason=r.finish_reason??e.finishReason,l(e,r.delta.content,n),m(e,r.delta.tool_calls??[]))}function l(e,t,n){if(!t)return;let r=f(t,n.toolCallTextProjector);p(e,r);let i=u(r.visibleText,n.textProjector);i.length!==0&&(e.textParts.push(i),n.onTextDelta?.(i))}function u(e,t){return t?t(e):e}function d(e,t){let n=t.toolCallTextProjector?.flush();if(n){p(e,n);let r=u(n.visibleText,t.textProjector);r.length>0&&(e.textParts.push(r),t.onTextDelta?.(r))}let r=t.textProjectorFlush?.();r&&(e.textParts.push(r),t.onTextDelta?.(r))}function f(e,t){return t?.project(e)??{visibleText:e,toolCalls:[],removedToolCallText:!1}}function p(e,t){t.toolCalls.length>0&&e.projectedToolCalls.push(...t.toolCalls),t.removedToolCallText&&(e.toolCallTextProjected=!0),t.rawToolCallText&&t.rawToolCallText.length>0&&e.rawToolCallTextParts.push(t.rawToolCallText)}function m(e,t){for(let n of t){let t=n.index??0,r=e.toolCallParts.get(t)??{id:``,name:``,arguments:``},i=n.function?.name??r.name;e.toolCallParts.set(t,{id:n.id??r.id,name:i,arguments:r.arguments+(n.function?.arguments??``)})}}function h(t,n={}){let r={...n};t.model&&(r.model=t.model),t.finishReason&&(r.finishReason=t.finishReason),t.toolCallTextProjected&&(r.toolCallTextProjected=!0),t.rawToolCallTextParts.length>0&&(r.rawToolCallText=t.rawToolCallTextParts.join(``));let i=g(t);return{id:e(),role:`assistant`,content:t.textParts.join(``),state:`complete`,timestamp:new Date,...i.length>0&&{toolCalls:i},...Object.keys(r).length>0&&{metadata:r}}}function g(e){return[..._(e.toolCallParts),...e.projectedToolCalls]}function _(e){return Array.from(e.entries()).sort(([e],[t])=>e-t).map(([e,t])=>({id:t.id||`call_${e}`,type:`function`,function:{name:t.name,arguments:t.arguments||`{}`}}))}async function*v(e,t){let n=e[Symbol.asyncIterator]();try{for(;!t?.aborted;){let e=await y(n,t);if(e.done||(await b(t),t?.aborted))break;yield e.value}}finally{t?.aborted&&await n.return?.()}}async function y(e,t){if(!t)return e.next();if(t.aborted)return{done:!0,value:void 0};let n,r=new Promise(e=>{n=()=>e({done:!0,value:void 0}),t.addEventListener(`abort`,n,{once:!0})});try{return await Promise.race([e.next(),r])}finally{n&&t.removeEventListener(`abort`,n)}}async function b(e){e?.aborted||await new Promise(e=>setTimeout(e,0))}async function*x(e,t){let n=t.initialSequence??0;for await(let r of e)t.onProviderNativeRawPayload?.({provider:t.provider,...t.apiSurface!==void 0&&{apiSurface:t.apiSurface},payloadKind:`stream_event`,sequence:n,payload:r}),n++,yield r}async function S(e,t=C){if(!e.baseURL)return{ok:!0,message:`Profile fields are valid; no endpoint probe configured.`};try{let n=await t(`${e.baseURL.replace(/\/$/,``)}/models`);if(!n.ok)return{ok:!1,message:`HTTP ${n.status}`};let r=((await n.json()).data??[]).map(e=>e.id).filter(e=>!!e);return{ok:!0,message:`${r.length} model(s) discovered`,models:r}}catch(e){return{ok:!1,message:e instanceof Error?e.message:String(e)}}}async function C(e){let t=await fetch(e);return{ok:t.ok,status:t.status,json:()=>t.json()}}export{n as a,o as i,x as n,r as o,s as r,S as t};
|
|
2
|
+
//# sourceMappingURL=openai-compatible-Dm4Sof9e.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-compatible-Dm4Sof9e.js","names":["exhaustive"],"sources":["../../src/shared/openai-compatible/message-converter.ts","../../src/shared/openai-compatible/response-parser.ts","../../src/shared/openai-compatible/stream-assembler.ts","../../src/shared/openai-compatible/native-payload-observer.ts","../../src/shared/openai-compatible/endpoint-probe.ts"],"sourcesContent":["import type OpenAI from 'openai';\nimport type {\n IAssistantMessage,\n IToolCall,\n IToolSchema,\n TUniversalMessage,\n} from '@robota-sdk/agent-core';\n\nexport function convertToOpenAICompatibleMessages(\n messages: TUniversalMessage[],\n): OpenAI.Chat.ChatCompletionMessageParam[] {\n return messages.map((message) => convertMessage(message));\n}\n\nexport function convertToOpenAICompatibleTools(\n tools: IToolSchema[],\n): OpenAI.Chat.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }));\n}\n\nfunction convertMessage(message: TUniversalMessage): OpenAI.Chat.ChatCompletionMessageParam {\n if (message.role === 'user') {\n return {\n role: 'user',\n content: message.content || '',\n };\n }\n\n if (message.role === 'assistant') {\n return convertAssistantMessage(message);\n }\n\n if (message.role === 'system') {\n return {\n role: 'system',\n content: message.content || '',\n };\n }\n\n if (message.role === 'tool') {\n if (!message.toolCallId || message.toolCallId.trim().length === 0) {\n throw new Error(`Tool message missing toolCallId: ${JSON.stringify(message)}`);\n }\n return {\n role: 'tool',\n content: message.content || '',\n tool_call_id: message.toolCallId,\n };\n }\n\n const exhaustive: never = message;\n throw new Error(`Unsupported message role: ${JSON.stringify(exhaustive)}`);\n}\n\nfunction convertAssistantMessage(\n message: IAssistantMessage,\n): OpenAI.Chat.ChatCompletionAssistantMessageParam {\n if (message.toolCalls && message.toolCalls.length > 0) {\n return {\n role: 'assistant',\n content: message.content === '' ? null : message.content || null,\n tool_calls: message.toolCalls.map((toolCall: IToolCall) => ({\n id: toolCall.id,\n type: 'function',\n function: {\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n },\n })),\n };\n }\n\n return {\n role: 'assistant',\n content: message.content === null ? null : message.content || '',\n };\n}\n","import { randomUUID } from 'node:crypto';\nimport type OpenAI from 'openai';\nimport type { ILogger, IToolCall, TUniversalMessage } from '@robota-sdk/agent-core';\nimport { SilentLogger } from '@robota-sdk/agent-core';\nimport type {\n IOpenAICompatibleToolCallTextProjector,\n IOpenAICompatibleToolCallTextProjection,\n TOpenAICompatibleTextProjector,\n} from './types';\n\nexport interface IOpenAICompatibleResponseParserOptions {\n logger?: ILogger;\n textProjector?: TOpenAICompatibleTextProjector;\n toolCallTextProjector?: IOpenAICompatibleToolCallTextProjector;\n}\n\nexport class OpenAICompatibleResponseParser {\n private readonly logger: ILogger;\n private readonly textProjector?: TOpenAICompatibleTextProjector;\n private readonly toolCallTextProjector?: IOpenAICompatibleToolCallTextProjector;\n\n constructor(options: IOpenAICompatibleResponseParserOptions = {}) {\n this.logger = options.logger ?? SilentLogger;\n this.textProjector = options.textProjector;\n this.toolCallTextProjector = options.toolCallTextProjector;\n }\n\n parseResponse(response: OpenAI.Chat.ChatCompletion): TUniversalMessage {\n try {\n const choice = response.choices?.[0];\n if (!choice) {\n throw new Error('No choices found in OpenAI-compatible response');\n }\n\n return this.parseChoice(choice, response.usage);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'OpenAI-compatible response parsing failed';\n this.logger.error('Response parsing failed', { error: message });\n throw new Error(`OpenAI-compatible response parsing failed: ${message}`);\n }\n }\n\n private parseChoice(\n choice: OpenAI.Chat.ChatCompletion.Choice,\n usage: OpenAI.CompletionUsage | undefined,\n ): TUniversalMessage {\n const message = choice.message;\n const toolTextProjection = this.projectToolCallText(message.content || '');\n const toolTextFlush = this.toolCallTextProjector?.flush();\n const nativeToolCalls = this.parseNativeToolCalls(message);\n const projectedToolCalls = [\n ...toolTextProjection.toolCalls,\n ...(toolTextFlush?.toolCalls ?? []),\n ];\n const toolCalls = [...nativeToolCalls, ...projectedToolCalls];\n\n return {\n id: randomUUID(),\n state: 'complete',\n role: 'assistant',\n content: this.projectText(\n toolTextProjection.visibleText + (toolTextFlush?.visibleText ?? ''),\n ),\n timestamp: new Date(),\n ...(toolCalls.length > 0 && { toolCalls }),\n ...(usage && { usage: this.parseUsage(usage) }),\n metadata: {\n finishReason: choice.finish_reason || undefined,\n ...this.buildToolTextMetadata(toolTextProjection, toolTextFlush),\n },\n };\n }\n\n private parseNativeToolCalls(message: OpenAI.Chat.ChatCompletionMessage): IToolCall[] {\n return (\n message.tool_calls?.map((toolCall) => ({\n id: toolCall.id,\n type: 'function' as const,\n function: {\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n },\n })) || []\n );\n }\n\n private parseUsage(usage: OpenAI.CompletionUsage): {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n } {\n return {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n }\n\n parseStreamingChunk(chunk: OpenAI.Chat.ChatCompletionChunk): TUniversalMessage | null {\n try {\n const choice = chunk.choices?.[0];\n if (!choice) {\n return null;\n }\n\n const finishReason = choice.finish_reason;\n const toolCalls = choice.delta.tool_calls?.map((toolCall) => ({\n id: toolCall.id || '',\n type: 'function' as const,\n function: {\n name: toolCall.function?.name || '',\n arguments: toolCall.function?.arguments || '',\n },\n }));\n\n if (toolCalls) {\n return {\n id: randomUUID(),\n state: 'complete',\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n toolCalls,\n metadata: {\n isStreamChunk: true,\n isComplete: finishReason === 'stop' || finishReason === 'tool_calls',\n },\n };\n }\n\n return {\n id: randomUUID(),\n state: 'complete',\n role: 'assistant',\n content: this.projectText(choice.delta.content || ''),\n timestamp: new Date(),\n metadata: {\n isStreamChunk: true,\n isComplete: finishReason === 'stop' || finishReason === 'tool_calls',\n },\n };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'OpenAI-compatible chunk parsing failed';\n this.logger.error('Chunk parsing failed', { error: message });\n throw new Error(`OpenAI-compatible chunk parsing failed: ${message}`);\n }\n }\n\n private projectText(text: string): string {\n return this.textProjector ? this.textProjector(text) : text;\n }\n\n private projectToolCallText(text: string): IOpenAICompatibleToolCallTextProjection {\n return (\n this.toolCallTextProjector?.project(text) ?? {\n visibleText: text,\n toolCalls: [],\n removedToolCallText: false,\n }\n );\n }\n\n private buildToolTextMetadata(\n projection: IOpenAICompatibleToolCallTextProjection,\n flush: IOpenAICompatibleToolCallTextProjection | undefined,\n ): Record<string, string | boolean | undefined> {\n const rawToolCallText = [projection.rawToolCallText, flush?.rawToolCallText]\n .filter((text): text is string => typeof text === 'string' && text.length > 0)\n .join('');\n const removedToolCallText =\n projection.removedToolCallText || (flush?.removedToolCallText ?? false);\n\n return {\n ...(removedToolCallText && { toolCallTextProjected: true }),\n ...(rawToolCallText.length > 0 && { rawToolCallText }),\n };\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type OpenAI from 'openai';\nimport type { IToolCall, TUniversalMessage } from '@robota-sdk/agent-core';\nimport type {\n IOpenAICompatibleToolCallTextProjection,\n IOpenAICompatibleStreamAssemblyOptions,\n TOpenAICompatibleTextProjector,\n} from './types';\n\ninterface IToolCallPart {\n id: string;\n name: string;\n arguments: string;\n}\n\ninterface IAssemblyState {\n textParts: string[];\n toolCallParts: Map<number, IToolCallPart>;\n projectedToolCalls: IToolCall[];\n rawToolCallTextParts: string[];\n toolCallTextProjected: boolean;\n model: string;\n finishReason: string | null;\n}\n\nexport async function assembleOpenAICompatibleStream(\n options: IOpenAICompatibleStreamAssemblyOptions,\n): Promise<TUniversalMessage> {\n const state: IAssemblyState = {\n textParts: [],\n toolCallParts: new Map(),\n projectedToolCalls: [],\n rawToolCallTextParts: [],\n toolCallTextProjected: false,\n model: '',\n finishReason: null,\n };\n\n for await (const chunk of streamWithAbort(options.stream, options.signal)) {\n applyChunk(state, chunk, options);\n }\n applyProjectedTextFlush(state, options);\n\n return buildMessage(state, options.metadata);\n}\n\nfunction applyChunk(\n state: IAssemblyState,\n chunk: OpenAI.Chat.ChatCompletionChunk,\n options: IOpenAICompatibleStreamAssemblyOptions,\n): void {\n if (chunk.model) {\n state.model = chunk.model;\n }\n\n const choice = chunk.choices?.[0];\n if (!choice) {\n return;\n }\n\n state.finishReason = choice.finish_reason ?? state.finishReason;\n applyTextDelta(state, choice.delta.content, options);\n applyToolCallDeltas(state, choice.delta.tool_calls ?? []);\n}\n\nfunction applyTextDelta(\n state: IAssemblyState,\n content: string | null | undefined,\n options: IOpenAICompatibleStreamAssemblyOptions,\n): void {\n if (!content) {\n return;\n }\n\n const toolProjection = projectToolCallText(content, options.toolCallTextProjector);\n applyToolCallTextProjection(state, toolProjection);\n const visibleContent = projectText(toolProjection.visibleText, options.textProjector);\n if (visibleContent.length === 0) {\n return;\n }\n\n state.textParts.push(visibleContent);\n options.onTextDelta?.(visibleContent);\n}\n\nfunction projectText(text: string, projector?: TOpenAICompatibleTextProjector): string {\n return projector ? projector(text) : text;\n}\n\nfunction applyProjectedTextFlush(\n state: IAssemblyState,\n options: IOpenAICompatibleStreamAssemblyOptions,\n): void {\n const toolProjection = options.toolCallTextProjector?.flush();\n if (toolProjection) {\n applyToolCallTextProjection(state, toolProjection);\n const visibleToolText = projectText(toolProjection.visibleText, options.textProjector);\n if (visibleToolText.length > 0) {\n state.textParts.push(visibleToolText);\n options.onTextDelta?.(visibleToolText);\n }\n }\n\n const visibleContent = options.textProjectorFlush?.();\n if (!visibleContent) {\n return;\n }\n\n state.textParts.push(visibleContent);\n options.onTextDelta?.(visibleContent);\n}\n\nfunction projectToolCallText(\n text: string,\n projector: IOpenAICompatibleStreamAssemblyOptions['toolCallTextProjector'],\n): IOpenAICompatibleToolCallTextProjection {\n return (\n projector?.project(text) ?? {\n visibleText: text,\n toolCalls: [],\n removedToolCallText: false,\n }\n );\n}\n\nfunction applyToolCallTextProjection(\n state: IAssemblyState,\n projection: IOpenAICompatibleToolCallTextProjection,\n): void {\n if (projection.toolCalls.length > 0) {\n state.projectedToolCalls.push(...projection.toolCalls);\n }\n if (projection.removedToolCallText) {\n state.toolCallTextProjected = true;\n }\n if (projection.rawToolCallText && projection.rawToolCallText.length > 0) {\n state.rawToolCallTextParts.push(projection.rawToolCallText);\n }\n}\n\nfunction applyToolCallDeltas(\n state: IAssemblyState,\n deltas: OpenAI.Chat.ChatCompletionChunk.Choice.Delta.ToolCall[],\n): void {\n for (const delta of deltas) {\n const index = delta.index ?? 0;\n const current = state.toolCallParts.get(index) ?? { id: '', name: '', arguments: '' };\n const nextName = delta.function?.name ?? current.name;\n state.toolCallParts.set(index, {\n id: delta.id ?? current.id,\n name: nextName,\n arguments: current.arguments + (delta.function?.arguments ?? ''),\n });\n }\n}\n\nfunction buildMessage(\n state: IAssemblyState,\n metadata: Record<string, string | number | boolean> = {},\n): TUniversalMessage {\n const resultMetadata: NonNullable<TUniversalMessage['metadata']> = { ...metadata };\n if (state.model) {\n resultMetadata['model'] = state.model;\n }\n if (state.finishReason) {\n resultMetadata['finishReason'] = state.finishReason;\n }\n if (state.toolCallTextProjected) {\n resultMetadata['toolCallTextProjected'] = true;\n }\n if (state.rawToolCallTextParts.length > 0) {\n resultMetadata['rawToolCallText'] = state.rawToolCallTextParts.join('');\n }\n\n const toolCalls = buildAllToolCalls(state);\n\n return {\n id: randomUUID(),\n role: 'assistant',\n content: state.textParts.join(''),\n state: 'complete',\n timestamp: new Date(),\n ...(toolCalls.length > 0 && { toolCalls }),\n ...(Object.keys(resultMetadata).length > 0 && { metadata: resultMetadata }),\n };\n}\n\nfunction buildAllToolCalls(state: IAssemblyState): IToolCall[] {\n return [...buildToolCalls(state.toolCallParts), ...state.projectedToolCalls];\n}\n\nfunction buildToolCalls(toolCallParts: Map<number, IToolCallPart>): IToolCall[] {\n return Array.from(toolCallParts.entries())\n .sort(([left], [right]) => left - right)\n .map(([index, toolCall]) => ({\n id: toolCall.id || `call_${index}`,\n type: 'function',\n function: {\n name: toolCall.name,\n arguments: toolCall.arguments || '{}',\n },\n }));\n}\n\nasync function* streamWithAbort<T>(\n source: AsyncIterable<T>,\n signal?: AbortSignal,\n): AsyncGenerator<T> {\n const iterator = source[Symbol.asyncIterator]();\n try {\n while (!signal?.aborted) {\n const item = await nextStreamItem(iterator, signal);\n if (item.done) break;\n await yieldToMacrotask(signal);\n if (signal?.aborted) break;\n yield item.value;\n }\n } finally {\n if (signal?.aborted) {\n await iterator.return?.();\n }\n }\n}\n\nasync function nextStreamItem<T>(\n iterator: AsyncIterator<T>,\n signal?: AbortSignal,\n): Promise<IteratorResult<T>> {\n if (!signal) return iterator.next();\n if (signal.aborted) return { done: true, value: undefined as T };\n\n let abortListener: (() => void) | undefined;\n const aborted = new Promise<IteratorResult<T>>((resolve) => {\n abortListener = (): void => resolve({ done: true, value: undefined as T });\n signal.addEventListener('abort', abortListener, { once: true });\n });\n\n try {\n return await Promise.race([iterator.next(), aborted]);\n } finally {\n if (abortListener) signal.removeEventListener('abort', abortListener);\n }\n}\n\nasync function yieldToMacrotask(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return;\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n}\n","import type { TProviderNativeRawPayloadCallback } from '@robota-sdk/agent-core';\n\nexport interface IObserveProviderNativeRawPayloadStreamOptions {\n provider: string;\n apiSurface?: string;\n onProviderNativeRawPayload?: TProviderNativeRawPayloadCallback;\n initialSequence?: number;\n}\n\nexport async function* observeProviderNativeRawPayloadStream<TPayload extends object>(\n stream: AsyncIterable<TPayload>,\n options: IObserveProviderNativeRawPayloadStreamOptions,\n): AsyncIterable<TPayload> {\n let sequence = options.initialSequence ?? 0;\n for await (const payload of stream) {\n options.onProviderNativeRawPayload?.({\n provider: options.provider,\n ...(options.apiSurface !== undefined && { apiSurface: options.apiSurface }),\n payloadKind: 'stream_event',\n sequence,\n payload,\n });\n sequence++;\n yield payload;\n }\n}\n","import type { IProviderProfileConfig, IProviderProbeResult } from '@robota-sdk/agent-core';\n\nexport interface IOpenAICompatibleModelsResponse {\n data?: Array<{ id?: string }>;\n}\n\nexport interface IOpenAICompatibleFetchResponse {\n ok: boolean;\n status: number;\n json: () => Promise<IOpenAICompatibleModelsResponse>;\n}\n\nexport type TOpenAICompatibleFetch = (url: string) => Promise<IOpenAICompatibleFetchResponse>;\n\nexport async function probeOpenAICompatibleProfile(\n profile: IProviderProfileConfig,\n fetcher: TOpenAICompatibleFetch = defaultOpenAICompatibleFetch,\n): Promise<IProviderProbeResult> {\n if (!profile.baseURL) {\n return { ok: true, message: 'Profile fields are valid; no endpoint probe configured.' };\n }\n\n try {\n const response = await fetcher(`${profile.baseURL.replace(/\\/$/, '')}/models`);\n if (!response.ok) {\n return { ok: false, message: `HTTP ${response.status}` };\n }\n const body = await response.json();\n const models = (body.data ?? []).map((item) => item.id).filter((id): id is string => !!id);\n return { ok: true, message: `${models.length} model(s) discovered`, models };\n } catch (error) {\n return { ok: false, message: error instanceof Error ? error.message : String(error) };\n }\n}\n\nasync function defaultOpenAICompatibleFetch(url: string): Promise<IOpenAICompatibleFetchResponse> {\n const response = await fetch(url);\n return {\n ok: response.ok,\n status: response.status,\n json: () => response.json() as Promise<IOpenAICompatibleModelsResponse>,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./openai-compatible-BYfyY5lb.cjs`);let n=require(`node:crypto`),r=require(`@robota-sdk/agent-core`),i=require(`openai`);i=e.t(i,1);var a=class{parser;constructor(e){this.parser=new t.i({logger:e})}parseResponse(e){try{return this.parser.parseResponse(e)}catch(e){let t=o(e instanceof Error?e.message:`OpenAI response parsing failed`);throw Error(`OpenAI response parsing failed: ${t}`)}}parseStreamingChunk(e){try{return this.parser.parseStreamingChunk(e)}catch(e){let t=o(e instanceof Error?e.message:`OpenAI chunk parsing failed`);throw Error(`OpenAI chunk parsing failed: ${t}`)}}};function o(e){return e.replace(/^OpenAI-compatible response parsing failed: /,``).replace(/^OpenAI-compatible chunk parsing failed: /,``).replace(`OpenAI-compatible response`,`OpenAI response`)}function s(e){if(e.responseFormat===void 0||e.responseFormat===`text`)return;if(e.responseFormat===`json_object`)return{type:`json_object`};let t=l(e);return{type:`json_schema`,json_schema:{name:t.name,schema:t.schema,...t.description!==void 0&&{description:t.description},...t.strict!==void 0&&{strict:t.strict}}}}function c(e){if(e.responseFormat===void 0||e.responseFormat===`text`)return;if(e.responseFormat===`json_object`)return{format:{type:`json_object`}};let t=l(e);return{format:{type:`json_schema`,name:t.name,schema:t.schema,...t.description!==void 0&&{description:t.description},...t.strict!==void 0&&{strict:t.strict}}}}function l(e){let t=e.jsonSchema;if(e.responseFormat!==`json_schema`)throw Error(`Unsupported OpenAI response format: ${e.responseFormat}`);if(!t?.schema)throw Error(`OpenAI jsonSchema.schema is required when responseFormat is json_schema`);return{name:t.name,schema:t.schema,...t.description!==void 0&&{description:t.description},...t.strict!==void 0&&{strict:t.strict}}}function u(e){return t.a(e)}function ee(e){return t.o(e)}async function te(e){let t=h(e.client);try{let n=f(e);if(e.chatOptions?.onTextDelta??e.onTextDelta)return await p(t,e,{...n,stream:!0});await m(e,n,`chat`),e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:n});let r=await t.chat.completions.create(n);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`response`,payload:r}),e.responseParser.parseResponse(r)}catch(e){let t=e.message||`OpenAI API request failed`;throw Error(`OpenAI chat failed: ${t}`)}}async function*d(e){let n=h(e.client);try{let r={...f(e),stream:!0};await m(e,r,`stream`),e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r});let i=await n.chat.completions.create(r,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0);for await(let n of t.n(i,{provider:`openai`,apiSurface:`chat-completions`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload})){let t=e.responseParser.parseStreamingChunk(n);t&&(yield t)}}catch(e){let t=e.message||`OpenAI API request failed`;throw Error(`OpenAI stream failed: ${t}`)}}function f(e){let t=u(e.messages),n=e.chatOptions?.model??e.providerOptions.defaultModel;if(!n)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let r=s(e.providerOptions);return{model:n,messages:t,...e.chatOptions?.temperature!==void 0&&{temperature:e.chatOptions.temperature},...e.chatOptions?.maxTokens!==void 0&&{max_tokens:e.chatOptions.maxTokens},...e.chatOptions?.tools&&{tools:ee(e.chatOptions.tools),tool_choice:`auto`},...r!==void 0&&{response_format:r}}}async function p(e,n,r){try{return await m(n,r,`stream`),n.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r}),t.r({stream:t.n(await e.chat.completions.create(r,n.chatOptions?.signal?{signal:n.chatOptions.signal}:void 0),{provider:`openai`,apiSurface:`chat-completions`,onProviderNativeRawPayload:n.chatOptions?.onProviderNativeRawPayload}),onTextDelta:n.chatOptions?.onTextDelta??n.onTextDelta,signal:n.chatOptions?.signal})}catch(e){let t=e.message||`OpenAI streaming request failed`;throw Error(`OpenAI stream failed: ${t}`)}}async function m(e,t,n){if(!e.payloadLogger?.isEnabled())return;let r={model:t.model,messagesCount:t.messages.length,hasTools:!!t.tools,temperature:t.temperature??void 0,maxTokens:t.max_tokens??void 0,timestamp:new Date().toISOString()};await e.payloadLogger.logPayload(r,n)}function h(e){if(!e)throw Error(`OpenAI client not available. Either provide a client/apiKey or use an executor.`);return e}function g(e){return e.flatMap(e=>v(e))}function _(e,t){let n=e?.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.parameters,strict:t??!1}))??[];return n.length>0?n:void 0}function v(e){if(e.role===`user`)return[S(`user`,b(e.content,e.parts))];if(e.role===`system`)return[S(`system`,e.content)];if(e.role===`tool`){if(!e.toolCallId||e.toolCallId.trim().length===0)throw Error(`Tool message missing toolCallId: ${JSON.stringify(e)}`);return[{type:`function_call_output`,call_id:e.toolCallId,output:e.content||``}]}return y(e)}function y(e){let t=[];e.content&&e.content.length>0&&t.push(S(`assistant`,e.content));for(let n of e.toolCalls??[])t.push({type:`function_call`,call_id:n.id,name:n.function.name,arguments:n.function.arguments});return t.length===0&&t.push(S(`assistant`,``)),t}function b(e,t){if(!t||t.length===0)return e;let n=t.map(e=>x(e));return e.length>0&&!t.some(e=>e.type===`text`)?[{type:`input_text`,text:e},...n]:n}function x(e){return e.type===`text`?{type:`input_text`,text:e.text}:e.type===`image_uri`?{type:`input_image`,image_url:e.uri}:{type:`input_image`,image_url:`data:${e.mimeType};base64,${e.data}`}}function S(e,t){return{role:e,content:t}}async function*ne(e,t){let n=e[Symbol.asyncIterator]();try{for(;!t?.aborted;){let e=await re(n,t);if(e.done||t?.aborted)break;yield e.value}}finally{t?.aborted&&await n.return?.()}}async function re(e,t){if(!t)return e.next();if(t.aborted)return{done:!0,value:void 0};let n,r=new Promise(e=>{n=()=>e({done:!0,value:void 0}),t.addEventListener(`abort`,n,{once:!0})});try{return await Promise.race([e.next(),r])}finally{n&&t.removeEventListener(`abort`,n)}}function ie(e){I(e);let t=e.output??[];return C({content:e.output_text??O(t),toolCalls:T(t),response:e,reasoning:j(t)})}async function ae(e){let t={textParts:[],toolCalls:[],reasoning:N()};for await(let n of ne(e.stream,e.signal))oe(t,n,e.onTextDelta);return t.completedResponse===void 0?C({content:t.textParts.join(``),toolCalls:t.toolCalls,reasoning:t.reasoning}):ce(t)}function oe(e,t,n){if(t.type===`response.output_text.delta`){e.textParts.push(t.delta),n?.(t.delta);return}if(t.type===`response.completed`){e.completedResponse=t.response,P(e.reasoning,j(t.response.output??[]));return}if(t.type===`response.output_item.done`){se(e,t.item);return}if(t.type===`response.error`||t.type===`response.failed`||t.type===`response.incomplete`)throw Error(`OpenAI Responses API failed: ${L(t)}`)}function se(e,t){if(E(t)){e.toolCalls.push(D(t));return}M(t)&&P(e.reasoning,j([t]))}function ce(e){let t=e.completedResponse;if(t===void 0)throw Error(`OpenAI Responses stream completed without response metadata`);I(t);let n=t.output??[],r=T(n),i=e.textParts.length>0?e.textParts.join(``):t.output_text??O(n),a=j(n);return P(a,e.reasoning),C({content:i,toolCalls:r.length>0?r:e.toolCalls,response:t,reasoning:a})}function C(e){return{id:(0,n.randomUUID)(),role:`assistant`,content:e.content,state:`complete`,timestamp:new Date,...e.toolCalls.length>0&&{toolCalls:e.toolCalls},...e.response?.usage!==void 0&&{usage:w(e.response.usage)},metadata:le(e.response,e.reasoning)}}function le(e,t){return{providerApiSurface:`responses`,...e?.id!==void 0&&{responseId:e.id},...e?.model!==void 0&&{model:e.model},...e?.status!==void 0&&{finishReason:e.status},...t.reasoningSummaryCount>0&&{reasoningSummaryCount:t.reasoningSummaryCount,reasoningSummaries:t.reasoningSummaries},...t.hasEncryptedReasoning&&{hasEncryptedReasoning:!0}}}function w(e){return{promptTokens:e.input_tokens??0,completionTokens:e.output_tokens??0,totalTokens:e.total_tokens??0}}function T(e){return e.filter(E).map(e=>D(e))}function E(e){return e.type===`function_call`&&`call_id`in e&&`name`in e&&`arguments`in e}function D(e){return{id:e.call_id,type:`function`,function:{name:e.name,arguments:e.arguments}}}function O(e){return e.filter(A).flatMap(e=>e.content).map(k).join(``)}function k(e){return e.type===`refusal`?e.refusal:e.text}function A(e){return e.type===`message`&&`content`in e&&Array.isArray(e.content)}function j(e){let t=N();for(let n of e){if(!M(n))continue;let e=n.summary?.map(e=>e.text).filter(F)??[];t.reasoningSummaryCount+=e.length,t.reasoningSummaries.push(...e),t.hasEncryptedReasoning=t.hasEncryptedReasoning||!!n.encrypted_content}return t}function M(e){return e.type===`reasoning`}function N(){return{reasoningSummaryCount:0,reasoningSummaries:[],hasEncryptedReasoning:!1}}function P(e,t){e.reasoningSummaryCount+=t.reasoningSummaryCount,e.reasoningSummaries.push(...t.reasoningSummaries),e.hasEncryptedReasoning=e.hasEncryptedReasoning||t.hasEncryptedReasoning}function F(e){return e!==void 0}function I(e){if(e.status===`failed`||e.status===`incomplete`)throw Error(`OpenAI Responses API failed: ${e.error?.message??e.status}`)}function L(e){return e.message??e.error?.message??e.response?.error?.message??`unknown error`}async function R(e){let t=e.chatOptions?.onTextDelta??e.onTextDelta;if(t)return B({...e,chatOptions:{...e.chatOptions,onTextDelta:t}});if(!e.client)throw Error(`OpenAI Responses client not available.`);try{let t=V(e);e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`request`,payload:t});let n=await e.client.responses.create(t,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`response`,payload:n}),ie(n)}catch(e){let t=e.message||`OpenAI Responses API request failed`;throw Error(`OpenAI responses failed: ${t}`)}}async function*z(e){let t={deltas:[]},n=e.chatOptions?.onTextDelta??e.onTextDelta,r=B({...e,chatOptions:{...e.chatOptions,onTextDelta:e=>{n?.(e),ue(t,U(e))}}}).then(e=>de(t,e)).catch(e=>fe(t,he(e)));yield*W(t),await r}async function B(e){if(!e.client)throw Error(`OpenAI Responses client not available.`);try{let n=H(e);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`request`,payload:n}),ae({stream:t.n(await e.client.responses.create(n,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0),{provider:`openai`,apiSurface:`responses`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload}),onTextDelta:e.chatOptions?.onTextDelta,signal:e.chatOptions?.signal})}catch(e){let t=e.message||`OpenAI Responses streaming request failed`;throw Error(`OpenAI responses stream failed: ${t}`)}}function V(e){let t=e.chatOptions?.model??e.providerOptions.defaultModel;if(!t)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let n=_(e.chatOptions?.tools,e.providerOptions.strictTools),r=c(e.providerOptions);return{model:t,input:g(e.messages),...n!==void 0&&{tools:n,tool_choice:`auto`},...e.chatOptions?.temperature!==void 0&&{temperature:e.chatOptions.temperature},...e.chatOptions?.maxTokens!==void 0&&{max_output_tokens:e.chatOptions.maxTokens},...r!==void 0&&{text:r},...e.providerOptions.reasoning!==void 0&&{reasoning:e.providerOptions.reasoning},...e.providerOptions.includeEncryptedReasoning===!0&&{include:[`reasoning.encrypted_content`]},...e.providerOptions.store!==void 0&&{store:e.providerOptions.store}}}function H(e){return{...V(e),stream:!0}}function U(e){return{id:(0,n.randomUUID)(),role:`assistant`,content:e,state:`complete`,timestamp:new Date,metadata:{providerApiSurface:`responses`,isStreamChunk:!0,isComplete:!1}}}async function*W(e){for(;;){let t=e.deltas.shift();if(t!==void 0){yield t;continue}if(e.error!==void 0)throw e.error;if(e.finalMessage!==void 0){yield me(e.finalMessage);return}await pe(e)}}function ue(e,t){e.deltas.push(t),G(e)}function de(e,t){e.finalMessage=t,G(e)}function fe(e,t){e.error=t,G(e)}function pe(e){return new Promise(t=>{e.wake=t})}function G(e){e.wake?.(),e.wake=void 0}function me(e){return{...e,content:``,metadata:{...e.metadata,isStreamChunk:!0,isComplete:!0}}}function he(e){return e instanceof Error?e:Error(String(e))}var K=class extends r.AbstractAIProvider{name=`openai`;version=`1.0.0`;client;options;apiSurface;payloadLogger;responseParser;onTextDelta;constructor(e){if(super(e.logger||r.SilentLogger),this.options=e,this.apiSurface=ge(e),_e(this.apiSurface,e.nativeWebTools),e.executor&&(this.executor=e.executor),!this.executor)if(e.client)this.client=e.client;else if(e.apiKey)this.client=new i.default({apiKey:e.apiKey,...e.organization&&{organization:e.organization},...e.timeout&&{timeout:e.timeout},...e.baseURL&&{baseURL:e.baseURL}});else throw Error(`Either OpenAI client, apiKey, or executor is required`);this.responseParser=new a(this.logger),this.payloadLogger=e.payloadLogger}async chat(e,t){if(this.validateMessages(e),this.validateNativeWebTools(t?.nativeWebTools),this.executor)try{return await this.executeViaExecutorOrDirect(e,t)}catch(e){throw this.logger.error(`OpenAI Provider executor chat error:`,e instanceof Error?e.message:String(e)),e}return this.apiSurface===`responses`?R({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,onTextDelta:this.onTextDelta}):te({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,payloadLogger:this.payloadLogger,responseParser:this.responseParser,onTextDelta:this.onTextDelta})}async*chatStream(e,t){if(this.validateNativeWebTools(t?.nativeWebTools),this.executor)try{yield*this.executeStreamViaExecutorOrDirect(e,t);return}catch(e){throw this.logger.error(`OpenAI Provider executor stream error:`,e instanceof Error?e.message:String(e)),e}if(this.apiSurface===`responses`){yield*z({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,onTextDelta:this.onTextDelta});return}yield*d({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,payloadLogger:this.payloadLogger,responseParser:this.responseParser,onTextDelta:this.onTextDelta})}supportsTools(){return!0}getCapabilities(){let e=this.apiSurface===`chat-completions`?`openai-compatible-chat-completions`:`openai-responses`;return{functionCalling:{supported:!0},nativeWebTools:{webSearch:{supported:!1,enabled:!1,source:e,reason:q(this.apiSurface,`search`)},webFetch:{supported:!1,enabled:!1,source:e,reason:q(this.apiSurface,`fetch`)}}}}validateConfig(){return!!this.client&&!!this.options}async dispose(){}validateMessages(e){super.validateMessages(e);for(let t of e)if(t.role===`assistant`){let e=t;if(e.toolCalls&&e.toolCalls.length>0&&e.content===``)continue}}};function ge(e){return e.apiSurface===void 0?e.baseURL?`chat-completions`:`responses`:e.apiSurface}function q(e,t){return e===`chat-completions`?`OpenAI-compatible Chat Completions endpoints support declared function tools, not provider-native web ${t}.`:`OpenAI Responses native web ${t} is not wired in this Robota provider version.`}function _e(e,t){if(!(t?.webSearch!==!0&&t?.webFetch!==!0))throw Error(`Provider openai native web search/fetch is not supported for apiSurface ${e} in this Robota provider version.`)}var ve=class{static filterMessagesForOpenAI(e){return e.filter(e=>e.role===`user`||e.role===`assistant`||e.role===`system`?!0:e.role===`tool`?!!(e.toolCallId&&e.toolCallId.trim()!==``&&e.toolCallId!==`unknown`):!1)}static toOpenAIFormat(e){return this.filterMessagesForOpenAI(e).map(e=>this.convertMessage(e))}static convertMessage(e){let t=e.role;if(t===`user`)return{role:`user`,content:e.content};if(t===`assistant`){let t=e;return t.toolCalls&&t.toolCalls.length>0?{role:`assistant`,content:t.content===``?null:t.content||null,tool_calls:t.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.function.name,arguments:e.function.arguments}}))}:{role:`assistant`,content:t.content===null||t.content===``?null:t.content||``}}if(t===`system`)return{role:`system`,content:e.content};if(t===`tool`){if(!e.toolCallId||e.toolCallId.trim()===``)throw Error(`Tool message missing toolCallId: ${JSON.stringify(e)}`);return{role:`tool`,content:e.content,tool_call_id:e.toolCallId}}throw Error(`Unsupported message role: ${t}`)}static addSystemPromptIfNeeded(e,t){return!t||e.some(e=>e.role===`system`)?e:[{role:`system`,content:t},...e]}};const J=`https://platform.openai.com/docs/api-reference/models/list`;async function Y(e,t={}){if(!e.apiKey)return X(`OpenAI model catalog refresh requires apiKey.`);let n=t.fetcher??Se,r=t.now??(()=>new Date),i=ye(e.baseURL);try{let t=await n(i,{headers:{Authorization:`Bearer ${e.apiKey}`}});if(!t.ok)return X(xe(t));let a=be(await t.json());return{status:`live`,entries:a,lastVerifiedAt:r().toISOString(),sourceUrl:J,message:`${a.length} OpenAI model(s) discovered.`}}catch(e){return X(e instanceof Error?e.message:String(e))}}function ye(e){return e?`${e.replace(/\/$/,``)}/models`:`https://api.openai.com/v1/models`}function be(e){return(e.data??[]).map(e=>e.id).filter(e=>e!==void 0&&e.trim().length>0).map(e=>({id:e,displayName:e,lifecycle:`active`}))}function xe(e){let t=e.statusText?` ${e.statusText}`:``;return`OpenAI model catalog refresh failed: HTTP ${e.status}${t}`}function X(e){return{status:`unavailable`,sourceUrl:J,message:e}}async function Se(e,t){let n=await fetch(e,t);return{ok:n.ok,status:n.status,statusText:n.statusText,json:()=>n.json()}}const Z=`$ENV:OPENAI_API_KEY`,Ce=[{kind:`api-key`,label:`OpenAI API keys`,url:`https://platform.openai.com/api-keys`,sourceUrl:`https://developers.openai.com/api/reference/overview#authentication`,lastVerifiedAt:`2026-05-08`}];function we(){return{type:`openai`,displayName:`OpenAI`,description:`Official OpenAI Responses API provider`,defaults:{apiKey:Z},modelCatalog:{status:`unavailable`,sourceUrl:`https://platform.openai.com/docs/api-reference/models/list`,message:`OpenAI model availability should be discovered live from GET /v1/models.`},setupHelpLinks:Ce,setupSteps:[{key:`model`,title:`OpenAI model`,required:!0},{key:`apiKey`,title:`OpenAI API key`,defaultValue:Z,masked:!0}],requiresApiKey:!0,probeProfile:t.t,refreshModelCatalog:({profile:e})=>Y(e),modelCatalogCacheTtlSeconds:86400,createProvider:e=>{let t=Te(e.options),n=Ee(e.options);return De(e.baseURL,t,n),new K({apiKey:Q(e.apiKey),...e.baseURL!==void 0&&{baseURL:e.baseURL},...e.timeout!==void 0&&{timeout:e.timeout},...t!==void 0&&{apiSurface:t},...n!==void 0&&{nativeWebTools:n},defaultModel:e.model})}}}function Q(e){if(!e)throw Error(`Provider openai requires apiKey`);return e}function Te(e){let t=e?.apiSurface;if(t===`responses`||t===`chat-completions`)return t}function Ee(e){let t=$(e?.nativeWebTools)??$(e?.builtInWebTools);if(t!==void 0)return t}function $(e){if(e==null||e instanceof Date||Array.isArray(e)||typeof e!=`object`)return;let t=e.webSearch,n=e.webFetch;return{...typeof t==`boolean`&&{webSearch:t},...typeof n==`boolean`&&{webFetch:n}}}function De(e,t,n){if(!(n?.webSearch!==!0&&n?.webFetch!==!0))throw Error(e!==void 0||t===`chat-completions`?`Provider openai profile uses an OpenAI-compatible Chat Completions endpoint; native web search/fetch is not supported for this profile. Use Robota local WebSearch/WebFetch tools or a provider with documented hosted web support.`:`Provider openai native web search/fetch is not wired in this Robota provider version. Use Robota local WebSearch/WebFetch tools or a provider with documented hosted web support.`)}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return ve}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return we}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Z}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../qwen-CjT71vSM.cjs`);exports.DEFAULT_QWEN_PROVIDER_API_KEY_ENV=e.i,exports.DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE=e.a,exports.DEFAULT_QWEN_PROVIDER_BASE_URL=e.o,exports.DEFAULT_QWEN_PROVIDER_MODEL=e.s,exports.DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL=e.c,exports.QWEN_MODEL_LAST_VERIFIED_AT=e.l,exports.QWEN_MODEL_SOURCE_URL=e.u,exports.QWEN_PROVIDER_BASE_URLS=e.d,exports.QWEN_PROVIDER_RESPONSES_BASE_URLS=e.f,exports.QwenProvider=e.r,exports.createQwenProviderDefinition=e.t,exports.refreshQwenModelCatalog=e.n;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { A as IQwenResponsesWebExtractorTool, B as TQwenResponsesStreamEvent, C as IQwenResponsesRequestStreaming, D as IQwenResponsesToolUsageCount, E as IQwenResponsesTextDeltaEvent, F as TQwenBuiltInWebToolName, G as DEFAULT_QWEN_PROVIDER_MODEL, H as DEFAULT_QWEN_PROVIDER_API_KEY_ENV, I as TQwenMessagesToResponsesInput, J as QWEN_MODEL_SOURCE_URL, K as DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL, L as TQwenProviderOptionValue, M as IQwenResponsesWebSearchEvent, N as IQwenResponsesWebSearchOutputItem, O as IQwenResponsesUsage, P as IQwenResponsesWebSearchTool, Q as TQwenProviderResponsesRegion, R as TQwenResponsesInputItem, S as IQwenResponsesRequestNonStreaming, T as IQwenResponsesTextContent, U as DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE, V as TQwenResponsesTool, W as DEFAULT_QWEN_PROVIDER_BASE_URL, X as QWEN_PROVIDER_RESPONSES_BASE_URLS, Y as QWEN_PROVIDER_BASE_URLS, Z as TQwenProviderRegion, _ as IQwenResponsesGenericOutputItem, a as refreshQwenModelCatalog, b as IQwenResponsesOutputItemDoneEvent, c as IQwenBuiltInWebToolsOptions, d as IQwenResponsesErrorEvent, f as IQwenResponsesFunctionCallInput, g as IQwenResponsesGenericEvent, h as IQwenResponsesFunctionTool, i as TQwenFetch, j as IQwenResponsesWebSearchAction, k as IQwenResponsesWebExtractorOutputItem, l as IQwenProviderOptions, m as IQwenResponsesFunctionCallOutputItem, n as IQwenFetchResponse, o as createQwenProviderDefinition, p as IQwenResponsesFunctionCallOutputInput, q as QWEN_MODEL_LAST_VERIFIED_AT, r as IQwenModelsResponse, s as QwenProvider, t as IQwenFetchInit, u as IQwenResponsesCompletedEvent, v as IQwenResponsesMessageInput, w as IQwenResponsesResponse, x as IQwenResponsesRequestBase, y as IQwenResponsesMessageOutputItem, z as TQwenResponsesOutputItem } from "../index-BqixM_XD.js";
|
|
2
|
+
export { DEFAULT_QWEN_PROVIDER_API_KEY_ENV, DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE, DEFAULT_QWEN_PROVIDER_BASE_URL, DEFAULT_QWEN_PROVIDER_MODEL, DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL, IQwenBuiltInWebToolsOptions, IQwenFetchInit, IQwenFetchResponse, IQwenModelsResponse, IQwenProviderOptions, IQwenResponsesCompletedEvent, IQwenResponsesErrorEvent, IQwenResponsesFunctionCallInput, IQwenResponsesFunctionCallOutputInput, IQwenResponsesFunctionCallOutputItem, IQwenResponsesFunctionTool, IQwenResponsesGenericEvent, IQwenResponsesGenericOutputItem, IQwenResponsesMessageInput, IQwenResponsesMessageOutputItem, IQwenResponsesOutputItemDoneEvent, IQwenResponsesRequestBase, IQwenResponsesRequestNonStreaming, IQwenResponsesRequestStreaming, IQwenResponsesResponse, IQwenResponsesTextContent, IQwenResponsesTextDeltaEvent, IQwenResponsesToolUsageCount, IQwenResponsesUsage, IQwenResponsesWebExtractorOutputItem, IQwenResponsesWebExtractorTool, IQwenResponsesWebSearchAction, IQwenResponsesWebSearchEvent, IQwenResponsesWebSearchOutputItem, IQwenResponsesWebSearchTool, QWEN_MODEL_LAST_VERIFIED_AT, QWEN_MODEL_SOURCE_URL, QWEN_PROVIDER_BASE_URLS, QWEN_PROVIDER_RESPONSES_BASE_URLS, QwenProvider, TQwenBuiltInWebToolName, TQwenFetch, TQwenMessagesToResponsesInput, TQwenProviderOptionValue, TQwenProviderRegion, TQwenProviderResponsesRegion, TQwenResponsesInputItem, TQwenResponsesOutputItem, TQwenResponsesStreamEvent, TQwenResponsesTool, createQwenProviderDefinition, refreshQwenModelCatalog };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,r as c,s as l,t as u,u as d}from"../qwen-ChUZobTL.js";export{i as DEFAULT_QWEN_PROVIDER_API_KEY_ENV,e as DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE,s as DEFAULT_QWEN_PROVIDER_BASE_URL,l as DEFAULT_QWEN_PROVIDER_MODEL,t as DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL,a as QWEN_MODEL_LAST_VERIFIED_AT,d as QWEN_MODEL_SOURCE_URL,n as QWEN_PROVIDER_BASE_URLS,r as QWEN_PROVIDER_RESPONSES_BASE_URLS,c as QwenProvider,u as createQwenProviderDefinition,o as refreshQwenModelCatalog};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,i as t,n,o as r,r as i,t as a}from"./openai-compatible-Dm4Sof9e.js";import{randomUUID as o}from"node:crypto";import{AbstractAIProvider as s,SilentLogger as c}from"@robota-sdk/agent-core";import l from"openai";const u={singapore:`https://dashscope-intl.aliyuncs.com/compatible-mode/v1`,usVirginia:`https://dashscope-us.aliyuncs.com/compatible-mode/v1`,beijing:`https://dashscope.aliyuncs.com/compatible-mode/v1`,hongKong:`https://cn-hongkong.dashscope.aliyuncs.com/compatible-mode/v1`},d={singapore:`https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1`,usVirginia:`https://dashscope-us.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1`,beijing:`https://dashscope.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1`},f=`qwen-plus`,p=`DASHSCOPE_API_KEY`,m=`$ENV:${p}`,h=u.singapore,g=d.singapore,_=`https://www.alibabacloud.com/help/en/model-studio/compatibility-of-openai-with-dashscope`,v=`2026-05-04`;function y(e){let t=[];return(e?.webSearch===!0||e?.webFetch===!0)&&t.push(`web_search`),e?.webFetch===!0&&t.push(`web_extractor`),t}function b(e){return y(e).length>0}function x(e){return e.flatMap(e=>w(e))}function S(e,t){let n=[...e.map(e=>({type:e})),...C(t)];return n.length>0?n:void 0}function C(e){return e?.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.parameters}))??[]}function w(e){return e.role===`user`?[E(`user`,e.content)]:e.role===`system`?[E(`system`,e.content)]:e.role===`tool`?[{type:`function_call_output`,call_id:e.toolCallId,output:e.content||``}]:T(e)}function T(e){let t=[];e.content&&e.content.length>0&&t.push(E(`assistant`,e.content));for(let n of e.toolCalls??[])t.push({type:`function_call`,call_id:n.id,name:n.function.name,arguments:n.function.arguments});return t.length===0&&t.push(E(`assistant`,``)),t}function E(e,t){return{role:e,content:t??``}}async function*D(e,t){let n=e[Symbol.asyncIterator]();try{for(;!t?.aborted;){let e=await ee(n,t);if(e.done||t?.aborted)break;yield e.value}}finally{t?.aborted&&await n.return?.()}}async function ee(e,t){if(!t)return e.next();if(t.aborted)return{done:!0,value:void 0};let n,r=new Promise(e=>{n=()=>e({done:!0,value:void 0}),t.addEventListener(`abort`,n,{once:!0})});try{return await Promise.race([e.next(),r])}finally{n&&t.removeEventListener(`abort`,n)}}function O(e,t){let n=e.output??[],r=M(n,e.usage),i=L(n);return k({content:e.output_text??B(n),toolCalls:i,response:e,usage:r,enabledBuiltInTools:t.enabledBuiltInTools})}async function te(e){let t={textParts:[],toolCalls:[],usage:F()};for await(let n of D(e.stream,e.signal))ne(t,n,e.onTextDelta);return t.completedResponse===void 0?k({content:t.textParts.join(``),toolCalls:t.toolCalls,usage:t.usage,enabledBuiltInTools:e.enabledBuiltInTools}):re(t,e.enabledBuiltInTools)}function ne(e,t,n){if(t.type===`response.output_text.delta`){e.textParts.push(t.delta),n?.(t.delta);return}if(t.type===`response.completed`){e.completedResponse=t.response,P(e.usage,M(t.response.output??[],t.response.usage));return}if(t.type===`response.output_item.done`){ie(e,t.item);return}if(t.type===`response.web_search_call.completed`){e.usage.webSearchCalls+=1;return}if(t.type===`response.error`||t.type===`response.failed`)throw Error(`Qwen Responses API failed: ${V(t)}`)}function re(e,t){let n=e.completedResponse;if(n===void 0)throw Error(`Qwen Responses stream completed without response metadata`);let r=n.output??[],i=L(r),a=e.textParts.length>0?e.textParts.join(``):n.output_text??B(r),o=M(r,n.usage);return P(o,e.usage),k({content:a,toolCalls:i.length>0?i:e.toolCalls,response:n,usage:o,enabledBuiltInTools:t})}function ie(e,t){if(t.type===`function_call`){R(t)&&e.toolCalls.push(z(t));return}P(e.usage,M([t],void 0))}function k(e){return{id:o(),role:`assistant`,content:e.content,state:`complete`,timestamp:new Date,...e.toolCalls.length>0&&{toolCalls:e.toolCalls},...e.response?.usage!==void 0&&{usage:{promptTokens:e.response.usage.input_tokens??0,completionTokens:e.response.usage.output_tokens??0,totalTokens:e.response.usage.total_tokens??0}},metadata:A(e.enabledBuiltInTools,e.usage,e.response)}}function A(e,t,n){let r=j(t);return{providerToolMode:`qwen_responses`,providerBuiltInToolsEnabled:[...e],...r.length>0&&{providerBuiltInToolsUsed:r},qwenWebSearchCalls:t.webSearchCalls,qwenWebExtractorCalls:t.webExtractorCalls,...t.unsupportedToolTypes.size>0&&{qwenUnsupportedProviderToolTypes:[...t.unsupportedToolTypes].sort()},...n?.id!==void 0&&{responseId:n.id},...n?.model!==void 0&&{model:n.model},...n?.status!==void 0&&{finishReason:n.status}}}function j(e){let t=[];return e.webSearchCalls>0&&t.push(`web_search`),e.webExtractorCalls>0&&t.push(`web_extractor`),t}function M(e,t){let n=F();for(let t of e)t.type===`web_search_call`?n.webSearchCalls+=1:t.type===`web_extractor_call`?n.webExtractorCalls+=1:I(t.type)&&n.unsupportedToolTypes.add(t.type);return N(n,t),n}function N(e,t){let n=t?.x_tools;if(n!==void 0){e.webSearchCalls=Math.max(e.webSearchCalls,n.web_search?.count??0),e.webExtractorCalls=Math.max(e.webExtractorCalls,n.web_extractor?.count??0);for(let t of Object.keys(n))t!==`web_search`&&t!==`web_extractor`&&e.unsupportedToolTypes.add(t)}}function P(e,t){e.webSearchCalls=Math.max(e.webSearchCalls,t.webSearchCalls),e.webExtractorCalls=Math.max(e.webExtractorCalls,t.webExtractorCalls);for(let n of t.unsupportedToolTypes)e.unsupportedToolTypes.add(n)}function F(){return{webSearchCalls:0,webExtractorCalls:0,unsupportedToolTypes:new Set}}function I(e){return e.endsWith(`_call`)&&e!==`function_call`}function L(e){return e.filter(R).map(e=>z(e))}function R(e){return e.type===`function_call`&&`call_id`in e&&`name`in e&&`arguments`in e}function z(e){return{id:e.call_id,type:`function`,function:{name:e.name,arguments:e.arguments}}}function B(e){return e.filter(e=>e.type===`message`).flatMap(e=>e.content).map(e=>e.text).join(``)}function V(e){return e.message??e.error?.message??e.response?.error?.message??`unknown error`}async function H(e){let t=e.chatOptions?.onTextDelta??e.onTextDelta;if(t)return W({...e,chatOptions:{...e.chatOptions,onTextDelta:t}});if(!e.client)throw Error(`Qwen Responses client not available for built-in web tools.`);try{let t=G(e);e.chatOptions?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`responses`,payloadKind:`request`,payload:t});let n=await e.client.responses.create(t,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`responses`,payloadKind:`response`,payload:n}),O(n,{enabledBuiltInTools:y(e.builtInWebTools)})}catch(e){let t=e.message||`Qwen Responses API request failed`;throw Error(`Qwen responses failed: ${t}`)}}async function*U(e){let t=[],n=await W({...e,chatOptions:{...e.chatOptions,onTextDelta:n=>{e.chatOptions?.onTextDelta?.(n),t.push(q(n))}}});for(let e of t)yield e;yield{...n,content:``,metadata:{...n.metadata,isStreamChunk:!0,isComplete:!0}}}async function W(e){if(!e.client)throw Error(`Qwen Responses client not available for built-in web tools.`);try{let t=K(e);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`responses`,payloadKind:`request`,payload:t}),te({stream:n(await e.client.responses.create(t,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0),{provider:`qwen`,apiSurface:`responses`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload}),enabledBuiltInTools:y(e.builtInWebTools),onTextDelta:e.chatOptions?.onTextDelta,signal:e.chatOptions?.signal})}catch(e){let t=e.message||`Qwen Responses streaming request failed`;throw Error(`Qwen responses stream failed: ${t}`)}}function G(e){let t=e.chatOptions?.model??e.defaultModel;if(!t)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let n=S(y(e.builtInWebTools),e.chatOptions?.tools);return{model:t,input:x(e.messages),...n!==void 0&&{tools:n},...e.chatOptions?.temperature!==void 0&&{temperature:e.chatOptions.temperature},...e.chatOptions?.maxTokens!==void 0&&{max_output_tokens:e.chatOptions.maxTokens},...e.builtInWebTools?.enableThinking!==void 0&&{enable_thinking:e.builtInWebTools.enableThinking}}}function K(e){return{...G(e),stream:!0}}function q(e){return{id:o(),role:`assistant`,content:e,state:`complete`,timestamp:new Date,metadata:{isStreamChunk:!0,isComplete:!1}}}const J=`qwen-responses`;function Y(e){let t=e.builtInWebTools,n=t?.webSearch===!0||t?.webFetch===!0,r=t?.webFetch===!0;return{functionCalling:{supported:!0},nativeWebTools:{webSearch:n?{supported:!0,enabled:!0,source:J}:{supported:!0,enabled:!1,source:J,reason:`Enable builtInWebTools.webSearch or builtInWebTools.webFetch.`},webFetch:r?{supported:!0,enabled:!0,source:J}:{supported:!0,enabled:!1,source:J,reason:`Enable builtInWebTools.webFetch.`}}}}async function ae(e,t,r){try{return r.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`request`,payload:t}),i({stream:n(await e.chat.completions.create(t,r.signal?{signal:r.signal}:void 0),{provider:`qwen`,apiSurface:`chat-completions`,onProviderNativeRawPayload:r.onProviderNativeRawPayload}),onTextDelta:r.onTextDelta,signal:r.signal})}catch(e){let t=e.message||`Qwen streaming request failed`;throw Error(`Qwen stream failed: ${t}`)}}var X=class extends s{name=`qwen`;version=`1.0.0`;client;responsesClient;options;responseParser;onTextDelta;constructor(e){if(super(e.logger||c),this.options=e,e.executor&&(this.executor=e.executor),!this.executor)if(e.client)this.client=e.client,this.responsesClient=e.client;else if(e.apiKey)this.client=new l({apiKey:e.apiKey,baseURL:e.baseURL??h,...e.timeout!==void 0&&{timeout:e.timeout}}),this.responsesClient=new l({apiKey:e.apiKey,baseURL:e.responsesBaseURL??g,...e.timeout!==void 0&&{timeout:e.timeout}});else throw Error(`Either Qwen client, apiKey, or executor is required`);this.responseParser=new t({logger:this.logger})}async chat(e,t){return this.validateMessages(e),this.validateNativeWebTools(t?.nativeWebTools),this.executor?this.chatViaExecutor(e,t):this.shouldUseResponsesApi()?this.chatViaResponsesApi(e,t,this.getResponsesClient()):this.chatViaChatCompletions(e,t,this.getClient())}async chatViaExecutor(e,t){try{return await this.executeViaExecutorOrDirect(e,t)}catch(e){throw this.logger.error(`Qwen Provider executor chat error:`,e instanceof Error?e.message:String(e)),e}}async chatViaResponsesApi(e,t,n){return this.validateTools(t?.tools),H({client:n,messages:e,chatOptions:t,defaultModel:this.options.defaultModel,builtInWebTools:this.options.builtInWebTools,onTextDelta:this.onTextDelta})}async chatViaChatCompletions(e,t,n){try{let r=this.buildRequestParams(e,t),i=t?.onTextDelta??this.onTextDelta;if(i)return ae(n,{...r,stream:!0},{...t,onTextDelta:i});t?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r});let a=await n.chat.completions.create(r);return t?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`response`,payload:a}),this.responseParser.parseResponse(a)}catch(e){let t=e.message||`Qwen API request failed`;throw Error(`Qwen chat failed: ${t}`)}}async*chatStream(e,t){if(this.validateMessages(e),this.validateNativeWebTools(t?.nativeWebTools),this.executor)try{yield*this.executeStreamViaExecutorOrDirect(e,t);return}catch(e){throw this.logger.error(`Qwen Provider executor stream error:`,e instanceof Error?e.message:String(e)),e}if(!this.client)throw Error(`Qwen client not available. Either provide a client/apiKey or use an executor.`);if(this.shouldUseResponsesApi()){this.validateTools(t?.tools),yield*U({client:this.responsesClient,messages:e,chatOptions:t,defaultModel:this.options.defaultModel,builtInWebTools:this.options.builtInWebTools,onTextDelta:this.onTextDelta});return}try{let r=this.buildStreamingRequestParams(e,t);t?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r});let i=n(await this.client.chat.completions.create(r),{provider:`qwen`,apiSurface:`chat-completions`,onProviderNativeRawPayload:t?.onProviderNativeRawPayload});for await(let e of this.streamWithAbort(i,t?.signal)){let t=this.responseParser.parseStreamingChunk(e);t&&(yield t)}}catch(e){let t=e.message||`Qwen API request failed`;throw Error(`Qwen stream failed: ${t}`)}}supportsTools(){return!0}getCapabilities(){return Y(this.options)}validateConfig(){return!!this.client&&!!this.options&&(!this.shouldUseResponsesApi()||!!this.responsesClient)}async dispose(){}buildRequestParams(t,n){this.validateTools(n?.tools);let i=n?.model??this.options.defaultModel;if(!i)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);return{model:i,messages:e(t),...n?.temperature!==void 0&&{temperature:n.temperature},...n?.maxTokens!==void 0&&{max_tokens:n.maxTokens},...n?.tools&&{tools:r(n.tools),tool_choice:`auto`}}}buildStreamingRequestParams(e,t){return{...this.buildRequestParams(e,t),stream:!0}}shouldUseResponsesApi(){return b(this.options.builtInWebTools)}getClient(){if(!this.client)throw Error(`Qwen client not available. Either provide a client/apiKey or use an executor.`);return this.client}getResponsesClient(){if(!this.responsesClient)throw Error(`Qwen Responses client not available for built-in web tools.`);return this.responsesClient}};async function Z(e,t=le){let n=await t(`${ce(e.baseURL??h)}/models`,oe(e.apiKey));if(!n.ok)return{status:`unavailable`,sourceUrl:_,message:`Qwen model refresh failed: HTTP ${n.status}`};let r=((await n.json()).data??[]).map(e=>e.id).filter(e=>typeof e==`string`&&e.length>0).map(se);return{status:`live`,sourceUrl:_,lastVerifiedAt:v,entries:r,message:`Loaded ${r.length} models from Qwen API`}}function oe(e){if(e)return{headers:{Authorization:`Bearer ${e}`}}}function se(e){return{id:e,displayName:e,lifecycle:`active`,sourceUrl:_,lastVerifiedAt:v}}function ce(e){return e.replace(/\/$/,``)}async function le(e,t){let n=await fetch(e,{...t?.headers!==void 0&&{headers:t.headers}});return{ok:n.ok,status:n.status,json:()=>n.json()}}const ue=[{kind:`api-key`,label:`Alibaba Cloud Model Studio API keys`,url:`https://modelstudio.console.alibabacloud.com/?tab=api#/api-key`,sourceUrl:`https://www.alibabacloud.com/help/en/model-studio/get-api-key`,lastVerifiedAt:`2026-05-08`}],Q={status:`fallback`,sourceUrl:_,lastVerifiedAt:v,entries:[{id:f,displayName:`Qwen Plus`,capabilities:[`tools`,`reasoning`,`native_web`,`streaming`],lifecycle:`active`,sourceUrl:_,lastVerifiedAt:v},{id:`qwen-max`,displayName:`Qwen Max`,capabilities:[`tools`,`reasoning`,`native_web`,`streaming`],lifecycle:`active`,sourceUrl:_,lastVerifiedAt:v},{id:`qwen-flash`,displayName:`Qwen Flash`,capabilities:[`tools`,`native_web`,`streaming`],lifecycle:`active`,sourceUrl:_,lastVerifiedAt:v}]};function de(){return{type:`qwen`,displayName:`Qwen`,description:`Alibaba Cloud Model Studio OpenAI-compatible endpoint`,defaults:{model:f,apiKey:m,baseURL:h},modelCatalog:Q,refreshModelCatalog:({profile:e})=>Z(e),modelCatalogCacheTtlSeconds:86400,setupHelpLinks:ue,setupSteps:[{key:`baseURL`,title:`Qwen OpenAI-compatible base URL`,defaultValue:h},{key:`model`,title:`Qwen model`,defaultValue:f},{key:`apiKey`,title:`Qwen Model Studio API key`,defaultValue:m,masked:!0}],requiresApiKey:!0,probeProfile:a,createProvider:e=>{let t=pe(e.options);return new X({apiKey:fe(e.apiKey),...e.baseURL!==void 0&&{baseURL:e.baseURL},...t.responsesBaseURL!==void 0&&{responsesBaseURL:t.responsesBaseURL},...e.timeout!==void 0&&{timeout:e.timeout},...t.builtInWebTools!==void 0&&{builtInWebTools:t.builtInWebTools},defaultModel:e.model})}}}function fe(e){if(!e)throw Error(`Provider qwen requires apiKey`);return e}function pe(e){let t=me(he(e?.builtInWebTools)),n=ge(e?.responsesBaseURL);return{...n!==void 0&&{responsesBaseURL:n},...t!==void 0&&{builtInWebTools:t}}}function me(e){if(e!==void 0)return{...$(e.webSearch)!==void 0&&{webSearch:$(e.webSearch)},...$(e.webFetch)!==void 0&&{webFetch:$(e.webFetch)},...$(e.enableThinking)!==void 0&&{enableThinking:$(e.enableThinking)}}}function he(e){if(!(e==null||e instanceof Date||Array.isArray(e)))return typeof e==`object`?e:void 0}function $(e){return typeof e==`boolean`?e:void 0}function ge(e){return typeof e==`string`&&e.length>0?e:void 0}export{m as a,g as c,u as d,d as f,p as i,v as l,Z as n,h as o,X as r,f as s,de as t,_ as u};
|
|
2
|
+
//# sourceMappingURL=qwen-ChUZobTL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qwen-ChUZobTL.js","names":["qwenError","qwenError","qwenError"],"sources":["../../src/qwen/defaults.ts","../../src/qwen/responses-converter.ts","../../src/qwen/responses-stream-utils.ts","../../src/qwen/responses-parser.ts","../../src/qwen/responses-chat.ts","../../src/qwen/provider-capabilities.ts","../../src/qwen/provider-streaming-assembly.ts","../../src/qwen/provider.ts","../../src/qwen/model-catalog-refresh.ts","../../src/qwen/provider-definition.ts"],"sourcesContent":["export const QWEN_PROVIDER_BASE_URLS = {\n singapore: 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1',\n usVirginia: 'https://dashscope-us.aliyuncs.com/compatible-mode/v1',\n beijing: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n hongKong: 'https://cn-hongkong.dashscope.aliyuncs.com/compatible-mode/v1',\n} as const;\n\nexport type TQwenProviderRegion = keyof typeof QWEN_PROVIDER_BASE_URLS;\n\nexport const QWEN_PROVIDER_RESPONSES_BASE_URLS = {\n singapore: 'https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1',\n usVirginia: 'https://dashscope-us.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1',\n beijing: 'https://dashscope.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1',\n} as const;\n\nexport type TQwenProviderResponsesRegion = keyof typeof QWEN_PROVIDER_RESPONSES_BASE_URLS;\n\nexport const DEFAULT_QWEN_PROVIDER_MODEL = 'qwen-plus';\nexport const DEFAULT_QWEN_PROVIDER_API_KEY_ENV = 'DASHSCOPE_API_KEY';\nexport const DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE = `$ENV:${DEFAULT_QWEN_PROVIDER_API_KEY_ENV}`;\nexport const DEFAULT_QWEN_PROVIDER_BASE_URL = QWEN_PROVIDER_BASE_URLS.singapore;\nexport const DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL = QWEN_PROVIDER_RESPONSES_BASE_URLS.singapore;\n\nexport const QWEN_MODEL_SOURCE_URL =\n 'https://www.alibabacloud.com/help/en/model-studio/compatibility-of-openai-with-dashscope';\nexport const QWEN_MODEL_LAST_VERIFIED_AT = '2026-05-04';\n","import type { IAssistantMessage, IToolSchema, TUniversalMessage } from '@robota-sdk/agent-core';\nimport type {\n IQwenBuiltInWebToolsOptions,\n IQwenResponsesFunctionTool,\n IQwenResponsesMessageInput,\n TQwenBuiltInWebToolName,\n TQwenResponsesInputItem,\n TQwenResponsesTool,\n} from './types';\n\nexport function getQwenBuiltInWebToolNames(\n options: IQwenBuiltInWebToolsOptions | undefined,\n): TQwenBuiltInWebToolName[] {\n const tools: TQwenBuiltInWebToolName[] = [];\n if (options?.webSearch === true || options?.webFetch === true) {\n tools.push('web_search');\n }\n if (options?.webFetch === true) {\n tools.push('web_extractor');\n }\n return tools;\n}\n\nexport function hasQwenBuiltInWebTools(options: IQwenBuiltInWebToolsOptions | undefined): boolean {\n return getQwenBuiltInWebToolNames(options).length > 0;\n}\n\nexport function convertToQwenResponsesInput(\n messages: TUniversalMessage[],\n): TQwenResponsesInputItem[] {\n return messages.flatMap((message) => convertMessage(message));\n}\n\nexport function buildQwenResponsesTools(\n builtInWebTools: readonly TQwenBuiltInWebToolName[],\n localTools: IToolSchema[] | undefined,\n): TQwenResponsesTool[] | undefined {\n const tools: TQwenResponsesTool[] = [\n ...builtInWebTools.map((type) => ({ type })),\n ...convertToQwenResponsesFunctionTools(localTools),\n ];\n return tools.length > 0 ? tools : undefined;\n}\n\nfunction convertToQwenResponsesFunctionTools(\n tools: IToolSchema[] | undefined,\n): IQwenResponsesFunctionTool[] {\n return (\n tools?.map((tool) => ({\n type: 'function',\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n })) ?? []\n );\n}\n\nfunction convertMessage(message: TUniversalMessage): TQwenResponsesInputItem[] {\n if (message.role === 'user') {\n return [createMessageInput('user', message.content)];\n }\n if (message.role === 'system') {\n return [createMessageInput('system', message.content)];\n }\n if (message.role === 'tool') {\n return [\n {\n type: 'function_call_output',\n call_id: message.toolCallId,\n output: message.content || '',\n },\n ];\n }\n return convertAssistantMessage(message);\n}\n\nfunction convertAssistantMessage(message: IAssistantMessage): TQwenResponsesInputItem[] {\n const items: TQwenResponsesInputItem[] = [];\n if (message.content && message.content.length > 0) {\n items.push(createMessageInput('assistant', message.content));\n }\n for (const toolCall of message.toolCalls ?? []) {\n items.push({\n type: 'function_call',\n call_id: toolCall.id,\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n });\n }\n if (items.length === 0) {\n items.push(createMessageInput('assistant', ''));\n }\n return items;\n}\n\nfunction createMessageInput(\n role: IQwenResponsesMessageInput['role'],\n content: string | null,\n): IQwenResponsesMessageInput {\n return {\n role,\n content: content ?? '',\n };\n}\n","export async function* streamWithAbort<T>(\n source: AsyncIterable<T>,\n signal?: AbortSignal,\n): AsyncGenerator<T> {\n const iterator = source[Symbol.asyncIterator]();\n try {\n while (!signal?.aborted) {\n const item = await nextStreamItem(iterator, signal);\n if (item.done) break;\n if (signal?.aborted) break;\n yield item.value;\n }\n } finally {\n if (signal?.aborted) {\n await iterator.return?.();\n }\n }\n}\n\nasync function nextStreamItem<T>(\n iterator: AsyncIterator<T>,\n signal?: AbortSignal,\n): Promise<IteratorResult<T>> {\n if (!signal) return iterator.next();\n if (signal.aborted) return { done: true, value: undefined as T };\n\n let abortListener: (() => void) | undefined;\n const aborted = new Promise<IteratorResult<T>>((resolve) => {\n abortListener = (): void => resolve({ done: true, value: undefined as T });\n signal.addEventListener('abort', abortListener, { once: true });\n });\n\n try {\n return await Promise.race([iterator.next(), aborted]);\n } finally {\n if (abortListener) signal.removeEventListener('abort', abortListener);\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { IToolCall, TTextDeltaCallback, TUniversalMessage } from '@robota-sdk/agent-core';\nimport type {\n IQwenResponsesFunctionCallOutputItem,\n IQwenResponsesErrorEvent,\n IQwenResponsesResponse,\n IQwenResponsesUsage,\n TQwenBuiltInWebToolName,\n TQwenResponsesOutputItem,\n TQwenResponsesStreamEvent,\n} from './types';\nimport { streamWithAbort } from './responses-stream-utils';\n\ninterface IQwenResponsesParseOptions {\n enabledBuiltInTools: readonly TQwenBuiltInWebToolName[];\n}\n\ninterface IQwenResponsesStreamAssemblyOptions extends IQwenResponsesParseOptions {\n stream: AsyncIterable<TQwenResponsesStreamEvent>;\n onTextDelta?: TTextDeltaCallback;\n signal?: AbortSignal;\n}\n\ninterface IQwenProviderToolUsage {\n webSearchCalls: number;\n webExtractorCalls: number;\n unsupportedToolTypes: Set<string>;\n}\n\ninterface IQwenResponsesStreamState {\n textParts: string[];\n toolCalls: IToolCall[];\n completedResponse?: IQwenResponsesResponse;\n usage: IQwenProviderToolUsage;\n}\n\nexport function parseQwenResponsesResponse(\n response: IQwenResponsesResponse,\n options: IQwenResponsesParseOptions,\n): TUniversalMessage {\n const output = response.output ?? [];\n const usage = collectProviderToolUsage(output, response.usage);\n const toolCalls = extractFunctionToolCalls(output);\n const content = response.output_text ?? extractMessageText(output);\n\n return buildAssistantMessage({\n content,\n toolCalls,\n response,\n usage,\n enabledBuiltInTools: options.enabledBuiltInTools,\n });\n}\n\nexport async function assembleQwenResponsesStream(\n options: IQwenResponsesStreamAssemblyOptions,\n): Promise<TUniversalMessage> {\n const state: IQwenResponsesStreamState = {\n textParts: [],\n toolCalls: [],\n usage: createEmptyToolUsage(),\n };\n\n for await (const event of streamWithAbort(options.stream, options.signal)) {\n applyStreamEvent(state, event, options.onTextDelta);\n }\n\n if (state.completedResponse !== undefined) {\n return buildMessageFromCompletedResponse(state, options.enabledBuiltInTools);\n }\n\n return buildAssistantMessage({\n content: state.textParts.join(''),\n toolCalls: state.toolCalls,\n usage: state.usage,\n enabledBuiltInTools: options.enabledBuiltInTools,\n });\n}\n\nfunction applyStreamEvent(\n state: IQwenResponsesStreamState,\n event: TQwenResponsesStreamEvent,\n onTextDelta: TTextDeltaCallback | undefined,\n): void {\n if (event.type === 'response.output_text.delta') {\n state.textParts.push(event.delta);\n onTextDelta?.(event.delta);\n return;\n }\n\n if (event.type === 'response.completed') {\n state.completedResponse = event.response;\n mergeToolUsage(\n state.usage,\n collectProviderToolUsage(event.response.output ?? [], event.response.usage),\n );\n return;\n }\n\n if (event.type === 'response.output_item.done') {\n applyOutputItem(state, event.item);\n return;\n }\n\n if (event.type === 'response.web_search_call.completed') {\n state.usage.webSearchCalls += 1;\n return;\n }\n\n if (event.type === 'response.error' || event.type === 'response.failed') {\n throw new Error(`Qwen Responses API failed: ${extractErrorMessage(event)}`);\n }\n}\n\nfunction buildMessageFromCompletedResponse(\n state: IQwenResponsesStreamState,\n enabledBuiltInTools: readonly TQwenBuiltInWebToolName[],\n): TUniversalMessage {\n const response = state.completedResponse;\n if (response === undefined) {\n throw new Error('Qwen Responses stream completed without response metadata');\n }\n\n const output = response.output ?? [];\n const responseToolCalls = extractFunctionToolCalls(output);\n const content =\n state.textParts.length > 0\n ? state.textParts.join('')\n : (response.output_text ?? extractMessageText(output));\n const usage = collectProviderToolUsage(output, response.usage);\n mergeToolUsage(usage, state.usage);\n\n return buildAssistantMessage({\n content,\n toolCalls: responseToolCalls.length > 0 ? responseToolCalls : state.toolCalls,\n response,\n usage,\n enabledBuiltInTools,\n });\n}\n\nfunction applyOutputItem(state: IQwenResponsesStreamState, item: TQwenResponsesOutputItem): void {\n if (item.type === 'function_call') {\n if (isFunctionCallOutputItem(item)) {\n state.toolCalls.push(convertFunctionCall(item));\n }\n return;\n }\n mergeToolUsage(state.usage, collectProviderToolUsage([item], undefined));\n}\n\nfunction buildAssistantMessage(input: {\n content: string;\n toolCalls: IToolCall[];\n response?: IQwenResponsesResponse;\n usage: IQwenProviderToolUsage;\n enabledBuiltInTools: readonly TQwenBuiltInWebToolName[];\n}): TUniversalMessage {\n return {\n id: randomUUID(),\n role: 'assistant',\n content: input.content,\n state: 'complete',\n timestamp: new Date(),\n ...(input.toolCalls.length > 0 && { toolCalls: input.toolCalls }),\n ...(input.response?.usage !== undefined && {\n usage: {\n promptTokens: input.response.usage.input_tokens ?? 0,\n completionTokens: input.response.usage.output_tokens ?? 0,\n totalTokens: input.response.usage.total_tokens ?? 0,\n },\n }),\n metadata: buildProviderToolMetadata(input.enabledBuiltInTools, input.usage, input.response),\n };\n}\n\nfunction buildProviderToolMetadata(\n enabledBuiltInTools: readonly TQwenBuiltInWebToolName[],\n usage: IQwenProviderToolUsage,\n response: IQwenResponsesResponse | undefined,\n): NonNullable<TUniversalMessage['metadata']> {\n const usedTools = collectUsedToolNames(usage);\n return {\n providerToolMode: 'qwen_responses',\n providerBuiltInToolsEnabled: [...enabledBuiltInTools],\n ...(usedTools.length > 0 && { providerBuiltInToolsUsed: usedTools }),\n qwenWebSearchCalls: usage.webSearchCalls,\n qwenWebExtractorCalls: usage.webExtractorCalls,\n ...(usage.unsupportedToolTypes.size > 0 && {\n qwenUnsupportedProviderToolTypes: [...usage.unsupportedToolTypes].sort(),\n }),\n ...(response?.id !== undefined && { responseId: response.id }),\n ...(response?.model !== undefined && { model: response.model }),\n ...(response?.status !== undefined && { finishReason: response.status }),\n };\n}\n\nfunction collectUsedToolNames(usage: IQwenProviderToolUsage): TQwenBuiltInWebToolName[] {\n const used: TQwenBuiltInWebToolName[] = [];\n if (usage.webSearchCalls > 0) {\n used.push('web_search');\n }\n if (usage.webExtractorCalls > 0) {\n used.push('web_extractor');\n }\n return used;\n}\n\nfunction collectProviderToolUsage(\n output: readonly TQwenResponsesOutputItem[],\n responseUsage: IQwenResponsesUsage | undefined,\n): IQwenProviderToolUsage {\n const usage = createEmptyToolUsage();\n for (const item of output) {\n if (item.type === 'web_search_call') {\n usage.webSearchCalls += 1;\n } else if (item.type === 'web_extractor_call') {\n usage.webExtractorCalls += 1;\n } else if (isProviderToolOutput(item.type)) {\n usage.unsupportedToolTypes.add(item.type);\n }\n }\n applyUsageCounts(usage, responseUsage);\n return usage;\n}\n\nfunction applyUsageCounts(\n usage: IQwenProviderToolUsage,\n responseUsage: IQwenResponsesUsage | undefined,\n): void {\n const xTools = responseUsage?.x_tools;\n if (xTools === undefined) {\n return;\n }\n usage.webSearchCalls = Math.max(usage.webSearchCalls, xTools['web_search']?.count ?? 0);\n usage.webExtractorCalls = Math.max(usage.webExtractorCalls, xTools['web_extractor']?.count ?? 0);\n for (const toolName of Object.keys(xTools)) {\n if (toolName !== 'web_search' && toolName !== 'web_extractor') {\n usage.unsupportedToolTypes.add(toolName);\n }\n }\n}\n\nfunction mergeToolUsage(target: IQwenProviderToolUsage, source: IQwenProviderToolUsage): void {\n target.webSearchCalls = Math.max(target.webSearchCalls, source.webSearchCalls);\n target.webExtractorCalls = Math.max(target.webExtractorCalls, source.webExtractorCalls);\n for (const toolType of source.unsupportedToolTypes) {\n target.unsupportedToolTypes.add(toolType);\n }\n}\n\nfunction createEmptyToolUsage(): IQwenProviderToolUsage {\n return {\n webSearchCalls: 0,\n webExtractorCalls: 0,\n unsupportedToolTypes: new Set(),\n };\n}\n\nfunction isProviderToolOutput(type: string): boolean {\n return type.endsWith('_call') && type !== 'function_call';\n}\n\nfunction extractFunctionToolCalls(output: readonly TQwenResponsesOutputItem[]): IToolCall[] {\n return output.filter(isFunctionCallOutputItem).map((item) => convertFunctionCall(item));\n}\n\nfunction isFunctionCallOutputItem(\n item: TQwenResponsesOutputItem,\n): item is IQwenResponsesFunctionCallOutputItem {\n return (\n item.type === 'function_call' && 'call_id' in item && 'name' in item && 'arguments' in item\n );\n}\n\nfunction convertFunctionCall(item: IQwenResponsesFunctionCallOutputItem): IToolCall {\n return {\n id: item.call_id,\n type: 'function',\n function: {\n name: item.name,\n arguments: item.arguments,\n },\n };\n}\n\nfunction extractMessageText(output: readonly TQwenResponsesOutputItem[]): string {\n return output\n .filter((item): item is Extract<TQwenResponsesOutputItem, { type: 'message' }> => {\n return item.type === 'message';\n })\n .flatMap((item) => item.content)\n .map((part) => part.text)\n .join('');\n}\n\nfunction extractErrorMessage(event: IQwenResponsesErrorEvent): string {\n return event.message ?? event.error?.message ?? event.response?.error?.message ?? 'unknown error';\n}\n","import { randomUUID } from 'node:crypto';\nimport type OpenAI from 'openai';\nimport type { IChatOptions, TTextDeltaCallback, TUniversalMessage } from '@robota-sdk/agent-core';\nimport {\n observeProviderNativeRawPayloadStream,\n type IOpenAICompatibleError,\n} from '../shared/openai-compatible/index.js';\nimport {\n buildQwenResponsesTools,\n convertToQwenResponsesInput,\n getQwenBuiltInWebToolNames,\n} from './responses-converter';\nimport { assembleQwenResponsesStream, parseQwenResponsesResponse } from './responses-parser';\nimport type {\n IQwenBuiltInWebToolsOptions,\n IQwenResponsesRequestNonStreaming,\n IQwenResponsesRequestStreaming,\n TQwenResponsesStreamEvent,\n} from './types';\n\nexport interface IQwenResponsesChatOptions {\n client?: OpenAI;\n messages: TUniversalMessage[];\n chatOptions?: IChatOptions;\n defaultModel?: string;\n builtInWebTools?: IQwenBuiltInWebToolsOptions;\n onTextDelta?: TTextDeltaCallback;\n}\n\nexport async function chatWithQwenResponsesApi(\n input: IQwenResponsesChatOptions,\n): Promise<TUniversalMessage> {\n const textDeltaCb = input.chatOptions?.onTextDelta ?? input.onTextDelta;\n if (textDeltaCb) {\n return chatWithQwenResponsesStreamingAssembly({\n ...input,\n chatOptions: {\n ...input.chatOptions,\n onTextDelta: textDeltaCb,\n },\n });\n }\n\n if (!input.client) {\n throw new Error('Qwen Responses client not available for built-in web tools.');\n }\n\n try {\n const requestParams = buildResponsesRequestParams(input);\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'qwen',\n apiSurface: 'responses',\n payloadKind: 'request',\n payload: requestParams,\n });\n const response = await input.client.responses.create(\n requestParams as OpenAI.Responses.ResponseCreateParamsNonStreaming,\n input.chatOptions?.signal ? { signal: input.chatOptions.signal } : undefined,\n );\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'qwen',\n apiSurface: 'responses',\n payloadKind: 'response',\n payload: response,\n });\n return parseQwenResponsesResponse(response, {\n enabledBuiltInTools: getQwenBuiltInWebToolNames(input.builtInWebTools),\n });\n } catch (error) {\n const qwenError = error as IOpenAICompatibleError;\n const errorMessage = qwenError.message || 'Qwen Responses API request failed';\n throw new Error(`Qwen responses failed: ${errorMessage}`);\n }\n}\n\nexport async function* chatStreamWithQwenResponsesApi(\n input: IQwenResponsesChatOptions,\n): AsyncIterable<TUniversalMessage> {\n const deltas: TUniversalMessage[] = [];\n const result = await chatWithQwenResponsesStreamingAssembly({\n ...input,\n chatOptions: {\n ...input.chatOptions,\n onTextDelta: (delta) => {\n input.chatOptions?.onTextDelta?.(delta);\n deltas.push(createStreamDeltaMessage(delta));\n },\n },\n });\n\n for (const delta of deltas) {\n yield delta;\n }\n yield {\n ...result,\n content: '',\n metadata: {\n ...result.metadata,\n isStreamChunk: true,\n isComplete: true,\n },\n };\n}\n\nasync function chatWithQwenResponsesStreamingAssembly(\n input: IQwenResponsesChatOptions,\n): Promise<TUniversalMessage> {\n if (!input.client) {\n throw new Error('Qwen Responses client not available for built-in web tools.');\n }\n\n try {\n const requestParams = buildResponsesStreamingRequestParams(input);\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'qwen',\n apiSurface: 'responses',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await input.client.responses.create(\n requestParams as OpenAI.Responses.ResponseCreateParamsStreaming,\n input.chatOptions?.signal ? { signal: input.chatOptions.signal } : undefined,\n );\n return assembleQwenResponsesStream({\n stream: observeProviderNativeRawPayloadStream(\n stream as AsyncIterable<TQwenResponsesStreamEvent>,\n {\n provider: 'qwen',\n apiSurface: 'responses',\n onProviderNativeRawPayload: input.chatOptions?.onProviderNativeRawPayload,\n },\n ),\n enabledBuiltInTools: getQwenBuiltInWebToolNames(input.builtInWebTools),\n onTextDelta: input.chatOptions?.onTextDelta,\n signal: input.chatOptions?.signal,\n });\n } catch (error) {\n const qwenError = error as IOpenAICompatibleError;\n const errorMessage = qwenError.message || 'Qwen Responses streaming request failed';\n throw new Error(`Qwen responses stream failed: ${errorMessage}`);\n }\n}\n\nfunction buildResponsesRequestParams(\n input: IQwenResponsesChatOptions,\n): IQwenResponsesRequestNonStreaming {\n const model = input.chatOptions?.model ?? input.defaultModel;\n if (!model) {\n throw new Error(\n 'Model is required in chat options. Please specify a model in defaultModel configuration.',\n );\n }\n\n const enabledBuiltInTools = getQwenBuiltInWebToolNames(input.builtInWebTools);\n const tools = buildQwenResponsesTools(enabledBuiltInTools, input.chatOptions?.tools);\n\n return {\n model,\n input: convertToQwenResponsesInput(input.messages),\n ...(tools !== undefined && { tools }),\n ...(input.chatOptions?.temperature !== undefined && {\n temperature: input.chatOptions.temperature,\n }),\n ...(input.chatOptions?.maxTokens !== undefined && {\n max_output_tokens: input.chatOptions.maxTokens,\n }),\n ...(input.builtInWebTools?.enableThinking !== undefined && {\n enable_thinking: input.builtInWebTools.enableThinking,\n }),\n };\n}\n\nfunction buildResponsesStreamingRequestParams(\n input: IQwenResponsesChatOptions,\n): IQwenResponsesRequestStreaming {\n return {\n ...buildResponsesRequestParams(input),\n stream: true,\n };\n}\n\nfunction createStreamDeltaMessage(delta: string): TUniversalMessage {\n return {\n id: randomUUID(),\n role: 'assistant',\n content: delta,\n state: 'complete',\n timestamp: new Date(),\n metadata: {\n isStreamChunk: true,\n isComplete: false,\n },\n };\n}\n","import type { IProviderCapabilities } from '@robota-sdk/agent-core';\nimport type { IQwenProviderOptions } from './types';\n\nconst QWEN_RESPONSES_SOURCE = 'qwen-responses';\nconst ENABLE_WEB_SEARCH_REASON = 'Enable builtInWebTools.webSearch or builtInWebTools.webFetch.';\nconst ENABLE_WEB_FETCH_REASON = 'Enable builtInWebTools.webFetch.';\n\nexport function getQwenProviderCapabilities(options: IQwenProviderOptions): IProviderCapabilities {\n const webTools = options.builtInWebTools;\n const webSearchEnabled = webTools?.webSearch === true || webTools?.webFetch === true;\n const webFetchEnabled = webTools?.webFetch === true;\n\n return {\n functionCalling: { supported: true },\n nativeWebTools: {\n webSearch: webSearchEnabled\n ? { supported: true, enabled: true, source: QWEN_RESPONSES_SOURCE }\n : {\n supported: true,\n enabled: false,\n source: QWEN_RESPONSES_SOURCE,\n reason: ENABLE_WEB_SEARCH_REASON,\n },\n webFetch: webFetchEnabled\n ? { supported: true, enabled: true, source: QWEN_RESPONSES_SOURCE }\n : {\n supported: true,\n enabled: false,\n source: QWEN_RESPONSES_SOURCE,\n reason: ENABLE_WEB_FETCH_REASON,\n },\n },\n };\n}\n","import OpenAI from 'openai';\nimport type { IChatOptions, TUniversalMessage } from '@robota-sdk/agent-core';\nimport {\n assembleOpenAICompatibleStream,\n observeProviderNativeRawPayloadStream,\n} from '../shared/openai-compatible/index.js';\nimport type { IOpenAICompatibleError } from '../shared/openai-compatible/index.js';\n\nexport async function qwenChatWithStreamingAssembly(\n client: OpenAI,\n requestParams: OpenAI.Chat.ChatCompletionCreateParamsStreaming,\n options: IChatOptions,\n): Promise<TUniversalMessage> {\n try {\n options.onProviderNativeRawPayload?.({\n provider: 'qwen',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await client.chat.completions.create(\n requestParams,\n options.signal ? { signal: options.signal } : undefined,\n );\n\n return assembleOpenAICompatibleStream({\n stream: observeProviderNativeRawPayloadStream(stream, {\n provider: 'qwen',\n apiSurface: 'chat-completions',\n onProviderNativeRawPayload: options.onProviderNativeRawPayload,\n }),\n onTextDelta: options.onTextDelta,\n signal: options.signal,\n });\n } catch (error) {\n const qwenError = error as IOpenAICompatibleError;\n const errorMessage = qwenError.message || 'Qwen streaming request failed';\n throw new Error(`Qwen stream failed: ${errorMessage}`);\n }\n}\n","import OpenAI from 'openai';\nimport { AbstractAIProvider, SilentLogger } from '@robota-sdk/agent-core';\nimport type { IChatOptions, TTextDeltaCallback, TUniversalMessage } from '@robota-sdk/agent-core';\nimport {\n assembleOpenAICompatibleStream,\n convertToOpenAICompatibleMessages,\n convertToOpenAICompatibleTools,\n observeProviderNativeRawPayloadStream,\n OpenAICompatibleResponseParser,\n} from '../shared/openai-compatible/index.js';\nimport type { IOpenAICompatibleError } from '../shared/openai-compatible/index.js';\nimport {\n DEFAULT_QWEN_PROVIDER_BASE_URL,\n DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL,\n} from './defaults';\nimport { hasQwenBuiltInWebTools } from './responses-converter';\nimport { chatStreamWithQwenResponsesApi, chatWithQwenResponsesApi } from './responses-chat';\nimport { getQwenProviderCapabilities } from './provider-capabilities';\nimport { qwenChatWithStreamingAssembly } from './provider-streaming-assembly';\nimport type { IQwenProviderOptions } from './types';\n\nexport class QwenProvider extends AbstractAIProvider {\n override readonly name = 'qwen';\n override readonly version = '1.0.0';\n\n private readonly client?: OpenAI;\n private readonly responsesClient?: OpenAI;\n private readonly options: IQwenProviderOptions;\n private readonly responseParser: OpenAICompatibleResponseParser;\n\n onTextDelta?: TTextDeltaCallback;\n\n constructor(options: IQwenProviderOptions) {\n super(options.logger || SilentLogger);\n this.options = options;\n\n if (options.executor) {\n this.executor = options.executor;\n }\n\n if (!this.executor) {\n if (options.client) {\n this.client = options.client;\n this.responsesClient = options.client;\n } else if (options.apiKey) {\n this.client = new OpenAI({\n apiKey: options.apiKey,\n baseURL: options.baseURL ?? DEFAULT_QWEN_PROVIDER_BASE_URL,\n ...(options.timeout !== undefined && { timeout: options.timeout }),\n });\n this.responsesClient = new OpenAI({\n apiKey: options.apiKey,\n baseURL: options.responsesBaseURL ?? DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL,\n ...(options.timeout !== undefined && { timeout: options.timeout }),\n });\n } else {\n throw new Error('Either Qwen client, apiKey, or executor is required');\n }\n }\n\n this.responseParser = new OpenAICompatibleResponseParser({ logger: this.logger });\n }\n\n override async chat(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): Promise<TUniversalMessage> {\n this.validateMessages(messages);\n this.validateNativeWebTools(options?.nativeWebTools);\n\n if (this.executor) {\n return this.chatViaExecutor(messages, options);\n }\n\n if (this.shouldUseResponsesApi()) {\n return this.chatViaResponsesApi(messages, options, this.getResponsesClient());\n }\n\n return this.chatViaChatCompletions(messages, options, this.getClient());\n }\n\n private async chatViaExecutor(\n messages: TUniversalMessage[],\n options: IChatOptions | undefined,\n ): Promise<TUniversalMessage> {\n try {\n return await this.executeViaExecutorOrDirect(messages, options);\n } catch (error) {\n this.logger.error(\n 'Qwen Provider executor chat error:',\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n }\n }\n\n private async chatViaResponsesApi(\n messages: TUniversalMessage[],\n options: IChatOptions | undefined,\n client: OpenAI,\n ): Promise<TUniversalMessage> {\n this.validateTools(options?.tools);\n return chatWithQwenResponsesApi({\n client,\n messages,\n chatOptions: options,\n defaultModel: this.options.defaultModel,\n builtInWebTools: this.options.builtInWebTools,\n onTextDelta: this.onTextDelta,\n });\n }\n\n private async chatViaChatCompletions(\n messages: TUniversalMessage[],\n options: IChatOptions | undefined,\n client: OpenAI,\n ): Promise<TUniversalMessage> {\n try {\n const requestParams = this.buildRequestParams(messages, options);\n const textDeltaCb = options?.onTextDelta ?? this.onTextDelta;\n if (textDeltaCb) {\n return qwenChatWithStreamingAssembly(\n client,\n { ...requestParams, stream: true },\n { ...options, onTextDelta: textDeltaCb },\n );\n }\n\n options?.onProviderNativeRawPayload?.({\n provider: 'qwen',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const response = await client.chat.completions.create(requestParams);\n options?.onProviderNativeRawPayload?.({\n provider: 'qwen',\n apiSurface: 'chat-completions',\n payloadKind: 'response',\n payload: response,\n });\n return this.responseParser.parseResponse(response);\n } catch (error) {\n const qwenError = error as IOpenAICompatibleError;\n const errorMessage = qwenError.message || 'Qwen API request failed';\n throw new Error(`Qwen chat failed: ${errorMessage}`);\n }\n }\n\n override async *chatStream(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): AsyncIterable<TUniversalMessage> {\n this.validateMessages(messages);\n this.validateNativeWebTools(options?.nativeWebTools);\n\n if (this.executor) {\n try {\n yield* this.executeStreamViaExecutorOrDirect(messages, options);\n return;\n } catch (error) {\n this.logger.error(\n 'Qwen Provider executor stream error:',\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n }\n }\n\n if (!this.client) {\n throw new Error(\n 'Qwen client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n\n if (this.shouldUseResponsesApi()) {\n this.validateTools(options?.tools);\n yield* chatStreamWithQwenResponsesApi({\n client: this.responsesClient,\n messages,\n chatOptions: options,\n defaultModel: this.options.defaultModel,\n builtInWebTools: this.options.builtInWebTools,\n onTextDelta: this.onTextDelta,\n });\n return;\n }\n\n try {\n const requestParams = this.buildStreamingRequestParams(messages, options);\n options?.onProviderNativeRawPayload?.({\n provider: 'qwen',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await this.client.chat.completions.create(requestParams);\n\n const observedStream = observeProviderNativeRawPayloadStream(stream, {\n provider: 'qwen',\n apiSurface: 'chat-completions',\n onProviderNativeRawPayload: options?.onProviderNativeRawPayload,\n });\n\n for await (const chunk of this.streamWithAbort(observedStream, options?.signal)) {\n const universalMessage = this.responseParser.parseStreamingChunk(chunk);\n if (universalMessage) {\n yield universalMessage;\n }\n }\n } catch (error) {\n const qwenError = error as IOpenAICompatibleError;\n const errorMessage = qwenError.message || 'Qwen API request failed';\n throw new Error(`Qwen stream failed: ${errorMessage}`);\n }\n }\n\n override supportsTools(): boolean {\n return true;\n }\n\n override getCapabilities() {\n return getQwenProviderCapabilities(this.options);\n }\n\n override validateConfig(): boolean {\n return (\n !!this.client && !!this.options && (!this.shouldUseResponsesApi() || !!this.responsesClient)\n );\n }\n\n override async dispose(): Promise<void> {\n // OpenAI-compatible Qwen clients do not need explicit cleanup.\n }\n\n private buildRequestParams(\n messages: TUniversalMessage[],\n options: IChatOptions | undefined,\n ): OpenAI.Chat.ChatCompletionCreateParamsNonStreaming {\n this.validateTools(options?.tools);\n const model = options?.model ?? this.options.defaultModel;\n if (!model) {\n throw new Error(\n 'Model is required in chat options. Please specify a model in defaultModel configuration.',\n );\n }\n\n const requestParams = {\n model,\n messages: convertToOpenAICompatibleMessages(messages),\n ...(options?.temperature !== undefined && { temperature: options.temperature }),\n ...(options?.maxTokens !== undefined && { max_tokens: options.maxTokens }),\n ...(options?.tools && {\n tools: convertToOpenAICompatibleTools(options.tools),\n tool_choice: 'auto' as const,\n }),\n };\n\n return requestParams as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming;\n }\n\n private buildStreamingRequestParams(\n messages: TUniversalMessage[],\n options: IChatOptions | undefined,\n ): OpenAI.Chat.ChatCompletionCreateParamsStreaming {\n return {\n ...this.buildRequestParams(messages, options),\n stream: true,\n } as OpenAI.Chat.ChatCompletionCreateParamsStreaming;\n }\n\n private shouldUseResponsesApi(): boolean {\n return hasQwenBuiltInWebTools(this.options.builtInWebTools);\n }\n\n private getClient(): OpenAI {\n if (!this.client) {\n throw new Error(\n 'Qwen client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n\n return this.client;\n }\n\n private getResponsesClient(): OpenAI {\n if (!this.responsesClient) {\n throw new Error('Qwen Responses client not available for built-in web tools.');\n }\n\n return this.responsesClient;\n }\n}\n","import type {\n IProviderModelCatalog,\n IProviderModelCatalogEntry,\n IProviderProfileConfig,\n} from '@robota-sdk/agent-core';\nimport {\n DEFAULT_QWEN_PROVIDER_BASE_URL,\n QWEN_MODEL_LAST_VERIFIED_AT,\n QWEN_MODEL_SOURCE_URL,\n} from './defaults';\n\nexport interface IQwenModelsResponse {\n data?: Array<{\n id?: string;\n object?: string;\n owned_by?: string;\n }>;\n}\n\nexport interface IQwenFetchInit {\n headers?: Record<string, string>;\n}\n\nexport interface IQwenFetchResponse {\n ok: boolean;\n status: number;\n json: () => Promise<IQwenModelsResponse>;\n}\n\nexport type TQwenFetch = (url: string, init?: IQwenFetchInit) => Promise<IQwenFetchResponse>;\n\nexport async function refreshQwenModelCatalog(\n profile: IProviderProfileConfig,\n fetcher: TQwenFetch = defaultQwenFetch,\n): Promise<IProviderModelCatalog> {\n const baseURL = trimTrailingSlash(profile.baseURL ?? DEFAULT_QWEN_PROVIDER_BASE_URL);\n const url = `${baseURL}/models`;\n const response = await fetcher(url, buildFetchInit(profile.apiKey));\n\n if (!response.ok) {\n return {\n status: 'unavailable',\n sourceUrl: QWEN_MODEL_SOURCE_URL,\n message: `Qwen model refresh failed: HTTP ${response.status}`,\n };\n }\n\n const body = await response.json();\n const entries = (body.data ?? [])\n .map((model) => model.id)\n .filter((id): id is string => typeof id === 'string' && id.length > 0)\n .map(toModelCatalogEntry);\n\n return {\n status: 'live',\n sourceUrl: QWEN_MODEL_SOURCE_URL,\n lastVerifiedAt: QWEN_MODEL_LAST_VERIFIED_AT,\n entries,\n message: `Loaded ${entries.length} models from Qwen API`,\n };\n}\n\nfunction buildFetchInit(apiKey: string | undefined): IQwenFetchInit | undefined {\n if (!apiKey) {\n return undefined;\n }\n return {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n}\n\nfunction toModelCatalogEntry(id: string): IProviderModelCatalogEntry {\n return {\n id,\n displayName: id,\n lifecycle: 'active',\n sourceUrl: QWEN_MODEL_SOURCE_URL,\n lastVerifiedAt: QWEN_MODEL_LAST_VERIFIED_AT,\n };\n}\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/$/, '');\n}\n\nasync function defaultQwenFetch(url: string, init?: IQwenFetchInit): Promise<IQwenFetchResponse> {\n const response = await fetch(url, {\n ...(init?.headers !== undefined && { headers: init.headers }),\n });\n return {\n ok: response.ok,\n status: response.status,\n json: () => response.json() as Promise<IQwenModelsResponse>,\n };\n}\n","import type { IProviderDefinition } from '@robota-sdk/agent-core';\nimport type { TUniversalValue } from '@robota-sdk/agent-core';\nimport { probeOpenAICompatibleProfile } from '../shared/openai-compatible/index.js';\nimport { QwenProvider } from './provider';\nimport {\n DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE,\n DEFAULT_QWEN_PROVIDER_BASE_URL,\n DEFAULT_QWEN_PROVIDER_MODEL,\n QWEN_MODEL_LAST_VERIFIED_AT,\n QWEN_MODEL_SOURCE_URL,\n} from './defaults';\nimport type { IQwenBuiltInWebToolsOptions } from './types';\nimport { refreshQwenModelCatalog } from './model-catalog-refresh';\n\nconst QWEN_API_KEY_URL = 'https://modelstudio.console.alibabacloud.com/?tab=api#/api-key';\nconst QWEN_SETUP_SOURCE_URL = 'https://www.alibabacloud.com/help/en/model-studio/get-api-key';\nconst QWEN_SETUP_LAST_VERIFIED_AT = '2026-05-08';\nconst QWEN_SETUP_HELP_LINKS: NonNullable<IProviderDefinition['setupHelpLinks']> = [\n {\n kind: 'api-key',\n label: 'Alibaba Cloud Model Studio API keys',\n url: QWEN_API_KEY_URL,\n sourceUrl: QWEN_SETUP_SOURCE_URL,\n lastVerifiedAt: QWEN_SETUP_LAST_VERIFIED_AT,\n },\n];\nconst QWEN_MODEL_CATALOG: NonNullable<IProviderDefinition['modelCatalog']> = {\n status: 'fallback',\n sourceUrl: QWEN_MODEL_SOURCE_URL,\n lastVerifiedAt: QWEN_MODEL_LAST_VERIFIED_AT,\n entries: [\n {\n id: DEFAULT_QWEN_PROVIDER_MODEL,\n displayName: 'Qwen Plus',\n capabilities: ['tools', 'reasoning', 'native_web', 'streaming'],\n lifecycle: 'active',\n sourceUrl: QWEN_MODEL_SOURCE_URL,\n lastVerifiedAt: QWEN_MODEL_LAST_VERIFIED_AT,\n },\n {\n id: 'qwen-max',\n displayName: 'Qwen Max',\n capabilities: ['tools', 'reasoning', 'native_web', 'streaming'],\n lifecycle: 'active',\n sourceUrl: QWEN_MODEL_SOURCE_URL,\n lastVerifiedAt: QWEN_MODEL_LAST_VERIFIED_AT,\n },\n {\n id: 'qwen-flash',\n displayName: 'Qwen Flash',\n capabilities: ['tools', 'native_web', 'streaming'],\n lifecycle: 'active',\n sourceUrl: QWEN_MODEL_SOURCE_URL,\n lastVerifiedAt: QWEN_MODEL_LAST_VERIFIED_AT,\n },\n ],\n};\n\nexport {\n DEFAULT_QWEN_PROVIDER_API_KEY_ENV,\n DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE,\n DEFAULT_QWEN_PROVIDER_BASE_URL,\n DEFAULT_QWEN_PROVIDER_MODEL,\n DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL,\n QWEN_PROVIDER_BASE_URLS,\n QWEN_PROVIDER_RESPONSES_BASE_URLS,\n} from './defaults';\nexport type { TQwenProviderRegion, TQwenProviderResponsesRegion } from './defaults';\n\nexport function createQwenProviderDefinition(): IProviderDefinition {\n return {\n type: 'qwen',\n displayName: 'Qwen',\n description: 'Alibaba Cloud Model Studio OpenAI-compatible endpoint',\n defaults: {\n model: DEFAULT_QWEN_PROVIDER_MODEL,\n apiKey: DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE,\n baseURL: DEFAULT_QWEN_PROVIDER_BASE_URL,\n },\n modelCatalog: QWEN_MODEL_CATALOG,\n refreshModelCatalog: ({ profile }) => refreshQwenModelCatalog(profile),\n modelCatalogCacheTtlSeconds: 86400,\n setupHelpLinks: QWEN_SETUP_HELP_LINKS,\n setupSteps: [\n {\n key: 'baseURL',\n title: 'Qwen OpenAI-compatible base URL',\n defaultValue: DEFAULT_QWEN_PROVIDER_BASE_URL,\n },\n {\n key: 'model',\n title: 'Qwen model',\n defaultValue: DEFAULT_QWEN_PROVIDER_MODEL,\n },\n {\n key: 'apiKey',\n title: 'Qwen Model Studio API key',\n defaultValue: DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE,\n masked: true,\n },\n ],\n requiresApiKey: true,\n probeProfile: probeOpenAICompatibleProfile,\n createProvider: (config) => {\n const qwenOptions = parseQwenProviderOptions(config.options);\n return new QwenProvider({\n apiKey: requireApiKey(config.apiKey),\n ...(config.baseURL !== undefined && { baseURL: config.baseURL }),\n ...(qwenOptions.responsesBaseURL !== undefined && {\n responsesBaseURL: qwenOptions.responsesBaseURL,\n }),\n ...(config.timeout !== undefined && { timeout: config.timeout }),\n ...(qwenOptions.builtInWebTools !== undefined && {\n builtInWebTools: qwenOptions.builtInWebTools,\n }),\n defaultModel: config.model,\n });\n },\n };\n}\n\nfunction requireApiKey(apiKey: string | undefined): string {\n if (!apiKey) {\n throw new Error('Provider qwen requires apiKey');\n }\n return apiKey;\n}\n\nfunction parseQwenProviderOptions(options: Record<string, TUniversalValue> | undefined): {\n responsesBaseURL?: string;\n builtInWebTools?: IQwenBuiltInWebToolsOptions;\n} {\n const builtInWebTools = parseBuiltInWebTools(asRecord(options?.['builtInWebTools']));\n const responsesBaseURL = asString(options?.['responsesBaseURL']);\n return {\n ...(responsesBaseURL !== undefined && { responsesBaseURL }),\n ...(builtInWebTools !== undefined && { builtInWebTools }),\n };\n}\n\nfunction parseBuiltInWebTools(\n options: Record<string, TUniversalValue> | undefined,\n): IQwenBuiltInWebToolsOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...(asBoolean(options['webSearch']) !== undefined && {\n webSearch: asBoolean(options['webSearch']),\n }),\n ...(asBoolean(options['webFetch']) !== undefined && {\n webFetch: asBoolean(options['webFetch']),\n }),\n ...(asBoolean(options['enableThinking']) !== undefined && {\n enableThinking: asBoolean(options['enableThinking']),\n }),\n };\n}\n\nfunction asRecord(value: TUniversalValue | undefined): Record<string, TUniversalValue> | undefined {\n if (value === null || value === undefined || value instanceof Date || Array.isArray(value)) {\n return undefined;\n }\n return typeof value === 'object' ? value : undefined;\n}\n\nfunction asBoolean(value: TUniversalValue | undefined): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined;\n}\n\nfunction asString(value: TUniversalValue | undefined): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./openai-compatible-BYfyY5lb.cjs`);let n=require(`node:crypto`),r=require(`@robota-sdk/agent-core`),i=require(`openai`);i=e.t(i,1);const a={singapore:`https://dashscope-intl.aliyuncs.com/compatible-mode/v1`,usVirginia:`https://dashscope-us.aliyuncs.com/compatible-mode/v1`,beijing:`https://dashscope.aliyuncs.com/compatible-mode/v1`,hongKong:`https://cn-hongkong.dashscope.aliyuncs.com/compatible-mode/v1`},o={singapore:`https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1`,usVirginia:`https://dashscope-us.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1`,beijing:`https://dashscope.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1`},s=`qwen-plus`,c=`DASHSCOPE_API_KEY`,l=`$ENV:${c}`,u=a.singapore,d=o.singapore,f=`https://www.alibabacloud.com/help/en/model-studio/compatibility-of-openai-with-dashscope`,p=`2026-05-04`;function m(e){let t=[];return(e?.webSearch===!0||e?.webFetch===!0)&&t.push(`web_search`),e?.webFetch===!0&&t.push(`web_extractor`),t}function h(e){return m(e).length>0}function g(e){return e.flatMap(e=>ee(e))}function _(e,t){let n=[...e.map(e=>({type:e})),...v(t)];return n.length>0?n:void 0}function v(e){return e?.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.parameters}))??[]}function ee(e){return e.role===`user`?[y(`user`,e.content)]:e.role===`system`?[y(`system`,e.content)]:e.role===`tool`?[{type:`function_call_output`,call_id:e.toolCallId,output:e.content||``}]:te(e)}function te(e){let t=[];e.content&&e.content.length>0&&t.push(y(`assistant`,e.content));for(let n of e.toolCalls??[])t.push({type:`function_call`,call_id:n.id,name:n.function.name,arguments:n.function.arguments});return t.length===0&&t.push(y(`assistant`,``)),t}function y(e,t){return{role:e,content:t??``}}async function*b(e,t){let n=e[Symbol.asyncIterator]();try{for(;!t?.aborted;){let e=await x(n,t);if(e.done||t?.aborted)break;yield e.value}}finally{t?.aborted&&await n.return?.()}}async function x(e,t){if(!t)return e.next();if(t.aborted)return{done:!0,value:void 0};let n,r=new Promise(e=>{n=()=>e({done:!0,value:void 0}),t.addEventListener(`abort`,n,{once:!0})});try{return await Promise.race([e.next(),r])}finally{n&&t.removeEventListener(`abort`,n)}}function S(e,t){let n=e.output??[],r=A(n,e.usage),i=F(n);return D({content:e.output_text??R(n),toolCalls:i,response:e,usage:r,enabledBuiltInTools:t.enabledBuiltInTools})}async function C(e){let t={textParts:[],toolCalls:[],usage:N()};for await(let n of b(e.stream,e.signal))w(t,n,e.onTextDelta);return t.completedResponse===void 0?D({content:t.textParts.join(``),toolCalls:t.toolCalls,usage:t.usage,enabledBuiltInTools:e.enabledBuiltInTools}):T(t,e.enabledBuiltInTools)}function w(e,t,n){if(t.type===`response.output_text.delta`){e.textParts.push(t.delta),n?.(t.delta);return}if(t.type===`response.completed`){e.completedResponse=t.response,M(e.usage,A(t.response.output??[],t.response.usage));return}if(t.type===`response.output_item.done`){E(e,t.item);return}if(t.type===`response.web_search_call.completed`){e.usage.webSearchCalls+=1;return}if(t.type===`response.error`||t.type===`response.failed`)throw Error(`Qwen Responses API failed: ${z(t)}`)}function T(e,t){let n=e.completedResponse;if(n===void 0)throw Error(`Qwen Responses stream completed without response metadata`);let r=n.output??[],i=F(r),a=e.textParts.length>0?e.textParts.join(``):n.output_text??R(r),o=A(r,n.usage);return M(o,e.usage),D({content:a,toolCalls:i.length>0?i:e.toolCalls,response:n,usage:o,enabledBuiltInTools:t})}function E(e,t){if(t.type===`function_call`){I(t)&&e.toolCalls.push(L(t));return}M(e.usage,A([t],void 0))}function D(e){return{id:(0,n.randomUUID)(),role:`assistant`,content:e.content,state:`complete`,timestamp:new Date,...e.toolCalls.length>0&&{toolCalls:e.toolCalls},...e.response?.usage!==void 0&&{usage:{promptTokens:e.response.usage.input_tokens??0,completionTokens:e.response.usage.output_tokens??0,totalTokens:e.response.usage.total_tokens??0}},metadata:O(e.enabledBuiltInTools,e.usage,e.response)}}function O(e,t,n){let r=k(t);return{providerToolMode:`qwen_responses`,providerBuiltInToolsEnabled:[...e],...r.length>0&&{providerBuiltInToolsUsed:r},qwenWebSearchCalls:t.webSearchCalls,qwenWebExtractorCalls:t.webExtractorCalls,...t.unsupportedToolTypes.size>0&&{qwenUnsupportedProviderToolTypes:[...t.unsupportedToolTypes].sort()},...n?.id!==void 0&&{responseId:n.id},...n?.model!==void 0&&{model:n.model},...n?.status!==void 0&&{finishReason:n.status}}}function k(e){let t=[];return e.webSearchCalls>0&&t.push(`web_search`),e.webExtractorCalls>0&&t.push(`web_extractor`),t}function A(e,t){let n=N();for(let t of e)t.type===`web_search_call`?n.webSearchCalls+=1:t.type===`web_extractor_call`?n.webExtractorCalls+=1:P(t.type)&&n.unsupportedToolTypes.add(t.type);return j(n,t),n}function j(e,t){let n=t?.x_tools;if(n!==void 0){e.webSearchCalls=Math.max(e.webSearchCalls,n.web_search?.count??0),e.webExtractorCalls=Math.max(e.webExtractorCalls,n.web_extractor?.count??0);for(let t of Object.keys(n))t!==`web_search`&&t!==`web_extractor`&&e.unsupportedToolTypes.add(t)}}function M(e,t){e.webSearchCalls=Math.max(e.webSearchCalls,t.webSearchCalls),e.webExtractorCalls=Math.max(e.webExtractorCalls,t.webExtractorCalls);for(let n of t.unsupportedToolTypes)e.unsupportedToolTypes.add(n)}function N(){return{webSearchCalls:0,webExtractorCalls:0,unsupportedToolTypes:new Set}}function P(e){return e.endsWith(`_call`)&&e!==`function_call`}function F(e){return e.filter(I).map(e=>L(e))}function I(e){return e.type===`function_call`&&`call_id`in e&&`name`in e&&`arguments`in e}function L(e){return{id:e.call_id,type:`function`,function:{name:e.name,arguments:e.arguments}}}function R(e){return e.filter(e=>e.type===`message`).flatMap(e=>e.content).map(e=>e.text).join(``)}function z(e){return e.message??e.error?.message??e.response?.error?.message??`unknown error`}async function B(e){let t=e.chatOptions?.onTextDelta??e.onTextDelta;if(t)return H({...e,chatOptions:{...e.chatOptions,onTextDelta:t}});if(!e.client)throw Error(`Qwen Responses client not available for built-in web tools.`);try{let t=U(e);e.chatOptions?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`responses`,payloadKind:`request`,payload:t});let n=await e.client.responses.create(t,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`responses`,payloadKind:`response`,payload:n}),S(n,{enabledBuiltInTools:m(e.builtInWebTools)})}catch(e){let t=e.message||`Qwen Responses API request failed`;throw Error(`Qwen responses failed: ${t}`)}}async function*V(e){let t=[],n=await H({...e,chatOptions:{...e.chatOptions,onTextDelta:n=>{e.chatOptions?.onTextDelta?.(n),t.push(ne(n))}}});for(let e of t)yield e;yield{...n,content:``,metadata:{...n.metadata,isStreamChunk:!0,isComplete:!0}}}async function H(e){if(!e.client)throw Error(`Qwen Responses client not available for built-in web tools.`);try{let n=W(e);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`responses`,payloadKind:`request`,payload:n}),C({stream:t.n(await e.client.responses.create(n,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0),{provider:`qwen`,apiSurface:`responses`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload}),enabledBuiltInTools:m(e.builtInWebTools),onTextDelta:e.chatOptions?.onTextDelta,signal:e.chatOptions?.signal})}catch(e){let t=e.message||`Qwen Responses streaming request failed`;throw Error(`Qwen responses stream failed: ${t}`)}}function U(e){let t=e.chatOptions?.model??e.defaultModel;if(!t)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let n=_(m(e.builtInWebTools),e.chatOptions?.tools);return{model:t,input:g(e.messages),...n!==void 0&&{tools:n},...e.chatOptions?.temperature!==void 0&&{temperature:e.chatOptions.temperature},...e.chatOptions?.maxTokens!==void 0&&{max_output_tokens:e.chatOptions.maxTokens},...e.builtInWebTools?.enableThinking!==void 0&&{enable_thinking:e.builtInWebTools.enableThinking}}}function W(e){return{...U(e),stream:!0}}function ne(e){return{id:(0,n.randomUUID)(),role:`assistant`,content:e,state:`complete`,timestamp:new Date,metadata:{isStreamChunk:!0,isComplete:!1}}}const G=`qwen-responses`;function K(e){let t=e.builtInWebTools,n=t?.webSearch===!0||t?.webFetch===!0,r=t?.webFetch===!0;return{functionCalling:{supported:!0},nativeWebTools:{webSearch:n?{supported:!0,enabled:!0,source:G}:{supported:!0,enabled:!1,source:G,reason:`Enable builtInWebTools.webSearch or builtInWebTools.webFetch.`},webFetch:r?{supported:!0,enabled:!0,source:G}:{supported:!0,enabled:!1,source:G,reason:`Enable builtInWebTools.webFetch.`}}}}async function q(e,n,r){try{return r.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`request`,payload:n}),t.r({stream:t.n(await e.chat.completions.create(n,r.signal?{signal:r.signal}:void 0),{provider:`qwen`,apiSurface:`chat-completions`,onProviderNativeRawPayload:r.onProviderNativeRawPayload}),onTextDelta:r.onTextDelta,signal:r.signal})}catch(e){let t=e.message||`Qwen streaming request failed`;throw Error(`Qwen stream failed: ${t}`)}}var J=class extends r.AbstractAIProvider{name=`qwen`;version=`1.0.0`;client;responsesClient;options;responseParser;onTextDelta;constructor(e){if(super(e.logger||r.SilentLogger),this.options=e,e.executor&&(this.executor=e.executor),!this.executor)if(e.client)this.client=e.client,this.responsesClient=e.client;else if(e.apiKey)this.client=new i.default({apiKey:e.apiKey,baseURL:e.baseURL??u,...e.timeout!==void 0&&{timeout:e.timeout}}),this.responsesClient=new i.default({apiKey:e.apiKey,baseURL:e.responsesBaseURL??d,...e.timeout!==void 0&&{timeout:e.timeout}});else throw Error(`Either Qwen client, apiKey, or executor is required`);this.responseParser=new t.i({logger:this.logger})}async chat(e,t){return this.validateMessages(e),this.validateNativeWebTools(t?.nativeWebTools),this.executor?this.chatViaExecutor(e,t):this.shouldUseResponsesApi()?this.chatViaResponsesApi(e,t,this.getResponsesClient()):this.chatViaChatCompletions(e,t,this.getClient())}async chatViaExecutor(e,t){try{return await this.executeViaExecutorOrDirect(e,t)}catch(e){throw this.logger.error(`Qwen Provider executor chat error:`,e instanceof Error?e.message:String(e)),e}}async chatViaResponsesApi(e,t,n){return this.validateTools(t?.tools),B({client:n,messages:e,chatOptions:t,defaultModel:this.options.defaultModel,builtInWebTools:this.options.builtInWebTools,onTextDelta:this.onTextDelta})}async chatViaChatCompletions(e,t,n){try{let r=this.buildRequestParams(e,t),i=t?.onTextDelta??this.onTextDelta;if(i)return q(n,{...r,stream:!0},{...t,onTextDelta:i});t?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r});let a=await n.chat.completions.create(r);return t?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`response`,payload:a}),this.responseParser.parseResponse(a)}catch(e){let t=e.message||`Qwen API request failed`;throw Error(`Qwen chat failed: ${t}`)}}async*chatStream(e,n){if(this.validateMessages(e),this.validateNativeWebTools(n?.nativeWebTools),this.executor)try{yield*this.executeStreamViaExecutorOrDirect(e,n);return}catch(e){throw this.logger.error(`Qwen Provider executor stream error:`,e instanceof Error?e.message:String(e)),e}if(!this.client)throw Error(`Qwen client not available. Either provide a client/apiKey or use an executor.`);if(this.shouldUseResponsesApi()){this.validateTools(n?.tools),yield*V({client:this.responsesClient,messages:e,chatOptions:n,defaultModel:this.options.defaultModel,builtInWebTools:this.options.builtInWebTools,onTextDelta:this.onTextDelta});return}try{let r=this.buildStreamingRequestParams(e,n);n?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r});let i=t.n(await this.client.chat.completions.create(r),{provider:`qwen`,apiSurface:`chat-completions`,onProviderNativeRawPayload:n?.onProviderNativeRawPayload});for await(let e of this.streamWithAbort(i,n?.signal)){let t=this.responseParser.parseStreamingChunk(e);t&&(yield t)}}catch(e){let t=e.message||`Qwen API request failed`;throw Error(`Qwen stream failed: ${t}`)}}supportsTools(){return!0}getCapabilities(){return K(this.options)}validateConfig(){return!!this.client&&!!this.options&&(!this.shouldUseResponsesApi()||!!this.responsesClient)}async dispose(){}buildRequestParams(e,n){this.validateTools(n?.tools);let r=n?.model??this.options.defaultModel;if(!r)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);return{model:r,messages:t.a(e),...n?.temperature!==void 0&&{temperature:n.temperature},...n?.maxTokens!==void 0&&{max_tokens:n.maxTokens},...n?.tools&&{tools:t.o(n.tools),tool_choice:`auto`}}}buildStreamingRequestParams(e,t){return{...this.buildRequestParams(e,t),stream:!0}}shouldUseResponsesApi(){return h(this.options.builtInWebTools)}getClient(){if(!this.client)throw Error(`Qwen client not available. Either provide a client/apiKey or use an executor.`);return this.client}getResponsesClient(){if(!this.responsesClient)throw Error(`Qwen Responses client not available for built-in web tools.`);return this.responsesClient}};async function Y(e,t=re){let n=await t(`${Q(e.baseURL??u)}/models`,X(e.apiKey));if(!n.ok)return{status:`unavailable`,sourceUrl:f,message:`Qwen model refresh failed: HTTP ${n.status}`};let r=((await n.json()).data??[]).map(e=>e.id).filter(e=>typeof e==`string`&&e.length>0).map(Z);return{status:`live`,sourceUrl:f,lastVerifiedAt:p,entries:r,message:`Loaded ${r.length} models from Qwen API`}}function X(e){if(e)return{headers:{Authorization:`Bearer ${e}`}}}function Z(e){return{id:e,displayName:e,lifecycle:`active`,sourceUrl:f,lastVerifiedAt:p}}function Q(e){return e.replace(/\/$/,``)}async function re(e,t){let n=await fetch(e,{...t?.headers!==void 0&&{headers:t.headers}});return{ok:n.ok,status:n.status,json:()=>n.json()}}const ie=[{kind:`api-key`,label:`Alibaba Cloud Model Studio API keys`,url:`https://modelstudio.console.alibabacloud.com/?tab=api#/api-key`,sourceUrl:`https://www.alibabacloud.com/help/en/model-studio/get-api-key`,lastVerifiedAt:`2026-05-08`}],ae={status:`fallback`,sourceUrl:f,lastVerifiedAt:p,entries:[{id:s,displayName:`Qwen Plus`,capabilities:[`tools`,`reasoning`,`native_web`,`streaming`],lifecycle:`active`,sourceUrl:f,lastVerifiedAt:p},{id:`qwen-max`,displayName:`Qwen Max`,capabilities:[`tools`,`reasoning`,`native_web`,`streaming`],lifecycle:`active`,sourceUrl:f,lastVerifiedAt:p},{id:`qwen-flash`,displayName:`Qwen Flash`,capabilities:[`tools`,`native_web`,`streaming`],lifecycle:`active`,sourceUrl:f,lastVerifiedAt:p}]};function oe(){return{type:`qwen`,displayName:`Qwen`,description:`Alibaba Cloud Model Studio OpenAI-compatible endpoint`,defaults:{model:s,apiKey:l,baseURL:u},modelCatalog:ae,refreshModelCatalog:({profile:e})=>Y(e),modelCatalogCacheTtlSeconds:86400,setupHelpLinks:ie,setupSteps:[{key:`baseURL`,title:`Qwen OpenAI-compatible base URL`,defaultValue:u},{key:`model`,title:`Qwen model`,defaultValue:s},{key:`apiKey`,title:`Qwen Model Studio API key`,defaultValue:l,masked:!0}],requiresApiKey:!0,probeProfile:t.t,createProvider:e=>{let t=ce(e.options);return new J({apiKey:se(e.apiKey),...e.baseURL!==void 0&&{baseURL:e.baseURL},...t.responsesBaseURL!==void 0&&{responsesBaseURL:t.responsesBaseURL},...e.timeout!==void 0&&{timeout:e.timeout},...t.builtInWebTools!==void 0&&{builtInWebTools:t.builtInWebTools},defaultModel:e.model})}}}function se(e){if(!e)throw Error(`Provider qwen requires apiKey`);return e}function ce(e){let t=le(ue(e?.builtInWebTools)),n=de(e?.responsesBaseURL);return{...n!==void 0&&{responsesBaseURL:n},...t!==void 0&&{builtInWebTools:t}}}function le(e){if(e!==void 0)return{...$(e.webSearch)!==void 0&&{webSearch:$(e.webSearch)},...$(e.webFetch)!==void 0&&{webFetch:$(e.webFetch)},...$(e.enableThinking)!==void 0&&{enableThinking:$(e.enableThinking)}}}function ue(e){if(!(e==null||e instanceof Date||Array.isArray(e)))return typeof e==`object`?e:void 0}function $(e){return typeof e==`boolean`?e:void 0}function de(e){return typeof e==`string`&&e.length>0?e:void 0}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return oe}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return f}});
|
package/package.json
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@robota-sdk/agent-provider",
|
|
3
|
+
"version": "3.0.0-beta.64",
|
|
4
|
+
"description": "Consolidated AI provider implementations for Robota SDK",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"main": "dist/node/index.js",
|
|
10
|
+
"types": "dist/node/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/node/index.d.ts",
|
|
14
|
+
"source": "./src/index.ts",
|
|
15
|
+
"node": {
|
|
16
|
+
"import": "./dist/node/index.js",
|
|
17
|
+
"require": "./dist/node/index.cjs"
|
|
18
|
+
},
|
|
19
|
+
"default": {
|
|
20
|
+
"import": "./dist/node/index.js",
|
|
21
|
+
"require": "./dist/node/index.cjs"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"./anthropic": {
|
|
25
|
+
"types": "./dist/node/anthropic/index.d.ts",
|
|
26
|
+
"source": "./src/anthropic/index.ts",
|
|
27
|
+
"node": {
|
|
28
|
+
"import": "./dist/node/anthropic/index.js",
|
|
29
|
+
"require": "./dist/node/anthropic/index.cjs"
|
|
30
|
+
},
|
|
31
|
+
"default": {
|
|
32
|
+
"import": "./dist/node/anthropic/index.js",
|
|
33
|
+
"require": "./dist/node/anthropic/index.cjs"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"./openai": {
|
|
37
|
+
"types": "./dist/node/openai/index.d.ts",
|
|
38
|
+
"source": "./src/openai/index.ts",
|
|
39
|
+
"node": {
|
|
40
|
+
"import": "./dist/node/openai/index.js",
|
|
41
|
+
"require": "./dist/node/openai/index.cjs"
|
|
42
|
+
},
|
|
43
|
+
"default": {
|
|
44
|
+
"import": "./dist/node/openai/index.js",
|
|
45
|
+
"require": "./dist/node/openai/index.cjs"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"./openai/loggers": {
|
|
49
|
+
"types": "./dist/loggers/index.d.ts",
|
|
50
|
+
"source": "./src/openai/loggers/index.ts",
|
|
51
|
+
"node": {
|
|
52
|
+
"import": "./dist/loggers/index.js",
|
|
53
|
+
"require": "./dist/loggers/index.cjs"
|
|
54
|
+
},
|
|
55
|
+
"default": {
|
|
56
|
+
"import": "./dist/loggers/index.js",
|
|
57
|
+
"require": "./dist/loggers/index.cjs"
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"./deepseek": {
|
|
61
|
+
"types": "./dist/node/deepseek/index.d.ts",
|
|
62
|
+
"source": "./src/deepseek/index.ts",
|
|
63
|
+
"node": {
|
|
64
|
+
"import": "./dist/node/deepseek/index.js",
|
|
65
|
+
"require": "./dist/node/deepseek/index.cjs"
|
|
66
|
+
},
|
|
67
|
+
"default": {
|
|
68
|
+
"import": "./dist/node/deepseek/index.js",
|
|
69
|
+
"require": "./dist/node/deepseek/index.cjs"
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
"./gemini": {
|
|
73
|
+
"types": "./dist/node/gemini/index.d.ts",
|
|
74
|
+
"source": "./src/gemini/index.ts",
|
|
75
|
+
"node": {
|
|
76
|
+
"import": "./dist/node/gemini/index.js",
|
|
77
|
+
"require": "./dist/node/gemini/index.cjs"
|
|
78
|
+
},
|
|
79
|
+
"default": {
|
|
80
|
+
"import": "./dist/node/gemini/index.js",
|
|
81
|
+
"require": "./dist/node/gemini/index.cjs"
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"./google": {
|
|
85
|
+
"types": "./dist/node/google/index.d.ts",
|
|
86
|
+
"source": "./src/google/index.ts",
|
|
87
|
+
"node": {
|
|
88
|
+
"import": "./dist/node/google/index.js",
|
|
89
|
+
"require": "./dist/node/google/index.cjs"
|
|
90
|
+
},
|
|
91
|
+
"default": {
|
|
92
|
+
"import": "./dist/node/google/index.js",
|
|
93
|
+
"require": "./dist/node/google/index.cjs"
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"./gemma": {
|
|
97
|
+
"types": "./dist/node/gemma/index.d.ts",
|
|
98
|
+
"source": "./src/gemma/index.ts",
|
|
99
|
+
"node": {
|
|
100
|
+
"import": "./dist/node/gemma/index.js",
|
|
101
|
+
"require": "./dist/node/gemma/index.cjs"
|
|
102
|
+
},
|
|
103
|
+
"default": {
|
|
104
|
+
"import": "./dist/node/gemma/index.js",
|
|
105
|
+
"require": "./dist/node/gemma/index.cjs"
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
"./bytedance": {
|
|
109
|
+
"types": "./dist/node/bytedance/index.d.ts",
|
|
110
|
+
"source": "./src/bytedance/index.ts",
|
|
111
|
+
"node": {
|
|
112
|
+
"import": "./dist/node/bytedance/index.js",
|
|
113
|
+
"require": "./dist/node/bytedance/index.cjs"
|
|
114
|
+
},
|
|
115
|
+
"default": {
|
|
116
|
+
"import": "./dist/node/bytedance/index.js",
|
|
117
|
+
"require": "./dist/node/bytedance/index.cjs"
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
"./qwen": {
|
|
121
|
+
"types": "./dist/node/qwen/index.d.ts",
|
|
122
|
+
"source": "./src/qwen/index.ts",
|
|
123
|
+
"node": {
|
|
124
|
+
"import": "./dist/node/qwen/index.js",
|
|
125
|
+
"require": "./dist/node/qwen/index.cjs"
|
|
126
|
+
},
|
|
127
|
+
"default": {
|
|
128
|
+
"import": "./dist/node/qwen/index.js",
|
|
129
|
+
"require": "./dist/node/qwen/index.cjs"
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
"files": [
|
|
134
|
+
"dist",
|
|
135
|
+
"src"
|
|
136
|
+
],
|
|
137
|
+
"dependencies": {
|
|
138
|
+
"@anthropic-ai/sdk": "^0.80.0",
|
|
139
|
+
"@google/genai": "^1.51.0",
|
|
140
|
+
"openai": "^4.98.0",
|
|
141
|
+
"@robota-sdk/agent-core": "3.0.0-beta.64"
|
|
142
|
+
},
|
|
143
|
+
"devDependencies": {
|
|
144
|
+
"@types/node": "^22.14.0",
|
|
145
|
+
"rimraf": "^6.0.1",
|
|
146
|
+
"tsdown": "^0.22.0",
|
|
147
|
+
"typescript": "^5.8.3",
|
|
148
|
+
"vitest": "^1.1.0"
|
|
149
|
+
},
|
|
150
|
+
"scripts": {
|
|
151
|
+
"build": "tsdown",
|
|
152
|
+
"typecheck": "tsc --noEmit",
|
|
153
|
+
"test": "vitest run",
|
|
154
|
+
"test:coverage": "vitest run --coverage",
|
|
155
|
+
"clean": "rimraf dist"
|
|
156
|
+
}
|
|
157
|
+
}
|