blink 0.1.76 → 0.1.78

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.
@@ -1452,13 +1452,7 @@ The structure MUST be as follows:
1452
1452
  **Decision Rules (apply in order):**
1453
1453
  1. **Model Continues:** If your last response explicitly states an immediate next action *you* intend to take (e.g., "Next, I will...", "Now I'll process...", "Moving on to analyze...", indicates an intended tool call that didn't execute), OR if the response seems clearly incomplete (cut off mid-thought without a natural conclusion), then the **'model'** should speak next.
1454
1454
  2. **Question to User:** If your last response ends with a direct question specifically addressed *to the user*, then the **'user'** should speak next.
1455
- 3. **Waiting for User:** If your last response completed a thought, statement, or task *and* does not meet the criteria for Rule 1 (Model Continues) or Rule 2 (Question to User), it implies a pause expecting user input or reaction. In this case, the **'user'** should speak next.`}]}];try{let parsedResponse=await geminiClient.generateJson(contents,RESPONSE_SCHEMA,abortSignal,DEFAULT_GEMINI_FLASH_MODEL);return parsedResponse&&parsedResponse.next_speaker&&[`user`,`model`].includes(parsedResponse.next_speaker)?parsedResponse:null}catch(error$22){return console.warn(`Failed to talk to Gemini endpoint when seeing if conversation should continue.`,error$22),null}}var require_levenshtein=__commonJSMin(((exports,module)=>{(function(){var collator;try{collator=typeof Intl<`u`&&Intl.Collator!==void 0?Intl.Collator(`generic`,{sensitivity:`base`}):null}catch(err){console.log(`Collator could not be initialized and wouldn't be used`)}var prevRow=[],str2Char=[],Levenshtein={get:function(str1,str2,options$1){var useCollator=options$1&&collator&&options$1.useCollator,str1Len=str1.length,str2Len=str2.length;if(str1Len===0)return str2Len;if(str2Len===0)return str1Len;var curCol,nextCol,i$4,j$2,tmp;for(i$4=0;i$4<str2Len;++i$4)prevRow[i$4]=i$4,str2Char[i$4]=str2.charCodeAt(i$4);prevRow[str2Len]=str2Len;var strCmp;if(useCollator)for(i$4=0;i$4<str1Len;++i$4){for(nextCol=i$4+1,j$2=0;j$2<str2Len;++j$2)curCol=nextCol,strCmp=collator.compare(str1.charAt(i$4),String.fromCharCode(str2Char[j$2]))===0,nextCol=prevRow[j$2]+(strCmp?0:1),tmp=curCol+1,nextCol>tmp&&(nextCol=tmp),tmp=prevRow[j$2+1]+1,nextCol>tmp&&(nextCol=tmp),prevRow[j$2]=curCol;prevRow[j$2]=nextCol}else for(i$4=0;i$4<str1Len;++i$4){for(nextCol=i$4+1,j$2=0;j$2<str2Len;++j$2)curCol=nextCol,strCmp=str1.charCodeAt(i$4)===str2Char[j$2],nextCol=prevRow[j$2]+(strCmp?0:1),tmp=curCol+1,nextCol>tmp&&(nextCol=tmp),tmp=prevRow[j$2+1]+1,nextCol>tmp&&(nextCol=tmp),prevRow[j$2]=curCol;prevRow[j$2]=nextCol}return nextCol}};typeof define<`u`&&define!==null&&define.amd?define(function(){return Levenshtein}):module!=null&&exports!==void 0&&module.exports===exports?module.exports=Levenshtein:typeof self<`u`&&typeof self.postMessage==`function`&&typeof self.importScripts==`function`?self.Levenshtein=Levenshtein:typeof window<`u`&&window!==null&&(window.Levenshtein=Levenshtein)})()})),import_levenshtein=__toESM(require_levenshtein(),1),ChatRecordingService=class{conversationFile=null;cachedLastConvData=null;sessionId;projectHash;queuedThoughts=[];queuedTokens=null;config;constructor(config){this.config=config,this.sessionId=config.getSessionId(),this.projectHash=getProjectHash(config.getProjectRoot())}initialize(resumedSessionData){try{if(resumedSessionData)this.conversationFile=resumedSessionData.filePath,this.sessionId=resumedSessionData.conversation.sessionId,this.updateConversation(conversation=>{conversation.sessionId=this.sessionId}),this.cachedLastConvData=null;else{let chatsDir=path.join(this.config.storage.getProjectTempDir(),`chats`);fs.mkdirSync(chatsDir,{recursive:!0});let timestamp=new Date().toISOString().slice(0,16).replace(/:/g,`-`),filename=`session-${timestamp}-${this.sessionId.slice(0,8)}.json`;this.conversationFile=path.join(chatsDir,filename),this.writeConversation({sessionId:this.sessionId,projectHash:this.projectHash,startTime:new Date().toISOString(),lastUpdated:new Date().toISOString(),messages:[]})}this.queuedThoughts=[],this.queuedTokens=null}catch(error$22){throw console.error(`Error initializing chat recording service:`,error$22),error$22}}getLastMessage(conversation){return conversation.messages.at(-1)}newMessage(type,content){return{id:randomUUID$1(),timestamp:new Date().toISOString(),type,content}}recordMessage(message){if(this.conversationFile)try{this.updateConversation(conversation=>{let msg=this.newMessage(message.type,message.content);msg.type===`gemini`?(conversation.messages.push({...msg,thoughts:this.queuedThoughts,tokens:this.queuedTokens,model:this.config.getModel()}),this.queuedThoughts=[],this.queuedTokens=null):conversation.messages.push(msg)})}catch(error$22){throw console.error(`Error saving message:`,error$22),error$22}}recordThought(thought){if(this.conversationFile)try{this.queuedThoughts.push({...thought,timestamp:new Date().toISOString()})}catch(error$22){throw console.error(`Error saving thought:`,error$22),error$22}}recordMessageTokens(respUsageMetadata){if(this.conversationFile)try{let tokens={input:respUsageMetadata.promptTokenCount??0,output:respUsageMetadata.candidatesTokenCount??0,cached:respUsageMetadata.cachedContentTokenCount??0,thoughts:respUsageMetadata.thoughtsTokenCount??0,tool:respUsageMetadata.toolUsePromptTokenCount??0,total:respUsageMetadata.totalTokenCount??0};this.updateConversation(conversation=>{let lastMsg=this.getLastMessage(conversation);lastMsg&&lastMsg.type===`gemini`&&!lastMsg.tokens?(lastMsg.tokens=tokens,this.queuedTokens=null):this.queuedTokens=tokens})}catch(error$22){throw console.error(`Error updating message tokens:`,error$22),error$22}}recordToolCalls(toolCalls){if(!this.conversationFile)return;let toolRegistry=this.config.getToolRegistry(),enrichedToolCalls=toolCalls.map(toolCall=>{let toolInstance=toolRegistry.getTool(toolCall.name);return{...toolCall,displayName:toolInstance?.displayName||toolCall.name,description:toolInstance?.description||``,renderOutputAsMarkdown:toolInstance?.isOutputMarkdown||!1}});try{this.updateConversation(conversation=>{let lastMsg=this.getLastMessage(conversation);if(!lastMsg||lastMsg.type!==`gemini`||this.queuedThoughts.length>0){let newMsg={...this.newMessage(`gemini`,``),type:`gemini`,toolCalls:enrichedToolCalls,thoughts:this.queuedThoughts,model:this.config.getModel()};this.queuedThoughts.length>0&&(newMsg.thoughts=this.queuedThoughts,this.queuedThoughts=[]),this.queuedTokens&&(newMsg.tokens=this.queuedTokens,this.queuedTokens=null),conversation.messages.push(newMsg)}else{lastMsg.toolCalls||(lastMsg.toolCalls=[]),lastMsg.toolCalls=lastMsg.toolCalls.map(toolCall=>{let incomingToolCall=toolCalls.find(tc=>tc.id===toolCall.id);return incomingToolCall?{...toolCall,...incomingToolCall}:toolCall});for(let toolCall of enrichedToolCalls){let existingToolCall=lastMsg.toolCalls.find(tc=>tc.id===toolCall.id);existingToolCall||lastMsg.toolCalls.push(toolCall)}}})}catch(error$22){throw console.error(`Error adding tool call to message:`,error$22),error$22}}readConversation(){try{return this.cachedLastConvData=fs.readFileSync(this.conversationFile,`utf8`),JSON.parse(this.cachedLastConvData)}catch(error$22){if(error$22.code!==`ENOENT`)throw console.error(`Error reading conversation file:`,error$22),error$22;return{sessionId:this.sessionId,projectHash:this.projectHash,startTime:new Date().toISOString(),lastUpdated:new Date().toISOString(),messages:[]}}}writeConversation(conversation){try{if(!this.conversationFile||conversation.messages.length===0)return;if(this.cachedLastConvData!==JSON.stringify(conversation,null,2)){conversation.lastUpdated=new Date().toISOString();let newContent=JSON.stringify(conversation,null,2);this.cachedLastConvData=newContent,fs.writeFileSync(this.conversationFile,newContent)}}catch(error$22){throw console.error(`Error writing conversation file:`,error$22),error$22}}updateConversation(updateFn){let conversation=this.readConversation();updateFn(conversation),this.writeConversation(conversation)}deleteSession(sessionId$1){try{let chatsDir=path.join(this.config.storage.getProjectTempDir(),`chats`),sessionPath=path.join(chatsDir,`${sessionId$1}.json`);fs.unlinkSync(sessionPath)}catch(error$22){throw console.error(`Error deleting session:`,error$22),error$22}}};init_esm$1();
1456
- /**
1457
- * @license
1458
- * Copyright 2025 Google LLC
1459
- * SPDX-License-Identifier: Apache-2.0
1460
- */
1461
- var TelemetryTarget;(function(TelemetryTarget$1){TelemetryTarget$1.GCP=`gcp`,TelemetryTarget$1.LOCAL=`local`})(TelemetryTarget||(TelemetryTarget={}));const DEFAULT_TELEMETRY_TARGET=TelemetryTarget.LOCAL,DEFAULT_OTLP_ENDPOINT=`http://localhost:4317`;async function handleFallback(config,failedModel,authType,error$22){if(authType!==AuthType.LOGIN_WITH_GOOGLE)return null;let fallbackModel=DEFAULT_GEMINI_FLASH_MODEL;if(failedModel===fallbackModel)return null;let fallbackModelHandler=config.fallbackModelHandler;if(typeof fallbackModelHandler!=`function`)return null;try{let intent=await fallbackModelHandler(failedModel,fallbackModel,error$22);switch(intent){case`retry`:return activateFallbackMode(config,authType),!0;case`stop`:return activateFallbackMode(config,authType),!1;case`auth`:return!1;default:throw Error(`Unexpected fallback intent received from fallbackModelHandler: "${intent}"`)}}catch(handlerError){return console.error(`Fallback UI handler failed:`,handlerError),null}}function activateFallbackMode(config,authType){config.isInFallbackMode()||(config.setFallbackMode(!0),authType&&logFlashFallback(config,new FlashFallbackEvent(authType)))}function partListUnionToString(value){return partToString(value,{verbose:!0})}var StreamEventType;(function(StreamEventType$1){StreamEventType$1.CHUNK=`chunk`,StreamEventType$1.RETRY=`retry`})(StreamEventType||(StreamEventType={}));const INVALID_CONTENT_RETRY_OPTIONS={maxAttempts:3,initialDelayMs:500};function isValidResponse(response){if(response.candidates===void 0||response.candidates.length===0)return!1;let content=response.candidates[0]?.content;return content===void 0?!1:isValidContent(content)}function isValidContent(content){if(content.parts===void 0||content.parts.length===0)return!1;for(let part of content.parts)if(part===void 0||Object.keys(part).length===0||!part.thought&&part.text!==void 0&&part.text===``)return!1;return!0}function validateHistory(history){for(let content of history)if(content.role!==`user`&&content.role!==`model`)throw Error(`Role must be user or model, but got ${content.role}.`)}function extractCuratedHistory(comprehensiveHistory){if(comprehensiveHistory===void 0||comprehensiveHistory.length===0)return[];let curatedHistory=[],length=comprehensiveHistory.length,i$4=0;for(;i$4<length;)if(comprehensiveHistory[i$4].role===`user`)curatedHistory.push(comprehensiveHistory[i$4]),i$4++;else{let modelOutput=[],isValid=!0;for(;i$4<length&&comprehensiveHistory[i$4].role===`model`;)modelOutput.push(comprehensiveHistory[i$4]),isValid&&!isValidContent(comprehensiveHistory[i$4])&&(isValid=!1),i$4++;isValid&&curatedHistory.push(...modelOutput)}return curatedHistory}var EmptyStreamError=class extends Error{constructor(message){super(message),this.name=`EmptyStreamError`}},GeminiChat=class{config;generationConfig;history;sendPromise=Promise.resolve();chatRecordingService;constructor(config,generationConfig={},history=[]){this.config=config,this.generationConfig=generationConfig,this.history=history,validateHistory(history),this.chatRecordingService=new ChatRecordingService(config),this.chatRecordingService.initialize()}setSystemInstruction(sysInstr){this.generationConfig.systemInstruction=sysInstr}async sendMessageStream(params,prompt_id){await this.sendPromise;let streamDoneResolver,streamDonePromise=new Promise(resolve$9=>{streamDoneResolver=resolve$9});this.sendPromise=streamDonePromise;let userContent=createUserContent(params.message);if(!isFunctionResponse(userContent)){let userMessage=Array.isArray(params.message)?params.message:[params.message],userMessageContent=partListUnionToString(toParts(userMessage));this.chatRecordingService.recordMessage({type:`user`,content:userMessageContent})}this.history.push(userContent);let requestContents=this.getHistory(!0),self$1=this;return(async function*(){try{let lastError=Error(`Request failed after all retries.`);for(let attempt=0;attempt<INVALID_CONTENT_RETRY_OPTIONS.maxAttempts;attempt++)try{attempt>0&&(yield{type:StreamEventType.RETRY});let stream$8=await self$1.makeApiCallAndProcessStream(requestContents,params,prompt_id,userContent);for await(let chunk$1 of stream$8)yield{type:StreamEventType.CHUNK,value:chunk$1};lastError=null;break}catch(error$22){lastError=error$22;let isContentError=error$22 instanceof EmptyStreamError;if(isContentError&&attempt<INVALID_CONTENT_RETRY_OPTIONS.maxAttempts-1){logContentRetry(self$1.config,new ContentRetryEvent(attempt,`EmptyStreamError`,INVALID_CONTENT_RETRY_OPTIONS.initialDelayMs)),await new Promise(res=>setTimeout(res,INVALID_CONTENT_RETRY_OPTIONS.initialDelayMs*(attempt+1)));continue}break}if(lastError)throw lastError instanceof EmptyStreamError&&logContentRetryFailure(self$1.config,new ContentRetryFailureEvent(INVALID_CONTENT_RETRY_OPTIONS.maxAttempts,`EmptyStreamError`)),self$1.history[self$1.history.length-1]===userContent&&self$1.history.pop(),lastError}finally{streamDoneResolver()}})()}async makeApiCallAndProcessStream(requestContents,params,prompt_id,userContent){let currentAttemptModel,apiCall=()=>{let modelToUse=this.config.isInFallbackMode()?DEFAULT_GEMINI_FLASH_MODEL:this.config.getModel();if(currentAttemptModel=modelToUse,this.config.getQuotaErrorOccurred()&&modelToUse===DEFAULT_GEMINI_FLASH_MODEL)throw Error(`Please submit a new query to continue with the Flash model.`);return this.config.getContentGenerator().generateContentStream({model:modelToUse,contents:requestContents,config:{...this.generationConfig,...params.config}},prompt_id)},onPersistent429Callback=async(authType,error$22)=>currentAttemptModel?await handleFallback(this.config,currentAttemptModel,authType,error$22):null,streamResponse=await retryWithBackoff(apiCall,{shouldRetry:error$22=>{if(error$22 instanceof Error&&error$22.message){if(isSchemaDepthError(error$22.message))return!1;if(error$22.message.includes(`429`)||error$22.message.match(/5\d{2}/))return!0}return!1},onPersistent429:onPersistent429Callback,authType:this.config.getContentGeneratorConfig()?.authType});return this.processStreamResponse(streamResponse,userContent)}getHistory(curated=!1){let history=curated?extractCuratedHistory(this.history):this.history;return structuredClone(history)}clearHistory(){this.history=[]}addHistory(content){this.history.push(content)}setHistory(history){this.history=history}stripThoughtsFromHistory(){this.history=this.history.map(content=>{let newContent={...content};return newContent.parts&&(newContent.parts=newContent.parts.map(part=>{if(part&&typeof part==`object`&&`thoughtSignature`in part){let newPart={...part};return delete newPart.thoughtSignature,newPart}return part})),newContent})}setTools(tools$1){this.generationConfig.tools=tools$1}async maybeIncludeSchemaDepthContext(error$22){if(isSchemaDepthError(error$22.message)||isInvalidArgumentError(error$22.message)){let tools$1=this.config.getToolRegistry().getAllTools(),cyclicSchemaTools=[];for(let tool$1 of tools$1)(tool$1.schema.parametersJsonSchema&&hasCycleInSchema(tool$1.schema.parametersJsonSchema)||tool$1.schema.parameters&&hasCycleInSchema(tool$1.schema.parameters))&&cyclicSchemaTools.push(tool$1.displayName);if(cyclicSchemaTools.length>0){let extraDetails=`
1455
+ 3. **Waiting for User:** If your last response completed a thought, statement, or task *and* does not meet the criteria for Rule 1 (Model Continues) or Rule 2 (Question to User), it implies a pause expecting user input or reaction. In this case, the **'user'** should speak next.`}]}];try{let parsedResponse=await geminiClient.generateJson(contents,RESPONSE_SCHEMA,abortSignal,DEFAULT_GEMINI_FLASH_MODEL);return parsedResponse&&parsedResponse.next_speaker&&[`user`,`model`].includes(parsedResponse.next_speaker)?parsedResponse:null}catch(error$22){return console.warn(`Failed to talk to Gemini endpoint when seeing if conversation should continue.`,error$22),null}}var require_levenshtein=__commonJSMin(((exports,module)=>{(function(){var collator;try{collator=typeof Intl<`u`&&Intl.Collator!==void 0?Intl.Collator(`generic`,{sensitivity:`base`}):null}catch(err){console.log(`Collator could not be initialized and wouldn't be used`)}var prevRow=[],str2Char=[],Levenshtein={get:function(str1,str2,options$1){var useCollator=options$1&&collator&&options$1.useCollator,str1Len=str1.length,str2Len=str2.length;if(str1Len===0)return str2Len;if(str2Len===0)return str1Len;var curCol,nextCol,i$4,j$2,tmp;for(i$4=0;i$4<str2Len;++i$4)prevRow[i$4]=i$4,str2Char[i$4]=str2.charCodeAt(i$4);prevRow[str2Len]=str2Len;var strCmp;if(useCollator)for(i$4=0;i$4<str1Len;++i$4){for(nextCol=i$4+1,j$2=0;j$2<str2Len;++j$2)curCol=nextCol,strCmp=collator.compare(str1.charAt(i$4),String.fromCharCode(str2Char[j$2]))===0,nextCol=prevRow[j$2]+(strCmp?0:1),tmp=curCol+1,nextCol>tmp&&(nextCol=tmp),tmp=prevRow[j$2+1]+1,nextCol>tmp&&(nextCol=tmp),prevRow[j$2]=curCol;prevRow[j$2]=nextCol}else for(i$4=0;i$4<str1Len;++i$4){for(nextCol=i$4+1,j$2=0;j$2<str2Len;++j$2)curCol=nextCol,strCmp=str1.charCodeAt(i$4)===str2Char[j$2],nextCol=prevRow[j$2]+(strCmp?0:1),tmp=curCol+1,nextCol>tmp&&(nextCol=tmp),tmp=prevRow[j$2+1]+1,nextCol>tmp&&(nextCol=tmp),prevRow[j$2]=curCol;prevRow[j$2]=nextCol}return nextCol}};typeof define<`u`&&define!==null&&define.amd?define(function(){return Levenshtein}):module!=null&&exports!==void 0&&module.exports===exports?module.exports=Levenshtein:typeof self<`u`&&typeof self.postMessage==`function`&&typeof self.importScripts==`function`?self.Levenshtein=Levenshtein:typeof window<`u`&&window!==null&&(window.Levenshtein=Levenshtein)})()})),import_levenshtein=__toESM(require_levenshtein(),1),ChatRecordingService=class{conversationFile=null;cachedLastConvData=null;sessionId;projectHash;queuedThoughts=[];queuedTokens=null;config;constructor(config){this.config=config,this.sessionId=config.getSessionId(),this.projectHash=getProjectHash(config.getProjectRoot())}initialize(resumedSessionData){try{if(resumedSessionData)this.conversationFile=resumedSessionData.filePath,this.sessionId=resumedSessionData.conversation.sessionId,this.updateConversation(conversation=>{conversation.sessionId=this.sessionId}),this.cachedLastConvData=null;else{let chatsDir=path.join(this.config.storage.getProjectTempDir(),`chats`);fs.mkdirSync(chatsDir,{recursive:!0});let timestamp=new Date().toISOString().slice(0,16).replace(/:/g,`-`),filename=`session-${timestamp}-${this.sessionId.slice(0,8)}.json`;this.conversationFile=path.join(chatsDir,filename),this.writeConversation({sessionId:this.sessionId,projectHash:this.projectHash,startTime:new Date().toISOString(),lastUpdated:new Date().toISOString(),messages:[]})}this.queuedThoughts=[],this.queuedTokens=null}catch(error$22){throw console.error(`Error initializing chat recording service:`,error$22),error$22}}getLastMessage(conversation){return conversation.messages.at(-1)}newMessage(type,content){return{id:randomUUID$1(),timestamp:new Date().toISOString(),type,content}}recordMessage(message){if(this.conversationFile)try{this.updateConversation(conversation=>{let msg=this.newMessage(message.type,message.content);msg.type===`gemini`?(conversation.messages.push({...msg,thoughts:this.queuedThoughts,tokens:this.queuedTokens,model:this.config.getModel()}),this.queuedThoughts=[],this.queuedTokens=null):conversation.messages.push(msg)})}catch(error$22){throw console.error(`Error saving message:`,error$22),error$22}}recordThought(thought){if(this.conversationFile)try{this.queuedThoughts.push({...thought,timestamp:new Date().toISOString()})}catch(error$22){throw console.error(`Error saving thought:`,error$22),error$22}}recordMessageTokens(respUsageMetadata){if(this.conversationFile)try{let tokens={input:respUsageMetadata.promptTokenCount??0,output:respUsageMetadata.candidatesTokenCount??0,cached:respUsageMetadata.cachedContentTokenCount??0,thoughts:respUsageMetadata.thoughtsTokenCount??0,tool:respUsageMetadata.toolUsePromptTokenCount??0,total:respUsageMetadata.totalTokenCount??0};this.updateConversation(conversation=>{let lastMsg=this.getLastMessage(conversation);lastMsg&&lastMsg.type===`gemini`&&!lastMsg.tokens?(lastMsg.tokens=tokens,this.queuedTokens=null):this.queuedTokens=tokens})}catch(error$22){throw console.error(`Error updating message tokens:`,error$22),error$22}}recordToolCalls(toolCalls){if(!this.conversationFile)return;let toolRegistry=this.config.getToolRegistry(),enrichedToolCalls=toolCalls.map(toolCall=>{let toolInstance=toolRegistry.getTool(toolCall.name);return{...toolCall,displayName:toolInstance?.displayName||toolCall.name,description:toolInstance?.description||``,renderOutputAsMarkdown:toolInstance?.isOutputMarkdown||!1}});try{this.updateConversation(conversation=>{let lastMsg=this.getLastMessage(conversation);if(!lastMsg||lastMsg.type!==`gemini`||this.queuedThoughts.length>0){let newMsg={...this.newMessage(`gemini`,``),type:`gemini`,toolCalls:enrichedToolCalls,thoughts:this.queuedThoughts,model:this.config.getModel()};this.queuedThoughts.length>0&&(newMsg.thoughts=this.queuedThoughts,this.queuedThoughts=[]),this.queuedTokens&&(newMsg.tokens=this.queuedTokens,this.queuedTokens=null),conversation.messages.push(newMsg)}else{lastMsg.toolCalls||(lastMsg.toolCalls=[]),lastMsg.toolCalls=lastMsg.toolCalls.map(toolCall=>{let incomingToolCall=toolCalls.find(tc=>tc.id===toolCall.id);return incomingToolCall?{...toolCall,...incomingToolCall}:toolCall});for(let toolCall of enrichedToolCalls){let existingToolCall=lastMsg.toolCalls.find(tc=>tc.id===toolCall.id);existingToolCall||lastMsg.toolCalls.push(toolCall)}}})}catch(error$22){throw console.error(`Error adding tool call to message:`,error$22),error$22}}readConversation(){try{return this.cachedLastConvData=fs.readFileSync(this.conversationFile,`utf8`),JSON.parse(this.cachedLastConvData)}catch(error$22){if(error$22.code!==`ENOENT`)throw console.error(`Error reading conversation file:`,error$22),error$22;return{sessionId:this.sessionId,projectHash:this.projectHash,startTime:new Date().toISOString(),lastUpdated:new Date().toISOString(),messages:[]}}}writeConversation(conversation){try{if(!this.conversationFile||conversation.messages.length===0)return;if(this.cachedLastConvData!==JSON.stringify(conversation,null,2)){conversation.lastUpdated=new Date().toISOString();let newContent=JSON.stringify(conversation,null,2);this.cachedLastConvData=newContent,fs.writeFileSync(this.conversationFile,newContent)}}catch(error$22){throw console.error(`Error writing conversation file:`,error$22),error$22}}updateConversation(updateFn){let conversation=this.readConversation();updateFn(conversation),this.writeConversation(conversation)}deleteSession(sessionId$1){try{let chatsDir=path.join(this.config.storage.getProjectTempDir(),`chats`),sessionPath=path.join(chatsDir,`${sessionId$1}.json`);fs.unlinkSync(sessionPath)}catch(error$22){throw console.error(`Error deleting session:`,error$22),error$22}}},TelemetryTarget;(function(TelemetryTarget$1){TelemetryTarget$1.GCP=`gcp`,TelemetryTarget$1.LOCAL=`local`})(TelemetryTarget||(TelemetryTarget={}));const DEFAULT_TELEMETRY_TARGET=TelemetryTarget.LOCAL,DEFAULT_OTLP_ENDPOINT=`http://localhost:4317`;async function handleFallback(config,failedModel,authType,error$22){if(authType!==AuthType.LOGIN_WITH_GOOGLE)return null;let fallbackModel=DEFAULT_GEMINI_FLASH_MODEL;if(failedModel===fallbackModel)return null;let fallbackModelHandler=config.fallbackModelHandler;if(typeof fallbackModelHandler!=`function`)return null;try{let intent=await fallbackModelHandler(failedModel,fallbackModel,error$22);switch(intent){case`retry`:return activateFallbackMode(config,authType),!0;case`stop`:return activateFallbackMode(config,authType),!1;case`auth`:return!1;default:throw Error(`Unexpected fallback intent received from fallbackModelHandler: "${intent}"`)}}catch(handlerError){return console.error(`Fallback UI handler failed:`,handlerError),null}}function activateFallbackMode(config,authType){config.isInFallbackMode()||(config.setFallbackMode(!0),authType&&logFlashFallback(config,new FlashFallbackEvent(authType)))}function partListUnionToString(value){return partToString(value,{verbose:!0})}var StreamEventType;(function(StreamEventType$1){StreamEventType$1.CHUNK=`chunk`,StreamEventType$1.RETRY=`retry`})(StreamEventType||(StreamEventType={}));const INVALID_CONTENT_RETRY_OPTIONS={maxAttempts:3,initialDelayMs:500};function isValidResponse(response){if(response.candidates===void 0||response.candidates.length===0)return!1;let content=response.candidates[0]?.content;return content===void 0?!1:isValidContent(content)}function isValidContent(content){if(content.parts===void 0||content.parts.length===0)return!1;for(let part of content.parts)if(part===void 0||Object.keys(part).length===0||!part.thought&&part.text!==void 0&&part.text===``)return!1;return!0}function validateHistory(history){for(let content of history)if(content.role!==`user`&&content.role!==`model`)throw Error(`Role must be user or model, but got ${content.role}.`)}function extractCuratedHistory(comprehensiveHistory){if(comprehensiveHistory===void 0||comprehensiveHistory.length===0)return[];let curatedHistory=[],length=comprehensiveHistory.length,i$4=0;for(;i$4<length;)if(comprehensiveHistory[i$4].role===`user`)curatedHistory.push(comprehensiveHistory[i$4]),i$4++;else{let modelOutput=[],isValid=!0;for(;i$4<length&&comprehensiveHistory[i$4].role===`model`;)modelOutput.push(comprehensiveHistory[i$4]),isValid&&!isValidContent(comprehensiveHistory[i$4])&&(isValid=!1),i$4++;isValid&&curatedHistory.push(...modelOutput)}return curatedHistory}var EmptyStreamError=class extends Error{constructor(message){super(message),this.name=`EmptyStreamError`}},GeminiChat=class{config;generationConfig;history;sendPromise=Promise.resolve();chatRecordingService;constructor(config,generationConfig={},history=[]){this.config=config,this.generationConfig=generationConfig,this.history=history,validateHistory(history),this.chatRecordingService=new ChatRecordingService(config),this.chatRecordingService.initialize()}setSystemInstruction(sysInstr){this.generationConfig.systemInstruction=sysInstr}async sendMessageStream(params,prompt_id){await this.sendPromise;let streamDoneResolver,streamDonePromise=new Promise(resolve$9=>{streamDoneResolver=resolve$9});this.sendPromise=streamDonePromise;let userContent=createUserContent(params.message);if(!isFunctionResponse(userContent)){let userMessage=Array.isArray(params.message)?params.message:[params.message],userMessageContent=partListUnionToString(toParts(userMessage));this.chatRecordingService.recordMessage({type:`user`,content:userMessageContent})}this.history.push(userContent);let requestContents=this.getHistory(!0),self$1=this;return(async function*(){try{let lastError=Error(`Request failed after all retries.`);for(let attempt=0;attempt<INVALID_CONTENT_RETRY_OPTIONS.maxAttempts;attempt++)try{attempt>0&&(yield{type:StreamEventType.RETRY});let stream$8=await self$1.makeApiCallAndProcessStream(requestContents,params,prompt_id,userContent);for await(let chunk$1 of stream$8)yield{type:StreamEventType.CHUNK,value:chunk$1};lastError=null;break}catch(error$22){lastError=error$22;let isContentError=error$22 instanceof EmptyStreamError;if(isContentError&&attempt<INVALID_CONTENT_RETRY_OPTIONS.maxAttempts-1){logContentRetry(self$1.config,new ContentRetryEvent(attempt,`EmptyStreamError`,INVALID_CONTENT_RETRY_OPTIONS.initialDelayMs)),await new Promise(res=>setTimeout(res,INVALID_CONTENT_RETRY_OPTIONS.initialDelayMs*(attempt+1)));continue}break}if(lastError)throw lastError instanceof EmptyStreamError&&logContentRetryFailure(self$1.config,new ContentRetryFailureEvent(INVALID_CONTENT_RETRY_OPTIONS.maxAttempts,`EmptyStreamError`)),self$1.history[self$1.history.length-1]===userContent&&self$1.history.pop(),lastError}finally{streamDoneResolver()}})()}async makeApiCallAndProcessStream(requestContents,params,prompt_id,userContent){let currentAttemptModel,apiCall=()=>{let modelToUse=this.config.isInFallbackMode()?DEFAULT_GEMINI_FLASH_MODEL:this.config.getModel();if(currentAttemptModel=modelToUse,this.config.getQuotaErrorOccurred()&&modelToUse===DEFAULT_GEMINI_FLASH_MODEL)throw Error(`Please submit a new query to continue with the Flash model.`);return this.config.getContentGenerator().generateContentStream({model:modelToUse,contents:requestContents,config:{...this.generationConfig,...params.config}},prompt_id)},onPersistent429Callback=async(authType,error$22)=>currentAttemptModel?await handleFallback(this.config,currentAttemptModel,authType,error$22):null,streamResponse=await retryWithBackoff(apiCall,{shouldRetry:error$22=>{if(error$22 instanceof Error&&error$22.message){if(isSchemaDepthError(error$22.message))return!1;if(error$22.message.includes(`429`)||error$22.message.match(/5\d{2}/))return!0}return!1},onPersistent429:onPersistent429Callback,authType:this.config.getContentGeneratorConfig()?.authType});return this.processStreamResponse(streamResponse,userContent)}getHistory(curated=!1){let history=curated?extractCuratedHistory(this.history):this.history;return structuredClone(history)}clearHistory(){this.history=[]}addHistory(content){this.history.push(content)}setHistory(history){this.history=history}stripThoughtsFromHistory(){this.history=this.history.map(content=>{let newContent={...content};return newContent.parts&&(newContent.parts=newContent.parts.map(part=>{if(part&&typeof part==`object`&&`thoughtSignature`in part){let newPart={...part};return delete newPart.thoughtSignature,newPart}return part})),newContent})}setTools(tools$1){this.generationConfig.tools=tools$1}async maybeIncludeSchemaDepthContext(error$22){if(isSchemaDepthError(error$22.message)||isInvalidArgumentError(error$22.message)){let tools$1=this.config.getToolRegistry().getAllTools(),cyclicSchemaTools=[];for(let tool$1 of tools$1)(tool$1.schema.parametersJsonSchema&&hasCycleInSchema(tool$1.schema.parametersJsonSchema)||tool$1.schema.parameters&&hasCycleInSchema(tool$1.schema.parameters))&&cyclicSchemaTools.push(tool$1.displayName);if(cyclicSchemaTools.length>0){let extraDetails=`
1462
1456
 
1463
1457
  This error was probably caused by cyclic schema references in one of the following tools, try disabling them with excludeTools:
1464
1458
 
package/dist/cli/index.js CHANGED
@@ -17,6 +17,6 @@ Expecting one of '${n.join(`', '`)}'`);return this._lifeCycleHooks[e]?this._life
17
17
  - if the default executable name is not suitable, use the executableFile option to supply a custom name or path
18
18
  - ${r}`;throw Error(i)}_executeSubCommand(e,t){t=t.slice();let n=!1,s=[`.js`,`.ts`,`.tsx`,`.mjs`,`.cjs`];function c(e,t){let n=i.resolve(e,t);if(a.existsSync(n))return n;if(s.includes(i.extname(t)))return;let r=s.find(e=>a.existsSync(`${n}${e}`));if(r)return`${n}${r}`}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let u=e._executableFile||`${this._name}-${e._name}`,d=this._executableDir||``;if(this._scriptPath){let e;try{e=a.realpathSync(this._scriptPath)}catch{e=this._scriptPath}d=i.resolve(i.dirname(e),d)}if(d){let t=c(d,u);if(!t&&!e._executableFile&&this._scriptPath){let n=i.basename(this._scriptPath,i.extname(this._scriptPath));n!==this._name&&(t=c(d,`${n}-${e._name}`))}u=t||u}n=s.includes(i.extname(u));let f;if(o.platform===`win32`?(this._checkForMissingExecutable(u,d,e._name),t.unshift(u),t=g(o.execArgv).concat(t),f=r.spawn(o.execPath,t,{stdio:`inherit`})):n?(t.unshift(u),t=g(o.execArgv).concat(t),f=r.spawn(o.argv[0],t,{stdio:`inherit`})):f=r.spawn(u,t,{stdio:`inherit`}),!f.killed){let e=[`SIGUSR1`,`SIGUSR2`,`SIGTERM`,`SIGINT`,`SIGHUP`];e.forEach(e=>{o.on(e,()=>{f.killed===!1&&f.exitCode===null&&f.kill(e)})})}let p=this._exitCallback;f.on(`close`,e=>{e=e??1,p?p(new l(e,`commander.executeSubCommandAsync`,`(close)`)):o.exit(e)}),f.on(`error`,t=>{if(t.code===`ENOENT`)this._checkForMissingExecutable(u,d,e._name);else if(t.code===`EACCES`)throw Error(`'${u}' not executable`);if(!p)o.exit(1);else{let e=new l(1,`commander.executeSubCommandAsync`,`(error)`);e.nestedError=t,p(e)}}),this.runningCommand=f}_dispatchSubcommand(e,t,n){let r=this._findCommand(e);r||this.help({error:!0}),r._prepareForParse();let i;return i=this._chainOrCallSubCommandHook(i,r,`preSubcommand`),i=this._chainOrCall(i,()=>{if(r._executableHandler)this._executeSubCommand(r,t.concat(n));else return r._parseCommand(t,n)}),i}_dispatchHelpCommand(e){e||this.help();let t=this._findCommand(e);return t&&!t._executableHandler&&t.help(),this._dispatchSubcommand(e,[],[this._getHelpOption()?.long??this._getHelpOption()?.short??`--help`])}_checkNumberOfArguments(){this.registeredArguments.forEach((e,t)=>{e.required&&this.args[t]==null&&this.missingArgument(e.name())}),!(this.registeredArguments.length>0&&this.registeredArguments[this.registeredArguments.length-1].variadic)&&this.args.length>this.registeredArguments.length&&this._excessArguments(this.args)}_processArguments(){let e=(e,t,n)=>{let r=t;if(t!==null&&e.parseArg){let i=`error: command-argument value '${t}' is invalid for argument '${e.name()}'.`;r=this._callParseArg(e,t,n,i)}return r};this._checkNumberOfArguments();let t=[];this.registeredArguments.forEach((n,r)=>{let i=n.defaultValue;n.variadic?r<this.args.length?(i=this.args.slice(r),n.parseArg&&(i=i.reduce((t,r)=>e(n,r,t),n.defaultValue))):i===void 0&&(i=[]):r<this.args.length&&(i=this.args[r],n.parseArg&&(i=e(n,i,n.defaultValue))),t[r]=i}),this.processedArgs=t}_chainOrCall(e,t){return e&&e.then&&typeof e.then==`function`?e.then(()=>t()):t()}_chainOrCallHooks(e,t){let n=e,r=[];return this._getCommandAndAncestors().reverse().filter(e=>e._lifeCycleHooks[t]!==void 0).forEach(e=>{e._lifeCycleHooks[t].forEach(t=>{r.push({hookedCommand:e,callback:t})})}),t===`postAction`&&r.reverse(),r.forEach(e=>{n=this._chainOrCall(n,()=>e.callback(e.hookedCommand,this))}),n}_chainOrCallSubCommandHook(e,t,n){let r=e;return this._lifeCycleHooks[n]!==void 0&&this._lifeCycleHooks[n].forEach(e=>{r=this._chainOrCall(r,()=>e(this,t))}),r}_parseCommand(e,t){let n=this.parseOptions(t);if(this._parseOptionsEnv(),this._parseOptionsImplied(),e=e.concat(n.operands),t=n.unknown,this.args=e.concat(t),e&&this._findCommand(e[0]))return this._dispatchSubcommand(e[0],e.slice(1),t);if(this._getHelpCommand()&&e[0]===this._getHelpCommand().name())return this._dispatchHelpCommand(e[1]);if(this._defaultCommandName)return this._outputHelpIfRequested(t),this._dispatchSubcommand(this._defaultCommandName,e,t);this.commands.length&&this.args.length===0&&!this._actionHandler&&!this._defaultCommandName&&this.help({error:!0}),this._outputHelpIfRequested(n.unknown),this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let r=()=>{n.unknown.length>0&&this.unknownOption(n.unknown[0])},i=`command:${this.name()}`;if(this._actionHandler){r(),this._processArguments();let n;return n=this._chainOrCallHooks(n,`preAction`),n=this._chainOrCall(n,()=>this._actionHandler(this.processedArgs)),this.parent&&(n=this._chainOrCall(n,()=>{this.parent.emit(i,e,t)})),n=this._chainOrCallHooks(n,`postAction`),n}if(this.parent&&this.parent.listenerCount(i))r(),this._processArguments(),this.parent.emit(i,e,t);else if(e.length){if(this._findCommand(`*`))return this._dispatchSubcommand(`*`,e,t);this.listenerCount(`command:*`)?this.emit(`command:*`,e,t):this.commands.length?this.unknownCommand():(r(),this._processArguments())}else this.commands.length?(r(),this.help({error:!0})):(r(),this._processArguments())}_findCommand(e){if(e)return this.commands.find(t=>t._name===e||t._aliases.includes(e))}_findOption(e){return this.options.find(t=>t.is(e))}_checkForMissingMandatoryOptions(){this._getCommandAndAncestors().forEach(e=>{e.options.forEach(t=>{t.mandatory&&e.getOptionValue(t.attributeName())===void 0&&e.missingMandatoryOptionValue(t)})})}_checkForConflictingLocalOptions(){let e=this.options.filter(e=>{let t=e.attributeName();return this.getOptionValue(t)===void 0?!1:this.getOptionValueSource(t)!==`default`}),t=e.filter(e=>e.conflictsWith.length>0);t.forEach(t=>{let n=e.find(e=>t.conflictsWith.includes(e.attributeName()));n&&this._conflictingOption(t,n)})}_checkForConflictingOptions(){this._getCommandAndAncestors().forEach(e=>{e._checkForConflictingLocalOptions()})}parseOptions(e){let t=[],n=[],r=t,i=e.slice();function a(e){return e.length>1&&e[0]===`-`}let o=e=>/^-\d*\.?\d+(e[+-]?\d+)?$/.test(e)?!this._getCommandAndAncestors().some(e=>e.options.map(e=>e.short).some(e=>/^-\d$/.test(e))):!1,s=null;for(;i.length;){let e=i.shift();if(e===`--`){r===n&&r.push(e),r.push(...i);break}if(s&&(!a(e)||o(e))){this.emit(`option:${s.name()}`,e);continue}if(s=null,a(e)){let t=this._findOption(e);if(t){if(t.required){let e=i.shift();e===void 0&&this.optionMissingArgument(t),this.emit(`option:${t.name()}`,e)}else if(t.optional){let e=null;i.length>0&&(!a(i[0])||o(i[0]))&&(e=i.shift()),this.emit(`option:${t.name()}`,e)}else this.emit(`option:${t.name()}`);s=t.variadic?t:null;continue}}if(e.length>2&&e[0]===`-`&&e[1]!==`-`){let t=this._findOption(`-${e[1]}`);if(t){t.required||t.optional&&this._combineFlagAndOptionalValue?this.emit(`option:${t.name()}`,e.slice(2)):(this.emit(`option:${t.name()}`),i.unshift(`-${e.slice(2)}`));continue}}if(/^--[^=]+=/.test(e)){let t=e.indexOf(`=`),n=this._findOption(e.slice(0,t));if(n&&(n.required||n.optional)){this.emit(`option:${n.name()}`,e.slice(t+1));continue}}if(r===t&&a(e)&&!(this.commands.length===0&&o(e))&&(r=n),(this._enablePositionalOptions||this._passThroughOptions)&&t.length===0&&n.length===0){if(this._findCommand(e)){t.push(e),i.length>0&&n.push(...i);break}else if(this._getHelpCommand()&&e===this._getHelpCommand().name()){t.push(e),i.length>0&&t.push(...i);break}else if(this._defaultCommandName){n.push(e),i.length>0&&n.push(...i);break}}if(this._passThroughOptions){r.push(e),i.length>0&&r.push(...i);break}r.push(e)}return{operands:t,unknown:n}}opts(){if(this._storeOptionsAsProperties){let e={},t=this.options.length;for(let n=0;n<t;n++){let t=this.options[n].attributeName();e[t]=t===this._versionOptionName?this._version:this[t]}return e}return this._optionValues}optsWithGlobals(){return this._getCommandAndAncestors().reduce((e,t)=>Object.assign(e,t.opts()),{})}error(e,t){this._outputConfiguration.outputError(`${e}\n`,this._outputConfiguration.writeErr),typeof this._showHelpAfterError==`string`?this._outputConfiguration.writeErr(`${this._showHelpAfterError}\n`):this._showHelpAfterError&&(this._outputConfiguration.writeErr(`
19
19
  `),this.outputHelp({error:!0}));let n=t||{},r=n.exitCode||1,i=n.code||`commander.error`;this._exit(r,i,e)}_parseOptionsEnv(){this.options.forEach(e=>{if(e.envVar&&e.envVar in o.env){let t=e.attributeName();(this.getOptionValue(t)===void 0||[`default`,`config`,`env`].includes(this.getOptionValueSource(t)))&&(e.required||e.optional?this.emit(`optionEnv:${e.name()}`,o.env[e.envVar]):this.emit(`optionEnv:${e.name()}`))}})}_parseOptionsImplied(){let e=new p(this.options),t=e=>this.getOptionValue(e)!==void 0&&![`default`,`implied`].includes(this.getOptionValueSource(e));this.options.filter(n=>n.implied!==void 0&&t(n.attributeName())&&e.valueFromOption(this.getOptionValue(n.attributeName()),n)).forEach(e=>{Object.keys(e.implied).filter(e=>!t(e)).forEach(t=>{this.setOptionValueWithSource(t,e.implied[t],`implied`)})})}missingArgument(e){let t=`error: missing required argument '${e}'`;this.error(t,{code:`commander.missingArgument`})}optionMissingArgument(e){let t=`error: option '${e.flags}' argument missing`;this.error(t,{code:`commander.optionMissingArgument`})}missingMandatoryOptionValue(e){let t=`error: required option '${e.flags}' not specified`;this.error(t,{code:`commander.missingMandatoryOptionValue`})}_conflictingOption(e,t){let n=e=>{let t=e.attributeName(),n=this.getOptionValue(t),r=this.options.find(e=>e.negate&&t===e.attributeName()),i=this.options.find(e=>!e.negate&&t===e.attributeName());return r&&(r.presetArg===void 0&&n===!1||r.presetArg!==void 0&&n===r.presetArg)?r:i||e},r=e=>{let t=n(e),r=t.attributeName(),i=this.getOptionValueSource(r);return i===`env`?`environment variable '${t.envVar}'`:`option '${t.flags}'`},i=`error: ${r(e)} cannot be used with ${r(t)}`;this.error(i,{code:`commander.conflictingOption`})}unknownOption(e){if(this._allowUnknownOption)return;let t=``;if(e.startsWith(`--`)&&this._showSuggestionAfterError){let n=[],r=this;do{let e=r.createHelp().visibleOptions(r).filter(e=>e.long).map(e=>e.long);n=n.concat(e),r=r.parent}while(r&&!r._enablePositionalOptions);t=m(e,n)}let n=`error: unknown option '${e}'${t}`;this.error(n,{code:`commander.unknownOption`})}_excessArguments(e){if(this._allowExcessArguments)return;let t=this.registeredArguments.length,n=t===1?``:`s`,r=this.parent?` for '${this.name()}'`:``,i=`error: too many arguments${r}. Expected ${t} argument${n} but got ${e.length}.`;this.error(i,{code:`commander.excessArguments`})}unknownCommand(){let e=this.args[0],t=``;if(this._showSuggestionAfterError){let n=[];this.createHelp().visibleCommands(this).forEach(e=>{n.push(e.name()),e.alias()&&n.push(e.alias())}),t=m(e,n)}let n=`error: unknown command '${e}'${t}`;this.error(n,{code:`commander.unknownCommand`})}version(e,t,n){if(e===void 0)return this._version;this._version=e,t=t||`-V, --version`,n=n||`output the version number`;let r=this.createOption(t,n);return this._versionOptionName=r.attributeName(),this._registerOption(r),this.on(`option:`+r.name(),()=>{this._outputConfiguration.writeOut(`${e}\n`),this._exit(0,`commander.version`,e)}),this}description(e,t){return e===void 0&&t===void 0?this._description:(this._description=e,t&&(this._argsDescription=t),this)}summary(e){return e===void 0?this._summary:(this._summary=e,this)}alias(e){if(e===void 0)return this._aliases[0];let t=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler&&(t=this.commands[this.commands.length-1]),e===t._name)throw Error(`Command alias can't be the same as its name`);let n=this.parent?._findCommand(e);if(n){let t=[n.name()].concat(n.aliases()).join(`|`);throw Error(`cannot add alias '${e}' to command '${this.name()}' as already have command '${t}'`)}return t._aliases.push(e),this}aliases(e){return e===void 0?this._aliases:(e.forEach(e=>this.alias(e)),this)}usage(e){if(e===void 0){if(this._usage)return this._usage;let e=this.registeredArguments.map(e=>c(e));return[].concat(this.options.length||this._helpOption!==null?`[options]`:[],this.commands.length?`[command]`:[],this.registeredArguments.length?e:[]).join(` `)}return this._usage=e,this}name(e){return e===void 0?this._name:(this._name=e,this)}helpGroup(e){return e===void 0?this._helpGroupHeading??``:(this._helpGroupHeading=e,this)}commandsGroup(e){return e===void 0?this._defaultCommandGroup??``:(this._defaultCommandGroup=e,this)}optionsGroup(e){return e===void 0?this._defaultOptionGroup??``:(this._defaultOptionGroup=e,this)}_initOptionGroup(e){this._defaultOptionGroup&&!e.helpGroupHeading&&e.helpGroup(this._defaultOptionGroup)}_initCommandGroup(e){this._defaultCommandGroup&&!e.helpGroup()&&e.helpGroup(this._defaultCommandGroup)}nameFromFilename(e){return this._name=i.basename(e,i.extname(e)),this}executableDir(e){return e===void 0?this._executableDir:(this._executableDir=e,this)}helpInformation(e){let t=this.createHelp(),n=this._getOutputContext(e);t.prepareContext({error:n.error,helpWidth:n.helpWidth,outputHasColors:n.hasColors});let r=t.formatHelp(this,t);return n.hasColors?r:this._outputConfiguration.stripColor(r)}_getOutputContext(e){e=e||{};let t=!!e.error,n,r,i;t?(n=e=>this._outputConfiguration.writeErr(e),r=this._outputConfiguration.getErrHasColors(),i=this._outputConfiguration.getErrHelpWidth()):(n=e=>this._outputConfiguration.writeOut(e),r=this._outputConfiguration.getOutHasColors(),i=this._outputConfiguration.getOutHelpWidth());let a=e=>(r||(e=this._outputConfiguration.stripColor(e)),n(e));return{error:t,write:a,hasColors:r,helpWidth:i}}outputHelp(e){let t;typeof e==`function`&&(t=e,e=void 0);let n=this._getOutputContext(e),r={error:n.error,write:n.write,command:this};this._getCommandAndAncestors().reverse().forEach(e=>e.emit(`beforeAllHelp`,r)),this.emit(`beforeHelp`,r);let i=this.helpInformation({error:n.error});if(t&&(i=t(i),typeof i!=`string`&&!Buffer.isBuffer(i)))throw Error(`outputHelp callback must return a string or a Buffer`);n.write(i),this._getHelpOption()?.long&&this.emit(this._getHelpOption().long),this.emit(`afterHelp`,r),this._getCommandAndAncestors().forEach(e=>e.emit(`afterAllHelp`,r))}helpOption(e,t){return typeof e==`boolean`?(e?(this._helpOption===null&&(this._helpOption=void 0),this._defaultOptionGroup&&this._initOptionGroup(this._getHelpOption())):this._helpOption=null,this):(this._helpOption=this.createOption(e??`-h, --help`,t??`display help for command`),(e||t)&&this._initOptionGroup(this._helpOption),this)}_getHelpOption(){return this._helpOption===void 0&&this.helpOption(void 0,void 0),this._helpOption}addHelpOption(e){return this._helpOption=e,this._initOptionGroup(e),this}help(e){this.outputHelp(e);let t=Number(o.exitCode??0);t===0&&e&&typeof e!=`function`&&e.error&&(t=1),this._exit(t,`commander.help`,`(outputHelp)`)}addHelpText(e,t){let n=[`beforeAll`,`before`,`after`,`afterAll`];if(!n.includes(e))throw Error(`Unexpected value for position to addHelpText.
20
- Expecting one of '${n.join(`', '`)}'`);let r=`${e}Help`;return this.on(r,e=>{let n;n=typeof t==`function`?t({error:e.error,command:e.command}):t,n&&e.write(`${n}\n`)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption(),n=t&&e.find(e=>t.is(e));n&&(this.outputHelp(),this._exit(0,`commander.helpDisplayed`,`(outputHelp)`))}};function g(e){return e.map(e=>{if(!e.startsWith(`--inspect`))return e;let t,n=`127.0.0.1`,r=`9229`,i;return(i=e.match(/^(--inspect(-brk)?)$/))===null?(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))===null?(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(t=i[1],n=i[3],r=i[4]):(t=i[1],/^\d+$/.test(i[3])?r=i[3]:n=i[3]):t=i[1],t&&r!==`0`?`${t}=${n}:${parseInt(r)+1}`:e})}function _(){if(o.env.NO_COLOR||o.env.FORCE_COLOR===`0`||o.env.FORCE_COLOR===`false`)return!1;if(o.env.FORCE_COLOR||o.env.CLICOLOR_FORCE!==void 0)return!0}exports.Command=h,exports.useColor=_})),k=e((exports=>{let{Argument:t}=w(),{Command:n}=O(),{CommanderError:r,InvalidArgumentError:i}=C(),{Help:a}=T(),{Option:o}=E();exports.program=new n,exports.createCommand=e=>new n(e),exports.createOption=(e,t)=>new o(e,t),exports.createArgument=(e,n)=>new t(e,n),exports.Command=n,exports.Option=o,exports.Argument=t,exports.Help=a,exports.CommanderError=r,exports.InvalidArgumentError=i,exports.InvalidOptionArgumentError=i})),A=n(k(),1);const{program:j,createCommand:M,createArgument:N,createOption:re,CommanderError:P,InvalidArgumentError:ie,InvalidOptionArgumentError:F,Command:I,Argument:ae,Option:L,Help:R}=A.default;var z=`0.1.76`;async function B(e){e||(e=process.cwd());let t=s(e);await t.build({cwd:e,entry:t.entry,outdir:t.outdir,watch:!1,onStart:()=>{console.log(`Building agent...`)},onResult:e=>{`error`in e&&(console.error(e.error),process.exit(1));for(let t of e.warnings)console.warn(t.message);console.log(`Built agent to ${e.entry}`)}})}var V=n(o(),1),H=n(a(),1);async function U(e,t){e||(e=process.cwd());let n=await u(),r=new c({authToken:n,fetch:(e,t)=>{let n=new Headers(t?.headers);return n.set(`x-blink-cli-version`,z),fetch(e,{...t,headers:n})}}),a=await i(e,`package.json`);if(!a)throw Error(`package.json not found`);let o=await x(a,`utf-8`),h=JSON.parse(o),C=_(a),w=v(C,`.blink`,`config.json`),T={};if(ee(w)){let e=await x(w,`utf-8`);T=JSON.parse(e)}let E;if(T?.organizationId)try{let e=await r.organizations.get(T.organizationId);E=e.name}catch(e){T.organizationId=void 0}if(!T?.organizationId){let e=await r.organizations.list();if(e.length===1){let t=e[0];T.organizationId=t.id,E=t.name}else{let t=await p({message:`Which organization should contain this agent?`,options:e.map(e=>({value:e.id,label:e.name}))});if(d(t))return;T.organizationId=t,E=e.find(e=>e.id===t).name}}if(!T.organizationId)throw Error(`Developer error: No organization ID found.`);let D;if(T?.agentId)try{let e=await r.agents.get(T.agentId);D=e.name}catch(e){T.agentId=void 0}if(!T?.agentId)try{let e=await r.organizations.agents.get({organization_id:T.organizationId,agent_name:h.name});T.agentId=e.id,D=e.name}catch(e){let t=await r.agents.create({name:h.name,organization_id:T.organizationId});T.agentId=t.id,D=t.name}if(!T.agentId)throw Error(`Developer error: No agent ID found.`);await te(_(w),{recursive:!0}),await ne(w,JSON.stringify({_:`This file can be source controlled. It contains no secrets.`,...T},null,2),`utf-8`);let O=s(C),k=await new Promise((e,t)=>{O.build({cwd:C,entry:O.entry,outdir:O.outdir,watch:!1,onStart:()=>{},onResult:t=>{e(t)}}).catch(t)});if(!k)throw Error(`Failed to build agent`);if(`error`in k)throw Error(k.error.message);let A={},j=await b(k.outdir);for(let e of j)A[v(k.outdir,e)]=e;let M=v(e,`README.md`);await W(M)&&(A[M]=`README.md`);let N={},re=await se(C);for(let e of re){let t=y(C,e);N[e]=t}let P=Object.entries(A),ie=Object.entries(N),F=[...P,...ie],I=F.length,ae=0,L=0,R=0,B=Array(I);await oe(F,10,async([e,t],n)=>{let i=await S(e),a=i.size,o=++ae;K(`${f.dim(`[${o}/${I}]`)} Uploading ${t} (${G(a)})...`);let s=await x(e),c=await r.files.upload(new File([s],t));B[n]={path:t,id:c.id},L+=1,R+=a}),K(`${f.dim(`[${L}/${I}]`)} Uploaded files (${G(R)}).`),process.stdout.write(`
20
+ Expecting one of '${n.join(`', '`)}'`);let r=`${e}Help`;return this.on(r,e=>{let n;n=typeof t==`function`?t({error:e.error,command:e.command}):t,n&&e.write(`${n}\n`)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption(),n=t&&e.find(e=>t.is(e));n&&(this.outputHelp(),this._exit(0,`commander.helpDisplayed`,`(outputHelp)`))}};function g(e){return e.map(e=>{if(!e.startsWith(`--inspect`))return e;let t,n=`127.0.0.1`,r=`9229`,i;return(i=e.match(/^(--inspect(-brk)?)$/))===null?(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))===null?(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(t=i[1],n=i[3],r=i[4]):(t=i[1],/^\d+$/.test(i[3])?r=i[3]:n=i[3]):t=i[1],t&&r!==`0`?`${t}=${n}:${parseInt(r)+1}`:e})}function _(){if(o.env.NO_COLOR||o.env.FORCE_COLOR===`0`||o.env.FORCE_COLOR===`false`)return!1;if(o.env.FORCE_COLOR||o.env.CLICOLOR_FORCE!==void 0)return!0}exports.Command=h,exports.useColor=_})),k=e((exports=>{let{Argument:t}=w(),{Command:n}=O(),{CommanderError:r,InvalidArgumentError:i}=C(),{Help:a}=T(),{Option:o}=E();exports.program=new n,exports.createCommand=e=>new n(e),exports.createOption=(e,t)=>new o(e,t),exports.createArgument=(e,n)=>new t(e,n),exports.Command=n,exports.Option=o,exports.Argument=t,exports.Help=a,exports.CommanderError=r,exports.InvalidArgumentError=i,exports.InvalidOptionArgumentError=i})),A=n(k(),1);const{program:j,createCommand:M,createArgument:N,createOption:re,CommanderError:P,InvalidArgumentError:ie,InvalidOptionArgumentError:F,Command:I,Argument:ae,Option:L,Help:R}=A.default;var z=`0.1.78`;async function B(e){e||(e=process.cwd());let t=s(e);await t.build({cwd:e,entry:t.entry,outdir:t.outdir,watch:!1,onStart:()=>{console.log(`Building agent...`)},onResult:e=>{`error`in e&&(console.error(e.error),process.exit(1));for(let t of e.warnings)console.warn(t.message);console.log(`Built agent to ${e.entry}`)}})}var V=n(o(),1),H=n(a(),1);async function U(e,t){e||(e=process.cwd());let n=await u(),r=new c({authToken:n,fetch:(e,t)=>{let n=new Headers(t?.headers);return n.set(`x-blink-cli-version`,z),fetch(e,{...t,headers:n})}}),a=await i(e,`package.json`);if(!a)throw Error(`package.json not found`);let o=await x(a,`utf-8`),h=JSON.parse(o),C=_(a),w=v(C,`.blink`,`config.json`),T={};if(ee(w)){let e=await x(w,`utf-8`);T=JSON.parse(e)}let E;if(T?.organizationId)try{let e=await r.organizations.get(T.organizationId);E=e.name}catch(e){T.organizationId=void 0}if(!T?.organizationId){let e=await r.organizations.list();if(e.length===1){let t=e[0];T.organizationId=t.id,E=t.name}else{let t=await p({message:`Which organization should contain this agent?`,options:e.map(e=>({value:e.id,label:e.name}))});if(d(t))return;T.organizationId=t,E=e.find(e=>e.id===t).name}}if(!T.organizationId)throw Error(`Developer error: No organization ID found.`);let D;if(T?.agentId)try{let e=await r.agents.get(T.agentId);D=e.name}catch(e){T.agentId=void 0}if(!T?.agentId)try{let e=await r.organizations.agents.get({organization_id:T.organizationId,agent_name:h.name});T.agentId=e.id,D=e.name}catch(e){let t=await r.agents.create({name:h.name,organization_id:T.organizationId});T.agentId=t.id,D=t.name}if(!T.agentId)throw Error(`Developer error: No agent ID found.`);await te(_(w),{recursive:!0}),await ne(w,JSON.stringify({_:`This file can be source controlled. It contains no secrets.`,...T},null,2),`utf-8`);let O=s(C),k=await new Promise((e,t)=>{O.build({cwd:C,entry:O.entry,outdir:O.outdir,watch:!1,onStart:()=>{},onResult:t=>{e(t)}}).catch(t)});if(!k)throw Error(`Failed to build agent`);if(`error`in k)throw Error(k.error.message);let A={},j=await b(k.outdir);for(let e of j)A[v(k.outdir,e)]=e;let M=v(e,`README.md`);await W(M)&&(A[M]=`README.md`);let N={},re=await se(C);for(let e of re){let t=y(C,e);N[e]=t}let P=Object.entries(A),ie=Object.entries(N),F=[...P,...ie],I=F.length,ae=0,L=0,R=0,B=Array(I);await oe(F,10,async([e,t],n)=>{let i=await S(e),a=i.size,o=++ae;K(`${f.dim(`[${o}/${I}]`)} Uploading ${t} (${G(a)})...`);let s=await x(e),c=await r.files.upload(new File([s],t));B[n]={path:t,id:c.id},L+=1,R+=a}),K(`${f.dim(`[${L}/${I}]`)} Uploaded files (${G(R)}).`),process.stdout.write(`
21
21
  `);let H=B.filter(Boolean),U=H.slice(0,P.length),q=H.slice(P.length),J=v(e,`.env.local`),Y=[];if(await W(J)){let e=(0,V.parse)(await x(J,`utf-8`));Y=Object.keys(e)}let X=[],ce=await r.agents.env.list({agent_id:T.agentId});X=ce.map(e=>e.key);let Z=v(e,`.env.production`);if(await W(Z)){let e=(0,V.parse)(await x(Z,`utf-8`)),t=Object.entries(e),n=t.length,i=0;for(let[e,a]of t){let t=await r.agents.env.create({agent_id:T.agentId,key:e,value:a,target:[`production`,`preview`],secret:!0,upsert:!0});X.push(t.key),i+=1,K(`${f.dim(`[${i}/${n}]`)} Updating environment variable: ${e} ${f.dim(`(.env.production)`)}`)}K(`${f.dim(`[${i}/${n}]`)} Updated environment variables! ${f.dim(`(.env.production)`)}`),process.stdout.write(`
22
- `)}let le=Y.filter(e=>!X.includes(e));if(le.length>0){console.log(`Warning: The following environment variables are set in .env.local but not in .env.production:`);for(let e of le)console.log(`- ${e}`);let e=await m({message:`Do you want to deploy anyway?`});if(e===!1||d(e))return}let ue=await r.agents.deployments.create({agent_id:T.agentId,target:`production`,entrypoint:g(k.entry),output_files:U,source_files:q,message:t?.message}),Q=`https://blink.so/${E}/${D}/deployments/${ue.number}`;console.log(`Deployed:`,Q);let $=l();$.start(`Waiting for deployment to be live...`);try{for(;;){let e=await r.agents.deployments.get({agent_id:T.agentId,deployment_id:ue.id});if(e.status===`success`){let t=`Deployment successful.`;e.target===`production`&&(t+=` All chats will use this deployment!`),$.stop(t);break}if(e.status===`failed`){let t=`Deployment failed.`;e.error_message&&(t+=` ${e.error_message}`),$.stop(t),console.log(`Read logs for details:`,Q);return}await new Promise(e=>setTimeout(e,500))}}catch(e){$.stop(`Failed to poll for deployment status.`),console.log(`Read logs for details:`,Q);return}}const W=async e=>{try{return await S(e),!0}catch(e){return!1}};async function oe(e,t,n){let r=Array(e.length),i=0,a=Array(Math.min(t,e.length)).fill(0).map(async()=>{for(;;){let t=i++;if(t>=e.length)break;r[t]=await n(e[t],t)}});return await Promise.all(a),r}function G(e){if(e===0)return`0B`;let t=1024,n=[`B`,`KB`,`MB`,`GB`,`TB`],r=Math.floor(Math.log(e)/Math.log(t)),i=e/Math.pow(t,r);return`${i.toFixed(i>=100?0:i>=10?1:2)}${n[r]}`}function K(e){if(process.stdout.isTTY)try{process.stdout.clearLine(0),process.stdout.cursorTo(0),process.stdout.write(e);return}catch{}console.log(e)}async function se(e){let t=[],n=[`.git`,`node_modules`,`.blink`,`.env`,`.env.*`],r=(0,H.default)().add(n),i=v(e,`.gitignore`);if(await W(i)){let e=await x(i,`utf-8`);r.add(e)}async function a(n,i=e){let o=await b(n,{withFileTypes:!0});for(let e of o){let o=v(n,e.name),s=y(i,o);if(r.ignores(s))continue;e.isDirectory()?await a(o,i):e.isFile()&&t.push(o)}}return await a(e),t}globalThis.WebSocket||(globalThis.WebSocket=r.default),globalThis.crypto||(globalThis.crypto={}),globalThis.crypto.randomUUID||(globalThis.crypto.randomUUID=()=>h()),j.name(`blink`).description(`Blink is a runtime for building and deploying AI agents.`).version(z).action(()=>{j.outputHelp()});const q=e=>async(...t)=>{let{default:n}=await e();return n(...t)};j.command(`init [directory]`).description(`Initialize a new Blink agent.`).action(q(()=>import(`./init-D-601hh-.js`))),j.command(`dev [directory] [options]`).description(`Start a development server for your agent.`).action(q(()=>import(`./dev-IdmzRYNF.js`))),j.command(`deploy [directory]`).description(`Deploy your agent to the Blink Cloud.`).option(`-m, --message <message>`,`Message for this deployment`).action(U),j.command(`build [directory]`).description(`Build your agent for production.`).action(B),j.command(`telemetry [boolean]`).description(`Enable or disable telemetry.`),j.command(`start [directory]`).description("Starts the Blink runtime in production mode. The agent must be compiled with `blink build` first."),j.command(`connect`,{hidden:!0}).description(`Connect compute to the Blink Cloud.`).action(q(()=>import(`./connect-DSyrG7KH.js`))),j.command(`chat`,{hidden:!0}).description(`Start a Blink chat connected to your machine.`).action(q(()=>import(`./chat-CChZ6Dgt.js`))),j.command(`login`,{hidden:!0}).description(`Log in to the Blink Cloud.`).action(q(()=>import(`./login-CxmH7hHe.js`))),j.parse(process.argv);export{};
22
+ `)}let le=Y.filter(e=>!X.includes(e));if(le.length>0){console.log(`Warning: The following environment variables are set in .env.local but not in .env.production:`);for(let e of le)console.log(`- ${e}`);let e=await m({message:`Do you want to deploy anyway?`});if(e===!1||d(e))return}let ue=await r.agents.deployments.create({agent_id:T.agentId,target:`production`,entrypoint:g(k.entry),output_files:U,source_files:q,message:t?.message}),Q=`https://blink.so/${E}/${D}/deployments/${ue.number}`;console.log(`Deployed:`,Q);let $=l();$.start(`Waiting for deployment to be live...`);try{for(;;){let e=await r.agents.deployments.get({agent_id:T.agentId,deployment_id:ue.id});if(e.status===`success`){let t=`Deployment successful.`;e.target===`production`&&(t+=` All chats will use this deployment!`),$.stop(t);break}if(e.status===`failed`){let t=`Deployment failed.`;e.error_message&&(t+=` ${e.error_message}`),$.stop(t),console.log(`Read logs for details:`,Q);return}await new Promise(e=>setTimeout(e,500))}}catch(e){$.stop(`Failed to poll for deployment status.`),console.log(`Read logs for details:`,Q);return}}const W=async e=>{try{return await S(e),!0}catch(e){return!1}};async function oe(e,t,n){let r=Array(e.length),i=0,a=Array(Math.min(t,e.length)).fill(0).map(async()=>{for(;;){let t=i++;if(t>=e.length)break;r[t]=await n(e[t],t)}});return await Promise.all(a),r}function G(e){if(e===0)return`0B`;let t=1024,n=[`B`,`KB`,`MB`,`GB`,`TB`],r=Math.floor(Math.log(e)/Math.log(t)),i=e/Math.pow(t,r);return`${i.toFixed(i>=100?0:i>=10?1:2)}${n[r]}`}function K(e){if(process.stdout.isTTY)try{process.stdout.clearLine(0),process.stdout.cursorTo(0),process.stdout.write(e);return}catch{}console.log(e)}async function se(e){let t=[],n=[`.git`,`node_modules`,`.blink`,`.env`,`.env.*`],r=(0,H.default)().add(n),i=v(e,`.gitignore`);if(await W(i)){let e=await x(i,`utf-8`);r.add(e)}async function a(n,i=e){let o=await b(n,{withFileTypes:!0});for(let e of o){let o=v(n,e.name),s=y(i,o);if(r.ignores(s))continue;e.isDirectory()?await a(o,i):e.isFile()&&t.push(o)}}return await a(e),t}globalThis.WebSocket||(globalThis.WebSocket=r.default),globalThis.crypto||(globalThis.crypto={}),globalThis.crypto.randomUUID||(globalThis.crypto.randomUUID=()=>h()),j.name(`blink`).description(`Blink is a runtime for building and deploying AI agents.`).version(z).action(()=>{j.outputHelp()});const q=e=>async(...t)=>{let{default:n}=await e();return n(...t)};j.command(`init [directory]`).description(`Initialize a new Blink agent.`).action(q(()=>import(`./init-D-601hh-.js`))),j.command(`dev [directory] [options]`).description(`Start a development server for your agent.`).action(q(()=>import(`./dev-CIl-UXl2.js`))),j.command(`deploy [directory]`).description(`Deploy your agent to the Blink Cloud.`).option(`-m, --message <message>`,`Message for this deployment`).action(U),j.command(`build [directory]`).description(`Build your agent for production.`).action(B),j.command(`telemetry [boolean]`).description(`Enable or disable telemetry.`),j.command(`start [directory]`).description("Starts the Blink runtime in production mode. The agent must be compiled with `blink build` first."),j.command(`connect`,{hidden:!0}).description(`Connect compute to the Blink Cloud.`).action(q(()=>import(`./connect-DSyrG7KH.js`))),j.command(`chat`,{hidden:!0}).description(`Start a Blink chat connected to your machine.`).action(q(()=>import(`./chat-CChZ6Dgt.js`))),j.command(`login`,{hidden:!0}).description(`Log in to the Blink Cloud.`).action(q(()=>import(`./login-CxmH7hHe.js`))),j.parse(process.argv);export{};
@@ -21,10 +21,10 @@ ${e}
21
21
 
22
22
  `;break}case`tool`:throw new Ii({functionality:`tool messages`});default:{let e=i;throw Error(`Unsupported role: ${e}`)}}return r+=`${n}:
23
23
  `,{prompt:r,stopSequences:[`
24
- ${t}:`]}}function Ba({id:e,model:t,created:n}){return{id:e??void 0,modelId:t??void 0,timestamp:n==null?void 0:new Date(n*1e3)}}function Va(e){switch(e){case`stop`:return`stop`;case`length`:return`length`;case`content_filter`:return`content-filter`;case`function_call`:case`tool_calls`:return`tool-calls`;default:return`unknown`}}var Ha=n.z.object({echo:n.z.boolean().optional(),logitBias:n.z.record(n.z.string(),n.z.number()).optional(),suffix:n.z.string().optional(),user:n.z.string().optional()}),Ua=class{constructor(e,t){this.specificationVersion=`v2`;var n;this.modelId=e,this.config=t;let r=(n=t.errorStructure)??Na;this.chunkSchema=Ka(r.errorSchema),this.failedResponseHandler=_a(r)}get provider(){return this.config.provider}get providerOptionsName(){return this.config.provider.split(`.`)[0].trim()}get supportedUrls(){var e,t,n;return(n=(t=(e=this.config).supportedUrls)?.call(e))??{}}async getArgs({prompt:e,maxOutputTokens:t,temperature:n,topP:r,topK:i,frequencyPenalty:a,presencePenalty:o,stopSequences:s,responseFormat:c,seed:l,providerOptions:u,tools:d,toolChoice:f}){var p;let m=[],h=(p=await ma({provider:this.providerOptionsName,providerOptions:u,schema:Ha}))??{};i!=null&&m.push({type:`unsupported-setting`,setting:`topK`}),d?.length&&m.push({type:`unsupported-setting`,setting:`tools`}),f!=null&&m.push({type:`unsupported-setting`,setting:`toolChoice`}),c!=null&&c.type!==`text`&&m.push({type:`unsupported-setting`,setting:`responseFormat`,details:`JSON response format is not supported.`});let{prompt:g,stopSequences:_}=za({prompt:e}),v=[..._??[],...s??[]];return{args:{model:this.modelId,echo:h.echo,logit_bias:h.logitBias,suffix:h.suffix,user:h.user,max_tokens:t,temperature:n,top_p:r,frequency_penalty:a,presence_penalty:o,seed:l,...u?.[this.providerOptionsName],prompt:g,stop:v.length>0?v:void 0},warnings:m}}async doGenerate(e){var t,n,r,i,a,o;let{args:s,warnings:c}=await this.getArgs(e),{responseHeaders:l,value:u,rawValue:d}=await $({url:this.config.url({path:`/completions`,modelId:this.modelId}),headers:Q(this.config.headers(),e.headers),body:s,failedResponseHandler:this.failedResponseHandler,successfulResponseHandler:ya(Ga),abortSignal:e.abortSignal,fetch:this.config.fetch}),f=u.choices[0],p=[];return f.text!=null&&f.text.length>0&&p.push({type:`text`,text:f.text}),{content:p,usage:{inputTokens:(n=(t=u.usage)?.prompt_tokens)??void 0,outputTokens:(i=(r=u.usage)?.completion_tokens)??void 0,totalTokens:(o=(a=u.usage)?.total_tokens)??void 0},finishReason:Va(f.finish_reason),request:{body:s},response:{...Ba(u),headers:l,body:d},warnings:c}}async doStream(e){let{args:t,warnings:n}=await this.getArgs(e),r={...t,stream:!0,stream_options:this.config.includeUsage?{include_usage:!0}:void 0},{responseHeaders:i,value:a}=await $({url:this.config.url({path:`/completions`,modelId:this.modelId}),headers:Q(this.config.headers(),e.headers),body:r,failedResponseHandler:this.failedResponseHandler,successfulResponseHandler:va(this.chunkSchema),abortSignal:e.abortSignal,fetch:this.config.fetch}),o=`unknown`,s={inputTokens:void 0,outputTokens:void 0,totalTokens:void 0},c=!0;return{stream:a.pipeThrough(new TransformStream({start(e){e.enqueue({type:`stream-start`,warnings:n})},transform(t,n){var r,i,a;if(e.includeRawChunks&&n.enqueue({type:`raw`,rawValue:t.rawValue}),!t.success){o=`error`,n.enqueue({type:`error`,error:t.error});return}let l=t.value;if(`error`in l){o=`error`,n.enqueue({type:`error`,error:l.error});return}c&&(c=!1,n.enqueue({type:`response-metadata`,...Ba(l)}),n.enqueue({type:`text-start`,id:`0`})),l.usage!=null&&(s.inputTokens=(r=l.usage.prompt_tokens)??void 0,s.outputTokens=(i=l.usage.completion_tokens)??void 0,s.totalTokens=(a=l.usage.total_tokens)??void 0);let u=l.choices[0];u?.finish_reason!=null&&(o=Va(u.finish_reason)),u?.text!=null&&n.enqueue({type:`text-delta`,id:`0`,delta:u.text})},flush(e){c||e.enqueue({type:`text-end`,id:`0`}),e.enqueue({type:`finish`,finishReason:o,usage:s})}})),request:{body:r},response:{headers:i}}}},Wa=n.z.object({prompt_tokens:n.z.number(),completion_tokens:n.z.number(),total_tokens:n.z.number()}),Ga=n.z.object({id:n.z.string().nullish(),created:n.z.number().nullish(),model:n.z.string().nullish(),choices:n.z.array(n.z.object({text:n.z.string(),finish_reason:n.z.string()})),usage:Wa.nullish()}),Ka=e=>n.z.union([n.z.object({id:n.z.string().nullish(),created:n.z.number().nullish(),model:n.z.string().nullish(),choices:n.z.array(n.z.object({text:n.z.string(),finish_reason:n.z.string().nullish(),index:n.z.number()})),usage:Wa.nullish()}),e]),qa=n.z.object({dimensions:n.z.number().optional(),user:n.z.string().optional()}),Ja=class{constructor(e,t){this.specificationVersion=`v2`,this.modelId=e,this.config=t}get provider(){return this.config.provider}get maxEmbeddingsPerCall(){var e;return(e=this.config.maxEmbeddingsPerCall)??2048}get supportsParallelCalls(){var e;return(e=this.config.supportsParallelCalls)??!0}get providerOptionsName(){return this.config.provider.split(`.`)[0].trim()}async doEmbed({values:e,headers:t,abortSignal:n,providerOptions:r}){var i,a,o;let s=Object.assign((i=await ma({provider:`openai-compatible`,providerOptions:r,schema:qa}))??{},(a=await ma({provider:this.providerOptionsName,providerOptions:r,schema:qa}))??{});if(e.length>this.maxEmbeddingsPerCall)throw new Ti({provider:this.provider,modelId:this.modelId,maxEmbeddingsPerCall:this.maxEmbeddingsPerCall,values:e});let{responseHeaders:c,value:l,rawValue:u}=await $({url:this.config.url({path:`/embeddings`,modelId:this.modelId}),headers:Q(this.config.headers(),t),body:{model:this.modelId,input:e,encoding_format:`float`,dimensions:s.dimensions,user:s.user},failedResponseHandler:_a((o=this.config.errorStructure)??Na),successfulResponseHandler:ya(Ya),abortSignal:n,fetch:this.config.fetch});return{embeddings:l.data.map(e=>e.embedding),usage:l.usage?{tokens:l.usage.prompt_tokens}:void 0,providerMetadata:l.providerMetadata,response:{headers:c,body:u}}}},Ya=n.z.object({data:n.z.array(n.z.object({embedding:n.z.array(n.z.number())})),usage:n.z.object({prompt_tokens:n.z.number()}).nullish(),providerMetadata:n.z.record(n.z.string(),n.z.record(n.z.string(),n.z.any())).optional()}),Xa=class{constructor(e,t){this.modelId=e,this.config=t,this.specificationVersion=`v2`,this.maxImagesPerCall=10}get provider(){return this.config.provider}async doGenerate({prompt:e,n:t,size:n,aspectRatio:r,seed:i,providerOptions:a,headers:o,abortSignal:s}){var c,l,u,d,f;let p=[];r!=null&&p.push({type:`unsupported-setting`,setting:`aspectRatio`,details:"This model does not support aspect ratio. Use `size` instead."}),i!=null&&p.push({type:`unsupported-setting`,setting:`seed`});let m=(u=(l=(c=this.config._internal)?.currentDate)?.call(c))??new Date,{value:h,responseHeaders:g}=await $({url:this.config.url({path:`/images/generations`,modelId:this.modelId}),headers:Q(this.config.headers(),o),body:{model:this.modelId,prompt:e,n:t,size:n,...(d=a.openai)??{},response_format:`b64_json`},failedResponseHandler:_a((f=this.config.errorStructure)??Na),successfulResponseHandler:ya(Za),abortSignal:s,fetch:this.config.fetch});return{images:h.data.map(e=>e.b64_json),warnings:p,response:{timestamp:m,modelId:this.modelId,headers:g}}}},Za=n.z.object({data:n.z.array(n.z.object({b64_json:n.z.string()}))}),Qa=`1.0.19`;function $a(e){let t=Ea(e.baseURL),n=e.name,r={...e.apiKey&&{Authorization:`Bearer ${e.apiKey}`},...e.headers},i=()=>Gi(r,`ai-sdk/openai-compatible/${Qa}`),a=r=>({provider:`${n}.${r}`,url:({path:n})=>{let r=new URL(`${t}${n}`);return e.queryParams&&(r.search=new URLSearchParams(e.queryParams).toString()),r.toString()},headers:i,fetch:e.fetch}),o=e=>s(e),s=t=>new Fa(t,{...a(`chat`),includeUsage:e.includeUsage,supportsStructuredOutputs:e.supportsStructuredOutputs}),c=t=>new Ua(t,{...a(`completion`),includeUsage:e.includeUsage}),l=e=>new Ja(e,{...a(`embedding`)}),u=e=>new Xa(e,a(`image`)),d=e=>o(e);return d.languageModel=o,d.chatModel=s,d.completionModel=c,d.textEmbeddingModel=l,d.imageModel=u,d}function eo(){let e={chat:[],ui:[],request:[],error:[]},n={on:(t,r)=>(e[t]=[...e[t]??[],r],n),serve:n=>{n||={},n.host||=process.env.HOST??`127.0.0.1`,n.port||=parseInt(process.env.PORT??`3000`),n.apiUrl||=process.env.BLINK_API_URL;let r=gr(n.apiUrl??``,{fetch:n.apiUrl?void 0:async()=>{throw console.warn(`Your code is attempting to use the Blink API server, but no API server is configured for this Blink agent.`),Error(`No API server is configured for this Blink agent. External APIs are not available.`)}}),i={chat:{async ensure(e){let t=await r.chat[`:key`].$post({param:{key:e}});if(t.status!==200)throw Error(`Failed to ensure chat!`);return t.json()},async message(e,t,n){let i=await r.chat[`:key`].sendMessages.$post({param:{key:e},json:{message:t,options:n??{}}});if(i.status!==204)throw Error(`Failed to send message!`)}},store:{async get(e){let t=await r.kv[`:key`].$get({param:{key:e}});if(t.status!==200)throw Error(`Failed to get value!`);let{value:n}=await t.json();return n},async set(e,t){let n=await r.kv[`:key`].$post({param:{key:e},json:{value:t}});if(n.status!==204)throw Error(`Failed to set value!`)},async delete(e){let t=await r.kv[`:key`].$delete({param:{key:e}});if(t.status!==204)throw Error(`Failed to delete value!`)},async list(e,t){let n=await r.kv.$get({query:{prefix:e,limit:t?.limit,cursor:t?.cursor}});if(n.status!==200)throw Error(`Failed to list values!`);return n.json()}}},a=t.createServer(Yt(t=>no.fetch(t,{context:i,listeners:e})));return a.listen(n?.port??3e3,n?.host??`127.0.0.1`)}};return n}const to=new tr().post(`/chat`,Cr(`json`,e=>({messages:e.messages,chat:e.chat})),async e=>{let t=e.env.listeners.chat,n=e.req.valid(`json`);for(let r of t){let t;try{t=await r({chat:n.chat,messages:n.messages,abortSignal:e.req.raw.signal,context:e.env.context})}catch(e){if(e instanceof wr)t=e.response;else throw e}if(!t)continue;if(t instanceof Response)return t;let i;if(t instanceof ReadableStream)i=t;else if(typeof t==`object`&&`toUIMessageStream`in t)i=t.toUIMessageStream({messageMetadata:({part:e})=>{switch(e.type){case`finish`:return{totalUsage:e.totalUsage};case`finish-step`:return{usage:e.usage,model:e.response.modelId}}}});else throw Error(`Invalid chat handler result! Must be a Response, ReadableStream, or toUIMessageStream function.`);return new Response(i.pipeThrough(new TransformStream({transform(e,t){t.enqueue(`data: ${JSON.stringify(e)}\n\n`)},flush(e){e.enqueue(`data: [DONE]
24
+ ${t}:`]}}function Ba({id:e,model:t,created:n}){return{id:e??void 0,modelId:t??void 0,timestamp:n==null?void 0:new Date(n*1e3)}}function Va(e){switch(e){case`stop`:return`stop`;case`length`:return`length`;case`content_filter`:return`content-filter`;case`function_call`:case`tool_calls`:return`tool-calls`;default:return`unknown`}}var Ha=n.z.object({echo:n.z.boolean().optional(),logitBias:n.z.record(n.z.string(),n.z.number()).optional(),suffix:n.z.string().optional(),user:n.z.string().optional()}),Ua=class{constructor(e,t){this.specificationVersion=`v2`;var n;this.modelId=e,this.config=t;let r=(n=t.errorStructure)??Na;this.chunkSchema=Ka(r.errorSchema),this.failedResponseHandler=_a(r)}get provider(){return this.config.provider}get providerOptionsName(){return this.config.provider.split(`.`)[0].trim()}get supportedUrls(){var e,t,n;return(n=(t=(e=this.config).supportedUrls)?.call(e))??{}}async getArgs({prompt:e,maxOutputTokens:t,temperature:n,topP:r,topK:i,frequencyPenalty:a,presencePenalty:o,stopSequences:s,responseFormat:c,seed:l,providerOptions:u,tools:d,toolChoice:f}){var p;let m=[],h=(p=await ma({provider:this.providerOptionsName,providerOptions:u,schema:Ha}))??{};i!=null&&m.push({type:`unsupported-setting`,setting:`topK`}),d?.length&&m.push({type:`unsupported-setting`,setting:`tools`}),f!=null&&m.push({type:`unsupported-setting`,setting:`toolChoice`}),c!=null&&c.type!==`text`&&m.push({type:`unsupported-setting`,setting:`responseFormat`,details:`JSON response format is not supported.`});let{prompt:g,stopSequences:_}=za({prompt:e}),v=[..._??[],...s??[]];return{args:{model:this.modelId,echo:h.echo,logit_bias:h.logitBias,suffix:h.suffix,user:h.user,max_tokens:t,temperature:n,top_p:r,frequency_penalty:a,presence_penalty:o,seed:l,...u?.[this.providerOptionsName],prompt:g,stop:v.length>0?v:void 0},warnings:m}}async doGenerate(e){var t,n,r,i,a,o;let{args:s,warnings:c}=await this.getArgs(e),{responseHeaders:l,value:u,rawValue:d}=await $({url:this.config.url({path:`/completions`,modelId:this.modelId}),headers:Q(this.config.headers(),e.headers),body:s,failedResponseHandler:this.failedResponseHandler,successfulResponseHandler:ya(Ga),abortSignal:e.abortSignal,fetch:this.config.fetch}),f=u.choices[0],p=[];return f.text!=null&&f.text.length>0&&p.push({type:`text`,text:f.text}),{content:p,usage:{inputTokens:(n=(t=u.usage)?.prompt_tokens)??void 0,outputTokens:(i=(r=u.usage)?.completion_tokens)??void 0,totalTokens:(o=(a=u.usage)?.total_tokens)??void 0},finishReason:Va(f.finish_reason),request:{body:s},response:{...Ba(u),headers:l,body:d},warnings:c}}async doStream(e){let{args:t,warnings:n}=await this.getArgs(e),r={...t,stream:!0,stream_options:this.config.includeUsage?{include_usage:!0}:void 0},{responseHeaders:i,value:a}=await $({url:this.config.url({path:`/completions`,modelId:this.modelId}),headers:Q(this.config.headers(),e.headers),body:r,failedResponseHandler:this.failedResponseHandler,successfulResponseHandler:va(this.chunkSchema),abortSignal:e.abortSignal,fetch:this.config.fetch}),o=`unknown`,s={inputTokens:void 0,outputTokens:void 0,totalTokens:void 0},c=!0;return{stream:a.pipeThrough(new TransformStream({start(e){e.enqueue({type:`stream-start`,warnings:n})},transform(t,n){var r,i,a;if(e.includeRawChunks&&n.enqueue({type:`raw`,rawValue:t.rawValue}),!t.success){o=`error`,n.enqueue({type:`error`,error:t.error});return}let l=t.value;if(`error`in l){o=`error`,n.enqueue({type:`error`,error:l.error});return}c&&(c=!1,n.enqueue({type:`response-metadata`,...Ba(l)}),n.enqueue({type:`text-start`,id:`0`})),l.usage!=null&&(s.inputTokens=(r=l.usage.prompt_tokens)??void 0,s.outputTokens=(i=l.usage.completion_tokens)??void 0,s.totalTokens=(a=l.usage.total_tokens)??void 0);let u=l.choices[0];u?.finish_reason!=null&&(o=Va(u.finish_reason)),u?.text!=null&&n.enqueue({type:`text-delta`,id:`0`,delta:u.text})},flush(e){c||e.enqueue({type:`text-end`,id:`0`}),e.enqueue({type:`finish`,finishReason:o,usage:s})}})),request:{body:r},response:{headers:i}}}},Wa=n.z.object({prompt_tokens:n.z.number(),completion_tokens:n.z.number(),total_tokens:n.z.number()}),Ga=n.z.object({id:n.z.string().nullish(),created:n.z.number().nullish(),model:n.z.string().nullish(),choices:n.z.array(n.z.object({text:n.z.string(),finish_reason:n.z.string()})),usage:Wa.nullish()}),Ka=e=>n.z.union([n.z.object({id:n.z.string().nullish(),created:n.z.number().nullish(),model:n.z.string().nullish(),choices:n.z.array(n.z.object({text:n.z.string(),finish_reason:n.z.string().nullish(),index:n.z.number()})),usage:Wa.nullish()}),e]),qa=n.z.object({dimensions:n.z.number().optional(),user:n.z.string().optional()}),Ja=class{constructor(e,t){this.specificationVersion=`v2`,this.modelId=e,this.config=t}get provider(){return this.config.provider}get maxEmbeddingsPerCall(){var e;return(e=this.config.maxEmbeddingsPerCall)??2048}get supportsParallelCalls(){var e;return(e=this.config.supportsParallelCalls)??!0}get providerOptionsName(){return this.config.provider.split(`.`)[0].trim()}async doEmbed({values:e,headers:t,abortSignal:n,providerOptions:r}){var i,a,o;let s=Object.assign((i=await ma({provider:`openai-compatible`,providerOptions:r,schema:qa}))??{},(a=await ma({provider:this.providerOptionsName,providerOptions:r,schema:qa}))??{});if(e.length>this.maxEmbeddingsPerCall)throw new Ti({provider:this.provider,modelId:this.modelId,maxEmbeddingsPerCall:this.maxEmbeddingsPerCall,values:e});let{responseHeaders:c,value:l,rawValue:u}=await $({url:this.config.url({path:`/embeddings`,modelId:this.modelId}),headers:Q(this.config.headers(),t),body:{model:this.modelId,input:e,encoding_format:`float`,dimensions:s.dimensions,user:s.user},failedResponseHandler:_a((o=this.config.errorStructure)??Na),successfulResponseHandler:ya(Ya),abortSignal:n,fetch:this.config.fetch});return{embeddings:l.data.map(e=>e.embedding),usage:l.usage?{tokens:l.usage.prompt_tokens}:void 0,providerMetadata:l.providerMetadata,response:{headers:c,body:u}}}},Ya=n.z.object({data:n.z.array(n.z.object({embedding:n.z.array(n.z.number())})),usage:n.z.object({prompt_tokens:n.z.number()}).nullish(),providerMetadata:n.z.record(n.z.string(),n.z.record(n.z.string(),n.z.any())).optional()}),Xa=class{constructor(e,t){this.modelId=e,this.config=t,this.specificationVersion=`v2`,this.maxImagesPerCall=10}get provider(){return this.config.provider}async doGenerate({prompt:e,n:t,size:n,aspectRatio:r,seed:i,providerOptions:a,headers:o,abortSignal:s}){var c,l,u,d,f;let p=[];r!=null&&p.push({type:`unsupported-setting`,setting:`aspectRatio`,details:"This model does not support aspect ratio. Use `size` instead."}),i!=null&&p.push({type:`unsupported-setting`,setting:`seed`});let m=(u=(l=(c=this.config._internal)?.currentDate)?.call(c))??new Date,{value:h,responseHeaders:g}=await $({url:this.config.url({path:`/images/generations`,modelId:this.modelId}),headers:Q(this.config.headers(),o),body:{model:this.modelId,prompt:e,n:t,size:n,...(d=a.openai)??{},response_format:`b64_json`},failedResponseHandler:_a((f=this.config.errorStructure)??Na),successfulResponseHandler:ya(Za),abortSignal:s,fetch:this.config.fetch});return{images:h.data.map(e=>e.b64_json),warnings:p,response:{timestamp:m,modelId:this.modelId,headers:g}}}},Za=n.z.object({data:n.z.array(n.z.object({b64_json:n.z.string()}))}),Qa=`1.0.19`;function $a(e){let t=Ea(e.baseURL),n=e.name,r={...e.apiKey&&{Authorization:`Bearer ${e.apiKey}`},...e.headers},i=()=>Gi(r,`ai-sdk/openai-compatible/${Qa}`),a=r=>({provider:`${n}.${r}`,url:({path:n})=>{let r=new URL(`${t}${n}`);return e.queryParams&&(r.search=new URLSearchParams(e.queryParams).toString()),r.toString()},headers:i,fetch:e.fetch}),o=e=>s(e),s=t=>new Fa(t,{...a(`chat`),includeUsage:e.includeUsage,supportsStructuredOutputs:e.supportsStructuredOutputs}),c=t=>new Ua(t,{...a(`completion`),includeUsage:e.includeUsage}),l=e=>new Ja(e,{...a(`embedding`)}),u=e=>new Xa(e,a(`image`)),d=e=>o(e);return d.languageModel=o,d.chatModel=s,d.completionModel=c,d.textEmbeddingModel=l,d.imageModel=u,d}function eo(){let e={chat:[],ui:[],request:[],error:[]},n={on:(t,r)=>(e[t]=[...e[t]??[],r],n),serve:n=>{n||={},n.host||=process.env.HOST??`127.0.0.1`,n.port||=parseInt(process.env.PORT??`3000`),n.apiUrl||=process.env.BLINK_API_URL;let r=gr(n.apiUrl??``,{fetch:n.apiUrl?void 0:async()=>{throw console.warn(`Your code is attempting to use the Blink API server, but no API server is configured for this Blink agent.`),Error(`No API server is configured for this Blink agent. External APIs are not available.`)}}),i={chat:{async ensure(e){let t=await r.chat[`:key`].$post({param:{key:e}});if(t.status!==200)throw Error(`Failed to ensure chat!`);return t.json()},async message(e,t,n){let i=await r.chat[`:key`].sendMessages.$post({param:{key:e},json:{message:t,options:n??{}}});if(i.status!==204)throw Error(`Failed to send message!`)}},store:{async get(e){let t=await r.kv[`:key`].$get({param:{key:encodeURIComponent(e)}});if(t.status!==200)throw Error(`Failed to get value!`);let{value:n}=await t.json();return n},async set(e,t){let n=await r.kv[`:key`].$post({param:{key:encodeURIComponent(e)},json:{value:t}});if(n.status!==204)throw Error(`Failed to set value!`)},async delete(e){let t=await r.kv[`:key`].$delete({param:{key:encodeURIComponent(e)}});if(t.status!==204)throw Error(`Failed to delete value!`)},async list(e,t){let n=await r.kv.$get({query:{prefix:e?encodeURIComponent(e):void 0,limit:t?.limit,cursor:t?.cursor}});if(n.status!==200)throw Error(`Failed to list values!`);return n.json()}}},a=t.createServer(Yt(t=>no.fetch(t,{context:i,listeners:e})));return a.listen(n?.port??3e3,n?.host??`127.0.0.1`)}};return n}const to=new tr().post(`/chat`,Cr(`json`,e=>({messages:e.messages,chat:e.chat})),async e=>{let t=e.env.listeners.chat,n=e.req.valid(`json`);for(let r of t){let t;try{t=await r({chat:n.chat,messages:n.messages,abortSignal:e.req.raw.signal,context:e.env.context})}catch(e){if(e instanceof wr)t=e.response;else throw e}if(!t)continue;if(t instanceof Response)return t;let i;if(t instanceof ReadableStream)i=t;else if(typeof t==`object`&&`toUIMessageStream`in t)i=t.toUIMessageStream({messageMetadata:({part:e})=>{switch(e.type){case`finish`:return{totalUsage:e.totalUsage};case`finish-step`:return{usage:e.usage,model:e.response.modelId}}}});else throw Error(`Invalid chat handler result! Must be a Response, ReadableStream, or toUIMessageStream function.`);return new Response(i.pipeThrough(new TransformStream({transform(e,t){t.enqueue(`data: ${JSON.stringify(e)}\n\n`)},flush(e){e.enqueue(`data: [DONE]
25
25
 
26
26
  `)}})).pipeThrough(new TextEncoderStream),{headers:ro})}return e.json({error:`No chat handlers found.`},404)}).get(`/capabilities`,async e=>{let t=e.env.listeners,n={ui:t.ui.length>0,chat:t.chat.length>0,request:t.request.length>0,error:t.error.length>0};return e.json(n,200)}).get(`/health`,async e=>e.body(`OK`,200)).get(`/ui`,async e=>{let t=e.req.query(`selected_options`),n;if(t)try{n=JSON.parse(t)}catch{return e.json({error:`Invalid selected_options query parameter!`},400)}let r=e.env.listeners.ui;for(let t of r){let r=await t({selectedOptions:n});if(!r)continue;return e.json(r,200)}return e.json({error:`No UI listener returned a response`},404)}),no=new tr().route(`/_agent`,to).all(`*`,async e=>{let t=e.env.listeners.request;for(let n of t){let t=await n(e.req.raw,e.env.context);if(t)return t}return e.json({error:`No request handlers found.`},404)}),ro={"content-type":`text/event-stream`,"cache-control":`no-cache, no-transform`,connection:`keep-alive`,"x-accel-buffering":`no`},io=e=>{let t=process.env.BLINK_TOKEN??process.env.BLINK_INVOCATION_AUTH_TOKEN;if(!t)throw Error(`You must be authenticated with Blink to use the model gateway.
27
27
 
28
28
  Authenticate with "blink login".
29
29
 
30
- Feel free to use other providers like OpenAI, Anthropic, or Google.`);return $a({name:`Blink Gateway`,baseURL:`https://blink.so/api/ai-gateway/v1`,apiKey:t})(e)};function ao(e){return e}const oo=Object.freeze({withContext(e,t){let n={};for(let r of Object.keys(e)){let i=e[r];n[r]=i.withContext(t)}return n},with(e,t){let n={};for(let r of Object.keys(e)){let i=e[r];n[r]=i.withContext(t)}return n},async withApproval(e){let t={};for(let[n,r]of Object.entries(e.tools)){let e=r.execute;t[n]={...r,execute:async(t,n)=>{if(r.autoApprove&&e){let i=await r.autoApprove(t);if(i)return e(t,n)}let i={type:`tool-approval`,outcome:`pending`};return i}}}let n=e.messages[e.messages.length-1];if(!n?.parts)return t;let i=[];for(let t of n.parts){if(!(0,r.isToolUIPart)(t))continue;let n=(0,r.getToolName)(t),a=e.tools[n];if(!a||t.state!==`output-available`||!a.execute||!so(t.output))continue;t.output.outcome===`approved`&&i.push({toolName:(0,r.getToolName)(t),tool:a,input:t.input,toolCallId:t.toolCallId})}if(i.length>0){let t=(0,r.createUIMessageStream)({execute:async({writer:t})=>{t.write({type:`start-step`}),await Promise.all(i.map(async n=>{if(!n.tool.execute)throw Error(`Tool does not support execute.`);t.write({type:`tool-input-available`,toolCallId:n.toolCallId,toolName:n.toolName,input:n.input});try{let i=await n.tool.execute(n.input,{toolCallId:n.toolCallId,messages:(0,r.convertToModelMessages)(e.messages,{tools:e.tools}),abortSignal:e.abortSignal});if(ht(i))for await(let e of i)t.write({type:`tool-output-available`,toolCallId:n.toolCallId,output:e,preliminary:!0});t.write({type:`tool-output-available`,toolCallId:n.toolCallId,output:i})}catch(e){t.write({type:`tool-output-error`,toolCallId:n.toolCallId,errorText:e instanceof Error?e.message:String(e)})}})),t.write({type:`finish`})}});throw new wr(`Executing tools`,t)}return t},prefix(e,t){let n={};for(let[r,i]of Object.entries(e))n[`${t}${r}`]=i;return n}});function so(e){return typeof e==`object`&&!!e&&`type`in e&&e.type===`tool-approval`}function co(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n!==void 0&&n.role===`user`&&!(typeof n.metadata!=`object`||n.metadata===null)&&`options`in n.metadata)return n.metadata.options}}const lo=`x-blink-stream-response-format`;function uo(e,t){let n=new Headers(e.headers);return n.set(lo,t),new Response(e.body,{status:e.status,statusText:e.statusText,headers:n})}exports.StreamResponseFormatHeader=lo,exports.agent=eo,exports.api=no,exports.isToolApprovalOutput=so,exports.lastUIOptions=co,exports.model=io,exports.toolWithApproval=ao,exports.tools=oo,exports.withResponseFormat=uo;
30
+ Feel free to use other providers like OpenAI, Anthropic, or Google.`);let n=process.env.INTERNAL_BLINK_API_SERVER_URL??`https://blink.so`,r=new URL(`/api/ai-gateway/v1`,n);return $a({name:`Blink Gateway`,baseURL:r.toString(),apiKey:t})(e)};function ao(e){return e}const oo=Object.freeze({withContext(e,t){let n={};for(let r of Object.keys(e)){let i=e[r];n[r]=i.withContext(t)}return n},with(e,t){let n={};for(let r of Object.keys(e)){let i=e[r];n[r]=i.withContext(t)}return n},async withApproval(e){let t={};for(let[n,r]of Object.entries(e.tools)){let e=r.execute;t[n]={...r,execute:async(t,n)=>{if(r.autoApprove&&e){let i=await r.autoApprove(t);if(i)return e(t,n)}let i={type:`tool-approval`,outcome:`pending`};return i}}}let n=e.messages[e.messages.length-1];if(!n?.parts)return t;let i=[];for(let t of n.parts){if(!(0,r.isToolUIPart)(t))continue;let n=(0,r.getToolName)(t),a=e.tools[n];if(!a||t.state!==`output-available`||!a.execute||!so(t.output))continue;t.output.outcome===`approved`&&i.push({toolName:(0,r.getToolName)(t),tool:a,input:t.input,toolCallId:t.toolCallId})}if(i.length>0){let t=(0,r.createUIMessageStream)({execute:async({writer:t})=>{t.write({type:`start-step`}),await Promise.all(i.map(async n=>{if(!n.tool.execute)throw Error(`Tool does not support execute.`);t.write({type:`tool-input-available`,toolCallId:n.toolCallId,toolName:n.toolName,input:n.input});try{let i=await n.tool.execute(n.input,{toolCallId:n.toolCallId,messages:(0,r.convertToModelMessages)(e.messages,{tools:e.tools}),abortSignal:e.abortSignal});if(ht(i))for await(let e of i)t.write({type:`tool-output-available`,toolCallId:n.toolCallId,output:e,preliminary:!0});t.write({type:`tool-output-available`,toolCallId:n.toolCallId,output:i})}catch(e){t.write({type:`tool-output-error`,toolCallId:n.toolCallId,errorText:e instanceof Error?e.message:String(e)})}})),t.write({type:`finish`})}});throw new wr(`Executing tools`,t)}return t},prefix(e,t){let n={};for(let[r,i]of Object.entries(e))n[`${t}${r}`]=i;return n}});function so(e){return typeof e==`object`&&!!e&&`type`in e&&e.type===`tool-approval`}function co(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n!==void 0&&n.role===`user`&&!(typeof n.metadata!=`object`||n.metadata===null)&&`options`in n.metadata)return n.metadata.options}}const lo=`x-blink-stream-response-format`;function uo(e,t){let n=new Headers(e.headers);return n.set(lo,t),new Response(e.body,{status:e.status,statusText:e.statusText,headers:n})}exports.StreamResponseFormatHeader=lo,exports.agent=eo,exports.api=no,exports.isToolApprovalOutput=so,exports.lastUIOptions=co,exports.model=io,exports.toolWithApproval=ao,exports.tools=oo,exports.withResponseFormat=uo;
@@ -21,10 +21,10 @@ ${e}
21
21
 
22
22
  `;break}case`tool`:throw new Bi({functionality:`tool messages`});default:{let e=i;throw Error(`Unsupported role: ${e}`)}}return r+=`${n}:
23
23
  `,{prompt:r,stopSequences:[`
24
- ${t}:`]}}function Ha({id:e,model:t,created:n}){return{id:e??void 0,modelId:t??void 0,timestamp:n==null?void 0:new Date(n*1e3)}}function Ua(e){switch(e){case`stop`:return`stop`;case`length`:return`length`;case`content_filter`:return`content-filter`;case`function_call`:case`tool_calls`:return`tool-calls`;default:return`unknown`}}var Wa=s.object({echo:s.boolean().optional(),logitBias:s.record(s.string(),s.number()).optional(),suffix:s.string().optional(),user:s.string().optional()}),Ga=class{constructor(e,t){this.specificationVersion=`v2`;var n;this.modelId=e,this.config=t;let r=(n=t.errorStructure)??Fa;this.chunkSchema=Ja(r.errorSchema),this.failedResponseHandler=xa(r)}get provider(){return this.config.provider}get providerOptionsName(){return this.config.provider.split(`.`)[0].trim()}get supportedUrls(){var e,t,n;return(n=(t=(e=this.config).supportedUrls)?.call(e))??{}}async getArgs({prompt:e,maxOutputTokens:t,temperature:n,topP:r,topK:i,frequencyPenalty:a,presencePenalty:o,stopSequences:s,responseFormat:c,seed:l,providerOptions:u,tools:d,toolChoice:f}){var p;let m=[],h=(p=await va({provider:this.providerOptionsName,providerOptions:u,schema:Wa}))??{};i!=null&&m.push({type:`unsupported-setting`,setting:`topK`}),d?.length&&m.push({type:`unsupported-setting`,setting:`tools`}),f!=null&&m.push({type:`unsupported-setting`,setting:`toolChoice`}),c!=null&&c.type!==`text`&&m.push({type:`unsupported-setting`,setting:`responseFormat`,details:`JSON response format is not supported.`});let{prompt:g,stopSequences:_}=Va({prompt:e}),v=[..._??[],...s??[]];return{args:{model:this.modelId,echo:h.echo,logit_bias:h.logitBias,suffix:h.suffix,user:h.user,max_tokens:t,temperature:n,top_p:r,frequency_penalty:a,presence_penalty:o,seed:l,...u?.[this.providerOptionsName],prompt:g,stop:v.length>0?v:void 0},warnings:m}}async doGenerate(e){var t,n,r,i,a,o;let{args:s,warnings:c}=await this.getArgs(e),{responseHeaders:l,value:u,rawValue:d}=await $({url:this.config.url({path:`/completions`,modelId:this.modelId}),headers:Q(this.config.headers(),e.headers),body:s,failedResponseHandler:this.failedResponseHandler,successfulResponseHandler:Ca(qa),abortSignal:e.abortSignal,fetch:this.config.fetch}),f=u.choices[0],p=[];return f.text!=null&&f.text.length>0&&p.push({type:`text`,text:f.text}),{content:p,usage:{inputTokens:(n=(t=u.usage)?.prompt_tokens)??void 0,outputTokens:(i=(r=u.usage)?.completion_tokens)??void 0,totalTokens:(o=(a=u.usage)?.total_tokens)??void 0},finishReason:Ua(f.finish_reason),request:{body:s},response:{...Ha(u),headers:l,body:d},warnings:c}}async doStream(e){let{args:t,warnings:n}=await this.getArgs(e),r={...t,stream:!0,stream_options:this.config.includeUsage?{include_usage:!0}:void 0},{responseHeaders:i,value:a}=await $({url:this.config.url({path:`/completions`,modelId:this.modelId}),headers:Q(this.config.headers(),e.headers),body:r,failedResponseHandler:this.failedResponseHandler,successfulResponseHandler:Sa(this.chunkSchema),abortSignal:e.abortSignal,fetch:this.config.fetch}),o=`unknown`,s={inputTokens:void 0,outputTokens:void 0,totalTokens:void 0},c=!0;return{stream:a.pipeThrough(new TransformStream({start(e){e.enqueue({type:`stream-start`,warnings:n})},transform(t,n){var r,i,a;if(e.includeRawChunks&&n.enqueue({type:`raw`,rawValue:t.rawValue}),!t.success){o=`error`,n.enqueue({type:`error`,error:t.error});return}let l=t.value;if(`error`in l){o=`error`,n.enqueue({type:`error`,error:l.error});return}c&&(c=!1,n.enqueue({type:`response-metadata`,...Ha(l)}),n.enqueue({type:`text-start`,id:`0`})),l.usage!=null&&(s.inputTokens=(r=l.usage.prompt_tokens)??void 0,s.outputTokens=(i=l.usage.completion_tokens)??void 0,s.totalTokens=(a=l.usage.total_tokens)??void 0);let u=l.choices[0];u?.finish_reason!=null&&(o=Ua(u.finish_reason)),u?.text!=null&&n.enqueue({type:`text-delta`,id:`0`,delta:u.text})},flush(e){c||e.enqueue({type:`text-end`,id:`0`}),e.enqueue({type:`finish`,finishReason:o,usage:s})}})),request:{body:r},response:{headers:i}}}},Ka=s.object({prompt_tokens:s.number(),completion_tokens:s.number(),total_tokens:s.number()}),qa=s.object({id:s.string().nullish(),created:s.number().nullish(),model:s.string().nullish(),choices:s.array(s.object({text:s.string(),finish_reason:s.string()})),usage:Ka.nullish()}),Ja=e=>s.union([s.object({id:s.string().nullish(),created:s.number().nullish(),model:s.string().nullish(),choices:s.array(s.object({text:s.string(),finish_reason:s.string().nullish(),index:s.number()})),usage:Ka.nullish()}),e]),Ya=s.object({dimensions:s.number().optional(),user:s.string().optional()}),Xa=class{constructor(e,t){this.specificationVersion=`v2`,this.modelId=e,this.config=t}get provider(){return this.config.provider}get maxEmbeddingsPerCall(){var e;return(e=this.config.maxEmbeddingsPerCall)??2048}get supportsParallelCalls(){var e;return(e=this.config.supportsParallelCalls)??!0}get providerOptionsName(){return this.config.provider.split(`.`)[0].trim()}async doEmbed({values:e,headers:t,abortSignal:n,providerOptions:r}){var i,a,o;let s=Object.assign((i=await va({provider:`openai-compatible`,providerOptions:r,schema:Ya}))??{},(a=await va({provider:this.providerOptionsName,providerOptions:r,schema:Ya}))??{});if(e.length>this.maxEmbeddingsPerCall)throw new ki({provider:this.provider,modelId:this.modelId,maxEmbeddingsPerCall:this.maxEmbeddingsPerCall,values:e});let{responseHeaders:c,value:l,rawValue:u}=await $({url:this.config.url({path:`/embeddings`,modelId:this.modelId}),headers:Q(this.config.headers(),t),body:{model:this.modelId,input:e,encoding_format:`float`,dimensions:s.dimensions,user:s.user},failedResponseHandler:xa((o=this.config.errorStructure)??Fa),successfulResponseHandler:Ca(Za),abortSignal:n,fetch:this.config.fetch});return{embeddings:l.data.map(e=>e.embedding),usage:l.usage?{tokens:l.usage.prompt_tokens}:void 0,providerMetadata:l.providerMetadata,response:{headers:c,body:u}}}},Za=s.object({data:s.array(s.object({embedding:s.array(s.number())})),usage:s.object({prompt_tokens:s.number()}).nullish(),providerMetadata:s.record(s.string(),s.record(s.string(),s.any())).optional()}),Qa=class{constructor(e,t){this.modelId=e,this.config=t,this.specificationVersion=`v2`,this.maxImagesPerCall=10}get provider(){return this.config.provider}async doGenerate({prompt:e,n:t,size:n,aspectRatio:r,seed:i,providerOptions:a,headers:o,abortSignal:s}){var c,l,u,d,f;let p=[];r!=null&&p.push({type:`unsupported-setting`,setting:`aspectRatio`,details:"This model does not support aspect ratio. Use `size` instead."}),i!=null&&p.push({type:`unsupported-setting`,setting:`seed`});let m=(u=(l=(c=this.config._internal)?.currentDate)?.call(c))??new Date,{value:h,responseHeaders:g}=await $({url:this.config.url({path:`/images/generations`,modelId:this.modelId}),headers:Q(this.config.headers(),o),body:{model:this.modelId,prompt:e,n:t,size:n,...(d=a.openai)??{},response_format:`b64_json`},failedResponseHandler:xa((f=this.config.errorStructure)??Fa),successfulResponseHandler:Ca($a),abortSignal:s,fetch:this.config.fetch});return{images:h.data.map(e=>e.b64_json),warnings:p,response:{timestamp:m,modelId:this.modelId,headers:g}}}},$a=s.object({data:s.array(s.object({b64_json:s.string()}))}),eo=`1.0.19`;function to(e){let t=Oa(e.baseURL),n=e.name,r={...e.apiKey&&{Authorization:`Bearer ${e.apiKey}`},...e.headers},i=()=>Yi(r,`ai-sdk/openai-compatible/${eo}`),a=r=>({provider:`${n}.${r}`,url:({path:n})=>{let r=new URL(`${t}${n}`);return e.queryParams&&(r.search=new URLSearchParams(e.queryParams).toString()),r.toString()},headers:i,fetch:e.fetch}),o=e=>s(e),s=t=>new La(t,{...a(`chat`),includeUsage:e.includeUsage,supportsStructuredOutputs:e.supportsStructuredOutputs}),c=t=>new Ga(t,{...a(`completion`),includeUsage:e.includeUsage}),l=e=>new Xa(e,{...a(`embedding`)}),u=e=>new Qa(e,a(`image`)),d=e=>o(e);return d.languageModel=o,d.chatModel=s,d.completionModel=c,d.textEmbeddingModel=l,d.imageModel=u,d}function no(){let e={chat:[],ui:[],request:[],error:[]},t={on:(n,r)=>(e[n]=[...e[n]??[],r],t),serve:t=>{t||={},t.host||=process.env.HOST??`127.0.0.1`,t.port||=parseInt(process.env.PORT??`3000`),t.apiUrl||=process.env.BLINK_API_URL;let n=br(t.apiUrl??``,{fetch:t.apiUrl?void 0:async()=>{throw console.warn(`Your code is attempting to use the Blink API server, but no API server is configured for this Blink agent.`),Error(`No API server is configured for this Blink agent. External APIs are not available.`)}}),r={chat:{async ensure(e){let t=await n.chat[`:key`].$post({param:{key:e}});if(t.status!==200)throw Error(`Failed to ensure chat!`);return t.json()},async message(e,t,r){let i=await n.chat[`:key`].sendMessages.$post({param:{key:e},json:{message:t,options:r??{}}});if(i.status!==204)throw Error(`Failed to send message!`)}},store:{async get(e){let t=await n.kv[`:key`].$get({param:{key:e}});if(t.status!==200)throw Error(`Failed to get value!`);let{value:r}=await t.json();return r},async set(e,t){let r=await n.kv[`:key`].$post({param:{key:e},json:{value:t}});if(r.status!==204)throw Error(`Failed to set value!`)},async delete(e){let t=await n.kv[`:key`].$delete({param:{key:e}});if(t.status!==204)throw Error(`Failed to delete value!`)},async list(e,t){let r=await n.kv.$get({query:{prefix:e,limit:t?.limit,cursor:t?.cursor}});if(r.status!==200)throw Error(`Failed to list values!`);return r.json()}}},i=o.createServer($t(t=>io.fetch(t,{context:r,listeners:e})));return i.listen(t?.port??3e3,t?.host??`127.0.0.1`)}};return t}const ro=new ar().post(`/chat`,Dr(`json`,e=>({messages:e.messages,chat:e.chat})),async e=>{let t=e.env.listeners.chat,n=e.req.valid(`json`);for(let r of t){let t;try{t=await r({chat:n.chat,messages:n.messages,abortSignal:e.req.raw.signal,context:e.env.context})}catch(e){if(e instanceof Or)t=e.response;else throw e}if(!t)continue;if(t instanceof Response)return t;let i;if(t instanceof ReadableStream)i=t;else if(typeof t==`object`&&`toUIMessageStream`in t)i=t.toUIMessageStream({messageMetadata:({part:e})=>{switch(e.type){case`finish`:return{totalUsage:e.totalUsage};case`finish-step`:return{usage:e.usage,model:e.response.modelId}}}});else throw Error(`Invalid chat handler result! Must be a Response, ReadableStream, or toUIMessageStream function.`);return new Response(i.pipeThrough(new TransformStream({transform(e,t){t.enqueue(`data: ${JSON.stringify(e)}\n\n`)},flush(e){e.enqueue(`data: [DONE]
24
+ ${t}:`]}}function Ha({id:e,model:t,created:n}){return{id:e??void 0,modelId:t??void 0,timestamp:n==null?void 0:new Date(n*1e3)}}function Ua(e){switch(e){case`stop`:return`stop`;case`length`:return`length`;case`content_filter`:return`content-filter`;case`function_call`:case`tool_calls`:return`tool-calls`;default:return`unknown`}}var Wa=s.object({echo:s.boolean().optional(),logitBias:s.record(s.string(),s.number()).optional(),suffix:s.string().optional(),user:s.string().optional()}),Ga=class{constructor(e,t){this.specificationVersion=`v2`;var n;this.modelId=e,this.config=t;let r=(n=t.errorStructure)??Fa;this.chunkSchema=Ja(r.errorSchema),this.failedResponseHandler=xa(r)}get provider(){return this.config.provider}get providerOptionsName(){return this.config.provider.split(`.`)[0].trim()}get supportedUrls(){var e,t,n;return(n=(t=(e=this.config).supportedUrls)?.call(e))??{}}async getArgs({prompt:e,maxOutputTokens:t,temperature:n,topP:r,topK:i,frequencyPenalty:a,presencePenalty:o,stopSequences:s,responseFormat:c,seed:l,providerOptions:u,tools:d,toolChoice:f}){var p;let m=[],h=(p=await va({provider:this.providerOptionsName,providerOptions:u,schema:Wa}))??{};i!=null&&m.push({type:`unsupported-setting`,setting:`topK`}),d?.length&&m.push({type:`unsupported-setting`,setting:`tools`}),f!=null&&m.push({type:`unsupported-setting`,setting:`toolChoice`}),c!=null&&c.type!==`text`&&m.push({type:`unsupported-setting`,setting:`responseFormat`,details:`JSON response format is not supported.`});let{prompt:g,stopSequences:_}=Va({prompt:e}),v=[..._??[],...s??[]];return{args:{model:this.modelId,echo:h.echo,logit_bias:h.logitBias,suffix:h.suffix,user:h.user,max_tokens:t,temperature:n,top_p:r,frequency_penalty:a,presence_penalty:o,seed:l,...u?.[this.providerOptionsName],prompt:g,stop:v.length>0?v:void 0},warnings:m}}async doGenerate(e){var t,n,r,i,a,o;let{args:s,warnings:c}=await this.getArgs(e),{responseHeaders:l,value:u,rawValue:d}=await $({url:this.config.url({path:`/completions`,modelId:this.modelId}),headers:Q(this.config.headers(),e.headers),body:s,failedResponseHandler:this.failedResponseHandler,successfulResponseHandler:Ca(qa),abortSignal:e.abortSignal,fetch:this.config.fetch}),f=u.choices[0],p=[];return f.text!=null&&f.text.length>0&&p.push({type:`text`,text:f.text}),{content:p,usage:{inputTokens:(n=(t=u.usage)?.prompt_tokens)??void 0,outputTokens:(i=(r=u.usage)?.completion_tokens)??void 0,totalTokens:(o=(a=u.usage)?.total_tokens)??void 0},finishReason:Ua(f.finish_reason),request:{body:s},response:{...Ha(u),headers:l,body:d},warnings:c}}async doStream(e){let{args:t,warnings:n}=await this.getArgs(e),r={...t,stream:!0,stream_options:this.config.includeUsage?{include_usage:!0}:void 0},{responseHeaders:i,value:a}=await $({url:this.config.url({path:`/completions`,modelId:this.modelId}),headers:Q(this.config.headers(),e.headers),body:r,failedResponseHandler:this.failedResponseHandler,successfulResponseHandler:Sa(this.chunkSchema),abortSignal:e.abortSignal,fetch:this.config.fetch}),o=`unknown`,s={inputTokens:void 0,outputTokens:void 0,totalTokens:void 0},c=!0;return{stream:a.pipeThrough(new TransformStream({start(e){e.enqueue({type:`stream-start`,warnings:n})},transform(t,n){var r,i,a;if(e.includeRawChunks&&n.enqueue({type:`raw`,rawValue:t.rawValue}),!t.success){o=`error`,n.enqueue({type:`error`,error:t.error});return}let l=t.value;if(`error`in l){o=`error`,n.enqueue({type:`error`,error:l.error});return}c&&(c=!1,n.enqueue({type:`response-metadata`,...Ha(l)}),n.enqueue({type:`text-start`,id:`0`})),l.usage!=null&&(s.inputTokens=(r=l.usage.prompt_tokens)??void 0,s.outputTokens=(i=l.usage.completion_tokens)??void 0,s.totalTokens=(a=l.usage.total_tokens)??void 0);let u=l.choices[0];u?.finish_reason!=null&&(o=Ua(u.finish_reason)),u?.text!=null&&n.enqueue({type:`text-delta`,id:`0`,delta:u.text})},flush(e){c||e.enqueue({type:`text-end`,id:`0`}),e.enqueue({type:`finish`,finishReason:o,usage:s})}})),request:{body:r},response:{headers:i}}}},Ka=s.object({prompt_tokens:s.number(),completion_tokens:s.number(),total_tokens:s.number()}),qa=s.object({id:s.string().nullish(),created:s.number().nullish(),model:s.string().nullish(),choices:s.array(s.object({text:s.string(),finish_reason:s.string()})),usage:Ka.nullish()}),Ja=e=>s.union([s.object({id:s.string().nullish(),created:s.number().nullish(),model:s.string().nullish(),choices:s.array(s.object({text:s.string(),finish_reason:s.string().nullish(),index:s.number()})),usage:Ka.nullish()}),e]),Ya=s.object({dimensions:s.number().optional(),user:s.string().optional()}),Xa=class{constructor(e,t){this.specificationVersion=`v2`,this.modelId=e,this.config=t}get provider(){return this.config.provider}get maxEmbeddingsPerCall(){var e;return(e=this.config.maxEmbeddingsPerCall)??2048}get supportsParallelCalls(){var e;return(e=this.config.supportsParallelCalls)??!0}get providerOptionsName(){return this.config.provider.split(`.`)[0].trim()}async doEmbed({values:e,headers:t,abortSignal:n,providerOptions:r}){var i,a,o;let s=Object.assign((i=await va({provider:`openai-compatible`,providerOptions:r,schema:Ya}))??{},(a=await va({provider:this.providerOptionsName,providerOptions:r,schema:Ya}))??{});if(e.length>this.maxEmbeddingsPerCall)throw new ki({provider:this.provider,modelId:this.modelId,maxEmbeddingsPerCall:this.maxEmbeddingsPerCall,values:e});let{responseHeaders:c,value:l,rawValue:u}=await $({url:this.config.url({path:`/embeddings`,modelId:this.modelId}),headers:Q(this.config.headers(),t),body:{model:this.modelId,input:e,encoding_format:`float`,dimensions:s.dimensions,user:s.user},failedResponseHandler:xa((o=this.config.errorStructure)??Fa),successfulResponseHandler:Ca(Za),abortSignal:n,fetch:this.config.fetch});return{embeddings:l.data.map(e=>e.embedding),usage:l.usage?{tokens:l.usage.prompt_tokens}:void 0,providerMetadata:l.providerMetadata,response:{headers:c,body:u}}}},Za=s.object({data:s.array(s.object({embedding:s.array(s.number())})),usage:s.object({prompt_tokens:s.number()}).nullish(),providerMetadata:s.record(s.string(),s.record(s.string(),s.any())).optional()}),Qa=class{constructor(e,t){this.modelId=e,this.config=t,this.specificationVersion=`v2`,this.maxImagesPerCall=10}get provider(){return this.config.provider}async doGenerate({prompt:e,n:t,size:n,aspectRatio:r,seed:i,providerOptions:a,headers:o,abortSignal:s}){var c,l,u,d,f;let p=[];r!=null&&p.push({type:`unsupported-setting`,setting:`aspectRatio`,details:"This model does not support aspect ratio. Use `size` instead."}),i!=null&&p.push({type:`unsupported-setting`,setting:`seed`});let m=(u=(l=(c=this.config._internal)?.currentDate)?.call(c))??new Date,{value:h,responseHeaders:g}=await $({url:this.config.url({path:`/images/generations`,modelId:this.modelId}),headers:Q(this.config.headers(),o),body:{model:this.modelId,prompt:e,n:t,size:n,...(d=a.openai)??{},response_format:`b64_json`},failedResponseHandler:xa((f=this.config.errorStructure)??Fa),successfulResponseHandler:Ca($a),abortSignal:s,fetch:this.config.fetch});return{images:h.data.map(e=>e.b64_json),warnings:p,response:{timestamp:m,modelId:this.modelId,headers:g}}}},$a=s.object({data:s.array(s.object({b64_json:s.string()}))}),eo=`1.0.19`;function to(e){let t=Oa(e.baseURL),n=e.name,r={...e.apiKey&&{Authorization:`Bearer ${e.apiKey}`},...e.headers},i=()=>Yi(r,`ai-sdk/openai-compatible/${eo}`),a=r=>({provider:`${n}.${r}`,url:({path:n})=>{let r=new URL(`${t}${n}`);return e.queryParams&&(r.search=new URLSearchParams(e.queryParams).toString()),r.toString()},headers:i,fetch:e.fetch}),o=e=>s(e),s=t=>new La(t,{...a(`chat`),includeUsage:e.includeUsage,supportsStructuredOutputs:e.supportsStructuredOutputs}),c=t=>new Ga(t,{...a(`completion`),includeUsage:e.includeUsage}),l=e=>new Xa(e,{...a(`embedding`)}),u=e=>new Qa(e,a(`image`)),d=e=>o(e);return d.languageModel=o,d.chatModel=s,d.completionModel=c,d.textEmbeddingModel=l,d.imageModel=u,d}function no(){let e={chat:[],ui:[],request:[],error:[]},t={on:(n,r)=>(e[n]=[...e[n]??[],r],t),serve:t=>{t||={},t.host||=process.env.HOST??`127.0.0.1`,t.port||=parseInt(process.env.PORT??`3000`),t.apiUrl||=process.env.BLINK_API_URL;let n=br(t.apiUrl??``,{fetch:t.apiUrl?void 0:async()=>{throw console.warn(`Your code is attempting to use the Blink API server, but no API server is configured for this Blink agent.`),Error(`No API server is configured for this Blink agent. External APIs are not available.`)}}),r={chat:{async ensure(e){let t=await n.chat[`:key`].$post({param:{key:e}});if(t.status!==200)throw Error(`Failed to ensure chat!`);return t.json()},async message(e,t,r){let i=await n.chat[`:key`].sendMessages.$post({param:{key:e},json:{message:t,options:r??{}}});if(i.status!==204)throw Error(`Failed to send message!`)}},store:{async get(e){let t=await n.kv[`:key`].$get({param:{key:encodeURIComponent(e)}});if(t.status!==200)throw Error(`Failed to get value!`);let{value:r}=await t.json();return r},async set(e,t){let r=await n.kv[`:key`].$post({param:{key:encodeURIComponent(e)},json:{value:t}});if(r.status!==204)throw Error(`Failed to set value!`)},async delete(e){let t=await n.kv[`:key`].$delete({param:{key:encodeURIComponent(e)}});if(t.status!==204)throw Error(`Failed to delete value!`)},async list(e,t){let r=await n.kv.$get({query:{prefix:e?encodeURIComponent(e):void 0,limit:t?.limit,cursor:t?.cursor}});if(r.status!==200)throw Error(`Failed to list values!`);return r.json()}}},i=o.createServer($t(t=>io.fetch(t,{context:r,listeners:e})));return i.listen(t?.port??3e3,t?.host??`127.0.0.1`)}};return t}const ro=new ar().post(`/chat`,Dr(`json`,e=>({messages:e.messages,chat:e.chat})),async e=>{let t=e.env.listeners.chat,n=e.req.valid(`json`);for(let r of t){let t;try{t=await r({chat:n.chat,messages:n.messages,abortSignal:e.req.raw.signal,context:e.env.context})}catch(e){if(e instanceof Or)t=e.response;else throw e}if(!t)continue;if(t instanceof Response)return t;let i;if(t instanceof ReadableStream)i=t;else if(typeof t==`object`&&`toUIMessageStream`in t)i=t.toUIMessageStream({messageMetadata:({part:e})=>{switch(e.type){case`finish`:return{totalUsage:e.totalUsage};case`finish-step`:return{usage:e.usage,model:e.response.modelId}}}});else throw Error(`Invalid chat handler result! Must be a Response, ReadableStream, or toUIMessageStream function.`);return new Response(i.pipeThrough(new TransformStream({transform(e,t){t.enqueue(`data: ${JSON.stringify(e)}\n\n`)},flush(e){e.enqueue(`data: [DONE]
25
25
 
26
26
  `)}})).pipeThrough(new TextEncoderStream),{headers:ao})}return e.json({error:`No chat handlers found.`},404)}).get(`/capabilities`,async e=>{let t=e.env.listeners,n={ui:t.ui.length>0,chat:t.chat.length>0,request:t.request.length>0,error:t.error.length>0};return e.json(n,200)}).get(`/health`,async e=>e.body(`OK`,200)).get(`/ui`,async e=>{let t=e.req.query(`selected_options`),n;if(t)try{n=JSON.parse(t)}catch{return e.json({error:`Invalid selected_options query parameter!`},400)}let r=e.env.listeners.ui;for(let t of r){let r=await t({selectedOptions:n});if(!r)continue;return e.json(r,200)}return e.json({error:`No UI listener returned a response`},404)}),io=new ar().route(`/_agent`,ro).all(`*`,async e=>{let t=e.env.listeners.request;for(let n of t){let t=await n(e.req.raw,e.env.context);if(t)return t}return e.json({error:`No request handlers found.`},404)}),ao={"content-type":`text/event-stream`,"cache-control":`no-cache, no-transform`,connection:`keep-alive`,"x-accel-buffering":`no`},oo=e=>{let t=process.env.BLINK_TOKEN??process.env.BLINK_INVOCATION_AUTH_TOKEN;if(!t)throw Error(`You must be authenticated with Blink to use the model gateway.
27
27
 
28
28
  Authenticate with "blink login".
29
29
 
30
- Feel free to use other providers like OpenAI, Anthropic, or Google.`);return to({name:`Blink Gateway`,baseURL:`https://blink.so/api/ai-gateway/v1`,apiKey:t})(e)};function so(e){return e}const co=Object.freeze({withContext(e,t){let n={};for(let r of Object.keys(e)){let i=e[r];n[r]=i.withContext(t)}return n},with(e,t){let n={};for(let r of Object.keys(e)){let i=e[r];n[r]=i.withContext(t)}return n},async withApproval(e){let t={};for(let[n,r]of Object.entries(e.tools)){let e=r.execute;t[n]={...r,execute:async(t,n)=>{if(r.autoApprove&&e){let i=await r.autoApprove(t);if(i)return e(t,n)}let i={type:`tool-approval`,outcome:`pending`};return i}}}let n=e.messages[e.messages.length-1];if(!n?.parts)return t;let r=[];for(let t of n.parts){if(!d(t))continue;let n=u(t),i=e.tools[n];if(!i||t.state!==`output-available`||!i.execute||!lo(t.output))continue;t.output.outcome===`approved`&&r.push({toolName:u(t),tool:i,input:t.input,toolCallId:t.toolCallId})}if(r.length>0){let t=l({execute:async({writer:t})=>{t.write({type:`start-step`}),await Promise.all(r.map(async n=>{if(!n.tool.execute)throw Error(`Tool does not support execute.`);t.write({type:`tool-input-available`,toolCallId:n.toolCallId,toolName:n.toolName,input:n.input});try{let r=await n.tool.execute(n.input,{toolCallId:n.toolCallId,messages:c(e.messages,{tools:e.tools}),abortSignal:e.abortSignal});if(yt(r))for await(let e of r)t.write({type:`tool-output-available`,toolCallId:n.toolCallId,output:e,preliminary:!0});t.write({type:`tool-output-available`,toolCallId:n.toolCallId,output:r})}catch(e){t.write({type:`tool-output-error`,toolCallId:n.toolCallId,errorText:e instanceof Error?e.message:String(e)})}})),t.write({type:`finish`})}});throw new Or(`Executing tools`,t)}return t},prefix(e,t){let n={};for(let[r,i]of Object.entries(e))n[`${t}${r}`]=i;return n}});function lo(e){return typeof e==`object`&&!!e&&`type`in e&&e.type===`tool-approval`}function uo(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n!==void 0&&n.role===`user`&&!(typeof n.metadata!=`object`||n.metadata===null)&&`options`in n.metadata)return n.metadata.options}}const fo=`x-blink-stream-response-format`;function po(e,t){let n=new Headers(e.headers);return n.set(fo,t),new Response(e.body,{status:e.status,statusText:e.statusText,headers:n})}export{fo as StreamResponseFormatHeader,no as agent,io as api,lo as isToolApprovalOutput,uo as lastUIOptions,oo as model,so as toolWithApproval,co as tools,po as withResponseFormat};
30
+ Feel free to use other providers like OpenAI, Anthropic, or Google.`);let n=process.env.INTERNAL_BLINK_API_SERVER_URL??`https://blink.so`,r=new URL(`/api/ai-gateway/v1`,n);return to({name:`Blink Gateway`,baseURL:r.toString(),apiKey:t})(e)};function so(e){return e}const co=Object.freeze({withContext(e,t){let n={};for(let r of Object.keys(e)){let i=e[r];n[r]=i.withContext(t)}return n},with(e,t){let n={};for(let r of Object.keys(e)){let i=e[r];n[r]=i.withContext(t)}return n},async withApproval(e){let t={};for(let[n,r]of Object.entries(e.tools)){let e=r.execute;t[n]={...r,execute:async(t,n)=>{if(r.autoApprove&&e){let i=await r.autoApprove(t);if(i)return e(t,n)}let i={type:`tool-approval`,outcome:`pending`};return i}}}let n=e.messages[e.messages.length-1];if(!n?.parts)return t;let r=[];for(let t of n.parts){if(!d(t))continue;let n=u(t),i=e.tools[n];if(!i||t.state!==`output-available`||!i.execute||!lo(t.output))continue;t.output.outcome===`approved`&&r.push({toolName:u(t),tool:i,input:t.input,toolCallId:t.toolCallId})}if(r.length>0){let t=l({execute:async({writer:t})=>{t.write({type:`start-step`}),await Promise.all(r.map(async n=>{if(!n.tool.execute)throw Error(`Tool does not support execute.`);t.write({type:`tool-input-available`,toolCallId:n.toolCallId,toolName:n.toolName,input:n.input});try{let r=await n.tool.execute(n.input,{toolCallId:n.toolCallId,messages:c(e.messages,{tools:e.tools}),abortSignal:e.abortSignal});if(yt(r))for await(let e of r)t.write({type:`tool-output-available`,toolCallId:n.toolCallId,output:e,preliminary:!0});t.write({type:`tool-output-available`,toolCallId:n.toolCallId,output:r})}catch(e){t.write({type:`tool-output-error`,toolCallId:n.toolCallId,errorText:e instanceof Error?e.message:String(e)})}})),t.write({type:`finish`})}});throw new Or(`Executing tools`,t)}return t},prefix(e,t){let n={};for(let[r,i]of Object.entries(e))n[`${t}${r}`]=i;return n}});function lo(e){return typeof e==`object`&&!!e&&`type`in e&&e.type===`tool-approval`}function uo(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n!==void 0&&n.role===`user`&&!(typeof n.metadata!=`object`||n.metadata===null)&&`options`in n.metadata)return n.metadata.options}}const fo=`x-blink-stream-response-format`;function po(e,t){let n=new Headers(e.headers);return n.set(fo,t),new Response(e.body,{status:e.status,statusText:e.statusText,headers:n})}export{fo as StreamResponseFormatHeader,no as agent,io as api,lo as isToolApprovalOutput,uo as lastUIOptions,oo as model,so as toolWithApproval,co as tools,po as withResponseFormat};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blink",
3
- "version": "0.1.76",
3
+ "version": "0.1.78",
4
4
  "description": "Blink is a JavaScript runtime for building and deploying AI agents.",
5
5
  "type": "module",
6
6
  "bin": {