deepseek-toolkit 0.1.4 → 0.1.6

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
@@ -217,12 +217,13 @@ var ReasoningState = class {
217
217
  this.activeToolCall = false;
218
218
  }
219
219
  cleanMessageForContext(message) {
220
- if (this.activeToolCall) {
221
- return message;
222
- }
223
- if (message.reasoning_content && !message.tool_calls?.length) {
224
- const { reasoning_content: _, ...rest } = message;
225
- return rest;
220
+ if (this.activeToolCall) return message;
221
+ if (message.role === "assistant" && "reasoning_content" in message) {
222
+ const msg = message;
223
+ if (msg.reasoning_content && !msg.tool_calls?.length) {
224
+ const { reasoning_content: _, ...rest } = msg;
225
+ return rest;
226
+ }
226
227
  }
227
228
  return message;
228
229
  }
@@ -252,7 +253,10 @@ var ToolLoop = class {
252
253
  this.reasoning.startToolCallTurn();
253
254
  const choice = response.choices[0];
254
255
  if (!choice) break;
255
- const toolCalls = choice.message.tool_calls ?? [];
256
+ const rawCalls = choice.message.tool_calls ?? [];
257
+ const toolCalls = rawCalls.filter(
258
+ (tc) => tc.type === "function"
259
+ );
256
260
  const toolResults = await this.executeToolCalls(toolCalls, callbacks);
257
261
  messages.push(choice.message);
258
262
  for (const tr of toolResults) {
@@ -386,7 +390,7 @@ var ToolLoop = class {
386
390
  } else if (this.toolManager.hasHandler(name)) {
387
391
  const tr = await this.toolManager.executeToolCall(name, args, tc.id);
388
392
  results.push(tr);
389
- callbacks?.onToolResult?.(name, tr.content);
393
+ callbacks?.onToolResult?.(name, typeof tr.content === "string" ? tr.content : JSON.stringify(tr.content));
390
394
  } else {
391
395
  results.push({
392
396
  tool_call_id: tc.id,
@@ -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 } 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) {\n return message;\n }\n if (message.reasoning_content && !message.tool_calls?.length) {\n const { reasoning_content: _, ...rest } = message;\n return rest as ChatMessage;\n }\n return message;\n }\n}\n","import type OpenAI from \"openai\";\nimport type { ChatMessage, ChatResponse, StreamChunk } from \"./types/chat.js\";\nimport type { ToolDefinition, 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 toolCalls = choice.message.tool_calls ?? [];\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: Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>,\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, 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 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"]}
package/dist/index.js CHANGED
@@ -211,12 +211,13 @@ var ReasoningState = class {
211
211
  this.activeToolCall = false;
212
212
  }
213
213
  cleanMessageForContext(message) {
214
- if (this.activeToolCall) {
215
- return message;
216
- }
217
- if (message.reasoning_content && !message.tool_calls?.length) {
218
- const { reasoning_content: _, ...rest } = message;
219
- return rest;
214
+ if (this.activeToolCall) return message;
215
+ if (message.role === "assistant" && "reasoning_content" in message) {
216
+ const msg = message;
217
+ if (msg.reasoning_content && !msg.tool_calls?.length) {
218
+ const { reasoning_content: _, ...rest } = msg;
219
+ return rest;
220
+ }
220
221
  }
221
222
  return message;
222
223
  }
@@ -246,7 +247,10 @@ var ToolLoop = class {
246
247
  this.reasoning.startToolCallTurn();
247
248
  const choice = response.choices[0];
248
249
  if (!choice) break;
249
- const toolCalls = choice.message.tool_calls ?? [];
250
+ const rawCalls = choice.message.tool_calls ?? [];
251
+ const toolCalls = rawCalls.filter(
252
+ (tc) => tc.type === "function"
253
+ );
250
254
  const toolResults = await this.executeToolCalls(toolCalls, callbacks);
251
255
  messages.push(choice.message);
252
256
  for (const tr of toolResults) {
@@ -380,7 +384,7 @@ var ToolLoop = class {
380
384
  } else if (this.toolManager.hasHandler(name)) {
381
385
  const tr = await this.toolManager.executeToolCall(name, args, tc.id);
382
386
  results.push(tr);
383
- callbacks?.onToolResult?.(name, tr.content);
387
+ callbacks?.onToolResult?.(name, typeof tr.content === "string" ? tr.content : JSON.stringify(tr.content));
384
388
  } else {
385
389
  results.push({
386
390
  tool_call_id: tc.id,
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 } 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) {\n return message;\n }\n if (message.reasoning_content && !message.tool_calls?.length) {\n const { reasoning_content: _, ...rest } = message;\n return rest as ChatMessage;\n }\n return message;\n }\n}\n","import type OpenAI from \"openai\";\nimport type { ChatMessage, ChatResponse, StreamChunk } from \"./types/chat.js\";\nimport type { ToolDefinition, 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 toolCalls = choice.message.tool_calls ?? [];\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: Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>,\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, 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 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,3 +1,5 @@
1
+ import OpenAI from 'openai';
2
+
1
3
  declare const DEEPSEEK_MODELS: {
2
4
  readonly V4_PRO: "deepseek-v4-pro";
3
5
  readonly V4_FLASH: "deepseek-v4-flash";
@@ -52,77 +54,37 @@ interface ToolDefinition {
52
54
  function: {
53
55
  name: string;
54
56
  description: string;
55
- parameters: Record<string, unknown>;
57
+ parameters: {
58
+ type: "object";
59
+ properties: Record<string, unknown>;
60
+ required?: string[];
61
+ additionalProperties?: boolean;
62
+ };
56
63
  strict?: boolean;
57
64
  };
58
65
  }
59
- interface ToolCall {
60
- id: string;
61
- type: "function";
62
- function: {
63
- name: string;
64
- arguments: string;
65
- };
66
- }
67
- interface ToolResult {
68
- tool_call_id: string;
69
- role: "tool";
70
- content: string;
71
- }
66
+ type ToolCall = OpenAI.Chat.Completions.ChatCompletionMessageFunctionToolCall;
67
+ type ToolResult = OpenAI.Chat.Completions.ChatCompletionToolMessageParam;
68
+ type ToolChoice = OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;
72
69
  type ToolHandler<TParams = Record<string, unknown>> = (args: TParams) => Promise<string> | string;
73
70
  interface RegisteredTool {
74
71
  definition: ToolDefinition;
75
72
  handler?: ToolHandler;
76
73
  }
77
- type ToolChoice = "auto" | "none" | "required" | {
78
- type: "function";
79
- function: {
80
- name: string;
81
- };
82
- };
83
74
 
84
- interface ChatMessage {
85
- role: "system" | "user" | "assistant" | "tool";
75
+ /** A message in the conversation. Extends OpenAI's types with DeepSeek fields. */
76
+ type ChatMessage = OpenAI.Chat.Completions.ChatCompletionSystemMessageParam | OpenAI.Chat.Completions.ChatCompletionUserMessageParam | DeepSeekAssistantMessage | OpenAI.Chat.Completions.ChatCompletionToolMessageParam;
77
+ /** Assistant message with DeepSeek thinking-mode fields */
78
+ interface DeepSeekAssistantMessage {
79
+ role: "assistant";
86
80
  content: string | null;
87
81
  name?: string;
88
82
  reasoning_content?: string | null;
89
- tool_calls?: ToolCall[] | null;
90
- tool_call_id?: string;
83
+ tool_calls?: OpenAI.Chat.Completions.ChatCompletionMessageToolCall[] | null;
91
84
  prefix?: boolean;
92
85
  }
93
- interface ChatResponse {
94
- id: string;
95
- model: string;
96
- choices: {
97
- index: number;
98
- message: ChatMessage;
99
- finish_reason: "stop" | "length" | "tool_calls" | "content_filter" | "insufficient_system_resource";
100
- }[];
101
- usage?: {
102
- prompt_tokens: number;
103
- completion_tokens: number;
104
- total_tokens: number;
105
- };
106
- }
107
- interface StreamChunk {
108
- id: string;
109
- model: string;
110
- choices: {
111
- index: number;
112
- delta: {
113
- role?: string;
114
- content?: string;
115
- reasoning_content?: string;
116
- tool_calls?: Partial<ToolCall>[];
117
- };
118
- finish_reason: string | null;
119
- }[];
120
- usage?: {
121
- prompt_tokens: number;
122
- completion_tokens: number;
123
- total_tokens: number;
124
- };
125
- }
86
+ type ChatResponse = OpenAI.Chat.Completions.ChatCompletion;
87
+ type StreamChunk = OpenAI.Chat.Completions.ChatCompletionChunk;
126
88
 
127
89
  type SafeSearch = "off" | "moderate" | "strict";
128
90
  type Freshness = "pd" | "pw" | "pm" | "py";
@@ -1,3 +1,5 @@
1
+ import OpenAI from 'openai';
2
+
1
3
  declare const DEEPSEEK_MODELS: {
2
4
  readonly V4_PRO: "deepseek-v4-pro";
3
5
  readonly V4_FLASH: "deepseek-v4-flash";
@@ -52,77 +54,37 @@ interface ToolDefinition {
52
54
  function: {
53
55
  name: string;
54
56
  description: string;
55
- parameters: Record<string, unknown>;
57
+ parameters: {
58
+ type: "object";
59
+ properties: Record<string, unknown>;
60
+ required?: string[];
61
+ additionalProperties?: boolean;
62
+ };
56
63
  strict?: boolean;
57
64
  };
58
65
  }
59
- interface ToolCall {
60
- id: string;
61
- type: "function";
62
- function: {
63
- name: string;
64
- arguments: string;
65
- };
66
- }
67
- interface ToolResult {
68
- tool_call_id: string;
69
- role: "tool";
70
- content: string;
71
- }
66
+ type ToolCall = OpenAI.Chat.Completions.ChatCompletionMessageFunctionToolCall;
67
+ type ToolResult = OpenAI.Chat.Completions.ChatCompletionToolMessageParam;
68
+ type ToolChoice = OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;
72
69
  type ToolHandler<TParams = Record<string, unknown>> = (args: TParams) => Promise<string> | string;
73
70
  interface RegisteredTool {
74
71
  definition: ToolDefinition;
75
72
  handler?: ToolHandler;
76
73
  }
77
- type ToolChoice = "auto" | "none" | "required" | {
78
- type: "function";
79
- function: {
80
- name: string;
81
- };
82
- };
83
74
 
84
- interface ChatMessage {
85
- role: "system" | "user" | "assistant" | "tool";
75
+ /** A message in the conversation. Extends OpenAI's types with DeepSeek fields. */
76
+ type ChatMessage = OpenAI.Chat.Completions.ChatCompletionSystemMessageParam | OpenAI.Chat.Completions.ChatCompletionUserMessageParam | DeepSeekAssistantMessage | OpenAI.Chat.Completions.ChatCompletionToolMessageParam;
77
+ /** Assistant message with DeepSeek thinking-mode fields */
78
+ interface DeepSeekAssistantMessage {
79
+ role: "assistant";
86
80
  content: string | null;
87
81
  name?: string;
88
82
  reasoning_content?: string | null;
89
- tool_calls?: ToolCall[] | null;
90
- tool_call_id?: string;
83
+ tool_calls?: OpenAI.Chat.Completions.ChatCompletionMessageToolCall[] | null;
91
84
  prefix?: boolean;
92
85
  }
93
- interface ChatResponse {
94
- id: string;
95
- model: string;
96
- choices: {
97
- index: number;
98
- message: ChatMessage;
99
- finish_reason: "stop" | "length" | "tool_calls" | "content_filter" | "insufficient_system_resource";
100
- }[];
101
- usage?: {
102
- prompt_tokens: number;
103
- completion_tokens: number;
104
- total_tokens: number;
105
- };
106
- }
107
- interface StreamChunk {
108
- id: string;
109
- model: string;
110
- choices: {
111
- index: number;
112
- delta: {
113
- role?: string;
114
- content?: string;
115
- reasoning_content?: string;
116
- tool_calls?: Partial<ToolCall>[];
117
- };
118
- finish_reason: string | null;
119
- }[];
120
- usage?: {
121
- prompt_tokens: number;
122
- completion_tokens: number;
123
- total_tokens: number;
124
- };
125
- }
86
+ type ChatResponse = OpenAI.Chat.Completions.ChatCompletion;
87
+ type StreamChunk = OpenAI.Chat.Completions.ChatCompletionChunk;
126
88
 
127
89
  type SafeSearch = "off" | "moderate" | "strict";
128
90
  type Freshness = "pd" | "pw" | "pm" | "py";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepseek-toolkit",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
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",