@loopstack/claude-tools-module 0.2.0

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.
@@ -0,0 +1,8 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import type { LlmModuleConfig } from '@loopstack/llm-provider-module';
3
+ export declare class ClaudeToolsModule {
4
+ static forFeature(config: {
5
+ llm: LlmModuleConfig;
6
+ }): DynamicModule;
7
+ }
8
+ //# sourceMappingURL=claude-tools.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-tools.module.d.ts","sourceRoot":"","sources":["../src/claude-tools.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAKtE,qBAKa,iBAAiB;IAC5B,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,eAAe,CAAA;KAAE,GAAG,aAAa;CAQnE"}
@@ -0,0 +1,30 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var ClaudeToolsModule_1;
8
+ import { Module } from '@nestjs/common';
9
+ import { LlmProviderModule } from '@loopstack/llm-provider-module';
10
+ import { ClaudeWebSearch } from './tools/index.js';
11
+ const PROVIDERS = [ClaudeWebSearch];
12
+ let ClaudeToolsModule = ClaudeToolsModule_1 = class ClaudeToolsModule {
13
+ static forFeature(config) {
14
+ return {
15
+ module: ClaudeToolsModule_1,
16
+ imports: [LlmProviderModule.forFeature(config.llm)],
17
+ providers: PROVIDERS,
18
+ exports: PROVIDERS,
19
+ };
20
+ }
21
+ };
22
+ ClaudeToolsModule = ClaudeToolsModule_1 = __decorate([
23
+ Module({
24
+ imports: [LlmProviderModule.forFeature({})],
25
+ providers: PROVIDERS,
26
+ exports: PROVIDERS,
27
+ })
28
+ ], ClaudeToolsModule);
29
+ export { ClaudeToolsModule };
30
+ //# sourceMappingURL=claude-tools.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-tools.module.js","sourceRoot":"","sources":["../src/claude-tools.module.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAiB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,SAAS,GAAG,CAAC,eAAe,CAAC,CAAC;AAO7B,IAAM,iBAAiB,yBAAvB,MAAM,iBAAiB;IAC5B,MAAM,CAAC,UAAU,CAAC,MAAgC;QAChD,OAAO;YACL,MAAM,EAAE,mBAAiB;YACzB,OAAO,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnD,SAAS,EAAE,SAAS;YACpB,OAAO,EAAE,SAAS;SACnB,CAAC;IACJ,CAAC;CACF,CAAA;AATY,iBAAiB;IAL7B,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC3C,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,SAAS;KACnB,CAAC;GACW,iBAAiB,CAS7B"}
@@ -0,0 +1,4 @@
1
+ export * from './claude-tools.module.js';
2
+ export * from './tools/index.js';
3
+ export * from './types/index.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from './claude-tools.module.js';
2
+ export * from './tools/index.js';
3
+ export * from './types/index.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+ import { BaseTool, ToolCallOptions, ToolResult } from '@loopstack/common';
3
+ import type { LoopstackContext } from '@loopstack/common';
4
+ import { WebSearchResult } from '../types/index.js';
5
+ export declare const ClaudeWebSearchArgsSchema: z.ZodObject<{
6
+ query: z.ZodString;
7
+ }, z.core.$strict>;
8
+ export declare const ClaudeWebSearchConfigSchema: z.ZodObject<{
9
+ model: z.ZodOptional<z.ZodString>;
10
+ maxTokens: z.ZodOptional<z.ZodNumber>;
11
+ envApiKey: z.ZodOptional<z.ZodString>;
12
+ cache: z.ZodOptional<z.ZodBoolean>;
13
+ }, z.core.$strip>;
14
+ type ClaudeWebSearchArgs = z.infer<typeof ClaudeWebSearchArgsSchema>;
15
+ type ClaudeWebSearchConfig = z.infer<typeof ClaudeWebSearchConfigSchema>;
16
+ export declare class ClaudeWebSearch extends BaseTool<ClaudeWebSearchArgs, ClaudeWebSearchConfig, WebSearchResult> {
17
+ private readonly logger;
18
+ private readonly llmGenerateText;
19
+ protected handle(args: ClaudeWebSearchArgs, ctx: LoopstackContext, options?: ToolCallOptions<ClaudeWebSearchConfig>): Promise<ToolResult<WebSearchResult>>;
20
+ private getSystemPrompt;
21
+ private parseResponse;
22
+ private capResultSize;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=claude-web-search.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-web-search.tool.d.ts","sourceRoot":"","sources":["../../src/tools/claude-web-search.tool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAQ,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EAAgB,eAAe,EAAwB,MAAM,mBAAmB,CAAC;AAOxF,eAAO,MAAM,yBAAyB;;kBAI3B,CAAC;AAEZ,eAAO,MAAM,2BAA2B;;;;;iBAKtC,CAAC;AAEH,KAAK,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AACrE,KAAK,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEzE,qBASa,eAAgB,SAAQ,QAAQ,CAAC,mBAAmB,EAAE,qBAAqB,EAAE,eAAe,CAAC;IACxG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAEjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;cAEhD,MAAM,CACpB,IAAI,EAAE,mBAAmB,EACzB,GAAG,EAAE,gBAAgB,EACrB,OAAO,CAAC,EAAE,eAAe,CAAC,qBAAqB,CAAC,GAC/C,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IA2BvC,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,aAAa;IA8CrB,OAAO,CAAC,aAAa;CAuBtB"}
@@ -0,0 +1,137 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var ClaudeWebSearch_1;
11
+ import { Inject, Logger } from '@nestjs/common';
12
+ import { z } from 'zod';
13
+ import { BaseTool, Tool } from '@loopstack/common';
14
+ import { LlmGenerateTextTool } from '@loopstack/llm-provider-module';
15
+ const MAX_RESULT_SIZE_CHARS = 20_000;
16
+ const SOURCES_REMINDER = 'REMINDER: You MUST include the sources above in your response to the user using markdown hyperlinks.';
17
+ export const ClaudeWebSearchArgsSchema = z
18
+ .object({
19
+ query: z.string().min(2).describe('The search query to execute'),
20
+ })
21
+ .strict();
22
+ export const ClaudeWebSearchConfigSchema = z.object({
23
+ model: z.string().optional(),
24
+ maxTokens: z.number().optional(),
25
+ envApiKey: z.string().optional(),
26
+ cache: z.boolean().optional(),
27
+ });
28
+ let ClaudeWebSearch = ClaudeWebSearch_1 = class ClaudeWebSearch extends BaseTool {
29
+ logger = new Logger(ClaudeWebSearch_1.name);
30
+ llmGenerateText;
31
+ async handle(args, ctx, options) {
32
+ const config = options?.config;
33
+ const startTime = performance.now();
34
+ const result = await this.llmGenerateText.call({ prompt: `Perform a web search for the query: ${args.query}` }, {
35
+ config: {
36
+ system: this.getSystemPrompt(),
37
+ model: config?.model,
38
+ tools: ['claude_web_search_server'],
39
+ providerConfig: {
40
+ ...(config?.maxTokens != null ? { maxTokens: config.maxTokens } : {}),
41
+ ...(config?.envApiKey ? { envApiKey: config.envApiKey } : {}),
42
+ ...(config?.cache != null ? { cache: config.cache } : {}),
43
+ },
44
+ },
45
+ });
46
+ const response = result.data.response;
47
+ const durationSeconds = (performance.now() - startTime) / 1000;
48
+ const data = this.capResultSize(this.parseResponse(response.content, args.query, durationSeconds));
49
+ return { data, metadata: result.metadata };
50
+ }
51
+ getSystemPrompt() {
52
+ const monthYear = new Date().toLocaleString('en-US', { month: 'long', year: 'numeric' });
53
+ return [
54
+ "You are an assistant that performs a web search for the user's query and returns the relevant results.",
55
+ `The current month is ${monthYear}. Use this year in queries when searching for recent information,`,
56
+ 'documentation, or current events — never default to a prior year.',
57
+ ].join(' ');
58
+ }
59
+ parseResponse(blocks, query, durationSeconds) {
60
+ const results = [];
61
+ let textAcc = '';
62
+ let inText = true;
63
+ for (const block of blocks ?? []) {
64
+ if (block == null)
65
+ continue;
66
+ if (block.type === 'server_tool_use') {
67
+ if (inText) {
68
+ inText = false;
69
+ if (textAcc.trim().length > 0)
70
+ results.push(textAcc.trim());
71
+ textAcc = '';
72
+ }
73
+ continue;
74
+ }
75
+ if (block.type === 'web_search_tool_result') {
76
+ if (!Array.isArray(block.content)) {
77
+ const errorMessage = `Web search error: ${block.content.error_code}`;
78
+ this.logger.error(errorMessage);
79
+ results.push(errorMessage);
80
+ continue;
81
+ }
82
+ const hits = block.content
83
+ .filter((r) => r != null)
84
+ .map((r) => ({ title: r.title, url: r.url }));
85
+ results.push({ tool_use_id: block.tool_use_id, content: hits });
86
+ continue;
87
+ }
88
+ if (block.type === 'text') {
89
+ if (inText) {
90
+ textAcc += block.text;
91
+ }
92
+ else {
93
+ inText = true;
94
+ textAcc = block.text;
95
+ }
96
+ }
97
+ }
98
+ if (textAcc.length)
99
+ results.push(textAcc.trim());
100
+ return { query, results, sourcesReminder: SOURCES_REMINDER, durationSeconds };
101
+ }
102
+ capResultSize(data) {
103
+ const capped = [];
104
+ let runningSize = 0;
105
+ let truncated = false;
106
+ for (const entry of data.results) {
107
+ const entrySize = JSON.stringify(entry).length;
108
+ if (runningSize + entrySize > MAX_RESULT_SIZE_CHARS) {
109
+ truncated = true;
110
+ break;
111
+ }
112
+ capped.push(entry);
113
+ runningSize += entrySize;
114
+ }
115
+ if (!truncated)
116
+ return data;
117
+ this.logger.warn(`Web search result exceeds ${MAX_RESULT_SIZE_CHARS} chars; truncated to ${capped.length} entries.`);
118
+ capped.push(`(results truncated at ${MAX_RESULT_SIZE_CHARS} characters)`);
119
+ return { ...data, results: capped };
120
+ }
121
+ };
122
+ __decorate([
123
+ Inject(),
124
+ __metadata("design:type", LlmGenerateTextTool)
125
+ ], ClaudeWebSearch.prototype, "llmGenerateText", void 0);
126
+ ClaudeWebSearch = ClaudeWebSearch_1 = __decorate([
127
+ Tool({
128
+ name: 'claude_web_search',
129
+ description: 'Search the web using the Anthropic Claude API built-in web_search server tool. ' +
130
+ 'Returns a list of search hits (title + URL) and any text commentary from the model. ' +
131
+ "Use this to retrieve current information beyond the model's knowledge cutoff.",
132
+ schema: ClaudeWebSearchArgsSchema,
133
+ configSchema: ClaudeWebSearchConfigSchema,
134
+ })
135
+ ], ClaudeWebSearch);
136
+ export { ClaudeWebSearch };
137
+ //# sourceMappingURL=claude-web-search.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-web-search.tool.js","sourceRoot":"","sources":["../../src/tools/claude-web-search.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './claude-web-search.tool.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './claude-web-search.tool.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface WebSearchHit {
2
+ title: string;
3
+ url: string;
4
+ }
5
+ export interface WebSearchResultBlock {
6
+ tool_use_id: string;
7
+ content: WebSearchHit[];
8
+ }
9
+ export interface WebSearchResult {
10
+ query: string;
11
+ results: Array<WebSearchResultBlock | string>;
12
+ sourcesReminder: string;
13
+ durationSeconds: number;
14
+ }
15
+ //# sourceMappingURL=claude-web-search.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-web-search.types.d.ts","sourceRoot":"","sources":["../../src/types/claude-web-search.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC,oBAAoB,GAAG,MAAM,CAAC,CAAC;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=claude-web-search.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-web-search.types.js","sourceRoot":"","sources":["../../src/types/claude-web-search.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export * from './claude-web-search.types.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './claude-web-search.types.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@loopstack/claude-tools-module",
3
+ "displayName": "Loopstack Claude Tools Module",
4
+ "description": "Claude-specific tools that consume the LLM provider (e.g. web search using Claude server tools)",
5
+ "keywords": [
6
+ "ai",
7
+ "anthropic",
8
+ "claude",
9
+ "llm",
10
+ "loopstack",
11
+ "tool"
12
+ ],
13
+ "version": "0.2.0",
14
+ "license": "MIT",
15
+ "author": {
16
+ "name": "Jakob Klippel",
17
+ "url": "https://www.linkedin.com/in/jakob-klippel/"
18
+ },
19
+ "main": "dist/index.js",
20
+ "types": "dist/index.d.ts",
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "default": "./dist/index.js"
25
+ }
26
+ },
27
+ "scripts": {
28
+ "build": "nest build",
29
+ "compile": "tsc --noEmit",
30
+ "format": "prettier --write .",
31
+ "lint": "eslint .",
32
+ "test": "jest --passWithNoTests",
33
+ "watch": "nest build --watch"
34
+ },
35
+ "dependencies": {
36
+ "@anthropic-ai/sdk": "^0.96.0",
37
+ "@loopstack/common": "^0.32.0",
38
+ "@loopstack/llm-provider-module": "^0.4.0",
39
+ "@nestjs/common": "^11.1.19",
40
+ "zod": "^4.3.6"
41
+ },
42
+ "files": [
43
+ "dist"
44
+ ],
45
+ "jest": {
46
+ "moduleFileExtensions": [
47
+ "js",
48
+ "json",
49
+ "ts"
50
+ ],
51
+ "rootDir": "src",
52
+ "testRegex": ".*\\.spec\\.ts$",
53
+ "transform": {
54
+ "^.+\\.ts$": "ts-jest"
55
+ },
56
+ "collectCoverageFrom": [
57
+ "**/*.(t|j)s"
58
+ ],
59
+ "coverageDirectory": "../coverage",
60
+ "testEnvironment": "node",
61
+ "maxWorkers": 1
62
+ },
63
+ "type": "module"
64
+ }