veryfront 0.1.1281 → 0.1.1282
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/esm/cli/commands/knowledge/binary-assets.d.ts.map +1 -1
- package/esm/cli/commands/knowledge/binary-assets.js +5 -2
- package/esm/deno.js +1 -1
- package/esm/extensions/ext-llm-anthropic/src/anthropic-request-builder.d.ts.map +1 -1
- package/esm/extensions/ext-llm-anthropic/src/anthropic-request-builder.js +13 -12
- package/esm/extensions/ext-llm-google/src/google-request-builder.d.ts.map +1 -1
- package/esm/extensions/ext-llm-google/src/google-request-builder.js +47 -8
- package/esm/extensions/ext-llm-openai/src/openai-provider.d.ts.map +1 -1
- package/esm/extensions/ext-llm-openai/src/openai-provider.js +20 -9
- package/esm/extensions/ext-llm-openai/src/openai-responses-request-builder.d.ts.map +1 -1
- package/esm/extensions/ext-llm-openai/src/openai-responses-request-builder.js +107 -8
- package/esm/src/agent/runtime/final-request-budget.d.ts.map +1 -1
- package/esm/src/agent/runtime/final-request-budget.js +2 -0
- package/esm/src/chat/message-file-parts.d.ts +8 -0
- package/esm/src/chat/message-file-parts.d.ts.map +1 -0
- package/esm/src/chat/message-file-parts.js +88 -0
- package/esm/src/chat/message-prep.d.ts +1 -6
- package/esm/src/chat/message-prep.d.ts.map +1 -1
- package/esm/src/chat/message-prep.js +2 -77
- package/esm/src/html/hydration-script-builder/hydration-runtime.generated.js +1 -1
- package/esm/src/integrations/_data.d.ts.map +1 -1
- package/esm/src/integrations/_data.js +46 -0
- package/esm/src/integrations/client.d.ts.map +1 -1
- package/esm/src/integrations/client.js +3 -3
- package/esm/src/integrations/limits.d.ts +9 -1
- package/esm/src/integrations/limits.d.ts.map +1 -1
- package/esm/src/integrations/limits.js +11 -1
- package/esm/src/integrations/local-endpoint-executor.d.ts +6 -0
- package/esm/src/integrations/local-endpoint-executor.d.ts.map +1 -1
- package/esm/src/integrations/local-endpoint-executor.js +226 -29
- package/esm/src/integrations/local-tool-source.d.ts.map +1 -1
- package/esm/src/integrations/local-tool-source.js +1 -0
- package/esm/src/integrations/outlook-service-account.d.ts.map +1 -1
- package/esm/src/integrations/outlook-service-account.js +2 -0
- package/esm/src/integrations/remote-tools.js +1 -1
- package/esm/src/integrations/schema.d.ts +6 -0
- package/esm/src/integrations/schema.d.ts.map +1 -1
- package/esm/src/integrations/schema.js +5 -0
- package/esm/src/internal-agents/managed-recovery-http.d.ts +19 -1
- package/esm/src/internal-agents/managed-recovery-http.d.ts.map +1 -1
- package/esm/src/internal-agents/managed-recovery-http.js +102 -12
- package/esm/src/internal-agents/recovery-source-manifest.d.ts +5 -2
- package/esm/src/internal-agents/recovery-source-manifest.d.ts.map +1 -1
- package/esm/src/internal-agents/recovery-source-manifest.js +114 -13
- package/esm/src/llm/file.d.ts +79 -0
- package/esm/src/llm/file.d.ts.map +1 -0
- package/esm/src/llm/file.js +147 -0
- package/esm/src/llm/index.d.ts +2 -0
- package/esm/src/llm/index.d.ts.map +1 -1
- package/esm/src/llm/index.js +2 -0
- package/esm/src/platform/compat/http/pinned-fetch.d.ts +1 -1
- package/esm/src/provider/model-registry.d.ts.map +1 -1
- package/esm/src/provider/model-registry.js +1 -11
- package/esm/src/provider/runtime-loader/inline-file.d.ts +40 -0
- package/esm/src/provider/runtime-loader/inline-file.d.ts.map +1 -0
- package/esm/src/provider/runtime-loader/inline-file.js +89 -0
- package/esm/src/provider/runtime-loader.d.ts.map +1 -1
- package/esm/src/provider/runtime-loader.js +12 -4
- package/esm/src/provider/shared/index.d.ts +1 -0
- package/esm/src/provider/shared/index.d.ts.map +1 -1
- package/esm/src/provider/shared/index.js +2 -0
- package/esm/src/provider/types.d.ts +2 -0
- package/esm/src/provider/types.d.ts.map +1 -1
- package/esm/src/provider/veryfront-cloud/model-catalog.d.ts +2 -2
- package/esm/src/provider/veryfront-cloud/model-catalog.d.ts.map +1 -1
- package/esm/src/provider/veryfront-cloud/model-catalog.js +3 -3
- package/esm/src/runtime/model-call-context-request.d.ts +3 -1
- package/esm/src/runtime/model-call-context-request.d.ts.map +1 -1
- package/esm/src/runtime/model-call-context-request.js +17 -6
- package/esm/src/security/private-sha256.d.ts +1 -1
- package/esm/src/security/private-sha256.d.ts.map +1 -1
- package/esm/src/tool/remote-mcp.js +1 -1
- package/esm/src/tool/remote-source-tools.d.ts.map +1 -1
- package/esm/src/tool/remote-source-tools.js +4 -2
- package/esm/src/utils/response-body.d.ts +11 -0
- package/esm/src/utils/response-body.d.ts.map +1 -1
- package/esm/src/utils/response-body.js +58 -0
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binary-assets.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/knowledge/binary-assets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAkBhE,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAGvE;AAwCD,mGAAmG;AACnG,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA+GhC;AAED,8FAA8F;AAC9F,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACrF,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"binary-assets.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/knowledge/binary-assets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAkBhE,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAGvE;AAwCD,mGAAmG;AACnG,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA+GhC;AAED,8FAA8F;AAC9F,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACrF,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CA6HpF"}
|
|
@@ -221,8 +221,11 @@ export async function readKnowledgeBundle(input) {
|
|
|
221
221
|
typeof entry.content_path === "string") {
|
|
222
222
|
const expectedPath = `/projects/${encodeURIComponent(input.project)}/knowledge/assets/${encodeURIComponent(entry.path)}`;
|
|
223
223
|
const url = new URL(entry.content_path, "https://bundle.invalid");
|
|
224
|
-
|
|
225
|
-
|
|
224
|
+
const historical = url.searchParams.has("historical");
|
|
225
|
+
if ((historical &&
|
|
226
|
+
(scope.key !== "branch_id" || url.searchParams.get("historical") !== "true")) ||
|
|
227
|
+
url.origin !== "https://bundle.invalid" || url.hash !== "" ||
|
|
228
|
+
[...url.searchParams].length !== (historical ? 4 : 3) || url.pathname !== expectedPath ||
|
|
226
229
|
url.searchParams.get(scope.key) !== scope.id ||
|
|
227
230
|
url.searchParams.has(scope.key === "branch_id" ? "release_id" : "branch_id") ||
|
|
228
231
|
url.searchParams.get("file_version_id") !== entry.file_version_id ||
|
package/esm/deno.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-request-builder.d.ts","sourceRoot":"","sources":["../../../../src/extensions/ext-llm-anthropic/src/anthropic-request-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"anthropic-request-builder.d.ts","sourceRoot":"","sources":["../../../../src/extensions/ext-llm-anthropic/src/anthropic-request-builder.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,uBAAuB,EAEvB,0BAA0B,EAE3B,MAAM,uCAAuC,CAAC;AAO/C,OAAO,EACL,KAAK,iCAAiC,EAUvC,MAAM,+BAA+B,CAAC;AAEvC,KAAK,gBAAgB,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;AA6E9C,KAAK,0BAA0B,GAAG;IAChC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AAEF,MAAM,WAAW,+BAAgC,SAAQ,uBAAuB;IAC9E,YAAY,CAAC,EAAE,0BAA0B,CAAC;IAC1C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACjD;AAED,gGAAgG;AAChG,MAAM,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAE/D,KAAK,gBAAgB,GAAG;IACtB,IAAI,CAAC,OAAO,EAAE;QACZ,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC;QACtC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI,CAAC;IACT,KAAK,IAAI,KAAK,CAAC;QACb,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC;QACtC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACzC,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IACpD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AA0rFF,wBAAgB,iDAAiD,CAC/D,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,+BAA+B,EACxC,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,gBAAgB,GACzB;IACD,IAAI,EAAE,0BAA0B,CAAC;IACjC,qBAAqB,EAAE,iCAAiC,CAAC;CAC1D,CAoFA;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,+BAA+B,EACxC,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,gBAAgB,GACzB,0BAA0B,CAQ5B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { canIdentifyProxyWithoutHooks, closeSchemaForOutputConfig, isProxyWithoutHooks, jsonValuesEqual, readProviderOptions, readRecord, snapshotProviderJsonValue, stringifyToolResultValue, unwrapToolInputSchema, } from "../../../src/provider/shared/index.js";
|
|
1
|
+
import { canIdentifyProxyWithoutHooks, closeSchemaForOutputConfig, isImageFileInput, isProxyWithoutHooks, jsonValuesEqual, readInlineFileData, readProviderOptions, readRecord, readRemoteFileUrl, snapshotProviderJsonValue, stringifyToolResultValue, unsupportedFileInputError, unwrapToolInputSchema, } from "../../../src/provider/shared/index.js";
|
|
2
2
|
import { assertAnthropicMcpRequestContract, normalizeAnthropicMcpServers, normalizeAnthropicMcpToolsetArgs, } from "./anthropic-mcp-request.js";
|
|
3
3
|
import { isAnthropicProviderToolResultBlockType, MAX_ANTHROPIC_RAW_ASSISTANT_BLOCKS, MAX_ANTHROPIC_REPLAY_ASSISTANT_MESSAGES, parseAnthropicProviderToolUse, parseAnthropicServerToolResult, snapshotAnthropicRawAssistantMetadata, validateAnthropicRawAssistantMessages, } from "./anthropic-native-content.js";
|
|
4
4
|
const apply = Reflect.apply;
|
|
@@ -664,20 +664,21 @@ function toAnthropicUserContent(parts) {
|
|
|
664
664
|
const content = [];
|
|
665
665
|
for (const part of parts) {
|
|
666
666
|
if (part.type === "text") {
|
|
667
|
-
if (part.text.length > 0)
|
|
667
|
+
if (part.text.length > 0)
|
|
668
668
|
content.push({ type: "text", text: part.text });
|
|
669
|
-
}
|
|
670
669
|
continue;
|
|
671
670
|
}
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
}
|
|
680
|
-
|
|
671
|
+
const mediaType = part.mediaType.toLowerCase();
|
|
672
|
+
const image = isImageFileInput(part);
|
|
673
|
+
if (!image && mediaType !== "application/pdf") {
|
|
674
|
+
throw unsupportedFileInputError("Anthropic", part, "Use an image or a PDF file.");
|
|
675
|
+
}
|
|
676
|
+
const data = readInlineFileData(part);
|
|
677
|
+
const source = data === undefined
|
|
678
|
+
? { type: "url", url: readRemoteFileUrl("Anthropic", part) }
|
|
679
|
+
// Anthropic accepts only the standard `image/jpeg` spelling.
|
|
680
|
+
: { type: "base64", media_type: mediaType === "image/jpg" ? "image/jpeg" : mediaType, data };
|
|
681
|
+
content.push({ type: image ? "image" : "document", source });
|
|
681
682
|
}
|
|
682
683
|
return content;
|
|
683
684
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-request-builder.d.ts","sourceRoot":"","sources":["../../../../src/extensions/ext-llm-google/src/google-request-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"google-request-builder.d.ts","sourceRoot":"","sources":["../../../../src/extensions/ext-llm-google/src/google-request-builder.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,uBAAuB,EAEvB,0BAA0B,EAE3B,MAAM,uCAAuC,CAAC;AAmB/C,MAAM,WAAW,+BAAgC,SAAQ,uBAAuB;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,aAAa,CAAC;QACnC,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAED,gGAAgG;AAChG,MAAM,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAE/D,KAAK,gBAAgB,GAAG;IACtB,IAAI,CAAC,OAAO,EAAE;QACZ,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC;QACtC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI,CAAC;IACT,KAAK,IAAI,KAAK,CAAC;QACb,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC;QACtC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ,CAAC;AAEF,KAAK,uBAAuB,GAAG;IAC7B,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,KAAK,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CAC3C,CAAC;AAEF,KAAK,uBAAuB,GAAG;IAC7B,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,iBAAiB,CAAC,EAAE;QAClB,KAAK,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAChC,CAAC;IACF,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE;QACX,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAChD,CAAC;IACF,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AA4hCF,wBAAgB,iCAAiC,CAC/C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,+BAA+B,EACxC,QAAQ,EAAE,gBAAgB,GACzB,uBAAuB,CAsCzB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsonValuesEqual, readRecord, unwrapToolInputSchema } from "../../../src/provider/shared/index.js";
|
|
1
|
+
import { isImageFileInput, jsonValuesEqual, readInlineFileData, readRecord, readRemoteFileUrl, unsupportedFileInputError, unwrapToolInputSchema, } from "../../../src/provider/shared/index.js";
|
|
2
2
|
import { createGoogleToolCallCorrelationRegistry, GOOGLE_CODE_EXECUTION_TOOL_NAME, googleCodeExecutionInput, googleCodeExecutionOutput, readGoogleCodeExecutionResult, readGoogleExecutableCode, readGooglePartDataField, } from "./google-content-parts.js";
|
|
3
3
|
import { readGoogleRawAssistantReplay } from "./google-thought-signatures.js";
|
|
4
4
|
const arrayIsArray = Array.isArray;
|
|
@@ -395,6 +395,36 @@ function toGoogleContents(prompt) {
|
|
|
395
395
|
contents,
|
|
396
396
|
};
|
|
397
397
|
}
|
|
398
|
+
/** A URI the Gemini Files API returned; Gemini reads any supported type from it. */
|
|
399
|
+
function isGeminiFileUri(url) {
|
|
400
|
+
if (!URL.canParse(url))
|
|
401
|
+
return false;
|
|
402
|
+
const { protocol, hostname, pathname } = new URL(url);
|
|
403
|
+
return protocol === "https:" && hostname === "generativelanguage.googleapis.com" &&
|
|
404
|
+
/^\/v1[a-z0-9]*\/files\/[^/]+$/.test(pathname);
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Inline types Gemini reads, besides images, audio, video, `text/*`, and
|
|
408
|
+
* `+json`/`+xml` types.
|
|
409
|
+
* Other types, such as archives, fail before inference.
|
|
410
|
+
*/
|
|
411
|
+
const GOOGLE_INLINE_DOCUMENT_TYPES = new Set([
|
|
412
|
+
"application/pdf",
|
|
413
|
+
"application/json",
|
|
414
|
+
"application/xml",
|
|
415
|
+
"application/rtf",
|
|
416
|
+
"application/javascript",
|
|
417
|
+
"application/x-javascript",
|
|
418
|
+
"application/x-python",
|
|
419
|
+
"application/x-typescript",
|
|
420
|
+
"application/typescript",
|
|
421
|
+
"application/yaml",
|
|
422
|
+
"application/x-yaml",
|
|
423
|
+
]);
|
|
424
|
+
function isGoogleInlineMediaType(mimeType) {
|
|
425
|
+
return /^(image|audio|video|text)\//.test(mimeType) || /\+(json|xml)$/.test(mimeType) ||
|
|
426
|
+
GOOGLE_INLINE_DOCUMENT_TYPES.has(mimeType);
|
|
427
|
+
}
|
|
398
428
|
function toGoogleUserParts(parts) {
|
|
399
429
|
const content = [];
|
|
400
430
|
for (const part of parts) {
|
|
@@ -404,13 +434,22 @@ function toGoogleUserParts(parts) {
|
|
|
404
434
|
}
|
|
405
435
|
continue;
|
|
406
436
|
}
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
});
|
|
437
|
+
const mimeType = part.mediaType.toLowerCase();
|
|
438
|
+
const data = readInlineFileData(part);
|
|
439
|
+
if (data !== undefined) {
|
|
440
|
+
if (!isGoogleInlineMediaType(mimeType)) {
|
|
441
|
+
throw unsupportedFileInputError("Google", part, "Send a supported type such as an image, audio, video, PDF, or text file.");
|
|
442
|
+
}
|
|
443
|
+
content.push({ inlineData: { mimeType, data } });
|
|
444
|
+
}
|
|
445
|
+
else if (isGeminiFileUri(part.url)) {
|
|
446
|
+
content.push({ fileData: { mimeType, fileUri: part.url } });
|
|
447
|
+
}
|
|
448
|
+
else if (isImageFileInput(part)) {
|
|
449
|
+
content.push({ fileData: { mimeType, fileUri: readRemoteFileUrl("Google", part) } });
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
throw unsupportedFileInputError("Google", part, "Send non-image files as inline data, for example with fileFromBytes, or as a Gemini Files API URI.");
|
|
414
453
|
}
|
|
415
454
|
}
|
|
416
455
|
return content;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../../../src/extensions/ext-llm-openai/src/openai-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC3F,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,2BAA2B,EAC5B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,kBAAkB,EAQlB,aAAa,EACb,UAAU,EAEV,iBAAiB,
|
|
1
|
+
{"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../../../src/extensions/ext-llm-openai/src/openai-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC3F,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,2BAA2B,EAC5B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,kBAAkB,EAQlB,aAAa,EACb,UAAU,EAEV,iBAAiB,EAEjB,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EASpB,+BAA+B,EAEhC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,+BAA+B,EACrC,MAAM,kCAAkC,CAAC;AA+B1C,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,+BAA+B,GAChC,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,6BAA6B,CAAC;IACxD,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAk7BD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,YAAY,CAAC,+BAA+B,EAAE,2BAA2B,CAAC,CAsF5E;AAMD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,YAAY,CAAC,+BAA+B,EAAE,2BAA2B,CAAC,CA8J5E;AA2ED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,gBAAgB,CA4ClB;AAED,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,EAAE,YAAY;IAEvB,WAAW,CACT,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,iBAAiB,GACxB,YAAY,CAAC,+BAA+B,EAAE,2BAA2B,CAAC;IA0C7E,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,gBAAgB;IAa7E,eAAe,CACb,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,iBAAiB,GACxB,YAAY,CAAC,+BAA+B,EAAE,2BAA2B,CAAC;CAY9E"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @module extensions/ext-llm-openai/openai-provider
|
|
9
9
|
*/
|
|
10
|
-
import { buildProviderError, createOpenAIRequestInit, createWarningCollector, DEFAULT_PROVIDER_STREAM_HEADERS_TIMEOUT_MS, DEFAULT_PROVIDER_STREAM_TOTAL_HEADERS_BUDGET_MS, getOpenAIChatCompletionsUrl, getOpenAIEmbeddingUrl, getOpenAIResponsesUrl, isNumberArray, mergeUsage, notifyProviderRequestRetry, parseRetryAfterMs, ProviderError, ProviderOverloadedError, ProviderQuotaError, ProviderRateLimitError, ProviderRequestError, readGatewayBillingMode, readGatewayUsageCosts, readRecord, requestJson, requestStream, stringifyJsonValue, TOOL_INPUT_PENDING_THRESHOLD_MS, waitForProviderStreamRetry, } from "../../../src/provider/shared/index.js";
|
|
10
|
+
import { buildProviderError, createOpenAIRequestInit, createWarningCollector, DEFAULT_PROVIDER_STREAM_HEADERS_TIMEOUT_MS, DEFAULT_PROVIDER_STREAM_TOTAL_HEADERS_BUDGET_MS, getOpenAIChatCompletionsUrl, getOpenAIEmbeddingUrl, getOpenAIResponsesUrl, isNumberArray, mergeUsage, notifyProviderRequestRetry, parseRetryAfterMs, promptHasDocumentInput, ProviderError, ProviderOverloadedError, ProviderQuotaError, ProviderRateLimitError, ProviderRequestError, readGatewayBillingMode, readGatewayUsageCosts, readRecord, requestJson, requestStream, routesOpenAIDocumentInputToResponses, stringifyJsonValue, TOOL_INPUT_PENDING_THRESHOLD_MS, waitForProviderStreamRetry, } from "../../../src/provider/shared/index.js";
|
|
11
11
|
import { buildOpenAIChatRequest, } from "./openai-chat-request-builder.js";
|
|
12
12
|
import { MAX_OPENAI_STREAM_TOOL_CALLS, streamOpenAICompatibleParts } from "./openai-chat-stream.js";
|
|
13
13
|
import { buildOpenAIResponsesRequest } from "./openai-responses-request-builder.js";
|
|
@@ -900,6 +900,15 @@ function requestUsesOpenAIHostedTool(optionsForRuntime) {
|
|
|
900
900
|
}
|
|
901
901
|
return resolveOpenAIWebSearchDescriptor(options.tools) !== undefined;
|
|
902
902
|
}
|
|
903
|
+
/**
|
|
904
|
+
* Non-image files need Responses; Chat Completions only carries images. Only
|
|
905
|
+
* providers that serve Responses documents move there; the rest keep Chat
|
|
906
|
+
* Completions, which rejects the file before inference.
|
|
907
|
+
*/
|
|
908
|
+
function requiresOpenAIResponses(options, documentsOnResponses) {
|
|
909
|
+
return requestUsesOpenAIHostedTool(options) ||
|
|
910
|
+
(documentsOnResponses && promptHasDocumentInput(options.prompt));
|
|
911
|
+
}
|
|
903
912
|
function createOpenAIChatCompletionsOnlyRuntime(chatRuntime, hostedToolReason) {
|
|
904
913
|
function assertHostedToolsSupported(options) {
|
|
905
914
|
if (requestUsesOpenAIHostedTool(options)) {
|
|
@@ -919,19 +928,21 @@ function createOpenAIChatCompletionsOnlyRuntime(chatRuntime, hostedToolReason) {
|
|
|
919
928
|
},
|
|
920
929
|
};
|
|
921
930
|
}
|
|
922
|
-
function createOpenAIAdaptiveModelRuntime(chatRuntime, responsesRuntime) {
|
|
931
|
+
function createOpenAIAdaptiveModelRuntime(chatRuntime, responsesRuntime, documentsOnResponses) {
|
|
923
932
|
return {
|
|
924
933
|
...chatRuntime,
|
|
925
934
|
openAITransport: "auto",
|
|
926
|
-
|
|
927
|
-
|
|
935
|
+
openAIResponsesDocumentInput: documentsOnResponses,
|
|
936
|
+
// Async, so a request the selected runtime rejects up front still rejects.
|
|
937
|
+
async doGenerate(optionsForRuntime) {
|
|
938
|
+
return await (requiresOpenAIResponses(optionsForRuntime, documentsOnResponses)
|
|
928
939
|
? responsesRuntime.doGenerate(optionsForRuntime)
|
|
929
|
-
: chatRuntime.doGenerate(optionsForRuntime);
|
|
940
|
+
: chatRuntime.doGenerate(optionsForRuntime));
|
|
930
941
|
},
|
|
931
|
-
doStream(optionsForRuntime) {
|
|
932
|
-
return
|
|
942
|
+
async doStream(optionsForRuntime) {
|
|
943
|
+
return await (requiresOpenAIResponses(optionsForRuntime, documentsOnResponses)
|
|
933
944
|
? responsesRuntime.doStream(optionsForRuntime)
|
|
934
|
-
: chatRuntime.doStream(optionsForRuntime);
|
|
945
|
+
: chatRuntime.doStream(optionsForRuntime));
|
|
935
946
|
},
|
|
936
947
|
};
|
|
937
948
|
}
|
|
@@ -1007,7 +1018,7 @@ export class OpenAIProvider {
|
|
|
1007
1018
|
if (transport === "chat-completions") {
|
|
1008
1019
|
return createOpenAIChatCompletionsOnlyRuntime(chatRuntime, getOpenAIChatCompletionsOnlyReason(config));
|
|
1009
1020
|
}
|
|
1010
|
-
return createOpenAIAdaptiveModelRuntime(chatRuntime, responsesRuntime);
|
|
1021
|
+
return createOpenAIAdaptiveModelRuntime(chatRuntime, responsesRuntime, routesOpenAIDocumentInputToResponses(providerName, config.baseURL));
|
|
1011
1022
|
}
|
|
1012
1023
|
createEmbedding(modelId, config) {
|
|
1013
1024
|
return createOpenAIEmbeddingRuntime({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-responses-request-builder.d.ts","sourceRoot":"","sources":["../../../../src/extensions/ext-llm-openai/src/openai-responses-request-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openai-responses-request-builder.d.ts","sourceRoot":"","sources":["../../../../src/extensions/ext-llm-openai/src/openai-responses-request-builder.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,kCAAkC,CAAC;AAyBxF,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE/D,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,wBAAwB,EAAE,CAAC;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAC3C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,IAAI,CAAC,OAAO,EAAE;QACZ,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC;QACtC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI,CAAC;IACT,KAAK,IAAI,KAAK,CAAC;QACb,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC;QACtC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ,CAAC;AAsgBF,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,+BAA+B,EACxC,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,gBAAgB,GACzB,sBAAsB,CA8IxB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsonValuesEqual, stringifyToolArguments, stringifyToolResultValue, unwrapToolInputSchema, } from "../../../src/provider/shared/index.js";
|
|
1
|
+
import { fileInputBaseName, isImageFileInput, jsonValuesEqual, readInlineFileData, readRemoteFileUrl, stringifyToolArguments, stringifyToolResultValue, unsupportedFileInputError, unwrapToolInputSchema, } from "../../../src/provider/shared/index.js";
|
|
2
2
|
import { rejectsOpenAISamplingParams, resolveOpenAIReasoningConfig, shouldRequestOpenAIReasoningSummary, } from "./openai-reasoning-models.js";
|
|
3
3
|
import { defineOpenAIProviderOptions, readOpenAIProviderOptions, } from "./openai-provider-options.js";
|
|
4
4
|
import { isBoundedOpenAIStreamString, MAX_OPENAI_STREAM_TOOL_NAME_BYTES, } from "./openai-stream-metadata.js";
|
|
@@ -259,6 +259,93 @@ function toOpenAIResponsesInput(prompt) {
|
|
|
259
259
|
input,
|
|
260
260
|
};
|
|
261
261
|
}
|
|
262
|
+
const INLINE_FILE_EXTENSIONS = {
|
|
263
|
+
"application/json": "json",
|
|
264
|
+
"application/pdf": "pdf",
|
|
265
|
+
"text/csv": "csv",
|
|
266
|
+
"text/html": "html",
|
|
267
|
+
"text/markdown": "md",
|
|
268
|
+
"text/plain": "txt",
|
|
269
|
+
};
|
|
270
|
+
/**
|
|
271
|
+
* Inline document types Responses reads, besides `text/*` and `+json`/`+xml`
|
|
272
|
+
* types. From OpenAI's file input table, plus common aliases. Other types,
|
|
273
|
+
* such as archives, fail before inference.
|
|
274
|
+
*/
|
|
275
|
+
const RESPONSES_DOCUMENT_TYPES = new Set([
|
|
276
|
+
"application/pdf",
|
|
277
|
+
"application/msword",
|
|
278
|
+
"application/rtf",
|
|
279
|
+
"application/vnd.ms-excel",
|
|
280
|
+
"application/vnd.ms-powerpoint",
|
|
281
|
+
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
282
|
+
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
283
|
+
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
|
284
|
+
"application/vnd.oasis.opendocument.text",
|
|
285
|
+
"application/vnd.apple.pages",
|
|
286
|
+
"application/vnd.apple.keynote",
|
|
287
|
+
"application/vnd.apple.iwork",
|
|
288
|
+
"application/vnd.google-apps.document",
|
|
289
|
+
"application/vnd.google-apps.spreadsheet",
|
|
290
|
+
"application/vnd.google-apps.presentation",
|
|
291
|
+
"application/csv",
|
|
292
|
+
"application/x-iif",
|
|
293
|
+
"application/json",
|
|
294
|
+
"application/json5",
|
|
295
|
+
"application/x-json5",
|
|
296
|
+
"application/x-ndjson",
|
|
297
|
+
"application/xml",
|
|
298
|
+
"application/yaml",
|
|
299
|
+
"application/x-yaml",
|
|
300
|
+
"application/toml",
|
|
301
|
+
"application/x-toml",
|
|
302
|
+
"application/graphql",
|
|
303
|
+
"application/x-graphql",
|
|
304
|
+
"application/javascript",
|
|
305
|
+
"application/x-javascript",
|
|
306
|
+
"application/typescript",
|
|
307
|
+
"application/x-python",
|
|
308
|
+
"application/x-sh",
|
|
309
|
+
"application/x-bash",
|
|
310
|
+
"application/x-awk",
|
|
311
|
+
"application/x-sql",
|
|
312
|
+
"application/x-scala",
|
|
313
|
+
"application/x-rust",
|
|
314
|
+
"application/x-powershell",
|
|
315
|
+
"application/x-patch",
|
|
316
|
+
"application/x-php",
|
|
317
|
+
"application/x-httpd-php",
|
|
318
|
+
"application/x-httpd-php-source",
|
|
319
|
+
"application/x-protobuf",
|
|
320
|
+
"application/x-terraform",
|
|
321
|
+
"application/x-subrip",
|
|
322
|
+
"message/rfc822",
|
|
323
|
+
]);
|
|
324
|
+
function isResponsesDocumentType(mediaType) {
|
|
325
|
+
return mediaType.startsWith("text/") || /\+(json|xml)$/.test(mediaType) ||
|
|
326
|
+
RESPONSES_DOCUMENT_TYPES.has(mediaType);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Build an inline `input_file`. OpenAI infers the file type from the filename
|
|
330
|
+
* extension, so a filename without one needs a MIME type we can name.
|
|
331
|
+
*/
|
|
332
|
+
function toOpenAIResponsesInlineFile(part, data) {
|
|
333
|
+
const mediaType = part.mediaType.toLowerCase();
|
|
334
|
+
if (!isResponsesDocumentType(mediaType)) {
|
|
335
|
+
throw unsupportedFileInputError("OpenAI Responses", part, "Send a document such as PDF, text, code, a spreadsheet, or an office document.");
|
|
336
|
+
}
|
|
337
|
+
const extension = INLINE_FILE_EXTENSIONS[mediaType];
|
|
338
|
+
const name = fileInputBaseName(part.filename) ?? "file";
|
|
339
|
+
const hasExtension = /.\.[^.]+$/.test(name);
|
|
340
|
+
if (!hasExtension && !extension) {
|
|
341
|
+
throw unsupportedFileInputError("OpenAI Responses", part, "Set a filename with an extension, for example with fileFromBytes.");
|
|
342
|
+
}
|
|
343
|
+
return {
|
|
344
|
+
type: "input_file",
|
|
345
|
+
file_data: `data:${mediaType};base64,${data}`,
|
|
346
|
+
filename: hasExtension ? name : `${name}.${extension}`,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
262
349
|
function toOpenAIResponsesUserContent(parts) {
|
|
263
350
|
const content = [];
|
|
264
351
|
for (const part of parts) {
|
|
@@ -268,15 +355,27 @@ function toOpenAIResponsesUserContent(parts) {
|
|
|
268
355
|
}
|
|
269
356
|
continue;
|
|
270
357
|
}
|
|
271
|
-
if (part
|
|
272
|
-
|
|
358
|
+
if (isImageFileInput(part)) {
|
|
359
|
+
// Inline data is validated; any other image URL must be remote.
|
|
360
|
+
const imageUrl = readInlineFileData(part) === undefined
|
|
361
|
+
? readRemoteFileUrl("OpenAI Responses", part)
|
|
362
|
+
: part.url;
|
|
363
|
+
content.push({ type: "input_image", image_url: imageUrl, detail: "auto" });
|
|
273
364
|
continue;
|
|
274
365
|
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
366
|
+
// Responses file inputs are documents; audio and video use other input shapes.
|
|
367
|
+
if (/^(audio|video)\//i.test(part.mediaType)) {
|
|
368
|
+
throw unsupportedFileInputError("OpenAI Responses", part, "Send a document such as PDF, text, or a spreadsheet.");
|
|
369
|
+
}
|
|
370
|
+
const data = readInlineFileData(part);
|
|
371
|
+
const filename = fileInputBaseName(part.filename);
|
|
372
|
+
content.push(data === undefined
|
|
373
|
+
? {
|
|
374
|
+
type: "input_file",
|
|
375
|
+
file_url: readRemoteFileUrl("OpenAI Responses", part),
|
|
376
|
+
...(filename ? { filename } : {}),
|
|
377
|
+
}
|
|
378
|
+
: toOpenAIResponsesInlineFile(part, data));
|
|
280
379
|
}
|
|
281
380
|
return content;
|
|
282
381
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"final-request-budget.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/final-request-budget.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,4BAA4B,EAE7B,MAAM,6CAA6C,CAAC;AA4BrD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAa5D;AAqCD;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,OAAQ,CAAC;AAEhD;;;;;;;GAOG;AACH,eAAO,MAAM,oCAAoC,OAAO,CAAC;AAEzD,2DAA2D;AAC3D,MAAM,MAAM,kBAAkB,GAAG;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzF,4DAA4D;AAC5D,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC;;;OAGG;IACH,WAAW,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,wFAAwF;IACxF,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF,2EAA2E;AAC3E,MAAM,MAAM,4BAA4B,GAAG;IACzC,0EAA0E;IAC1E,cAAc,EAAE,OAAO,CAAC;IACxB,gFAAgF;IAChF,eAAe,EAAE,MAAM,CAAC;IACxB,sEAAsE;IACtE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,6FAA6F;AAC7F,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,uBAAuB,GAC7B;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAsBlE;AAED,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAAC,CAAC,CAAC;AAa5E;;;;;;;;GAQG;AACH,MAAM,MAAM,0BAA0B,GAAG,uBAAuB,GAAG;IACjE,KAAK,EAAE,iBAAiB,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;
|
|
1
|
+
{"version":3,"file":"final-request-budget.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/final-request-budget.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,4BAA4B,EAE7B,MAAM,6CAA6C,CAAC;AA4BrD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAa5D;AAqCD;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,OAAQ,CAAC;AAEhD;;;;;;;GAOG;AACH,eAAO,MAAM,oCAAoC,OAAO,CAAC;AAEzD,2DAA2D;AAC3D,MAAM,MAAM,kBAAkB,GAAG;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzF,4DAA4D;AAC5D,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC;;;OAGG;IACH,WAAW,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,wFAAwF;IACxF,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF,2EAA2E;AAC3E,MAAM,MAAM,4BAA4B,GAAG;IACzC,0EAA0E;IAC1E,cAAc,EAAE,OAAO,CAAC;IACxB,gFAAgF;IAChF,eAAe,EAAE,MAAM,CAAC;IACxB,sEAAsE;IACtE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,6FAA6F;AAC7F,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,uBAAuB,GAC7B;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAsBlE;AAED,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAAC,CAAC,CAAC;AAa5E;;;;;;;;GAQG;AACH,MAAM,MAAM,0BAA0B,GAAG,uBAAuB,GAAG;IACjE,KAAK,EAAE,iBAAiB,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAkGF,+FAA+F;AAC/F,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,0BAA0B,GAChC,4BAA4B,CAE9B;AAED,0EAA0E;AAC1E,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,0BAA0B,GAChC;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAOlE;AAED,uFAAuF;AACvF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,uBAAuB,GAC7B,4BAA4B,CA8E9B;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EAAE,CAAC,EAClF,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EACpC,OAAO,EAAE,MAAM,OAAO,GACrB,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAgB7B"}
|
|
@@ -155,6 +155,8 @@ function resolveEffectiveBudget(input) {
|
|
|
155
155
|
...(providerOptions === undefined ? {} : { providerOptions }),
|
|
156
156
|
...(budget.responseFormat === undefined ? {} : { responseFormat: budget.responseFormat }),
|
|
157
157
|
tools: toolDescriptors(budget.tools),
|
|
158
|
+
// A document can move an adaptive OpenAI request to Responses.
|
|
159
|
+
prompt: budget.messages,
|
|
158
160
|
});
|
|
159
161
|
const low = probe(1);
|
|
160
162
|
const high = probe(2);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ChatUiMessage } from "./types.js";
|
|
2
|
+
/** Check whether the model supports the file media type. */
|
|
3
|
+
export declare function isModelSupportedFileMediaType(mediaType: string): boolean;
|
|
4
|
+
/** Normalizes message file part media types. */
|
|
5
|
+
export declare function normalizeMessageFilePartMediaTypes(messages: ChatUiMessage[]): ChatUiMessage[];
|
|
6
|
+
/** Rewrite unsupported file parts as annotations. */
|
|
7
|
+
export declare function rewriteUnsupportedFilePartsAsAnnotations(messages: ChatUiMessage[]): ChatUiMessage[];
|
|
8
|
+
//# sourceMappingURL=message-file-parts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-file-parts.d.ts","sourceRoot":"","sources":["../../../src/src/chat/message-file-parts.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAInB,MAAM,YAAY,CAAC;AAEpB,4DAA4D;AAC5D,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAGxE;AA2BD,gDAAgD;AAChD,wBAAgB,kCAAkC,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAY7F;AAmBD,qDAAqD;AACrD,wBAAgB,wCAAwC,CACtD,QAAQ,EAAE,aAAa,EAAE,GACxB,aAAa,EAAE,CA4CjB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { buildDataFileAnnotation, normalizeInlineAttachmentMediaType, } from "./types.js";
|
|
2
|
+
/** Check whether the model supports the file media type. */
|
|
3
|
+
export function isModelSupportedFileMediaType(mediaType) {
|
|
4
|
+
const type = mediaType.toLowerCase();
|
|
5
|
+
return type.startsWith("image/") || type === "application/pdf" || type === "text/plain";
|
|
6
|
+
}
|
|
7
|
+
function isInlineDataFilePart(part) {
|
|
8
|
+
return /^data:/i.test(part.url ?? "");
|
|
9
|
+
}
|
|
10
|
+
const INLINE_BASE64_PREFIX = /^data:[^,]*;base64,/i;
|
|
11
|
+
/**
|
|
12
|
+
* Normalize a file part's MIME type. An inline base64 data URL is rewritten to
|
|
13
|
+
* the same type, so the provider sees matching data; other inline data keeps
|
|
14
|
+
* the MIME type its data URL names.
|
|
15
|
+
*/
|
|
16
|
+
function normalizeFilePart(part) {
|
|
17
|
+
const inline = isInlineDataFilePart(part);
|
|
18
|
+
if (inline && !INLINE_BASE64_PREFIX.test(part.url))
|
|
19
|
+
return part;
|
|
20
|
+
const mediaType = normalizeInlineAttachmentMediaType(part.filename, part.mediaType);
|
|
21
|
+
if (mediaType === part.mediaType)
|
|
22
|
+
return part;
|
|
23
|
+
return {
|
|
24
|
+
...part,
|
|
25
|
+
mediaType,
|
|
26
|
+
...(inline ? { url: part.url.replace(INLINE_BASE64_PREFIX, `data:${mediaType};base64,`) } : {}),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** Normalizes message file part media types. */
|
|
30
|
+
export function normalizeMessageFilePartMediaTypes(messages) {
|
|
31
|
+
return messages.map((message) => {
|
|
32
|
+
if (!message.parts.some((part) => part.type === "file")) {
|
|
33
|
+
return message;
|
|
34
|
+
}
|
|
35
|
+
const parts = message.parts.map((part) => part.type === "file" ? normalizeFilePart(part) : part);
|
|
36
|
+
return { ...message, parts };
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function appendDataFileAnnotation(kept, dataFiles) {
|
|
40
|
+
const annotation = buildDataFileAnnotation(dataFiles);
|
|
41
|
+
const lastTextIndex = kept.findLastIndex((part) => part.type === "text");
|
|
42
|
+
if (lastTextIndex >= 0) {
|
|
43
|
+
const textPart = kept[lastTextIndex];
|
|
44
|
+
if (textPart?.type === "text") {
|
|
45
|
+
kept[lastTextIndex] = { type: "text", text: textPart.text + annotation };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
kept.push({ type: "text", text: annotation.trimStart() });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Rewrite unsupported file parts as annotations. */
|
|
53
|
+
export function rewriteUnsupportedFilePartsAsAnnotations(messages) {
|
|
54
|
+
return messages.map((message) => {
|
|
55
|
+
if (message.parts.length === 0) {
|
|
56
|
+
return message;
|
|
57
|
+
}
|
|
58
|
+
const kept = [];
|
|
59
|
+
const dataFiles = [];
|
|
60
|
+
for (const part of message.parts) {
|
|
61
|
+
if (part.type !== "file") {
|
|
62
|
+
kept.push(part);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const normalized = normalizeFilePart(part);
|
|
66
|
+
// Inline data has no upload a tool could read, so the provider sends or
|
|
67
|
+
// rejects it. Runtimes send files only from user messages.
|
|
68
|
+
if (isModelSupportedFileMediaType(normalized.mediaType) ||
|
|
69
|
+
(message.role === "user" && isInlineDataFilePart(part))) {
|
|
70
|
+
kept.push(normalized);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
dataFiles.push({
|
|
74
|
+
name: part.filename || "file",
|
|
75
|
+
mediaType: normalized.mediaType,
|
|
76
|
+
// A data URL would put the file's base64 into prompt text.
|
|
77
|
+
...(part.url && !isInlineDataFilePart(part) ? { url: part.url } : {}),
|
|
78
|
+
...(part.uploadId ? { uploadId: part.uploadId } : {}),
|
|
79
|
+
...(part.uploadPath ? { path: part.uploadPath } : {}),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (dataFiles.length === 0) {
|
|
83
|
+
return message;
|
|
84
|
+
}
|
|
85
|
+
appendDataFileAnnotation(kept, dataFiles);
|
|
86
|
+
return { ...message, parts: kept };
|
|
87
|
+
});
|
|
88
|
+
}
|
|
@@ -4,18 +4,13 @@ import { type ChatUiMessage, type ProviderModelMessage } from "./types.js";
|
|
|
4
4
|
import type { HistoricalToolInputRetentionOptions, PrepareProviderModelMessagesFromUiMessagesOptions } from "./message-prep-types.js";
|
|
5
5
|
export { DEFAULT_MESSAGE_PREP_LIMITS } from "./message-prep-types.js";
|
|
6
6
|
export { repairToolPairs } from "./provider-message-tool-pair-repair.js";
|
|
7
|
+
export { isModelSupportedFileMediaType, normalizeMessageFilePartMediaTypes, rewriteUnsupportedFilePartsAsAnnotations, } from "./message-file-parts.js";
|
|
7
8
|
export type { HistoricalToolInputCompactionDiagnostic, HistoricalToolInputRetainedField, HistoricalToolInputRetentionOptions, HistoricalToolInputRetentionPolicy, HistoricalToolInputRetentionPolicyResolver, MessagePrepLimits, MessageTokenBreakdown, PrepareProviderModelMessagesFromUiMessagesOptions, } from "./message-prep-types.js";
|
|
8
9
|
export { estimateMessageTokenBreakdown } from "./message-token-breakdown.js";
|
|
9
10
|
/** Compress turn. */
|
|
10
11
|
export declare function compressTurn(messages: ProviderModelMessage[], startIdx: number, endIdx: number): ProviderModelMessage[];
|
|
11
12
|
/** Enforce token budget with turn compression. */
|
|
12
13
|
export declare function enforceTokenBudgetWithTurnCompression(messages: ProviderModelMessage[], budget: number, overhead: number, preserveSourceMessageIds?: readonly string[]): ProviderModelMessage[];
|
|
13
|
-
/** Check whether the model supports the file media type. */
|
|
14
|
-
export declare function isModelSupportedFileMediaType(mediaType: string): boolean;
|
|
15
|
-
/** Normalizes message file part media types. */
|
|
16
|
-
export declare function normalizeMessageFilePartMediaTypes(messages: ChatUiMessage[]): ChatUiMessage[];
|
|
17
|
-
/** Rewrite unsupported file parts as annotations. */
|
|
18
|
-
export declare function rewriteUnsupportedFilePartsAsAnnotations(messages: ChatUiMessage[]): ChatUiMessage[];
|
|
19
14
|
/** Strip pending tool parts. */
|
|
20
15
|
export declare function stripPendingToolParts(messages: ChatUiMessage[], trustedToolReplayMessageIds?: readonly string[]): ChatUiMessage[];
|
|
21
16
|
/** Sanitize provider model messages. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-prep.d.ts","sourceRoot":"","sources":["../../../src/src/chat/message-prep.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AAMjC,OAAO,EACL,2BAA2B,EAC3B,gBAAgB,EAChB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAalC,OAAO,EAEL,KAAK,kCAAkC,EAExC,MAAM,2CAA2C,CAAC;AAMnD,OAAO,
|
|
1
|
+
{"version":3,"file":"message-prep.d.ts","sourceRoot":"","sources":["../../../src/src/chat/message-prep.ts"],"names":[],"mappings":"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"}
|