@vibesdotdev/integrations-anthropic 0.0.0-stage → 1.0.0-rc.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 (150) hide show
  1. package/LICENSE +126 -0
  2. package/README.md +57 -2
  3. package/dist/ai/anthropic-router-codec.d.ts +32 -0
  4. package/dist/ai/anthropic-router-codec.d.ts.map +1 -0
  5. package/dist/ai/anthropic-router-codec.js +321 -0
  6. package/dist/ai/anthropic-router-codec.js.map +1 -0
  7. package/dist/ai/anthropic.plugin.d.ts +6 -0
  8. package/dist/ai/anthropic.plugin.d.ts.map +1 -0
  9. package/dist/ai/anthropic.plugin.js +116 -0
  10. package/dist/ai/anthropic.plugin.js.map +1 -0
  11. package/dist/ai/catalog.d.ts +87 -0
  12. package/dist/ai/catalog.d.ts.map +1 -0
  13. package/dist/ai/catalog.js +64 -0
  14. package/dist/ai/catalog.js.map +1 -0
  15. package/dist/ai/claude-code-session.d.ts +56 -0
  16. package/dist/ai/claude-code-session.d.ts.map +1 -0
  17. package/dist/ai/claude-code-session.js +75 -0
  18. package/dist/ai/claude-code-session.js.map +1 -0
  19. package/dist/ai/claude-code-turn-env.d.ts +10 -0
  20. package/dist/ai/claude-code-turn-env.d.ts.map +1 -0
  21. package/dist/ai/claude-code-turn-env.js +19 -0
  22. package/dist/ai/claude-code-turn-env.js.map +1 -0
  23. package/dist/ai/hostile.d.ts +23 -0
  24. package/dist/ai/hostile.d.ts.map +1 -0
  25. package/dist/ai/hostile.js +22 -0
  26. package/dist/ai/hostile.js.map +1 -0
  27. package/dist/ai/index.d.ts +4 -0
  28. package/dist/ai/index.d.ts.map +1 -0
  29. package/dist/ai/index.js +4 -0
  30. package/dist/ai/index.js.map +1 -0
  31. package/dist/ai/metadata/assets/logos/providers/anthropic.svg +1 -0
  32. package/dist/ai/metadata/provider-models/anthropic/anthropic-claude-3-5-haiku-20241022.json +77 -0
  33. package/dist/ai/metadata/provider-models/anthropic/anthropic-claude-3-5-sonnet-20241022.json +42 -0
  34. package/dist/ai/metadata/provider-models/anthropic/anthropic-claude-4-opus-20250514.json +79 -0
  35. package/dist/ai/metadata/provider-models/anthropic/anthropic-claude-4-sonnet-20250514.json +79 -0
  36. package/dist/ai/metadata/provider-models/anthropic/anthropic-claude-haiku-4-5.json +80 -0
  37. package/dist/ai/metadata/provider-models/anthropic/anthropic-claude-haiku-5-5.json +39 -0
  38. package/dist/ai/metadata/provider-models/anthropic/anthropic-claude-opus-4-1.json +78 -0
  39. package/dist/ai/metadata/provider-models/anthropic/anthropic-claude-opus-4-5.json +80 -0
  40. package/dist/ai/metadata/provider-models/anthropic/anthropic-claude-opus-4-6.json +80 -0
  41. package/dist/ai/metadata/provider-models/anthropic/anthropic-claude-opus-4-7.json +81 -0
  42. package/dist/ai/metadata/provider-models/anthropic/anthropic-claude-sonnet-4-5.json +80 -0
  43. package/dist/ai/metadata/provider-models/anthropic/anthropic-claude-sonnet-4-6.json +80 -0
  44. package/dist/ai/metadata/providers/anthropic.json +22 -0
  45. package/dist/ai/providers/anthropic/anthropic.provider.impl.d.ts +62 -0
  46. package/dist/ai/providers/anthropic/anthropic.provider.impl.d.ts.map +1 -0
  47. package/dist/ai/providers/anthropic/anthropic.provider.impl.js +430 -0
  48. package/dist/ai/providers/anthropic/anthropic.provider.impl.js.map +1 -0
  49. package/dist/ai/providers/anthropic/detection/index.d.ts +8 -0
  50. package/dist/ai/providers/anthropic/detection/index.d.ts.map +1 -0
  51. package/dist/ai/providers/anthropic/detection/index.js +8 -0
  52. package/dist/ai/providers/anthropic/detection/index.js.map +1 -0
  53. package/dist/ai/providers/anthropic/detection/system.d.ts +12 -0
  54. package/dist/ai/providers/anthropic/detection/system.d.ts.map +1 -0
  55. package/dist/ai/providers/anthropic/detection/system.js +34 -0
  56. package/dist/ai/providers/anthropic/detection/system.js.map +1 -0
  57. package/dist/ai/providers/anthropic/docs/ai.providers.anthropic.docs.descriptor.d.ts +4 -0
  58. package/dist/ai/providers/anthropic/docs/ai.providers.anthropic.docs.descriptor.d.ts.map +1 -0
  59. package/dist/ai/providers/anthropic/docs/ai.providers.anthropic.docs.descriptor.js +212 -0
  60. package/dist/ai/providers/anthropic/docs/ai.providers.anthropic.docs.descriptor.js.map +1 -0
  61. package/dist/ai/providers/anthropic/index.d.ts +4 -0
  62. package/dist/ai/providers/anthropic/index.d.ts.map +1 -0
  63. package/dist/ai/providers/anthropic/index.js +4 -0
  64. package/dist/ai/providers/anthropic/index.js.map +1 -0
  65. package/dist/ai/providers/anthropic/recommendations.d.ts +24 -0
  66. package/dist/ai/providers/anthropic/recommendations.d.ts.map +1 -0
  67. package/dist/ai/providers/anthropic/recommendations.js +192 -0
  68. package/dist/ai/providers/anthropic/recommendations.js.map +1 -0
  69. package/dist/ai/providers/cloud/frontier/anthropic/config/config.anthropic.descriptor.d.ts +4194 -0
  70. package/dist/ai/providers/cloud/frontier/anthropic/config/config.anthropic.descriptor.d.ts.map +1 -0
  71. package/dist/ai/providers/cloud/frontier/anthropic/config/config.anthropic.descriptor.js +52 -0
  72. package/dist/ai/providers/cloud/frontier/anthropic/config/config.anthropic.descriptor.js.map +1 -0
  73. package/dist/ai/providers/cloud/frontier/anthropic/config/schemas/index.d.ts +46 -0
  74. package/dist/ai/providers/cloud/frontier/anthropic/config/schemas/index.d.ts.map +1 -0
  75. package/dist/ai/providers/cloud/frontier/anthropic/config/schemas/index.js +22 -0
  76. package/dist/ai/providers/cloud/frontier/anthropic/config/schemas/index.js.map +1 -0
  77. package/dist/ai/providers/cloud/frontier/anthropic/index.d.ts +5 -0
  78. package/dist/ai/providers/cloud/frontier/anthropic/index.d.ts.map +1 -0
  79. package/dist/ai/providers/cloud/frontier/anthropic/index.js +4 -0
  80. package/dist/ai/providers/cloud/frontier/anthropic/index.js.map +1 -0
  81. package/dist/ai/providers/cloud/frontier/anthropic/provider.anthropic.descriptor.d.ts +183 -0
  82. package/dist/ai/providers/cloud/frontier/anthropic/provider.anthropic.descriptor.d.ts.map +1 -0
  83. package/dist/ai/providers/cloud/frontier/anthropic/provider.anthropic.descriptor.js +115 -0
  84. package/dist/ai/providers/cloud/frontier/anthropic/provider.anthropic.descriptor.js.map +1 -0
  85. package/dist/ai/specs/anthropic-messages/anthropic-messages.failures.d.ts +46 -0
  86. package/dist/ai/specs/anthropic-messages/anthropic-messages.failures.d.ts.map +1 -0
  87. package/dist/ai/specs/anthropic-messages/anthropic-messages.failures.js +183 -0
  88. package/dist/ai/specs/anthropic-messages/anthropic-messages.failures.js.map +1 -0
  89. package/dist/ai/specs/anthropic-messages/anthropic-messages.spec.descriptor.d.ts +34 -0
  90. package/dist/ai/specs/anthropic-messages/anthropic-messages.spec.descriptor.d.ts.map +1 -0
  91. package/dist/ai/specs/anthropic-messages/anthropic-messages.spec.descriptor.js +29 -0
  92. package/dist/ai/specs/anthropic-messages/anthropic-messages.spec.descriptor.js.map +1 -0
  93. package/dist/ai/specs/anthropic-messages/anthropic-messages.spec.impl.d.ts +48 -0
  94. package/dist/ai/specs/anthropic-messages/anthropic-messages.spec.impl.d.ts.map +1 -0
  95. package/dist/ai/specs/anthropic-messages/anthropic-messages.spec.impl.js +557 -0
  96. package/dist/ai/specs/anthropic-messages/anthropic-messages.spec.impl.js.map +1 -0
  97. package/dist/ai/specs/claude-code-exec/claude-code-exec.spec.descriptor.d.ts +26 -0
  98. package/dist/ai/specs/claude-code-exec/claude-code-exec.spec.descriptor.d.ts.map +1 -0
  99. package/dist/ai/specs/claude-code-exec/claude-code-exec.spec.descriptor.js +15 -0
  100. package/dist/ai/specs/claude-code-exec/claude-code-exec.spec.descriptor.js.map +1 -0
  101. package/dist/ai/specs/claude-code-exec/claude-code-exec.spec.impl.d.ts +35 -0
  102. package/dist/ai/specs/claude-code-exec/claude-code-exec.spec.impl.d.ts.map +1 -0
  103. package/dist/ai/specs/claude-code-exec/claude-code-exec.spec.impl.js +210 -0
  104. package/dist/ai/specs/claude-code-exec/claude-code-exec.spec.impl.js.map +1 -0
  105. package/dist/external/acp-server.consumer.plugin.d.ts +3 -0
  106. package/dist/external/acp-server.consumer.plugin.d.ts.map +1 -0
  107. package/dist/external/acp-server.consumer.plugin.js +29 -0
  108. package/dist/external/acp-server.consumer.plugin.js.map +1 -0
  109. package/dist/external/acp-server.d.ts +19 -0
  110. package/dist/external/acp-server.d.ts.map +1 -0
  111. package/dist/external/acp-server.js +198 -0
  112. package/dist/external/acp-server.js.map +1 -0
  113. package/dist/external/claude-code-hooks.d.ts +51 -0
  114. package/dist/external/claude-code-hooks.d.ts.map +1 -0
  115. package/dist/external/claude-code-hooks.js +252 -0
  116. package/dist/external/claude-code-hooks.js.map +1 -0
  117. package/dist/external/claude-code-installer.d.ts +10 -0
  118. package/dist/external/claude-code-installer.d.ts.map +1 -0
  119. package/dist/external/claude-code-installer.js +604 -0
  120. package/dist/external/claude-code-installer.js.map +1 -0
  121. package/dist/external/claude-code-operations.d.ts +217 -0
  122. package/dist/external/claude-code-operations.d.ts.map +1 -0
  123. package/dist/external/claude-code-operations.js +101 -0
  124. package/dist/external/claude-code-operations.js.map +1 -0
  125. package/dist/external/claude-code-plugin.json +7 -0
  126. package/dist/external/claude-code-presets.d.ts +813 -0
  127. package/dist/external/claude-code-presets.d.ts.map +1 -0
  128. package/dist/external/claude-code-presets.js +157 -0
  129. package/dist/external/claude-code-presets.js.map +1 -0
  130. package/dist/external/claude-code.descriptor.d.ts +160 -0
  131. package/dist/external/claude-code.descriptor.d.ts.map +1 -0
  132. package/dist/external/claude-code.descriptor.js +5 -0
  133. package/dist/external/claude-code.descriptor.js.map +1 -0
  134. package/dist/external/claude-code.manifest.d.ts +5 -0
  135. package/dist/external/claude-code.manifest.d.ts.map +1 -0
  136. package/dist/external/claude-code.manifest.js +205 -0
  137. package/dist/external/claude-code.manifest.js.map +1 -0
  138. package/dist/external/external.plugin.d.ts +6 -0
  139. package/dist/external/external.plugin.d.ts.map +1 -0
  140. package/dist/external/external.plugin.js +56 -0
  141. package/dist/external/external.plugin.js.map +1 -0
  142. package/dist/external/index.d.ts +6 -0
  143. package/dist/external/index.d.ts.map +1 -0
  144. package/dist/external/index.js +6 -0
  145. package/dist/external/index.js.map +1 -0
  146. package/dist/index.d.ts +4 -0
  147. package/dist/index.d.ts.map +1 -0
  148. package/dist/index.js +4 -0
  149. package/dist/index.js.map +1 -0
  150. package/package.json +108 -4
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Descriptor for ai.providers.anthropic
3
+ * Auto-generated by `vibes docs generate`
4
+ */
5
+ const ai_providers_anthropicMarkdown = `---
6
+ title: Anthropic Provider
7
+ summary: Use a Claude subscription locally or a separately billed Anthropic API credential
8
+ tags: [ai, providers, anthropic, claude, llm]
9
+ parent: ai.providers
10
+ order: 2
11
+ id: ai.providers.anthropic
12
+ ---
13
+
14
+ # Anthropic Provider
15
+
16
+ The \`@vibesdotdev/integrations-anthropic\` package registers two deliberately separate
17
+ Claude routes. Consumer hosts can delegate to the official Claude Code CLI using a
18
+ provider-managed \`claude.ai\` subscription session. Consumer and cloud hosts can use
19
+ an Anthropic API-key \`CredentialReference\`, which is billed by Anthropic Console.
20
+ A Claude subscription does not fund the API-key route.
21
+
22
+ ## Overview
23
+
24
+ The package contributes these runtime assets:
25
+
26
+ - A provider-type implementation (\`AnthropicProviderType\`) that verifies Claude Code
27
+ subscription status without returning account details, validates credential references,
28
+ and checks API health without sending a generated message.
29
+ - Credential detection (\`detectAnthropicSystem\`) that surfaces a configured
30
+ \`ANTHROPIC_API_KEY\` as a secret \`CredentialReference\`, never as its value.
31
+ - A consumer-only \`claude-code-exec\` process spec that disables tools, browser
32
+ integration, session persistence, and API-billing environment overrides.
33
+ - A recommendation engine (\`AnthropicRecommendation\`, resolved through the runtime) used by setup flows to score
34
+ Claude for chat, development, research, and organization use cases.
35
+
36
+ Claude models support a 200K-token context window, native tool use, and vision
37
+ (image) input.
38
+
39
+ ## Authentication
40
+
41
+ ### Claude subscription on a consumer host
42
+
43
+ Choose **Claude subscription** in the provider connection UI. The provider runs
44
+ \`claude auth login\` without \`--console\`, then accepts the connection only when
45
+ \`claude auth status\` reports \`authMethod: claude.ai\` and a non-empty subscription
46
+ type. Vibes never reads or mirrors Claude OAuth credentials.
47
+
48
+ This route runs only on the connected consumer host. Cloud workers cannot reuse a
49
+ consumer Claude session.
50
+
51
+ ### Anthropic API billing
52
+
53
+ Create the key in [Anthropic Console](https://console.anthropic.com/settings/keys),
54
+ put the value in a Vibes secrets store, and save only a \`CredentialReference\` such as
55
+ \`{ source: 'secret', key: 'ANTHROPIC_API_KEY' }\` in the provider connection. API usage
56
+ is metered separately from Claude subscriptions. Do not paste a bare key into source,
57
+ configuration, logs, or chat.
58
+
59
+ ## Detecting the provider
60
+
61
+ \`detectAnthropicSystem(runtime)\` returns a \`DetectedProvider\` when the handed runtime resolves the declared credential, or \`null\` when it is not:
62
+
63
+ :::usage{language="ts"}
64
+ import { detectAnthropicSystem } from '@vibesdotdev/integrations-anthropic/ai';
65
+
66
+ const detected = await detectAnthropicSystem(runtime);
67
+ if (detected) {
68
+ console.log(detected.providerType); // 'anthropic'
69
+ console.log(detected.status); // 'available'
70
+ }
71
+ :::
72
+
73
+ ## Generating text
74
+
75
+ Generation goes through the runtime's \`ai/generation\` kind. Resolve an executor for
76
+ the target hardware, then call \`generate()\` with a Claude model id. The runtime
77
+ routes the request to the Anthropic provider based on the model's provider id.
78
+
79
+ :::usage{language="ts"}
80
+ // runtime is supplied by the host or invocation context.
81
+ const executor = await runtime.query('ai/generation')
82
+ .forHardware('consumer')
83
+ .resolve();
84
+
85
+ const response = await executor.generate({
86
+ messages: [
87
+ { role: 'user', content: 'Hello, Claude!' }
88
+ ],
89
+ model: 'anthropic:claude-sonnet-4-5',
90
+ maxTokens: 1024,
91
+ temperature: 0.7
92
+ });
93
+
94
+ console.log(response.content);
95
+ :::
96
+
97
+ ### Tool use
98
+
99
+ \`\`\`ts
100
+ const response = await executor.generate({
101
+ messages: [
102
+ { role: 'user', content: 'What is the weather in San Francisco?' }
103
+ ],
104
+ model: 'anthropic:claude-sonnet-4-5',
105
+ tools: [
106
+ {
107
+ name: 'get_weather',
108
+ description: 'Get current weather for a location',
109
+ parameters: {
110
+ type: 'object',
111
+ properties: {
112
+ location: { type: 'string' }
113
+ },
114
+ required: ['location']
115
+ }
116
+ }
117
+ ],
118
+ toolChoice: 'auto'
119
+ });
120
+ \`\`\`
121
+
122
+ For streaming responses, see [\`ai.streaming\`](ai.streaming).
123
+
124
+ ## Available models
125
+
126
+ Claude models are registered by \`@vibesdotdev/integrations-anthropic\` with
127
+ colon-namespaced ids. All carry a 200K-token context window.
128
+
129
+ | Model id | Display name |
130
+ |----------|--------------|
131
+ | \`anthropic:claude-opus-4-7\` | Claude Opus 4.7 |
132
+ | \`anthropic:claude-opus-4-6\` | Claude Opus 4.6 |
133
+ | \`anthropic:claude-opus-4-5\` | Claude Opus 4.5 |
134
+ | \`anthropic:claude-opus-4-1\` | Claude Opus 4.1 (legacy pricing) |
135
+ | \`anthropic:claude-sonnet-4-6\` | Claude Sonnet 4.6 |
136
+ | \`anthropic:claude-sonnet-4-5\` | Claude Sonnet 4.5 |
137
+ | \`anthropic:claude-haiku-4-5\` | Claude Haiku 4.5 |
138
+
139
+ Opus models are tuned for complex reasoning, Sonnet for a balance of intelligence
140
+ and speed, and Haiku for fast, cost-effective tasks.
141
+
142
+ ## Connection validation
143
+
144
+ \`AnthropicProviderType\` exposes helpers that setup flows use to validate a
145
+ configuration before persisting it. \`validateConnection()\` requires a canonical
146
+ \`CredentialReference\` for API-key auth. Subscription health verifies the Claude Code
147
+ auth status; API health uses the non-generating models catalog endpoint. Provider bodies,
148
+ account identity, OAuth tokens, and authorization details are never returned.
149
+
150
+ ## Recommendations
151
+
152
+ The \`AnthropicRecommendation\` class, which the \`ai/provider-recommendation\` kind resolves
153
+ through the runtime, scores Claude
154
+ across use cases and supplies setup steps. It supports the \`oauth\`, \`api_key\` and \`env_var\`
155
+ setup methods. OAuth means a provider-managed Claude Code subscription login on a consumer host;
156
+ it does not mean that Vibes stores a reusable Anthropic token.
157
+
158
+ \`\`\`ts
159
+ const recommendation = await runtime.query('ai/provider-recommendation').withId('anthropic').resolve();
160
+
161
+ recommendation.getSupportedSetupMethods(); // ['oauth', 'api_key', 'env_var']
162
+ \`\`\`
163
+
164
+ ## Related
165
+
166
+ :::card{title="See also"}
167
+ - [\`ai.providers\`](ai.providers) — Provider registry overview
168
+ - [\`ai.generation\`](ai.generation) — Generation API
169
+ - [\`ai.streaming\`](ai.streaming) — Streaming responses
170
+ - [\`ai.models\`](ai.models) — Model registry and descriptors
171
+ :::
172
+ `;
173
+ const descriptor = {
174
+ kind: 'docs/topic',
175
+ id: 'ai.providers.anthropic',
176
+ title: 'Anthropic Provider',
177
+ summary: 'Use a Claude subscription locally or a separately billed Anthropic API credential',
178
+ body: {
179
+ type: 'markdown',
180
+ sourceType: 'raw',
181
+ source: ai_providers_anthropicMarkdown
182
+ },
183
+ parent: 'ai.providers',
184
+ order: 2,
185
+ tags: ['ai', 'providers', 'anthropic', 'claude', 'llm'],
186
+ surfaces: ['cli', 'web', 'in-app'],
187
+ hardware: ['consumer', 'cloud'],
188
+ enabled: true,
189
+ man: {
190
+ name: 'ai.providers.anthropic — Anthropic Claude provider',
191
+ section: 1,
192
+ synopsis: 'vibes man ai.providers.anthropic',
193
+ options: [],
194
+ examples: [
195
+ {
196
+ description: 'Generate text with Claude',
197
+ command: "const ex = await runtime.query('ai/generation').forHardware('consumer').resolve(); await ex.generate({ model: 'anthropic:claude-sonnet-4-5', messages: [...] })"
198
+ },
199
+ {
200
+ description: 'Detect a configured Anthropic key',
201
+ command: 'await detectAnthropicSystem(runtime)'
202
+ },
203
+ {
204
+ description: 'Inspect supported setup methods',
205
+ command: "(await runtime.query('ai/provider-recommendation').withId('anthropic').resolve()).getSupportedSetupMethods()"
206
+ }
207
+ ],
208
+ seeAlso: ['ai.providers', 'ai.generation', 'ai.streaming', 'ai.models']
209
+ }
210
+ };
211
+ export default descriptor;
212
+ //# sourceMappingURL=ai.providers.anthropic.docs.descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.providers.anthropic.docs.descriptor.js","sourceRoot":"","sources":["../../../../../src/ai/providers/anthropic/docs/ai.providers.anthropic.docs.descriptor.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,8BAA8B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuKtC,CAAC;AAEF,MAAM,UAAU,GAAwB;IACtC,IAAI,EAAE,YAAY;IAClB,EAAE,EAAE,wBAAwB;IAC5B,KAAK,EAAE,oBAAoB;IAC3B,OAAO,EAAE,mFAAmF;IAC5F,IAAI,EAAE;QACJ,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE,8BAA8B;KACvC;IACD,MAAM,EAAE,cAAc;IACtB,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC;IACvD,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC;IAClC,QAAQ,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;IAC/B,OAAO,EAAE,IAAI;IACb,GAAG,EAAE;QACH,IAAI,EAAE,oDAAoD;QAC1D,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,kCAAkC;QAC5C,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE;YACR;gBACE,WAAW,EAAE,2BAA2B;gBACxC,OAAO,EACL,iKAAiK;aACpK;YACD;gBACE,WAAW,EAAE,mCAAmC;gBAChD,OAAO,EAAE,sCAAsC;aAChD;YACD;gBACE,WAAW,EAAE,iCAAiC;gBAC9C,OAAO,EACL,8GAA8G;aACjH;SACF;QACD,OAAO,EAAE,CAAC,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,CAAC;KACxE;CACF,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { AnthropicProviderType } from './anthropic.provider.impl.ts';
2
+ export { detectAnthropicSystem } from './detection/system.ts';
3
+ export { AnthropicRecommendation } from './recommendations.ts';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/anthropic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { AnthropicProviderType } from "./anthropic.provider.impl.js";
2
+ export { detectAnthropicSystem } from "./detection/system.js";
3
+ export { AnthropicRecommendation } from "./recommendations.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ai/providers/anthropic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { ProviderRecommendation, type ModelAdapter } from '@vibesdotdev/ai/recommendations/base';
2
+ import type { UseCase, SetupMethod, RecommendationContext, SetupStep, ModelRecommendation } from '@vibesdotdev/ai/recommendations/schemas';
3
+ export declare class AnthropicRecommendation extends ProviderRecommendation {
4
+ readonly providerType = "anthropic";
5
+ readonly displayName = "Anthropic Claude";
6
+ getUseCaseScore(useCase: UseCase): number;
7
+ getStageScore(stage: RecommendationContext['stage']): number;
8
+ getRequiredEnvironmentVariables(): string[];
9
+ getReason(useCase: UseCase): string;
10
+ getStrengths(_useCase: UseCase): string[];
11
+ getWeaknesses(context: RecommendationContext): string[];
12
+ getSupportedSetupMethods(): SetupMethod[];
13
+ getSetupSteps(method: SetupMethod, _context: RecommendationContext): Promise<SetupStep[]>;
14
+ recommendModels(adapter: ModelAdapter | null, context: RecommendationContext): Promise<ModelRecommendation[]>;
15
+ getExecutionContext(): {
16
+ scanModels: "server";
17
+ getSetupSteps: "both";
18
+ recommendModels: "server";
19
+ };
20
+ supportsOAuth(): boolean;
21
+ supportsLocal(): boolean;
22
+ requiresGPU(): boolean;
23
+ }
24
+ //# sourceMappingURL=recommendations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommendations.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/anthropic/recommendations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,KAAK,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACjG,OAAO,KAAK,EACX,OAAO,EACP,WAAW,EACX,qBAAqB,EACrB,SAAS,EACT,mBAAmB,EACnB,MAAM,yCAAyC,CAAC;AAGjD,qBAAa,uBAAwB,SAAQ,sBAAsB;IAClE,QAAQ,CAAC,YAAY,eAAe;IACpC,QAAQ,CAAC,WAAW,sBAAsB;IAE1C,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAazC,aAAa,CAAC,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,GAAG,MAAM;IAI5D,+BAA+B,IAAI,MAAM,EAAE;IAI3C,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAenC,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE;IAUzC,aAAa,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,EAAE;IAoBvD,wBAAwB,IAAI,WAAW,EAAE;IAInC,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAsDzF,eAAe,CACpB,OAAO,EAAE,YAAY,GAAG,IAAI,EAC5B,OAAO,EAAE,qBAAqB,GAC5B,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAkFjC,mBAAmB;;;;;IAQnB,aAAa,IAAI,OAAO;IAIxB,aAAa,IAAI,OAAO;IAIxB,WAAW,IAAI,OAAO;CAGtB"}
@@ -0,0 +1,192 @@
1
+ import { ProviderRecommendation } from '@vibesdotdev/ai/recommendations/base';
2
+ import { catalogLimits, catalogModel, catalogName, usdPerMillion } from "../../catalog.js";
3
+ export class AnthropicRecommendation extends ProviderRecommendation {
4
+ providerType = 'anthropic';
5
+ displayName = 'Anthropic Claude';
6
+ getUseCaseScore(useCase) {
7
+ const scores = {
8
+ chat: 50,
9
+ development: 45,
10
+ research: 50,
11
+ images: 0,
12
+ video: 0,
13
+ audio: 0,
14
+ organization: 40
15
+ };
16
+ return scores[useCase];
17
+ }
18
+ getStageScore(stage) {
19
+ return stage === 'production' ? 25 : 0;
20
+ }
21
+ getRequiredEnvironmentVariables() {
22
+ return ['ANTHROPIC_API_KEY'];
23
+ }
24
+ getReason(useCase) {
25
+ switch (useCase) {
26
+ case 'chat':
27
+ return 'Claude excels at natural conversation with strong context retention';
28
+ case 'development':
29
+ return 'Claude Sonnet offers excellent code generation and debugging';
30
+ case 'research':
31
+ return "Claude's 200K context window handles long documents and analysis";
32
+ case 'organization':
33
+ return 'Enterprise-ready with strong safety and compliance';
34
+ default:
35
+ return 'General-purpose AI model with strong reasoning';
36
+ }
37
+ }
38
+ getStrengths(_useCase) {
39
+ return [
40
+ '200K context window',
41
+ 'Strong reasoning capabilities',
42
+ 'Fast response times',
43
+ 'SOC 2 Type II certified',
44
+ 'Excellent code understanding'
45
+ ];
46
+ }
47
+ getWeaknesses(context) {
48
+ const weaknesses = [];
49
+ if (context.useCase === 'images' ||
50
+ context.useCase === 'video' ||
51
+ context.useCase === 'audio') {
52
+ weaknesses.push('No multimedia generation');
53
+ }
54
+ if (!context.availableEnvVars?.includes('ANTHROPIC_API_KEY')) {
55
+ weaknesses.push('Cloud execution requires an Anthropic API credential reference');
56
+ }
57
+ weaknesses.push('Claude subscription execution requires a connected consumer host');
58
+ return weaknesses;
59
+ }
60
+ getSupportedSetupMethods() {
61
+ return ['oauth', 'api_key', 'env_var'];
62
+ }
63
+ async getSetupSteps(method, _context) {
64
+ if (method === 'oauth') {
65
+ return [
66
+ {
67
+ step: 'Connect Claude subscription',
68
+ description: 'Run the provider-owned Claude Code browser login without the Console API-billing option.'
69
+ },
70
+ {
71
+ step: 'Verify billing route',
72
+ description: 'Confirm Claude Code reports authMethod=claude.ai and a non-empty subscription type.'
73
+ }
74
+ ];
75
+ }
76
+ if (method === 'api_key') {
77
+ return [
78
+ {
79
+ step: 'Get API Key',
80
+ description: 'Sign up for Anthropic Claude and generate an API key',
81
+ action: 'https://console.anthropic.com/settings/keys',
82
+ component: 'anthropic/setup/signup-guide'
83
+ },
84
+ {
85
+ step: 'Store the API key',
86
+ description: 'Save the value through Vibes Secrets, then enter only its secret reference name in provider setup.',
87
+ component: 'anthropic/setup/api-key-form'
88
+ },
89
+ {
90
+ step: 'Test Connection',
91
+ description: "We'll verify your API key works and select a default model"
92
+ }
93
+ ];
94
+ }
95
+ if (method === 'env_var') {
96
+ return [
97
+ {
98
+ step: 'Bind the runtime credential',
99
+ description: 'Provision ANTHROPIC_API_KEY through the host credential store the runtime composes (a live host-credentials publisher or the workspace env-file store), then save the secret reference { source: "secret", key: "ANTHROPIC_API_KEY" }.',
100
+ component: 'anthropic/setup/env-var-guide'
101
+ },
102
+ {
103
+ step: 'Restart Application',
104
+ description: 'Restart the host so the credential store publishes the key'
105
+ }
106
+ ];
107
+ }
108
+ return [];
109
+ }
110
+ async recommendModels(adapter, context) {
111
+ const recommendations = [];
112
+ // If adapter exists, check which models user has access to
113
+ let availableModels = [];
114
+ if (adapter?.listModels) {
115
+ // A listing failure propagates: logging it and recommending against an
116
+ // empty list would present every model as unavailable.
117
+ const models = await adapter.listModels();
118
+ availableModels = models.map((m) => m.id);
119
+ }
120
+ // A model is available when the adapter lists its catalogue id, or a dated snapshot of it.
121
+ const isListed = (providerModelId) => availableModels.some((listed) => listed === providerModelId || listed.startsWith(`${providerModelId}-`));
122
+ /** A recommendation of one catalogue model: its id, name, limits and price are the catalogue's. */
123
+ const recommend = (providerModelId, fit) => {
124
+ const model = catalogModel(providerModelId);
125
+ const limits = catalogLimits(model);
126
+ const input = usdPerMillion(model, 'input_tokens');
127
+ const output = usdPerMillion(model, 'output_tokens');
128
+ const recommendation = {
129
+ modelId: model.providerModelId,
130
+ modelName: catalogName(model),
131
+ score: fit.score,
132
+ reason: fit.reason,
133
+ contextWindow: limits.contextWindow,
134
+ maxOutputTokens: limits.maxOutputTokens,
135
+ capabilities: fit.capabilities,
136
+ isAvailable: isListed(model.providerModelId),
137
+ requiresUpgrade: false,
138
+ useCaseFit: fit.score
139
+ };
140
+ // The field is per 1K tokens; the catalogue prices per million.
141
+ if (input !== undefined && output !== undefined) {
142
+ recommendation.costPer1kTokens = { input: input / 1000, output: output / 1000 };
143
+ }
144
+ return recommendation;
145
+ };
146
+ // Recommend models based on use case
147
+ if (context.useCase === 'chat' || context.useCase === 'research') {
148
+ recommendations.push(recommend('claude-opus-4-7', {
149
+ score: 95,
150
+ reason: 'Most capable model for complex reasoning and long conversations',
151
+ capabilities: ['chat', 'vision', 'tools']
152
+ }), recommend('claude-sonnet-4-6', {
153
+ score: 90,
154
+ reason: 'Best balance of intelligence and speed for most tasks',
155
+ capabilities: ['chat', 'vision', 'tools']
156
+ }));
157
+ }
158
+ if (context.useCase === 'development') {
159
+ recommendations.push(recommend('claude-sonnet-4-6', {
160
+ score: 95,
161
+ reason: 'Excellent at code generation, debugging, and technical tasks',
162
+ capabilities: ['chat', 'vision', 'tools']
163
+ }));
164
+ }
165
+ if (context.userType === 'simple' || context.useCase === 'organization') {
166
+ recommendations.push(recommend('claude-haiku-4-5', {
167
+ score: 75,
168
+ reason: 'Fast and cost-effective for simple queries',
169
+ capabilities: ['chat', 'vision']
170
+ }));
171
+ }
172
+ // Sort by score
173
+ return recommendations.sort((a, b) => b.score - a.score);
174
+ }
175
+ getExecutionContext() {
176
+ return {
177
+ scanModels: 'server',
178
+ getSetupSteps: 'both',
179
+ recommendModels: 'server'
180
+ };
181
+ }
182
+ supportsOAuth() {
183
+ return true;
184
+ }
185
+ supportsLocal() {
186
+ return true;
187
+ }
188
+ requiresGPU() {
189
+ return false;
190
+ }
191
+ }
192
+ //# sourceMappingURL=recommendations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommendations.js","sourceRoot":"","sources":["../../../../src/ai/providers/anthropic/recommendations.ts"],"names":[],"mappings":"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"}