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