@scenemesh/entity-engine-aimodule 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +854 -0
  3. package/dist/ai-core-LBGYFGOK.mjs +17 -0
  4. package/dist/ai-core-LBGYFGOK.mjs.map +1 -0
  5. package/dist/ai-core-UGJWSCQN.js +17 -0
  6. package/dist/ai-core-UGJWSCQN.js.map +1 -0
  7. package/dist/ai-core-manager-B3Z34RHA.mjs +9 -0
  8. package/dist/ai-core-manager-B3Z34RHA.mjs.map +1 -0
  9. package/dist/ai-core-manager-W7SSDCG5.js +9 -0
  10. package/dist/ai-core-manager-W7SSDCG5.js.map +1 -0
  11. package/dist/ai-embeddings-5ED5LDXX.mjs +17 -0
  12. package/dist/ai-embeddings-5ED5LDXX.mjs.map +1 -0
  13. package/dist/ai-embeddings-WCXZMMTZ.js +17 -0
  14. package/dist/ai-embeddings-WCXZMMTZ.js.map +1 -0
  15. package/dist/ai-form-renderer-24IWNMX5.js +233 -0
  16. package/dist/ai-form-renderer-24IWNMX5.js.map +1 -0
  17. package/dist/ai-form-renderer-BORQABF2.mjs +233 -0
  18. package/dist/ai-form-renderer-BORQABF2.mjs.map +1 -0
  19. package/dist/ai-provider-3PSCVEEN.mjs +17 -0
  20. package/dist/ai-provider-3PSCVEEN.mjs.map +1 -0
  21. package/dist/ai-provider-WMPMVZFL.js +17 -0
  22. package/dist/ai-provider-WMPMVZFL.js.map +1 -0
  23. package/dist/ai-renderer-7WGGWH5D.mjs +134 -0
  24. package/dist/ai-renderer-7WGGWH5D.mjs.map +1 -0
  25. package/dist/ai-renderer-OILYWAJV.js +134 -0
  26. package/dist/ai-renderer-OILYWAJV.js.map +1 -0
  27. package/dist/ai-settings-DGCFPK3U.js +15 -0
  28. package/dist/ai-settings-DGCFPK3U.js.map +1 -0
  29. package/dist/ai-settings-DTXEAB64.mjs +15 -0
  30. package/dist/ai-settings-DTXEAB64.mjs.map +1 -0
  31. package/dist/ai-structured-EGZ26ZS4.mjs +13 -0
  32. package/dist/ai-structured-EGZ26ZS4.mjs.map +1 -0
  33. package/dist/ai-structured-N2FZLO4A.js +13 -0
  34. package/dist/ai-structured-N2FZLO4A.js.map +1 -0
  35. package/dist/ai-tools-B3R77HZ3.js +19 -0
  36. package/dist/ai-tools-B3R77HZ3.js.map +1 -0
  37. package/dist/ai-tools-JAPVYQGE.mjs +19 -0
  38. package/dist/ai-tools-JAPVYQGE.mjs.map +1 -0
  39. package/dist/ai.module-GAHVCBTP.js +7 -0
  40. package/dist/ai.module-GAHVCBTP.js.map +1 -0
  41. package/dist/ai.module-TTPMTPB3.mjs +7 -0
  42. package/dist/ai.module-TTPMTPB3.mjs.map +1 -0
  43. package/dist/chunk-25C2NRSD.mjs +611 -0
  44. package/dist/chunk-25C2NRSD.mjs.map +1 -0
  45. package/dist/chunk-4JQ7UOXH.js +427 -0
  46. package/dist/chunk-4JQ7UOXH.js.map +1 -0
  47. package/dist/chunk-6IUKES2L.js +290 -0
  48. package/dist/chunk-6IUKES2L.js.map +1 -0
  49. package/dist/chunk-COWPK7XN.mjs +834 -0
  50. package/dist/chunk-COWPK7XN.mjs.map +1 -0
  51. package/dist/chunk-CTEXPMVZ.js +512 -0
  52. package/dist/chunk-CTEXPMVZ.js.map +1 -0
  53. package/dist/chunk-DXQTHA75.js +573 -0
  54. package/dist/chunk-DXQTHA75.js.map +1 -0
  55. package/dist/chunk-DZFQ6I23.js +72 -0
  56. package/dist/chunk-DZFQ6I23.js.map +1 -0
  57. package/dist/chunk-J323UTPE.mjs +650 -0
  58. package/dist/chunk-J323UTPE.mjs.map +1 -0
  59. package/dist/chunk-LHNNALVF.js +834 -0
  60. package/dist/chunk-LHNNALVF.js.map +1 -0
  61. package/dist/chunk-O7SZSMXV.js +1621 -0
  62. package/dist/chunk-O7SZSMXV.js.map +1 -0
  63. package/dist/chunk-OTNOFOVW.js +650 -0
  64. package/dist/chunk-OTNOFOVW.js.map +1 -0
  65. package/dist/chunk-PRIGZEI4.mjs +72 -0
  66. package/dist/chunk-PRIGZEI4.mjs.map +1 -0
  67. package/dist/chunk-SBSZ3IPB.mjs +573 -0
  68. package/dist/chunk-SBSZ3IPB.mjs.map +1 -0
  69. package/dist/chunk-SXPA6SSD.mjs +1621 -0
  70. package/dist/chunk-SXPA6SSD.mjs.map +1 -0
  71. package/dist/chunk-T5A4KAVS.mjs +512 -0
  72. package/dist/chunk-T5A4KAVS.mjs.map +1 -0
  73. package/dist/chunk-TDRKKUNT.mjs +357 -0
  74. package/dist/chunk-TDRKKUNT.mjs.map +1 -0
  75. package/dist/chunk-TJFNODPE.js +357 -0
  76. package/dist/chunk-TJFNODPE.js.map +1 -0
  77. package/dist/chunk-V2SSI3SL.mjs +427 -0
  78. package/dist/chunk-V2SSI3SL.mjs.map +1 -0
  79. package/dist/chunk-X42L6MTY.mjs +290 -0
  80. package/dist/chunk-X42L6MTY.mjs.map +1 -0
  81. package/dist/chunk-YSVMY77H.js +611 -0
  82. package/dist/chunk-YSVMY77H.js.map +1 -0
  83. package/dist/core-ANYRS6EF.mjs +73 -0
  84. package/dist/core-ANYRS6EF.mjs.map +1 -0
  85. package/dist/core-K5K34DCS.js +73 -0
  86. package/dist/core-K5K34DCS.js.map +1 -0
  87. package/dist/core-index.d.mts +1668 -0
  88. package/dist/core-index.d.ts +1668 -0
  89. package/dist/core-index.js +101 -0
  90. package/dist/core-index.js.map +1 -0
  91. package/dist/core-index.mjs +101 -0
  92. package/dist/core-index.mjs.map +1 -0
  93. package/dist/index.d.mts +2911 -0
  94. package/dist/index.d.ts +2911 -0
  95. package/dist/index.js +1177 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/index.mjs +1177 -0
  98. package/dist/index.mjs.map +1 -0
  99. package/dist/tools-352X7A6X.mjs +366 -0
  100. package/dist/tools-352X7A6X.mjs.map +1 -0
  101. package/dist/tools-YLEX6GNO.js +366 -0
  102. package/dist/tools-YLEX6GNO.js.map +1 -0
  103. package/dist/ui-index.d.mts +627 -0
  104. package/dist/ui-index.d.ts +627 -0
  105. package/dist/ui-index.js +2354 -0
  106. package/dist/ui-index.js.map +1 -0
  107. package/dist/ui-index.mjs +2353 -0
  108. package/dist/ui-index.mjs.map +1 -0
  109. package/package.json +105 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/ai-tools.ts"],"sourcesContent":["/**\n * AI Tool Calling Complete Integration\n * \n * Complete tool calling functionality:\n * - Basic tool calling and execution\n * - Multi-step calling system (stopWhen, stepCountIs) \n * - Dynamic tools (dynamicTool)\n * - Tool selection strategies (toolChoice)\n * - Error handling and tool repair\n * - MCP tool integration\n * - Complete type safety system\n */\n\nimport type { z } from 'zod';\n\nimport { EventEmitter } from 'events';\nimport {\n tool,\n type Tool,\n dynamicTool,\n stepCountIs,\n type ToolSet,\n NoSuchToolError,\n type CoreMessage,\n type FinishReason,\n type LanguageModel,\n type TypedToolCall,\n type TypedToolResult,\n type StreamTextResult,\n InvalidToolInputError,\n type LanguageModelUsage,\n type LanguageModelResponseMetadata\n} from 'ai';\n\n// Type Definitions\n\n/**\n * Complete tool choice strategy definition\n */\nexport type ToolChoice<TOOLS extends ToolSet = {}> = \n | 'auto' // Model automatically chooses whether to call tools\n | 'required' // Model must call tools\n | 'none' // 模型不得调用工具\n | { type: 'tool'; toolName: Extract<keyof TOOLS, string> }; // 必须调用指定工具\n\n/**\n * 停止条件类型 - 支持各种停止策略\n */\nexport type StopCondition<_TOOLS extends ToolSet = {}> = \n | ((options: { stepNumber: number; steps: Array<any>; }) => boolean)\n | { type: 'stepCount'; value: number }\n | { type: 'custom'; condition: (context: any) => boolean };\n\n/**\n * 工具执行选项 - 完整参数\n */\nexport interface ToolExecutionOptions {\n toolCallId: string;\n messages: CoreMessage[];\n abortSignal?: AbortSignal;\n experimental_context?: unknown;\n}\n\n/**\n * 工具定义接口 - 支持所有官方功能\n */\nexport interface AdvancedTool<TParameters = any, TResult = any> {\n description?: string;\n inputSchema: z.ZodSchema<TParameters>;\n execute?: (\n parameters: TParameters, \n options: ToolExecutionOptions\n ) => Promise<TResult> | TResult | AsyncIterable<TResult>;\n \n // 多模态工具结果支持\n toModelOutput?: (result: TResult) => {\n type: 'content';\n value: Array<{\n type: 'text' | 'image';\n text?: string;\n data?: string;\n mediaType?: string;\n }>;\n };\n}\n\n/**\n * 动态工具接口 - 完全匹配 AI SDK 的 dynamicTool 返回类型\n */\nexport type DynamicTool = ReturnType<typeof dynamicTool>;\n\n/**\n * 步骤结果类型 - 完整步骤信息\n */\nexport interface StepResult<TOOLS extends ToolSet = {}> {\n stepType: 'initial' | 'continue' | 'tool-result';\n stepNumber: number;\n text: string;\n reasoning?: string;\n toolCalls: Array<TypedToolCall<TOOLS>>;\n toolResults: Array<TypedToolResult<TOOLS>>;\n finishReason: FinishReason;\n usage: LanguageModelUsage;\n warnings?: Array<any>;\n response?: LanguageModelResponseMetadata;\n isContinued: boolean;\n providerMetadata?: Record<string, Record<string, any>>;\n}\n\n/**\n * 工具调用选项 - 完整参数集合\n */\nexport interface ToolCallOptions<TOOLS extends ToolSet = {}> {\n // 基础参数\n model: LanguageModel;\n system?: string;\n prompt?: string;\n messages?: CoreMessage[];\n \n // 工具相关\n tools: TOOLS;\n toolChoice?: ToolChoice<TOOLS>;\n activeTools?: Array<keyof TOOLS>;\n \n // 多步调用\n stopWhen?: StopCondition<TOOLS> | Array<StopCondition<TOOLS>>;\n maxSteps?: number;\n \n // 生成控制\n maxOutputTokens?: number;\n temperature?: number;\n topP?: number;\n topK?: number;\n presencePenalty?: number;\n frequencyPenalty?: number;\n seed?: number;\n \n // 控制选项\n maxRetries?: number;\n abortSignal?: AbortSignal;\n headers?: Record<string, string>;\n \n // 实验性功能\n experimental_context?: unknown;\n experimental_telemetry?: {\n isEnabled?: boolean;\n recordInputs?: boolean;\n recordOutputs?: boolean;\n functionId?: string;\n metadata?: Record<string, any>;\n };\n experimental_repairToolCall?: (options: {\n toolCall: any;\n tools: TOOLS;\n error: NoSuchToolError | InvalidToolInputError;\n messages: CoreMessage[];\n system?: string;\n inputSchema: (options: { toolName: string }) => any;\n }) => Promise<any | null>;\n \n // 回调函数\n onStepFinish?: (result: StepResult<TOOLS>) => Promise<void> | void;\n prepareStep?: (options: {\n stepNumber: number;\n steps: Array<StepResult<TOOLS>>;\n model: LanguageModel;\n messages: CoreMessage[];\n }) => Promise<{\n model?: LanguageModel;\n toolChoice?: ToolChoice<TOOLS>;\n activeTools?: Array<keyof TOOLS>;\n system?: string;\n messages?: CoreMessage[];\n } | void> | {\n model?: LanguageModel;\n toolChoice?: ToolChoice<TOOLS>;\n activeTools?: Array<keyof TOOLS>;\n system?: string;\n messages?: CoreMessage[];\n } | void;\n}\n\n/**\n * MCP客户端配置\n */\nexport interface MCPClientConfig {\n transport: \n | { type: 'sse'; url: string; headers?: Record<string, string> }\n | { type: 'stdio'; command: string; args?: string[] }\n | { type: 'custom'; transport: any }; // MCPTransport\n \n schemas?: Record<string, {\n inputSchema: z.ZodSchema<any>;\n }>;\n}\n\n/**\n * MCP客户端接口\n */\nexport interface MCPClient {\n tools(config?: { schemas?: Record<string, { inputSchema: z.ZodSchema<any> }> }): Promise<ToolSet>;\n close(): Promise<void>;\n}\n\n// Core Tools Integration Class\n\n/**\n * Complete tools integration class\n */\nexport class AIToolsIntegration extends EventEmitter {\n private initialized: boolean = false;\n private requestCounter: number = 0;\n private registeredTools: Map<string, AdvancedTool> = new Map();\n private dynamicTools: Map<string, DynamicTool> = new Map();\n private mcpClients: Map<string, MCPClient> = new Map();\n\n constructor() {\n super();\n }\n\n /**\n * 初始化\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n try {\n this.emit('ai_tools:initializing');\n this.initialized = true;\n this.emit('ai_tools:initialized');\n } catch (error) {\n this.emit('ai_tools:initialization_failed', { error });\n throw error;\n }\n }\n\n /**\n * 生成请求ID\n */\n private generateRequestId(): string {\n return `ai-tools-${Date.now()}-${++this.requestCounter}`;\n }\n\n // Tool Management\n\n /**\n * Create tool - following official specifications\n */\n createTool(\n description: string,\n inputSchema: z.ZodSchema<any>,\n execute?: (parameters: any, options?: any) => Promise<any> | any\n ): any {\n if (execute) {\n return tool({\n description,\n inputSchema,\n execute: async (params: any) => execute(params, {\n // 传递标准的AI SDK执行选项\n toolCallId: 'tool-call-' + Date.now(),\n messages: [],\n abortSignal: undefined,\n experimental_context: undefined\n })\n });\n } else {\n return tool({\n description,\n inputSchema\n });\n }\n }\n\n /**\n * 创建动态工具 - 完全基于 AI SDK 的 dynamicTool\n */\n createDynamicTool(\n description: string,\n inputSchema: z.ZodSchema<any>,\n execute?: (input: unknown, options: ToolExecutionOptions) => Promise<unknown>\n ): DynamicTool {\n // 完全基于 AI SDK 的 dynamicTool,返回类型完全匹配\n return dynamicTool({\n description,\n inputSchema,\n execute: execute ? async (input: unknown, options: any) => {\n const toolOptions: ToolExecutionOptions = {\n toolCallId: options.toolCallId || 'unknown',\n messages: options.messages || [],\n abortSignal: options.abortSignal,\n experimental_context: options.experimental_context\n };\n return execute(input, toolOptions);\n } : async (input: unknown, options: any) => \n // 默认实现:返回输入参数\n input\n \n });\n }\n\n /**\n * 注册工具到集成器\n */\n registerTool<TParameters, TResult>(\n name: string,\n toolInstance: AdvancedTool<TParameters, TResult>\n ): void {\n this.registeredTools.set(name, toolInstance);\n this.emit('ai_tools:tool_registered', { name, tool: toolInstance });\n }\n\n /**\n * 获取已注册的工具\n */\n getRegisteredTools(): Record<string, AdvancedTool> {\n const tools: Record<string, AdvancedTool> = {};\n this.registeredTools.forEach((registeredTool, name) => {\n tools[name] = registeredTool;\n });\n return tools;\n }\n\n /**\n * 注册动态工具\n */\n registerDynamicTool(name: string, dynamicToolInstance: DynamicTool): void {\n this.dynamicTools.set(name, dynamicToolInstance);\n this.emit('ai_tools:dynamic_tool_registered', { name, tool: dynamicToolInstance });\n }\n\n // ================================\n // 🔄 多步调用系统 - 按照官方文档规范实现\n // ================================\n\n /**\n * 使用工具执行文本生成 - 遵循官方 generateText + tools 模式\n * 这是 AI SDK 工具调用的标准方式\n */\n async generateTextWithTools<TOOLS extends ToolSet = {}>(\n options: ToolCallOptions<TOOLS>\n ): Promise<{\n text: string;\n steps: Array<StepResult<TOOLS>>;\n toolCalls: Array<TypedToolCall<TOOLS>>;\n toolResults: Array<TypedToolResult<TOOLS>>;\n finishReason: FinishReason;\n usage: LanguageModelUsage;\n totalUsage: LanguageModelUsage;\n content: Array<any>;\n reasoning?: Array<any>;\n reasoningText?: string;\n sources?: Array<any>;\n files?: Array<any>;\n warnings?: Array<any>;\n response?: any;\n providerMetadata?: any;\n }> {\n const { generateText } = await import('ai');\n \n const requestId = this.generateRequestId();\n const startTime = Date.now();\n \n try {\n this.emit('ai_tools:multi_step_started', {\n requestId,\n model: typeof options.model === 'string' ? options.model : 'unknown',\n hasTools: !!options.tools,\n stopWhen: !!options.stopWhen,\n maxSteps: options.maxSteps || 5\n });\n\n // 构建参数\n const generateOptions: any = {\n model: options.model,\n system: options.system,\n prompt: options.prompt,\n messages: options.messages,\n tools: options.tools,\n toolChoice: options.toolChoice,\n activeTools: options.activeTools,\n maxOutputTokens: options.maxOutputTokens,\n temperature: options.temperature,\n topP: options.topP,\n topK: options.topK,\n presencePenalty: options.presencePenalty,\n frequencyPenalty: options.frequencyPenalty,\n seed: options.seed,\n maxRetries: options.maxRetries,\n abortSignal: options.abortSignal,\n headers: options.headers,\n experimental_context: options.experimental_context,\n experimental_telemetry: options.experimental_telemetry,\n experimental_repairToolCall: options.experimental_repairToolCall,\n onStepFinish: options.onStepFinish,\n prepareStep: options.prepareStep\n };\n\n // 处理停止条件\n if (options.stopWhen) {\n generateOptions.stopWhen = Array.isArray(options.stopWhen) \n ? options.stopWhen.map(cond => this.parseStopCondition(cond))\n : this.parseStopCondition(options.stopWhen);\n } else if (options.maxSteps) {\n generateOptions.stopWhen = stepCountIs(options.maxSteps);\n }\n\n const result = await generateText(generateOptions);\n\n this.emit('ai_tools:multi_step_completed', {\n requestId,\n latency: Date.now() - startTime,\n steps: result.steps?.length || 1,\n toolCalls: result.toolCalls?.length || 0,\n toolResults: result.toolResults?.length || 0,\n finishReason: result.finishReason,\n usage: result.usage\n });\n\n // 返回完整的 generateText 结果,符合官方规范\n return {\n text: result.text,\n steps: (result.steps || []) as unknown as Array<StepResult<TOOLS>>,\n toolCalls: result.toolCalls || [],\n toolResults: result.toolResults || [],\n finishReason: result.finishReason,\n usage: result.usage,\n totalUsage: result.totalUsage || result.usage,\n content: (result as any).content || [],\n reasoning: (result as any).reasoning || [],\n reasoningText: (result as any).reasoningText,\n sources: (result as any).sources || [],\n files: (result as any).files || [],\n warnings: result.warnings,\n response: (result as any).response,\n providerMetadata: (result as any).providerMetadata\n };\n\n } catch (error: any) {\n this.emit('ai_tools:generate_text_with_tools_failed', {\n requestId,\n error: error.message,\n latency: Date.now() - startTime,\n errorType: error.constructor.name\n });\n\n throw error;\n }\n }\n\n /**\n * 使用工具执行流式文本生成 - 遵循官方 streamText + tools 模式\n */\n async streamTextWithTools<TOOLS extends ToolSet = {}>(\n options: ToolCallOptions<TOOLS>\n ): Promise<StreamTextResult<TOOLS, any>> {\n const { streamText } = await import('ai');\n \n const requestId = this.generateRequestId();\n \n this.emit('ai_tools:multi_step_stream_started', {\n requestId,\n model: typeof options.model === 'string' ? options.model : 'unknown',\n hasTools: !!options.tools,\n stopWhen: !!options.stopWhen\n });\n\n // 包装回调\n const wrappedOptions = {\n ...options,\n onStepFinish: (result: any) => {\n this.emit('ai_tools:step_finished', {\n requestId,\n stepType: result.stepType,\n stepNumber: result.stepNumber || 0,\n toolCalls: result.toolCalls?.length || 0,\n toolResults: result.toolResults?.length || 0,\n finishReason: result.finishReason\n });\n if (options.onStepFinish) {\n options.onStepFinish(result);\n }\n }\n };\n\n // 构建参数并处理停止条件\n const streamOptions: any = { ...wrappedOptions };\n if (options.stopWhen) {\n streamOptions.stopWhen = Array.isArray(options.stopWhen) \n ? options.stopWhen.map(cond => this.parseStopCondition(cond))\n : this.parseStopCondition(options.stopWhen);\n }\n\n const streamResult = streamText(streamOptions);\n \n // 增强流式结果,添加工具调用相关的便利方法\n const enhancedStreamResult = {\n ...streamResult,\n \n // 工具调用分析方法\n analyzeToolUsage: async () => {\n const steps = await streamResult.steps;\n return this.analyzeToolUsage(steps as unknown as Array<StepResult<TOOLS>>);\n },\n \n // 提取所有工具调用\n getAllToolCalls: async () => {\n const steps = await streamResult.steps;\n return this.extractToolCallsFromSteps(steps as unknown as Array<StepResult<TOOLS>>);\n },\n \n // 提取所有工具结果\n getAllToolResults: async () => {\n const steps = await streamResult.steps;\n return this.extractToolResultsFromSteps(steps as unknown as Array<StepResult<TOOLS>>);\n },\n \n // 获取响应消息 - 官方文档重点功能\n getResponseMessages: async () => {\n const response = await streamResult.response;\n return this.extractResponseMessages({ response });\n }\n } as any;\n \n return enhancedStreamResult;\n }\n\n /**\n * 创建步骤计数停止条件\n */\n createStepCountCondition(maxSteps: number): StopCondition<any> {\n return { type: 'stepCount', value: maxSteps };\n }\n\n /**\n * 创建自定义停止条件 \n */\n createCustomStopCondition<TOOLS extends ToolSet = {}>(\n condition: (options: { stepNumber: number; steps: Array<StepResult<TOOLS>>; }) => boolean\n ): StopCondition<TOOLS> {\n return condition;\n }\n\n /**\n * 解析停止条件\n */\n private parseStopCondition<TOOLS extends ToolSet = {}>(\n condition: StopCondition<TOOLS>\n ): any {\n if (typeof condition === 'function') {\n return condition;\n }\n \n if (condition.type === 'stepCount') {\n return stepCountIs(condition.value);\n }\n \n if (condition.type === 'custom') {\n return condition.condition;\n }\n \n return stepCountIs(5); // 默认最多5步\n }\n\n // ================================\n // Tool repair system\n // ================================\n\n /**\n * 创建结构化输出修复器\n */\n createStructuredRepairFunction<TOOLS extends ToolSet = {}>(\n repairModel: LanguageModel\n ) {\n return async (options: {\n toolCall: any;\n tools: TOOLS;\n error: NoSuchToolError | InvalidToolInputError;\n inputSchema: (options: { toolName: string }) => any;\n }) => {\n if (NoSuchToolError.isInstance(options.error)) {\n return null; // 不修复无效工具名称\n }\n\n try {\n // 使用结构化输出来修复工具参数\n const { generateObject } = await import('ai');\n \n const toolDef = (options.tools as any)[options.toolCall.toolName];\n if (!toolDef) return null;\n\n const { object: repairedArgs } = await generateObject({\n model: repairModel,\n schema: toolDef.parameters || toolDef.schema,\n prompt: [\n `The model tried to call the tool \"${options.toolCall.toolName}\" with the following inputs:`,\n JSON.stringify(options.toolCall.input),\n `The tool accepts the following schema:`,\n JSON.stringify(options.inputSchema(options.toolCall)),\n 'Please fix the inputs to match the schema.'\n ].join('\\n'),\n });\n\n return { \n ...options.toolCall, \n input: JSON.stringify(repairedArgs) \n };\n } catch (repairError) {\n this.emit('ai_tools:repair_failed', { \n originalError: options.error, \n repairError,\n toolCall: options.toolCall \n });\n return null;\n }\n };\n }\n\n /**\n * 创建重新询问修复器\n */\n createReaskRepairFunction<TOOLS extends ToolSet = {}>(\n repairModel: LanguageModel\n ) {\n return async (options: {\n toolCall: any;\n tools: TOOLS;\n error: NoSuchToolError | InvalidToolInputError;\n messages: CoreMessage[];\n system?: string;\n }) => {\n try {\n const { generateText } = await import('ai');\n \n const result = await generateText({\n model: repairModel,\n system: options.system,\n messages: [\n ...options.messages,\n {\n role: 'assistant',\n content: [{\n type: 'tool-call',\n toolCallId: options.toolCall.toolCallId,\n toolName: options.toolCall.toolName,\n input: options.toolCall.input,\n }],\n },\n {\n role: 'tool',\n content: [{\n type: 'tool-result',\n toolCallId: options.toolCall.toolCallId,\n toolName: options.toolCall.toolName,\n output: options.error.message,\n }],\n },\n ] as CoreMessage[],\n tools: options.tools,\n });\n\n const newToolCall = result.toolCalls.find(\n (newCall: any) => newCall.toolName === options.toolCall.toolName,\n );\n\n return newToolCall ? {\n toolCallType: 'function' as const,\n toolCallId: options.toolCall.toolCallId,\n toolName: options.toolCall.toolName,\n input: JSON.stringify(newToolCall.input),\n } : null;\n } catch (repairError) {\n this.emit('ai_tools:reask_repair_failed', { \n originalError: options.error, \n repairError,\n toolCall: options.toolCall \n });\n return null;\n }\n };\n }\n\n // ================================\n // 🔗 MCP集成系统\n // ================================\n\n /**\n * 创建MCP客户端\n */\n async createMCPClient(config: MCPClientConfig): Promise<MCPClient> {\n const { experimental_createMCPClient } = await import('ai');\n \n let transportConfig: any;\n \n switch (config.transport.type) {\n case 'sse':\n transportConfig = {\n transport: {\n type: 'sse',\n url: config.transport.url,\n headers: config.transport.headers,\n }\n };\n break;\n \n case 'stdio':\n // Conditionally import stdio transport only in Node.js environment\n if (typeof window === 'undefined' && typeof process !== 'undefined') {\n try {\n const { Experimental_StdioMCPTransport } = await import('ai/mcp-stdio');\n transportConfig = {\n transport: new Experimental_StdioMCPTransport({\n command: config.transport.command,\n args: config.transport.args,\n })\n };\n } catch (error) {\n throw new Error('stdio transport requires Node.js environment and ai/mcp-stdio package');\n }\n } else {\n throw new Error('stdio transport is only available in Node.js environment');\n }\n break;\n \n case 'custom':\n transportConfig = {\n transport: config.transport.transport\n };\n break;\n \n default:\n throw new Error(`Unsupported MCP transport type: ${(config.transport as any).type}`);\n }\n\n const mcpClient = await experimental_createMCPClient(transportConfig);\n \n const clientId = `mcp-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n \n const wrappedClient: MCPClient = {\n async tools(toolConfig?: { schemas?: Record<string, { inputSchema: z.ZodSchema<any> }> }) {\n if (config.schemas || toolConfig?.schemas) {\n return (mcpClient as any).tools({ schemas: config.schemas || toolConfig?.schemas });\n } else {\n return (mcpClient as any).tools();\n }\n },\n \n async close() {\n await (mcpClient as any).close();\n (this as any).mcpClients.delete(clientId);\n (this as any).emit('ai_tools:mcp_client_closed', { clientId });\n }\n };\n \n this.mcpClients.set(clientId, wrappedClient);\n this.emit('ai_tools:mcp_client_created', { clientId, config });\n \n return wrappedClient;\n }\n\n /**\n * 关闭所有MCP客户端\n */\n async closeAllMCPClients(): Promise<void> {\n const closePromises = Array.from(this.mcpClients.values()).map(client => client.close());\n await Promise.all(closePromises);\n this.mcpClients.clear();\n }\n\n // Utility methods\n\n /**\n * Create simple tool call configuration\n */\n createSimpleToolCall<TOOLS extends ToolSet = {}>(\n model: LanguageModel,\n tools: TOOLS,\n prompt: string,\n options?: Partial<ToolCallOptions<TOOLS>>\n ): ToolCallOptions<TOOLS> {\n return {\n model,\n tools,\n prompt,\n ...options\n };\n }\n\n /**\n * 创建多步工具调用配置 - 使用 stopWhen 参数\n */\n createMultiStepToolCall<TOOLS extends ToolSet = {}>(\n model: LanguageModel,\n tools: TOOLS,\n prompt: string,\n maxSteps: number = 5,\n options?: Partial<ToolCallOptions<TOOLS>>\n ): ToolCallOptions<TOOLS> {\n return {\n model,\n tools,\n prompt,\n stopWhen: this.createStepCountCondition(maxSteps),\n ...options\n };\n }\n\n /**\n * 直接执行单个工具 - 用于测试或直接调用\n */\n async executeSingleTool<TOOLS extends ToolSet = {}>(\n toolName: keyof TOOLS,\n input: any,\n tools: TOOLS,\n options?: {\n messages?: CoreMessage[];\n abortSignal?: AbortSignal;\n experimental_context?: unknown;\n }\n ): Promise<any> {\n const selectedTool = tools[toolName] as any;\n if (!selectedTool || !selectedTool.execute) {\n throw new Error(`Tool '${String(toolName)}' not found or not executable`);\n }\n\n const toolOptions: ToolExecutionOptions = {\n toolCallId: `direct-${Date.now()}`,\n messages: options?.messages || [],\n abortSignal: options?.abortSignal,\n experimental_context: options?.experimental_context\n };\n\n return selectedTool.execute(input, toolOptions);\n }\n\n /**\n * 获取响应消息 - 官方文档重点推荐的功能\n * 用于将助手和工具消息添加到对话历史\n */\n extractResponseMessages(result: {\n response?: { messages: Array<any> };\n }): Array<any> {\n return result.response?.messages || [];\n }\n\n /**\n * 将响应消息添加到对话历史 - 官方文档示例\n */\n addResponseMessagesToHistory(\n messages: Array<any>,\n result: {\n response?: { messages: Array<any> };\n }\n ): Array<any> {\n const responseMessages = this.extractResponseMessages(result);\n return [...messages, ...responseMessages];\n }\n\n /**\n * 批量工具调用验证\n */\n validateBatchToolCalls<TOOLS extends ToolSet = {}>(\n toolCalls: Array<TypedToolCall<TOOLS>>,\n tools: TOOLS\n ): Array<{ toolCall: TypedToolCall<TOOLS>; valid: boolean; error?: string }> {\n return toolCalls.map(toolCall => ({\n toolCall,\n ...this.validateToolCall(toolCall, tools)\n }));\n }\n\n /**\n * 工具调用结果验证\n */\n validateToolCall<TOOLS extends ToolSet = {}>(\n toolCall: TypedToolCall<TOOLS>,\n tools: TOOLS\n ): { valid: boolean; error?: string } {\n const toolName = toolCall.toolName;\n const targetTool = tools[toolName];\n \n if (!targetTool) {\n return { valid: false, error: `Tool '${String(toolName)}' not found` };\n }\n\n try {\n // 验证输入参数\n if ((targetTool as any).inputSchema || (targetTool as any).parameters) {\n const schema = (targetTool as any).inputSchema || (targetTool as any).parameters;\n schema.parse(toolCall.input);\n }\n \n return { valid: true };\n } catch (validationError: any) {\n return { \n valid: false, \n error: `Invalid tool input: ${validationError.message}` \n };\n }\n }\n\n /**\n * 工具调用统计分析\n */\n analyzeToolUsage<TOOLS extends ToolSet = {}>(\n steps: Array<StepResult<TOOLS>>\n ): {\n totalToolCalls: number;\n totalToolResults: number;\n toolUsageByName: Record<string, number>;\n avgToolCallsPerStep: number;\n stepTypes: Record<string, number>;\n } {\n const allToolCalls = this.extractToolCallsFromSteps(steps);\n const allToolResults = this.extractToolResultsFromSteps(steps);\n \n const toolUsageByName: Record<string, number> = {};\n allToolCalls.forEach(call => {\n const toolName = String(call.toolName);\n toolUsageByName[toolName] = (toolUsageByName[toolName] || 0) + 1;\n });\n\n const stepTypes: Record<string, number> = {};\n steps.forEach(step => {\n stepTypes[step.stepType] = (stepTypes[step.stepType] || 0) + 1;\n });\n\n return {\n totalToolCalls: allToolCalls.length,\n totalToolResults: allToolResults.length,\n toolUsageByName,\n avgToolCallsPerStep: steps.length > 0 ? allToolCalls.length / steps.length : 0,\n stepTypes\n };\n }\n\n /**\n * 提取步骤中的所有工具调用\n */\n extractToolCallsFromSteps<TOOLS extends ToolSet = {}>(\n steps: Array<StepResult<TOOLS>>\n ): Array<TypedToolCall<TOOLS>> {\n return steps.flatMap(step => step.toolCalls);\n }\n\n /**\n * 提取步骤中的所有工具结果\n */\n extractToolResultsFromSteps<TOOLS extends ToolSet = {}>(\n steps: Array<StepResult<TOOLS>>\n ): Array<TypedToolResult<TOOLS>> {\n return steps.flatMap(step => step.toolResults);\n }\n\n /**\n * 检查初始化状态\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * 获取统计信息\n */\n getStats(): {\n requestCount: number;\n isInitialized: boolean;\n registeredTools: number;\n dynamicTools: number;\n mcpClients: number;\n } {\n return {\n requestCount: this.requestCounter,\n isInitialized: this.initialized,\n registeredTools: this.registeredTools.size,\n dynamicTools: this.dynamicTools.size,\n mcpClients: this.mcpClients.size,\n };\n }\n\n /**\n * 重置统计信息\n */\n resetStats(): void {\n this.requestCounter = 0;\n }\n\n /**\n * 销毁实例\n */\n async destroy(): Promise<void> {\n await this.closeAllMCPClients();\n this.registeredTools.clear();\n this.dynamicTools.clear();\n this.removeAllListeners();\n this.initialized = false;\n this.requestCounter = 0;\n }\n}\n\n// Exports\n\nexport {\n // Core functions\n tool,\n // Core types\n type Tool,\n dynamicTool,\n stepCountIs,\n type ToolSet,\n NoSuchToolError,\n type CoreMessage,\n type FinishReason,\n \n type TypedToolCall,\n type LanguageModel,\n type TypedToolResult,\n InvalidToolInputError,\n type LanguageModelUsage\n};\n\n// Default export\nexport default AIToolsIntegration;"],"mappings":"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","names":[]}
@@ -0,0 +1,427 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/core/ai-structured.ts
2
+ var _events = require('events');
3
+
4
+
5
+
6
+ var _ai = require('ai');
7
+ var AIStructuredDataIntegration = class extends _events.EventEmitter {
8
+ constructor() {
9
+ super();
10
+ this.initialized = false;
11
+ this.requestCounter = 0;
12
+ }
13
+ /**
14
+ * 初始化
15
+ */
16
+ async initialize() {
17
+ if (this.initialized) {
18
+ return;
19
+ }
20
+ try {
21
+ this.emit("ai_structured:initializing");
22
+ this.initialized = true;
23
+ this.emit("ai_structured:initialized");
24
+ } catch (error) {
25
+ this.emit("ai_structured:initialization_failed", { error });
26
+ throw error;
27
+ }
28
+ }
29
+ /**
30
+ * 生成请求ID
31
+ */
32
+ generateRequestId() {
33
+ return `ai-structured-${Date.now()}-${++this.requestCounter}`;
34
+ }
35
+ // ================================
36
+ // generateObject methods
37
+ /**
38
+ * Generate structured object - supports all output strategies
39
+ */
40
+ async generateObject(options) {
41
+ if (!this.initialized) {
42
+ throw new Error("AIStructuredDataIntegration not initialized. Call initialize() first.");
43
+ }
44
+ const requestId = this.generateRequestId();
45
+ const startTime = Date.now();
46
+ try {
47
+ this.emit("ai_structured:generate_object_started", {
48
+ requestId,
49
+ model: typeof options.model === "string" ? options.model : "unknown",
50
+ output: options.output || "object",
51
+ hasSchema: !!options.schema,
52
+ hasEnum: !!options.enum,
53
+ mode: options.mode || "auto"
54
+ });
55
+ const generateOptions = {
56
+ model: options.model,
57
+ system: options.system,
58
+ prompt: options.prompt,
59
+ messages: options.messages,
60
+ maxOutputTokens: options.maxOutputTokens,
61
+ temperature: options.temperature,
62
+ topP: options.topP,
63
+ topK: options.topK,
64
+ presencePenalty: options.presencePenalty,
65
+ frequencyPenalty: options.frequencyPenalty,
66
+ seed: options.seed,
67
+ maxRetries: options.maxRetries,
68
+ abortSignal: options.abortSignal,
69
+ headers: options.headers,
70
+ experimental_repairText: options.experimental_repairText,
71
+ experimental_download: options.experimental_download,
72
+ experimental_telemetry: options.experimental_telemetry,
73
+ providerOptions: options.providerOptions
74
+ };
75
+ if (options.output) {
76
+ generateOptions.output = options.output;
77
+ }
78
+ if (options.mode) {
79
+ generateOptions.mode = options.mode;
80
+ }
81
+ if (options.schema) {
82
+ generateOptions.schema = options.schema;
83
+ }
84
+ if (options.schemaName) {
85
+ generateOptions.schemaName = options.schemaName;
86
+ }
87
+ if (options.schemaDescription) {
88
+ generateOptions.schemaDescription = options.schemaDescription;
89
+ }
90
+ if (options.output === "enum" && options.enum) {
91
+ generateOptions.enum = options.enum;
92
+ }
93
+ const result = await _ai.generateObject.call(void 0, generateOptions);
94
+ this.emit("ai_structured:generate_object_completed", {
95
+ requestId,
96
+ latency: Date.now() - startTime,
97
+ finishReason: result.finishReason,
98
+ usage: result.usage,
99
+ output: options.output || "object",
100
+ hasObject: !!result.object,
101
+ hasReasoning: !!result.reasoning,
102
+ warnings: _optionalChain([result, 'access', _ => _.warnings, 'optionalAccess', _2 => _2.length]) || 0
103
+ });
104
+ const enhancedResult = {
105
+ ...result,
106
+ // 确保 toJsonResponse 方法存在
107
+ toJsonResponse: (init) => _optionalChain([result, 'access', _3 => _3.toJsonResponse, 'optionalCall', _4 => _4(init)]) || new Response(JSON.stringify(result.object), {
108
+ status: 200,
109
+ headers: { "Content-Type": "application/json; charset=utf-8" },
110
+ ...init
111
+ })
112
+ };
113
+ return enhancedResult;
114
+ } catch (error) {
115
+ this.emit("ai_structured:generate_object_failed", {
116
+ requestId,
117
+ error: error.message,
118
+ latency: Date.now() - startTime,
119
+ errorType: error.constructor.name,
120
+ output: options.output || "object"
121
+ });
122
+ throw error;
123
+ }
124
+ }
125
+ // ================================
126
+ // streamObject methods
127
+ /**
128
+ * Stream structured object generation - supports all output strategies and stream modes
129
+ */
130
+ streamObject(options) {
131
+ if (!this.initialized) {
132
+ throw new Error("AIStructuredDataIntegration not initialized. Call initialize() first.");
133
+ }
134
+ const requestId = this.generateRequestId();
135
+ const startTime = Date.now();
136
+ this.emit("ai_structured:stream_object_started", {
137
+ requestId,
138
+ model: typeof options.model === "string" ? options.model : "unknown",
139
+ output: options.output || "object",
140
+ hasSchema: !!options.schema,
141
+ hasEnum: !!options.enum,
142
+ mode: options.mode || "auto"
143
+ });
144
+ const wrappedOptions = {
145
+ ...options,
146
+ onError: (event) => {
147
+ this.emit("ai_structured:stream_object_error", {
148
+ requestId,
149
+ error: event.error,
150
+ latency: Date.now() - startTime
151
+ });
152
+ if (options.onError) {
153
+ options.onError(event);
154
+ }
155
+ },
156
+ onFinish: (result) => {
157
+ this.emit("ai_structured:stream_object_finished", {
158
+ requestId,
159
+ latency: Date.now() - startTime,
160
+ usage: result.usage,
161
+ hasObject: !!result.object,
162
+ hasError: !!result.error,
163
+ warnings: _optionalChain([result, 'access', _5 => _5.warnings, 'optionalAccess', _6 => _6.length]) || 0,
164
+ output: options.output || "object"
165
+ });
166
+ if (options.onFinish) {
167
+ options.onFinish(result);
168
+ }
169
+ }
170
+ };
171
+ const streamOptions = {
172
+ model: options.model,
173
+ system: options.system,
174
+ prompt: options.prompt,
175
+ messages: options.messages,
176
+ maxOutputTokens: options.maxOutputTokens,
177
+ temperature: options.temperature,
178
+ topP: options.topP,
179
+ topK: options.topK,
180
+ presencePenalty: options.presencePenalty,
181
+ frequencyPenalty: options.frequencyPenalty,
182
+ seed: options.seed,
183
+ maxRetries: options.maxRetries,
184
+ abortSignal: options.abortSignal,
185
+ headers: options.headers,
186
+ experimental_repairText: options.experimental_repairText,
187
+ experimental_download: options.experimental_download,
188
+ experimental_telemetry: options.experimental_telemetry,
189
+ providerOptions: options.providerOptions,
190
+ onError: wrappedOptions.onError,
191
+ onFinish: wrappedOptions.onFinish
192
+ };
193
+ if (options.output) {
194
+ streamOptions.output = options.output;
195
+ }
196
+ if (options.mode) {
197
+ streamOptions.mode = options.mode;
198
+ }
199
+ if (options.schema) {
200
+ streamOptions.schema = options.schema;
201
+ }
202
+ if (options.schemaName) {
203
+ streamOptions.schemaName = options.schemaName;
204
+ }
205
+ if (options.schemaDescription) {
206
+ streamOptions.schemaDescription = options.schemaDescription;
207
+ }
208
+ if (options.output === "enum" && options.enum) {
209
+ streamOptions.enum = options.enum;
210
+ }
211
+ const streamResult = _ai.streamObject.call(void 0, streamOptions);
212
+ return {
213
+ // Promise 属性
214
+ usage: streamResult.usage,
215
+ providerMetadata: streamResult.providerMetadata,
216
+ object: streamResult.object,
217
+ // 流属性
218
+ partialObjectStream: streamResult.partialObjectStream,
219
+ elementStream: streamResult.elementStream || streamResult.partialObjectStream,
220
+ // array 模式下可用
221
+ textStream: streamResult.textStream,
222
+ fullStream: streamResult.fullStream,
223
+ // 元数据
224
+ request: streamResult.request,
225
+ response: streamResult.response,
226
+ warnings: streamResult.warnings,
227
+ // 响应转换方法
228
+ pipeTextStreamToResponse: (response, init) => {
229
+ if (streamResult.pipeTextStreamToResponse) {
230
+ streamResult.pipeTextStreamToResponse(response, init);
231
+ } else {
232
+ this.pipeStreamToResponse(streamResult.textStream, response, init);
233
+ }
234
+ },
235
+ toTextStreamResponse: (init) => _optionalChain([streamResult, 'access', _7 => _7.toTextStreamResponse, 'optionalCall', _8 => _8(init)]) || new Response(streamResult.textStream, {
236
+ headers: { "Content-Type": "text/plain; charset=utf-8" },
237
+ ...init
238
+ }),
239
+ // 补充遗漏的方法
240
+ pipeObjectStreamToResponse: (response, init) => {
241
+ if (streamResult.pipeObjectStreamToResponse) {
242
+ streamResult.pipeObjectStreamToResponse(response, init);
243
+ } else {
244
+ this.pipeStreamToResponse(streamResult.fullStream, response, init);
245
+ }
246
+ },
247
+ toObjectStreamResponse: (init) => _optionalChain([streamResult, 'access', _9 => _9.toObjectStreamResponse, 'optionalCall', _10 => _10(init)]) || new Response(streamResult.fullStream, {
248
+ headers: { "Content-Type": "application/json; charset=utf-8" },
249
+ ...init
250
+ })
251
+ };
252
+ }
253
+ /**
254
+ * 辅助方法:将流导入响应 - 标准实现
255
+ */
256
+ pipeStreamToResponse(stream, response, options) {
257
+ if (!stream || !response) return;
258
+ if (typeof response.write === "function") {
259
+ if (stream.pipeTo) {
260
+ stream.pipeTo(response).catch((error) => {
261
+ this.emit("ai_structured:stream_pipe_error", { error });
262
+ });
263
+ } else if (stream[Symbol.asyncIterator]) {
264
+ this.consumeAsyncIterator(stream, response);
265
+ }
266
+ } else if (response instanceof Response) {
267
+ const writer = new WritableStream({
268
+ write(chunk) {
269
+ }
270
+ });
271
+ _optionalChain([stream, 'access', _11 => _11.pipeTo, 'optionalCall', _12 => _12(writer)]);
272
+ }
273
+ }
274
+ /**
275
+ * 消费异步迭代器并写入响应
276
+ */
277
+ async consumeAsyncIterator(stream, response) {
278
+ try {
279
+ for await (const chunk of stream) {
280
+ if (response.write) {
281
+ response.write(typeof chunk === "string" ? chunk : JSON.stringify(chunk));
282
+ }
283
+ }
284
+ if (response.end) {
285
+ response.end();
286
+ }
287
+ } catch (error) {
288
+ this.emit("ai_structured:async_iterator_error", { error });
289
+ }
290
+ }
291
+ // Convenience methods
292
+ /**
293
+ * Generate object - default object output strategy
294
+ */
295
+ async generateObjectData(model, schema, prompt, options) {
296
+ return this.generateObject({
297
+ model,
298
+ schema,
299
+ prompt,
300
+ output: "object",
301
+ ...options
302
+ });
303
+ }
304
+ /**
305
+ * 生成数组 - array 输出策略
306
+ */
307
+ async generateArray(model, elementSchema, prompt, options) {
308
+ return this.generateObject({
309
+ model,
310
+ schema: elementSchema,
311
+ prompt,
312
+ output: "array",
313
+ ...options
314
+ });
315
+ }
316
+ /**
317
+ * 生成枚举值 - enum 输出策略
318
+ */
319
+ async generateEnum(model, enumValues, prompt, options) {
320
+ return this.generateObject({
321
+ model,
322
+ prompt,
323
+ output: "enum",
324
+ enum: enumValues,
325
+ ...options
326
+ });
327
+ }
328
+ /**
329
+ * 生成无模式JSON - no-schema 输出策略
330
+ */
331
+ async generateFreeformJSON(model, prompt, options) {
332
+ return this.generateObject({
333
+ model,
334
+ prompt,
335
+ output: "no-schema",
336
+ mode: "json",
337
+ ...options
338
+ });
339
+ }
340
+ /**
341
+ * 流式生成对象 - 默认 object 输出策略
342
+ */
343
+ streamObjectData(model, schema, prompt, options) {
344
+ return this.streamObject({
345
+ model,
346
+ schema,
347
+ prompt,
348
+ output: "object",
349
+ ...options
350
+ });
351
+ }
352
+ /**
353
+ * 流式生成数组 - array 输出策略
354
+ */
355
+ streamArray(model, elementSchema, prompt, options) {
356
+ return this.streamObject({
357
+ model,
358
+ schema: elementSchema,
359
+ prompt,
360
+ output: "array",
361
+ ...options
362
+ });
363
+ }
364
+ /**
365
+ * 流式生成枚举值 - enum 输出策略
366
+ */
367
+ streamEnum(model, enumValues, prompt, options) {
368
+ return this.streamObject({
369
+ model,
370
+ prompt,
371
+ output: "enum",
372
+ enum: enumValues,
373
+ ...options
374
+ });
375
+ }
376
+ /**
377
+ * 流式生成无模式JSON - no-schema 输出策略
378
+ */
379
+ streamFreeformJSON(model, prompt, options) {
380
+ return this.streamObject({
381
+ model,
382
+ prompt,
383
+ output: "no-schema",
384
+ mode: "json",
385
+ ...options
386
+ });
387
+ }
388
+ // Utility methods
389
+ /**
390
+ * Check initialization status
391
+ */
392
+ isInitialized() {
393
+ return this.initialized;
394
+ }
395
+ /**
396
+ * Get statistics
397
+ */
398
+ getStats() {
399
+ return {
400
+ requestCount: this.requestCounter,
401
+ isInitialized: this.initialized
402
+ };
403
+ }
404
+ /**
405
+ * 重置统计信息
406
+ */
407
+ resetStats() {
408
+ this.requestCounter = 0;
409
+ }
410
+ /**
411
+ * 销毁实例
412
+ */
413
+ destroy() {
414
+ this.removeAllListeners();
415
+ this.initialized = false;
416
+ this.requestCounter = 0;
417
+ }
418
+ };
419
+ var ai_structured_default = AIStructuredDataIntegration;
420
+
421
+
422
+
423
+
424
+
425
+
426
+ exports.streamObject = _ai.streamObject; exports.generateObject = _ai.generateObject; exports.AIStructuredDataIntegration = AIStructuredDataIntegration; exports.ai_structured_default = ai_structured_default;
427
+ //# sourceMappingURL=chunk-4JQ7UOXH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/shixin/dev/workspaces/scenemesh-projects/scenemesh-platform-workbench5/packages/entity-engine-aimodule/dist/chunk-4JQ7UOXH.js","../src/core/ai-structured.ts"],"names":[],"mappings":"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","file":"/Users/shixin/dev/workspaces/scenemesh-projects/scenemesh-platform-workbench5/packages/entity-engine-aimodule/dist/chunk-4JQ7UOXH.js","sourcesContent":[null,"/**\n * AI Structured Data Complete Integration\n * \n * Core structured data functionality:\n * - generateObject: Structured object generation\n * - streamObject: Streaming structured object generation\n * \n * Supports all output strategies: object, array, enum, no-schema\n */\n\nimport type { z } from 'zod';\n\nimport { EventEmitter } from 'events';\nimport {\n streamObject,\n generateObject,\n type CoreMessage,\n type FinishReason,\n type LanguageModel,\n type StreamObjectResult,\n type LanguageModelUsage,\n type GenerateObjectResult,\n type LanguageModelRequestMetadata,\n type LanguageModelResponseMetadata\n} from 'ai';\n\n// Type Definitions\n\n/**\n * Complete generateObject options interface\n */\nexport interface GenerateObjectOptions<T = any> {\n // Core parameters\n model: LanguageModel;\n \n // Output strategy - supports all official strategies\n output?: 'object' | 'array' | 'enum' | 'no-schema';\n \n // Generation mode\n mode?: 'auto' | 'json' | 'tool';\n \n // Schema related - supports Zod Schema or JSON Schema\n schema?: z.ZodSchema<T> | any; // JSON Schema\n schemaName?: string;\n schemaDescription?: string;\n \n // Enum output specific\n enum?: string[];\n \n // Messages and prompts\n system?: string;\n prompt?: string | Array<any>; // SystemModelMessage | UserModelMessage | AssistantModelMessage | ToolModelMessage\n messages?: CoreMessage[];\n \n // Generation control parameters\n maxOutputTokens?: number;\n temperature?: number;\n topP?: number;\n topK?: number;\n presencePenalty?: number;\n frequencyPenalty?: number;\n seed?: number;\n \n // Retry and control\n maxRetries?: number;\n abortSignal?: AbortSignal;\n headers?: Record<string, string>;\n \n // Experimental features\n experimental_repairText?: (options: {\n text: string;\n error: any; // JSONParseError | TypeValidationError\n }) => Promise<string>;\n experimental_download?: (requestedDownloads: Array<{ url: URL; isUrlSupportedByModel: boolean }>) => Promise<Array<null | { data: Uint8Array; mediaType?: string }>>;\n experimental_telemetry?: {\n isEnabled?: boolean;\n recordInputs?: boolean;\n recordOutputs?: boolean;\n functionId?: string;\n metadata?: Record<string, string | number | boolean | Array<null | undefined | string> | Array<null | undefined | number> | Array<null | undefined | boolean>>;\n };\n \n // 提供商选项\n providerOptions?: Record<string, Record<string, any>>;\n}\n\n/**\n * streamObject 完整参数接口 - 基于 streamObject.md 规范\n */\nexport interface StreamObjectOptions<T = any> extends GenerateObjectOptions<T> {\n // 错误处理回调\n onError?: (event: { error: unknown }) => Promise<void> | void;\n \n // 完成回调\n onFinish?: (result: {\n usage: LanguageModelUsage;\n providerMetadata?: Record<string, Record<string, any>>;\n object?: T;\n error?: unknown;\n warnings?: Array<any>;\n response?: {\n id: string;\n model: string;\n timestamp: Date;\n headers?: Record<string, string>;\n };\n }) => void;\n}\n\n/**\n * generateObject 返回结果类型 - 基于 generateObject().md 规范\n */\nexport type GenerateObjectResultType<T> = {\n object: T;\n finishReason: 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other' | 'unknown';\n usage: LanguageModelUsage;\n request?: LanguageModelRequestMetadata;\n response?: LanguageModelResponseMetadata & {\n body?: unknown;\n };\n reasoning?: string; // 官方文档明确定义的返回字段\n warnings?: Array<any>;\n providerMetadata?: any;\n toJsonResponse: (init?: any) => Response; // 官方文档要求的标准方法\n};\n\n/**\n * streamObject 返回结果类型 - 基于 streamObject.md 规范\n */\nexport type StreamObjectResultType<T> = {\n // Promise 属性 - 完整列表\n usage: Promise<LanguageModelUsage>;\n providerMetadata: Promise<Record<string, Record<string, any>> | undefined>;\n object: Promise<T>;\n \n // 流属性 - 完整列表\n partialObjectStream: AsyncIterable<any> & ReadableStream<any>; // DeepPartial<T>\n elementStream: AsyncIterable<T> & ReadableStream<T>; // 仅在 array 模式下可用\n textStream: AsyncIterable<string> & ReadableStream<string>;\n fullStream: AsyncIterable<any> & ReadableStream<any>; // ObjectStreamPart<T>\n \n // 元数据 - 完整列表\n request: Promise<LanguageModelRequestMetadata>;\n response: Promise<LanguageModelResponseMetadata>;\n warnings?: Array<any>;\n \n // 响应转换方法 - 完整列表\n pipeTextStreamToResponse: (response: any, init?: any) => void;\n toTextStreamResponse: (init?: any) => Response;\n \n // 遗漏的方法 - 补充\n pipeObjectStreamToResponse?: (response: any, init?: any) => void;\n toObjectStreamResponse?: (init?: any) => Response;\n};\n\n// Core Integration Class\n\n/**\n * Complete structured data integration class\n */\nexport class AIStructuredDataIntegration extends EventEmitter {\n private initialized: boolean = false;\n private requestCounter: number = 0;\n\n constructor() {\n super();\n }\n\n /**\n * 初始化\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n try {\n this.emit('ai_structured:initializing');\n this.initialized = true;\n this.emit('ai_structured:initialized');\n } catch (error) {\n this.emit('ai_structured:initialization_failed', { error });\n throw error;\n }\n }\n\n /**\n * 生成请求ID\n */\n private generateRequestId(): string {\n return `ai-structured-${Date.now()}-${++this.requestCounter}`;\n }\n\n // ================================\n // generateObject methods\n\n /**\n * Generate structured object - supports all output strategies\n */\n async generateObject<T = any>(\n options: GenerateObjectOptions<T>\n ): Promise<GenerateObjectResultType<T>> {\n if (!this.initialized) {\n throw new Error('AIStructuredDataIntegration not initialized. Call initialize() first.');\n }\n\n const requestId = this.generateRequestId();\n const startTime = Date.now();\n\n try {\n this.emit('ai_structured:generate_object_started', {\n requestId,\n model: typeof options.model === 'string' ? options.model : 'unknown',\n output: options.output || 'object',\n hasSchema: !!options.schema,\n hasEnum: !!options.enum,\n mode: options.mode || 'auto'\n });\n\n // 根据输出策略构建参数\n const generateOptions: any = {\n model: options.model,\n system: options.system,\n prompt: options.prompt,\n messages: options.messages,\n maxOutputTokens: options.maxOutputTokens,\n temperature: options.temperature,\n topP: options.topP,\n topK: options.topK,\n presencePenalty: options.presencePenalty,\n frequencyPenalty: options.frequencyPenalty,\n seed: options.seed,\n maxRetries: options.maxRetries,\n abortSignal: options.abortSignal,\n headers: options.headers,\n experimental_repairText: options.experimental_repairText,\n experimental_download: options.experimental_download,\n experimental_telemetry: options.experimental_telemetry,\n providerOptions: options.providerOptions\n };\n\n // 处理不同的输出策略\n if (options.output) {\n generateOptions.output = options.output;\n }\n \n if (options.mode) {\n generateOptions.mode = options.mode;\n }\n\n // Schema 相关参数\n if (options.schema) {\n generateOptions.schema = options.schema;\n }\n \n if (options.schemaName) {\n generateOptions.schemaName = options.schemaName;\n }\n \n if (options.schemaDescription) {\n generateOptions.schemaDescription = options.schemaDescription;\n }\n\n // Enum 模式专用参数\n if (options.output === 'enum' && options.enum) {\n generateOptions.enum = options.enum;\n }\n\n const result = await generateObject(generateOptions);\n\n this.emit('ai_structured:generate_object_completed', {\n requestId,\n latency: Date.now() - startTime,\n finishReason: result.finishReason,\n usage: result.usage,\n output: options.output || 'object',\n hasObject: !!result.object,\n hasReasoning: !!result.reasoning,\n warnings: result.warnings?.length || 0\n });\n\n // 增强返回结果,确保包含所有官方规范的方法\n const enhancedResult = {\n ...result,\n // 确保 toJsonResponse 方法存在\n toJsonResponse: (init?: any) => (result as any).toJsonResponse?.(init) || \n new Response(JSON.stringify(result.object), {\n status: 200,\n headers: { 'Content-Type': 'application/json; charset=utf-8' },\n ...init\n })\n };\n\n return enhancedResult as GenerateObjectResultType<T>;\n\n } catch (error: any) {\n this.emit('ai_structured:generate_object_failed', {\n requestId,\n error: error.message,\n latency: Date.now() - startTime,\n errorType: error.constructor.name,\n output: options.output || 'object'\n });\n\n throw error;\n }\n }\n\n // ================================\n // streamObject methods\n\n /**\n * Stream structured object generation - supports all output strategies and stream modes\n */\n streamObject<T = any>(\n options: StreamObjectOptions<T>\n ): StreamObjectResultType<T> {\n if (!this.initialized) {\n throw new Error('AIStructuredDataIntegration not initialized. Call initialize() first.');\n }\n\n const requestId = this.generateRequestId();\n const startTime = Date.now();\n\n this.emit('ai_structured:stream_object_started', {\n requestId,\n model: typeof options.model === 'string' ? options.model : 'unknown',\n output: options.output || 'object',\n hasSchema: !!options.schema,\n hasEnum: !!options.enum,\n mode: options.mode || 'auto'\n });\n\n // 包装回调以添加事件发射\n const wrappedOptions = {\n ...options,\n onError: (event: any) => {\n this.emit('ai_structured:stream_object_error', {\n requestId,\n error: event.error,\n latency: Date.now() - startTime\n });\n if (options.onError) {\n options.onError(event);\n }\n },\n onFinish: (result: any) => {\n this.emit('ai_structured:stream_object_finished', {\n requestId,\n latency: Date.now() - startTime,\n usage: result.usage,\n hasObject: !!result.object,\n hasError: !!result.error,\n warnings: result.warnings?.length || 0,\n output: options.output || 'object'\n });\n\n if (options.onFinish) {\n options.onFinish(result);\n }\n }\n };\n\n // 根据输出策略构建参数\n const streamOptions: any = {\n model: options.model,\n system: options.system,\n prompt: options.prompt,\n messages: options.messages,\n maxOutputTokens: options.maxOutputTokens,\n temperature: options.temperature,\n topP: options.topP,\n topK: options.topK,\n presencePenalty: options.presencePenalty,\n frequencyPenalty: options.frequencyPenalty,\n seed: options.seed,\n maxRetries: options.maxRetries,\n abortSignal: options.abortSignal,\n headers: options.headers,\n experimental_repairText: options.experimental_repairText,\n experimental_download: options.experimental_download,\n experimental_telemetry: options.experimental_telemetry,\n providerOptions: options.providerOptions,\n onError: wrappedOptions.onError,\n onFinish: wrappedOptions.onFinish\n };\n\n // 处理不同的输出策略\n if (options.output) {\n streamOptions.output = options.output;\n }\n \n if (options.mode) {\n streamOptions.mode = options.mode;\n }\n\n // Schema 相关参数\n if (options.schema) {\n streamOptions.schema = options.schema;\n }\n \n if (options.schemaName) {\n streamOptions.schemaName = options.schemaName;\n }\n \n if (options.schemaDescription) {\n streamOptions.schemaDescription = options.schemaDescription;\n }\n\n // Enum 模式专用参数\n if (options.output === 'enum' && options.enum) {\n streamOptions.enum = options.enum;\n }\n\n const streamResult = streamObject(streamOptions);\n\n // 增强 StreamResult,确保符合官方规范\n return {\n // Promise 属性\n usage: streamResult.usage,\n providerMetadata: streamResult.providerMetadata,\n object: streamResult.object as Promise<T>,\n\n // 流属性\n partialObjectStream: streamResult.partialObjectStream,\n elementStream: streamResult.elementStream || streamResult.partialObjectStream, // array 模式下可用\n textStream: streamResult.textStream,\n fullStream: streamResult.fullStream,\n\n // 元数据\n request: streamResult.request,\n response: streamResult.response,\n warnings: streamResult.warnings,\n\n // 响应转换方法\n pipeTextStreamToResponse: (response: any, init?: any) => {\n if ((streamResult as any).pipeTextStreamToResponse) {\n (streamResult as any).pipeTextStreamToResponse(response, init);\n } else {\n this.pipeStreamToResponse(streamResult.textStream, response, init);\n }\n },\n\n toTextStreamResponse: (init?: any) => (streamResult as any).toTextStreamResponse?.(init) || \n new Response(streamResult.textStream as any, {\n headers: { 'Content-Type': 'text/plain; charset=utf-8' },\n ...init\n }),\n \n // 补充遗漏的方法\n pipeObjectStreamToResponse: (response: any, init?: any) => {\n if ((streamResult as any).pipeObjectStreamToResponse) {\n (streamResult as any).pipeObjectStreamToResponse(response, init);\n } else {\n this.pipeStreamToResponse(streamResult.fullStream, response, init);\n }\n },\n \n toObjectStreamResponse: (init?: any) => (streamResult as any).toObjectStreamResponse?.(init) || \n new Response(streamResult.fullStream as any, {\n headers: { 'Content-Type': 'application/json; charset=utf-8' },\n ...init\n })\n } as unknown as StreamObjectResultType<T>;\n }\n\n /**\n * 辅助方法:将流导入响应 - 标准实现\n */\n private pipeStreamToResponse(stream: any, response: any, options?: any): void {\n if (!stream || !response) return;\n \n // 标准流处理实现\n if (typeof response.write === 'function') {\n // Node.js Response 对象\n if (stream.pipeTo) {\n stream.pipeTo(response).catch((error: any) => {\n this.emit('ai_structured:stream_pipe_error', { error });\n });\n } else if (stream[Symbol.asyncIterator]) {\n // 异步迭代器处理\n this.consumeAsyncIterator(stream, response);\n }\n } else if (response instanceof Response) {\n // Web API Response 对象 - 创建新的可写流\n const writer = new WritableStream({\n write(chunk) {\n // 处理流式数据写入\n }\n });\n stream.pipeTo?.(writer);\n }\n }\n\n /**\n * 消费异步迭代器并写入响应\n */\n private async consumeAsyncIterator(stream: any, response: any): Promise<void> {\n try {\n for await (const chunk of stream) {\n if (response.write) {\n response.write(typeof chunk === 'string' ? chunk : JSON.stringify(chunk));\n }\n }\n if (response.end) {\n response.end();\n }\n } catch (error) {\n this.emit('ai_structured:async_iterator_error', { error });\n }\n }\n\n // Convenience methods\n\n /**\n * Generate object - default object output strategy\n */\n async generateObjectData<T>(\n model: LanguageModel,\n schema: z.ZodSchema<T>,\n prompt: string,\n options?: Partial<GenerateObjectOptions<T>>\n ): Promise<GenerateObjectResultType<T>> {\n return this.generateObject({\n model,\n schema,\n prompt,\n output: 'object',\n ...options\n });\n }\n\n /**\n * 生成数组 - array 输出策略\n */\n async generateArray<T>(\n model: LanguageModel,\n elementSchema: z.ZodSchema<T>,\n prompt: string,\n options?: Partial<GenerateObjectOptions<T>>\n ): Promise<GenerateObjectResultType<T[]>> {\n return this.generateObject({\n model,\n schema: elementSchema,\n prompt,\n output: 'array',\n ...options\n });\n }\n\n /**\n * 生成枚举值 - enum 输出策略\n */\n async generateEnum(\n model: LanguageModel,\n enumValues: string[],\n prompt: string,\n options?: Partial<GenerateObjectOptions<string>>\n ): Promise<GenerateObjectResultType<string>> {\n return this.generateObject({\n model,\n prompt,\n output: 'enum',\n enum: enumValues,\n ...options\n });\n }\n\n /**\n * 生成无模式JSON - no-schema 输出策略\n */\n async generateFreeformJSON(\n model: LanguageModel,\n prompt: string,\n options?: Partial<GenerateObjectOptions<any>>\n ): Promise<GenerateObjectResultType<any>> {\n return this.generateObject({\n model,\n prompt,\n output: 'no-schema',\n mode: 'json',\n ...options\n });\n }\n\n /**\n * 流式生成对象 - 默认 object 输出策略\n */\n streamObjectData<T>(\n model: LanguageModel,\n schema: z.ZodSchema<T>,\n prompt: string,\n options?: Partial<StreamObjectOptions<T>>\n ): StreamObjectResultType<T> {\n return this.streamObject({\n model,\n schema,\n prompt,\n output: 'object',\n ...options\n });\n }\n\n /**\n * 流式生成数组 - array 输出策略\n */\n streamArray<T>(\n model: LanguageModel,\n elementSchema: z.ZodSchema<T>,\n prompt: string,\n options?: Partial<StreamObjectOptions<T>>\n ): StreamObjectResultType<T[]> {\n return this.streamObject<T[]>({\n model,\n schema: elementSchema,\n prompt,\n output: 'array',\n ...options\n } as StreamObjectOptions<T[]>);\n }\n\n /**\n * 流式生成枚举值 - enum 输出策略\n */\n streamEnum(\n model: LanguageModel,\n enumValues: string[],\n prompt: string,\n options?: Partial<StreamObjectOptions<string>>\n ): StreamObjectResultType<string> {\n return this.streamObject({\n model,\n prompt,\n output: 'enum',\n enum: enumValues,\n ...options\n });\n }\n\n /**\n * 流式生成无模式JSON - no-schema 输出策略\n */\n streamFreeformJSON(\n model: LanguageModel,\n prompt: string,\n options?: Partial<StreamObjectOptions<any>>\n ): StreamObjectResultType<any> {\n return this.streamObject({\n model,\n prompt,\n output: 'no-schema',\n mode: 'json',\n ...options\n });\n }\n\n // Utility methods\n\n /**\n * Check initialization status\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Get statistics\n */\n getStats(): {\n requestCount: number;\n isInitialized: boolean;\n } {\n return {\n requestCount: this.requestCounter,\n isInitialized: this.initialized\n };\n }\n\n /**\n * 重置统计信息\n */\n resetStats(): void {\n this.requestCounter = 0;\n }\n\n /**\n * 销毁实例\n */\n destroy(): void {\n this.removeAllListeners();\n this.initialized = false;\n this.requestCounter = 0;\n }\n}\n\n// Exports\n\nexport {\n streamObject,\n // Core functions\n generateObject,\n type CoreMessage,\n type FinishReason,\n type LanguageModel,\n type StreamObjectResult,\n \n type LanguageModelUsage,\n // Core types\n type GenerateObjectResult\n};\n\n// Default export\nexport default AIStructuredDataIntegration;"]}