deepseek-toolkit 0.1.7 → 0.1.9

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
@@ -88,8 +88,9 @@ var BraveSearchClient = class {
88
88
  }
89
89
  });
90
90
  if (!response.ok) {
91
+ const body = await response.text().catch(() => "");
91
92
  throw new BraveSearchError(
92
- `Brave Web Search failed: ${response.status} ${response.statusText}`,
93
+ `Brave Web Search failed: ${response.status} \u2014 ${body || response.statusText}`,
93
94
  response.status
94
95
  );
95
96
  }
@@ -98,8 +99,6 @@ var BraveSearchClient = class {
98
99
  async llmContext(query, options = {}) {
99
100
  const params = new URLSearchParams();
100
101
  params.set("q", query);
101
- if (options.country) params.set("country", options.country);
102
- if (options.searchLang) params.set("search_lang", options.searchLang);
103
102
  if (options.freshness) params.set("freshness", options.freshness);
104
103
  if (options.count !== void 0)
105
104
  params.set("count", String(options.count));
@@ -123,7 +122,6 @@ var BraveSearchClient = class {
123
122
  params.set("context_threshold_mode", options.contextThresholdMode);
124
123
  if (options.enableLocal !== void 0 && options.enableLocal !== null)
125
124
  params.set("enable_local", String(options.enableLocal));
126
- if (options.safesearch) params.set("safesearch", options.safesearch);
127
125
  const url = `${BRAVE_LLM_CONTEXT_URL}?${params.toString()}`;
128
126
  const response = await fetch(url, {
129
127
  headers: {
@@ -132,8 +130,9 @@ var BraveSearchClient = class {
132
130
  }
133
131
  });
134
132
  if (!response.ok) {
133
+ const body = await response.text().catch(() => "");
135
134
  throw new BraveSearchError(
136
- `Brave LLM Context failed: ${response.status} ${response.statusText}`,
135
+ `Brave LLM Context failed: ${response.status} \u2014 ${body || response.statusText}`,
137
136
  response.status
138
137
  );
139
138
  }
@@ -381,13 +380,17 @@ var ToolLoop = class {
381
380
  }
382
381
  if (callbacks?.onToolCall) {
383
382
  const result = await callbacks.onToolCall(name, args, tc.id);
384
- results.push({
385
- tool_call_id: tc.id,
386
- role: "tool",
387
- content: result
388
- });
389
- callbacks.onToolResult?.(name, result);
390
- } else if (this.toolManager.hasHandler(name)) {
383
+ if (result !== void 0 && result !== null) {
384
+ results.push({
385
+ tool_call_id: tc.id,
386
+ role: "tool",
387
+ content: result
388
+ });
389
+ callbacks.onToolResult?.(name, result);
390
+ continue;
391
+ }
392
+ }
393
+ if (this.toolManager.hasHandler(name)) {
391
394
  const tr = await this.toolManager.executeToolCall(name, args, tc.id);
392
395
  results.push(tr);
393
396
  callbacks?.onToolResult?.(name, typeof tr.content === "string" ? tr.content : JSON.stringify(tr.content));
@@ -470,40 +473,6 @@ var BRAVE_WEB_SEARCH_TOOL_DEFINITION = {
470
473
  }
471
474
  }
472
475
  };
473
- var BRAVE_LLM_CONTEXT_TOOL_DEFINITION = {
474
- type: "function",
475
- function: {
476
- name: "brave_llm_context",
477
- description: "Search the web and get content optimized for AI consumption. Returns pre-extracted text snippets from web pages, ideal for grounding responses in current information.",
478
- parameters: {
479
- type: "object",
480
- properties: {
481
- query: {
482
- type: "string",
483
- description: "The search query"
484
- },
485
- freshness: {
486
- type: "string",
487
- enum: ["pd", "pw", "pm", "py"],
488
- description: "Filter results by freshness: pd (24h), pw (7 days), pm (month), py (year)"
489
- },
490
- maxTokens: {
491
- type: "integer",
492
- minimum: 1024,
493
- maximum: 32768,
494
- description: "Max tokens in context (default 8192)"
495
- },
496
- maxUrls: {
497
- type: "integer",
498
- minimum: 1,
499
- maximum: 50,
500
- description: "Maximum URLs to include (default 20)"
501
- }
502
- },
503
- required: ["query"]
504
- }
505
- }
506
- };
507
476
  function resolveConfig(config) {
508
477
  return {
509
478
  deepseekApiKey: config.deepseekApiKey,
@@ -564,20 +533,6 @@ var DeepSeekClient = class {
564
533
  return JSON.stringify(result);
565
534
  }
566
535
  );
567
- this.toolManager.addTool(
568
- BRAVE_LLM_CONTEXT_TOOL_DEFINITION,
569
- async (args) => {
570
- const result = await this.braveSearch.llmContext(args.query, {
571
- freshness: args.freshness,
572
- maxTokens: args.maxTokens,
573
- maxUrls: args.maxUrls,
574
- country: this.config.braveSearch.country,
575
- searchLang: this.config.braveSearch.searchLang,
576
- safesearch: this.config.braveSearch.safesearch
577
- });
578
- return JSON.stringify(result);
579
- }
580
- );
581
536
  }
582
537
  }
583
538
  async chat(messages, options) {
@@ -716,7 +671,6 @@ var DeepSeekClient = class {
716
671
  }
717
672
  };
718
673
 
719
- exports.BRAVE_LLM_CONTEXT_TOOL_DEFINITION = BRAVE_LLM_CONTEXT_TOOL_DEFINITION;
720
674
  exports.BRAVE_LLM_CONTEXT_URL = BRAVE_LLM_CONTEXT_URL;
721
675
  exports.BRAVE_WEB_SEARCH_TOOL_DEFINITION = BRAVE_WEB_SEARCH_TOOL_DEFINITION;
722
676
  exports.BRAVE_WEB_SEARCH_URL = BRAVE_WEB_SEARCH_URL;
@@ -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 throw new BraveSearchError(\n `Brave Web Search failed: ${response.status} ${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.country) params.set(\"country\", options.country);\n if (options.searchLang) params.set(\"search_lang\", options.searchLang);\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 if (options.safesearch) params.set(\"safesearch\", options.safesearch);\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 throw new BraveSearchError(\n `Brave LLM Context failed: ${response.status} ${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 onToolCall?: (\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ) => Promise<string> | string;\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 results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: result,\n });\n callbacks.onToolResult?.(name, result);\n } else 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\nexport interface BraveLLMContextParams {\n query: string;\n freshness?: \"pd\" | \"pw\" | \"pm\" | \"py\";\n maxTokens?: number;\n maxUrls?: number;\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\nexport const BRAVE_LLM_CONTEXT_TOOL_DEFINITION: ToolDefinition = {\n type: \"function\",\n function: {\n name: \"brave_llm_context\",\n description:\n \"Search the web and get content optimized for AI consumption. Returns pre-extracted text snippets from web pages, ideal for grounding responses in current information.\",\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 maxTokens: {\n type: \"integer\",\n minimum: 1024,\n maximum: 32768,\n description: \"Max tokens in context (default 8192)\",\n },\n maxUrls: {\n type: \"integer\",\n minimum: 1,\n maximum: 50,\n description: \"Maximum URLs to include (default 20)\",\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 {\n BRAVE_WEB_SEARCH_TOOL_DEFINITION,\n BRAVE_LLM_CONTEXT_TOOL_DEFINITION,\n} from \"./defaults.js\";\nimport type { BraveWebSearchParams, BraveLLMContextParams } 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 this.toolManager.addTool<BraveLLMContextParams>(\n BRAVE_LLM_CONTEXT_TOOL_DEFINITION,\n async (args: BraveLLMContextParams) => {\n const result = await this.braveSearch!.llmContext(args.query, {\n freshness: args.freshness,\n maxTokens: args.maxTokens,\n maxUrls: args.maxUrls,\n country: this.config.braveSearch.country,\n searchLang: this.config.braveSearch.searchLang,\n safesearch: this.config.braveSearch.safesearch,\n });\n return JSON.stringify(result);\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 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"]}
package/dist/index.d.cts CHANGED
@@ -31,7 +31,9 @@ declare class ReasoningState {
31
31
  }
32
32
 
33
33
  interface ToolLoopCallbacks {
34
- onToolCall?: (name: string, args: Record<string, unknown>, toolCallId: string) => Promise<string> | string;
34
+ /** Observe or override a tool call. Return undefined/null to delegate to the registered handler. */
35
+ onToolCall?: (name: string, args: Record<string, unknown>, toolCallId: string) => Promise<string | null | undefined> | string | null | undefined;
36
+ /** Called after each tool call completes with the result */
35
37
  onToolResult?: (name: string, result: string) => void;
36
38
  }
37
39
  declare class ToolLoop {
@@ -156,14 +158,7 @@ interface BraveWebSearchParams {
156
158
  count?: number;
157
159
  safesearch?: "off" | "moderate" | "strict";
158
160
  }
159
- interface BraveLLMContextParams {
160
- query: string;
161
- freshness?: "pd" | "pw" | "pm" | "py";
162
- maxTokens?: number;
163
- maxUrls?: number;
164
- }
165
161
  declare const BRAVE_WEB_SEARCH_TOOL_DEFINITION: ToolDefinition;
166
- declare const BRAVE_LLM_CONTEXT_TOOL_DEFINITION: ToolDefinition;
167
162
  declare function resolveConfig(config: DeepSeekConfig): ResolvedConfig;
168
163
 
169
- export { BRAVE_LLM_CONTEXT_TOOL_DEFINITION, BRAVE_WEB_SEARCH_TOOL_DEFINITION, BraveLLMContextOptions, type BraveLLMContextParams, BraveLLMContextResponse, BraveSearchClient, BraveSearchDefaults, BraveSearchError, BraveWebSearchOptions, type BraveWebSearchParams, BraveWebSearchResponse, ChatMessage, ChatResponse, ConfigError, DEFAULT_CONFIG, DeepSeekClient, DeepSeekConfig, DeepSeekError, ModelName, ReasoningEffort, ReasoningState, RegisteredTool, ResolvedConfig, StreamChunk, ThinkingConfig, ToolChoice, ToolDefinition, ToolError, ToolHandler, ToolLoop, type ToolLoopCallbacks, ToolLoopError, ToolManager, ToolResult, resolveConfig };
164
+ export { BRAVE_WEB_SEARCH_TOOL_DEFINITION, BraveLLMContextOptions, BraveLLMContextResponse, BraveSearchClient, BraveSearchDefaults, BraveSearchError, BraveWebSearchOptions, type BraveWebSearchParams, BraveWebSearchResponse, ChatMessage, ChatResponse, ConfigError, DEFAULT_CONFIG, DeepSeekClient, DeepSeekConfig, DeepSeekError, ModelName, ReasoningEffort, ReasoningState, RegisteredTool, ResolvedConfig, StreamChunk, ThinkingConfig, ToolChoice, ToolDefinition, ToolError, ToolHandler, ToolLoop, type ToolLoopCallbacks, ToolLoopError, ToolManager, ToolResult, resolveConfig };
package/dist/index.d.ts CHANGED
@@ -31,7 +31,9 @@ declare class ReasoningState {
31
31
  }
32
32
 
33
33
  interface ToolLoopCallbacks {
34
- onToolCall?: (name: string, args: Record<string, unknown>, toolCallId: string) => Promise<string> | string;
34
+ /** Observe or override a tool call. Return undefined/null to delegate to the registered handler. */
35
+ onToolCall?: (name: string, args: Record<string, unknown>, toolCallId: string) => Promise<string | null | undefined> | string | null | undefined;
36
+ /** Called after each tool call completes with the result */
35
37
  onToolResult?: (name: string, result: string) => void;
36
38
  }
37
39
  declare class ToolLoop {
@@ -156,14 +158,7 @@ interface BraveWebSearchParams {
156
158
  count?: number;
157
159
  safesearch?: "off" | "moderate" | "strict";
158
160
  }
159
- interface BraveLLMContextParams {
160
- query: string;
161
- freshness?: "pd" | "pw" | "pm" | "py";
162
- maxTokens?: number;
163
- maxUrls?: number;
164
- }
165
161
  declare const BRAVE_WEB_SEARCH_TOOL_DEFINITION: ToolDefinition;
166
- declare const BRAVE_LLM_CONTEXT_TOOL_DEFINITION: ToolDefinition;
167
162
  declare function resolveConfig(config: DeepSeekConfig): ResolvedConfig;
168
163
 
169
- export { BRAVE_LLM_CONTEXT_TOOL_DEFINITION, BRAVE_WEB_SEARCH_TOOL_DEFINITION, BraveLLMContextOptions, type BraveLLMContextParams, BraveLLMContextResponse, BraveSearchClient, BraveSearchDefaults, BraveSearchError, BraveWebSearchOptions, type BraveWebSearchParams, BraveWebSearchResponse, ChatMessage, ChatResponse, ConfigError, DEFAULT_CONFIG, DeepSeekClient, DeepSeekConfig, DeepSeekError, ModelName, ReasoningEffort, ReasoningState, RegisteredTool, ResolvedConfig, StreamChunk, ThinkingConfig, ToolChoice, ToolDefinition, ToolError, ToolHandler, ToolLoop, type ToolLoopCallbacks, ToolLoopError, ToolManager, ToolResult, resolveConfig };
164
+ export { BRAVE_WEB_SEARCH_TOOL_DEFINITION, BraveLLMContextOptions, BraveLLMContextResponse, BraveSearchClient, BraveSearchDefaults, BraveSearchError, BraveWebSearchOptions, type BraveWebSearchParams, BraveWebSearchResponse, ChatMessage, ChatResponse, ConfigError, DEFAULT_CONFIG, DeepSeekClient, DeepSeekConfig, DeepSeekError, ModelName, ReasoningEffort, ReasoningState, RegisteredTool, ResolvedConfig, StreamChunk, ThinkingConfig, ToolChoice, ToolDefinition, ToolError, ToolHandler, ToolLoop, type ToolLoopCallbacks, ToolLoopError, ToolManager, ToolResult, resolveConfig };
package/dist/index.js CHANGED
@@ -82,8 +82,9 @@ var BraveSearchClient = class {
82
82
  }
83
83
  });
84
84
  if (!response.ok) {
85
+ const body = await response.text().catch(() => "");
85
86
  throw new BraveSearchError(
86
- `Brave Web Search failed: ${response.status} ${response.statusText}`,
87
+ `Brave Web Search failed: ${response.status} \u2014 ${body || response.statusText}`,
87
88
  response.status
88
89
  );
89
90
  }
@@ -92,8 +93,6 @@ var BraveSearchClient = class {
92
93
  async llmContext(query, options = {}) {
93
94
  const params = new URLSearchParams();
94
95
  params.set("q", query);
95
- if (options.country) params.set("country", options.country);
96
- if (options.searchLang) params.set("search_lang", options.searchLang);
97
96
  if (options.freshness) params.set("freshness", options.freshness);
98
97
  if (options.count !== void 0)
99
98
  params.set("count", String(options.count));
@@ -117,7 +116,6 @@ var BraveSearchClient = class {
117
116
  params.set("context_threshold_mode", options.contextThresholdMode);
118
117
  if (options.enableLocal !== void 0 && options.enableLocal !== null)
119
118
  params.set("enable_local", String(options.enableLocal));
120
- if (options.safesearch) params.set("safesearch", options.safesearch);
121
119
  const url = `${BRAVE_LLM_CONTEXT_URL}?${params.toString()}`;
122
120
  const response = await fetch(url, {
123
121
  headers: {
@@ -126,8 +124,9 @@ var BraveSearchClient = class {
126
124
  }
127
125
  });
128
126
  if (!response.ok) {
127
+ const body = await response.text().catch(() => "");
129
128
  throw new BraveSearchError(
130
- `Brave LLM Context failed: ${response.status} ${response.statusText}`,
129
+ `Brave LLM Context failed: ${response.status} \u2014 ${body || response.statusText}`,
131
130
  response.status
132
131
  );
133
132
  }
@@ -375,13 +374,17 @@ var ToolLoop = class {
375
374
  }
376
375
  if (callbacks?.onToolCall) {
377
376
  const result = await callbacks.onToolCall(name, args, tc.id);
378
- results.push({
379
- tool_call_id: tc.id,
380
- role: "tool",
381
- content: result
382
- });
383
- callbacks.onToolResult?.(name, result);
384
- } else if (this.toolManager.hasHandler(name)) {
377
+ if (result !== void 0 && result !== null) {
378
+ results.push({
379
+ tool_call_id: tc.id,
380
+ role: "tool",
381
+ content: result
382
+ });
383
+ callbacks.onToolResult?.(name, result);
384
+ continue;
385
+ }
386
+ }
387
+ if (this.toolManager.hasHandler(name)) {
385
388
  const tr = await this.toolManager.executeToolCall(name, args, tc.id);
386
389
  results.push(tr);
387
390
  callbacks?.onToolResult?.(name, typeof tr.content === "string" ? tr.content : JSON.stringify(tr.content));
@@ -464,40 +467,6 @@ var BRAVE_WEB_SEARCH_TOOL_DEFINITION = {
464
467
  }
465
468
  }
466
469
  };
467
- var BRAVE_LLM_CONTEXT_TOOL_DEFINITION = {
468
- type: "function",
469
- function: {
470
- name: "brave_llm_context",
471
- description: "Search the web and get content optimized for AI consumption. Returns pre-extracted text snippets from web pages, ideal for grounding responses in current information.",
472
- parameters: {
473
- type: "object",
474
- properties: {
475
- query: {
476
- type: "string",
477
- description: "The search query"
478
- },
479
- freshness: {
480
- type: "string",
481
- enum: ["pd", "pw", "pm", "py"],
482
- description: "Filter results by freshness: pd (24h), pw (7 days), pm (month), py (year)"
483
- },
484
- maxTokens: {
485
- type: "integer",
486
- minimum: 1024,
487
- maximum: 32768,
488
- description: "Max tokens in context (default 8192)"
489
- },
490
- maxUrls: {
491
- type: "integer",
492
- minimum: 1,
493
- maximum: 50,
494
- description: "Maximum URLs to include (default 20)"
495
- }
496
- },
497
- required: ["query"]
498
- }
499
- }
500
- };
501
470
  function resolveConfig(config) {
502
471
  return {
503
472
  deepseekApiKey: config.deepseekApiKey,
@@ -558,20 +527,6 @@ var DeepSeekClient = class {
558
527
  return JSON.stringify(result);
559
528
  }
560
529
  );
561
- this.toolManager.addTool(
562
- BRAVE_LLM_CONTEXT_TOOL_DEFINITION,
563
- async (args) => {
564
- const result = await this.braveSearch.llmContext(args.query, {
565
- freshness: args.freshness,
566
- maxTokens: args.maxTokens,
567
- maxUrls: args.maxUrls,
568
- country: this.config.braveSearch.country,
569
- searchLang: this.config.braveSearch.searchLang,
570
- safesearch: this.config.braveSearch.safesearch
571
- });
572
- return JSON.stringify(result);
573
- }
574
- );
575
530
  }
576
531
  }
577
532
  async chat(messages, options) {
@@ -710,6 +665,6 @@ var DeepSeekClient = class {
710
665
  }
711
666
  };
712
667
 
713
- export { BRAVE_LLM_CONTEXT_TOOL_DEFINITION, BRAVE_LLM_CONTEXT_URL, BRAVE_WEB_SEARCH_TOOL_DEFINITION, BRAVE_WEB_SEARCH_URL, BraveSearchClient, BraveSearchError, ConfigError, DEEPSEEK_BASE_URL, DEEPSEEK_BETA_BASE_URL, DEEPSEEK_MODELS, DEFAULT_CONFIG, DEFAULT_MAX_TOOL_LOOP_ITERATIONS, DeepSeekClient, DeepSeekError, ReasoningState, ToolError, ToolLoop, ToolLoopError, ToolManager, resolveConfig };
668
+ export { BRAVE_LLM_CONTEXT_URL, BRAVE_WEB_SEARCH_TOOL_DEFINITION, BRAVE_WEB_SEARCH_URL, BraveSearchClient, BraveSearchError, ConfigError, DEEPSEEK_BASE_URL, DEEPSEEK_BETA_BASE_URL, DEEPSEEK_MODELS, DEFAULT_CONFIG, DEFAULT_MAX_TOOL_LOOP_ITERATIONS, DeepSeekClient, DeepSeekError, ReasoningState, ToolError, ToolLoop, ToolLoopError, ToolManager, resolveConfig };
714
669
  //# sourceMappingURL=index.js.map
715
670
  //# sourceMappingURL=index.js.map
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 throw new BraveSearchError(\n `Brave Web Search failed: ${response.status} ${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.country) params.set(\"country\", options.country);\n if (options.searchLang) params.set(\"search_lang\", options.searchLang);\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 if (options.safesearch) params.set(\"safesearch\", options.safesearch);\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 throw new BraveSearchError(\n `Brave LLM Context failed: ${response.status} ${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 onToolCall?: (\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ) => Promise<string> | string;\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 results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: result,\n });\n callbacks.onToolResult?.(name, result);\n } else 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\nexport interface BraveLLMContextParams {\n query: string;\n freshness?: \"pd\" | \"pw\" | \"pm\" | \"py\";\n maxTokens?: number;\n maxUrls?: number;\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\nexport const BRAVE_LLM_CONTEXT_TOOL_DEFINITION: ToolDefinition = {\n type: \"function\",\n function: {\n name: \"brave_llm_context\",\n description:\n \"Search the web and get content optimized for AI consumption. Returns pre-extracted text snippets from web pages, ideal for grounding responses in current information.\",\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 maxTokens: {\n type: \"integer\",\n minimum: 1024,\n maximum: 32768,\n description: \"Max tokens in context (default 8192)\",\n },\n maxUrls: {\n type: \"integer\",\n minimum: 1,\n maximum: 50,\n description: \"Maximum URLs to include (default 20)\",\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 {\n BRAVE_WEB_SEARCH_TOOL_DEFINITION,\n BRAVE_LLM_CONTEXT_TOOL_DEFINITION,\n} from \"./defaults.js\";\nimport type { BraveWebSearchParams, BraveLLMContextParams } 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 this.toolManager.addTool<BraveLLMContextParams>(\n BRAVE_LLM_CONTEXT_TOOL_DEFINITION,\n async (args: BraveLLMContextParams) => {\n const result = await this.braveSearch!.llmContext(args.query, {\n freshness: args.freshness,\n maxTokens: args.maxTokens,\n maxUrls: args.maxUrls,\n country: this.config.braveSearch.country,\n searchLang: this.config.braveSearch.searchLang,\n safesearch: this.config.braveSearch.safesearch,\n });\n return JSON.stringify(result);\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 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepseek-toolkit",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
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",