@loopstack/claude-module 0.22.3 → 0.22.5
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/claude.module.d.ts.map +1 -1
- package/dist/claude.module.js +12 -1
- package/dist/claude.module.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/services/claude-client.service.d.ts +1 -1
- package/dist/services/claude-client.service.d.ts.map +1 -1
- package/dist/services/claude-client.service.js +2 -2
- package/dist/services/claude-client.service.js.map +1 -1
- package/dist/services/claude-tools-helper.service.d.ts +1 -1
- package/dist/services/claude-tools-helper.service.d.ts.map +1 -1
- package/dist/services/claude-tools-helper.service.js +4 -3
- package/dist/services/claude-tools-helper.service.js.map +1 -1
- package/dist/tools/claude-generate-text.tool.d.ts.map +1 -1
- package/dist/tools/claude-generate-text.tool.js +3 -1
- package/dist/tools/claude-generate-text.tool.js.map +1 -1
- package/dist/tools/claude-web-search.tool.d.ts +27 -0
- package/dist/tools/claude-web-search.tool.d.ts.map +1 -0
- package/dist/tools/claude-web-search.tool.js +192 -0
- package/dist/tools/claude-web-search.tool.js.map +1 -0
- package/dist/tools/delegate-tool-calls.tool.d.ts.map +1 -1
- package/dist/tools/delegate-tool-calls.tool.js +18 -2
- package/dist/tools/delegate-tool-calls.tool.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/update-tool-result.tool.d.ts +3 -0
- package/dist/tools/update-tool-result.tool.d.ts.map +1 -1
- package/dist/tools/update-tool-result.tool.js +21 -1
- package/dist/tools/update-tool-result.tool.js.map +1 -1
- package/dist/types/claude-web-search.types.d.ts +15 -0
- package/dist/types/claude-web-search.types.d.ts.map +1 -0
- package/dist/types/claude-web-search.types.js +3 -0
- package/dist/types/claude-web-search.types.js.map +1 -0
- package/dist/types/claude.types.d.ts +8 -0
- package/dist/types/claude.types.d.ts.map +1 -1
- package/dist/types/claude.types.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/package.json +5 -8
- package/src/claude.module.ts +0 -29
- package/src/documents/claude-message-document.ts +0 -20
- package/src/documents/claude-message-document.yaml +0 -5
- package/src/documents/index.ts +0 -1
- package/src/index.ts +0 -4
- package/src/schemas/claude-generate-tool-base.schema.ts +0 -23
- package/src/services/claude-client.service.ts +0 -34
- package/src/services/claude-messages-helper.service.ts +0 -41
- package/src/services/claude-tools-helper.service.ts +0 -36
- package/src/services/index.ts +0 -3
- package/src/tools/claude-generate-document.tool.ts +0 -29
- package/src/tools/claude-generate-object.tool.ts +0 -135
- package/src/tools/claude-generate-text.tool.ts +0 -128
- package/src/tools/delegate-tool-calls.tool.ts +0 -139
- package/src/tools/index.ts +0 -5
- package/src/tools/update-tool-result.tool.ts +0 -99
- package/src/types/claude.types.ts +0 -60
- package/src/types/index.ts +0 -1
- package/src/utils/cache.utils.ts +0 -59
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-tool-result.tool.js","sourceRoot":"","sources":["../../src/tools/update-tool-result.tool.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAoD;AACpD,6BAAwB;AACxB,8CAAsH;AAEtH,MAAM,sBAAsB,GAAG,OAAC,CAAC,MAAM,CAAC;IACtC,cAAc,EAAE,OAAC,CAAC,MAAM,CAAC;QACvB,YAAY,EAAE,OAAC,CAAC,OAAO,EAAE;QACzB,WAAW,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC;QAC7B,OAAO,EAAE,OAAC,CAAC,GAAG,EAAE;QAChB,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"update-tool-result.tool.js","sourceRoot":"","sources":["../../src/tools/update-tool-result.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"claude-web-search.types.js","sourceRoot":"","sources":["../../src/types/claude-web-search.types.ts"],"names":[],"mappings":""}
|
|
@@ -27,6 +27,14 @@ export interface DelegateToolCallsResult {
|
|
|
27
27
|
content: Anthropic.ContentBlock[];
|
|
28
28
|
};
|
|
29
29
|
pendingCount: number;
|
|
30
|
+
errorCount: number;
|
|
31
|
+
hasErrors: boolean;
|
|
32
|
+
errors: DelegateToolErrorEntry[];
|
|
33
|
+
}
|
|
34
|
+
export interface DelegateToolErrorEntry {
|
|
35
|
+
toolName: string;
|
|
36
|
+
toolUseId: string;
|
|
37
|
+
message: string;
|
|
30
38
|
}
|
|
31
39
|
export interface DelegateToolResultEntry {
|
|
32
40
|
type: 'tool_result';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.types.d.ts","sourceRoot":"","sources":["../../src/types/claude.types.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,MAAM,WAAW,iBAAiB;IAEhC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,SAAS,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;CAC3D;AAKD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;CAC9C;AAMD,MAAM,WAAW,wBAAyB,SAAQ,SAAS,CAAC,OAAO;IACjE,SAAS,CAAC,EAAE,YAAY,CAAC;CAC1B;AAKD,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,uBAAuB,EAAE,CAAC;IACvC,OAAO,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,SAAS,CAAC,YAAY,EAAE,CAAA;KAAE,CAAC;IAC5D,YAAY,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"claude.types.d.ts","sourceRoot":"","sources":["../../src/types/claude.types.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,MAAM,WAAW,iBAAiB;IAEhC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,SAAS,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;CAC3D;AAKD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;CAC9C;AAMD,MAAM,WAAW,wBAAyB,SAAQ,SAAS,CAAC,OAAO;IACjE,SAAS,CAAC,EAAE,YAAY,CAAC;CAC1B;AAKD,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,uBAAuB,EAAE,CAAC;IACvC,OAAO,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,SAAS,CAAC,YAAY,EAAE,CAAA;KAAE,CAAC;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,sBAAsB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAGD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.types.js","sourceRoot":"","sources":["../../src/types/claude.types.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"claude.types.js","sourceRoot":"","sources":["../../src/types/claude.types.ts"],"names":[],"mappings":";;;;;;AAoEA,yCAAyD;AAAhD,iHAAA,OAAO,OAAa"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC"}
|
package/dist/types/index.js
CHANGED
|
@@ -15,4 +15,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./claude.types"), exports);
|
|
18
|
+
__exportStar(require("./claude-web-search.types"), exports);
|
|
18
19
|
//# sourceMappingURL=index.js.map
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,4DAA0C"}
|
package/package.json
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"loopstack",
|
|
11
11
|
"tool"
|
|
12
12
|
],
|
|
13
|
-
"version": "0.22.
|
|
13
|
+
"version": "0.22.5",
|
|
14
14
|
"license": "MIT",
|
|
15
15
|
"author": {
|
|
16
16
|
"name": "Jakob Klippel",
|
|
@@ -19,8 +19,7 @@
|
|
|
19
19
|
"main": "dist/index.js",
|
|
20
20
|
"types": "dist/index.d.ts",
|
|
21
21
|
"exports": {
|
|
22
|
-
".": "./dist/index.js"
|
|
23
|
-
"./src/*": "./src/*"
|
|
22
|
+
".": "./dist/index.js"
|
|
24
23
|
},
|
|
25
24
|
"scripts": {
|
|
26
25
|
"build": "nest build",
|
|
@@ -32,16 +31,15 @@
|
|
|
32
31
|
},
|
|
33
32
|
"dependencies": {
|
|
34
33
|
"@anthropic-ai/sdk": "^0.88.0",
|
|
35
|
-
"@loopstack/common": "^0.
|
|
36
|
-
"@loopstack/core": "^0.
|
|
34
|
+
"@loopstack/common": "^0.28.0",
|
|
35
|
+
"@loopstack/core": "^0.28.0",
|
|
37
36
|
"@nestjs/common": "^11.1.19",
|
|
38
37
|
"@nestjs/config": "^4.0.4",
|
|
39
38
|
"@nestjs/core": "^11.1.19",
|
|
40
39
|
"zod": "^4.3.6"
|
|
41
40
|
},
|
|
42
41
|
"files": [
|
|
43
|
-
"dist"
|
|
44
|
-
"src"
|
|
42
|
+
"dist"
|
|
45
43
|
],
|
|
46
44
|
"jest": {
|
|
47
45
|
"moduleFileExtensions": [
|
|
@@ -69,7 +67,6 @@
|
|
|
69
67
|
}
|
|
70
68
|
],
|
|
71
69
|
"installModes": [
|
|
72
|
-
"add",
|
|
73
70
|
"install"
|
|
74
71
|
]
|
|
75
72
|
}
|
package/src/claude.module.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { Module } from '@nestjs/common';
|
|
2
|
-
import { LoopCoreModule } from '@loopstack/core';
|
|
3
|
-
import { ClaudeClientService, ClaudeMessagesHelperService, ClaudeToolsHelperService } from './services';
|
|
4
|
-
import {
|
|
5
|
-
ClaudeGenerateDocument,
|
|
6
|
-
ClaudeGenerateObject,
|
|
7
|
-
ClaudeGenerateText,
|
|
8
|
-
DelegateToolCalls,
|
|
9
|
-
UpdateToolResult,
|
|
10
|
-
} from './tools';
|
|
11
|
-
|
|
12
|
-
@Module({
|
|
13
|
-
imports: [LoopCoreModule],
|
|
14
|
-
providers: [
|
|
15
|
-
// services
|
|
16
|
-
ClaudeClientService,
|
|
17
|
-
ClaudeMessagesHelperService,
|
|
18
|
-
ClaudeToolsHelperService,
|
|
19
|
-
|
|
20
|
-
// tools
|
|
21
|
-
ClaudeGenerateText,
|
|
22
|
-
ClaudeGenerateObject,
|
|
23
|
-
ClaudeGenerateDocument,
|
|
24
|
-
DelegateToolCalls,
|
|
25
|
-
UpdateToolResult,
|
|
26
|
-
],
|
|
27
|
-
exports: [ClaudeGenerateText, ClaudeGenerateObject, ClaudeGenerateDocument, DelegateToolCalls, UpdateToolResult],
|
|
28
|
-
})
|
|
29
|
-
export class ClaudeModule {}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { Document } from '@loopstack/common';
|
|
3
|
-
|
|
4
|
-
export const ClaudeMessageDocumentSchema = z.object({
|
|
5
|
-
role: z.enum(['user', 'assistant']),
|
|
6
|
-
content: z.union([z.string(), z.array(z.any())]),
|
|
7
|
-
toolResults: z.array(z.any()).optional(),
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
export type ClaudeMessageDocumentContentType = z.infer<typeof ClaudeMessageDocumentSchema>;
|
|
11
|
-
|
|
12
|
-
@Document({
|
|
13
|
-
schema: ClaudeMessageDocumentSchema,
|
|
14
|
-
uiConfig: __dirname + '/claude-message-document.yaml',
|
|
15
|
-
})
|
|
16
|
-
export class ClaudeMessageDocument {
|
|
17
|
-
role: 'user' | 'assistant';
|
|
18
|
-
content: string | any[];
|
|
19
|
-
toolResults?: any[];
|
|
20
|
-
}
|
package/src/documents/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './claude-message-document';
|
package/src/index.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
|
|
3
|
-
export const ClaudeGenerateToolBaseSchema = z.object({
|
|
4
|
-
claude: z
|
|
5
|
-
.object({
|
|
6
|
-
model: z.string().optional(),
|
|
7
|
-
envApiKey: z.string().optional(),
|
|
8
|
-
maxTokens: z.number().optional(),
|
|
9
|
-
cache: z.boolean().optional(),
|
|
10
|
-
})
|
|
11
|
-
.optional(),
|
|
12
|
-
messages: z
|
|
13
|
-
.array(
|
|
14
|
-
z.object({
|
|
15
|
-
role: z.enum(['user', 'assistant']),
|
|
16
|
-
content: z.union([z.string(), z.array(z.any())]),
|
|
17
|
-
}),
|
|
18
|
-
)
|
|
19
|
-
.optional(),
|
|
20
|
-
system: z.string().optional(),
|
|
21
|
-
prompt: z.string().optional(),
|
|
22
|
-
messagesSearchTag: z.string().optional(),
|
|
23
|
-
});
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
-
import { Injectable } from '@nestjs/common';
|
|
3
|
-
import { ClaudeModelConfig } from '../types';
|
|
4
|
-
|
|
5
|
-
@Injectable()
|
|
6
|
-
export class ClaudeClientService {
|
|
7
|
-
private getApiKey(envApiKey?: string): string {
|
|
8
|
-
const envVar = envApiKey ?? 'ANTHROPIC_API_KEY';
|
|
9
|
-
const apiKey = process.env[envVar];
|
|
10
|
-
|
|
11
|
-
if (!apiKey) {
|
|
12
|
-
throw new Error(`No API key found! Please make sure to provide "${envVar}" in your .env file.`);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
return apiKey;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
getClient(config?: ClaudeModelConfig): Anthropic {
|
|
19
|
-
const apiKey = this.getApiKey(config?.envApiKey);
|
|
20
|
-
return new Anthropic({ apiKey });
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
getModel(config?: ClaudeModelConfig): string {
|
|
24
|
-
const model = config?.model ?? process.env['CLAUDE_MODEL'];
|
|
25
|
-
|
|
26
|
-
if (!model) {
|
|
27
|
-
throw new Error(
|
|
28
|
-
'No model defined. Please provide CLAUDE_MODEL env var or set the claude.model parameter in the tool args.',
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return model;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
-
import { Injectable } from '@nestjs/common';
|
|
3
|
-
import { DocumentEntity } from '@loopstack/common';
|
|
4
|
-
|
|
5
|
-
@Injectable()
|
|
6
|
-
export class ClaudeMessagesHelperService {
|
|
7
|
-
private searchMessages(documents: DocumentEntity[], tag: string): Anthropic.MessageParam[] {
|
|
8
|
-
return documents
|
|
9
|
-
.filter((document) => !document.isInvalidated && document.tags?.includes(tag))
|
|
10
|
-
.sort((a, b) => a.index - b.index)
|
|
11
|
-
.flatMap((document) => {
|
|
12
|
-
const content = document.content as {
|
|
13
|
-
role: 'user' | 'assistant';
|
|
14
|
-
content: string | Anthropic.ContentBlockParam[];
|
|
15
|
-
toolResults?: Anthropic.ToolResultBlockParam[];
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
// Combined document: expand into assistant message + user tool_result message
|
|
19
|
-
if (content.toolResults?.length) {
|
|
20
|
-
return [
|
|
21
|
-
{ role: content.role, content: content.content } as Anthropic.MessageParam,
|
|
22
|
-
{ role: 'user' as const, content: content.toolResults } as Anthropic.MessageParam,
|
|
23
|
-
];
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
return [{ role: content.role, content: content.content } as Anthropic.MessageParam];
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
getMessages(
|
|
31
|
-
documents: DocumentEntity[],
|
|
32
|
-
args: { messages?: Anthropic.MessageParam[]; messagesSearchTag?: string },
|
|
33
|
-
): Anthropic.MessageParam[] {
|
|
34
|
-
let messages: Anthropic.MessageParam[] | undefined = args.messages;
|
|
35
|
-
if (!messages?.length) {
|
|
36
|
-
messages = this.searchMessages(documents, args.messagesSearchTag ?? 'message');
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return messages;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
-
import { Injectable } from '@nestjs/common';
|
|
3
|
-
import { toJSONSchema } from 'zod';
|
|
4
|
-
import { ToolInterface, WorkflowInterface, getBlockArgsSchema, getBlockConfig } from '@loopstack/common';
|
|
5
|
-
import { getBlockTool } from '@loopstack/common';
|
|
6
|
-
import { WorkflowType } from '@loopstack/contracts/dist/types';
|
|
7
|
-
|
|
8
|
-
@Injectable()
|
|
9
|
-
export class ClaudeToolsHelperService {
|
|
10
|
-
getTools(tools: string[], parent: WorkflowInterface): Anthropic.Tool[] | undefined {
|
|
11
|
-
const toolDefinitions: Anthropic.Tool[] = [];
|
|
12
|
-
|
|
13
|
-
for (const toolName of tools) {
|
|
14
|
-
const tool = getBlockTool<ToolInterface>(parent, toolName);
|
|
15
|
-
if (!tool) {
|
|
16
|
-
throw new Error(`Tool with name ${toolName} not available in Workflow context.`);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const inputSchema = getBlockArgsSchema(tool);
|
|
20
|
-
const config = getBlockConfig<WorkflowType>(tool);
|
|
21
|
-
if (!config) {
|
|
22
|
-
throw new Error(`Block ${tool.constructor.name} is missing @BlockConfig decorator`);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const jsonSchema = inputSchema ? toJSONSchema(inputSchema) : { type: 'object' };
|
|
26
|
-
|
|
27
|
-
toolDefinitions.push({
|
|
28
|
-
name: toolName,
|
|
29
|
-
description: config.description ?? '',
|
|
30
|
-
input_schema: jsonSchema as Anthropic.Tool['input_schema'],
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return toolDefinitions.length ? toolDefinitions : undefined;
|
|
35
|
-
}
|
|
36
|
-
}
|
package/src/services/index.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { BaseTool, InjectTool, Tool, ToolResult } from '@loopstack/common';
|
|
2
|
-
import {
|
|
3
|
-
ClaudeGenerateObject,
|
|
4
|
-
ClaudeGenerateObjectArgsType,
|
|
5
|
-
ClaudeGenerateObjectSchema,
|
|
6
|
-
} from './claude-generate-object.tool';
|
|
7
|
-
|
|
8
|
-
@Tool({
|
|
9
|
-
uiConfig: {
|
|
10
|
-
description: 'Generates a structured object using the Anthropic Claude API and creates it as a document',
|
|
11
|
-
},
|
|
12
|
-
schema: ClaudeGenerateObjectSchema,
|
|
13
|
-
})
|
|
14
|
-
export class ClaudeGenerateDocument extends BaseTool {
|
|
15
|
-
@InjectTool() private claudeGenerateObject!: ClaudeGenerateObject;
|
|
16
|
-
|
|
17
|
-
async call(args: ClaudeGenerateObjectArgsType): Promise<ToolResult> {
|
|
18
|
-
const generateResult = await this.claudeGenerateObject.call(args);
|
|
19
|
-
const entity = await this.repository.save(args.response.document, generateResult.data as Record<string, unknown>, {
|
|
20
|
-
id: args.response.id,
|
|
21
|
-
validate: 'skip',
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
return {
|
|
25
|
-
data: entity,
|
|
26
|
-
metadata: generateResult.metadata,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
-
import { Inject } from '@nestjs/common';
|
|
3
|
-
import { toJSONSchema, z } from 'zod';
|
|
4
|
-
import {
|
|
5
|
-
BaseTool,
|
|
6
|
-
DocumentClass,
|
|
7
|
-
Tool,
|
|
8
|
-
ToolResult,
|
|
9
|
-
getBlockTypeFromMetadata,
|
|
10
|
-
getDocumentSchema,
|
|
11
|
-
} from '@loopstack/common';
|
|
12
|
-
import { ClaudeGenerateToolBaseSchema } from '../schemas/claude-generate-tool-base.schema';
|
|
13
|
-
import { ClaudeClientService } from '../services';
|
|
14
|
-
import { ClaudeMessagesHelperService } from '../services';
|
|
15
|
-
import { applyCacheBreakpoints } from '../utils/cache.utils';
|
|
16
|
-
|
|
17
|
-
export const ClaudeGenerateObjectSchema = ClaudeGenerateToolBaseSchema.extend({
|
|
18
|
-
response: z.object({
|
|
19
|
-
id: z.string().optional(),
|
|
20
|
-
document: z.custom<DocumentClass>(
|
|
21
|
-
(val) => typeof val === 'function' && getBlockTypeFromMetadata(val as object) === 'document',
|
|
22
|
-
),
|
|
23
|
-
}),
|
|
24
|
-
}).strict();
|
|
25
|
-
|
|
26
|
-
export type ClaudeGenerateObjectArgsType = z.infer<typeof ClaudeGenerateObjectSchema>;
|
|
27
|
-
|
|
28
|
-
const STRUCTURED_OUTPUT_TOOL_NAME = 'structured_output';
|
|
29
|
-
|
|
30
|
-
@Tool({
|
|
31
|
-
uiConfig: {
|
|
32
|
-
description: 'Generates a structured object using the Anthropic Claude API',
|
|
33
|
-
},
|
|
34
|
-
schema: ClaudeGenerateObjectSchema,
|
|
35
|
-
})
|
|
36
|
-
export class ClaudeGenerateObject extends BaseTool {
|
|
37
|
-
@Inject()
|
|
38
|
-
private readonly claudeClientService: ClaudeClientService;
|
|
39
|
-
@Inject()
|
|
40
|
-
private readonly claudeMessagesHelperService: ClaudeMessagesHelperService;
|
|
41
|
-
|
|
42
|
-
async call(args: ClaudeGenerateObjectArgsType): Promise<ToolResult> {
|
|
43
|
-
const client = this.claudeClientService.getClient(args.claude);
|
|
44
|
-
const model = this.claudeClientService.getModel(args.claude);
|
|
45
|
-
|
|
46
|
-
const messages: Anthropic.MessageParam[] = [];
|
|
47
|
-
|
|
48
|
-
if (args.prompt) {
|
|
49
|
-
messages.push({ role: 'user', content: args.prompt });
|
|
50
|
-
} else {
|
|
51
|
-
const resolved = this.claudeMessagesHelperService.getMessages(this.ctx.runtime.documents, {
|
|
52
|
-
messages: args.messages as Anthropic.MessageParam[],
|
|
53
|
-
messagesSearchTag: args.messagesSearchTag,
|
|
54
|
-
});
|
|
55
|
-
messages.push(...resolved);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const responseSchema = getDocumentSchema(args.response.document);
|
|
59
|
-
if (!responseSchema) {
|
|
60
|
-
throw new Error('Claude object generation source document must have a schema.');
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const jsonSchema = toJSONSchema(responseSchema);
|
|
64
|
-
|
|
65
|
-
const response = await this.handleGenerateObject(client, {
|
|
66
|
-
model,
|
|
67
|
-
messages,
|
|
68
|
-
system: args.system,
|
|
69
|
-
maxTokens: args.claude?.maxTokens,
|
|
70
|
-
inputSchema: jsonSchema as Anthropic.Tool['input_schema'],
|
|
71
|
-
cache: args.claude?.cache,
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
return {
|
|
75
|
-
data: response.data,
|
|
76
|
-
metadata: {
|
|
77
|
-
usage: {
|
|
78
|
-
inputTokens: response.usage.input_tokens,
|
|
79
|
-
outputTokens: response.usage.output_tokens,
|
|
80
|
-
cacheCreationInputTokens: response.usage.cache_creation_input_tokens ?? 0,
|
|
81
|
-
cacheReadInputTokens: response.usage.cache_read_input_tokens ?? 0,
|
|
82
|
-
},
|
|
83
|
-
},
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
private async handleGenerateObject(
|
|
88
|
-
client: Anthropic,
|
|
89
|
-
options: {
|
|
90
|
-
model: string;
|
|
91
|
-
messages: Anthropic.MessageParam[];
|
|
92
|
-
system?: string;
|
|
93
|
-
maxTokens?: number;
|
|
94
|
-
inputSchema: Anthropic.Tool['input_schema'];
|
|
95
|
-
cache?: boolean;
|
|
96
|
-
},
|
|
97
|
-
): Promise<{ data: unknown; usage: Anthropic.Usage }> {
|
|
98
|
-
const baseTool: Anthropic.Tool = {
|
|
99
|
-
name: STRUCTURED_OUTPUT_TOOL_NAME,
|
|
100
|
-
description: 'Return the structured output matching the schema.',
|
|
101
|
-
input_schema: options.inputSchema,
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
const { system, tools, messages } = options.cache
|
|
105
|
-
? applyCacheBreakpoints({ system: options.system, tools: [baseTool], messages: options.messages })
|
|
106
|
-
: { system: options.system, tools: [baseTool], messages: options.messages };
|
|
107
|
-
|
|
108
|
-
const startTime = performance.now();
|
|
109
|
-
try {
|
|
110
|
-
const response = await client.messages.create({
|
|
111
|
-
model: options.model,
|
|
112
|
-
messages,
|
|
113
|
-
max_tokens: options.maxTokens ?? 4096,
|
|
114
|
-
...(system ? { system } : {}),
|
|
115
|
-
tools: tools!,
|
|
116
|
-
tool_choice: { type: 'tool', name: STRUCTURED_OUTPUT_TOOL_NAME },
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
const toolUseBlock = response.content.find((block): block is Anthropic.ToolUseBlock => block.type === 'tool_use');
|
|
120
|
-
|
|
121
|
-
if (!toolUseBlock) {
|
|
122
|
-
throw new Error('Claude did not return a tool_use block for structured output.');
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
return {
|
|
126
|
-
data: toolUseBlock.input,
|
|
127
|
-
usage: response.usage,
|
|
128
|
-
};
|
|
129
|
-
} catch (error) {
|
|
130
|
-
const errorResponseTime = performance.now() - startTime;
|
|
131
|
-
console.error(`Request failed after ${errorResponseTime}ms:`, error);
|
|
132
|
-
throw error;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
-
import { Inject } from '@nestjs/common';
|
|
3
|
-
import { z } from 'zod';
|
|
4
|
-
import { BaseTool, Tool, ToolCallEntry, ToolCallsMap, ToolResult } from '@loopstack/common';
|
|
5
|
-
import { ClaudeGenerateToolBaseSchema } from '../schemas/claude-generate-tool-base.schema';
|
|
6
|
-
import { ClaudeClientService } from '../services';
|
|
7
|
-
import { ClaudeMessagesHelperService } from '../services';
|
|
8
|
-
import { ClaudeToolsHelperService } from '../services';
|
|
9
|
-
import { ClaudeGenerateTextResult } from '../types';
|
|
10
|
-
import { applyCacheBreakpoints } from '../utils/cache.utils';
|
|
11
|
-
|
|
12
|
-
export const ClaudeGenerateTextSchema = ClaudeGenerateToolBaseSchema.extend({
|
|
13
|
-
tools: z.array(z.string()).optional(),
|
|
14
|
-
}).strict();
|
|
15
|
-
|
|
16
|
-
type ClaudeGenerateTextArgsType = z.infer<typeof ClaudeGenerateTextSchema>;
|
|
17
|
-
|
|
18
|
-
@Tool({
|
|
19
|
-
uiConfig: {
|
|
20
|
-
description: 'Generates text using the Anthropic Claude API',
|
|
21
|
-
},
|
|
22
|
-
schema: ClaudeGenerateTextSchema,
|
|
23
|
-
})
|
|
24
|
-
export class ClaudeGenerateText extends BaseTool {
|
|
25
|
-
@Inject()
|
|
26
|
-
private readonly claudeClientService: ClaudeClientService;
|
|
27
|
-
@Inject()
|
|
28
|
-
private readonly claudeMessagesHelperService: ClaudeMessagesHelperService;
|
|
29
|
-
@Inject()
|
|
30
|
-
private readonly claudeToolsHelperService: ClaudeToolsHelperService;
|
|
31
|
-
|
|
32
|
-
async call(args: ClaudeGenerateTextArgsType): Promise<ToolResult<ClaudeGenerateTextResult>> {
|
|
33
|
-
const client = this.claudeClientService.getClient(args.claude);
|
|
34
|
-
const model = this.claudeClientService.getModel(args.claude);
|
|
35
|
-
|
|
36
|
-
const messages: Anthropic.MessageParam[] = [];
|
|
37
|
-
|
|
38
|
-
if (args.prompt) {
|
|
39
|
-
messages.push({ role: 'user', content: args.prompt });
|
|
40
|
-
} else {
|
|
41
|
-
const resolved = this.claudeMessagesHelperService.getMessages(this.ctx.runtime.documents, {
|
|
42
|
-
messages: args.messages as Anthropic.MessageParam[],
|
|
43
|
-
messagesSearchTag: args.messagesSearchTag,
|
|
44
|
-
});
|
|
45
|
-
messages.push(...resolved);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const tools = args.tools ? this.claudeToolsHelperService.getTools(args.tools, this.ctx.parent) : undefined;
|
|
49
|
-
|
|
50
|
-
const response = await this.handleGenerateText(client, {
|
|
51
|
-
model,
|
|
52
|
-
messages,
|
|
53
|
-
system: args.system,
|
|
54
|
-
maxTokens: args.claude?.maxTokens,
|
|
55
|
-
tools,
|
|
56
|
-
cache: args.claude?.cache,
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
const toolCalls = this.extractToolCalls(response);
|
|
60
|
-
|
|
61
|
-
return {
|
|
62
|
-
data: {
|
|
63
|
-
...response,
|
|
64
|
-
...(toolCalls ? { toolCalls } : {}),
|
|
65
|
-
},
|
|
66
|
-
metadata: {
|
|
67
|
-
usage: {
|
|
68
|
-
inputTokens: response.usage.input_tokens,
|
|
69
|
-
outputTokens: response.usage.output_tokens,
|
|
70
|
-
cacheCreationInputTokens: response.usage.cache_creation_input_tokens ?? 0,
|
|
71
|
-
cacheReadInputTokens: response.usage.cache_read_input_tokens ?? 0,
|
|
72
|
-
},
|
|
73
|
-
},
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
private extractToolCalls(response: Anthropic.Message): ToolCallsMap | null {
|
|
78
|
-
if (response.stop_reason !== 'tool_use') {
|
|
79
|
-
return null;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const toolCalls: ToolCallsMap = {};
|
|
83
|
-
for (const block of response.content) {
|
|
84
|
-
if (block.type === 'tool_use') {
|
|
85
|
-
toolCalls[block.name] = {
|
|
86
|
-
id: block.id,
|
|
87
|
-
name: block.name,
|
|
88
|
-
input: block.input,
|
|
89
|
-
} satisfies ToolCallEntry;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return Object.keys(toolCalls).length > 0 ? toolCalls : null;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
private async handleGenerateText(
|
|
97
|
-
client: Anthropic,
|
|
98
|
-
options: {
|
|
99
|
-
model: string;
|
|
100
|
-
messages: Anthropic.MessageParam[];
|
|
101
|
-
system?: string;
|
|
102
|
-
maxTokens?: number;
|
|
103
|
-
tools?: Anthropic.Tool[];
|
|
104
|
-
cache?: boolean;
|
|
105
|
-
},
|
|
106
|
-
): Promise<Anthropic.Message> {
|
|
107
|
-
const { system, tools, messages } = options.cache
|
|
108
|
-
? applyCacheBreakpoints({ system: options.system, tools: options.tools, messages: options.messages })
|
|
109
|
-
: { system: options.system, tools: options.tools, messages: options.messages };
|
|
110
|
-
|
|
111
|
-
const startTime = performance.now();
|
|
112
|
-
try {
|
|
113
|
-
const stream = client.messages.stream({
|
|
114
|
-
model: options.model,
|
|
115
|
-
messages,
|
|
116
|
-
max_tokens: options.maxTokens ?? 4096,
|
|
117
|
-
...(system ? { system } : {}),
|
|
118
|
-
...(tools ? { tools } : {}),
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
return await stream.finalMessage();
|
|
122
|
-
} catch (error) {
|
|
123
|
-
const errorResponseTime = performance.now() - startTime;
|
|
124
|
-
console.error(`Request failed after ${errorResponseTime}ms:`, error);
|
|
125
|
-
throw error;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|