deepseek-toolkit 0.1.10 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -280,31 +280,43 @@ var ToolLoop = class {
280
280
  ...this.toolManager.getToolDefinitions(),
281
281
  ...tools ?? []
282
282
  ];
283
- let streamResult = await this.makeStreamRequest(messages, allTools, toolChoice);
284
283
  let iterations = 0;
285
- let accumulatedToolCalls = [];
286
- let finalChunks = [];
287
- for await (const chunk of streamResult) {
288
- const delta = chunk.choices[0]?.delta;
289
- if (delta?.tool_calls) {
290
- for (const tc of delta.tool_calls) {
291
- if (tc.id) {
292
- accumulatedToolCalls.push({
293
- id: tc.id,
294
- name: tc.function?.name ?? "",
295
- arguments: tc.function?.arguments ?? ""
296
- });
297
- } else if (tc.function?.arguments) {
298
- const existing = accumulatedToolCalls[accumulatedToolCalls.length - 1];
299
- if (existing) {
300
- existing.arguments += tc.function.arguments;
284
+ let streamResult = await this.makeStreamRequest(messages, allTools, toolChoice);
285
+ while (iterations < this.config.maxToolLoopIterations) {
286
+ const accumulatedToolCalls = [];
287
+ let accumulatedReasoning = "";
288
+ let toolCallChunks = [];
289
+ let hasContent = false;
290
+ for await (const chunk of streamResult) {
291
+ const delta = chunk.choices[0]?.delta;
292
+ if (delta?.reasoning_content) {
293
+ accumulatedReasoning += delta.reasoning_content;
294
+ }
295
+ if (delta?.content) {
296
+ hasContent = true;
297
+ }
298
+ if (delta?.tool_calls) {
299
+ for (const tc of delta.tool_calls) {
300
+ if (tc.id) {
301
+ accumulatedToolCalls.push({
302
+ id: tc.id,
303
+ name: tc.function?.name ?? "",
304
+ arguments: tc.function?.arguments ?? ""
305
+ });
306
+ } else if (tc.function?.arguments) {
307
+ const existing = accumulatedToolCalls[accumulatedToolCalls.length - 1];
308
+ if (existing) {
309
+ existing.arguments += tc.function.arguments;
310
+ }
301
311
  }
302
312
  }
303
313
  }
314
+ toolCallChunks.push(chunk);
304
315
  }
305
- finalChunks.push(chunk);
306
- }
307
- if (accumulatedToolCalls.length > 0 && iterations < this.config.maxToolLoopIterations) {
316
+ if (accumulatedToolCalls.length === 0) {
317
+ return this.chunksToAsyncIterable(toolCallChunks);
318
+ }
319
+ iterations++;
308
320
  this.reasoning.startToolCallTurn();
309
321
  const toolResults = await this.executeToolCalls(
310
322
  accumulatedToolCalls.map((tc) => ({
@@ -316,7 +328,8 @@ var ToolLoop = class {
316
328
  );
317
329
  const assistantMsg = {
318
330
  role: "assistant",
319
- content: null,
331
+ content: hasContent ? null : null,
332
+ reasoning_content: accumulatedReasoning || null,
320
333
  tool_calls: accumulatedToolCalls.map((tc) => ({
321
334
  id: tc.id,
322
335
  type: "function",
@@ -327,11 +340,13 @@ var ToolLoop = class {
327
340
  for (const tr of toolResults) {
328
341
  messages.push(tr);
329
342
  }
330
- const nextResponse = await this.makeStreamRequest(messages, allTools, toolChoice);
331
343
  this.reasoning.endToolCallTurn();
332
- return nextResponse;
344
+ streamResult = await this.makeStreamRequest(messages, allTools, toolChoice);
333
345
  }
334
- return this.chunksToAsyncIterable(finalChunks);
346
+ throw new ToolLoopError(
347
+ `Tool call loop exceeded maximum iterations (${this.config.maxToolLoopIterations})`,
348
+ iterations
349
+ );
335
350
  }
336
351
  async makeRequest(messages, tools, toolChoice) {
337
352
  const params = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/types/models.ts","../src/brave-search.ts","../src/tool-manager.ts","../src/reasoning.ts","../src/tool-loop.ts","../src/defaults.ts","../src/client.ts"],"names":["OpenAI"],"mappings":"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","file":"index.cjs","sourcesContent":["export class DeepSeekError extends Error {\n constructor(\n message: string,\n public status?: number,\n public code?: string,\n ) {\n super(message);\n this.name = \"DeepSeekError\";\n }\n}\n\nexport class BraveSearchError extends Error {\n constructor(\n message: string,\n public status?: number,\n ) {\n super(message);\n this.name = \"BraveSearchError\";\n }\n}\n\nexport class ToolError extends Error {\n constructor(\n message: string,\n public toolName?: string,\n ) {\n super(message);\n this.name = \"ToolError\";\n }\n}\n\nexport class ToolLoopError extends Error {\n constructor(\n message: string,\n public iterations: number,\n ) {\n super(message);\n this.name = \"ToolLoopError\";\n }\n}\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigError\";\n }\n}\n","export const DEEPSEEK_MODELS = {\n V4_PRO: \"deepseek-v4-pro\",\n V4_FLASH: \"deepseek-v4-flash\",\n} as const;\n\nexport type ModelName = (typeof DEEPSEEK_MODELS)[keyof typeof DEEPSEEK_MODELS];\n\nexport const DEEPSEEK_BASE_URL = \"https://api.deepseek.com\";\nexport const DEEPSEEK_BETA_BASE_URL = \"https://api.deepseek.com/beta\";\n\nexport const BRAVE_WEB_SEARCH_URL = \"https://api.search.brave.com/res/v1/web/search\";\nexport const BRAVE_LLM_CONTEXT_URL = \"https://api.search.brave.com/res/v1/llm/context\";\n\nexport const DEFAULT_MAX_TOOL_LOOP_ITERATIONS = 10;\n","import { BraveSearchError } from \"./errors.js\";\nimport { BRAVE_WEB_SEARCH_URL, BRAVE_LLM_CONTEXT_URL } from \"./types/models.js\";\nimport type {\n BraveWebSearchOptions,\n BraveLLMContextOptions,\n BraveWebSearchResponse,\n BraveLLMContextResponse,\n} from \"./types/brave-search.js\";\n\nexport class BraveSearchClient {\n constructor(private apiKey: string) {}\n\n async webSearch(\n query: string,\n options: BraveWebSearchOptions = {},\n ): Promise<BraveWebSearchResponse> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n\n if (options.country) params.set(\"country\", options.country);\n if (options.searchLang) params.set(\"search_lang\", options.searchLang);\n if (options.safesearch) params.set(\"safesearch\", options.safesearch);\n if (options.freshness) params.set(\"freshness\", options.freshness);\n if (options.count !== undefined)\n params.set(\"count\", String(options.count));\n if (options.offset !== undefined)\n params.set(\"offset\", String(options.offset));\n if (options.extraSnippets)\n params.set(\"extra_snippets\", \"true\");\n\n const url = `${BRAVE_WEB_SEARCH_URL}?${params.toString()}`;\n\n const response = await fetch(url, {\n headers: {\n \"X-Subscription-Token\": this.apiKey,\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new BraveSearchError(\n `Brave Web Search failed: ${response.status} — ${body || response.statusText}`,\n response.status,\n );\n }\n\n return response.json() as Promise<BraveWebSearchResponse>;\n }\n\n async llmContext(\n query: string,\n options: BraveLLMContextOptions = {},\n ): Promise<BraveLLMContextResponse> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n\n if (options.freshness) params.set(\"freshness\", options.freshness);\n if (options.count !== undefined)\n params.set(\"count\", String(options.count));\n if (options.maxUrls !== undefined)\n params.set(\"maximum_number_of_urls\", String(options.maxUrls));\n if (options.maxTokens !== undefined)\n params.set(\"maximum_number_of_tokens\", String(options.maxTokens));\n if (options.maxSnippets !== undefined)\n params.set(\"maximum_number_of_snippets\", String(options.maxSnippets));\n if (options.maxTokensPerUrl !== undefined)\n params.set(\n \"maximum_number_of_tokens_per_url\",\n String(options.maxTokensPerUrl),\n );\n if (options.maxSnippetsPerUrl !== undefined)\n params.set(\n \"maximum_number_of_snippets_per_url\",\n String(options.maxSnippetsPerUrl),\n );\n if (options.contextThresholdMode)\n params.set(\"context_threshold_mode\", options.contextThresholdMode);\n if (options.enableLocal !== undefined && options.enableLocal !== null)\n params.set(\"enable_local\", String(options.enableLocal));\n\n const url = `${BRAVE_LLM_CONTEXT_URL}?${params.toString()}`;\n\n const response = await fetch(url, {\n headers: {\n \"X-Subscription-Token\": this.apiKey,\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new BraveSearchError(\n `Brave LLM Context failed: ${response.status} — ${body || response.statusText}`,\n response.status,\n );\n }\n\n return response.json() as Promise<BraveLLMContextResponse>;\n }\n}\n","import type {\n ToolDefinition,\n ToolHandler,\n RegisteredTool,\n ToolResult,\n} from \"./types/tools.js\";\nimport { ToolError } from \"./errors.js\";\n\nexport class ToolManager {\n private tools: Map<string, RegisteredTool> = new Map();\n\n addTool<TParams = Record<string, unknown>>(\n definition: ToolDefinition,\n handler?: ToolHandler<TParams>,\n ): void {\n const name = definition.function.name;\n if (this.tools.has(name)) {\n throw new ToolError(`Tool \"${name}\" is already registered`, name);\n }\n // Safe: at runtime handler receives Record<string,unknown> from JSON.parse\n this.tools.set(name, { definition, handler: handler as ToolHandler });\n }\n\n addTools<TParams = Record<string, unknown>>(\n tools: Array<{\n definition: ToolDefinition;\n handler?: ToolHandler<TParams>;\n }>,\n ): void {\n for (const tool of tools) {\n this.addTool(tool.definition, tool.handler);\n }\n }\n\n removeTool(name: string): boolean {\n return this.tools.delete(name);\n }\n\n getTool(name: string): RegisteredTool | undefined {\n return this.tools.get(name);\n }\n\n hasTool(name: string): boolean {\n return this.tools.has(name);\n }\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => t.definition);\n }\n\n getHandler(name: string): ToolHandler | undefined {\n return this.tools.get(name)?.handler;\n }\n\n hasHandler(name: string): boolean {\n const tool = this.tools.get(name);\n return tool !== undefined && tool.handler !== undefined;\n }\n\n async executeToolCall(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ): Promise<ToolResult> {\n const handler = this.getHandler(name);\n if (!handler) {\n throw new ToolError(\n `No handler registered for tool \"${name}\". Provide a handler via addTool() to enable automatic execution.`,\n name,\n );\n }\n const result = await handler(args);\n return {\n tool_call_id: toolCallId,\n role: \"tool\",\n content: typeof result === \"string\" ? result : JSON.stringify(result),\n };\n }\n\n get registeredCount(): number {\n return this.tools.size;\n }\n\n get registeredNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n clear(): void {\n this.tools.clear();\n }\n}\n","import type { ChatMessage, DeepSeekAssistantMessage } from \"./types/chat.js\";\n\nexport class ReasoningState {\n private activeToolCall = false;\n\n startToolCallTurn(): void {\n this.activeToolCall = true;\n }\n\n endToolCallTurn(): void {\n this.activeToolCall = false;\n }\n\n shouldIncludeReasoning(): boolean {\n return this.activeToolCall;\n }\n\n reset(): void {\n this.activeToolCall = false;\n }\n\n cleanMessageForContext(message: ChatMessage): ChatMessage {\n if (this.activeToolCall) return message;\n\n if (message.role === \"assistant\" && \"reasoning_content\" in message) {\n const msg = message as DeepSeekAssistantMessage;\n if (msg.reasoning_content && !msg.tool_calls?.length) {\n const { reasoning_content: _, ...rest } = msg;\n return rest as ChatMessage;\n }\n }\n return message;\n }\n}\n","import type OpenAI from \"openai\";\nimport type { ChatMessage, ChatResponse, StreamChunk } from \"./types/chat.js\";\nimport type { ToolDefinition, ToolCall, ToolChoice } from \"./types/tools.js\";\nimport type { ResolvedConfig } from \"./types/config.js\";\nimport { ToolManager } from \"./tool-manager.js\";\nimport { ReasoningState } from \"./reasoning.js\";\nimport { ToolLoopError } from \"./errors.js\";\n\nexport interface ToolLoopCallbacks {\n /** Observe or override a tool call. Return undefined/null to delegate to the registered handler. */\n onToolCall?: (\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ) => Promise<string | null | undefined> | string | null | undefined;\n /** Called after each tool call completes with the result */\n onToolResult?: (name: string, result: string) => void;\n}\n\nexport class ToolLoop {\n private reasoning: ReasoningState;\n\n constructor(\n private openai: OpenAI,\n private config: ResolvedConfig,\n private toolManager: ToolManager,\n ) {\n this.reasoning = new ReasoningState();\n }\n\n async run(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n callbacks?: ToolLoopCallbacks,\n ): Promise<ChatResponse> {\n const allTools = [\n ...this.toolManager.getToolDefinitions(),\n ...(tools ?? []),\n ];\n\n let response = await this.makeRequest(messages, allTools, toolChoice);\n let iterations = 0;\n\n while (this.hasToolCalls(response) && iterations < this.config.maxToolLoopIterations) {\n iterations++;\n this.reasoning.startToolCallTurn();\n\n const choice = response.choices[0];\n if (!choice) break;\n\n const rawCalls = choice.message.tool_calls ?? [];\n const toolCalls = rawCalls.filter(\n (tc): tc is ToolCall => tc.type === \"function\",\n );\n const toolResults = await this.executeToolCalls(toolCalls, callbacks);\n\n messages.push(choice.message);\n for (const tr of toolResults) {\n messages.push(tr);\n }\n\n response = await this.makeRequest(messages, allTools, toolChoice);\n this.reasoning.endToolCallTurn();\n }\n\n if (iterations >= this.config.maxToolLoopIterations) {\n const lastChoice = response.choices[0];\n if (lastChoice && this.hasToolCallsInChoice(response)) {\n throw new ToolLoopError(\n `Tool call loop exceeded maximum iterations (${this.config.maxToolLoopIterations})`,\n iterations,\n );\n }\n }\n\n return response;\n }\n\n async runStream(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n callbacks?: ToolLoopCallbacks,\n ): Promise<AsyncIterable<StreamChunk>> {\n const allTools = [\n ...this.toolManager.getToolDefinitions(),\n ...(tools ?? []),\n ];\n\n let streamResult = await this.makeStreamRequest(messages, allTools, toolChoice);\n\n let iterations = 0;\n let accumulatedToolCalls: Array<{\n id: string;\n name: string;\n arguments: string;\n }> = [];\n let finalChunks: StreamChunk[] = [];\n\n for await (const chunk of streamResult) {\n const delta = chunk.choices[0]?.delta;\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (tc.id) {\n accumulatedToolCalls.push({\n id: tc.id,\n name: tc.function?.name ?? \"\",\n arguments: tc.function?.arguments ?? \"\",\n });\n } else if (tc.function?.arguments) {\n const existing = accumulatedToolCalls[accumulatedToolCalls.length - 1];\n if (existing) {\n existing.arguments += tc.function.arguments;\n }\n }\n }\n }\n finalChunks.push(chunk);\n }\n\n if (accumulatedToolCalls.length > 0 && iterations < this.config.maxToolLoopIterations) {\n this.reasoning.startToolCallTurn();\n\n const toolResults = await this.executeToolCalls(\n accumulatedToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n callbacks,\n );\n\n const assistantMsg: ChatMessage = {\n role: \"assistant\",\n content: null,\n tool_calls: accumulatedToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n };\n messages.push(assistantMsg);\n for (const tr of toolResults) {\n messages.push(tr);\n }\n\n const nextResponse = await this.makeStreamRequest(messages, allTools, toolChoice);\n this.reasoning.endToolCallTurn();\n return nextResponse;\n }\n\n return this.chunksToAsyncIterable(finalChunks);\n }\n\n private async makeRequest(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n ): Promise<ChatResponse> {\n const params = {\n model: this.config.model,\n messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n reasoning_effort: this.config.reasoningEffort,\n thinking: this.config.thinking,\n } as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming;\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.Completions.ChatCompletionTool[];\n params.tool_choice = (toolChoice ?? \"auto\") as OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;\n }\n if (this.config.maxTokens !== undefined) params.max_tokens = this.config.maxTokens;\n if (this.config.temperature !== undefined) params.temperature = this.config.temperature;\n if (this.config.topP !== undefined) params.top_p = this.config.topP;\n\n const result = await this.openai.chat.completions.create(params);\n return result as unknown as ChatResponse;\n }\n\n private async makeStreamRequest(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n ): Promise<AsyncIterable<StreamChunk>> {\n const params = {\n model: this.config.model,\n messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n stream: true as const,\n reasoning_effort: this.config.reasoningEffort,\n thinking: this.config.thinking,\n } as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming;\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.Completions.ChatCompletionTool[];\n params.tool_choice = (toolChoice ?? \"auto\") as OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;\n }\n if (this.config.maxTokens !== undefined) params.max_tokens = this.config.maxTokens;\n if (this.config.temperature !== undefined) params.temperature = this.config.temperature;\n if (this.config.topP !== undefined) params.top_p = this.config.topP;\n\n const stream = await this.openai.chat.completions.create(params);\n return stream as unknown as AsyncIterable<StreamChunk>;\n }\n\n private async executeToolCalls(\n toolCalls: ToolCall[],\n callbacks?: ToolLoopCallbacks,\n ) {\n const results = [];\n for (const tc of toolCalls) {\n const name = tc.function.name;\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n args = {};\n }\n\n if (callbacks?.onToolCall) {\n const result = await callbacks.onToolCall(name, args, tc.id);\n if (result !== undefined && result !== null) {\n // Callback handled it — use its return value\n results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: result,\n });\n callbacks.onToolResult?.(name, result);\n continue;\n }\n // result is undefined/null — fall through to registered handler\n }\n if (this.toolManager.hasHandler(name)) {\n const tr = await this.toolManager.executeToolCall(name, args, tc.id);\n results.push(tr);\n callbacks?.onToolResult?.(name, typeof tr.content === \"string\" ? tr.content : JSON.stringify(tr.content));\n } else {\n results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: `Tool \"${name}\" has no handler registered. Register a handler to enable automatic execution.`,\n });\n }\n }\n return results;\n }\n\n private hasToolCalls(response: ChatResponse): boolean {\n return this.hasToolCallsInChoice(response);\n }\n\n private hasToolCallsInChoice(response: ChatResponse): boolean {\n const choice = response.choices[0];\n if (!choice) return false;\n return (\n choice.finish_reason === \"tool_calls\" &&\n (choice.message.tool_calls?.length ?? 0) > 0\n );\n }\n\n private async *chunksToAsyncIterable(\n chunks: StreamChunk[],\n ): AsyncIterable<StreamChunk> {\n for (const chunk of chunks) {\n yield chunk;\n }\n }\n\n get reasoningState(): ReasoningState {\n return this.reasoning;\n }\n\n resetReasoning(): void {\n this.reasoning.reset();\n }\n}\n","import type { DeepSeekConfig, ResolvedConfig } from \"./types/config.js\";\nimport type { ToolDefinition } from \"./types/tools.js\";\nimport {\n DEEPSEEK_MODELS,\n DEEPSEEK_BASE_URL,\n DEFAULT_MAX_TOOL_LOOP_ITERATIONS,\n} from \"./types/models.js\";\n\nexport const DEFAULT_CONFIG = {\n model: DEEPSEEK_MODELS.V4_PRO,\n baseURL: DEEPSEEK_BASE_URL,\n thinking: { type: \"enabled\" as const },\n reasoningEffort: \"high\" as const,\n braveSearch: {\n safesearch: \"off\" as const,\n freshness: undefined as \"pd\" | \"pw\" | \"pm\" | \"py\" | undefined,\n country: \"US\",\n searchLang: \"en\",\n count: 10,\n },\n maxToolLoopIterations: DEFAULT_MAX_TOOL_LOOP_ITERATIONS,\n};\n\n// -- Typed params for built-in tools ------------------------------------------\n\nexport interface BraveWebSearchParams {\n query: string;\n freshness?: \"pd\" | \"pw\" | \"pm\" | \"py\";\n count?: number;\n safesearch?: \"off\" | \"moderate\" | \"strict\";\n}\n\n// -- Built-in tool definitions ------------------------------------------------\n\nexport const BRAVE_WEB_SEARCH_TOOL_DEFINITION: ToolDefinition = {\n type: \"function\",\n function: {\n name: \"brave_web_search\",\n description:\n \"Search the web using Brave Search. Returns web page results with titles, URLs, and descriptions. Use this to find current information, news, documentation, or any web content.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"The search query\",\n },\n freshness: {\n type: \"string\",\n enum: [\"pd\", \"pw\", \"pm\", \"py\"],\n description:\n \"Filter results by freshness: pd (24h), pw (7 days), pm (month), py (year)\",\n },\n count: {\n type: \"integer\",\n minimum: 1,\n maximum: 20,\n description: \"Number of results (max 20)\",\n },\n safesearch: {\n type: \"string\",\n enum: [\"off\", \"moderate\", \"strict\"],\n description: \"Content filter level\",\n },\n },\n required: [\"query\"],\n },\n },\n};\n\n// -- Config resolver ----------------------------------------------------------\n\nexport function resolveConfig(config: DeepSeekConfig): ResolvedConfig {\n return {\n deepseekApiKey: config.deepseekApiKey,\n braveSearchApiKey: config.braveSearchApiKey,\n model: config.model ?? DEFAULT_CONFIG.model,\n baseURL: config.baseURL ?? DEFAULT_CONFIG.baseURL,\n thinking: config.thinking ?? DEFAULT_CONFIG.thinking,\n reasoningEffort: config.reasoningEffort ?? DEFAULT_CONFIG.reasoningEffort,\n braveSearch: {\n safesearch:\n config.braveSearch?.safesearch ?? DEFAULT_CONFIG.braveSearch.safesearch,\n freshness:\n config.braveSearch?.freshness ?? DEFAULT_CONFIG.braveSearch.freshness,\n country:\n config.braveSearch?.country ?? DEFAULT_CONFIG.braveSearch.country,\n searchLang:\n config.braveSearch?.searchLang ?? DEFAULT_CONFIG.braveSearch.searchLang,\n count:\n config.braveSearch?.count ?? DEFAULT_CONFIG.braveSearch.count,\n },\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n topP: config.topP,\n maxToolLoopIterations:\n config.maxToolLoopIterations ?? DEFAULT_CONFIG.maxToolLoopIterations,\n };\n}\n","import OpenAI from \"openai\";\nimport type {\n DeepSeekConfig,\n ResolvedConfig,\n ThinkingConfig,\n ReasoningEffort,\n BraveSearchDefaults,\n} from \"./types/config.js\";\nimport type {\n ToolDefinition,\n ToolHandler,\n RegisteredTool,\n ToolChoice,\n ToolCall,\n ToolResult,\n} from \"./types/tools.js\";\nimport type {\n ChatMessage,\n ChatResponse,\n StreamChunk,\n} from \"./types/chat.js\";\nimport type {\n BraveWebSearchOptions,\n BraveLLMContextOptions,\n BraveWebSearchResponse,\n BraveLLMContextResponse,\n} from \"./types/brave-search.js\";\nimport type { ModelName } from \"./types/models.js\";\nimport { BraveSearchClient } from \"./brave-search.js\";\nimport { ToolManager } from \"./tool-manager.js\";\nimport { ToolLoop, type ToolLoopCallbacks } from \"./tool-loop.js\";\nimport { resolveConfig } from \"./defaults.js\";\nimport { BRAVE_WEB_SEARCH_TOOL_DEFINITION } from \"./defaults.js\";\nimport type { BraveWebSearchParams } from \"./defaults.js\";\nimport { ConfigError } from \"./errors.js\";\n\nexport class DeepSeekClient {\n private config: ResolvedConfig;\n private openai: OpenAI;\n private braveSearch?: BraveSearchClient;\n private toolManager: ToolManager;\n private toolLoop: ToolLoop;\n\n constructor(config: DeepSeekConfig) {\n if (!config.deepseekApiKey) {\n throw new ConfigError(\"deepseekApiKey is required\");\n }\n this.config = resolveConfig(config);\n\n this.openai = new OpenAI({\n apiKey: this.config.deepseekApiKey,\n baseURL: this.config.baseURL,\n });\n\n if (config.braveSearchApiKey) {\n this.braveSearch = new BraveSearchClient(config.braveSearchApiKey);\n }\n\n this.toolManager = new ToolManager();\n this.toolLoop = new ToolLoop(this.openai, this.config, this.toolManager);\n\n this.registerBuiltinTools();\n }\n\n private registerBuiltinTools(): void {\n if (this.braveSearch) {\n this.toolManager.addTool<BraveWebSearchParams>(\n BRAVE_WEB_SEARCH_TOOL_DEFINITION,\n async (args: BraveWebSearchParams) => {\n const result = await this.braveSearch!.webSearch(args.query, {\n freshness: args.freshness,\n safesearch: args.safesearch ?? this.config.braveSearch.safesearch,\n count: args.count ?? this.config.braveSearch.count,\n country: this.config.braveSearch.country,\n searchLang: this.config.braveSearch.searchLang,\n });\n return JSON.stringify(result);\n },\n );\n\n }\n }\n\n async chat(\n messages: ChatMessage[],\n options?: {\n tools?: ToolDefinition[];\n toolChoice?: ToolChoice;\n model?: ModelName;\n thinking?: ThinkingConfig;\n reasoningEffort?: ReasoningEffort;\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n onToolCall?: ToolLoopCallbacks[\"onToolCall\"];\n onToolResult?: ToolLoopCallbacks[\"onToolResult\"];\n },\n ): Promise<ChatResponse> {\n const prevModel = this.config.model;\n const prevThinking = this.config.thinking;\n const prevEffort = this.config.reasoningEffort;\n const prevMaxTokens = this.config.maxTokens;\n const prevTemp = this.config.temperature;\n const prevTopP = this.config.topP;\n\n if (options?.model) this.config.model = options.model;\n if (options?.thinking) this.config.thinking = options.thinking;\n if (options?.reasoningEffort)\n this.config.reasoningEffort = options.reasoningEffort;\n if (options?.maxTokens !== undefined)\n this.config.maxTokens = options.maxTokens;\n if (options?.temperature !== undefined)\n this.config.temperature = options.temperature;\n if (options?.topP !== undefined) this.config.topP = options.topP;\n\n try {\n return await this.toolLoop.run(\n messages,\n options?.tools,\n options?.toolChoice,\n {\n onToolCall: options?.onToolCall,\n onToolResult: options?.onToolResult,\n },\n );\n } finally {\n this.config.model = prevModel;\n this.config.thinking = prevThinking;\n this.config.reasoningEffort = prevEffort;\n this.config.maxTokens = prevMaxTokens;\n this.config.temperature = prevTemp;\n this.config.topP = prevTopP;\n }\n }\n\n async chatStream(\n messages: ChatMessage[],\n options?: {\n tools?: ToolDefinition[];\n toolChoice?: ToolChoice;\n model?: ModelName;\n thinking?: ThinkingConfig;\n reasoningEffort?: ReasoningEffort;\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n onToolCall?: ToolLoopCallbacks[\"onToolCall\"];\n onToolResult?: ToolLoopCallbacks[\"onToolResult\"];\n },\n ): Promise<AsyncIterable<StreamChunk>> {\n const prevModel = this.config.model;\n const prevThinking = this.config.thinking;\n const prevEffort = this.config.reasoningEffort;\n const prevMaxTokens = this.config.maxTokens;\n const prevTemp = this.config.temperature;\n const prevTopP = this.config.topP;\n\n if (options?.model) this.config.model = options.model;\n if (options?.thinking) this.config.thinking = options.thinking;\n if (options?.reasoningEffort)\n this.config.reasoningEffort = options.reasoningEffort;\n if (options?.maxTokens !== undefined)\n this.config.maxTokens = options.maxTokens;\n if (options?.temperature !== undefined)\n this.config.temperature = options.temperature;\n if (options?.topP !== undefined) this.config.topP = options.topP;\n\n try {\n return await this.toolLoop.runStream(\n messages,\n options?.tools,\n options?.toolChoice,\n {\n onToolCall: options?.onToolCall,\n onToolResult: options?.onToolResult,\n },\n );\n } finally {\n this.config.model = prevModel;\n this.config.thinking = prevThinking;\n this.config.reasoningEffort = prevEffort;\n this.config.maxTokens = prevMaxTokens;\n this.config.temperature = prevTemp;\n this.config.topP = prevTopP;\n }\n }\n\n addTool<TParams = Record<string, unknown>>(\n definition: ToolDefinition,\n handler?: ToolHandler<TParams>,\n ): void {\n this.toolManager.addTool(definition, handler);\n }\n\n addTools<TParams = Record<string, unknown>>(\n tools: Array<{\n definition: ToolDefinition;\n handler?: ToolHandler<TParams>;\n }>,\n ): void {\n this.toolManager.addTools(tools);\n }\n\n removeTool(name: string): boolean {\n return this.toolManager.removeTool(name);\n }\n\n getTools(): RegisteredTool[] {\n return this.toolManager.getToolDefinitions().map((d) => {\n const registered = this.toolManager.getTool(d.function.name);\n return registered!;\n });\n }\n\n hasTool(name: string): boolean {\n return this.toolManager.hasTool(name);\n }\n\n async executeToolCall(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ): Promise<ToolResult> {\n return this.toolManager.executeToolCall(name, args, toolCallId);\n }\n\n async search(\n query: string,\n options?: BraveWebSearchOptions,\n ): Promise<BraveWebSearchResponse> {\n if (!this.braveSearch) {\n throw new ConfigError(\n \"Brave Search is not configured. Provide braveSearchApiKey in config.\",\n );\n }\n return this.braveSearch.webSearch(query, options ?? {});\n }\n\n async searchAsContext(\n query: string,\n options?: BraveLLMContextOptions,\n ): Promise<BraveLLMContextResponse> {\n if (!this.braveSearch) {\n throw new ConfigError(\n \"Brave Search is not configured. Provide braveSearchApiKey in config.\",\n );\n }\n return this.braveSearch.llmContext(query, options ?? {});\n }\n\n get model(): ModelName {\n return this.config.model;\n }\n\n set model(m: ModelName) {\n this.config.model = m;\n }\n\n get thinking(): ThinkingConfig {\n return this.config.thinking;\n }\n\n set thinking(t: ThinkingConfig) {\n this.config.thinking = t;\n }\n\n get reasoningEffort(): ReasoningEffort {\n return this.config.reasoningEffort;\n }\n\n set reasoningEffort(r: ReasoningEffort) {\n this.config.reasoningEffort = r;\n }\n\n get braveSearchDefaults(): BraveSearchDefaults {\n return this.config.braveSearch;\n }\n\n set braveSearchDefaults(d: BraveSearchDefaults) {\n this.config.braveSearch = { ...this.config.braveSearch, ...d };\n }\n\n get openaiClient(): OpenAI {\n return this.openai;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/types/models.ts","../src/brave-search.ts","../src/tool-manager.ts","../src/reasoning.ts","../src/tool-loop.ts","../src/defaults.ts","../src/client.ts"],"names":["OpenAI"],"mappings":"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","file":"index.cjs","sourcesContent":["export class DeepSeekError extends Error {\n constructor(\n message: string,\n public status?: number,\n public code?: string,\n ) {\n super(message);\n this.name = \"DeepSeekError\";\n }\n}\n\nexport class BraveSearchError extends Error {\n constructor(\n message: string,\n public status?: number,\n ) {\n super(message);\n this.name = \"BraveSearchError\";\n }\n}\n\nexport class ToolError extends Error {\n constructor(\n message: string,\n public toolName?: string,\n ) {\n super(message);\n this.name = \"ToolError\";\n }\n}\n\nexport class ToolLoopError extends Error {\n constructor(\n message: string,\n public iterations: number,\n ) {\n super(message);\n this.name = \"ToolLoopError\";\n }\n}\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigError\";\n }\n}\n","export const DEEPSEEK_MODELS = {\n V4_PRO: \"deepseek-v4-pro\",\n V4_FLASH: \"deepseek-v4-flash\",\n} as const;\n\nexport type ModelName = (typeof DEEPSEEK_MODELS)[keyof typeof DEEPSEEK_MODELS];\n\nexport const DEEPSEEK_BASE_URL = \"https://api.deepseek.com\";\nexport const DEEPSEEK_BETA_BASE_URL = \"https://api.deepseek.com/beta\";\n\nexport const BRAVE_WEB_SEARCH_URL = \"https://api.search.brave.com/res/v1/web/search\";\nexport const BRAVE_LLM_CONTEXT_URL = \"https://api.search.brave.com/res/v1/llm/context\";\n\nexport const DEFAULT_MAX_TOOL_LOOP_ITERATIONS = 10;\n","import { BraveSearchError } from \"./errors.js\";\nimport { BRAVE_WEB_SEARCH_URL, BRAVE_LLM_CONTEXT_URL } from \"./types/models.js\";\nimport type {\n BraveWebSearchOptions,\n BraveLLMContextOptions,\n BraveWebSearchResponse,\n BraveLLMContextResponse,\n} from \"./types/brave-search.js\";\n\nexport class BraveSearchClient {\n constructor(private apiKey: string) {}\n\n async webSearch(\n query: string,\n options: BraveWebSearchOptions = {},\n ): Promise<BraveWebSearchResponse> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n\n if (options.country) params.set(\"country\", options.country);\n if (options.searchLang) params.set(\"search_lang\", options.searchLang);\n if (options.safesearch) params.set(\"safesearch\", options.safesearch);\n if (options.freshness) params.set(\"freshness\", options.freshness);\n if (options.count !== undefined)\n params.set(\"count\", String(options.count));\n if (options.offset !== undefined)\n params.set(\"offset\", String(options.offset));\n if (options.extraSnippets)\n params.set(\"extra_snippets\", \"true\");\n\n const url = `${BRAVE_WEB_SEARCH_URL}?${params.toString()}`;\n\n const response = await fetch(url, {\n headers: {\n \"X-Subscription-Token\": this.apiKey,\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new BraveSearchError(\n `Brave Web Search failed: ${response.status} — ${body || response.statusText}`,\n response.status,\n );\n }\n\n return response.json() as Promise<BraveWebSearchResponse>;\n }\n\n async llmContext(\n query: string,\n options: BraveLLMContextOptions = {},\n ): Promise<BraveLLMContextResponse> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n\n if (options.freshness) params.set(\"freshness\", options.freshness);\n if (options.count !== undefined)\n params.set(\"count\", String(options.count));\n if (options.maxUrls !== undefined)\n params.set(\"maximum_number_of_urls\", String(options.maxUrls));\n if (options.maxTokens !== undefined)\n params.set(\"maximum_number_of_tokens\", String(options.maxTokens));\n if (options.maxSnippets !== undefined)\n params.set(\"maximum_number_of_snippets\", String(options.maxSnippets));\n if (options.maxTokensPerUrl !== undefined)\n params.set(\n \"maximum_number_of_tokens_per_url\",\n String(options.maxTokensPerUrl),\n );\n if (options.maxSnippetsPerUrl !== undefined)\n params.set(\n \"maximum_number_of_snippets_per_url\",\n String(options.maxSnippetsPerUrl),\n );\n if (options.contextThresholdMode)\n params.set(\"context_threshold_mode\", options.contextThresholdMode);\n if (options.enableLocal !== undefined && options.enableLocal !== null)\n params.set(\"enable_local\", String(options.enableLocal));\n\n const url = `${BRAVE_LLM_CONTEXT_URL}?${params.toString()}`;\n\n const response = await fetch(url, {\n headers: {\n \"X-Subscription-Token\": this.apiKey,\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new BraveSearchError(\n `Brave LLM Context failed: ${response.status} — ${body || response.statusText}`,\n response.status,\n );\n }\n\n return response.json() as Promise<BraveLLMContextResponse>;\n }\n}\n","import type {\n ToolDefinition,\n ToolHandler,\n RegisteredTool,\n ToolResult,\n} from \"./types/tools.js\";\nimport { ToolError } from \"./errors.js\";\n\nexport class ToolManager {\n private tools: Map<string, RegisteredTool> = new Map();\n\n addTool<TParams = Record<string, unknown>>(\n definition: ToolDefinition,\n handler?: ToolHandler<TParams>,\n ): void {\n const name = definition.function.name;\n if (this.tools.has(name)) {\n throw new ToolError(`Tool \"${name}\" is already registered`, name);\n }\n // Safe: at runtime handler receives Record<string,unknown> from JSON.parse\n this.tools.set(name, { definition, handler: handler as ToolHandler });\n }\n\n addTools<TParams = Record<string, unknown>>(\n tools: Array<{\n definition: ToolDefinition;\n handler?: ToolHandler<TParams>;\n }>,\n ): void {\n for (const tool of tools) {\n this.addTool(tool.definition, tool.handler);\n }\n }\n\n removeTool(name: string): boolean {\n return this.tools.delete(name);\n }\n\n getTool(name: string): RegisteredTool | undefined {\n return this.tools.get(name);\n }\n\n hasTool(name: string): boolean {\n return this.tools.has(name);\n }\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => t.definition);\n }\n\n getHandler(name: string): ToolHandler | undefined {\n return this.tools.get(name)?.handler;\n }\n\n hasHandler(name: string): boolean {\n const tool = this.tools.get(name);\n return tool !== undefined && tool.handler !== undefined;\n }\n\n async executeToolCall(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ): Promise<ToolResult> {\n const handler = this.getHandler(name);\n if (!handler) {\n throw new ToolError(\n `No handler registered for tool \"${name}\". Provide a handler via addTool() to enable automatic execution.`,\n name,\n );\n }\n const result = await handler(args);\n return {\n tool_call_id: toolCallId,\n role: \"tool\",\n content: typeof result === \"string\" ? result : JSON.stringify(result),\n };\n }\n\n get registeredCount(): number {\n return this.tools.size;\n }\n\n get registeredNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n clear(): void {\n this.tools.clear();\n }\n}\n","import type { ChatMessage, DeepSeekAssistantMessage } from \"./types/chat.js\";\n\nexport class ReasoningState {\n private activeToolCall = false;\n\n startToolCallTurn(): void {\n this.activeToolCall = true;\n }\n\n endToolCallTurn(): void {\n this.activeToolCall = false;\n }\n\n shouldIncludeReasoning(): boolean {\n return this.activeToolCall;\n }\n\n reset(): void {\n this.activeToolCall = false;\n }\n\n cleanMessageForContext(message: ChatMessage): ChatMessage {\n if (this.activeToolCall) return message;\n\n if (message.role === \"assistant\" && \"reasoning_content\" in message) {\n const msg = message as DeepSeekAssistantMessage;\n if (msg.reasoning_content && !msg.tool_calls?.length) {\n const { reasoning_content: _, ...rest } = msg;\n return rest as ChatMessage;\n }\n }\n return message;\n }\n}\n","import type OpenAI from \"openai\";\nimport type { ChatMessage, ChatResponse, StreamChunk } from \"./types/chat.js\";\nimport type { ToolDefinition, ToolCall, ToolChoice } from \"./types/tools.js\";\nimport type { ResolvedConfig } from \"./types/config.js\";\nimport { ToolManager } from \"./tool-manager.js\";\nimport { ReasoningState } from \"./reasoning.js\";\nimport { ToolLoopError } from \"./errors.js\";\n\nexport interface ToolLoopCallbacks {\n /** Observe or override a tool call. Return undefined/null to delegate to the registered handler. */\n onToolCall?: (\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ) => Promise<string | null | undefined> | string | null | undefined;\n /** Called after each tool call completes with the result */\n onToolResult?: (name: string, result: string) => void;\n}\n\nexport class ToolLoop {\n private reasoning: ReasoningState;\n\n constructor(\n private openai: OpenAI,\n private config: ResolvedConfig,\n private toolManager: ToolManager,\n ) {\n this.reasoning = new ReasoningState();\n }\n\n async run(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n callbacks?: ToolLoopCallbacks,\n ): Promise<ChatResponse> {\n const allTools = [\n ...this.toolManager.getToolDefinitions(),\n ...(tools ?? []),\n ];\n\n let response = await this.makeRequest(messages, allTools, toolChoice);\n let iterations = 0;\n\n while (this.hasToolCalls(response) && iterations < this.config.maxToolLoopIterations) {\n iterations++;\n this.reasoning.startToolCallTurn();\n\n const choice = response.choices[0];\n if (!choice) break;\n\n const rawCalls = choice.message.tool_calls ?? [];\n const toolCalls = rawCalls.filter(\n (tc): tc is ToolCall => tc.type === \"function\",\n );\n const toolResults = await this.executeToolCalls(toolCalls, callbacks);\n\n messages.push(choice.message);\n for (const tr of toolResults) {\n messages.push(tr);\n }\n\n response = await this.makeRequest(messages, allTools, toolChoice);\n this.reasoning.endToolCallTurn();\n }\n\n if (iterations >= this.config.maxToolLoopIterations) {\n const lastChoice = response.choices[0];\n if (lastChoice && this.hasToolCallsInChoice(response)) {\n throw new ToolLoopError(\n `Tool call loop exceeded maximum iterations (${this.config.maxToolLoopIterations})`,\n iterations,\n );\n }\n }\n\n return response;\n }\n\n async runStream(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n callbacks?: ToolLoopCallbacks,\n ): Promise<AsyncIterable<StreamChunk>> {\n const allTools = [\n ...this.toolManager.getToolDefinitions(),\n ...(tools ?? []),\n ];\n\n let iterations = 0;\n let streamResult = await this.makeStreamRequest(messages, allTools, toolChoice);\n\n while (iterations < this.config.maxToolLoopIterations) {\n const accumulatedToolCalls: Array<{\n id: string;\n name: string;\n arguments: string;\n }> = [];\n let accumulatedReasoning = \"\";\n let toolCallChunks: StreamChunk[] = [];\n let hasContent = false;\n\n for await (const chunk of streamResult) {\n const delta = chunk.choices[0]?.delta;\n if (delta?.reasoning_content) {\n accumulatedReasoning += delta.reasoning_content;\n }\n if (delta?.content) {\n hasContent = true;\n }\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (tc.id) {\n accumulatedToolCalls.push({\n id: tc.id,\n name: tc.function?.name ?? \"\",\n arguments: tc.function?.arguments ?? \"\",\n });\n } else if (tc.function?.arguments) {\n const existing = accumulatedToolCalls[accumulatedToolCalls.length - 1];\n if (existing) {\n existing.arguments += tc.function.arguments;\n }\n }\n }\n }\n toolCallChunks.push(chunk);\n }\n\n // No tool calls → return the final stream chunks\n if (accumulatedToolCalls.length === 0) {\n return this.chunksToAsyncIterable(toolCallChunks);\n }\n\n iterations++;\n this.reasoning.startToolCallTurn();\n\n const toolResults = await this.executeToolCalls(\n accumulatedToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n callbacks,\n );\n\n const assistantMsg: ChatMessage = {\n role: \"assistant\",\n content: hasContent ? null : null,\n reasoning_content: accumulatedReasoning || null,\n tool_calls: accumulatedToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n };\n messages.push(assistantMsg);\n for (const tr of toolResults) {\n messages.push(tr);\n }\n\n this.reasoning.endToolCallTurn();\n streamResult = await this.makeStreamRequest(messages, allTools, toolChoice);\n }\n\n throw new ToolLoopError(\n `Tool call loop exceeded maximum iterations (${this.config.maxToolLoopIterations})`,\n iterations,\n );\n }\n\n private async makeRequest(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n ): Promise<ChatResponse> {\n const params = {\n model: this.config.model,\n messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n reasoning_effort: this.config.reasoningEffort,\n thinking: this.config.thinking,\n } as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming;\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.Completions.ChatCompletionTool[];\n params.tool_choice = (toolChoice ?? \"auto\") as OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;\n }\n if (this.config.maxTokens !== undefined) params.max_tokens = this.config.maxTokens;\n if (this.config.temperature !== undefined) params.temperature = this.config.temperature;\n if (this.config.topP !== undefined) params.top_p = this.config.topP;\n\n const result = await this.openai.chat.completions.create(params);\n return result as unknown as ChatResponse;\n }\n\n private async makeStreamRequest(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n ): Promise<AsyncIterable<StreamChunk>> {\n const params = {\n model: this.config.model,\n messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n stream: true as const,\n reasoning_effort: this.config.reasoningEffort,\n thinking: this.config.thinking,\n } as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming;\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.Completions.ChatCompletionTool[];\n params.tool_choice = (toolChoice ?? \"auto\") as OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;\n }\n if (this.config.maxTokens !== undefined) params.max_tokens = this.config.maxTokens;\n if (this.config.temperature !== undefined) params.temperature = this.config.temperature;\n if (this.config.topP !== undefined) params.top_p = this.config.topP;\n\n const stream = await this.openai.chat.completions.create(params);\n return stream as unknown as AsyncIterable<StreamChunk>;\n }\n\n private async executeToolCalls(\n toolCalls: ToolCall[],\n callbacks?: ToolLoopCallbacks,\n ) {\n const results = [];\n for (const tc of toolCalls) {\n const name = tc.function.name;\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n args = {};\n }\n\n if (callbacks?.onToolCall) {\n const result = await callbacks.onToolCall(name, args, tc.id);\n if (result !== undefined && result !== null) {\n // Callback handled it — use its return value\n results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: result,\n });\n callbacks.onToolResult?.(name, result);\n continue;\n }\n // result is undefined/null — fall through to registered handler\n }\n if (this.toolManager.hasHandler(name)) {\n const tr = await this.toolManager.executeToolCall(name, args, tc.id);\n results.push(tr);\n callbacks?.onToolResult?.(name, typeof tr.content === \"string\" ? tr.content : JSON.stringify(tr.content));\n } else {\n results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: `Tool \"${name}\" has no handler registered. Register a handler to enable automatic execution.`,\n });\n }\n }\n return results;\n }\n\n private hasToolCalls(response: ChatResponse): boolean {\n return this.hasToolCallsInChoice(response);\n }\n\n private hasToolCallsInChoice(response: ChatResponse): boolean {\n const choice = response.choices[0];\n if (!choice) return false;\n return (\n choice.finish_reason === \"tool_calls\" &&\n (choice.message.tool_calls?.length ?? 0) > 0\n );\n }\n\n private async *chunksToAsyncIterable(\n chunks: StreamChunk[],\n ): AsyncIterable<StreamChunk> {\n for (const chunk of chunks) {\n yield chunk;\n }\n }\n\n get reasoningState(): ReasoningState {\n return this.reasoning;\n }\n\n resetReasoning(): void {\n this.reasoning.reset();\n }\n}\n","import type { DeepSeekConfig, ResolvedConfig } from \"./types/config.js\";\nimport type { ToolDefinition } from \"./types/tools.js\";\nimport {\n DEEPSEEK_MODELS,\n DEEPSEEK_BASE_URL,\n DEFAULT_MAX_TOOL_LOOP_ITERATIONS,\n} from \"./types/models.js\";\n\nexport const DEFAULT_CONFIG = {\n model: DEEPSEEK_MODELS.V4_PRO,\n baseURL: DEEPSEEK_BASE_URL,\n thinking: { type: \"enabled\" as const },\n reasoningEffort: \"high\" as const,\n braveSearch: {\n safesearch: \"off\" as const,\n freshness: undefined as \"pd\" | \"pw\" | \"pm\" | \"py\" | undefined,\n country: \"US\",\n searchLang: \"en\",\n count: 10,\n },\n maxToolLoopIterations: DEFAULT_MAX_TOOL_LOOP_ITERATIONS,\n};\n\n// -- Typed params for built-in tools ------------------------------------------\n\nexport interface BraveWebSearchParams {\n query: string;\n freshness?: \"pd\" | \"pw\" | \"pm\" | \"py\";\n count?: number;\n safesearch?: \"off\" | \"moderate\" | \"strict\";\n}\n\n// -- Built-in tool definitions ------------------------------------------------\n\nexport const BRAVE_WEB_SEARCH_TOOL_DEFINITION: ToolDefinition = {\n type: \"function\",\n function: {\n name: \"brave_web_search\",\n description:\n \"Search the web using Brave Search. Returns web page results with titles, URLs, and descriptions. Use this to find current information, news, documentation, or any web content.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"The search query\",\n },\n freshness: {\n type: \"string\",\n enum: [\"pd\", \"pw\", \"pm\", \"py\"],\n description:\n \"Filter results by freshness: pd (24h), pw (7 days), pm (month), py (year)\",\n },\n count: {\n type: \"integer\",\n minimum: 1,\n maximum: 20,\n description: \"Number of results (max 20)\",\n },\n safesearch: {\n type: \"string\",\n enum: [\"off\", \"moderate\", \"strict\"],\n description: \"Content filter level\",\n },\n },\n required: [\"query\"],\n },\n },\n};\n\n// -- Config resolver ----------------------------------------------------------\n\nexport function resolveConfig(config: DeepSeekConfig): ResolvedConfig {\n return {\n deepseekApiKey: config.deepseekApiKey,\n braveSearchApiKey: config.braveSearchApiKey,\n model: config.model ?? DEFAULT_CONFIG.model,\n baseURL: config.baseURL ?? DEFAULT_CONFIG.baseURL,\n thinking: config.thinking ?? DEFAULT_CONFIG.thinking,\n reasoningEffort: config.reasoningEffort ?? DEFAULT_CONFIG.reasoningEffort,\n braveSearch: {\n safesearch:\n config.braveSearch?.safesearch ?? DEFAULT_CONFIG.braveSearch.safesearch,\n freshness:\n config.braveSearch?.freshness ?? DEFAULT_CONFIG.braveSearch.freshness,\n country:\n config.braveSearch?.country ?? DEFAULT_CONFIG.braveSearch.country,\n searchLang:\n config.braveSearch?.searchLang ?? DEFAULT_CONFIG.braveSearch.searchLang,\n count:\n config.braveSearch?.count ?? DEFAULT_CONFIG.braveSearch.count,\n },\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n topP: config.topP,\n maxToolLoopIterations:\n config.maxToolLoopIterations ?? DEFAULT_CONFIG.maxToolLoopIterations,\n };\n}\n","import OpenAI from \"openai\";\nimport type {\n DeepSeekConfig,\n ResolvedConfig,\n ThinkingConfig,\n ReasoningEffort,\n BraveSearchDefaults,\n} from \"./types/config.js\";\nimport type {\n ToolDefinition,\n ToolHandler,\n RegisteredTool,\n ToolChoice,\n ToolCall,\n ToolResult,\n} from \"./types/tools.js\";\nimport type {\n ChatMessage,\n ChatResponse,\n StreamChunk,\n} from \"./types/chat.js\";\nimport type {\n BraveWebSearchOptions,\n BraveLLMContextOptions,\n BraveWebSearchResponse,\n BraveLLMContextResponse,\n} from \"./types/brave-search.js\";\nimport type { ModelName } from \"./types/models.js\";\nimport { BraveSearchClient } from \"./brave-search.js\";\nimport { ToolManager } from \"./tool-manager.js\";\nimport { ToolLoop, type ToolLoopCallbacks } from \"./tool-loop.js\";\nimport { resolveConfig } from \"./defaults.js\";\nimport { BRAVE_WEB_SEARCH_TOOL_DEFINITION } from \"./defaults.js\";\nimport type { BraveWebSearchParams } from \"./defaults.js\";\nimport { ConfigError } from \"./errors.js\";\n\nexport class DeepSeekClient {\n private config: ResolvedConfig;\n private openai: OpenAI;\n private braveSearch?: BraveSearchClient;\n private toolManager: ToolManager;\n private toolLoop: ToolLoop;\n\n constructor(config: DeepSeekConfig) {\n if (!config.deepseekApiKey) {\n throw new ConfigError(\"deepseekApiKey is required\");\n }\n this.config = resolveConfig(config);\n\n this.openai = new OpenAI({\n apiKey: this.config.deepseekApiKey,\n baseURL: this.config.baseURL,\n });\n\n if (config.braveSearchApiKey) {\n this.braveSearch = new BraveSearchClient(config.braveSearchApiKey);\n }\n\n this.toolManager = new ToolManager();\n this.toolLoop = new ToolLoop(this.openai, this.config, this.toolManager);\n\n this.registerBuiltinTools();\n }\n\n private registerBuiltinTools(): void {\n if (this.braveSearch) {\n this.toolManager.addTool<BraveWebSearchParams>(\n BRAVE_WEB_SEARCH_TOOL_DEFINITION,\n async (args: BraveWebSearchParams) => {\n const result = await this.braveSearch!.webSearch(args.query, {\n freshness: args.freshness,\n safesearch: args.safesearch ?? this.config.braveSearch.safesearch,\n count: args.count ?? this.config.braveSearch.count,\n country: this.config.braveSearch.country,\n searchLang: this.config.braveSearch.searchLang,\n });\n return JSON.stringify(result);\n },\n );\n\n }\n }\n\n async chat(\n messages: ChatMessage[],\n options?: {\n tools?: ToolDefinition[];\n toolChoice?: ToolChoice;\n model?: ModelName;\n thinking?: ThinkingConfig;\n reasoningEffort?: ReasoningEffort;\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n onToolCall?: ToolLoopCallbacks[\"onToolCall\"];\n onToolResult?: ToolLoopCallbacks[\"onToolResult\"];\n },\n ): Promise<ChatResponse> {\n const prevModel = this.config.model;\n const prevThinking = this.config.thinking;\n const prevEffort = this.config.reasoningEffort;\n const prevMaxTokens = this.config.maxTokens;\n const prevTemp = this.config.temperature;\n const prevTopP = this.config.topP;\n\n if (options?.model) this.config.model = options.model;\n if (options?.thinking) this.config.thinking = options.thinking;\n if (options?.reasoningEffort)\n this.config.reasoningEffort = options.reasoningEffort;\n if (options?.maxTokens !== undefined)\n this.config.maxTokens = options.maxTokens;\n if (options?.temperature !== undefined)\n this.config.temperature = options.temperature;\n if (options?.topP !== undefined) this.config.topP = options.topP;\n\n try {\n return await this.toolLoop.run(\n messages,\n options?.tools,\n options?.toolChoice,\n {\n onToolCall: options?.onToolCall,\n onToolResult: options?.onToolResult,\n },\n );\n } finally {\n this.config.model = prevModel;\n this.config.thinking = prevThinking;\n this.config.reasoningEffort = prevEffort;\n this.config.maxTokens = prevMaxTokens;\n this.config.temperature = prevTemp;\n this.config.topP = prevTopP;\n }\n }\n\n async chatStream(\n messages: ChatMessage[],\n options?: {\n tools?: ToolDefinition[];\n toolChoice?: ToolChoice;\n model?: ModelName;\n thinking?: ThinkingConfig;\n reasoningEffort?: ReasoningEffort;\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n onToolCall?: ToolLoopCallbacks[\"onToolCall\"];\n onToolResult?: ToolLoopCallbacks[\"onToolResult\"];\n },\n ): Promise<AsyncIterable<StreamChunk>> {\n const prevModel = this.config.model;\n const prevThinking = this.config.thinking;\n const prevEffort = this.config.reasoningEffort;\n const prevMaxTokens = this.config.maxTokens;\n const prevTemp = this.config.temperature;\n const prevTopP = this.config.topP;\n\n if (options?.model) this.config.model = options.model;\n if (options?.thinking) this.config.thinking = options.thinking;\n if (options?.reasoningEffort)\n this.config.reasoningEffort = options.reasoningEffort;\n if (options?.maxTokens !== undefined)\n this.config.maxTokens = options.maxTokens;\n if (options?.temperature !== undefined)\n this.config.temperature = options.temperature;\n if (options?.topP !== undefined) this.config.topP = options.topP;\n\n try {\n return await this.toolLoop.runStream(\n messages,\n options?.tools,\n options?.toolChoice,\n {\n onToolCall: options?.onToolCall,\n onToolResult: options?.onToolResult,\n },\n );\n } finally {\n this.config.model = prevModel;\n this.config.thinking = prevThinking;\n this.config.reasoningEffort = prevEffort;\n this.config.maxTokens = prevMaxTokens;\n this.config.temperature = prevTemp;\n this.config.topP = prevTopP;\n }\n }\n\n addTool<TParams = Record<string, unknown>>(\n definition: ToolDefinition,\n handler?: ToolHandler<TParams>,\n ): void {\n this.toolManager.addTool(definition, handler);\n }\n\n addTools<TParams = Record<string, unknown>>(\n tools: Array<{\n definition: ToolDefinition;\n handler?: ToolHandler<TParams>;\n }>,\n ): void {\n this.toolManager.addTools(tools);\n }\n\n removeTool(name: string): boolean {\n return this.toolManager.removeTool(name);\n }\n\n getTools(): RegisteredTool[] {\n return this.toolManager.getToolDefinitions().map((d) => {\n const registered = this.toolManager.getTool(d.function.name);\n return registered!;\n });\n }\n\n hasTool(name: string): boolean {\n return this.toolManager.hasTool(name);\n }\n\n async executeToolCall(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ): Promise<ToolResult> {\n return this.toolManager.executeToolCall(name, args, toolCallId);\n }\n\n async search(\n query: string,\n options?: BraveWebSearchOptions,\n ): Promise<BraveWebSearchResponse> {\n if (!this.braveSearch) {\n throw new ConfigError(\n \"Brave Search is not configured. Provide braveSearchApiKey in config.\",\n );\n }\n return this.braveSearch.webSearch(query, options ?? {});\n }\n\n async searchAsContext(\n query: string,\n options?: BraveLLMContextOptions,\n ): Promise<BraveLLMContextResponse> {\n if (!this.braveSearch) {\n throw new ConfigError(\n \"Brave Search is not configured. Provide braveSearchApiKey in config.\",\n );\n }\n return this.braveSearch.llmContext(query, options ?? {});\n }\n\n get model(): ModelName {\n return this.config.model;\n }\n\n set model(m: ModelName) {\n this.config.model = m;\n }\n\n get thinking(): ThinkingConfig {\n return this.config.thinking;\n }\n\n set thinking(t: ThinkingConfig) {\n this.config.thinking = t;\n }\n\n get reasoningEffort(): ReasoningEffort {\n return this.config.reasoningEffort;\n }\n\n set reasoningEffort(r: ReasoningEffort) {\n this.config.reasoningEffort = r;\n }\n\n get braveSearchDefaults(): BraveSearchDefaults {\n return this.config.braveSearch;\n }\n\n set braveSearchDefaults(d: BraveSearchDefaults) {\n this.config.braveSearch = { ...this.config.braveSearch, ...d };\n }\n\n get openaiClient(): OpenAI {\n return this.openai;\n }\n}\n"]}
package/dist/index.js CHANGED
@@ -274,31 +274,43 @@ var ToolLoop = class {
274
274
  ...this.toolManager.getToolDefinitions(),
275
275
  ...tools ?? []
276
276
  ];
277
- let streamResult = await this.makeStreamRequest(messages, allTools, toolChoice);
278
277
  let iterations = 0;
279
- let accumulatedToolCalls = [];
280
- let finalChunks = [];
281
- for await (const chunk of streamResult) {
282
- const delta = chunk.choices[0]?.delta;
283
- if (delta?.tool_calls) {
284
- for (const tc of delta.tool_calls) {
285
- if (tc.id) {
286
- accumulatedToolCalls.push({
287
- id: tc.id,
288
- name: tc.function?.name ?? "",
289
- arguments: tc.function?.arguments ?? ""
290
- });
291
- } else if (tc.function?.arguments) {
292
- const existing = accumulatedToolCalls[accumulatedToolCalls.length - 1];
293
- if (existing) {
294
- existing.arguments += tc.function.arguments;
278
+ let streamResult = await this.makeStreamRequest(messages, allTools, toolChoice);
279
+ while (iterations < this.config.maxToolLoopIterations) {
280
+ const accumulatedToolCalls = [];
281
+ let accumulatedReasoning = "";
282
+ let toolCallChunks = [];
283
+ let hasContent = false;
284
+ for await (const chunk of streamResult) {
285
+ const delta = chunk.choices[0]?.delta;
286
+ if (delta?.reasoning_content) {
287
+ accumulatedReasoning += delta.reasoning_content;
288
+ }
289
+ if (delta?.content) {
290
+ hasContent = true;
291
+ }
292
+ if (delta?.tool_calls) {
293
+ for (const tc of delta.tool_calls) {
294
+ if (tc.id) {
295
+ accumulatedToolCalls.push({
296
+ id: tc.id,
297
+ name: tc.function?.name ?? "",
298
+ arguments: tc.function?.arguments ?? ""
299
+ });
300
+ } else if (tc.function?.arguments) {
301
+ const existing = accumulatedToolCalls[accumulatedToolCalls.length - 1];
302
+ if (existing) {
303
+ existing.arguments += tc.function.arguments;
304
+ }
295
305
  }
296
306
  }
297
307
  }
308
+ toolCallChunks.push(chunk);
298
309
  }
299
- finalChunks.push(chunk);
300
- }
301
- if (accumulatedToolCalls.length > 0 && iterations < this.config.maxToolLoopIterations) {
310
+ if (accumulatedToolCalls.length === 0) {
311
+ return this.chunksToAsyncIterable(toolCallChunks);
312
+ }
313
+ iterations++;
302
314
  this.reasoning.startToolCallTurn();
303
315
  const toolResults = await this.executeToolCalls(
304
316
  accumulatedToolCalls.map((tc) => ({
@@ -310,7 +322,8 @@ var ToolLoop = class {
310
322
  );
311
323
  const assistantMsg = {
312
324
  role: "assistant",
313
- content: null,
325
+ content: hasContent ? null : null,
326
+ reasoning_content: accumulatedReasoning || null,
314
327
  tool_calls: accumulatedToolCalls.map((tc) => ({
315
328
  id: tc.id,
316
329
  type: "function",
@@ -321,11 +334,13 @@ var ToolLoop = class {
321
334
  for (const tr of toolResults) {
322
335
  messages.push(tr);
323
336
  }
324
- const nextResponse = await this.makeStreamRequest(messages, allTools, toolChoice);
325
337
  this.reasoning.endToolCallTurn();
326
- return nextResponse;
338
+ streamResult = await this.makeStreamRequest(messages, allTools, toolChoice);
327
339
  }
328
- return this.chunksToAsyncIterable(finalChunks);
340
+ throw new ToolLoopError(
341
+ `Tool call loop exceeded maximum iterations (${this.config.maxToolLoopIterations})`,
342
+ iterations
343
+ );
329
344
  }
330
345
  async makeRequest(messages, tools, toolChoice) {
331
346
  const params = {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/types/models.ts","../src/brave-search.ts","../src/tool-manager.ts","../src/reasoning.ts","../src/tool-loop.ts","../src/defaults.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export class DeepSeekError extends Error {\n constructor(\n message: string,\n public status?: number,\n public code?: string,\n ) {\n super(message);\n this.name = \"DeepSeekError\";\n }\n}\n\nexport class BraveSearchError extends Error {\n constructor(\n message: string,\n public status?: number,\n ) {\n super(message);\n this.name = \"BraveSearchError\";\n }\n}\n\nexport class ToolError extends Error {\n constructor(\n message: string,\n public toolName?: string,\n ) {\n super(message);\n this.name = \"ToolError\";\n }\n}\n\nexport class ToolLoopError extends Error {\n constructor(\n message: string,\n public iterations: number,\n ) {\n super(message);\n this.name = \"ToolLoopError\";\n }\n}\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigError\";\n }\n}\n","export const DEEPSEEK_MODELS = {\n V4_PRO: \"deepseek-v4-pro\",\n V4_FLASH: \"deepseek-v4-flash\",\n} as const;\n\nexport type ModelName = (typeof DEEPSEEK_MODELS)[keyof typeof DEEPSEEK_MODELS];\n\nexport const DEEPSEEK_BASE_URL = \"https://api.deepseek.com\";\nexport const DEEPSEEK_BETA_BASE_URL = \"https://api.deepseek.com/beta\";\n\nexport const BRAVE_WEB_SEARCH_URL = \"https://api.search.brave.com/res/v1/web/search\";\nexport const BRAVE_LLM_CONTEXT_URL = \"https://api.search.brave.com/res/v1/llm/context\";\n\nexport const DEFAULT_MAX_TOOL_LOOP_ITERATIONS = 10;\n","import { BraveSearchError } from \"./errors.js\";\nimport { BRAVE_WEB_SEARCH_URL, BRAVE_LLM_CONTEXT_URL } from \"./types/models.js\";\nimport type {\n BraveWebSearchOptions,\n BraveLLMContextOptions,\n BraveWebSearchResponse,\n BraveLLMContextResponse,\n} from \"./types/brave-search.js\";\n\nexport class BraveSearchClient {\n constructor(private apiKey: string) {}\n\n async webSearch(\n query: string,\n options: BraveWebSearchOptions = {},\n ): Promise<BraveWebSearchResponse> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n\n if (options.country) params.set(\"country\", options.country);\n if (options.searchLang) params.set(\"search_lang\", options.searchLang);\n if (options.safesearch) params.set(\"safesearch\", options.safesearch);\n if (options.freshness) params.set(\"freshness\", options.freshness);\n if (options.count !== undefined)\n params.set(\"count\", String(options.count));\n if (options.offset !== undefined)\n params.set(\"offset\", String(options.offset));\n if (options.extraSnippets)\n params.set(\"extra_snippets\", \"true\");\n\n const url = `${BRAVE_WEB_SEARCH_URL}?${params.toString()}`;\n\n const response = await fetch(url, {\n headers: {\n \"X-Subscription-Token\": this.apiKey,\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new BraveSearchError(\n `Brave Web Search failed: ${response.status} — ${body || response.statusText}`,\n response.status,\n );\n }\n\n return response.json() as Promise<BraveWebSearchResponse>;\n }\n\n async llmContext(\n query: string,\n options: BraveLLMContextOptions = {},\n ): Promise<BraveLLMContextResponse> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n\n if (options.freshness) params.set(\"freshness\", options.freshness);\n if (options.count !== undefined)\n params.set(\"count\", String(options.count));\n if (options.maxUrls !== undefined)\n params.set(\"maximum_number_of_urls\", String(options.maxUrls));\n if (options.maxTokens !== undefined)\n params.set(\"maximum_number_of_tokens\", String(options.maxTokens));\n if (options.maxSnippets !== undefined)\n params.set(\"maximum_number_of_snippets\", String(options.maxSnippets));\n if (options.maxTokensPerUrl !== undefined)\n params.set(\n \"maximum_number_of_tokens_per_url\",\n String(options.maxTokensPerUrl),\n );\n if (options.maxSnippetsPerUrl !== undefined)\n params.set(\n \"maximum_number_of_snippets_per_url\",\n String(options.maxSnippetsPerUrl),\n );\n if (options.contextThresholdMode)\n params.set(\"context_threshold_mode\", options.contextThresholdMode);\n if (options.enableLocal !== undefined && options.enableLocal !== null)\n params.set(\"enable_local\", String(options.enableLocal));\n\n const url = `${BRAVE_LLM_CONTEXT_URL}?${params.toString()}`;\n\n const response = await fetch(url, {\n headers: {\n \"X-Subscription-Token\": this.apiKey,\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new BraveSearchError(\n `Brave LLM Context failed: ${response.status} — ${body || response.statusText}`,\n response.status,\n );\n }\n\n return response.json() as Promise<BraveLLMContextResponse>;\n }\n}\n","import type {\n ToolDefinition,\n ToolHandler,\n RegisteredTool,\n ToolResult,\n} from \"./types/tools.js\";\nimport { ToolError } from \"./errors.js\";\n\nexport class ToolManager {\n private tools: Map<string, RegisteredTool> = new Map();\n\n addTool<TParams = Record<string, unknown>>(\n definition: ToolDefinition,\n handler?: ToolHandler<TParams>,\n ): void {\n const name = definition.function.name;\n if (this.tools.has(name)) {\n throw new ToolError(`Tool \"${name}\" is already registered`, name);\n }\n // Safe: at runtime handler receives Record<string,unknown> from JSON.parse\n this.tools.set(name, { definition, handler: handler as ToolHandler });\n }\n\n addTools<TParams = Record<string, unknown>>(\n tools: Array<{\n definition: ToolDefinition;\n handler?: ToolHandler<TParams>;\n }>,\n ): void {\n for (const tool of tools) {\n this.addTool(tool.definition, tool.handler);\n }\n }\n\n removeTool(name: string): boolean {\n return this.tools.delete(name);\n }\n\n getTool(name: string): RegisteredTool | undefined {\n return this.tools.get(name);\n }\n\n hasTool(name: string): boolean {\n return this.tools.has(name);\n }\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => t.definition);\n }\n\n getHandler(name: string): ToolHandler | undefined {\n return this.tools.get(name)?.handler;\n }\n\n hasHandler(name: string): boolean {\n const tool = this.tools.get(name);\n return tool !== undefined && tool.handler !== undefined;\n }\n\n async executeToolCall(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ): Promise<ToolResult> {\n const handler = this.getHandler(name);\n if (!handler) {\n throw new ToolError(\n `No handler registered for tool \"${name}\". Provide a handler via addTool() to enable automatic execution.`,\n name,\n );\n }\n const result = await handler(args);\n return {\n tool_call_id: toolCallId,\n role: \"tool\",\n content: typeof result === \"string\" ? result : JSON.stringify(result),\n };\n }\n\n get registeredCount(): number {\n return this.tools.size;\n }\n\n get registeredNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n clear(): void {\n this.tools.clear();\n }\n}\n","import type { ChatMessage, DeepSeekAssistantMessage } from \"./types/chat.js\";\n\nexport class ReasoningState {\n private activeToolCall = false;\n\n startToolCallTurn(): void {\n this.activeToolCall = true;\n }\n\n endToolCallTurn(): void {\n this.activeToolCall = false;\n }\n\n shouldIncludeReasoning(): boolean {\n return this.activeToolCall;\n }\n\n reset(): void {\n this.activeToolCall = false;\n }\n\n cleanMessageForContext(message: ChatMessage): ChatMessage {\n if (this.activeToolCall) return message;\n\n if (message.role === \"assistant\" && \"reasoning_content\" in message) {\n const msg = message as DeepSeekAssistantMessage;\n if (msg.reasoning_content && !msg.tool_calls?.length) {\n const { reasoning_content: _, ...rest } = msg;\n return rest as ChatMessage;\n }\n }\n return message;\n }\n}\n","import type OpenAI from \"openai\";\nimport type { ChatMessage, ChatResponse, StreamChunk } from \"./types/chat.js\";\nimport type { ToolDefinition, ToolCall, ToolChoice } from \"./types/tools.js\";\nimport type { ResolvedConfig } from \"./types/config.js\";\nimport { ToolManager } from \"./tool-manager.js\";\nimport { ReasoningState } from \"./reasoning.js\";\nimport { ToolLoopError } from \"./errors.js\";\n\nexport interface ToolLoopCallbacks {\n /** Observe or override a tool call. Return undefined/null to delegate to the registered handler. */\n onToolCall?: (\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ) => Promise<string | null | undefined> | string | null | undefined;\n /** Called after each tool call completes with the result */\n onToolResult?: (name: string, result: string) => void;\n}\n\nexport class ToolLoop {\n private reasoning: ReasoningState;\n\n constructor(\n private openai: OpenAI,\n private config: ResolvedConfig,\n private toolManager: ToolManager,\n ) {\n this.reasoning = new ReasoningState();\n }\n\n async run(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n callbacks?: ToolLoopCallbacks,\n ): Promise<ChatResponse> {\n const allTools = [\n ...this.toolManager.getToolDefinitions(),\n ...(tools ?? []),\n ];\n\n let response = await this.makeRequest(messages, allTools, toolChoice);\n let iterations = 0;\n\n while (this.hasToolCalls(response) && iterations < this.config.maxToolLoopIterations) {\n iterations++;\n this.reasoning.startToolCallTurn();\n\n const choice = response.choices[0];\n if (!choice) break;\n\n const rawCalls = choice.message.tool_calls ?? [];\n const toolCalls = rawCalls.filter(\n (tc): tc is ToolCall => tc.type === \"function\",\n );\n const toolResults = await this.executeToolCalls(toolCalls, callbacks);\n\n messages.push(choice.message);\n for (const tr of toolResults) {\n messages.push(tr);\n }\n\n response = await this.makeRequest(messages, allTools, toolChoice);\n this.reasoning.endToolCallTurn();\n }\n\n if (iterations >= this.config.maxToolLoopIterations) {\n const lastChoice = response.choices[0];\n if (lastChoice && this.hasToolCallsInChoice(response)) {\n throw new ToolLoopError(\n `Tool call loop exceeded maximum iterations (${this.config.maxToolLoopIterations})`,\n iterations,\n );\n }\n }\n\n return response;\n }\n\n async runStream(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n callbacks?: ToolLoopCallbacks,\n ): Promise<AsyncIterable<StreamChunk>> {\n const allTools = [\n ...this.toolManager.getToolDefinitions(),\n ...(tools ?? []),\n ];\n\n let streamResult = await this.makeStreamRequest(messages, allTools, toolChoice);\n\n let iterations = 0;\n let accumulatedToolCalls: Array<{\n id: string;\n name: string;\n arguments: string;\n }> = [];\n let finalChunks: StreamChunk[] = [];\n\n for await (const chunk of streamResult) {\n const delta = chunk.choices[0]?.delta;\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (tc.id) {\n accumulatedToolCalls.push({\n id: tc.id,\n name: tc.function?.name ?? \"\",\n arguments: tc.function?.arguments ?? \"\",\n });\n } else if (tc.function?.arguments) {\n const existing = accumulatedToolCalls[accumulatedToolCalls.length - 1];\n if (existing) {\n existing.arguments += tc.function.arguments;\n }\n }\n }\n }\n finalChunks.push(chunk);\n }\n\n if (accumulatedToolCalls.length > 0 && iterations < this.config.maxToolLoopIterations) {\n this.reasoning.startToolCallTurn();\n\n const toolResults = await this.executeToolCalls(\n accumulatedToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n callbacks,\n );\n\n const assistantMsg: ChatMessage = {\n role: \"assistant\",\n content: null,\n tool_calls: accumulatedToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n };\n messages.push(assistantMsg);\n for (const tr of toolResults) {\n messages.push(tr);\n }\n\n const nextResponse = await this.makeStreamRequest(messages, allTools, toolChoice);\n this.reasoning.endToolCallTurn();\n return nextResponse;\n }\n\n return this.chunksToAsyncIterable(finalChunks);\n }\n\n private async makeRequest(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n ): Promise<ChatResponse> {\n const params = {\n model: this.config.model,\n messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n reasoning_effort: this.config.reasoningEffort,\n thinking: this.config.thinking,\n } as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming;\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.Completions.ChatCompletionTool[];\n params.tool_choice = (toolChoice ?? \"auto\") as OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;\n }\n if (this.config.maxTokens !== undefined) params.max_tokens = this.config.maxTokens;\n if (this.config.temperature !== undefined) params.temperature = this.config.temperature;\n if (this.config.topP !== undefined) params.top_p = this.config.topP;\n\n const result = await this.openai.chat.completions.create(params);\n return result as unknown as ChatResponse;\n }\n\n private async makeStreamRequest(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n ): Promise<AsyncIterable<StreamChunk>> {\n const params = {\n model: this.config.model,\n messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n stream: true as const,\n reasoning_effort: this.config.reasoningEffort,\n thinking: this.config.thinking,\n } as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming;\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.Completions.ChatCompletionTool[];\n params.tool_choice = (toolChoice ?? \"auto\") as OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;\n }\n if (this.config.maxTokens !== undefined) params.max_tokens = this.config.maxTokens;\n if (this.config.temperature !== undefined) params.temperature = this.config.temperature;\n if (this.config.topP !== undefined) params.top_p = this.config.topP;\n\n const stream = await this.openai.chat.completions.create(params);\n return stream as unknown as AsyncIterable<StreamChunk>;\n }\n\n private async executeToolCalls(\n toolCalls: ToolCall[],\n callbacks?: ToolLoopCallbacks,\n ) {\n const results = [];\n for (const tc of toolCalls) {\n const name = tc.function.name;\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n args = {};\n }\n\n if (callbacks?.onToolCall) {\n const result = await callbacks.onToolCall(name, args, tc.id);\n if (result !== undefined && result !== null) {\n // Callback handled it — use its return value\n results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: result,\n });\n callbacks.onToolResult?.(name, result);\n continue;\n }\n // result is undefined/null — fall through to registered handler\n }\n if (this.toolManager.hasHandler(name)) {\n const tr = await this.toolManager.executeToolCall(name, args, tc.id);\n results.push(tr);\n callbacks?.onToolResult?.(name, typeof tr.content === \"string\" ? tr.content : JSON.stringify(tr.content));\n } else {\n results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: `Tool \"${name}\" has no handler registered. Register a handler to enable automatic execution.`,\n });\n }\n }\n return results;\n }\n\n private hasToolCalls(response: ChatResponse): boolean {\n return this.hasToolCallsInChoice(response);\n }\n\n private hasToolCallsInChoice(response: ChatResponse): boolean {\n const choice = response.choices[0];\n if (!choice) return false;\n return (\n choice.finish_reason === \"tool_calls\" &&\n (choice.message.tool_calls?.length ?? 0) > 0\n );\n }\n\n private async *chunksToAsyncIterable(\n chunks: StreamChunk[],\n ): AsyncIterable<StreamChunk> {\n for (const chunk of chunks) {\n yield chunk;\n }\n }\n\n get reasoningState(): ReasoningState {\n return this.reasoning;\n }\n\n resetReasoning(): void {\n this.reasoning.reset();\n }\n}\n","import type { DeepSeekConfig, ResolvedConfig } from \"./types/config.js\";\nimport type { ToolDefinition } from \"./types/tools.js\";\nimport {\n DEEPSEEK_MODELS,\n DEEPSEEK_BASE_URL,\n DEFAULT_MAX_TOOL_LOOP_ITERATIONS,\n} from \"./types/models.js\";\n\nexport const DEFAULT_CONFIG = {\n model: DEEPSEEK_MODELS.V4_PRO,\n baseURL: DEEPSEEK_BASE_URL,\n thinking: { type: \"enabled\" as const },\n reasoningEffort: \"high\" as const,\n braveSearch: {\n safesearch: \"off\" as const,\n freshness: undefined as \"pd\" | \"pw\" | \"pm\" | \"py\" | undefined,\n country: \"US\",\n searchLang: \"en\",\n count: 10,\n },\n maxToolLoopIterations: DEFAULT_MAX_TOOL_LOOP_ITERATIONS,\n};\n\n// -- Typed params for built-in tools ------------------------------------------\n\nexport interface BraveWebSearchParams {\n query: string;\n freshness?: \"pd\" | \"pw\" | \"pm\" | \"py\";\n count?: number;\n safesearch?: \"off\" | \"moderate\" | \"strict\";\n}\n\n// -- Built-in tool definitions ------------------------------------------------\n\nexport const BRAVE_WEB_SEARCH_TOOL_DEFINITION: ToolDefinition = {\n type: \"function\",\n function: {\n name: \"brave_web_search\",\n description:\n \"Search the web using Brave Search. Returns web page results with titles, URLs, and descriptions. Use this to find current information, news, documentation, or any web content.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"The search query\",\n },\n freshness: {\n type: \"string\",\n enum: [\"pd\", \"pw\", \"pm\", \"py\"],\n description:\n \"Filter results by freshness: pd (24h), pw (7 days), pm (month), py (year)\",\n },\n count: {\n type: \"integer\",\n minimum: 1,\n maximum: 20,\n description: \"Number of results (max 20)\",\n },\n safesearch: {\n type: \"string\",\n enum: [\"off\", \"moderate\", \"strict\"],\n description: \"Content filter level\",\n },\n },\n required: [\"query\"],\n },\n },\n};\n\n// -- Config resolver ----------------------------------------------------------\n\nexport function resolveConfig(config: DeepSeekConfig): ResolvedConfig {\n return {\n deepseekApiKey: config.deepseekApiKey,\n braveSearchApiKey: config.braveSearchApiKey,\n model: config.model ?? DEFAULT_CONFIG.model,\n baseURL: config.baseURL ?? DEFAULT_CONFIG.baseURL,\n thinking: config.thinking ?? DEFAULT_CONFIG.thinking,\n reasoningEffort: config.reasoningEffort ?? DEFAULT_CONFIG.reasoningEffort,\n braveSearch: {\n safesearch:\n config.braveSearch?.safesearch ?? DEFAULT_CONFIG.braveSearch.safesearch,\n freshness:\n config.braveSearch?.freshness ?? DEFAULT_CONFIG.braveSearch.freshness,\n country:\n config.braveSearch?.country ?? DEFAULT_CONFIG.braveSearch.country,\n searchLang:\n config.braveSearch?.searchLang ?? DEFAULT_CONFIG.braveSearch.searchLang,\n count:\n config.braveSearch?.count ?? DEFAULT_CONFIG.braveSearch.count,\n },\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n topP: config.topP,\n maxToolLoopIterations:\n config.maxToolLoopIterations ?? DEFAULT_CONFIG.maxToolLoopIterations,\n };\n}\n","import OpenAI from \"openai\";\nimport type {\n DeepSeekConfig,\n ResolvedConfig,\n ThinkingConfig,\n ReasoningEffort,\n BraveSearchDefaults,\n} from \"./types/config.js\";\nimport type {\n ToolDefinition,\n ToolHandler,\n RegisteredTool,\n ToolChoice,\n ToolCall,\n ToolResult,\n} from \"./types/tools.js\";\nimport type {\n ChatMessage,\n ChatResponse,\n StreamChunk,\n} from \"./types/chat.js\";\nimport type {\n BraveWebSearchOptions,\n BraveLLMContextOptions,\n BraveWebSearchResponse,\n BraveLLMContextResponse,\n} from \"./types/brave-search.js\";\nimport type { ModelName } from \"./types/models.js\";\nimport { BraveSearchClient } from \"./brave-search.js\";\nimport { ToolManager } from \"./tool-manager.js\";\nimport { ToolLoop, type ToolLoopCallbacks } from \"./tool-loop.js\";\nimport { resolveConfig } from \"./defaults.js\";\nimport { BRAVE_WEB_SEARCH_TOOL_DEFINITION } from \"./defaults.js\";\nimport type { BraveWebSearchParams } from \"./defaults.js\";\nimport { ConfigError } from \"./errors.js\";\n\nexport class DeepSeekClient {\n private config: ResolvedConfig;\n private openai: OpenAI;\n private braveSearch?: BraveSearchClient;\n private toolManager: ToolManager;\n private toolLoop: ToolLoop;\n\n constructor(config: DeepSeekConfig) {\n if (!config.deepseekApiKey) {\n throw new ConfigError(\"deepseekApiKey is required\");\n }\n this.config = resolveConfig(config);\n\n this.openai = new OpenAI({\n apiKey: this.config.deepseekApiKey,\n baseURL: this.config.baseURL,\n });\n\n if (config.braveSearchApiKey) {\n this.braveSearch = new BraveSearchClient(config.braveSearchApiKey);\n }\n\n this.toolManager = new ToolManager();\n this.toolLoop = new ToolLoop(this.openai, this.config, this.toolManager);\n\n this.registerBuiltinTools();\n }\n\n private registerBuiltinTools(): void {\n if (this.braveSearch) {\n this.toolManager.addTool<BraveWebSearchParams>(\n BRAVE_WEB_SEARCH_TOOL_DEFINITION,\n async (args: BraveWebSearchParams) => {\n const result = await this.braveSearch!.webSearch(args.query, {\n freshness: args.freshness,\n safesearch: args.safesearch ?? this.config.braveSearch.safesearch,\n count: args.count ?? this.config.braveSearch.count,\n country: this.config.braveSearch.country,\n searchLang: this.config.braveSearch.searchLang,\n });\n return JSON.stringify(result);\n },\n );\n\n }\n }\n\n async chat(\n messages: ChatMessage[],\n options?: {\n tools?: ToolDefinition[];\n toolChoice?: ToolChoice;\n model?: ModelName;\n thinking?: ThinkingConfig;\n reasoningEffort?: ReasoningEffort;\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n onToolCall?: ToolLoopCallbacks[\"onToolCall\"];\n onToolResult?: ToolLoopCallbacks[\"onToolResult\"];\n },\n ): Promise<ChatResponse> {\n const prevModel = this.config.model;\n const prevThinking = this.config.thinking;\n const prevEffort = this.config.reasoningEffort;\n const prevMaxTokens = this.config.maxTokens;\n const prevTemp = this.config.temperature;\n const prevTopP = this.config.topP;\n\n if (options?.model) this.config.model = options.model;\n if (options?.thinking) this.config.thinking = options.thinking;\n if (options?.reasoningEffort)\n this.config.reasoningEffort = options.reasoningEffort;\n if (options?.maxTokens !== undefined)\n this.config.maxTokens = options.maxTokens;\n if (options?.temperature !== undefined)\n this.config.temperature = options.temperature;\n if (options?.topP !== undefined) this.config.topP = options.topP;\n\n try {\n return await this.toolLoop.run(\n messages,\n options?.tools,\n options?.toolChoice,\n {\n onToolCall: options?.onToolCall,\n onToolResult: options?.onToolResult,\n },\n );\n } finally {\n this.config.model = prevModel;\n this.config.thinking = prevThinking;\n this.config.reasoningEffort = prevEffort;\n this.config.maxTokens = prevMaxTokens;\n this.config.temperature = prevTemp;\n this.config.topP = prevTopP;\n }\n }\n\n async chatStream(\n messages: ChatMessage[],\n options?: {\n tools?: ToolDefinition[];\n toolChoice?: ToolChoice;\n model?: ModelName;\n thinking?: ThinkingConfig;\n reasoningEffort?: ReasoningEffort;\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n onToolCall?: ToolLoopCallbacks[\"onToolCall\"];\n onToolResult?: ToolLoopCallbacks[\"onToolResult\"];\n },\n ): Promise<AsyncIterable<StreamChunk>> {\n const prevModel = this.config.model;\n const prevThinking = this.config.thinking;\n const prevEffort = this.config.reasoningEffort;\n const prevMaxTokens = this.config.maxTokens;\n const prevTemp = this.config.temperature;\n const prevTopP = this.config.topP;\n\n if (options?.model) this.config.model = options.model;\n if (options?.thinking) this.config.thinking = options.thinking;\n if (options?.reasoningEffort)\n this.config.reasoningEffort = options.reasoningEffort;\n if (options?.maxTokens !== undefined)\n this.config.maxTokens = options.maxTokens;\n if (options?.temperature !== undefined)\n this.config.temperature = options.temperature;\n if (options?.topP !== undefined) this.config.topP = options.topP;\n\n try {\n return await this.toolLoop.runStream(\n messages,\n options?.tools,\n options?.toolChoice,\n {\n onToolCall: options?.onToolCall,\n onToolResult: options?.onToolResult,\n },\n );\n } finally {\n this.config.model = prevModel;\n this.config.thinking = prevThinking;\n this.config.reasoningEffort = prevEffort;\n this.config.maxTokens = prevMaxTokens;\n this.config.temperature = prevTemp;\n this.config.topP = prevTopP;\n }\n }\n\n addTool<TParams = Record<string, unknown>>(\n definition: ToolDefinition,\n handler?: ToolHandler<TParams>,\n ): void {\n this.toolManager.addTool(definition, handler);\n }\n\n addTools<TParams = Record<string, unknown>>(\n tools: Array<{\n definition: ToolDefinition;\n handler?: ToolHandler<TParams>;\n }>,\n ): void {\n this.toolManager.addTools(tools);\n }\n\n removeTool(name: string): boolean {\n return this.toolManager.removeTool(name);\n }\n\n getTools(): RegisteredTool[] {\n return this.toolManager.getToolDefinitions().map((d) => {\n const registered = this.toolManager.getTool(d.function.name);\n return registered!;\n });\n }\n\n hasTool(name: string): boolean {\n return this.toolManager.hasTool(name);\n }\n\n async executeToolCall(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ): Promise<ToolResult> {\n return this.toolManager.executeToolCall(name, args, toolCallId);\n }\n\n async search(\n query: string,\n options?: BraveWebSearchOptions,\n ): Promise<BraveWebSearchResponse> {\n if (!this.braveSearch) {\n throw new ConfigError(\n \"Brave Search is not configured. Provide braveSearchApiKey in config.\",\n );\n }\n return this.braveSearch.webSearch(query, options ?? {});\n }\n\n async searchAsContext(\n query: string,\n options?: BraveLLMContextOptions,\n ): Promise<BraveLLMContextResponse> {\n if (!this.braveSearch) {\n throw new ConfigError(\n \"Brave Search is not configured. Provide braveSearchApiKey in config.\",\n );\n }\n return this.braveSearch.llmContext(query, options ?? {});\n }\n\n get model(): ModelName {\n return this.config.model;\n }\n\n set model(m: ModelName) {\n this.config.model = m;\n }\n\n get thinking(): ThinkingConfig {\n return this.config.thinking;\n }\n\n set thinking(t: ThinkingConfig) {\n this.config.thinking = t;\n }\n\n get reasoningEffort(): ReasoningEffort {\n return this.config.reasoningEffort;\n }\n\n set reasoningEffort(r: ReasoningEffort) {\n this.config.reasoningEffort = r;\n }\n\n get braveSearchDefaults(): BraveSearchDefaults {\n return this.config.braveSearch;\n }\n\n set braveSearchDefaults(d: BraveSearchDefaults) {\n this.config.braveSearch = { ...this.config.braveSearch, ...d };\n }\n\n get openaiClient(): OpenAI {\n return this.openai;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/types/models.ts","../src/brave-search.ts","../src/tool-manager.ts","../src/reasoning.ts","../src/tool-loop.ts","../src/defaults.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export class DeepSeekError extends Error {\n constructor(\n message: string,\n public status?: number,\n public code?: string,\n ) {\n super(message);\n this.name = \"DeepSeekError\";\n }\n}\n\nexport class BraveSearchError extends Error {\n constructor(\n message: string,\n public status?: number,\n ) {\n super(message);\n this.name = \"BraveSearchError\";\n }\n}\n\nexport class ToolError extends Error {\n constructor(\n message: string,\n public toolName?: string,\n ) {\n super(message);\n this.name = \"ToolError\";\n }\n}\n\nexport class ToolLoopError extends Error {\n constructor(\n message: string,\n public iterations: number,\n ) {\n super(message);\n this.name = \"ToolLoopError\";\n }\n}\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigError\";\n }\n}\n","export const DEEPSEEK_MODELS = {\n V4_PRO: \"deepseek-v4-pro\",\n V4_FLASH: \"deepseek-v4-flash\",\n} as const;\n\nexport type ModelName = (typeof DEEPSEEK_MODELS)[keyof typeof DEEPSEEK_MODELS];\n\nexport const DEEPSEEK_BASE_URL = \"https://api.deepseek.com\";\nexport const DEEPSEEK_BETA_BASE_URL = \"https://api.deepseek.com/beta\";\n\nexport const BRAVE_WEB_SEARCH_URL = \"https://api.search.brave.com/res/v1/web/search\";\nexport const BRAVE_LLM_CONTEXT_URL = \"https://api.search.brave.com/res/v1/llm/context\";\n\nexport const DEFAULT_MAX_TOOL_LOOP_ITERATIONS = 10;\n","import { BraveSearchError } from \"./errors.js\";\nimport { BRAVE_WEB_SEARCH_URL, BRAVE_LLM_CONTEXT_URL } from \"./types/models.js\";\nimport type {\n BraveWebSearchOptions,\n BraveLLMContextOptions,\n BraveWebSearchResponse,\n BraveLLMContextResponse,\n} from \"./types/brave-search.js\";\n\nexport class BraveSearchClient {\n constructor(private apiKey: string) {}\n\n async webSearch(\n query: string,\n options: BraveWebSearchOptions = {},\n ): Promise<BraveWebSearchResponse> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n\n if (options.country) params.set(\"country\", options.country);\n if (options.searchLang) params.set(\"search_lang\", options.searchLang);\n if (options.safesearch) params.set(\"safesearch\", options.safesearch);\n if (options.freshness) params.set(\"freshness\", options.freshness);\n if (options.count !== undefined)\n params.set(\"count\", String(options.count));\n if (options.offset !== undefined)\n params.set(\"offset\", String(options.offset));\n if (options.extraSnippets)\n params.set(\"extra_snippets\", \"true\");\n\n const url = `${BRAVE_WEB_SEARCH_URL}?${params.toString()}`;\n\n const response = await fetch(url, {\n headers: {\n \"X-Subscription-Token\": this.apiKey,\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new BraveSearchError(\n `Brave Web Search failed: ${response.status} — ${body || response.statusText}`,\n response.status,\n );\n }\n\n return response.json() as Promise<BraveWebSearchResponse>;\n }\n\n async llmContext(\n query: string,\n options: BraveLLMContextOptions = {},\n ): Promise<BraveLLMContextResponse> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n\n if (options.freshness) params.set(\"freshness\", options.freshness);\n if (options.count !== undefined)\n params.set(\"count\", String(options.count));\n if (options.maxUrls !== undefined)\n params.set(\"maximum_number_of_urls\", String(options.maxUrls));\n if (options.maxTokens !== undefined)\n params.set(\"maximum_number_of_tokens\", String(options.maxTokens));\n if (options.maxSnippets !== undefined)\n params.set(\"maximum_number_of_snippets\", String(options.maxSnippets));\n if (options.maxTokensPerUrl !== undefined)\n params.set(\n \"maximum_number_of_tokens_per_url\",\n String(options.maxTokensPerUrl),\n );\n if (options.maxSnippetsPerUrl !== undefined)\n params.set(\n \"maximum_number_of_snippets_per_url\",\n String(options.maxSnippetsPerUrl),\n );\n if (options.contextThresholdMode)\n params.set(\"context_threshold_mode\", options.contextThresholdMode);\n if (options.enableLocal !== undefined && options.enableLocal !== null)\n params.set(\"enable_local\", String(options.enableLocal));\n\n const url = `${BRAVE_LLM_CONTEXT_URL}?${params.toString()}`;\n\n const response = await fetch(url, {\n headers: {\n \"X-Subscription-Token\": this.apiKey,\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new BraveSearchError(\n `Brave LLM Context failed: ${response.status} — ${body || response.statusText}`,\n response.status,\n );\n }\n\n return response.json() as Promise<BraveLLMContextResponse>;\n }\n}\n","import type {\n ToolDefinition,\n ToolHandler,\n RegisteredTool,\n ToolResult,\n} from \"./types/tools.js\";\nimport { ToolError } from \"./errors.js\";\n\nexport class ToolManager {\n private tools: Map<string, RegisteredTool> = new Map();\n\n addTool<TParams = Record<string, unknown>>(\n definition: ToolDefinition,\n handler?: ToolHandler<TParams>,\n ): void {\n const name = definition.function.name;\n if (this.tools.has(name)) {\n throw new ToolError(`Tool \"${name}\" is already registered`, name);\n }\n // Safe: at runtime handler receives Record<string,unknown> from JSON.parse\n this.tools.set(name, { definition, handler: handler as ToolHandler });\n }\n\n addTools<TParams = Record<string, unknown>>(\n tools: Array<{\n definition: ToolDefinition;\n handler?: ToolHandler<TParams>;\n }>,\n ): void {\n for (const tool of tools) {\n this.addTool(tool.definition, tool.handler);\n }\n }\n\n removeTool(name: string): boolean {\n return this.tools.delete(name);\n }\n\n getTool(name: string): RegisteredTool | undefined {\n return this.tools.get(name);\n }\n\n hasTool(name: string): boolean {\n return this.tools.has(name);\n }\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => t.definition);\n }\n\n getHandler(name: string): ToolHandler | undefined {\n return this.tools.get(name)?.handler;\n }\n\n hasHandler(name: string): boolean {\n const tool = this.tools.get(name);\n return tool !== undefined && tool.handler !== undefined;\n }\n\n async executeToolCall(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ): Promise<ToolResult> {\n const handler = this.getHandler(name);\n if (!handler) {\n throw new ToolError(\n `No handler registered for tool \"${name}\". Provide a handler via addTool() to enable automatic execution.`,\n name,\n );\n }\n const result = await handler(args);\n return {\n tool_call_id: toolCallId,\n role: \"tool\",\n content: typeof result === \"string\" ? result : JSON.stringify(result),\n };\n }\n\n get registeredCount(): number {\n return this.tools.size;\n }\n\n get registeredNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n clear(): void {\n this.tools.clear();\n }\n}\n","import type { ChatMessage, DeepSeekAssistantMessage } from \"./types/chat.js\";\n\nexport class ReasoningState {\n private activeToolCall = false;\n\n startToolCallTurn(): void {\n this.activeToolCall = true;\n }\n\n endToolCallTurn(): void {\n this.activeToolCall = false;\n }\n\n shouldIncludeReasoning(): boolean {\n return this.activeToolCall;\n }\n\n reset(): void {\n this.activeToolCall = false;\n }\n\n cleanMessageForContext(message: ChatMessage): ChatMessage {\n if (this.activeToolCall) return message;\n\n if (message.role === \"assistant\" && \"reasoning_content\" in message) {\n const msg = message as DeepSeekAssistantMessage;\n if (msg.reasoning_content && !msg.tool_calls?.length) {\n const { reasoning_content: _, ...rest } = msg;\n return rest as ChatMessage;\n }\n }\n return message;\n }\n}\n","import type OpenAI from \"openai\";\nimport type { ChatMessage, ChatResponse, StreamChunk } from \"./types/chat.js\";\nimport type { ToolDefinition, ToolCall, ToolChoice } from \"./types/tools.js\";\nimport type { ResolvedConfig } from \"./types/config.js\";\nimport { ToolManager } from \"./tool-manager.js\";\nimport { ReasoningState } from \"./reasoning.js\";\nimport { ToolLoopError } from \"./errors.js\";\n\nexport interface ToolLoopCallbacks {\n /** Observe or override a tool call. Return undefined/null to delegate to the registered handler. */\n onToolCall?: (\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ) => Promise<string | null | undefined> | string | null | undefined;\n /** Called after each tool call completes with the result */\n onToolResult?: (name: string, result: string) => void;\n}\n\nexport class ToolLoop {\n private reasoning: ReasoningState;\n\n constructor(\n private openai: OpenAI,\n private config: ResolvedConfig,\n private toolManager: ToolManager,\n ) {\n this.reasoning = new ReasoningState();\n }\n\n async run(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n callbacks?: ToolLoopCallbacks,\n ): Promise<ChatResponse> {\n const allTools = [\n ...this.toolManager.getToolDefinitions(),\n ...(tools ?? []),\n ];\n\n let response = await this.makeRequest(messages, allTools, toolChoice);\n let iterations = 0;\n\n while (this.hasToolCalls(response) && iterations < this.config.maxToolLoopIterations) {\n iterations++;\n this.reasoning.startToolCallTurn();\n\n const choice = response.choices[0];\n if (!choice) break;\n\n const rawCalls = choice.message.tool_calls ?? [];\n const toolCalls = rawCalls.filter(\n (tc): tc is ToolCall => tc.type === \"function\",\n );\n const toolResults = await this.executeToolCalls(toolCalls, callbacks);\n\n messages.push(choice.message);\n for (const tr of toolResults) {\n messages.push(tr);\n }\n\n response = await this.makeRequest(messages, allTools, toolChoice);\n this.reasoning.endToolCallTurn();\n }\n\n if (iterations >= this.config.maxToolLoopIterations) {\n const lastChoice = response.choices[0];\n if (lastChoice && this.hasToolCallsInChoice(response)) {\n throw new ToolLoopError(\n `Tool call loop exceeded maximum iterations (${this.config.maxToolLoopIterations})`,\n iterations,\n );\n }\n }\n\n return response;\n }\n\n async runStream(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n callbacks?: ToolLoopCallbacks,\n ): Promise<AsyncIterable<StreamChunk>> {\n const allTools = [\n ...this.toolManager.getToolDefinitions(),\n ...(tools ?? []),\n ];\n\n let iterations = 0;\n let streamResult = await this.makeStreamRequest(messages, allTools, toolChoice);\n\n while (iterations < this.config.maxToolLoopIterations) {\n const accumulatedToolCalls: Array<{\n id: string;\n name: string;\n arguments: string;\n }> = [];\n let accumulatedReasoning = \"\";\n let toolCallChunks: StreamChunk[] = [];\n let hasContent = false;\n\n for await (const chunk of streamResult) {\n const delta = chunk.choices[0]?.delta;\n if (delta?.reasoning_content) {\n accumulatedReasoning += delta.reasoning_content;\n }\n if (delta?.content) {\n hasContent = true;\n }\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (tc.id) {\n accumulatedToolCalls.push({\n id: tc.id,\n name: tc.function?.name ?? \"\",\n arguments: tc.function?.arguments ?? \"\",\n });\n } else if (tc.function?.arguments) {\n const existing = accumulatedToolCalls[accumulatedToolCalls.length - 1];\n if (existing) {\n existing.arguments += tc.function.arguments;\n }\n }\n }\n }\n toolCallChunks.push(chunk);\n }\n\n // No tool calls → return the final stream chunks\n if (accumulatedToolCalls.length === 0) {\n return this.chunksToAsyncIterable(toolCallChunks);\n }\n\n iterations++;\n this.reasoning.startToolCallTurn();\n\n const toolResults = await this.executeToolCalls(\n accumulatedToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n callbacks,\n );\n\n const assistantMsg: ChatMessage = {\n role: \"assistant\",\n content: hasContent ? null : null,\n reasoning_content: accumulatedReasoning || null,\n tool_calls: accumulatedToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n };\n messages.push(assistantMsg);\n for (const tr of toolResults) {\n messages.push(tr);\n }\n\n this.reasoning.endToolCallTurn();\n streamResult = await this.makeStreamRequest(messages, allTools, toolChoice);\n }\n\n throw new ToolLoopError(\n `Tool call loop exceeded maximum iterations (${this.config.maxToolLoopIterations})`,\n iterations,\n );\n }\n\n private async makeRequest(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n ): Promise<ChatResponse> {\n const params = {\n model: this.config.model,\n messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n reasoning_effort: this.config.reasoningEffort,\n thinking: this.config.thinking,\n } as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming;\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.Completions.ChatCompletionTool[];\n params.tool_choice = (toolChoice ?? \"auto\") as OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;\n }\n if (this.config.maxTokens !== undefined) params.max_tokens = this.config.maxTokens;\n if (this.config.temperature !== undefined) params.temperature = this.config.temperature;\n if (this.config.topP !== undefined) params.top_p = this.config.topP;\n\n const result = await this.openai.chat.completions.create(params);\n return result as unknown as ChatResponse;\n }\n\n private async makeStreamRequest(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n ): Promise<AsyncIterable<StreamChunk>> {\n const params = {\n model: this.config.model,\n messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n stream: true as const,\n reasoning_effort: this.config.reasoningEffort,\n thinking: this.config.thinking,\n } as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming;\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.Completions.ChatCompletionTool[];\n params.tool_choice = (toolChoice ?? \"auto\") as OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;\n }\n if (this.config.maxTokens !== undefined) params.max_tokens = this.config.maxTokens;\n if (this.config.temperature !== undefined) params.temperature = this.config.temperature;\n if (this.config.topP !== undefined) params.top_p = this.config.topP;\n\n const stream = await this.openai.chat.completions.create(params);\n return stream as unknown as AsyncIterable<StreamChunk>;\n }\n\n private async executeToolCalls(\n toolCalls: ToolCall[],\n callbacks?: ToolLoopCallbacks,\n ) {\n const results = [];\n for (const tc of toolCalls) {\n const name = tc.function.name;\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n args = {};\n }\n\n if (callbacks?.onToolCall) {\n const result = await callbacks.onToolCall(name, args, tc.id);\n if (result !== undefined && result !== null) {\n // Callback handled it — use its return value\n results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: result,\n });\n callbacks.onToolResult?.(name, result);\n continue;\n }\n // result is undefined/null — fall through to registered handler\n }\n if (this.toolManager.hasHandler(name)) {\n const tr = await this.toolManager.executeToolCall(name, args, tc.id);\n results.push(tr);\n callbacks?.onToolResult?.(name, typeof tr.content === \"string\" ? tr.content : JSON.stringify(tr.content));\n } else {\n results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: `Tool \"${name}\" has no handler registered. Register a handler to enable automatic execution.`,\n });\n }\n }\n return results;\n }\n\n private hasToolCalls(response: ChatResponse): boolean {\n return this.hasToolCallsInChoice(response);\n }\n\n private hasToolCallsInChoice(response: ChatResponse): boolean {\n const choice = response.choices[0];\n if (!choice) return false;\n return (\n choice.finish_reason === \"tool_calls\" &&\n (choice.message.tool_calls?.length ?? 0) > 0\n );\n }\n\n private async *chunksToAsyncIterable(\n chunks: StreamChunk[],\n ): AsyncIterable<StreamChunk> {\n for (const chunk of chunks) {\n yield chunk;\n }\n }\n\n get reasoningState(): ReasoningState {\n return this.reasoning;\n }\n\n resetReasoning(): void {\n this.reasoning.reset();\n }\n}\n","import type { DeepSeekConfig, ResolvedConfig } from \"./types/config.js\";\nimport type { ToolDefinition } from \"./types/tools.js\";\nimport {\n DEEPSEEK_MODELS,\n DEEPSEEK_BASE_URL,\n DEFAULT_MAX_TOOL_LOOP_ITERATIONS,\n} from \"./types/models.js\";\n\nexport const DEFAULT_CONFIG = {\n model: DEEPSEEK_MODELS.V4_PRO,\n baseURL: DEEPSEEK_BASE_URL,\n thinking: { type: \"enabled\" as const },\n reasoningEffort: \"high\" as const,\n braveSearch: {\n safesearch: \"off\" as const,\n freshness: undefined as \"pd\" | \"pw\" | \"pm\" | \"py\" | undefined,\n country: \"US\",\n searchLang: \"en\",\n count: 10,\n },\n maxToolLoopIterations: DEFAULT_MAX_TOOL_LOOP_ITERATIONS,\n};\n\n// -- Typed params for built-in tools ------------------------------------------\n\nexport interface BraveWebSearchParams {\n query: string;\n freshness?: \"pd\" | \"pw\" | \"pm\" | \"py\";\n count?: number;\n safesearch?: \"off\" | \"moderate\" | \"strict\";\n}\n\n// -- Built-in tool definitions ------------------------------------------------\n\nexport const BRAVE_WEB_SEARCH_TOOL_DEFINITION: ToolDefinition = {\n type: \"function\",\n function: {\n name: \"brave_web_search\",\n description:\n \"Search the web using Brave Search. Returns web page results with titles, URLs, and descriptions. Use this to find current information, news, documentation, or any web content.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"The search query\",\n },\n freshness: {\n type: \"string\",\n enum: [\"pd\", \"pw\", \"pm\", \"py\"],\n description:\n \"Filter results by freshness: pd (24h), pw (7 days), pm (month), py (year)\",\n },\n count: {\n type: \"integer\",\n minimum: 1,\n maximum: 20,\n description: \"Number of results (max 20)\",\n },\n safesearch: {\n type: \"string\",\n enum: [\"off\", \"moderate\", \"strict\"],\n description: \"Content filter level\",\n },\n },\n required: [\"query\"],\n },\n },\n};\n\n// -- Config resolver ----------------------------------------------------------\n\nexport function resolveConfig(config: DeepSeekConfig): ResolvedConfig {\n return {\n deepseekApiKey: config.deepseekApiKey,\n braveSearchApiKey: config.braveSearchApiKey,\n model: config.model ?? DEFAULT_CONFIG.model,\n baseURL: config.baseURL ?? DEFAULT_CONFIG.baseURL,\n thinking: config.thinking ?? DEFAULT_CONFIG.thinking,\n reasoningEffort: config.reasoningEffort ?? DEFAULT_CONFIG.reasoningEffort,\n braveSearch: {\n safesearch:\n config.braveSearch?.safesearch ?? DEFAULT_CONFIG.braveSearch.safesearch,\n freshness:\n config.braveSearch?.freshness ?? DEFAULT_CONFIG.braveSearch.freshness,\n country:\n config.braveSearch?.country ?? DEFAULT_CONFIG.braveSearch.country,\n searchLang:\n config.braveSearch?.searchLang ?? DEFAULT_CONFIG.braveSearch.searchLang,\n count:\n config.braveSearch?.count ?? DEFAULT_CONFIG.braveSearch.count,\n },\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n topP: config.topP,\n maxToolLoopIterations:\n config.maxToolLoopIterations ?? DEFAULT_CONFIG.maxToolLoopIterations,\n };\n}\n","import OpenAI from \"openai\";\nimport type {\n DeepSeekConfig,\n ResolvedConfig,\n ThinkingConfig,\n ReasoningEffort,\n BraveSearchDefaults,\n} from \"./types/config.js\";\nimport type {\n ToolDefinition,\n ToolHandler,\n RegisteredTool,\n ToolChoice,\n ToolCall,\n ToolResult,\n} from \"./types/tools.js\";\nimport type {\n ChatMessage,\n ChatResponse,\n StreamChunk,\n} from \"./types/chat.js\";\nimport type {\n BraveWebSearchOptions,\n BraveLLMContextOptions,\n BraveWebSearchResponse,\n BraveLLMContextResponse,\n} from \"./types/brave-search.js\";\nimport type { ModelName } from \"./types/models.js\";\nimport { BraveSearchClient } from \"./brave-search.js\";\nimport { ToolManager } from \"./tool-manager.js\";\nimport { ToolLoop, type ToolLoopCallbacks } from \"./tool-loop.js\";\nimport { resolveConfig } from \"./defaults.js\";\nimport { BRAVE_WEB_SEARCH_TOOL_DEFINITION } from \"./defaults.js\";\nimport type { BraveWebSearchParams } from \"./defaults.js\";\nimport { ConfigError } from \"./errors.js\";\n\nexport class DeepSeekClient {\n private config: ResolvedConfig;\n private openai: OpenAI;\n private braveSearch?: BraveSearchClient;\n private toolManager: ToolManager;\n private toolLoop: ToolLoop;\n\n constructor(config: DeepSeekConfig) {\n if (!config.deepseekApiKey) {\n throw new ConfigError(\"deepseekApiKey is required\");\n }\n this.config = resolveConfig(config);\n\n this.openai = new OpenAI({\n apiKey: this.config.deepseekApiKey,\n baseURL: this.config.baseURL,\n });\n\n if (config.braveSearchApiKey) {\n this.braveSearch = new BraveSearchClient(config.braveSearchApiKey);\n }\n\n this.toolManager = new ToolManager();\n this.toolLoop = new ToolLoop(this.openai, this.config, this.toolManager);\n\n this.registerBuiltinTools();\n }\n\n private registerBuiltinTools(): void {\n if (this.braveSearch) {\n this.toolManager.addTool<BraveWebSearchParams>(\n BRAVE_WEB_SEARCH_TOOL_DEFINITION,\n async (args: BraveWebSearchParams) => {\n const result = await this.braveSearch!.webSearch(args.query, {\n freshness: args.freshness,\n safesearch: args.safesearch ?? this.config.braveSearch.safesearch,\n count: args.count ?? this.config.braveSearch.count,\n country: this.config.braveSearch.country,\n searchLang: this.config.braveSearch.searchLang,\n });\n return JSON.stringify(result);\n },\n );\n\n }\n }\n\n async chat(\n messages: ChatMessage[],\n options?: {\n tools?: ToolDefinition[];\n toolChoice?: ToolChoice;\n model?: ModelName;\n thinking?: ThinkingConfig;\n reasoningEffort?: ReasoningEffort;\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n onToolCall?: ToolLoopCallbacks[\"onToolCall\"];\n onToolResult?: ToolLoopCallbacks[\"onToolResult\"];\n },\n ): Promise<ChatResponse> {\n const prevModel = this.config.model;\n const prevThinking = this.config.thinking;\n const prevEffort = this.config.reasoningEffort;\n const prevMaxTokens = this.config.maxTokens;\n const prevTemp = this.config.temperature;\n const prevTopP = this.config.topP;\n\n if (options?.model) this.config.model = options.model;\n if (options?.thinking) this.config.thinking = options.thinking;\n if (options?.reasoningEffort)\n this.config.reasoningEffort = options.reasoningEffort;\n if (options?.maxTokens !== undefined)\n this.config.maxTokens = options.maxTokens;\n if (options?.temperature !== undefined)\n this.config.temperature = options.temperature;\n if (options?.topP !== undefined) this.config.topP = options.topP;\n\n try {\n return await this.toolLoop.run(\n messages,\n options?.tools,\n options?.toolChoice,\n {\n onToolCall: options?.onToolCall,\n onToolResult: options?.onToolResult,\n },\n );\n } finally {\n this.config.model = prevModel;\n this.config.thinking = prevThinking;\n this.config.reasoningEffort = prevEffort;\n this.config.maxTokens = prevMaxTokens;\n this.config.temperature = prevTemp;\n this.config.topP = prevTopP;\n }\n }\n\n async chatStream(\n messages: ChatMessage[],\n options?: {\n tools?: ToolDefinition[];\n toolChoice?: ToolChoice;\n model?: ModelName;\n thinking?: ThinkingConfig;\n reasoningEffort?: ReasoningEffort;\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n onToolCall?: ToolLoopCallbacks[\"onToolCall\"];\n onToolResult?: ToolLoopCallbacks[\"onToolResult\"];\n },\n ): Promise<AsyncIterable<StreamChunk>> {\n const prevModel = this.config.model;\n const prevThinking = this.config.thinking;\n const prevEffort = this.config.reasoningEffort;\n const prevMaxTokens = this.config.maxTokens;\n const prevTemp = this.config.temperature;\n const prevTopP = this.config.topP;\n\n if (options?.model) this.config.model = options.model;\n if (options?.thinking) this.config.thinking = options.thinking;\n if (options?.reasoningEffort)\n this.config.reasoningEffort = options.reasoningEffort;\n if (options?.maxTokens !== undefined)\n this.config.maxTokens = options.maxTokens;\n if (options?.temperature !== undefined)\n this.config.temperature = options.temperature;\n if (options?.topP !== undefined) this.config.topP = options.topP;\n\n try {\n return await this.toolLoop.runStream(\n messages,\n options?.tools,\n options?.toolChoice,\n {\n onToolCall: options?.onToolCall,\n onToolResult: options?.onToolResult,\n },\n );\n } finally {\n this.config.model = prevModel;\n this.config.thinking = prevThinking;\n this.config.reasoningEffort = prevEffort;\n this.config.maxTokens = prevMaxTokens;\n this.config.temperature = prevTemp;\n this.config.topP = prevTopP;\n }\n }\n\n addTool<TParams = Record<string, unknown>>(\n definition: ToolDefinition,\n handler?: ToolHandler<TParams>,\n ): void {\n this.toolManager.addTool(definition, handler);\n }\n\n addTools<TParams = Record<string, unknown>>(\n tools: Array<{\n definition: ToolDefinition;\n handler?: ToolHandler<TParams>;\n }>,\n ): void {\n this.toolManager.addTools(tools);\n }\n\n removeTool(name: string): boolean {\n return this.toolManager.removeTool(name);\n }\n\n getTools(): RegisteredTool[] {\n return this.toolManager.getToolDefinitions().map((d) => {\n const registered = this.toolManager.getTool(d.function.name);\n return registered!;\n });\n }\n\n hasTool(name: string): boolean {\n return this.toolManager.hasTool(name);\n }\n\n async executeToolCall(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ): Promise<ToolResult> {\n return this.toolManager.executeToolCall(name, args, toolCallId);\n }\n\n async search(\n query: string,\n options?: BraveWebSearchOptions,\n ): Promise<BraveWebSearchResponse> {\n if (!this.braveSearch) {\n throw new ConfigError(\n \"Brave Search is not configured. Provide braveSearchApiKey in config.\",\n );\n }\n return this.braveSearch.webSearch(query, options ?? {});\n }\n\n async searchAsContext(\n query: string,\n options?: BraveLLMContextOptions,\n ): Promise<BraveLLMContextResponse> {\n if (!this.braveSearch) {\n throw new ConfigError(\n \"Brave Search is not configured. Provide braveSearchApiKey in config.\",\n );\n }\n return this.braveSearch.llmContext(query, options ?? {});\n }\n\n get model(): ModelName {\n return this.config.model;\n }\n\n set model(m: ModelName) {\n this.config.model = m;\n }\n\n get thinking(): ThinkingConfig {\n return this.config.thinking;\n }\n\n set thinking(t: ThinkingConfig) {\n this.config.thinking = t;\n }\n\n get reasoningEffort(): ReasoningEffort {\n return this.config.reasoningEffort;\n }\n\n set reasoningEffort(r: ReasoningEffort) {\n this.config.reasoningEffort = r;\n }\n\n get braveSearchDefaults(): BraveSearchDefaults {\n return this.config.braveSearch;\n }\n\n set braveSearchDefaults(d: BraveSearchDefaults) {\n this.config.braveSearch = { ...this.config.braveSearch, ...d };\n }\n\n get openaiClient(): OpenAI {\n return this.openai;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepseek-toolkit",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "description": "DeepSeek API toolkit with built-in Brave Search — batteries-included wrapper for chat, tools, and web search",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",