sdkwork-browser-agent 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 (146) hide show
  1. package/README.md +228 -0
  2. package/README.zh.md +228 -0
  3. package/dist/agent-Bpxmkz8W.d.ts +197 -0
  4. package/dist/agent-kexkkI13.d.cts +197 -0
  5. package/dist/browser/agent-Bpxmkz8W.d.ts +197 -0
  6. package/dist/browser/chunk-7W2JJCSS.js +276 -0
  7. package/dist/browser/chunk-7W2JJCSS.js.map +1 -0
  8. package/dist/browser/chunk-BHRFRGR7.js +144 -0
  9. package/dist/browser/chunk-BHRFRGR7.js.map +1 -0
  10. package/dist/browser/chunk-CLP6UNSV.js +285 -0
  11. package/dist/browser/chunk-CLP6UNSV.js.map +1 -0
  12. package/dist/browser/chunk-HXLRBB7S.js +1569 -0
  13. package/dist/browser/chunk-HXLRBB7S.js.map +1 -0
  14. package/dist/browser/chunk-VJEFLRZT.js +1720 -0
  15. package/dist/browser/chunk-VJEFLRZT.js.map +1 -0
  16. package/dist/browser/index.d.ts +842 -0
  17. package/dist/browser/index.js +3293 -0
  18. package/dist/browser/index.js.map +1 -0
  19. package/dist/browser/llm/index.d.ts +235 -0
  20. package/dist/browser/llm/index.js +29 -0
  21. package/dist/browser/llm/index.js.map +1 -0
  22. package/dist/browser/mcp/index.d.ts +63 -0
  23. package/dist/browser/mcp/index.js +9 -0
  24. package/dist/browser/mcp/index.js.map +1 -0
  25. package/dist/browser/provider-Dna36xA-.d.ts +105 -0
  26. package/dist/browser/skills/index.d.ts +401 -0
  27. package/dist/browser/skills/index.js +31 -0
  28. package/dist/browser/skills/index.js.map +1 -0
  29. package/dist/browser/storage/index.d.ts +64 -0
  30. package/dist/browser/storage/index.js +15 -0
  31. package/dist/browser/storage/index.js.map +1 -0
  32. package/dist/browser/tools/index.d.ts +45 -0
  33. package/dist/browser/tools/index.js +15 -0
  34. package/dist/browser/tools/index.js.map +1 -0
  35. package/dist/browser/types-CG5I-byI.d.ts +30 -0
  36. package/dist/chunk-56J3IBXZ.js +144 -0
  37. package/dist/chunk-56J3IBXZ.js.map +1 -0
  38. package/dist/chunk-5XTVS5MB.js +1720 -0
  39. package/dist/chunk-5XTVS5MB.js.map +1 -0
  40. package/dist/chunk-6AYIRBGI.js +166 -0
  41. package/dist/chunk-6AYIRBGI.js.map +1 -0
  42. package/dist/chunk-C2EYJHXW.cjs +276 -0
  43. package/dist/chunk-C2EYJHXW.cjs.map +1 -0
  44. package/dist/chunk-HOZQ445W.cjs +166 -0
  45. package/dist/chunk-HOZQ445W.cjs.map +1 -0
  46. package/dist/chunk-KZNZ6CGD.cjs +144 -0
  47. package/dist/chunk-KZNZ6CGD.cjs.map +1 -0
  48. package/dist/chunk-XFMT5ZA4.js +276 -0
  49. package/dist/chunk-XFMT5ZA4.js.map +1 -0
  50. package/dist/chunk-XPGICLEJ.cjs +1720 -0
  51. package/dist/chunk-XPGICLEJ.cjs.map +1 -0
  52. package/dist/index.cjs +1311 -0
  53. package/dist/index.cjs.map +1 -0
  54. package/dist/index.d.cts +395 -0
  55. package/dist/index.d.ts +395 -0
  56. package/dist/index.js +1311 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/llm/index.cjs +29 -0
  59. package/dist/llm/index.cjs.map +1 -0
  60. package/dist/llm/index.d.cts +235 -0
  61. package/dist/llm/index.d.ts +235 -0
  62. package/dist/llm/index.js +29 -0
  63. package/dist/llm/index.js.map +1 -0
  64. package/dist/mcp/index.cjs +9 -0
  65. package/dist/mcp/index.cjs.map +1 -0
  66. package/dist/mcp/index.d.cts +63 -0
  67. package/dist/mcp/index.d.ts +63 -0
  68. package/dist/mcp/index.js +9 -0
  69. package/dist/mcp/index.js.map +1 -0
  70. package/dist/node/agent-Bpxmkz8W.d.ts +197 -0
  71. package/dist/node/agent-kexkkI13.d.cts +197 -0
  72. package/dist/node/chunk-7W2JJCSS.js +276 -0
  73. package/dist/node/chunk-7W2JJCSS.js.map +1 -0
  74. package/dist/node/chunk-BHRFRGR7.js +144 -0
  75. package/dist/node/chunk-BHRFRGR7.js.map +1 -0
  76. package/dist/node/chunk-CLP6UNSV.js +285 -0
  77. package/dist/node/chunk-CLP6UNSV.js.map +1 -0
  78. package/dist/node/chunk-HXLRBB7S.js +1569 -0
  79. package/dist/node/chunk-HXLRBB7S.js.map +1 -0
  80. package/dist/node/chunk-IYG37UN3.cjs +144 -0
  81. package/dist/node/chunk-IYG37UN3.cjs.map +1 -0
  82. package/dist/node/chunk-JF33ZOMB.cjs +285 -0
  83. package/dist/node/chunk-JF33ZOMB.cjs.map +1 -0
  84. package/dist/node/chunk-KXXS33G3.cjs +276 -0
  85. package/dist/node/chunk-KXXS33G3.cjs.map +1 -0
  86. package/dist/node/chunk-MTFOABGC.cjs +1720 -0
  87. package/dist/node/chunk-MTFOABGC.cjs.map +1 -0
  88. package/dist/node/chunk-VJEFLRZT.js +1720 -0
  89. package/dist/node/chunk-VJEFLRZT.js.map +1 -0
  90. package/dist/node/chunk-YDHQCPSN.cjs +1569 -0
  91. package/dist/node/chunk-YDHQCPSN.cjs.map +1 -0
  92. package/dist/node/index.cjs +3293 -0
  93. package/dist/node/index.cjs.map +1 -0
  94. package/dist/node/index.d.cts +842 -0
  95. package/dist/node/index.d.ts +842 -0
  96. package/dist/node/index.js +3293 -0
  97. package/dist/node/index.js.map +1 -0
  98. package/dist/node/llm/index.cjs +29 -0
  99. package/dist/node/llm/index.cjs.map +1 -0
  100. package/dist/node/llm/index.d.cts +235 -0
  101. package/dist/node/llm/index.d.ts +235 -0
  102. package/dist/node/llm/index.js +29 -0
  103. package/dist/node/llm/index.js.map +1 -0
  104. package/dist/node/mcp/index.cjs +9 -0
  105. package/dist/node/mcp/index.cjs.map +1 -0
  106. package/dist/node/mcp/index.d.cts +63 -0
  107. package/dist/node/mcp/index.d.ts +63 -0
  108. package/dist/node/mcp/index.js +9 -0
  109. package/dist/node/mcp/index.js.map +1 -0
  110. package/dist/node/provider-Dna36xA-.d.cts +105 -0
  111. package/dist/node/provider-Dna36xA-.d.ts +105 -0
  112. package/dist/node/skills/index.cjs +31 -0
  113. package/dist/node/skills/index.cjs.map +1 -0
  114. package/dist/node/skills/index.d.cts +401 -0
  115. package/dist/node/skills/index.d.ts +401 -0
  116. package/dist/node/skills/index.js +31 -0
  117. package/dist/node/skills/index.js.map +1 -0
  118. package/dist/node/storage/index.cjs +15 -0
  119. package/dist/node/storage/index.cjs.map +1 -0
  120. package/dist/node/storage/index.d.cts +64 -0
  121. package/dist/node/storage/index.d.ts +64 -0
  122. package/dist/node/storage/index.js +15 -0
  123. package/dist/node/storage/index.js.map +1 -0
  124. package/dist/node/tools/index.cjs +15 -0
  125. package/dist/node/tools/index.cjs.map +1 -0
  126. package/dist/node/tools/index.d.cts +45 -0
  127. package/dist/node/tools/index.d.ts +45 -0
  128. package/dist/node/tools/index.js +15 -0
  129. package/dist/node/tools/index.js.map +1 -0
  130. package/dist/node/types-CG5I-byI.d.cts +30 -0
  131. package/dist/node/types-CG5I-byI.d.ts +30 -0
  132. package/dist/provider-Dna36xA-.d.cts +105 -0
  133. package/dist/provider-Dna36xA-.d.ts +105 -0
  134. package/dist/skills/index.cjs +15 -0
  135. package/dist/skills/index.cjs.map +1 -0
  136. package/dist/skills/index.d.cts +43 -0
  137. package/dist/skills/index.d.ts +43 -0
  138. package/dist/skills/index.js +15 -0
  139. package/dist/skills/index.js.map +1 -0
  140. package/dist/tools/index.cjs +15 -0
  141. package/dist/tools/index.cjs.map +1 -0
  142. package/dist/tools/index.d.cts +45 -0
  143. package/dist/tools/index.d.ts +45 -0
  144. package/dist/tools/index.js +15 -0
  145. package/dist/tools/index.js.map +1 -0
  146. package/package.json +150 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/llm/provider.ts","../src/llm/providers/openai.ts","../src/llm/providers/anthropic.ts","../src/llm/providers/gemini.ts","../src/llm/providers/moonshot.ts","../src/llm/providers/minimax.ts","../src/llm/providers/zhipu.ts","../src/llm/providers/qwen.ts","../src/llm/providers/deepseek.ts","../src/llm/providers/doubao.ts"],"sourcesContent":["/**\n * LLM Provider Interface\n * Supports various LLM providers: OpenAI, Anthropic, Google, local models, etc.\n */\n\n// Message types for LLM communication\nexport interface LLMMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n name?: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n}\n\nexport interface ToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\n// LLM Request configuration\nexport interface LLMRequest {\n messages: LLMMessage[];\n model?: string;\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n stream?: boolean;\n tools?: ToolDefinition[];\n tool_choice?: 'auto' | 'none' | { type: 'function'; function: { name: string } };\n}\n\nexport interface ToolDefinition {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n}\n\n// LLM Response\nexport interface LLMResponse {\n id: string;\n model: string;\n content: string;\n role: 'assistant';\n tool_calls?: ToolCall[];\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter';\n}\n\n// Streaming response chunk\nexport interface LLMStreamChunk {\n id: string;\n model: string;\n delta: {\n content?: string;\n role?: 'assistant';\n tool_calls?: ToolCall[];\n };\n finish_reason?: 'stop' | 'length' | 'tool_calls' | 'content_filter';\n}\n\n// Provider configuration\nexport interface LLMProviderConfig {\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n defaultParams?: Partial<LLMRequest>;\n timeout?: number;\n retries?: number;\n}\n\n// Abstract LLM Provider interface\nexport interface LLMProvider {\n readonly name: string;\n readonly supportedModels: string[];\n\n complete(request: LLMRequest): Promise<LLMResponse>;\n stream(request: LLMRequest): AsyncIterableIterator<LLMStreamChunk>;\n validateConfig(): boolean;\n}\n\n// Provider factory type\nexport type LLMProviderFactory = (config: LLMProviderConfig) => LLMProvider;\n\n// Provider registry\nexport class LLMProviderRegistry {\n private providers = new Map<string, LLMProviderFactory>();\n private instances = new Map<string, LLMProvider>();\n\n register(name: string, factory: LLMProviderFactory): void {\n this.providers.set(name, factory);\n }\n\n create(name: string, config: LLMProviderConfig): LLMProvider {\n const factory = this.providers.get(name);\n if (!factory) {\n throw new Error(`Unknown LLM provider: ${name}`);\n }\n const instance = factory(config);\n this.instances.set(name, instance);\n return instance;\n }\n\n get(name: string): LLMProvider | undefined {\n return this.instances.get(name);\n }\n\n listProviders(): string[] {\n return Array.from(this.providers.keys());\n }\n\n isRegistered(name: string): boolean {\n return this.providers.has(name);\n }\n}\n\n// Global provider registry\nexport const globalProviderRegistry = new LLMProviderRegistry();\n\n// LLM Manager for handling multiple providers\nexport class LLMManager {\n private providers = new Map<string, LLMProvider>();\n private defaultProvider?: string;\n\n constructor(private registry: LLMProviderRegistry = globalProviderRegistry) {}\n\n addProvider(name: string, config: LLMProviderConfig): LLMProvider {\n const provider = this.registry.create(name, config);\n this.providers.set(name, provider);\n return provider;\n }\n\n setDefaultProvider(name: string): void {\n if (!this.providers.has(name)) {\n throw new Error(`Provider '${name}' not found. Add it first.`);\n }\n this.defaultProvider = name;\n }\n\n getProvider(name?: string): LLMProvider {\n const providerName = name || this.defaultProvider;\n if (!providerName) {\n throw new Error('No provider specified and no default provider set');\n }\n const provider = this.providers.get(providerName);\n if (!provider) {\n throw new Error(`Provider '${providerName}' not found`);\n }\n return provider;\n }\n\n async complete(request: LLMRequest, providerName?: string): Promise<LLMResponse> {\n const provider = this.getProvider(providerName);\n return provider.complete(request);\n }\n\n async *stream(request: LLMRequest, providerName?: string): AsyncIterableIterator<LLMStreamChunk> {\n const provider = this.getProvider(providerName);\n yield* provider.stream(request);\n }\n\n listProviders(): string[] {\n return Array.from(this.providers.keys());\n }\n}\n","/**\n * OpenAI Provider Implementation\n * Updated with latest GPT-5 series models (2025)\n */\n\nimport {\n LLMProvider,\n LLMProviderConfig,\n LLMRequest,\n LLMResponse,\n LLMStreamChunk,\n} from '../provider';\n\nexport interface OpenAIConfig extends LLMProviderConfig {\n organization?: string;\n project?: string;\n}\n\nexport class OpenAIProvider implements LLMProvider {\n readonly name = 'openai';\n readonly supportedModels = [\n // GPT-5.2 系列 (最新旗舰模型 - 2025)\n 'gpt-5.2',\n 'gpt-5.2-2025-01-28',\n 'gpt-5.2-pro',\n 'gpt-5.2-pro-2025-01-28',\n 'gpt-5.2-codex',\n 'gpt-5.2-codex-2025-01-28',\n\n // GPT-5.1 系列\n 'gpt-5.1',\n 'gpt-5.1-2025-01-28',\n 'gpt-5.1-codex',\n 'gpt-5.1-codex-2025-01-28',\n 'gpt-5.1-codex-max',\n\n // GPT-5 系列\n 'gpt-5',\n 'gpt-5-2025-01-28',\n 'gpt-5-pro',\n\n // GPT-5 Mini/Nano (轻量版)\n 'gpt-5-mini',\n 'gpt-5-mini-2025-01-28',\n 'gpt-5-nano',\n 'gpt-5-nano-2025-01-28',\n\n // GPT-4.1 系列\n 'gpt-4.1',\n 'gpt-4.1-2025-01-28',\n 'gpt-4.1-mini',\n 'gpt-4.1-nano',\n\n // GPT-4o 系列 (旧版但仍支持)\n 'gpt-4o',\n 'gpt-4o-2024-11-20',\n 'gpt-4o-2024-08-06',\n 'gpt-4o-mini',\n 'gpt-4o-mini-2024-07-18',\n\n // o 系列 (推理模型)\n 'o3',\n 'o3-2025-01-28',\n 'o3-pro',\n 'o4-mini',\n 'o4-mini-2025-01-28',\n 'o1',\n 'o1-2024-12-17',\n 'o1-pro',\n\n // 开源模型\n 'gpt-oss-120b',\n 'gpt-oss-20b',\n\n // 专用模型\n 'o3-deep-research',\n 'o4-mini-deep-research',\n 'computer-use-preview',\n ];\n\n private _apiKey: string;\n private _baseUrl: string;\n private _defaultParams: Partial<LLMRequest>;\n private _timeout: number;\n private _organization?: string;\n private _project?: string;\n\n constructor(config: OpenAIConfig) {\n this._apiKey = config.apiKey || '';\n this._baseUrl = config.baseUrl || 'https://api.openai.com/v1';\n this._defaultParams = config.defaultParams || {};\n this._timeout = config.timeout || 60000;\n this._organization = config.organization;\n this._project = config.project;\n }\n\n validateConfig(): boolean {\n return !!this._apiKey;\n }\n\n private async makeRequest(endpoint: string, body: unknown): Promise<Response> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this._apiKey}`,\n };\n\n if (this._organization) {\n headers['OpenAI-Organization'] = this._organization;\n }\n if (this._project) {\n headers['OpenAI-Project'] = this._project;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n try {\n const response = await fetch(`${this._baseUrl}${endpoint}`, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${response.status} - ${error}`);\n }\n\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n async complete(request: LLMRequest): Promise<LLMResponse> {\n const body = this.buildRequestBody(request);\n const response = await this.makeRequest('/chat/completions', body);\n const data = await response.json();\n\n return this.parseResponse(data);\n }\n\n async *stream(request: LLMRequest): AsyncIterableIterator<LLMStreamChunk> {\n const body = this.buildRequestBody(request, true);\n const response = await this.makeRequest('/chat/completions', body);\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data);\n yield this.parseStreamChunk(chunk);\n } catch {\n // Ignore parse errors for malformed chunks\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n private buildRequestBody(request: LLMRequest, stream = false): Record<string, unknown> {\n return {\n model: request.model || this._defaultParams.model || 'gpt-5.2',\n messages: this.formatMessages(request.messages),\n temperature: request.temperature ?? this._defaultParams.temperature ?? 0.7,\n max_tokens: request.max_tokens ?? this._defaultParams.max_tokens,\n top_p: request.top_p ?? this._defaultParams.top_p ?? 1,\n stream,\n tools: request.tools,\n tool_choice: request.tool_choice,\n };\n }\n\n private formatMessages(\n messages: Array<{\n role: string;\n content: string;\n name?: string;\n tool_calls?: unknown;\n tool_call_id?: string;\n }>\n ): Array<Record<string, unknown>> {\n return messages.map(msg => {\n const formatted: Record<string, unknown> = {\n role: msg.role,\n content: msg.content,\n };\n if (msg.name) formatted.name = msg.name;\n if (msg.tool_calls) formatted.tool_calls = msg.tool_calls;\n if (msg.tool_call_id) formatted.tool_call_id = msg.tool_call_id;\n return formatted;\n });\n }\n\n private parseResponse(data: Record<string, unknown>): LLMResponse {\n const choice = (data.choices as Record<string, unknown>[])[0];\n const message = choice.message as Record<string, unknown>;\n\n return {\n id: data.id as string,\n model: data.model as string,\n content: (message.content as string) || '',\n role: 'assistant',\n tool_calls: message.tool_calls as LLMResponse['tool_calls'],\n usage: data.usage as LLMResponse['usage'],\n finish_reason: choice.finish_reason as LLMResponse['finish_reason'],\n };\n }\n\n private parseStreamChunk(data: Record<string, unknown>): LLMStreamChunk {\n const choice = (data.choices as Record<string, unknown>[])[0];\n const delta = choice.delta as Record<string, unknown>;\n\n return {\n id: data.id as string,\n model: data.model as string,\n delta: {\n content: delta.content as string | undefined,\n role: delta.role as 'assistant' | undefined,\n tool_calls: delta.tool_calls as LLMStreamChunk['delta']['tool_calls'],\n },\n finish_reason: choice.finish_reason as LLMStreamChunk['finish_reason'],\n };\n }\n}\n\n// Register provider\nimport { globalProviderRegistry } from '../provider';\nglobalProviderRegistry.register(\n 'openai',\n (config: LLMProviderConfig) => new OpenAIProvider(config as OpenAIConfig)\n);\n","/**\n * Anthropic Claude Provider Implementation\n * Updated with Claude 4.5 series models (2025)\n */\n\nimport {\n LLMProvider,\n LLMProviderConfig as LLMProviderConfigType,\n LLMRequest,\n LLMResponse,\n LLMStreamChunk,\n} from '../provider';\n\nexport interface AnthropicConfig extends LLMProviderConfigType {\n anthropicVersion?: string;\n}\n\nexport class AnthropicProvider implements LLMProvider {\n readonly name = 'anthropic';\n readonly supportedModels = [\n // Claude 4.5 系列 (最新 - 2025)\n 'claude-sonnet-4-5',\n 'claude-sonnet-4-5-20250929',\n 'claude-sonnet-4-5-latest',\n\n 'claude-haiku-4-5',\n 'claude-haiku-4-5-20251001',\n 'claude-haiku-4-5-latest',\n\n 'claude-opus-4-5',\n 'claude-opus-4-5-20251101',\n 'claude-opus-4-5-latest',\n\n // Claude 4.1/4.0 系列\n 'claude-opus-4-1',\n 'claude-opus-4-1-20250805',\n 'claude-opus-4-1-latest',\n\n 'claude-sonnet-4',\n 'claude-sonnet-4-20250514',\n 'claude-sonnet-4-0',\n 'claude-sonnet-4-latest',\n\n // Claude 3.7 系列\n 'claude-3-7-sonnet',\n 'claude-3-7-sonnet-20250219',\n 'claude-3-7-sonnet-latest',\n\n // Claude 3.5 系列 (旧版)\n 'claude-3-5-sonnet',\n 'claude-3-5-sonnet-20241022',\n 'claude-3-5-sonnet-20240620',\n\n 'claude-3-5-haiku',\n 'claude-3-5-haiku-20241022',\n\n // Claude 3 系列 (旧版)\n 'claude-3-opus',\n 'claude-3-opus-20240229',\n 'claude-3-opus-4',\n 'claude-3-opus-4-20250514',\n\n 'claude-3-sonnet',\n 'claude-3-sonnet-20240229',\n\n 'claude-3-haiku',\n 'claude-3-haiku-20240307',\n ];\n\n private _apiKey: string;\n private _baseUrl: string;\n private _defaultParams: Partial<LLMRequest>;\n private _timeout: number;\n private _anthropicVersion: string;\n\n constructor(config: AnthropicConfig) {\n this._apiKey = config.apiKey || '';\n this._baseUrl = config.baseUrl || 'https://api.anthropic.com/v1';\n this._defaultParams = config.defaultParams || {};\n this._timeout = config.timeout || 60000;\n this._anthropicVersion = config.anthropicVersion || '2023-06-01';\n }\n\n validateConfig(): boolean {\n return !!this._apiKey;\n }\n\n private async makeRequest(endpoint: string, body: unknown): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n try {\n const response = await fetch(`${this._baseUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Api-Key': this._apiKey,\n 'Anthropic-Version': this._anthropicVersion,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${response.status} - ${error}`);\n }\n\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n async complete(request: LLMRequest): Promise<LLMResponse> {\n const body = this.buildRequestBody(request);\n const response = await this.makeRequest('/messages', body);\n const data = await response.json();\n\n return this.parseResponse(data);\n }\n\n async *stream(request: LLMRequest): AsyncIterableIterator<LLMStreamChunk> {\n const body = this.buildRequestBody(request, true);\n const response = await this.makeRequest('/messages', body);\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') return;\n\n try {\n const event = JSON.parse(data);\n if (event.type === 'content_block_delta') {\n yield this.parseStreamChunk(event);\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n private buildRequestBody(request: LLMRequest, stream = false): Record<string, unknown> {\n const systemMessage = request.messages.find(m => m.role === 'system');\n const messages = request.messages.filter(m => m.role !== 'system');\n\n const body: Record<string, unknown> = {\n model: request.model || this._defaultParams.model || 'claude-sonnet-4-5-latest',\n messages: messages.map(msg => ({\n role: msg.role === 'assistant' ? 'assistant' : 'user',\n content: msg.content,\n })),\n max_tokens: request.max_tokens ?? this._defaultParams.max_tokens ?? 4096,\n stream,\n };\n\n if (systemMessage) {\n body.system = systemMessage.content;\n }\n\n if (request.temperature !== undefined) {\n body.temperature = request.temperature;\n }\n\n if (request.tools) {\n body.tools = request.tools.map(tool => ({\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function.parameters,\n }));\n }\n\n return body;\n }\n\n private parseResponse(data: Record<string, unknown>): LLMResponse {\n const content = (data.content as Array<Record<string, unknown>>) || [];\n const textContent = content.find(c => c.type === 'text');\n\n return {\n id: data.id as string,\n model: data.model as string,\n content: (textContent?.text as string) || '',\n role: 'assistant',\n usage: {\n prompt_tokens: (data.usage as Record<string, number>)?.input_tokens || 0,\n completion_tokens: (data.usage as Record<string, number>)?.output_tokens || 0,\n total_tokens:\n ((data.usage as Record<string, number>)?.input_tokens || 0) +\n ((data.usage as Record<string, number>)?.output_tokens || 0),\n },\n finish_reason: 'stop',\n };\n }\n\n private parseStreamChunk(event: Record<string, unknown>): LLMStreamChunk {\n return {\n id: event.id as string,\n model: event.model as string,\n delta: {\n content: (event.delta as Record<string, string>)?.text,\n },\n };\n }\n}\n\n// Register provider\nimport { globalProviderRegistry } from '../provider';\nglobalProviderRegistry.register(\n 'anthropic',\n (config: LLMProviderConfigType) => new AnthropicProvider(config as AnthropicConfig)\n);\n","/**\n * Google Gemini Provider Implementation\n * Updated with Gemini 2.0/3.0 series models (2025)\n */\n\nimport {\n LLMProvider,\n LLMProviderConfig as LLMProviderConfigType,\n LLMRequest,\n LLMResponse,\n LLMStreamChunk,\n} from '../provider';\n\nexport interface GeminiConfig extends LLMProviderConfigType {\n apiVersion?: string;\n}\n\nexport class GeminiProvider implements LLMProvider {\n readonly name = 'gemini';\n readonly supportedModels = [\n // Gemini 3.0 系列 (最新 - 2025)\n 'gemini-3.0-pro',\n 'gemini-3.0-pro-001',\n 'gemini-3.0-pro-latest',\n 'gemini-3.0-pro-exp',\n\n 'gemini-3.0-flash',\n 'gemini-3.0-flash-001',\n 'gemini-3.0-flash-latest',\n 'gemini-3.0-flash-exp',\n\n 'gemini-3.0-ultra',\n 'gemini-3.0-ultra-001',\n 'gemini-3.0-ultra-latest',\n\n // Gemini 2.5 系列\n 'gemini-2.5-pro',\n 'gemini-2.5-pro-001',\n 'gemini-2.5-pro-latest',\n 'gemini-2.5-pro-exp',\n\n 'gemini-2.5-flash',\n 'gemini-2.5-flash-001',\n 'gemini-2.5-flash-latest',\n\n // Gemini 2.0 系列\n 'gemini-2.0-flash',\n 'gemini-2.0-flash-001',\n 'gemini-2.0-flash-latest',\n 'gemini-2.0-flash-exp',\n 'gemini-2.0-flash-lite',\n 'gemini-2.0-flash-thinking-exp',\n 'gemini-2.0-flash-thinking-exp-01-21',\n\n 'gemini-2.0-pro',\n 'gemini-2.0-pro-001',\n 'gemini-2.0-pro-latest',\n 'gemini-2.0-pro-exp',\n 'gemini-2.0-pro-exp-02-05',\n\n 'gemini-2.0-ultra',\n 'gemini-2.0-ultra-001',\n 'gemini-2.0-ultra-latest',\n\n // Gemini 1.5 系列 (旧版)\n 'gemini-1.5-flash',\n 'gemini-1.5-flash-002',\n 'gemini-1.5-flash-8b',\n 'gemini-1.5-flash-8b-latest',\n 'gemini-1.5-flash-8b-001',\n 'gemini-1.5-flash-latest',\n\n 'gemini-1.5-pro',\n 'gemini-1.5-pro-002',\n 'gemini-1.5-pro-latest',\n\n 'gemini-1.5-ultra',\n\n // Gemini 1.0 系列 (旧版)\n 'gemini-1.0-pro',\n 'gemini-1.0-pro-002',\n 'gemini-1.0-pro-vision-latest',\n 'gemini-1.0-pro-vision',\n ];\n\n private _apiKey: string;\n private _baseUrl: string;\n private _defaultParams: Partial<LLMRequest>;\n private _timeout: number;\n private _apiVersion: string;\n\n constructor(config: GeminiConfig) {\n this._apiKey = config.apiKey || '';\n this._baseUrl = config.baseUrl || 'https://generativelanguage.googleapis.com';\n this._defaultParams = config.defaultParams || {};\n this._timeout = config.timeout || 60000;\n this._apiVersion = config.apiVersion || 'v1beta';\n }\n\n validateConfig(): boolean {\n return !!this._apiKey;\n }\n\n private async makeRequest(endpoint: string, body: unknown): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n try {\n const response = await fetch(\n `${this._baseUrl}/${this._apiVersion}/${endpoint}?key=${this._apiKey}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n }\n );\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Gemini API error: ${response.status} - ${error}`);\n }\n\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n async complete(request: LLMRequest): Promise<LLMResponse> {\n const model = request.model || this._defaultParams.model || 'gemini-3.0-flash';\n const body = this.buildRequestBody(request);\n const response = await this.makeRequest(`models/${model}:generateContent`, body);\n const data = await response.json();\n\n return this.parseResponse(data, model);\n }\n\n async *stream(request: LLMRequest): AsyncIterableIterator<LLMStreamChunk> {\n const model = request.model || this._defaultParams.model || 'gemini-3.0-flash';\n const body = this.buildRequestBody(request);\n const response = await this.makeRequest(`models/${model}:streamGenerateContent`, body);\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim()) {\n try {\n const event = JSON.parse(line);\n yield this.parseStreamChunk(event, model);\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n private buildRequestBody(request: LLMRequest): Record<string, unknown> {\n const systemMessage = request.messages.find(m => m.role === 'system');\n const messages = request.messages.filter(m => m.role !== 'system');\n\n const contents = messages.map(msg => ({\n role: msg.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: msg.content }],\n }));\n\n const body: Record<string, unknown> = {\n contents,\n generationConfig: {\n temperature: request.temperature ?? this._defaultParams.temperature ?? 0.7,\n maxOutputTokens: request.max_tokens ?? this._defaultParams.max_tokens ?? 2048,\n topP: request.top_p ?? this._defaultParams.top_p ?? 0.95,\n },\n };\n\n if (systemMessage) {\n body.systemInstruction = {\n parts: [{ text: systemMessage.content }],\n };\n }\n\n if (request.tools) {\n body.tools = [\n {\n functionDeclarations: request.tools.map(tool => ({\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters,\n })),\n },\n ];\n }\n\n return body;\n }\n\n private parseResponse(data: Record<string, unknown>, model: string): LLMResponse {\n const candidates = (data.candidates as Array<Record<string, unknown>>) || [];\n const firstCandidate = candidates[0];\n const content = firstCandidate?.content as Record<string, unknown>;\n const parts = (content?.parts as Array<Record<string, unknown>>) || [];\n const textPart = parts.find(p => p.text);\n\n return {\n id: data.id as string,\n model,\n content: (textPart?.text as string) || '',\n role: 'assistant',\n usage: {\n prompt_tokens: (data.usageMetadata as Record<string, number>)?.promptTokenCount || 0,\n completion_tokens:\n (data.usageMetadata as Record<string, number>)?.candidatesTokenCount || 0,\n total_tokens: (data.usageMetadata as Record<string, number>)?.totalTokenCount || 0,\n },\n finish_reason: firstCandidate?.finishReason === 'STOP' ? 'stop' : 'length',\n };\n }\n\n private parseStreamChunk(event: Record<string, unknown>, model: string): LLMStreamChunk {\n const candidates = (event.candidates as Array<Record<string, unknown>>) || [];\n const firstCandidate = candidates[0];\n const content = firstCandidate?.content as Record<string, unknown>;\n const parts = (content?.parts as Array<Record<string, unknown>>) || [];\n const textPart = parts.find(p => p.text);\n\n return {\n id: event.id as string,\n model,\n delta: {\n content: textPart?.text as string | undefined,\n },\n finish_reason: firstCandidate?.finishReason === 'STOP' ? 'stop' : undefined,\n };\n }\n}\n\n// Register provider\nimport { globalProviderRegistry } from '../provider';\nglobalProviderRegistry.register(\n 'gemini',\n (config: LLMProviderConfigType) => new GeminiProvider(config as GeminiConfig)\n);\n","/**\n * Moonshot (月之暗面) Provider Implementation\n * API: https://platform.moonshot.cn\n */\n\nimport {\n LLMProvider,\n LLMProviderConfig,\n LLMRequest,\n LLMResponse,\n LLMStreamChunk,\n} from '../provider';\n\nexport interface MoonshotConfig extends LLMProviderConfig {}\n\nexport class MoonshotProvider implements LLMProvider {\n readonly name = 'moonshot';\n readonly supportedModels = [\n // Kimi K2.5 系列 (最新旗舰)\n 'kimi-k2.5',\n 'kimi-k2.5-20250128',\n 'kimi-k2.5-latest',\n\n // Kimi K2 系列\n 'kimi-k2',\n 'kimi-k2-20250128',\n 'kimi-k2-latest',\n\n // Kimi K1.5 系列\n 'kimi-k1.5',\n 'kimi-k1.5-20250128',\n 'kimi-k1.5-latest',\n\n // Kimi K1 系列\n 'kimi-k1',\n 'kimi-k1-20250128',\n 'kimi-k1-latest',\n\n // Kimi 标准系列\n 'kimi-latest',\n 'kimi-2025-01-28',\n\n // 上下文长度版本\n 'moonshot-v1-128k',\n 'moonshot-v1-32k',\n 'moonshot-v1-8k',\n ];\n\n private _apiKey: string;\n private _baseUrl: string;\n private _defaultParams: Partial<LLMRequest>;\n private _timeout: number;\n\n constructor(config: MoonshotConfig) {\n this._apiKey = config.apiKey || '';\n this._baseUrl = config.baseUrl || 'https://api.moonshot.cn/v1';\n this._defaultParams = config.defaultParams || {};\n this._timeout = config.timeout || 60000;\n }\n\n validateConfig(): boolean {\n return !!this._apiKey;\n }\n\n private async makeRequest(endpoint: string, body: unknown): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n try {\n const response = await fetch(`${this._baseUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this._apiKey}`,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Moonshot API error: ${response.status} - ${error}`);\n }\n\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n async complete(request: LLMRequest): Promise<LLMResponse> {\n const body = this.buildRequestBody(request);\n const response = await this.makeRequest('/chat/completions', body);\n const data = await response.json();\n\n return this.parseResponse(data);\n }\n\n async *stream(request: LLMRequest): AsyncIterableIterator<LLMStreamChunk> {\n const body = this.buildRequestBody(request, true);\n const response = await this.makeRequest('/chat/completions', body);\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data);\n yield this.parseStreamChunk(chunk);\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n private buildRequestBody(request: LLMRequest, stream = false): Record<string, unknown> {\n return {\n model: request.model || this._defaultParams.model || 'kimi-k2.5',\n messages: request.messages,\n temperature: request.temperature ?? this._defaultParams.temperature ?? 0.7,\n max_tokens: request.max_tokens ?? this._defaultParams.max_tokens ?? 4096,\n top_p: request.top_p ?? this._defaultParams.top_p ?? 1,\n stream,\n };\n }\n\n private parseResponse(data: Record<string, unknown>): LLMResponse {\n const choice = (data.choices as Record<string, unknown>[])[0];\n const message = choice.message as Record<string, unknown>;\n\n return {\n id: data.id as string,\n model: data.model as string,\n content: (message.content as string) || '',\n role: 'assistant',\n usage: data.usage as LLMResponse['usage'],\n finish_reason: choice.finish_reason as LLMResponse['finish_reason'],\n };\n }\n\n private parseStreamChunk(data: Record<string, unknown>): LLMStreamChunk {\n const choice = (data.choices as Record<string, unknown>[])[0];\n const delta = choice.delta as Record<string, unknown>;\n\n return {\n id: data.id as string,\n model: data.model as string,\n delta: {\n content: delta.content as string | undefined,\n role: delta.role as 'assistant' | undefined,\n },\n finish_reason: choice.finish_reason as LLMStreamChunk['finish_reason'],\n };\n }\n}\n\n// Register provider\nimport { globalProviderRegistry } from '../provider';\nglobalProviderRegistry.register(\n 'moonshot',\n (config: LLMProviderConfig) => new MoonshotProvider(config as MoonshotConfig)\n);\n","/**\n * MiniMax Provider Implementation\n * API: https://platform.minimaxi.com\n */\n\nimport {\n LLMProvider,\n LLMProviderConfig,\n LLMRequest,\n LLMResponse,\n LLMStreamChunk,\n} from '../provider';\n\nexport interface MiniMaxConfig extends LLMProviderConfig {\n groupId?: string;\n}\n\nexport class MiniMaxProvider implements LLMProvider {\n readonly name = 'minimax';\n readonly supportedModels = [\n // MiniMax-Text-01 系列 (最新)\n 'MiniMax-Text-01',\n 'MiniMax-Text-01-20250128',\n 'MiniMax-Text-01-latest',\n\n // MiniMax-01 系列\n 'MiniMax-01',\n 'MiniMax-01-20250128',\n 'MiniMax-01-latest',\n\n // abab6.5 系列\n 'abab6.5',\n 'abab6.5-20250128',\n 'abab6.5-latest',\n 'abab6.5s',\n 'abab6.5s-20250128',\n\n // abab6 系列\n 'abab6',\n 'abab6-20250128',\n 'abab6-latest',\n\n // abab5.5 系列\n 'abab5.5',\n 'abab5.5-20250128',\n 'abab5.5-latest',\n 'abab5.5s',\n 'abab5.5s-20250128',\n\n // abab5 系列\n 'abab5',\n 'abab5-20250128',\n ];\n\n private _apiKey: string;\n private _groupId: string;\n private _baseUrl: string;\n private _defaultParams: Partial<LLMRequest>;\n private _timeout: number;\n\n constructor(config: MiniMaxConfig) {\n this._apiKey = config.apiKey || '';\n this._groupId = config.groupId || '';\n this._baseUrl = config.baseUrl || 'https://api.minimaxi.com/v1';\n this._defaultParams = config.defaultParams || {};\n this._timeout = config.timeout || 60000;\n }\n\n validateConfig(): boolean {\n return !!this._apiKey && !!this._groupId;\n }\n\n private async makeRequest(endpoint: string, body: unknown): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n try {\n const response = await fetch(`${this._baseUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this._apiKey}`,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`MiniMax API error: ${response.status} - ${error}`);\n }\n\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n async complete(request: LLMRequest): Promise<LLMResponse> {\n const body = this.buildRequestBody(request);\n const response = await this.makeRequest('/text/chatcompletion_v2', body);\n const data = await response.json();\n\n return this.parseResponse(data);\n }\n\n async *stream(request: LLMRequest): AsyncIterableIterator<LLMStreamChunk> {\n const body = this.buildRequestBody(request, true);\n const response = await this.makeRequest('/text/chatcompletion_v2', body);\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data);\n yield this.parseStreamChunk(chunk);\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n private buildRequestBody(request: LLMRequest, stream = false): Record<string, unknown> {\n return {\n model: request.model || this._defaultParams.model || 'MiniMax-Text-01',\n messages: request.messages,\n temperature: request.temperature ?? this._defaultParams.temperature ?? 0.7,\n max_tokens: request.max_tokens ?? this._defaultParams.max_tokens ?? 4096,\n top_p: request.top_p ?? this._defaultParams.top_p ?? 1,\n stream,\n };\n }\n\n private parseResponse(data: Record<string, unknown>): LLMResponse {\n const choice = (data.choices as Record<string, unknown>[])[0];\n const message = choice.message as Record<string, unknown>;\n\n return {\n id: data.id as string,\n model: data.model as string,\n content: (message.content as string) || '',\n role: 'assistant',\n usage: data.usage as LLMResponse['usage'],\n finish_reason: choice.finish_reason as LLMResponse['finish_reason'],\n };\n }\n\n private parseStreamChunk(data: Record<string, unknown>): LLMStreamChunk {\n const choice = (data.choices as Record<string, unknown>[])[0];\n const delta = choice.delta as Record<string, unknown>;\n\n return {\n id: data.id as string,\n model: data.model as string,\n delta: {\n content: delta.content as string | undefined,\n role: delta.role as 'assistant' | undefined,\n },\n finish_reason: choice.finish_reason as LLMStreamChunk['finish_reason'],\n };\n }\n}\n\n// Register provider\nimport { globalProviderRegistry } from '../provider';\nglobalProviderRegistry.register(\n 'minimax',\n (config: LLMProviderConfig) => new MiniMaxProvider(config as MiniMaxConfig)\n);\n","/**\n * Zhipu AI (智谱AI) Provider Implementation\n * API: https://open.bigmodel.cn\n */\n\nimport {\n LLMProvider,\n LLMProviderConfig,\n LLMRequest,\n LLMResponse,\n LLMStreamChunk,\n} from '../provider';\n\nexport interface ZhipuConfig extends LLMProviderConfig {}\n\nexport class ZhipuProvider implements LLMProvider {\n readonly name = 'zhipu';\n readonly supportedModels = [\n // GLM-4.5 系列 (最新)\n 'glm-4.5',\n 'glm-4.5-20250128',\n 'glm-4.5-latest',\n\n // GLM-4 系列\n 'glm-4',\n 'glm-4-20250128',\n 'glm-4-latest',\n 'glm-4-plus',\n 'glm-4-plus-20250128',\n 'glm-4-flash',\n 'glm-4-flash-20250128',\n 'glm-4-air',\n 'glm-4-air-20250128',\n 'glm-4-airx',\n 'glm-4-airx-20250128',\n 'glm-4-long',\n 'glm-4-long-20250128',\n 'glm-4-alltools',\n 'glm-4-alltools-20250128',\n\n // GLM-3 系列\n 'glm-3-turbo',\n 'glm-3-turbo-20250128',\n 'glm-3-turbo-latest',\n\n // ChatGLM3 系列\n 'chatglm3-6b',\n 'chatglm3-6b-32k',\n\n // 代码模型\n 'codegeex-4',\n 'codegeex-4-20250128',\n\n // 视觉模型\n 'glm-4v',\n 'glm-4v-20250128',\n 'glm-4v-plus',\n 'glm-4v-plus-20250128',\n\n // 嵌入模型\n 'embedding-3',\n 'embedding-2',\n ];\n\n private _apiKey: string;\n private _baseUrl: string;\n private _defaultParams: Partial<LLMRequest>;\n private _timeout: number;\n\n constructor(config: ZhipuConfig) {\n this._apiKey = config.apiKey || '';\n this._baseUrl = config.baseUrl || 'https://open.bigmodel.cn/api/paas/v4';\n this._defaultParams = config.defaultParams || {};\n this._timeout = config.timeout || 60000;\n }\n\n validateConfig(): boolean {\n return !!this._apiKey;\n }\n\n private async makeRequest(endpoint: string, body: unknown): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n try {\n const response = await fetch(`${this._baseUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this._apiKey}`,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Zhipu API error: ${response.status} - ${error}`);\n }\n\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n async complete(request: LLMRequest): Promise<LLMResponse> {\n const body = this.buildRequestBody(request);\n const response = await this.makeRequest('/chat/completions', body);\n const data = await response.json();\n\n return this.parseResponse(data);\n }\n\n async *stream(request: LLMRequest): AsyncIterableIterator<LLMStreamChunk> {\n const body = this.buildRequestBody(request, true);\n const response = await this.makeRequest('/chat/completions', body);\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data);\n yield this.parseStreamChunk(chunk);\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n private buildRequestBody(request: LLMRequest, stream = false): Record<string, unknown> {\n return {\n model: request.model || this._defaultParams.model || 'glm-4.5',\n messages: request.messages,\n temperature: request.temperature ?? this._defaultParams.temperature ?? 0.7,\n max_tokens: request.max_tokens ?? this._defaultParams.max_tokens ?? 4096,\n top_p: request.top_p ?? this._defaultParams.top_p ?? 1,\n stream,\n };\n }\n\n private parseResponse(data: Record<string, unknown>): LLMResponse {\n const choice = (data.choices as Record<string, unknown>[])[0];\n const message = choice.message as Record<string, unknown>;\n\n return {\n id: data.id as string,\n model: data.model as string,\n content: (message.content as string) || '',\n role: 'assistant',\n usage: data.usage as LLMResponse['usage'],\n finish_reason: choice.finish_reason as LLMResponse['finish_reason'],\n };\n }\n\n private parseStreamChunk(data: Record<string, unknown>): LLMStreamChunk {\n const choice = (data.choices as Record<string, unknown>[])[0];\n const delta = choice.delta as Record<string, unknown>;\n\n return {\n id: data.id as string,\n model: data.model as string,\n delta: {\n content: delta.content as string | undefined,\n role: delta.role as 'assistant' | undefined,\n },\n finish_reason: choice.finish_reason as LLMStreamChunk['finish_reason'],\n };\n }\n}\n\n// Register provider\nimport { globalProviderRegistry } from '../provider';\nglobalProviderRegistry.register(\n 'zhipu',\n (config: LLMProviderConfig) => new ZhipuProvider(config as ZhipuConfig)\n);\n","/**\n * Qwen (通义千问) Provider Implementation\n * API: https://dashscope.aliyun.com\n * Updated with latest Qwen3 series models (2025)\n */\n\nimport {\n LLMProvider,\n LLMProviderConfig,\n LLMRequest,\n LLMResponse,\n LLMStreamChunk,\n} from '../provider';\n\nexport interface QwenConfig extends LLMProviderConfig {}\n\nexport class QwenProvider implements LLMProvider {\n readonly name = 'qwen';\n readonly supportedModels = [\n // Qwen3 Max 系列 (最新旗舰)\n 'qwen3-max',\n 'qwen3-max-2026-01-23',\n 'qwen3-max-2025-09-23',\n 'qwen3-max-latest',\n 'qwen3-max-preview',\n\n // Qwen3 Plus 系列\n 'qwen3-plus',\n 'qwen3-plus-2025-12-01',\n 'qwen3-plus-2025-09-11',\n 'qwen3-plus-2025-07-28',\n 'qwen3-plus-2025-07-14',\n 'qwen3-plus-2025-04-28',\n 'qwen3-plus-latest',\n\n // Qwen3 Flash 系列\n 'qwen3-flash',\n 'qwen3-flash-2025-07-28',\n 'qwen3-flash-latest',\n\n // Qwen3 Omni 系列 (多模态)\n 'qwen3-omni-flash',\n 'qwen3-omni-flash-2025-12-01',\n 'qwen3-omni-flash-2025-09-15',\n 'qwen3-omni-flash-realtime',\n 'qwen3-omni-flash-realtime-2025-12-01',\n 'qwen3-omni-flash-realtime-2025-09-15',\n\n // Qwen3 VL 系列 (视觉)\n 'qwen3-vl-plus',\n 'qwen3-vl-plus-2025-12-19',\n 'qwen3-vl-plus-2025-09-23',\n 'qwen3-vl-flash',\n 'qwen3-vl-flash-2026-01-22',\n 'qwen3-vl-flash-2025-10-15',\n\n // Qwen Max 系列 (旧版)\n 'qwen-max',\n 'qwen-max-2025-01-25',\n 'qwen-max-2024-09-19',\n 'qwen-max-latest',\n\n // Qwen Plus 系列 (旧版)\n 'qwen-plus',\n 'qwen-plus-2025-01-25',\n 'qwen-plus-2025-01-12',\n 'qwen-plus-2024-12-20',\n 'qwen-plus-2024-11-27',\n 'qwen-plus-2024-11-25',\n 'qwen-plus-2024-09-19',\n 'qwen-plus-2024-08-06',\n 'qwen-plus-2024-07-23',\n 'qwen-plus-latest',\n\n // Qwen Turbo 系列 (旧版)\n 'qwen-turbo',\n 'qwen-turbo-2025-04-28',\n 'qwen-turbo-2025-02-11',\n 'qwen-turbo-2024-11-01',\n 'qwen-turbo-2024-09-19',\n 'qwen-turbo-2024-06-24',\n 'qwen-turbo-latest',\n\n // Qwen Long 系列 (长上下文)\n 'qwen-long',\n 'qwen-long-2025-01-25',\n 'qwen-long-latest',\n\n // QwQ 推理模型\n 'qwq-plus',\n 'qwq-plus-2025-05-15',\n 'qwq-plus-2025-03-05',\n 'qwq-plus-latest',\n\n // QVQ 视觉推理\n 'qvq-max',\n 'qvq-max-2025-05-15',\n 'qvq-max-2025-03-25',\n 'qvq-plus',\n 'qvq-plus-2025-05-15',\n\n // Qwen VL 系列 (视觉旧版)\n 'qwen-vl-max',\n 'qwen-vl-max-2025-08-13',\n 'qwen-vl-max-2025-04-08',\n 'qwen-vl-max-2025-04-02',\n 'qwen-vl-max-2025-01-25',\n 'qwen-vl-max-2024-12-30',\n 'qwen-vl-max-2024-11-19',\n 'qwen-vl-max-2024-10-30',\n 'qwen-vl-max-2024-08-09',\n 'qwen-vl-max-latest',\n\n 'qwen-vl-plus',\n 'qwen-vl-plus-2025-08-15',\n 'qwen-vl-plus-2025-07-10',\n 'qwen-vl-plus-2025-05-07',\n 'qwen-vl-plus-2025-01-25',\n 'qwen-vl-plus-2025-01-02',\n 'qwen-vl-plus-2024-08-09',\n 'qwen-vl-plus-latest',\n\n // Qwen OCR\n 'qwen-vl-ocr',\n 'qwen-vl-ocr-2025-11-20',\n 'qwen-vl-ocr-2025-08-28',\n 'qwen-vl-ocr-2025-04-13',\n 'qwen-vl-ocr-2024-10-28',\n 'qwen-vl-ocr-latest',\n\n // Qwen Audio\n 'qwen-audio-turbo',\n 'qwen-audio-turbo-2024-12-04',\n 'qwen-audio-turbo-2024-08-07',\n 'qwen-audio-turbo-latest',\n\n // 嵌入模型\n 'text-embedding-v3',\n 'text-embedding-v2',\n 'text-embedding-v1',\n ];\n\n private _apiKey: string;\n private _baseUrl: string;\n private _defaultParams: Partial<LLMRequest>;\n private _timeout: number;\n\n constructor(config: QwenConfig) {\n this._apiKey = config.apiKey || '';\n this._baseUrl = config.baseUrl || 'https://dashscope.aliyuncs.com/api/v1';\n this._defaultParams = config.defaultParams || {};\n this._timeout = config.timeout || 60000;\n }\n\n validateConfig(): boolean {\n return !!this._apiKey;\n }\n\n private async makeRequest(endpoint: string, body: unknown): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n try {\n const response = await fetch(`${this._baseUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this._apiKey}`,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Qwen API error: ${response.status} - ${error}`);\n }\n\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n async complete(request: LLMRequest): Promise<LLMResponse> {\n const body = this.buildRequestBody(request);\n const response = await this.makeRequest('/services/aigc/text-generation/generation', body);\n const data = await response.json();\n\n return this.parseResponse(data);\n }\n\n async *stream(request: LLMRequest): AsyncIterableIterator<LLMStreamChunk> {\n const body = this.buildRequestBody(request, true);\n const response = await this.makeRequest('/services/aigc/text-generation/generation', body);\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data);\n yield this.parseStreamChunk(chunk);\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n private buildRequestBody(request: LLMRequest, _stream = false): Record<string, unknown> {\n return {\n model: request.model || this._defaultParams.model || 'qwen3-max',\n input: {\n messages: request.messages,\n },\n parameters: {\n temperature: request.temperature ?? this._defaultParams.temperature ?? 0.7,\n max_tokens: request.max_tokens ?? this._defaultParams.max_tokens ?? 4096,\n top_p: request.top_p ?? this._defaultParams.top_p ?? 1,\n result_format: 'message',\n },\n };\n }\n\n private parseResponse(data: Record<string, unknown>): LLMResponse {\n const output = data.output as Record<string, unknown>;\n const choice = (output.choices as Record<string, unknown>[])[0];\n const message = choice.message as Record<string, unknown>;\n const usage = data.usage as Record<string, number>;\n\n return {\n id: data.request_id as string,\n model: data.model as string,\n content: (message.content as string) || '',\n role: 'assistant',\n usage: {\n prompt_tokens: usage?.input_tokens || 0,\n completion_tokens: usage?.output_tokens || 0,\n total_tokens: (usage?.input_tokens || 0) + (usage?.output_tokens || 0),\n },\n finish_reason: choice.finish_reason as LLMResponse['finish_reason'],\n };\n }\n\n private parseStreamChunk(data: Record<string, unknown>): LLMStreamChunk {\n const output = data.output as Record<string, unknown>;\n const choice = (output.choices as Record<string, unknown>[])[0];\n const message = choice.message as Record<string, unknown>;\n\n return {\n id: data.request_id as string,\n model: data.model as string,\n delta: {\n content: message.content as string | undefined,\n role: message.role as 'assistant' | undefined,\n },\n finish_reason: choice.finish_reason as LLMStreamChunk['finish_reason'],\n };\n }\n}\n\n// Register provider\nimport { globalProviderRegistry } from '../provider';\nglobalProviderRegistry.register(\n 'qwen',\n (config: LLMProviderConfig) => new QwenProvider(config as QwenConfig)\n);\n","/**\n * DeepSeek Provider Implementation\n * API: https://platform.deepseek.com\n * Updated with latest DeepSeek-V3.2 models (2025)\n */\n\nimport {\n LLMProvider,\n LLMProviderConfig,\n LLMRequest,\n LLMResponse,\n LLMStreamChunk,\n} from '../provider';\n\nexport interface DeepSeekConfig extends LLMProviderConfig {}\n\nexport class DeepSeekProvider implements LLMProvider {\n readonly name = 'deepseek';\n readonly supportedModels = [\n // DeepSeek-V3.2 系列 (最新)\n 'deepseek-v3.2',\n 'deepseek-v3.2-20251201',\n 'deepseek-v3.2-latest',\n\n 'deepseek-v3.2-exp',\n 'deepseek-v3.2-exp-20250929',\n\n // DeepSeek-V3.1 系列\n 'deepseek-v3.1',\n 'deepseek-v3.1-20250922',\n 'deepseek-v3.1-20250821',\n 'deepseek-v3.1-latest',\n\n // DeepSeek-V3 系列\n 'deepseek-v3',\n 'deepseek-v3-20250325',\n 'deepseek-v3-20241226',\n 'deepseek-v3-latest',\n\n // DeepSeek-R1 系列 (推理模型)\n 'deepseek-r1',\n 'deepseek-r1-20250528',\n 'deepseek-r1-20250120',\n 'deepseek-r1-latest',\n\n // DeepSeek-R1-Lite 系列\n 'deepseek-r1-lite',\n 'deepseek-r1-lite-20241120',\n 'deepseek-r1-lite-latest',\n\n // DeepSeek-V2.5 系列\n 'deepseek-v2.5',\n 'deepseek-v2.5-1210',\n 'deepseek-v2.5-20240905',\n 'deepseek-v2.5-latest',\n\n // DeepSeek-V2 系列\n 'deepseek-v2',\n 'deepseek-v2-20250128',\n 'deepseek-v2-20240802',\n 'deepseek-v2-latest',\n\n // DeepSeek-Coder-V2 系列\n 'deepseek-coder-v2',\n 'deepseek-coder-v2-20250128',\n 'deepseek-coder-v2-20240725',\n 'deepseek-coder-v2-latest',\n\n // DeepSeek-Coder 系列\n 'deepseek-coder',\n 'deepseek-coder-20250128',\n 'deepseek-coder-6.7b',\n 'deepseek-coder-33b',\n 'deepseek-coder-latest',\n\n // 别名 (API 兼容)\n 'deepseek-chat',\n 'deepseek-reasoner',\n ];\n\n private _apiKey: string;\n private _baseUrl: string;\n private _defaultParams: Partial<LLMRequest>;\n private _timeout: number;\n\n constructor(config: DeepSeekConfig) {\n this._apiKey = config.apiKey || '';\n this._baseUrl = config.baseUrl || 'https://api.deepseek.com';\n this._defaultParams = config.defaultParams || {};\n this._timeout = config.timeout || 60000;\n }\n\n validateConfig(): boolean {\n return !!this._apiKey;\n }\n\n private async makeRequest(endpoint: string, body: unknown): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n try {\n const response = await fetch(`${this._baseUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this._apiKey}`,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`DeepSeek API error: ${response.status} - ${error}`);\n }\n\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n async complete(request: LLMRequest): Promise<LLMResponse> {\n const body = this.buildRequestBody(request);\n const response = await this.makeRequest('/chat/completions', body);\n const data = await response.json();\n\n return this.parseResponse(data);\n }\n\n async *stream(request: LLMRequest): AsyncIterableIterator<LLMStreamChunk> {\n const body = this.buildRequestBody(request, true);\n const response = await this.makeRequest('/chat/completions', body);\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data);\n yield this.parseStreamChunk(chunk);\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n private buildRequestBody(request: LLMRequest, stream = false): Record<string, unknown> {\n return {\n model: request.model || this._defaultParams.model || 'deepseek-v3.2',\n messages: request.messages,\n temperature: request.temperature ?? this._defaultParams.temperature ?? 0.7,\n max_tokens: request.max_tokens ?? this._defaultParams.max_tokens ?? 4096,\n top_p: request.top_p ?? this._defaultParams.top_p ?? 1,\n stream,\n };\n }\n\n private parseResponse(data: Record<string, unknown>): LLMResponse {\n const choice = (data.choices as Record<string, unknown>[])[0];\n const message = choice.message as Record<string, unknown>;\n\n return {\n id: data.id as string,\n model: data.model as string,\n content: (message.content as string) || '',\n role: 'assistant',\n usage: data.usage as LLMResponse['usage'],\n finish_reason: choice.finish_reason as LLMResponse['finish_reason'],\n };\n }\n\n private parseStreamChunk(data: Record<string, unknown>): LLMStreamChunk {\n const choice = (data.choices as Record<string, unknown>[])[0];\n const delta = choice.delta as Record<string, unknown>;\n\n return {\n id: data.id as string,\n model: data.model as string,\n delta: {\n content: delta.content as string | undefined,\n role: delta.role as 'assistant' | undefined,\n },\n finish_reason: choice.finish_reason as LLMStreamChunk['finish_reason'],\n };\n }\n}\n\n// Register provider\nimport { globalProviderRegistry } from '../provider';\nglobalProviderRegistry.register(\n 'deepseek',\n (config: LLMProviderConfig) => new DeepSeekProvider(config as DeepSeekConfig)\n);\n","/**\n * Doubao (豆包) Provider Implementation\n * API: https://console.volcengine.com/ark\n * Updated with latest Doubao 1.8 series models (2025)\n */\n\nimport {\n LLMProvider,\n LLMProviderConfig,\n LLMRequest,\n LLMResponse,\n LLMStreamChunk,\n} from '../provider';\n\nexport interface DoubaoConfig extends LLMProviderConfig {\n region?: string;\n}\n\nexport class DoubaoProvider implements LLMProvider {\n readonly name = 'doubao';\n readonly supportedModels = [\n // Doubao 1.8 系列 (最新)\n 'doubao-1.8-pro-32k',\n 'doubao-1.8-pro-32k-20250128',\n 'doubao-1.8-pro-32k-latest',\n\n 'doubao-1.8-pro-256k',\n 'doubao-1.8-pro-256k-20250128',\n 'doubao-1.8-pro-256k-latest',\n\n 'doubao-1.8-lite-32k',\n 'doubao-1.8-lite-32k-20250128',\n 'doubao-1.8-lite-32k-latest',\n\n 'doubao-1.8-vision-pro-32k',\n 'doubao-1.8-vision-pro-32k-20250128',\n 'doubao-1.8-vision-pro-32k-latest',\n\n // Doubao 1.5 系列\n 'doubao-1.5-pro-32k',\n 'doubao-1.5-pro-32k-20250128',\n 'doubao-1.5-pro-32k-latest',\n\n 'doubao-1.5-pro-256k',\n 'doubao-1.5-pro-256k-20250128',\n 'doubao-1.5-pro-256k-latest',\n\n 'doubao-1.5-lite-32k',\n 'doubao-1.5-lite-32k-20250128',\n 'doubao-1.5-lite-32k-latest',\n\n 'doubao-1.5-vision-pro-32k',\n 'doubao-1.5-vision-pro-32k-20250128',\n 'doubao-1.5-vision-pro-32k-latest',\n\n // Doubao Pro 系列\n 'doubao-pro-4k',\n 'doubao-pro-4k-20250128',\n 'doubao-pro-4k-latest',\n\n 'doubao-pro-32k',\n 'doubao-pro-32k-20250128',\n 'doubao-pro-32k-latest',\n\n 'doubao-pro-128k',\n 'doubao-pro-128k-20250128',\n 'doubao-pro-128k-latest',\n\n 'doubao-pro-256k',\n 'doubao-pro-256k-20250128',\n 'doubao-pro-256k-latest',\n\n // Doubao Lite 系列\n 'doubao-lite-4k',\n 'doubao-lite-4k-20250128',\n 'doubao-lite-4k-latest',\n\n 'doubao-lite-32k',\n 'doubao-lite-32k-20250128',\n 'doubao-lite-32k-latest',\n\n 'doubao-lite-128k',\n 'doubao-lite-128k-20250128',\n 'doubao-lite-128k-latest',\n\n // Doubao Vision 系列\n 'doubao-vision-lite-32k',\n 'doubao-vision-lite-32k-20250128',\n 'doubao-vision-lite-32k-latest',\n\n 'doubao-vision-pro-32k',\n 'doubao-vision-pro-32k-20250128',\n 'doubao-vision-pro-32k-latest',\n\n // 角色扮演系列\n 'doubao-character-pro-32k',\n 'doubao-character-pro-32k-20250128',\n 'doubao-character-pro-32k-latest',\n\n 'doubao-character-lite-32k',\n 'doubao-character-lite-32k-20250128',\n 'doubao-character-lite-32k-latest',\n\n // 语音模型\n 'doubao-asr',\n 'doubao-tts',\n\n // 嵌入模型\n 'doubao-embedding',\n 'doubao-embedding-large',\n ];\n\n private _apiKey: string;\n private _baseUrl: string;\n private _defaultParams: Partial<LLMRequest>;\n private _timeout: number;\n\n constructor(config: DoubaoConfig) {\n this._apiKey = config.apiKey || '';\n this._baseUrl = config.baseUrl || 'https://ark.cn-beijing.volces.com/api/v3';\n this._defaultParams = config.defaultParams || {};\n this._timeout = config.timeout || 60000;\n }\n\n validateConfig(): boolean {\n return !!this._apiKey;\n }\n\n private async makeRequest(endpoint: string, body: unknown): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n try {\n const response = await fetch(`${this._baseUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this._apiKey}`,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Doubao API error: ${response.status} - ${error}`);\n }\n\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n async complete(request: LLMRequest): Promise<LLMResponse> {\n const body = this.buildRequestBody(request);\n const response = await this.makeRequest('/chat/completions', body);\n const data = await response.json();\n\n return this.parseResponse(data);\n }\n\n async *stream(request: LLMRequest): AsyncIterableIterator<LLMStreamChunk> {\n const body = this.buildRequestBody(request, true);\n const response = await this.makeRequest('/chat/completions', body);\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data);\n yield this.parseStreamChunk(chunk);\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n private buildRequestBody(request: LLMRequest, stream = false): Record<string, unknown> {\n return {\n model: request.model || this._defaultParams.model || 'doubao-1.8-pro-32k',\n messages: request.messages,\n temperature: request.temperature ?? this._defaultParams.temperature ?? 0.7,\n max_tokens: request.max_tokens ?? this._defaultParams.max_tokens ?? 4096,\n top_p: request.top_p ?? this._defaultParams.top_p ?? 1,\n stream,\n };\n }\n\n private parseResponse(data: Record<string, unknown>): LLMResponse {\n const choice = (data.choices as Record<string, unknown>[])[0];\n const message = choice.message as Record<string, unknown>;\n\n return {\n id: data.id as string,\n model: data.model as string,\n content: (message.content as string) || '',\n role: 'assistant',\n usage: data.usage as LLMResponse['usage'],\n finish_reason: choice.finish_reason as LLMResponse['finish_reason'],\n };\n }\n\n private parseStreamChunk(data: Record<string, unknown>): LLMStreamChunk {\n const choice = (data.choices as Record<string, unknown>[])[0];\n const delta = choice.delta as Record<string, unknown>;\n\n return {\n id: data.id as string,\n model: data.model as string,\n delta: {\n content: delta.content as string | undefined,\n role: delta.role as 'assistant' | undefined,\n },\n finish_reason: choice.finish_reason as LLMStreamChunk['finish_reason'],\n };\n }\n}\n\n// Register provider\nimport { globalProviderRegistry } from '../provider';\nglobalProviderRegistry.register(\n 'doubao',\n (config: LLMProviderConfig) => new DoubaoProvider(config as DoubaoConfig)\n);\n"],"mappings":"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","names":[]}
@@ -0,0 +1,166 @@
1
+ // src/skills/registry.ts
2
+ var SkillRegistry = class {
3
+ skills = /* @__PURE__ */ new Map();
4
+ categories = /* @__PURE__ */ new Map();
5
+ constructor(_config = {}) {
6
+ void _config;
7
+ }
8
+ register(skill) {
9
+ this.skills.set(skill.name, skill);
10
+ if (skill.metadata?.category) {
11
+ const category = skill.metadata.category;
12
+ if (!this.categories.has(category)) {
13
+ this.categories.set(category, /* @__PURE__ */ new Set());
14
+ }
15
+ this.categories.get(category).add(skill.name);
16
+ }
17
+ }
18
+ unregister(name) {
19
+ const skill = this.skills.get(name);
20
+ if (!skill) return false;
21
+ if (skill.metadata?.category) {
22
+ this.categories.get(skill.metadata.category)?.delete(name);
23
+ }
24
+ return this.skills.delete(name);
25
+ }
26
+ get(name) {
27
+ return this.skills.get(name);
28
+ }
29
+ has(name) {
30
+ return this.skills.has(name);
31
+ }
32
+ list() {
33
+ return Array.from(this.skills.values());
34
+ }
35
+ listNames() {
36
+ return Array.from(this.skills.keys());
37
+ }
38
+ findByCategory(category) {
39
+ const names = this.categories.get(category);
40
+ if (!names) return [];
41
+ return Array.from(names).map((name) => this.skills.get(name)).filter((skill) => skill !== void 0);
42
+ }
43
+ findByTag(tag) {
44
+ return this.list().filter((skill) => skill.metadata?.tags?.includes(tag));
45
+ }
46
+ search(query) {
47
+ const lowerQuery = query.toLowerCase();
48
+ return this.list().filter(
49
+ (skill) => skill.name.toLowerCase().includes(lowerQuery) || skill.description.toLowerCase().includes(lowerQuery) || skill.metadata?.tags?.some((tag) => tag.toLowerCase().includes(lowerQuery))
50
+ );
51
+ }
52
+ async execute(name, params2, context) {
53
+ const skill = this.skills.get(name);
54
+ if (!skill) {
55
+ return { success: false, error: `Skill '${name}' not found in registry` };
56
+ }
57
+ return skill.handler(params2, context);
58
+ }
59
+ clear() {
60
+ this.skills.clear();
61
+ this.categories.clear();
62
+ }
63
+ getCategories() {
64
+ return Array.from(this.categories.keys());
65
+ }
66
+ getStats() {
67
+ return {
68
+ total: this.skills.size,
69
+ categories: this.categories.size
70
+ };
71
+ }
72
+ };
73
+
74
+ // src/skills/builtin.ts
75
+ var echoSkill = {
76
+ name: "echo",
77
+ description: "Echo back the input message",
78
+ parameters: {
79
+ type: "object",
80
+ properties: {
81
+ message: {
82
+ type: "string",
83
+ description: "The message to echo"
84
+ }
85
+ },
86
+ required: ["message"]
87
+ },
88
+ handler: async (params2) => ({
89
+ success: true,
90
+ data: params2.message
91
+ }),
92
+ metadata: {
93
+ category: "utility",
94
+ tags: ["debug", "test"],
95
+ version: "1.0.0"
96
+ }
97
+ };
98
+ var mathSkill = {
99
+ name: "math",
100
+ description: "Perform mathematical calculations",
101
+ parameters: {
102
+ type: "object",
103
+ properties: {
104
+ expression: {
105
+ type: "string",
106
+ description: "Mathematical expression to evaluate"
107
+ }
108
+ },
109
+ required: ["expression"]
110
+ },
111
+ handler: async (params) => {
112
+ try {
113
+ const expression = String(params.expression);
114
+ const sanitized = expression.replace(/[^0-9+\-*/().\s]/g, "");
115
+ const result = eval(sanitized);
116
+ return { success: true, data: result };
117
+ } catch (error) {
118
+ return {
119
+ success: false,
120
+ error: error instanceof Error ? error.message : "Invalid expression"
121
+ };
122
+ }
123
+ },
124
+ metadata: {
125
+ category: "utility",
126
+ tags: ["math", "calculation"],
127
+ version: "1.0.0"
128
+ }
129
+ };
130
+ var listSkillsSkill = {
131
+ name: "list_skills",
132
+ description: "List all available skills",
133
+ parameters: {
134
+ type: "object",
135
+ properties: {
136
+ category: {
137
+ type: "string",
138
+ description: "Filter by category"
139
+ }
140
+ }
141
+ },
142
+ handler: async (_params, context) => {
143
+ const skills = context.agent.getAllSkills().map((skill) => ({
144
+ name: skill.name,
145
+ description: skill.description,
146
+ category: skill.metadata?.category,
147
+ tags: skill.metadata?.tags
148
+ }));
149
+ return { success: true, data: skills };
150
+ },
151
+ metadata: {
152
+ category: "meta",
153
+ tags: ["introspection"],
154
+ version: "1.0.0"
155
+ }
156
+ };
157
+ var builtInSkills = [echoSkill, mathSkill, listSkillsSkill];
158
+
159
+ export {
160
+ SkillRegistry,
161
+ echoSkill,
162
+ mathSkill,
163
+ listSkillsSkill,
164
+ builtInSkills
165
+ };
166
+ //# sourceMappingURL=chunk-6AYIRBGI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/skills/registry.ts","../src/skills/builtin.ts"],"sourcesContent":["/**\n * Skill Registry for managing and discovering skills\n */\n\nimport { Skill, SkillResult, ExecutionContext } from '../core/agent';\n\nexport interface SkillRegistryConfig {\n autoDiscover?: boolean;\n skillDirectory?: string;\n}\n\nexport class SkillRegistry {\n private skills = new Map<string, Skill>();\n private categories = new Map<string, Set<string>>();\n\n constructor(_config: SkillRegistryConfig = {}) {\n // Config stored for future use\n void _config;\n }\n\n register(skill: Skill): void {\n this.skills.set(skill.name, skill);\n\n // Categorize skill\n if (skill.metadata?.category) {\n const category = skill.metadata.category;\n if (!this.categories.has(category)) {\n this.categories.set(category, new Set());\n }\n this.categories.get(category)!.add(skill.name);\n }\n }\n\n unregister(name: string): boolean {\n const skill = this.skills.get(name);\n if (!skill) return false;\n\n // Remove from categories\n if (skill.metadata?.category) {\n this.categories.get(skill.metadata.category)?.delete(name);\n }\n\n return this.skills.delete(name);\n }\n\n get(name: string): Skill | undefined {\n return this.skills.get(name);\n }\n\n has(name: string): boolean {\n return this.skills.has(name);\n }\n\n list(): Skill[] {\n return Array.from(this.skills.values());\n }\n\n listNames(): string[] {\n return Array.from(this.skills.keys());\n }\n\n findByCategory(category: string): Skill[] {\n const names = this.categories.get(category);\n if (!names) return [];\n return Array.from(names)\n .map(name => this.skills.get(name))\n .filter((skill): skill is Skill => skill !== undefined);\n }\n\n findByTag(tag: string): Skill[] {\n return this.list().filter(skill => skill.metadata?.tags?.includes(tag));\n }\n\n search(query: string): Skill[] {\n const lowerQuery = query.toLowerCase();\n return this.list().filter(\n skill =>\n skill.name.toLowerCase().includes(lowerQuery) ||\n skill.description.toLowerCase().includes(lowerQuery) ||\n skill.metadata?.tags?.some(tag => tag.toLowerCase().includes(lowerQuery))\n );\n }\n\n async execute(\n name: string,\n params: Record<string, unknown>,\n context: ExecutionContext\n ): Promise<SkillResult> {\n const skill = this.skills.get(name);\n if (!skill) {\n return { success: false, error: `Skill '${name}' not found in registry` };\n }\n return skill.handler(params, context);\n }\n\n clear(): void {\n this.skills.clear();\n this.categories.clear();\n }\n\n getCategories(): string[] {\n return Array.from(this.categories.keys());\n }\n\n getStats(): { total: number; categories: number } {\n return {\n total: this.skills.size,\n categories: this.categories.size,\n };\n }\n}\n","/**\n * Built-in Skills\n */\n\nimport { Skill, ExecutionContext } from '../core/agent';\n\nexport const echoSkill: Skill = {\n name: 'echo',\n description: 'Echo back the input message',\n parameters: {\n type: 'object',\n properties: {\n message: {\n type: 'string',\n description: 'The message to echo',\n },\n },\n required: ['message'],\n },\n handler: async params => ({\n success: true,\n data: params.message,\n }),\n metadata: {\n category: 'utility',\n tags: ['debug', 'test'],\n version: '1.0.0',\n },\n};\n\nexport const mathSkill: Skill = {\n name: 'math',\n description: 'Perform mathematical calculations',\n parameters: {\n type: 'object',\n properties: {\n expression: {\n type: 'string',\n description: 'Mathematical expression to evaluate',\n },\n },\n required: ['expression'],\n },\n handler: async params => {\n try {\n // Safe evaluation - only basic math operations\n const expression = String(params.expression);\n const sanitized = expression.replace(/[^0-9+\\-*/().\\s]/g, '');\n // eslint-disable-next-line no-eval\n const result = eval(sanitized);\n return { success: true, data: result };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Invalid expression',\n };\n }\n },\n metadata: {\n category: 'utility',\n tags: ['math', 'calculation'],\n version: '1.0.0',\n },\n};\n\nexport const listSkillsSkill: Skill = {\n name: 'list_skills',\n description: 'List all available skills',\n parameters: {\n type: 'object',\n properties: {\n category: {\n type: 'string',\n description: 'Filter by category',\n },\n },\n },\n handler: async (_params, context: ExecutionContext) => {\n const skills = context.agent.getAllSkills().map(skill => ({\n name: skill.name,\n description: skill.description,\n category: skill.metadata?.category,\n tags: skill.metadata?.tags,\n }));\n return { success: true, data: skills };\n },\n metadata: {\n category: 'meta',\n tags: ['introspection'],\n version: '1.0.0',\n },\n};\n\nexport const builtInSkills = [echoSkill, mathSkill, listSkillsSkill];\n"],"mappings":"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","names":["params","params"]}