@llumiverse/drivers 0.24.0 → 0.25.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.
- package/package.json +3 -3
- package/lib/cjs/adobe/firefly.js +0 -120
- package/lib/cjs/adobe/firefly.js.map +0 -1
- package/lib/cjs/azure/azure_foundry.js +0 -432
- package/lib/cjs/azure/azure_foundry.js.map +0 -1
- package/lib/cjs/bedrock/converse.js +0 -285
- package/lib/cjs/bedrock/converse.js.map +0 -1
- package/lib/cjs/bedrock/index.js +0 -1091
- package/lib/cjs/bedrock/index.js.map +0 -1
- package/lib/cjs/bedrock/nova-image-payload.js +0 -207
- package/lib/cjs/bedrock/nova-image-payload.js.map +0 -1
- package/lib/cjs/bedrock/payloads.js +0 -3
- package/lib/cjs/bedrock/payloads.js.map +0 -1
- package/lib/cjs/bedrock/s3.js +0 -107
- package/lib/cjs/bedrock/s3.js.map +0 -1
- package/lib/cjs/bedrock/twelvelabs.js +0 -87
- package/lib/cjs/bedrock/twelvelabs.js.map +0 -1
- package/lib/cjs/groq/index.js +0 -323
- package/lib/cjs/groq/index.js.map +0 -1
- package/lib/cjs/huggingface_ie.js +0 -201
- package/lib/cjs/huggingface_ie.js.map +0 -1
- package/lib/cjs/index.js +0 -31
- package/lib/cjs/index.js.map +0 -1
- package/lib/cjs/mistral/index.js +0 -173
- package/lib/cjs/mistral/index.js.map +0 -1
- package/lib/cjs/mistral/types.js +0 -83
- package/lib/cjs/mistral/types.js.map +0 -1
- package/lib/cjs/openai/azure_openai.js +0 -72
- package/lib/cjs/openai/azure_openai.js.map +0 -1
- package/lib/cjs/openai/index.js +0 -665
- package/lib/cjs/openai/index.js.map +0 -1
- package/lib/cjs/openai/openai.js +0 -21
- package/lib/cjs/openai/openai.js.map +0 -1
- package/lib/cjs/openai/openai_compatible.js +0 -62
- package/lib/cjs/openai/openai_compatible.js.map +0 -1
- package/lib/cjs/openai/openai_format.js +0 -131
- package/lib/cjs/openai/openai_format.js.map +0 -1
- package/lib/cjs/package.json +0 -3
- package/lib/cjs/replicate.js +0 -275
- package/lib/cjs/replicate.js.map +0 -1
- package/lib/cjs/test-driver/TestErrorCompletionStream.js +0 -20
- package/lib/cjs/test-driver/TestErrorCompletionStream.js.map +0 -1
- package/lib/cjs/test-driver/TestValidationErrorCompletionStream.js +0 -24
- package/lib/cjs/test-driver/TestValidationErrorCompletionStream.js.map +0 -1
- package/lib/cjs/test-driver/index.js +0 -109
- package/lib/cjs/test-driver/index.js.map +0 -1
- package/lib/cjs/test-driver/utils.js +0 -30
- package/lib/cjs/test-driver/utils.js.map +0 -1
- package/lib/cjs/togetherai/index.js +0 -126
- package/lib/cjs/togetherai/index.js.map +0 -1
- package/lib/cjs/togetherai/interfaces.js +0 -3
- package/lib/cjs/togetherai/interfaces.js.map +0 -1
- package/lib/cjs/vertexai/debug.js +0 -12
- package/lib/cjs/vertexai/debug.js.map +0 -1
- package/lib/cjs/vertexai/embeddings/embeddings-image.js +0 -27
- package/lib/cjs/vertexai/embeddings/embeddings-image.js.map +0 -1
- package/lib/cjs/vertexai/embeddings/embeddings-text.js +0 -23
- package/lib/cjs/vertexai/embeddings/embeddings-text.js.map +0 -1
- package/lib/cjs/vertexai/index.js +0 -576
- package/lib/cjs/vertexai/index.js.map +0 -1
- package/lib/cjs/vertexai/models/claude.js +0 -485
- package/lib/cjs/vertexai/models/claude.js.map +0 -1
- package/lib/cjs/vertexai/models/gemini.js +0 -871
- package/lib/cjs/vertexai/models/gemini.js.map +0 -1
- package/lib/cjs/vertexai/models/imagen.js +0 -303
- package/lib/cjs/vertexai/models/imagen.js.map +0 -1
- package/lib/cjs/vertexai/models/llama.js +0 -183
- package/lib/cjs/vertexai/models/llama.js.map +0 -1
- package/lib/cjs/vertexai/models.js +0 -35
- package/lib/cjs/vertexai/models.js.map +0 -1
- package/lib/cjs/watsonx/index.js +0 -161
- package/lib/cjs/watsonx/index.js.map +0 -1
- package/lib/cjs/watsonx/interfaces.js +0 -3
- package/lib/cjs/watsonx/interfaces.js.map +0 -1
- package/lib/cjs/xai/index.js +0 -65
- package/lib/cjs/xai/index.js.map +0 -1
- package/lib/esm/adobe/firefly.js +0 -116
- package/lib/esm/adobe/firefly.js.map +0 -1
- package/lib/esm/azure/azure_foundry.js +0 -426
- package/lib/esm/azure/azure_foundry.js.map +0 -1
- package/lib/esm/bedrock/converse.js +0 -278
- package/lib/esm/bedrock/converse.js.map +0 -1
- package/lib/esm/bedrock/index.js +0 -1087
- package/lib/esm/bedrock/index.js.map +0 -1
- package/lib/esm/bedrock/nova-image-payload.js +0 -203
- package/lib/esm/bedrock/nova-image-payload.js.map +0 -1
- package/lib/esm/bedrock/payloads.js +0 -2
- package/lib/esm/bedrock/payloads.js.map +0 -1
- package/lib/esm/bedrock/s3.js +0 -99
- package/lib/esm/bedrock/s3.js.map +0 -1
- package/lib/esm/bedrock/twelvelabs.js +0 -84
- package/lib/esm/bedrock/twelvelabs.js.map +0 -1
- package/lib/esm/groq/index.js +0 -316
- package/lib/esm/groq/index.js.map +0 -1
- package/lib/esm/huggingface_ie.js +0 -197
- package/lib/esm/huggingface_ie.js.map +0 -1
- package/lib/esm/index.js +0 -15
- package/lib/esm/index.js.map +0 -1
- package/lib/esm/mistral/index.js +0 -169
- package/lib/esm/mistral/index.js.map +0 -1
- package/lib/esm/mistral/types.js +0 -80
- package/lib/esm/mistral/types.js.map +0 -1
- package/lib/esm/openai/azure_openai.js +0 -68
- package/lib/esm/openai/azure_openai.js.map +0 -1
- package/lib/esm/openai/index.js +0 -660
- package/lib/esm/openai/index.js.map +0 -1
- package/lib/esm/openai/openai.js +0 -14
- package/lib/esm/openai/openai.js.map +0 -1
- package/lib/esm/openai/openai_compatible.js +0 -55
- package/lib/esm/openai/openai_compatible.js.map +0 -1
- package/lib/esm/openai/openai_format.js +0 -127
- package/lib/esm/openai/openai_format.js.map +0 -1
- package/lib/esm/replicate.js +0 -268
- package/lib/esm/replicate.js.map +0 -1
- package/lib/esm/test-driver/TestErrorCompletionStream.js +0 -16
- package/lib/esm/test-driver/TestErrorCompletionStream.js.map +0 -1
- package/lib/esm/test-driver/TestValidationErrorCompletionStream.js +0 -20
- package/lib/esm/test-driver/TestValidationErrorCompletionStream.js.map +0 -1
- package/lib/esm/test-driver/index.js +0 -91
- package/lib/esm/test-driver/index.js.map +0 -1
- package/lib/esm/test-driver/utils.js +0 -25
- package/lib/esm/test-driver/utils.js.map +0 -1
- package/lib/esm/togetherai/index.js +0 -122
- package/lib/esm/togetherai/index.js.map +0 -1
- package/lib/esm/togetherai/interfaces.js +0 -2
- package/lib/esm/togetherai/interfaces.js.map +0 -1
- package/lib/esm/vertexai/debug.js +0 -6
- package/lib/esm/vertexai/debug.js.map +0 -1
- package/lib/esm/vertexai/embeddings/embeddings-image.js +0 -24
- package/lib/esm/vertexai/embeddings/embeddings-image.js.map +0 -1
- package/lib/esm/vertexai/embeddings/embeddings-text.js +0 -20
- package/lib/esm/vertexai/embeddings/embeddings-text.js.map +0 -1
- package/lib/esm/vertexai/index.js +0 -571
- package/lib/esm/vertexai/index.js.map +0 -1
- package/lib/esm/vertexai/models/claude.js +0 -479
- package/lib/esm/vertexai/models/claude.js.map +0 -1
- package/lib/esm/vertexai/models/gemini.js +0 -866
- package/lib/esm/vertexai/models/gemini.js.map +0 -1
- package/lib/esm/vertexai/models/imagen.js +0 -299
- package/lib/esm/vertexai/models/imagen.js.map +0 -1
- package/lib/esm/vertexai/models/llama.js +0 -179
- package/lib/esm/vertexai/models/llama.js.map +0 -1
- package/lib/esm/vertexai/models.js +0 -32
- package/lib/esm/vertexai/models.js.map +0 -1
- package/lib/esm/watsonx/index.js +0 -157
- package/lib/esm/watsonx/index.js.map +0 -1
- package/lib/esm/watsonx/interfaces.js +0 -2
- package/lib/esm/watsonx/interfaces.js.map +0 -1
- package/lib/esm/xai/index.js +0 -58
- package/lib/esm/xai/index.js.map +0 -1
- package/lib/types/adobe/firefly.d.ts +0 -30
- package/lib/types/adobe/firefly.d.ts.map +0 -1
- package/lib/types/azure/azure_foundry.d.ts +0 -52
- package/lib/types/azure/azure_foundry.d.ts.map +0 -1
- package/lib/types/bedrock/converse.d.ts +0 -9
- package/lib/types/bedrock/converse.d.ts.map +0 -1
- package/lib/types/bedrock/index.d.ts +0 -68
- package/lib/types/bedrock/index.d.ts.map +0 -1
- package/lib/types/bedrock/nova-image-payload.d.ts +0 -74
- package/lib/types/bedrock/nova-image-payload.d.ts.map +0 -1
- package/lib/types/bedrock/payloads.d.ts +0 -12
- package/lib/types/bedrock/payloads.d.ts.map +0 -1
- package/lib/types/bedrock/s3.d.ts +0 -23
- package/lib/types/bedrock/s3.d.ts.map +0 -1
- package/lib/types/bedrock/twelvelabs.d.ts +0 -50
- package/lib/types/bedrock/twelvelabs.d.ts.map +0 -1
- package/lib/types/groq/index.d.ts +0 -27
- package/lib/types/groq/index.d.ts.map +0 -1
- package/lib/types/huggingface_ie.d.ts +0 -35
- package/lib/types/huggingface_ie.d.ts.map +0 -1
- package/lib/types/index.d.ts +0 -15
- package/lib/types/index.d.ts.map +0 -1
- package/lib/types/mistral/index.d.ts +0 -25
- package/lib/types/mistral/index.d.ts.map +0 -1
- package/lib/types/mistral/types.d.ts +0 -132
- package/lib/types/mistral/types.d.ts.map +0 -1
- package/lib/types/openai/azure_openai.d.ts +0 -25
- package/lib/types/openai/azure_openai.d.ts.map +0 -1
- package/lib/types/openai/index.d.ts +0 -31
- package/lib/types/openai/index.d.ts.map +0 -1
- package/lib/types/openai/openai.d.ts +0 -15
- package/lib/types/openai/openai.d.ts.map +0 -1
- package/lib/types/openai/openai_compatible.d.ts +0 -26
- package/lib/types/openai/openai_compatible.d.ts.map +0 -1
- package/lib/types/openai/openai_format.d.ts +0 -21
- package/lib/types/openai/openai_format.d.ts.map +0 -1
- package/lib/types/replicate.d.ts +0 -48
- package/lib/types/replicate.d.ts.map +0 -1
- package/lib/types/test-driver/TestErrorCompletionStream.d.ts +0 -9
- package/lib/types/test-driver/TestErrorCompletionStream.d.ts.map +0 -1
- package/lib/types/test-driver/TestValidationErrorCompletionStream.d.ts +0 -9
- package/lib/types/test-driver/TestValidationErrorCompletionStream.d.ts.map +0 -1
- package/lib/types/test-driver/index.d.ts +0 -24
- package/lib/types/test-driver/index.d.ts.map +0 -1
- package/lib/types/test-driver/utils.d.ts +0 -5
- package/lib/types/test-driver/utils.d.ts.map +0 -1
- package/lib/types/togetherai/index.d.ts +0 -23
- package/lib/types/togetherai/index.d.ts.map +0 -1
- package/lib/types/togetherai/interfaces.d.ts +0 -96
- package/lib/types/togetherai/interfaces.d.ts.map +0 -1
- package/lib/types/vertexai/debug.d.ts +0 -2
- package/lib/types/vertexai/debug.d.ts.map +0 -1
- package/lib/types/vertexai/embeddings/embeddings-image.d.ts +0 -11
- package/lib/types/vertexai/embeddings/embeddings-image.d.ts.map +0 -1
- package/lib/types/vertexai/embeddings/embeddings-text.d.ts +0 -10
- package/lib/types/vertexai/embeddings/embeddings-text.d.ts.map +0 -1
- package/lib/types/vertexai/index.d.ts +0 -65
- package/lib/types/vertexai/index.d.ts.map +0 -1
- package/lib/types/vertexai/models/claude.d.ts +0 -28
- package/lib/types/vertexai/models/claude.d.ts.map +0 -1
- package/lib/types/vertexai/models/gemini.d.ts +0 -18
- package/lib/types/vertexai/models/gemini.d.ts.map +0 -1
- package/lib/types/vertexai/models/imagen.d.ts +0 -75
- package/lib/types/vertexai/models/imagen.d.ts.map +0 -1
- package/lib/types/vertexai/models/llama.d.ts +0 -20
- package/lib/types/vertexai/models/llama.d.ts.map +0 -1
- package/lib/types/vertexai/models.d.ts +0 -15
- package/lib/types/vertexai/models.d.ts.map +0 -1
- package/lib/types/watsonx/index.d.ts +0 -27
- package/lib/types/watsonx/index.d.ts.map +0 -1
- package/lib/types/watsonx/interfaces.d.ts +0 -65
- package/lib/types/watsonx/interfaces.d.ts.map +0 -1
- package/lib/types/xai/index.d.ts +0 -18
- package/lib/types/xai/index.d.ts.map +0 -1
|
@@ -1,479 +0,0 @@
|
|
|
1
|
-
import { getMaxTokensLimitVertexAi, ModelType, PromptRole, readStreamAsBase64, readStreamAsString } from "@llumiverse/core";
|
|
2
|
-
import { asyncMap } from "@llumiverse/core/async";
|
|
3
|
-
export const ANTHROPIC_REGIONS = {
|
|
4
|
-
us: "us-east5",
|
|
5
|
-
europe: "europe-west1",
|
|
6
|
-
global: "global",
|
|
7
|
-
};
|
|
8
|
-
export const NON_GLOBAL_ANTHROPIC_MODELS = [
|
|
9
|
-
"claude-3-5",
|
|
10
|
-
"claude-3",
|
|
11
|
-
];
|
|
12
|
-
function claudeFinishReason(reason) {
|
|
13
|
-
if (!reason)
|
|
14
|
-
return undefined;
|
|
15
|
-
switch (reason) {
|
|
16
|
-
case 'end_turn': return "stop";
|
|
17
|
-
case 'max_tokens': return "length";
|
|
18
|
-
default: return reason; //stop_sequence
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
export function collectTools(content) {
|
|
22
|
-
const out = [];
|
|
23
|
-
for (const block of content) {
|
|
24
|
-
if (block.type === "tool_use") {
|
|
25
|
-
out.push({
|
|
26
|
-
id: block.id,
|
|
27
|
-
tool_name: block.name,
|
|
28
|
-
tool_input: block.input,
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
return out.length > 0 ? out : undefined;
|
|
33
|
-
}
|
|
34
|
-
function collectAllTextContent(content, includeThoughts = false) {
|
|
35
|
-
const textParts = [];
|
|
36
|
-
// First pass: collect thinking blocks
|
|
37
|
-
if (includeThoughts) {
|
|
38
|
-
for (const block of content) {
|
|
39
|
-
if (block.type === 'thinking' && block.thinking) {
|
|
40
|
-
textParts.push(block.thinking);
|
|
41
|
-
}
|
|
42
|
-
else if (block.type === 'redacted_thinking' && block.data) {
|
|
43
|
-
textParts.push(`[Redacted thinking: ${block.data}]`);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
if (textParts.length > 0) {
|
|
47
|
-
textParts.push(''); // Create a new line after thinking blocks
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
// Second pass: collect text blocks
|
|
51
|
-
for (const block of content) {
|
|
52
|
-
if (block.type === 'text' && block.text) {
|
|
53
|
-
textParts.push(block.text);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return textParts.join('\n');
|
|
57
|
-
}
|
|
58
|
-
//Used to get a max_token value when not specified in the model options. Claude requires it to be set.
|
|
59
|
-
function maxToken(option) {
|
|
60
|
-
const modelOptions = option.model_options;
|
|
61
|
-
if (modelOptions && typeof modelOptions.max_tokens === "number") {
|
|
62
|
-
return modelOptions.max_tokens;
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
const thinking_budget = modelOptions?.thinking_budget_tokens ?? 0;
|
|
66
|
-
let maxSupportedTokens = getMaxTokensLimitVertexAi(option.model);
|
|
67
|
-
// Fallback to the default max tokens limit for the model
|
|
68
|
-
if (option.model.includes('claude-3-7-sonnet') && (modelOptions?.thinking_budget_tokens ?? 0) < 48000) {
|
|
69
|
-
maxSupportedTokens = 64000; // Claude 3.7 can go up to 128k with a beta header, but when no max tokens is specified, we default to 64k.
|
|
70
|
-
}
|
|
71
|
-
return Math.min(16000 + thinking_budget, maxSupportedTokens); // Cap to 16k, to avoid taking up too much context window and quota.
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
async function collectFileBlocks(segment, restrictedTypes = false) {
|
|
75
|
-
const contentBlocks = [];
|
|
76
|
-
for (const file of segment.files || []) {
|
|
77
|
-
if (file.mime_type?.startsWith("image/")) {
|
|
78
|
-
const allowedTypes = ["image/png", "image/jpeg", "image/gif", "image/webp"];
|
|
79
|
-
if (!allowedTypes.includes(file.mime_type)) {
|
|
80
|
-
throw new Error(`Unsupported image type: ${file.mime_type}`);
|
|
81
|
-
}
|
|
82
|
-
const mimeType = String(file.mime_type);
|
|
83
|
-
contentBlocks.push({
|
|
84
|
-
type: 'image',
|
|
85
|
-
source: {
|
|
86
|
-
type: 'base64',
|
|
87
|
-
data: await readStreamAsBase64(await file.getStream()),
|
|
88
|
-
media_type: mimeType
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
else if (!restrictedTypes) {
|
|
93
|
-
if (file.mime_type === "application/pdf") {
|
|
94
|
-
contentBlocks.push({
|
|
95
|
-
title: file.name,
|
|
96
|
-
type: 'document',
|
|
97
|
-
source: {
|
|
98
|
-
type: 'base64',
|
|
99
|
-
data: await readStreamAsBase64(await file.getStream()),
|
|
100
|
-
media_type: 'application/pdf'
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
else if (file.mime_type?.startsWith("text/")) {
|
|
105
|
-
contentBlocks.push({
|
|
106
|
-
title: file.name,
|
|
107
|
-
type: 'document',
|
|
108
|
-
source: {
|
|
109
|
-
type: 'text',
|
|
110
|
-
data: await readStreamAsString(await file.getStream()),
|
|
111
|
-
media_type: 'text/plain'
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return contentBlocks;
|
|
118
|
-
}
|
|
119
|
-
export class ClaudeModelDefinition {
|
|
120
|
-
model;
|
|
121
|
-
constructor(modelId) {
|
|
122
|
-
this.model = {
|
|
123
|
-
id: modelId,
|
|
124
|
-
name: modelId,
|
|
125
|
-
provider: 'vertexai',
|
|
126
|
-
type: ModelType.Text,
|
|
127
|
-
can_stream: true,
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
async createPrompt(_driver, segments, options) {
|
|
131
|
-
// Convert the prompt to the format expected by the Claude API
|
|
132
|
-
let system = segments
|
|
133
|
-
.filter(segment => segment.role === PromptRole.system)
|
|
134
|
-
.map(segment => ({
|
|
135
|
-
text: segment.content,
|
|
136
|
-
type: 'text'
|
|
137
|
-
}));
|
|
138
|
-
if (options.result_schema) {
|
|
139
|
-
let schemaText = '';
|
|
140
|
-
if (options.tools && options.tools.length > 0) {
|
|
141
|
-
schemaText = "When not calling tools, the answer must be a JSON object using the following JSON Schema:\n" + JSON.stringify(options.result_schema);
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
schemaText = "The answer must be a JSON object using the following JSON Schema:\n" + JSON.stringify(options.result_schema);
|
|
145
|
-
}
|
|
146
|
-
const schemaSegments = {
|
|
147
|
-
text: schemaText,
|
|
148
|
-
type: 'text'
|
|
149
|
-
};
|
|
150
|
-
system.push(schemaSegments);
|
|
151
|
-
}
|
|
152
|
-
let messages = [];
|
|
153
|
-
const safetyMessages = [];
|
|
154
|
-
for (const segment of segments) {
|
|
155
|
-
if (segment.role === PromptRole.system) {
|
|
156
|
-
continue;
|
|
157
|
-
}
|
|
158
|
-
if (segment.role === PromptRole.tool) {
|
|
159
|
-
if (!segment.tool_use_id) {
|
|
160
|
-
throw new Error("Tool prompt segment must have a tool use ID");
|
|
161
|
-
}
|
|
162
|
-
// Build content blocks for tool results (restricted types)
|
|
163
|
-
const contentBlocks = [];
|
|
164
|
-
if (segment.content) {
|
|
165
|
-
contentBlocks.push({
|
|
166
|
-
type: 'text',
|
|
167
|
-
text: segment.content
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
// Collect file blocks with type safety
|
|
171
|
-
const fileBlocks = await collectFileBlocks(segment, true);
|
|
172
|
-
contentBlocks.push(...fileBlocks);
|
|
173
|
-
messages.push({
|
|
174
|
-
role: 'user',
|
|
175
|
-
content: [{
|
|
176
|
-
type: 'tool_result',
|
|
177
|
-
tool_use_id: segment.tool_use_id,
|
|
178
|
-
content: contentBlocks,
|
|
179
|
-
}]
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
// Build content blocks for regular messages (all types allowed)
|
|
184
|
-
const contentBlocks = [];
|
|
185
|
-
if (segment.content) {
|
|
186
|
-
contentBlocks.push({
|
|
187
|
-
type: 'text',
|
|
188
|
-
text: segment.content
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
// Collect file blocks without restrictions
|
|
192
|
-
const fileBlocks = await collectFileBlocks(segment, false);
|
|
193
|
-
contentBlocks.push(...fileBlocks);
|
|
194
|
-
if (contentBlocks.length === 0) {
|
|
195
|
-
continue; // skip empty segments
|
|
196
|
-
}
|
|
197
|
-
const messageParam = {
|
|
198
|
-
role: segment.role === PromptRole.assistant ? 'assistant' : 'user',
|
|
199
|
-
content: contentBlocks
|
|
200
|
-
};
|
|
201
|
-
if (segment.role === PromptRole.safety) {
|
|
202
|
-
safetyMessages.push(messageParam);
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
messages.push(messageParam);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
messages = messages.concat(safetyMessages);
|
|
210
|
-
if (system && system.length === 0) {
|
|
211
|
-
system = undefined; // If system is empty, set to undefined
|
|
212
|
-
}
|
|
213
|
-
return {
|
|
214
|
-
messages: messages,
|
|
215
|
-
system: system
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
async requestTextCompletion(driver, prompt, options) {
|
|
219
|
-
const splits = options.model.split("/");
|
|
220
|
-
let region = undefined;
|
|
221
|
-
if (splits[0] === "locations" && splits.length >= 2) {
|
|
222
|
-
region = splits[1];
|
|
223
|
-
}
|
|
224
|
-
const modelName = splits[splits.length - 1];
|
|
225
|
-
options = { ...options, model: modelName };
|
|
226
|
-
const client = await driver.getAnthropicClient(region);
|
|
227
|
-
options.model_options = options.model_options;
|
|
228
|
-
if (options.model_options?._option_id !== "vertexai-claude") {
|
|
229
|
-
driver.logger.warn({ options: options.model_options }, "Invalid model options");
|
|
230
|
-
}
|
|
231
|
-
let conversation = updateConversation(options.conversation, prompt);
|
|
232
|
-
const { payload, requestOptions } = getClaudePayload(options, conversation);
|
|
233
|
-
// disable streaming, the create function is overloaded so payload type matters.
|
|
234
|
-
const nonStreamingPayload = { ...payload, stream: false };
|
|
235
|
-
const result = await client.messages.create(nonStreamingPayload, requestOptions);
|
|
236
|
-
// Use the new function to collect text content, including thinking if enabled
|
|
237
|
-
const includeThoughts = options.model_options?.include_thoughts ?? false;
|
|
238
|
-
const text = collectAllTextContent(result.content, includeThoughts);
|
|
239
|
-
const tool_use = collectTools(result.content);
|
|
240
|
-
conversation = updateConversation(conversation, createPromptFromResponse(result));
|
|
241
|
-
return {
|
|
242
|
-
result: text ? [{ type: "text", value: text }] : [{ type: "text", value: '' }],
|
|
243
|
-
tool_use,
|
|
244
|
-
token_usage: {
|
|
245
|
-
prompt: result.usage.input_tokens,
|
|
246
|
-
result: result.usage.output_tokens,
|
|
247
|
-
total: result.usage.input_tokens + result.usage.output_tokens
|
|
248
|
-
},
|
|
249
|
-
// make sure we set finish_reason to the correct value (claude is normally setting this by itself)
|
|
250
|
-
finish_reason: tool_use ? "tool_use" : claudeFinishReason(result?.stop_reason ?? ''),
|
|
251
|
-
conversation
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
async requestTextCompletionStream(driver, prompt, options) {
|
|
255
|
-
const splits = options.model.split("/");
|
|
256
|
-
let region = undefined;
|
|
257
|
-
if (splits[0] === "locations" && splits.length >= 2) {
|
|
258
|
-
region = splits[1];
|
|
259
|
-
}
|
|
260
|
-
const modelName = splits[splits.length - 1];
|
|
261
|
-
options = { ...options, model: modelName };
|
|
262
|
-
const client = await driver.getAnthropicClient(region);
|
|
263
|
-
const model_options = options.model_options;
|
|
264
|
-
if (model_options?._option_id !== "vertexai-claude") {
|
|
265
|
-
driver.logger.warn({ options: options.model_options }, "Invalid model options");
|
|
266
|
-
}
|
|
267
|
-
// Include conversation history (same as non-streaming)
|
|
268
|
-
const conversation = updateConversation(options.conversation, prompt);
|
|
269
|
-
const { payload, requestOptions } = getClaudePayload(options, conversation);
|
|
270
|
-
const streamingPayload = { ...payload, stream: true };
|
|
271
|
-
const response_stream = await client.messages.stream(streamingPayload, requestOptions);
|
|
272
|
-
// Track current tool use being built from streaming
|
|
273
|
-
let currentToolUse = null;
|
|
274
|
-
const stream = asyncMap(response_stream, async (streamEvent) => {
|
|
275
|
-
switch (streamEvent.type) {
|
|
276
|
-
case "message_start":
|
|
277
|
-
return {
|
|
278
|
-
result: [{ type: "text", value: '' }],
|
|
279
|
-
token_usage: {
|
|
280
|
-
prompt: streamEvent.message.usage.input_tokens,
|
|
281
|
-
result: streamEvent.message.usage.output_tokens
|
|
282
|
-
}
|
|
283
|
-
};
|
|
284
|
-
case "message_delta":
|
|
285
|
-
return {
|
|
286
|
-
result: [{ type: "text", value: '' }],
|
|
287
|
-
token_usage: {
|
|
288
|
-
result: streamEvent.usage.output_tokens
|
|
289
|
-
},
|
|
290
|
-
finish_reason: claudeFinishReason(streamEvent.delta.stop_reason ?? undefined),
|
|
291
|
-
};
|
|
292
|
-
case "content_block_start":
|
|
293
|
-
// Handle tool_use blocks
|
|
294
|
-
if (streamEvent.content_block.type === "tool_use") {
|
|
295
|
-
currentToolUse = {
|
|
296
|
-
id: streamEvent.content_block.id,
|
|
297
|
-
name: streamEvent.content_block.name,
|
|
298
|
-
inputJson: ''
|
|
299
|
-
};
|
|
300
|
-
return {
|
|
301
|
-
result: [],
|
|
302
|
-
tool_use: [{
|
|
303
|
-
id: streamEvent.content_block.id,
|
|
304
|
-
tool_name: streamEvent.content_block.name,
|
|
305
|
-
tool_input: '' // Will be accumulated via input_json_delta
|
|
306
|
-
}]
|
|
307
|
-
};
|
|
308
|
-
}
|
|
309
|
-
// Handle redacted thinking blocks
|
|
310
|
-
if (streamEvent.content_block.type === "redacted_thinking" && model_options?.include_thoughts) {
|
|
311
|
-
return {
|
|
312
|
-
result: [{ type: "text", value: `[Redacted thinking: ${streamEvent.content_block.data}]` }]
|
|
313
|
-
};
|
|
314
|
-
}
|
|
315
|
-
break;
|
|
316
|
-
case "content_block_delta":
|
|
317
|
-
// Handle different delta types
|
|
318
|
-
switch (streamEvent.delta.type) {
|
|
319
|
-
case "text_delta":
|
|
320
|
-
return {
|
|
321
|
-
result: streamEvent.delta.text ? [{ type: "text", value: streamEvent.delta.text }] : []
|
|
322
|
-
};
|
|
323
|
-
case "input_json_delta":
|
|
324
|
-
// Accumulate tool input JSON
|
|
325
|
-
if (currentToolUse && streamEvent.delta.partial_json) {
|
|
326
|
-
return {
|
|
327
|
-
result: [],
|
|
328
|
-
tool_use: [{
|
|
329
|
-
id: currentToolUse.id,
|
|
330
|
-
tool_name: '', // Name already sent in content_block_start
|
|
331
|
-
tool_input: streamEvent.delta.partial_json
|
|
332
|
-
}]
|
|
333
|
-
};
|
|
334
|
-
}
|
|
335
|
-
break;
|
|
336
|
-
case "thinking_delta":
|
|
337
|
-
if (model_options?.include_thoughts) {
|
|
338
|
-
return {
|
|
339
|
-
result: streamEvent.delta.thinking ? [{ type: "text", value: streamEvent.delta.thinking }] : [],
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
break;
|
|
343
|
-
case "signature_delta":
|
|
344
|
-
// Signature deltas, signify the end of the thoughts.
|
|
345
|
-
if (model_options?.include_thoughts) {
|
|
346
|
-
return {
|
|
347
|
-
result: [{ type: "text", value: '\n\n' }], // Double newline for more spacing
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
break;
|
|
351
|
-
}
|
|
352
|
-
break;
|
|
353
|
-
case "content_block_stop":
|
|
354
|
-
// Reset current tool use tracking when block ends
|
|
355
|
-
if (currentToolUse) {
|
|
356
|
-
currentToolUse = null;
|
|
357
|
-
}
|
|
358
|
-
// Handle the end of content blocks, for redacted thinking blocks
|
|
359
|
-
if (model_options?.include_thoughts) {
|
|
360
|
-
return {
|
|
361
|
-
result: [{ type: "text", value: '\n\n' }] // Add double newline for spacing
|
|
362
|
-
};
|
|
363
|
-
}
|
|
364
|
-
break;
|
|
365
|
-
}
|
|
366
|
-
// Default case for all other event types
|
|
367
|
-
return {
|
|
368
|
-
result: []
|
|
369
|
-
};
|
|
370
|
-
});
|
|
371
|
-
return stream;
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
function createPromptFromResponse(response) {
|
|
375
|
-
return {
|
|
376
|
-
messages: [{
|
|
377
|
-
role: response.role,
|
|
378
|
-
content: response.content,
|
|
379
|
-
}],
|
|
380
|
-
system: undefined
|
|
381
|
-
};
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* Merge consecutive user messages in the conversation.
|
|
385
|
-
* This is required because Anthropic's API expects all tool_result blocks
|
|
386
|
-
* from a single assistant turn to be in one user message.
|
|
387
|
-
* When multiple tool results are added as separate user messages,
|
|
388
|
-
* we need to merge them before sending to the API.
|
|
389
|
-
*/
|
|
390
|
-
export function mergeConsecutiveUserMessages(messages) {
|
|
391
|
-
if (messages.length === 0)
|
|
392
|
-
return [];
|
|
393
|
-
// Check if any merging is needed
|
|
394
|
-
const needsMerging = messages.some((msg, i) => i < messages.length - 1 &&
|
|
395
|
-
msg.role === 'user' &&
|
|
396
|
-
messages[i + 1].role === 'user');
|
|
397
|
-
if (!needsMerging) {
|
|
398
|
-
return messages;
|
|
399
|
-
}
|
|
400
|
-
const result = [];
|
|
401
|
-
let i = 0;
|
|
402
|
-
while (i < messages.length) {
|
|
403
|
-
const current = messages[i];
|
|
404
|
-
if (current.role === 'user') {
|
|
405
|
-
// Collect all consecutive user messages
|
|
406
|
-
const mergedContent = [];
|
|
407
|
-
while (i < messages.length && messages[i].role === 'user') {
|
|
408
|
-
const userMsg = messages[i];
|
|
409
|
-
if (Array.isArray(userMsg.content)) {
|
|
410
|
-
mergedContent.push(...userMsg.content);
|
|
411
|
-
}
|
|
412
|
-
else if (typeof userMsg.content === 'string') {
|
|
413
|
-
mergedContent.push({ type: 'text', text: userMsg.content });
|
|
414
|
-
}
|
|
415
|
-
i++;
|
|
416
|
-
}
|
|
417
|
-
result.push({
|
|
418
|
-
role: 'user',
|
|
419
|
-
content: mergedContent
|
|
420
|
-
});
|
|
421
|
-
}
|
|
422
|
-
else {
|
|
423
|
-
result.push(current);
|
|
424
|
-
i++;
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
return result;
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* Update the conversation messages
|
|
431
|
-
* @param prompt
|
|
432
|
-
* @param response
|
|
433
|
-
* @returns
|
|
434
|
-
*/
|
|
435
|
-
function updateConversation(conversation, prompt) {
|
|
436
|
-
const baseSystemMessages = conversation?.system || [];
|
|
437
|
-
const baseMessages = conversation?.messages || [];
|
|
438
|
-
const system = baseSystemMessages.concat(prompt.system || []);
|
|
439
|
-
// Merge consecutive user messages to ensure tool_result blocks are properly grouped
|
|
440
|
-
const mergedMessages = mergeConsecutiveUserMessages(baseMessages.concat(prompt.messages || []));
|
|
441
|
-
return {
|
|
442
|
-
messages: mergedMessages,
|
|
443
|
-
system: system.length > 0 ? system : undefined // If system is empty, set to undefined
|
|
444
|
-
};
|
|
445
|
-
}
|
|
446
|
-
function getClaudePayload(options, prompt) {
|
|
447
|
-
const modelName = options.model; // Model name is already extracted in the calling methods
|
|
448
|
-
const model_options = options.model_options;
|
|
449
|
-
// Add beta header for Claude 3.7 models to enable 128k output tokens
|
|
450
|
-
let requestOptions = undefined;
|
|
451
|
-
if (modelName.includes('claude-3-7-sonnet') &&
|
|
452
|
-
((model_options?.max_tokens ?? 0) > 64000 || (model_options?.thinking_budget_tokens ?? 0) > 64000)) {
|
|
453
|
-
requestOptions = {
|
|
454
|
-
headers: {
|
|
455
|
-
'anthropic-beta': 'output-128k-2025-02-19'
|
|
456
|
-
}
|
|
457
|
-
};
|
|
458
|
-
}
|
|
459
|
-
const payload = {
|
|
460
|
-
messages: prompt.messages,
|
|
461
|
-
system: prompt.system,
|
|
462
|
-
tools: options.tools, // we are using the same shape as claude for tools
|
|
463
|
-
temperature: model_options?.temperature,
|
|
464
|
-
model: modelName,
|
|
465
|
-
max_tokens: maxToken(options),
|
|
466
|
-
top_p: model_options?.top_p,
|
|
467
|
-
top_k: model_options?.top_k,
|
|
468
|
-
stop_sequences: model_options?.stop_sequence,
|
|
469
|
-
thinking: model_options?.thinking_mode ?
|
|
470
|
-
{
|
|
471
|
-
budget_tokens: model_options?.thinking_budget_tokens ?? 1024,
|
|
472
|
-
type: "enabled"
|
|
473
|
-
} : {
|
|
474
|
-
type: "disabled"
|
|
475
|
-
}
|
|
476
|
-
};
|
|
477
|
-
return { payload, requestOptions };
|
|
478
|
-
}
|
|
479
|
-
//# sourceMappingURL=claude.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../../src/vertexai/models/claude.ts"],"names":[],"mappings":"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"}
|