@juspay/neurolink 11.11.6 → 11.12.0

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/CHANGELOG.md CHANGED
@@ -1,4 +1,8 @@
1
- ## [11.11.6](https://github.com/juspay/neurolink/compare/v11.11.5...v11.11.6) (2026-08-21)
1
+ ## [11.12.0](https://github.com/juspay/neurolink/compare/v11.11.7...v11.12.0) (2026-08-21)
2
+
3
+ ### Features
4
+
5
+ - **(googleVertex):** support Vertex AI Express Mode and an endpoint override ([115be83](https://github.com/juspay/neurolink/commit/115be8391de0ff0e2fed412045e0e29f433ead74))
2
6
 
3
7
  ## [11.2.3](https://github.com/juspay/neurolink/compare/v11.2.2...v11.2.3) (2026-08-19)
4
8
 
@@ -1126,7 +1126,7 @@ ${t[0].text}`;let n=t.length-1;t[n].text=`${t[n].text}
1126
1126
  IMPORTANT: You MUST call the 'final_result' tool to return your response in the required structured format. Do not respond with plain text - always use the final_result tool.`});function qSr(r,e){switch(r){case"max_tokens":return"length";case"tool_use":return"tool-calls";case"refusal":return"content-filter";default:return e?"tool-calls":"stop"}}function DBe(r){return{providerLabel:"anthropic",maxSteps:r.maxSteps,...r.toolFailureBreaker?{toolFailureBreaker:r.toolFailureBreaker}:{},...r.planReclaim?{planReclaim:(e,t)=>{let n=r.planReclaim?.(e,t);return n?{conversation:n}:void 0}}:{},resolveToolOnMiss:e=>{let n=pI(r.toolsRecord,e)?.execute;if(n)return{execute:async(o,s)=>n(o,s)}},buildStepRequest(e,t){return{raw:r.buildParams(e,t)}},async executeStep(e,t,n){let o=e.raw,s=await r.client.messages.create({...o,stream:!0},{signal:n}),i=new Map,a=new Map,l=new Map,c=new Map,u="",p="",m,f=0,h=0,y=0,x=0,b=0;for await(let A of s){if(n.aborted)break;let M=A;if(M.type==="message_start"){let L=M.message?.usage;f+=L?.input_tokens??0;let U=L?.output_tokens??0;h+=U-b,b=U,y+=L?.cache_read_input_tokens??0,x+=L?.cache_creation_input_tokens??0,r.noteObservedPromptTokens?.((L?.input_tokens??0)+(L?.cache_read_input_tokens??0)+(L?.cache_creation_input_tokens??0));continue}if(M.type==="content_block_start"){let L=M.index??0;if(M.content_block?.type==="redacted_thinking"){let U=M.content_block.data;typeof U=="string"&&c.set(L,U)}M.content_block?.type==="tool_use"&&a.set(L,{id:M.content_block.id??"",name:M.content_block.name??"",inputJson:""});continue}if(M.type==="content_block_delta"){let L=M.index??0,U=M.delta;if(U?.type==="text_delta"&&U.text)u+=U.text,i.set(L,(i.get(L)??"")+U.text),t.push({content:U.text});else if(U?.type==="thinking_delta"&&U.thinking){let D=l.get(L)??{text:"",signature:""};D.text+=U.thinking,l.set(L,D),p+=U.thinking,t.push({content:"",reasoning:U.thinking})}else if(U?.type==="signature_delta"&&U.signature){let D=l.get(L)??{text:"",signature:""};D.signature+=U.signature,l.set(L,D)}else if(U?.type==="input_json_delta"&&U.partial_json){let D=a.get(L);D&&(D.inputJson+=U.partial_json)}continue}if(M.type==="message_delta"){m=M.delta?.stop_reason??m;let L=M.usage?.output_tokens??b;h+=L-b,b=L}}let T=A=>{if(!A)return{};try{let M=JSON.parse(A);return typeof M=="object"&&M!==null&&!Array.isArray(M)?M:{}}catch{return{}}},w=[],C=new Set([...i.keys(),...a.keys(),...l.keys(),...c.keys()]);for(let A of[...C].sort((M,L)=>M-L)){let M=c.get(A);M&&w.push({type:"redacted_thinking",data:M});let L=l.get(A);L?.text&&L.signature&&w.push({type:"thinking",thinking:L.text,signature:L.signature});let U=i.get(A);U&&w.push({type:"text",text:U});let D=a.get(A);D&&w.push({type:"tool_use",id:D.id,name:D.name,input:T(D.inputJson)})}let R=[...a.values()].map(A=>({id:A.id,name:A.name,args:T(A.inputJson)})),k=r.finalResultToolName?[...a.values()].find(A=>A.name===r.finalResultToolName):void 0,P=k?[]:R,I=k?LBe(k.inputJson):u;return k&&r.onTerminalResult?.(I),{text:I,...p?{reasoning:p}:{},toolCalls:P,usage:{inputTokens:f,outputTokens:h,cacheReadTokens:y,cacheWriteTokens:x},rawStopReason:m,raw:w}},buildToolResultMessages(e,t,n){let o={role:"assistant",content:t.raw},s={role:"user",content:n.map(i=>({type:"tool_result",tool_use_id:i.id,content:i.error?`Error executing tool ${i.name}: ${i.error}`:Mq(i.output),...i.error?{is_error:!0}:{}}))};return[...e,o,s]},mapFinishReason:qSr}}var UBe=E(()=>{"use strict";mI();Ese();Ase()});function Pse(r){if(r.length>=8&&r[0]===137&&r[1]===80&&r[2]===78&&r[3]===71)return"image/png";if(r.length>=3&&r[0]===255&&r[1]===216&&r[2]===255)return"image/jpeg";if(r.length>=6&&r[0]===71&&r[1]===73&&r[2]===70)return"image/gif";if(r.length>=12&&r[0]===82&&r[1]===73&&r[2]===70&&r[3]===70&&r[8]===87&&r[9]===69&&r[10]===66&&r[11]===80)return"image/webp"}function fM(r,e){if(r instanceof ArrayBuffer)return fM(new Uint8Array(r),e);if(r instanceof Uint8Array)return{type:"image",source:{type:"base64",media_type:Ise(e)??Pse(r)??"image/png",data:Buffer.from(r).toString("base64")}};if(typeof r!="string"&&!(r instanceof URL))return;let t=r instanceof URL?r.toString():r,n=t.match(/^data:(image\/[a-z0-9+.-]+);base64,(.+)$/i);if(n){let s=Ise(n[1])??FBe(n[2]);return s?{type:"image",source:{type:"base64",media_type:s,data:n[2]}}:void 0}return/^https?:\/\//i.test(t)?{type:"image",source:{type:"url",url:t}}:{type:"image",source:{type:"base64",media_type:Ise(e)??FBe(t)??"image/png",data:t}}}function zBe(r){let e=r?.data;if(e==null)return;let t=typeof r.mediaType=="string"?r.mediaType.toLowerCase().split(";")[0].trim():"";if($Be.has(t)||t==="image/jpg")return fM(e,t);if(t==="application/pdf")return BBe(e);let n=e instanceof ArrayBuffer?new Uint8Array(e):e instanceof Uint8Array?e:void 0;if(n&&Pse(n))return fM(n)}var $Be,Ise,VSr,FBe,BBe,jBe=E(()=>{"use strict";$Be=new Set(["image/jpeg","image/png","image/gif","image/webp"]),Ise=r=>{if(!r)return;let e=r.toLowerCase().split(";")[0].trim();return e==="image/jpg"?"image/jpeg":$Be.has(e)?e:void 0};VSr=32,FBe=r=>{try{return Pse(Buffer.from(r.slice(0,VSr),"base64"))}catch{return}};BBe=r=>{if(r instanceof ArrayBuffer)return BBe(new Uint8Array(r));if(r instanceof Uint8Array)return{type:"document",source:{type:"base64",media_type:"application/pdf",data:Buffer.from(r).toString("base64")}};if(r instanceof URL)return{type:"document",source:{type:"url",url:r.toString()}};if(typeof r=="string"){let e=r.match(/^data:application\/pdf;base64,(.+)$/i);return e?{type:"document",source:{type:"base64",media_type:"application/pdf",data:e[1]}}:/^https?:\/\//i.test(r)?{type:"document",source:{type:"url",url:r}}:{type:"document",source:{type:"base64",media_type:"application/pdf",data:r}}}}});var Oq,Mse=E(()=>{"use strict";Oq={"anthropic-beta":["claude-code-20250219","fine-grained-tool-streaming-2025-05-14"].join(",")}});var GBe,Nq,HSr,qBe,KSr,WSr,VBe,HBe,JSr,KBe,Ose,WBe=E(()=>{"use strict";loe();gr();to();wd();Qr();NE();eu();Xo();hne();yse();xBe();oo();kBe();Dt();ea();Y();bse();Fd();gi();Hr();_se();Ld();Ese();UBe();eG();Ko();_l();yne();ZB();Mp();Oj();Ea();qj();jBe();cg();Rg();Wv();oG();Mse();Bre();Ase();yse();GBe=()=>an(iye()),Nq=()=>ln("ANTHROPIC_MODEL","claude-sonnet-4-6"),HSr=ft.getTracer("neurolink.provider.anthropic"),qBe=()=>{try{let e=Fr(Pp(),".neurolink","anthropic-credentials.json");if(eo(e)){let t=Gc(e,"utf-8"),n=JSON.parse(t);if(n.type==="oauth"&&n.oauth?.accessToken)return g.debug("[AnthropicProvider] Using OAuth token from stored credentials file"),n.oauth}}catch(e){g.debug("[AnthropicProvider] Failed to read stored credentials:",e)}let r=process.env.ANTHROPIC_OAUTH_TOKEN||process.env.CLAUDE_OAUTH_TOKEN;if(!r)return null;try{let e=JSON.parse(r);if(typeof e=="object"&&e.accessToken)return e;if(typeof e=="string")return{accessToken:e}}catch{}return{accessToken:r}},KSr=r=>{let e=process.env.ANTHROPIC_SUBSCRIPTION_TIER?.toLowerCase();if(e){let t=["free","pro","max","max_5","max_20","api"];if(t.includes(e))return g.debug("[detectSubscriptionTier] Using environment override",{tier:e}),e;g.warn("[detectSubscriptionTier] Invalid ANTHROPIC_SUBSCRIPTION_TIER",{value:e,validTiers:t})}if(r){let t=r.scopes??[],n="pro";return t.includes("max_20")?n="max_20":t.includes("max_5")?n="max_5":t.includes("max")&&(n="max"),g.debug("[detectSubscriptionTier] Detected from OAuth token",{tier:n,scopes:t}),n}return g.debug("[detectSubscriptionTier] No OAuth token, defaulting to API tier"),"api"},WSr=r=>{let e=process.env.ANTHROPIC_AUTH_METHOD?.toLowerCase();if(e==="api_key"||e==="apikey")return g.debug("[detectAuthMethod] Forced to api_key by ANTHROPIC_AUTH_METHOD env var"),"api_key";if(e==="oauth"){if(r)return g.debug("[detectAuthMethod] Forced to oauth by ANTHROPIC_AUTH_METHOD env var"),"oauth";g.warn("[detectAuthMethod] ANTHROPIC_AUTH_METHOD=oauth but no OAuth token found; falling through to auto-detection")}else e&&g.warn("[detectAuthMethod] Unrecognized ANTHROPIC_AUTH_METHOD value; falling through to auto-detection",{value:e});let t=r?"oauth":"api_key";return g.debug("[detectAuthMethod] Auth method resolved",{method:t,hasOAuthToken:!!r}),t},VBe=r=>{let e=[],t=[],n=i=>Array.isArray(i)?i:[i],o=(i,a)=>{let l=nm(a);if(l&&i.length>0){let c=i[i.length-1];c.cache_control=l}};for(let i of r)switch(i.role){case"system":{let a=typeof i.content=="string"?i.content:n(i.content).map(c=>typeof c=="string"?c:String(c?.text??"")).join(`
1127
1127
  `),l=nm(i);e.push({type:"text",text:a,...l?{cache_control:l}:{}});break}case"user":{let a=[];for(let l of n(i.content)){if(typeof l=="string"){l.length>0&&a.push({type:"text",text:l});continue}let c=l;if(c?.type==="text"&&typeof c.text=="string"){let u=nm(c);a.push({type:"text",text:c.text,...u?{cache_control:u}:{}})}else if(c?.type==="image"||c?.type==="image_url"){let u=fM(c.image??c.data??c.url);if(u){let p=nm(c);a.push(p?{...u,cache_control:p}:u)}}else if(c?.type==="file"){let p=typeof c=="object"&&c!==null&&("mediaType"in c?typeof c.mediaType=="string":!0)?zBe(c):void 0;if(p){let m=nm(c);m&&(p.cache_control=m),a.push(p)}}}a.length>0&&(o(a,i),t.push({role:"user",content:a}));break}case"assistant":{let a=[];for(let l of n(i.content)){if(typeof l=="string"){l.length>0&&a.push({type:"text",text:l});continue}let c=l;if(c?.type==="text"&&typeof c.text=="string"){if(c.text.length>0){let u=nm(c);a.push({type:"text",text:c.text,...u?{cache_control:u}:{}})}}else if(c?.type==="tool-call"){let u=c.input;if(typeof u=="string")try{u=JSON.parse(u)}catch{u={}}a.push({type:"tool_use",id:c.toolCallId??"",name:c.toolName??"",input:u??{}})}}a.length>0&&(o(a,i),t.push({role:"assistant",content:a}));break}case"tool":{let a=[];if(Array.isArray(i.content))for(let l of i.content){let c=l;c?.type==="tool-result"&&a.push({type:"tool_result",tool_use_id:c.toolCallId??"",content:Mq(c.output)})}else typeof i.content=="string"&&a.push({type:"tool_result",tool_use_id:i.toolCallId??"",content:i.content});a.length>0&&t.push({role:"user",content:a});break}}let s=e.length===0?void 0:e.some(i=>i.cache_control)?e:e.map(i=>i.text).join(`
1128
1128
 
1129
- `);return{...s!==void 0?{system:s}:{},messages:t}},HBe=r=>{if(!(!r||r==="auto")){if(r==="none")return{type:"none"};if(r==="required")return{type:"any"};if(typeof r=="object"){let e=r;if(e.type==="tool"&&e.toolName)return{type:"tool",name:e.toolName}}}},JSr=r=>{switch(r){case"max_tokens":return"length";case"tool_use":return"tool-calls";case"refusal":return"content-filter";default:return"stop"}},KBe=6e5,Ose=class extends no{client;authMethod;subscriptionTier;enableBetaFeatures;oauthToken;lastResponseMetadata=null;usageInfo=null;refreshPromise;constructor(e,t,n,o){let s=!!(o?.apiKey&&!o?.oauthToken),i=s?null:(o?.oauthToken?{accessToken:o.oauthToken}:null)??n?.oauthToken??qBe(),a=s?"api_key":n?.authMethod??WSr(i),l=n?.subscriptionTier??(a==="oauth"?KSr(i):"api"),c=e||Nq(),u=c;!process.env.ANTHROPIC_BASE_URL&&l!=="api"&&!pM(c,l)&&(u=_q(l),g.warn("Model not available for subscription tier, using recommended model",{requestedModel:c,subscriptionTier:l,recommendedModel:u})),super(u,"anthropic",t),this.enableBetaFeatures=n?.enableBetaFeatures??!0,this.oauthToken=i,this.subscriptionTier=l,this.authMethod=a;let m=this.getAuthHeaders(),f;if(g.debug("[AnthropicProvider] Constructor - checking OAuth:",{authMethod:this.authMethod,hasOAuthToken:!!this.oauthToken,hasAccessToken:!!this.oauthToken?.accessToken}),this.authMethod==="oauth"&&this.oauthToken){g.debug("[AnthropicProvider] Creating OAuth fetch wrapper...");let h=this.oauthToken,y=yBe(()=>h.accessToken,this.enableBetaFeatures,!1,!0);f=new Wd({apiKey:"oauth-authenticated",fetch:vse(y),timeout:KBe,maxRetries:0}),g.debug("[AnthropicProvider] Anthropic SDK client created with OAuth fetch wrapper"),g.debug("Anthropic Provider initialized with OAuth",{modelName:this.modelName,provider:this.providerName,authMethod:this.authMethod,subscriptionTier:this.subscriptionTier,enableBetaFeatures:this.enableBetaFeatures,hasRefreshToken:!!this.oauthToken.refreshToken,tokenExpiry:this.oauthToken.expiresAt?new Date(this.oauthToken.expiresAt).toISOString():"none"})}else{let h=o?.apiKey??n?.apiKey??GBe(),y=(()=>{let x=process.env.ANTHROPIC_BASE_URL;if(!x)return;let b=x.replace(/\/+$/,""),T=b.replace(/\/v\d+$/,"");return T!==b&&g.debug("[AnthropicProvider] Stripping the version suffix from ANTHROPIC_BASE_URL \u2014 the official Anthropic SDK appends /v1 to the base URL itself.",{baseURL:Ir(x),rewrittenTo:Ir(T)}),T})();f=new Wd({apiKey:h,defaultHeaders:m,...y&&{baseURL:y},fetch:vse(xt()),timeout:KBe,maxRetries:0}),g.debug("Anthropic Provider initialized with API key",{modelName:this.modelName,provider:this.providerName,authMethod:this.authMethod,subscriptionTier:this.subscriptionTier,enableBetaFeatures:this.enableBetaFeatures})}this.client=f,this.usageInfo={messagesUsed:0,messagesRemaining:-1,tokensUsed:0,tokensRemaining:-1,inputTokensUsed:0,outputTokensUsed:0,lastRequestTimestamp:0,isRateLimited:!1,requestCount:0,messageQuotaPercent:0,tokenQuotaPercent:0},g.debug("Anthropic Provider v2 initialized",{modelName:this.modelName,provider:this.providerName,authMethod:this.authMethod,subscriptionTier:this.subscriptionTier,enableBetaFeatures:this.enableBetaFeatures,betaFeatures:this.enableBetaFeatures?Oq["anthropic-beta"]:"disabled"})}getAuthHeaders(){let e={},t=!!process.env.ANTHROPIC_BASE_URL;if(this.enableBetaFeatures)if(t){let n=process.env.ANTHROPIC_ENABLE_LONG_CONTEXT_BETA==="1"||process.env.ANTHROPIC_ENABLE_LONG_CONTEXT_BETA==="true",o=[...yb,"fine-grained-tool-streaming-2025-05-14","interleaved-thinking-2025-05-14","redact-thinking-2026-02-12"];n&&o.push("context-1m-2025-08-07"),e["anthropic-beta"]=o.join(",")}else e["anthropic-beta"]=Oq["anthropic-beta"];return t&&(e["User-Agent"]=Jd),this.subscriptionTier!=="api"&&(e["x-subscription-tier"]=this.subscriptionTier),e}validateModelAccess(e){if(process.env.ANTHROPIC_BASE_URL)return g.debug("[validateModelAccess] Bypassing tier check (ANTHROPIC_BASE_URL set \u2014 proxy enforces access)",{model:e}),!0;if(this.subscriptionTier==="api")return!0;let t=pM(e,this.subscriptionTier);return t||g.debug("[validateModelAccess] Model not available for tier",{model:e,tier:this.subscriptionTier}),t}getUsageInfo(){return this.usageInfo}areBetaFeaturesEnabled(){return this.enableBetaFeatures}getModelCapabilities(){return Eq(this.modelName||this.getDefaultModel())}getSubscriptionTier(){return this.subscriptionTier}getAuthMethod(){return this.authMethod}async refreshAuthIfNeeded(){if(this.authMethod!=="oauth"||!this.oauthToken){g.debug("Token refresh not applicable for API key authentication");return}if(!this.oauthToken.expiresAt){g.debug("Token has no expiry information, assuming valid");return}let e=Date.now(),t=this.oauthToken.expiresAt<=e,n=this.oauthToken.expiresAt<=e+3e5;if(!t&&!n){g.debug("OAuth token is still valid",{expiresInMs:this.oauthToken.expiresAt-e});return}if(!this.oauthToken.refreshToken){if(t)throw new Mt("OAuth token expired and no refresh token available. Please re-authenticate.",this.providerName);g.warn("OAuth token expiring soon but no refresh token available",{expiresInMs:this.oauthToken.expiresAt-e});return}if(this.refreshPromise){await this.refreshPromise;return}g.info("Refreshing OAuth token",{isExpired:t,expiresInMs:this.oauthToken.expiresAt-e});let o=this.oauthToken,s=o.refreshToken;this.refreshPromise=(async()=>{let a=new AbortController,l=setTimeout(()=>a.abort(),3e4),c=await fetch(ME,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":Jd},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:s,client_id:Sq}),signal:a.signal});if(clearTimeout(l),!c.ok){let m=await c.text();throw new Mt(`Failed to refresh OAuth token: ${c.status} ${m}`,this.providerName)}let u=await c.json();o.accessToken=u.access_token,o.refreshToken=u.refresh_token||o.refreshToken,o.expiresAt=u.expires_in?Date.now()+u.expires_in*1e3:void 0,o.tokenType=u.token_type||"Bearer";let p=o;try{let m=Fr(Pp(),".neurolink");eo(m)||lA(m,{recursive:!0});let f=Fr(m,"anthropic-credentials.json"),h=`${f}.tmp`,x={...eo(f)?JSON.parse(Gc(f,"utf-8")):{},type:"oauth",oauth:p,updatedAt:Date.now()};aA(h,JSON.stringify(x,null,2),{mode:384}),lX(h,f),g.debug("Refreshed OAuth credentials persisted to disk")}catch(m){g.warn("Failed to persist refreshed OAuth token to disk",{error:m instanceof Error?m.message:String(m)})}g.info("OAuth token refreshed successfully",{hasNewRefreshToken:!!u.refresh_token,expiresIn:u.expires_in})})();try{await this.refreshPromise}catch(i){throw i instanceof Mt?i:new Mt(`Failed to refresh OAuth token: ${i instanceof Error?i.message:String(i)}`,this.providerName)}finally{this.refreshPromise=void 0}}getLastResponseMetadata(){return this.lastResponseMetadata}updateResponseMetadata(e,t,n){this.lastResponseMetadata={rateLimit:e,...t?{requestId:t}:{}},this.usageInfo&&(this.usageInfo.requestCount++,this.usageInfo.messagesUsed++,this.usageInfo.lastRequestTimestamp=Date.now(),n&&(n.inputTokens!==void 0&&(this.usageInfo.inputTokensUsed+=n.inputTokens,this.usageInfo.tokensUsed+=n.inputTokens),n.outputTokens!==void 0&&(this.usageInfo.outputTokensUsed+=n.outputTokens,this.usageInfo.tokensUsed+=n.outputTokens)),e?.requestsRemaining!==void 0&&(this.usageInfo.messagesRemaining=e.requestsRemaining),e?.tokensRemaining!==void 0&&(this.usageInfo.tokensRemaining=e.tokensRemaining),e?.requestsLimit&&e.requestsLimit>0&&(this.usageInfo.messageQuotaPercent=Math.round((e.requestsLimit-(e.requestsRemaining??0))/e.requestsLimit*100)),e?.tokensLimit&&e.tokensLimit>0&&(this.usageInfo.tokenQuotaPercent=Math.round((e.tokensLimit-(e.tokensRemaining??0))/e.tokensLimit*100)),e?.retryAfter!==void 0?(this.usageInfo.isRateLimited=!0,this.usageInfo.rateLimitExpiresAt=Date.now()+e.retryAfter*1e3):(this.usageInfo.isRateLimited=!1,this.usageInfo.rateLimitExpiresAt=void 0)),e?.requestsRemaining!==void 0&&e.requestsRemaining<=5&&g.warn("Approaching Anthropic request rate limit",{remaining:e.requestsRemaining,limit:e.requestsLimit,reset:e.requestsReset}),e?.tokensRemaining!==void 0&&e.tokensLimit&&e.tokensRemaining<e.tokensLimit*.1&&g.warn("Approaching Anthropic token rate limit",{remaining:e.tokensRemaining,limit:e.tokensLimit,reset:e.tokensReset})}getProviderName(){return"anthropic"}getDefaultModel(){return Nq()}getAISDKModel(){let e=this.client,t=this.providerName,n=this.modelName||Nq(),o=a=>this.getTimeout(a??{}),s=()=>this.refreshAuthIfNeeded();return{specificationVersion:"v3",provider:t,modelId:n,supportedUrls:{},doGenerate:async a=>{await s();let l=VBe(a.prompt),c=l.messages,u=l.system,p=(a.tools??[]).filter(B=>B.type==="function").map(B=>{let $=nm(B);return{name:B.name,...B.description?{description:B.description}:{},input_schema:B.inputSchema??{type:"object",properties:{}},...$?{cache_control:$}:{}}});p&&p.length===0&&(p=void 0);let m=a.toolChoice?HBe(a.toolChoice.type==="tool"?{type:"tool",toolName:a.toolChoice.toolName}:a.toolChoice.type):void 0,f;if(a.responseFormat?.type==="json"){f=a.responseFormat.name??"json";let B=a.responseFormat.schema??{type:"object"};p=[{name:f,description:a.responseFormat.description??"Respond by calling this tool with the answer as its input.",input_schema:B}],m={type:"tool",name:f}}let h=a.providerOptions?.anthropic?.finalResultSchema,y=!1;if(!f&&h){let B=Rse(p,h);p=B.tools,y=B.applied,B.applied&&(u=kse(u))}let x=a.providerOptions?.anthropic?.thinking,b=Sse({system:u,tools:p,messages:c}),T=wse(c,Pq-b),w=_a("anthropic",n,{...a.temperature!==void 0&&a.temperature!==null?{temperature:a.temperature}:{},...a.topP!==void 0&&a.topP!==null?{topP:a.topP}:{}},"anthropic.doGenerate"),C={model:n,messages:T,max_tokens:A_(n,a.maxOutputTokens),...u?{system:u}:{},...w.temperature!==void 0?{temperature:w.temperature}:{},...w.topP!==void 0?{top_p:w.topP}:{},...a.stopSequences&&a.stopSequences.length>0?{stop_sequences:a.stopSequences}:{},...p?{tools:p}:{},...m?{tool_choice:m}:{},...x?{thinking:x}:{}},R=a.timeout,k=R!=null,P=C.max_tokens>8192&&!k?Math.max(o(a),3e5):o(a),I=Ws(P,t,"generate"),A;try{A=await e.messages.create(C,{signal:Fx(a.abortSignal,I?.controller.signal)})}finally{I?.cleanup()}let M=[],L,U=[],D=!1;for(let B of A.content)B.type==="thinking"?M.push({type:"reasoning",text:B.thinking}):B.type==="text"?f?U.push(B.text):M.push({type:"text",text:B.text}):B.type==="tool_use"&&(f&&B.name===f?(D=!0,M.push({type:"text",text:bP(B.input)})):y&&B.name===gM?L=bP(B.input):M.push({type:"tool-call",toolCallId:B.id,toolName:B.name,input:bP(B.input)}));if(f&&!D&&U.length>0&&M.push({type:"text",text:U.join("")}),L!==void 0){let B=M.filter($=>$.type==="reasoning");M.length=0,M.push(...B,{type:"text",text:L}),g.debug("[Anthropic] Extracted structured output from final_result tool (generate)",{chars:L.length})}let z=A.usage.cache_read_input_tokens??0,j=A.usage.cache_creation_input_tokens??0;return{content:M,finishReason:{unified:L!==void 0?"stop":JSr(A.stop_reason),raw:A.stop_reason??"stop"},usage:{inputTokens:{total:A.usage.input_tokens+z+j,noCache:A.usage.input_tokens,cacheRead:z,cacheWrite:j},outputTokens:{total:A.usage.output_tokens,text:A.usage.output_tokens,reasoning:void 0}},warnings:[],request:{body:C},response:{id:A.id,modelId:A.model,headers:_Be()??{},body:A}}},doStream:()=>{throw new Error(`${t}: doStream is not implemented on the delegating model \u2014 the streaming path uses executeStream directly.`)}}}formatProviderError(e){return en(e,[{match:n=>n.statusCode===401||/API_KEY_INVALID|Invalid API key/i.test(n.message),errorClass:Mt,message:"Invalid Anthropic API key. Please check your ANTHROPIC_API_KEY environment variable."},{match:n=>n.statusCode===429||/rate limit|too_many_requests|429/i.test(n.message),errorClass:qr,message:"Anthropic rate limit exceeded. Please try again later."},{match:n=>/ECONNRESET|ENOTFOUND|ECONNREFUSED|network|connection/i.test(n.message),errorClass:cn,message:n=>`Connection error: ${n.message}`},{match:n=>/500|502|503|504|server error/i.test(n.message),errorClass:mt,message:n=>`Server error: ${n.message}`},{match:()=>!0,errorClass:mt,message:n=>`Anthropic error: ${n.message}`}],this.providerName,this.modelName)}async generate(e,t){await this.refreshAuthIfNeeded();let{result:n,snapshot:o}=await SBe(()=>super.generate(e,t));return n&&o&&(this.recordLimitSnapshot(o),n.limits=o,n.analytics&&(n.analytics.limits=o)),n}recordLimitSnapshot(e){this.updateResponseMetadata(e.rateLimit,e.requestId),CBe(e),RBe(e,this.modelName)}async executeStream(e,t){return EBe(()=>this.executeStreamInCaptureScope(e,t))}async executeStreamInCaptureScope(e,t){await this.refreshAuthIfNeeded(),this.validateStreamOptions(e);let n=this.getTimeout(e),o=Ws(n,this.providerName,"stream"),s=new AbortController,i=y1([e.abortSignal,o?.controller.signal,s.signal]).signal,a,l,c,u,p=!1;try{u=!e.disableTools&&this.supportsTools(),a=u?e.tools||await this.getAllTools():{},l=u?Eg(a,"input_schema"):void 0;let ae=await this.buildMessagesForStream(e);if(c=VBe(ae),e.schema&&l&&l.length>0){let X=Rse(l,xn(e.schema));l=X.tools,p=X.applied,X.applied&&(c.system=kse(c.system))}}catch(ae){throw o?.cleanup(),this.handleProviderError(ae)}let m=this.modelName||Nq(),f=u&&l&&l.length>0?HBe(mG(e,a,u)):void 0,h=e.thinkingConfig?.enabled&&e.thinkingConfig.budgetTokens?{type:"enabled",budget_tokens:e.thinkingConfig.budgetTokens}:void 0,y=HSr.startSpan("neurolink.provider.streamText",{kind:br.CLIENT,attributes:{"gen_ai.system":"anthropic","gen_ai.request.model":m}}),x=e.maxSteps||Jo,b=this.neurolink?.getEventEmitter(),T=Uu(),{push:w}=T,{usagePromise:C,finishPromise:R,resolveUsage:k,resolveFinish:P}=uG();C.then(ae=>{y.setAttribute("gen_ai.usage.input_tokens",ae.promptTokens||0),y.setAttribute("gen_ai.usage.output_tokens",ae.completionTokens||0),ae.cacheReadTokens&&y.setAttribute("gen_ai.usage.cached_input_tokens",ae.cacheReadTokens);let X=Us(this.providerName,this.modelName,{input:ae.promptTokens||0,output:ae.completionTokens||0,total:ae.totalTokens||0,...ae.cacheReadTokens?{cacheReadTokens:ae.cacheReadTokens}:{},...ae.cacheCreationTokens?{cacheCreationTokens:ae.cacheCreationTokens}:{}});X&&X>0&&y.setAttribute("neurolink.cost",X)}).catch(()=>{}),R.then(ae=>{y.setAttribute("gen_ai.response.finish_reason",ae||"unknown"),y.end()}).catch(()=>{y.end()});let I,A=this.client,M=[],L=Date.now(),U=0,D=0,z=0,j=0,B=null,$=()=>({promptTokens:U,completionTokens:D,totalTokens:U+z+j+D,...z>0?{cacheReadTokens:z}:{},...j>0?{cacheCreationTokens:j}:{}}),N="",J,ne=(ae,X)=>{let Se=ye=>{if(typeof ye=="string")return ye;try{return JSON.stringify(ye)??""}catch{return""}};return zt(Se(ae),"anthropic")+zt(Se(X),"anthropic")},de=(async()=>{let ae,X,se=DBe({client:A,maxSteps:x,toolsRecord:a,buildParams:oe=>{if(l){let we=new Set(l.map(Ge=>Ge.name)),Je=Object.fromEntries(Object.entries(a).filter(([Ge])=>!we.has(Ge)));if(Object.keys(Je).length>0){let Ge=Eg(Je,"input_schema");Ge&&Ge.length>0&&(l=[...l,...Ge])}}let le=Sse({system:c.system,tools:l,messages:oe}),fe=wse(oe,Pq-le),De=_a("anthropic",m,e.temperature!==void 0&&e.temperature!==null?{temperature:e.temperature}:{},"anthropic.executeStream");return{model:m,messages:fe,max_tokens:A_(m,e.maxTokens),stream:!0,...c.system?{system:c.system}:{},...De.temperature!==void 0?{temperature:De.temperature}:{},...l&&l.length>0?{tools:l}:{},...f?{tool_choice:f}:{},...h?{thinking:h}:{}}},planReclaim:oe=>{let le=Aq({conversation:oe,availableInputTokens:mi("anthropic",m,e.maxTokens??void 0),fixedOverheadTokens:ne(c.system,l),provider:"anthropic",observedPromptTokens:ae,previousSentEstimate:X,onSentEstimate:Je=>{X=Je}});if(!le)return;let fe=new Set(le.drop),De=new Set(le.truncate),we=[];for(let Je=0;Je<oe.length;Je++){if(fe.has(Je))continue;let Ge=oe[Je];if(De.has(Je)&&Array.isArray(Ge.content)){we.push({...Ge,content:Ge.content.map(ce=>ce.type==="tool_result"?{...ce,content:kq(typeof ce.content=="string"?ce.content:JSON.stringify(ce.content)??"")}:ce)});continue}we.push(Ge)}if(fe.size>0){let Je=we.findIndex(Ge=>Array.isArray(Ge.content)&&Ge.content.some(ce=>ce.type==="tool_use"||ce.type==="tool_result"));Je<0&&(Je=Math.min(1,we.length)),we.splice(Je,0,{role:"user",content:[{type:"text",text:Rq}]})}return we},noteObservedPromptTokens:oe=>{ae=oe},...p?{finalResultToolName:gM,onTerminalResult:oe=>{J=oe,g.debug("[Anthropic] Extracted structured output from final_result tool (stream)",{chars:oe.length})}}:{}}),G={...se,buildToolResultMessages:(oe,le,fe)=>{for(let Je of fe)M.push(Je.name);let De=fe.map(Je=>({type:"tool-call",toolCallId:Je.id,toolName:Je.name,args:Je.args})),we=fe.map(Je=>Je.error?{type:"tool-result",toolCallId:Je.id,toolName:Je.name,error:Je.error}:{type:"tool-result",toolCallId:Je.id,toolName:Je.name,result:Je.output});return Yw(b,we.map(Je=>({toolName:Je.toolName,result:"result"in Je?Je.result:void 0,error:"error"in Je?Je.error:void 0}))),this.handleToolExecutionStorage(De,we,e,new Date).catch(Je=>{g.warn("[AnthropicProvider] Failed to store tool executions",{provider:this.providerName,error:Je instanceof Error?Je.message:String(Je)})}),se.buildToolResultMessages(oe,le,fe)}},q={};for(let[oe,le]of Object.entries(a)){let fe=le.execute;fe&&(q[oe]={execute:async(De,we)=>{let Je=we;return fe(De,{toolCallId:Je.toolCallId??"",...Je.abortSignal?{abortSignal:Je.abortSignal}:{},messages:[]})}})}let{stream:re,resultPromise:O}=ty(G,c.messages.slice(),{tools:q,...i?{abortSignal:i}:{}}),Z=(async()=>{for await(let oe of re)oe.reasoning&&w({content:"",reasoning:oe.reasoning}),oe.content&&(p?N+=oe.content:w({content:oe.content}))})(),Q=await O;await Z,U+=Q.usage.inputTokens,D+=Q.usage.outputTokens,z+=Q.usage.cacheReadTokens??0,j+=Q.usage.cacheWriteTokens??0,B=Q.rawStopReason??B,k($()),P(B??"stop")})().catch(ae=>{throw I=ae,g.error("Anthropic: Stream error",{error:ae instanceof Error?ae.message:String(ae)}),k($()),P("error"),this.formatProviderError(ae)}).finally(()=>{if(p){let ae=J??N;ae.length>0&&w({content:ae})}o?.cleanup(),T.close()});de.catch(()=>{});let Ue=this.providerName;return{stream:async function*(){let ae=0;try{for await(let X of T.iterable)"content"in X&&typeof X.content=="string"&&X.content.length>0&&ae++,yield X;if(await de,ae===0&&M.length===0){g.warn(`${Ue}: Stream produced no output \u2014 emitting enriched sentinel`);let X=new Ta({message:"Stream produced no output"}),Se=await Yp(X,void 0,I);Zp(Se),yield Se}}catch(X){let Se=await Yp(X,void 0,I);if(Zp(Se),yield Se,!Ta.isInstance(X))throw X}finally{s.signal.aborted||s.abort()}}(),provider:this.providerName,model:this.modelName,toolCalls:[],toolResults:[],analytics:R.then(async()=>{let ae=await pG.createAnalytics(this.providerName,m,{textStream:(async function*(){})(),usage:C,finishReason:R},Date.now()-L,{requestId:e.requestId??`${this.providerName}-stream-${Date.now()}`,streamingMode:!0}),X=wBe();return X&&ae&&(this.recordLimitSnapshot(X),ae.limits=X),ae})}}async isAvailable(){try{return qBe()||GBe(),!0}catch{return!1}}getModel(){return this.getAISDKModel()}}});var JBe={};ue(JBe,{ANTHROPIC_BETA_HEADERS:()=>Oq,AnthropicProvider:()=>Ose,ModelAccessError:()=>jR,getModelCapabilities:()=>Eq,getRecommendedModelForTier:()=>_q,isModelAvailableForTier:()=>pM});var XBe=E(()=>{"use strict";WBe();Mse()});var YBe={};ue(YBe,{Agent:()=>Owr,BedrockClient:()=>YSr,BedrockRuntimeClient:()=>Nse,Blob:()=>Mwr,Client:()=>Lwr,ConverseCommand:()=>Lse,ConverseStreamCommand:()=>Dse,Cron:()=>gwr,Dispatcher:()=>Dwr,File:()=>Pwr,FlowProducer:()=>mwr,FormData:()=>Iwr,GoogleAuth:()=>rwr,HTTPException:()=>Twr,Headers:()=>Awr,Hippocampus:()=>iwr,HippocampusConfig:()=>awr,Hono:()=>vwr,ImageFormat:()=>DE,InvokeEndpointCommand:()=>ewr,InvokeEndpointWithResponseStreamCommand:()=>twr,Job:()=>dwr,ListFoundationModelsCommand:()=>ZSr,MockAgent:()=>$wr,Pool:()=>Nwr,Queue:()=>cwr,QueueScheduler:()=>pwr,Request:()=>Rwr,Response:()=>kwr,SageMakerRuntimeClient:()=>QSr,TextToSpeechClient:()=>owr,VertexAI:()=>nwr,Webhook:()=>swr,Worker:()=>uwr,convertToHtml:()=>xwr,cors:()=>bwr,createClient:()=>lwr,default:()=>XSr,extractRawText:()=>ywr,fetch:()=>Cwr,getGlobalDispatcher:()=>Fwr,interceptors:()=>Bwr,logger:()=>Swr,parseBuffer:()=>fwr,request:()=>zwr,secureHeaders:()=>wwr,selectCover:()=>hwr,setGlobalDispatcher:()=>Uwr,streamSSE:()=>_wr,timeout:()=>Ewr});var LE,Mi,XSr,YSr,ZSr,Nse,Lse,Dse,DE,QSr,ewr,twr,rwr,nwr,owr,swr,iwr,awr,lwr,cwr,uwr,dwr,pwr,mwr,gwr,fwr,hwr,ywr,xwr,vwr,bwr,Twr,Swr,wwr,_wr,Ewr,Cwr,Rwr,kwr,Awr,Iwr,Pwr,Mwr,Owr,Nwr,Lwr,Dwr,Uwr,Fwr,$wr,Bwr,zwr,Lq=E(()=>{LE={get(r,e){return e==="__esModule"?!0:e==="default"?new Proxy({},{get:LE.get}):new Proxy(function(...t){return new Proxy({},{get:LE.get})},{get:LE.get,apply(t,n,o){return new Proxy({},{get:LE.get})},construct(t,n){return new Proxy({},{get:LE.get})}})}},Mi=new Proxy({},LE),XSr=Mi,{BedrockClient:YSr,ListFoundationModelsCommand:ZSr,BedrockRuntimeClient:Nse,ConverseCommand:Lse,ConverseStreamCommand:Dse,ImageFormat:DE}=Mi,{SageMakerRuntimeClient:QSr,InvokeEndpointCommand:ewr,InvokeEndpointWithResponseStreamCommand:twr}=Mi,{GoogleAuth:rwr,VertexAI:nwr,TextToSpeechClient:owr}=Mi,{Webhook:swr}=Mi,{Hippocampus:iwr,HippocampusConfig:awr}=Mi,{createClient:lwr}=Mi,{Queue:cwr,Worker:uwr,Job:dwr,QueueScheduler:pwr,FlowProducer:mwr}=Mi,{Cron:gwr}=Mi,{parseBuffer:fwr,selectCover:hwr}=Mi,{extractRawText:ywr,convertToHtml:xwr}=Mi,{Hono:vwr}=Mi,{cors:bwr,HTTPException:Twr,logger:Swr,secureHeaders:wwr,streamSSE:_wr,timeout:Ewr}=Mi,Cwr=globalThis.fetch,Rwr=globalThis.Request,kwr=globalThis.Response,Awr=globalThis.Headers,Iwr=globalThis.FormData,Pwr=globalThis.File,Mwr=globalThis.Blob,Owr=Mi.Agent,Nwr=Mi.Pool,Lwr=Mi.Client,Dwr=Mi.Dispatcher,Uwr=()=>{},Fwr=()=>Mi,$wr=Mi.MockAgent,Bwr={redirect:()=>r=>r,retry:()=>r=>r},zwr=async(r,e)=>{let t=await globalThis.fetch(r,e);return{statusCode:t.status,headers:Object.fromEntries(t.headers.entries()),body:{text:()=>t.text(),json:()=>t.json(),arrayBuffer:()=>t.arrayBuffer()}}}});function Gwr(r){if(/^(us|ca)-/.test(r))return"us";if(/^(eu|il|me|af)-/.test(r))return"eu";if(/^ap-northeast-[13]$/.test(r))return"jp";if(/^ap-southeast-[246]$/.test(r))return"au";if(/^ap-/.test(r))return"apac"}function qwr(r){return/^(us|eu|au|jp|apac|global)\./.test(r)}function ZBe(r){if(typeof r!="object"||r===null)return!1;let e=r,t=typeof e.name=="string"?e.name:"",n=typeof e.message=="string"?e.message:"";return!/ValidationException/i.test(t)&&!/ValidationException/i.test(n)?!1:/inference profile/i.test(n)&&/on-demand throughput/i.test(n)}function Vwr(r,e){if(r.startsWith("arn:")||qwr(r))return[];let t=[],n=Gwr(e);return n&&t.push(`${n}.${r}`),t.push(`${jwr}.${r}`),t}function eze(r,e){return`${r}::${e}`}function Hwr(r,e){return QBe.get(eze(e,r))}function Kwr(r,e,t){QBe.set(eze(e,r),t),g.debug("[Bedrock] Cached inference-profile resolution for subsequent calls",{region:e})}async function Use(r,e,t){let n=Hwr(r,e);if(n&&n!==r)return t(n);try{return await t(r)}catch(o){if(!ZBe(o))throw o;let s=Vwr(r,e);if(s.length===0)throw o;g.warn("[Bedrock] Model requires a cross-region inference profile in this region; retrying with a prefixed id",{region:e,candidates:s.length});for(let i of s)try{let a=await t(i);return Kwr(r,e,i),a}catch(a){if(!ZBe(a))throw a}throw o}}var jwr,QBe,tze=E(()=>{"use strict";Y();jwr="global";QBe=new Map});function Dq(){return`tool_${Date.now()}_${Math.random().toString(36).substring(2,11)}`}function nze(r,e){if(r){if(r.toolUse&&r._inputBuffer){try{r.toolUse.input=JSON.parse(r._inputBuffer)}catch{r.toolUse.input={}}delete r._inputBuffer}e&&!r.toolUse&&(r.text=e)}}function oze(r){return r.filter(e=>e.toolUse).map(e=>({id:e.toolUse?.toolUseId??Dq(),name:e.toolUse?.name??"",args:e.toolUse?.input??{}}))}async function Wwr(r,e,t){let n=[],o=new Map,s=new Map,i=h=>{let y=o.get(h);return y||(y={},o.set(h,y),n.push(y)),y},a="",l,c=0,u=0,p=0,m=0;if(r.stream)for await(let h of r.stream){if(t.aborted)break;let y=h;if(y.contentBlockStart&&i(y.contentBlockStart.contentBlockIndex??0),y.contentBlockDelta?.delta?.text){let x=y.contentBlockDelta.contentBlockIndex??0,b=y.contentBlockDelta.delta.text;i(x),a+=b,s.set(x,(s.get(x)??"")+b),e.push({content:b})}if(y.contentBlockStart?.start?.toolUse){let x=i(y.contentBlockStart.contentBlockIndex??0);x.toolUse={name:y.contentBlockStart.start.toolUse.name??"",input:{},toolUseId:y.contentBlockStart.start.toolUse.toolUseId??Dq()}}if(y.contentBlockDelta?.delta?.toolUse){let x=i(y.contentBlockDelta.contentBlockIndex??0);x.toolUse??={name:"",input:{},toolUseId:Dq()};let b=y.contentBlockDelta.delta.toolUse.input;typeof b=="string"?x._inputBuffer=(x._inputBuffer??"")+b:typeof b=="object"&&b!==null&&!Array.isArray(b)&&(x.toolUse.input={...x.toolUse.input??{},...b})}if(y.contentBlockStop){let x=y.contentBlockStop.contentBlockIndex??0;nze(o.get(x),s.get(x)??"")}if(y.messageStop){l=y.messageStop.stopReason??"end_turn";continue}if(y.metadata?.usage){c+=y.metadata.usage.inputTokens??0,u+=y.metadata.usage.outputTokens??0,p+=y.metadata.usage.cacheReadInputTokens??0,m+=y.metadata.usage.cacheWriteInputTokens??0;break}}for(let[h,y]of o)nze(y,s.get(h)??"");let f=n.filter(h=>h.text||h.toolUse||h.image||h.document);return{text:a,toolCalls:oze(f),usage:{inputTokens:c,outputTokens:u,cacheReadTokens:p,cacheWriteTokens:m},rawStopReason:l,raw:f}}function Jwr(r){let e=[],t="";for(let n of r.output?.message?.content??[]){let o={};"text"in n&&n.text&&(o.text=n.text,t+=t?` ${n.text}`:n.text),"toolUse"in n&&n.toolUse&&(o.toolUse={toolUseId:n.toolUse.toolUseId??Dq(),name:n.toolUse.name??"",input:n.toolUse.input??{}}),e.push(o)}return{text:t,toolCalls:oze(e),usage:{inputTokens:r.usage?.inputTokens??0,outputTokens:r.usage?.outputTokens??0,cacheReadTokens:r.usage?.cacheReadInputTokens??0,cacheWriteTokens:r.usage?.cacheWriteInputTokens??0},rawStopReason:r.stopReason,raw:e}}function Fse(r){return{providerLabel:"bedrock",maxSteps:r.maxSteps,buildStepRequest(e,t){return{raw:r.buildCommandInput(e,t)}},async executeStep(e,t,n){let o=e.raw;if(!r.streaming){let i=await Use(o.modelId??"",r.region,a=>ze(r.client.send(new Lse({...o,modelId:a})),rze,new Error("Bedrock API call timed out")));if(!i.output?.message)throw new Error("Invalid response structure from Bedrock API");return Jwr(i)}let s=await Use(o.modelId??"",r.region,i=>ze(r.client.send(new Dse({...o,modelId:i})),rze,new Error("Bedrock streaming API call timed out")));return Wwr(s,t,n)},buildToolResultMessages(e,t,n){let o={role:"assistant",content:t.raw},s={role:"user",content:n.map(i=>({toolResult:{toolUseId:i.id,content:[{text:i.error?`Error executing tool ${i.name}: ${i.error}`:String(typeof i.output=="string"?i.output:JSON.stringify(i.output))}],status:i.error?"error":"success"}}))};return[...e,o,s]},mapFinishReason(e,t){switch(e){case"end_turn":case"stop_sequence":return"stop";case"max_tokens":return"length";case"tool_use":return"tool-calls";default:return t?"tool-calls":"stop"}}}}var rze,sze=E(()=>{"use strict";Lq();St();tze();rze=12e4});function $se(r,e,t){return{input:{text:r.input?.text||"",images:r.input?.images,content:r.input?.content,files:r.input?.files,csvFiles:r.input?.csvFiles,pdfFiles:r.input?.pdfFiles,audioFiles:r.input?.audioFiles,videoFiles:r.input?.videoFiles},csvOptions:r.csvOptions,pdfOptions:r.pdfOptions,systemPrompt:r.systemPrompt,conversationHistory:r.conversationMessages,provider:e,model:t,temperature:r.temperature,maxTokens:r.maxTokens,enableAnalytics:r.enableAnalytics,enableEvaluation:r.enableEvaluation,context:r.context,fileRegistry:r.fileRegistry}}var ize=E(()=>{"use strict"});var Uq,Bse=E(()=>{"use strict";ac();Uq=Me.provider});var aze={};ue(aze,{Agent:()=>U_r,BedrockClient:()=>Ywr,BedrockRuntimeClient:()=>Qwr,Blob:()=>D_r,Client:()=>$_r,ConverseCommand:()=>e_r,ConverseStreamCommand:()=>t_r,Cron:()=>x_r,Dispatcher:()=>B_r,File:()=>L_r,FlowProducer:()=>y_r,FormData:()=>N_r,GoogleAuth:()=>i_r,HTTPException:()=>E_r,Headers:()=>O_r,Hippocampus:()=>u_r,HippocampusConfig:()=>d_r,Hono:()=>w_r,ImageFormat:()=>r_r,InvokeEndpointCommand:()=>o_r,InvokeEndpointWithResponseStreamCommand:()=>s_r,Job:()=>f_r,ListFoundationModelsCommand:()=>Zwr,MockAgent:()=>G_r,Pool:()=>F_r,Queue:()=>m_r,QueueScheduler:()=>h_r,Request:()=>P_r,Response:()=>M_r,SageMakerRuntimeClient:()=>n_r,TextToSpeechClient:()=>l_r,VertexAI:()=>a_r,Webhook:()=>c_r,Worker:()=>g_r,convertToHtml:()=>S_r,cors:()=>__r,createClient:()=>p_r,default:()=>Xwr,extractRawText:()=>T_r,fetch:()=>I_r,getGlobalDispatcher:()=>j_r,interceptors:()=>q_r,logger:()=>C_r,parseBuffer:()=>v_r,request:()=>V_r,secureHeaders:()=>R_r,selectCover:()=>b_r,setGlobalDispatcher:()=>z_r,streamSSE:()=>k_r,timeout:()=>A_r});var UE,Oi,Xwr,Ywr,Zwr,Qwr,e_r,t_r,r_r,n_r,o_r,s_r,i_r,a_r,l_r,c_r,u_r,d_r,p_r,m_r,g_r,f_r,h_r,y_r,x_r,v_r,b_r,T_r,S_r,w_r,__r,E_r,C_r,R_r,k_r,A_r,I_r,P_r,M_r,O_r,N_r,L_r,D_r,U_r,F_r,$_r,B_r,z_r,j_r,G_r,q_r,V_r,lze=E(()=>{UE={get(r,e){return e==="__esModule"?!0:e==="default"?new Proxy({},{get:UE.get}):new Proxy(function(...t){return new Proxy({},{get:UE.get})},{get:UE.get,apply(t,n,o){return new Proxy({},{get:UE.get})},construct(t,n){return new Proxy({},{get:UE.get})}})}},Oi=new Proxy({},UE),Xwr=Oi,{BedrockClient:Ywr,ListFoundationModelsCommand:Zwr,BedrockRuntimeClient:Qwr,ConverseCommand:e_r,ConverseStreamCommand:t_r,ImageFormat:r_r}=Oi,{SageMakerRuntimeClient:n_r,InvokeEndpointCommand:o_r,InvokeEndpointWithResponseStreamCommand:s_r}=Oi,{GoogleAuth:i_r,VertexAI:a_r,TextToSpeechClient:l_r}=Oi,{Webhook:c_r}=Oi,{Hippocampus:u_r,HippocampusConfig:d_r}=Oi,{createClient:p_r}=Oi,{Queue:m_r,Worker:g_r,Job:f_r,QueueScheduler:h_r,FlowProducer:y_r}=Oi,{Cron:x_r}=Oi,{parseBuffer:v_r,selectCover:b_r}=Oi,{extractRawText:T_r,convertToHtml:S_r}=Oi,{Hono:w_r}=Oi,{cors:__r,HTTPException:E_r,logger:C_r,secureHeaders:R_r,streamSSE:k_r,timeout:A_r}=Oi,I_r=globalThis.fetch,P_r=globalThis.Request,M_r=globalThis.Response,O_r=globalThis.Headers,N_r=globalThis.FormData,L_r=globalThis.File,D_r=globalThis.Blob,U_r=Oi.Agent,F_r=Oi.Pool,$_r=Oi.Client,B_r=Oi.Dispatcher,z_r=()=>{},j_r=()=>Oi,G_r=Oi.MockAgent,q_r={redirect:()=>r=>r,retry:()=>r=>r},V_r=async(r,e)=>{let t=await globalThis.fetch(r,e);return{statusCode:t.status,headers:Object.fromEntries(t.headers.entries()),body:{text:()=>t.text(),json:()=>t.json(),arrayBuffer:()=>t.arrayBuffer()}}}});async function Fq(){return await Promise.resolve().then(()=>(lze(),aze))}var zse=E(()=>{"use strict"});var jse,cze=E(()=>{"use strict";Lq();Qr();Vw();eu();Xo();eG();sze();Dt();ea();St();Y();cg();qI();ize();Ea();gr();Bse();zse();jse=class r extends no{bedrockClient;conversationHistory=[];region;static extractRegionFromArn(e){return e?e.match(/^arn:aws[a-z0-9-]*:bedrock:([^:]+):/)?.[1]??null:null}constructor(e,t,n,o){super(e,"bedrock",t);let s=e||process.env.BEDROCK_MODEL||this.modelName,i=r.extractRegionFromArn(s);this.region=o?.region||n||i||process.env.AWS_REGION||"us-east-1",g.debug("[AmazonBedrockProvider] Starting constructor with extensive logging for debugging"),g.debug(`[AmazonBedrockProvider] Environment check: AWS_REGION=${process.env.AWS_REGION||"undefined"}, AWS_ACCESS_KEY_ID=${process.env.AWS_ACCESS_KEY_ID?"SET":"undefined"}, AWS_SECRET_ACCESS_KEY=${process.env.AWS_SECRET_ACCESS_KEY?"SET":"undefined"}`);try{g.debug("[AmazonBedrockProvider] Creating BedrockRuntimeClient with clean configuration"),this.bedrockClient=new Nse({region:this.region,...o?.accessKeyId&&o?.secretAccessKey?{credentials:{accessKeyId:o.accessKeyId,secretAccessKey:o.secretAccessKey,...o.sessionToken?{sessionToken:o.sessionToken}:{}}}:{}}),g.debug(`[AmazonBedrockProvider] Successfully created BedrockRuntimeClient with model: ${this.modelName}, region: ${this.region}`)}catch(a){throw g.error("[AmazonBedrockProvider] CRITICAL: Failed to initialize BedrockRuntimeClient:",a),a}}async performInitialHealthCheck(){let{BedrockClient:e,ListFoundationModelsCommand:t}=await Fq(),n=new e({region:this.region});try{g.debug("[AmazonBedrockProvider] Starting initial health check to validate credentials and connectivity");let o=new t({}),s=Date.now();await n.send(o);let i=Date.now()-s;g.debug(`[AmazonBedrockProvider] Health check PASSED - credentials valid, connectivity good, responseTime: ${i}ms`)}catch(o){let s=o instanceof Error?o.message:String(o);g.error("[AmazonBedrockProvider] Health check FAILED - this will cause production failures:",{error:s,errorType:o instanceof Error?o.constructor.name:"Unknown",region:process.env.AWS_REGION||"us-east-1",hasAccessKey:!!process.env.AWS_ACCESS_KEY_ID,hasSecretKey:!!process.env.AWS_SECRET_ACCESS_KEY})}finally{try{n.destroy()}catch{}}}getAISDKModel(){throw new Error("AmazonBedrockProvider does not use AI SDK models")}getProviderName(){return"bedrock"}getDefaultModel(){return process.env.BEDROCK_MODEL||"anthropic.claude-sonnet-4-6"}getDefaultEmbeddingModel(){return process.env.BEDROCK_EMBEDDING_MODEL||process.env.AWS_EMBEDDING_MODEL||"amazon.titan-embed-text-v2:0"}async generate(e){g.debug("[AmazonBedrockProvider] generate() called with conversation management");let t=Date.now(),n=typeof e=="string"?{prompt:e}:e;this.conversationHistory=[];let o=n.input;if(!!(o?.images?.length||o?.content?.length||o?.files?.length||o?.csvFiles?.length||o?.pdfFiles?.length)){g.debug("[AmazonBedrockProvider] Detected multimodal input in generate(), using multimodal message builder",{hasImages:!!o?.images?.length,imageCount:o?.images?.length||0,hasContent:!!o?.content?.length,contentCount:o?.content?.length||0,hasFiles:!!o?.files?.length,fileCount:o?.files?.length||0,hasCSVFiles:!!o?.csvFiles?.length,csvFileCount:o?.csvFiles?.length||0,hasPDFFiles:!!o?.pdfFiles?.length,pdfFileCount:o?.pdfFiles?.length||0});let m=$se(n,this.providerName,this.modelName),f=await T_(m,this.providerName,this.modelName);this.conversationHistory=this.convertToBedrockMessages(f)}else{g.debug("[AmazonBedrockProvider] Text-only input in generate(), using simple message builder");let p={role:"user",content:[{text:n.prompt}]};this.conversationHistory.push(p)}g.debug(`[AmazonBedrockProvider] Starting conversation with ${this.conversationHistory.length} message(s)`);let i,a,l,c;try{({text:i,usage:a,finishReason:l,rawFinishReason:c}=await this.conversationLoop(n))}catch(p){let m=this.neurolink?.getEventEmitter();throw m&&m.emit("generation:end",{provider:this.providerName,responseTime:Date.now()-t,timestamp:Date.now(),result:{content:"",usage:{input:0,output:0,total:0},model:this.modelName||this.getDefaultModel(),provider:this.providerName,finishReason:"error"},success:!1,error:p instanceof Error?p.message:String(p)}),p}let u=this.neurolink?.getEventEmitter();return u&&u.emit("generation:end",{provider:this.providerName,responseTime:Date.now()-t,timestamp:Date.now(),result:{content:i,usage:a,model:this.modelName||this.getDefaultModel(),provider:this.providerName,finishReason:l},success:!0}),{content:i,usage:a,model:this.modelName||this.getDefaultModel(),provider:this.getProviderName(),...l!==void 0&&{finishReason:l},...c!==void 0&&{rawFinishReason:c}}}async conversationLoop(e){let t=e.maxSteps||Jo,n=await this.resolveTurnTools(e.tools,e.disableTools),o=this.formatToolsForBedrock(n),s=_a(this.providerName,this.modelName||this.getDefaultModel(),{temperature:e.temperature??.7},"bedrock.converse"),i=Fse({client:this.bedrockClient,streaming:!1,region:this.region,maxSteps:t,buildCommandInput:a=>({modelId:this.modelName||this.getDefaultModel(),messages:this.convertToAWSMessages(a),system:[{text:e.systemPrompt||"You are a helpful assistant with access to external tools. Use tools when necessary to provide accurate information."}],inferenceConfig:{maxTokens:e.maxTokens,...s.temperature!==void 0&&{temperature:s.temperature}},...o?{toolConfig:o}:{}})});try{let{resultPromise:a}=ty(i,this.conversationHistory,{tools:this.toEngineTools(n),abortSignal:e.abortSignal}),l=await a;this.conversationHistory=l.conversation;let c=l.usage.inputTokens,u=l.usage.outputTokens,p=l.usage.cacheReadTokens??0,m=l.usage.cacheWriteTokens??0;return{text:l.text||"",usage:{input:c,output:u,total:c+p+m+u,...p>0&&{cacheReadTokens:p},...m>0&&{cacheCreationTokens:m}},finishReason:l.finishReason,rawFinishReason:l.rawStopReason}}catch(a){throw g.error("[AmazonBedrockProvider] Error in conversation loop:",a),this.handleProviderError(a)}}convertToAWSMessages(e){return e.map(t=>({role:t.role,content:t.content.map(n=>n.text?{text:n.text}:n.image?{image:n.image}:n.document?{document:n.document}:n.toolUse?{toolUse:{toolUseId:n.toolUse.toolUseId,name:n.toolUse.name,input:n.toolUse.input}}:n.toolResult?{toolResult:{toolUseId:n.toolResult.toolUseId,content:n.toolResult.content,status:n.toolResult.status}}:{text:""})}))}async executeSingleTool(e,t,n,o){return Uq.startActiveSpan("bedrock.tool.execute",{kind:br.CLIENT,attributes:{"gen_ai.tool.name":t,"gen_ai.system":"aws.bedrock"}},async s=>{try{if(g.debug(`[AmazonBedrockProvider] Executing single tool: ${t}`,{args:n}),!e[t])throw new Error(`Tool not found: ${t}`);let i=e[t];if(!i||!i.execute)throw new Error(`Tool ${t} does not have execute method`);let a=n||{};t==="list_directory"&&!a.path&&(a.path=".",g.debug("[AmazonBedrockProvider] Added default path '.' for list_directory tool")),g.debug("[AmazonBedrockProvider] Tool input parameters:",a);let l={};for(let[p,m]of Object.entries(a))(m===null||typeof m=="string"||typeof m=="number"||typeof m=="boolean"||typeof m=="object"&&m!==null)&&(l[p]=m);let c=await i.execute(l);g.debug("[AmazonBedrockProvider] Tool execution result:",{toolName:t,result:c});let u;if(c&&typeof c=="object"&&"success"in c)if(c.success&&c.data!==void 0)typeof c.data=="string"?u=c.data:typeof c.data=="object"?u=JSON.stringify(c.data,null,2):u=String(c.data);else if(c.error){let p=typeof c.error=="string"?c.error:c.error.message||"Tool execution failed";throw new Error(p)}else u="";else typeof c=="string"?u=c:typeof c=="object"?u=JSON.stringify(c,null,2):u=String(c);return s.setStatus({code:$e.OK}),u}catch(i){throw g.error("[AmazonBedrockProvider] Tool execution error:",{toolName:t,error:i}),s.setStatus({code:$e.ERROR,message:i.message}),s.recordException(i),i}finally{s.end()}})}async resolveTurnTools(e,t){if(t)return{};let n=e??await this.getAllTools();return this.convertAISDKToolsToToolDefinitions(n)}toEngineTools(e){let t={};for(let n of Object.keys(e))t[n]={execute:o=>this.executeSingleTool(e,n,o)};return t}convertAISDKToolsToToolDefinitions(e){let t={};for(let[n,o]of Object.entries(e))if("description"in o&&o.description){let i=o.parameters??o.inputSchema;t[n]={description:o.description,parameters:i,execute:async a=>{if("execute"in o&&o.execute)return{success:!0,data:await o.execute(a,{toolCallId:`tool_${Date.now()}`,messages:[]})};throw new Error(`Tool ${n} has no execute method`)}}}return t}formatToolsForBedrock(e){if(!e||Object.keys(e).length===0)return null;let t=Object.entries(e).map(([n,o])=>{let s;return o.parameters&&typeof o.parameters=="object"?"_def"in o.parameters?s=xn(o.parameters):s=o.parameters:s={type:"object",properties:{},required:[]},(!s.type||s.type!=="object")&&(s={type:"object",properties:s.properties||{},required:s.required||[]}),{toolSpec:{name:n,description:o.description,inputSchema:{json:s}}}});return g.debug(`[AmazonBedrockProvider] Formatted ${t.length} tools for Bedrock`),{tools:t}}convertToBedrockMessages(e){return e.map(t=>{let n={role:t.role==="system"?"user":t.role,content:[]};return typeof t.content=="string"?n.content.push({text:t.content}):t.content.forEach(o=>{if(o.type==="text"&&o.text)n.content.push({text:o.text});else if(o.type==="image"&&o.image){let s=typeof o.image=="string"?Buffer.from(o.image.replace(/^data:image\/\w+;base64,/,""),"base64"):o.image,i=o.mimeType?.split("/")[1]||"png";i==="jpg"&&(i="jpeg"),n.content.push({image:{format:i==="jpeg"?DE.JPEG:i==="png"?DE.PNG:i==="gif"?DE.GIF:DE.WEBP,source:{bytes:s}}})}else if(o.type==="document"||o.type==="pdf"||o.type==="file"&&o.mimeType?.toLowerCase().startsWith("application/pdf")){let s;if(typeof o.data=="string"){let a=o.data.replace(/^data:application\/pdf;base64,/i,"");s=Buffer.from(a,"base64")}else s=o.data;let i=typeof o.name=="string"&&o.name?Sd.basename(o.name):"document-pdf";i=i.replace(/\.[^.]+$/,""),i=i.replace(/[^a-zA-Z0-9\s\-()[\]]/g,"-"),i=i.replace(/-+/g,"-").trim().replace(/^-+|-+$/g,""),i=i||"document",n.content.push({document:{format:"pdf",name:i,source:{bytes:s}}})}}),n})}getBedrockClient(){return this.bedrockClient}async executeStream(e){return g.debug("[TRACE] executeStream ENTRY - starting streaming attempt"),g.info("[AmazonBedrockProvider] Attempting real streaming with ConverseStreamCommand"),Uq.startActiveSpan("bedrock.stream",{kind:br.CLIENT,attributes:{"gen_ai.system":"aws.bedrock","gen_ai.request.model":this.modelName||this.getDefaultModel(),"gen_ai.operation.name":"stream"}},async t=>{try{if(g.debug("[TRACE] executeStream TRY block - about to call streamingConversationLoop"),this.conversationHistory=[],!!(e.input?.images?.length||e.input?.content?.length||e.input?.files?.length||e.input?.csvFiles?.length||e.input?.pdfFiles?.length)){g.debug("[AmazonBedrockProvider] Detected multimodal input, using multimodal message builder",{hasImages:!!e.input?.images?.length,imageCount:e.input?.images?.length||0,hasContent:!!e.input?.content?.length,contentCount:e.input?.content?.length||0,hasFiles:!!e.input?.files?.length,fileCount:e.input?.files?.length||0,hasCSVFiles:!!e.input?.csvFiles?.length,csvFileCount:e.input?.csvFiles?.length||0,hasPDFFiles:!!e.input?.pdfFiles?.length,pdfFileCount:e.input?.pdfFiles?.length||0});let s=$se(e,this.providerName,this.modelName),i=await T_(s,this.providerName,this.modelName);this.conversationHistory=this.convertToBedrockMessages(i)}else{g.debug("[AmazonBedrockProvider] Text-only input, using simple message builder");let s={role:"user",content:[{text:e.input.text}]};this.conversationHistory.push(s)}g.debug(`[AmazonBedrockProvider] Starting streaming conversation with ${this.conversationHistory.length} message(s)`),g.debug("[TRACE] executeStream - calling streamingConversationLoop NOW");let o=await this.streamingConversationLoop(e,t);return g.debug("[TRACE] executeStream - streamingConversationLoop SUCCESS, returning result"),t.setStatus({code:$e.OK}),t.end(),o}catch(n){g.debug("[TRACE] executeStream CATCH - error caught from streamingConversationLoop");let o=n,s=o?.name==="AccessDeniedException"||o?.name==="UnauthorizedOperation"||o?.message?.includes("bedrock:InvokeModelWithResponseStream")||o?.message?.includes("streaming")||o?.message?.includes("ConverseStream");if(g.debug("[TRACE] executeStream CATCH - checking if permission error"),g.debug(`[TRACE] executeStream CATCH - isPermissionError=${s}`),s){g.debug("[TRACE] executeStream CATCH - PERMISSION ERROR DETECTED, starting fallback"),g.warn(`[AmazonBedrockProvider] Streaming permissions not available, falling back to generate method: ${o.message}`),t.addEvent("stream.fallback_to_generate",{reason:o.message});let i=await this.generate({prompt:e.input.text,input:e.input,maxTokens:e.maxTokens,temperature:e.temperature,systemPrompt:e.systemPrompt});if(!i)throw t.setStatus({code:$e.ERROR,message:"Generate method returned null result"}),t.end(),new Error("Generate method returned null result");t.setAttribute("gen_ai.response.stop_reason","fallback_end_turn"),t.setStatus({code:$e.OK}),t.end();let a=new ReadableStream({start(c){let p=(i.content||"").split(/(\s+)/),m="";for(let f=0;f<p.length;f++)m+=p[f],(f===p.length-1||m.length>50||/[.!?;,]\s*$/.test(m))&&m.length>0&&(c.enqueue({content:m}),m="");m.length>0&&c.enqueue({content:m}),c.close()}});return{stream:{async*[Symbol.asyncIterator](){let c=a.getReader();try{for(;;){let{done:u,value:p}=await c.read();if(u)break;yield p}}finally{c.releaseLock()}}},usage:i.usage,model:this.modelName||this.getDefaultModel(),provider:this.getProviderName(),metadata:{fallback:!0}}}throw t.setStatus({code:$e.ERROR,message:o instanceof Error?o.message:String(o)}),t.recordException(o instanceof Error?o:new Error(String(o))),t.end(),n}})}async streamingConversationLoop(e,t){let n=Date.now(),o=e.maxSteps||Jo,s=await this.resolveTurnTools(e.tools,e.disableTools),i=this.formatToolsForBedrock(s),a=_a(this.providerName,this.modelName||this.getDefaultModel(),{temperature:e.temperature??.7},"bedrock.converseStream"),l=Fse({client:this.bedrockClient,streaming:!0,region:this.region,maxSteps:o,buildCommandInput:P=>({modelId:this.modelName||this.getDefaultModel(),messages:this.convertToAWSMessages(P),system:[{text:e.systemPrompt||"You are a helpful assistant with access to external tools. Use tools when necessary to provide accurate information."}],inferenceConfig:{maxTokens:e.maxTokens,...a.temperature!==void 0&&{temperature:a.temperature}},...i?{toolConfig:i}:{}})}),c=!1,u,p=new Promise(P=>{u=()=>{c=!0,P()}}),m={...l,executeStep:async(P,I,A)=>{let M=await l.executeStep(P,I,A);return u(),M}};t.addEvent("stream.api_call",{"bedrock.tool_count":i?.tools?.length??0});let{stream:f,resultPromise:h}=ty(m,this.conversationHistory,{tools:this.toEngineTools(s),abortSignal:e.abortSignal}),y=h.then(P=>({result:P,error:void 0}),P=>({result:void 0,error:P}));if(await Promise.race([p,y]),!c){let P=await y;if(P.error)throw P.error}let x=this.neurolink?.getEventEmitter(),b=this,T={startTime:n,streamId:`bedrock-${Date.now()}`},w,C=new Promise(P=>{w=P}),R=P=>{let I=P?.inputTokens??0,A=P?.outputTokens??0,M=P?.cacheReadTokens??0,L=P?.cacheWriteTokens??0;return{input:I,output:A,total:I+M+L+A,...M>0&&{cacheReadTokens:M},...L>0&&{cacheCreationTokens:L}}};return y.then(P=>{w(Vp(this.providerName,this.modelName||this.getDefaultModel(),{usage:R(P.result?.usage)},Date.now()-n,{requestId:`bedrock-stream-${Date.now()}`,streamingMode:!0}))}),{stream:{async*[Symbol.asyncIterator](){let P=!1;try{yield*f}catch(I){throw P=!0,I}finally{let I=await y;I.error&&(P=!0);let A=R(I.result?.usage);I.result&&(b.conversationHistory=I.result.conversation,T.finishReason=I.result.finishReason,T.rawFinishReason=I.result.rawStopReason,t.setAttribute("gen_ai.response.stop_reason",I.result.rawStopReason??"unknown")),x&&x.emit("generation:end",{provider:b.providerName,responseTime:Date.now()-n,timestamp:Date.now(),result:{content:"",usage:A,model:b.modelName||b.getDefaultModel(),provider:b.providerName,finishReason:P?"error":I.result?.rawStopReason},success:!P})}}},model:this.modelName||this.getDefaultModel(),provider:this.getProviderName(),analytics:C,metadata:T}}async checkBedrockHealth(){let e=new AbortController,t=setTimeout(()=>e.abort(),1e4),{BedrockClient:n,ListFoundationModelsCommand:o}=await Fq(),s=new n({region:process.env.AWS_REGION||"us-east-1"});try{g.debug("[AmazonBedrockProvider] Starting health check...");let i=new o({}),l=(await s.send(i,{abortSignal:e.signal})).modelSummaries||[],c=l.filter(u=>u.modelLifecycle?.status==="ACTIVE");if(g.debug(`[AmazonBedrockProvider] Health check passed - Found ${c.length} active models out of ${l.length} total models`),c.length===0)throw new Error("No active foundation models available in the region")}catch(i){clearTimeout(t);let a=i;if(wr(i))throw new Error("Bedrock health check timed out after 10 seconds",{cause:i});let l=typeof a.message=="string"?a.message:"";throw l.includes("UnauthorizedOperation")||l.includes("AccessDenied")?new Error("Bedrock access denied. Check your AWS credentials and IAM permissions for bedrock:ListFoundationModels",{cause:i}):a.code==="ECONNREFUSED"||a.code==="ENOTFOUND"?new Error("Unable to connect to Bedrock service. Check your network connectivity and AWS region configuration",{cause:i}):(g.error("[AmazonBedrockProvider] Health check failed:",i),new Error(`Bedrock health check failed: ${l||"Unknown error"}`,{cause:i}))}finally{clearTimeout(t);try{s.destroy()}catch{}}}formatProviderError(e){return en(e,[{match:n=>/AccessDeniedException/i.test(n.message),errorClass:Mt,message:"AWS Bedrock access denied. Check your credentials and permissions."},{match:n=>n.errorName==="ThrottlingException"||n.errorCode==="ThrottlingException",errorClass:qr,message:n=>`Bedrock rate limit (throttled): ${n.message}`},{match:n=>/ValidationException/i.test(n.message),errorClass:mt,message:n=>`Validation error: ${n.message}`},{match:()=>!0,errorClass:mt,message:n=>`AWS Bedrock error: ${n.message}`}],this.providerName,this.modelName)}async embed(e,t){let n=t||"amazon.titan-embed-text-v2:0";g.debug("Generating embedding",{provider:this.providerName,model:n,textLength:e.length});try{let{InvokeModelCommand:o}=await Promise.resolve().then(()=>(Lq(),YBe)),s=JSON.stringify({inputText:e}),i=new o({modelId:n,contentType:"application/json",accept:"application/json",body:s}),a=await ze(this.bedrockClient.send(i),6e4,new Error("Bedrock embedding API call timed out")),l=JSON.parse(new TextDecoder().decode(a.body));if(!l.embedding||!Array.isArray(l.embedding))throw new Error("Invalid embedding response from Bedrock");return g.debug("Embedding generated successfully",{provider:this.providerName,model:n,embeddingDimension:l.embedding.length}),l.embedding}catch(o){throw g.error("Embedding generation failed",{error:o instanceof Error?o.message:String(o),model:n,textLength:e.length}),this.handleProviderError(o)}}async embedMany(e,t){let n=t||"amazon.titan-embed-text-v2:0";g.debug("Generating batch embeddings",{provider:this.providerName,model:n,count:e.length});try{let o=await Promise.all(e.map(s=>this.embed(s,n)));return g.debug("Batch embeddings generated successfully",{provider:this.providerName,model:n,count:o.length,embeddingDimension:o[0]?.length}),o}catch(o){throw g.error("Batch embedding generation failed",{error:o instanceof Error?o.message:String(o),model:n,count:e.length}),this.handleProviderError(o)}}}});var uze={};ue(uze,{AmazonBedrockProvider:()=>jse,bedrockTracer:()=>Uq,loadBedrockControl:()=>Fq});var dze=E(()=>{"use strict";cze();Bse();zse()});var pze={};ue(pze,{AzureOpenAIProvider:()=>Gse});var Gse,mze=E(()=>{"use strict";Dt();Y();ea();Ko();Hp();hc();Rg();Gse=class extends Fn{azureDeployment;azureApiVersion;azureResourceOrigin;azureDeploymentPathPrefix;useMaxCompletionTokensOverride;constructor(e,t,n,o){let s=o?.apiKey||process.env.AZURE_OPENAI_API_KEY||"",i=process.env.AZURE_OPENAI_ENDPOINT||"",a;if(i)try{a=new URL(i.includes("://")?i:`https://${i}`)}catch{a=void 0}let l=a?.hostname??"",c=a?.pathname&&a.pathname!=="/"?a.pathname.replace(/\/+$/,""):"",u=/\.(openai|cognitiveservices)\.azure\.com$/.test(l),p;u?p="/openai":p=/\/openai(?:\/v\d+)?$/.test(c)?c:`${c}/openai`;let m=a?.origin??"",f=o?.deploymentName||e||process.env.AZURE_OPENAI_MODEL||process.env.AZURE_OPENAI_DEPLOYMENT||process.env.AZURE_OPENAI_DEPLOYMENT_ID||"gpt-4o",h=o?.apiVersion||process.env.AZURE_API_VERSION||"2025-04-01-preview",y=process.env.AZURE_OPENAI_USE_MAX_COMPLETION_TOKENS,x=o?.useMaxCompletionTokens??(y===void 0?void 0:/^(1|true|yes)$/i.test(y));s||an(uye()),m||an(dye()),super("azure",e,t,{baseURL:m,apiKey:s}),this.azureDeployment=f,this.azureApiVersion=h,this.azureResourceOrigin=m,this.azureDeploymentPathPrefix=p,this.useMaxCompletionTokensOverride=x,g.shouldLog("debug")&&g.debug("Azure OpenAI Provider initialized",qB({deployment:this.azureDeployment,resourceOrigin:this.azureResourceOrigin,deploymentPathPrefix:this.azureDeploymentPathPrefix,apiVersion:this.azureApiVersion,provider:"azure"}))}suppressResponseFormatWithTools(){return!1}getProviderName(){return"azure"}getDefaultModel(){return this.azureDeployment}formatProviderError(e){let t=[{match:n=>/401/.test(n.message),errorClass:Mt,message:"Invalid Azure OpenAI API key or endpoint."},...tn];return en(e,t,"azure",this.modelName)}getChatCompletionsURL(e){let t=e||this.azureDeployment,n=this.azureDeploymentPathPrefix.replace(/\/+$/,"");return`${this.azureResourceOrigin}${n}/deployments/${t}/chat/completions?api-version=${this.azureApiVersion}`}getAuthHeaders(){return{"api-key":this.config.apiKey}}adjustRequestBody(e,t){let n=this.useMaxCompletionTokensOverride??A1e(t);return e.max_tokens!==void 0&&n?{...e,max_completion_tokens:e.max_tokens,max_tokens:void 0}:e}}});function gze(r){return r.length>=8&&r[0]===137&&r[1]===80&&r[2]===78&&r[3]===71?"image/png":r.length>=3&&r[0]===255&&r[1]===216&&r[2]===255?"image/jpeg":r.length>=12&&r[0]===82&&r[1]===73&&r[2]===70&&r[3]===70&&r[8]===87&&r[9]===69&&r[10]===66&&r[11]===80?"image/webp":r.length>=6&&r[0]===71&&r[1]===73&&r[2]===70?"image/gif":"image/png"}var fze=E(()=>{"use strict"});function qse(r){return r.map(e=>typeof e.content=="string"?{role:e.role,content:e.content}:{role:e.role,content:e.content.map(t=>t.type==="image"||t.type==="document"?{type:t.type,media_type:t.source.media_type,base64_chars:t.source.data.length}:t)})}var hze=E(()=>{"use strict"});var $q,yze=E(()=>{$q=r=>{if(typeof globalThis.process<"u")return globalThis.process.env?.[r]?.trim()||void 0;if(typeof globalThis.Deno<"u")return globalThis.Deno.env?.get?.(r)?.trim()||void 0}});var xze=E(()=>{go()});function Bq(r){return r!=null&&typeof r=="object"&&!Array.isArray(r)}var Vse,Hse,Kse=E(()=>{xze();Vse=r=>(Vse=Array.isArray,Vse(r)),Hse=Vse});function*H_r(r){if(!r)return;if(vze in r){let{values:n,nulls:o}=r;yield*n.entries();for(let s of o)yield[s,null];return}let e=!1,t;r instanceof Headers?t=r.entries():Hse(r)?t=r:(e=!0,t=Object.entries(r??{}));for(let n of t){let o=n[0];if(typeof o!="string")throw new TypeError("expected header name to be a string");let s=Hse(n[1])?n[1]:[n[1]],i=!1;for(let a of s)a!==void 0&&(e&&!i&&(i=!0,yield[o,null]),yield[o,a])}}var vze,bze,Tze=E(()=>{Kse();vze=Symbol.for("brand.privateNullableHeaders");bze=r=>{let e=new Headers,t=new Set;for(let n of r){let o=new Set;for(let[s,i]of H_r(n)){let a=s.toLowerCase();o.has(a)||(e.delete(s),o.add(a)),i===null?(e.delete(s),t.add(a)):(e.append(s,i),t.delete(a))}}return{[vze]:!0,values:e,nulls:t}}});function J_r(r){let e=new um(r);return delete e.batches,e}function X_r(r){let e=new ti(r);return delete e.messages.batches,e}var K_r,W_r,zq,Wse=E(()=>{cM();use();P_();yze();Kse();Tze();cM();K_r="vertex-2023-10-16",W_r=new Set(["/v1/messages","/v1/messages?beta=true"]),zq=class extends Wn{constructor({baseURL:e=$q("ANTHROPIC_VERTEX_BASE_URL"),region:t=$q("CLOUD_ML_REGION")??null,projectId:n=$q("ANTHROPIC_VERTEX_PROJECT_ID")??null,...o}={}){if(!t)throw new Error("No region was given. The client should be instantiated with the `region` option or the `CLOUD_ML_REGION` environment variable should be set.");if(!e)switch(t){case"global":e="https://aiplatform.googleapis.com/v1";break;case"us":e="https://aiplatform.us.rep.googleapis.com/v1";break;case"eu":e="https://aiplatform.eu.rep.googleapis.com/v1";break;default:e=`https://${t}-aiplatform.googleapis.com/v1`}if(super({baseURL:e,...o}),this.messages=J_r(this),this.beta=X_r(this),this.region=t,this.projectId=n,this.accessToken=o.accessToken??null,o.authClient&&o.googleAuth)throw new Error("You cannot provide both `authClient` and `googleAuth`. Please provide only one of them.");o.authClient?this._authClientPromise=Promise.resolve(o.authClient):(this._auth=o.googleAuth??new iP({scopes:"https://www.googleapis.com/auth/cloud-platform"}),this._authClientPromise=this._auth.getClient())}validateHeaders(){}async prepareOptions(e){let t=await this._authClientPromise,n=await t.getRequestHeaders(),o=t.projectId??n["x-goog-user-project"];!this.projectId&&o&&(this.projectId=o),e.headers=bze([n,e.headers])}async buildRequest(e){if(Bq(e.body)&&(e.body={...e.body}),Bq(e.body)&&(e.body.anthropic_version||(e.body.anthropic_version=K_r)),W_r.has(e.path)&&e.method==="post"){if(!this.projectId)throw new Error("No projectId was given and it could not be resolved from credentials. The client should be instantiated with the `projectId` option or the `ANTHROPIC_VERTEX_PROJECT_ID` environment variable should be set.");if(!Bq(e.body))throw new Error("Expected request body to be an object for post /v1/messages");let t=e.body.model;e.body.model=void 0;let o=e.body.stream??!1?"streamRawPredict":"rawPredict";e.path=`/projects/${this.projectId}/locations/${this.region}/publishers/anthropic/models/${t}:${o}`}if(e.path==="/v1/messages/count_tokens"||e.path=="/v1/messages/count_tokens?beta=true"&&e.method==="post"){if(!this.projectId)throw new Error("No projectId was given and it could not be resolved from credentials. The client should be instantiated with the `projectId` option or the `ANTHROPIC_VERTEX_PROJECT_ID` environment variable should be set.");e.path=`/projects/${this.projectId}/locations/${this.region}/publishers/anthropic/models/count-tokens:rawPredict`}return super.buildRequest(e)}}});var Jse={};ue(Jse,{AnthropicVertex:()=>zq,BaseAnthropic:()=>Wn,default:()=>zq});var Xse=E(()=>{Wse();Wse()});async function Y_r(){return Yse||(Yse=await Promise.resolve().then(()=>(Xse(),Jse))),Yse}function Q_r(r){let e=[],t=new Map,n=0,o=s=>{let i=`${n}:${s??"x"}`,a=t.get(i);return a||(a={type:"tool_step",callParts:[],resultParts:[]},t.set(i,a),e.push(a)),a};for(let s of r){if(s.role==="tool_call"){o(s.metadata?.stepIndex).callParts.push({name:s.tool||"unknown",input:s.args||{}});continue}if(s.role==="tool_result"){o(s.metadata?.stepIndex).resultParts.push(s.content&&s.content.length>0?s.content:"(no output)");continue}let i=s.role==="assistant"?"assistant":s.role==="user"?"user":null;!i||!s.content||s.content.trim().length===0||(n++,e.push({type:"regular",role:i,parts:[s.content]}))}return e}function Zse(r,e,t){let n=r[r.length-1];n&&n.role===e&&Array.isArray(n.content)?n.content.push(...t):r.push({role:e,content:[...t]})}function eEr(r,e){let t=r.callParts,n=r.resultParts,o=Math.min(t.length,n.length);(o!==t.length||o!==n.length)&&g.debug("[GoogleVertex] Unbalanced tool step in Claude history replay",{calls:t.length,results:n.length,paired:o});let s=[],i=[];for(let a=0;a<o;a++){let l=`hist_${e}_${a}`;s.push({type:"tool_use",id:l,name:t[a].name,input:t[a].input}),i.push({type:"tool_result",tool_use_id:l,content:n[a]})}return{uses:s,results:i}}function tEr(r){let e=t=>Array.isArray(t.content)&&t.content.length>0&&t.content.every(n=>n.type==="tool_result");for(;r.length>0&&(r[0].role!=="user"||e(r[0]));)r.shift()}function eie(r){let e=[],t=0;for(let n of Q_r(r)){if(n.type==="regular"){Zse(e,n.role==="assistant"?"assistant":"user",[{type:"text",text:String(n.parts[0]??"")}]);continue}let{uses:o,results:s}=eEr(n,t);o.length!==0&&(t++,Zse(e,"assistant",o),Zse(e,"user",s))}if(tEr(e),g.shouldLog("debug")){let n=e.flatMap(o=>Array.isArray(o.content)?o.content:[]);g.debug("[GoogleVertex] Replayed Claude history with tool turns",{historyMessages:e.length,toolUseBlocks:n.filter(o=>o.type==="tool_use").length,toolResultBlocks:n.filter(o=>o.type==="tool_result").length})}return e}function tie(r,e){let t=r[r.length-1];if(t&&t.role==="user"){let n=Array.isArray(t.content)?t.content:[{type:"text",text:t.content}],o=Array.isArray(e)?e:[{type:"text",text:e}];t.content=[...n,...o];return}r.push({role:"user",content:e})}function my(r){if(!r||typeof r!="object")return;let e=["additionalProperties","default","$schema","$id","$ref","definitions","$defs","examples","errorMessage"];for(let n of e)n in r&&delete r[n];typeof r.exclusiveMinimum=="boolean"&&(r.exclusiveMinimum===!0&&typeof r.minimum=="number"?(r.exclusiveMinimum=r.minimum,delete r.minimum):delete r.exclusiveMinimum),typeof r.exclusiveMaximum=="boolean"&&(r.exclusiveMaximum===!0&&typeof r.maximum=="number"?(r.exclusiveMaximum=r.maximum,delete r.maximum):delete r.exclusiveMaximum);let t=2147483647;if(typeof r.maximum=="number"&&r.maximum>t&&delete r.maximum,typeof r.minimum=="number"&&r.minimum<-t&&delete r.minimum,r.properties&&typeof r.properties=="object")for(let n of Object.values(r.properties))n&&typeof n=="object"&&my(n);if(r.items&&typeof r.items=="object")if(Array.isArray(r.items))for(let n of r.items)n&&typeof n=="object"&&my(n);else my(r.items);for(let n of["allOf","anyOf","oneOf"])if(Array.isArray(r[n]))for(let o of r[n])o&&typeof o=="object"&&my(o)}function Sze(r,e,t){let n=nG({contents:r,availableInputTokens:mi("vertex",e),provider:"vertex",observedPromptTokens:t});if(!n)return!1;let o=new Set(n.drop),s=new Set(n.truncate),i=[];for(let a=0;a<r.length;a++){if(o.has(a))continue;let l=r[a];if(s.has(a)&&Array.isArray(l.parts)){i.push({...l,parts:l.parts.map(c=>{if(!("functionResponse"in c))return c;let u=c.functionResponse,p=JSON.stringify(u.response)??"";return p.length<=oEr?c:{functionResponse:{name:u.name,response:{result:fP(p)}}}})});continue}i.push(l)}if(o.size>0){let a=i.findIndex(l=>Array.isArray(l.parts)&&l.parts.some(c=>!!c.functionCall||!!c.functionResponse));a<0&&(a=Math.min(1,i.length)),i.splice(a,0,{role:"user",parts:[{text:rG}]})}return r.length=0,r.push(...i),!0}function wze(r,e,t){let n=Aq({conversation:r,availableInputTokens:mi("vertex",e),fixedOverheadTokens:0,provider:"vertex",observedPromptTokens:t,observedDescribesCurrentPayload:!0});if(!n)return!1;let o=new Set(n.drop),s=new Set(n.truncate),i=[];for(let a=0;a<r.length;a++){if(o.has(a))continue;let l=r[a];if(s.has(a)&&Array.isArray(l.content)){i.push({...l,content:l.content.map(c=>{if(c.type!=="tool_result")return c;let u=typeof c.content=="string"?c.content:JSON.stringify(c.content)??"";return{...c,content:kq(u)}})});continue}i.push(l)}if(o.size>0){let a=i.findIndex(l=>Array.isArray(l.content)&&l.content.some(c=>c.type==="tool_use"||c.type==="tool_result"));a<0&&(a=Math.min(1,i.length)),i.splice(a,0,{role:"user",content:[{type:"text",text:Rq}]})}return r.length=0,r.push(...i),!0}var Yse,Z_r,rie,jq,Gq,hM,FE,rEr,nEr,Qse,oEr,nie,oie=E(()=>{"use strict";to();Qr();eu();Oz();gP();ote();Xo();Ih();sz();Hr();oo();Dt();ea();St();_se();Kte();qI();Y();Fre();bse();Gj();fze();qj();Ko();Ea();kre();L_();_l();$re();Wv();oG();Fd();mI();ac();gr();Ld();Hp();cI();cg();hze();YI();Yse=null;Z_r=()=>!0;rie=()=>an(GL()),jq=()=>process.env.GOOGLE_CLOUD_LOCATION||process.env.VERTEX_LOCATION||process.env.GOOGLE_VERTEX_LOCATION||"us-central1",Gq=(r,e)=>{let t=e||jq();if(!r)return t;let n=r.toLowerCase();return n.startsWith("gemini-")||n.includes("/gemini-")||_2.some(s=>n===s.toLowerCase()||n.includes(s.toLowerCase())||s.toLowerCase().includes(n))?process.env.GOOGLE_VERTEX_GLOBAL_LOCATION||"global":t},hM=Gq,FE=()=>process.env.VERTEX_MODEL||"gemini-2.5-flash",rEr=()=>!!(process.env.GOOGLE_APPLICATION_CREDENTIALS_NEUROLINK||process.env.GOOGLE_APPLICATION_CREDENTIALS||process.env.GOOGLE_SERVICE_ACCOUNT_KEY||process.env.GOOGLE_AUTH_CLIENT_EMAIL&&process.env.GOOGLE_AUTH_PRIVATE_KEY),nEr=async(r,e)=>{let t=r||jq();return{projectId:rie(),region:t,...e!==void 0&&{timeout:e},maxRetries:0}},Qse=r=>r.toLowerCase().includes("claude"),oEr=2048;nie=class r extends no{projectId;location;registeredTools=new Map;toolContext={};static modelConfigCache=new Map;static modelConfigCacheTime=0;static CACHE_DURATION=300*1e3;static MAX_CACHE_SIZE=50;static maxTokensCache=new Map;static maxTokensCacheTime=0;constructor(e,t,n,o,s){super(e,"vertex",n),s&&(s.projectId&&(process.env.GOOGLE_CLOUD_PROJECT=String(s.projectId)),s.location&&(process.env.GOOGLE_CLOUD_LOCATION=String(s.location)),s.apiKey&&(process.env.GOOGLE_API_KEY=String(s.apiKey))),rEr()||an(Cye()),this.projectId=s?.projectId||rie(),this.location=o||s?.location||jq(),g.debug("[GoogleVertexProvider] Constructor initialized",{regionParam:o,resolvedLocation:this.location,projectId:this.projectId}),g.debug("Google Vertex AI BaseProvider v2 initialized",{modelName:this.modelName,projectId:this.projectId,location:this.location,provider:this.providerName})}getProviderName(){return"vertex"}getDefaultModel(){return FE()}async getAISDKModel(){throw new Oe({code:rt.INVALID_CONFIGURATION,message:"GoogleVertexProvider no longer uses @ai-sdk/google-vertex. All models use native SDKs: @google/genai for Gemini, @anthropic-ai/vertex-sdk for Claude.",category:"configuration",severity:"critical",retriable:!1,context:{provider:this.providerName,model:this.modelName}})}validateStreamOptionsOnly(e){this.validateStreamOptions(e)}async preprocessNativeFileInput(e){if(e.input&&jI(e.input),e.input?.files?.length)try{await GI(e,100*1024*1024,this.providerName)}catch(t){g.warn(`[GoogleVertex] processUnifiedFilesArray threw, continuing without file content: ${t instanceof Error?t.message:String(t)}`)}await Fv(e.input)}async executeStream(e,t){let n=e.model||this.modelName||FE();return KA({name:"neurolink.provider.stream",tracer:Me.provider,attributes:{[Ie.GEN_AI_SYSTEM]:this.providerName,[Ie.GEN_AI_MODEL]:n,[Ie.GEN_AI_OPERATION]:"stream",[Ie.NL_PROVIDER]:this.providerName}},async o=>{let s=Date.now(),i=e.tools||{};await this.preprocessNativeFileInput(e);let l={...await Ye({name:"neurolink.message.build",tracer:Me.provider,attributes:{[Ie.NL_PROVIDER]:this.providerName,"message.count":1,"message.build.count":1,"message.build.path":"vertex.native.stream"}},async()=>this.processCSVFilesForNativeSDK(e)),tools:i};try{let c;Qse(n)?(g.info("[GoogleVertex] Routing Claude model to native @anthropic-ai/vertex-sdk",{model:n,totalToolCount:Object.keys(i).length}),c=await this.executeNativeAnthropicStream(l)):(g.info("[GoogleVertex] Routing Gemini model to native @google/genai",{model:n,totalToolCount:Object.keys(i).length}),c=await this.executeNativeGemini3Stream(l)),this.attachUsageAndCostAttributes(o,n,c?.usage);let u=this.wrapStreamResultWithLifecycle(e,c,s);return this.emitStreamEnd(n,s,!0,void 0,c.finishReason),u}catch(c){throw this.fireGenerateOnError(e,c,s),this.emitStreamEnd(n,s,!1,c),c}},o=>o.stream,(o,s)=>this.preserveStreamResultAccessors(o,{...o,stream:s}))}emitStreamEnd(e,t,n,o,s){let i=this.neurolink?.getEventEmitter();i&&i.emit("stream:end",{provider:this.providerName,responseTime:Date.now()-t,timestamp:Date.now(),result:{content:"",usage:{input:0,output:0,total:0},model:e,provider:this.providerName,finishReason:n?s??"stop":"error"},success:n,...o?{error:o instanceof Error?o.message:String(o)}:{}})}async createVertexGenAIClient(e){let t=rie(),n=e||this.location||jq(),s=(await Promise.resolve().then(()=>(_w(),ww))).GoogleGenAI;if(!s)throw new Oe({code:rt.INVALID_CONFIGURATION,message:"@google/genai does not export GoogleGenAI",category:"configuration",severity:"critical",retriable:!1,context:{module:"@google/genai",expectedExport:"GoogleGenAI"}});let i=s;return new i({vertexai:!0,project:t,location:n,httpOptions:{fetch:xt()}})}buildGeminiFunctionDeclaration(e,t){let n={name:e,description:t.description||`Tool: ${e}`},s=t.parameters||t.inputSchema;if(s){let i=xn(s,"openApi3"),a=pn(i);a.$schema&&delete a.$schema;let l=pi(a);my(l),n.parametersJsonSchema=l}return n}refreshGeminiToolDeclarations(e,t,n,o){if(!e||!t)return;let s=new Set(t.map(i=>i.name));for(let[i,a]of Object.entries(e))s.has(i)||(t.push(this.buildGeminiFunctionDeclaration(i,a)),a.execute&&n.set(i,a.execute),o.delete(i),g.info(`[GoogleVertex] Tool "${i}" hydrated mid-turn via discovery \u2014 added to Gemini declarations.`))}resolveGeminiToolOnMiss(e,t,n,o,s){if(!n)return;let i=eee(t,e);if(i?.execute)return n.some(a=>a.name===e)||n.push(this.buildGeminiFunctionDeclaration(e,i)),o.set(e,i.execute),s.delete(e),g.info(`[GoogleVertex] Tool "${e}" resolved mid-turn via discovery \u2014 executing.`),o.get(e)}buildAnthropicToolDeclaration(e,t){let n={name:e,description:t.description||`Tool: ${e}`,input_schema:{type:"object"}},s=t.parameters||t.inputSchema;if(s){let i=xn(s),a=pn(i);n.input_schema={type:"object",properties:a.properties||{},required:a.required||[]}}return n}refreshAnthropicToolDeclarations(e,t,n,o){if(!e||!t)return;let s=new Set(t.map(i=>i.name));for(let[i,a]of Object.entries(e))s.has(i)||(t.push(this.buildAnthropicToolDeclaration(i,a)),a.execute&&n.set(i,a.execute),o.delete(i),g.info(`[GoogleVertex] Tool "${i}" hydrated mid-turn via discovery \u2014 added to Anthropic declarations.`))}resolveAnthropicToolOnMiss(e,t,n,o,s){if(!n)return;let i=eee(t,e);if(i?.execute)return n.some(a=>a.name===e)||n.push(this.buildAnthropicToolDeclaration(e,i)),o.set(e,i.execute),s.delete(e),g.info(`[GoogleVertex] Tool "${e}" resolved mid-turn via discovery \u2014 executing.`),o.get(e)}async executeNativeGemini3Stream(e){let t=e.model||this.modelName||FE(),n=hM(t,e.region),o=await this.createVertexGenAIClient(n);g.debug("[GoogleVertex] Using native @google/genai for Gemini 3",{model:t,hasTools:!!e.tools&&Object.keys(e.tools).length>0,project:this.projectId,location:n});let s=[],i=[{text:e.input.text??""}],a=e.input;if(a?.pdfFiles&&a.pdfFiles.length>0){g.debug(`[GoogleVertex] Processing ${a.pdfFiles.length} PDF file(s) for native stream`);for(let fe of a.pdfFiles){let De;typeof fe=="string"?wn.existsSync(fe)?De=wn.readFileSync(fe):De=Buffer.from(fe,"base64"):De=fe;let we=De.toString("base64");i.push({inlineData:{mimeType:"application/pdf",data:we}})}}if(await Zj(i,a?.nativeAudioFiles,"[GoogleVertex]"),a?.images&&a.images.length>0){g.debug(`[GoogleVertex] Processing ${a.images.length} image(s) for native stream`);for(let fe of a.images){let De=i_(fe),we,Je="image/jpeg";if(typeof De=="string")if(wn.existsSync(De)){we=wn.readFileSync(De);let ce=Nv(De);Je=ce.startsWith("image/")?ce:this.detectImageType(we)}else if(De.startsWith("data:")){let ce=De.match(/^data:([^;]+);base64,(.+)$/);if(ce)Je=ce[1],we=Buffer.from(ce[2],"base64");else continue}else if(De.startsWith("http://")||De.startsWith("https://"))try{let ce=await fetch(De);if(!ce.ok){g.warn(`[GoogleVertex] Image fetch failed: ${ce.status} ${ce.statusText}, skipping`,{url:Wr(De)});continue}let qe=await ce.arrayBuffer();we=Buffer.from(qe);let Be=ce.headers.get("content-type");Be&&Be.startsWith("image/")&&(Je=Be.split(";")[0])}catch(ce){g.warn(`[GoogleVertex] Image URL fetch threw, skipping: ${ce instanceof Error?ce.message:String(ce)}`,{url:Wr(De)});continue}else we=Buffer.from(De,"base64"),Je=this.detectImageType(we);else we=De,Je=this.detectImageType(we);let Ge=we.toString("base64");i.push({inlineData:{mimeType:Je,data:Ge}})}}O_(s,e.conversationMessages),s.push({role:"user",parts:i});let l,c=new Qh;if(e.tools&&Object.keys(e.tools).length>0&&!e.disableTools){let fe=Eg(e.tools,"functionDeclarations");l=fe.toolsConfig;for(let[De,we]of fe.executeMap)c.set(De,we);g.debug("[GoogleVertex] Converted tools for native SDK",{toolCount:fe.toolsConfig[0].functionDeclarations.length,toolNames:fe.toolsConfig[0].functionDeclarations.map(De=>De.name)})}let u=e,p=!1;if(u.schema&&l){p=!0;let fe=xn(u.schema,"openApi3"),De=pn(fe);De.$schema&&delete De.$schema;let we=pi(De),Je=l[0]?.functionDeclarations||[];Je.push({name:"final_result",description:"Return the final structured result. You MUST call this tool when you have gathered all information and are ready to provide the final answer. The arguments should contain the structured data matching the expected schema.",parametersJsonSchema:we}),l=[{functionDeclarations:Je}],g.debug("[GoogleVertex] Added final_result tool for structured output with tools (stream)",{schemaKeys:Object.keys(we),totalTools:Je.length})}let m=_a(this.providerName,t,{temperature:e.temperature??1,...e.topP!==void 0&&{topP:e.topP}},"vertex.gemini"),f={...m.temperature!==void 0&&{temperature:m.temperature},maxOutputTokens:e.maxTokens};nP(t)&&(f.maxOutputTokens&&f.maxOutputTokens>Nl&&(g.warn(`[GoogleVertex] Capping maxOutputTokens from ${f.maxOutputTokens} to ${Nl} for ${t}`),f.maxOutputTokens=Nl),f.maxOutputTokens||(f.maxOutputTokens=Nl)),m.topP!==void 0&&(f.topP=m.topP),e.topK!==void 0&&(f.topK=e.topK),e.stopSequences&&e.stopSequences.length>0&&(f.stopSequences=e.stopSequences),l&&(f.tools=l);let h=e.systemPrompt||"";p&&(h=h+`
1129
+ `);return{...s!==void 0?{system:s}:{},messages:t}},HBe=r=>{if(!(!r||r==="auto")){if(r==="none")return{type:"none"};if(r==="required")return{type:"any"};if(typeof r=="object"){let e=r;if(e.type==="tool"&&e.toolName)return{type:"tool",name:e.toolName}}}},JSr=r=>{switch(r){case"max_tokens":return"length";case"tool_use":return"tool-calls";case"refusal":return"content-filter";default:return"stop"}},KBe=6e5,Ose=class extends no{client;authMethod;subscriptionTier;enableBetaFeatures;oauthToken;lastResponseMetadata=null;usageInfo=null;refreshPromise;constructor(e,t,n,o){let s=!!(o?.apiKey&&!o?.oauthToken),i=s?null:(o?.oauthToken?{accessToken:o.oauthToken}:null)??n?.oauthToken??qBe(),a=s?"api_key":n?.authMethod??WSr(i),l=n?.subscriptionTier??(a==="oauth"?KSr(i):"api"),c=e||Nq(),u=c;!process.env.ANTHROPIC_BASE_URL&&l!=="api"&&!pM(c,l)&&(u=_q(l),g.warn("Model not available for subscription tier, using recommended model",{requestedModel:c,subscriptionTier:l,recommendedModel:u})),super(u,"anthropic",t),this.enableBetaFeatures=n?.enableBetaFeatures??!0,this.oauthToken=i,this.subscriptionTier=l,this.authMethod=a;let m=this.getAuthHeaders(),f;if(g.debug("[AnthropicProvider] Constructor - checking OAuth:",{authMethod:this.authMethod,hasOAuthToken:!!this.oauthToken,hasAccessToken:!!this.oauthToken?.accessToken}),this.authMethod==="oauth"&&this.oauthToken){g.debug("[AnthropicProvider] Creating OAuth fetch wrapper...");let h=this.oauthToken,y=yBe(()=>h.accessToken,this.enableBetaFeatures,!1,!0);f=new Wd({apiKey:"oauth-authenticated",fetch:vse(y),timeout:KBe,maxRetries:0}),g.debug("[AnthropicProvider] Anthropic SDK client created with OAuth fetch wrapper"),g.debug("Anthropic Provider initialized with OAuth",{modelName:this.modelName,provider:this.providerName,authMethod:this.authMethod,subscriptionTier:this.subscriptionTier,enableBetaFeatures:this.enableBetaFeatures,hasRefreshToken:!!this.oauthToken.refreshToken,tokenExpiry:this.oauthToken.expiresAt?new Date(this.oauthToken.expiresAt).toISOString():"none"})}else{let h=o?.apiKey??n?.apiKey??GBe(),y=(()=>{let x=process.env.ANTHROPIC_BASE_URL;if(!x)return;let b=x.replace(/\/+$/,""),T=b.replace(/\/v\d+$/,"");return T!==b&&g.debug("[AnthropicProvider] Stripping the version suffix from ANTHROPIC_BASE_URL \u2014 the official Anthropic SDK appends /v1 to the base URL itself.",{baseURL:Ir(x),rewrittenTo:Ir(T)}),T})();f=new Wd({apiKey:h,defaultHeaders:m,...y&&{baseURL:y},fetch:vse(xt()),timeout:KBe,maxRetries:0}),g.debug("Anthropic Provider initialized with API key",{modelName:this.modelName,provider:this.providerName,authMethod:this.authMethod,subscriptionTier:this.subscriptionTier,enableBetaFeatures:this.enableBetaFeatures})}this.client=f,this.usageInfo={messagesUsed:0,messagesRemaining:-1,tokensUsed:0,tokensRemaining:-1,inputTokensUsed:0,outputTokensUsed:0,lastRequestTimestamp:0,isRateLimited:!1,requestCount:0,messageQuotaPercent:0,tokenQuotaPercent:0},g.debug("Anthropic Provider v2 initialized",{modelName:this.modelName,provider:this.providerName,authMethod:this.authMethod,subscriptionTier:this.subscriptionTier,enableBetaFeatures:this.enableBetaFeatures,betaFeatures:this.enableBetaFeatures?Oq["anthropic-beta"]:"disabled"})}getAuthHeaders(){let e={},t=!!process.env.ANTHROPIC_BASE_URL;if(this.enableBetaFeatures)if(t){let n=process.env.ANTHROPIC_ENABLE_LONG_CONTEXT_BETA==="1"||process.env.ANTHROPIC_ENABLE_LONG_CONTEXT_BETA==="true",o=[...yb,"fine-grained-tool-streaming-2025-05-14","interleaved-thinking-2025-05-14","redact-thinking-2026-02-12"];n&&o.push("context-1m-2025-08-07"),e["anthropic-beta"]=o.join(",")}else e["anthropic-beta"]=Oq["anthropic-beta"];return t&&(e["User-Agent"]=Jd),this.subscriptionTier!=="api"&&(e["x-subscription-tier"]=this.subscriptionTier),e}validateModelAccess(e){if(process.env.ANTHROPIC_BASE_URL)return g.debug("[validateModelAccess] Bypassing tier check (ANTHROPIC_BASE_URL set \u2014 proxy enforces access)",{model:e}),!0;if(this.subscriptionTier==="api")return!0;let t=pM(e,this.subscriptionTier);return t||g.debug("[validateModelAccess] Model not available for tier",{model:e,tier:this.subscriptionTier}),t}getUsageInfo(){return this.usageInfo}areBetaFeaturesEnabled(){return this.enableBetaFeatures}getModelCapabilities(){return Eq(this.modelName||this.getDefaultModel())}getSubscriptionTier(){return this.subscriptionTier}getAuthMethod(){return this.authMethod}async refreshAuthIfNeeded(){if(this.authMethod!=="oauth"||!this.oauthToken){g.debug("Token refresh not applicable for API key authentication");return}if(!this.oauthToken.expiresAt){g.debug("Token has no expiry information, assuming valid");return}let e=Date.now(),t=this.oauthToken.expiresAt<=e,n=this.oauthToken.expiresAt<=e+3e5;if(!t&&!n){g.debug("OAuth token is still valid",{expiresInMs:this.oauthToken.expiresAt-e});return}if(!this.oauthToken.refreshToken){if(t)throw new Mt("OAuth token expired and no refresh token available. Please re-authenticate.",this.providerName);g.warn("OAuth token expiring soon but no refresh token available",{expiresInMs:this.oauthToken.expiresAt-e});return}if(this.refreshPromise){await this.refreshPromise;return}g.info("Refreshing OAuth token",{isExpired:t,expiresInMs:this.oauthToken.expiresAt-e});let o=this.oauthToken,s=o.refreshToken;this.refreshPromise=(async()=>{let a=new AbortController,l=setTimeout(()=>a.abort(),3e4),c=await fetch(ME,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":Jd},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:s,client_id:Sq}),signal:a.signal});if(clearTimeout(l),!c.ok){let m=await c.text();throw new Mt(`Failed to refresh OAuth token: ${c.status} ${m}`,this.providerName)}let u=await c.json();o.accessToken=u.access_token,o.refreshToken=u.refresh_token||o.refreshToken,o.expiresAt=u.expires_in?Date.now()+u.expires_in*1e3:void 0,o.tokenType=u.token_type||"Bearer";let p=o;try{let m=Fr(Pp(),".neurolink");eo(m)||lA(m,{recursive:!0});let f=Fr(m,"anthropic-credentials.json"),h=`${f}.tmp`,x={...eo(f)?JSON.parse(Gc(f,"utf-8")):{},type:"oauth",oauth:p,updatedAt:Date.now()};aA(h,JSON.stringify(x,null,2),{mode:384}),lX(h,f),g.debug("Refreshed OAuth credentials persisted to disk")}catch(m){g.warn("Failed to persist refreshed OAuth token to disk",{error:m instanceof Error?m.message:String(m)})}g.info("OAuth token refreshed successfully",{hasNewRefreshToken:!!u.refresh_token,expiresIn:u.expires_in})})();try{await this.refreshPromise}catch(i){throw i instanceof Mt?i:new Mt(`Failed to refresh OAuth token: ${i instanceof Error?i.message:String(i)}`,this.providerName)}finally{this.refreshPromise=void 0}}getLastResponseMetadata(){return this.lastResponseMetadata}updateResponseMetadata(e,t,n){this.lastResponseMetadata={rateLimit:e,...t?{requestId:t}:{}},this.usageInfo&&(this.usageInfo.requestCount++,this.usageInfo.messagesUsed++,this.usageInfo.lastRequestTimestamp=Date.now(),n&&(n.inputTokens!==void 0&&(this.usageInfo.inputTokensUsed+=n.inputTokens,this.usageInfo.tokensUsed+=n.inputTokens),n.outputTokens!==void 0&&(this.usageInfo.outputTokensUsed+=n.outputTokens,this.usageInfo.tokensUsed+=n.outputTokens)),e?.requestsRemaining!==void 0&&(this.usageInfo.messagesRemaining=e.requestsRemaining),e?.tokensRemaining!==void 0&&(this.usageInfo.tokensRemaining=e.tokensRemaining),e?.requestsLimit&&e.requestsLimit>0&&(this.usageInfo.messageQuotaPercent=Math.round((e.requestsLimit-(e.requestsRemaining??0))/e.requestsLimit*100)),e?.tokensLimit&&e.tokensLimit>0&&(this.usageInfo.tokenQuotaPercent=Math.round((e.tokensLimit-(e.tokensRemaining??0))/e.tokensLimit*100)),e?.retryAfter!==void 0?(this.usageInfo.isRateLimited=!0,this.usageInfo.rateLimitExpiresAt=Date.now()+e.retryAfter*1e3):(this.usageInfo.isRateLimited=!1,this.usageInfo.rateLimitExpiresAt=void 0)),e?.requestsRemaining!==void 0&&e.requestsRemaining<=5&&g.warn("Approaching Anthropic request rate limit",{remaining:e.requestsRemaining,limit:e.requestsLimit,reset:e.requestsReset}),e?.tokensRemaining!==void 0&&e.tokensLimit&&e.tokensRemaining<e.tokensLimit*.1&&g.warn("Approaching Anthropic token rate limit",{remaining:e.tokensRemaining,limit:e.tokensLimit,reset:e.tokensReset})}getProviderName(){return"anthropic"}getDefaultModel(){return Nq()}getAISDKModel(){let e=this.client,t=this.providerName,n=this.modelName||Nq(),o=a=>this.getTimeout(a??{}),s=()=>this.refreshAuthIfNeeded();return{specificationVersion:"v3",provider:t,modelId:n,supportedUrls:{},doGenerate:async a=>{await s();let l=VBe(a.prompt),c=l.messages,u=l.system,p=(a.tools??[]).filter(B=>B.type==="function").map(B=>{let $=nm(B);return{name:B.name,...B.description?{description:B.description}:{},input_schema:B.inputSchema??{type:"object",properties:{}},...$?{cache_control:$}:{}}});p&&p.length===0&&(p=void 0);let m=a.toolChoice?HBe(a.toolChoice.type==="tool"?{type:"tool",toolName:a.toolChoice.toolName}:a.toolChoice.type):void 0,f;if(a.responseFormat?.type==="json"){f=a.responseFormat.name??"json";let B=a.responseFormat.schema??{type:"object"};p=[{name:f,description:a.responseFormat.description??"Respond by calling this tool with the answer as its input.",input_schema:B}],m={type:"tool",name:f}}let h=a.providerOptions?.anthropic?.finalResultSchema,y=!1;if(!f&&h){let B=Rse(p,h);p=B.tools,y=B.applied,B.applied&&(u=kse(u))}let x=a.providerOptions?.anthropic?.thinking,b=Sse({system:u,tools:p,messages:c}),T=wse(c,Pq-b),w=_a("anthropic",n,{...a.temperature!==void 0&&a.temperature!==null?{temperature:a.temperature}:{},...a.topP!==void 0&&a.topP!==null?{topP:a.topP}:{}},"anthropic.doGenerate"),C={model:n,messages:T,max_tokens:A_(n,a.maxOutputTokens),...u?{system:u}:{},...w.temperature!==void 0?{temperature:w.temperature}:{},...w.topP!==void 0?{top_p:w.topP}:{},...a.stopSequences&&a.stopSequences.length>0?{stop_sequences:a.stopSequences}:{},...p?{tools:p}:{},...m?{tool_choice:m}:{},...x?{thinking:x}:{}},R=a.timeout,k=R!=null,P=C.max_tokens>8192&&!k?Math.max(o(a),3e5):o(a),I=Ws(P,t,"generate"),A;try{A=await e.messages.create(C,{signal:Fx(a.abortSignal,I?.controller.signal)})}finally{I?.cleanup()}let M=[],L,U=[],D=!1;for(let B of A.content)B.type==="thinking"?M.push({type:"reasoning",text:B.thinking}):B.type==="text"?f?U.push(B.text):M.push({type:"text",text:B.text}):B.type==="tool_use"&&(f&&B.name===f?(D=!0,M.push({type:"text",text:bP(B.input)})):y&&B.name===gM?L=bP(B.input):M.push({type:"tool-call",toolCallId:B.id,toolName:B.name,input:bP(B.input)}));if(f&&!D&&U.length>0&&M.push({type:"text",text:U.join("")}),L!==void 0){let B=M.filter($=>$.type==="reasoning");M.length=0,M.push(...B,{type:"text",text:L}),g.debug("[Anthropic] Extracted structured output from final_result tool (generate)",{chars:L.length})}let z=A.usage.cache_read_input_tokens??0,j=A.usage.cache_creation_input_tokens??0;return{content:M,finishReason:{unified:L!==void 0?"stop":JSr(A.stop_reason),raw:A.stop_reason??"stop"},usage:{inputTokens:{total:A.usage.input_tokens+z+j,noCache:A.usage.input_tokens,cacheRead:z,cacheWrite:j},outputTokens:{total:A.usage.output_tokens,text:A.usage.output_tokens,reasoning:void 0}},warnings:[],request:{body:C},response:{id:A.id,modelId:A.model,headers:_Be()??{},body:A}}},doStream:()=>{throw new Error(`${t}: doStream is not implemented on the delegating model \u2014 the streaming path uses executeStream directly.`)}}}formatProviderError(e){return en(e,[{match:n=>n.statusCode===401||/API_KEY_INVALID|Invalid API key/i.test(n.message),errorClass:Mt,message:"Invalid Anthropic API key. Please check your ANTHROPIC_API_KEY environment variable."},{match:n=>n.statusCode===429||/rate limit|too_many_requests|429/i.test(n.message),errorClass:qr,message:"Anthropic rate limit exceeded. Please try again later."},{match:n=>/ECONNRESET|ENOTFOUND|ECONNREFUSED|network|connection/i.test(n.message),errorClass:cn,message:n=>`Connection error: ${n.message}`},{match:n=>/500|502|503|504|server error/i.test(n.message),errorClass:mt,message:n=>`Server error: ${n.message}`},{match:()=>!0,errorClass:mt,message:n=>`Anthropic error: ${n.message}`}],this.providerName,this.modelName)}async generate(e,t){await this.refreshAuthIfNeeded();let{result:n,snapshot:o}=await SBe(()=>super.generate(e,t));return n&&o&&(this.recordLimitSnapshot(o),n.limits=o,n.analytics&&(n.analytics.limits=o)),n}recordLimitSnapshot(e){this.updateResponseMetadata(e.rateLimit,e.requestId),CBe(e),RBe(e,this.modelName)}async executeStream(e,t){return EBe(()=>this.executeStreamInCaptureScope(e,t))}async executeStreamInCaptureScope(e,t){await this.refreshAuthIfNeeded(),this.validateStreamOptions(e);let n=this.getTimeout(e),o=Ws(n,this.providerName,"stream"),s=new AbortController,i=y1([e.abortSignal,o?.controller.signal,s.signal]).signal,a,l,c,u,p=!1;try{u=!e.disableTools&&this.supportsTools(),a=u?e.tools||await this.getAllTools():{},l=u?Eg(a,"input_schema"):void 0;let ae=await this.buildMessagesForStream(e);if(c=VBe(ae),e.schema&&l&&l.length>0){let X=Rse(l,xn(e.schema));l=X.tools,p=X.applied,X.applied&&(c.system=kse(c.system))}}catch(ae){throw o?.cleanup(),this.handleProviderError(ae)}let m=this.modelName||Nq(),f=u&&l&&l.length>0?HBe(mG(e,a,u)):void 0,h=e.thinkingConfig?.enabled&&e.thinkingConfig.budgetTokens?{type:"enabled",budget_tokens:e.thinkingConfig.budgetTokens}:void 0,y=HSr.startSpan("neurolink.provider.streamText",{kind:br.CLIENT,attributes:{"gen_ai.system":"anthropic","gen_ai.request.model":m}}),x=e.maxSteps||Jo,b=this.neurolink?.getEventEmitter(),T=Uu(),{push:w}=T,{usagePromise:C,finishPromise:R,resolveUsage:k,resolveFinish:P}=uG();C.then(ae=>{y.setAttribute("gen_ai.usage.input_tokens",ae.promptTokens||0),y.setAttribute("gen_ai.usage.output_tokens",ae.completionTokens||0),ae.cacheReadTokens&&y.setAttribute("gen_ai.usage.cached_input_tokens",ae.cacheReadTokens);let X=Us(this.providerName,this.modelName,{input:ae.promptTokens||0,output:ae.completionTokens||0,total:ae.totalTokens||0,...ae.cacheReadTokens?{cacheReadTokens:ae.cacheReadTokens}:{},...ae.cacheCreationTokens?{cacheCreationTokens:ae.cacheCreationTokens}:{}});X&&X>0&&y.setAttribute("neurolink.cost",X)}).catch(()=>{}),R.then(ae=>{y.setAttribute("gen_ai.response.finish_reason",ae||"unknown"),y.end()}).catch(()=>{y.end()});let I,A=this.client,M=[],L=Date.now(),U=0,D=0,z=0,j=0,B=null,$=()=>({promptTokens:U,completionTokens:D,totalTokens:U+z+j+D,...z>0?{cacheReadTokens:z}:{},...j>0?{cacheCreationTokens:j}:{}}),N="",J,ne=(ae,X)=>{let Se=ye=>{if(typeof ye=="string")return ye;try{return JSON.stringify(ye)??""}catch{return""}};return zt(Se(ae),"anthropic")+zt(Se(X),"anthropic")},de=(async()=>{let ae,X,se=DBe({client:A,maxSteps:x,toolsRecord:a,buildParams:oe=>{if(l){let we=new Set(l.map(Ge=>Ge.name)),Je=Object.fromEntries(Object.entries(a).filter(([Ge])=>!we.has(Ge)));if(Object.keys(Je).length>0){let Ge=Eg(Je,"input_schema");Ge&&Ge.length>0&&(l=[...l,...Ge])}}let le=Sse({system:c.system,tools:l,messages:oe}),fe=wse(oe,Pq-le),De=_a("anthropic",m,e.temperature!==void 0&&e.temperature!==null?{temperature:e.temperature}:{},"anthropic.executeStream");return{model:m,messages:fe,max_tokens:A_(m,e.maxTokens),stream:!0,...c.system?{system:c.system}:{},...De.temperature!==void 0?{temperature:De.temperature}:{},...l&&l.length>0?{tools:l}:{},...f?{tool_choice:f}:{},...h?{thinking:h}:{}}},planReclaim:oe=>{let le=Aq({conversation:oe,availableInputTokens:mi("anthropic",m,e.maxTokens??void 0),fixedOverheadTokens:ne(c.system,l),provider:"anthropic",observedPromptTokens:ae,previousSentEstimate:X,onSentEstimate:Je=>{X=Je}});if(!le)return;let fe=new Set(le.drop),De=new Set(le.truncate),we=[];for(let Je=0;Je<oe.length;Je++){if(fe.has(Je))continue;let Ge=oe[Je];if(De.has(Je)&&Array.isArray(Ge.content)){we.push({...Ge,content:Ge.content.map(ce=>ce.type==="tool_result"?{...ce,content:kq(typeof ce.content=="string"?ce.content:JSON.stringify(ce.content)??"")}:ce)});continue}we.push(Ge)}if(fe.size>0){let Je=we.findIndex(Ge=>Array.isArray(Ge.content)&&Ge.content.some(ce=>ce.type==="tool_use"||ce.type==="tool_result"));Je<0&&(Je=Math.min(1,we.length)),we.splice(Je,0,{role:"user",content:[{type:"text",text:Rq}]})}return we},noteObservedPromptTokens:oe=>{ae=oe},...p?{finalResultToolName:gM,onTerminalResult:oe=>{J=oe,g.debug("[Anthropic] Extracted structured output from final_result tool (stream)",{chars:oe.length})}}:{}}),G={...se,buildToolResultMessages:(oe,le,fe)=>{for(let Je of fe)M.push(Je.name);let De=fe.map(Je=>({type:"tool-call",toolCallId:Je.id,toolName:Je.name,args:Je.args})),we=fe.map(Je=>Je.error?{type:"tool-result",toolCallId:Je.id,toolName:Je.name,error:Je.error}:{type:"tool-result",toolCallId:Je.id,toolName:Je.name,result:Je.output});return Yw(b,we.map(Je=>({toolName:Je.toolName,result:"result"in Je?Je.result:void 0,error:"error"in Je?Je.error:void 0}))),this.handleToolExecutionStorage(De,we,e,new Date).catch(Je=>{g.warn("[AnthropicProvider] Failed to store tool executions",{provider:this.providerName,error:Je instanceof Error?Je.message:String(Je)})}),se.buildToolResultMessages(oe,le,fe)}},q={};for(let[oe,le]of Object.entries(a)){let fe=le.execute;fe&&(q[oe]={execute:async(De,we)=>{let Je=we;return fe(De,{toolCallId:Je.toolCallId??"",...Je.abortSignal?{abortSignal:Je.abortSignal}:{},messages:[]})}})}let{stream:re,resultPromise:O}=ty(G,c.messages.slice(),{tools:q,...i?{abortSignal:i}:{}}),Z=(async()=>{for await(let oe of re)oe.reasoning&&w({content:"",reasoning:oe.reasoning}),oe.content&&(p?N+=oe.content:w({content:oe.content}))})(),Q=await O;await Z,U+=Q.usage.inputTokens,D+=Q.usage.outputTokens,z+=Q.usage.cacheReadTokens??0,j+=Q.usage.cacheWriteTokens??0,B=Q.rawStopReason??B,k($()),P(B??"stop")})().catch(ae=>{throw I=ae,g.error("Anthropic: Stream error",{error:ae instanceof Error?ae.message:String(ae)}),k($()),P("error"),this.formatProviderError(ae)}).finally(()=>{if(p){let ae=J??N;ae.length>0&&w({content:ae})}o?.cleanup(),T.close()});de.catch(()=>{});let Ue=this.providerName;return{stream:async function*(){let ae=0;try{for await(let X of T.iterable)"content"in X&&typeof X.content=="string"&&X.content.length>0&&ae++,yield X;if(await de,ae===0&&M.length===0){g.warn(`${Ue}: Stream produced no output \u2014 emitting enriched sentinel`);let X=new Ta({message:"Stream produced no output"}),Se=await Yp(X,void 0,I);Zp(Se),yield Se}}catch(X){let Se=await Yp(X,void 0,I);if(Zp(Se),yield Se,!Ta.isInstance(X))throw X}finally{s.signal.aborted||s.abort()}}(),provider:this.providerName,model:this.modelName,toolCalls:[],toolResults:[],analytics:R.then(async()=>{let ae=await pG.createAnalytics(this.providerName,m,{textStream:(async function*(){})(),usage:C,finishReason:R},Date.now()-L,{requestId:e.requestId??`${this.providerName}-stream-${Date.now()}`,streamingMode:!0}),X=wBe();return X&&ae&&(this.recordLimitSnapshot(X),ae.limits=X),ae})}}async isAvailable(){try{return qBe()||GBe(),!0}catch{return!1}}getModel(){return this.getAISDKModel()}}});var JBe={};ue(JBe,{ANTHROPIC_BETA_HEADERS:()=>Oq,AnthropicProvider:()=>Ose,ModelAccessError:()=>jR,getModelCapabilities:()=>Eq,getRecommendedModelForTier:()=>_q,isModelAvailableForTier:()=>pM});var XBe=E(()=>{"use strict";WBe();Mse()});var YBe={};ue(YBe,{Agent:()=>Owr,BedrockClient:()=>YSr,BedrockRuntimeClient:()=>Nse,Blob:()=>Mwr,Client:()=>Lwr,ConverseCommand:()=>Lse,ConverseStreamCommand:()=>Dse,Cron:()=>gwr,Dispatcher:()=>Dwr,File:()=>Pwr,FlowProducer:()=>mwr,FormData:()=>Iwr,GoogleAuth:()=>rwr,HTTPException:()=>Twr,Headers:()=>Awr,Hippocampus:()=>iwr,HippocampusConfig:()=>awr,Hono:()=>vwr,ImageFormat:()=>DE,InvokeEndpointCommand:()=>ewr,InvokeEndpointWithResponseStreamCommand:()=>twr,Job:()=>dwr,ListFoundationModelsCommand:()=>ZSr,MockAgent:()=>$wr,Pool:()=>Nwr,Queue:()=>cwr,QueueScheduler:()=>pwr,Request:()=>Rwr,Response:()=>kwr,SageMakerRuntimeClient:()=>QSr,TextToSpeechClient:()=>owr,VertexAI:()=>nwr,Webhook:()=>swr,Worker:()=>uwr,convertToHtml:()=>xwr,cors:()=>bwr,createClient:()=>lwr,default:()=>XSr,extractRawText:()=>ywr,fetch:()=>Cwr,getGlobalDispatcher:()=>Fwr,interceptors:()=>Bwr,logger:()=>Swr,parseBuffer:()=>fwr,request:()=>zwr,secureHeaders:()=>wwr,selectCover:()=>hwr,setGlobalDispatcher:()=>Uwr,streamSSE:()=>_wr,timeout:()=>Ewr});var LE,Mi,XSr,YSr,ZSr,Nse,Lse,Dse,DE,QSr,ewr,twr,rwr,nwr,owr,swr,iwr,awr,lwr,cwr,uwr,dwr,pwr,mwr,gwr,fwr,hwr,ywr,xwr,vwr,bwr,Twr,Swr,wwr,_wr,Ewr,Cwr,Rwr,kwr,Awr,Iwr,Pwr,Mwr,Owr,Nwr,Lwr,Dwr,Uwr,Fwr,$wr,Bwr,zwr,Lq=E(()=>{LE={get(r,e){return e==="__esModule"?!0:e==="default"?new Proxy({},{get:LE.get}):new Proxy(function(...t){return new Proxy({},{get:LE.get})},{get:LE.get,apply(t,n,o){return new Proxy({},{get:LE.get})},construct(t,n){return new Proxy({},{get:LE.get})}})}},Mi=new Proxy({},LE),XSr=Mi,{BedrockClient:YSr,ListFoundationModelsCommand:ZSr,BedrockRuntimeClient:Nse,ConverseCommand:Lse,ConverseStreamCommand:Dse,ImageFormat:DE}=Mi,{SageMakerRuntimeClient:QSr,InvokeEndpointCommand:ewr,InvokeEndpointWithResponseStreamCommand:twr}=Mi,{GoogleAuth:rwr,VertexAI:nwr,TextToSpeechClient:owr}=Mi,{Webhook:swr}=Mi,{Hippocampus:iwr,HippocampusConfig:awr}=Mi,{createClient:lwr}=Mi,{Queue:cwr,Worker:uwr,Job:dwr,QueueScheduler:pwr,FlowProducer:mwr}=Mi,{Cron:gwr}=Mi,{parseBuffer:fwr,selectCover:hwr}=Mi,{extractRawText:ywr,convertToHtml:xwr}=Mi,{Hono:vwr}=Mi,{cors:bwr,HTTPException:Twr,logger:Swr,secureHeaders:wwr,streamSSE:_wr,timeout:Ewr}=Mi,Cwr=globalThis.fetch,Rwr=globalThis.Request,kwr=globalThis.Response,Awr=globalThis.Headers,Iwr=globalThis.FormData,Pwr=globalThis.File,Mwr=globalThis.Blob,Owr=Mi.Agent,Nwr=Mi.Pool,Lwr=Mi.Client,Dwr=Mi.Dispatcher,Uwr=()=>{},Fwr=()=>Mi,$wr=Mi.MockAgent,Bwr={redirect:()=>r=>r,retry:()=>r=>r},zwr=async(r,e)=>{let t=await globalThis.fetch(r,e);return{statusCode:t.status,headers:Object.fromEntries(t.headers.entries()),body:{text:()=>t.text(),json:()=>t.json(),arrayBuffer:()=>t.arrayBuffer()}}}});function Gwr(r){if(/^(us|ca)-/.test(r))return"us";if(/^(eu|il|me|af)-/.test(r))return"eu";if(/^ap-northeast-[13]$/.test(r))return"jp";if(/^ap-southeast-[246]$/.test(r))return"au";if(/^ap-/.test(r))return"apac"}function qwr(r){return/^(us|eu|au|jp|apac|global)\./.test(r)}function ZBe(r){if(typeof r!="object"||r===null)return!1;let e=r,t=typeof e.name=="string"?e.name:"",n=typeof e.message=="string"?e.message:"";return!/ValidationException/i.test(t)&&!/ValidationException/i.test(n)?!1:/inference profile/i.test(n)&&/on-demand throughput/i.test(n)}function Vwr(r,e){if(r.startsWith("arn:")||qwr(r))return[];let t=[],n=Gwr(e);return n&&t.push(`${n}.${r}`),t.push(`${jwr}.${r}`),t}function eze(r,e){return`${r}::${e}`}function Hwr(r,e){return QBe.get(eze(e,r))}function Kwr(r,e,t){QBe.set(eze(e,r),t),g.debug("[Bedrock] Cached inference-profile resolution for subsequent calls",{region:e})}async function Use(r,e,t){let n=Hwr(r,e);if(n&&n!==r)return t(n);try{return await t(r)}catch(o){if(!ZBe(o))throw o;let s=Vwr(r,e);if(s.length===0)throw o;g.warn("[Bedrock] Model requires a cross-region inference profile in this region; retrying with a prefixed id",{region:e,candidates:s.length});for(let i of s)try{let a=await t(i);return Kwr(r,e,i),a}catch(a){if(!ZBe(a))throw a}throw o}}var jwr,QBe,tze=E(()=>{"use strict";Y();jwr="global";QBe=new Map});function Dq(){return`tool_${Date.now()}_${Math.random().toString(36).substring(2,11)}`}function nze(r,e){if(r){if(r.toolUse&&r._inputBuffer){try{r.toolUse.input=JSON.parse(r._inputBuffer)}catch{r.toolUse.input={}}delete r._inputBuffer}e&&!r.toolUse&&(r.text=e)}}function oze(r){return r.filter(e=>e.toolUse).map(e=>({id:e.toolUse?.toolUseId??Dq(),name:e.toolUse?.name??"",args:e.toolUse?.input??{}}))}async function Wwr(r,e,t){let n=[],o=new Map,s=new Map,i=h=>{let y=o.get(h);return y||(y={},o.set(h,y),n.push(y)),y},a="",l,c=0,u=0,p=0,m=0;if(r.stream)for await(let h of r.stream){if(t.aborted)break;let y=h;if(y.contentBlockStart&&i(y.contentBlockStart.contentBlockIndex??0),y.contentBlockDelta?.delta?.text){let x=y.contentBlockDelta.contentBlockIndex??0,b=y.contentBlockDelta.delta.text;i(x),a+=b,s.set(x,(s.get(x)??"")+b),e.push({content:b})}if(y.contentBlockStart?.start?.toolUse){let x=i(y.contentBlockStart.contentBlockIndex??0);x.toolUse={name:y.contentBlockStart.start.toolUse.name??"",input:{},toolUseId:y.contentBlockStart.start.toolUse.toolUseId??Dq()}}if(y.contentBlockDelta?.delta?.toolUse){let x=i(y.contentBlockDelta.contentBlockIndex??0);x.toolUse??={name:"",input:{},toolUseId:Dq()};let b=y.contentBlockDelta.delta.toolUse.input;typeof b=="string"?x._inputBuffer=(x._inputBuffer??"")+b:typeof b=="object"&&b!==null&&!Array.isArray(b)&&(x.toolUse.input={...x.toolUse.input??{},...b})}if(y.contentBlockStop){let x=y.contentBlockStop.contentBlockIndex??0;nze(o.get(x),s.get(x)??"")}if(y.messageStop){l=y.messageStop.stopReason??"end_turn";continue}if(y.metadata?.usage){c+=y.metadata.usage.inputTokens??0,u+=y.metadata.usage.outputTokens??0,p+=y.metadata.usage.cacheReadInputTokens??0,m+=y.metadata.usage.cacheWriteInputTokens??0;break}}for(let[h,y]of o)nze(y,s.get(h)??"");let f=n.filter(h=>h.text||h.toolUse||h.image||h.document);return{text:a,toolCalls:oze(f),usage:{inputTokens:c,outputTokens:u,cacheReadTokens:p,cacheWriteTokens:m},rawStopReason:l,raw:f}}function Jwr(r){let e=[],t="";for(let n of r.output?.message?.content??[]){let o={};"text"in n&&n.text&&(o.text=n.text,t+=t?` ${n.text}`:n.text),"toolUse"in n&&n.toolUse&&(o.toolUse={toolUseId:n.toolUse.toolUseId??Dq(),name:n.toolUse.name??"",input:n.toolUse.input??{}}),e.push(o)}return{text:t,toolCalls:oze(e),usage:{inputTokens:r.usage?.inputTokens??0,outputTokens:r.usage?.outputTokens??0,cacheReadTokens:r.usage?.cacheReadInputTokens??0,cacheWriteTokens:r.usage?.cacheWriteInputTokens??0},rawStopReason:r.stopReason,raw:e}}function Fse(r){return{providerLabel:"bedrock",maxSteps:r.maxSteps,buildStepRequest(e,t){return{raw:r.buildCommandInput(e,t)}},async executeStep(e,t,n){let o=e.raw;if(!r.streaming){let i=await Use(o.modelId??"",r.region,a=>ze(r.client.send(new Lse({...o,modelId:a})),rze,new Error("Bedrock API call timed out")));if(!i.output?.message)throw new Error("Invalid response structure from Bedrock API");return Jwr(i)}let s=await Use(o.modelId??"",r.region,i=>ze(r.client.send(new Dse({...o,modelId:i})),rze,new Error("Bedrock streaming API call timed out")));return Wwr(s,t,n)},buildToolResultMessages(e,t,n){let o={role:"assistant",content:t.raw},s={role:"user",content:n.map(i=>({toolResult:{toolUseId:i.id,content:[{text:i.error?`Error executing tool ${i.name}: ${i.error}`:String(typeof i.output=="string"?i.output:JSON.stringify(i.output))}],status:i.error?"error":"success"}}))};return[...e,o,s]},mapFinishReason(e,t){switch(e){case"end_turn":case"stop_sequence":return"stop";case"max_tokens":return"length";case"tool_use":return"tool-calls";default:return t?"tool-calls":"stop"}}}}var rze,sze=E(()=>{"use strict";Lq();St();tze();rze=12e4});function $se(r,e,t){return{input:{text:r.input?.text||"",images:r.input?.images,content:r.input?.content,files:r.input?.files,csvFiles:r.input?.csvFiles,pdfFiles:r.input?.pdfFiles,audioFiles:r.input?.audioFiles,videoFiles:r.input?.videoFiles},csvOptions:r.csvOptions,pdfOptions:r.pdfOptions,systemPrompt:r.systemPrompt,conversationHistory:r.conversationMessages,provider:e,model:t,temperature:r.temperature,maxTokens:r.maxTokens,enableAnalytics:r.enableAnalytics,enableEvaluation:r.enableEvaluation,context:r.context,fileRegistry:r.fileRegistry}}var ize=E(()=>{"use strict"});var Uq,Bse=E(()=>{"use strict";ac();Uq=Me.provider});var aze={};ue(aze,{Agent:()=>U_r,BedrockClient:()=>Ywr,BedrockRuntimeClient:()=>Qwr,Blob:()=>D_r,Client:()=>$_r,ConverseCommand:()=>e_r,ConverseStreamCommand:()=>t_r,Cron:()=>x_r,Dispatcher:()=>B_r,File:()=>L_r,FlowProducer:()=>y_r,FormData:()=>N_r,GoogleAuth:()=>i_r,HTTPException:()=>E_r,Headers:()=>O_r,Hippocampus:()=>u_r,HippocampusConfig:()=>d_r,Hono:()=>w_r,ImageFormat:()=>r_r,InvokeEndpointCommand:()=>o_r,InvokeEndpointWithResponseStreamCommand:()=>s_r,Job:()=>f_r,ListFoundationModelsCommand:()=>Zwr,MockAgent:()=>G_r,Pool:()=>F_r,Queue:()=>m_r,QueueScheduler:()=>h_r,Request:()=>P_r,Response:()=>M_r,SageMakerRuntimeClient:()=>n_r,TextToSpeechClient:()=>l_r,VertexAI:()=>a_r,Webhook:()=>c_r,Worker:()=>g_r,convertToHtml:()=>S_r,cors:()=>__r,createClient:()=>p_r,default:()=>Xwr,extractRawText:()=>T_r,fetch:()=>I_r,getGlobalDispatcher:()=>j_r,interceptors:()=>q_r,logger:()=>C_r,parseBuffer:()=>v_r,request:()=>V_r,secureHeaders:()=>R_r,selectCover:()=>b_r,setGlobalDispatcher:()=>z_r,streamSSE:()=>k_r,timeout:()=>A_r});var UE,Oi,Xwr,Ywr,Zwr,Qwr,e_r,t_r,r_r,n_r,o_r,s_r,i_r,a_r,l_r,c_r,u_r,d_r,p_r,m_r,g_r,f_r,h_r,y_r,x_r,v_r,b_r,T_r,S_r,w_r,__r,E_r,C_r,R_r,k_r,A_r,I_r,P_r,M_r,O_r,N_r,L_r,D_r,U_r,F_r,$_r,B_r,z_r,j_r,G_r,q_r,V_r,lze=E(()=>{UE={get(r,e){return e==="__esModule"?!0:e==="default"?new Proxy({},{get:UE.get}):new Proxy(function(...t){return new Proxy({},{get:UE.get})},{get:UE.get,apply(t,n,o){return new Proxy({},{get:UE.get})},construct(t,n){return new Proxy({},{get:UE.get})}})}},Oi=new Proxy({},UE),Xwr=Oi,{BedrockClient:Ywr,ListFoundationModelsCommand:Zwr,BedrockRuntimeClient:Qwr,ConverseCommand:e_r,ConverseStreamCommand:t_r,ImageFormat:r_r}=Oi,{SageMakerRuntimeClient:n_r,InvokeEndpointCommand:o_r,InvokeEndpointWithResponseStreamCommand:s_r}=Oi,{GoogleAuth:i_r,VertexAI:a_r,TextToSpeechClient:l_r}=Oi,{Webhook:c_r}=Oi,{Hippocampus:u_r,HippocampusConfig:d_r}=Oi,{createClient:p_r}=Oi,{Queue:m_r,Worker:g_r,Job:f_r,QueueScheduler:h_r,FlowProducer:y_r}=Oi,{Cron:x_r}=Oi,{parseBuffer:v_r,selectCover:b_r}=Oi,{extractRawText:T_r,convertToHtml:S_r}=Oi,{Hono:w_r}=Oi,{cors:__r,HTTPException:E_r,logger:C_r,secureHeaders:R_r,streamSSE:k_r,timeout:A_r}=Oi,I_r=globalThis.fetch,P_r=globalThis.Request,M_r=globalThis.Response,O_r=globalThis.Headers,N_r=globalThis.FormData,L_r=globalThis.File,D_r=globalThis.Blob,U_r=Oi.Agent,F_r=Oi.Pool,$_r=Oi.Client,B_r=Oi.Dispatcher,z_r=()=>{},j_r=()=>Oi,G_r=Oi.MockAgent,q_r={redirect:()=>r=>r,retry:()=>r=>r},V_r=async(r,e)=>{let t=await globalThis.fetch(r,e);return{statusCode:t.status,headers:Object.fromEntries(t.headers.entries()),body:{text:()=>t.text(),json:()=>t.json(),arrayBuffer:()=>t.arrayBuffer()}}}});async function Fq(){return await Promise.resolve().then(()=>(lze(),aze))}var zse=E(()=>{"use strict"});var jse,cze=E(()=>{"use strict";Lq();Qr();Vw();eu();Xo();eG();sze();Dt();ea();St();Y();cg();qI();ize();Ea();gr();Bse();zse();jse=class r extends no{bedrockClient;conversationHistory=[];region;static extractRegionFromArn(e){return e?e.match(/^arn:aws[a-z0-9-]*:bedrock:([^:]+):/)?.[1]??null:null}constructor(e,t,n,o){super(e,"bedrock",t);let s=e||process.env.BEDROCK_MODEL||this.modelName,i=r.extractRegionFromArn(s);this.region=o?.region||n||i||process.env.AWS_REGION||"us-east-1",g.debug("[AmazonBedrockProvider] Starting constructor with extensive logging for debugging"),g.debug(`[AmazonBedrockProvider] Environment check: AWS_REGION=${process.env.AWS_REGION||"undefined"}, AWS_ACCESS_KEY_ID=${process.env.AWS_ACCESS_KEY_ID?"SET":"undefined"}, AWS_SECRET_ACCESS_KEY=${process.env.AWS_SECRET_ACCESS_KEY?"SET":"undefined"}`);try{g.debug("[AmazonBedrockProvider] Creating BedrockRuntimeClient with clean configuration"),this.bedrockClient=new Nse({region:this.region,...o?.accessKeyId&&o?.secretAccessKey?{credentials:{accessKeyId:o.accessKeyId,secretAccessKey:o.secretAccessKey,...o.sessionToken?{sessionToken:o.sessionToken}:{}}}:{}}),g.debug(`[AmazonBedrockProvider] Successfully created BedrockRuntimeClient with model: ${this.modelName}, region: ${this.region}`)}catch(a){throw g.error("[AmazonBedrockProvider] CRITICAL: Failed to initialize BedrockRuntimeClient:",a),a}}async performInitialHealthCheck(){let{BedrockClient:e,ListFoundationModelsCommand:t}=await Fq(),n=new e({region:this.region});try{g.debug("[AmazonBedrockProvider] Starting initial health check to validate credentials and connectivity");let o=new t({}),s=Date.now();await n.send(o);let i=Date.now()-s;g.debug(`[AmazonBedrockProvider] Health check PASSED - credentials valid, connectivity good, responseTime: ${i}ms`)}catch(o){let s=o instanceof Error?o.message:String(o);g.error("[AmazonBedrockProvider] Health check FAILED - this will cause production failures:",{error:s,errorType:o instanceof Error?o.constructor.name:"Unknown",region:process.env.AWS_REGION||"us-east-1",hasAccessKey:!!process.env.AWS_ACCESS_KEY_ID,hasSecretKey:!!process.env.AWS_SECRET_ACCESS_KEY})}finally{try{n.destroy()}catch{}}}getAISDKModel(){throw new Error("AmazonBedrockProvider does not use AI SDK models")}getProviderName(){return"bedrock"}getDefaultModel(){return process.env.BEDROCK_MODEL||"anthropic.claude-sonnet-4-6"}getDefaultEmbeddingModel(){return process.env.BEDROCK_EMBEDDING_MODEL||process.env.AWS_EMBEDDING_MODEL||"amazon.titan-embed-text-v2:0"}async generate(e){g.debug("[AmazonBedrockProvider] generate() called with conversation management");let t=Date.now(),n=typeof e=="string"?{prompt:e}:e;this.conversationHistory=[];let o=n.input;if(!!(o?.images?.length||o?.content?.length||o?.files?.length||o?.csvFiles?.length||o?.pdfFiles?.length)){g.debug("[AmazonBedrockProvider] Detected multimodal input in generate(), using multimodal message builder",{hasImages:!!o?.images?.length,imageCount:o?.images?.length||0,hasContent:!!o?.content?.length,contentCount:o?.content?.length||0,hasFiles:!!o?.files?.length,fileCount:o?.files?.length||0,hasCSVFiles:!!o?.csvFiles?.length,csvFileCount:o?.csvFiles?.length||0,hasPDFFiles:!!o?.pdfFiles?.length,pdfFileCount:o?.pdfFiles?.length||0});let m=$se(n,this.providerName,this.modelName),f=await T_(m,this.providerName,this.modelName);this.conversationHistory=this.convertToBedrockMessages(f)}else{g.debug("[AmazonBedrockProvider] Text-only input in generate(), using simple message builder");let p={role:"user",content:[{text:n.prompt}]};this.conversationHistory.push(p)}g.debug(`[AmazonBedrockProvider] Starting conversation with ${this.conversationHistory.length} message(s)`);let i,a,l,c;try{({text:i,usage:a,finishReason:l,rawFinishReason:c}=await this.conversationLoop(n))}catch(p){let m=this.neurolink?.getEventEmitter();throw m&&m.emit("generation:end",{provider:this.providerName,responseTime:Date.now()-t,timestamp:Date.now(),result:{content:"",usage:{input:0,output:0,total:0},model:this.modelName||this.getDefaultModel(),provider:this.providerName,finishReason:"error"},success:!1,error:p instanceof Error?p.message:String(p)}),p}let u=this.neurolink?.getEventEmitter();return u&&u.emit("generation:end",{provider:this.providerName,responseTime:Date.now()-t,timestamp:Date.now(),result:{content:i,usage:a,model:this.modelName||this.getDefaultModel(),provider:this.providerName,finishReason:l},success:!0}),{content:i,usage:a,model:this.modelName||this.getDefaultModel(),provider:this.getProviderName(),...l!==void 0&&{finishReason:l},...c!==void 0&&{rawFinishReason:c}}}async conversationLoop(e){let t=e.maxSteps||Jo,n=await this.resolveTurnTools(e.tools,e.disableTools),o=this.formatToolsForBedrock(n),s=_a(this.providerName,this.modelName||this.getDefaultModel(),{temperature:e.temperature??.7},"bedrock.converse"),i=Fse({client:this.bedrockClient,streaming:!1,region:this.region,maxSteps:t,buildCommandInput:a=>({modelId:this.modelName||this.getDefaultModel(),messages:this.convertToAWSMessages(a),system:[{text:e.systemPrompt||"You are a helpful assistant with access to external tools. Use tools when necessary to provide accurate information."}],inferenceConfig:{maxTokens:e.maxTokens,...s.temperature!==void 0&&{temperature:s.temperature}},...o?{toolConfig:o}:{}})});try{let{resultPromise:a}=ty(i,this.conversationHistory,{tools:this.toEngineTools(n),abortSignal:e.abortSignal}),l=await a;this.conversationHistory=l.conversation;let c=l.usage.inputTokens,u=l.usage.outputTokens,p=l.usage.cacheReadTokens??0,m=l.usage.cacheWriteTokens??0;return{text:l.text||"",usage:{input:c,output:u,total:c+p+m+u,...p>0&&{cacheReadTokens:p},...m>0&&{cacheCreationTokens:m}},finishReason:l.finishReason,rawFinishReason:l.rawStopReason}}catch(a){throw g.error("[AmazonBedrockProvider] Error in conversation loop:",a),this.handleProviderError(a)}}convertToAWSMessages(e){return e.map(t=>({role:t.role,content:t.content.map(n=>n.text?{text:n.text}:n.image?{image:n.image}:n.document?{document:n.document}:n.toolUse?{toolUse:{toolUseId:n.toolUse.toolUseId,name:n.toolUse.name,input:n.toolUse.input}}:n.toolResult?{toolResult:{toolUseId:n.toolResult.toolUseId,content:n.toolResult.content,status:n.toolResult.status}}:{text:""})}))}async executeSingleTool(e,t,n,o){return Uq.startActiveSpan("bedrock.tool.execute",{kind:br.CLIENT,attributes:{"gen_ai.tool.name":t,"gen_ai.system":"aws.bedrock"}},async s=>{try{if(g.debug(`[AmazonBedrockProvider] Executing single tool: ${t}`,{args:n}),!e[t])throw new Error(`Tool not found: ${t}`);let i=e[t];if(!i||!i.execute)throw new Error(`Tool ${t} does not have execute method`);let a=n||{};t==="list_directory"&&!a.path&&(a.path=".",g.debug("[AmazonBedrockProvider] Added default path '.' for list_directory tool")),g.debug("[AmazonBedrockProvider] Tool input parameters:",a);let l={};for(let[p,m]of Object.entries(a))(m===null||typeof m=="string"||typeof m=="number"||typeof m=="boolean"||typeof m=="object"&&m!==null)&&(l[p]=m);let c=await i.execute(l);g.debug("[AmazonBedrockProvider] Tool execution result:",{toolName:t,result:c});let u;if(c&&typeof c=="object"&&"success"in c)if(c.success&&c.data!==void 0)typeof c.data=="string"?u=c.data:typeof c.data=="object"?u=JSON.stringify(c.data,null,2):u=String(c.data);else if(c.error){let p=typeof c.error=="string"?c.error:c.error.message||"Tool execution failed";throw new Error(p)}else u="";else typeof c=="string"?u=c:typeof c=="object"?u=JSON.stringify(c,null,2):u=String(c);return s.setStatus({code:$e.OK}),u}catch(i){throw g.error("[AmazonBedrockProvider] Tool execution error:",{toolName:t,error:i}),s.setStatus({code:$e.ERROR,message:i.message}),s.recordException(i),i}finally{s.end()}})}async resolveTurnTools(e,t){if(t)return{};let n=e??await this.getAllTools();return this.convertAISDKToolsToToolDefinitions(n)}toEngineTools(e){let t={};for(let n of Object.keys(e))t[n]={execute:o=>this.executeSingleTool(e,n,o)};return t}convertAISDKToolsToToolDefinitions(e){let t={};for(let[n,o]of Object.entries(e))if("description"in o&&o.description){let i=o.parameters??o.inputSchema;t[n]={description:o.description,parameters:i,execute:async a=>{if("execute"in o&&o.execute)return{success:!0,data:await o.execute(a,{toolCallId:`tool_${Date.now()}`,messages:[]})};throw new Error(`Tool ${n} has no execute method`)}}}return t}formatToolsForBedrock(e){if(!e||Object.keys(e).length===0)return null;let t=Object.entries(e).map(([n,o])=>{let s;return o.parameters&&typeof o.parameters=="object"?"_def"in o.parameters?s=xn(o.parameters):s=o.parameters:s={type:"object",properties:{},required:[]},(!s.type||s.type!=="object")&&(s={type:"object",properties:s.properties||{},required:s.required||[]}),{toolSpec:{name:n,description:o.description,inputSchema:{json:s}}}});return g.debug(`[AmazonBedrockProvider] Formatted ${t.length} tools for Bedrock`),{tools:t}}convertToBedrockMessages(e){return e.map(t=>{let n={role:t.role==="system"?"user":t.role,content:[]};return typeof t.content=="string"?n.content.push({text:t.content}):t.content.forEach(o=>{if(o.type==="text"&&o.text)n.content.push({text:o.text});else if(o.type==="image"&&o.image){let s=typeof o.image=="string"?Buffer.from(o.image.replace(/^data:image\/\w+;base64,/,""),"base64"):o.image,i=o.mimeType?.split("/")[1]||"png";i==="jpg"&&(i="jpeg"),n.content.push({image:{format:i==="jpeg"?DE.JPEG:i==="png"?DE.PNG:i==="gif"?DE.GIF:DE.WEBP,source:{bytes:s}}})}else if(o.type==="document"||o.type==="pdf"||o.type==="file"&&o.mimeType?.toLowerCase().startsWith("application/pdf")){let s;if(typeof o.data=="string"){let a=o.data.replace(/^data:application\/pdf;base64,/i,"");s=Buffer.from(a,"base64")}else s=o.data;let i=typeof o.name=="string"&&o.name?Sd.basename(o.name):"document-pdf";i=i.replace(/\.[^.]+$/,""),i=i.replace(/[^a-zA-Z0-9\s\-()[\]]/g,"-"),i=i.replace(/-+/g,"-").trim().replace(/^-+|-+$/g,""),i=i||"document",n.content.push({document:{format:"pdf",name:i,source:{bytes:s}}})}}),n})}getBedrockClient(){return this.bedrockClient}async executeStream(e){return g.debug("[TRACE] executeStream ENTRY - starting streaming attempt"),g.info("[AmazonBedrockProvider] Attempting real streaming with ConverseStreamCommand"),Uq.startActiveSpan("bedrock.stream",{kind:br.CLIENT,attributes:{"gen_ai.system":"aws.bedrock","gen_ai.request.model":this.modelName||this.getDefaultModel(),"gen_ai.operation.name":"stream"}},async t=>{try{if(g.debug("[TRACE] executeStream TRY block - about to call streamingConversationLoop"),this.conversationHistory=[],!!(e.input?.images?.length||e.input?.content?.length||e.input?.files?.length||e.input?.csvFiles?.length||e.input?.pdfFiles?.length)){g.debug("[AmazonBedrockProvider] Detected multimodal input, using multimodal message builder",{hasImages:!!e.input?.images?.length,imageCount:e.input?.images?.length||0,hasContent:!!e.input?.content?.length,contentCount:e.input?.content?.length||0,hasFiles:!!e.input?.files?.length,fileCount:e.input?.files?.length||0,hasCSVFiles:!!e.input?.csvFiles?.length,csvFileCount:e.input?.csvFiles?.length||0,hasPDFFiles:!!e.input?.pdfFiles?.length,pdfFileCount:e.input?.pdfFiles?.length||0});let s=$se(e,this.providerName,this.modelName),i=await T_(s,this.providerName,this.modelName);this.conversationHistory=this.convertToBedrockMessages(i)}else{g.debug("[AmazonBedrockProvider] Text-only input, using simple message builder");let s={role:"user",content:[{text:e.input.text}]};this.conversationHistory.push(s)}g.debug(`[AmazonBedrockProvider] Starting streaming conversation with ${this.conversationHistory.length} message(s)`),g.debug("[TRACE] executeStream - calling streamingConversationLoop NOW");let o=await this.streamingConversationLoop(e,t);return g.debug("[TRACE] executeStream - streamingConversationLoop SUCCESS, returning result"),t.setStatus({code:$e.OK}),t.end(),o}catch(n){g.debug("[TRACE] executeStream CATCH - error caught from streamingConversationLoop");let o=n,s=o?.name==="AccessDeniedException"||o?.name==="UnauthorizedOperation"||o?.message?.includes("bedrock:InvokeModelWithResponseStream")||o?.message?.includes("streaming")||o?.message?.includes("ConverseStream");if(g.debug("[TRACE] executeStream CATCH - checking if permission error"),g.debug(`[TRACE] executeStream CATCH - isPermissionError=${s}`),s){g.debug("[TRACE] executeStream CATCH - PERMISSION ERROR DETECTED, starting fallback"),g.warn(`[AmazonBedrockProvider] Streaming permissions not available, falling back to generate method: ${o.message}`),t.addEvent("stream.fallback_to_generate",{reason:o.message});let i=await this.generate({prompt:e.input.text,input:e.input,maxTokens:e.maxTokens,temperature:e.temperature,systemPrompt:e.systemPrompt});if(!i)throw t.setStatus({code:$e.ERROR,message:"Generate method returned null result"}),t.end(),new Error("Generate method returned null result");t.setAttribute("gen_ai.response.stop_reason","fallback_end_turn"),t.setStatus({code:$e.OK}),t.end();let a=new ReadableStream({start(c){let p=(i.content||"").split(/(\s+)/),m="";for(let f=0;f<p.length;f++)m+=p[f],(f===p.length-1||m.length>50||/[.!?;,]\s*$/.test(m))&&m.length>0&&(c.enqueue({content:m}),m="");m.length>0&&c.enqueue({content:m}),c.close()}});return{stream:{async*[Symbol.asyncIterator](){let c=a.getReader();try{for(;;){let{done:u,value:p}=await c.read();if(u)break;yield p}}finally{c.releaseLock()}}},usage:i.usage,model:this.modelName||this.getDefaultModel(),provider:this.getProviderName(),metadata:{fallback:!0}}}throw t.setStatus({code:$e.ERROR,message:o instanceof Error?o.message:String(o)}),t.recordException(o instanceof Error?o:new Error(String(o))),t.end(),n}})}async streamingConversationLoop(e,t){let n=Date.now(),o=e.maxSteps||Jo,s=await this.resolveTurnTools(e.tools,e.disableTools),i=this.formatToolsForBedrock(s),a=_a(this.providerName,this.modelName||this.getDefaultModel(),{temperature:e.temperature??.7},"bedrock.converseStream"),l=Fse({client:this.bedrockClient,streaming:!0,region:this.region,maxSteps:o,buildCommandInput:P=>({modelId:this.modelName||this.getDefaultModel(),messages:this.convertToAWSMessages(P),system:[{text:e.systemPrompt||"You are a helpful assistant with access to external tools. Use tools when necessary to provide accurate information."}],inferenceConfig:{maxTokens:e.maxTokens,...a.temperature!==void 0&&{temperature:a.temperature}},...i?{toolConfig:i}:{}})}),c=!1,u,p=new Promise(P=>{u=()=>{c=!0,P()}}),m={...l,executeStep:async(P,I,A)=>{let M=await l.executeStep(P,I,A);return u(),M}};t.addEvent("stream.api_call",{"bedrock.tool_count":i?.tools?.length??0});let{stream:f,resultPromise:h}=ty(m,this.conversationHistory,{tools:this.toEngineTools(s),abortSignal:e.abortSignal}),y=h.then(P=>({result:P,error:void 0}),P=>({result:void 0,error:P}));if(await Promise.race([p,y]),!c){let P=await y;if(P.error)throw P.error}let x=this.neurolink?.getEventEmitter(),b=this,T={startTime:n,streamId:`bedrock-${Date.now()}`},w,C=new Promise(P=>{w=P}),R=P=>{let I=P?.inputTokens??0,A=P?.outputTokens??0,M=P?.cacheReadTokens??0,L=P?.cacheWriteTokens??0;return{input:I,output:A,total:I+M+L+A,...M>0&&{cacheReadTokens:M},...L>0&&{cacheCreationTokens:L}}};return y.then(P=>{w(Vp(this.providerName,this.modelName||this.getDefaultModel(),{usage:R(P.result?.usage)},Date.now()-n,{requestId:`bedrock-stream-${Date.now()}`,streamingMode:!0}))}),{stream:{async*[Symbol.asyncIterator](){let P=!1;try{yield*f}catch(I){throw P=!0,I}finally{let I=await y;I.error&&(P=!0);let A=R(I.result?.usage);I.result&&(b.conversationHistory=I.result.conversation,T.finishReason=I.result.finishReason,T.rawFinishReason=I.result.rawStopReason,t.setAttribute("gen_ai.response.stop_reason",I.result.rawStopReason??"unknown")),x&&x.emit("generation:end",{provider:b.providerName,responseTime:Date.now()-n,timestamp:Date.now(),result:{content:"",usage:A,model:b.modelName||b.getDefaultModel(),provider:b.providerName,finishReason:P?"error":I.result?.rawStopReason},success:!P})}}},model:this.modelName||this.getDefaultModel(),provider:this.getProviderName(),analytics:C,metadata:T}}async checkBedrockHealth(){let e=new AbortController,t=setTimeout(()=>e.abort(),1e4),{BedrockClient:n,ListFoundationModelsCommand:o}=await Fq(),s=new n({region:process.env.AWS_REGION||"us-east-1"});try{g.debug("[AmazonBedrockProvider] Starting health check...");let i=new o({}),l=(await s.send(i,{abortSignal:e.signal})).modelSummaries||[],c=l.filter(u=>u.modelLifecycle?.status==="ACTIVE");if(g.debug(`[AmazonBedrockProvider] Health check passed - Found ${c.length} active models out of ${l.length} total models`),c.length===0)throw new Error("No active foundation models available in the region")}catch(i){clearTimeout(t);let a=i;if(wr(i))throw new Error("Bedrock health check timed out after 10 seconds",{cause:i});let l=typeof a.message=="string"?a.message:"";throw l.includes("UnauthorizedOperation")||l.includes("AccessDenied")?new Error("Bedrock access denied. Check your AWS credentials and IAM permissions for bedrock:ListFoundationModels",{cause:i}):a.code==="ECONNREFUSED"||a.code==="ENOTFOUND"?new Error("Unable to connect to Bedrock service. Check your network connectivity and AWS region configuration",{cause:i}):(g.error("[AmazonBedrockProvider] Health check failed:",i),new Error(`Bedrock health check failed: ${l||"Unknown error"}`,{cause:i}))}finally{clearTimeout(t);try{s.destroy()}catch{}}}formatProviderError(e){return en(e,[{match:n=>/AccessDeniedException/i.test(n.message),errorClass:Mt,message:"AWS Bedrock access denied. Check your credentials and permissions."},{match:n=>n.errorName==="ThrottlingException"||n.errorCode==="ThrottlingException",errorClass:qr,message:n=>`Bedrock rate limit (throttled): ${n.message}`},{match:n=>/ValidationException/i.test(n.message),errorClass:mt,message:n=>`Validation error: ${n.message}`},{match:()=>!0,errorClass:mt,message:n=>`AWS Bedrock error: ${n.message}`}],this.providerName,this.modelName)}async embed(e,t){let n=t||"amazon.titan-embed-text-v2:0";g.debug("Generating embedding",{provider:this.providerName,model:n,textLength:e.length});try{let{InvokeModelCommand:o}=await Promise.resolve().then(()=>(Lq(),YBe)),s=JSON.stringify({inputText:e}),i=new o({modelId:n,contentType:"application/json",accept:"application/json",body:s}),a=await ze(this.bedrockClient.send(i),6e4,new Error("Bedrock embedding API call timed out")),l=JSON.parse(new TextDecoder().decode(a.body));if(!l.embedding||!Array.isArray(l.embedding))throw new Error("Invalid embedding response from Bedrock");return g.debug("Embedding generated successfully",{provider:this.providerName,model:n,embeddingDimension:l.embedding.length}),l.embedding}catch(o){throw g.error("Embedding generation failed",{error:o instanceof Error?o.message:String(o),model:n,textLength:e.length}),this.handleProviderError(o)}}async embedMany(e,t){let n=t||"amazon.titan-embed-text-v2:0";g.debug("Generating batch embeddings",{provider:this.providerName,model:n,count:e.length});try{let o=await Promise.all(e.map(s=>this.embed(s,n)));return g.debug("Batch embeddings generated successfully",{provider:this.providerName,model:n,count:o.length,embeddingDimension:o[0]?.length}),o}catch(o){throw g.error("Batch embedding generation failed",{error:o instanceof Error?o.message:String(o),model:n,count:e.length}),this.handleProviderError(o)}}}});var uze={};ue(uze,{AmazonBedrockProvider:()=>jse,bedrockTracer:()=>Uq,loadBedrockControl:()=>Fq});var dze=E(()=>{"use strict";cze();Bse();zse()});var pze={};ue(pze,{AzureOpenAIProvider:()=>Gse});var Gse,mze=E(()=>{"use strict";Dt();Y();ea();Ko();Hp();hc();Rg();Gse=class extends Fn{azureDeployment;azureApiVersion;azureResourceOrigin;azureDeploymentPathPrefix;useMaxCompletionTokensOverride;constructor(e,t,n,o){let s=o?.apiKey||process.env.AZURE_OPENAI_API_KEY||"",i=process.env.AZURE_OPENAI_ENDPOINT||"",a;if(i)try{a=new URL(i.includes("://")?i:`https://${i}`)}catch{a=void 0}let l=a?.hostname??"",c=a?.pathname&&a.pathname!=="/"?a.pathname.replace(/\/+$/,""):"",u=/\.(openai|cognitiveservices)\.azure\.com$/.test(l),p;u?p="/openai":p=/\/openai(?:\/v\d+)?$/.test(c)?c:`${c}/openai`;let m=a?.origin??"",f=o?.deploymentName||e||process.env.AZURE_OPENAI_MODEL||process.env.AZURE_OPENAI_DEPLOYMENT||process.env.AZURE_OPENAI_DEPLOYMENT_ID||"gpt-4o",h=o?.apiVersion||process.env.AZURE_API_VERSION||"2025-04-01-preview",y=process.env.AZURE_OPENAI_USE_MAX_COMPLETION_TOKENS,x=o?.useMaxCompletionTokens??(y===void 0?void 0:/^(1|true|yes)$/i.test(y));s||an(uye()),m||an(dye()),super("azure",e,t,{baseURL:m,apiKey:s}),this.azureDeployment=f,this.azureApiVersion=h,this.azureResourceOrigin=m,this.azureDeploymentPathPrefix=p,this.useMaxCompletionTokensOverride=x,g.shouldLog("debug")&&g.debug("Azure OpenAI Provider initialized",qB({deployment:this.azureDeployment,resourceOrigin:this.azureResourceOrigin,deploymentPathPrefix:this.azureDeploymentPathPrefix,apiVersion:this.azureApiVersion,provider:"azure"}))}suppressResponseFormatWithTools(){return!1}getProviderName(){return"azure"}getDefaultModel(){return this.azureDeployment}formatProviderError(e){let t=[{match:n=>/401/.test(n.message),errorClass:Mt,message:"Invalid Azure OpenAI API key or endpoint."},...tn];return en(e,t,"azure",this.modelName)}getChatCompletionsURL(e){let t=e||this.azureDeployment,n=this.azureDeploymentPathPrefix.replace(/\/+$/,"");return`${this.azureResourceOrigin}${n}/deployments/${t}/chat/completions?api-version=${this.azureApiVersion}`}getAuthHeaders(){return{"api-key":this.config.apiKey}}adjustRequestBody(e,t){let n=this.useMaxCompletionTokensOverride??A1e(t);return e.max_tokens!==void 0&&n?{...e,max_completion_tokens:e.max_tokens,max_tokens:void 0}:e}}});function gze(r){return r.length>=8&&r[0]===137&&r[1]===80&&r[2]===78&&r[3]===71?"image/png":r.length>=3&&r[0]===255&&r[1]===216&&r[2]===255?"image/jpeg":r.length>=12&&r[0]===82&&r[1]===73&&r[2]===70&&r[3]===70&&r[8]===87&&r[9]===69&&r[10]===66&&r[11]===80?"image/webp":r.length>=6&&r[0]===71&&r[1]===73&&r[2]===70?"image/gif":"image/png"}var fze=E(()=>{"use strict"});function qse(r){return r.map(e=>typeof e.content=="string"?{role:e.role,content:e.content}:{role:e.role,content:e.content.map(t=>t.type==="image"||t.type==="document"?{type:t.type,media_type:t.source.media_type,base64_chars:t.source.data.length}:t)})}var hze=E(()=>{"use strict"});var $q,yze=E(()=>{$q=r=>{if(typeof globalThis.process<"u")return globalThis.process.env?.[r]?.trim()||void 0;if(typeof globalThis.Deno<"u")return globalThis.Deno.env?.get?.(r)?.trim()||void 0}});var xze=E(()=>{go()});function Bq(r){return r!=null&&typeof r=="object"&&!Array.isArray(r)}var Vse,Hse,Kse=E(()=>{xze();Vse=r=>(Vse=Array.isArray,Vse(r)),Hse=Vse});function*H_r(r){if(!r)return;if(vze in r){let{values:n,nulls:o}=r;yield*n.entries();for(let s of o)yield[s,null];return}let e=!1,t;r instanceof Headers?t=r.entries():Hse(r)?t=r:(e=!0,t=Object.entries(r??{}));for(let n of t){let o=n[0];if(typeof o!="string")throw new TypeError("expected header name to be a string");let s=Hse(n[1])?n[1]:[n[1]],i=!1;for(let a of s)a!==void 0&&(e&&!i&&(i=!0,yield[o,null]),yield[o,a])}}var vze,bze,Tze=E(()=>{Kse();vze=Symbol.for("brand.privateNullableHeaders");bze=r=>{let e=new Headers,t=new Set;for(let n of r){let o=new Set;for(let[s,i]of H_r(n)){let a=s.toLowerCase();o.has(a)||(e.delete(s),o.add(a)),i===null?(e.delete(s),t.add(a)):(e.append(s,i),t.delete(a))}}return{[vze]:!0,values:e,nulls:t}}});function J_r(r){let e=new um(r);return delete e.batches,e}function X_r(r){let e=new ti(r);return delete e.messages.batches,e}var K_r,W_r,zq,Wse=E(()=>{cM();use();P_();yze();Kse();Tze();cM();K_r="vertex-2023-10-16",W_r=new Set(["/v1/messages","/v1/messages?beta=true"]),zq=class extends Wn{constructor({baseURL:e=$q("ANTHROPIC_VERTEX_BASE_URL"),region:t=$q("CLOUD_ML_REGION")??null,projectId:n=$q("ANTHROPIC_VERTEX_PROJECT_ID")??null,...o}={}){if(!t)throw new Error("No region was given. The client should be instantiated with the `region` option or the `CLOUD_ML_REGION` environment variable should be set.");if(!e)switch(t){case"global":e="https://aiplatform.googleapis.com/v1";break;case"us":e="https://aiplatform.us.rep.googleapis.com/v1";break;case"eu":e="https://aiplatform.eu.rep.googleapis.com/v1";break;default:e=`https://${t}-aiplatform.googleapis.com/v1`}if(super({baseURL:e,...o}),this.messages=J_r(this),this.beta=X_r(this),this.region=t,this.projectId=n,this.accessToken=o.accessToken??null,o.authClient&&o.googleAuth)throw new Error("You cannot provide both `authClient` and `googleAuth`. Please provide only one of them.");o.authClient?this._authClientPromise=Promise.resolve(o.authClient):(this._auth=o.googleAuth??new iP({scopes:"https://www.googleapis.com/auth/cloud-platform"}),this._authClientPromise=this._auth.getClient())}validateHeaders(){}async prepareOptions(e){let t=await this._authClientPromise,n=await t.getRequestHeaders(),o=t.projectId??n["x-goog-user-project"];!this.projectId&&o&&(this.projectId=o),e.headers=bze([n,e.headers])}async buildRequest(e){if(Bq(e.body)&&(e.body={...e.body}),Bq(e.body)&&(e.body.anthropic_version||(e.body.anthropic_version=K_r)),W_r.has(e.path)&&e.method==="post"){if(!this.projectId)throw new Error("No projectId was given and it could not be resolved from credentials. The client should be instantiated with the `projectId` option or the `ANTHROPIC_VERTEX_PROJECT_ID` environment variable should be set.");if(!Bq(e.body))throw new Error("Expected request body to be an object for post /v1/messages");let t=e.body.model;e.body.model=void 0;let o=e.body.stream??!1?"streamRawPredict":"rawPredict";e.path=`/projects/${this.projectId}/locations/${this.region}/publishers/anthropic/models/${t}:${o}`}if(e.path==="/v1/messages/count_tokens"||e.path=="/v1/messages/count_tokens?beta=true"&&e.method==="post"){if(!this.projectId)throw new Error("No projectId was given and it could not be resolved from credentials. The client should be instantiated with the `projectId` option or the `ANTHROPIC_VERTEX_PROJECT_ID` environment variable should be set.");e.path=`/projects/${this.projectId}/locations/${this.region}/publishers/anthropic/models/count-tokens:rawPredict`}return super.buildRequest(e)}}});var Jse={};ue(Jse,{AnthropicVertex:()=>zq,BaseAnthropic:()=>Wn,default:()=>zq});var Xse=E(()=>{Wse();Wse()});async function Y_r(){return Yse||(Yse=await Promise.resolve().then(()=>(Xse(),Jse))),Yse}function Q_r(r){let e=[],t=new Map,n=0,o=s=>{let i=`${n}:${s??"x"}`,a=t.get(i);return a||(a={type:"tool_step",callParts:[],resultParts:[]},t.set(i,a),e.push(a)),a};for(let s of r){if(s.role==="tool_call"){o(s.metadata?.stepIndex).callParts.push({name:s.tool||"unknown",input:s.args||{}});continue}if(s.role==="tool_result"){o(s.metadata?.stepIndex).resultParts.push(s.content&&s.content.length>0?s.content:"(no output)");continue}let i=s.role==="assistant"?"assistant":s.role==="user"?"user":null;!i||!s.content||s.content.trim().length===0||(n++,e.push({type:"regular",role:i,parts:[s.content]}))}return e}function Zse(r,e,t){let n=r[r.length-1];n&&n.role===e&&Array.isArray(n.content)?n.content.push(...t):r.push({role:e,content:[...t]})}function eEr(r,e){let t=r.callParts,n=r.resultParts,o=Math.min(t.length,n.length);(o!==t.length||o!==n.length)&&g.debug("[GoogleVertex] Unbalanced tool step in Claude history replay",{calls:t.length,results:n.length,paired:o});let s=[],i=[];for(let a=0;a<o;a++){let l=`hist_${e}_${a}`;s.push({type:"tool_use",id:l,name:t[a].name,input:t[a].input}),i.push({type:"tool_result",tool_use_id:l,content:n[a]})}return{uses:s,results:i}}function tEr(r){let e=t=>Array.isArray(t.content)&&t.content.length>0&&t.content.every(n=>n.type==="tool_result");for(;r.length>0&&(r[0].role!=="user"||e(r[0]));)r.shift()}function eie(r){let e=[],t=0;for(let n of Q_r(r)){if(n.type==="regular"){Zse(e,n.role==="assistant"?"assistant":"user",[{type:"text",text:String(n.parts[0]??"")}]);continue}let{uses:o,results:s}=eEr(n,t);o.length!==0&&(t++,Zse(e,"assistant",o),Zse(e,"user",s))}if(tEr(e),g.shouldLog("debug")){let n=e.flatMap(o=>Array.isArray(o.content)?o.content:[]);g.debug("[GoogleVertex] Replayed Claude history with tool turns",{historyMessages:e.length,toolUseBlocks:n.filter(o=>o.type==="tool_use").length,toolResultBlocks:n.filter(o=>o.type==="tool_result").length})}return e}function tie(r,e){let t=r[r.length-1];if(t&&t.role==="user"){let n=Array.isArray(t.content)?t.content:[{type:"text",text:t.content}],o=Array.isArray(e)?e:[{type:"text",text:e}];t.content=[...n,...o];return}r.push({role:"user",content:e})}function my(r){if(!r||typeof r!="object")return;let e=["additionalProperties","default","$schema","$id","$ref","definitions","$defs","examples","errorMessage"];for(let n of e)n in r&&delete r[n];typeof r.exclusiveMinimum=="boolean"&&(r.exclusiveMinimum===!0&&typeof r.minimum=="number"?(r.exclusiveMinimum=r.minimum,delete r.minimum):delete r.exclusiveMinimum),typeof r.exclusiveMaximum=="boolean"&&(r.exclusiveMaximum===!0&&typeof r.maximum=="number"?(r.exclusiveMaximum=r.maximum,delete r.maximum):delete r.exclusiveMaximum);let t=2147483647;if(typeof r.maximum=="number"&&r.maximum>t&&delete r.maximum,typeof r.minimum=="number"&&r.minimum<-t&&delete r.minimum,r.properties&&typeof r.properties=="object")for(let n of Object.values(r.properties))n&&typeof n=="object"&&my(n);if(r.items&&typeof r.items=="object")if(Array.isArray(r.items))for(let n of r.items)n&&typeof n=="object"&&my(n);else my(r.items);for(let n of["allOf","anyOf","oneOf"])if(Array.isArray(r[n]))for(let o of r[n])o&&typeof o=="object"&&my(o)}function Sze(r,e,t){let n=nG({contents:r,availableInputTokens:mi("vertex",e),provider:"vertex",observedPromptTokens:t});if(!n)return!1;let o=new Set(n.drop),s=new Set(n.truncate),i=[];for(let a=0;a<r.length;a++){if(o.has(a))continue;let l=r[a];if(s.has(a)&&Array.isArray(l.parts)){i.push({...l,parts:l.parts.map(c=>{if(!("functionResponse"in c))return c;let u=c.functionResponse,p=JSON.stringify(u.response)??"";return p.length<=oEr?c:{functionResponse:{name:u.name,response:{result:fP(p)}}}})});continue}i.push(l)}if(o.size>0){let a=i.findIndex(l=>Array.isArray(l.parts)&&l.parts.some(c=>!!c.functionCall||!!c.functionResponse));a<0&&(a=Math.min(1,i.length)),i.splice(a,0,{role:"user",parts:[{text:rG}]})}return r.length=0,r.push(...i),!0}function wze(r,e,t){let n=Aq({conversation:r,availableInputTokens:mi("vertex",e),fixedOverheadTokens:0,provider:"vertex",observedPromptTokens:t,observedDescribesCurrentPayload:!0});if(!n)return!1;let o=new Set(n.drop),s=new Set(n.truncate),i=[];for(let a=0;a<r.length;a++){if(o.has(a))continue;let l=r[a];if(s.has(a)&&Array.isArray(l.content)){i.push({...l,content:l.content.map(c=>{if(c.type!=="tool_result")return c;let u=typeof c.content=="string"?c.content:JSON.stringify(c.content)??"";return{...c,content:kq(u)}})});continue}i.push(l)}if(o.size>0){let a=i.findIndex(l=>Array.isArray(l.content)&&l.content.some(c=>c.type==="tool_use"||c.type==="tool_result"));a<0&&(a=Math.min(1,i.length)),i.splice(a,0,{role:"user",content:[{type:"text",text:Rq}]})}return r.length=0,r.push(...i),!0}var Yse,Z_r,rie,jq,Gq,hM,FE,rEr,nEr,Qse,oEr,nie,oie=E(()=>{"use strict";to();Qr();eu();Oz();gP();ote();Xo();Ih();sz();Hr();oo();Dt();ea();St();_se();Kte();qI();Y();Fre();bse();Gj();fze();qj();Ko();Ea();kre();L_();_l();$re();Wv();oG();Fd();mI();ac();gr();Ld();Hp();cI();cg();hze();YI();Yse=null;Z_r=()=>!0;rie=()=>an(GL()),jq=()=>process.env.GOOGLE_CLOUD_LOCATION||process.env.VERTEX_LOCATION||process.env.GOOGLE_VERTEX_LOCATION||"us-central1",Gq=(r,e)=>{let t=e||jq();if(!r)return t;let n=r.toLowerCase();return n.startsWith("gemini-")||n.includes("/gemini-")||_2.some(s=>n===s.toLowerCase()||n.includes(s.toLowerCase())||s.toLowerCase().includes(n))?process.env.GOOGLE_VERTEX_GLOBAL_LOCATION||"global":t},hM=Gq,FE=()=>process.env.VERTEX_MODEL||"gemini-2.5-flash",rEr=()=>!!(process.env.GOOGLE_APPLICATION_CREDENTIALS_NEUROLINK||process.env.GOOGLE_APPLICATION_CREDENTIALS||process.env.GOOGLE_SERVICE_ACCOUNT_KEY||process.env.GOOGLE_AUTH_CLIENT_EMAIL&&process.env.GOOGLE_AUTH_PRIVATE_KEY),nEr=async(r,e)=>{let t=r||jq();return{projectId:rie(),region:t,...e!==void 0&&{timeout:e},maxRetries:0}},Qse=r=>r.toLowerCase().includes("claude"),oEr=2048;nie=class r extends no{projectId;location;expressApiKey;baseURL;registeredTools=new Map;toolContext={};static modelConfigCache=new Map;static modelConfigCacheTime=0;static CACHE_DURATION=300*1e3;static MAX_CACHE_SIZE=50;static maxTokensCache=new Map;static maxTokensCacheTime=0;constructor(e,t,n,o,s){super(e,"vertex",n),s&&(s.projectId&&(process.env.GOOGLE_CLOUD_PROJECT=String(s.projectId)),s.location&&(process.env.GOOGLE_CLOUD_LOCATION=String(s.location)),s.apiKey&&(process.env.GOOGLE_API_KEY=String(s.apiKey),!s.projectId&&!s.location&&(this.expressApiKey=String(s.apiKey))),s.baseURL&&(this.baseURL=String(s.baseURL)));let i=!!this.resolveExpressApiKey();i||rEr()||an(Cye()),this.projectId=s?.projectId||(i?"":rie()),this.location=o||s?.location||jq(),g.debug("[GoogleVertexProvider] Constructor initialized",{regionParam:o,resolvedLocation:this.location,projectId:this.projectId}),g.debug("Google Vertex AI BaseProvider v2 initialized",{modelName:this.modelName,projectId:this.projectId,location:this.location,provider:this.providerName})}getProviderName(){return"vertex"}getDefaultModel(){return FE()}async getAISDKModel(){throw new Oe({code:rt.INVALID_CONFIGURATION,message:"GoogleVertexProvider no longer uses @ai-sdk/google-vertex. All models use native SDKs: @google/genai for Gemini, @anthropic-ai/vertex-sdk for Claude.",category:"configuration",severity:"critical",retriable:!1,context:{provider:this.providerName,model:this.modelName}})}validateStreamOptionsOnly(e){this.validateStreamOptions(e)}async preprocessNativeFileInput(e){if(e.input&&jI(e.input),e.input?.files?.length)try{await GI(e,100*1024*1024,this.providerName)}catch(t){g.warn(`[GoogleVertex] processUnifiedFilesArray threw, continuing without file content: ${t instanceof Error?t.message:String(t)}`)}await Fv(e.input)}async executeStream(e,t){let n=e.model||this.modelName||FE();return KA({name:"neurolink.provider.stream",tracer:Me.provider,attributes:{[Ie.GEN_AI_SYSTEM]:this.providerName,[Ie.GEN_AI_MODEL]:n,[Ie.GEN_AI_OPERATION]:"stream",[Ie.NL_PROVIDER]:this.providerName}},async o=>{let s=Date.now(),i=e.tools||{};await this.preprocessNativeFileInput(e);let l={...await Ye({name:"neurolink.message.build",tracer:Me.provider,attributes:{[Ie.NL_PROVIDER]:this.providerName,"message.count":1,"message.build.count":1,"message.build.path":"vertex.native.stream"}},async()=>this.processCSVFilesForNativeSDK(e)),tools:i};try{let c;Qse(n)?(g.info("[GoogleVertex] Routing Claude model to native @anthropic-ai/vertex-sdk",{model:n,totalToolCount:Object.keys(i).length}),c=await this.executeNativeAnthropicStream(l)):(g.info("[GoogleVertex] Routing Gemini model to native @google/genai",{model:n,totalToolCount:Object.keys(i).length}),c=await this.executeNativeGemini3Stream(l)),this.attachUsageAndCostAttributes(o,n,c?.usage);let u=this.wrapStreamResultWithLifecycle(e,c,s);return this.emitStreamEnd(n,s,!0,void 0,c.finishReason),u}catch(c){throw this.fireGenerateOnError(e,c,s),this.emitStreamEnd(n,s,!1,c),c}},o=>o.stream,(o,s)=>this.preserveStreamResultAccessors(o,{...o,stream:s}))}emitStreamEnd(e,t,n,o,s){let i=this.neurolink?.getEventEmitter();i&&i.emit("stream:end",{provider:this.providerName,responseTime:Date.now()-t,timestamp:Date.now(),result:{content:"",usage:{input:0,output:0,total:0},model:e,provider:this.providerName,finishReason:n?s??"stop":"error"},success:n,...o?{error:o instanceof Error?o.message:String(o)}:{}})}async createVertexGenAIClient(e){let t=this.resolveExpressApiKey(),n=t?"":rie(),o=e||this.location||jq(),i=(await Promise.resolve().then(()=>(_w(),ww))).GoogleGenAI;if(!i)throw new Oe({code:rt.INVALID_CONFIGURATION,message:"@google/genai does not export GoogleGenAI",category:"configuration",severity:"critical",retriable:!1,context:{module:"@google/genai",expectedExport:"GoogleGenAI"}});let a=i,l=this.resolveBaseURL(),c={fetch:xt(),...l?{baseUrl:l}:{}};return t?new a({vertexai:!0,apiKey:t,httpOptions:c}):new a({vertexai:!0,project:n,location:o,httpOptions:c})}resolveBaseURL(){let e=this.baseURL?.trim()||process.env.GOOGLE_VERTEX_BASE_URL?.trim();return e&&e.length>0?e:void 0}resolveExpressApiKey(){let e=this.expressApiKey?.trim();if(e)return e;let t=process.env.GOOGLE_VERTEX_API_KEY?.trim();return t?["GOOGLE_CLOUD_PROJECT_ID","VERTEX_PROJECT_ID","GOOGLE_VERTEX_PROJECT","GOOGLE_CLOUD_PROJECT"].some(o=>(process.env[o]??"").trim().length>0)?void 0:t:void 0}buildGeminiFunctionDeclaration(e,t){let n={name:e,description:t.description||`Tool: ${e}`},s=t.parameters||t.inputSchema;if(s){let i=xn(s,"openApi3"),a=pn(i);a.$schema&&delete a.$schema;let l=pi(a);my(l),n.parametersJsonSchema=l}return n}refreshGeminiToolDeclarations(e,t,n,o){if(!e||!t)return;let s=new Set(t.map(i=>i.name));for(let[i,a]of Object.entries(e))s.has(i)||(t.push(this.buildGeminiFunctionDeclaration(i,a)),a.execute&&n.set(i,a.execute),o.delete(i),g.info(`[GoogleVertex] Tool "${i}" hydrated mid-turn via discovery \u2014 added to Gemini declarations.`))}resolveGeminiToolOnMiss(e,t,n,o,s){if(!n)return;let i=eee(t,e);if(i?.execute)return n.some(a=>a.name===e)||n.push(this.buildGeminiFunctionDeclaration(e,i)),o.set(e,i.execute),s.delete(e),g.info(`[GoogleVertex] Tool "${e}" resolved mid-turn via discovery \u2014 executing.`),o.get(e)}buildAnthropicToolDeclaration(e,t){let n={name:e,description:t.description||`Tool: ${e}`,input_schema:{type:"object"}},s=t.parameters||t.inputSchema;if(s){let i=xn(s),a=pn(i);n.input_schema={type:"object",properties:a.properties||{},required:a.required||[]}}return n}refreshAnthropicToolDeclarations(e,t,n,o){if(!e||!t)return;let s=new Set(t.map(i=>i.name));for(let[i,a]of Object.entries(e))s.has(i)||(t.push(this.buildAnthropicToolDeclaration(i,a)),a.execute&&n.set(i,a.execute),o.delete(i),g.info(`[GoogleVertex] Tool "${i}" hydrated mid-turn via discovery \u2014 added to Anthropic declarations.`))}resolveAnthropicToolOnMiss(e,t,n,o,s){if(!n)return;let i=eee(t,e);if(i?.execute)return n.some(a=>a.name===e)||n.push(this.buildAnthropicToolDeclaration(e,i)),o.set(e,i.execute),s.delete(e),g.info(`[GoogleVertex] Tool "${e}" resolved mid-turn via discovery \u2014 executing.`),o.get(e)}async executeNativeGemini3Stream(e){let t=e.model||this.modelName||FE(),n=hM(t,e.region),o=await this.createVertexGenAIClient(n);g.debug("[GoogleVertex] Using native @google/genai for Gemini 3",{model:t,hasTools:!!e.tools&&Object.keys(e.tools).length>0,project:this.projectId,location:n});let s=[],i=[{text:e.input.text??""}],a=e.input;if(a?.pdfFiles&&a.pdfFiles.length>0){g.debug(`[GoogleVertex] Processing ${a.pdfFiles.length} PDF file(s) for native stream`);for(let fe of a.pdfFiles){let De;typeof fe=="string"?wn.existsSync(fe)?De=wn.readFileSync(fe):De=Buffer.from(fe,"base64"):De=fe;let we=De.toString("base64");i.push({inlineData:{mimeType:"application/pdf",data:we}})}}if(await Zj(i,a?.nativeAudioFiles,"[GoogleVertex]"),a?.images&&a.images.length>0){g.debug(`[GoogleVertex] Processing ${a.images.length} image(s) for native stream`);for(let fe of a.images){let De=i_(fe),we,Je="image/jpeg";if(typeof De=="string")if(wn.existsSync(De)){we=wn.readFileSync(De);let ce=Nv(De);Je=ce.startsWith("image/")?ce:this.detectImageType(we)}else if(De.startsWith("data:")){let ce=De.match(/^data:([^;]+);base64,(.+)$/);if(ce)Je=ce[1],we=Buffer.from(ce[2],"base64");else continue}else if(De.startsWith("http://")||De.startsWith("https://"))try{let ce=await fetch(De);if(!ce.ok){g.warn(`[GoogleVertex] Image fetch failed: ${ce.status} ${ce.statusText}, skipping`,{url:Wr(De)});continue}let qe=await ce.arrayBuffer();we=Buffer.from(qe);let Be=ce.headers.get("content-type");Be&&Be.startsWith("image/")&&(Je=Be.split(";")[0])}catch(ce){g.warn(`[GoogleVertex] Image URL fetch threw, skipping: ${ce instanceof Error?ce.message:String(ce)}`,{url:Wr(De)});continue}else we=Buffer.from(De,"base64"),Je=this.detectImageType(we);else we=De,Je=this.detectImageType(we);let Ge=we.toString("base64");i.push({inlineData:{mimeType:Je,data:Ge}})}}O_(s,e.conversationMessages),s.push({role:"user",parts:i});let l,c=new Qh;if(e.tools&&Object.keys(e.tools).length>0&&!e.disableTools){let fe=Eg(e.tools,"functionDeclarations");l=fe.toolsConfig;for(let[De,we]of fe.executeMap)c.set(De,we);g.debug("[GoogleVertex] Converted tools for native SDK",{toolCount:fe.toolsConfig[0].functionDeclarations.length,toolNames:fe.toolsConfig[0].functionDeclarations.map(De=>De.name)})}let u=e,p=!1;if(u.schema&&l){p=!0;let fe=xn(u.schema,"openApi3"),De=pn(fe);De.$schema&&delete De.$schema;let we=pi(De),Je=l[0]?.functionDeclarations||[];Je.push({name:"final_result",description:"Return the final structured result. You MUST call this tool when you have gathered all information and are ready to provide the final answer. The arguments should contain the structured data matching the expected schema.",parametersJsonSchema:we}),l=[{functionDeclarations:Je}],g.debug("[GoogleVertex] Added final_result tool for structured output with tools (stream)",{schemaKeys:Object.keys(we),totalTools:Je.length})}let m=_a(this.providerName,t,{temperature:e.temperature??1,...e.topP!==void 0&&{topP:e.topP}},"vertex.gemini"),f={...m.temperature!==void 0&&{temperature:m.temperature},maxOutputTokens:e.maxTokens};nP(t)&&(f.maxOutputTokens&&f.maxOutputTokens>Nl&&(g.warn(`[GoogleVertex] Capping maxOutputTokens from ${f.maxOutputTokens} to ${Nl} for ${t}`),f.maxOutputTokens=Nl),f.maxOutputTokens||(f.maxOutputTokens=Nl)),m.topP!==void 0&&(f.topP=m.topP),e.topK!==void 0&&(f.topK=e.topK),e.stopSequences&&e.stopSequences.length>0&&(f.stopSequences=e.stopSequences),l&&(f.tools=l);let h=e.systemPrompt||"";p&&(h=h+`
1130
1130
 
1131
1131
  IMPORTANT: When you have gathered all necessary information and are ready to provide your final answer, you MUST call the 'final_result' tool with the structured data. Do not return the final answer as plain text - always use the final_result tool.`),h&&(f.systemInstruction=h);let y=cP(e.thinkingConfig);if(y&&(f.thinkingConfig=y),(u.output?.format==="json"||u.schema)&&!p&&!l&&(f.responseMimeType="application/json",u.schema)){let fe=xn(u.schema,"openApi3"),De=pn(fe);De.$schema&&delete De.$schema;let we=pi(De);my(we),f.responseSchema=we,g.debug("[GoogleVertex] Added responseSchema for JSON output (stream)",{schemaKeys:Object.keys(we)})}let x=Date.now(),b=e.maxSteps||Jo,T=Number.isFinite(b)&&b>0?Math.min(Math.floor(b),100):Math.min(Jo,100),w=[...s],C="",R,k=[],P=[],I=0,A,M=new Map,L=ey(Ud("vertex",t)),U=!1,D=0,z=0,j=0,B=0,$=[],N=sl(e.timeout)??Ew,J=e.toolTimeoutMs??Cw,ne=e.turnTimeoutMs??N,te=new AbortController,de=()=>te.abort();e.abortSignal?.addEventListener("abort",de);let Ue=mP({turnTimeoutMs:e.turnTimeoutMs,defaultTurnTimeoutMs:N,stallTimeoutMs:e.stallTimeoutMs,wrapupTimeLeadMs:e.wrapupTimeLeadMs,onDeadline:fe=>{g.warn(fe==="timeout"?`[GoogleVertex] Native Gemini turn exceeded its ${ne}ms time budget \u2014 aborting`:`[GoogleVertex] Native Gemini turn made no progress for ${e.stallTimeoutMs}ms \u2014 aborting`),te.abort()}}),W=te.signal;e.abortSignal?.aborted&&te.abort();let ae=!1,X=0,Se=!1,ye=!1;try{for(;I<T;){if(W.aborted){ae=!0;break}if(L.shouldStop())if(Sze(w,t,L.projectedNextPromptTokens))L.resetAfterReclaim();else{U=!0,g.warn(`[GoogleVertex] Gemini turn stopped by the context guard: projected prompt ~${L.projectedNextPromptTokens} tokens >= threshold ${L.thresholdTokens} (step ${I}) \u2014 synthesizing a final answer.`);break}I++,Ue.noteProgress(),this.refreshGeminiToolDeclarations(e.tools,l?.[0]?.functionDeclarations,c,M),g.debug(`[GoogleVertex] Native SDK step ${I}/${T}`);try{let fe=await o.models.generateContentStream({model:t,contents:w,config:{...f,abortSignal:W}}),De=[],we=[],Je,Ge=0,ce=0,qe=0,Be=0;for await(let ee of fe){Ue.noteProgress();let H=ee,Ce=H.candidates?.[0],F=Ce?.finishReason;typeof F=="string"&&F&&(R=F,Je=F);let me=Ce?.content;if(me&&Array.isArray(me.parts))for(let ie of me.parts)we.push(ie),typeof ie.text=="string"&&ie.text.length>0&&$.push(ie.text);ee.functionCalls&&De.push(...ee.functionCalls);let Te=H.usageMetadata;if(Te){if(Te.promptTokenCount!==void 0&&Te.promptTokenCount>0){D+=Te.promptTokenCount-Ge,Ge=Te.promptTokenCount,L.noteUsage(Te.promptTokenCount,Te.candidatesTokenCount??0);let ie=Math.min(Te.cachedContentTokenCount??0,Te.promptTokenCount);j+=ie-qe,qe=ie}Te.candidatesTokenCount!==void 0&&Te.candidatesTokenCount>0&&(z+=Te.candidatesTokenCount-ce,ce=Te.candidatesTokenCount),Te.thoughtsTokenCount!==void 0&&Te.thoughtsTokenCount>0&&(B+=Te.thoughtsTokenCount-Be,Be=Te.thoughtsTokenCount)}}let Ee=we.filter(ee=>typeof ee.text=="string").map(ee=>ee.text).join("");if(De.length===0&&!Ee&&Je==="MALFORMED_FUNCTION_CALL"&&X<1&&!W.aborted){X++,g.warn(`[GoogleVertex] Model returned MALFORMED_FUNCTION_CALL at step ${I}/${T}; retrying once with a corrective note.`),this.emitTurnEvent({phase:"malformed-retry",step:I,maxSteps:T}),we.length>0&&w.push({role:"model",parts:we}),w.push({role:"user",parts:[{text:"Your previous function call was malformed and could not be parsed. Re-issue it as a single valid function call, or answer in plain text."}]});continue}if(De.length===0){C=Ee;break}if(p){let ee=De.find(H=>H.name==="final_result");if(ee){A=ee.args,g.debug("[GoogleVertex] Received final_result tool call with structured output (stream)",{outputKeys:Object.keys(A)}),C=JSON.stringify(A);break}}g.debug(`[GoogleVertex] Executing ${De.length} function calls`),w.push({role:"model",parts:we.length>0?we:De.map(ee=>({functionCall:ee}))});let Xe=[],_=[],V=[];for(let ee of De){if(W.aborted){ae=!0;break}k.push({toolName:ee.name,args:ee.args}),_.push({toolName:ee.name,args:ee.args});let H=M.get(ee.name);if(H&&H.count>=Eo){g.warn(`[GoogleVertex] Tool "${ee.name}" has exceeded retry limit (${Eo}), skipping execution`);let Ce={error:`TOOL_PERMANENTLY_FAILED: The tool "${ee.name}" has failed ${H.count} times and will not be retried. Last error: ${H.lastError}. Please proceed without using this tool or inform the user that this functionality is unavailable.`,status:"permanently_failed",do_not_retry:!0};Xe.push({functionResponse:{name:ee.name,response:Ce}}),P.push({name:ee.name,input:ee.args,output:Ce}),V.push({toolName:ee.name,output:Ce});continue}let he=c.get(ee.name);if(he||(he=this.resolveGeminiToolOnMiss(ee.name,e.tools,l?.[0]?.functionDeclarations,c,M)),he)try{let Ce={toolCallId:`${ee.name}-${Date.now()}`,messages:[],abortSignal:W};Ue.noteProgress();let F=await yt(Th(Promise.resolve(he(ee.args,Ce)),W),J,`Tool "${ee.name}" execution timed out after ${J}ms`);Ue.noteProgress();let me=XI(F);if(me){let Te=M.get(ee.name)||{count:0,lastError:""};Te.count++,Te.lastError=me,M.set(ee.name,Te)}else M.delete(ee.name);P.push({name:ee.name,input:ee.args,output:F}),Xe.push({functionResponse:{name:ee.name,response:{result:F}}}),V.push({toolName:ee.name,output:F})}catch(Ce){if(W.aborted||tu(Ce)){ae=!0;break}Ue.noteProgress(),Ce instanceof na&&this.emitTurnEvent({phase:"tool-timeout",step:I,maxSteps:T,toolName:ee.name});let F=Ce instanceof Error?Ce.message:"Unknown error",me=M.get(ee.name)||{count:0,lastError:""};me.count++,me.lastError=F,M.set(ee.name,me),g.warn(`[GoogleVertex] Tool "${ee.name}" failed (attempt ${me.count}/${Eo}): ${F}`);let Te=me.count>=Eo,ie={error:Te?`TOOL_PERMANENTLY_FAILED: The tool "${ee.name}" has failed ${me.count} times with error: ${F}. This tool will not be retried. Please proceed without using this tool or inform the user that this functionality is unavailable.`:`TOOL_EXECUTION_ERROR: ${F}. Retry attempt ${me.count}/${Eo}.`,status:Te?"permanently_failed":"failed",do_not_retry:Te,retry_count:me.count,max_retries:Eo};Xe.push({functionResponse:{name:ee.name,response:ie}}),P.push({name:ee.name,input:ee.args,output:ie}),V.push({toolName:ee.name,output:ie})}else{let Ce={error:`TOOL_NOT_FOUND: The tool "${ee.name}" does not exist. Do not attempt to call this tool again.`,status:"permanently_failed",do_not_retry:!0},F=M.get(ee.name)||{count:0,lastError:""};F.count++,F.lastError=Ce.error,M.set(ee.name,F),Xe.push({functionResponse:{name:ee.name,response:Ce}}),P.push({name:ee.name,input:ee.args,output:Ce}),V.push({toolName:ee.name,output:Ce})}}if(ae)break;if(_.length>0||V.length>0){let ee=M_(we);yt(this.handleToolExecutionStorage(_.map((H,he)=>({...H,...he===0&&ee?{thoughtSignature:ee}:{},stepIndex:I})),V.map(H=>({...H,stepIndex:I})),e,new Date),ng,"tool storage write timed out").catch(H=>{g.warn("[GoogleVertex] Failed to store native Gemini stream tool executions",{error:H instanceof Error?H.message:String(H)})})}Ue.shouldNudgeWrapup()&&Xe.push({text:dP(p)}),w.push({role:"user",parts:Xe});try{L.noteAppendedChars(JSON.stringify(Xe).length)}catch{}}catch(fe){if(W.aborted||tu(fe)){ae=!0;break}throw g.error("[GoogleVertex] Native SDK error",fe),this.handleProviderError(fe)}}if(!C&&(I>=T||ae||U)){Se=I>=T&&!ae;let fe=k.filter(De=>De.toolName!=="final_result").length;if($.length>0)g.warn(U?"[GoogleVertex] Tool call loop stopped by the context guard; returning text already gathered from prior steps.":`[GoogleVertex] Tool call loop terminated after reaching maxSteps (${T}); returning text already gathered from prior steps.`);else if(ae)g.warn(`[GoogleVertex] Tool call loop ended mid-turn (${Ue.timedOut?"turn time limit":Ue.stalled?"stall watchdog":"caller abort"}); returning an honest terminal message.`),C=this.buildLoopExitMessage({turnClock:Ue,wasAborted:ae,stallTimeoutMs:e.stallTimeoutMs,maxSteps:T,toolCallCount:fe});else{g.warn(U?"[GoogleVertex] Tool call loop stopped by the context guard with no text; synthesizing a final answer with tools disabled.":`[GoogleVertex] Tool call loop terminated after reaching maxSteps (${T}) with no text; synthesizing a final answer with tools disabled.`);let De=await this.synthesizeFinalAnswerWithoutTools(o,t,f,w,p,sl(e.timeout)??Ew,W);De.text?(ye=!0,C=De.text,$.push(De.text),D+=De.inputTokens,z+=De.outputTokens,B+=De.reasoningTokens??0,De.finishReason&&(R=De.finishReason)):C=U?ru(fe):_g(T,fe)}}}finally{Ue.dispose(),e.abortSignal?.removeEventListener("abort",de)}let se=Se&&!ye?"tool-calls":uP(R),G=pP({timedOut:Ue.timedOut,stalled:Ue.stalled,wasAborted:ae,cappedWithoutAnswer:Se&&!ye,contextCappedWithoutAnswer:U&&!ye,finishReason:se});G!=="completed"&&this.emitTurnEvent({phase:G,step:I,maxSteps:T,toolCallCount:k.filter(fe=>fe.toolName!=="final_result").length,elapsedMs:Ue.elapsedMs()});let q=Date.now()-x,re=A?[C]:$.length>0?$:[C];async function*O(){for(let fe of re)fe.length>0&&(yield{content:fe})}let Z=k.filter(fe=>fe.toolName!=="final_result"),Q=P.filter(fe=>fe.name!=="final_result"),oe=Math.max(0,D-j),le={stream:O(),provider:this.providerName,model:t,finishReason:se,stopReason:G,rawFinishReason:R,usage:{input:oe,output:z+B,total:oe+j+z+B,...j>0&&{cacheReadTokens:j},...B>0&&{reasoning:B}},toolCalls:Z.map(fe=>({toolName:fe.toolName,args:fe.args})),toolsUsed:Z.map(fe=>fe.toolName),toolExecutions:Sv(Q),metadata:{streamId:`native-vertex-${Date.now()}`,startTime:x,responseTime:q,totalToolExecutions:Z.length,stopReason:G,rawFinishReason:R,stepsUsed:I}};return A&&(le.structuredOutput=A),le}async executeNativeGemini3Generate(e){let t=e.model||this.modelName||FE(),n=hM(t,e.region),o=await this.createVertexGenAIClient(n);g.debug("[GoogleVertex] Using native @google/genai for Gemini 3 generate",{model:t,project:this.projectId,location:n});let s=e.input?.text||e.prompt||"Please respond.",i=[],a=[{text:s}],l=e.input;if(l?.pdfFiles&&l.pdfFiles.length>0){g.debug(`[GoogleVertex] Processing ${l.pdfFiles.length} PDF file(s) for native generate`);for(let le of l.pdfFiles){let fe;typeof le=="string"?wn.existsSync(le)?fe=wn.readFileSync(le):fe=Buffer.from(le,"base64"):fe=le;let De=fe.toString("base64");a.push({inlineData:{mimeType:"application/pdf",data:De}})}}if(await Zj(a,l?.nativeAudioFiles,"[GoogleVertex]"),l?.images&&l.images.length>0){g.debug(`[GoogleVertex] Processing ${l.images.length} image(s) for native generate`);for(let le of l.images){let fe=i_(le),De,we="image/jpeg";if(typeof fe=="string")if(wn.existsSync(fe)){De=wn.readFileSync(fe);let Ge=Nv(fe);we=Ge.startsWith("image/")?Ge:this.detectImageType(De)}else if(fe.startsWith("data:")){let Ge=fe.match(/^data:([^;]+);base64,(.+)$/);if(Ge)we=Ge[1],De=Buffer.from(Ge[2],"base64");else continue}else if(fe.startsWith("http://")||fe.startsWith("https://"))try{let Ge=await fetch(fe);if(!Ge.ok){g.warn(`[GoogleVertex] Image fetch failed: ${Ge.status} ${Ge.statusText}, skipping`,{url:Wr(fe)});continue}let ce=await Ge.arrayBuffer();De=Buffer.from(ce);let qe=Ge.headers.get("content-type");qe&&qe.startsWith("image/")&&(we=qe.split(";")[0])}catch(Ge){g.warn(`[GoogleVertex] Image URL fetch threw, skipping: ${Ge instanceof Error?Ge.message:String(Ge)}`,{url:Wr(fe)});continue}else De=Buffer.from(fe,"base64"),we=this.detectImageType(De);else De=fe,we=this.detectImageType(De);let Je=De.toString("base64");a.push({inlineData:{mimeType:we,data:Je}})}}O_(i,e.conversationMessages),i.push({role:"user",parts:a});let c=e.disableTools?{}:e.tools||{},u,p=new Qh;if(Object.keys(c).length>0){let le=Eg(c,"functionDeclarations");u=le.toolsConfig;for(let[fe,De]of le.executeMap)p.set(fe,De);g.debug("[GoogleVertex] Converted tools for native SDK generate",{toolCount:le.toolsConfig[0].functionDeclarations.length,toolNames:le.toolsConfig[0].functionDeclarations.map(fe=>fe.name)})}let m=!1;if(e.schema&&u){m=!0;let le=xn(e.schema,"openApi3"),fe=pn(le);fe.$schema&&delete fe.$schema;let De=pi(fe),we=u[0]?.functionDeclarations||[];we.push({name:"final_result",description:"Return the final structured result. You MUST call this tool when you have gathered all information and are ready to provide the final answer. The arguments should contain the structured data matching the expected schema.",parametersJsonSchema:De}),u=[{functionDeclarations:we}],g.debug("[GoogleVertex] Added final_result tool for structured output with tools (generate)",{schemaKeys:Object.keys(De),totalTools:we.length})}let f=_a(this.providerName,t,{temperature:e.temperature??1,...e.topP!==void 0&&{topP:e.topP}},"vertex.gemini"),h={...f.temperature!==void 0&&{temperature:f.temperature},maxOutputTokens:e.maxTokens};nP(t)&&(h.maxOutputTokens&&h.maxOutputTokens>Nl&&(g.warn(`[GoogleVertex] Capping maxOutputTokens from ${h.maxOutputTokens} to ${Nl} for ${t}`),h.maxOutputTokens=Nl),h.maxOutputTokens||(h.maxOutputTokens=Nl)),f.topP!==void 0&&(h.topP=f.topP),e.topK!==void 0&&(h.topK=e.topK),e.stopSequences&&e.stopSequences.length>0&&(h.stopSequences=e.stopSequences),u&&(h.tools=u);let y=e.systemPrompt||"";m&&(y=y+`
1132
1132
 
@@ -54,6 +54,27 @@ export declare const resolveVertexLocation: (modelName: string | undefined, conf
54
54
  export declare class GoogleVertexProvider extends BaseProvider {
55
55
  private projectId;
56
56
  private location;
57
+ /**
58
+ * Vertex AI Express Mode credentials.
59
+ *
60
+ * Vertex supports two authentication modes. The long-standing one pairs a
61
+ * project and location with Application Default Credentials, which makes
62
+ * the SDK mint an OAuth token through google-auth-library before every
63
+ * request. Express Mode instead authenticates with an API key alone.
64
+ *
65
+ * Express is used only when an apiKey is supplied WITHOUT an explicit
66
+ * project or location, so existing ADC callers — including those already
67
+ * passing an apiKey alongside a project — keep exactly the behaviour they
68
+ * have today.
69
+ */
70
+ private expressApiKey?;
71
+ /**
72
+ * Optional endpoint override, mirroring AI Studio's
73
+ * `credentials.googleAiStudio.baseURL`: per-request credential first, then
74
+ * the environment, then unset so the SDK applies its own default. Blank
75
+ * values count as unset so an empty override cannot clobber that default.
76
+ */
77
+ private baseURL?;
57
78
  private registeredTools;
58
79
  private toolContext;
59
80
  private static modelConfigCache;
@@ -105,6 +126,18 @@ export declare class GoogleVertexProvider extends BaseProvider {
105
126
  * Create @google/genai client configured for Vertex AI
106
127
  */
107
128
  private createVertexGenAIClient;
129
+ /** Endpoint override: credential, then environment, then unset. */
130
+ private resolveBaseURL;
131
+ /**
132
+ * Express Mode key, if this provider should use it.
133
+ *
134
+ * Deliberately NOT read from GOOGLE_API_KEY: that variable is already set
135
+ * by callers who also configure a project, and treating it as an Express
136
+ * opt-in would silently switch their authentication mode. Express is opted
137
+ * into per request, or through GOOGLE_VERTEX_API_KEY which exists only for
138
+ * this purpose.
139
+ */
140
+ private resolveExpressApiKey;
108
141
  /**
109
142
  * Convert one AI-SDK tool into a Vertex Gemini function declaration.
110
143
  * Single source for the pre-loop snapshot AND the mid-turn discovery
@@ -578,6 +578,27 @@ function reclaimVertexAnthropicContext(messages, modelName, observedPromptTokens
578
578
  export class GoogleVertexProvider extends BaseProvider {
579
579
  projectId;
580
580
  location;
581
+ /**
582
+ * Vertex AI Express Mode credentials.
583
+ *
584
+ * Vertex supports two authentication modes. The long-standing one pairs a
585
+ * project and location with Application Default Credentials, which makes
586
+ * the SDK mint an OAuth token through google-auth-library before every
587
+ * request. Express Mode instead authenticates with an API key alone.
588
+ *
589
+ * Express is used only when an apiKey is supplied WITHOUT an explicit
590
+ * project or location, so existing ADC callers — including those already
591
+ * passing an apiKey alongside a project — keep exactly the behaviour they
592
+ * have today.
593
+ */
594
+ expressApiKey;
595
+ /**
596
+ * Optional endpoint override, mirroring AI Studio's
597
+ * `credentials.googleAiStudio.baseURL`: per-request credential first, then
598
+ * the environment, then unset so the SDK applies its own default. Blank
599
+ * values count as unset so an empty override cannot clobber that default.
600
+ */
601
+ baseURL;
581
602
  registeredTools = new Map();
582
603
  toolContext = {};
583
604
  // Memory-managed cache for model configuration lookups to avoid repeated calls
@@ -601,14 +622,33 @@ export class GoogleVertexProvider extends BaseProvider {
601
622
  }
602
623
  if (credentials.apiKey) {
603
624
  process.env.GOOGLE_API_KEY = String(credentials.apiKey);
625
+ // Express Mode only when the caller gave a key and NOTHING else to
626
+ // authenticate with. An apiKey passed next to a project is the
627
+ // pre-existing combination and must keep resolving through ADC.
628
+ if (!credentials.projectId && !credentials.location) {
629
+ this.expressApiKey = String(credentials.apiKey);
630
+ }
631
+ }
632
+ if (credentials.baseURL) {
633
+ this.baseURL = String(credentials.baseURL);
604
634
  }
605
635
  }
606
- // Validate Google Cloud credentials - now using consolidated utility
607
- if (!hasGoogleCredentials()) {
608
- validateApiKey(createGoogleAuthConfig());
636
+ // Express Mode authenticates with the key alone, so neither the ADC
637
+ // credential check nor project resolution applies. Both THROW when
638
+ // nothing is configured, which would fail an apiKey-only request before
639
+ // the Express client is ever built — and would do so only on machines
640
+ // without an ambient project, which is exactly where Express is the point.
641
+ const usingExpress = Boolean(this.resolveExpressApiKey());
642
+ if (!usingExpress) {
643
+ // Validate Google Cloud credentials - now using consolidated utility
644
+ if (!hasGoogleCredentials()) {
645
+ validateApiKey(createGoogleAuthConfig());
646
+ }
609
647
  }
610
648
  // Initialize Google Cloud configuration
611
- this.projectId = credentials?.projectId || getVertexProjectId();
649
+ this.projectId =
650
+ credentials?.projectId ||
651
+ (usingExpress ? "" : getVertexProjectId());
612
652
  this.location =
613
653
  region || credentials?.location || getVertexLocation();
614
654
  logger.debug("[GoogleVertexProvider] Constructor initialized", {
@@ -803,7 +843,10 @@ export class GoogleVertexProvider extends BaseProvider {
803
843
  * Create @google/genai client configured for Vertex AI
804
844
  */
805
845
  async createVertexGenAIClient(regionOverride) {
806
- const project = getVertexProjectId();
846
+ const expressApiKey = this.resolveExpressApiKey();
847
+ // Resolved only on the ADC path: getVertexProjectId() throws when no
848
+ // project is configured, which an Express request legitimately has none of.
849
+ const project = expressApiKey ? "" : getVertexProjectId();
807
850
  const location = regionOverride || this.location || getVertexLocation();
808
851
  const mod = await import("@google/genai");
809
852
  const ctor = mod.GoogleGenAI;
@@ -818,17 +861,70 @@ export class GoogleVertexProvider extends BaseProvider {
818
861
  });
819
862
  }
820
863
  const Ctor = ctor;
821
- // Use vertexai mode with project and location
822
- // Include httpOptions with proxy fetch for corporate network support
864
+ const baseUrl = this.resolveBaseURL();
865
+ const httpOptions = {
866
+ // Proxy fetch for corporate network support.
867
+ fetch: createProxyFetch(),
868
+ // Only set when resolved: the SDK falls back to its own default
869
+ // whenever httpOptions.baseUrl is undefined, so omitting the key and
870
+ // passing undefined behave identically.
871
+ ...(baseUrl ? { baseUrl } : {}),
872
+ };
873
+ if (expressApiKey) {
874
+ // Express Mode: an API key replaces project/location entirely. Passing
875
+ // them alongside the key would defeat it — the SDK prefers
876
+ // project/location and falls back to ADC, which is the very thing
877
+ // Express exists to avoid.
878
+ return new Ctor({
879
+ vertexai: true,
880
+ apiKey: expressApiKey,
881
+ httpOptions,
882
+ });
883
+ }
884
+ // Project/location mode, authenticating through ADC.
823
885
  return new Ctor({
824
886
  vertexai: true,
825
887
  project,
826
888
  location,
827
- httpOptions: {
828
- fetch: createProxyFetch(),
829
- },
889
+ httpOptions,
830
890
  });
831
891
  }
892
+ /** Endpoint override: credential, then environment, then unset. */
893
+ resolveBaseURL() {
894
+ const resolved = this.baseURL?.trim() || process.env.GOOGLE_VERTEX_BASE_URL?.trim();
895
+ return resolved && resolved.length > 0 ? resolved : undefined;
896
+ }
897
+ /**
898
+ * Express Mode key, if this provider should use it.
899
+ *
900
+ * Deliberately NOT read from GOOGLE_API_KEY: that variable is already set
901
+ * by callers who also configure a project, and treating it as an Express
902
+ * opt-in would silently switch their authentication mode. Express is opted
903
+ * into per request, or through GOOGLE_VERTEX_API_KEY which exists only for
904
+ * this purpose.
905
+ */
906
+ resolveExpressApiKey() {
907
+ // A per-request key already carries its own guard: it is only recorded
908
+ // when the caller supplied no project and no location.
909
+ const fromCredentials = this.expressApiKey?.trim();
910
+ if (fromCredentials) {
911
+ return fromCredentials;
912
+ }
913
+ const fromEnv = process.env.GOOGLE_VERTEX_API_KEY?.trim();
914
+ if (!fromEnv) {
915
+ return undefined;
916
+ }
917
+ // The environment key gets the same guard. A process that configures a
918
+ // project has an ADC setup, and letting an ambient key silently switch it
919
+ // to Express would change how that process authenticates.
920
+ const projectConfigured = [
921
+ "GOOGLE_CLOUD_PROJECT_ID",
922
+ "VERTEX_PROJECT_ID",
923
+ "GOOGLE_VERTEX_PROJECT",
924
+ "GOOGLE_CLOUD_PROJECT",
925
+ ].some((name) => (process.env[name] ?? "").trim().length > 0);
926
+ return projectConfigured ? undefined : fromEnv;
927
+ }
832
928
  /**
833
929
  * Convert one AI-SDK tool into a Vertex Gemini function declaration.
834
930
  * Single source for the pre-loop snapshot AND the mid-turn discovery
@@ -95,9 +95,6 @@ export type AgenticLoopToolFailureBreaker = {
95
95
  export type AgenticLoopAdapter<TConversation = unknown, TRaw = unknown> = {
96
96
  readonly providerLabel: string;
97
97
  readonly maxSteps: number;
98
- /** Pre-existing per-family flat timeout, used as createTurnClock's deadline default. */
99
- readonly defaultTurnTimeoutMs?: number;
100
- readonly stallTimeoutMs?: number;
101
98
  /** Set only for adapter instances whose client has the TOOL_NOT_FOUND strike breaker today: both Gemini adapters (AI Studio, Vertex+Gemini) AND the Vertex+Claude call to createAnthropicLoopAdapter — NOT the native-Anthropic call to that same factory, and not Bedrock. See Verified Fact 4. */
102
99
  readonly toolFailureBreaker?: AgenticLoopToolFailureBreaker;
103
100
  /**
@@ -54,6 +54,27 @@ export declare const resolveVertexLocation: (modelName: string | undefined, conf
54
54
  export declare class GoogleVertexProvider extends BaseProvider {
55
55
  private projectId;
56
56
  private location;
57
+ /**
58
+ * Vertex AI Express Mode credentials.
59
+ *
60
+ * Vertex supports two authentication modes. The long-standing one pairs a
61
+ * project and location with Application Default Credentials, which makes
62
+ * the SDK mint an OAuth token through google-auth-library before every
63
+ * request. Express Mode instead authenticates with an API key alone.
64
+ *
65
+ * Express is used only when an apiKey is supplied WITHOUT an explicit
66
+ * project or location, so existing ADC callers — including those already
67
+ * passing an apiKey alongside a project — keep exactly the behaviour they
68
+ * have today.
69
+ */
70
+ private expressApiKey?;
71
+ /**
72
+ * Optional endpoint override, mirroring AI Studio's
73
+ * `credentials.googleAiStudio.baseURL`: per-request credential first, then
74
+ * the environment, then unset so the SDK applies its own default. Blank
75
+ * values count as unset so an empty override cannot clobber that default.
76
+ */
77
+ private baseURL?;
57
78
  private registeredTools;
58
79
  private toolContext;
59
80
  private static modelConfigCache;
@@ -105,6 +126,18 @@ export declare class GoogleVertexProvider extends BaseProvider {
105
126
  * Create @google/genai client configured for Vertex AI
106
127
  */
107
128
  private createVertexGenAIClient;
129
+ /** Endpoint override: credential, then environment, then unset. */
130
+ private resolveBaseURL;
131
+ /**
132
+ * Express Mode key, if this provider should use it.
133
+ *
134
+ * Deliberately NOT read from GOOGLE_API_KEY: that variable is already set
135
+ * by callers who also configure a project, and treating it as an Express
136
+ * opt-in would silently switch their authentication mode. Express is opted
137
+ * into per request, or through GOOGLE_VERTEX_API_KEY which exists only for
138
+ * this purpose.
139
+ */
140
+ private resolveExpressApiKey;
108
141
  /**
109
142
  * Convert one AI-SDK tool into a Vertex Gemini function declaration.
110
143
  * Single source for the pre-loop snapshot AND the mid-turn discovery
@@ -578,6 +578,27 @@ function reclaimVertexAnthropicContext(messages, modelName, observedPromptTokens
578
578
  export class GoogleVertexProvider extends BaseProvider {
579
579
  projectId;
580
580
  location;
581
+ /**
582
+ * Vertex AI Express Mode credentials.
583
+ *
584
+ * Vertex supports two authentication modes. The long-standing one pairs a
585
+ * project and location with Application Default Credentials, which makes
586
+ * the SDK mint an OAuth token through google-auth-library before every
587
+ * request. Express Mode instead authenticates with an API key alone.
588
+ *
589
+ * Express is used only when an apiKey is supplied WITHOUT an explicit
590
+ * project or location, so existing ADC callers — including those already
591
+ * passing an apiKey alongside a project — keep exactly the behaviour they
592
+ * have today.
593
+ */
594
+ expressApiKey;
595
+ /**
596
+ * Optional endpoint override, mirroring AI Studio's
597
+ * `credentials.googleAiStudio.baseURL`: per-request credential first, then
598
+ * the environment, then unset so the SDK applies its own default. Blank
599
+ * values count as unset so an empty override cannot clobber that default.
600
+ */
601
+ baseURL;
581
602
  registeredTools = new Map();
582
603
  toolContext = {};
583
604
  // Memory-managed cache for model configuration lookups to avoid repeated calls
@@ -601,14 +622,33 @@ export class GoogleVertexProvider extends BaseProvider {
601
622
  }
602
623
  if (credentials.apiKey) {
603
624
  process.env.GOOGLE_API_KEY = String(credentials.apiKey);
625
+ // Express Mode only when the caller gave a key and NOTHING else to
626
+ // authenticate with. An apiKey passed next to a project is the
627
+ // pre-existing combination and must keep resolving through ADC.
628
+ if (!credentials.projectId && !credentials.location) {
629
+ this.expressApiKey = String(credentials.apiKey);
630
+ }
631
+ }
632
+ if (credentials.baseURL) {
633
+ this.baseURL = String(credentials.baseURL);
604
634
  }
605
635
  }
606
- // Validate Google Cloud credentials - now using consolidated utility
607
- if (!hasGoogleCredentials()) {
608
- validateApiKey(createGoogleAuthConfig());
636
+ // Express Mode authenticates with the key alone, so neither the ADC
637
+ // credential check nor project resolution applies. Both THROW when
638
+ // nothing is configured, which would fail an apiKey-only request before
639
+ // the Express client is ever built — and would do so only on machines
640
+ // without an ambient project, which is exactly where Express is the point.
641
+ const usingExpress = Boolean(this.resolveExpressApiKey());
642
+ if (!usingExpress) {
643
+ // Validate Google Cloud credentials - now using consolidated utility
644
+ if (!hasGoogleCredentials()) {
645
+ validateApiKey(createGoogleAuthConfig());
646
+ }
609
647
  }
610
648
  // Initialize Google Cloud configuration
611
- this.projectId = credentials?.projectId || getVertexProjectId();
649
+ this.projectId =
650
+ credentials?.projectId ||
651
+ (usingExpress ? "" : getVertexProjectId());
612
652
  this.location =
613
653
  region || credentials?.location || getVertexLocation();
614
654
  logger.debug("[GoogleVertexProvider] Constructor initialized", {
@@ -803,7 +843,10 @@ export class GoogleVertexProvider extends BaseProvider {
803
843
  * Create @google/genai client configured for Vertex AI
804
844
  */
805
845
  async createVertexGenAIClient(regionOverride) {
806
- const project = getVertexProjectId();
846
+ const expressApiKey = this.resolveExpressApiKey();
847
+ // Resolved only on the ADC path: getVertexProjectId() throws when no
848
+ // project is configured, which an Express request legitimately has none of.
849
+ const project = expressApiKey ? "" : getVertexProjectId();
807
850
  const location = regionOverride || this.location || getVertexLocation();
808
851
  const mod = await import("@google/genai");
809
852
  const ctor = mod.GoogleGenAI;
@@ -818,17 +861,70 @@ export class GoogleVertexProvider extends BaseProvider {
818
861
  });
819
862
  }
820
863
  const Ctor = ctor;
821
- // Use vertexai mode with project and location
822
- // Include httpOptions with proxy fetch for corporate network support
864
+ const baseUrl = this.resolveBaseURL();
865
+ const httpOptions = {
866
+ // Proxy fetch for corporate network support.
867
+ fetch: createProxyFetch(),
868
+ // Only set when resolved: the SDK falls back to its own default
869
+ // whenever httpOptions.baseUrl is undefined, so omitting the key and
870
+ // passing undefined behave identically.
871
+ ...(baseUrl ? { baseUrl } : {}),
872
+ };
873
+ if (expressApiKey) {
874
+ // Express Mode: an API key replaces project/location entirely. Passing
875
+ // them alongside the key would defeat it — the SDK prefers
876
+ // project/location and falls back to ADC, which is the very thing
877
+ // Express exists to avoid.
878
+ return new Ctor({
879
+ vertexai: true,
880
+ apiKey: expressApiKey,
881
+ httpOptions,
882
+ });
883
+ }
884
+ // Project/location mode, authenticating through ADC.
823
885
  return new Ctor({
824
886
  vertexai: true,
825
887
  project,
826
888
  location,
827
- httpOptions: {
828
- fetch: createProxyFetch(),
829
- },
889
+ httpOptions,
830
890
  });
831
891
  }
892
+ /** Endpoint override: credential, then environment, then unset. */
893
+ resolveBaseURL() {
894
+ const resolved = this.baseURL?.trim() || process.env.GOOGLE_VERTEX_BASE_URL?.trim();
895
+ return resolved && resolved.length > 0 ? resolved : undefined;
896
+ }
897
+ /**
898
+ * Express Mode key, if this provider should use it.
899
+ *
900
+ * Deliberately NOT read from GOOGLE_API_KEY: that variable is already set
901
+ * by callers who also configure a project, and treating it as an Express
902
+ * opt-in would silently switch their authentication mode. Express is opted
903
+ * into per request, or through GOOGLE_VERTEX_API_KEY which exists only for
904
+ * this purpose.
905
+ */
906
+ resolveExpressApiKey() {
907
+ // A per-request key already carries its own guard: it is only recorded
908
+ // when the caller supplied no project and no location.
909
+ const fromCredentials = this.expressApiKey?.trim();
910
+ if (fromCredentials) {
911
+ return fromCredentials;
912
+ }
913
+ const fromEnv = process.env.GOOGLE_VERTEX_API_KEY?.trim();
914
+ if (!fromEnv) {
915
+ return undefined;
916
+ }
917
+ // The environment key gets the same guard. A process that configures a
918
+ // project has an ADC setup, and letting an ambient key silently switch it
919
+ // to Express would change how that process authenticates.
920
+ const projectConfigured = [
921
+ "GOOGLE_CLOUD_PROJECT_ID",
922
+ "VERTEX_PROJECT_ID",
923
+ "GOOGLE_VERTEX_PROJECT",
924
+ "GOOGLE_CLOUD_PROJECT",
925
+ ].some((name) => (process.env[name] ?? "").trim().length > 0);
926
+ return projectConfigured ? undefined : fromEnv;
927
+ }
832
928
  /**
833
929
  * Convert one AI-SDK tool into a Vertex Gemini function declaration.
834
930
  * Single source for the pre-loop snapshot AND the mid-turn discovery
@@ -95,9 +95,6 @@ export type AgenticLoopToolFailureBreaker = {
95
95
  export type AgenticLoopAdapter<TConversation = unknown, TRaw = unknown> = {
96
96
  readonly providerLabel: string;
97
97
  readonly maxSteps: number;
98
- /** Pre-existing per-family flat timeout, used as createTurnClock's deadline default. */
99
- readonly defaultTurnTimeoutMs?: number;
100
- readonly stallTimeoutMs?: number;
101
98
  /** Set only for adapter instances whose client has the TOOL_NOT_FOUND strike breaker today: both Gemini adapters (AI Studio, Vertex+Gemini) AND the Vertex+Claude call to createAnthropicLoopAdapter — NOT the native-Anthropic call to that same factory, and not Bedrock. See Verified Fact 4. */
102
99
  readonly toolFailureBreaker?: AgenticLoopToolFailureBreaker;
103
100
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juspay/neurolink",
3
- "version": "11.11.6",
3
+ "version": "11.12.0",
4
4
  "packageManager": "pnpm@10.15.1",
5
5
  "description": "TypeScript AI SDK with 24+ LLM providers behind one consistent API. MCP-native (connect any MCP server), voice TTS/STT/realtime, RAG, agents, memory, context compaction. OpenAI · Anthropic · Gemini · Bedrock · Azure · Ollama · DeepSeek · NVIDIA NIM and more.",
6
6
  "author": {
@@ -91,6 +91,7 @@
91
91
  "test:middleware": "npx tsx test/continuous-test-suite-middleware.ts",
92
92
  "test:observability": "npx tsx test/continuous-test-suite-observability.ts",
93
93
  "test:ppt": "npx tsx test/continuous-test-suite-ppt.ts",
94
+ "test:vertex-loop-characterization": "tsx test/continuous-test-suite-vertex-loop-characterization.ts",
94
95
  "test:providers": "npx tsx test/continuous-test-suite-providers.ts",
95
96
  "test:new-providers": "npx tsx test/continuous-test-suite-new-providers.ts",
96
97
  "test:matrix": "npx tsx test/continuous-test-suite-provider-matrix.ts",