@robota-sdk/agent-provider 3.0.0-beta.65 → 3.0.0-beta.67
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/README.md +89 -0
- package/dist/browser/index.d.ts +5 -2
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +3 -3
- package/dist/browser/index.js.map +1 -1
- package/dist/loggers/index.d.ts.map +1 -1
- package/dist/loggers/index.js.map +1 -1
- package/dist/node/anthropic/index.d.ts +1 -1
- package/dist/node/anthropic/index.d.ts.map +1 -1
- package/dist/node/anthropic--1vgLC-e.js.map +1 -1
- package/dist/node/bytedance/index.d.ts.map +1 -1
- package/dist/node/bytedance-C_0sF_pJ.js.map +1 -1
- package/dist/node/deepseek-_8Ixx7rA.js.map +1 -1
- package/dist/node/gemini/index.d.ts.map +1 -1
- package/dist/node/gemini-Bh2U87MY.js.map +1 -1
- package/dist/node/gemma/index.cjs +1 -1
- package/dist/node/gemma/index.d.ts +1 -1
- package/dist/node/gemma/index.js +1 -1
- package/dist/node/{gemma-G-Pf_PnX.cjs → gemma-079LPvrN.cjs} +1 -1
- package/dist/node/gemma-BMFWnmXE.js +2 -0
- package/dist/node/gemma-BMFWnmXE.js.map +1 -0
- package/dist/node/google/index.d.ts.map +1 -1
- package/dist/node/google/index.js.map +1 -1
- package/dist/node/index-B6PnlDMd.d.ts.map +1 -1
- package/dist/node/index-B7UvPJcI.d.ts.map +1 -1
- package/dist/node/{index-C3beaqKO.d.ts → index-B9a2gTwI.d.ts} +3 -3
- package/dist/node/{index-BqixM_XD.d.ts.map → index-B9a2gTwI.d.ts.map} +1 -1
- package/dist/node/index-BLPOTNb5.d.ts.map +1 -1
- package/dist/node/{index-BqixM_XD.d.ts → index-CjPeNJ1G.d.ts} +3 -3
- package/dist/node/{index-C3beaqKO.d.ts.map → index-CjPeNJ1G.d.ts.map} +1 -1
- package/dist/node/index-Cp2XRh9G.d.ts.map +1 -1
- package/dist/node/index-DSv5xruI.d.ts.map +1 -1
- package/dist/node/index-w0bV1uaP.d.ts.map +1 -1
- package/dist/node/index.cjs +1 -1
- package/dist/node/index.d.ts +11 -5
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +2 -1
- package/dist/node/index.js.map +1 -0
- package/dist/node/openai/index.cjs +1 -1
- package/dist/node/openai/index.d.ts +1 -1
- package/dist/node/openai/index.js +1 -1
- package/dist/node/openai--CyyQ-E4.js +2 -0
- package/dist/node/openai--CyyQ-E4.js.map +1 -0
- package/dist/node/{openai-xWC6pY7r.cjs → openai-CmuDu5k-.cjs} +1 -1
- package/dist/node/openai-compatible-Dm4Sof9e.js.map +1 -1
- package/dist/node/qwen/index.cjs +1 -1
- package/dist/node/qwen/index.d.ts +1 -1
- package/dist/node/qwen/index.js +1 -1
- package/dist/node/qwen-D8gtsbsC.js +2 -0
- package/dist/node/qwen-D8gtsbsC.js.map +1 -0
- package/dist/node/qwen-DxNnm7Le.cjs +1 -0
- package/package.json +4 -2
- package/src/anthropic/index.ts +1 -1
- package/src/anthropic/message-converter.ts +3 -2
- package/src/anthropic/model-catalog-refresh.ts +5 -4
- package/src/anthropic/parsers/response-parser.ts +5 -2
- package/src/anthropic/provider-definition.ts +2 -1
- package/src/anthropic/provider.ts +6 -3
- package/src/anthropic/streaming-handler.ts +4 -2
- package/src/anthropic/types.ts +1 -1
- package/src/bytedance/http-client.ts +1 -1
- package/src/bytedance/provider.spec.ts +1 -0
- package/src/bytedance/provider.ts +10 -9
- package/src/bytedance/status-mapper.ts +1 -1
- package/src/deepseek/model-catalog-refresh.ts +6 -5
- package/src/deepseek/model-catalog.ts +2 -1
- package/src/deepseek/provider-definition.ts +3 -2
- package/src/deepseek/provider.ts +11 -9
- package/src/deepseek/types.ts +1 -1
- package/src/default-provider-definitions.ts +19 -0
- package/src/gemini/execution-helpers.ts +14 -12
- package/src/gemini/image-operations.ts +2 -2
- package/src/gemini/message-converter.ts +1 -0
- package/src/gemini/model-catalog-refresh.ts +2 -1
- package/src/gemini/provider-definition.ts +2 -1
- package/src/gemini/provider.spec.ts +2 -0
- package/src/gemini/provider.ts +6 -3
- package/src/gemini/tool-schema-converter.ts +1 -0
- package/src/gemma/message-factory.ts +2 -1
- package/src/gemma/provider-definition.ts +3 -2
- package/src/gemma/provider-projection.ts +4 -3
- package/src/gemma/provider.ts +19 -17
- package/src/gemma/pseudo-command-envelope.ts +1 -0
- package/src/gemma/pseudo-tool-call-projector.ts +2 -1
- package/src/gemma/streaming-projection.ts +6 -4
- package/src/gemma/tool-call-projector.ts +4 -3
- package/src/gemma/types.ts +1 -1
- package/src/google/provider.ts +1 -0
- package/src/index.ts +2 -0
- package/src/openai/adapter.ts +1 -1
- package/src/openai/chat-completions-chat.ts +8 -7
- package/src/openai/loggers/console-payload-logger.ts +4 -2
- package/src/openai/loggers/file-payload-logger.ts +5 -2
- package/src/openai/message-converter.ts +3 -2
- package/src/openai/openai-request-format.ts +1 -1
- package/src/openai/parsers/response-parser.ts +3 -2
- package/src/openai/provider-definition.ts +3 -2
- package/src/openai/provider.ts +11 -9
- package/src/openai/responses-chat.ts +7 -5
- package/src/openai/responses-converter.ts +6 -6
- package/src/openai/responses-parser.ts +4 -2
- package/src/openai/responses-types.ts +1 -1
- package/src/openai/streaming/stream-handler.ts +6 -4
- package/src/openai/types.ts +1 -2
- package/src/qwen/model-catalog-refresh.ts +6 -5
- package/src/qwen/provider-capabilities.ts +1 -1
- package/src/qwen/provider-definition.ts +6 -5
- package/src/qwen/provider-streaming-assembly.ts +3 -2
- package/src/qwen/provider.ts +19 -12
- package/src/qwen/responses-chat.ts +8 -6
- package/src/qwen/responses-converter.ts +1 -1
- package/src/qwen/responses-parser.ts +4 -2
- package/src/qwen/types.ts +1 -1
- package/src/shared/openai-compatible/message-converter.ts +1 -1
- package/src/shared/openai-compatible/response-parser.ts +4 -2
- package/src/shared/openai-compatible/stream-assembler.ts +3 -2
- package/src/shared/openai-compatible/types.ts +1 -1
- package/dist/node/gemma-Dp_AfCUR.js +0 -2
- package/dist/node/gemma-Dp_AfCUR.js.map +0 -1
- package/dist/node/openai-CRQjg4xF.js +0 -2
- package/dist/node/openai-CRQjg4xF.js.map +0 -1
- package/dist/node/qwen-ChUZobTL.js +0 -2
- package/dist/node/qwen-ChUZobTL.js.map +0 -1
- package/dist/node/qwen-CjT71vSM.cjs +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/openai/types/api-types.ts","../../src/openai/interfaces/payload-logger.ts","../../src/openai/loggers/file-payload-logger.ts","../../src/openai/loggers/console-payload-logger.ts"],"mappings":";;;;;;UAuGiB,cAAA;EACf,KAAA;EACA,aAAA;EACA,QAAA;EACA,WAAA;EACA,SAAA;EACA,SAAA;EACA,SAAA;AAAA;;;;;AAPF;;;;;;UC5FiB,cAAA;EDgGf;;;;EC3FA,SAAA;ED8FS;;;;ACnGX;EAYE,UAAA,CAAW,OAAA,EAAS,cAAA,EAAgB,IAAA,sBAA0B,OAAO;AAAA;;;;UAMtD,qBAAA;EANJ;;;;EAWX,OAAA;EALe;;;;EAWf,gBAAA;EAAA;;;;EAMA,MAAA,GAAS,OAAO;AAAA;;;;ADyDlB;;;;;;;;;;;;AAOW;;;;ACnGX;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/openai/types/api-types.ts","../../src/openai/interfaces/payload-logger.ts","../../src/openai/loggers/file-payload-logger.ts","../../src/openai/loggers/console-payload-logger.ts"],"mappings":";;;;;;UAuGiB,cAAA;EACf,KAAA;EACA,aAAA;EACA,QAAA;EACA,WAAA;EACA,SAAA;EACA,SAAA;EACA,SAAA;AAAA;;;;;AAPF;;;;;;UC5FiB,cAAA;EDgGf;;;;EC3FA,SAAA;ED8FS;;;;ACnGX;EAYE,UAAA,CAAW,OAAA,EAAS,cAAA,EAAgB,IAAA,sBAA0B,OAAO;AAAA;;;;UAMtD,qBAAA;EANJ;;;;EAWX,OAAA;EALe;;;;EAWf,gBAAA;EAAA;;;;EAMA,MAAA,GAAS,OAAO;AAAA;;;;ADyDlB;;;;;;;;;;;;AAOW;;;;ACnGX;;;;;cCsBa,iBAAA,YAA6B,cAAA;EAAA,iBACvB,OAAA;EAAA,iBACA,MAAA;EAAA,iBACA,gBAAA;EAAA,iBACA,MAAA;cAEL,OAAA;IACV,MAAA;IACA,OAAA;IACA,gBAAA;IACA,MAAA,GAAS,OAAA;EAAA;EDTX;;;ECwBA,SAAA,CAAA;EDZgB;AAAA;;;;ECqBV,UAAA,CAAW,OAAA,EAAS,cAAA,EAAgB,IAAA,uBAAmC,OAAA;EAlChD;;;EAAA,QAqErB,wBAAA;AAAA;;;;;AFCV;;;;;;;;;;;;AAOW;;;;ACnGX;;;;cEkBa,oBAAA,YAAgC,cAAA;EAAA,iBAC1B,OAAA;EAAA,iBACA,gBAAA;EAAA,iBACA,MAAA;cAEL,OAAA,GAAS,qBAAA;EFXyC;;AAAO;EEoBrE,SAAA,CAAA;EFdoC;;;;;EEuB9B,UAAA,CAAW,OAAA,EAAS,cAAA,EAAgB,IAAA,uBAAmC,OAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/openai/loggers/sanitize-openai-log-data.ts","../../src/openai/loggers/file-payload-logger.ts","../../src/openai/loggers/console-payload-logger.ts"],"sourcesContent":["import type { IOpenAILogData } from '../types/api-types';\n\n/**\n * Creates a defensive deep copy of OpenAI log data.\n * SSOT utility shared by payload loggers.\n */\nexport function sanitizeOpenAILogData(payload: IOpenAILogData): IOpenAILogData {\n // Create a deep copy to avoid modifying original\n const sanitized = JSON.parse(JSON.stringify(payload)) as IOpenAILogData;\n\n // Remove or mask sensitive data if needed.\n // For now, we keep everything as OpenAI payloads don't contain API keys.\n return sanitized;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/openai/loggers/sanitize-openai-log-data.ts","../../src/openai/loggers/file-payload-logger.ts","../../src/openai/loggers/console-payload-logger.ts"],"sourcesContent":["import type { IOpenAILogData } from '../types/api-types';\n\n/**\n * Creates a defensive deep copy of OpenAI log data.\n * SSOT utility shared by payload loggers.\n */\nexport function sanitizeOpenAILogData(payload: IOpenAILogData): IOpenAILogData {\n // Create a deep copy to avoid modifying original\n const sanitized = JSON.parse(JSON.stringify(payload)) as IOpenAILogData;\n\n // Remove or mask sensitive data if needed.\n // For now, we keep everything as OpenAI payloads don't contain API keys.\n return sanitized;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nimport { SilentLogger } from '@robota-sdk/agent-core';\n\nimport { sanitizeOpenAILogData } from './sanitize-openai-log-data';\n\nimport type { IPayloadLogger } from '../interfaces/payload-logger';\nimport type { IOpenAILogData } from '../types/api-types';\nimport type { ILogger } from '@robota-sdk/agent-core';\n\n/**\n * File-based payload logger for Node.js environments\n *\n * This logger saves API request/response payloads to JSON files on disk.\n * It's designed specifically for Node.js environments with filesystem access.\n *\n * @example\n * ```typescript\n * import { FilePayloadLogger } from '@robota-sdk/agent-provider/openai/loggers';\n *\n * const logger = new FilePayloadLogger({\n * logDir: './logs/api-payloads',\n * enabled: true,\n * includeTimestamp: true\n * });\n *\n * const provider = new OpenAIProvider({\n * client: openaiClient,\n * payloadLogger: logger\n * });\n * ```\n */\nexport class FilePayloadLogger implements IPayloadLogger {\n private readonly enabled: boolean;\n private readonly logDir: string;\n private readonly includeTimestamp: boolean;\n private readonly logger: ILogger;\n\n constructor(options: {\n logDir: string;\n enabled?: boolean;\n includeTimestamp?: boolean;\n logger?: ILogger;\n }) {\n this.enabled = options.enabled ?? true;\n this.logDir = options.logDir;\n this.includeTimestamp = options.includeTimestamp ?? true;\n this.logger = options.logger || SilentLogger;\n\n if (this.enabled) {\n this.ensureLogDirectoryExists();\n }\n }\n\n /**\n * Check if logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Log API payload to file\n * @param payload - The API request payload\n * @param type - Type of request ('chat' or 'stream')\n */\n async logPayload(payload: IOpenAILogData, type: 'chat' | 'stream' = 'chat'): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n try {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const filename = this.includeTimestamp\n ? `openai-${type}-${timestamp}.json`\n : `openai-${type}-${Date.now()}.json`;\n\n const filepath = path.join(this.logDir, filename);\n\n const logData = {\n timestamp: new Date().toISOString(),\n type,\n provider: 'openai',\n payload: sanitizeOpenAILogData(payload),\n };\n\n await fs.promises.writeFile(filepath, JSON.stringify(logData, null, 2), 'utf8');\n\n // Payload saved successfully (silent operation)\n } catch (error) {\n // Don't throw errors - just log them and continue\n // This ensures that API logging failures don't break the main functionality\n this.logger.error('[FilePayloadLogger] Failed to save payload log:', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Ensure log directory exists\n */\n private ensureLogDirectoryExists(): void {\n try {\n if (!fs.existsSync(this.logDir)) {\n fs.mkdirSync(this.logDir, { recursive: true });\n }\n } catch (error) {\n this.logger.error('[FilePayloadLogger] Failed to create log directory:', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n // Sanitization intentionally lives in ./sanitize-openai-log-data.ts (SSOT utility).\n}\n","import { SilentLogger, type ILogger } from '@robota-sdk/agent-core';\n\nimport { sanitizeOpenAILogData } from './sanitize-openai-log-data';\n\nimport type { IPayloadLogger, IPayloadLoggerOptions } from '../interfaces/payload-logger';\nimport type { IOpenAILogData } from '../types/api-types';\n\n/**\n * Console-based payload logger for browser environments\n *\n * This logger outputs API request/response payloads to the browser console\n * using structured logging. It's designed specifically for browser environments\n * and development/debugging scenarios.\n *\n * @example\n * ```typescript\n * import { ConsolePayloadLogger } from '@robota-sdk/agent-provider/openai/loggers';\n *\n * const logger = new ConsolePayloadLogger({\n * enabled: true,\n * includeTimestamp: true\n * });\n *\n * const provider = new OpenAIProvider({\n * client: openaiClient,\n * payloadLogger: logger\n * });\n * ```\n */\nexport class ConsolePayloadLogger implements IPayloadLogger {\n private readonly enabled: boolean;\n private readonly includeTimestamp: boolean;\n private readonly logger: ILogger;\n\n constructor(options: IPayloadLoggerOptions = {}) {\n this.enabled = options.enabled ?? true;\n this.includeTimestamp = options.includeTimestamp ?? true;\n this.logger = options.logger || SilentLogger;\n }\n\n /**\n * Check if logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Log API payload to browser console\n * @param payload - The API request payload\n * @param type - Type of request ('chat' or 'stream')\n */\n async logPayload(payload: IOpenAILogData, type: 'chat' | 'stream' = 'chat'): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n try {\n const sanitizedPayload = sanitizeOpenAILogData(payload);\n\n // Use structured console logging for better browser developer tools integration\n const title = `[OpenAI ${type.toUpperCase()}] API Payload`;\n const timeInfo = this.includeTimestamp ? ` (${sanitizedPayload.timestamp})` : '';\n\n // Group related log entries for better organization\n this.logger.group?.(`${title}${timeInfo}`);\n\n // Log different aspects with appropriate console methods\n this.logger.info('📋 Request Details:', {\n model: payload.model,\n messagesCount: payload.messagesCount,\n hasTools: payload.hasTools,\n temperature: payload.temperature,\n maxTokens: payload.maxTokens,\n });\n\n this.logger.debug('🔍 Full Payload:', { type, provider: 'openai', ...sanitizedPayload });\n\n this.logger.groupEnd?.();\n } catch (error) {\n // Don't throw errors - just log them and continue\n // This ensures that API logging failures don't break the main functionality\n this.logger.error(\n '[ConsolePayloadLogger] Failed to log payload:',\n error instanceof Error ? error.message : 'Unknown error',\n );\n }\n }\n\n /**\n * Sanitize payload to remove sensitive information\n * @param payload - Raw payload object\n * @returns Sanitized payload\n */\n // Sanitization intentionally lives in ./sanitize-openai-log-data.ts (SSOT utility).\n}\n"],"mappings":"kGAMA,SAAgB,EAAsB,EAAyC,CAM7E,OAJkB,KAAK,MAAM,KAAK,UAAU,CAAO,CAIpC,CACjB,CCoBA,IAAa,EAAb,KAAyD,CACvD,QACA,OACA,iBACA,OAEA,YAAY,EAKT,CACD,KAAK,QAAU,EAAQ,SAAW,GAClC,KAAK,OAAS,EAAQ,OACtB,KAAK,iBAAmB,EAAQ,kBAAoB,GACpD,KAAK,OAAS,EAAQ,QAAU,EAE5B,KAAK,SACP,KAAK,yBAAyB,CAElC,CAKA,WAAqB,CACnB,OAAO,KAAK,OACd,CAOA,MAAM,WAAW,EAAyB,EAA0B,OAAuB,CACpF,QAAK,QAIV,GAAI,CACF,IAAM,EAAY,IAAI,KAAK,EAAE,YAAY,EAAE,QAAQ,QAAS,GAAG,EACzD,EAAW,KAAK,iBAClB,UAAU,EAAK,GAAG,EAAU,OAC5B,UAAU,EAAK,GAAG,KAAK,IAAI,EAAE,OAE3B,EAAW,EAAK,KAAK,KAAK,OAAQ,CAAQ,EAE1C,EAAU,CACd,UAAW,IAAI,KAAK,EAAE,YAAY,EAClC,OACA,SAAU,SACV,QAAS,EAAsB,CAAO,CACxC,EAEA,MAAM,EAAG,SAAS,UAAU,EAAU,KAAK,UAAU,EAAS,KAAM,CAAC,EAAG,MAAM,CAGhF,OAAS,EAAO,CAGd,KAAK,OAAO,MAAM,kDAAmD,CACnE,MAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAC9D,CAAC,CACH,CACF,CAKA,0BAAyC,CACvC,GAAI,CACG,EAAG,WAAW,KAAK,MAAM,GAC5B,EAAG,UAAU,KAAK,OAAQ,CAAE,UAAW,EAAK,CAAC,CAEjD,OAAS,EAAO,CACd,KAAK,OAAO,MAAM,sDAAuD,CACvE,MAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAC9D,CAAC,CACH,CACF,CAEF,ECrFa,EAAb,KAA4D,CAC1D,QACA,iBACA,OAEA,YAAY,EAAiC,CAAC,EAAG,CAC/C,KAAK,QAAU,EAAQ,SAAW,GAClC,KAAK,iBAAmB,EAAQ,kBAAoB,GACpD,KAAK,OAAS,EAAQ,QAAU,CAClC,CAKA,WAAqB,CACnB,OAAO,KAAK,OACd,CAOA,MAAM,WAAW,EAAyB,EAA0B,OAAuB,CACpF,QAAK,QAIV,GAAI,CACF,IAAM,EAAmB,EAAsB,CAAO,EAGhD,EAAQ,WAAW,EAAK,YAAY,EAAE,eACtC,EAAW,KAAK,iBAAmB,KAAK,EAAiB,UAAU,GAAK,GAG9E,KAAK,OAAO,QAAQ,GAAG,IAAQ,GAAU,EAGzC,KAAK,OAAO,KAAK,sBAAuB,CACtC,MAAO,EAAQ,MACf,cAAe,EAAQ,cACvB,SAAU,EAAQ,SAClB,YAAa,EAAQ,YACrB,UAAW,EAAQ,SACrB,CAAC,EAED,KAAK,OAAO,MAAM,mBAAoB,CAAE,OAAM,SAAU,SAAU,GAAG,CAAiB,CAAC,EAEvF,KAAK,OAAO,WAAW,CACzB,OAAS,EAAO,CAGd,KAAK,OAAO,MACV,gDACA,aAAiB,MAAQ,EAAM,QAAU,eAC3C,CACF,CACF,CAQF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import Anthropic from "@anthropic-ai/sdk";
|
|
2
1
|
import { AbstractAIProvider, IChatOptions, IExecutor, IProviderCapabilities, IProviderDefinition, IProviderModelCatalog, IProviderNativeWebToolRequest, IProviderProfileConfig, TProviderOptionValueBase, TTextDeltaCallback, TUniversalMessage } from "@robota-sdk/agent-core";
|
|
2
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
3
3
|
|
|
4
4
|
//#region src/anthropic/types.d.ts
|
|
5
5
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/anthropic/types.ts","../../../src/anthropic/provider.ts","../../../src/anthropic/provider-definition.ts","../../../src/anthropic/model-catalog-refresh.ts","../../../src/anthropic/index.ts"],"mappings":";;;;;;AAMA;KAAY,6BAAA,kDAMR,SAAA,GACA,SAAA,GACA,wBAAA,GACA,6BAAA;EAAA,CACG,GAAA,WAAc,6BAAA;AAAA;;;;;;;UAQJ,yBAAA;EAXb;;;EAAA,CAeD,GAAA,WAAc,6BAAA;EAZI;;AAA6B;EAiBhD,MAAA;EATwC;;;EAcxC,OAAA;EAuCW;;;EAlCX,OAAA;EAfe;;;;;EAsBf,MAAA,GAAS,SAAA;EA2BT;;;AAAoB;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/anthropic/types.ts","../../../src/anthropic/provider.ts","../../../src/anthropic/provider-definition.ts","../../../src/anthropic/model-catalog-refresh.ts","../../../src/anthropic/index.ts"],"mappings":";;;;;;AAMA;KAAY,6BAAA,kDAMR,SAAA,GACA,SAAA,GACA,wBAAA,GACA,6BAAA;EAAA,CACG,GAAA,WAAc,6BAAA;AAAA;;;;;;;UAQJ,yBAAA;EAXb;;;EAAA,CAeD,GAAA,WAAc,6BAAA;EAZI;;AAA6B;EAiBhD,MAAA;EATwC;;;EAcxC,OAAA;EAuCW;;;EAlCX,OAAA;EAfe;;;;;EAsBf,MAAA,GAAS,SAAA;EA2BT;;;AAAoB;;;;AC/CtB;;;;;;;;;;;;;;;;;;ED+CE,QAAA,GAAW,SAAA;AAAA;;;;AAvEb;;;;;;;;;;;;cCwBa,iBAAA,SAA0B,kBAAA;EAAA,SACnB,IAAA;EAAA,SACA,OAAA;EAAA,iBAED,MAAA;EAAA,iBACA,OAAA;EDnB+B;AAQlD;;;ECiBE,cAAA;EDSS;;;;;;ECDT,WAAA,GAAc,kBAAA;EDXd;ECcA,eAAA,IAAmB,QAAA,UAAkB,KAAA,EAAO,MAAA;cAEhC,OAAA,EAAS,yBAAA;EDJZ;;;ECiCM,IAAA,CACb,QAAA,EAAU,iBAAA,IACV,OAAA,GAAU,YAAA,GACT,OAAA,CAAQ,iBAAA;EDTS;;;ECwEJ,UAAA,CACd,QAAA,EAAU,iBAAA,IACV,OAAA,GAAU,YAAA,GACT,aAAA,CAAc,iBAAA;EAgFR,aAAA,CAAA;EAIA,eAAA,CAAA,GAAmB,qBAAA;EAsB5B,uBAAA,CAAwB,OAAA,EAAS,6BAAA,GAAgC,qBAAA;EAQxD,cAAA,CAAA;EAIM,OAAA,CAAA,GAAW,OAAA;EAxNL;;;EAAA,UA+NF,gBAAA,CAAiB,QAAA,EAAU,iBAAA;AAAA;;;cC5QnC,gCAAA;AAAA,cACA,sCAAA;AAAA,cACA,4CAAA;AAAA,cACA,0BAAA;AAAA,cACA,gCAAA;AAAA,iBAcG,iCAAA,CAAA,GAAqC,mBAAmB;;;UCbvD,wBAAA;EACf,IAAA,GAAO,KAAK;IACV,EAAA;IACA,YAAA;IACA,IAAA;EAAA;EAEF,QAAA;AAAA;AAAA,UAGe,mBAAA;EACf,OAAA,GAAU,MAAM;AAAA;AAAA,UAGD,uBAAA;EACf,EAAA;EACA,MAAA;EACA,IAAA,QAAY,OAAO,CAAC,wBAAA;AAAA;AAAA,KAGV,eAAA,IACV,GAAA,UACA,IAAA,GAAO,mBAAA,KACJ,OAAA,CAAQ,uBAAA;AAAA,iBAES,4BAAA,CACpB,OAAA,EAAS,sBAAA,EACT,OAAA,GAAS,eAAA,GACR,OAAA,CAAQ,qBAAA;;;;;;;;iBCtBK,uBAAA,CAAwB,QAAmC,EAAzB,yBAAyB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic--1vgLC-e.js","names":["toolMsg"],"sources":["../../src/anthropic/message-converter.ts","../../src/anthropic/streaming-handler.ts","../../src/anthropic/provider.ts","../../src/anthropic/model-catalog-refresh.ts","../../src/anthropic/provider-definition.ts","../../src/anthropic/index.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport Anthropic from '@anthropic-ai/sdk';\nimport type {\n TUniversalMessage,\n IToolSchema,\n IAssistantMessage,\n IToolMessage,\n} from '@robota-sdk/agent-core';\n\n/**\n * Convert TUniversalMessage array to Anthropic message format.\n *\n * CRITICAL: Anthropic API requires specific content handling:\n * - tool_use messages: content MUST be null\n * - regular messages: content should be a string\n */\nexport function convertToAnthropicFormat(messages: TUniversalMessage[]): Anthropic.MessageParam[] {\n return messages.map((msg) => {\n if (msg.role === 'user') {\n return {\n role: 'user',\n content: msg.content || '',\n };\n } else if (msg.role === 'assistant') {\n const assistantMsg = msg as IAssistantMessage;\n\n // Anthropic uses content blocks — include both text and tool_use\n if (assistantMsg.toolCalls && assistantMsg.toolCalls.length > 0) {\n const contentBlocks: Array<Anthropic.TextBlockParam | Anthropic.ToolUseBlockParam> = [];\n\n // Include text content if present alongside tool calls\n if (assistantMsg.content) {\n contentBlocks.push({\n type: 'text' as const,\n text: assistantMsg.content,\n });\n }\n\n for (const tc of assistantMsg.toolCalls) {\n contentBlocks.push({\n type: 'tool_use' as const,\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n });\n }\n\n return {\n role: 'assistant' as const,\n content: contentBlocks,\n };\n }\n\n // Regular assistant message (no tool calls)\n return {\n role: 'assistant',\n content: assistantMsg.content || '',\n };\n } else if (msg.role === 'tool') {\n // Tool result message — convert to Anthropic tool_result content block\n const toolMsg = msg as IToolMessage;\n return {\n role: 'user' as const,\n content: [\n {\n type: 'tool_result' as const,\n tool_use_id: toolMsg.toolCallId ?? '',\n content: msg.content || '',\n },\n ],\n };\n } else {\n // System messages\n return {\n role: 'user', // Anthropic doesn't have system role, use user\n content: msg.content || '',\n };\n }\n });\n}\n\n/**\n * Convert Anthropic response to TUniversalMessage.\n *\n * Anthropic responses can contain multiple content blocks:\n * e.g., [text(\"I'll read the file\"), tool_use(Read, {...}), tool_use(Bash, {...})]\n * We must extract ALL text and ALL tool_use blocks.\n */\nexport function convertFromAnthropicResponse(response: Anthropic.Message): TUniversalMessage {\n if (!response.content || response.content.length === 0) {\n throw new Error('No content in Anthropic response');\n }\n\n let textParts: string[] = [];\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }> = [];\n\n for (const block of response.content) {\n if (block.type === 'text') {\n const textBlock = block as Anthropic.TextBlock;\n if (textBlock.text) {\n textParts.push(textBlock.text);\n }\n } else if (block.type === 'tool_use') {\n const toolBlock = block as Anthropic.ToolUseBlock;\n toolCalls.push({\n id: toolBlock.id,\n type: 'function' as const,\n function: {\n name: toolBlock.name,\n arguments: JSON.stringify(toolBlock.input),\n },\n });\n } else if (block.type === 'server_tool_use') {\n // Server tool invocation (e.g., web_search) — results come in a separate block\n } else if (block.type === 'web_search_tool_result') {\n const resultBlock = block as Anthropic.Messages.WebSearchToolResultBlock;\n const searchResults = formatWebSearchResults(resultBlock);\n if (searchResults) {\n textParts.push(searchResults);\n }\n }\n }\n\n // Use empty string instead of null so agent-core's buildFinalResult\n // doesn't reject the message. Tool-only responses have no text.\n const textContent = textParts.join('\\n') || '';\n\n const result: TUniversalMessage = {\n id: randomUUID(),\n role: 'assistant',\n content: textContent,\n state: 'complete' as const,\n timestamp: new Date(),\n ...(toolCalls.length > 0 && { toolCalls }),\n };\n\n // Add metadata if available\n if (response.usage) {\n result.metadata = {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n model: response.model,\n };\n\n if (response.stop_reason) {\n result.metadata['stopReason'] = response.stop_reason;\n }\n }\n\n return result;\n}\n\n/** Format a WebSearchToolResultBlock into readable text. */\nexport function formatWebSearchResults(block: Anthropic.Messages.WebSearchToolResultBlock): string {\n if (!Array.isArray(block.content)) return '';\n\n const results = block.content\n .filter(\n (r): r is Anthropic.Messages.WebSearchResultBlock =>\n r.type === 'web_search_result' && 'title' in r && 'url' in r,\n )\n .map((r, i) => `${i + 1}. ${r.title}\\n ${r.url}`)\n .join('\\n');\n\n return results ? `[Web Search Results]\\n${results}` : '';\n}\n\n/**\n * Convert tool schemas to Anthropic format.\n */\nexport function convertToolsToAnthropicFormat(tools: IToolSchema[]): Anthropic.Tool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.parameters as Anthropic.Tool.InputSchema,\n }));\n}\n","import { randomUUID } from 'node:crypto';\nimport Anthropic from '@anthropic-ai/sdk';\nimport type {\n TProviderNativeRawPayloadCallback,\n TUniversalMessage,\n TTextDeltaCallback,\n} from '@robota-sdk/agent-core';\nimport { formatWebSearchResults } from './message-converter';\n\n/**\n * Stream the Anthropic API response and assemble a complete TUniversalMessage.\n *\n * Calls onTextDelta for each text chunk as it arrives.\n * Returns the fully assembled TUniversalMessage when the stream is done.\n */\nexport async function streamAndAssemble(\n client: Anthropic,\n params: Anthropic.MessageCreateParamsNonStreaming,\n onTextDelta: TTextDeltaCallback,\n onServerToolUse: ((toolName: string, input: Record<string, string>) => void) | undefined,\n signal: AbortSignal | undefined,\n onProviderNativeRawPayload?: TProviderNativeRawPayloadCallback,\n): Promise<TUniversalMessage> {\n const streamParams: Anthropic.MessageCreateParamsStreaming = {\n ...params,\n stream: true,\n };\n\n onProviderNativeRawPayload?.({\n provider: 'anthropic',\n apiSurface: 'anthropic-messages',\n payloadKind: 'request',\n payload: streamParams,\n });\n const stream = await client.messages.create(streamParams, signal ? { signal } : undefined);\n\n // Accumulate the full response from stream events\n const textParts: string[] = [];\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }> = [];\n let currentToolId = '';\n let currentToolName = '';\n let currentToolJson = '';\n let usage = { input_tokens: 0, output_tokens: 0 };\n let model = '';\n let stopReason: string | null = null;\n\n try {\n let sequence = 0;\n for await (const event of streamWithAbort(stream, signal)) {\n onProviderNativeRawPayload?.({\n provider: 'anthropic',\n apiSurface: 'anthropic-messages',\n payloadKind: 'stream_event',\n sequence,\n payload: event,\n });\n sequence++;\n switch (event.type) {\n case 'message_start':\n usage = event.message.usage;\n model = event.message.model;\n break;\n\n case 'content_block_start':\n if (event.content_block.type === 'tool_use') {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n currentToolJson = '';\n } else if (event.content_block.type === 'server_tool_use') {\n const serverBlock = event.content_block as {\n name?: string;\n input?: { query?: string };\n };\n const query = serverBlock.input?.query ?? '';\n const toolLabel = query\n ? `\\n🔍 Searching: \"${query}\"\\n`\n : `\\n🔍 [${serverBlock.name ?? 'server_tool'}]\\n`;\n textParts.push(toolLabel);\n onTextDelta(toolLabel);\n if (onServerToolUse) {\n onServerToolUse(serverBlock.name ?? 'server_tool', { query });\n }\n } else if (event.content_block.type === 'web_search_tool_result') {\n const resultBlock = event.content_block as Anthropic.Messages.WebSearchToolResultBlock;\n const formatted = formatWebSearchResults(resultBlock);\n if (formatted) {\n textParts.push(`\\n${formatted}\\n\\n`);\n onTextDelta(`\\n${formatted}\\n\\n`);\n }\n }\n break;\n\n case 'content_block_delta':\n if (event.delta.type === 'text_delta') {\n textParts.push(event.delta.text);\n onTextDelta(event.delta.text);\n } else if (event.delta.type === 'input_json_delta') {\n currentToolJson += event.delta.partial_json;\n }\n break;\n\n case 'content_block_stop':\n if (currentToolId) {\n toolCalls.push({\n id: currentToolId,\n type: 'function' as const,\n function: {\n name: currentToolName,\n arguments: currentToolJson || '{}',\n },\n });\n currentToolId = '';\n currentToolName = '';\n currentToolJson = '';\n }\n break;\n\n case 'message_delta':\n if (event.usage) {\n usage.output_tokens = event.usage.output_tokens;\n }\n stopReason = event.delta.stop_reason;\n break;\n }\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n return buildPartialResult(textParts, toolCalls, usage, model);\n }\n throw err;\n }\n\n // If aborted via break (not via catch), return partial response\n if (signal?.aborted) {\n return buildPartialResult(textParts, toolCalls, usage, model);\n }\n\n const textContent = textParts.join('') || '';\n\n const result: TUniversalMessage = {\n id: randomUUID(),\n role: 'assistant',\n content: textContent,\n state: 'complete' as const,\n timestamp: new Date(),\n ...(toolCalls.length > 0 && { toolCalls }),\n };\n\n result.metadata = {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n model,\n };\n if (stopReason) {\n result.metadata['stopReason'] = stopReason;\n }\n\n return result;\n}\n\nfunction buildPartialResult(\n textParts: string[],\n toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }>,\n usage: { input_tokens: number; output_tokens: number },\n model: string,\n): TUniversalMessage {\n const partialText = textParts.join('') || '';\n const partialResult: TUniversalMessage = {\n id: randomUUID(),\n role: 'assistant',\n content: partialText,\n state: 'complete' as const,\n timestamp: new Date(),\n ...(toolCalls.length > 0 && { toolCalls }),\n };\n partialResult.metadata = {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n model,\n stopReason: 'aborted',\n };\n return partialResult;\n}\n\n/**\n * Wrap a stream to support abort signal interruption.\n */\nasync function* streamWithAbort(\n stream: AsyncIterable<Anthropic.MessageStreamEvent>,\n signal?: AbortSignal,\n): AsyncIterable<Anthropic.MessageStreamEvent> {\n for await (const event of stream) {\n if (signal?.aborted) break;\n yield event;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport Anthropic from '@anthropic-ai/sdk';\nimport type { IAnthropicProviderOptions } from './types';\nimport { AbstractAIProvider, getModelMaxOutput } from '@robota-sdk/agent-core';\nimport type {\n IProviderCapabilities,\n IProviderNativeWebToolRequest,\n TUniversalMessage,\n IChatOptions,\n TTextDeltaCallback,\n} from '@robota-sdk/agent-core';\nimport { convertToAnthropicFormat, convertToolsToAnthropicFormat } from './message-converter';\nimport { streamAndAssemble } from './streaming-handler';\n\n/**\n * Anthropic provider implementation for Robota\n *\n * IMPORTANT PROVIDER-SPECIFIC RULES:\n * 1. This provider MUST extend BaseAIProvider from @robota-sdk/agent-core\n * 2. Content handling for Anthropic API:\n * - When tool_calls are present: content MUST be null (not empty string)\n * - For regular assistant messages: content should be a string\n * 3. Use override keyword for all methods inherited from BaseAIProvider\n * 4. Provider-specific API behavior should be documented here\n *\n * @public\n */\nexport class AnthropicProvider extends AbstractAIProvider {\n override readonly name = 'anthropic';\n override readonly version = '1.0.0';\n\n private readonly client?: Anthropic;\n private readonly options: IAnthropicProviderOptions;\n\n /**\n * When true, Anthropic server tools (web_search) are included in every request.\n * The server executes these tools internally — no local tool registration needed.\n */\n enableWebTools = false;\n\n /**\n * Optional callback for text deltas during streaming.\n * Set by the consumer (e.g., Session) to receive real-time text chunks.\n * When set, chat() uses streaming internally while still returning\n * the complete assembled message.\n */\n onTextDelta?: TTextDeltaCallback;\n\n /** Callback when a server tool (web_search etc.) is invoked by the API */\n onServerToolUse?: (toolName: string, input: Record<string, string>) => void;\n\n constructor(options: IAnthropicProviderOptions) {\n super();\n this.options = options;\n\n // Set executor if provided\n if (options.executor) {\n this.executor = options.executor;\n }\n\n // Only create client if not using executor\n if (!this.executor) {\n // Create client from apiKey if not provided.\n if (options.client) {\n this.client = options.client;\n } else if (options.apiKey) {\n this.client = new Anthropic({\n apiKey: options.apiKey,\n ...(options.timeout && { timeout: options.timeout }),\n ...(options.baseURL && { baseURL: options.baseURL }),\n });\n } else {\n throw new Error('Either Anthropic client, apiKey, or executor is required');\n }\n }\n }\n\n /**\n * Generate response using TUniversalMessage\n */\n override async chat(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): Promise<TUniversalMessage> {\n this.validateMessages(messages);\n this.validateNativeWebTools(options?.nativeWebTools);\n\n // Use executor when configured; otherwise use direct execution\n if (this.executor) {\n try {\n return await this.executeViaExecutorOrDirect(messages, options);\n } catch (error) {\n throw error;\n }\n }\n\n // Direct execution with Anthropic client\n if (!this.client) {\n throw new Error(\n 'Anthropic client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n\n // Separate system messages for the Anthropic system parameter\n const systemMessages = messages.filter((m) => m.role === 'system');\n const nonSystemMessages = messages.filter((m) => m.role !== 'system');\n const anthropicMessages = convertToAnthropicFormat(nonSystemMessages);\n const systemPrompt = systemMessages.map((m) => m.content || '').join('\\n\\n') || undefined;\n\n if (!options?.model) {\n throw new Error(\n 'Model is required in chat options. Please specify a model in defaultModel configuration.',\n );\n }\n\n const functionTools = options?.tools ? convertToolsToAnthropicFormat(options.tools) : [];\n const serverTools: Anthropic.Messages.ToolUnion[] = this.enableWebTools\n ? [{ type: 'web_search_20250305' as const, name: 'web_search' }]\n : [];\n const allTools: Anthropic.Messages.ToolUnion[] = [...functionTools, ...serverTools];\n\n const baseParams: Anthropic.MessageCreateParamsNonStreaming = {\n model: options.model as string,\n messages: anthropicMessages,\n max_tokens: options?.maxTokens || getModelMaxOutput(options.model as string),\n ...(systemPrompt && { system: systemPrompt }),\n ...(options?.temperature !== undefined && { temperature: options.temperature }),\n ...(allTools.length > 0 && { tools: allTools }),\n };\n\n // Always use streaming to avoid Anthropic SDK's 10-minute non-streaming timeout.\n // When no onTextDelta callback is available, use a no-op to silently assemble the response.\n const textDeltaCb = options?.onTextDelta ?? this.onTextDelta ?? (() => {});\n return streamAndAssemble(\n this.client,\n baseParams,\n textDeltaCb,\n this.onServerToolUse,\n options?.signal,\n options?.onProviderNativeRawPayload,\n );\n }\n\n /**\n * Generate streaming response using TUniversalMessage\n */\n override async *chatStream(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): AsyncIterable<TUniversalMessage> {\n this.validateMessages(messages);\n this.validateNativeWebTools(options?.nativeWebTools);\n\n // Use executor when configured; otherwise use direct execution\n if (this.executor) {\n try {\n yield* this.executeStreamViaExecutorOrDirect(messages, options);\n return;\n } catch (error) {\n throw error;\n }\n }\n\n // Direct execution with Anthropic client\n if (!this.client) {\n throw new Error(\n 'Anthropic client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n\n const anthropicMessages = convertToAnthropicFormat(messages);\n\n if (!options?.model) {\n throw new Error(\n 'Model is required in chat options. Please specify a model in defaultModel configuration.',\n );\n }\n\n const requestParams: Anthropic.MessageCreateParamsStreaming = {\n model: options.model as string,\n messages: anthropicMessages,\n max_tokens: options?.maxTokens || getModelMaxOutput(options.model as string),\n stream: true,\n };\n\n if (options?.temperature !== undefined) {\n requestParams.temperature = options.temperature;\n }\n\n const functionTools = options?.tools ? convertToolsToAnthropicFormat(options.tools) : [];\n const serverTools: Anthropic.Messages.ToolUnion[] = this.enableWebTools\n ? [{ type: 'web_search_20250305' as const, name: 'web_search' }]\n : [];\n const allTools: Anthropic.Messages.ToolUnion[] = [...functionTools, ...serverTools];\n\n if (allTools.length > 0) {\n requestParams.tools = allTools;\n }\n\n options?.onProviderNativeRawPayload?.({\n provider: 'anthropic',\n apiSurface: 'anthropic-messages',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await this.client.messages.create(requestParams);\n\n let sequence = 0;\n for await (const chunk of stream) {\n options?.onProviderNativeRawPayload?.({\n provider: 'anthropic',\n apiSurface: 'anthropic-messages',\n payloadKind: 'stream_event',\n sequence,\n payload: chunk,\n });\n sequence++;\n if (chunk.type === 'content_block_delta' && chunk.delta.type === 'text_delta') {\n yield {\n id: randomUUID(),\n role: 'assistant',\n content: chunk.delta.text,\n state: 'complete' as const,\n timestamp: new Date(),\n };\n }\n }\n }\n\n override supportsTools(): boolean {\n return true;\n }\n\n override getCapabilities(): IProviderCapabilities {\n return {\n functionCalling: { supported: true },\n nativeWebTools: {\n webSearch: this.enableWebTools\n ? { supported: true, enabled: true, source: 'anthropic-messages' }\n : {\n supported: true,\n enabled: false,\n source: 'anthropic-messages',\n reason: 'Call configureNativeWebTools({ webSearch: true }) or set enableWebTools.',\n },\n webFetch: {\n supported: false,\n enabled: false,\n source: 'anthropic-messages',\n reason: 'Anthropic provider exposes server web search only.',\n },\n },\n };\n }\n\n configureNativeWebTools(request: IProviderNativeWebToolRequest): IProviderCapabilities {\n if (request.webSearch === true) {\n this.enableWebTools = true;\n }\n this.validateNativeWebTools(request);\n return this.getCapabilities();\n }\n\n override validateConfig(): boolean {\n return !!this.client && !!this.options && !!this.options.apiKey;\n }\n\n override async dispose(): Promise<void> {\n // Anthropic client doesn't need explicit cleanup\n }\n\n /**\n * Validate TUniversalMessage array\n */\n protected override validateMessages(messages: TUniversalMessage[]): void {\n if (!Array.isArray(messages)) {\n throw new Error('Messages must be an array');\n }\n\n if (messages.length === 0) {\n throw new Error('Messages array cannot be empty');\n }\n\n for (const message of messages) {\n if (!message.role || !['user', 'assistant', 'system', 'tool'].includes(message.role)) {\n throw new Error(`Invalid message role: ${message.role}`);\n }\n }\n }\n}\n","import type {\n IProviderModelCatalog,\n IProviderModelCatalogEntry,\n IProviderProfileConfig,\n} from '@robota-sdk/agent-core';\nimport {\n ANTHROPIC_MODEL_SOURCE_URL,\n ANTHROPIC_MODEL_LAST_VERIFIED_AT,\n} from './provider-definition';\n\nconst ANTHROPIC_MODELS_API_URL = 'https://api.anthropic.com/v1/models';\nconst ANTHROPIC_API_VERSION = '2023-06-01';\n\nexport interface IAnthropicModelsResponse {\n data?: Array<{\n id?: string;\n display_name?: string;\n type?: string;\n }>;\n has_more?: boolean;\n}\n\nexport interface IAnthropicFetchInit {\n headers?: Record<string, string>;\n}\n\nexport interface IAnthropicFetchResponse {\n ok: boolean;\n status: number;\n json: () => Promise<IAnthropicModelsResponse>;\n}\n\nexport type TAnthropicFetch = (\n url: string,\n init?: IAnthropicFetchInit,\n) => Promise<IAnthropicFetchResponse>;\n\nexport async function refreshAnthropicModelCatalog(\n profile: IProviderProfileConfig,\n fetcher: TAnthropicFetch = defaultAnthropicFetch,\n): Promise<IProviderModelCatalog> {\n return fetchModelCatalog(profile, fetcher);\n}\n\nasync function fetchModelCatalog(\n profile: IProviderProfileConfig,\n fetcher: TAnthropicFetch,\n): Promise<IProviderModelCatalog> {\n const response = await fetcher(ANTHROPIC_MODELS_API_URL, buildFetchInit(profile.apiKey)).catch(\n (err: unknown) => {\n // allow-fallback: catalog refresh is non-terminal; callers expect IProviderModelCatalog\n const message = err instanceof Error ? err.message : String(err);\n return {\n ok: false as const,\n status: 0,\n json: (): Promise<IAnthropicModelsResponse> => Promise.resolve({ data: [] }),\n errorMessage: `Anthropic model refresh failed: ${message}`,\n };\n },\n );\n\n if ('errorMessage' in response) {\n return {\n status: 'unavailable',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n message: response.errorMessage,\n };\n }\n\n if (!response.ok) {\n return {\n status: 'unavailable',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n message: `Anthropic model refresh failed: HTTP ${response.status}`,\n };\n }\n\n const body = await response.json();\n const now = new Date().toISOString();\n const entries: IProviderModelCatalogEntry[] = (body.data ?? [])\n .filter(\n (item): item is { id: string; display_name?: string; type?: string } =>\n typeof item.id === 'string' && item.id.length > 0,\n )\n .map(\n (item): IProviderModelCatalogEntry => ({\n id: item.id,\n displayName: item.display_name ?? item.id,\n lifecycle: 'active',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n lastVerifiedAt: now,\n }),\n );\n\n return {\n status: 'live',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n lastVerifiedAt: ANTHROPIC_MODEL_LAST_VERIFIED_AT,\n entries,\n message: `Fetched ${entries.length} models from Anthropic API`,\n };\n}\n\nfunction buildFetchInit(apiKey: string | undefined): IAnthropicFetchInit | undefined {\n if (!apiKey) {\n return undefined;\n }\n return {\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': ANTHROPIC_API_VERSION,\n },\n };\n}\n\nasync function defaultAnthropicFetch(\n url: string,\n init?: IAnthropicFetchInit,\n): Promise<IAnthropicFetchResponse> {\n const response = await fetch(url, {\n ...(init?.headers !== undefined && { headers: init.headers }),\n });\n return {\n ok: response.ok,\n status: response.status,\n json: () => response.json() as Promise<IAnthropicModelsResponse>,\n };\n}\n","import {\n CLAUDE_MODELS,\n type IProviderDefinition,\n type IProviderModelCatalogEntry,\n} from '@robota-sdk/agent-core';\nimport { AnthropicProvider } from './provider';\nimport { refreshAnthropicModelCatalog } from './model-catalog-refresh';\n\nexport const DEFAULT_ANTHROPIC_PROVIDER_MODEL = 'claude-sonnet-4-6';\nexport const DEFAULT_ANTHROPIC_PROVIDER_API_KEY_ENV = 'ANTHROPIC_API_KEY';\nexport const DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE = `$ENV:${DEFAULT_ANTHROPIC_PROVIDER_API_KEY_ENV}`;\nexport const ANTHROPIC_MODEL_SOURCE_URL = 'https://platform.claude.com/docs/en/api/models/list';\nexport const ANTHROPIC_MODEL_LAST_VERIFIED_AT = '2026-05-04';\nconst ANTHROPIC_API_KEY_URL = 'https://platform.claude.com/settings/keys';\nconst ANTHROPIC_SETUP_SOURCE_URL = 'https://platform.claude.com/docs/en/api/overview';\nconst ANTHROPIC_SETUP_LAST_VERIFIED_AT = '2026-05-08';\nconst ANTHROPIC_SETUP_HELP_LINKS: NonNullable<IProviderDefinition['setupHelpLinks']> = [\n {\n kind: 'api-key',\n label: 'Anthropic API keys',\n url: ANTHROPIC_API_KEY_URL,\n sourceUrl: ANTHROPIC_SETUP_SOURCE_URL,\n lastVerifiedAt: ANTHROPIC_SETUP_LAST_VERIFIED_AT,\n },\n];\n\nexport function createAnthropicProviderDefinition(): IProviderDefinition {\n return {\n type: 'anthropic',\n displayName: 'Anthropic',\n description: 'Claude models through Anthropic API',\n defaults: {\n model: DEFAULT_ANTHROPIC_PROVIDER_MODEL,\n apiKey: DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE,\n },\n modelCatalog: {\n status: 'fallback',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n lastVerifiedAt: ANTHROPIC_MODEL_LAST_VERIFIED_AT,\n entries: buildAnthropicModelCatalogEntries(),\n },\n setupHelpLinks: ANTHROPIC_SETUP_HELP_LINKS,\n setupSteps: [\n {\n key: 'apiKey',\n title: 'Anthropic API key',\n defaultValue: DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE,\n masked: true,\n },\n {\n key: 'model',\n title: 'Anthropic model',\n defaultValue: DEFAULT_ANTHROPIC_PROVIDER_MODEL,\n },\n ],\n refreshModelCatalog: ({ profile }) => refreshAnthropicModelCatalog(profile),\n modelCatalogCacheTtlSeconds: 86400,\n requiresApiKey: true,\n createProvider: (config) =>\n new AnthropicProvider({\n apiKey: requireAnthropicApiKey(config.apiKey),\n ...(config.baseURL !== undefined && { baseURL: config.baseURL }),\n ...(config.timeout !== undefined && { timeout: config.timeout }),\n defaultModel: config.model,\n }),\n };\n}\n\nfunction buildAnthropicModelCatalogEntries(): IProviderModelCatalogEntry[] {\n const seen = new Set<string>();\n const entries: IProviderModelCatalogEntry[] = [];\n for (const model of Object.values(CLAUDE_MODELS)) {\n if (seen.has(model.name)) continue;\n seen.add(model.name);\n entries.push({\n id: model.id,\n displayName: model.name,\n contextWindow: model.contextWindow,\n capabilities: ['tools', 'vision', 'json_schema', 'reasoning', 'streaming'],\n lifecycle: 'active',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n lastVerifiedAt: ANTHROPIC_MODEL_LAST_VERIFIED_AT,\n });\n }\n return entries;\n}\n\nfunction requireAnthropicApiKey(apiKey: string | undefined): string {\n if (!apiKey) {\n throw new Error('Provider anthropic requires apiKey');\n }\n return apiKey;\n}\n","/**\n * @robota-sdk/agent-provider (anthropic)\n *\n * Provides Provider implementation for using Anthropic API with provider-agnostic TUniversalMessage.\n */\n\n// Main exports\nexport * from './provider';\nexport * from './types';\nexport * from './provider-definition';\nexport * from './model-catalog-refresh';\n\nimport type { IAnthropicProviderOptions } from './types';\n\n/**\n * Factory function for creating an AnthropicProvider instance.\n * @param _options - Configuration options for the Anthropic provider\n * @returns An AnthropicProvider instance\n */\nexport function createAnthropicProvider(_options: IAnthropicProviderOptions) {\n // Implementation of createAnthropicProvider function\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"anthropic--1vgLC-e.js","names":["toolMsg"],"sources":["../../src/anthropic/message-converter.ts","../../src/anthropic/streaming-handler.ts","../../src/anthropic/provider.ts","../../src/anthropic/model-catalog-refresh.ts","../../src/anthropic/provider-definition.ts","../../src/anthropic/index.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type Anthropic from '@anthropic-ai/sdk';\nimport type {\n TUniversalMessage,\n IToolSchema,\n IAssistantMessage,\n IToolMessage,\n} from '@robota-sdk/agent-core';\n\n/**\n * Convert TUniversalMessage array to Anthropic message format.\n *\n * CRITICAL: Anthropic API requires specific content handling:\n * - tool_use messages: content MUST be null\n * - regular messages: content should be a string\n */\nexport function convertToAnthropicFormat(messages: TUniversalMessage[]): Anthropic.MessageParam[] {\n return messages.map((msg) => {\n if (msg.role === 'user') {\n return {\n role: 'user',\n content: msg.content || '',\n };\n } else if (msg.role === 'assistant') {\n const assistantMsg = msg as IAssistantMessage;\n\n // Anthropic uses content blocks — include both text and tool_use\n if (assistantMsg.toolCalls && assistantMsg.toolCalls.length > 0) {\n const contentBlocks: Array<Anthropic.TextBlockParam | Anthropic.ToolUseBlockParam> = [];\n\n // Include text content if present alongside tool calls\n if (assistantMsg.content) {\n contentBlocks.push({\n type: 'text' as const,\n text: assistantMsg.content,\n });\n }\n\n for (const tc of assistantMsg.toolCalls) {\n contentBlocks.push({\n type: 'tool_use' as const,\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n });\n }\n\n return {\n role: 'assistant' as const,\n content: contentBlocks,\n };\n }\n\n // Regular assistant message (no tool calls)\n return {\n role: 'assistant',\n content: assistantMsg.content || '',\n };\n } else if (msg.role === 'tool') {\n // Tool result message — convert to Anthropic tool_result content block\n const toolMsg = msg as IToolMessage;\n return {\n role: 'user' as const,\n content: [\n {\n type: 'tool_result' as const,\n tool_use_id: toolMsg.toolCallId ?? '',\n content: msg.content || '',\n },\n ],\n };\n } else {\n // System messages\n return {\n role: 'user', // Anthropic doesn't have system role, use user\n content: msg.content || '',\n };\n }\n });\n}\n\n/**\n * Convert Anthropic response to TUniversalMessage.\n *\n * Anthropic responses can contain multiple content blocks:\n * e.g., [text(\"I'll read the file\"), tool_use(Read, {...}), tool_use(Bash, {...})]\n * We must extract ALL text and ALL tool_use blocks.\n */\nexport function convertFromAnthropicResponse(response: Anthropic.Message): TUniversalMessage {\n if (!response.content || response.content.length === 0) {\n throw new Error('No content in Anthropic response');\n }\n\n const textParts: string[] = [];\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }> = [];\n\n for (const block of response.content) {\n if (block.type === 'text') {\n const textBlock = block as Anthropic.TextBlock;\n if (textBlock.text) {\n textParts.push(textBlock.text);\n }\n } else if (block.type === 'tool_use') {\n const toolBlock = block as Anthropic.ToolUseBlock;\n toolCalls.push({\n id: toolBlock.id,\n type: 'function' as const,\n function: {\n name: toolBlock.name,\n arguments: JSON.stringify(toolBlock.input),\n },\n });\n } else if (block.type === 'server_tool_use') {\n // Server tool invocation (e.g., web_search) — results come in a separate block\n } else if (block.type === 'web_search_tool_result') {\n const resultBlock = block as Anthropic.Messages.WebSearchToolResultBlock;\n const searchResults = formatWebSearchResults(resultBlock);\n if (searchResults) {\n textParts.push(searchResults);\n }\n }\n }\n\n // Use empty string instead of null so agent-core's buildFinalResult\n // doesn't reject the message. Tool-only responses have no text.\n const textContent = textParts.join('\\n') || '';\n\n const result: TUniversalMessage = {\n id: randomUUID(),\n role: 'assistant',\n content: textContent,\n state: 'complete' as const,\n timestamp: new Date(),\n ...(toolCalls.length > 0 && { toolCalls }),\n };\n\n // Add metadata if available\n if (response.usage) {\n result.metadata = {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n model: response.model,\n };\n\n if (response.stop_reason) {\n result.metadata['stopReason'] = response.stop_reason;\n }\n }\n\n return result;\n}\n\n/** Format a WebSearchToolResultBlock into readable text. */\nexport function formatWebSearchResults(block: Anthropic.Messages.WebSearchToolResultBlock): string {\n if (!Array.isArray(block.content)) return '';\n\n const results = block.content\n .filter(\n (r): r is Anthropic.Messages.WebSearchResultBlock =>\n r.type === 'web_search_result' && 'title' in r && 'url' in r,\n )\n .map((r, i) => `${i + 1}. ${r.title}\\n ${r.url}`)\n .join('\\n');\n\n return results ? `[Web Search Results]\\n${results}` : '';\n}\n\n/**\n * Convert tool schemas to Anthropic format.\n */\nexport function convertToolsToAnthropicFormat(tools: IToolSchema[]): Anthropic.Tool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.parameters as Anthropic.Tool.InputSchema,\n }));\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { formatWebSearchResults } from './message-converter';\n\nimport type Anthropic from '@anthropic-ai/sdk';\nimport type {\n TProviderNativeRawPayloadCallback,\n TUniversalMessage,\n TTextDeltaCallback,\n} from '@robota-sdk/agent-core';\n\n/**\n * Stream the Anthropic API response and assemble a complete TUniversalMessage.\n *\n * Calls onTextDelta for each text chunk as it arrives.\n * Returns the fully assembled TUniversalMessage when the stream is done.\n */\nexport async function streamAndAssemble(\n client: Anthropic,\n params: Anthropic.MessageCreateParamsNonStreaming,\n onTextDelta: TTextDeltaCallback,\n onServerToolUse: ((toolName: string, input: Record<string, string>) => void) | undefined,\n signal: AbortSignal | undefined,\n onProviderNativeRawPayload?: TProviderNativeRawPayloadCallback,\n): Promise<TUniversalMessage> {\n const streamParams: Anthropic.MessageCreateParamsStreaming = {\n ...params,\n stream: true,\n };\n\n onProviderNativeRawPayload?.({\n provider: 'anthropic',\n apiSurface: 'anthropic-messages',\n payloadKind: 'request',\n payload: streamParams,\n });\n const stream = await client.messages.create(streamParams, signal ? { signal } : undefined);\n\n // Accumulate the full response from stream events\n const textParts: string[] = [];\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }> = [];\n let currentToolId = '';\n let currentToolName = '';\n let currentToolJson = '';\n let usage = { input_tokens: 0, output_tokens: 0 };\n let model = '';\n let stopReason: string | null = null;\n\n try {\n let sequence = 0;\n for await (const event of streamWithAbort(stream, signal)) {\n onProviderNativeRawPayload?.({\n provider: 'anthropic',\n apiSurface: 'anthropic-messages',\n payloadKind: 'stream_event',\n sequence,\n payload: event,\n });\n sequence++;\n switch (event.type) {\n case 'message_start':\n usage = event.message.usage;\n model = event.message.model;\n break;\n\n case 'content_block_start':\n if (event.content_block.type === 'tool_use') {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n currentToolJson = '';\n } else if (event.content_block.type === 'server_tool_use') {\n const serverBlock = event.content_block as {\n name?: string;\n input?: { query?: string };\n };\n const query = serverBlock.input?.query ?? '';\n const toolLabel = query\n ? `\\n🔍 Searching: \"${query}\"\\n`\n : `\\n🔍 [${serverBlock.name ?? 'server_tool'}]\\n`;\n textParts.push(toolLabel);\n onTextDelta(toolLabel);\n if (onServerToolUse) {\n onServerToolUse(serverBlock.name ?? 'server_tool', { query });\n }\n } else if (event.content_block.type === 'web_search_tool_result') {\n const resultBlock = event.content_block as Anthropic.Messages.WebSearchToolResultBlock;\n const formatted = formatWebSearchResults(resultBlock);\n if (formatted) {\n textParts.push(`\\n${formatted}\\n\\n`);\n onTextDelta(`\\n${formatted}\\n\\n`);\n }\n }\n break;\n\n case 'content_block_delta':\n if (event.delta.type === 'text_delta') {\n textParts.push(event.delta.text);\n onTextDelta(event.delta.text);\n } else if (event.delta.type === 'input_json_delta') {\n currentToolJson += event.delta.partial_json;\n }\n break;\n\n case 'content_block_stop':\n if (currentToolId) {\n toolCalls.push({\n id: currentToolId,\n type: 'function' as const,\n function: {\n name: currentToolName,\n arguments: currentToolJson || '{}',\n },\n });\n currentToolId = '';\n currentToolName = '';\n currentToolJson = '';\n }\n break;\n\n case 'message_delta':\n if (event.usage) {\n usage.output_tokens = event.usage.output_tokens;\n }\n stopReason = event.delta.stop_reason;\n break;\n }\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n return buildPartialResult(textParts, toolCalls, usage, model);\n }\n throw err;\n }\n\n // If aborted via break (not via catch), return partial response\n if (signal?.aborted) {\n return buildPartialResult(textParts, toolCalls, usage, model);\n }\n\n const textContent = textParts.join('') || '';\n\n const result: TUniversalMessage = {\n id: randomUUID(),\n role: 'assistant',\n content: textContent,\n state: 'complete' as const,\n timestamp: new Date(),\n ...(toolCalls.length > 0 && { toolCalls }),\n };\n\n result.metadata = {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n model,\n };\n if (stopReason) {\n result.metadata['stopReason'] = stopReason;\n }\n\n return result;\n}\n\nfunction buildPartialResult(\n textParts: string[],\n toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }>,\n usage: { input_tokens: number; output_tokens: number },\n model: string,\n): TUniversalMessage {\n const partialText = textParts.join('') || '';\n const partialResult: TUniversalMessage = {\n id: randomUUID(),\n role: 'assistant',\n content: partialText,\n state: 'complete' as const,\n timestamp: new Date(),\n ...(toolCalls.length > 0 && { toolCalls }),\n };\n partialResult.metadata = {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n model,\n stopReason: 'aborted',\n };\n return partialResult;\n}\n\n/**\n * Wrap a stream to support abort signal interruption.\n */\nasync function* streamWithAbort(\n stream: AsyncIterable<Anthropic.MessageStreamEvent>,\n signal?: AbortSignal,\n): AsyncIterable<Anthropic.MessageStreamEvent> {\n for await (const event of stream) {\n if (signal?.aborted) break;\n yield event;\n }\n}\n","import { randomUUID } from 'node:crypto';\n\nimport Anthropic from '@anthropic-ai/sdk';\nimport { AbstractAIProvider, getModelMaxOutput } from '@robota-sdk/agent-core';\n\nimport { convertToAnthropicFormat, convertToolsToAnthropicFormat } from './message-converter';\nimport { streamAndAssemble } from './streaming-handler';\n\nimport type { IAnthropicProviderOptions } from './types';\nimport type {\n IProviderCapabilities,\n IProviderNativeWebToolRequest,\n TUniversalMessage,\n IChatOptions,\n TTextDeltaCallback,\n} from '@robota-sdk/agent-core';\n\n/**\n * Anthropic provider implementation for Robota\n *\n * IMPORTANT PROVIDER-SPECIFIC RULES:\n * 1. This provider MUST extend BaseAIProvider from @robota-sdk/agent-core\n * 2. Content handling for Anthropic API:\n * - When tool_calls are present: content MUST be null (not empty string)\n * - For regular assistant messages: content should be a string\n * 3. Use override keyword for all methods inherited from BaseAIProvider\n * 4. Provider-specific API behavior should be documented here\n *\n * @public\n */\nexport class AnthropicProvider extends AbstractAIProvider {\n override readonly name = 'anthropic';\n override readonly version = '1.0.0';\n\n private readonly client?: Anthropic;\n private readonly options: IAnthropicProviderOptions;\n\n /**\n * When true, Anthropic server tools (web_search) are included in every request.\n * The server executes these tools internally — no local tool registration needed.\n */\n enableWebTools = false;\n\n /**\n * Optional callback for text deltas during streaming.\n * Set by the consumer (e.g., Session) to receive real-time text chunks.\n * When set, chat() uses streaming internally while still returning\n * the complete assembled message.\n */\n onTextDelta?: TTextDeltaCallback;\n\n /** Callback when a server tool (web_search etc.) is invoked by the API */\n onServerToolUse?: (toolName: string, input: Record<string, string>) => void;\n\n constructor(options: IAnthropicProviderOptions) {\n super();\n this.options = options;\n\n // Set executor if provided\n if (options.executor) {\n this.executor = options.executor;\n }\n\n // Only create client if not using executor\n if (!this.executor) {\n // Create client from apiKey if not provided.\n if (options.client) {\n this.client = options.client;\n } else if (options.apiKey) {\n this.client = new Anthropic({\n apiKey: options.apiKey,\n ...(options.timeout && { timeout: options.timeout }),\n ...(options.baseURL && { baseURL: options.baseURL }),\n });\n } else {\n throw new Error('Either Anthropic client, apiKey, or executor is required');\n }\n }\n }\n\n /**\n * Generate response using TUniversalMessage\n */\n override async chat(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): Promise<TUniversalMessage> {\n this.validateMessages(messages);\n this.validateNativeWebTools(options?.nativeWebTools);\n\n // Use executor when configured; otherwise use direct execution\n if (this.executor) {\n try {\n return await this.executeViaExecutorOrDirect(messages, options);\n } catch (error) {\n throw error;\n }\n }\n\n // Direct execution with Anthropic client\n if (!this.client) {\n throw new Error(\n 'Anthropic client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n\n // Separate system messages for the Anthropic system parameter\n const systemMessages = messages.filter((m) => m.role === 'system');\n const nonSystemMessages = messages.filter((m) => m.role !== 'system');\n const anthropicMessages = convertToAnthropicFormat(nonSystemMessages);\n const systemPrompt = systemMessages.map((m) => m.content || '').join('\\n\\n') || undefined;\n\n if (!options?.model) {\n throw new Error(\n 'Model is required in chat options. Please specify a model in defaultModel configuration.',\n );\n }\n\n const functionTools = options?.tools ? convertToolsToAnthropicFormat(options.tools) : [];\n const serverTools: Anthropic.Messages.ToolUnion[] = this.enableWebTools\n ? [{ type: 'web_search_20250305' as const, name: 'web_search' }]\n : [];\n const allTools: Anthropic.Messages.ToolUnion[] = [...functionTools, ...serverTools];\n\n const baseParams: Anthropic.MessageCreateParamsNonStreaming = {\n model: options.model as string,\n messages: anthropicMessages,\n max_tokens: options?.maxTokens || getModelMaxOutput(options.model as string),\n ...(systemPrompt && { system: systemPrompt }),\n ...(options?.temperature !== undefined && { temperature: options.temperature }),\n ...(allTools.length > 0 && { tools: allTools }),\n };\n\n // Always use streaming to avoid Anthropic SDK's 10-minute non-streaming timeout.\n // When no onTextDelta callback is available, use a no-op to silently assemble the response.\n const textDeltaCb = options?.onTextDelta ?? this.onTextDelta ?? (() => {});\n return streamAndAssemble(\n this.client,\n baseParams,\n textDeltaCb,\n this.onServerToolUse,\n options?.signal,\n options?.onProviderNativeRawPayload,\n );\n }\n\n /**\n * Generate streaming response using TUniversalMessage\n */\n override async *chatStream(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): AsyncIterable<TUniversalMessage> {\n this.validateMessages(messages);\n this.validateNativeWebTools(options?.nativeWebTools);\n\n // Use executor when configured; otherwise use direct execution\n if (this.executor) {\n try {\n yield* this.executeStreamViaExecutorOrDirect(messages, options);\n return;\n } catch (error) {\n throw error;\n }\n }\n\n // Direct execution with Anthropic client\n if (!this.client) {\n throw new Error(\n 'Anthropic client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n\n const anthropicMessages = convertToAnthropicFormat(messages);\n\n if (!options?.model) {\n throw new Error(\n 'Model is required in chat options. Please specify a model in defaultModel configuration.',\n );\n }\n\n const requestParams: Anthropic.MessageCreateParamsStreaming = {\n model: options.model as string,\n messages: anthropicMessages,\n max_tokens: options?.maxTokens || getModelMaxOutput(options.model as string),\n stream: true,\n };\n\n if (options?.temperature !== undefined) {\n requestParams.temperature = options.temperature;\n }\n\n const functionTools = options?.tools ? convertToolsToAnthropicFormat(options.tools) : [];\n const serverTools: Anthropic.Messages.ToolUnion[] = this.enableWebTools\n ? [{ type: 'web_search_20250305' as const, name: 'web_search' }]\n : [];\n const allTools: Anthropic.Messages.ToolUnion[] = [...functionTools, ...serverTools];\n\n if (allTools.length > 0) {\n requestParams.tools = allTools;\n }\n\n options?.onProviderNativeRawPayload?.({\n provider: 'anthropic',\n apiSurface: 'anthropic-messages',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await this.client.messages.create(requestParams);\n\n let sequence = 0;\n for await (const chunk of stream) {\n options?.onProviderNativeRawPayload?.({\n provider: 'anthropic',\n apiSurface: 'anthropic-messages',\n payloadKind: 'stream_event',\n sequence,\n payload: chunk,\n });\n sequence++;\n if (chunk.type === 'content_block_delta' && chunk.delta.type === 'text_delta') {\n yield {\n id: randomUUID(),\n role: 'assistant',\n content: chunk.delta.text,\n state: 'complete' as const,\n timestamp: new Date(),\n };\n }\n }\n }\n\n override supportsTools(): boolean {\n return true;\n }\n\n override getCapabilities(): IProviderCapabilities {\n return {\n functionCalling: { supported: true },\n nativeWebTools: {\n webSearch: this.enableWebTools\n ? { supported: true, enabled: true, source: 'anthropic-messages' }\n : {\n supported: true,\n enabled: false,\n source: 'anthropic-messages',\n reason: 'Call configureNativeWebTools({ webSearch: true }) or set enableWebTools.',\n },\n webFetch: {\n supported: false,\n enabled: false,\n source: 'anthropic-messages',\n reason: 'Anthropic provider exposes server web search only.',\n },\n },\n };\n }\n\n configureNativeWebTools(request: IProviderNativeWebToolRequest): IProviderCapabilities {\n if (request.webSearch === true) {\n this.enableWebTools = true;\n }\n this.validateNativeWebTools(request);\n return this.getCapabilities();\n }\n\n override validateConfig(): boolean {\n return !!this.client && !!this.options && !!this.options.apiKey;\n }\n\n override async dispose(): Promise<void> {\n // Anthropic client doesn't need explicit cleanup\n }\n\n /**\n * Validate TUniversalMessage array\n */\n protected override validateMessages(messages: TUniversalMessage[]): void {\n if (!Array.isArray(messages)) {\n throw new Error('Messages must be an array');\n }\n\n if (messages.length === 0) {\n throw new Error('Messages array cannot be empty');\n }\n\n for (const message of messages) {\n if (!message.role || !['user', 'assistant', 'system', 'tool'].includes(message.role)) {\n throw new Error(`Invalid message role: ${message.role}`);\n }\n }\n }\n}\n","import {\n ANTHROPIC_MODEL_SOURCE_URL,\n ANTHROPIC_MODEL_LAST_VERIFIED_AT,\n} from './provider-definition';\n\nimport type {\n IProviderModelCatalog,\n IProviderModelCatalogEntry,\n IProviderProfileConfig,\n} from '@robota-sdk/agent-core';\n\nconst ANTHROPIC_MODELS_API_URL = 'https://api.anthropic.com/v1/models';\nconst ANTHROPIC_API_VERSION = '2023-06-01';\n\nexport interface IAnthropicModelsResponse {\n data?: Array<{\n id?: string;\n display_name?: string;\n type?: string;\n }>;\n has_more?: boolean;\n}\n\nexport interface IAnthropicFetchInit {\n headers?: Record<string, string>;\n}\n\nexport interface IAnthropicFetchResponse {\n ok: boolean;\n status: number;\n json: () => Promise<IAnthropicModelsResponse>;\n}\n\nexport type TAnthropicFetch = (\n url: string,\n init?: IAnthropicFetchInit,\n) => Promise<IAnthropicFetchResponse>;\n\nexport async function refreshAnthropicModelCatalog(\n profile: IProviderProfileConfig,\n fetcher: TAnthropicFetch = defaultAnthropicFetch,\n): Promise<IProviderModelCatalog> {\n return fetchModelCatalog(profile, fetcher);\n}\n\nasync function fetchModelCatalog(\n profile: IProviderProfileConfig,\n fetcher: TAnthropicFetch,\n): Promise<IProviderModelCatalog> {\n const response = await fetcher(ANTHROPIC_MODELS_API_URL, buildFetchInit(profile.apiKey)).catch(\n (err: unknown) => {\n // allow-fallback: catalog refresh is non-terminal; callers expect IProviderModelCatalog\n const message = err instanceof Error ? err.message : String(err);\n return {\n ok: false as const,\n status: 0,\n json: (): Promise<IAnthropicModelsResponse> => Promise.resolve({ data: [] }),\n errorMessage: `Anthropic model refresh failed: ${message}`,\n };\n },\n );\n\n if ('errorMessage' in response) {\n return {\n status: 'unavailable',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n message: response.errorMessage,\n };\n }\n\n if (!response.ok) {\n return {\n status: 'unavailable',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n message: `Anthropic model refresh failed: HTTP ${response.status}`,\n };\n }\n\n const body = await response.json();\n const now = new Date().toISOString();\n const entries: IProviderModelCatalogEntry[] = (body.data ?? [])\n .filter(\n (item): item is { id: string; display_name?: string; type?: string } =>\n typeof item.id === 'string' && item.id.length > 0,\n )\n .map(\n (item): IProviderModelCatalogEntry => ({\n id: item.id,\n displayName: item.display_name ?? item.id,\n lifecycle: 'active',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n lastVerifiedAt: now,\n }),\n );\n\n return {\n status: 'live',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n lastVerifiedAt: ANTHROPIC_MODEL_LAST_VERIFIED_AT,\n entries,\n message: `Fetched ${entries.length} models from Anthropic API`,\n };\n}\n\nfunction buildFetchInit(apiKey: string | undefined): IAnthropicFetchInit | undefined {\n if (!apiKey) {\n return undefined;\n }\n return {\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': ANTHROPIC_API_VERSION,\n },\n };\n}\n\nasync function defaultAnthropicFetch(\n url: string,\n init?: IAnthropicFetchInit,\n): Promise<IAnthropicFetchResponse> {\n const response = await fetch(url, {\n ...(init?.headers !== undefined && { headers: init.headers }),\n });\n return {\n ok: response.ok,\n status: response.status,\n json: () => response.json() as Promise<IAnthropicModelsResponse>,\n };\n}\n","import {\n CLAUDE_MODELS,\n type IProviderDefinition,\n type IProviderModelCatalogEntry,\n} from '@robota-sdk/agent-core';\n\nimport { refreshAnthropicModelCatalog } from './model-catalog-refresh';\nimport { AnthropicProvider } from './provider';\n\nexport const DEFAULT_ANTHROPIC_PROVIDER_MODEL = 'claude-sonnet-4-6';\nexport const DEFAULT_ANTHROPIC_PROVIDER_API_KEY_ENV = 'ANTHROPIC_API_KEY';\nexport const DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE = `$ENV:${DEFAULT_ANTHROPIC_PROVIDER_API_KEY_ENV}`;\nexport const ANTHROPIC_MODEL_SOURCE_URL = 'https://platform.claude.com/docs/en/api/models/list';\nexport const ANTHROPIC_MODEL_LAST_VERIFIED_AT = '2026-05-04';\nconst ANTHROPIC_API_KEY_URL = 'https://platform.claude.com/settings/keys';\nconst ANTHROPIC_SETUP_SOURCE_URL = 'https://platform.claude.com/docs/en/api/overview';\nconst ANTHROPIC_SETUP_LAST_VERIFIED_AT = '2026-05-08';\nconst ANTHROPIC_SETUP_HELP_LINKS: NonNullable<IProviderDefinition['setupHelpLinks']> = [\n {\n kind: 'api-key',\n label: 'Anthropic API keys',\n url: ANTHROPIC_API_KEY_URL,\n sourceUrl: ANTHROPIC_SETUP_SOURCE_URL,\n lastVerifiedAt: ANTHROPIC_SETUP_LAST_VERIFIED_AT,\n },\n];\n\nexport function createAnthropicProviderDefinition(): IProviderDefinition {\n return {\n type: 'anthropic',\n displayName: 'Anthropic',\n description: 'Claude models through Anthropic API',\n defaults: {\n model: DEFAULT_ANTHROPIC_PROVIDER_MODEL,\n apiKey: DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE,\n },\n modelCatalog: {\n status: 'fallback',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n lastVerifiedAt: ANTHROPIC_MODEL_LAST_VERIFIED_AT,\n entries: buildAnthropicModelCatalogEntries(),\n },\n setupHelpLinks: ANTHROPIC_SETUP_HELP_LINKS,\n setupSteps: [\n {\n key: 'apiKey',\n title: 'Anthropic API key',\n defaultValue: DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE,\n masked: true,\n },\n {\n key: 'model',\n title: 'Anthropic model',\n defaultValue: DEFAULT_ANTHROPIC_PROVIDER_MODEL,\n },\n ],\n refreshModelCatalog: ({ profile }) => refreshAnthropicModelCatalog(profile),\n modelCatalogCacheTtlSeconds: 86400,\n requiresApiKey: true,\n createProvider: (config) =>\n new AnthropicProvider({\n apiKey: requireAnthropicApiKey(config.apiKey),\n ...(config.baseURL !== undefined && { baseURL: config.baseURL }),\n ...(config.timeout !== undefined && { timeout: config.timeout }),\n defaultModel: config.model,\n }),\n };\n}\n\nfunction buildAnthropicModelCatalogEntries(): IProviderModelCatalogEntry[] {\n const seen = new Set<string>();\n const entries: IProviderModelCatalogEntry[] = [];\n for (const model of Object.values(CLAUDE_MODELS)) {\n if (seen.has(model.name)) continue;\n seen.add(model.name);\n entries.push({\n id: model.id,\n displayName: model.name,\n contextWindow: model.contextWindow,\n capabilities: ['tools', 'vision', 'json_schema', 'reasoning', 'streaming'],\n lifecycle: 'active',\n sourceUrl: ANTHROPIC_MODEL_SOURCE_URL,\n lastVerifiedAt: ANTHROPIC_MODEL_LAST_VERIFIED_AT,\n });\n }\n return entries;\n}\n\nfunction requireAnthropicApiKey(apiKey: string | undefined): string {\n if (!apiKey) {\n throw new Error('Provider anthropic requires apiKey');\n }\n return apiKey;\n}\n","/**\n * @robota-sdk/agent-provider (anthropic)\n *\n * Provides Provider implementation for using Anthropic API with provider-agnostic TUniversalMessage.\n */\n\n// Main exports\nexport * from './provider';\nexport * from './types';\nexport * from './provider-definition';\nexport * from './model-catalog-refresh';\n\nimport type { IAnthropicProviderOptions } from './types';\n\n/**\n * Factory function for creating an AnthropicProvider instance.\n * @param _options - Configuration options for the Anthropic provider\n * @returns An AnthropicProvider instance\n */\nexport function createAnthropicProvider(_options: IAnthropicProviderOptions): void {\n // Implementation of createAnthropicProvider function\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/bytedance/types.ts","../../../src/bytedance/provider.ts"],"mappings":";;;UAEiB,yBAAA;EACf,MAAA;EACA,OAAA;EACA,eAAA;EACA,wBAAA;EACA,2BAAA;EACA,qBAAA;EACA,SAAA;EACA,cAAA,GAAiB,MAAM;AAAA;AAAA,UAGR,yBAAA;EACf,IAAA;EACA,IAAI;AAAA;AAAA,UAGW,6BAAA;EACf,IAAA;EACA,SAAA;IACE,GAAA;EAAA;AAAA;AAAA,KAIQ,qBAAA,GAAwB,yBAAA,GAA4B,6BAA6B;AAAA,UAE5E,gCAAA;EACf,KAAA;EACA,OAAA,EAAS,qBAAqB;EAC9B,cAAA;EACA,KAAA;EACA,QAAA;EACA,SAAA;AAAA;AAAA,UAGe,iCAAA;EACf,EAAA;EACA,MAAA;EACA,UAAA;AAAA;AAAA,UAGe,6BAAA;EACf,IAAA;EACA,SAAA;IACE,GAAA;EAAA;AAAA;AAAA,UAIa,2BAAA;EACf,EAAA;EACA,MAAA;EACA,SAAA;EACA,OAAA;IACE,SAAA;EAAA;EAEF,SAAA;EACA,KAAA;EACA,aAAA;EACA,UAAA;EACA,UAAA;AAAA;AAAA,UAGe,0BAAA;EACf,IAAA;EACA,OAAA;EACA,OAAA,GAAU,MAAM,SAAS,eAAA;AAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/bytedance/types.ts","../../../src/bytedance/provider.ts"],"mappings":";;;UAEiB,yBAAA;EACf,MAAA;EACA,OAAA;EACA,eAAA;EACA,wBAAA;EACA,2BAAA;EACA,qBAAA;EACA,SAAA;EACA,cAAA,GAAiB,MAAM;AAAA;AAAA,UAGR,yBAAA;EACf,IAAA;EACA,IAAI;AAAA;AAAA,UAGW,6BAAA;EACf,IAAA;EACA,SAAA;IACE,GAAA;EAAA;AAAA;AAAA,KAIQ,qBAAA,GAAwB,yBAAA,GAA4B,6BAA6B;AAAA,UAE5E,gCAAA;EACf,KAAA;EACA,OAAA,EAAS,qBAAqB;EAC9B,cAAA;EACA,KAAA;EACA,QAAA;EACA,SAAA;AAAA;AAAA,UAGe,iCAAA;EACf,EAAA;EACA,MAAA;EACA,UAAA;AAAA;AAAA,UAGe,6BAAA;EACf,IAAA;EACA,SAAA;IACE,GAAA;EAAA;AAAA;AAAA,UAIa,2BAAA;EACf,EAAA;EACA,MAAA;EACA,SAAA;EACA,OAAA;IACE,SAAA;EAAA;EAEF,SAAA;EACA,KAAA;EACA,aAAA;EACA,UAAA;EACA,UAAA;AAAA;AAAA,UAGe,0BAAA;EACf,IAAA;EACA,OAAA;EACA,OAAA,GAAU,MAAM,SAAS,eAAA;AAAA;;;cC1Cd,iBAAA,YAA6B,wBAAA;EAAA,iBACvB,OAAA;cAEE,OAAA,EAAS,yBAAA;EAIf,WAAA,CACX,OAAA,EAAS,uBAAA,GACR,OAAA,CAAQ,oBAAA,CAAqB,iBAAA;EAmDnB,WAAA,CAAY,KAAA,WAAgB,OAAA,CAAQ,oBAAA,CAAqB,iBAAA;EAkBzD,cAAA,CAAe,KAAA,WAAgB,OAAA,CAAQ,oBAAA,CAAqB,iBAAA;EAAA,QAmBjE,mBAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bytedance-C_0sF_pJ.js","names":[],"sources":["../../src/bytedance/http-client.ts","../../src/bytedance/status-mapper.ts","../../src/bytedance/provider.ts"],"sourcesContent":["import type { TProviderMediaResult } from '@robota-sdk/agent-core';\nimport type { IBytedanceApiErrorResponse, IBytedanceProviderOptions } from './types';\n\nconst DEFAULT_TIMEOUT_MS = 60_000;\n\n/** HTTP status codes used by the Bytedance API error mapper. */\nconst HTTP_UNAUTHORIZED = 401;\nconst HTTP_FORBIDDEN = 403;\nconst HTTP_NOT_FOUND = 404;\nconst HTTP_CONFLICT = 409;\nconst HTTP_TOO_MANY_REQUESTS = 429;\nconst HTTP_BAD_REQUEST = 400;\nconst HTTP_INTERNAL_ERROR = 500;\n\n/** Sends an HTTP request to the Bytedance API and returns the parsed JSON response. */\nexport async function requestJson<TResponse>(\n options: IBytedanceProviderOptions,\n request: {\n path: string;\n method: 'GET' | 'POST' | 'DELETE';\n body?: string;\n },\n): Promise<TProviderMediaResult<TResponse>> {\n const controller = new AbortController();\n const timeoutHandle = setTimeout(\n () => controller.abort(),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n try {\n const response = await fetch(buildUrl(options.baseUrl, request.path), {\n method: request.method,\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n 'Content-Type': 'application/json',\n ...(options.defaultHeaders ?? {}),\n },\n body: request.body,\n signal: controller.signal,\n });\n const responseText = await response.text();\n if (!response.ok) {\n return mapHttpError(response.status, responseText);\n }\n\n const parsedResult = parseJsonRecord(responseText);\n if (!parsedResult.ok) {\n return parsedResult;\n }\n return {\n ok: true,\n value: parsedResult.value as TResponse,\n };\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return {\n ok: false,\n error: { code: 'PROVIDER_TIMEOUT', message: 'Bytedance media request timed out.' },\n };\n }\n return {\n ok: false,\n error: {\n code: 'PROVIDER_UPSTREAM_ERROR',\n message: error instanceof Error ? error.message : 'Bytedance media request failed.',\n },\n };\n } finally {\n clearTimeout(timeoutHandle);\n }\n}\n\nfunction buildUrl(baseUrl: string, path: string): string {\n const sanitizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const sanitizedPath = path.startsWith('/') ? path : `/${path}`;\n return `${sanitizedBaseUrl}${sanitizedPath}`;\n}\n\nfunction parseJsonRecord(\n responseText: string,\n): TProviderMediaResult<Record<string, string | number | boolean | undefined>> {\n try {\n const parsedValue = JSON.parse(responseText) as Record<\n string,\n string | number | boolean | undefined\n >;\n return { ok: true, value: parsedValue };\n } catch {\n return {\n ok: false,\n error: { code: 'PROVIDER_UPSTREAM_ERROR', message: 'Bytedance response is not valid JSON.' },\n };\n }\n}\n\nfunction parseErrorResponse(responseText: string): IBytedanceApiErrorResponse {\n try {\n return JSON.parse(responseText) as IBytedanceApiErrorResponse;\n } catch {\n return { message: responseText };\n }\n}\n\nfunction mapHttpError(statusCode: number, responseText: string): TProviderMediaResult<never> {\n const parsedError = parseErrorResponse(responseText);\n if (statusCode === HTTP_UNAUTHORIZED || statusCode === HTTP_FORBIDDEN) {\n return {\n ok: false,\n error: {\n code: 'PROVIDER_AUTH_ERROR',\n message: parsedError.message ?? 'Bytedance authentication failed.',\n details: parsedError.details,\n },\n };\n }\n if (statusCode === HTTP_NOT_FOUND) {\n return {\n ok: false,\n error: {\n code: 'PROVIDER_JOB_NOT_FOUND',\n message: parsedError.message ?? 'Bytedance video job was not found.',\n details: parsedError.details,\n },\n };\n }\n if (statusCode === HTTP_CONFLICT) {\n return {\n ok: false,\n error: {\n code: 'PROVIDER_JOB_NOT_CANCELLABLE',\n message: parsedError.message ?? 'Bytedance video job cannot be cancelled in current state.',\n details: parsedError.details,\n },\n };\n }\n if (statusCode === HTTP_TOO_MANY_REQUESTS) {\n return {\n ok: false,\n error: {\n code: 'PROVIDER_RATE_LIMITED',\n message: parsedError.message ?? 'Bytedance rate limit exceeded.',\n details: parsedError.details,\n },\n };\n }\n if (statusCode >= HTTP_BAD_REQUEST && statusCode < HTTP_INTERNAL_ERROR) {\n return {\n ok: false,\n error: {\n code: 'PROVIDER_INVALID_REQUEST',\n message: parsedError.message ?? 'Bytedance rejected request payload.',\n details: parsedError.details,\n },\n };\n }\n return {\n ok: false,\n error: {\n code: 'PROVIDER_UPSTREAM_ERROR',\n message: parsedError.message ?? 'Bytedance upstream request failed.',\n details: parsedError.details,\n },\n };\n}\n","import type { TProviderMediaResult, IVideoJobSnapshot } from '@robota-sdk/agent-core';\nimport type { IBytedanceVideoTaskResponse } from './types';\n\n/** Threshold (in milliseconds) above which a numeric timestamp is treated as milliseconds rather than seconds. */\nconst MILLISECOND_EPOCH_THRESHOLD = 1_000_000_000_000;\n\n/** Conversion factor from seconds to milliseconds. */\nconst MS_PER_SECOND = 1000;\n\n/** Maps a Bytedance video task response into a normalized job snapshot. */\nexport function mapVideoJobSnapshot(\n response: IBytedanceVideoTaskResponse,\n): TProviderMediaResult<IVideoJobSnapshot> {\n if (response.id.trim().length === 0) {\n return {\n ok: false,\n error: {\n code: 'PROVIDER_UPSTREAM_ERROR',\n message: 'Bytedance video job response is missing task id.',\n },\n };\n }\n const normalizedStatusResult = mapVideoStatus(response.status);\n if (!normalizedStatusResult.ok) {\n return normalizedStatusResult;\n }\n return {\n ok: true,\n value: {\n jobId: response.id,\n status: normalizedStatusResult.value,\n output: mapOutput(response),\n error:\n normalizedStatusResult.value === 'failed' && response.error_message\n ? { code: 'PROVIDER_UPSTREAM_ERROR', message: response.error_message }\n : undefined,\n updatedAt: toIsoTimestamp(response.updated_at ?? response.created_at),\n },\n };\n}\n\n/** Maps a Bytedance status string to a normalized video job status. */\nexport function mapVideoStatus(status: string): TProviderMediaResult<IVideoJobSnapshot['status']> {\n const normalized = status.trim().toLowerCase();\n if (normalized === 'queued' || normalized === 'pending' || normalized === 'submitted') {\n return { ok: true, value: 'queued' };\n }\n if (normalized === 'running' || normalized === 'processing' || normalized === 'in_progress') {\n return { ok: true, value: 'running' };\n }\n if (normalized === 'succeeded' || normalized === 'success' || normalized === 'completed') {\n return { ok: true, value: 'succeeded' };\n }\n if (normalized === 'failed' || normalized === 'error') {\n return { ok: true, value: 'failed' };\n }\n if (normalized === 'cancelled' || normalized === 'canceled') {\n return { ok: true, value: 'cancelled' };\n }\n return {\n ok: false,\n error: {\n code: 'PROVIDER_UPSTREAM_ERROR',\n message: `Unexpected video job status from Bytedance: ${status}`,\n },\n };\n}\n\n/** Maps the initial createVideo status to queued or running. */\nexport function mapInitialStatus(\n statusValue: string | undefined,\n): TProviderMediaResult<'queued' | 'running'> {\n if (typeof statusValue !== 'string' || statusValue.trim().length === 0) {\n return { ok: true, value: 'queued' };\n }\n const normalizedStatus = statusValue.trim().toLowerCase();\n if (\n normalizedStatus === 'queued' ||\n normalizedStatus === 'pending' ||\n normalizedStatus === 'submitted'\n ) {\n return { ok: true, value: 'queued' };\n }\n if (\n normalizedStatus === 'running' ||\n normalizedStatus === 'processing' ||\n normalizedStatus === 'in_progress'\n ) {\n return { ok: true, value: 'running' };\n }\n return {\n ok: false,\n error: {\n code: 'PROVIDER_UPSTREAM_ERROR',\n message: `Unexpected createVideo status from Bytedance: ${statusValue}`,\n },\n };\n}\n\n/** Converts a numeric or string timestamp to ISO 8601 format. */\nexport function toIsoTimestamp(value: string | number | undefined): string {\n if (typeof value === 'number' && Number.isFinite(value)) {\n const numericTimestamp = value > MILLISECOND_EPOCH_THRESHOLD ? value : value * MS_PER_SECOND;\n const date = new Date(numericTimestamp);\n if (!Number.isNaN(date.getTime())) {\n return date.toISOString();\n }\n }\n if (typeof value === 'string' && value.trim().length > 0) {\n const maybeNumeric = Number(value);\n if (Number.isFinite(maybeNumeric)) {\n return toIsoTimestamp(maybeNumeric);\n }\n const parsedDate = new Date(value);\n if (!Number.isNaN(parsedDate.getTime())) {\n return parsedDate.toISOString();\n }\n }\n return new Date().toISOString();\n}\n\nfunction mapOutput(response: IBytedanceVideoTaskResponse): IVideoJobSnapshot['output'] {\n const directVideoUrl =\n typeof response.video_url === 'string' && response.video_url.trim().length > 0\n ? response.video_url\n : undefined;\n const contentVideoUrl =\n typeof response.content?.video_url === 'string' && response.content.video_url.trim().length > 0\n ? response.content.video_url\n : undefined;\n const resolvedVideoUrl = directVideoUrl ?? contentVideoUrl;\n if (typeof resolvedVideoUrl !== 'string') {\n return undefined;\n }\n return {\n kind: 'uri',\n uri: resolvedVideoUrl,\n mimeType: response.mime_type,\n bytes: response.bytes,\n };\n}\n","import type {\n IInlineImageInputSource,\n IUriImageInputSource,\n TProviderMediaResult,\n IVideoGenerationProvider,\n IVideoGenerationRequest,\n IVideoJobAccepted,\n IVideoJobSnapshot,\n} from '@robota-sdk/agent-core';\nimport type {\n IBytedanceCreateVideoTaskRequest,\n IBytedanceCreateVideoTaskResponse,\n IBytedanceProviderOptions,\n IBytedanceVideoTaskResponse,\n TBytedanceTaskContent,\n} from './types';\nimport { requestJson } from './http-client';\nimport { mapVideoJobSnapshot, mapInitialStatus, toIsoTimestamp } from './status-mapper';\n\nconst DEFAULT_CREATE_VIDEO_PATH = '/contents/generations/tasks';\nconst DEFAULT_GET_VIDEO_TASK_PATH_TEMPLATE = '/contents/generations/tasks/{taskId}';\nconst DEFAULT_CANCEL_VIDEO_TASK_PATH_TEMPLATE = '/contents/generations/tasks/{taskId}';\n\nexport class BytedanceProvider implements IVideoGenerationProvider {\n private readonly options: IBytedanceProviderOptions;\n\n public constructor(options: IBytedanceProviderOptions) {\n this.options = options;\n }\n\n public async createVideo(\n request: IVideoGenerationRequest,\n ): Promise<TProviderMediaResult<IVideoJobAccepted>> {\n if (request.prompt.trim().length === 0) {\n return buildInvalidRequestError('Video generation requires non-empty prompt.');\n }\n if (request.model.trim().length === 0) {\n return buildInvalidRequestError('Video generation requires non-empty model.');\n }\n if (typeof request.seed === 'number') {\n return buildInvalidRequestError(\n 'ModelArk Seedance provider does not support seed field in current contract.',\n );\n }\n\n const contentResult = this.buildContentPayload(request.prompt, request.inputImages);\n if (!contentResult.ok) {\n return contentResult;\n }\n\n const payload: IBytedanceCreateVideoTaskRequest = {\n model: request.model.trim(),\n content: contentResult.value,\n duration: request.durationSeconds,\n ratio: request.aspectRatio,\n };\n\n const responseResult = await requestJson<IBytedanceCreateVideoTaskResponse>(this.options, {\n path: this.options.createVideoPath ?? DEFAULT_CREATE_VIDEO_PATH,\n method: 'POST',\n body: JSON.stringify(payload),\n });\n if (!responseResult.ok) {\n return responseResult;\n }\n\n if (responseResult.value.id.trim().length === 0) {\n return buildUpstreamError('Bytedance createVideo response is missing task id.');\n }\n const mappedStatus = mapInitialStatus(responseResult.value.status);\n if (!mappedStatus.ok) {\n return mappedStatus;\n }\n return {\n ok: true,\n value: {\n jobId: responseResult.value.id,\n status: mappedStatus.value,\n createdAt: toIsoTimestamp(responseResult.value.created_at),\n },\n };\n }\n\n public async getVideoJob(jobId: string): Promise<TProviderMediaResult<IVideoJobSnapshot>> {\n if (jobId.trim().length === 0) {\n return buildInvalidRequestError('Video job lookup requires non-empty jobId.');\n }\n\n const responseResult = await requestJson<IBytedanceVideoTaskResponse>(this.options, {\n path: buildPath(\n this.options.getVideoTaskPathTemplate ?? DEFAULT_GET_VIDEO_TASK_PATH_TEMPLATE,\n jobId,\n ),\n method: 'GET',\n });\n if (!responseResult.ok) {\n return responseResult;\n }\n return mapVideoJobSnapshot(responseResult.value);\n }\n\n public async cancelVideoJob(jobId: string): Promise<TProviderMediaResult<IVideoJobSnapshot>> {\n if (jobId.trim().length === 0) {\n return buildInvalidRequestError('Video job cancellation requires non-empty jobId.');\n }\n\n const cancelMethod = this.options.cancelVideoTaskMethod ?? 'DELETE';\n const responseResult = await requestJson<IBytedanceVideoTaskResponse>(this.options, {\n path: buildPath(\n this.options.cancelVideoTaskPathTemplate ?? DEFAULT_CANCEL_VIDEO_TASK_PATH_TEMPLATE,\n jobId,\n ),\n method: cancelMethod,\n });\n if (!responseResult.ok) {\n return responseResult;\n }\n return mapVideoJobSnapshot(responseResult.value);\n }\n\n private buildContentPayload(\n prompt: string,\n inputImages: IVideoGenerationRequest['inputImages'],\n ): TProviderMediaResult<TBytedanceTaskContent[]> {\n const normalizedPrompt = prompt.trim();\n if (normalizedPrompt.length === 0) {\n return buildInvalidRequestError('Video generation requires non-empty prompt.');\n }\n const content: TBytedanceTaskContent[] = [{ type: 'text', text: normalizedPrompt }];\n if (Array.isArray(inputImages)) {\n for (const image of inputImages) {\n const imageUrlResult = toContentImageUrl(image);\n if (!imageUrlResult.ok) {\n return imageUrlResult;\n }\n content.push({ type: 'image_url', image_url: { url: imageUrlResult.value } });\n }\n }\n return { ok: true, value: content };\n }\n}\n\nfunction buildPath(template: string, taskId: string): string {\n return template.replace('{taskId}', encodeURIComponent(taskId));\n}\n\nfunction buildInvalidRequestError(message: string): TProviderMediaResult<never> {\n return { ok: false, error: { code: 'PROVIDER_INVALID_REQUEST', message } };\n}\n\nfunction buildUpstreamError(message: string): TProviderMediaResult<never> {\n return { ok: false, error: { code: 'PROVIDER_UPSTREAM_ERROR', message } };\n}\n\nfunction toContentImageUrl(\n image: IInlineImageInputSource | IUriImageInputSource,\n): TProviderMediaResult<string> {\n if (image.kind === 'uri') {\n if (image.uri.trim().length === 0) {\n return buildInvalidRequestError('Image uri must be non-empty.');\n }\n return { ok: true, value: image.uri };\n }\n if (image.data.trim().length === 0) {\n return buildInvalidRequestError('Inline image data must be non-empty.');\n }\n if (image.mimeType.trim().length === 0) {\n return buildInvalidRequestError('Inline image mimeType must be non-empty.');\n }\n return { ok: true, value: `data:${image.mimeType};base64,${image.data}` };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bytedance-C_0sF_pJ.js","names":[],"sources":["../../src/bytedance/http-client.ts","../../src/bytedance/status-mapper.ts","../../src/bytedance/provider.ts"],"sourcesContent":["import type { IBytedanceApiErrorResponse, IBytedanceProviderOptions } from './types';\nimport type { TProviderMediaResult } from '@robota-sdk/agent-core';\n\nconst DEFAULT_TIMEOUT_MS = 60_000;\n\n/** HTTP status codes used by the Bytedance API error mapper. */\nconst HTTP_UNAUTHORIZED = 401;\nconst HTTP_FORBIDDEN = 403;\nconst HTTP_NOT_FOUND = 404;\nconst HTTP_CONFLICT = 409;\nconst HTTP_TOO_MANY_REQUESTS = 429;\nconst HTTP_BAD_REQUEST = 400;\nconst HTTP_INTERNAL_ERROR = 500;\n\n/** Sends an HTTP request to the Bytedance API and returns the parsed JSON response. */\nexport async function requestJson<TResponse>(\n options: IBytedanceProviderOptions,\n request: {\n path: string;\n method: 'GET' | 'POST' | 'DELETE';\n body?: string;\n },\n): Promise<TProviderMediaResult<TResponse>> {\n const controller = new AbortController();\n const timeoutHandle = setTimeout(\n () => controller.abort(),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n try {\n const response = await fetch(buildUrl(options.baseUrl, request.path), {\n method: request.method,\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n 'Content-Type': 'application/json',\n ...(options.defaultHeaders ?? {}),\n },\n body: request.body,\n signal: controller.signal,\n });\n const responseText = await response.text();\n if (!response.ok) {\n return mapHttpError(response.status, responseText);\n }\n\n const parsedResult = parseJsonRecord(responseText);\n if (!parsedResult.ok) {\n return parsedResult;\n }\n return {\n ok: true,\n value: parsedResult.value as TResponse,\n };\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return {\n ok: false,\n error: { code: 'PROVIDER_TIMEOUT', message: 'Bytedance media request timed out.' },\n };\n }\n return {\n ok: false,\n error: {\n code: 'PROVIDER_UPSTREAM_ERROR',\n message: error instanceof Error ? error.message : 'Bytedance media request failed.',\n },\n };\n } finally {\n clearTimeout(timeoutHandle);\n }\n}\n\nfunction buildUrl(baseUrl: string, path: string): string {\n const sanitizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const sanitizedPath = path.startsWith('/') ? path : `/${path}`;\n return `${sanitizedBaseUrl}${sanitizedPath}`;\n}\n\nfunction parseJsonRecord(\n responseText: string,\n): TProviderMediaResult<Record<string, string | number | boolean | undefined>> {\n try {\n const parsedValue = JSON.parse(responseText) as Record<\n string,\n string | number | boolean | undefined\n >;\n return { ok: true, value: parsedValue };\n } catch {\n return {\n ok: false,\n error: { code: 'PROVIDER_UPSTREAM_ERROR', message: 'Bytedance response is not valid JSON.' },\n };\n }\n}\n\nfunction parseErrorResponse(responseText: string): IBytedanceApiErrorResponse {\n try {\n return JSON.parse(responseText) as IBytedanceApiErrorResponse;\n } catch {\n return { message: responseText };\n }\n}\n\nfunction mapHttpError(statusCode: number, responseText: string): TProviderMediaResult<never> {\n const parsedError = parseErrorResponse(responseText);\n if (statusCode === HTTP_UNAUTHORIZED || statusCode === HTTP_FORBIDDEN) {\n return {\n ok: false,\n error: {\n code: 'PROVIDER_AUTH_ERROR',\n message: parsedError.message ?? 'Bytedance authentication failed.',\n details: parsedError.details,\n },\n };\n }\n if (statusCode === HTTP_NOT_FOUND) {\n return {\n ok: false,\n error: {\n code: 'PROVIDER_JOB_NOT_FOUND',\n message: parsedError.message ?? 'Bytedance video job was not found.',\n details: parsedError.details,\n },\n };\n }\n if (statusCode === HTTP_CONFLICT) {\n return {\n ok: false,\n error: {\n code: 'PROVIDER_JOB_NOT_CANCELLABLE',\n message: parsedError.message ?? 'Bytedance video job cannot be cancelled in current state.',\n details: parsedError.details,\n },\n };\n }\n if (statusCode === HTTP_TOO_MANY_REQUESTS) {\n return {\n ok: false,\n error: {\n code: 'PROVIDER_RATE_LIMITED',\n message: parsedError.message ?? 'Bytedance rate limit exceeded.',\n details: parsedError.details,\n },\n };\n }\n if (statusCode >= HTTP_BAD_REQUEST && statusCode < HTTP_INTERNAL_ERROR) {\n return {\n ok: false,\n error: {\n code: 'PROVIDER_INVALID_REQUEST',\n message: parsedError.message ?? 'Bytedance rejected request payload.',\n details: parsedError.details,\n },\n };\n }\n return {\n ok: false,\n error: {\n code: 'PROVIDER_UPSTREAM_ERROR',\n message: parsedError.message ?? 'Bytedance upstream request failed.',\n details: parsedError.details,\n },\n };\n}\n","import type { IBytedanceVideoTaskResponse } from './types';\nimport type { TProviderMediaResult, IVideoJobSnapshot } from '@robota-sdk/agent-core';\n\n/** Threshold (in milliseconds) above which a numeric timestamp is treated as milliseconds rather than seconds. */\nconst MILLISECOND_EPOCH_THRESHOLD = 1_000_000_000_000;\n\n/** Conversion factor from seconds to milliseconds. */\nconst MS_PER_SECOND = 1000;\n\n/** Maps a Bytedance video task response into a normalized job snapshot. */\nexport function mapVideoJobSnapshot(\n response: IBytedanceVideoTaskResponse,\n): TProviderMediaResult<IVideoJobSnapshot> {\n if (response.id.trim().length === 0) {\n return {\n ok: false,\n error: {\n code: 'PROVIDER_UPSTREAM_ERROR',\n message: 'Bytedance video job response is missing task id.',\n },\n };\n }\n const normalizedStatusResult = mapVideoStatus(response.status);\n if (!normalizedStatusResult.ok) {\n return normalizedStatusResult;\n }\n return {\n ok: true,\n value: {\n jobId: response.id,\n status: normalizedStatusResult.value,\n output: mapOutput(response),\n error:\n normalizedStatusResult.value === 'failed' && response.error_message\n ? { code: 'PROVIDER_UPSTREAM_ERROR', message: response.error_message }\n : undefined,\n updatedAt: toIsoTimestamp(response.updated_at ?? response.created_at),\n },\n };\n}\n\n/** Maps a Bytedance status string to a normalized video job status. */\nexport function mapVideoStatus(status: string): TProviderMediaResult<IVideoJobSnapshot['status']> {\n const normalized = status.trim().toLowerCase();\n if (normalized === 'queued' || normalized === 'pending' || normalized === 'submitted') {\n return { ok: true, value: 'queued' };\n }\n if (normalized === 'running' || normalized === 'processing' || normalized === 'in_progress') {\n return { ok: true, value: 'running' };\n }\n if (normalized === 'succeeded' || normalized === 'success' || normalized === 'completed') {\n return { ok: true, value: 'succeeded' };\n }\n if (normalized === 'failed' || normalized === 'error') {\n return { ok: true, value: 'failed' };\n }\n if (normalized === 'cancelled' || normalized === 'canceled') {\n return { ok: true, value: 'cancelled' };\n }\n return {\n ok: false,\n error: {\n code: 'PROVIDER_UPSTREAM_ERROR',\n message: `Unexpected video job status from Bytedance: ${status}`,\n },\n };\n}\n\n/** Maps the initial createVideo status to queued or running. */\nexport function mapInitialStatus(\n statusValue: string | undefined,\n): TProviderMediaResult<'queued' | 'running'> {\n if (typeof statusValue !== 'string' || statusValue.trim().length === 0) {\n return { ok: true, value: 'queued' };\n }\n const normalizedStatus = statusValue.trim().toLowerCase();\n if (\n normalizedStatus === 'queued' ||\n normalizedStatus === 'pending' ||\n normalizedStatus === 'submitted'\n ) {\n return { ok: true, value: 'queued' };\n }\n if (\n normalizedStatus === 'running' ||\n normalizedStatus === 'processing' ||\n normalizedStatus === 'in_progress'\n ) {\n return { ok: true, value: 'running' };\n }\n return {\n ok: false,\n error: {\n code: 'PROVIDER_UPSTREAM_ERROR',\n message: `Unexpected createVideo status from Bytedance: ${statusValue}`,\n },\n };\n}\n\n/** Converts a numeric or string timestamp to ISO 8601 format. */\nexport function toIsoTimestamp(value: string | number | undefined): string {\n if (typeof value === 'number' && Number.isFinite(value)) {\n const numericTimestamp = value > MILLISECOND_EPOCH_THRESHOLD ? value : value * MS_PER_SECOND;\n const date = new Date(numericTimestamp);\n if (!Number.isNaN(date.getTime())) {\n return date.toISOString();\n }\n }\n if (typeof value === 'string' && value.trim().length > 0) {\n const maybeNumeric = Number(value);\n if (Number.isFinite(maybeNumeric)) {\n return toIsoTimestamp(maybeNumeric);\n }\n const parsedDate = new Date(value);\n if (!Number.isNaN(parsedDate.getTime())) {\n return parsedDate.toISOString();\n }\n }\n return new Date().toISOString();\n}\n\nfunction mapOutput(response: IBytedanceVideoTaskResponse): IVideoJobSnapshot['output'] {\n const directVideoUrl =\n typeof response.video_url === 'string' && response.video_url.trim().length > 0\n ? response.video_url\n : undefined;\n const contentVideoUrl =\n typeof response.content?.video_url === 'string' && response.content.video_url.trim().length > 0\n ? response.content.video_url\n : undefined;\n const resolvedVideoUrl = directVideoUrl ?? contentVideoUrl;\n if (typeof resolvedVideoUrl !== 'string') {\n return undefined;\n }\n return {\n kind: 'uri',\n uri: resolvedVideoUrl,\n mimeType: response.mime_type,\n bytes: response.bytes,\n };\n}\n","import { requestJson } from './http-client';\nimport { mapVideoJobSnapshot, mapInitialStatus, toIsoTimestamp } from './status-mapper';\n\nimport type {\n IBytedanceCreateVideoTaskRequest,\n IBytedanceCreateVideoTaskResponse,\n IBytedanceProviderOptions,\n IBytedanceVideoTaskResponse,\n TBytedanceTaskContent,\n} from './types';\nimport type {\n IInlineImageInputSource,\n IUriImageInputSource,\n TProviderMediaResult,\n IVideoGenerationProvider,\n IVideoGenerationRequest,\n IVideoJobAccepted,\n IVideoJobSnapshot,\n} from '@robota-sdk/agent-core';\n\nconst DEFAULT_CREATE_VIDEO_PATH = '/contents/generations/tasks';\nconst DEFAULT_GET_VIDEO_TASK_PATH_TEMPLATE = '/contents/generations/tasks/{taskId}';\nconst DEFAULT_CANCEL_VIDEO_TASK_PATH_TEMPLATE = '/contents/generations/tasks/{taskId}';\n\nexport class BytedanceProvider implements IVideoGenerationProvider {\n private readonly options: IBytedanceProviderOptions;\n\n public constructor(options: IBytedanceProviderOptions) {\n this.options = options;\n }\n\n public async createVideo(\n request: IVideoGenerationRequest,\n ): Promise<TProviderMediaResult<IVideoJobAccepted>> {\n if (request.prompt.trim().length === 0) {\n return buildInvalidRequestError('Video generation requires non-empty prompt.');\n }\n if (request.model.trim().length === 0) {\n return buildInvalidRequestError('Video generation requires non-empty model.');\n }\n if (typeof request.seed === 'number') {\n return buildInvalidRequestError(\n 'ModelArk Seedance provider does not support seed field in current contract.',\n );\n }\n\n const contentResult = this.buildContentPayload(request.prompt, request.inputImages);\n if (!contentResult.ok) {\n return contentResult;\n }\n\n const payload: IBytedanceCreateVideoTaskRequest = {\n model: request.model.trim(),\n content: contentResult.value,\n duration: request.durationSeconds,\n ratio: request.aspectRatio,\n };\n\n const responseResult = await requestJson<IBytedanceCreateVideoTaskResponse>(this.options, {\n path: this.options.createVideoPath ?? DEFAULT_CREATE_VIDEO_PATH,\n method: 'POST',\n body: JSON.stringify(payload),\n });\n if (!responseResult.ok) {\n return responseResult;\n }\n\n if (responseResult.value.id.trim().length === 0) {\n return buildUpstreamError('Bytedance createVideo response is missing task id.');\n }\n const mappedStatus = mapInitialStatus(responseResult.value.status);\n if (!mappedStatus.ok) {\n return mappedStatus;\n }\n return {\n ok: true,\n value: {\n jobId: responseResult.value.id,\n status: mappedStatus.value,\n createdAt: toIsoTimestamp(responseResult.value.created_at),\n },\n };\n }\n\n public async getVideoJob(jobId: string): Promise<TProviderMediaResult<IVideoJobSnapshot>> {\n if (jobId.trim().length === 0) {\n return buildInvalidRequestError('Video job lookup requires non-empty jobId.');\n }\n\n const responseResult = await requestJson<IBytedanceVideoTaskResponse>(this.options, {\n path: buildPath(\n this.options.getVideoTaskPathTemplate ?? DEFAULT_GET_VIDEO_TASK_PATH_TEMPLATE,\n jobId,\n ),\n method: 'GET',\n });\n if (!responseResult.ok) {\n return responseResult;\n }\n return mapVideoJobSnapshot(responseResult.value);\n }\n\n public async cancelVideoJob(jobId: string): Promise<TProviderMediaResult<IVideoJobSnapshot>> {\n if (jobId.trim().length === 0) {\n return buildInvalidRequestError('Video job cancellation requires non-empty jobId.');\n }\n\n const cancelMethod = this.options.cancelVideoTaskMethod ?? 'DELETE';\n const responseResult = await requestJson<IBytedanceVideoTaskResponse>(this.options, {\n path: buildPath(\n this.options.cancelVideoTaskPathTemplate ?? DEFAULT_CANCEL_VIDEO_TASK_PATH_TEMPLATE,\n jobId,\n ),\n method: cancelMethod,\n });\n if (!responseResult.ok) {\n return responseResult;\n }\n return mapVideoJobSnapshot(responseResult.value);\n }\n\n private buildContentPayload(\n prompt: string,\n inputImages: IVideoGenerationRequest['inputImages'],\n ): TProviderMediaResult<TBytedanceTaskContent[]> {\n const normalizedPrompt = prompt.trim();\n if (normalizedPrompt.length === 0) {\n return buildInvalidRequestError('Video generation requires non-empty prompt.');\n }\n const content: TBytedanceTaskContent[] = [{ type: 'text', text: normalizedPrompt }];\n if (Array.isArray(inputImages)) {\n for (const image of inputImages) {\n const imageUrlResult = toContentImageUrl(image);\n if (!imageUrlResult.ok) {\n return imageUrlResult;\n }\n content.push({ type: 'image_url', image_url: { url: imageUrlResult.value } });\n }\n }\n return { ok: true, value: content };\n }\n}\n\nfunction buildPath(template: string, taskId: string): string {\n return template.replace('{taskId}', encodeURIComponent(taskId));\n}\n\nfunction buildInvalidRequestError(message: string): TProviderMediaResult<never> {\n return { ok: false, error: { code: 'PROVIDER_INVALID_REQUEST', message } };\n}\n\nfunction buildUpstreamError(message: string): TProviderMediaResult<never> {\n return { ok: false, error: { code: 'PROVIDER_UPSTREAM_ERROR', message } };\n}\n\nfunction toContentImageUrl(\n image: IInlineImageInputSource | IUriImageInputSource,\n): TProviderMediaResult<string> {\n if (image.kind === 'uri') {\n if (image.uri.trim().length === 0) {\n return buildInvalidRequestError('Image uri must be non-empty.');\n }\n return { ok: true, value: image.uri };\n }\n if (image.data.trim().length === 0) {\n return buildInvalidRequestError('Inline image data must be non-empty.');\n }\n if (image.mimeType.trim().length === 0) {\n return buildInvalidRequestError('Inline image mimeType must be non-empty.');\n }\n return { ok: true, value: `data:${image.mimeType};base64,${image.data}` };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepseek-_8Ixx7rA.js","names":["deepSeekError"],"sources":["../../src/deepseek/defaults.ts","../../src/deepseek/provider.ts","../../src/deepseek/model-catalog.ts","../../src/deepseek/model-catalog-refresh.ts","../../src/deepseek/provider-definition.ts"],"sourcesContent":["export const DEFAULT_DEEPSEEK_PROVIDER_MODEL = 'deepseek-v4-flash';\nexport const DEFAULT_DEEPSEEK_PROVIDER_API_KEY_ENV = 'DEEPSEEK_API_KEY';\nexport const DEFAULT_DEEPSEEK_PROVIDER_API_KEY_REFERENCE = `$ENV:${DEFAULT_DEEPSEEK_PROVIDER_API_KEY_ENV}`;\nexport const DEFAULT_DEEPSEEK_PROVIDER_BASE_URL = 'https://api.deepseek.com';\n","import OpenAI from 'openai';\nimport { AbstractAIProvider, SilentLogger } from '@robota-sdk/agent-core';\nimport type {\n IChatOptions,\n IProviderCapabilities,\n TTextDeltaCallback,\n TUniversalMessage,\n} from '@robota-sdk/agent-core';\nimport {\n assembleOpenAICompatibleStream,\n convertToOpenAICompatibleMessages,\n convertToOpenAICompatibleTools,\n observeProviderNativeRawPayloadStream,\n OpenAICompatibleResponseParser,\n} from '../shared/openai-compatible/index.js';\nimport type { IOpenAICompatibleError } from '../shared/openai-compatible/index.js';\nimport { DEFAULT_DEEPSEEK_PROVIDER_BASE_URL } from './defaults';\nimport type {\n IDeepSeekProviderOptions,\n IDeepSeekThinkingConfig,\n TDeepSeekReasoningEffort,\n} from './types';\n\ntype TDeepSeekChatCompletionCreateParamsNonStreaming = Omit<\n OpenAI.Chat.ChatCompletionCreateParamsNonStreaming,\n 'reasoning_effort'\n> & {\n thinking?: IDeepSeekThinkingConfig;\n reasoning_effort?: TDeepSeekReasoningEffort;\n};\n\ntype TDeepSeekChatCompletionCreateParamsStreaming = Omit<\n OpenAI.Chat.ChatCompletionCreateParamsStreaming,\n 'reasoning_effort'\n> & {\n thinking?: IDeepSeekThinkingConfig;\n reasoning_effort?: TDeepSeekReasoningEffort;\n};\n\nexport class DeepSeekProvider extends AbstractAIProvider {\n override readonly name = 'deepseek';\n override readonly version = '1.0.0';\n\n private readonly client?: OpenAI;\n private readonly options: IDeepSeekProviderOptions;\n private readonly responseParser: OpenAICompatibleResponseParser;\n\n onTextDelta?: TTextDeltaCallback;\n\n constructor(options: IDeepSeekProviderOptions) {\n super(options.logger || SilentLogger);\n this.options = options;\n\n if (options.executor) {\n this.executor = options.executor;\n }\n\n if (!this.executor) {\n if (options.client) {\n this.client = options.client;\n } else if (options.apiKey) {\n this.client = new OpenAI({\n apiKey: options.apiKey,\n baseURL: options.baseURL ?? DEFAULT_DEEPSEEK_PROVIDER_BASE_URL,\n ...(options.timeout !== undefined && { timeout: options.timeout }),\n });\n } else {\n throw new Error('Either DeepSeek client, apiKey, or executor is required');\n }\n }\n\n this.responseParser = new OpenAICompatibleResponseParser({ logger: this.logger });\n }\n\n override async chat(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): Promise<TUniversalMessage> {\n this.validateMessages(messages);\n this.validateNativeWebTools(options?.nativeWebTools);\n\n if (this.executor) {\n try {\n return await this.executeViaExecutorOrDirect(messages, options);\n } catch (error) {\n this.logger.error(\n 'DeepSeek Provider executor chat error:',\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n }\n }\n\n const client = this.getClient();\n\n try {\n const requestParams = this.buildRequestParams(messages, options);\n const textDeltaCb = options?.onTextDelta ?? this.onTextDelta;\n if (textDeltaCb) {\n return await this.chatWithStreamingAssembly(\n { ...requestParams, stream: true },\n { ...options, onTextDelta: textDeltaCb },\n );\n }\n\n options?.onProviderNativeRawPayload?.({\n provider: 'deepseek',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const response = await client.chat.completions.create(\n requestParams as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming,\n );\n options?.onProviderNativeRawPayload?.({\n provider: 'deepseek',\n apiSurface: 'chat-completions',\n payloadKind: 'response',\n payload: response,\n });\n return this.responseParser.parseResponse(response);\n } catch (error) {\n const deepSeekError = error as IOpenAICompatibleError;\n const errorMessage = deepSeekError.message || 'DeepSeek API request failed';\n throw new Error(`DeepSeek chat failed: ${errorMessage}`);\n }\n }\n\n override async *chatStream(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): AsyncIterable<TUniversalMessage> {\n this.validateMessages(messages);\n this.validateNativeWebTools(options?.nativeWebTools);\n\n if (this.executor) {\n try {\n yield* this.executeStreamViaExecutorOrDirect(messages, options);\n return;\n } catch (error) {\n this.logger.error(\n 'DeepSeek Provider executor stream error:',\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n }\n }\n\n const client = this.getClient();\n\n try {\n const requestParams = this.buildStreamingRequestParams(messages, options);\n options?.onProviderNativeRawPayload?.({\n provider: 'deepseek',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await client.chat.completions.create(\n requestParams as OpenAI.Chat.ChatCompletionCreateParamsStreaming,\n );\n const observedStream = observeProviderNativeRawPayloadStream(stream, {\n provider: 'deepseek',\n apiSurface: 'chat-completions',\n onProviderNativeRawPayload: options?.onProviderNativeRawPayload,\n });\n\n for await (const chunk of this.streamWithAbort(observedStream, options?.signal)) {\n const universalMessage = this.responseParser.parseStreamingChunk(chunk);\n if (universalMessage) {\n yield universalMessage;\n }\n }\n } catch (error) {\n const deepSeekError = error as IOpenAICompatibleError;\n const errorMessage = deepSeekError.message || 'DeepSeek API request failed';\n throw new Error(`DeepSeek stream failed: ${errorMessage}`);\n }\n }\n\n override supportsTools(): boolean {\n return true;\n }\n\n override getCapabilities(): IProviderCapabilities {\n return {\n functionCalling: { supported: true },\n nativeWebTools: {\n webSearch: {\n supported: false,\n enabled: false,\n source: 'openai-compatible-chat-completions',\n reason:\n 'DeepSeek OpenAI-compatible Chat Completions supports declared function tools, not provider-native web search.',\n },\n webFetch: {\n supported: false,\n enabled: false,\n source: 'openai-compatible-chat-completions',\n reason:\n 'DeepSeek OpenAI-compatible Chat Completions supports declared function tools, not provider-native web fetch.',\n },\n },\n };\n }\n\n override validateConfig(): boolean {\n return !!this.client && !!this.options;\n }\n\n override async dispose(): Promise<void> {\n // OpenAI-compatible DeepSeek clients do not need explicit cleanup.\n }\n\n private buildRequestParams(\n messages: TUniversalMessage[],\n options: IChatOptions | undefined,\n ): TDeepSeekChatCompletionCreateParamsNonStreaming {\n this.validateTools(options?.tools);\n const model = options?.model ?? this.options.defaultModel;\n if (!model) {\n throw new Error(\n 'Model is required in chat options. Please specify a model in defaultModel configuration.',\n );\n }\n\n return {\n model,\n messages: convertToOpenAICompatibleMessages(messages),\n ...(options?.temperature !== undefined && { temperature: options.temperature }),\n ...(options?.maxTokens !== undefined && { max_tokens: options.maxTokens }),\n ...(options?.tools && {\n tools: convertToOpenAICompatibleTools(options.tools),\n tool_choice: 'auto' as const,\n }),\n ...(this.options.thinking !== undefined && {\n thinking: { type: this.options.thinking },\n }),\n ...(this.options.reasoningEffort !== undefined && {\n reasoning_effort: this.options.reasoningEffort,\n }),\n };\n }\n\n private buildStreamingRequestParams(\n messages: TUniversalMessage[],\n options: IChatOptions | undefined,\n ): TDeepSeekChatCompletionCreateParamsStreaming {\n return {\n ...this.buildRequestParams(messages, options),\n stream: true,\n };\n }\n\n private getClient(): OpenAI {\n if (!this.client) {\n throw new Error(\n 'DeepSeek client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n\n return this.client;\n }\n\n private async chatWithStreamingAssembly(\n requestParams: TDeepSeekChatCompletionCreateParamsStreaming,\n options: IChatOptions,\n ): Promise<TUniversalMessage> {\n const client = this.getClient();\n\n try {\n options.onProviderNativeRawPayload?.({\n provider: 'deepseek',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await client.chat.completions.create(\n requestParams as OpenAI.Chat.ChatCompletionCreateParamsStreaming,\n options.signal ? { signal: options.signal } : undefined,\n );\n\n return assembleOpenAICompatibleStream({\n stream: observeProviderNativeRawPayloadStream(stream, {\n provider: 'deepseek',\n apiSurface: 'chat-completions',\n onProviderNativeRawPayload: options.onProviderNativeRawPayload,\n }),\n onTextDelta: options.onTextDelta,\n signal: options.signal,\n });\n } catch (error) {\n const deepSeekError = error as IOpenAICompatibleError;\n const errorMessage = deepSeekError.message || 'DeepSeek streaming request failed';\n throw new Error(`DeepSeek stream failed: ${errorMessage}`);\n }\n }\n}\n","import type { IProviderModelCatalogEntry } from '@robota-sdk/agent-core';\nimport { DEFAULT_DEEPSEEK_PROVIDER_MODEL } from './defaults';\n\nexport const DEEPSEEK_MODEL_CATALOG_SOURCE_URL =\n 'https://api-docs.deepseek.com/quick_start/pricing';\nexport const DEEPSEEK_MODEL_LIST_SOURCE_URL = 'https://api-docs.deepseek.com/api/list-models';\nexport const DEEPSEEK_MODEL_LAST_VERIFIED_AT = '2026-05-07';\nexport const DEEPSEEK_DEPRECATED_ALIAS_RETIREMENT_DATE = '2026-07-24';\n\nexport const DEEPSEEK_MODEL_CATALOG_ENTRIES: readonly IProviderModelCatalogEntry[] = [\n {\n id: DEFAULT_DEEPSEEK_PROVIDER_MODEL,\n displayName: 'DeepSeek V4 Flash',\n contextWindow: 1_000_000,\n capabilities: ['tools', 'reasoning', 'json_schema', 'streaming'],\n lifecycle: 'active',\n sourceUrl: DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n lastVerifiedAt: DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n },\n {\n id: 'deepseek-v4-pro',\n displayName: 'DeepSeek V4 Pro',\n contextWindow: 1_000_000,\n capabilities: ['tools', 'reasoning', 'json_schema', 'streaming'],\n lifecycle: 'active',\n sourceUrl: DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n lastVerifiedAt: DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n },\n {\n id: 'deepseek-chat',\n displayName: `DeepSeek Chat compatibility alias, deprecated ${DEEPSEEK_DEPRECATED_ALIAS_RETIREMENT_DATE}`,\n aliases: [DEFAULT_DEEPSEEK_PROVIDER_MODEL],\n contextWindow: 1_000_000,\n capabilities: ['tools', 'json_schema', 'streaming'],\n lifecycle: 'deprecated',\n sourceUrl: DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n lastVerifiedAt: DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n },\n {\n id: 'deepseek-reasoner',\n displayName: `DeepSeek Reasoner compatibility alias, deprecated ${DEEPSEEK_DEPRECATED_ALIAS_RETIREMENT_DATE}`,\n aliases: [DEFAULT_DEEPSEEK_PROVIDER_MODEL],\n contextWindow: 1_000_000,\n capabilities: ['reasoning', 'json_schema', 'streaming'],\n lifecycle: 'deprecated',\n sourceUrl: DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n lastVerifiedAt: DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n },\n];\n\nexport function getDeepSeekFallbackModelCatalogEntry(\n id: string,\n): IProviderModelCatalogEntry | undefined {\n return DEEPSEEK_MODEL_CATALOG_ENTRIES.find((entry) => entry.id === id);\n}\n","import type {\n IProviderModelCatalog,\n IProviderModelCatalogEntry,\n IProviderProfileConfig,\n} from '@robota-sdk/agent-core';\nimport { DEFAULT_DEEPSEEK_PROVIDER_BASE_URL } from './defaults';\nimport {\n DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n getDeepSeekFallbackModelCatalogEntry,\n} from './model-catalog';\n\nexport interface IDeepSeekModelsResponse {\n data?: Array<{\n id?: string;\n object?: string;\n owned_by?: string;\n }>;\n}\n\nexport interface IDeepSeekFetchInit {\n headers?: Record<string, string>;\n}\n\nexport interface IDeepSeekFetchResponse {\n ok: boolean;\n status: number;\n json: () => Promise<IDeepSeekModelsResponse>;\n}\n\nexport type TDeepSeekFetch = (\n url: string,\n init?: IDeepSeekFetchInit,\n) => Promise<IDeepSeekFetchResponse>;\n\nexport async function refreshDeepSeekModelCatalog(\n profile: IProviderProfileConfig,\n fetcher: TDeepSeekFetch = defaultDeepSeekFetch,\n): Promise<IProviderModelCatalog> {\n const baseURL = trimTrailingSlash(profile.baseURL ?? DEFAULT_DEEPSEEK_PROVIDER_BASE_URL);\n const url = `${baseURL}/models`;\n const response = await fetcher(url, buildFetchInit(profile.apiKey));\n\n if (!response.ok) {\n return {\n status: 'unavailable',\n sourceUrl: DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n message: `DeepSeek model refresh failed: HTTP ${response.status}`,\n };\n }\n\n const body = await response.json();\n const entries = (body.data ?? [])\n .map((model) => model.id)\n .filter((id): id is string => typeof id === 'string' && id.length > 0)\n .map(toModelCatalogEntry);\n\n return {\n status: 'live',\n sourceUrl: DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n lastVerifiedAt: DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n entries,\n };\n}\n\nfunction buildFetchInit(apiKey: string | undefined): IDeepSeekFetchInit | undefined {\n if (!apiKey) {\n return undefined;\n }\n return {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n}\n\nfunction toModelCatalogEntry(id: string): IProviderModelCatalogEntry {\n return (\n getDeepSeekFallbackModelCatalogEntry(id) ?? {\n id,\n displayName: id,\n lifecycle: 'active',\n sourceUrl: DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n lastVerifiedAt: DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n }\n );\n}\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/$/, '');\n}\n\nasync function defaultDeepSeekFetch(\n url: string,\n init?: IDeepSeekFetchInit,\n): Promise<IDeepSeekFetchResponse> {\n const response = await fetch(url, {\n ...(init?.headers !== undefined && { headers: init.headers }),\n });\n return {\n ok: response.ok,\n status: response.status,\n json: () => response.json() as Promise<IDeepSeekModelsResponse>,\n };\n}\n","import type { IProviderDefinition, TUniversalValue } from '@robota-sdk/agent-core';\nimport { probeOpenAICompatibleProfile } from '../shared/openai-compatible/index.js';\nimport {\n DEFAULT_DEEPSEEK_PROVIDER_API_KEY_REFERENCE,\n DEFAULT_DEEPSEEK_PROVIDER_BASE_URL,\n DEFAULT_DEEPSEEK_PROVIDER_MODEL,\n} from './defaults';\nimport {\n DEEPSEEK_MODEL_CATALOG_ENTRIES,\n DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n} from './model-catalog';\nimport { refreshDeepSeekModelCatalog } from './model-catalog-refresh';\nimport { DeepSeekProvider } from './provider';\nimport type { TDeepSeekReasoningEffort, TDeepSeekThinkingMode } from './types';\n\nconst DEEPSEEK_MODEL_CATALOG: NonNullable<IProviderDefinition['modelCatalog']> = {\n status: 'fallback',\n sourceUrl: DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n lastVerifiedAt: DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n entries: DEEPSEEK_MODEL_CATALOG_ENTRIES,\n};\nconst DEEPSEEK_API_KEY_URL = 'https://platform.deepseek.com/api_keys';\nconst DEEPSEEK_SETUP_SOURCE_URL = 'https://api-docs.deepseek.com/';\nconst DEEPSEEK_SETUP_LAST_VERIFIED_AT = '2026-05-08';\nconst DEEPSEEK_SETUP_HELP_LINKS: NonNullable<IProviderDefinition['setupHelpLinks']> = [\n {\n kind: 'api-key',\n label: 'DeepSeek API keys',\n url: DEEPSEEK_API_KEY_URL,\n sourceUrl: DEEPSEEK_SETUP_SOURCE_URL,\n lastVerifiedAt: DEEPSEEK_SETUP_LAST_VERIFIED_AT,\n },\n];\n\nexport function createDeepSeekProviderDefinition(): IProviderDefinition {\n return {\n type: 'deepseek',\n displayName: 'DeepSeek',\n description: 'DeepSeek OpenAI-compatible endpoint',\n defaults: {\n model: DEFAULT_DEEPSEEK_PROVIDER_MODEL,\n apiKey: DEFAULT_DEEPSEEK_PROVIDER_API_KEY_REFERENCE,\n baseURL: DEFAULT_DEEPSEEK_PROVIDER_BASE_URL,\n },\n modelCatalog: DEEPSEEK_MODEL_CATALOG,\n setupHelpLinks: DEEPSEEK_SETUP_HELP_LINKS,\n setupSteps: [\n {\n key: 'baseURL',\n title: 'DeepSeek OpenAI-compatible base URL',\n defaultValue: DEFAULT_DEEPSEEK_PROVIDER_BASE_URL,\n },\n {\n key: 'model',\n title: 'DeepSeek model',\n defaultValue: DEFAULT_DEEPSEEK_PROVIDER_MODEL,\n },\n {\n key: 'apiKey',\n title: 'DeepSeek API key',\n defaultValue: DEFAULT_DEEPSEEK_PROVIDER_API_KEY_REFERENCE,\n masked: true,\n },\n ],\n requiresApiKey: true,\n probeProfile: probeOpenAICompatibleProfile,\n refreshModelCatalog: ({ profile }) => refreshDeepSeekModelCatalog(profile),\n modelCatalogCacheTtlSeconds: 86400,\n createProvider: (config) => {\n const options = parseDeepSeekProviderOptions(config.options);\n return new DeepSeekProvider({\n apiKey: requireApiKey(config.apiKey),\n ...(config.baseURL !== undefined && { baseURL: config.baseURL }),\n ...(config.timeout !== undefined && { timeout: config.timeout }),\n ...(options.thinking !== undefined && { thinking: options.thinking }),\n ...(options.reasoningEffort !== undefined && { reasoningEffort: options.reasoningEffort }),\n defaultModel: config.model,\n });\n },\n };\n}\n\nfunction requireApiKey(apiKey: string | undefined): string {\n if (!apiKey) {\n throw new Error('Provider deepseek requires apiKey');\n }\n return apiKey;\n}\n\nfunction parseDeepSeekProviderOptions(options: Record<string, TUniversalValue> | undefined): {\n thinking?: TDeepSeekThinkingMode;\n reasoningEffort?: TDeepSeekReasoningEffort;\n} {\n const thinking = parseThinkingMode(options?.['thinking']);\n const reasoningEffort = parseReasoningEffort(options?.['reasoningEffort']);\n return {\n ...(thinking !== undefined && { thinking }),\n ...(reasoningEffort !== undefined && { reasoningEffort }),\n };\n}\n\nfunction parseThinkingMode(value: TUniversalValue | undefined): TDeepSeekThinkingMode | undefined {\n if (value === true) return 'enabled';\n if (value === false) return 'disabled';\n if (value === 'enabled' || value === 'disabled') return value;\n const record = asRecord(value);\n const type = record?.['type'];\n return type === 'enabled' || type === 'disabled' ? type : undefined;\n}\n\nfunction parseReasoningEffort(\n value: TUniversalValue | undefined,\n): TDeepSeekReasoningEffort | undefined {\n if (\n value === 'low' ||\n value === 'medium' ||\n value === 'high' ||\n value === 'xhigh' ||\n value === 'max'\n ) {\n return value;\n }\n return undefined;\n}\n\nfunction asRecord(value: TUniversalValue | undefined): Record<string, TUniversalValue> | undefined {\n if (value === null || value === undefined || value instanceof Date || Array.isArray(value)) {\n return undefined;\n }\n return typeof value === 'object' ? value : undefined;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"deepseek-_8Ixx7rA.js","names":["deepSeekError"],"sources":["../../src/deepseek/defaults.ts","../../src/deepseek/provider.ts","../../src/deepseek/model-catalog.ts","../../src/deepseek/model-catalog-refresh.ts","../../src/deepseek/provider-definition.ts"],"sourcesContent":["export const DEFAULT_DEEPSEEK_PROVIDER_MODEL = 'deepseek-v4-flash';\nexport const DEFAULT_DEEPSEEK_PROVIDER_API_KEY_ENV = 'DEEPSEEK_API_KEY';\nexport const DEFAULT_DEEPSEEK_PROVIDER_API_KEY_REFERENCE = `$ENV:${DEFAULT_DEEPSEEK_PROVIDER_API_KEY_ENV}`;\nexport const DEFAULT_DEEPSEEK_PROVIDER_BASE_URL = 'https://api.deepseek.com';\n","import { AbstractAIProvider, SilentLogger } from '@robota-sdk/agent-core';\nimport OpenAI from 'openai';\n\nimport { DEFAULT_DEEPSEEK_PROVIDER_BASE_URL } from './defaults';\nimport {\n assembleOpenAICompatibleStream,\n convertToOpenAICompatibleMessages,\n convertToOpenAICompatibleTools,\n observeProviderNativeRawPayloadStream,\n OpenAICompatibleResponseParser,\n} from '../shared/openai-compatible/index.js';\n\nimport type {\n IDeepSeekProviderOptions,\n IDeepSeekThinkingConfig,\n TDeepSeekReasoningEffort,\n} from './types';\nimport type { IOpenAICompatibleError } from '../shared/openai-compatible/index.js';\nimport type {\n IChatOptions,\n IProviderCapabilities,\n TTextDeltaCallback,\n TUniversalMessage,\n} from '@robota-sdk/agent-core';\n\ntype TDeepSeekChatCompletionCreateParamsNonStreaming = Omit<\n OpenAI.Chat.ChatCompletionCreateParamsNonStreaming,\n 'reasoning_effort'\n> & {\n thinking?: IDeepSeekThinkingConfig;\n reasoning_effort?: TDeepSeekReasoningEffort;\n};\n\ntype TDeepSeekChatCompletionCreateParamsStreaming = Omit<\n OpenAI.Chat.ChatCompletionCreateParamsStreaming,\n 'reasoning_effort'\n> & {\n thinking?: IDeepSeekThinkingConfig;\n reasoning_effort?: TDeepSeekReasoningEffort;\n};\n\nexport class DeepSeekProvider extends AbstractAIProvider {\n override readonly name = 'deepseek';\n override readonly version = '1.0.0';\n\n private readonly client?: OpenAI;\n private readonly options: IDeepSeekProviderOptions;\n private readonly responseParser: OpenAICompatibleResponseParser;\n\n onTextDelta?: TTextDeltaCallback;\n\n constructor(options: IDeepSeekProviderOptions) {\n super(options.logger || SilentLogger);\n this.options = options;\n\n if (options.executor) {\n this.executor = options.executor;\n }\n\n if (!this.executor) {\n if (options.client) {\n this.client = options.client;\n } else if (options.apiKey) {\n this.client = new OpenAI({\n apiKey: options.apiKey,\n baseURL: options.baseURL ?? DEFAULT_DEEPSEEK_PROVIDER_BASE_URL,\n ...(options.timeout !== undefined && { timeout: options.timeout }),\n });\n } else {\n throw new Error('Either DeepSeek client, apiKey, or executor is required');\n }\n }\n\n this.responseParser = new OpenAICompatibleResponseParser({ logger: this.logger });\n }\n\n override async chat(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): Promise<TUniversalMessage> {\n this.validateMessages(messages);\n this.validateNativeWebTools(options?.nativeWebTools);\n\n if (this.executor) {\n try {\n return await this.executeViaExecutorOrDirect(messages, options);\n } catch (error) {\n this.logger.error(\n 'DeepSeek Provider executor chat error:',\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n }\n }\n\n const client = this.getClient();\n\n try {\n const requestParams = this.buildRequestParams(messages, options);\n const textDeltaCb = options?.onTextDelta ?? this.onTextDelta;\n if (textDeltaCb) {\n return await this.chatWithStreamingAssembly(\n { ...requestParams, stream: true },\n { ...options, onTextDelta: textDeltaCb },\n );\n }\n\n options?.onProviderNativeRawPayload?.({\n provider: 'deepseek',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const response = await client.chat.completions.create(\n requestParams as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming,\n );\n options?.onProviderNativeRawPayload?.({\n provider: 'deepseek',\n apiSurface: 'chat-completions',\n payloadKind: 'response',\n payload: response,\n });\n return this.responseParser.parseResponse(response);\n } catch (error) {\n const deepSeekError = error as IOpenAICompatibleError;\n const errorMessage = deepSeekError.message || 'DeepSeek API request failed';\n throw new Error(`DeepSeek chat failed: ${errorMessage}`);\n }\n }\n\n override async *chatStream(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): AsyncIterable<TUniversalMessage> {\n this.validateMessages(messages);\n this.validateNativeWebTools(options?.nativeWebTools);\n\n if (this.executor) {\n try {\n yield* this.executeStreamViaExecutorOrDirect(messages, options);\n return;\n } catch (error) {\n this.logger.error(\n 'DeepSeek Provider executor stream error:',\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n }\n }\n\n const client = this.getClient();\n\n try {\n const requestParams = this.buildStreamingRequestParams(messages, options);\n options?.onProviderNativeRawPayload?.({\n provider: 'deepseek',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await client.chat.completions.create(\n requestParams as OpenAI.Chat.ChatCompletionCreateParamsStreaming,\n );\n const observedStream = observeProviderNativeRawPayloadStream(stream, {\n provider: 'deepseek',\n apiSurface: 'chat-completions',\n onProviderNativeRawPayload: options?.onProviderNativeRawPayload,\n });\n\n for await (const chunk of this.streamWithAbort(observedStream, options?.signal)) {\n const universalMessage = this.responseParser.parseStreamingChunk(chunk);\n if (universalMessage) {\n yield universalMessage;\n }\n }\n } catch (error) {\n const deepSeekError = error as IOpenAICompatibleError;\n const errorMessage = deepSeekError.message || 'DeepSeek API request failed';\n throw new Error(`DeepSeek stream failed: ${errorMessage}`);\n }\n }\n\n override supportsTools(): boolean {\n return true;\n }\n\n override getCapabilities(): IProviderCapabilities {\n return {\n functionCalling: { supported: true },\n nativeWebTools: {\n webSearch: {\n supported: false,\n enabled: false,\n source: 'openai-compatible-chat-completions',\n reason:\n 'DeepSeek OpenAI-compatible Chat Completions supports declared function tools, not provider-native web search.',\n },\n webFetch: {\n supported: false,\n enabled: false,\n source: 'openai-compatible-chat-completions',\n reason:\n 'DeepSeek OpenAI-compatible Chat Completions supports declared function tools, not provider-native web fetch.',\n },\n },\n };\n }\n\n override validateConfig(): boolean {\n return !!this.client && !!this.options;\n }\n\n override async dispose(): Promise<void> {\n // OpenAI-compatible DeepSeek clients do not need explicit cleanup.\n }\n\n private buildRequestParams(\n messages: TUniversalMessage[],\n options: IChatOptions | undefined,\n ): TDeepSeekChatCompletionCreateParamsNonStreaming {\n this.validateTools(options?.tools);\n const model = options?.model ?? this.options.defaultModel;\n if (!model) {\n throw new Error(\n 'Model is required in chat options. Please specify a model in defaultModel configuration.',\n );\n }\n\n return {\n model,\n messages: convertToOpenAICompatibleMessages(messages),\n ...(options?.temperature !== undefined && { temperature: options.temperature }),\n ...(options?.maxTokens !== undefined && { max_tokens: options.maxTokens }),\n ...(options?.tools && {\n tools: convertToOpenAICompatibleTools(options.tools),\n tool_choice: 'auto' as const,\n }),\n ...(this.options.thinking !== undefined && {\n thinking: { type: this.options.thinking },\n }),\n ...(this.options.reasoningEffort !== undefined && {\n reasoning_effort: this.options.reasoningEffort,\n }),\n };\n }\n\n private buildStreamingRequestParams(\n messages: TUniversalMessage[],\n options: IChatOptions | undefined,\n ): TDeepSeekChatCompletionCreateParamsStreaming {\n return {\n ...this.buildRequestParams(messages, options),\n stream: true,\n };\n }\n\n private getClient(): OpenAI {\n if (!this.client) {\n throw new Error(\n 'DeepSeek client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n\n return this.client;\n }\n\n private async chatWithStreamingAssembly(\n requestParams: TDeepSeekChatCompletionCreateParamsStreaming,\n options: IChatOptions,\n ): Promise<TUniversalMessage> {\n const client = this.getClient();\n\n try {\n options.onProviderNativeRawPayload?.({\n provider: 'deepseek',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await client.chat.completions.create(\n requestParams as OpenAI.Chat.ChatCompletionCreateParamsStreaming,\n options.signal ? { signal: options.signal } : undefined,\n );\n\n return assembleOpenAICompatibleStream({\n stream: observeProviderNativeRawPayloadStream(stream, {\n provider: 'deepseek',\n apiSurface: 'chat-completions',\n onProviderNativeRawPayload: options.onProviderNativeRawPayload,\n }),\n onTextDelta: options.onTextDelta,\n signal: options.signal,\n });\n } catch (error) {\n const deepSeekError = error as IOpenAICompatibleError;\n const errorMessage = deepSeekError.message || 'DeepSeek streaming request failed';\n throw new Error(`DeepSeek stream failed: ${errorMessage}`);\n }\n }\n}\n","import { DEFAULT_DEEPSEEK_PROVIDER_MODEL } from './defaults';\n\nimport type { IProviderModelCatalogEntry } from '@robota-sdk/agent-core';\n\nexport const DEEPSEEK_MODEL_CATALOG_SOURCE_URL =\n 'https://api-docs.deepseek.com/quick_start/pricing';\nexport const DEEPSEEK_MODEL_LIST_SOURCE_URL = 'https://api-docs.deepseek.com/api/list-models';\nexport const DEEPSEEK_MODEL_LAST_VERIFIED_AT = '2026-05-07';\nexport const DEEPSEEK_DEPRECATED_ALIAS_RETIREMENT_DATE = '2026-07-24';\n\nexport const DEEPSEEK_MODEL_CATALOG_ENTRIES: readonly IProviderModelCatalogEntry[] = [\n {\n id: DEFAULT_DEEPSEEK_PROVIDER_MODEL,\n displayName: 'DeepSeek V4 Flash',\n contextWindow: 1_000_000,\n capabilities: ['tools', 'reasoning', 'json_schema', 'streaming'],\n lifecycle: 'active',\n sourceUrl: DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n lastVerifiedAt: DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n },\n {\n id: 'deepseek-v4-pro',\n displayName: 'DeepSeek V4 Pro',\n contextWindow: 1_000_000,\n capabilities: ['tools', 'reasoning', 'json_schema', 'streaming'],\n lifecycle: 'active',\n sourceUrl: DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n lastVerifiedAt: DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n },\n {\n id: 'deepseek-chat',\n displayName: `DeepSeek Chat compatibility alias, deprecated ${DEEPSEEK_DEPRECATED_ALIAS_RETIREMENT_DATE}`,\n aliases: [DEFAULT_DEEPSEEK_PROVIDER_MODEL],\n contextWindow: 1_000_000,\n capabilities: ['tools', 'json_schema', 'streaming'],\n lifecycle: 'deprecated',\n sourceUrl: DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n lastVerifiedAt: DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n },\n {\n id: 'deepseek-reasoner',\n displayName: `DeepSeek Reasoner compatibility alias, deprecated ${DEEPSEEK_DEPRECATED_ALIAS_RETIREMENT_DATE}`,\n aliases: [DEFAULT_DEEPSEEK_PROVIDER_MODEL],\n contextWindow: 1_000_000,\n capabilities: ['reasoning', 'json_schema', 'streaming'],\n lifecycle: 'deprecated',\n sourceUrl: DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n lastVerifiedAt: DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n },\n];\n\nexport function getDeepSeekFallbackModelCatalogEntry(\n id: string,\n): IProviderModelCatalogEntry | undefined {\n return DEEPSEEK_MODEL_CATALOG_ENTRIES.find((entry) => entry.id === id);\n}\n","import { DEFAULT_DEEPSEEK_PROVIDER_BASE_URL } from './defaults';\nimport {\n DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n getDeepSeekFallbackModelCatalogEntry,\n} from './model-catalog';\n\nimport type {\n IProviderModelCatalog,\n IProviderModelCatalogEntry,\n IProviderProfileConfig,\n} from '@robota-sdk/agent-core';\n\nexport interface IDeepSeekModelsResponse {\n data?: Array<{\n id?: string;\n object?: string;\n owned_by?: string;\n }>;\n}\n\nexport interface IDeepSeekFetchInit {\n headers?: Record<string, string>;\n}\n\nexport interface IDeepSeekFetchResponse {\n ok: boolean;\n status: number;\n json: () => Promise<IDeepSeekModelsResponse>;\n}\n\nexport type TDeepSeekFetch = (\n url: string,\n init?: IDeepSeekFetchInit,\n) => Promise<IDeepSeekFetchResponse>;\n\nexport async function refreshDeepSeekModelCatalog(\n profile: IProviderProfileConfig,\n fetcher: TDeepSeekFetch = defaultDeepSeekFetch,\n): Promise<IProviderModelCatalog> {\n const baseURL = trimTrailingSlash(profile.baseURL ?? DEFAULT_DEEPSEEK_PROVIDER_BASE_URL);\n const url = `${baseURL}/models`;\n const response = await fetcher(url, buildFetchInit(profile.apiKey));\n\n if (!response.ok) {\n return {\n status: 'unavailable',\n sourceUrl: DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n message: `DeepSeek model refresh failed: HTTP ${response.status}`,\n };\n }\n\n const body = await response.json();\n const entries = (body.data ?? [])\n .map((model) => model.id)\n .filter((id): id is string => typeof id === 'string' && id.length > 0)\n .map(toModelCatalogEntry);\n\n return {\n status: 'live',\n sourceUrl: DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n lastVerifiedAt: DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n entries,\n };\n}\n\nfunction buildFetchInit(apiKey: string | undefined): IDeepSeekFetchInit | undefined {\n if (!apiKey) {\n return undefined;\n }\n return {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n}\n\nfunction toModelCatalogEntry(id: string): IProviderModelCatalogEntry {\n return (\n getDeepSeekFallbackModelCatalogEntry(id) ?? {\n id,\n displayName: id,\n lifecycle: 'active',\n sourceUrl: DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n lastVerifiedAt: DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n }\n );\n}\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/$/, '');\n}\n\nasync function defaultDeepSeekFetch(\n url: string,\n init?: IDeepSeekFetchInit,\n): Promise<IDeepSeekFetchResponse> {\n const response = await fetch(url, {\n ...(init?.headers !== undefined && { headers: init.headers }),\n });\n return {\n ok: response.ok,\n status: response.status,\n json: () => response.json() as Promise<IDeepSeekModelsResponse>,\n };\n}\n","import {\n DEFAULT_DEEPSEEK_PROVIDER_API_KEY_REFERENCE,\n DEFAULT_DEEPSEEK_PROVIDER_BASE_URL,\n DEFAULT_DEEPSEEK_PROVIDER_MODEL,\n} from './defaults';\nimport {\n DEEPSEEK_MODEL_CATALOG_ENTRIES,\n DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n} from './model-catalog';\nimport { refreshDeepSeekModelCatalog } from './model-catalog-refresh';\nimport { DeepSeekProvider } from './provider';\nimport { probeOpenAICompatibleProfile } from '../shared/openai-compatible/index.js';\n\nimport type { TDeepSeekReasoningEffort, TDeepSeekThinkingMode } from './types';\nimport type { IProviderDefinition, TUniversalValue } from '@robota-sdk/agent-core';\n\nconst DEEPSEEK_MODEL_CATALOG: NonNullable<IProviderDefinition['modelCatalog']> = {\n status: 'fallback',\n sourceUrl: DEEPSEEK_MODEL_CATALOG_SOURCE_URL,\n lastVerifiedAt: DEEPSEEK_MODEL_LAST_VERIFIED_AT,\n entries: DEEPSEEK_MODEL_CATALOG_ENTRIES,\n};\nconst DEEPSEEK_API_KEY_URL = 'https://platform.deepseek.com/api_keys';\nconst DEEPSEEK_SETUP_SOURCE_URL = 'https://api-docs.deepseek.com/';\nconst DEEPSEEK_SETUP_LAST_VERIFIED_AT = '2026-05-08';\nconst DEEPSEEK_SETUP_HELP_LINKS: NonNullable<IProviderDefinition['setupHelpLinks']> = [\n {\n kind: 'api-key',\n label: 'DeepSeek API keys',\n url: DEEPSEEK_API_KEY_URL,\n sourceUrl: DEEPSEEK_SETUP_SOURCE_URL,\n lastVerifiedAt: DEEPSEEK_SETUP_LAST_VERIFIED_AT,\n },\n];\n\nexport function createDeepSeekProviderDefinition(): IProviderDefinition {\n return {\n type: 'deepseek',\n displayName: 'DeepSeek',\n description: 'DeepSeek OpenAI-compatible endpoint',\n defaults: {\n model: DEFAULT_DEEPSEEK_PROVIDER_MODEL,\n apiKey: DEFAULT_DEEPSEEK_PROVIDER_API_KEY_REFERENCE,\n baseURL: DEFAULT_DEEPSEEK_PROVIDER_BASE_URL,\n },\n modelCatalog: DEEPSEEK_MODEL_CATALOG,\n setupHelpLinks: DEEPSEEK_SETUP_HELP_LINKS,\n setupSteps: [\n {\n key: 'baseURL',\n title: 'DeepSeek OpenAI-compatible base URL',\n defaultValue: DEFAULT_DEEPSEEK_PROVIDER_BASE_URL,\n },\n {\n key: 'model',\n title: 'DeepSeek model',\n defaultValue: DEFAULT_DEEPSEEK_PROVIDER_MODEL,\n },\n {\n key: 'apiKey',\n title: 'DeepSeek API key',\n defaultValue: DEFAULT_DEEPSEEK_PROVIDER_API_KEY_REFERENCE,\n masked: true,\n },\n ],\n requiresApiKey: true,\n probeProfile: probeOpenAICompatibleProfile,\n refreshModelCatalog: ({ profile }) => refreshDeepSeekModelCatalog(profile),\n modelCatalogCacheTtlSeconds: 86400,\n createProvider: (config) => {\n const options = parseDeepSeekProviderOptions(config.options);\n return new DeepSeekProvider({\n apiKey: requireApiKey(config.apiKey),\n ...(config.baseURL !== undefined && { baseURL: config.baseURL }),\n ...(config.timeout !== undefined && { timeout: config.timeout }),\n ...(options.thinking !== undefined && { thinking: options.thinking }),\n ...(options.reasoningEffort !== undefined && { reasoningEffort: options.reasoningEffort }),\n defaultModel: config.model,\n });\n },\n };\n}\n\nfunction requireApiKey(apiKey: string | undefined): string {\n if (!apiKey) {\n throw new Error('Provider deepseek requires apiKey');\n }\n return apiKey;\n}\n\nfunction parseDeepSeekProviderOptions(options: Record<string, TUniversalValue> | undefined): {\n thinking?: TDeepSeekThinkingMode;\n reasoningEffort?: TDeepSeekReasoningEffort;\n} {\n const thinking = parseThinkingMode(options?.['thinking']);\n const reasoningEffort = parseReasoningEffort(options?.['reasoningEffort']);\n return {\n ...(thinking !== undefined && { thinking }),\n ...(reasoningEffort !== undefined && { reasoningEffort }),\n };\n}\n\nfunction parseThinkingMode(value: TUniversalValue | undefined): TDeepSeekThinkingMode | undefined {\n if (value === true) return 'enabled';\n if (value === false) return 'disabled';\n if (value === 'enabled' || value === 'disabled') return value;\n const record = asRecord(value);\n const type = record?.['type'];\n return type === 'enabled' || type === 'disabled' ? type : undefined;\n}\n\nfunction parseReasoningEffort(\n value: TUniversalValue | undefined,\n): TDeepSeekReasoningEffort | undefined {\n if (\n value === 'low' ||\n value === 'medium' ||\n value === 'high' ||\n value === 'xhigh' ||\n value === 'max'\n ) {\n return value;\n }\n return undefined;\n}\n\nfunction asRecord(value: TUniversalValue | undefined): Record<string, TUniversalValue> | undefined {\n if (value === null || value === undefined || value instanceof Date || Array.isArray(value)) {\n return undefined;\n }\n return typeof value === 'object' ? value : undefined;\n}\n"],"mappings":"sLAAA,MAAa,EAAkC,oBAClC,EAAwC,mBACxC,EAA8C,QAAQ,IACtD,EAAqC,2BCsClD,IAAa,EAAb,cAAsC,CAAmB,CACvD,KAAyB,WACzB,QAA4B,QAE5B,OACA,QACA,eAEA,YAEA,YAAY,EAAmC,CAQ7C,GAPA,MAAM,EAAQ,QAAU,CAAY,EACpC,KAAK,QAAU,EAEX,EAAQ,WACV,KAAK,SAAW,EAAQ,UAGtB,CAAC,KAAK,SACR,GAAI,EAAQ,OACV,KAAK,OAAS,EAAQ,YACjB,GAAI,EAAQ,OACjB,KAAK,OAAS,IAAI,EAAO,CACvB,OAAQ,EAAQ,OAChB,QAAS,EAAQ,SAAA,2BACjB,GAAI,EAAQ,UAAY,IAAA,IAAa,CAAE,QAAS,EAAQ,OAAQ,CAClE,CAAC,OAED,MAAU,MAAM,yDAAyD,EAI7E,KAAK,eAAiB,IAAI,EAA+B,CAAE,OAAQ,KAAK,MAAO,CAAC,CAClF,CAEA,MAAe,KACb,EACA,EAC4B,CAI5B,GAHA,KAAK,iBAAiB,CAAQ,EAC9B,KAAK,uBAAuB,GAAS,cAAc,EAE/C,KAAK,SACP,GAAI,CACF,OAAO,MAAM,KAAK,2BAA2B,EAAU,CAAO,CAChE,OAAS,EAAO,CAKd,MAJA,KAAK,OAAO,MACV,yCACA,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CACvD,EACM,CACR,CAGF,IAAM,EAAS,KAAK,UAAU,EAE9B,GAAI,CACF,IAAM,EAAgB,KAAK,mBAAmB,EAAU,CAAO,EACzD,EAAc,GAAS,aAAe,KAAK,YACjD,GAAI,EACF,OAAO,MAAM,KAAK,0BAChB,CAAE,GAAG,EAAe,OAAQ,EAAK,EACjC,CAAE,GAAG,EAAS,YAAa,CAAY,CACzC,EAGF,GAAS,6BAA6B,CACpC,SAAU,WACV,WAAY,mBACZ,YAAa,UACb,QAAS,CACX,CAAC,EACD,IAAM,EAAW,MAAM,EAAO,KAAK,YAAY,OAC7C,CACF,EAOA,OANA,GAAS,6BAA6B,CACpC,SAAU,WACV,WAAY,mBACZ,YAAa,WACb,QAAS,CACX,CAAC,EACM,KAAK,eAAe,cAAc,CAAQ,CACnD,OAAS,EAAO,CAEd,IAAM,EAAeA,EAAc,SAAW,8BAC9C,MAAU,MAAM,yBAAyB,GAAc,CACzD,CACF,CAEA,MAAgB,WACd,EACA,EACkC,CAIlC,GAHA,KAAK,iBAAiB,CAAQ,EAC9B,KAAK,uBAAuB,GAAS,cAAc,EAE/C,KAAK,SACP,GAAI,CACF,MAAO,KAAK,iCAAiC,EAAU,CAAO,EAC9D,MACF,OAAS,EAAO,CAKd,MAJA,KAAK,OAAO,MACV,2CACA,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CACvD,EACM,CACR,CAGF,IAAM,EAAS,KAAK,UAAU,EAE9B,GAAI,CACF,IAAM,EAAgB,KAAK,4BAA4B,EAAU,CAAO,EACxE,GAAS,6BAA6B,CACpC,SAAU,WACV,WAAY,mBACZ,YAAa,UACb,QAAS,CACX,CAAC,EAID,IAAM,EAAiB,EAAsC,MAHxC,EAAO,KAAK,YAAY,OAC3C,CACF,EACqE,CACnE,SAAU,WACV,WAAY,mBACZ,2BAA4B,GAAS,0BACvC,CAAC,EAED,UAAW,IAAM,KAAS,KAAK,gBAAgB,EAAgB,GAAS,MAAM,EAAG,CAC/E,IAAM,EAAmB,KAAK,eAAe,oBAAoB,CAAK,EAClE,IACF,MAAM,EAEV,CACF,OAAS,EAAO,CAEd,IAAM,EAAeA,EAAc,SAAW,8BAC9C,MAAU,MAAM,2BAA2B,GAAc,CAC3D,CACF,CAEA,eAAkC,CAChC,MAAO,EACT,CAEA,iBAAkD,CAChD,MAAO,CACL,gBAAiB,CAAE,UAAW,EAAK,EACnC,eAAgB,CACd,UAAW,CACT,UAAW,GACX,QAAS,GACT,OAAQ,qCACR,OACE,+GACJ,EACA,SAAU,CACR,UAAW,GACX,QAAS,GACT,OAAQ,qCACR,OACE,8GACJ,CACF,CACF,CACF,CAEA,gBAAmC,CACjC,MAAO,CAAC,CAAC,KAAK,QAAU,CAAC,CAAC,KAAK,OACjC,CAEA,MAAe,SAAyB,CAExC,CAEA,mBACE,EACA,EACiD,CACjD,KAAK,cAAc,GAAS,KAAK,EACjC,IAAM,EAAQ,GAAS,OAAS,KAAK,QAAQ,aAC7C,GAAI,CAAC,EACH,MAAU,MACR,0FACF,EAGF,MAAO,CACL,QACA,SAAU,EAAkC,CAAQ,EACpD,GAAI,GAAS,cAAgB,IAAA,IAAa,CAAE,YAAa,EAAQ,WAAY,EAC7E,GAAI,GAAS,YAAc,IAAA,IAAa,CAAE,WAAY,EAAQ,SAAU,EACxE,GAAI,GAAS,OAAS,CACpB,MAAO,EAA+B,EAAQ,KAAK,EACnD,YAAa,MACf,EACA,GAAI,KAAK,QAAQ,WAAa,IAAA,IAAa,CACzC,SAAU,CAAE,KAAM,KAAK,QAAQ,QAAS,CAC1C,EACA,GAAI,KAAK,QAAQ,kBAAoB,IAAA,IAAa,CAChD,iBAAkB,KAAK,QAAQ,eACjC,CACF,CACF,CAEA,4BACE,EACA,EAC8C,CAC9C,MAAO,CACL,GAAG,KAAK,mBAAmB,EAAU,CAAO,EAC5C,OAAQ,EACV,CACF,CAEA,WAA4B,CAC1B,GAAI,CAAC,KAAK,OACR,MAAU,MACR,mFACF,EAGF,OAAO,KAAK,MACd,CAEA,MAAc,0BACZ,EACA,EAC4B,CAC5B,IAAM,EAAS,KAAK,UAAU,EAE9B,GAAI,CAYF,OAXA,EAAQ,6BAA6B,CACnC,SAAU,WACV,WAAY,mBACZ,YAAa,UACb,QAAS,CACX,CAAC,EAMM,EAA+B,CACpC,OAAQ,EAAsC,MAN3B,EAAO,KAAK,YAAY,OAC3C,EACA,EAAQ,OAAS,CAAE,OAAQ,EAAQ,MAAO,EAAI,IAAA,EAChD,EAGwD,CACpD,SAAU,WACV,WAAY,mBACZ,2BAA4B,EAAQ,0BACtC,CAAC,EACD,YAAa,EAAQ,YACrB,OAAQ,EAAQ,MAClB,CAAC,CACH,OAAS,EAAO,CAEd,IAAM,EAAeA,EAAc,SAAW,oCAC9C,MAAU,MAAM,2BAA2B,GAAc,CAC3D,CACF,CACF,ECvSA,MAAa,EACX,oDACW,EAAiC,gDACjC,EAAkC,aAClC,EAA4C,aAE5C,EAAwE,CACnF,CACE,GAAI,EACJ,YAAa,oBACb,cAAe,IACf,aAAc,CAAC,QAAS,YAAa,cAAe,WAAW,EAC/D,UAAW,SACX,UAAW,EACX,eAAgB,CAClB,EACA,CACE,GAAI,kBACJ,YAAa,kBACb,cAAe,IACf,aAAc,CAAC,QAAS,YAAa,cAAe,WAAW,EAC/D,UAAW,SACX,UAAW,EACX,eAAgB,CAClB,EACA,CACE,GAAI,gBACJ,YAAa,iDAAiD,IAC9D,QAAS,CAAC,CAA+B,EACzC,cAAe,IACf,aAAc,CAAC,QAAS,cAAe,WAAW,EAClD,UAAW,aACX,UAAW,EACX,eAAgB,CAClB,EACA,CACE,GAAI,oBACJ,YAAa,qDAAqD,IAClE,QAAS,CAAC,CAA+B,EACzC,cAAe,IACf,aAAc,CAAC,YAAa,cAAe,WAAW,EACtD,UAAW,aACX,UAAW,EACX,eAAgB,CAClB,CACF,EAEA,SAAgB,EACd,EACwC,CACxC,OAAO,EAA+B,KAAM,GAAU,EAAM,KAAO,CAAE,CACvE,CCnBA,eAAsB,EACpB,EACA,EAA0B,EACM,CAGhC,IAAM,EAAW,MAAM,EAAQ,GAFf,EAAkB,EAAQ,SAAA,0BACrB,EAAE,SACa,EAAe,EAAQ,MAAM,CAAC,EAgBlE,OAdK,EAAS,GAcP,CACL,OAAQ,OACR,UAAW,EACX,eAAgB,EAChB,UATe,MADE,EAAS,KAAK,GACX,MAAQ,CAAC,GAC5B,IAAK,GAAU,EAAM,EAAE,EACvB,OAAQ,GAAqB,OAAO,GAAO,UAAY,EAAG,OAAS,CAAC,EACpE,IAAI,CAMC,CACR,EAlBS,CACL,OAAQ,cACR,UAAW,EACX,QAAS,uCAAuC,EAAS,QAC3D,CAeJ,CAEA,SAAS,EAAe,EAA4D,CAC7E,KAGL,MAAO,CACL,QAAS,CACP,cAAe,UAAU,GAC3B,CACF,CACF,CAEA,SAAS,EAAoB,EAAwC,CACnE,OACE,EAAqC,CAAE,GAAK,CAC1C,KACA,YAAa,EACb,UAAW,SACX,UAAA,oDACA,eAAA,YACF,CAEJ,CAEA,SAAS,EAAkB,EAAuB,CAChD,OAAO,EAAM,QAAQ,MAAO,EAAE,CAChC,CAEA,eAAe,EACb,EACA,EACiC,CACjC,IAAM,EAAW,MAAM,MAAM,EAAK,CAChC,GAAI,GAAM,UAAY,IAAA,IAAa,CAAE,QAAS,EAAK,OAAQ,CAC7D,CAAC,EACD,MAAO,CACL,GAAI,EAAS,GACb,OAAQ,EAAS,OACjB,SAAY,EAAS,KAAK,CAC5B,CACF,CCxFA,MAAM,EAA2E,CAC/E,OAAQ,WACR,UAAW,EACX,eAAgB,EAChB,QAAS,CACX,EAIM,EAAgF,CACpF,CACE,KAAM,UACN,MAAO,oBACP,IAAK,yCACL,UAAW,iCACX,eAAgB,YAClB,CACF,EAEA,SAAgB,GAAwD,CACtE,MAAO,CACL,KAAM,WACN,YAAa,WACb,YAAa,sCACb,SAAU,CACR,MAAO,EACP,OAAQ,EACR,QAAS,CACX,EACA,aAAc,EACd,eAAgB,EAChB,WAAY,CACV,CACE,IAAK,UACL,MAAO,sCACP,aAAc,CAChB,EACA,CACE,IAAK,QACL,MAAO,iBACP,aAAc,CAChB,EACA,CACE,IAAK,SACL,MAAO,mBACP,aAAc,EACd,OAAQ,EACV,CACF,EACA,eAAgB,GAChB,aAAc,EACd,qBAAsB,CAAE,aAAc,EAA4B,CAAO,EACzE,4BAA6B,MAC7B,eAAiB,GAAW,CAC1B,IAAM,EAAU,EAA6B,EAAO,OAAO,EAC3D,OAAO,IAAI,EAAiB,CAC1B,OAAQ,EAAc,EAAO,MAAM,EACnC,GAAI,EAAO,UAAY,IAAA,IAAa,CAAE,QAAS,EAAO,OAAQ,EAC9D,GAAI,EAAO,UAAY,IAAA,IAAa,CAAE,QAAS,EAAO,OAAQ,EAC9D,GAAI,EAAQ,WAAa,IAAA,IAAa,CAAE,SAAU,EAAQ,QAAS,EACnE,GAAI,EAAQ,kBAAoB,IAAA,IAAa,CAAE,gBAAiB,EAAQ,eAAgB,EACxF,aAAc,EAAO,KACvB,CAAC,CACH,CACF,CACF,CAEA,SAAS,EAAc,EAAoC,CACzD,GAAI,CAAC,EACH,MAAU,MAAM,mCAAmC,EAErD,OAAO,CACT,CAEA,SAAS,EAA6B,EAGpC,CACA,IAAM,EAAW,EAAkB,GAAU,QAAW,EAClD,EAAkB,EAAqB,GAAU,eAAkB,EACzE,MAAO,CACL,GAAI,IAAa,IAAA,IAAa,CAAE,UAAS,EACzC,GAAI,IAAoB,IAAA,IAAa,CAAE,iBAAgB,CACzD,CACF,CAEA,SAAS,EAAkB,EAAuE,CAChG,GAAI,IAAU,GAAM,MAAO,UAC3B,GAAI,IAAU,GAAO,MAAO,WAC5B,GAAI,IAAU,WAAa,IAAU,WAAY,OAAO,EAExD,IAAM,EADS,EAAS,CACN,GAAI,KACtB,OAAO,IAAS,WAAa,IAAS,WAAa,EAAO,IAAA,EAC5D,CAEA,SAAS,EACP,EACsC,CACtC,GACE,IAAU,OACV,IAAU,UACV,IAAU,QACV,IAAU,SACV,IAAU,MAEV,OAAO,CAGX,CAEA,SAAS,EAAS,EAAiF,CAC7F,QAAU,MAA+B,aAAiB,MAAQ,MAAM,QAAQ,CAAK,GAGzF,OAAO,OAAO,GAAU,SAAW,EAAQ,IAAA,EAC7C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/gemini/model-catalog-refresh.ts","../../../src/gemini/types.ts","../../../src/gemini/provider.ts","../../../src/gemini/provider-definition.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/gemini/model-catalog-refresh.ts","../../../src/gemini/types.ts","../../../src/gemini/provider.ts","../../../src/gemini/provider-definition.ts"],"mappings":";;;UAUiB,gBAAA;EACf,IAAA;EACA,WAAA;EACA,WAAA;EACA,eAAA;EACA,gBAAA;EACA,0BAAA;AAAA;AAAA,UAGe,qBAAA;EACf,MAAA,GAAS,gBAAgB;EACzB,aAAA;AAAA;AAAA,UAGe,gBAAA;EACf,OAAA,GAAU,MAAM;AAAA;AAAA,UAGD,oBAAA;EACf,EAAA;EACA,MAAA;EACA,IAAA,QAAY,OAAO,CAAC,qBAAA;AAAA;AAAA,KAGV,YAAA,IAAgB,GAAA,UAAa,IAAA,GAAO,gBAAA,KAAqB,OAAA,CAAQ,oBAAA;AAAA,iBAEvD,yBAAA,CACpB,OAAA,EAAS,sBAAA,EACT,OAAA,GAAS,YAAA,GACR,OAAA,CAAQ,qBAAA;;;;;AA7BX;KCLY,0BAAA,kDAMR,SAAA,GACA,wBAAA,GACA,0BAAA;EAAA,CACG,GAAA,WAAc,0BAAA;AAAA;AAAA,UAEJ,oBAAA;EAAA,CACd,GAAA,WAAc,0BAA0B;EACzC,QAAA;EACA,SAAA;EACA,MAAA;AAAA;AAAA,UAGe,qBAAA;EAAA,CACd,GAAA,WAAc,0BAA0B;EACzC,eAAA;EACA,cAAA;EACA,aAAA;AAAA;;;;UAMe,sBAAA;EDZF;AAGf;;EAHe,CCgBZ,GAAA,WAAc,0BAAA;EDZf;ECeA,MAAA;EDZe;;;ECiBf,YAAA;EDhBA;;;;;ECuBA,gBAAA;EDrByC;AAG3C;;ECuBE,cAAA,GAAiB,MAAA,SAAe,0BAAA;EDvBc;;;;EC6B9C,kBAAA,GAAqB,MAAA,SAAe,0BAAA;ED7BV;;;;ECmC1B,cAAA,GAAiB,oBAAA;EDnC8E;AAAA;AAEjG;ECsCE,cAAA,GAAiB,qBAAA;;;;EAKjB,UAAA,GAAa,MAAA,SAAe,0BAAA;EDxC3B;;;;EC8CD,yBAAA,GAA4B,KAAA;ED/CnB;;;;ECqDT,kBAAA;EDpD8B;;;;AClChC;;;;;;;;;;;;;;;AAS+C;AAE/C;;;;;;EAuGE,QAAA,GAAW,SAAA;AAAA;;;AD7Gb;;;;;;;;;;;AAM4B;AAG5B;AATA,cEyBa,cAAA,SAAuB,kBAAA,YAA8B,wBAAA;EAAA,SAC9C,IAAA;EAAA,SACA,OAAA;EACX,WAAA,GAAc,kBAAA;EAAA,iBAEJ,MAAA;EAAA,iBACA,OAAA;cAEL,OAAA,EAAS,sBAAA;EFtBR;EEoCE,IAAA,CACb,QAAA,EAAU,iBAAA,IACV,OAAA,GAAU,YAAA,GACT,OAAA,CAAQ,iBAAA;EFpCoB;EEsEf,UAAA,CACd,QAAA,EAAU,iBAAA,IACV,OAAA,GAAU,YAAA,GACT,aAAA,CAAc,iBAAA;EFxEjB;EE0Ga,aAAA,CACX,OAAA,EAAS,uBAAA,GACR,OAAA,CAAQ,oBAAA,CAAqB,sBAAA;EFzGjB;EEyIF,SAAA,CACX,OAAA,EAAS,iBAAA,GACR,OAAA,CAAQ,oBAAA,CAAqB,sBAAA;;EAqCnB,YAAA,CACX,OAAA,EAAS,oBAAA,GACR,OAAA,CAAQ,oBAAA,CAAqB,sBAAA;EAkDvB,aAAA,CAAA;EAIA,cAAA,CAAA;EAOM,OAAA,CAAA,GAAW,OAAA;EAAA,QAIlB,qBAAA;AAAA;;;cC1QG,mCAAA;AAAA,cACA,yCAAA;AAAA,cACA,6BAAA;AAAA,cACA,uBAAA;AAAA,cACA,6BAAA;AAAA,iBAcG,8BAAA,CAAA,GAAkC,mBAAmB"}
|