deepseek-toolkit 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +15 -61
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -9
- package/dist/index.d.ts +4 -9
- package/dist/index.js +16 -61
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -88,8 +88,9 @@ var BraveSearchClient = class {
|
|
|
88
88
|
}
|
|
89
89
|
});
|
|
90
90
|
if (!response.ok) {
|
|
91
|
+
const body = await response.text().catch(() => "");
|
|
91
92
|
throw new BraveSearchError(
|
|
92
|
-
`Brave Web Search failed: ${response.status} ${response.statusText}`,
|
|
93
|
+
`Brave Web Search failed: ${response.status} \u2014 ${body || response.statusText}`,
|
|
93
94
|
response.status
|
|
94
95
|
);
|
|
95
96
|
}
|
|
@@ -98,8 +99,6 @@ var BraveSearchClient = class {
|
|
|
98
99
|
async llmContext(query, options = {}) {
|
|
99
100
|
const params = new URLSearchParams();
|
|
100
101
|
params.set("q", query);
|
|
101
|
-
if (options.country) params.set("country", options.country);
|
|
102
|
-
if (options.searchLang) params.set("search_lang", options.searchLang);
|
|
103
102
|
if (options.freshness) params.set("freshness", options.freshness);
|
|
104
103
|
if (options.count !== void 0)
|
|
105
104
|
params.set("count", String(options.count));
|
|
@@ -123,7 +122,6 @@ var BraveSearchClient = class {
|
|
|
123
122
|
params.set("context_threshold_mode", options.contextThresholdMode);
|
|
124
123
|
if (options.enableLocal !== void 0 && options.enableLocal !== null)
|
|
125
124
|
params.set("enable_local", String(options.enableLocal));
|
|
126
|
-
if (options.safesearch) params.set("safesearch", options.safesearch);
|
|
127
125
|
const url = `${BRAVE_LLM_CONTEXT_URL}?${params.toString()}`;
|
|
128
126
|
const response = await fetch(url, {
|
|
129
127
|
headers: {
|
|
@@ -132,8 +130,9 @@ var BraveSearchClient = class {
|
|
|
132
130
|
}
|
|
133
131
|
});
|
|
134
132
|
if (!response.ok) {
|
|
133
|
+
const body = await response.text().catch(() => "");
|
|
135
134
|
throw new BraveSearchError(
|
|
136
|
-
`Brave LLM Context failed: ${response.status} ${response.statusText}`,
|
|
135
|
+
`Brave LLM Context failed: ${response.status} \u2014 ${body || response.statusText}`,
|
|
137
136
|
response.status
|
|
138
137
|
);
|
|
139
138
|
}
|
|
@@ -381,13 +380,17 @@ var ToolLoop = class {
|
|
|
381
380
|
}
|
|
382
381
|
if (callbacks?.onToolCall) {
|
|
383
382
|
const result = await callbacks.onToolCall(name, args, tc.id);
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
383
|
+
if (result !== void 0 && result !== null) {
|
|
384
|
+
results.push({
|
|
385
|
+
tool_call_id: tc.id,
|
|
386
|
+
role: "tool",
|
|
387
|
+
content: result
|
|
388
|
+
});
|
|
389
|
+
callbacks.onToolResult?.(name, result);
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
if (this.toolManager.hasHandler(name)) {
|
|
391
394
|
const tr = await this.toolManager.executeToolCall(name, args, tc.id);
|
|
392
395
|
results.push(tr);
|
|
393
396
|
callbacks?.onToolResult?.(name, typeof tr.content === "string" ? tr.content : JSON.stringify(tr.content));
|
|
@@ -470,40 +473,6 @@ var BRAVE_WEB_SEARCH_TOOL_DEFINITION = {
|
|
|
470
473
|
}
|
|
471
474
|
}
|
|
472
475
|
};
|
|
473
|
-
var BRAVE_LLM_CONTEXT_TOOL_DEFINITION = {
|
|
474
|
-
type: "function",
|
|
475
|
-
function: {
|
|
476
|
-
name: "brave_llm_context",
|
|
477
|
-
description: "Search the web and get content optimized for AI consumption. Returns pre-extracted text snippets from web pages, ideal for grounding responses in current information.",
|
|
478
|
-
parameters: {
|
|
479
|
-
type: "object",
|
|
480
|
-
properties: {
|
|
481
|
-
query: {
|
|
482
|
-
type: "string",
|
|
483
|
-
description: "The search query"
|
|
484
|
-
},
|
|
485
|
-
freshness: {
|
|
486
|
-
type: "string",
|
|
487
|
-
enum: ["pd", "pw", "pm", "py"],
|
|
488
|
-
description: "Filter results by freshness: pd (24h), pw (7 days), pm (month), py (year)"
|
|
489
|
-
},
|
|
490
|
-
maxTokens: {
|
|
491
|
-
type: "integer",
|
|
492
|
-
minimum: 1024,
|
|
493
|
-
maximum: 32768,
|
|
494
|
-
description: "Max tokens in context (default 8192)"
|
|
495
|
-
},
|
|
496
|
-
maxUrls: {
|
|
497
|
-
type: "integer",
|
|
498
|
-
minimum: 1,
|
|
499
|
-
maximum: 50,
|
|
500
|
-
description: "Maximum URLs to include (default 20)"
|
|
501
|
-
}
|
|
502
|
-
},
|
|
503
|
-
required: ["query"]
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
};
|
|
507
476
|
function resolveConfig(config) {
|
|
508
477
|
return {
|
|
509
478
|
deepseekApiKey: config.deepseekApiKey,
|
|
@@ -564,20 +533,6 @@ var DeepSeekClient = class {
|
|
|
564
533
|
return JSON.stringify(result);
|
|
565
534
|
}
|
|
566
535
|
);
|
|
567
|
-
this.toolManager.addTool(
|
|
568
|
-
BRAVE_LLM_CONTEXT_TOOL_DEFINITION,
|
|
569
|
-
async (args) => {
|
|
570
|
-
const result = await this.braveSearch.llmContext(args.query, {
|
|
571
|
-
freshness: args.freshness,
|
|
572
|
-
maxTokens: args.maxTokens,
|
|
573
|
-
maxUrls: args.maxUrls,
|
|
574
|
-
country: this.config.braveSearch.country,
|
|
575
|
-
searchLang: this.config.braveSearch.searchLang,
|
|
576
|
-
safesearch: this.config.braveSearch.safesearch
|
|
577
|
-
});
|
|
578
|
-
return JSON.stringify(result);
|
|
579
|
-
}
|
|
580
|
-
);
|
|
581
536
|
}
|
|
582
537
|
}
|
|
583
538
|
async chat(messages, options) {
|
|
@@ -716,7 +671,6 @@ var DeepSeekClient = class {
|
|
|
716
671
|
}
|
|
717
672
|
};
|
|
718
673
|
|
|
719
|
-
exports.BRAVE_LLM_CONTEXT_TOOL_DEFINITION = BRAVE_LLM_CONTEXT_TOOL_DEFINITION;
|
|
720
674
|
exports.BRAVE_LLM_CONTEXT_URL = BRAVE_LLM_CONTEXT_URL;
|
|
721
675
|
exports.BRAVE_WEB_SEARCH_TOOL_DEFINITION = BRAVE_WEB_SEARCH_TOOL_DEFINITION;
|
|
722
676
|
exports.BRAVE_WEB_SEARCH_URL = BRAVE_WEB_SEARCH_URL;
|
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 throw new BraveSearchError(\n `Brave Web Search failed: ${response.status} ${response.statusText}`,\n response.status,\n );\n }\n\n return response.json() as Promise<BraveWebSearchResponse>;\n }\n\n async llmContext(\n query: string,\n options: BraveLLMContextOptions = {},\n ): Promise<BraveLLMContextResponse> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n\n if (options.country) params.set(\"country\", options.country);\n if (options.searchLang) params.set(\"search_lang\", options.searchLang);\n if (options.freshness) params.set(\"freshness\", options.freshness);\n if (options.count !== undefined)\n params.set(\"count\", String(options.count));\n if (options.maxUrls !== undefined)\n params.set(\"maximum_number_of_urls\", String(options.maxUrls));\n if (options.maxTokens !== undefined)\n params.set(\"maximum_number_of_tokens\", String(options.maxTokens));\n if (options.maxSnippets !== undefined)\n params.set(\"maximum_number_of_snippets\", String(options.maxSnippets));\n if (options.maxTokensPerUrl !== undefined)\n params.set(\n \"maximum_number_of_tokens_per_url\",\n String(options.maxTokensPerUrl),\n );\n if (options.maxSnippetsPerUrl !== undefined)\n params.set(\n \"maximum_number_of_snippets_per_url\",\n String(options.maxSnippetsPerUrl),\n );\n if (options.contextThresholdMode)\n params.set(\"context_threshold_mode\", options.contextThresholdMode);\n if (options.enableLocal !== undefined && options.enableLocal !== null)\n params.set(\"enable_local\", String(options.enableLocal));\n if (options.safesearch) params.set(\"safesearch\", options.safesearch);\n\n const url = `${BRAVE_LLM_CONTEXT_URL}?${params.toString()}`;\n\n const response = await fetch(url, {\n headers: {\n \"X-Subscription-Token\": this.apiKey,\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new BraveSearchError(\n `Brave LLM Context failed: ${response.status} ${response.statusText}`,\n response.status,\n );\n }\n\n return response.json() as Promise<BraveLLMContextResponse>;\n }\n}\n","import type {\n ToolDefinition,\n ToolHandler,\n RegisteredTool,\n ToolResult,\n} from \"./types/tools.js\";\nimport { ToolError } from \"./errors.js\";\n\nexport class ToolManager {\n private tools: Map<string, RegisteredTool> = new Map();\n\n addTool<TParams = Record<string, unknown>>(\n definition: ToolDefinition,\n handler?: ToolHandler<TParams>,\n ): void {\n const name = definition.function.name;\n if (this.tools.has(name)) {\n throw new ToolError(`Tool \"${name}\" is already registered`, name);\n }\n // Safe: at runtime handler receives Record<string,unknown> from JSON.parse\n this.tools.set(name, { definition, handler: handler as ToolHandler });\n }\n\n addTools<TParams = Record<string, unknown>>(\n tools: Array<{\n definition: ToolDefinition;\n handler?: ToolHandler<TParams>;\n }>,\n ): void {\n for (const tool of tools) {\n this.addTool(tool.definition, tool.handler);\n }\n }\n\n removeTool(name: string): boolean {\n return this.tools.delete(name);\n }\n\n getTool(name: string): RegisteredTool | undefined {\n return this.tools.get(name);\n }\n\n hasTool(name: string): boolean {\n return this.tools.has(name);\n }\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => t.definition);\n }\n\n getHandler(name: string): ToolHandler | undefined {\n return this.tools.get(name)?.handler;\n }\n\n hasHandler(name: string): boolean {\n const tool = this.tools.get(name);\n return tool !== undefined && tool.handler !== undefined;\n }\n\n async executeToolCall(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ): Promise<ToolResult> {\n const handler = this.getHandler(name);\n if (!handler) {\n throw new ToolError(\n `No handler registered for tool \"${name}\". Provide a handler via addTool() to enable automatic execution.`,\n name,\n );\n }\n const result = await handler(args);\n return {\n tool_call_id: toolCallId,\n role: \"tool\",\n content: typeof result === \"string\" ? result : JSON.stringify(result),\n };\n }\n\n get registeredCount(): number {\n return this.tools.size;\n }\n\n get registeredNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n clear(): void {\n this.tools.clear();\n }\n}\n","import type { ChatMessage, DeepSeekAssistantMessage } from \"./types/chat.js\";\n\nexport class ReasoningState {\n private activeToolCall = false;\n\n startToolCallTurn(): void {\n this.activeToolCall = true;\n }\n\n endToolCallTurn(): void {\n this.activeToolCall = false;\n }\n\n shouldIncludeReasoning(): boolean {\n return this.activeToolCall;\n }\n\n reset(): void {\n this.activeToolCall = false;\n }\n\n cleanMessageForContext(message: ChatMessage): ChatMessage {\n if (this.activeToolCall) return message;\n\n if (message.role === \"assistant\" && \"reasoning_content\" in message) {\n const msg = message as DeepSeekAssistantMessage;\n if (msg.reasoning_content && !msg.tool_calls?.length) {\n const { reasoning_content: _, ...rest } = msg;\n return rest as ChatMessage;\n }\n }\n return message;\n }\n}\n","import type OpenAI from \"openai\";\nimport type { ChatMessage, ChatResponse, StreamChunk } from \"./types/chat.js\";\nimport type { ToolDefinition, ToolCall, ToolChoice } from \"./types/tools.js\";\nimport type { ResolvedConfig } from \"./types/config.js\";\nimport { ToolManager } from \"./tool-manager.js\";\nimport { ReasoningState } from \"./reasoning.js\";\nimport { ToolLoopError } from \"./errors.js\";\n\nexport interface ToolLoopCallbacks {\n onToolCall?: (\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ) => Promise<string> | string;\n onToolResult?: (name: string, result: string) => void;\n}\n\nexport class ToolLoop {\n private reasoning: ReasoningState;\n\n constructor(\n private openai: OpenAI,\n private config: ResolvedConfig,\n private toolManager: ToolManager,\n ) {\n this.reasoning = new ReasoningState();\n }\n\n async run(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n callbacks?: ToolLoopCallbacks,\n ): Promise<ChatResponse> {\n const allTools = [\n ...this.toolManager.getToolDefinitions(),\n ...(tools ?? []),\n ];\n\n let response = await this.makeRequest(messages, allTools, toolChoice);\n let iterations = 0;\n\n while (this.hasToolCalls(response) && iterations < this.config.maxToolLoopIterations) {\n iterations++;\n this.reasoning.startToolCallTurn();\n\n const choice = response.choices[0];\n if (!choice) break;\n\n const rawCalls = choice.message.tool_calls ?? [];\n const toolCalls = rawCalls.filter(\n (tc): tc is ToolCall => tc.type === \"function\",\n );\n const toolResults = await this.executeToolCalls(toolCalls, callbacks);\n\n messages.push(choice.message);\n for (const tr of toolResults) {\n messages.push(tr);\n }\n\n response = await this.makeRequest(messages, allTools, toolChoice);\n this.reasoning.endToolCallTurn();\n }\n\n if (iterations >= this.config.maxToolLoopIterations) {\n const lastChoice = response.choices[0];\n if (lastChoice && this.hasToolCallsInChoice(response)) {\n throw new ToolLoopError(\n `Tool call loop exceeded maximum iterations (${this.config.maxToolLoopIterations})`,\n iterations,\n );\n }\n }\n\n return response;\n }\n\n async runStream(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n callbacks?: ToolLoopCallbacks,\n ): Promise<AsyncIterable<StreamChunk>> {\n const allTools = [\n ...this.toolManager.getToolDefinitions(),\n ...(tools ?? []),\n ];\n\n let streamResult = await this.makeStreamRequest(messages, allTools, toolChoice);\n\n let iterations = 0;\n let accumulatedToolCalls: Array<{\n id: string;\n name: string;\n arguments: string;\n }> = [];\n let finalChunks: StreamChunk[] = [];\n\n for await (const chunk of streamResult) {\n const delta = chunk.choices[0]?.delta;\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (tc.id) {\n accumulatedToolCalls.push({\n id: tc.id,\n name: tc.function?.name ?? \"\",\n arguments: tc.function?.arguments ?? \"\",\n });\n } else if (tc.function?.arguments) {\n const existing = accumulatedToolCalls[accumulatedToolCalls.length - 1];\n if (existing) {\n existing.arguments += tc.function.arguments;\n }\n }\n }\n }\n finalChunks.push(chunk);\n }\n\n if (accumulatedToolCalls.length > 0 && iterations < this.config.maxToolLoopIterations) {\n this.reasoning.startToolCallTurn();\n\n const toolResults = await this.executeToolCalls(\n accumulatedToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n callbacks,\n );\n\n const assistantMsg: ChatMessage = {\n role: \"assistant\",\n content: null,\n tool_calls: accumulatedToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n };\n messages.push(assistantMsg);\n for (const tr of toolResults) {\n messages.push(tr);\n }\n\n const nextResponse = await this.makeStreamRequest(messages, allTools, toolChoice);\n this.reasoning.endToolCallTurn();\n return nextResponse;\n }\n\n return this.chunksToAsyncIterable(finalChunks);\n }\n\n private async makeRequest(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n ): Promise<ChatResponse> {\n const params = {\n model: this.config.model,\n messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n reasoning_effort: this.config.reasoningEffort,\n thinking: this.config.thinking,\n } as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming;\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.Completions.ChatCompletionTool[];\n params.tool_choice = (toolChoice ?? \"auto\") as OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;\n }\n if (this.config.maxTokens !== undefined) params.max_tokens = this.config.maxTokens;\n if (this.config.temperature !== undefined) params.temperature = this.config.temperature;\n if (this.config.topP !== undefined) params.top_p = this.config.topP;\n\n const result = await this.openai.chat.completions.create(params);\n return result as unknown as ChatResponse;\n }\n\n private async makeStreamRequest(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n ): Promise<AsyncIterable<StreamChunk>> {\n const params = {\n model: this.config.model,\n messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n stream: true as const,\n reasoning_effort: this.config.reasoningEffort,\n thinking: this.config.thinking,\n } as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming;\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.Completions.ChatCompletionTool[];\n params.tool_choice = (toolChoice ?? \"auto\") as OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;\n }\n if (this.config.maxTokens !== undefined) params.max_tokens = this.config.maxTokens;\n if (this.config.temperature !== undefined) params.temperature = this.config.temperature;\n if (this.config.topP !== undefined) params.top_p = this.config.topP;\n\n const stream = await this.openai.chat.completions.create(params);\n return stream as unknown as AsyncIterable<StreamChunk>;\n }\n\n private async executeToolCalls(\n toolCalls: ToolCall[],\n callbacks?: ToolLoopCallbacks,\n ) {\n const results = [];\n for (const tc of toolCalls) {\n const name = tc.function.name;\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n args = {};\n }\n\n if (callbacks?.onToolCall) {\n const result = await callbacks.onToolCall(name, args, tc.id);\n results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: result,\n });\n callbacks.onToolResult?.(name, result);\n } else if (this.toolManager.hasHandler(name)) {\n const tr = await this.toolManager.executeToolCall(name, args, tc.id);\n results.push(tr);\n callbacks?.onToolResult?.(name, typeof tr.content === \"string\" ? tr.content : JSON.stringify(tr.content));\n } else {\n results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: `Tool \"${name}\" has no handler registered. Register a handler to enable automatic execution.`,\n });\n }\n }\n return results;\n }\n\n private hasToolCalls(response: ChatResponse): boolean {\n return this.hasToolCallsInChoice(response);\n }\n\n private hasToolCallsInChoice(response: ChatResponse): boolean {\n const choice = response.choices[0];\n if (!choice) return false;\n return (\n choice.finish_reason === \"tool_calls\" &&\n (choice.message.tool_calls?.length ?? 0) > 0\n );\n }\n\n private async *chunksToAsyncIterable(\n chunks: StreamChunk[],\n ): AsyncIterable<StreamChunk> {\n for (const chunk of chunks) {\n yield chunk;\n }\n }\n\n get reasoningState(): ReasoningState {\n return this.reasoning;\n }\n\n resetReasoning(): void {\n this.reasoning.reset();\n }\n}\n","import type { DeepSeekConfig, ResolvedConfig } from \"./types/config.js\";\nimport type { ToolDefinition } from \"./types/tools.js\";\nimport {\n DEEPSEEK_MODELS,\n DEEPSEEK_BASE_URL,\n DEFAULT_MAX_TOOL_LOOP_ITERATIONS,\n} from \"./types/models.js\";\n\nexport const DEFAULT_CONFIG = {\n model: DEEPSEEK_MODELS.V4_PRO,\n baseURL: DEEPSEEK_BASE_URL,\n thinking: { type: \"enabled\" as const },\n reasoningEffort: \"high\" as const,\n braveSearch: {\n safesearch: \"off\" as const,\n freshness: undefined as \"pd\" | \"pw\" | \"pm\" | \"py\" | undefined,\n country: \"US\",\n searchLang: \"en\",\n count: 10,\n },\n maxToolLoopIterations: DEFAULT_MAX_TOOL_LOOP_ITERATIONS,\n};\n\n// -- Typed params for built-in tools ------------------------------------------\n\nexport interface BraveWebSearchParams {\n query: string;\n freshness?: \"pd\" | \"pw\" | \"pm\" | \"py\";\n count?: number;\n safesearch?: \"off\" | \"moderate\" | \"strict\";\n}\n\nexport interface BraveLLMContextParams {\n query: string;\n freshness?: \"pd\" | \"pw\" | \"pm\" | \"py\";\n maxTokens?: number;\n maxUrls?: number;\n}\n\n// -- Built-in tool definitions ------------------------------------------------\n\nexport const BRAVE_WEB_SEARCH_TOOL_DEFINITION: ToolDefinition = {\n type: \"function\",\n function: {\n name: \"brave_web_search\",\n description:\n \"Search the web using Brave Search. Returns web page results with titles, URLs, and descriptions. Use this to find current information, news, documentation, or any web content.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"The search query\",\n },\n freshness: {\n type: \"string\",\n enum: [\"pd\", \"pw\", \"pm\", \"py\"],\n description:\n \"Filter results by freshness: pd (24h), pw (7 days), pm (month), py (year)\",\n },\n count: {\n type: \"integer\",\n minimum: 1,\n maximum: 20,\n description: \"Number of results (max 20)\",\n },\n safesearch: {\n type: \"string\",\n enum: [\"off\", \"moderate\", \"strict\"],\n description: \"Content filter level\",\n },\n },\n required: [\"query\"],\n },\n },\n};\n\nexport const BRAVE_LLM_CONTEXT_TOOL_DEFINITION: ToolDefinition = {\n type: \"function\",\n function: {\n name: \"brave_llm_context\",\n description:\n \"Search the web and get content optimized for AI consumption. Returns pre-extracted text snippets from web pages, ideal for grounding responses in current information.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"The search query\",\n },\n freshness: {\n type: \"string\",\n enum: [\"pd\", \"pw\", \"pm\", \"py\"],\n description:\n \"Filter results by freshness: pd (24h), pw (7 days), pm (month), py (year)\",\n },\n maxTokens: {\n type: \"integer\",\n minimum: 1024,\n maximum: 32768,\n description: \"Max tokens in context (default 8192)\",\n },\n maxUrls: {\n type: \"integer\",\n minimum: 1,\n maximum: 50,\n description: \"Maximum URLs to include (default 20)\",\n },\n },\n required: [\"query\"],\n },\n },\n};\n\n// -- Config resolver ----------------------------------------------------------\n\nexport function resolveConfig(config: DeepSeekConfig): ResolvedConfig {\n return {\n deepseekApiKey: config.deepseekApiKey,\n braveSearchApiKey: config.braveSearchApiKey,\n model: config.model ?? DEFAULT_CONFIG.model,\n baseURL: config.baseURL ?? DEFAULT_CONFIG.baseURL,\n thinking: config.thinking ?? DEFAULT_CONFIG.thinking,\n reasoningEffort: config.reasoningEffort ?? DEFAULT_CONFIG.reasoningEffort,\n braveSearch: {\n safesearch:\n config.braveSearch?.safesearch ?? DEFAULT_CONFIG.braveSearch.safesearch,\n freshness:\n config.braveSearch?.freshness ?? DEFAULT_CONFIG.braveSearch.freshness,\n country:\n config.braveSearch?.country ?? DEFAULT_CONFIG.braveSearch.country,\n searchLang:\n config.braveSearch?.searchLang ?? DEFAULT_CONFIG.braveSearch.searchLang,\n count:\n config.braveSearch?.count ?? DEFAULT_CONFIG.braveSearch.count,\n },\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n topP: config.topP,\n maxToolLoopIterations:\n config.maxToolLoopIterations ?? DEFAULT_CONFIG.maxToolLoopIterations,\n };\n}\n","import OpenAI from \"openai\";\nimport type {\n DeepSeekConfig,\n ResolvedConfig,\n ThinkingConfig,\n ReasoningEffort,\n BraveSearchDefaults,\n} from \"./types/config.js\";\nimport type {\n ToolDefinition,\n ToolHandler,\n RegisteredTool,\n ToolChoice,\n ToolCall,\n ToolResult,\n} from \"./types/tools.js\";\nimport type {\n ChatMessage,\n ChatResponse,\n StreamChunk,\n} from \"./types/chat.js\";\nimport type {\n BraveWebSearchOptions,\n BraveLLMContextOptions,\n BraveWebSearchResponse,\n BraveLLMContextResponse,\n} from \"./types/brave-search.js\";\nimport type { ModelName } from \"./types/models.js\";\nimport { BraveSearchClient } from \"./brave-search.js\";\nimport { ToolManager } from \"./tool-manager.js\";\nimport { ToolLoop, type ToolLoopCallbacks } from \"./tool-loop.js\";\nimport { resolveConfig } from \"./defaults.js\";\nimport {\n BRAVE_WEB_SEARCH_TOOL_DEFINITION,\n BRAVE_LLM_CONTEXT_TOOL_DEFINITION,\n} from \"./defaults.js\";\nimport type { BraveWebSearchParams, BraveLLMContextParams } from \"./defaults.js\";\nimport { ConfigError } from \"./errors.js\";\n\nexport class DeepSeekClient {\n private config: ResolvedConfig;\n private openai: OpenAI;\n private braveSearch?: BraveSearchClient;\n private toolManager: ToolManager;\n private toolLoop: ToolLoop;\n\n constructor(config: DeepSeekConfig) {\n if (!config.deepseekApiKey) {\n throw new ConfigError(\"deepseekApiKey is required\");\n }\n this.config = resolveConfig(config);\n\n this.openai = new OpenAI({\n apiKey: this.config.deepseekApiKey,\n baseURL: this.config.baseURL,\n });\n\n if (config.braveSearchApiKey) {\n this.braveSearch = new BraveSearchClient(config.braveSearchApiKey);\n }\n\n this.toolManager = new ToolManager();\n this.toolLoop = new ToolLoop(this.openai, this.config, this.toolManager);\n\n this.registerBuiltinTools();\n }\n\n private registerBuiltinTools(): void {\n if (this.braveSearch) {\n this.toolManager.addTool<BraveWebSearchParams>(\n BRAVE_WEB_SEARCH_TOOL_DEFINITION,\n async (args: BraveWebSearchParams) => {\n const result = await this.braveSearch!.webSearch(args.query, {\n freshness: args.freshness,\n safesearch: args.safesearch ?? this.config.braveSearch.safesearch,\n count: args.count ?? this.config.braveSearch.count,\n country: this.config.braveSearch.country,\n searchLang: this.config.braveSearch.searchLang,\n });\n return JSON.stringify(result);\n },\n );\n\n this.toolManager.addTool<BraveLLMContextParams>(\n BRAVE_LLM_CONTEXT_TOOL_DEFINITION,\n async (args: BraveLLMContextParams) => {\n const result = await this.braveSearch!.llmContext(args.query, {\n freshness: args.freshness,\n maxTokens: args.maxTokens,\n maxUrls: args.maxUrls,\n country: this.config.braveSearch.country,\n searchLang: this.config.braveSearch.searchLang,\n safesearch: this.config.braveSearch.safesearch,\n });\n return JSON.stringify(result);\n },\n );\n }\n }\n\n async chat(\n messages: ChatMessage[],\n options?: {\n tools?: ToolDefinition[];\n toolChoice?: ToolChoice;\n model?: ModelName;\n thinking?: ThinkingConfig;\n reasoningEffort?: ReasoningEffort;\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n onToolCall?: ToolLoopCallbacks[\"onToolCall\"];\n onToolResult?: ToolLoopCallbacks[\"onToolResult\"];\n },\n ): Promise<ChatResponse> {\n const prevModel = this.config.model;\n const prevThinking = this.config.thinking;\n const prevEffort = this.config.reasoningEffort;\n const prevMaxTokens = this.config.maxTokens;\n const prevTemp = this.config.temperature;\n const prevTopP = this.config.topP;\n\n if (options?.model) this.config.model = options.model;\n if (options?.thinking) this.config.thinking = options.thinking;\n if (options?.reasoningEffort)\n this.config.reasoningEffort = options.reasoningEffort;\n if (options?.maxTokens !== undefined)\n this.config.maxTokens = options.maxTokens;\n if (options?.temperature !== undefined)\n this.config.temperature = options.temperature;\n if (options?.topP !== undefined) this.config.topP = options.topP;\n\n try {\n return await this.toolLoop.run(\n messages,\n options?.tools,\n options?.toolChoice,\n {\n onToolCall: options?.onToolCall,\n onToolResult: options?.onToolResult,\n },\n );\n } finally {\n this.config.model = prevModel;\n this.config.thinking = prevThinking;\n this.config.reasoningEffort = prevEffort;\n this.config.maxTokens = prevMaxTokens;\n this.config.temperature = prevTemp;\n this.config.topP = prevTopP;\n }\n }\n\n async chatStream(\n messages: ChatMessage[],\n options?: {\n tools?: ToolDefinition[];\n toolChoice?: ToolChoice;\n model?: ModelName;\n thinking?: ThinkingConfig;\n reasoningEffort?: ReasoningEffort;\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n onToolCall?: ToolLoopCallbacks[\"onToolCall\"];\n onToolResult?: ToolLoopCallbacks[\"onToolResult\"];\n },\n ): Promise<AsyncIterable<StreamChunk>> {\n const prevModel = this.config.model;\n const prevThinking = this.config.thinking;\n const prevEffort = this.config.reasoningEffort;\n const prevMaxTokens = this.config.maxTokens;\n const prevTemp = this.config.temperature;\n const prevTopP = this.config.topP;\n\n if (options?.model) this.config.model = options.model;\n if (options?.thinking) this.config.thinking = options.thinking;\n if (options?.reasoningEffort)\n this.config.reasoningEffort = options.reasoningEffort;\n if (options?.maxTokens !== undefined)\n this.config.maxTokens = options.maxTokens;\n if (options?.temperature !== undefined)\n this.config.temperature = options.temperature;\n if (options?.topP !== undefined) this.config.topP = options.topP;\n\n try {\n return await this.toolLoop.runStream(\n messages,\n options?.tools,\n options?.toolChoice,\n {\n onToolCall: options?.onToolCall,\n onToolResult: options?.onToolResult,\n },\n );\n } finally {\n this.config.model = prevModel;\n this.config.thinking = prevThinking;\n this.config.reasoningEffort = prevEffort;\n this.config.maxTokens = prevMaxTokens;\n this.config.temperature = prevTemp;\n this.config.topP = prevTopP;\n }\n }\n\n addTool<TParams = Record<string, unknown>>(\n definition: ToolDefinition,\n handler?: ToolHandler<TParams>,\n ): void {\n this.toolManager.addTool(definition, handler);\n }\n\n addTools<TParams = Record<string, unknown>>(\n tools: Array<{\n definition: ToolDefinition;\n handler?: ToolHandler<TParams>;\n }>,\n ): void {\n this.toolManager.addTools(tools);\n }\n\n removeTool(name: string): boolean {\n return this.toolManager.removeTool(name);\n }\n\n getTools(): RegisteredTool[] {\n return this.toolManager.getToolDefinitions().map((d) => {\n const registered = this.toolManager.getTool(d.function.name);\n return registered!;\n });\n }\n\n hasTool(name: string): boolean {\n return this.toolManager.hasTool(name);\n }\n\n async executeToolCall(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ): Promise<ToolResult> {\n return this.toolManager.executeToolCall(name, args, toolCallId);\n }\n\n async search(\n query: string,\n options?: BraveWebSearchOptions,\n ): Promise<BraveWebSearchResponse> {\n if (!this.braveSearch) {\n throw new ConfigError(\n \"Brave Search is not configured. Provide braveSearchApiKey in config.\",\n );\n }\n return this.braveSearch.webSearch(query, options ?? {});\n }\n\n async searchAsContext(\n query: string,\n options?: BraveLLMContextOptions,\n ): Promise<BraveLLMContextResponse> {\n if (!this.braveSearch) {\n throw new ConfigError(\n \"Brave Search is not configured. Provide braveSearchApiKey in config.\",\n );\n }\n return this.braveSearch.llmContext(query, options ?? {});\n }\n\n get model(): ModelName {\n return this.config.model;\n }\n\n set model(m: ModelName) {\n this.config.model = m;\n }\n\n get thinking(): ThinkingConfig {\n return this.config.thinking;\n }\n\n set thinking(t: ThinkingConfig) {\n this.config.thinking = t;\n }\n\n get reasoningEffort(): ReasoningEffort {\n return this.config.reasoningEffort;\n }\n\n set reasoningEffort(r: ReasoningEffort) {\n this.config.reasoningEffort = r;\n }\n\n get braveSearchDefaults(): BraveSearchDefaults {\n return this.config.braveSearch;\n }\n\n set braveSearchDefaults(d: BraveSearchDefaults) {\n this.config.braveSearch = { ...this.config.braveSearch, ...d };\n }\n\n get openaiClient(): OpenAI {\n return this.openai;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/types/models.ts","../src/brave-search.ts","../src/tool-manager.ts","../src/reasoning.ts","../src/tool-loop.ts","../src/defaults.ts","../src/client.ts"],"names":["OpenAI"],"mappings":"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","file":"index.cjs","sourcesContent":["export class DeepSeekError extends Error {\n constructor(\n message: string,\n public status?: number,\n public code?: string,\n ) {\n super(message);\n this.name = \"DeepSeekError\";\n }\n}\n\nexport class BraveSearchError extends Error {\n constructor(\n message: string,\n public status?: number,\n ) {\n super(message);\n this.name = \"BraveSearchError\";\n }\n}\n\nexport class ToolError extends Error {\n constructor(\n message: string,\n public toolName?: string,\n ) {\n super(message);\n this.name = \"ToolError\";\n }\n}\n\nexport class ToolLoopError extends Error {\n constructor(\n message: string,\n public iterations: number,\n ) {\n super(message);\n this.name = \"ToolLoopError\";\n }\n}\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigError\";\n }\n}\n","export const DEEPSEEK_MODELS = {\n V4_PRO: \"deepseek-v4-pro\",\n V4_FLASH: \"deepseek-v4-flash\",\n} as const;\n\nexport type ModelName = (typeof DEEPSEEK_MODELS)[keyof typeof DEEPSEEK_MODELS];\n\nexport const DEEPSEEK_BASE_URL = \"https://api.deepseek.com\";\nexport const DEEPSEEK_BETA_BASE_URL = \"https://api.deepseek.com/beta\";\n\nexport const BRAVE_WEB_SEARCH_URL = \"https://api.search.brave.com/res/v1/web/search\";\nexport const BRAVE_LLM_CONTEXT_URL = \"https://api.search.brave.com/res/v1/llm/context\";\n\nexport const DEFAULT_MAX_TOOL_LOOP_ITERATIONS = 10;\n","import { BraveSearchError } from \"./errors.js\";\nimport { BRAVE_WEB_SEARCH_URL, BRAVE_LLM_CONTEXT_URL } from \"./types/models.js\";\nimport type {\n BraveWebSearchOptions,\n BraveLLMContextOptions,\n BraveWebSearchResponse,\n BraveLLMContextResponse,\n} from \"./types/brave-search.js\";\n\nexport class BraveSearchClient {\n constructor(private apiKey: string) {}\n\n async webSearch(\n query: string,\n options: BraveWebSearchOptions = {},\n ): Promise<BraveWebSearchResponse> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n\n if (options.country) params.set(\"country\", options.country);\n if (options.searchLang) params.set(\"search_lang\", options.searchLang);\n if (options.safesearch) params.set(\"safesearch\", options.safesearch);\n if (options.freshness) params.set(\"freshness\", options.freshness);\n if (options.count !== undefined)\n params.set(\"count\", String(options.count));\n if (options.offset !== undefined)\n params.set(\"offset\", String(options.offset));\n if (options.extraSnippets)\n params.set(\"extra_snippets\", \"true\");\n\n const url = `${BRAVE_WEB_SEARCH_URL}?${params.toString()}`;\n\n const response = await fetch(url, {\n headers: {\n \"X-Subscription-Token\": this.apiKey,\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new BraveSearchError(\n `Brave Web Search failed: ${response.status} — ${body || response.statusText}`,\n response.status,\n );\n }\n\n return response.json() as Promise<BraveWebSearchResponse>;\n }\n\n async llmContext(\n query: string,\n options: BraveLLMContextOptions = {},\n ): Promise<BraveLLMContextResponse> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n\n if (options.freshness) params.set(\"freshness\", options.freshness);\n if (options.count !== undefined)\n params.set(\"count\", String(options.count));\n if (options.maxUrls !== undefined)\n params.set(\"maximum_number_of_urls\", String(options.maxUrls));\n if (options.maxTokens !== undefined)\n params.set(\"maximum_number_of_tokens\", String(options.maxTokens));\n if (options.maxSnippets !== undefined)\n params.set(\"maximum_number_of_snippets\", String(options.maxSnippets));\n if (options.maxTokensPerUrl !== undefined)\n params.set(\n \"maximum_number_of_tokens_per_url\",\n String(options.maxTokensPerUrl),\n );\n if (options.maxSnippetsPerUrl !== undefined)\n params.set(\n \"maximum_number_of_snippets_per_url\",\n String(options.maxSnippetsPerUrl),\n );\n if (options.contextThresholdMode)\n params.set(\"context_threshold_mode\", options.contextThresholdMode);\n if (options.enableLocal !== undefined && options.enableLocal !== null)\n params.set(\"enable_local\", String(options.enableLocal));\n\n const url = `${BRAVE_LLM_CONTEXT_URL}?${params.toString()}`;\n\n const response = await fetch(url, {\n headers: {\n \"X-Subscription-Token\": this.apiKey,\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new BraveSearchError(\n `Brave LLM Context failed: ${response.status} — ${body || response.statusText}`,\n response.status,\n );\n }\n\n return response.json() as Promise<BraveLLMContextResponse>;\n }\n}\n","import type {\n ToolDefinition,\n ToolHandler,\n RegisteredTool,\n ToolResult,\n} from \"./types/tools.js\";\nimport { ToolError } from \"./errors.js\";\n\nexport class ToolManager {\n private tools: Map<string, RegisteredTool> = new Map();\n\n addTool<TParams = Record<string, unknown>>(\n definition: ToolDefinition,\n handler?: ToolHandler<TParams>,\n ): void {\n const name = definition.function.name;\n if (this.tools.has(name)) {\n throw new ToolError(`Tool \"${name}\" is already registered`, name);\n }\n // Safe: at runtime handler receives Record<string,unknown> from JSON.parse\n this.tools.set(name, { definition, handler: handler as ToolHandler });\n }\n\n addTools<TParams = Record<string, unknown>>(\n tools: Array<{\n definition: ToolDefinition;\n handler?: ToolHandler<TParams>;\n }>,\n ): void {\n for (const tool of tools) {\n this.addTool(tool.definition, tool.handler);\n }\n }\n\n removeTool(name: string): boolean {\n return this.tools.delete(name);\n }\n\n getTool(name: string): RegisteredTool | undefined {\n return this.tools.get(name);\n }\n\n hasTool(name: string): boolean {\n return this.tools.has(name);\n }\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => t.definition);\n }\n\n getHandler(name: string): ToolHandler | undefined {\n return this.tools.get(name)?.handler;\n }\n\n hasHandler(name: string): boolean {\n const tool = this.tools.get(name);\n return tool !== undefined && tool.handler !== undefined;\n }\n\n async executeToolCall(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ): Promise<ToolResult> {\n const handler = this.getHandler(name);\n if (!handler) {\n throw new ToolError(\n `No handler registered for tool \"${name}\". Provide a handler via addTool() to enable automatic execution.`,\n name,\n );\n }\n const result = await handler(args);\n return {\n tool_call_id: toolCallId,\n role: \"tool\",\n content: typeof result === \"string\" ? result : JSON.stringify(result),\n };\n }\n\n get registeredCount(): number {\n return this.tools.size;\n }\n\n get registeredNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n clear(): void {\n this.tools.clear();\n }\n}\n","import type { ChatMessage, DeepSeekAssistantMessage } from \"./types/chat.js\";\n\nexport class ReasoningState {\n private activeToolCall = false;\n\n startToolCallTurn(): void {\n this.activeToolCall = true;\n }\n\n endToolCallTurn(): void {\n this.activeToolCall = false;\n }\n\n shouldIncludeReasoning(): boolean {\n return this.activeToolCall;\n }\n\n reset(): void {\n this.activeToolCall = false;\n }\n\n cleanMessageForContext(message: ChatMessage): ChatMessage {\n if (this.activeToolCall) return message;\n\n if (message.role === \"assistant\" && \"reasoning_content\" in message) {\n const msg = message as DeepSeekAssistantMessage;\n if (msg.reasoning_content && !msg.tool_calls?.length) {\n const { reasoning_content: _, ...rest } = msg;\n return rest as ChatMessage;\n }\n }\n return message;\n }\n}\n","import type OpenAI from \"openai\";\nimport type { ChatMessage, ChatResponse, StreamChunk } from \"./types/chat.js\";\nimport type { ToolDefinition, ToolCall, ToolChoice } from \"./types/tools.js\";\nimport type { ResolvedConfig } from \"./types/config.js\";\nimport { ToolManager } from \"./tool-manager.js\";\nimport { ReasoningState } from \"./reasoning.js\";\nimport { ToolLoopError } from \"./errors.js\";\n\nexport interface ToolLoopCallbacks {\n /** Observe or override a tool call. Return undefined/null to delegate to the registered handler. */\n onToolCall?: (\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ) => Promise<string | null | undefined> | string | null | undefined;\n /** Called after each tool call completes with the result */\n onToolResult?: (name: string, result: string) => void;\n}\n\nexport class ToolLoop {\n private reasoning: ReasoningState;\n\n constructor(\n private openai: OpenAI,\n private config: ResolvedConfig,\n private toolManager: ToolManager,\n ) {\n this.reasoning = new ReasoningState();\n }\n\n async run(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n callbacks?: ToolLoopCallbacks,\n ): Promise<ChatResponse> {\n const allTools = [\n ...this.toolManager.getToolDefinitions(),\n ...(tools ?? []),\n ];\n\n let response = await this.makeRequest(messages, allTools, toolChoice);\n let iterations = 0;\n\n while (this.hasToolCalls(response) && iterations < this.config.maxToolLoopIterations) {\n iterations++;\n this.reasoning.startToolCallTurn();\n\n const choice = response.choices[0];\n if (!choice) break;\n\n const rawCalls = choice.message.tool_calls ?? [];\n const toolCalls = rawCalls.filter(\n (tc): tc is ToolCall => tc.type === \"function\",\n );\n const toolResults = await this.executeToolCalls(toolCalls, callbacks);\n\n messages.push(choice.message);\n for (const tr of toolResults) {\n messages.push(tr);\n }\n\n response = await this.makeRequest(messages, allTools, toolChoice);\n this.reasoning.endToolCallTurn();\n }\n\n if (iterations >= this.config.maxToolLoopIterations) {\n const lastChoice = response.choices[0];\n if (lastChoice && this.hasToolCallsInChoice(response)) {\n throw new ToolLoopError(\n `Tool call loop exceeded maximum iterations (${this.config.maxToolLoopIterations})`,\n iterations,\n );\n }\n }\n\n return response;\n }\n\n async runStream(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n callbacks?: ToolLoopCallbacks,\n ): Promise<AsyncIterable<StreamChunk>> {\n const allTools = [\n ...this.toolManager.getToolDefinitions(),\n ...(tools ?? []),\n ];\n\n let streamResult = await this.makeStreamRequest(messages, allTools, toolChoice);\n\n let iterations = 0;\n let accumulatedToolCalls: Array<{\n id: string;\n name: string;\n arguments: string;\n }> = [];\n let finalChunks: StreamChunk[] = [];\n\n for await (const chunk of streamResult) {\n const delta = chunk.choices[0]?.delta;\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (tc.id) {\n accumulatedToolCalls.push({\n id: tc.id,\n name: tc.function?.name ?? \"\",\n arguments: tc.function?.arguments ?? \"\",\n });\n } else if (tc.function?.arguments) {\n const existing = accumulatedToolCalls[accumulatedToolCalls.length - 1];\n if (existing) {\n existing.arguments += tc.function.arguments;\n }\n }\n }\n }\n finalChunks.push(chunk);\n }\n\n if (accumulatedToolCalls.length > 0 && iterations < this.config.maxToolLoopIterations) {\n this.reasoning.startToolCallTurn();\n\n const toolResults = await this.executeToolCalls(\n accumulatedToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n callbacks,\n );\n\n const assistantMsg: ChatMessage = {\n role: \"assistant\",\n content: null,\n tool_calls: accumulatedToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n };\n messages.push(assistantMsg);\n for (const tr of toolResults) {\n messages.push(tr);\n }\n\n const nextResponse = await this.makeStreamRequest(messages, allTools, toolChoice);\n this.reasoning.endToolCallTurn();\n return nextResponse;\n }\n\n return this.chunksToAsyncIterable(finalChunks);\n }\n\n private async makeRequest(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n ): Promise<ChatResponse> {\n const params = {\n model: this.config.model,\n messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n reasoning_effort: this.config.reasoningEffort,\n thinking: this.config.thinking,\n } as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming;\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.Completions.ChatCompletionTool[];\n params.tool_choice = (toolChoice ?? \"auto\") as OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;\n }\n if (this.config.maxTokens !== undefined) params.max_tokens = this.config.maxTokens;\n if (this.config.temperature !== undefined) params.temperature = this.config.temperature;\n if (this.config.topP !== undefined) params.top_p = this.config.topP;\n\n const result = await this.openai.chat.completions.create(params);\n return result as unknown as ChatResponse;\n }\n\n private async makeStreamRequest(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n ): Promise<AsyncIterable<StreamChunk>> {\n const params = {\n model: this.config.model,\n messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n stream: true as const,\n reasoning_effort: this.config.reasoningEffort,\n thinking: this.config.thinking,\n } as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming;\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.Completions.ChatCompletionTool[];\n params.tool_choice = (toolChoice ?? \"auto\") as OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;\n }\n if (this.config.maxTokens !== undefined) params.max_tokens = this.config.maxTokens;\n if (this.config.temperature !== undefined) params.temperature = this.config.temperature;\n if (this.config.topP !== undefined) params.top_p = this.config.topP;\n\n const stream = await this.openai.chat.completions.create(params);\n return stream as unknown as AsyncIterable<StreamChunk>;\n }\n\n private async executeToolCalls(\n toolCalls: ToolCall[],\n callbacks?: ToolLoopCallbacks,\n ) {\n const results = [];\n for (const tc of toolCalls) {\n const name = tc.function.name;\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n args = {};\n }\n\n if (callbacks?.onToolCall) {\n const result = await callbacks.onToolCall(name, args, tc.id);\n if (result !== undefined && result !== null) {\n // Callback handled it — use its return value\n results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: result,\n });\n callbacks.onToolResult?.(name, result);\n continue;\n }\n // result is undefined/null — fall through to registered handler\n }\n if (this.toolManager.hasHandler(name)) {\n const tr = await this.toolManager.executeToolCall(name, args, tc.id);\n results.push(tr);\n callbacks?.onToolResult?.(name, typeof tr.content === \"string\" ? tr.content : JSON.stringify(tr.content));\n } else {\n results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: `Tool \"${name}\" has no handler registered. Register a handler to enable automatic execution.`,\n });\n }\n }\n return results;\n }\n\n private hasToolCalls(response: ChatResponse): boolean {\n return this.hasToolCallsInChoice(response);\n }\n\n private hasToolCallsInChoice(response: ChatResponse): boolean {\n const choice = response.choices[0];\n if (!choice) return false;\n return (\n choice.finish_reason === \"tool_calls\" &&\n (choice.message.tool_calls?.length ?? 0) > 0\n );\n }\n\n private async *chunksToAsyncIterable(\n chunks: StreamChunk[],\n ): AsyncIterable<StreamChunk> {\n for (const chunk of chunks) {\n yield chunk;\n }\n }\n\n get reasoningState(): ReasoningState {\n return this.reasoning;\n }\n\n resetReasoning(): void {\n this.reasoning.reset();\n }\n}\n","import type { DeepSeekConfig, ResolvedConfig } from \"./types/config.js\";\nimport type { ToolDefinition } from \"./types/tools.js\";\nimport {\n DEEPSEEK_MODELS,\n DEEPSEEK_BASE_URL,\n DEFAULT_MAX_TOOL_LOOP_ITERATIONS,\n} from \"./types/models.js\";\n\nexport const DEFAULT_CONFIG = {\n model: DEEPSEEK_MODELS.V4_PRO,\n baseURL: DEEPSEEK_BASE_URL,\n thinking: { type: \"enabled\" as const },\n reasoningEffort: \"high\" as const,\n braveSearch: {\n safesearch: \"off\" as const,\n freshness: undefined as \"pd\" | \"pw\" | \"pm\" | \"py\" | undefined,\n country: \"US\",\n searchLang: \"en\",\n count: 10,\n },\n maxToolLoopIterations: DEFAULT_MAX_TOOL_LOOP_ITERATIONS,\n};\n\n// -- Typed params for built-in tools ------------------------------------------\n\nexport interface BraveWebSearchParams {\n query: string;\n freshness?: \"pd\" | \"pw\" | \"pm\" | \"py\";\n count?: number;\n safesearch?: \"off\" | \"moderate\" | \"strict\";\n}\n\n// -- Built-in tool definitions ------------------------------------------------\n\nexport const BRAVE_WEB_SEARCH_TOOL_DEFINITION: ToolDefinition = {\n type: \"function\",\n function: {\n name: \"brave_web_search\",\n description:\n \"Search the web using Brave Search. Returns web page results with titles, URLs, and descriptions. Use this to find current information, news, documentation, or any web content.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"The search query\",\n },\n freshness: {\n type: \"string\",\n enum: [\"pd\", \"pw\", \"pm\", \"py\"],\n description:\n \"Filter results by freshness: pd (24h), pw (7 days), pm (month), py (year)\",\n },\n count: {\n type: \"integer\",\n minimum: 1,\n maximum: 20,\n description: \"Number of results (max 20)\",\n },\n safesearch: {\n type: \"string\",\n enum: [\"off\", \"moderate\", \"strict\"],\n description: \"Content filter level\",\n },\n },\n required: [\"query\"],\n },\n },\n};\n\n// -- Config resolver ----------------------------------------------------------\n\nexport function resolveConfig(config: DeepSeekConfig): ResolvedConfig {\n return {\n deepseekApiKey: config.deepseekApiKey,\n braveSearchApiKey: config.braveSearchApiKey,\n model: config.model ?? DEFAULT_CONFIG.model,\n baseURL: config.baseURL ?? DEFAULT_CONFIG.baseURL,\n thinking: config.thinking ?? DEFAULT_CONFIG.thinking,\n reasoningEffort: config.reasoningEffort ?? DEFAULT_CONFIG.reasoningEffort,\n braveSearch: {\n safesearch:\n config.braveSearch?.safesearch ?? DEFAULT_CONFIG.braveSearch.safesearch,\n freshness:\n config.braveSearch?.freshness ?? DEFAULT_CONFIG.braveSearch.freshness,\n country:\n config.braveSearch?.country ?? DEFAULT_CONFIG.braveSearch.country,\n searchLang:\n config.braveSearch?.searchLang ?? DEFAULT_CONFIG.braveSearch.searchLang,\n count:\n config.braveSearch?.count ?? DEFAULT_CONFIG.braveSearch.count,\n },\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n topP: config.topP,\n maxToolLoopIterations:\n config.maxToolLoopIterations ?? DEFAULT_CONFIG.maxToolLoopIterations,\n };\n}\n","import OpenAI from \"openai\";\nimport type {\n DeepSeekConfig,\n ResolvedConfig,\n ThinkingConfig,\n ReasoningEffort,\n BraveSearchDefaults,\n} from \"./types/config.js\";\nimport type {\n ToolDefinition,\n ToolHandler,\n RegisteredTool,\n ToolChoice,\n ToolCall,\n ToolResult,\n} from \"./types/tools.js\";\nimport type {\n ChatMessage,\n ChatResponse,\n StreamChunk,\n} from \"./types/chat.js\";\nimport type {\n BraveWebSearchOptions,\n BraveLLMContextOptions,\n BraveWebSearchResponse,\n BraveLLMContextResponse,\n} from \"./types/brave-search.js\";\nimport type { ModelName } from \"./types/models.js\";\nimport { BraveSearchClient } from \"./brave-search.js\";\nimport { ToolManager } from \"./tool-manager.js\";\nimport { ToolLoop, type ToolLoopCallbacks } from \"./tool-loop.js\";\nimport { resolveConfig } from \"./defaults.js\";\nimport { BRAVE_WEB_SEARCH_TOOL_DEFINITION } from \"./defaults.js\";\nimport type { BraveWebSearchParams } from \"./defaults.js\";\nimport { ConfigError } from \"./errors.js\";\n\nexport class DeepSeekClient {\n private config: ResolvedConfig;\n private openai: OpenAI;\n private braveSearch?: BraveSearchClient;\n private toolManager: ToolManager;\n private toolLoop: ToolLoop;\n\n constructor(config: DeepSeekConfig) {\n if (!config.deepseekApiKey) {\n throw new ConfigError(\"deepseekApiKey is required\");\n }\n this.config = resolveConfig(config);\n\n this.openai = new OpenAI({\n apiKey: this.config.deepseekApiKey,\n baseURL: this.config.baseURL,\n });\n\n if (config.braveSearchApiKey) {\n this.braveSearch = new BraveSearchClient(config.braveSearchApiKey);\n }\n\n this.toolManager = new ToolManager();\n this.toolLoop = new ToolLoop(this.openai, this.config, this.toolManager);\n\n this.registerBuiltinTools();\n }\n\n private registerBuiltinTools(): void {\n if (this.braveSearch) {\n this.toolManager.addTool<BraveWebSearchParams>(\n BRAVE_WEB_SEARCH_TOOL_DEFINITION,\n async (args: BraveWebSearchParams) => {\n const result = await this.braveSearch!.webSearch(args.query, {\n freshness: args.freshness,\n safesearch: args.safesearch ?? this.config.braveSearch.safesearch,\n count: args.count ?? this.config.braveSearch.count,\n country: this.config.braveSearch.country,\n searchLang: this.config.braveSearch.searchLang,\n });\n return JSON.stringify(result);\n },\n );\n\n }\n }\n\n async chat(\n messages: ChatMessage[],\n options?: {\n tools?: ToolDefinition[];\n toolChoice?: ToolChoice;\n model?: ModelName;\n thinking?: ThinkingConfig;\n reasoningEffort?: ReasoningEffort;\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n onToolCall?: ToolLoopCallbacks[\"onToolCall\"];\n onToolResult?: ToolLoopCallbacks[\"onToolResult\"];\n },\n ): Promise<ChatResponse> {\n const prevModel = this.config.model;\n const prevThinking = this.config.thinking;\n const prevEffort = this.config.reasoningEffort;\n const prevMaxTokens = this.config.maxTokens;\n const prevTemp = this.config.temperature;\n const prevTopP = this.config.topP;\n\n if (options?.model) this.config.model = options.model;\n if (options?.thinking) this.config.thinking = options.thinking;\n if (options?.reasoningEffort)\n this.config.reasoningEffort = options.reasoningEffort;\n if (options?.maxTokens !== undefined)\n this.config.maxTokens = options.maxTokens;\n if (options?.temperature !== undefined)\n this.config.temperature = options.temperature;\n if (options?.topP !== undefined) this.config.topP = options.topP;\n\n try {\n return await this.toolLoop.run(\n messages,\n options?.tools,\n options?.toolChoice,\n {\n onToolCall: options?.onToolCall,\n onToolResult: options?.onToolResult,\n },\n );\n } finally {\n this.config.model = prevModel;\n this.config.thinking = prevThinking;\n this.config.reasoningEffort = prevEffort;\n this.config.maxTokens = prevMaxTokens;\n this.config.temperature = prevTemp;\n this.config.topP = prevTopP;\n }\n }\n\n async chatStream(\n messages: ChatMessage[],\n options?: {\n tools?: ToolDefinition[];\n toolChoice?: ToolChoice;\n model?: ModelName;\n thinking?: ThinkingConfig;\n reasoningEffort?: ReasoningEffort;\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n onToolCall?: ToolLoopCallbacks[\"onToolCall\"];\n onToolResult?: ToolLoopCallbacks[\"onToolResult\"];\n },\n ): Promise<AsyncIterable<StreamChunk>> {\n const prevModel = this.config.model;\n const prevThinking = this.config.thinking;\n const prevEffort = this.config.reasoningEffort;\n const prevMaxTokens = this.config.maxTokens;\n const prevTemp = this.config.temperature;\n const prevTopP = this.config.topP;\n\n if (options?.model) this.config.model = options.model;\n if (options?.thinking) this.config.thinking = options.thinking;\n if (options?.reasoningEffort)\n this.config.reasoningEffort = options.reasoningEffort;\n if (options?.maxTokens !== undefined)\n this.config.maxTokens = options.maxTokens;\n if (options?.temperature !== undefined)\n this.config.temperature = options.temperature;\n if (options?.topP !== undefined) this.config.topP = options.topP;\n\n try {\n return await this.toolLoop.runStream(\n messages,\n options?.tools,\n options?.toolChoice,\n {\n onToolCall: options?.onToolCall,\n onToolResult: options?.onToolResult,\n },\n );\n } finally {\n this.config.model = prevModel;\n this.config.thinking = prevThinking;\n this.config.reasoningEffort = prevEffort;\n this.config.maxTokens = prevMaxTokens;\n this.config.temperature = prevTemp;\n this.config.topP = prevTopP;\n }\n }\n\n addTool<TParams = Record<string, unknown>>(\n definition: ToolDefinition,\n handler?: ToolHandler<TParams>,\n ): void {\n this.toolManager.addTool(definition, handler);\n }\n\n addTools<TParams = Record<string, unknown>>(\n tools: Array<{\n definition: ToolDefinition;\n handler?: ToolHandler<TParams>;\n }>,\n ): void {\n this.toolManager.addTools(tools);\n }\n\n removeTool(name: string): boolean {\n return this.toolManager.removeTool(name);\n }\n\n getTools(): RegisteredTool[] {\n return this.toolManager.getToolDefinitions().map((d) => {\n const registered = this.toolManager.getTool(d.function.name);\n return registered!;\n });\n }\n\n hasTool(name: string): boolean {\n return this.toolManager.hasTool(name);\n }\n\n async executeToolCall(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ): Promise<ToolResult> {\n return this.toolManager.executeToolCall(name, args, toolCallId);\n }\n\n async search(\n query: string,\n options?: BraveWebSearchOptions,\n ): Promise<BraveWebSearchResponse> {\n if (!this.braveSearch) {\n throw new ConfigError(\n \"Brave Search is not configured. Provide braveSearchApiKey in config.\",\n );\n }\n return this.braveSearch.webSearch(query, options ?? {});\n }\n\n async searchAsContext(\n query: string,\n options?: BraveLLMContextOptions,\n ): Promise<BraveLLMContextResponse> {\n if (!this.braveSearch) {\n throw new ConfigError(\n \"Brave Search is not configured. Provide braveSearchApiKey in config.\",\n );\n }\n return this.braveSearch.llmContext(query, options ?? {});\n }\n\n get model(): ModelName {\n return this.config.model;\n }\n\n set model(m: ModelName) {\n this.config.model = m;\n }\n\n get thinking(): ThinkingConfig {\n return this.config.thinking;\n }\n\n set thinking(t: ThinkingConfig) {\n this.config.thinking = t;\n }\n\n get reasoningEffort(): ReasoningEffort {\n return this.config.reasoningEffort;\n }\n\n set reasoningEffort(r: ReasoningEffort) {\n this.config.reasoningEffort = r;\n }\n\n get braveSearchDefaults(): BraveSearchDefaults {\n return this.config.braveSearch;\n }\n\n set braveSearchDefaults(d: BraveSearchDefaults) {\n this.config.braveSearch = { ...this.config.braveSearch, ...d };\n }\n\n get openaiClient(): OpenAI {\n return this.openai;\n }\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -31,7 +31,9 @@ declare class ReasoningState {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
interface ToolLoopCallbacks {
|
|
34
|
-
|
|
34
|
+
/** Observe or override a tool call. Return undefined/null to delegate to the registered handler. */
|
|
35
|
+
onToolCall?: (name: string, args: Record<string, unknown>, toolCallId: string) => Promise<string | null | undefined> | string | null | undefined;
|
|
36
|
+
/** Called after each tool call completes with the result */
|
|
35
37
|
onToolResult?: (name: string, result: string) => void;
|
|
36
38
|
}
|
|
37
39
|
declare class ToolLoop {
|
|
@@ -156,14 +158,7 @@ interface BraveWebSearchParams {
|
|
|
156
158
|
count?: number;
|
|
157
159
|
safesearch?: "off" | "moderate" | "strict";
|
|
158
160
|
}
|
|
159
|
-
interface BraveLLMContextParams {
|
|
160
|
-
query: string;
|
|
161
|
-
freshness?: "pd" | "pw" | "pm" | "py";
|
|
162
|
-
maxTokens?: number;
|
|
163
|
-
maxUrls?: number;
|
|
164
|
-
}
|
|
165
161
|
declare const BRAVE_WEB_SEARCH_TOOL_DEFINITION: ToolDefinition;
|
|
166
|
-
declare const BRAVE_LLM_CONTEXT_TOOL_DEFINITION: ToolDefinition;
|
|
167
162
|
declare function resolveConfig(config: DeepSeekConfig): ResolvedConfig;
|
|
168
163
|
|
|
169
|
-
export {
|
|
164
|
+
export { BRAVE_WEB_SEARCH_TOOL_DEFINITION, BraveLLMContextOptions, BraveLLMContextResponse, BraveSearchClient, BraveSearchDefaults, BraveSearchError, BraveWebSearchOptions, type BraveWebSearchParams, BraveWebSearchResponse, ChatMessage, ChatResponse, ConfigError, DEFAULT_CONFIG, DeepSeekClient, DeepSeekConfig, DeepSeekError, ModelName, ReasoningEffort, ReasoningState, RegisteredTool, ResolvedConfig, StreamChunk, ThinkingConfig, ToolChoice, ToolDefinition, ToolError, ToolHandler, ToolLoop, type ToolLoopCallbacks, ToolLoopError, ToolManager, ToolResult, resolveConfig };
|
package/dist/index.d.ts
CHANGED
|
@@ -31,7 +31,9 @@ declare class ReasoningState {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
interface ToolLoopCallbacks {
|
|
34
|
-
|
|
34
|
+
/** Observe or override a tool call. Return undefined/null to delegate to the registered handler. */
|
|
35
|
+
onToolCall?: (name: string, args: Record<string, unknown>, toolCallId: string) => Promise<string | null | undefined> | string | null | undefined;
|
|
36
|
+
/** Called after each tool call completes with the result */
|
|
35
37
|
onToolResult?: (name: string, result: string) => void;
|
|
36
38
|
}
|
|
37
39
|
declare class ToolLoop {
|
|
@@ -156,14 +158,7 @@ interface BraveWebSearchParams {
|
|
|
156
158
|
count?: number;
|
|
157
159
|
safesearch?: "off" | "moderate" | "strict";
|
|
158
160
|
}
|
|
159
|
-
interface BraveLLMContextParams {
|
|
160
|
-
query: string;
|
|
161
|
-
freshness?: "pd" | "pw" | "pm" | "py";
|
|
162
|
-
maxTokens?: number;
|
|
163
|
-
maxUrls?: number;
|
|
164
|
-
}
|
|
165
161
|
declare const BRAVE_WEB_SEARCH_TOOL_DEFINITION: ToolDefinition;
|
|
166
|
-
declare const BRAVE_LLM_CONTEXT_TOOL_DEFINITION: ToolDefinition;
|
|
167
162
|
declare function resolveConfig(config: DeepSeekConfig): ResolvedConfig;
|
|
168
163
|
|
|
169
|
-
export {
|
|
164
|
+
export { BRAVE_WEB_SEARCH_TOOL_DEFINITION, BraveLLMContextOptions, BraveLLMContextResponse, BraveSearchClient, BraveSearchDefaults, BraveSearchError, BraveWebSearchOptions, type BraveWebSearchParams, BraveWebSearchResponse, ChatMessage, ChatResponse, ConfigError, DEFAULT_CONFIG, DeepSeekClient, DeepSeekConfig, DeepSeekError, ModelName, ReasoningEffort, ReasoningState, RegisteredTool, ResolvedConfig, StreamChunk, ThinkingConfig, ToolChoice, ToolDefinition, ToolError, ToolHandler, ToolLoop, type ToolLoopCallbacks, ToolLoopError, ToolManager, ToolResult, resolveConfig };
|
package/dist/index.js
CHANGED
|
@@ -82,8 +82,9 @@ var BraveSearchClient = class {
|
|
|
82
82
|
}
|
|
83
83
|
});
|
|
84
84
|
if (!response.ok) {
|
|
85
|
+
const body = await response.text().catch(() => "");
|
|
85
86
|
throw new BraveSearchError(
|
|
86
|
-
`Brave Web Search failed: ${response.status} ${response.statusText}`,
|
|
87
|
+
`Brave Web Search failed: ${response.status} \u2014 ${body || response.statusText}`,
|
|
87
88
|
response.status
|
|
88
89
|
);
|
|
89
90
|
}
|
|
@@ -92,8 +93,6 @@ var BraveSearchClient = class {
|
|
|
92
93
|
async llmContext(query, options = {}) {
|
|
93
94
|
const params = new URLSearchParams();
|
|
94
95
|
params.set("q", query);
|
|
95
|
-
if (options.country) params.set("country", options.country);
|
|
96
|
-
if (options.searchLang) params.set("search_lang", options.searchLang);
|
|
97
96
|
if (options.freshness) params.set("freshness", options.freshness);
|
|
98
97
|
if (options.count !== void 0)
|
|
99
98
|
params.set("count", String(options.count));
|
|
@@ -117,7 +116,6 @@ var BraveSearchClient = class {
|
|
|
117
116
|
params.set("context_threshold_mode", options.contextThresholdMode);
|
|
118
117
|
if (options.enableLocal !== void 0 && options.enableLocal !== null)
|
|
119
118
|
params.set("enable_local", String(options.enableLocal));
|
|
120
|
-
if (options.safesearch) params.set("safesearch", options.safesearch);
|
|
121
119
|
const url = `${BRAVE_LLM_CONTEXT_URL}?${params.toString()}`;
|
|
122
120
|
const response = await fetch(url, {
|
|
123
121
|
headers: {
|
|
@@ -126,8 +124,9 @@ var BraveSearchClient = class {
|
|
|
126
124
|
}
|
|
127
125
|
});
|
|
128
126
|
if (!response.ok) {
|
|
127
|
+
const body = await response.text().catch(() => "");
|
|
129
128
|
throw new BraveSearchError(
|
|
130
|
-
`Brave LLM Context failed: ${response.status} ${response.statusText}`,
|
|
129
|
+
`Brave LLM Context failed: ${response.status} \u2014 ${body || response.statusText}`,
|
|
131
130
|
response.status
|
|
132
131
|
);
|
|
133
132
|
}
|
|
@@ -375,13 +374,17 @@ var ToolLoop = class {
|
|
|
375
374
|
}
|
|
376
375
|
if (callbacks?.onToolCall) {
|
|
377
376
|
const result = await callbacks.onToolCall(name, args, tc.id);
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
377
|
+
if (result !== void 0 && result !== null) {
|
|
378
|
+
results.push({
|
|
379
|
+
tool_call_id: tc.id,
|
|
380
|
+
role: "tool",
|
|
381
|
+
content: result
|
|
382
|
+
});
|
|
383
|
+
callbacks.onToolResult?.(name, result);
|
|
384
|
+
continue;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
if (this.toolManager.hasHandler(name)) {
|
|
385
388
|
const tr = await this.toolManager.executeToolCall(name, args, tc.id);
|
|
386
389
|
results.push(tr);
|
|
387
390
|
callbacks?.onToolResult?.(name, typeof tr.content === "string" ? tr.content : JSON.stringify(tr.content));
|
|
@@ -464,40 +467,6 @@ var BRAVE_WEB_SEARCH_TOOL_DEFINITION = {
|
|
|
464
467
|
}
|
|
465
468
|
}
|
|
466
469
|
};
|
|
467
|
-
var BRAVE_LLM_CONTEXT_TOOL_DEFINITION = {
|
|
468
|
-
type: "function",
|
|
469
|
-
function: {
|
|
470
|
-
name: "brave_llm_context",
|
|
471
|
-
description: "Search the web and get content optimized for AI consumption. Returns pre-extracted text snippets from web pages, ideal for grounding responses in current information.",
|
|
472
|
-
parameters: {
|
|
473
|
-
type: "object",
|
|
474
|
-
properties: {
|
|
475
|
-
query: {
|
|
476
|
-
type: "string",
|
|
477
|
-
description: "The search query"
|
|
478
|
-
},
|
|
479
|
-
freshness: {
|
|
480
|
-
type: "string",
|
|
481
|
-
enum: ["pd", "pw", "pm", "py"],
|
|
482
|
-
description: "Filter results by freshness: pd (24h), pw (7 days), pm (month), py (year)"
|
|
483
|
-
},
|
|
484
|
-
maxTokens: {
|
|
485
|
-
type: "integer",
|
|
486
|
-
minimum: 1024,
|
|
487
|
-
maximum: 32768,
|
|
488
|
-
description: "Max tokens in context (default 8192)"
|
|
489
|
-
},
|
|
490
|
-
maxUrls: {
|
|
491
|
-
type: "integer",
|
|
492
|
-
minimum: 1,
|
|
493
|
-
maximum: 50,
|
|
494
|
-
description: "Maximum URLs to include (default 20)"
|
|
495
|
-
}
|
|
496
|
-
},
|
|
497
|
-
required: ["query"]
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
};
|
|
501
470
|
function resolveConfig(config) {
|
|
502
471
|
return {
|
|
503
472
|
deepseekApiKey: config.deepseekApiKey,
|
|
@@ -558,20 +527,6 @@ var DeepSeekClient = class {
|
|
|
558
527
|
return JSON.stringify(result);
|
|
559
528
|
}
|
|
560
529
|
);
|
|
561
|
-
this.toolManager.addTool(
|
|
562
|
-
BRAVE_LLM_CONTEXT_TOOL_DEFINITION,
|
|
563
|
-
async (args) => {
|
|
564
|
-
const result = await this.braveSearch.llmContext(args.query, {
|
|
565
|
-
freshness: args.freshness,
|
|
566
|
-
maxTokens: args.maxTokens,
|
|
567
|
-
maxUrls: args.maxUrls,
|
|
568
|
-
country: this.config.braveSearch.country,
|
|
569
|
-
searchLang: this.config.braveSearch.searchLang,
|
|
570
|
-
safesearch: this.config.braveSearch.safesearch
|
|
571
|
-
});
|
|
572
|
-
return JSON.stringify(result);
|
|
573
|
-
}
|
|
574
|
-
);
|
|
575
530
|
}
|
|
576
531
|
}
|
|
577
532
|
async chat(messages, options) {
|
|
@@ -710,6 +665,6 @@ var DeepSeekClient = class {
|
|
|
710
665
|
}
|
|
711
666
|
};
|
|
712
667
|
|
|
713
|
-
export {
|
|
668
|
+
export { BRAVE_LLM_CONTEXT_URL, BRAVE_WEB_SEARCH_TOOL_DEFINITION, BRAVE_WEB_SEARCH_URL, BraveSearchClient, BraveSearchError, ConfigError, DEEPSEEK_BASE_URL, DEEPSEEK_BETA_BASE_URL, DEEPSEEK_MODELS, DEFAULT_CONFIG, DEFAULT_MAX_TOOL_LOOP_ITERATIONS, DeepSeekClient, DeepSeekError, ReasoningState, ToolError, ToolLoop, ToolLoopError, ToolManager, resolveConfig };
|
|
714
669
|
//# sourceMappingURL=index.js.map
|
|
715
670
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/types/models.ts","../src/brave-search.ts","../src/tool-manager.ts","../src/reasoning.ts","../src/tool-loop.ts","../src/defaults.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export class DeepSeekError extends Error {\n constructor(\n message: string,\n public status?: number,\n public code?: string,\n ) {\n super(message);\n this.name = \"DeepSeekError\";\n }\n}\n\nexport class BraveSearchError extends Error {\n constructor(\n message: string,\n public status?: number,\n ) {\n super(message);\n this.name = \"BraveSearchError\";\n }\n}\n\nexport class ToolError extends Error {\n constructor(\n message: string,\n public toolName?: string,\n ) {\n super(message);\n this.name = \"ToolError\";\n }\n}\n\nexport class ToolLoopError extends Error {\n constructor(\n message: string,\n public iterations: number,\n ) {\n super(message);\n this.name = \"ToolLoopError\";\n }\n}\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigError\";\n }\n}\n","export const DEEPSEEK_MODELS = {\n V4_PRO: \"deepseek-v4-pro\",\n V4_FLASH: \"deepseek-v4-flash\",\n} as const;\n\nexport type ModelName = (typeof DEEPSEEK_MODELS)[keyof typeof DEEPSEEK_MODELS];\n\nexport const DEEPSEEK_BASE_URL = \"https://api.deepseek.com\";\nexport const DEEPSEEK_BETA_BASE_URL = \"https://api.deepseek.com/beta\";\n\nexport const BRAVE_WEB_SEARCH_URL = \"https://api.search.brave.com/res/v1/web/search\";\nexport const BRAVE_LLM_CONTEXT_URL = \"https://api.search.brave.com/res/v1/llm/context\";\n\nexport const DEFAULT_MAX_TOOL_LOOP_ITERATIONS = 10;\n","import { BraveSearchError } from \"./errors.js\";\nimport { BRAVE_WEB_SEARCH_URL, BRAVE_LLM_CONTEXT_URL } from \"./types/models.js\";\nimport type {\n BraveWebSearchOptions,\n BraveLLMContextOptions,\n BraveWebSearchResponse,\n BraveLLMContextResponse,\n} from \"./types/brave-search.js\";\n\nexport class BraveSearchClient {\n constructor(private apiKey: string) {}\n\n async webSearch(\n query: string,\n options: BraveWebSearchOptions = {},\n ): Promise<BraveWebSearchResponse> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n\n if (options.country) params.set(\"country\", options.country);\n if (options.searchLang) params.set(\"search_lang\", options.searchLang);\n if (options.safesearch) params.set(\"safesearch\", options.safesearch);\n if (options.freshness) params.set(\"freshness\", options.freshness);\n if (options.count !== undefined)\n params.set(\"count\", String(options.count));\n if (options.offset !== undefined)\n params.set(\"offset\", String(options.offset));\n if (options.extraSnippets)\n params.set(\"extra_snippets\", \"true\");\n\n const url = `${BRAVE_WEB_SEARCH_URL}?${params.toString()}`;\n\n const response = await fetch(url, {\n headers: {\n \"X-Subscription-Token\": this.apiKey,\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new BraveSearchError(\n `Brave Web Search failed: ${response.status} ${response.statusText}`,\n response.status,\n );\n }\n\n return response.json() as Promise<BraveWebSearchResponse>;\n }\n\n async llmContext(\n query: string,\n options: BraveLLMContextOptions = {},\n ): Promise<BraveLLMContextResponse> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n\n if (options.country) params.set(\"country\", options.country);\n if (options.searchLang) params.set(\"search_lang\", options.searchLang);\n if (options.freshness) params.set(\"freshness\", options.freshness);\n if (options.count !== undefined)\n params.set(\"count\", String(options.count));\n if (options.maxUrls !== undefined)\n params.set(\"maximum_number_of_urls\", String(options.maxUrls));\n if (options.maxTokens !== undefined)\n params.set(\"maximum_number_of_tokens\", String(options.maxTokens));\n if (options.maxSnippets !== undefined)\n params.set(\"maximum_number_of_snippets\", String(options.maxSnippets));\n if (options.maxTokensPerUrl !== undefined)\n params.set(\n \"maximum_number_of_tokens_per_url\",\n String(options.maxTokensPerUrl),\n );\n if (options.maxSnippetsPerUrl !== undefined)\n params.set(\n \"maximum_number_of_snippets_per_url\",\n String(options.maxSnippetsPerUrl),\n );\n if (options.contextThresholdMode)\n params.set(\"context_threshold_mode\", options.contextThresholdMode);\n if (options.enableLocal !== undefined && options.enableLocal !== null)\n params.set(\"enable_local\", String(options.enableLocal));\n if (options.safesearch) params.set(\"safesearch\", options.safesearch);\n\n const url = `${BRAVE_LLM_CONTEXT_URL}?${params.toString()}`;\n\n const response = await fetch(url, {\n headers: {\n \"X-Subscription-Token\": this.apiKey,\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new BraveSearchError(\n `Brave LLM Context failed: ${response.status} ${response.statusText}`,\n response.status,\n );\n }\n\n return response.json() as Promise<BraveLLMContextResponse>;\n }\n}\n","import type {\n ToolDefinition,\n ToolHandler,\n RegisteredTool,\n ToolResult,\n} from \"./types/tools.js\";\nimport { ToolError } from \"./errors.js\";\n\nexport class ToolManager {\n private tools: Map<string, RegisteredTool> = new Map();\n\n addTool<TParams = Record<string, unknown>>(\n definition: ToolDefinition,\n handler?: ToolHandler<TParams>,\n ): void {\n const name = definition.function.name;\n if (this.tools.has(name)) {\n throw new ToolError(`Tool \"${name}\" is already registered`, name);\n }\n // Safe: at runtime handler receives Record<string,unknown> from JSON.parse\n this.tools.set(name, { definition, handler: handler as ToolHandler });\n }\n\n addTools<TParams = Record<string, unknown>>(\n tools: Array<{\n definition: ToolDefinition;\n handler?: ToolHandler<TParams>;\n }>,\n ): void {\n for (const tool of tools) {\n this.addTool(tool.definition, tool.handler);\n }\n }\n\n removeTool(name: string): boolean {\n return this.tools.delete(name);\n }\n\n getTool(name: string): RegisteredTool | undefined {\n return this.tools.get(name);\n }\n\n hasTool(name: string): boolean {\n return this.tools.has(name);\n }\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => t.definition);\n }\n\n getHandler(name: string): ToolHandler | undefined {\n return this.tools.get(name)?.handler;\n }\n\n hasHandler(name: string): boolean {\n const tool = this.tools.get(name);\n return tool !== undefined && tool.handler !== undefined;\n }\n\n async executeToolCall(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ): Promise<ToolResult> {\n const handler = this.getHandler(name);\n if (!handler) {\n throw new ToolError(\n `No handler registered for tool \"${name}\". Provide a handler via addTool() to enable automatic execution.`,\n name,\n );\n }\n const result = await handler(args);\n return {\n tool_call_id: toolCallId,\n role: \"tool\",\n content: typeof result === \"string\" ? result : JSON.stringify(result),\n };\n }\n\n get registeredCount(): number {\n return this.tools.size;\n }\n\n get registeredNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n clear(): void {\n this.tools.clear();\n }\n}\n","import type { ChatMessage, DeepSeekAssistantMessage } from \"./types/chat.js\";\n\nexport class ReasoningState {\n private activeToolCall = false;\n\n startToolCallTurn(): void {\n this.activeToolCall = true;\n }\n\n endToolCallTurn(): void {\n this.activeToolCall = false;\n }\n\n shouldIncludeReasoning(): boolean {\n return this.activeToolCall;\n }\n\n reset(): void {\n this.activeToolCall = false;\n }\n\n cleanMessageForContext(message: ChatMessage): ChatMessage {\n if (this.activeToolCall) return message;\n\n if (message.role === \"assistant\" && \"reasoning_content\" in message) {\n const msg = message as DeepSeekAssistantMessage;\n if (msg.reasoning_content && !msg.tool_calls?.length) {\n const { reasoning_content: _, ...rest } = msg;\n return rest as ChatMessage;\n }\n }\n return message;\n }\n}\n","import type OpenAI from \"openai\";\nimport type { ChatMessage, ChatResponse, StreamChunk } from \"./types/chat.js\";\nimport type { ToolDefinition, ToolCall, ToolChoice } from \"./types/tools.js\";\nimport type { ResolvedConfig } from \"./types/config.js\";\nimport { ToolManager } from \"./tool-manager.js\";\nimport { ReasoningState } from \"./reasoning.js\";\nimport { ToolLoopError } from \"./errors.js\";\n\nexport interface ToolLoopCallbacks {\n onToolCall?: (\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ) => Promise<string> | string;\n onToolResult?: (name: string, result: string) => void;\n}\n\nexport class ToolLoop {\n private reasoning: ReasoningState;\n\n constructor(\n private openai: OpenAI,\n private config: ResolvedConfig,\n private toolManager: ToolManager,\n ) {\n this.reasoning = new ReasoningState();\n }\n\n async run(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n callbacks?: ToolLoopCallbacks,\n ): Promise<ChatResponse> {\n const allTools = [\n ...this.toolManager.getToolDefinitions(),\n ...(tools ?? []),\n ];\n\n let response = await this.makeRequest(messages, allTools, toolChoice);\n let iterations = 0;\n\n while (this.hasToolCalls(response) && iterations < this.config.maxToolLoopIterations) {\n iterations++;\n this.reasoning.startToolCallTurn();\n\n const choice = response.choices[0];\n if (!choice) break;\n\n const rawCalls = choice.message.tool_calls ?? [];\n const toolCalls = rawCalls.filter(\n (tc): tc is ToolCall => tc.type === \"function\",\n );\n const toolResults = await this.executeToolCalls(toolCalls, callbacks);\n\n messages.push(choice.message);\n for (const tr of toolResults) {\n messages.push(tr);\n }\n\n response = await this.makeRequest(messages, allTools, toolChoice);\n this.reasoning.endToolCallTurn();\n }\n\n if (iterations >= this.config.maxToolLoopIterations) {\n const lastChoice = response.choices[0];\n if (lastChoice && this.hasToolCallsInChoice(response)) {\n throw new ToolLoopError(\n `Tool call loop exceeded maximum iterations (${this.config.maxToolLoopIterations})`,\n iterations,\n );\n }\n }\n\n return response;\n }\n\n async runStream(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n callbacks?: ToolLoopCallbacks,\n ): Promise<AsyncIterable<StreamChunk>> {\n const allTools = [\n ...this.toolManager.getToolDefinitions(),\n ...(tools ?? []),\n ];\n\n let streamResult = await this.makeStreamRequest(messages, allTools, toolChoice);\n\n let iterations = 0;\n let accumulatedToolCalls: Array<{\n id: string;\n name: string;\n arguments: string;\n }> = [];\n let finalChunks: StreamChunk[] = [];\n\n for await (const chunk of streamResult) {\n const delta = chunk.choices[0]?.delta;\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (tc.id) {\n accumulatedToolCalls.push({\n id: tc.id,\n name: tc.function?.name ?? \"\",\n arguments: tc.function?.arguments ?? \"\",\n });\n } else if (tc.function?.arguments) {\n const existing = accumulatedToolCalls[accumulatedToolCalls.length - 1];\n if (existing) {\n existing.arguments += tc.function.arguments;\n }\n }\n }\n }\n finalChunks.push(chunk);\n }\n\n if (accumulatedToolCalls.length > 0 && iterations < this.config.maxToolLoopIterations) {\n this.reasoning.startToolCallTurn();\n\n const toolResults = await this.executeToolCalls(\n accumulatedToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n callbacks,\n );\n\n const assistantMsg: ChatMessage = {\n role: \"assistant\",\n content: null,\n tool_calls: accumulatedToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n };\n messages.push(assistantMsg);\n for (const tr of toolResults) {\n messages.push(tr);\n }\n\n const nextResponse = await this.makeStreamRequest(messages, allTools, toolChoice);\n this.reasoning.endToolCallTurn();\n return nextResponse;\n }\n\n return this.chunksToAsyncIterable(finalChunks);\n }\n\n private async makeRequest(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n ): Promise<ChatResponse> {\n const params = {\n model: this.config.model,\n messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n reasoning_effort: this.config.reasoningEffort,\n thinking: this.config.thinking,\n } as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming;\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.Completions.ChatCompletionTool[];\n params.tool_choice = (toolChoice ?? \"auto\") as OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;\n }\n if (this.config.maxTokens !== undefined) params.max_tokens = this.config.maxTokens;\n if (this.config.temperature !== undefined) params.temperature = this.config.temperature;\n if (this.config.topP !== undefined) params.top_p = this.config.topP;\n\n const result = await this.openai.chat.completions.create(params);\n return result as unknown as ChatResponse;\n }\n\n private async makeStreamRequest(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n ): Promise<AsyncIterable<StreamChunk>> {\n const params = {\n model: this.config.model,\n messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n stream: true as const,\n reasoning_effort: this.config.reasoningEffort,\n thinking: this.config.thinking,\n } as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming;\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.Completions.ChatCompletionTool[];\n params.tool_choice = (toolChoice ?? \"auto\") as OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;\n }\n if (this.config.maxTokens !== undefined) params.max_tokens = this.config.maxTokens;\n if (this.config.temperature !== undefined) params.temperature = this.config.temperature;\n if (this.config.topP !== undefined) params.top_p = this.config.topP;\n\n const stream = await this.openai.chat.completions.create(params);\n return stream as unknown as AsyncIterable<StreamChunk>;\n }\n\n private async executeToolCalls(\n toolCalls: ToolCall[],\n callbacks?: ToolLoopCallbacks,\n ) {\n const results = [];\n for (const tc of toolCalls) {\n const name = tc.function.name;\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n args = {};\n }\n\n if (callbacks?.onToolCall) {\n const result = await callbacks.onToolCall(name, args, tc.id);\n results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: result,\n });\n callbacks.onToolResult?.(name, result);\n } else if (this.toolManager.hasHandler(name)) {\n const tr = await this.toolManager.executeToolCall(name, args, tc.id);\n results.push(tr);\n callbacks?.onToolResult?.(name, typeof tr.content === \"string\" ? tr.content : JSON.stringify(tr.content));\n } else {\n results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: `Tool \"${name}\" has no handler registered. Register a handler to enable automatic execution.`,\n });\n }\n }\n return results;\n }\n\n private hasToolCalls(response: ChatResponse): boolean {\n return this.hasToolCallsInChoice(response);\n }\n\n private hasToolCallsInChoice(response: ChatResponse): boolean {\n const choice = response.choices[0];\n if (!choice) return false;\n return (\n choice.finish_reason === \"tool_calls\" &&\n (choice.message.tool_calls?.length ?? 0) > 0\n );\n }\n\n private async *chunksToAsyncIterable(\n chunks: StreamChunk[],\n ): AsyncIterable<StreamChunk> {\n for (const chunk of chunks) {\n yield chunk;\n }\n }\n\n get reasoningState(): ReasoningState {\n return this.reasoning;\n }\n\n resetReasoning(): void {\n this.reasoning.reset();\n }\n}\n","import type { DeepSeekConfig, ResolvedConfig } from \"./types/config.js\";\nimport type { ToolDefinition } from \"./types/tools.js\";\nimport {\n DEEPSEEK_MODELS,\n DEEPSEEK_BASE_URL,\n DEFAULT_MAX_TOOL_LOOP_ITERATIONS,\n} from \"./types/models.js\";\n\nexport const DEFAULT_CONFIG = {\n model: DEEPSEEK_MODELS.V4_PRO,\n baseURL: DEEPSEEK_BASE_URL,\n thinking: { type: \"enabled\" as const },\n reasoningEffort: \"high\" as const,\n braveSearch: {\n safesearch: \"off\" as const,\n freshness: undefined as \"pd\" | \"pw\" | \"pm\" | \"py\" | undefined,\n country: \"US\",\n searchLang: \"en\",\n count: 10,\n },\n maxToolLoopIterations: DEFAULT_MAX_TOOL_LOOP_ITERATIONS,\n};\n\n// -- Typed params for built-in tools ------------------------------------------\n\nexport interface BraveWebSearchParams {\n query: string;\n freshness?: \"pd\" | \"pw\" | \"pm\" | \"py\";\n count?: number;\n safesearch?: \"off\" | \"moderate\" | \"strict\";\n}\n\nexport interface BraveLLMContextParams {\n query: string;\n freshness?: \"pd\" | \"pw\" | \"pm\" | \"py\";\n maxTokens?: number;\n maxUrls?: number;\n}\n\n// -- Built-in tool definitions ------------------------------------------------\n\nexport const BRAVE_WEB_SEARCH_TOOL_DEFINITION: ToolDefinition = {\n type: \"function\",\n function: {\n name: \"brave_web_search\",\n description:\n \"Search the web using Brave Search. Returns web page results with titles, URLs, and descriptions. Use this to find current information, news, documentation, or any web content.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"The search query\",\n },\n freshness: {\n type: \"string\",\n enum: [\"pd\", \"pw\", \"pm\", \"py\"],\n description:\n \"Filter results by freshness: pd (24h), pw (7 days), pm (month), py (year)\",\n },\n count: {\n type: \"integer\",\n minimum: 1,\n maximum: 20,\n description: \"Number of results (max 20)\",\n },\n safesearch: {\n type: \"string\",\n enum: [\"off\", \"moderate\", \"strict\"],\n description: \"Content filter level\",\n },\n },\n required: [\"query\"],\n },\n },\n};\n\nexport const BRAVE_LLM_CONTEXT_TOOL_DEFINITION: ToolDefinition = {\n type: \"function\",\n function: {\n name: \"brave_llm_context\",\n description:\n \"Search the web and get content optimized for AI consumption. Returns pre-extracted text snippets from web pages, ideal for grounding responses in current information.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"The search query\",\n },\n freshness: {\n type: \"string\",\n enum: [\"pd\", \"pw\", \"pm\", \"py\"],\n description:\n \"Filter results by freshness: pd (24h), pw (7 days), pm (month), py (year)\",\n },\n maxTokens: {\n type: \"integer\",\n minimum: 1024,\n maximum: 32768,\n description: \"Max tokens in context (default 8192)\",\n },\n maxUrls: {\n type: \"integer\",\n minimum: 1,\n maximum: 50,\n description: \"Maximum URLs to include (default 20)\",\n },\n },\n required: [\"query\"],\n },\n },\n};\n\n// -- Config resolver ----------------------------------------------------------\n\nexport function resolveConfig(config: DeepSeekConfig): ResolvedConfig {\n return {\n deepseekApiKey: config.deepseekApiKey,\n braveSearchApiKey: config.braveSearchApiKey,\n model: config.model ?? DEFAULT_CONFIG.model,\n baseURL: config.baseURL ?? DEFAULT_CONFIG.baseURL,\n thinking: config.thinking ?? DEFAULT_CONFIG.thinking,\n reasoningEffort: config.reasoningEffort ?? DEFAULT_CONFIG.reasoningEffort,\n braveSearch: {\n safesearch:\n config.braveSearch?.safesearch ?? DEFAULT_CONFIG.braveSearch.safesearch,\n freshness:\n config.braveSearch?.freshness ?? DEFAULT_CONFIG.braveSearch.freshness,\n country:\n config.braveSearch?.country ?? DEFAULT_CONFIG.braveSearch.country,\n searchLang:\n config.braveSearch?.searchLang ?? DEFAULT_CONFIG.braveSearch.searchLang,\n count:\n config.braveSearch?.count ?? DEFAULT_CONFIG.braveSearch.count,\n },\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n topP: config.topP,\n maxToolLoopIterations:\n config.maxToolLoopIterations ?? DEFAULT_CONFIG.maxToolLoopIterations,\n };\n}\n","import OpenAI from \"openai\";\nimport type {\n DeepSeekConfig,\n ResolvedConfig,\n ThinkingConfig,\n ReasoningEffort,\n BraveSearchDefaults,\n} from \"./types/config.js\";\nimport type {\n ToolDefinition,\n ToolHandler,\n RegisteredTool,\n ToolChoice,\n ToolCall,\n ToolResult,\n} from \"./types/tools.js\";\nimport type {\n ChatMessage,\n ChatResponse,\n StreamChunk,\n} from \"./types/chat.js\";\nimport type {\n BraveWebSearchOptions,\n BraveLLMContextOptions,\n BraveWebSearchResponse,\n BraveLLMContextResponse,\n} from \"./types/brave-search.js\";\nimport type { ModelName } from \"./types/models.js\";\nimport { BraveSearchClient } from \"./brave-search.js\";\nimport { ToolManager } from \"./tool-manager.js\";\nimport { ToolLoop, type ToolLoopCallbacks } from \"./tool-loop.js\";\nimport { resolveConfig } from \"./defaults.js\";\nimport {\n BRAVE_WEB_SEARCH_TOOL_DEFINITION,\n BRAVE_LLM_CONTEXT_TOOL_DEFINITION,\n} from \"./defaults.js\";\nimport type { BraveWebSearchParams, BraveLLMContextParams } from \"./defaults.js\";\nimport { ConfigError } from \"./errors.js\";\n\nexport class DeepSeekClient {\n private config: ResolvedConfig;\n private openai: OpenAI;\n private braveSearch?: BraveSearchClient;\n private toolManager: ToolManager;\n private toolLoop: ToolLoop;\n\n constructor(config: DeepSeekConfig) {\n if (!config.deepseekApiKey) {\n throw new ConfigError(\"deepseekApiKey is required\");\n }\n this.config = resolveConfig(config);\n\n this.openai = new OpenAI({\n apiKey: this.config.deepseekApiKey,\n baseURL: this.config.baseURL,\n });\n\n if (config.braveSearchApiKey) {\n this.braveSearch = new BraveSearchClient(config.braveSearchApiKey);\n }\n\n this.toolManager = new ToolManager();\n this.toolLoop = new ToolLoop(this.openai, this.config, this.toolManager);\n\n this.registerBuiltinTools();\n }\n\n private registerBuiltinTools(): void {\n if (this.braveSearch) {\n this.toolManager.addTool<BraveWebSearchParams>(\n BRAVE_WEB_SEARCH_TOOL_DEFINITION,\n async (args: BraveWebSearchParams) => {\n const result = await this.braveSearch!.webSearch(args.query, {\n freshness: args.freshness,\n safesearch: args.safesearch ?? this.config.braveSearch.safesearch,\n count: args.count ?? this.config.braveSearch.count,\n country: this.config.braveSearch.country,\n searchLang: this.config.braveSearch.searchLang,\n });\n return JSON.stringify(result);\n },\n );\n\n this.toolManager.addTool<BraveLLMContextParams>(\n BRAVE_LLM_CONTEXT_TOOL_DEFINITION,\n async (args: BraveLLMContextParams) => {\n const result = await this.braveSearch!.llmContext(args.query, {\n freshness: args.freshness,\n maxTokens: args.maxTokens,\n maxUrls: args.maxUrls,\n country: this.config.braveSearch.country,\n searchLang: this.config.braveSearch.searchLang,\n safesearch: this.config.braveSearch.safesearch,\n });\n return JSON.stringify(result);\n },\n );\n }\n }\n\n async chat(\n messages: ChatMessage[],\n options?: {\n tools?: ToolDefinition[];\n toolChoice?: ToolChoice;\n model?: ModelName;\n thinking?: ThinkingConfig;\n reasoningEffort?: ReasoningEffort;\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n onToolCall?: ToolLoopCallbacks[\"onToolCall\"];\n onToolResult?: ToolLoopCallbacks[\"onToolResult\"];\n },\n ): Promise<ChatResponse> {\n const prevModel = this.config.model;\n const prevThinking = this.config.thinking;\n const prevEffort = this.config.reasoningEffort;\n const prevMaxTokens = this.config.maxTokens;\n const prevTemp = this.config.temperature;\n const prevTopP = this.config.topP;\n\n if (options?.model) this.config.model = options.model;\n if (options?.thinking) this.config.thinking = options.thinking;\n if (options?.reasoningEffort)\n this.config.reasoningEffort = options.reasoningEffort;\n if (options?.maxTokens !== undefined)\n this.config.maxTokens = options.maxTokens;\n if (options?.temperature !== undefined)\n this.config.temperature = options.temperature;\n if (options?.topP !== undefined) this.config.topP = options.topP;\n\n try {\n return await this.toolLoop.run(\n messages,\n options?.tools,\n options?.toolChoice,\n {\n onToolCall: options?.onToolCall,\n onToolResult: options?.onToolResult,\n },\n );\n } finally {\n this.config.model = prevModel;\n this.config.thinking = prevThinking;\n this.config.reasoningEffort = prevEffort;\n this.config.maxTokens = prevMaxTokens;\n this.config.temperature = prevTemp;\n this.config.topP = prevTopP;\n }\n }\n\n async chatStream(\n messages: ChatMessage[],\n options?: {\n tools?: ToolDefinition[];\n toolChoice?: ToolChoice;\n model?: ModelName;\n thinking?: ThinkingConfig;\n reasoningEffort?: ReasoningEffort;\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n onToolCall?: ToolLoopCallbacks[\"onToolCall\"];\n onToolResult?: ToolLoopCallbacks[\"onToolResult\"];\n },\n ): Promise<AsyncIterable<StreamChunk>> {\n const prevModel = this.config.model;\n const prevThinking = this.config.thinking;\n const prevEffort = this.config.reasoningEffort;\n const prevMaxTokens = this.config.maxTokens;\n const prevTemp = this.config.temperature;\n const prevTopP = this.config.topP;\n\n if (options?.model) this.config.model = options.model;\n if (options?.thinking) this.config.thinking = options.thinking;\n if (options?.reasoningEffort)\n this.config.reasoningEffort = options.reasoningEffort;\n if (options?.maxTokens !== undefined)\n this.config.maxTokens = options.maxTokens;\n if (options?.temperature !== undefined)\n this.config.temperature = options.temperature;\n if (options?.topP !== undefined) this.config.topP = options.topP;\n\n try {\n return await this.toolLoop.runStream(\n messages,\n options?.tools,\n options?.toolChoice,\n {\n onToolCall: options?.onToolCall,\n onToolResult: options?.onToolResult,\n },\n );\n } finally {\n this.config.model = prevModel;\n this.config.thinking = prevThinking;\n this.config.reasoningEffort = prevEffort;\n this.config.maxTokens = prevMaxTokens;\n this.config.temperature = prevTemp;\n this.config.topP = prevTopP;\n }\n }\n\n addTool<TParams = Record<string, unknown>>(\n definition: ToolDefinition,\n handler?: ToolHandler<TParams>,\n ): void {\n this.toolManager.addTool(definition, handler);\n }\n\n addTools<TParams = Record<string, unknown>>(\n tools: Array<{\n definition: ToolDefinition;\n handler?: ToolHandler<TParams>;\n }>,\n ): void {\n this.toolManager.addTools(tools);\n }\n\n removeTool(name: string): boolean {\n return this.toolManager.removeTool(name);\n }\n\n getTools(): RegisteredTool[] {\n return this.toolManager.getToolDefinitions().map((d) => {\n const registered = this.toolManager.getTool(d.function.name);\n return registered!;\n });\n }\n\n hasTool(name: string): boolean {\n return this.toolManager.hasTool(name);\n }\n\n async executeToolCall(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ): Promise<ToolResult> {\n return this.toolManager.executeToolCall(name, args, toolCallId);\n }\n\n async search(\n query: string,\n options?: BraveWebSearchOptions,\n ): Promise<BraveWebSearchResponse> {\n if (!this.braveSearch) {\n throw new ConfigError(\n \"Brave Search is not configured. Provide braveSearchApiKey in config.\",\n );\n }\n return this.braveSearch.webSearch(query, options ?? {});\n }\n\n async searchAsContext(\n query: string,\n options?: BraveLLMContextOptions,\n ): Promise<BraveLLMContextResponse> {\n if (!this.braveSearch) {\n throw new ConfigError(\n \"Brave Search is not configured. Provide braveSearchApiKey in config.\",\n );\n }\n return this.braveSearch.llmContext(query, options ?? {});\n }\n\n get model(): ModelName {\n return this.config.model;\n }\n\n set model(m: ModelName) {\n this.config.model = m;\n }\n\n get thinking(): ThinkingConfig {\n return this.config.thinking;\n }\n\n set thinking(t: ThinkingConfig) {\n this.config.thinking = t;\n }\n\n get reasoningEffort(): ReasoningEffort {\n return this.config.reasoningEffort;\n }\n\n set reasoningEffort(r: ReasoningEffort) {\n this.config.reasoningEffort = r;\n }\n\n get braveSearchDefaults(): BraveSearchDefaults {\n return this.config.braveSearch;\n }\n\n set braveSearchDefaults(d: BraveSearchDefaults) {\n this.config.braveSearch = { ...this.config.braveSearch, ...d };\n }\n\n get openaiClient(): OpenAI {\n return this.openai;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/types/models.ts","../src/brave-search.ts","../src/tool-manager.ts","../src/reasoning.ts","../src/tool-loop.ts","../src/defaults.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export class DeepSeekError extends Error {\n constructor(\n message: string,\n public status?: number,\n public code?: string,\n ) {\n super(message);\n this.name = \"DeepSeekError\";\n }\n}\n\nexport class BraveSearchError extends Error {\n constructor(\n message: string,\n public status?: number,\n ) {\n super(message);\n this.name = \"BraveSearchError\";\n }\n}\n\nexport class ToolError extends Error {\n constructor(\n message: string,\n public toolName?: string,\n ) {\n super(message);\n this.name = \"ToolError\";\n }\n}\n\nexport class ToolLoopError extends Error {\n constructor(\n message: string,\n public iterations: number,\n ) {\n super(message);\n this.name = \"ToolLoopError\";\n }\n}\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigError\";\n }\n}\n","export const DEEPSEEK_MODELS = {\n V4_PRO: \"deepseek-v4-pro\",\n V4_FLASH: \"deepseek-v4-flash\",\n} as const;\n\nexport type ModelName = (typeof DEEPSEEK_MODELS)[keyof typeof DEEPSEEK_MODELS];\n\nexport const DEEPSEEK_BASE_URL = \"https://api.deepseek.com\";\nexport const DEEPSEEK_BETA_BASE_URL = \"https://api.deepseek.com/beta\";\n\nexport const BRAVE_WEB_SEARCH_URL = \"https://api.search.brave.com/res/v1/web/search\";\nexport const BRAVE_LLM_CONTEXT_URL = \"https://api.search.brave.com/res/v1/llm/context\";\n\nexport const DEFAULT_MAX_TOOL_LOOP_ITERATIONS = 10;\n","import { BraveSearchError } from \"./errors.js\";\nimport { BRAVE_WEB_SEARCH_URL, BRAVE_LLM_CONTEXT_URL } from \"./types/models.js\";\nimport type {\n BraveWebSearchOptions,\n BraveLLMContextOptions,\n BraveWebSearchResponse,\n BraveLLMContextResponse,\n} from \"./types/brave-search.js\";\n\nexport class BraveSearchClient {\n constructor(private apiKey: string) {}\n\n async webSearch(\n query: string,\n options: BraveWebSearchOptions = {},\n ): Promise<BraveWebSearchResponse> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n\n if (options.country) params.set(\"country\", options.country);\n if (options.searchLang) params.set(\"search_lang\", options.searchLang);\n if (options.safesearch) params.set(\"safesearch\", options.safesearch);\n if (options.freshness) params.set(\"freshness\", options.freshness);\n if (options.count !== undefined)\n params.set(\"count\", String(options.count));\n if (options.offset !== undefined)\n params.set(\"offset\", String(options.offset));\n if (options.extraSnippets)\n params.set(\"extra_snippets\", \"true\");\n\n const url = `${BRAVE_WEB_SEARCH_URL}?${params.toString()}`;\n\n const response = await fetch(url, {\n headers: {\n \"X-Subscription-Token\": this.apiKey,\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new BraveSearchError(\n `Brave Web Search failed: ${response.status} — ${body || response.statusText}`,\n response.status,\n );\n }\n\n return response.json() as Promise<BraveWebSearchResponse>;\n }\n\n async llmContext(\n query: string,\n options: BraveLLMContextOptions = {},\n ): Promise<BraveLLMContextResponse> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n\n if (options.freshness) params.set(\"freshness\", options.freshness);\n if (options.count !== undefined)\n params.set(\"count\", String(options.count));\n if (options.maxUrls !== undefined)\n params.set(\"maximum_number_of_urls\", String(options.maxUrls));\n if (options.maxTokens !== undefined)\n params.set(\"maximum_number_of_tokens\", String(options.maxTokens));\n if (options.maxSnippets !== undefined)\n params.set(\"maximum_number_of_snippets\", String(options.maxSnippets));\n if (options.maxTokensPerUrl !== undefined)\n params.set(\n \"maximum_number_of_tokens_per_url\",\n String(options.maxTokensPerUrl),\n );\n if (options.maxSnippetsPerUrl !== undefined)\n params.set(\n \"maximum_number_of_snippets_per_url\",\n String(options.maxSnippetsPerUrl),\n );\n if (options.contextThresholdMode)\n params.set(\"context_threshold_mode\", options.contextThresholdMode);\n if (options.enableLocal !== undefined && options.enableLocal !== null)\n params.set(\"enable_local\", String(options.enableLocal));\n\n const url = `${BRAVE_LLM_CONTEXT_URL}?${params.toString()}`;\n\n const response = await fetch(url, {\n headers: {\n \"X-Subscription-Token\": this.apiKey,\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new BraveSearchError(\n `Brave LLM Context failed: ${response.status} — ${body || response.statusText}`,\n response.status,\n );\n }\n\n return response.json() as Promise<BraveLLMContextResponse>;\n }\n}\n","import type {\n ToolDefinition,\n ToolHandler,\n RegisteredTool,\n ToolResult,\n} from \"./types/tools.js\";\nimport { ToolError } from \"./errors.js\";\n\nexport class ToolManager {\n private tools: Map<string, RegisteredTool> = new Map();\n\n addTool<TParams = Record<string, unknown>>(\n definition: ToolDefinition,\n handler?: ToolHandler<TParams>,\n ): void {\n const name = definition.function.name;\n if (this.tools.has(name)) {\n throw new ToolError(`Tool \"${name}\" is already registered`, name);\n }\n // Safe: at runtime handler receives Record<string,unknown> from JSON.parse\n this.tools.set(name, { definition, handler: handler as ToolHandler });\n }\n\n addTools<TParams = Record<string, unknown>>(\n tools: Array<{\n definition: ToolDefinition;\n handler?: ToolHandler<TParams>;\n }>,\n ): void {\n for (const tool of tools) {\n this.addTool(tool.definition, tool.handler);\n }\n }\n\n removeTool(name: string): boolean {\n return this.tools.delete(name);\n }\n\n getTool(name: string): RegisteredTool | undefined {\n return this.tools.get(name);\n }\n\n hasTool(name: string): boolean {\n return this.tools.has(name);\n }\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => t.definition);\n }\n\n getHandler(name: string): ToolHandler | undefined {\n return this.tools.get(name)?.handler;\n }\n\n hasHandler(name: string): boolean {\n const tool = this.tools.get(name);\n return tool !== undefined && tool.handler !== undefined;\n }\n\n async executeToolCall(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ): Promise<ToolResult> {\n const handler = this.getHandler(name);\n if (!handler) {\n throw new ToolError(\n `No handler registered for tool \"${name}\". Provide a handler via addTool() to enable automatic execution.`,\n name,\n );\n }\n const result = await handler(args);\n return {\n tool_call_id: toolCallId,\n role: \"tool\",\n content: typeof result === \"string\" ? result : JSON.stringify(result),\n };\n }\n\n get registeredCount(): number {\n return this.tools.size;\n }\n\n get registeredNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n clear(): void {\n this.tools.clear();\n }\n}\n","import type { ChatMessage, DeepSeekAssistantMessage } from \"./types/chat.js\";\n\nexport class ReasoningState {\n private activeToolCall = false;\n\n startToolCallTurn(): void {\n this.activeToolCall = true;\n }\n\n endToolCallTurn(): void {\n this.activeToolCall = false;\n }\n\n shouldIncludeReasoning(): boolean {\n return this.activeToolCall;\n }\n\n reset(): void {\n this.activeToolCall = false;\n }\n\n cleanMessageForContext(message: ChatMessage): ChatMessage {\n if (this.activeToolCall) return message;\n\n if (message.role === \"assistant\" && \"reasoning_content\" in message) {\n const msg = message as DeepSeekAssistantMessage;\n if (msg.reasoning_content && !msg.tool_calls?.length) {\n const { reasoning_content: _, ...rest } = msg;\n return rest as ChatMessage;\n }\n }\n return message;\n }\n}\n","import type OpenAI from \"openai\";\nimport type { ChatMessage, ChatResponse, StreamChunk } from \"./types/chat.js\";\nimport type { ToolDefinition, ToolCall, ToolChoice } from \"./types/tools.js\";\nimport type { ResolvedConfig } from \"./types/config.js\";\nimport { ToolManager } from \"./tool-manager.js\";\nimport { ReasoningState } from \"./reasoning.js\";\nimport { ToolLoopError } from \"./errors.js\";\n\nexport interface ToolLoopCallbacks {\n /** Observe or override a tool call. Return undefined/null to delegate to the registered handler. */\n onToolCall?: (\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ) => Promise<string | null | undefined> | string | null | undefined;\n /** Called after each tool call completes with the result */\n onToolResult?: (name: string, result: string) => void;\n}\n\nexport class ToolLoop {\n private reasoning: ReasoningState;\n\n constructor(\n private openai: OpenAI,\n private config: ResolvedConfig,\n private toolManager: ToolManager,\n ) {\n this.reasoning = new ReasoningState();\n }\n\n async run(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n callbacks?: ToolLoopCallbacks,\n ): Promise<ChatResponse> {\n const allTools = [\n ...this.toolManager.getToolDefinitions(),\n ...(tools ?? []),\n ];\n\n let response = await this.makeRequest(messages, allTools, toolChoice);\n let iterations = 0;\n\n while (this.hasToolCalls(response) && iterations < this.config.maxToolLoopIterations) {\n iterations++;\n this.reasoning.startToolCallTurn();\n\n const choice = response.choices[0];\n if (!choice) break;\n\n const rawCalls = choice.message.tool_calls ?? [];\n const toolCalls = rawCalls.filter(\n (tc): tc is ToolCall => tc.type === \"function\",\n );\n const toolResults = await this.executeToolCalls(toolCalls, callbacks);\n\n messages.push(choice.message);\n for (const tr of toolResults) {\n messages.push(tr);\n }\n\n response = await this.makeRequest(messages, allTools, toolChoice);\n this.reasoning.endToolCallTurn();\n }\n\n if (iterations >= this.config.maxToolLoopIterations) {\n const lastChoice = response.choices[0];\n if (lastChoice && this.hasToolCallsInChoice(response)) {\n throw new ToolLoopError(\n `Tool call loop exceeded maximum iterations (${this.config.maxToolLoopIterations})`,\n iterations,\n );\n }\n }\n\n return response;\n }\n\n async runStream(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n callbacks?: ToolLoopCallbacks,\n ): Promise<AsyncIterable<StreamChunk>> {\n const allTools = [\n ...this.toolManager.getToolDefinitions(),\n ...(tools ?? []),\n ];\n\n let streamResult = await this.makeStreamRequest(messages, allTools, toolChoice);\n\n let iterations = 0;\n let accumulatedToolCalls: Array<{\n id: string;\n name: string;\n arguments: string;\n }> = [];\n let finalChunks: StreamChunk[] = [];\n\n for await (const chunk of streamResult) {\n const delta = chunk.choices[0]?.delta;\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (tc.id) {\n accumulatedToolCalls.push({\n id: tc.id,\n name: tc.function?.name ?? \"\",\n arguments: tc.function?.arguments ?? \"\",\n });\n } else if (tc.function?.arguments) {\n const existing = accumulatedToolCalls[accumulatedToolCalls.length - 1];\n if (existing) {\n existing.arguments += tc.function.arguments;\n }\n }\n }\n }\n finalChunks.push(chunk);\n }\n\n if (accumulatedToolCalls.length > 0 && iterations < this.config.maxToolLoopIterations) {\n this.reasoning.startToolCallTurn();\n\n const toolResults = await this.executeToolCalls(\n accumulatedToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n callbacks,\n );\n\n const assistantMsg: ChatMessage = {\n role: \"assistant\",\n content: null,\n tool_calls: accumulatedToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n };\n messages.push(assistantMsg);\n for (const tr of toolResults) {\n messages.push(tr);\n }\n\n const nextResponse = await this.makeStreamRequest(messages, allTools, toolChoice);\n this.reasoning.endToolCallTurn();\n return nextResponse;\n }\n\n return this.chunksToAsyncIterable(finalChunks);\n }\n\n private async makeRequest(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n ): Promise<ChatResponse> {\n const params = {\n model: this.config.model,\n messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n reasoning_effort: this.config.reasoningEffort,\n thinking: this.config.thinking,\n } as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming;\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.Completions.ChatCompletionTool[];\n params.tool_choice = (toolChoice ?? \"auto\") as OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;\n }\n if (this.config.maxTokens !== undefined) params.max_tokens = this.config.maxTokens;\n if (this.config.temperature !== undefined) params.temperature = this.config.temperature;\n if (this.config.topP !== undefined) params.top_p = this.config.topP;\n\n const result = await this.openai.chat.completions.create(params);\n return result as unknown as ChatResponse;\n }\n\n private async makeStreamRequest(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n toolChoice?: ToolChoice,\n ): Promise<AsyncIterable<StreamChunk>> {\n const params = {\n model: this.config.model,\n messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n stream: true as const,\n reasoning_effort: this.config.reasoningEffort,\n thinking: this.config.thinking,\n } as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming;\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.Completions.ChatCompletionTool[];\n params.tool_choice = (toolChoice ?? \"auto\") as OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;\n }\n if (this.config.maxTokens !== undefined) params.max_tokens = this.config.maxTokens;\n if (this.config.temperature !== undefined) params.temperature = this.config.temperature;\n if (this.config.topP !== undefined) params.top_p = this.config.topP;\n\n const stream = await this.openai.chat.completions.create(params);\n return stream as unknown as AsyncIterable<StreamChunk>;\n }\n\n private async executeToolCalls(\n toolCalls: ToolCall[],\n callbacks?: ToolLoopCallbacks,\n ) {\n const results = [];\n for (const tc of toolCalls) {\n const name = tc.function.name;\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n args = {};\n }\n\n if (callbacks?.onToolCall) {\n const result = await callbacks.onToolCall(name, args, tc.id);\n if (result !== undefined && result !== null) {\n // Callback handled it — use its return value\n results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: result,\n });\n callbacks.onToolResult?.(name, result);\n continue;\n }\n // result is undefined/null — fall through to registered handler\n }\n if (this.toolManager.hasHandler(name)) {\n const tr = await this.toolManager.executeToolCall(name, args, tc.id);\n results.push(tr);\n callbacks?.onToolResult?.(name, typeof tr.content === \"string\" ? tr.content : JSON.stringify(tr.content));\n } else {\n results.push({\n tool_call_id: tc.id,\n role: \"tool\" as const,\n content: `Tool \"${name}\" has no handler registered. Register a handler to enable automatic execution.`,\n });\n }\n }\n return results;\n }\n\n private hasToolCalls(response: ChatResponse): boolean {\n return this.hasToolCallsInChoice(response);\n }\n\n private hasToolCallsInChoice(response: ChatResponse): boolean {\n const choice = response.choices[0];\n if (!choice) return false;\n return (\n choice.finish_reason === \"tool_calls\" &&\n (choice.message.tool_calls?.length ?? 0) > 0\n );\n }\n\n private async *chunksToAsyncIterable(\n chunks: StreamChunk[],\n ): AsyncIterable<StreamChunk> {\n for (const chunk of chunks) {\n yield chunk;\n }\n }\n\n get reasoningState(): ReasoningState {\n return this.reasoning;\n }\n\n resetReasoning(): void {\n this.reasoning.reset();\n }\n}\n","import type { DeepSeekConfig, ResolvedConfig } from \"./types/config.js\";\nimport type { ToolDefinition } from \"./types/tools.js\";\nimport {\n DEEPSEEK_MODELS,\n DEEPSEEK_BASE_URL,\n DEFAULT_MAX_TOOL_LOOP_ITERATIONS,\n} from \"./types/models.js\";\n\nexport const DEFAULT_CONFIG = {\n model: DEEPSEEK_MODELS.V4_PRO,\n baseURL: DEEPSEEK_BASE_URL,\n thinking: { type: \"enabled\" as const },\n reasoningEffort: \"high\" as const,\n braveSearch: {\n safesearch: \"off\" as const,\n freshness: undefined as \"pd\" | \"pw\" | \"pm\" | \"py\" | undefined,\n country: \"US\",\n searchLang: \"en\",\n count: 10,\n },\n maxToolLoopIterations: DEFAULT_MAX_TOOL_LOOP_ITERATIONS,\n};\n\n// -- Typed params for built-in tools ------------------------------------------\n\nexport interface BraveWebSearchParams {\n query: string;\n freshness?: \"pd\" | \"pw\" | \"pm\" | \"py\";\n count?: number;\n safesearch?: \"off\" | \"moderate\" | \"strict\";\n}\n\n// -- Built-in tool definitions ------------------------------------------------\n\nexport const BRAVE_WEB_SEARCH_TOOL_DEFINITION: ToolDefinition = {\n type: \"function\",\n function: {\n name: \"brave_web_search\",\n description:\n \"Search the web using Brave Search. Returns web page results with titles, URLs, and descriptions. Use this to find current information, news, documentation, or any web content.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"The search query\",\n },\n freshness: {\n type: \"string\",\n enum: [\"pd\", \"pw\", \"pm\", \"py\"],\n description:\n \"Filter results by freshness: pd (24h), pw (7 days), pm (month), py (year)\",\n },\n count: {\n type: \"integer\",\n minimum: 1,\n maximum: 20,\n description: \"Number of results (max 20)\",\n },\n safesearch: {\n type: \"string\",\n enum: [\"off\", \"moderate\", \"strict\"],\n description: \"Content filter level\",\n },\n },\n required: [\"query\"],\n },\n },\n};\n\n// -- Config resolver ----------------------------------------------------------\n\nexport function resolveConfig(config: DeepSeekConfig): ResolvedConfig {\n return {\n deepseekApiKey: config.deepseekApiKey,\n braveSearchApiKey: config.braveSearchApiKey,\n model: config.model ?? DEFAULT_CONFIG.model,\n baseURL: config.baseURL ?? DEFAULT_CONFIG.baseURL,\n thinking: config.thinking ?? DEFAULT_CONFIG.thinking,\n reasoningEffort: config.reasoningEffort ?? DEFAULT_CONFIG.reasoningEffort,\n braveSearch: {\n safesearch:\n config.braveSearch?.safesearch ?? DEFAULT_CONFIG.braveSearch.safesearch,\n freshness:\n config.braveSearch?.freshness ?? DEFAULT_CONFIG.braveSearch.freshness,\n country:\n config.braveSearch?.country ?? DEFAULT_CONFIG.braveSearch.country,\n searchLang:\n config.braveSearch?.searchLang ?? DEFAULT_CONFIG.braveSearch.searchLang,\n count:\n config.braveSearch?.count ?? DEFAULT_CONFIG.braveSearch.count,\n },\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n topP: config.topP,\n maxToolLoopIterations:\n config.maxToolLoopIterations ?? DEFAULT_CONFIG.maxToolLoopIterations,\n };\n}\n","import OpenAI from \"openai\";\nimport type {\n DeepSeekConfig,\n ResolvedConfig,\n ThinkingConfig,\n ReasoningEffort,\n BraveSearchDefaults,\n} from \"./types/config.js\";\nimport type {\n ToolDefinition,\n ToolHandler,\n RegisteredTool,\n ToolChoice,\n ToolCall,\n ToolResult,\n} from \"./types/tools.js\";\nimport type {\n ChatMessage,\n ChatResponse,\n StreamChunk,\n} from \"./types/chat.js\";\nimport type {\n BraveWebSearchOptions,\n BraveLLMContextOptions,\n BraveWebSearchResponse,\n BraveLLMContextResponse,\n} from \"./types/brave-search.js\";\nimport type { ModelName } from \"./types/models.js\";\nimport { BraveSearchClient } from \"./brave-search.js\";\nimport { ToolManager } from \"./tool-manager.js\";\nimport { ToolLoop, type ToolLoopCallbacks } from \"./tool-loop.js\";\nimport { resolveConfig } from \"./defaults.js\";\nimport { BRAVE_WEB_SEARCH_TOOL_DEFINITION } from \"./defaults.js\";\nimport type { BraveWebSearchParams } from \"./defaults.js\";\nimport { ConfigError } from \"./errors.js\";\n\nexport class DeepSeekClient {\n private config: ResolvedConfig;\n private openai: OpenAI;\n private braveSearch?: BraveSearchClient;\n private toolManager: ToolManager;\n private toolLoop: ToolLoop;\n\n constructor(config: DeepSeekConfig) {\n if (!config.deepseekApiKey) {\n throw new ConfigError(\"deepseekApiKey is required\");\n }\n this.config = resolveConfig(config);\n\n this.openai = new OpenAI({\n apiKey: this.config.deepseekApiKey,\n baseURL: this.config.baseURL,\n });\n\n if (config.braveSearchApiKey) {\n this.braveSearch = new BraveSearchClient(config.braveSearchApiKey);\n }\n\n this.toolManager = new ToolManager();\n this.toolLoop = new ToolLoop(this.openai, this.config, this.toolManager);\n\n this.registerBuiltinTools();\n }\n\n private registerBuiltinTools(): void {\n if (this.braveSearch) {\n this.toolManager.addTool<BraveWebSearchParams>(\n BRAVE_WEB_SEARCH_TOOL_DEFINITION,\n async (args: BraveWebSearchParams) => {\n const result = await this.braveSearch!.webSearch(args.query, {\n freshness: args.freshness,\n safesearch: args.safesearch ?? this.config.braveSearch.safesearch,\n count: args.count ?? this.config.braveSearch.count,\n country: this.config.braveSearch.country,\n searchLang: this.config.braveSearch.searchLang,\n });\n return JSON.stringify(result);\n },\n );\n\n }\n }\n\n async chat(\n messages: ChatMessage[],\n options?: {\n tools?: ToolDefinition[];\n toolChoice?: ToolChoice;\n model?: ModelName;\n thinking?: ThinkingConfig;\n reasoningEffort?: ReasoningEffort;\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n onToolCall?: ToolLoopCallbacks[\"onToolCall\"];\n onToolResult?: ToolLoopCallbacks[\"onToolResult\"];\n },\n ): Promise<ChatResponse> {\n const prevModel = this.config.model;\n const prevThinking = this.config.thinking;\n const prevEffort = this.config.reasoningEffort;\n const prevMaxTokens = this.config.maxTokens;\n const prevTemp = this.config.temperature;\n const prevTopP = this.config.topP;\n\n if (options?.model) this.config.model = options.model;\n if (options?.thinking) this.config.thinking = options.thinking;\n if (options?.reasoningEffort)\n this.config.reasoningEffort = options.reasoningEffort;\n if (options?.maxTokens !== undefined)\n this.config.maxTokens = options.maxTokens;\n if (options?.temperature !== undefined)\n this.config.temperature = options.temperature;\n if (options?.topP !== undefined) this.config.topP = options.topP;\n\n try {\n return await this.toolLoop.run(\n messages,\n options?.tools,\n options?.toolChoice,\n {\n onToolCall: options?.onToolCall,\n onToolResult: options?.onToolResult,\n },\n );\n } finally {\n this.config.model = prevModel;\n this.config.thinking = prevThinking;\n this.config.reasoningEffort = prevEffort;\n this.config.maxTokens = prevMaxTokens;\n this.config.temperature = prevTemp;\n this.config.topP = prevTopP;\n }\n }\n\n async chatStream(\n messages: ChatMessage[],\n options?: {\n tools?: ToolDefinition[];\n toolChoice?: ToolChoice;\n model?: ModelName;\n thinking?: ThinkingConfig;\n reasoningEffort?: ReasoningEffort;\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n onToolCall?: ToolLoopCallbacks[\"onToolCall\"];\n onToolResult?: ToolLoopCallbacks[\"onToolResult\"];\n },\n ): Promise<AsyncIterable<StreamChunk>> {\n const prevModel = this.config.model;\n const prevThinking = this.config.thinking;\n const prevEffort = this.config.reasoningEffort;\n const prevMaxTokens = this.config.maxTokens;\n const prevTemp = this.config.temperature;\n const prevTopP = this.config.topP;\n\n if (options?.model) this.config.model = options.model;\n if (options?.thinking) this.config.thinking = options.thinking;\n if (options?.reasoningEffort)\n this.config.reasoningEffort = options.reasoningEffort;\n if (options?.maxTokens !== undefined)\n this.config.maxTokens = options.maxTokens;\n if (options?.temperature !== undefined)\n this.config.temperature = options.temperature;\n if (options?.topP !== undefined) this.config.topP = options.topP;\n\n try {\n return await this.toolLoop.runStream(\n messages,\n options?.tools,\n options?.toolChoice,\n {\n onToolCall: options?.onToolCall,\n onToolResult: options?.onToolResult,\n },\n );\n } finally {\n this.config.model = prevModel;\n this.config.thinking = prevThinking;\n this.config.reasoningEffort = prevEffort;\n this.config.maxTokens = prevMaxTokens;\n this.config.temperature = prevTemp;\n this.config.topP = prevTopP;\n }\n }\n\n addTool<TParams = Record<string, unknown>>(\n definition: ToolDefinition,\n handler?: ToolHandler<TParams>,\n ): void {\n this.toolManager.addTool(definition, handler);\n }\n\n addTools<TParams = Record<string, unknown>>(\n tools: Array<{\n definition: ToolDefinition;\n handler?: ToolHandler<TParams>;\n }>,\n ): void {\n this.toolManager.addTools(tools);\n }\n\n removeTool(name: string): boolean {\n return this.toolManager.removeTool(name);\n }\n\n getTools(): RegisteredTool[] {\n return this.toolManager.getToolDefinitions().map((d) => {\n const registered = this.toolManager.getTool(d.function.name);\n return registered!;\n });\n }\n\n hasTool(name: string): boolean {\n return this.toolManager.hasTool(name);\n }\n\n async executeToolCall(\n name: string,\n args: Record<string, unknown>,\n toolCallId: string,\n ): Promise<ToolResult> {\n return this.toolManager.executeToolCall(name, args, toolCallId);\n }\n\n async search(\n query: string,\n options?: BraveWebSearchOptions,\n ): Promise<BraveWebSearchResponse> {\n if (!this.braveSearch) {\n throw new ConfigError(\n \"Brave Search is not configured. Provide braveSearchApiKey in config.\",\n );\n }\n return this.braveSearch.webSearch(query, options ?? {});\n }\n\n async searchAsContext(\n query: string,\n options?: BraveLLMContextOptions,\n ): Promise<BraveLLMContextResponse> {\n if (!this.braveSearch) {\n throw new ConfigError(\n \"Brave Search is not configured. Provide braveSearchApiKey in config.\",\n );\n }\n return this.braveSearch.llmContext(query, options ?? {});\n }\n\n get model(): ModelName {\n return this.config.model;\n }\n\n set model(m: ModelName) {\n this.config.model = m;\n }\n\n get thinking(): ThinkingConfig {\n return this.config.thinking;\n }\n\n set thinking(t: ThinkingConfig) {\n this.config.thinking = t;\n }\n\n get reasoningEffort(): ReasoningEffort {\n return this.config.reasoningEffort;\n }\n\n set reasoningEffort(r: ReasoningEffort) {\n this.config.reasoningEffort = r;\n }\n\n get braveSearchDefaults(): BraveSearchDefaults {\n return this.config.braveSearch;\n }\n\n set braveSearchDefaults(d: BraveSearchDefaults) {\n this.config.braveSearch = { ...this.config.braveSearch, ...d };\n }\n\n get openaiClient(): OpenAI {\n return this.openai;\n }\n}\n"]}
|
package/package.json
CHANGED