@librechat/agents 4.0.1 → 4.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/agents/AgentContext.cjs +3 -2
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/decisions/deadline.cjs +52 -0
- package/dist/cjs/decisions/deadline.cjs.map +1 -0
- package/dist/cjs/decisions/dialect.cjs +88 -0
- package/dist/cjs/decisions/dialect.cjs.map +1 -0
- package/dist/cjs/decisions/http.cjs +77 -0
- package/dist/cjs/decisions/http.cjs.map +1 -0
- package/dist/cjs/decisions/index.cjs +7 -0
- package/dist/cjs/decisions/presets.cjs +82 -0
- package/dist/cjs/decisions/presets.cjs.map +1 -0
- package/dist/cjs/decisions/questions.cjs +70 -0
- package/dist/cjs/decisions/questions.cjs.map +1 -0
- package/dist/cjs/decisions/structuredChat.cjs +172 -0
- package/dist/cjs/decisions/structuredChat.cjs.map +1 -0
- package/dist/cjs/decisions/structuredOutput.cjs +18 -0
- package/dist/cjs/decisions/structuredOutput.cjs.map +1 -0
- package/dist/cjs/decisions/traceMarker.cjs +6 -0
- package/dist/cjs/decisions/traceMarker.cjs.map +1 -0
- package/dist/cjs/decisions/transport.cjs +166 -0
- package/dist/cjs/decisions/transport.cjs.map +1 -0
- package/dist/cjs/decisions/types.cjs +44 -0
- package/dist/cjs/decisions/types.cjs.map +1 -0
- package/dist/cjs/graphs/Graph.cjs +28 -9
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/langfuseToolOutputTracing.cjs +6 -1
- package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
- package/dist/cjs/llm/google/index.cjs +1 -1
- package/dist/cjs/llm/invoke.cjs +34 -12
- package/dist/cjs/llm/invoke.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +7 -0
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/providerTextBoundary.cjs +355 -0
- package/dist/cjs/llm/providerTextBoundary.cjs.map +1 -0
- package/dist/cjs/llm/providerTextChunk.cjs +14 -0
- package/dist/cjs/llm/providerTextChunk.cjs.map +1 -0
- package/dist/cjs/llm/providerTextControls.cjs +236 -0
- package/dist/cjs/llm/providerTextControls.cjs.map +1 -0
- package/dist/cjs/llm/stream/smoother.cjs +2 -1
- package/dist/cjs/llm/stream/smoother.cjs.map +1 -1
- package/dist/cjs/main.cjs +49 -1
- package/dist/cjs/protection/providerText.cjs +224 -0
- package/dist/cjs/protection/providerText.cjs.map +1 -0
- package/dist/cjs/protection/providerTextInput.cjs +25 -0
- package/dist/cjs/protection/providerTextInput.cjs.map +1 -0
- package/dist/cjs/rerank/index.cjs +2 -0
- package/dist/cjs/rerank/search.cjs +45 -0
- package/dist/cjs/rerank/search.cjs.map +1 -0
- package/dist/cjs/rerank/systemone.cjs +70 -0
- package/dist/cjs/rerank/systemone.cjs.map +1 -0
- package/dist/cjs/run.cjs +11 -1
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/stream.cjs +42 -14
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/summarization/node.cjs +26 -8
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/SubagentTool.cjs +11 -3
- package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +6 -5
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/search/rerankers.cjs +1 -0
- package/dist/cjs/tools/search/search.cjs +3 -3
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +4 -3
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs +13 -2
- package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +149 -26
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentReplay.cjs +4 -2
- package/dist/cjs/tools/subagent/SubagentReplay.cjs.map +1 -1
- package/dist/cjs/tools/subagent/childGraphConfig.cjs +3 -1
- package/dist/cjs/tools/subagent/childGraphConfig.cjs.map +1 -1
- package/dist/cjs/tools/subagent/diagnostics.cjs +88 -2
- package/dist/cjs/tools/subagent/diagnostics.cjs.map +1 -1
- package/dist/cjs/tools/subagent/hostArgs.cjs +214 -0
- package/dist/cjs/tools/subagent/hostArgs.cjs.map +1 -0
- package/dist/cjs/tools/subagent/index.cjs +2 -0
- package/dist/cjs/tools/toolErrorContent.cjs +1 -1
- package/dist/esm/agents/AgentContext.mjs +3 -2
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/decisions/deadline.mjs +52 -0
- package/dist/esm/decisions/deadline.mjs.map +1 -0
- package/dist/esm/decisions/dialect.mjs +87 -0
- package/dist/esm/decisions/dialect.mjs.map +1 -0
- package/dist/esm/decisions/http.mjs +75 -0
- package/dist/esm/decisions/http.mjs.map +1 -0
- package/dist/esm/decisions/index.mjs +8 -0
- package/dist/esm/decisions/presets.mjs +77 -0
- package/dist/esm/decisions/presets.mjs.map +1 -0
- package/dist/esm/decisions/questions.mjs +67 -0
- package/dist/esm/decisions/questions.mjs.map +1 -0
- package/dist/esm/decisions/structuredChat.mjs +172 -0
- package/dist/esm/decisions/structuredChat.mjs.map +1 -0
- package/dist/esm/decisions/structuredOutput.mjs +18 -0
- package/dist/esm/decisions/structuredOutput.mjs.map +1 -0
- package/dist/esm/decisions/traceMarker.mjs +6 -0
- package/dist/esm/decisions/traceMarker.mjs.map +1 -0
- package/dist/esm/decisions/transport.mjs +164 -0
- package/dist/esm/decisions/transport.mjs.map +1 -0
- package/dist/esm/decisions/types.mjs +39 -0
- package/dist/esm/decisions/types.mjs.map +1 -0
- package/dist/esm/graphs/Graph.mjs +28 -9
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/langfuseToolOutputTracing.mjs +6 -1
- package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
- package/dist/esm/llm/google/index.mjs +1 -1
- package/dist/esm/llm/invoke.mjs +34 -12
- package/dist/esm/llm/invoke.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +7 -0
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/providerTextBoundary.mjs +355 -0
- package/dist/esm/llm/providerTextBoundary.mjs.map +1 -0
- package/dist/esm/llm/providerTextChunk.mjs +13 -0
- package/dist/esm/llm/providerTextChunk.mjs.map +1 -0
- package/dist/esm/llm/providerTextControls.mjs +230 -0
- package/dist/esm/llm/providerTextControls.mjs.map +1 -0
- package/dist/esm/llm/stream/smoother.mjs +2 -1
- package/dist/esm/llm/stream/smoother.mjs.map +1 -1
- package/dist/esm/main.mjs +16 -2
- package/dist/esm/protection/providerText.mjs +218 -0
- package/dist/esm/protection/providerText.mjs.map +1 -0
- package/dist/esm/protection/providerTextInput.mjs +24 -0
- package/dist/esm/protection/providerTextInput.mjs.map +1 -0
- package/dist/esm/rerank/index.mjs +3 -0
- package/dist/esm/rerank/search.mjs +45 -0
- package/dist/esm/rerank/search.mjs.map +1 -0
- package/dist/esm/rerank/systemone.mjs +70 -0
- package/dist/esm/rerank/systemone.mjs.map +1 -0
- package/dist/esm/run.mjs +11 -1
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/stream.mjs +42 -14
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/summarization/node.mjs +26 -8
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/SubagentTool.mjs +11 -3
- package/dist/esm/tools/SubagentTool.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +6 -5
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/search/rerankers.mjs +1 -1
- package/dist/esm/tools/search/search.mjs +3 -3
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +4 -3
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs +13 -2
- package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +149 -26
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentReplay.mjs +4 -2
- package/dist/esm/tools/subagent/SubagentReplay.mjs.map +1 -1
- package/dist/esm/tools/subagent/childGraphConfig.mjs +3 -1
- package/dist/esm/tools/subagent/childGraphConfig.mjs.map +1 -1
- package/dist/esm/tools/subagent/diagnostics.mjs +84 -3
- package/dist/esm/tools/subagent/diagnostics.mjs.map +1 -1
- package/dist/esm/tools/subagent/hostArgs.mjs +207 -0
- package/dist/esm/tools/subagent/hostArgs.mjs.map +1 -0
- package/dist/esm/tools/subagent/index.mjs +2 -0
- package/dist/esm/tools/toolErrorContent.mjs +1 -1
- package/dist/types/decisions/deadline.d.ts +3 -0
- package/dist/types/decisions/dialect.d.ts +11 -0
- package/dist/types/decisions/http.d.ts +22 -0
- package/dist/types/decisions/index.d.ts +10 -0
- package/dist/types/decisions/presets.d.ts +17 -0
- package/dist/types/decisions/questions.d.ts +8 -0
- package/dist/types/decisions/structuredChat.d.ts +17 -0
- package/dist/types/decisions/structuredOutput.d.ts +4 -0
- package/dist/types/decisions/traceMarker.d.ts +2 -0
- package/dist/types/decisions/transport.d.ts +29 -0
- package/dist/types/decisions/types.d.ts +119 -0
- package/dist/types/graphs/Graph.d.ts +7 -3
- package/dist/types/index.d.ts +4 -0
- package/dist/types/llm/invoke.d.ts +4 -1
- package/dist/types/llm/providerTextBoundary.d.ts +4 -0
- package/dist/types/llm/providerTextChunk.d.ts +7 -0
- package/dist/types/llm/providerTextControls.d.ts +18 -0
- package/dist/types/protection/providerText.d.ts +77 -0
- package/dist/types/protection/providerTextInput.d.ts +3 -0
- package/dist/types/rerank/index.d.ts +4 -0
- package/dist/types/rerank/search.d.ts +7 -0
- package/dist/types/rerank/systemone.d.ts +13 -0
- package/dist/types/rerank/types.d.ts +24 -0
- package/dist/types/run.d.ts +2 -0
- package/dist/types/tools/BashExecutor.d.ts +4 -0
- package/dist/types/tools/CodeExecutor.d.ts +4 -0
- package/dist/types/tools/ReadFile.d.ts +4 -0
- package/dist/types/tools/SkillTool.d.ts +4 -0
- package/dist/types/tools/SubagentTool.d.ts +2 -0
- package/dist/types/tools/ToolSearch.d.ts +4 -0
- package/dist/types/tools/search/schema.d.ts +4 -0
- package/dist/types/tools/search/types.d.ts +3 -1
- package/dist/types/tools/subagent/SubagentExecutionRegistry.d.ts +6 -0
- package/dist/types/tools/subagent/SubagentExecutor.d.ts +22 -1
- package/dist/types/tools/subagent/SubagentReplay.d.ts +3 -1
- package/dist/types/tools/subagent/diagnostics.d.ts +56 -8
- package/dist/types/tools/subagent/hostArgs.d.ts +57 -0
- package/dist/types/tools/subagent/index.d.ts +3 -0
- package/dist/types/types/graph.d.ts +39 -0
- package/dist/types/types/run.d.ts +6 -2
- package/dist/types/types/tools.d.ts +2 -0
- package/package.json +4 -4
- package/src/agents/AgentContext.ts +3 -2
- package/src/decisions/deadline.ts +92 -0
- package/src/decisions/dialect.ts +200 -0
- package/src/decisions/http.ts +175 -0
- package/src/decisions/index.ts +14 -0
- package/src/decisions/presets.ts +111 -0
- package/src/decisions/questions.ts +128 -0
- package/src/decisions/structuredChat.ts +358 -0
- package/src/decisions/structuredOutput.ts +25 -0
- package/src/decisions/traceMarker.ts +2 -0
- package/src/decisions/transport.ts +335 -0
- package/src/decisions/types.ts +193 -0
- package/src/graphs/Graph.ts +57 -9
- package/src/index.ts +9 -0
- package/src/langfuseToolOutputTracing.ts +8 -1
- package/src/llm/invoke.ts +48 -7
- package/src/llm/openai/index.ts +8 -0
- package/src/llm/providerTextBoundary.ts +446 -0
- package/src/llm/providerTextChunk.ts +15 -0
- package/src/llm/providerTextControls.ts +173 -0
- package/src/llm/stream/smoother.ts +4 -2
- package/src/protection/providerText.ts +325 -0
- package/src/protection/providerTextInput.ts +21 -0
- package/src/rerank/index.ts +4 -0
- package/src/rerank/search.ts +85 -0
- package/src/rerank/systemone.ts +140 -0
- package/src/rerank/types.ts +28 -0
- package/src/run.ts +13 -0
- package/src/stream.ts +33 -7
- package/src/summarization/node.ts +32 -14
- package/src/tools/SubagentTool.ts +14 -3
- package/src/tools/ToolNode.ts +7 -3
- package/src/tools/search/search.ts +4 -4
- package/src/tools/search/tool.ts +27 -25
- package/src/tools/search/types.ts +4 -1
- package/src/tools/subagent/SubagentExecutionRegistry.ts +27 -2
- package/src/tools/subagent/SubagentExecutor.ts +323 -28
- package/src/tools/subagent/SubagentReplay.ts +10 -3
- package/src/tools/subagent/childGraphConfig.ts +12 -1
- package/src/tools/subagent/diagnostics.ts +180 -9
- package/src/tools/subagent/hostArgs.ts +413 -0
- package/src/tools/subagent/index.ts +20 -0
- package/src/types/graph.ts +44 -0
- package/src/types/run.ts +6 -2
- package/src/types/tools.ts +6 -1
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import "../common/enum.mjs";
|
|
2
|
+
import "../common/index.mjs";
|
|
3
|
+
import { getChatModelClass } from "./providers.mjs";
|
|
4
|
+
import { getStreamedToolCallAdapter, getStreamedToolCallSeal } from "../tools/streamedToolCallSeals.mjs";
|
|
5
|
+
import { ProviderTextAttempt, ProviderTextProtectionError } from "../protection/providerText.mjs";
|
|
6
|
+
import { GEMINI_SIGNATURES, ResponsesTextProjection, keys, replayPositions, safetyRatings, stringMap } from "./providerTextControls.mjs";
|
|
7
|
+
import { isProviderTextInput } from "../protection/providerTextInput.mjs";
|
|
8
|
+
import { createProviderTextChunk } from "./providerTextChunk.mjs";
|
|
9
|
+
import { RunnableBinding, RunnableSequence } from "@langchain/core/runnables";
|
|
10
|
+
import { AIMessage, AIMessageChunk, mergeContent } from "@langchain/core/messages";
|
|
11
|
+
import { ChatGenerationChunk } from "@langchain/core/outputs";
|
|
12
|
+
import { BaseChatModel } from "@langchain/core/language_models/chat_models";
|
|
13
|
+
//#region src/llm/providerTextBoundary.ts
|
|
14
|
+
const additionalKeys = new Set([
|
|
15
|
+
"tool_calls",
|
|
16
|
+
"function_call",
|
|
17
|
+
"reasoning",
|
|
18
|
+
"reasoning_content",
|
|
19
|
+
"reasoning_details",
|
|
20
|
+
"thinking",
|
|
21
|
+
"signature"
|
|
22
|
+
]);
|
|
23
|
+
const metadataKeys = new Set([
|
|
24
|
+
"finish_reason",
|
|
25
|
+
"stop_reason",
|
|
26
|
+
"stop_sequence",
|
|
27
|
+
"model_name",
|
|
28
|
+
"model",
|
|
29
|
+
"model_provider",
|
|
30
|
+
"system_fingerprint",
|
|
31
|
+
"service_tier",
|
|
32
|
+
"usage",
|
|
33
|
+
"tokenUsage",
|
|
34
|
+
"input_tokens",
|
|
35
|
+
"output_tokens",
|
|
36
|
+
"total_tokens",
|
|
37
|
+
"index",
|
|
38
|
+
"prompt",
|
|
39
|
+
"completion",
|
|
40
|
+
"output_version"
|
|
41
|
+
]);
|
|
42
|
+
const additionalControls = {
|
|
43
|
+
id: (value) => typeof value === "string",
|
|
44
|
+
type: (value) => value === "message",
|
|
45
|
+
role: (value) => value === "assistant",
|
|
46
|
+
model: (value) => typeof value === "string",
|
|
47
|
+
stop_reason: (value) => value == null || typeof value === "string",
|
|
48
|
+
stop_sequence: (value) => value == null || typeof value === "string",
|
|
49
|
+
usage: (value) => numericMetadata(value)
|
|
50
|
+
};
|
|
51
|
+
const geminiControls = {
|
|
52
|
+
[GEMINI_SIGNATURES]: stringMap,
|
|
53
|
+
finishReason: (value) => [
|
|
54
|
+
"STOP",
|
|
55
|
+
"MAX_TOKENS",
|
|
56
|
+
"SAFETY",
|
|
57
|
+
"RECITATION",
|
|
58
|
+
"OTHER",
|
|
59
|
+
"MALFORMED_FUNCTION_CALL",
|
|
60
|
+
"FINISH_REASON_UNSPECIFIED"
|
|
61
|
+
].includes(String(value)),
|
|
62
|
+
safetyRatings,
|
|
63
|
+
avgLogprobs: (value) => typeof value === "number" && Number.isFinite(value),
|
|
64
|
+
index: (value) => typeof value === "number" && Number.isSafeInteger(value) && value >= 0
|
|
65
|
+
};
|
|
66
|
+
const controlBlocks = new Set([
|
|
67
|
+
"thinking",
|
|
68
|
+
"redacted_thinking",
|
|
69
|
+
"reasoning",
|
|
70
|
+
"reasoning_content",
|
|
71
|
+
"tool_use"
|
|
72
|
+
]);
|
|
73
|
+
function copyMessage(message, content) {
|
|
74
|
+
const copied = createProviderTextChunk(message, {
|
|
75
|
+
content,
|
|
76
|
+
id: message.id,
|
|
77
|
+
name: message.name,
|
|
78
|
+
additional_kwargs: message.additional_kwargs,
|
|
79
|
+
response_metadata: message.response_metadata,
|
|
80
|
+
tool_calls: message.tool_calls,
|
|
81
|
+
tool_call_chunks: message instanceof AIMessageChunk ? message.tool_call_chunks : void 0,
|
|
82
|
+
invalid_tool_calls: message.invalid_tool_calls,
|
|
83
|
+
usage_metadata: message.usage_metadata
|
|
84
|
+
});
|
|
85
|
+
copied.invalid_tool_calls = message.invalid_tool_calls ?? [];
|
|
86
|
+
copied.lc_kwargs.invalid_tool_calls = copied.invalid_tool_calls;
|
|
87
|
+
return copied;
|
|
88
|
+
}
|
|
89
|
+
function numericMetadata(value, depth = 4) {
|
|
90
|
+
if (value == null) return true;
|
|
91
|
+
if (typeof value === "number") return Number.isFinite(value);
|
|
92
|
+
if (typeof value !== "object" || Array.isArray(value) || depth === 0) return false;
|
|
93
|
+
const values = Object.values(value);
|
|
94
|
+
return values.length <= 64 && values.every((entry) => numericMetadata(entry, depth - 1));
|
|
95
|
+
}
|
|
96
|
+
function hasKeys(value, keys) {
|
|
97
|
+
return value != null && typeof value === "object" && !Array.isArray(value) && Object.keys(value).every((key) => keys.includes(key));
|
|
98
|
+
}
|
|
99
|
+
function validateMetadata(metadata, google = false) {
|
|
100
|
+
for (const key of Object.keys(metadata)) {
|
|
101
|
+
const value = metadata[key];
|
|
102
|
+
let valid;
|
|
103
|
+
if (google && geminiControls[key] != null) valid = geminiControls[key](value);
|
|
104
|
+
else if (additionalControls[key] != null) valid = additionalControls[key](value);
|
|
105
|
+
else if (key === "contentBlockIndex") valid = typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
106
|
+
else if (key === "lc_streamed_tool_call_adapter") valid = getStreamedToolCallAdapter(metadata) != null;
|
|
107
|
+
else if (key === "lc_streamed_tool_call_seal") valid = hasKeys(value, [
|
|
108
|
+
"kind",
|
|
109
|
+
"id",
|
|
110
|
+
"index"
|
|
111
|
+
]) && getStreamedToolCallSeal(metadata) != null;
|
|
112
|
+
else if (key === "messageStart") valid = hasKeys(value, ["role"]) && value.role === "assistant";
|
|
113
|
+
else if (key === "messageStop") valid = hasKeys(value, ["stopReason"]) && typeof value.stopReason === "string";
|
|
114
|
+
else if (key === "metadata") valid = hasKeys(value, ["usage", "metrics"]) && numericMetadata(value);
|
|
115
|
+
else if (key === "usage" || key === "tokenUsage" || key === "estimatedTokenUsage") valid = numericMetadata(value);
|
|
116
|
+
else valid = metadataKeys.has(key) && (value == null || typeof value === "string" || typeof value === "number" && Number.isFinite(value));
|
|
117
|
+
if (!valid) throw new ProviderTextProtectionError("unsupported");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
var Candidate = class {
|
|
121
|
+
attempt;
|
|
122
|
+
provider;
|
|
123
|
+
block;
|
|
124
|
+
stringContent = false;
|
|
125
|
+
toolInputIndices = /* @__PURE__ */ new Set();
|
|
126
|
+
responses;
|
|
127
|
+
constructor(attempt, provider) {
|
|
128
|
+
this.attempt = attempt;
|
|
129
|
+
this.provider = provider;
|
|
130
|
+
this.responses = new ResponsesTextProjection(attempt);
|
|
131
|
+
}
|
|
132
|
+
strip(generation) {
|
|
133
|
+
const message = generation.message;
|
|
134
|
+
if (!(message instanceof AIMessageChunk)) throw new ProviderTextProtectionError("unsupported");
|
|
135
|
+
this.attempt.observeChunk();
|
|
136
|
+
for (const key of Object.keys(message.additional_kwargs)) {
|
|
137
|
+
if (additionalKeys.has(key)) continue;
|
|
138
|
+
const validate = (this.provider === "google" ? geminiControls[key] : void 0) ?? (key === "__openai_responses_replay_positions__" ? replayPositions : void 0) ?? (key === "__openai_function_call_ids__" ? stringMap : void 0) ?? additionalControls[key];
|
|
139
|
+
if (validate == null || !validate(message.additional_kwargs[key])) throw new ProviderTextProtectionError("unsupported");
|
|
140
|
+
}
|
|
141
|
+
let content;
|
|
142
|
+
if (typeof message.content === "string") {
|
|
143
|
+
if (message.content && this.block != null) throw new ProviderTextProtectionError("unsupported");
|
|
144
|
+
this.stringContent ||= message.content.length > 0;
|
|
145
|
+
const details = message.additional_kwargs.reasoning_details;
|
|
146
|
+
this.attempt.append(message.content, this.provider === "openrouter" && Array.isArray(details) && details.length > 0);
|
|
147
|
+
content = "";
|
|
148
|
+
} else {
|
|
149
|
+
content = [];
|
|
150
|
+
for (const block of message.content) {
|
|
151
|
+
if (typeof block === "string") throw new ProviderTextProtectionError("unsupported");
|
|
152
|
+
if (block.type !== "text") {
|
|
153
|
+
this.admitControl(block, message);
|
|
154
|
+
content.push(block);
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (typeof block.text !== "string" || this.stringContent || Object.keys(block).some((key) => ![
|
|
158
|
+
"type",
|
|
159
|
+
"text",
|
|
160
|
+
"index",
|
|
161
|
+
"annotations",
|
|
162
|
+
"phase"
|
|
163
|
+
].includes(key)) || "annotations" in block && (!Array.isArray(block.annotations) || block.annotations.length > 0) || "phase" in block && block.phase != null && !["commentary", "final_answer"].includes(String(block.phase))) throw new ProviderTextProtectionError("unsupported");
|
|
164
|
+
if (this.block != null && this.block.index !== block.index) throw new ProviderTextProtectionError("unsupported");
|
|
165
|
+
this.block ??= {
|
|
166
|
+
...block,
|
|
167
|
+
text: ""
|
|
168
|
+
};
|
|
169
|
+
this.attempt.append(block.text);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const metadata = this.responses.strip(message.response_metadata);
|
|
173
|
+
if (!Object.hasOwn(message.response_metadata, "output")) validateMetadata(metadata, this.provider === "google");
|
|
174
|
+
validateMetadata(generation.generationInfo ?? {}, this.provider === "google");
|
|
175
|
+
const stripped = copyMessage(message, content);
|
|
176
|
+
stripped.response_metadata = metadata;
|
|
177
|
+
stripped.lc_kwargs.response_metadata = metadata;
|
|
178
|
+
return new ChatGenerationChunk({
|
|
179
|
+
text: "",
|
|
180
|
+
message: stripped,
|
|
181
|
+
generationInfo: generation.generationInfo
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
admitControl(block, message) {
|
|
185
|
+
const { type, index, input, id, name } = block;
|
|
186
|
+
const part = block;
|
|
187
|
+
if (this.provider === "google" && keys(part, ["functionCall", "thoughtSignature"]) && keys(part.functionCall, [
|
|
188
|
+
"name",
|
|
189
|
+
"args",
|
|
190
|
+
"id"
|
|
191
|
+
])) {
|
|
192
|
+
const call = part.functionCall;
|
|
193
|
+
if (typeof call.name !== "string" || part.thoughtSignature != null && typeof part.thoughtSignature !== "string" || message.tool_calls?.some((tool) => tool.name === call.name && JSON.stringify(tool.args) === JSON.stringify(call.args)) !== true) throw new ProviderTextProtectionError("unsupported");
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (!Object.hasOwn(block, "type")) {
|
|
197
|
+
if (!hasKeys(block, ["index", "input"]) || typeof index !== "number" || !Number.isSafeInteger(index) || index < 0 || typeof input !== "string" || !this.toolInputIndices.has(index) || message.tool_call_chunks?.some((call) => call.index === index && call.args === input) !== true) throw new ProviderTextProtectionError("unsupported");
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (type == null || !controlBlocks.has(type)) throw new ProviderTextProtectionError("unsupported");
|
|
201
|
+
if (type === "tool_use" && index != null) {
|
|
202
|
+
if (typeof index !== "number" || !Number.isSafeInteger(index) || index < 0 || message.tool_call_chunks?.some((call) => call.index === index && call.id === id && call.name === name) !== true) throw new ProviderTextProtectionError("unsupported");
|
|
203
|
+
if (!this.toolInputIndices.has(index)) {
|
|
204
|
+
this.attempt.observeChunk();
|
|
205
|
+
this.toolInputIndices.add(index);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
async canonical() {
|
|
210
|
+
const content = await this.attempt.release();
|
|
211
|
+
const metadata = this.responses.canonical(content);
|
|
212
|
+
if (!content && metadata == null) return void 0;
|
|
213
|
+
return new ChatGenerationChunk({
|
|
214
|
+
text: content,
|
|
215
|
+
message: new AIMessageChunk({
|
|
216
|
+
content: this.block == null ? content : [{
|
|
217
|
+
...this.block,
|
|
218
|
+
text: content
|
|
219
|
+
}],
|
|
220
|
+
response_metadata: metadata
|
|
221
|
+
})
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
function clone(value) {
|
|
226
|
+
return Object.create(Object.getPrototypeOf(value), Object.getOwnPropertyDescriptors(value));
|
|
227
|
+
}
|
|
228
|
+
function assertBindingShell(model) {
|
|
229
|
+
if (model.constructor !== RunnableBinding || (model.configFactories?.length ?? 0) > 0 || model.invoke !== RunnableBinding.prototype.invoke || model.batch !== RunnableBinding.prototype.batch || model.stream !== RunnableBinding.prototype.stream || model.transform !== RunnableBinding.prototype.transform || model._streamIterator !== RunnableBinding.prototype._streamIterator) throw new ProviderTextProtectionError("unsupported");
|
|
230
|
+
}
|
|
231
|
+
function assertInputStep(input) {
|
|
232
|
+
if (isProviderTextInput(input)) return;
|
|
233
|
+
if (input instanceof RunnableBinding) {
|
|
234
|
+
assertBindingShell(input);
|
|
235
|
+
assertInputStep(input.bound);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
throw new ProviderTextProtectionError("unsupported");
|
|
239
|
+
}
|
|
240
|
+
function hasStreamingInvocation(model, options) {
|
|
241
|
+
if ("streaming" in model && model.streaming === true) return true;
|
|
242
|
+
const params = model.invocationParams(options);
|
|
243
|
+
if (params == null || typeof params !== "object" || Array.isArray(params)) throw new ProviderTextProtectionError("unsupported");
|
|
244
|
+
return "stream" in params && params.stream != null && params.stream !== false;
|
|
245
|
+
}
|
|
246
|
+
function usesInternalStreaming(model, options) {
|
|
247
|
+
if (hasStreamingInvocation(model, options)) return true;
|
|
248
|
+
for (const key of ["completions", "responses"]) {
|
|
249
|
+
const delegate = Reflect.get(model, key);
|
|
250
|
+
if (delegate instanceof BaseChatModel && hasStreamingInvocation(delegate, options)) return true;
|
|
251
|
+
}
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
function withProviderTextBoundary(model, policy, provider) {
|
|
255
|
+
const protectedModel = clone(model);
|
|
256
|
+
if (model instanceof RunnableBinding) {
|
|
257
|
+
assertBindingShell(model);
|
|
258
|
+
Object.defineProperty(protectedModel, "bound", { value: withProviderTextBoundary(model.bound, policy, provider) });
|
|
259
|
+
return protectedModel;
|
|
260
|
+
}
|
|
261
|
+
if (model instanceof RunnableSequence) {
|
|
262
|
+
if (model.constructor !== RunnableSequence || model.invoke !== RunnableSequence.prototype.invoke || model.batch !== RunnableSequence.prototype.batch || model.stream !== RunnableSequence.prototype.stream || model.transform !== RunnableSequence.prototype.transform || model._streamIterator !== RunnableSequence.prototype._streamIterator) throw new ProviderTextProtectionError("unsupported");
|
|
263
|
+
const steps = model.steps;
|
|
264
|
+
for (let index = 0; index < steps.length - 1; index++) assertInputStep(steps[index]);
|
|
265
|
+
Object.defineProperty(protectedModel, "last", { value: withProviderTextBoundary(steps[steps.length - 1], policy, provider) });
|
|
266
|
+
return protectedModel;
|
|
267
|
+
}
|
|
268
|
+
if (!(model instanceof BaseChatModel) || model.cache != null) throw new ProviderTextProtectionError("unsupported");
|
|
269
|
+
if (model.transform !== BaseChatModel.prototype.transform || model._streamIterator !== BaseChatModel.prototype._streamIterator || model.generate !== BaseChatModel.prototype.generate || model.generatePrompt !== BaseChatModel.prototype.generatePrompt || model._generateUncached !== BaseChatModel.prototype._generateUncached) throw new ProviderTextProtectionError("unsupported");
|
|
270
|
+
if (model.stream !== BaseChatModel.prototype.stream || model.invoke !== BaseChatModel.prototype.invoke) {
|
|
271
|
+
const openAI = getChatModelClass("openAI");
|
|
272
|
+
if (model.stream !== openAI.prototype.stream || model.invoke !== openAI.prototype.invoke) throw new ProviderTextProtectionError("unsupported");
|
|
273
|
+
}
|
|
274
|
+
if (model.disableStreaming && usesInternalStreaming(model)) throw new ProviderTextProtectionError("unsupported");
|
|
275
|
+
const protectedChat = clone(model);
|
|
276
|
+
protectedChat._streamResponseChunks = async function* (messages, options, runManager) {
|
|
277
|
+
const attempt = new ProviderTextAttempt(policy, options.signal);
|
|
278
|
+
const candidate = new Candidate(attempt, provider);
|
|
279
|
+
let source;
|
|
280
|
+
try {
|
|
281
|
+
source = model._streamResponseChunks(messages, {
|
|
282
|
+
...options,
|
|
283
|
+
signal: attempt.signal
|
|
284
|
+
}, void 0);
|
|
285
|
+
for (;;) {
|
|
286
|
+
const next = await attempt.wait(source.next());
|
|
287
|
+
attempt.check();
|
|
288
|
+
if (next.done === true) break;
|
|
289
|
+
const chunk = candidate.strip(next.value);
|
|
290
|
+
yield chunk;
|
|
291
|
+
await runManager?.handleLLMNewToken("", void 0, void 0, void 0, void 0, { chunk });
|
|
292
|
+
}
|
|
293
|
+
const canonical = await candidate.canonical();
|
|
294
|
+
attempt.check();
|
|
295
|
+
if (canonical != null) {
|
|
296
|
+
yield canonical;
|
|
297
|
+
attempt.check();
|
|
298
|
+
await runManager?.handleLLMNewToken(canonical.text, void 0, void 0, void 0, void 0, { chunk: canonical });
|
|
299
|
+
}
|
|
300
|
+
} finally {
|
|
301
|
+
try {
|
|
302
|
+
if (source != null) attempt.wait(source.return(void 0)).catch(() => {});
|
|
303
|
+
} finally {
|
|
304
|
+
attempt.finish();
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
protectedChat._streamChatModelEvents = BaseChatModel.prototype._streamChatModelEvents;
|
|
309
|
+
protectedChat._generate = async function(messages, options) {
|
|
310
|
+
if (usesInternalStreaming(model, options)) throw new ProviderTextProtectionError("unsupported");
|
|
311
|
+
const attempt = new ProviderTextAttempt(policy, options.signal);
|
|
312
|
+
try {
|
|
313
|
+
const result = await attempt.wait(model._generate(messages, {
|
|
314
|
+
...options,
|
|
315
|
+
signal: attempt.signal
|
|
316
|
+
}, void 0));
|
|
317
|
+
attempt.check();
|
|
318
|
+
if (result.llmOutput != null) validateMetadata(result.llmOutput, provider === "google");
|
|
319
|
+
if (result.generations.length !== 1) throw new ProviderTextProtectionError("unsupported");
|
|
320
|
+
const generation = result.generations[0];
|
|
321
|
+
if (!(generation.message instanceof AIMessage)) throw new ProviderTextProtectionError("unsupported");
|
|
322
|
+
const message = generation.message instanceof AIMessageChunk ? generation.message : copyMessage(generation.message, generation.message.content);
|
|
323
|
+
const candidate = new Candidate(attempt, provider);
|
|
324
|
+
const stripped = candidate.strip(new ChatGenerationChunk({
|
|
325
|
+
...generation,
|
|
326
|
+
message
|
|
327
|
+
}));
|
|
328
|
+
const canonical = await candidate.canonical();
|
|
329
|
+
attempt.check();
|
|
330
|
+
const released = canonical == null ? stripped : new ChatGenerationChunk({
|
|
331
|
+
text: canonical.text,
|
|
332
|
+
message: copyMessage(stripped.message, mergeContent(stripped.message.content, canonical.message.content)),
|
|
333
|
+
generationInfo: stripped.generationInfo
|
|
334
|
+
});
|
|
335
|
+
if (canonical != null) {
|
|
336
|
+
released.message.response_metadata = {
|
|
337
|
+
...released.message.response_metadata,
|
|
338
|
+
...canonical.message.response_metadata
|
|
339
|
+
};
|
|
340
|
+
released.message.lc_kwargs.response_metadata = released.message.response_metadata;
|
|
341
|
+
}
|
|
342
|
+
return {
|
|
343
|
+
...result,
|
|
344
|
+
generations: [released]
|
|
345
|
+
};
|
|
346
|
+
} finally {
|
|
347
|
+
attempt.finish();
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
return protectedChat;
|
|
351
|
+
}
|
|
352
|
+
//#endregion
|
|
353
|
+
export { withProviderTextBoundary };
|
|
354
|
+
|
|
355
|
+
//# sourceMappingURL=providerTextBoundary.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerTextBoundary.mjs","names":["control"],"sources":["../../../src/llm/providerTextBoundary.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AIMessageChunk } from "@langchain/core/messages";
|
|
2
|
+
//#region src/llm/providerTextChunk.ts
|
|
3
|
+
const constructors = /* @__PURE__ */ new WeakMap();
|
|
4
|
+
function registerProviderTextChunkConstructor(constructor) {
|
|
5
|
+
constructors.set(constructor.prototype, constructor);
|
|
6
|
+
}
|
|
7
|
+
function createProviderTextChunk(source, fields) {
|
|
8
|
+
return new ((constructors.get(Object.getPrototypeOf(source))) ?? AIMessageChunk)(fields);
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { createProviderTextChunk, registerProviderTextChunkConstructor };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=providerTextChunk.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerTextChunk.mjs","names":[],"sources":["../../../src/llm/providerTextChunk.ts"],"mappings":";;AAIA,MAAM,+BAAe,IAAI,QAAkC;AAG3D,SAAgB,qCAAqC,aAAqC;CACxF,aAAa,IAAI,YAAY,WAAW,WAAW;AACrD;AAEA,SAAgB,wBAAwB,QAAgB,QAA8C;CAEpG,OAAO,MADa,aAAa,IAAI,OAAO,eAAe,MAAM,CAAC,MAAK,gBAChD,MAAM;AAC/B"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { ProviderTextProtectionError } from "../protection/providerText.mjs";
|
|
2
|
+
//#region src/llm/providerTextControls.ts
|
|
3
|
+
const GEMINI_SIGNATURES = "__gemini_function_call_thought_signatures__";
|
|
4
|
+
const RESPONSES_POSITIONS = "__openai_responses_replay_positions__";
|
|
5
|
+
function keys(value, allowed) {
|
|
6
|
+
return value != null && typeof value === "object" && !Array.isArray(value) && Object.keys(value).every((key) => allowed.includes(key));
|
|
7
|
+
}
|
|
8
|
+
function stringMap(value) {
|
|
9
|
+
return value != null && typeof value === "object" && !Array.isArray(value) && Object.entries(value).length <= 128 && Object.values(value).every((entry) => typeof entry === "string");
|
|
10
|
+
}
|
|
11
|
+
function safetyRatings(value) {
|
|
12
|
+
return Array.isArray(value) && value.length <= 16 && value.every((entry) => keys(entry, [
|
|
13
|
+
"category",
|
|
14
|
+
"probability",
|
|
15
|
+
"blocked"
|
|
16
|
+
]) && typeof entry.category === "string" && /^HARM_CATEGORY_[A-Z_]+$/.test(entry.category) && [
|
|
17
|
+
"NEGLIGIBLE",
|
|
18
|
+
"LOW",
|
|
19
|
+
"MEDIUM",
|
|
20
|
+
"HIGH",
|
|
21
|
+
"HARM_PROBABILITY_UNSPECIFIED"
|
|
22
|
+
].includes(String(entry.probability)) && (entry.blocked == null || typeof entry.blocked === "boolean"));
|
|
23
|
+
}
|
|
24
|
+
function replayPositions(value) {
|
|
25
|
+
return Array.isArray(value) && value.length <= 128 && value.every((entry) => keys(entry, [
|
|
26
|
+
"itemId",
|
|
27
|
+
"kind",
|
|
28
|
+
"outputIndex",
|
|
29
|
+
"contentIndex"
|
|
30
|
+
]) && typeof entry.itemId === "string" && [
|
|
31
|
+
"message",
|
|
32
|
+
"text",
|
|
33
|
+
"reasoning",
|
|
34
|
+
"output"
|
|
35
|
+
].includes(String(entry.kind)) && typeof entry.outputIndex === "number" && Number.isSafeInteger(entry.outputIndex) && entry.outputIndex >= 0 && (entry.contentIndex == null || typeof entry.contentIndex === "number" && Number.isSafeInteger(entry.contentIndex) && entry.contentIndex >= 0));
|
|
36
|
+
}
|
|
37
|
+
const scalarKeys = new Set([
|
|
38
|
+
"id",
|
|
39
|
+
"model",
|
|
40
|
+
"model_name",
|
|
41
|
+
"model_provider",
|
|
42
|
+
"created_at",
|
|
43
|
+
"object",
|
|
44
|
+
"status",
|
|
45
|
+
"user",
|
|
46
|
+
"service_tier",
|
|
47
|
+
"max_output_tokens",
|
|
48
|
+
"max_tool_calls",
|
|
49
|
+
"parallel_tool_calls",
|
|
50
|
+
"temperature",
|
|
51
|
+
"top_p",
|
|
52
|
+
"truncation",
|
|
53
|
+
"store",
|
|
54
|
+
"background",
|
|
55
|
+
"previous_response_id",
|
|
56
|
+
"prompt_cache_key",
|
|
57
|
+
"prompt_cache_retention",
|
|
58
|
+
"safety_identifier",
|
|
59
|
+
"completed_at"
|
|
60
|
+
]);
|
|
61
|
+
function messageOutput(value) {
|
|
62
|
+
if (!keys(value, [
|
|
63
|
+
"id",
|
|
64
|
+
"type",
|
|
65
|
+
"role",
|
|
66
|
+
"status",
|
|
67
|
+
"phase",
|
|
68
|
+
"content"
|
|
69
|
+
]) || value.type !== "message" || typeof value.id !== "string" || value.role !== "assistant" || !["completed", "incomplete"].includes(String(value.status)) || value.phase != null && !["commentary", "final_answer"].includes(String(value.phase)) || !Array.isArray(value.content) || value.content.length !== 1) return false;
|
|
70
|
+
const part = value.content[0];
|
|
71
|
+
return keys(part, [
|
|
72
|
+
"type",
|
|
73
|
+
"text",
|
|
74
|
+
"annotations",
|
|
75
|
+
"logprobs"
|
|
76
|
+
]) && part.type === "output_text" && typeof part.text === "string" && Array.isArray(part.annotations) && part.annotations.length === 0 && (part.logprobs === void 0 || Array.isArray(part.logprobs) && part.logprobs.length === 0);
|
|
77
|
+
}
|
|
78
|
+
var ResponsesTextProjection = class {
|
|
79
|
+
attempt;
|
|
80
|
+
metadata;
|
|
81
|
+
hasOutputAlias = false;
|
|
82
|
+
output;
|
|
83
|
+
constructor(attempt) {
|
|
84
|
+
this.attempt = attempt;
|
|
85
|
+
}
|
|
86
|
+
strip(metadata) {
|
|
87
|
+
if (!Object.hasOwn(metadata, "output")) return metadata;
|
|
88
|
+
if (this.metadata != null || metadata.model_provider !== "openai" || metadata.object !== "response" || !Array.isArray(metadata.output) || metadata.output.length > 32) throw new ProviderTextProtectionError("unsupported");
|
|
89
|
+
let messageCount = 0;
|
|
90
|
+
const output = metadata.output.map((item) => {
|
|
91
|
+
if (messageOutput(item)) {
|
|
92
|
+
if (++messageCount > 1 || !this.attempt.matchesText(item.content[0].text)) throw new ProviderTextProtectionError("unsupported");
|
|
93
|
+
return {
|
|
94
|
+
...item,
|
|
95
|
+
content: [{
|
|
96
|
+
...item.content[0],
|
|
97
|
+
text: ""
|
|
98
|
+
}]
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (!responseOutputControl(item)) throw new ProviderTextProtectionError("unsupported");
|
|
102
|
+
return item;
|
|
103
|
+
});
|
|
104
|
+
if (messageCount === 0 && !this.attempt.matchesText("") || metadata.output_text != null && (typeof metadata.output_text !== "string" || !this.attempt.matchesText(metadata.output_text))) throw new ProviderTextProtectionError("unsupported");
|
|
105
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
106
|
+
let valid;
|
|
107
|
+
if (key === "output" || key === "output_text") continue;
|
|
108
|
+
if (key === "top_logprobs") valid = value == null || value === 0;
|
|
109
|
+
else if (key === "usage") valid = numericTree(value);
|
|
110
|
+
else if (key === "text") valid = keys(value, ["format", "verbosity"]) && keys(value.format, ["type"]) && value.format.type === "text" && (value.verbosity == null || [
|
|
111
|
+
"low",
|
|
112
|
+
"medium",
|
|
113
|
+
"high"
|
|
114
|
+
].includes(String(value.verbosity)));
|
|
115
|
+
else if (key === "tools") valid = Array.isArray(value) && value.length <= 32 && value.every(responseTool);
|
|
116
|
+
else if (key === "tool_choice") valid = value === "auto" || value === "none" || value === "required" || keys(value, ["type", "name"]) && value.type === "function" && typeof value.name === "string";
|
|
117
|
+
else if (key === "reasoning") valid = value == null || keys(value, ["effort", "summary"]) && (value.effort == null || [
|
|
118
|
+
"none",
|
|
119
|
+
"minimal",
|
|
120
|
+
"low",
|
|
121
|
+
"medium",
|
|
122
|
+
"high",
|
|
123
|
+
"xhigh"
|
|
124
|
+
].includes(String(value.effort))) && (value.summary == null || [
|
|
125
|
+
"auto",
|
|
126
|
+
"concise",
|
|
127
|
+
"detailed"
|
|
128
|
+
].includes(String(value.summary)));
|
|
129
|
+
else if (key === "metadata") valid = keys(value, []) || value == null;
|
|
130
|
+
else if (key === "instructions" || key === "error") valid = value == null;
|
|
131
|
+
else if (key === "incomplete_details") valid = value == null || keys(value, ["reason"]) && ["max_output_tokens", "content_filter"].includes(String(value.reason));
|
|
132
|
+
else valid = scalarKeys.has(key) && (value == null || typeof value === "string" || typeof value === "boolean" || typeof value === "number" && Number.isFinite(value));
|
|
133
|
+
if (!valid) throw new ProviderTextProtectionError("unsupported");
|
|
134
|
+
}
|
|
135
|
+
retainTree(metadata, this.attempt);
|
|
136
|
+
this.output = output;
|
|
137
|
+
this.hasOutputAlias = Object.hasOwn(metadata, "output_text");
|
|
138
|
+
const { output: _output, output_text: _alias, ...controls } = metadata;
|
|
139
|
+
this.metadata = controls;
|
|
140
|
+
return controls;
|
|
141
|
+
}
|
|
142
|
+
canonical(content) {
|
|
143
|
+
if (this.metadata == null || this.output == null) return void 0;
|
|
144
|
+
return {
|
|
145
|
+
output: this.output.map((item) => messageOutput(item) ? {
|
|
146
|
+
...item,
|
|
147
|
+
content: [{
|
|
148
|
+
...item.content[0],
|
|
149
|
+
text: content
|
|
150
|
+
}]
|
|
151
|
+
} : item),
|
|
152
|
+
...this.hasOutputAlias ? { output_text: content } : {}
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
function numericTree(value, depth = 4) {
|
|
157
|
+
if (value == null) return true;
|
|
158
|
+
if (typeof value === "number") return Number.isFinite(value);
|
|
159
|
+
if (typeof value !== "object" || Array.isArray(value) || depth === 0) return false;
|
|
160
|
+
const entries = Object.values(value);
|
|
161
|
+
return entries.length <= 64 && entries.every((entry) => numericTree(entry, depth - 1));
|
|
162
|
+
}
|
|
163
|
+
function responseOutputControl(value) {
|
|
164
|
+
if (!keys(value, [
|
|
165
|
+
"id",
|
|
166
|
+
"type",
|
|
167
|
+
"status",
|
|
168
|
+
"call_id",
|
|
169
|
+
"name",
|
|
170
|
+
"arguments",
|
|
171
|
+
"summary",
|
|
172
|
+
"encrypted_content"
|
|
173
|
+
])) return false;
|
|
174
|
+
if (typeof value.id !== "string" || value.status != null && ![
|
|
175
|
+
"completed",
|
|
176
|
+
"incomplete",
|
|
177
|
+
"in_progress"
|
|
178
|
+
].includes(String(value.status))) return false;
|
|
179
|
+
if (value.type === "function_call") return keys(value, [
|
|
180
|
+
"id",
|
|
181
|
+
"type",
|
|
182
|
+
"status",
|
|
183
|
+
"call_id",
|
|
184
|
+
"name",
|
|
185
|
+
"arguments"
|
|
186
|
+
]) && typeof value.call_id === "string" && typeof value.name === "string" && typeof value.arguments === "string";
|
|
187
|
+
if (value.type !== "reasoning" || !keys(value, [
|
|
188
|
+
"id",
|
|
189
|
+
"type",
|
|
190
|
+
"status",
|
|
191
|
+
"summary",
|
|
192
|
+
"encrypted_content"
|
|
193
|
+
])) return false;
|
|
194
|
+
return (value.encrypted_content == null || typeof value.encrypted_content === "string") && Array.isArray(value.summary) && value.summary.length <= 32 && value.summary.every((entry) => keys(entry, ["type", "text"]) && entry.type === "summary_text" && typeof entry.text === "string");
|
|
195
|
+
}
|
|
196
|
+
function responseTool(value) {
|
|
197
|
+
return keys(value, [
|
|
198
|
+
"type",
|
|
199
|
+
"name",
|
|
200
|
+
"description",
|
|
201
|
+
"strict",
|
|
202
|
+
"parameters"
|
|
203
|
+
]) && value.type === "function" && typeof value.name === "string" && (value.description == null || typeof value.description === "string") && (value.strict == null || typeof value.strict === "boolean") && jsonControl(value.parameters);
|
|
204
|
+
}
|
|
205
|
+
function jsonControl(value, depth = 6) {
|
|
206
|
+
if (value == null || typeof value === "string" || typeof value === "boolean") return true;
|
|
207
|
+
if (typeof value === "number") return Number.isFinite(value);
|
|
208
|
+
if (typeof value !== "object" || depth === 0) return false;
|
|
209
|
+
const entries = Object.values(value);
|
|
210
|
+
return entries.length <= 64 && entries.every((entry) => jsonControl(entry, depth - 1));
|
|
211
|
+
}
|
|
212
|
+
function retainTree(value, attempt, depth = 8) {
|
|
213
|
+
if (typeof value === "string") {
|
|
214
|
+
attempt.retain(value.length * 2 + 32);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
attempt.retain(64);
|
|
218
|
+
if (value == null || typeof value !== "object") return;
|
|
219
|
+
if (depth === 0) throw new ProviderTextProtectionError("unsupported");
|
|
220
|
+
const entries = Object.entries(value);
|
|
221
|
+
if (entries.length > 128) throw new ProviderTextProtectionError("unsupported");
|
|
222
|
+
for (const [key, entry] of entries) {
|
|
223
|
+
attempt.retain(key.length * 2 + 32);
|
|
224
|
+
retainTree(entry, attempt, depth - 1);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
//#endregion
|
|
228
|
+
export { GEMINI_SIGNATURES, RESPONSES_POSITIONS, ResponsesTextProjection, keys, replayPositions, safetyRatings, stringMap };
|
|
229
|
+
|
|
230
|
+
//# sourceMappingURL=providerTextControls.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerTextControls.mjs","names":[],"sources":["../../../src/llm/providerTextControls.ts"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isProtectedProviderTextSignal } from "../../protection/providerText.mjs";
|
|
1
2
|
//#region src/llm/stream/smoother.ts
|
|
2
3
|
const DEFAULT_STREAM_DELAY = 25;
|
|
3
4
|
const MAX_SMOOTH_ITEM_SEGMENT_CHARS = 4096;
|
|
@@ -52,7 +53,7 @@ async function waitForStreamDelay(delay, signal) {
|
|
|
52
53
|
});
|
|
53
54
|
}
|
|
54
55
|
async function* smoothStream({ source, delayMs, signal, abortUpstream }) {
|
|
55
|
-
if (!(delayMs > 0)) {
|
|
56
|
+
if (!(delayMs > 0) || isProtectedProviderTextSignal(signal)) {
|
|
56
57
|
for await (const item of source) {
|
|
57
58
|
if (isSignalAborted(signal)) {
|
|
58
59
|
abortUpstream?.();
|