@fased/fased 0.1.58 → 0.1.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/dist/agents/anthropic-payload-policy.js +188 -0
  2. package/dist/agents/anthropic-transport-stream.js +736 -0
  3. package/dist/agents/copilot-dynamic-headers.js +1 -1
  4. package/dist/agents/custom-api-registry.js +21 -0
  5. package/dist/agents/google-transport-stream.js +543 -0
  6. package/dist/agents/models-config.js +2 -1
  7. package/dist/agents/openai-completions-compat.js +49 -0
  8. package/dist/agents/openai-responses-payload-policy.js +100 -0
  9. package/dist/agents/openai-tool-schema.js +130 -0
  10. package/dist/agents/openai-transport-stream.js +1040 -0
  11. package/dist/agents/pi-embedded-runner/compact.js +9 -0
  12. package/dist/agents/pi-embedded-runner/run/attempt.js +9 -0
  13. package/dist/agents/provider-request-config.js +1 -1
  14. package/dist/agents/provider-stream.js +29 -0
  15. package/dist/agents/provider-transport-fetch.js +89 -0
  16. package/dist/agents/provider-transport-stream.js +72 -0
  17. package/dist/agents/system-prompt-cache-boundary.js +1 -1
  18. package/dist/agents/system-prompt.js +1 -1
  19. package/dist/agents/transport-message-transform.js +143 -0
  20. package/dist/agents/transport-stream-shared.js +81 -0
  21. package/dist/brand.js +1 -1
  22. package/dist/build-info.json +3 -3
  23. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  24. package/dist/channels/delivery.js +78 -0
  25. package/dist/channels/plugins/catalog.js +10 -5
  26. package/dist/cli/components-cli.js +16 -13
  27. package/dist/cli/program/register.subclis.js +9 -0
  28. package/dist/cli/providers-cli.js +79 -6
  29. package/dist/cli/services-cli.js +28 -0
  30. package/dist/commands/auth-choice.js +1 -1
  31. package/dist/commands/models/list.auth-overview.js +12 -0
  32. package/dist/commands/onboard-channels.js +5 -0
  33. package/dist/commands/onboard-helpers.js +1 -1
  34. package/dist/commands/vllm-setup.js +12 -3
  35. package/dist/control-ui/assets/{app-CpgQGqe6.js → app-S_jg-ADS.js} +1706 -1675
  36. package/dist/control-ui/assets/{index-DiBBflpv.js → index-C22rDOFm.js} +3 -3
  37. package/dist/control-ui/assets/{providers-Cc89iMdx.js → providers-QMn4w2_f.js} +3 -3
  38. package/dist/control-ui/index.html +1 -1
  39. package/dist/control-ui/version.json +1 -1
  40. package/dist/gateway/control-reply-text.js +10 -1
  41. package/dist/gateway/method-scopes.js +2 -0
  42. package/dist/gateway/protocol/schema/agents-models-skills.js +1 -0
  43. package/dist/gateway/server-chat.js +3 -3
  44. package/dist/gateway/server-methods/channels.js +10 -2
  45. package/dist/gateway/server-methods/chat.js +19 -12
  46. package/dist/gateway/server-methods/models.js +4 -0
  47. package/dist/gateway/server-methods/services.js +47 -2
  48. package/dist/gateway/server-methods-list.js +2 -0
  49. package/dist/gateway/session-event-payloads.js +20 -9
  50. package/dist/infra/google-api-base-url.js +29 -0
  51. package/dist/plugin-sdk/{accounts-BJuN64m-.js → accounts-DxblobYM.js} +1 -1
  52. package/dist/plugin-sdk/{actions-DaEvM9Bl.js → actions-D4UNimWa.js} +2 -2
  53. package/dist/plugin-sdk/{active-listener-B8Kuanet.js → active-listener-CFuy106s.js} +1 -1
  54. package/dist/plugin-sdk/{audio-preflight-D7tCO0EH.js → audio-preflight-CxZixyhW.js} +25 -25
  55. package/dist/plugin-sdk/{audit-CVWH4BVP.js → audit-Cs0K7LBp.js} +1 -1
  56. package/dist/plugin-sdk/{channel-access-CH9FAS-I.js → channel-access-D5aHoTY8.js} +1 -1
  57. package/dist/plugin-sdk/{channel-access-configure-CI0je66H.js → channel-access-configure-Dvch9mMQ.js} +1 -1
  58. package/dist/plugin-sdk/channel-plugin-common.d.ts +2 -2
  59. package/dist/plugin-sdk/channel-plugin-common.js +4 -4
  60. package/dist/plugin-sdk/{chunk-01oBnQjh.js → chunk-B0FUGc5A.js} +1 -1
  61. package/dist/plugin-sdk/{chunk-items-D2zDJ8q8.js → chunk-items-Cy9a3X7x.js} +1 -1
  62. package/dist/plugin-sdk/command-status.js +25 -25
  63. package/dist/plugin-sdk/{commands-registry-ckg4fhYa.js → commands-registry-DmDRhRAU.js} +2 -2
  64. package/dist/plugin-sdk/{common-zHvdO8ly.js → common-CfUOowOp.js} +1 -1
  65. package/dist/plugin-sdk/{config-DrhYEiCM.js → config-mxULv0fQ.js} +1 -1
  66. package/dist/plugin-sdk/{config-schema-BtjeV5Hm.js → config-schema-D8E0LX8X.js} +4405 -460
  67. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  68. package/dist/plugin-sdk/discord.d.ts +3 -3
  69. package/dist/plugin-sdk/discord.js +19 -19
  70. package/dist/plugin-sdk/{handle-action-5dhYpMbP.js → handle-action-DbVCF9HZ.js} +13 -13
  71. package/dist/plugin-sdk/{helpers-E9aafRzA.js → helpers-BXbdgs5H.js} +1 -1
  72. package/dist/plugin-sdk/{image-ops-D2U9ctmu.js → image-ops-D7jPxaph.js} +1 -1
  73. package/dist/plugin-sdk/index.d.ts +4 -4
  74. package/dist/plugin-sdk/index.js +27 -27
  75. package/dist/plugin-sdk/{login-hql0fNuL.js → login-BRxww6nv.js} +3 -3
  76. package/dist/plugin-sdk/{login-qr-DJJ0svux.js → login-qr-DJXsk9XH.js} +3 -3
  77. package/dist/plugin-sdk/{manager-ciNnAMBn.js → manager-Y2S_5IlI.js} +2 -2
  78. package/dist/plugin-sdk/{markdown-tables-BKxbua_h.js → markdown-tables-DHLFQqaF.js} +1 -1
  79. package/dist/plugin-sdk/{media-DUIZ6x9H.js → media-Czo4carg.js} +2 -2
  80. package/dist/plugin-sdk/{monitor-D-giXewh.js → monitor-CFHFAUOj.js} +30 -30
  81. package/dist/plugin-sdk/{monitor-CNSGw4uQ.js → monitor-xS9A8Upr.js} +29 -29
  82. package/dist/plugin-sdk/ollama-runtime.js +970 -0
  83. package/dist/plugin-sdk/{openresponses-http-dbTd8UMk.js → openresponses-http-BcUbeVV6.js} +25 -25
  84. package/dist/plugin-sdk/{optional-runtime-dependency-CKsJL1PD.js → optional-runtime-dependency-DdMbxS24.js} +1 -1
  85. package/dist/plugin-sdk/{outbound-DhGrjRft.js → outbound-Db8mRN6P.js} +6 -6
  86. package/dist/plugin-sdk/{outbound-attachment-DAF8huFz.js → outbound-attachment-BqFjcypb.js} +2 -2
  87. package/dist/plugin-sdk/{pairing-message-BsJVvXkb.js → pairing-message-B3GC_7CD.js} +1 -1
  88. package/dist/plugin-sdk/{pairing-message-C403mq4K.d.ts → pairing-message-CxonJmwM.d.ts} +1 -1
  89. package/dist/plugin-sdk/{pairing-store-DwM-BNbj.js → pairing-store-CQikgIbw.js} +2 -2
  90. package/dist/plugin-sdk/{pi-model-discovery-DkIdlJvJ.js → pi-model-discovery-CY3m5zJP.js} +1 -1
  91. package/dist/plugin-sdk/{pi-model-discovery-runtime-Cv7okUMt.js → pi-model-discovery-runtime-DSh1T2pn.js} +2 -2
  92. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +1 -1
  93. package/dist/plugin-sdk/{pw-ai-Dxd87W3J.js → pw-ai-AFUqn-tQ.js} +3 -3
  94. package/dist/plugin-sdk/{replies-Bx61SvAC.js → replies-Fzh9PhXl.js} +2 -2
  95. package/dist/plugin-sdk/{resolve-outbound-target-bc-FpPZg.js → resolve-outbound-target-KpF3co6T.js} +1 -1
  96. package/dist/plugin-sdk/{resolve-route-D0eBYPtb.js → resolve-route-CDl74O19.js} +1 -1
  97. package/dist/plugin-sdk/{retry-policy-HTrC4zfC.js → retry-policy-D4uiqUOG.js} +1 -1
  98. package/dist/plugin-sdk/{runtime-BVkIrYLQ.js → runtime-Bb6KRnCC.js} +6 -4
  99. package/dist/plugin-sdk/{runtime-dependency-B2PqMdBu.js → runtime-dependency-DLDmB94f.js} +2 -2
  100. package/dist/plugin-sdk/sat-runtime.d.ts +2 -2
  101. package/dist/plugin-sdk/sat-runtime.js +25 -25
  102. package/dist/plugin-sdk/{send-DgzZUx2i.js → send-5nFktR1n.js} +5 -5
  103. package/dist/plugin-sdk/{send-DT2egZNK.js → send-Bfzf11VY.js} +7 -7
  104. package/dist/plugin-sdk/{send-BGDGzxUu.js → send-C4k4JuJN.js} +6 -6
  105. package/dist/plugin-sdk/{send-KJy3ajA3.js → send-D-uDKGIq.js} +6 -6
  106. package/dist/plugin-sdk/{send-C3QWSYLR.js → send-Du8ykP1k.js} +8 -8
  107. package/dist/plugin-sdk/{session-BCIEFOu1.js → session-CS-Td9EM.js} +2 -2
  108. package/dist/plugin-sdk/{skill-commands-CyIkcR8P.js → skill-commands-CFAlXWHk.js} +2 -2
  109. package/dist/plugin-sdk/{slack-DjKNh2uh.js → slack-DXYGbizH.js} +37 -37
  110. package/dist/plugin-sdk/{slack-actions-CeM9LWDp.js → slack-actions-BcMkNv1Z.js} +11 -11
  111. package/dist/plugin-sdk/slack.d.ts +3 -3
  112. package/dist/plugin-sdk/slack.js +9 -9
  113. package/dist/plugin-sdk/{sticker-cache-DcWzQ2wx.js → sticker-cache-Dr3rYfU1.js} +3 -3
  114. package/dist/plugin-sdk/{tables-B2iehyjG.js → tables-bFXyRpkx.js} +1 -1
  115. package/dist/plugin-sdk/{targets-BPket0SF.js → targets-DH7a9lKB.js} +1 -1
  116. package/dist/plugin-sdk/{telegram-actions-Cx_HWVht.js → telegram-actions-Besbw_Hg.js} +28 -28
  117. package/dist/plugin-sdk/telegram.d.ts +3 -3
  118. package/dist/plugin-sdk/telegram.js +8 -8
  119. package/dist/plugin-sdk/{thread-bindings.lifecycle-CYH69SIw.js → thread-bindings.lifecycle-CgOvvdw8.js} +3 -3
  120. package/dist/plugin-sdk/{thread-bindings.state-BN6461WG.js → thread-bindings.state-CQpk44Hq.js} +2 -2
  121. package/dist/plugin-sdk/{tmp-fased-dir-Ouj58axY.d.ts → tmp-fased-dir-DQ00xQ5D.d.ts} +1 -1
  122. package/dist/plugin-sdk/{types-B4hj6HgR.d.ts → types-B6zx-Dl2.d.ts} +1 -1
  123. package/dist/plugin-sdk/{types-dWZFX1fk.d.ts → types-eUM7hcDz.d.ts} +1 -1
  124. package/dist/plugin-sdk/{web-vR-oNiBv.js → web-Q1-G--JH.js} +30 -30
  125. package/dist/plugin-sdk/{whatsapp-actions-BYNf8ceY.js → whatsapp-actions-BtSc2CBv.js} +13 -13
  126. package/dist/plugin-sdk/{whatsapp-heartbeat-DZwa8MF0.js → whatsapp-heartbeat-Bg9TuYzl.js} +2 -2
  127. package/dist/plugin-sdk/whatsapp.d.ts +3 -3
  128. package/dist/plugin-sdk/whatsapp.js +12 -12
  129. package/dist/plugin-sdk/{wsl-WGtdw_6h.js → wsl-C4DGFkOd.js} +3 -3
  130. package/dist/plugins/provider-runtime.js +79 -0
  131. package/dist/providers/refresh.js +14 -0
  132. package/extensions/acpx/package.json +1 -1
  133. package/extensions/bluebubbles/package.json +1 -1
  134. package/extensions/copilot-proxy/package.json +1 -1
  135. package/extensions/diagnostics-otel/package.json +1 -1
  136. package/extensions/fased-federation/package.json +1 -1
  137. package/extensions/google-gemini-cli-auth/package.json +1 -1
  138. package/extensions/imessage/package.json +1 -1
  139. package/extensions/irc/package.json +1 -1
  140. package/extensions/line/package.json +1 -1
  141. package/extensions/llm-task/package.json +1 -1
  142. package/extensions/lobster/package.json +1 -1
  143. package/extensions/matrix/CHANGELOG.md +6 -0
  144. package/extensions/matrix/package.json +1 -1
  145. package/extensions/mattermost/package.json +1 -1
  146. package/extensions/memory-core/package.json +2 -2
  147. package/extensions/memory-lancedb/package.json +1 -1
  148. package/extensions/minimax-portal-auth/package.json +1 -1
  149. package/extensions/msteams/CHANGELOG.md +6 -0
  150. package/extensions/msteams/package.json +1 -1
  151. package/extensions/nextcloud-talk/package.json +1 -1
  152. package/extensions/nostr/CHANGELOG.md +6 -0
  153. package/extensions/nostr/package.json +1 -1
  154. package/extensions/open-prose/package.json +1 -1
  155. package/extensions/sat-mining/package.json +1 -1
  156. package/extensions/signal/package.json +1 -1
  157. package/extensions/synology-chat/package.json +1 -1
  158. package/extensions/tlon/package.json +1 -1
  159. package/extensions/twitch/CHANGELOG.md +6 -0
  160. package/extensions/twitch/package.json +1 -1
  161. package/extensions/voice-call/CHANGELOG.md +6 -0
  162. package/extensions/voice-call/package.json +1 -1
  163. package/extensions/zalo/CHANGELOG.md +6 -0
  164. package/extensions/zalo/package.json +1 -1
  165. package/extensions/zalouser/CHANGELOG.md +6 -0
  166. package/extensions/zalouser/package.json +1 -1
  167. package/package.json +1 -1
@@ -0,0 +1,100 @@
1
+ import { resolveProviderRequestPolicyConfig } from "./provider-request-config.js";
2
+
3
+ //#region src/agents/openai-responses-payload-policy.ts
4
+ const OPENAI_RESPONSES_APIS = new Set(["openai-responses", "openai-codex-responses"]);
5
+ function parsePositiveInteger(value) {
6
+ if (typeof value === "number" && Number.isFinite(value) && value > 0) {
7
+ return Math.floor(value);
8
+ }
9
+ if (typeof value === "string") {
10
+ const parsed = Number.parseInt(value, 10);
11
+ if (Number.isFinite(parsed) && parsed > 0) {
12
+ return parsed;
13
+ }
14
+ }
15
+ return undefined;
16
+ }
17
+ function resolveOpenAIResponsesCompactThreshold(model) {
18
+ const contextWindow = parsePositiveInteger(model.contextWindow);
19
+ if (contextWindow) {
20
+ return Math.max(1e3, Math.floor(contextWindow * .7));
21
+ }
22
+ return 8e4;
23
+ }
24
+ function shouldEnableOpenAIResponsesServerCompaction(explicitStore, provider, extraParams) {
25
+ const configured = extraParams?.responsesServerCompaction;
26
+ if (configured === false) {
27
+ return false;
28
+ }
29
+ if (explicitStore !== true) {
30
+ return false;
31
+ }
32
+ if (configured === true) {
33
+ return true;
34
+ }
35
+ return provider === "openai";
36
+ }
37
+ function stripDisabledOpenAIReasoningPayload(payloadObj) {
38
+ const reasoning = payloadObj.reasoning;
39
+ if (reasoning === "none") {
40
+ delete payloadObj.reasoning;
41
+ return;
42
+ }
43
+ if (!reasoning || typeof reasoning !== "object" || Array.isArray(reasoning)) {
44
+ return;
45
+ }
46
+ const reasoningObj = reasoning;
47
+ if (reasoningObj.effort === "none") {
48
+ delete payloadObj.reasoning;
49
+ }
50
+ }
51
+ function resolveOpenAIResponsesPayloadPolicy(model, options = {}) {
52
+ const capabilities = resolveProviderRequestPolicyConfig({
53
+ provider: typeof model.provider === "string" ? model.provider : undefined,
54
+ api: typeof model.api === "string" ? model.api : undefined,
55
+ baseUrl: typeof model.baseUrl === "string" ? model.baseUrl : undefined,
56
+ compat: model.compat,
57
+ capability: "llm",
58
+ transport: "stream"
59
+ }).capabilities;
60
+ const storeMode = options.storeMode ?? "provider-policy";
61
+ const explicitStore = storeMode === "preserve" ? undefined : storeMode === "disable" ? capabilities.supportsResponsesStoreField ? false : undefined : capabilities.allowsResponsesStore ? true : undefined;
62
+ const isResponsesApi = typeof model.api === "string" && OPENAI_RESPONSES_APIS.has(model.api);
63
+ return {
64
+ allowsServiceTier: capabilities.allowsOpenAIServiceTier,
65
+ compactThreshold: parsePositiveInteger(options.extraParams?.responsesCompactThreshold) ?? resolveOpenAIResponsesCompactThreshold(model),
66
+ explicitStore,
67
+ shouldStripDisabledReasoningPayload: isResponsesApi && !capabilities.usesKnownNativeOpenAIRoute,
68
+ shouldStripReasoningPayload: false,
69
+ shouldStripPromptCache: options.enablePromptCacheStripping === true && capabilities.shouldStripResponsesPromptCache,
70
+ shouldStripStore: explicitStore !== true && model.compat?.supportsStore === false && isResponsesApi,
71
+ useServerCompaction: options.enableServerCompaction === true && shouldEnableOpenAIResponsesServerCompaction(explicitStore, model.provider, options.extraParams)
72
+ };
73
+ }
74
+ function applyOpenAIResponsesPayloadPolicy(payloadObj, policy) {
75
+ if (policy.explicitStore !== undefined) {
76
+ payloadObj.store = policy.explicitStore;
77
+ }
78
+ if (policy.shouldStripStore) {
79
+ delete payloadObj.store;
80
+ }
81
+ if (policy.shouldStripPromptCache) {
82
+ delete payloadObj.prompt_cache_key;
83
+ delete payloadObj.prompt_cache_retention;
84
+ }
85
+ if (policy.shouldStripReasoningPayload) {
86
+ delete payloadObj.reasoning;
87
+ }
88
+ if (policy.useServerCompaction && payloadObj.context_management === undefined) {
89
+ payloadObj.context_management = [{
90
+ type: "compaction",
91
+ compact_threshold: policy.compactThreshold
92
+ }];
93
+ }
94
+ if (policy.shouldStripDisabledReasoningPayload) {
95
+ stripDisabledOpenAIReasoningPayload(payloadObj);
96
+ }
97
+ }
98
+
99
+ //#endregion
100
+ export { applyOpenAIResponsesPayloadPolicy, resolveOpenAIResponsesPayloadPolicy };
@@ -0,0 +1,130 @@
1
+ import { resolveProviderRequestCapabilities } from "./provider-attribution.js";
2
+ import { normalizeToolParameters } from "./pi-tools.schema.js";
3
+
4
+ //#region src/agents/openai-tool-schema.ts
5
+ function normalizeToolParameterSchema(schema) {
6
+ const normalized = normalizeToolParameters({
7
+ name: "schema",
8
+ label: "Schema",
9
+ description: "Schema normalization placeholder.",
10
+ parameters: schema,
11
+ execute: async () => ({
12
+ content: [],
13
+ details: {}
14
+ })
15
+ });
16
+ return normalized.parameters;
17
+ }
18
+ function optionalString(value) {
19
+ return typeof value === "string" ? value : undefined;
20
+ }
21
+ function normalizeStrictOpenAIJsonSchema(schema) {
22
+ return normalizeStrictOpenAIJsonSchemaRecursive(normalizeToolParameterSchema(schema ?? {}));
23
+ }
24
+ function normalizeStrictOpenAIJsonSchemaRecursive(schema) {
25
+ if (Array.isArray(schema)) {
26
+ let changed = false;
27
+ const normalized = schema.map((entry) => {
28
+ const next = normalizeStrictOpenAIJsonSchemaRecursive(entry);
29
+ changed ||= next !== entry;
30
+ return next;
31
+ });
32
+ return changed ? normalized : schema;
33
+ }
34
+ if (!schema || typeof schema !== "object") {
35
+ return schema;
36
+ }
37
+ const record = schema;
38
+ let changed = false;
39
+ const normalized = {};
40
+ for (const [key, value] of Object.entries(record)) {
41
+ const next = normalizeStrictOpenAIJsonSchemaRecursive(value);
42
+ normalized[key] = next;
43
+ changed ||= next !== value;
44
+ }
45
+ if (normalized.type === "object") {
46
+ const properties = normalized.properties && typeof normalized.properties === "object" && !Array.isArray(normalized.properties) ? normalized.properties : undefined;
47
+ if (properties && Object.keys(properties).length === 0 && !Array.isArray(normalized.required)) {
48
+ normalized.required = [];
49
+ changed = true;
50
+ }
51
+ }
52
+ return changed ? normalized : schema;
53
+ }
54
+ function normalizeOpenAIStrictToolParameters(schema, strict) {
55
+ if (!strict) {
56
+ return normalizeToolParameterSchema(schema ?? {});
57
+ }
58
+ return normalizeStrictOpenAIJsonSchema(schema);
59
+ }
60
+ function isStrictOpenAIJsonSchemaCompatible(schema) {
61
+ return isStrictOpenAIJsonSchemaCompatibleRecursive(normalizeStrictOpenAIJsonSchema(schema));
62
+ }
63
+ function isStrictOpenAIJsonSchemaCompatibleRecursive(schema) {
64
+ if (Array.isArray(schema)) {
65
+ return schema.every((entry) => isStrictOpenAIJsonSchemaCompatibleRecursive(entry));
66
+ }
67
+ if (!schema || typeof schema !== "object") {
68
+ return true;
69
+ }
70
+ const record = schema;
71
+ if ("anyOf" in record || "oneOf" in record || "allOf" in record) {
72
+ return false;
73
+ }
74
+ if (Array.isArray(record.type)) {
75
+ return false;
76
+ }
77
+ if (record.type === "object" && record.additionalProperties !== false) {
78
+ return false;
79
+ }
80
+ if (record.type === "object") {
81
+ const properties = record.properties && typeof record.properties === "object" && !Array.isArray(record.properties) ? record.properties : {};
82
+ const required = Array.isArray(record.required) ? record.required.filter((entry) => typeof entry === "string") : undefined;
83
+ if (!required) {
84
+ return false;
85
+ }
86
+ const requiredSet = new Set(required);
87
+ if (Object.keys(properties).some((key) => !requiredSet.has(key))) {
88
+ return false;
89
+ }
90
+ }
91
+ return Object.entries(record).every(([key, entry]) => {
92
+ if (key === "properties" && entry && typeof entry === "object" && !Array.isArray(entry)) {
93
+ return Object.values(entry).every((value) => isStrictOpenAIJsonSchemaCompatibleRecursive(value));
94
+ }
95
+ return isStrictOpenAIJsonSchemaCompatibleRecursive(entry);
96
+ });
97
+ }
98
+ function resolveOpenAIStrictToolFlagForInventory(tools, strict) {
99
+ if (strict !== true) {
100
+ return strict === false ? false : undefined;
101
+ }
102
+ return tools.every((tool) => isStrictOpenAIJsonSchemaCompatible(tool.parameters));
103
+ }
104
+ function resolvesToNativeOpenAIStrictTools(model, transport) {
105
+ const capabilities = resolveProviderRequestCapabilities({
106
+ provider: optionalString(model.provider),
107
+ api: optionalString(model.api),
108
+ baseUrl: optionalString(model.baseUrl),
109
+ capability: "llm",
110
+ transport,
111
+ modelId: optionalString(model.id),
112
+ compat: model.compat && typeof model.compat === "object" ? model.compat : undefined
113
+ });
114
+ if (!capabilities.usesKnownNativeOpenAIRoute) {
115
+ return false;
116
+ }
117
+ return capabilities.provider === "openai" || capabilities.provider === "openai-codex";
118
+ }
119
+ function resolveOpenAIStrictToolSetting(model, options) {
120
+ if (resolvesToNativeOpenAIStrictTools(model, options?.transport ?? "stream")) {
121
+ return true;
122
+ }
123
+ if (options?.supportsStrictMode) {
124
+ return false;
125
+ }
126
+ return undefined;
127
+ }
128
+
129
+ //#endregion
130
+ export { normalizeOpenAIStrictToolParameters, resolveOpenAIStrictToolFlagForInventory, resolveOpenAIStrictToolSetting };