@kjerneverk/execution-anthropic 1.0.4-dev.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.
Files changed (42) hide show
  1. package/.kodrdriv-test-cache.json +6 -0
  2. package/LICENSE +18 -0
  3. package/README.md +83 -0
  4. package/dist/index.d.ts +85 -0
  5. package/dist/index.js +123 -0
  6. package/dist/index.js.map +1 -0
  7. package/output/kodrdriv/.kodrdriv-parallel-context.json +584 -0
  8. package/output/kodrdriv/.kodrdriv-parallel-context.json.lock +2 -0
  9. package/output/kodrdriv/260110-1741-release-notes.md +36 -0
  10. package/output/kodrdriv/260112-2201-commit-message.md +1 -0
  11. package/output/kodrdriv/260112-2202-release-notes.md +39 -0
  12. package/output/kodrdriv/260112-2340-commit-message.md +1 -0
  13. package/output/kodrdriv/260113-0022-commit-message.md +1 -0
  14. package/output/kodrdriv/260113-0023-release-notes.md +45 -0
  15. package/output/kodrdriv/260114-0655-commit-message.md +5 -0
  16. package/output/kodrdriv/260115-0616-commit-message.md +4 -0
  17. package/output/kodrdriv/260115-0739-commit-message.md +1 -0
  18. package/output/kodrdriv/260126-0919-commit-message.md +1 -0
  19. package/output/kodrdriv/260126-0921-release-notes.md +34 -0
  20. package/output/kodrdriv/260128-0923-commit-message.md +3 -0
  21. package/output/kodrdriv/260128-0924-release-notes.md +23 -0
  22. package/output/kodrdriv/260130-1638-commit-message.md +1 -0
  23. package/output/kodrdriv/260130-1645-commit-message.md +1 -0
  24. package/output/kodrdriv/260130-1646-release-notes.md +30 -0
  25. package/output/kodrdriv/RELEASE_NOTES.md +28 -0
  26. package/output/kodrdriv/RELEASE_TITLE.md +1 -0
  27. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T06-01-28-797Z.md +97 -0
  28. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T07-40-49-371Z.md +97 -0
  29. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T08-22-38-911Z.md +97 -0
  30. package/output/kodrdriv/agentic-reflection-commit-2026-01-14T14-55-30-939Z.md +118 -0
  31. package/output/kodrdriv/agentic-reflection-commit-2026-01-15T14-16-26-349Z.md +117 -0
  32. package/output/kodrdriv/agentic-reflection-commit-2026-01-15T15-39-45-943Z.md +97 -0
  33. package/output/kodrdriv/agentic-reflection-commit-2026-01-26T17-19-48-407Z.md +188 -0
  34. package/output/kodrdriv/agentic-reflection-commit-2026-01-31T00-38-51-441Z.md +160 -0
  35. package/output/kodrdriv/agentic-reflection-commit-2026-01-31T00-45-53-143Z.md +130 -0
  36. package/output/kodrdriv/agentic-reflection-release-2026-01-11T01-41-03-039Z.md +330 -0
  37. package/output/kodrdriv/agentic-reflection-release-2026-01-13T06-02-11-920Z.md +270 -0
  38. package/output/kodrdriv/agentic-reflection-release-2026-01-13T08-23-08-625Z.md +299 -0
  39. package/output/kodrdriv/agentic-reflection-release-2026-01-26T17-21-17-390Z.md +365 -0
  40. package/output/kodrdriv/agentic-reflection-release-2026-01-31T00-46-16-542Z.md +362 -0
  41. package/package.json +57 -0
  42. package/package.json~ +56 -0
@@ -0,0 +1,6 @@
1
+ {
2
+ "/Users/tobrien/gitw/kjerneverk/execution-anthropic": {
3
+ "lastTestRun": 1768074147459,
4
+ "lastCommitHash": "c99b06505aa201b8a5c9a3cea2a9e5fe1f59450b"
5
+ }
6
+ }
package/LICENSE ADDED
@@ -0,0 +1,18 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ Copyright 2025 Tim O'Brien
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.
18
+
package/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # execution-anthropic
2
+
3
+ Anthropic Claude provider implementation for LLM execution. Implements the `Provider` interface from the `execution` package.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install execution-anthropic @anthropic-ai/sdk
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import { AnthropicProvider, createAnthropicProvider } from 'execution-anthropic';
15
+
16
+ // Create provider
17
+ const provider = createAnthropicProvider();
18
+
19
+ // Execute a request
20
+ const response = await provider.execute(
21
+ {
22
+ model: 'claude-3-opus-20240229',
23
+ messages: [
24
+ { role: 'system', content: 'You are helpful.' },
25
+ { role: 'user', content: 'Hello!' }
26
+ ],
27
+ addMessage: () => {},
28
+ },
29
+ {
30
+ apiKey: process.env.ANTHROPIC_API_KEY,
31
+ temperature: 0.7,
32
+ maxTokens: 4096,
33
+ }
34
+ );
35
+
36
+ console.log(response.content);
37
+ console.log(response.usage); // { inputTokens: X, outputTokens: Y }
38
+ ```
39
+
40
+ ## Supported Models
41
+
42
+ The provider supports all Claude models:
43
+ - Claude 3 Opus
44
+ - Claude 3 Sonnet
45
+ - Claude 3 Haiku
46
+ - Claude 3.5 family
47
+
48
+ ## API Key
49
+
50
+ Set via:
51
+ 1. `options.apiKey` parameter
52
+ 2. `ANTHROPIC_API_KEY` environment variable
53
+
54
+ ## Features
55
+
56
+ - Automatic system prompt extraction (Anthropic separates system from messages)
57
+ - Structured output via tool use (JSON schema support)
58
+ - Full token usage tracking
59
+
60
+ ## Response Format
61
+
62
+ ```typescript
63
+ interface ProviderResponse {
64
+ content: string;
65
+ model: string;
66
+ usage?: {
67
+ inputTokens: number;
68
+ outputTokens: number;
69
+ };
70
+ }
71
+ ```
72
+
73
+ ## Related Packages
74
+
75
+ - `execution` - Core interfaces (no SDK dependencies)
76
+ - `execution-openai` - OpenAI provider
77
+ - `execution-gemini` - Google Gemini provider
78
+
79
+ ## License
80
+
81
+ Apache-2.0
82
+
83
+ <!-- v1.0.0 -->
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Execution Anthropic Package
3
+ *
4
+ * Anthropic provider implementation for LLM execution.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+
9
+ /**
10
+ * Anthropic Provider implementation
11
+ */
12
+ declare class AnthropicProvider implements Provider {
13
+ readonly name = "anthropic";
14
+ /**
15
+ * Check if this provider supports a given model
16
+ */
17
+ supportsModel(model: Model): boolean;
18
+ /**
19
+ * Execute a request against Anthropic
20
+ */
21
+ execute(request: Request_2, options?: ExecutionOptions): Promise<ProviderResponse>;
22
+ }
23
+ export { AnthropicProvider }
24
+ export default AnthropicProvider;
25
+
26
+ /**
27
+ * Create a new Anthropic provider instance
28
+ */
29
+ export declare function createAnthropicProvider(): AnthropicProvider;
30
+
31
+ export declare interface ExecutionOptions {
32
+ apiKey?: string;
33
+ model?: string;
34
+ temperature?: number;
35
+ maxTokens?: number;
36
+ timeout?: number;
37
+ retries?: number;
38
+ }
39
+
40
+ export declare interface Message {
41
+ role: 'user' | 'assistant' | 'system' | 'developer' | 'tool';
42
+ content: string | string[] | null;
43
+ name?: string;
44
+ }
45
+
46
+ export declare type Model = string;
47
+
48
+ export declare interface Provider {
49
+ readonly name: string;
50
+ execute(request: Request_2, options?: ExecutionOptions): Promise<ProviderResponse>;
51
+ supportsModel?(model: Model): boolean;
52
+ }
53
+
54
+ export declare interface ProviderResponse {
55
+ content: string;
56
+ model: string;
57
+ usage?: {
58
+ inputTokens: number;
59
+ outputTokens: number;
60
+ };
61
+ toolCalls?: Array<{
62
+ id: string;
63
+ type: 'function';
64
+ function: {
65
+ name: string;
66
+ arguments: string;
67
+ };
68
+ }>;
69
+ }
70
+
71
+ declare interface Request_2 {
72
+ messages: Message[];
73
+ model: Model;
74
+ responseFormat?: any;
75
+ validator?: any;
76
+ addMessage(message: Message): void;
77
+ }
78
+ export { Request_2 as Request }
79
+
80
+ /**
81
+ * Package version
82
+ */
83
+ export declare const VERSION = "0.0.1";
84
+
85
+ export { }
package/dist/index.js ADDED
@@ -0,0 +1,123 @@
1
+ import Anthropic from "@anthropic-ai/sdk";
2
+ import { getRedactor } from "@utilarium/offrecord";
3
+ import { configureErrorSanitizer, configureSecretGuard, createSafeError } from "@utilarium/spotclean";
4
+ const redactor = getRedactor();
5
+ redactor.register({
6
+ name: "anthropic",
7
+ patterns: [
8
+ /sk-ant-[a-zA-Z0-9_-]+/g,
9
+ /sk-ant-api\d+-[a-zA-Z0-9_-]+/g
10
+ ],
11
+ validator: (key) => /^sk-ant(-api\d+)?-[a-zA-Z0-9_-]+$/.test(key),
12
+ envVar: "ANTHROPIC_API_KEY",
13
+ description: "Anthropic API keys"
14
+ });
15
+ configureErrorSanitizer({
16
+ enabled: true,
17
+ environment: process.env.NODE_ENV === "production" ? "production" : "development",
18
+ includeCorrelationId: true,
19
+ sanitizeStackTraces: process.env.NODE_ENV === "production",
20
+ maxMessageLength: 500
21
+ });
22
+ configureSecretGuard({
23
+ enabled: true,
24
+ redactionText: "[REDACTED]",
25
+ preservePartial: false,
26
+ preserveLength: 0,
27
+ customPatterns: [
28
+ { name: "anthropic", pattern: /sk-ant-[a-zA-Z0-9_-]+/g, description: "Anthropic API key" },
29
+ { name: "anthropic-api", pattern: /sk-ant-api\d+-[a-zA-Z0-9_-]+/g, description: "Anthropic API key" }
30
+ ]
31
+ });
32
+ class AnthropicProvider {
33
+ name = "anthropic";
34
+ /**
35
+ * Check if this provider supports a given model
36
+ */
37
+ supportsModel(model) {
38
+ if (!model) return false;
39
+ return model.startsWith("claude");
40
+ }
41
+ /**
42
+ * Execute a request against Anthropic
43
+ */
44
+ async execute(request, options = {}) {
45
+ const apiKey = options.apiKey || process.env.ANTHROPIC_API_KEY;
46
+ if (!apiKey) {
47
+ throw new Error("Anthropic API key is required. Set ANTHROPIC_API_KEY environment variable.");
48
+ }
49
+ const validation = redactor.validateKey(apiKey, "anthropic");
50
+ if (!validation.valid) {
51
+ throw new Error("Invalid Anthropic API key format");
52
+ }
53
+ try {
54
+ const client = new Anthropic({ apiKey });
55
+ const model = options.model || request.model || "claude-3-opus-20240229";
56
+ let systemPrompt = "";
57
+ const messages = [];
58
+ for (const msg of request.messages) {
59
+ if (msg.role === "system" || msg.role === "developer") {
60
+ systemPrompt += (typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content)) + "\n\n";
61
+ } else {
62
+ messages.push({
63
+ role: msg.role,
64
+ content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content)
65
+ });
66
+ }
67
+ }
68
+ const response = await client.messages.create({
69
+ model,
70
+ system: systemPrompt.trim() || void 0,
71
+ messages,
72
+ max_tokens: options.maxTokens || 4096,
73
+ temperature: options.temperature,
74
+ ...request.responseFormat?.type === "json_schema" ? {
75
+ tools: [
76
+ {
77
+ name: request.responseFormat.json_schema.name,
78
+ description: request.responseFormat.json_schema.description || "Output data in this structured format",
79
+ input_schema: request.responseFormat.json_schema.schema
80
+ }
81
+ ],
82
+ tool_choice: {
83
+ type: "tool",
84
+ name: request.responseFormat.json_schema.name
85
+ }
86
+ } : {}
87
+ });
88
+ let text = "";
89
+ if (request.responseFormat?.type === "json_schema") {
90
+ const toolUseBlock = response.content.find(
91
+ (block) => block.type === "tool_use"
92
+ );
93
+ if (toolUseBlock && toolUseBlock.type === "tool_use") {
94
+ text = JSON.stringify(toolUseBlock.input, null, 2);
95
+ }
96
+ } else {
97
+ const contentBlock = response.content[0];
98
+ text = contentBlock.type === "text" ? contentBlock.text : "";
99
+ }
100
+ return {
101
+ content: text,
102
+ model: response.model,
103
+ usage: {
104
+ inputTokens: response.usage.input_tokens,
105
+ outputTokens: response.usage.output_tokens
106
+ }
107
+ };
108
+ } catch (error) {
109
+ throw createSafeError(error, { provider: "anthropic" });
110
+ }
111
+ }
112
+ }
113
+ function createAnthropicProvider() {
114
+ return new AnthropicProvider();
115
+ }
116
+ const VERSION = "0.0.1";
117
+ export {
118
+ AnthropicProvider,
119
+ VERSION,
120
+ createAnthropicProvider,
121
+ AnthropicProvider as default
122
+ };
123
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * Execution Anthropic Package\n *\n * Anthropic provider implementation for LLM execution.\n *\n * @packageDocumentation\n */\n\nimport Anthropic from '@anthropic-ai/sdk';\nimport { getRedactor } from '@utilarium/offrecord';\nimport { \n createSafeError, \n configureErrorSanitizer,\n configureSecretGuard,\n} from '@utilarium/spotclean';\n\n// Register Anthropic API key patterns on module load\nconst redactor = getRedactor();\nredactor.register({\n name: 'anthropic',\n patterns: [\n /sk-ant-[a-zA-Z0-9_-]+/g,\n /sk-ant-api\\d+-[a-zA-Z0-9_-]+/g,\n ],\n validator: (key: string) => /^sk-ant(-api\\d+)?-[a-zA-Z0-9_-]+$/.test(key),\n envVar: 'ANTHROPIC_API_KEY',\n description: 'Anthropic API keys',\n});\n\n// Configure spotclean for error sanitization\nconfigureErrorSanitizer({\n enabled: true,\n environment: process.env.NODE_ENV === 'production' ? 'production' : 'development',\n includeCorrelationId: true,\n sanitizeStackTraces: process.env.NODE_ENV === 'production',\n maxMessageLength: 500,\n});\n\nconfigureSecretGuard({\n enabled: true,\n redactionText: '[REDACTED]',\n preservePartial: false,\n preserveLength: 0,\n customPatterns: [\n { name: 'anthropic', pattern: /sk-ant-[a-zA-Z0-9_-]+/g, description: 'Anthropic API key' },\n { name: 'anthropic-api', pattern: /sk-ant-api\\d+-[a-zA-Z0-9_-]+/g, description: 'Anthropic API key' },\n ],\n});\n\n// ===== INLINE TYPES (from 'execution' package) =====\n\nexport type Model = string;\n\nexport interface Message {\n role: 'user' | 'assistant' | 'system' | 'developer' | 'tool';\n content: string | string[] | null;\n name?: string;\n}\n\nexport interface Request {\n messages: Message[];\n model: Model;\n responseFormat?: any;\n validator?: any;\n addMessage(message: Message): void;\n}\n\nexport interface ProviderResponse {\n content: string;\n model: string;\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n toolCalls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }>;\n}\n\nexport interface ExecutionOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n timeout?: number;\n retries?: number;\n}\n\nexport interface Provider {\n readonly name: string;\n execute(request: Request, options?: ExecutionOptions): Promise<ProviderResponse>;\n supportsModel?(model: Model): boolean;\n}\n\n/**\n * Anthropic Provider implementation\n */\nexport class AnthropicProvider implements Provider {\n readonly name = 'anthropic';\n\n /**\n * Check if this provider supports a given model\n */\n supportsModel(model: Model): boolean {\n if (!model) return false;\n return model.startsWith('claude');\n }\n\n /**\n * Execute a request against Anthropic\n */\n async execute(\n request: Request,\n options: ExecutionOptions = {}\n ): Promise<ProviderResponse> {\n const apiKey = options.apiKey || process.env.ANTHROPIC_API_KEY;\n \n if (!apiKey) {\n throw new Error('Anthropic API key is required. Set ANTHROPIC_API_KEY environment variable.');\n }\n\n // Validate key format\n const validation = redactor.validateKey(apiKey, 'anthropic');\n if (!validation.valid) {\n throw new Error('Invalid Anthropic API key format');\n }\n\n try {\n const client = new Anthropic({ apiKey });\n\n const model = options.model || request.model || 'claude-3-opus-20240229';\n\n // Anthropic separates system prompt from messages\n let systemPrompt = '';\n const messages: Anthropic.MessageParam[] = [];\n\n for (const msg of request.messages) {\n if (msg.role === 'system' || msg.role === 'developer') {\n systemPrompt +=\n (typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content)) + '\\n\\n';\n } else {\n messages.push({\n role: msg.role as 'user' | 'assistant',\n content:\n typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content),\n });\n }\n }\n\n const response = await client.messages.create({\n model: model,\n system: systemPrompt.trim() || undefined,\n messages: messages,\n max_tokens: options.maxTokens || 4096,\n temperature: options.temperature,\n ...(request.responseFormat?.type === 'json_schema'\n ? {\n tools: [\n {\n name: request.responseFormat.json_schema.name,\n description:\n request.responseFormat.json_schema.description ||\n 'Output data in this structured format',\n input_schema:\n request.responseFormat.json_schema.schema,\n },\n ],\n tool_choice: {\n type: 'tool' as const,\n name: request.responseFormat.json_schema.name,\n },\n }\n : {}),\n });\n\n // Handle ContentBlock\n let text = '';\n\n if (request.responseFormat?.type === 'json_schema') {\n const toolUseBlock = response.content.find(\n (block) => block.type === 'tool_use'\n );\n if (toolUseBlock && toolUseBlock.type === 'tool_use') {\n text = JSON.stringify(toolUseBlock.input, null, 2);\n }\n } else {\n const contentBlock = response.content[0];\n text = contentBlock.type === 'text' ? contentBlock.text : '';\n }\n\n return {\n content: text,\n model: response.model,\n usage: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n },\n };\n } catch (error) {\n // Sanitize error to remove any API keys from error messages\n // Use spotclean for comprehensive error sanitization\n throw createSafeError(error as Error, { provider: 'anthropic' });\n }\n }\n}\n\n/**\n * Create a new Anthropic provider instance\n */\nexport function createAnthropicProvider(): AnthropicProvider {\n return new AnthropicProvider();\n}\n\n/**\n * Package version\n */\nexport const VERSION = '0.0.1';\n\nexport default AnthropicProvider;\n"],"names":[],"mappings":"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"}