Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@micdrop/ai-sdk

Package Overview
Dependencies
Maintainers
1
Versions
7
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@micdrop/ai-sdk - npm Package Compare versions

Comparing version
1.0.1
to
1.0.2
+14
-2
dist/index.js

@@ -46,4 +46,6 @@ "use strict";

async generateAnswer(stream) {
this.abortController = new AbortController();
const abortController = new AbortController();
this.abortController = abortController;
const signal = this.abortController.signal;
let skipAnswer = false;
let extracting = false;

@@ -58,2 +60,10 @@ const extractOptions = this.getExtractOptions();

stopWhen: (0, import_ai.stepCountIs)(5),
onStepFinish: (step) => {
const tools = step.toolCalls.map(
(toolCall) => this.getTool(toolCall.toolName)
);
if (tools.some((t) => t?.skipAnswer)) {
skipAnswer = true;
}
},
...this.options.settings,

@@ -63,2 +73,3 @@ abortSignal: signal

for await (const textPart of result.textStream) {
if (skipAnswer) return;
this.log(`Answer chunk: "${textPart}"`);

@@ -80,2 +91,3 @@ if (extractOptions) {

}
if (skipAnswer) return;
const fullText = await result.text;

@@ -85,3 +97,3 @@ const { message, metadata } = this.extract(fullText);

} catch (error) {
if (!signal.aborted) {
if (abortController === this.abortController) {
console.error("[AiSdkAgent] Error answering:", error);

@@ -88,0 +100,0 @@ }

+1
-1

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/index.ts","../src/AiSdkAgent.ts"],"sourcesContent":["export * from './AiSdkAgent'","import { Agent, AgentOptions } from '@micdrop/server'\nimport {\n CallSettings,\n LanguageModel,\n ModelMessage,\n stepCountIs,\n streamText,\n tool,\n ToolSet,\n} from 'ai'\nimport { PassThrough } from 'stream'\nimport { z } from 'zod'\n\nexport interface AiSdkAgentOptions extends AgentOptions {\n model: LanguageModel\n settings?: CallSettings\n}\n\nexport class AiSdkAgent extends Agent<AiSdkAgentOptions> {\n private abortController?: AbortController\n\n answer() {\n this.cancel()\n this.log('Start answering')\n const stream = new PassThrough()\n\n this.generateAnswer(stream).finally(() => {\n this.abortController = undefined\n if (stream.writable) {\n stream.end()\n }\n })\n\n return stream\n }\n\n private async generateAnswer(stream: PassThrough): Promise<void> {\n this.abortController = new AbortController()\n const signal = this.abortController.signal\n\n // Prepare extracting\n let extracting = false\n const extractOptions = this.getExtractOptions()\n\n try {\n // Generate response using AI SDK\n const result = streamText({\n model: this.options.model,\n messages: this.buildMessages(),\n tools: this.buildTools(),\n maxRetries: 3,\n stopWhen: stepCountIs(5),\n ...this.options.settings,\n abortSignal: signal,\n })\n\n for await (const textPart of result.textStream) {\n this.log(`Answer chunk: \"${textPart}\"`)\n\n // Extracting value?\n if (extractOptions) {\n if (!extracting) {\n const startTagIndex = textPart.indexOf(extractOptions.startTag)\n if (startTagIndex !== -1) {\n extracting = true\n const messagePart = textPart.slice(0, startTagIndex).trimEnd()\n stream.write(messagePart)\n continue\n }\n } else {\n // Extracting, don't write to stream\n continue\n }\n }\n\n // Send chunk\n stream.write(textPart)\n }\n\n const fullText = await result.text\n const { message, metadata } = this.extract(fullText)\n\n // Emit message\n this.addAssistantMessage(message, metadata)\n } catch (error: any) {\n if (!signal.aborted) {\n console.error('[AiSdkAgent] Error answering:', error)\n }\n }\n }\n\n private buildMessages(): ModelMessage[] {\n return this.conversation.map((message): ModelMessage => {\n switch (message.role) {\n case 'user':\n case 'assistant':\n case 'system':\n return {\n role: message.role,\n content: message.content,\n }\n case 'tool_call':\n return {\n role: 'assistant',\n content: [\n {\n type: 'tool-call',\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n input: JSON.parse(message.parameters),\n },\n ],\n }\n case 'tool_result':\n return {\n role: 'tool',\n content: [\n {\n type: 'tool-result',\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n output: {\n type: 'json',\n value: JSON.parse(message.output),\n },\n },\n ],\n }\n }\n })\n }\n\n private buildTools() {\n const tools: ToolSet = {}\n\n // Disable tools if first message\n const enableTools = this.conversation.length > 1\n if (!enableTools) return tools\n\n this.tools.forEach((t) => {\n tools[t.name] = tool({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema || z.object({}),\n execute: (args, { toolCallId }) =>\n this.executeTool({\n role: 'tool_call',\n toolCallId,\n toolName: t.name,\n parameters: JSON.stringify(args),\n }),\n })\n })\n return tools\n }\n\n cancel() {\n if (!this.abortController) return\n this.log('Cancel')\n this.abortController.abort()\n this.abortController = undefined\n }\n}\n"],"mappings":"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","names":[]}
{"version":3,"sources":["../src/index.ts","../src/AiSdkAgent.ts"],"sourcesContent":["export * from './AiSdkAgent'","import { Agent, AgentOptions } from '@micdrop/server'\nimport {\n CallSettings,\n LanguageModel,\n ModelMessage,\n stepCountIs,\n streamText,\n tool,\n ToolSet,\n} from 'ai'\nimport { PassThrough } from 'stream'\nimport { z } from 'zod'\n\nexport interface AiSdkAgentOptions extends AgentOptions {\n model: LanguageModel\n settings?: CallSettings\n}\n\nexport class AiSdkAgent extends Agent<AiSdkAgentOptions> {\n private abortController?: AbortController\n\n answer() {\n this.cancel()\n this.log('Start answering')\n const stream = new PassThrough()\n\n this.generateAnswer(stream).finally(() => {\n this.abortController = undefined\n if (stream.writable) {\n stream.end()\n }\n })\n\n return stream\n }\n\n private async generateAnswer(stream: PassThrough): Promise<void> {\n const abortController = new AbortController()\n this.abortController = abortController\n const signal = this.abortController.signal\n let skipAnswer = false\n\n // Prepare extracting\n let extracting = false\n const extractOptions = this.getExtractOptions()\n\n try {\n // Generate response using AI SDK\n const result = streamText({\n model: this.options.model,\n messages: this.buildMessages(),\n tools: this.buildTools(),\n maxRetries: 3,\n stopWhen: stepCountIs(5),\n onStepFinish: (step) => {\n const tools = step.toolCalls.map((toolCall) =>\n this.getTool(toolCall.toolName)\n )\n if (tools.some((t) => t?.skipAnswer)) {\n skipAnswer = true\n }\n },\n ...this.options.settings,\n abortSignal: signal,\n })\n\n for await (const textPart of result.textStream) {\n if (skipAnswer) return\n this.log(`Answer chunk: \"${textPart}\"`)\n\n // Extracting value?\n if (extractOptions) {\n if (!extracting) {\n const startTagIndex = textPart.indexOf(extractOptions.startTag)\n if (startTagIndex !== -1) {\n extracting = true\n const messagePart = textPart.slice(0, startTagIndex).trimEnd()\n stream.write(messagePart)\n continue\n }\n } else {\n // Extracting, don't write to stream\n continue\n }\n }\n\n // Send chunk\n stream.write(textPart)\n }\n if (skipAnswer) return\n\n const fullText = await result.text\n const { message, metadata } = this.extract(fullText)\n\n // Emit message\n this.addAssistantMessage(message, metadata)\n } catch (error: any) {\n if (abortController === this.abortController) {\n console.error('[AiSdkAgent] Error answering:', error)\n }\n }\n }\n\n private buildMessages(): ModelMessage[] {\n return this.conversation.map((message): ModelMessage => {\n switch (message.role) {\n case 'user':\n case 'assistant':\n case 'system':\n return {\n role: message.role,\n content: message.content,\n }\n case 'tool_call':\n return {\n role: 'assistant',\n content: [\n {\n type: 'tool-call',\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n input: JSON.parse(message.parameters),\n },\n ],\n }\n case 'tool_result':\n return {\n role: 'tool',\n content: [\n {\n type: 'tool-result',\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n output: {\n type: 'json',\n value: JSON.parse(message.output),\n },\n },\n ],\n }\n }\n })\n }\n\n private buildTools() {\n const tools: ToolSet = {}\n\n // Disable tools if first message\n const enableTools = this.conversation.length > 1\n if (!enableTools) return tools\n\n this.tools.forEach((t) => {\n tools[t.name] = tool({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema || z.object({}),\n execute: (args, { toolCallId }) =>\n this.executeTool({\n role: 'tool_call',\n toolCallId,\n toolName: t.name,\n parameters: JSON.stringify(args),\n }),\n })\n })\n return tools\n }\n\n cancel() {\n if (!this.abortController) return\n this.log('Cancel')\n this.abortController.abort()\n this.abortController = undefined\n }\n}\n"],"mappings":"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","names":[]}

@@ -24,4 +24,6 @@ // src/AiSdkAgent.ts

async generateAnswer(stream) {
this.abortController = new AbortController();
const abortController = new AbortController();
this.abortController = abortController;
const signal = this.abortController.signal;
let skipAnswer = false;
let extracting = false;

@@ -36,2 +38,10 @@ const extractOptions = this.getExtractOptions();

stopWhen: stepCountIs(5),
onStepFinish: (step) => {
const tools = step.toolCalls.map(
(toolCall) => this.getTool(toolCall.toolName)
);
if (tools.some((t) => t?.skipAnswer)) {
skipAnswer = true;
}
},
...this.options.settings,

@@ -41,2 +51,3 @@ abortSignal: signal

for await (const textPart of result.textStream) {
if (skipAnswer) return;
this.log(`Answer chunk: "${textPart}"`);

@@ -58,2 +69,3 @@ if (extractOptions) {

}
if (skipAnswer) return;
const fullText = await result.text;

@@ -63,3 +75,3 @@ const { message, metadata } = this.extract(fullText);

} catch (error) {
if (!signal.aborted) {
if (abortController === this.abortController) {
console.error("[AiSdkAgent] Error answering:", error);

@@ -66,0 +78,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/AiSdkAgent.ts"],"sourcesContent":["import { Agent, AgentOptions } from '@micdrop/server'\nimport {\n CallSettings,\n LanguageModel,\n ModelMessage,\n stepCountIs,\n streamText,\n tool,\n ToolSet,\n} from 'ai'\nimport { PassThrough } from 'stream'\nimport { z } from 'zod'\n\nexport interface AiSdkAgentOptions extends AgentOptions {\n model: LanguageModel\n settings?: CallSettings\n}\n\nexport class AiSdkAgent extends Agent<AiSdkAgentOptions> {\n private abortController?: AbortController\n\n answer() {\n this.cancel()\n this.log('Start answering')\n const stream = new PassThrough()\n\n this.generateAnswer(stream).finally(() => {\n this.abortController = undefined\n if (stream.writable) {\n stream.end()\n }\n })\n\n return stream\n }\n\n private async generateAnswer(stream: PassThrough): Promise<void> {\n this.abortController = new AbortController()\n const signal = this.abortController.signal\n\n // Prepare extracting\n let extracting = false\n const extractOptions = this.getExtractOptions()\n\n try {\n // Generate response using AI SDK\n const result = streamText({\n model: this.options.model,\n messages: this.buildMessages(),\n tools: this.buildTools(),\n maxRetries: 3,\n stopWhen: stepCountIs(5),\n ...this.options.settings,\n abortSignal: signal,\n })\n\n for await (const textPart of result.textStream) {\n this.log(`Answer chunk: \"${textPart}\"`)\n\n // Extracting value?\n if (extractOptions) {\n if (!extracting) {\n const startTagIndex = textPart.indexOf(extractOptions.startTag)\n if (startTagIndex !== -1) {\n extracting = true\n const messagePart = textPart.slice(0, startTagIndex).trimEnd()\n stream.write(messagePart)\n continue\n }\n } else {\n // Extracting, don't write to stream\n continue\n }\n }\n\n // Send chunk\n stream.write(textPart)\n }\n\n const fullText = await result.text\n const { message, metadata } = this.extract(fullText)\n\n // Emit message\n this.addAssistantMessage(message, metadata)\n } catch (error: any) {\n if (!signal.aborted) {\n console.error('[AiSdkAgent] Error answering:', error)\n }\n }\n }\n\n private buildMessages(): ModelMessage[] {\n return this.conversation.map((message): ModelMessage => {\n switch (message.role) {\n case 'user':\n case 'assistant':\n case 'system':\n return {\n role: message.role,\n content: message.content,\n }\n case 'tool_call':\n return {\n role: 'assistant',\n content: [\n {\n type: 'tool-call',\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n input: JSON.parse(message.parameters),\n },\n ],\n }\n case 'tool_result':\n return {\n role: 'tool',\n content: [\n {\n type: 'tool-result',\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n output: {\n type: 'json',\n value: JSON.parse(message.output),\n },\n },\n ],\n }\n }\n })\n }\n\n private buildTools() {\n const tools: ToolSet = {}\n\n // Disable tools if first message\n const enableTools = this.conversation.length > 1\n if (!enableTools) return tools\n\n this.tools.forEach((t) => {\n tools[t.name] = tool({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema || z.object({}),\n execute: (args, { toolCallId }) =>\n this.executeTool({\n role: 'tool_call',\n toolCallId,\n toolName: t.name,\n parameters: JSON.stringify(args),\n }),\n })\n })\n return tools\n }\n\n cancel() {\n if (!this.abortController) return\n this.log('Cancel')\n this.abortController.abort()\n this.abortController = undefined\n }\n}\n"],"mappings":"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","names":[]}
{"version":3,"sources":["../src/AiSdkAgent.ts"],"sourcesContent":["import { Agent, AgentOptions } from '@micdrop/server'\nimport {\n CallSettings,\n LanguageModel,\n ModelMessage,\n stepCountIs,\n streamText,\n tool,\n ToolSet,\n} from 'ai'\nimport { PassThrough } from 'stream'\nimport { z } from 'zod'\n\nexport interface AiSdkAgentOptions extends AgentOptions {\n model: LanguageModel\n settings?: CallSettings\n}\n\nexport class AiSdkAgent extends Agent<AiSdkAgentOptions> {\n private abortController?: AbortController\n\n answer() {\n this.cancel()\n this.log('Start answering')\n const stream = new PassThrough()\n\n this.generateAnswer(stream).finally(() => {\n this.abortController = undefined\n if (stream.writable) {\n stream.end()\n }\n })\n\n return stream\n }\n\n private async generateAnswer(stream: PassThrough): Promise<void> {\n const abortController = new AbortController()\n this.abortController = abortController\n const signal = this.abortController.signal\n let skipAnswer = false\n\n // Prepare extracting\n let extracting = false\n const extractOptions = this.getExtractOptions()\n\n try {\n // Generate response using AI SDK\n const result = streamText({\n model: this.options.model,\n messages: this.buildMessages(),\n tools: this.buildTools(),\n maxRetries: 3,\n stopWhen: stepCountIs(5),\n onStepFinish: (step) => {\n const tools = step.toolCalls.map((toolCall) =>\n this.getTool(toolCall.toolName)\n )\n if (tools.some((t) => t?.skipAnswer)) {\n skipAnswer = true\n }\n },\n ...this.options.settings,\n abortSignal: signal,\n })\n\n for await (const textPart of result.textStream) {\n if (skipAnswer) return\n this.log(`Answer chunk: \"${textPart}\"`)\n\n // Extracting value?\n if (extractOptions) {\n if (!extracting) {\n const startTagIndex = textPart.indexOf(extractOptions.startTag)\n if (startTagIndex !== -1) {\n extracting = true\n const messagePart = textPart.slice(0, startTagIndex).trimEnd()\n stream.write(messagePart)\n continue\n }\n } else {\n // Extracting, don't write to stream\n continue\n }\n }\n\n // Send chunk\n stream.write(textPart)\n }\n if (skipAnswer) return\n\n const fullText = await result.text\n const { message, metadata } = this.extract(fullText)\n\n // Emit message\n this.addAssistantMessage(message, metadata)\n } catch (error: any) {\n if (abortController === this.abortController) {\n console.error('[AiSdkAgent] Error answering:', error)\n }\n }\n }\n\n private buildMessages(): ModelMessage[] {\n return this.conversation.map((message): ModelMessage => {\n switch (message.role) {\n case 'user':\n case 'assistant':\n case 'system':\n return {\n role: message.role,\n content: message.content,\n }\n case 'tool_call':\n return {\n role: 'assistant',\n content: [\n {\n type: 'tool-call',\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n input: JSON.parse(message.parameters),\n },\n ],\n }\n case 'tool_result':\n return {\n role: 'tool',\n content: [\n {\n type: 'tool-result',\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n output: {\n type: 'json',\n value: JSON.parse(message.output),\n },\n },\n ],\n }\n }\n })\n }\n\n private buildTools() {\n const tools: ToolSet = {}\n\n // Disable tools if first message\n const enableTools = this.conversation.length > 1\n if (!enableTools) return tools\n\n this.tools.forEach((t) => {\n tools[t.name] = tool({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema || z.object({}),\n execute: (args, { toolCallId }) =>\n this.executeTool({\n role: 'tool_call',\n toolCallId,\n toolName: t.name,\n parameters: JSON.stringify(args),\n }),\n })\n })\n return tools\n }\n\n cancel() {\n if (!this.abortController) return\n this.log('Cancel')\n this.abortController.abort()\n this.abortController = undefined\n }\n}\n"],"mappings":"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","names":[]}
{
"name": "@micdrop/ai-sdk",
"version": "1.0.1",
"version": "1.0.2",
"description": "AI SDK implementation for @micdrop/server",

@@ -5,0 +5,0 @@ "author": "Lonestone",