@omarestrella/ai-sdk-agent-sdk 1.0.0-beta.2 → 1.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +41 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +641 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +9 -8
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -6
- package/dist/index.js.map +0 -1
- package/dist/json.d.ts +0 -6
- package/dist/json.d.ts.map +0 -1
- package/dist/json.js +0 -29
- package/dist/json.js.map +0 -1
- package/dist/language-model.d.ts +0 -23
- package/dist/language-model.d.ts.map +0 -1
- package/dist/language-model.js +0 -440
- package/dist/language-model.js.map +0 -1
- package/dist/logger.d.ts +0 -15
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -142
- package/dist/logger.js.map +0 -1
- package/dist/messages.d.ts +0 -14
- package/dist/messages.d.ts.map +0 -1
- package/dist/messages.js +0 -92
- package/dist/messages.js.map +0 -1
- package/dist/provider.d.ts +0 -15
- package/dist/provider.d.ts.map +0 -1
- package/dist/provider.js +0 -19
- package/dist/provider.js.map +0 -1
- package/dist/tools.d.ts +0 -21
- package/dist/tools.d.ts.map +0 -1
- package/dist/tools.js +0 -82
- package/dist/tools.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/logger.ts","../src/json.ts","../src/messages.ts","../src/tools.ts","../src/language-model.ts","../src/provider.ts"],"sourcesContent":["import { createWriteStream, existsSync, mkdirSync } from \"fs\";\nimport type { WriteStream } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { safeJsonStringify } from \"./json\";\n\n/**\n * This is a weird file. We want to log to a file, but only if the consola package\n * we are using is available.\n */\n\n// Environment configuration\nconst LOG_LEVEL = (process.env.LOG_LEVEL as string) || \"debug\";\nconst LOG_DIR =\n process.env.LOG_DIR || join(homedir(), \".cache\", \"ai-sdk-claude-agent\");\nconst LOG_FILE = process.env.LOG_FILE || \"ai-sdk-claude-agent.log\";\n\n// Ensure log directory exists\nif (!existsSync(LOG_DIR)) {\n try {\n mkdirSync(LOG_DIR, { recursive: true });\n } catch {\n // Silent fail\n }\n}\n\nconst LOG_FILE_PATH = join(LOG_DIR, LOG_FILE);\n\n// Persistent write stream for file logging\nlet logStream: WriteStream | null = null;\n\nfunction getLogStream(): WriteStream {\n if (!logStream) {\n logStream = createWriteStream(LOG_FILE_PATH, { flags: \"a\" });\n }\n return logStream;\n}\n\n// Type definitions for consola\ninterface ConsolaInstance {\n debug: (message: string, ...args: unknown[]) => void;\n info: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n log: (message: string, ...args: unknown[]) => void;\n}\n\nlet consolaInstance: ConsolaInstance | null = null;\nlet consolaLoadAttempted = false;\n\n/**\n * Dynamically loads consola if available.\n * This is an optional peer dependency - if not installed, logging is a no-op.\n */\nasync function loadConsola(): Promise<ConsolaInstance | null> {\n if (consolaLoadAttempted) return consolaInstance;\n consolaLoadAttempted = true;\n\n try {\n // Dynamic import - will fail gracefully if consola is not installed\n const { createConsola } = await import(\"consola\");\n\n const reporters = [];\n\n // File reporter configuration\n if (LOG_FILE) {\n reporters.push({\n log: (logObj: { level: number; args: unknown[]; date: Date }) => {\n // Consola levels: 0=fatal/error, 1=warn, 2=log, 3=info, 4=debug, 5=trace\n const levelNames: Record<number, string> = {\n 0: \"ERROR\",\n 1: \"WARN\",\n 2: \"LOG\",\n 3: \"INFO\",\n 4: \"DEBUG\",\n 5: \"TRACE\",\n };\n const levelName = levelNames[logObj.level] || \"LOG\";\n const message = logObj.args\n .map((arg) =>\n typeof arg === \"object\" ? safeJsonStringify(arg) : String(arg),\n )\n .join(\" \");\n\n const line =\n safeJsonStringify({\n timestamp: logObj.date.toISOString(),\n level: levelName,\n message,\n }) + \"\\n\";\n\n // Append to file using persistent stream\n getLogStream().write(line);\n },\n });\n }\n\n consolaInstance = createConsola({\n // Consola levels: 0=fatal/error, 1=warn, 2=log, 3=info, 4=debug, 5=trace\n level:\n LOG_LEVEL === \"trace\"\n ? 5\n : LOG_LEVEL === \"debug\"\n ? 4\n : LOG_LEVEL === \"info\"\n ? 3\n : LOG_LEVEL === \"warn\"\n ? 1\n : 0,\n reporters,\n }) as ConsolaInstance;\n\n consolaInstance.info(\"Logger initialized with consola\", {\n level: LOG_LEVEL,\n file: LOG_FILE_PATH,\n });\n\n return consolaInstance;\n } catch {\n // consola is not installed - logging will be a no-op\n return null;\n }\n}\n\n// Initialize consola asynchronously\nconst consolaPromise = loadConsola();\n\n/**\n * Logger interface that wraps consola if available, otherwise no-op.\n */\nexport const logger = {\n debug(message: string, ...args: unknown[]): void {\n if (consolaInstance) {\n consolaInstance.debug(message, ...args);\n } else {\n consolaPromise.then((c) => c?.debug(message, ...args));\n }\n },\n\n info(message: string, ...args: unknown[]): void {\n if (consolaInstance) {\n consolaInstance.info(message, ...args);\n } else {\n consolaPromise.then((c) => c?.info(message, ...args));\n }\n },\n\n warn(message: string, ...args: unknown[]): void {\n if (consolaInstance) {\n consolaInstance.warn(message, ...args);\n } else {\n consolaPromise.then((c) => c?.warn(message, ...args));\n }\n },\n\n error(message: string, ...args: unknown[]): void {\n if (consolaInstance) {\n consolaInstance.error(message, ...args);\n } else {\n consolaPromise.then((c) => c?.error(message, ...args));\n }\n },\n\n /**\n * Legacy method - logs at info level\n * @deprecated Use logger.info() or logger.debug() instead\n */\n log(message: string, ...args: unknown[]): void {\n this.info(message, ...args);\n },\n};\n","import { logger } from \"./logger\";\n\n/**\n * Safely serializes a value to JSON, handling circular references\n * by replacing them with `[Circular]`.\n */\nexport function safeJsonStringify(\n value: unknown,\n space?: string | number,\n): string {\n const seen = new WeakSet();\n\n try {\n return JSON.stringify(\n value,\n (key, val) => {\n if (val === null || typeof val !== \"object\") {\n return val;\n }\n\n if (seen.has(val)) {\n return \"[Circular]\";\n }\n\n seen.add(val);\n return val;\n },\n space,\n );\n } catch (e) {\n const err = e as Error;\n logger.error(\"Cannot stringify JSON\", {\n error: err.message,\n stack: err.stack,\n });\n return \"{}\";\n }\n}\n","import type { LanguageModelV2Prompt } from \"@ai-sdk/provider\";\nimport { safeJsonStringify } from \"./json\";\nimport { logger } from \"./logger\";\n\nexport interface ConvertedPrompt {\n systemPrompt: string;\n prompt: string;\n}\n\n/**\n * Converts an AI SDK LanguageModelV2 prompt (array of system/user/assistant/tool messages)\n * into a system prompt string and a user prompt string for the Claude Agent SDK's query().\n *\n * Since we use maxTurns: 1, the Agent SDK makes a single LLM call. We serialize the full\n * conversation history into the prompt so the LLM has context from prior turns.\n */\nexport function convertMessages(messages: LanguageModelV2Prompt): ConvertedPrompt {\n logger.debug(\"Converting messages:\", { count: messages.length });\n\n const systemParts: string[] = [];\n const conversationParts: string[] = [];\n\n for (const message of messages) {\n logger.debug(\"Processing message:\", { role: message.role });\n switch (message.role) {\n case \"system\": {\n systemParts.push(message.content);\n break;\n }\n\n case \"user\": {\n const parts: string[] = [];\n logger.debug(\"Processing user message parts:\", { count: message.content.length });\n for (const part of message.content) {\n switch (part.type) {\n case \"text\":\n parts.push(part.text);\n break;\n case \"file\":\n parts.push(`[File: ${part.filename ?? part.mediaType}]`);\n break;\n }\n }\n if (parts.length > 0) {\n conversationParts.push(`[user]\\n${parts.join(\"\\n\")}`);\n }\n break;\n }\n\n case \"assistant\": {\n const parts: string[] = [];\n logger.debug(\"Processing assistant message parts:\", { count: message.content.length });\n for (const part of message.content) {\n switch (part.type) {\n case \"text\":\n parts.push(part.text);\n break;\n case \"tool-call\":\n parts.push(`[tool_call: ${part.toolName}(${safeJsonStringify(part.input)})]`);\n break;\n case \"reasoning\":\n parts.push(`[thinking]\\n${part.text}\\n[/thinking]`);\n break;\n }\n }\n if (parts.length > 0) {\n conversationParts.push(`[assistant]\\n${parts.join(\"\\n\")}`);\n }\n break;\n }\n\n case \"tool\": {\n const parts: string[] = [];\n for (const part of message.content) {\n const output = part.output;\n let outputText: string;\n if (Array.isArray(output)) {\n // Output is LanguageModelV2ToolResultOutput (array of parts)\n outputText = output\n .map((o) => {\n if (o.type === \"text\") return o.text;\n return `[${o.type}]`;\n })\n .join(\"\\n\");\n } else {\n outputText = typeof output === \"string\" ? output : safeJsonStringify(output);\n }\n parts.push(`[tool_result: ${part.toolName} (id: ${part.toolCallId})]\\n${outputText}`);\n }\n if (parts.length > 0) {\n conversationParts.push(parts.join(\"\\n\"));\n }\n break;\n }\n }\n }\n\n return {\n systemPrompt: systemParts.join(\"\\n\\n\"),\n prompt: conversationParts.join(\"\\n\\n\"),\n };\n}\n","import type { LanguageModelV2FunctionTool } from \"@ai-sdk/provider\";\nimport {\n createSdkMcpServer,\n tool,\n type McpServerConfig,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport * as z from \"zod\";\nimport { safeJsonStringify } from \"./json\";\nimport { logger } from \"./logger\";\n\n/**\n * The name of the MCP server that hosts AI SDK tools.\n * This is used to identify tools when the Agent SDK returns them\n * in the format: mcp__{SERVER_NAME}__{tool_name}\n */\nexport const AI_SDK_MCP_SERVER_NAME = \"ai-sdk-tools\";\n\n/**\n * Extracts Zod schema from AI SDK tool inputSchema using Zod 4's native\n * JSON Schema conversion.\n */\nfunction extractZodSchema(\n tool: LanguageModelV2FunctionTool,\n): Record<string, z.ZodTypeAny> {\n const inputSchema = tool.inputSchema as Record<string, unknown> | undefined;\n\n if (!inputSchema || typeof inputSchema !== \"object\") {\n return {};\n }\n\n try {\n const zodSchema = z.fromJSONSchema(inputSchema);\n if (zodSchema instanceof z.ZodObject) {\n return zodSchema.shape;\n }\n return { value: zodSchema };\n } catch (error) {\n logger.error(\"Failed to convert JSON Schema to Zod:\", {\n tool: tool.name,\n error,\n });\n return {};\n }\n}\n\n/**\n * Converts AI SDK function tool definitions into an in-process Agent SDK MCP server.\n *\n * Each AI SDK tool becomes an MCP tool with proper parameter validation.\n * Since we use maxTurns: 1, the Agent SDK will report tool_use blocks in the\n * assistant message but won't execute them. The AI SDK caller handles actual\n * tool execution.\n */\nexport function convertTools(tools: LanguageModelV2FunctionTool[] | undefined):\n | {\n mcpServer: McpServerConfig;\n allowedTools: string[];\n }\n | undefined {\n if (!tools || tools.length === 0) return undefined;\n\n logger.debug(\"Converting tools:\", {\n count: tools.length,\n tools: tools.map((t) => t.name),\n });\n\n const mcpTools = tools.map((aiTool) => {\n const zodSchema = extractZodSchema(aiTool);\n\n logger.debug(\"Creating tool:\", {\n name: aiTool.name,\n schemaKeys: Object.keys(zodSchema),\n });\n\n return tool(\n aiTool.name,\n aiTool.description ?? \"\",\n zodSchema,\n async () => {\n // Stub handler — tool execution is deferred to the AI SDK caller.\n // This should rarely (if ever) be called with maxTurns: 1.\n return {\n content: [\n {\n type: \"text\" as const,\n text: safeJsonStringify({\n _deferred: true,\n message: \"Tool execution deferred to AI SDK caller\",\n }),\n },\n ],\n };\n },\n );\n });\n\n logger.info(\"Created MCP server with\", mcpTools.length, \"tools\");\n\n const mcpServer = createSdkMcpServer({\n name: AI_SDK_MCP_SERVER_NAME,\n tools: mcpTools,\n });\n\n // Generate the allowed tool names with MCP prefix format\n const allowedTools = tools.map(\n (t) => `mcp__${AI_SDK_MCP_SERVER_NAME}__${t.name}`,\n );\n\n logger.debug(\"Allowed tools:\", allowedTools);\n\n return { mcpServer, allowedTools };\n}\n","import type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2CallWarning,\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n} from \"@ai-sdk/provider\";\nimport { query, type Options } from \"@anthropic-ai/claude-agent-sdk\";\nimport { safeJsonStringify } from \"./json\";\nimport { convertMessages } from \"./messages\";\nimport { AI_SDK_MCP_SERVER_NAME, convertTools } from \"./tools\";\nimport { logger } from \"./logger\";\n\n/**\n * Strips the MCP prefix from tool names returned by the Agent SDK.\n * The Agent SDK returns tools in format: mcp__{serverName}__{toolName}\n * The AI SDK expects just the original tool name.\n */\nfunction stripMcpPrefix(toolName: string): string {\n const prefix = `mcp__${AI_SDK_MCP_SERVER_NAME}__`;\n if (toolName.startsWith(prefix)) {\n return toolName.slice(prefix.length);\n }\n return toolName;\n}\n\nfunction mapFinishReason(\n stopReason: string | null | undefined,\n hasToolCalls: boolean,\n): LanguageModelV2FinishReason {\n if (hasToolCalls) return \"tool-calls\";\n\n switch (stopReason) {\n case \"end_turn\":\n return \"stop\";\n case \"max_tokens\":\n return \"length\";\n case \"stop_sequence\":\n return \"stop\";\n case \"tool_use\":\n return \"tool-calls\";\n default:\n return \"unknown\";\n }\n}\n\nexport interface ClaudeAgentLanguageModelConfig {\n provider: string;\n cwd?: string;\n}\n\ntype DoGenerateOptions = Parameters<LanguageModelV2[\"doGenerate\"]>[0];\ntype DoGenerateResult = Awaited<ReturnType<LanguageModelV2[\"doGenerate\"]>>;\ntype DoStreamOptions = Parameters<LanguageModelV2[\"doStream\"]>[0];\ntype DoStreamResult = Awaited<ReturnType<LanguageModelV2[\"doStream\"]>>;\n\nlet idCounter = 0;\nfunction generateId(): string {\n return `agent-${Date.now()}-${++idCounter}`;\n}\n\nexport class ClaudeAgentLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = \"v2\" as const;\n readonly modelId: string;\n readonly defaultObjectGenerationMode = undefined;\n\n private readonly config: ClaudeAgentLanguageModelConfig;\n\n constructor(modelId: string, config: ClaudeAgentLanguageModelConfig) {\n this.modelId = modelId;\n this.config = config;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportedUrls(): Record<string, RegExp[]> {\n return {};\n }\n\n private buildQueryOptions(options: LanguageModelV2CallOptions) {\n const { systemPrompt, prompt } = convertMessages(options.prompt);\n const convertedTools = convertTools(options.tools as any);\n\n const abortController = new AbortController();\n if (options.abortSignal) {\n options.abortSignal.addEventListener(\"abort\", () => {\n abortController.abort();\n });\n }\n\n const queryOptions: Options = {\n model: this.modelId,\n maxTurns: 1,\n permissionMode: \"bypassPermissions\" as const,\n allowDangerouslySkipPermissions: true,\n abortController,\n tools: [],\n allowedTools: [`mcp__${AI_SDK_MCP_SERVER_NAME}__*`],\n ...(this.config.cwd ? { cwd: this.config.cwd } : {}),\n };\n\n if (systemPrompt) {\n queryOptions.systemPrompt = systemPrompt;\n }\n\n if (convertedTools?.mcpServer) {\n queryOptions.mcpServers = {\n [AI_SDK_MCP_SERVER_NAME]: convertedTools.mcpServer,\n };\n }\n\n return { prompt, queryOptions };\n }\n\n async doGenerate(options: DoGenerateOptions): Promise<DoGenerateResult> {\n const warnings: LanguageModelV2CallWarning[] = [];\n const { prompt, queryOptions } = this.buildQueryOptions(options);\n\n const generator = query({\n prompt,\n options: queryOptions as any,\n });\n\n const content: LanguageModelV2Content[] = [];\n let usage: LanguageModelV2Usage = {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n };\n let finishReason: LanguageModelV2FinishReason = \"unknown\";\n let hasToolCalls = false;\n\n // Track message UUIDs to avoid counting usage multiple times\n // Per SDK docs: all messages with same ID have identical usage\n const seenMessageIds = new Set<string>();\n\n for await (const message of generator) {\n if (message.type === \"assistant\") {\n const apiMessage = message.message as any;\n const messageId = (message as any).uuid as string | undefined;\n\n if (Array.isArray(apiMessage.content)) {\n for (const block of apiMessage.content) {\n if (block.type === \"text\") {\n content.push({ type: \"text\", text: block.text });\n } else if (block.type === \"tool_use\") {\n hasToolCalls = true;\n const originalToolName = stripMcpPrefix(block.name);\n content.push({\n type: \"tool-call\",\n toolCallId: block.id,\n toolName: originalToolName,\n input:\n typeof block.input === \"string\"\n ? block.input\n : safeJsonStringify(block.input),\n });\n } else if (block.type === \"thinking\") {\n content.push({\n type: \"reasoning\",\n text: block.thinking ?? \"\",\n });\n }\n }\n\n // Only record usage once per unique message ID\n if (apiMessage.usage && messageId && !seenMessageIds.has(messageId)) {\n seenMessageIds.add(messageId);\n usage = {\n inputTokens: apiMessage.usage.input_tokens,\n outputTokens: apiMessage.usage.output_tokens,\n totalTokens:\n (apiMessage.usage.input_tokens ?? 0) +\n (apiMessage.usage.output_tokens ?? 0),\n };\n logger.debug(\"Usage reported in doGenerate\", {\n messageId,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n });\n }\n\n finishReason = mapFinishReason(apiMessage.stop_reason, hasToolCalls);\n }\n }\n\n if (message.type === \"result\") {\n // Result message contains cumulative usage from all steps\n if (message.usage) {\n usage = {\n inputTokens: message.usage.input_tokens ?? usage.inputTokens,\n outputTokens: message.usage.output_tokens ?? usage.outputTokens,\n totalTokens: usage.totalTokens,\n };\n logger.debug(\"Final usage from result message\", {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n });\n }\n }\n }\n\n // Calculate total tokens if we have both input and output\n if (usage.inputTokens !== undefined && usage.outputTokens !== undefined) {\n usage.totalTokens = usage.inputTokens + usage.outputTokens;\n }\n\n return {\n content,\n finishReason,\n usage,\n warnings,\n request: { body: queryOptions },\n response: {\n headers: undefined,\n },\n };\n }\n\n async doStream(options: DoStreamOptions): Promise<DoStreamResult> {\n const warnings: LanguageModelV2CallWarning[] = [];\n const { prompt, queryOptions } = this.buildQueryOptions(options);\n\n // Enable partial messages to get raw Anthropic streaming events\n queryOptions.includePartialMessages = true;\n\n const generator = query({\n prompt,\n options: queryOptions,\n });\n\n let hasToolCalls = false;\n\n const stream = new ReadableStream<LanguageModelV2StreamPart>({\n async start(controller) {\n controller.enqueue({ type: \"stream-start\", warnings });\n\n let finishReason: LanguageModelV2FinishReason = \"unknown\";\n let usage: LanguageModelV2Usage = {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n };\n\n // Track active text block for start/delta/end lifecycle\n let activeTextId: string | null = null;\n // Track active reasoning block\n let activeReasoningId: string | null = null;\n\n // Track tool calls being streamed (keyed by content block index)\n const toolCalls: Map<\n number,\n { toolCallId: string; toolName: string; argsText: string }\n > = new Map();\n\n // Track message UUIDs to avoid counting usage multiple times\n // Per SDK docs: all messages with same ID have identical usage\n const seenMessageIds = new Set<string>();\n\n try {\n for await (const message of generator) {\n if (message.type === \"stream_event\") {\n const event = message.event;\n\n if (!event || !event.type) continue;\n\n switch (event.type) {\n case \"message_start\": {\n const msg = event.message;\n if (msg) {\n controller.enqueue({\n type: \"response-metadata\",\n id: msg.id,\n timestamp: new Date(),\n modelId: msg.model,\n });\n if (msg.usage) {\n usage.inputTokens = msg.usage.input_tokens;\n logger.debug(\n \"Initial usage reported in doStream (message_start)\",\n {\n inputTokens: usage.inputTokens,\n },\n );\n }\n }\n break;\n }\n\n case \"content_block_start\": {\n const block = event.content_block;\n const index = event.index as number;\n\n if (block?.type === \"text\") {\n activeTextId = generateId();\n controller.enqueue({\n type: \"text-start\",\n id: activeTextId,\n });\n } else if (block?.type === \"tool_use\") {\n hasToolCalls = true;\n const id = block.id ?? generateId();\n toolCalls.set(index, {\n toolCallId: id,\n toolName: block.name,\n argsText: \"\",\n });\n controller.enqueue({\n type: \"tool-input-start\",\n id,\n toolName: block.name,\n });\n } else if (block?.type === \"thinking\") {\n activeReasoningId = generateId();\n controller.enqueue({\n type: \"reasoning-start\",\n id: activeReasoningId,\n });\n }\n break;\n }\n\n case \"content_block_delta\": {\n const delta = event.delta;\n const index = event.index as number;\n\n if (delta?.type === \"text_delta\") {\n if (!activeTextId) {\n activeTextId = generateId();\n controller.enqueue({\n type: \"text-start\",\n id: activeTextId,\n });\n }\n controller.enqueue({\n type: \"text-delta\",\n id: activeTextId,\n delta: delta.text,\n });\n } else if (delta?.type === \"input_json_delta\") {\n const tc = toolCalls.get(index);\n if (tc) {\n tc.argsText += delta.partial_json;\n controller.enqueue({\n type: \"tool-input-delta\",\n id: tc.toolCallId,\n delta: delta.partial_json,\n });\n }\n } else if (delta?.type === \"thinking_delta\") {\n if (!activeReasoningId) {\n activeReasoningId = generateId();\n controller.enqueue({\n type: \"reasoning-start\",\n id: activeReasoningId,\n });\n }\n controller.enqueue({\n type: \"reasoning-delta\",\n id: activeReasoningId,\n delta: delta.thinking,\n });\n }\n break;\n }\n\n case \"content_block_stop\": {\n const index = event.index as number;\n const tc = toolCalls.get(index);\n\n if (tc) {\n const originalToolName = stripMcpPrefix(tc.toolName);\n // End the tool input stream\n controller.enqueue({\n type: \"tool-input-end\",\n id: tc.toolCallId,\n });\n // Emit the complete tool call\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: tc.toolCallId,\n toolName: originalToolName,\n input: tc.argsText,\n });\n toolCalls.delete(index);\n } else if (activeTextId) {\n controller.enqueue({\n type: \"text-end\",\n id: activeTextId,\n });\n activeTextId = null;\n } else if (activeReasoningId) {\n controller.enqueue({\n type: \"reasoning-end\",\n id: activeReasoningId,\n });\n activeReasoningId = null;\n }\n break;\n }\n\n case \"message_delta\": {\n if (event.usage) {\n usage.outputTokens = event.usage.output_tokens;\n if (usage.inputTokens !== undefined) {\n usage.totalTokens =\n usage.inputTokens + (event.usage.output_tokens ?? 0);\n }\n logger.debug(\n \"Usage delta reported in doStream (message_delta)\",\n {\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n },\n );\n }\n finishReason = mapFinishReason(\n event.delta?.stop_reason,\n hasToolCalls,\n );\n break;\n }\n\n case \"message_stop\": {\n // Final streaming event\n break;\n }\n }\n } else if (message.type === \"assistant\") {\n // Full assistant message — only update finish reason, not usage\n // Usage is tracked from streaming events (message_start, message_delta)\n // Per SDK docs: assistant messages share usage with streaming events\n const apiMessage = (message as any).message;\n const messageId = (message as any).uuid as string | undefined;\n\n if (Array.isArray(apiMessage?.content)) {\n for (const block of apiMessage.content) {\n if (block.type === \"tool_use\") {\n hasToolCalls = true;\n }\n }\n }\n\n // Don't overwrite usage from streaming events - they are more accurate\n // and already tracked. Only log if this is a new message ID.\n if (\n apiMessage?.usage &&\n messageId &&\n !seenMessageIds.has(messageId)\n ) {\n seenMessageIds.add(messageId);\n logger.debug(\n \"Assistant message usage (already tracked from streaming)\",\n {\n messageId,\n inputTokens: apiMessage.usage.input_tokens,\n outputTokens: apiMessage.usage.output_tokens,\n },\n );\n }\n\n if (apiMessage?.stop_reason) {\n finishReason = mapFinishReason(\n apiMessage.stop_reason,\n hasToolCalls,\n );\n }\n } else if (message.type === \"result\") {\n // Final result with cumulative usage from all steps\n const result = message as any;\n if (result.usage) {\n usage.inputTokens =\n result.usage.input_tokens ?? usage.inputTokens;\n usage.outputTokens =\n result.usage.output_tokens ?? usage.outputTokens;\n logger.debug(\"Final usage from result message\", {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n });\n }\n }\n }\n } catch (error) {\n controller.enqueue({ type: \"error\", error });\n }\n\n // Close any dangling blocks\n if (activeTextId) {\n controller.enqueue({ type: \"text-end\", id: activeTextId });\n }\n if (activeReasoningId) {\n controller.enqueue({ type: \"reasoning-end\", id: activeReasoningId });\n }\n\n // Calculate total tokens if not already done\n if (\n usage.inputTokens !== undefined &&\n usage.outputTokens !== undefined\n ) {\n usage.totalTokens = usage.inputTokens + usage.outputTokens;\n }\n\n controller.enqueue({\n type: \"finish\",\n finishReason,\n usage,\n });\n\n controller.close();\n },\n });\n\n return {\n stream,\n request: { body: queryOptions },\n response: {\n headers: undefined,\n },\n };\n }\n}\n","import type { LanguageModelV2 } from \"@ai-sdk/provider\";\nimport {\n ClaudeAgentLanguageModel,\n type ClaudeAgentLanguageModelConfig,\n} from \"./language-model\";\nimport { safeJsonStringify } from \"./json\";\nimport { logger } from \"./logger\";\n\nexport interface ClaudeAgentProviderSettings {\n name?: string;\n\n /**\n * Working directory for the Agent SDK.\n * @default process.cwd()\n */\n cwd?: string;\n}\n\nexport interface ClaudeAgentProvider {\n (modelId: string): LanguageModelV2;\n languageModel(modelId: string): LanguageModelV2;\n}\n\nexport function createClaudeAgent(\n options: ClaudeAgentProviderSettings = {},\n): ClaudeAgentProvider {\n const config: ClaudeAgentLanguageModelConfig = {\n provider: options.name ?? \"claude-agent\",\n cwd: options.cwd,\n };\n\n logger.debug(\"Creating agent with:\", safeJsonStringify(options));\n\n const createLanguageModel = (modelId: string): LanguageModelV2 => {\n return new ClaudeAgentLanguageModel(modelId, config);\n };\n\n const provider = function (modelId: string) {\n return createLanguageModel(modelId);\n };\n\n provider.languageModel = createLanguageModel;\n\n return provider as ClaudeAgentProvider;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@omarestrella/ai-sdk-agent-sdk",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.3",
|
|
4
4
|
"description": "AI SDK provider for the Agent SDK for OpenCode",
|
|
5
5
|
"homepage": "https://github.com/omarestrella/ai-sdk-agent-sdk",
|
|
6
6
|
"keywords": [
|
|
@@ -21,19 +21,19 @@
|
|
|
21
21
|
"README.md"
|
|
22
22
|
],
|
|
23
23
|
"type": "module",
|
|
24
|
-
"main": "./dist/index.
|
|
25
|
-
"types": "./dist/index.d.
|
|
24
|
+
"main": "./dist/index.mjs",
|
|
25
|
+
"types": "./dist/index.d.mts",
|
|
26
26
|
"exports": {
|
|
27
27
|
".": {
|
|
28
28
|
"import": {
|
|
29
|
-
"types": "./dist/index.d.
|
|
30
|
-
"default": "./dist/index.
|
|
29
|
+
"types": "./dist/index.d.mts",
|
|
30
|
+
"default": "./dist/index.mjs"
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
},
|
|
34
34
|
"scripts": {
|
|
35
|
-
"build": "
|
|
36
|
-
"prepublishOnly": "rm -rf dist &&
|
|
35
|
+
"build": "tsdown",
|
|
36
|
+
"prepublishOnly": "rm -rf dist && tsdown",
|
|
37
37
|
"lint": "oxlint",
|
|
38
38
|
"lint:fix": "oxlint --fix",
|
|
39
39
|
"fmt": "oxfmt",
|
|
@@ -48,11 +48,12 @@
|
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@anthropic-ai/sdk": "^0.72.1",
|
|
51
|
-
"@types/consola": "^2.2.8",
|
|
52
51
|
"@types/bun": "^1.3.8",
|
|
52
|
+
"@types/consola": "^2.2.8",
|
|
53
53
|
"@types/node": "^25.1.0",
|
|
54
54
|
"oxfmt": "^0.27.0",
|
|
55
55
|
"oxlint": "^1.42.0",
|
|
56
|
+
"tsdown": "^0.20.1",
|
|
56
57
|
"typescript": "^5.0.0"
|
|
57
58
|
},
|
|
58
59
|
"peerDependencies": {
|
package/dist/index.d.ts
DELETED
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,GACjC,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAI5D,OAAO,EAAE,iBAAiB,IAAI,MAAM,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export { createClaudeAgent, } from "./provider";
|
|
2
|
-
export { ClaudeAgentLanguageModel } from "./language-model";
|
|
3
|
-
// `create` alias for compatibility with opencode's dynamic provider loader,
|
|
4
|
-
// which looks for a `create` function export from npm packages.
|
|
5
|
-
export { createClaudeAgent as create } from "./provider";
|
|
6
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAGlB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,4EAA4E;AAC5E,gEAAgE;AAChE,OAAO,EAAE,iBAAiB,IAAI,MAAM,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/json.d.ts
DELETED
package/dist/json.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GACtB,MAAM,CA4BR"}
|
package/dist/json.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { logger } from "./logger";
|
|
2
|
-
/**
|
|
3
|
-
* Safely serializes a value to JSON, handling circular references
|
|
4
|
-
* by replacing them with `[Circular]`.
|
|
5
|
-
*/
|
|
6
|
-
export function safeJsonStringify(value, space) {
|
|
7
|
-
const seen = new WeakSet();
|
|
8
|
-
try {
|
|
9
|
-
return JSON.stringify(value, (key, val) => {
|
|
10
|
-
if (val === null || typeof val !== "object") {
|
|
11
|
-
return val;
|
|
12
|
-
}
|
|
13
|
-
if (seen.has(val)) {
|
|
14
|
-
return "[Circular]";
|
|
15
|
-
}
|
|
16
|
-
seen.add(val);
|
|
17
|
-
return val;
|
|
18
|
-
}, space);
|
|
19
|
-
}
|
|
20
|
-
catch (e) {
|
|
21
|
-
const err = e;
|
|
22
|
-
logger.error("Cannot stringify JSON", {
|
|
23
|
-
error: err.message,
|
|
24
|
-
stack: err.stack,
|
|
25
|
-
});
|
|
26
|
-
return "{}";
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=json.js.map
|
package/dist/json.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAc,EACd,KAAuB;IAEvB,MAAM,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;IAE3B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CACnB,KAAK,EACL,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACX,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5C,OAAO,GAAG,CAAC;YACb,CAAC;YAED,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,OAAO,YAAY,CAAC;YACtB,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,GAAG,CAAC;QACb,CAAC,EACD,KAAK,CACN,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAU,CAAC;QACvB,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;YACpC,KAAK,EAAE,GAAG,CAAC,OAAO;YAClB,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/language-model.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { LanguageModelV2 } from "@ai-sdk/provider";
|
|
2
|
-
export interface ClaudeAgentLanguageModelConfig {
|
|
3
|
-
provider: string;
|
|
4
|
-
cwd?: string;
|
|
5
|
-
}
|
|
6
|
-
type DoGenerateOptions = Parameters<LanguageModelV2["doGenerate"]>[0];
|
|
7
|
-
type DoGenerateResult = Awaited<ReturnType<LanguageModelV2["doGenerate"]>>;
|
|
8
|
-
type DoStreamOptions = Parameters<LanguageModelV2["doStream"]>[0];
|
|
9
|
-
type DoStreamResult = Awaited<ReturnType<LanguageModelV2["doStream"]>>;
|
|
10
|
-
export declare class ClaudeAgentLanguageModel implements LanguageModelV2 {
|
|
11
|
-
readonly specificationVersion: "v2";
|
|
12
|
-
readonly modelId: string;
|
|
13
|
-
readonly defaultObjectGenerationMode: undefined;
|
|
14
|
-
private readonly config;
|
|
15
|
-
constructor(modelId: string, config: ClaudeAgentLanguageModelConfig);
|
|
16
|
-
get provider(): string;
|
|
17
|
-
get supportedUrls(): Record<string, RegExp[]>;
|
|
18
|
-
private buildQueryOptions;
|
|
19
|
-
doGenerate(options: DoGenerateOptions): Promise<DoGenerateResult>;
|
|
20
|
-
doStream(options: DoStreamOptions): Promise<DoStreamResult>;
|
|
21
|
-
}
|
|
22
|
-
export {};
|
|
23
|
-
//# sourceMappingURL=language-model.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"language-model.d.ts","sourceRoot":"","sources":["../src/language-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAOhB,MAAM,kBAAkB,CAAC;AAwC1B,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,KAAK,iBAAiB,GAAG,UAAU,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,KAAK,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AAC3E,KAAK,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,KAAK,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAOvE,qBAAa,wBAAyB,YAAW,eAAe;IAC9D,QAAQ,CAAC,oBAAoB,EAAG,IAAI,CAAU;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,2BAA2B,YAAa;IAEjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;gBAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,8BAA8B;IAKnE,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAE5C;IAED,OAAO,CAAC,iBAAiB;IAmCnB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA0GjE,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CA6SlE"}
|