@rudra-js/anthropic 0.2.0 → 0.3.1
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/README.md
CHANGED
|
@@ -21,15 +21,29 @@ const provider = createAnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY
|
|
|
21
21
|
const generator = createComponentGenerator({ provider });
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
`model` defaults to `claude-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
`model` defaults to `claude-sonnet-5`, and `thinking` defaults to
|
|
25
|
+
`{ type: 'disabled' }`.
|
|
26
|
+
|
|
27
|
+
Both of those come from the same constraint. Generation runs on the request
|
|
28
|
+
path, inside `modelTimeoutMs`, which core defaults to 1500ms. A model that
|
|
29
|
+
reasons before it answers won't finish in time. Sonnet 5 reasons by default
|
|
30
|
+
when `thinking` is left out, so it's the leaving out that would break the
|
|
31
|
+
budget, not the choice of model.
|
|
32
|
+
|
|
33
|
+
Want a different model? Pass `model` to pin one, and raise `modelTimeoutMs` to
|
|
34
|
+
match while you're there. A quick heads-up on `thinking`: some models reject an
|
|
35
|
+
explicit `{ type: 'disabled' }` and reason whatever you do. Pass
|
|
36
|
+
`thinking: null` for those and we'll send no `thinking` field at all. Our
|
|
37
|
+
example shop pins `claude-opus-5` and gives `modelTimeoutMs` a full 60 seconds,
|
|
38
|
+
which is a demo talking, not a production setting.
|
|
39
|
+
|
|
40
|
+
`maxTokens` and `baseUrl` are optional too.
|
|
27
41
|
|
|
28
42
|
### An identity-linked key needs a workspace
|
|
29
43
|
|
|
30
|
-
A key
|
|
31
|
-
you across several of them
|
|
32
|
-
|
|
44
|
+
A key you made against your identity rather than inside a workspace belongs to
|
|
45
|
+
you across several of them. The API can't tell which one a request is acting in,
|
|
46
|
+
so it answers:
|
|
33
47
|
|
|
34
48
|
```
|
|
35
49
|
400 invalid_request_error — anthropic-workspace-id is required when
|
|
@@ -45,38 +59,38 @@ createAnthropicProvider({
|
|
|
45
59
|
});
|
|
46
60
|
```
|
|
47
61
|
|
|
48
|
-
`fetch` is injectable
|
|
49
|
-
call.
|
|
62
|
+
`fetch` is injectable. That's how our test suite stands in for a network call.
|
|
50
63
|
|
|
51
|
-
The tool schema
|
|
52
|
-
`ProviderRequest
|
|
53
|
-
copy
|
|
54
|
-
|
|
64
|
+
The tool schema we send the model is derived from the `schema` on the
|
|
65
|
+
`ProviderRequest`, the same schema `@rudra-js/core` defines. We don't keep a
|
|
66
|
+
copy here. A second copy would be a second vocabulary, and then the reconciler
|
|
67
|
+
enforces one thing while the model is told another.
|
|
55
68
|
|
|
56
69
|
## Data handling
|
|
57
70
|
|
|
58
71
|
Each generation is one POST to `https://api.anthropic.com/v1/messages`. Set
|
|
59
|
-
`baseUrl` and it goes to that host instead
|
|
60
|
-
region-specific endpoint you have.
|
|
72
|
+
`baseUrl` and it goes to that host instead, whether that's a proxy, a gateway,
|
|
73
|
+
or a region-specific endpoint you have.
|
|
61
74
|
|
|
62
|
-
What
|
|
75
|
+
What's in that request is listed under **What the model sees** in the
|
|
63
76
|
[`@rudra-js/core` README](https://github.com/clivedsouza1010/rudra-js/tree/main/packages/core#what-the-model-sees).
|
|
64
77
|
Read it before you send real shopper traffic. In cohort mode, the default, the
|
|
65
78
|
request carries no individual. In per-shopper mode it carries that shopper's
|
|
66
79
|
likes, dislikes, purchases, basket, views and recent searches.
|
|
67
80
|
|
|
68
|
-
If your shop is in the EU or the UK, you
|
|
69
|
-
Anthropic,
|
|
70
|
-
mechanism for the data leaving your region. Your shop is Anthropic's customer
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
81
|
+
If your shop is in the EU or the UK, you're the one sending personal data to
|
|
82
|
+
Anthropic, so you'll need a data processing agreement with them plus a transfer
|
|
83
|
+
mechanism for the data leaving your region. Your shop is Anthropic's customer.
|
|
84
|
+
This package is a piece of code in the middle, and it _isn't_ a party to
|
|
85
|
+
anything.
|
|
86
|
+
|
|
87
|
+
When the API answers with an error, the `Error` we throw carries the status code
|
|
88
|
+
and the vendor's error category, like `anthropic responded 400
|
|
89
|
+
(invalid_request_error)`. We leave the vendor's own message out. It quotes the
|
|
90
|
+
request back, and for this framework the request can hold a shopper's search
|
|
91
|
+
terms, which an adopter's `console.error(error)` would then write to a log. A
|
|
92
|
+
test in `anthropic-provider.test.ts` puts a search term in that message and
|
|
93
|
+
asserts it does not reach the thrown error.
|
|
80
94
|
|
|
81
95
|
## Licence
|
|
82
96
|
|
|
@@ -11,6 +11,16 @@ export interface AnthropicProviderOptions {
|
|
|
11
11
|
* infer which one a request acts in and rejects it with a 400.
|
|
12
12
|
*/
|
|
13
13
|
workspaceId?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Sent as the request's `thinking`. Defaults to `{ type: 'disabled' }`,
|
|
16
|
+
* because core budgets 1500ms for the whole call and a model that reasons
|
|
17
|
+
* before answering does not finish inside it. Pass `null` to send nothing,
|
|
18
|
+
* which is what a model that rejects an explicit `disabled` needs, and raise
|
|
19
|
+
* `modelTimeoutMs` to match when you do.
|
|
20
|
+
*/
|
|
21
|
+
thinking?: {
|
|
22
|
+
type: 'adaptive' | 'disabled';
|
|
23
|
+
} | null;
|
|
14
24
|
/** Injected so the adapter is testable without a network or an SDK. */
|
|
15
25
|
fetch?: typeof globalThis.fetch;
|
|
16
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-provider.d.ts","sourceRoot":"","sources":["../src/anthropic-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EAIlB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;
|
|
1
|
+
{"version":3,"file":"anthropic-provider.d.ts","sourceRoot":"","sources":["../src/anthropic-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EAIlB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;IACpD,uEAAuE;IACvE,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAyCD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAgI5F"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
const TOOL_NAME = 'emit_component_spec';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* above a typical spec's size rather than tuned to it.
|
|
4
|
+
* A model that reasons before answering draws on the same output budget as the
|
|
5
|
+
* tool call, and a cap close to what a spec needs leaves no room for it. The
|
|
6
|
+
* default is well above a typical spec's size rather than tuned to it.
|
|
8
7
|
*/
|
|
9
8
|
const DEFAULT_MAX_TOKENS = 8192;
|
|
10
9
|
function describeShape(input) {
|
|
@@ -37,7 +36,8 @@ function isToolUseBlock(candidate) {
|
|
|
37
36
|
* and reach the generator as `provider-error` events.
|
|
38
37
|
*/
|
|
39
38
|
export function createAnthropicProvider(options) {
|
|
40
|
-
const model = options.model ?? 'claude-
|
|
39
|
+
const model = options.model ?? 'claude-sonnet-5';
|
|
40
|
+
const thinking = options.thinking === undefined ? { type: 'disabled' } : options.thinking;
|
|
41
41
|
const call = options.fetch ?? globalThis.fetch;
|
|
42
42
|
// Trimmed so a caller-supplied `baseUrl` ending in `/` cannot turn into
|
|
43
43
|
// `//v1/messages`. Done with a loop rather than `/\/+$/`: that pattern
|
|
@@ -71,6 +71,7 @@ export function createAnthropicProvider(options) {
|
|
|
71
71
|
body: JSON.stringify({
|
|
72
72
|
model,
|
|
73
73
|
max_tokens: maxTokens,
|
|
74
|
+
...(thinking ? { thinking } : {}),
|
|
74
75
|
// Marked as the cached prefix. Anything per-shopper interpolated here
|
|
75
76
|
// would destroy the prompt cache hit rate.
|
|
76
77
|
system: [{ type: 'text', text: request.system, cache_control: { type: 'ephemeral' } }],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-provider.js","sourceRoot":"","sources":["../src/anthropic-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic-provider.js","sourceRoot":"","sources":["../src/anthropic-provider.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rudra-js/anthropic",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "An Anthropic adapter for @rudra-js/core, with no vendor SDK and no dependencies",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"anthropic",
|
|
@@ -47,11 +47,11 @@
|
|
|
47
47
|
"access": "public"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"@rudra-js/core": "^0.
|
|
50
|
+
"@rudra-js/core": "^0.3.1",
|
|
51
51
|
"zod": "^4.5.0"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
|
-
"@rudra-js/core": "0.1
|
|
54
|
+
"@rudra-js/core": "0.3.1",
|
|
55
55
|
"zod": "^4.5.4"
|
|
56
56
|
}
|
|
57
57
|
}
|
|
@@ -18,6 +18,14 @@ export interface AnthropicProviderOptions {
|
|
|
18
18
|
* infer which one a request acts in and rejects it with a 400.
|
|
19
19
|
*/
|
|
20
20
|
workspaceId?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Sent as the request's `thinking`. Defaults to `{ type: 'disabled' }`,
|
|
23
|
+
* because core budgets 1500ms for the whole call and a model that reasons
|
|
24
|
+
* before answering does not finish inside it. Pass `null` to send nothing,
|
|
25
|
+
* which is what a model that rejects an explicit `disabled` needs, and raise
|
|
26
|
+
* `modelTimeoutMs` to match when you do.
|
|
27
|
+
*/
|
|
28
|
+
thinking?: { type: 'adaptive' | 'disabled' } | null;
|
|
21
29
|
/** Injected so the adapter is testable without a network or an SDK. */
|
|
22
30
|
fetch?: typeof globalThis.fetch;
|
|
23
31
|
}
|
|
@@ -25,10 +33,9 @@ export interface AnthropicProviderOptions {
|
|
|
25
33
|
const TOOL_NAME = 'emit_component_spec';
|
|
26
34
|
|
|
27
35
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* above a typical spec's size rather than tuned to it.
|
|
36
|
+
* A model that reasons before answering draws on the same output budget as the
|
|
37
|
+
* tool call, and a cap close to what a spec needs leaves no room for it. The
|
|
38
|
+
* default is well above a typical spec's size rather than tuned to it.
|
|
32
39
|
*/
|
|
33
40
|
const DEFAULT_MAX_TOKENS = 8192;
|
|
34
41
|
|
|
@@ -70,7 +77,9 @@ function isToolUseBlock(candidate: unknown): candidate is ToolUseBlock {
|
|
|
70
77
|
* and reach the generator as `provider-error` events.
|
|
71
78
|
*/
|
|
72
79
|
export function createAnthropicProvider(options: AnthropicProviderOptions): ComponentProvider {
|
|
73
|
-
const model = options.model ?? 'claude-
|
|
80
|
+
const model = options.model ?? 'claude-sonnet-5';
|
|
81
|
+
const thinking =
|
|
82
|
+
options.thinking === undefined ? { type: 'disabled' as const } : options.thinking;
|
|
74
83
|
const call = options.fetch ?? globalThis.fetch;
|
|
75
84
|
// Trimmed so a caller-supplied `baseUrl` ending in `/` cannot turn into
|
|
76
85
|
// `//v1/messages`. Done with a loop rather than `/\/+$/`: that pattern
|
|
@@ -106,6 +115,7 @@ export function createAnthropicProvider(options: AnthropicProviderOptions): Comp
|
|
|
106
115
|
body: JSON.stringify({
|
|
107
116
|
model,
|
|
108
117
|
max_tokens: maxTokens,
|
|
118
|
+
...(thinking ? { thinking } : {}),
|
|
109
119
|
// Marked as the cached prefix. Anything per-shopper interpolated here
|
|
110
120
|
// would destroy the prompt cache hit rate.
|
|
111
121
|
system: [{ type: 'text', text: request.system, cache_control: { type: 'ephemeral' } }],
|