@f5-sales-demo/pi-ai 19.51.2

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 (128) hide show
  1. package/CHANGELOG.md +1997 -0
  2. package/README.md +1160 -0
  3. package/package.json +135 -0
  4. package/src/api-registry.ts +95 -0
  5. package/src/auth-storage.ts +2694 -0
  6. package/src/cli.ts +493 -0
  7. package/src/index.ts +42 -0
  8. package/src/model-cache.ts +97 -0
  9. package/src/model-manager.ts +349 -0
  10. package/src/model-thinking.ts +561 -0
  11. package/src/models.json +49439 -0
  12. package/src/models.json.d.ts +9 -0
  13. package/src/models.ts +56 -0
  14. package/src/prompts/turn-aborted-guidance.md +4 -0
  15. package/src/provider-details.ts +81 -0
  16. package/src/provider-models/descriptors.ts +285 -0
  17. package/src/provider-models/google.ts +90 -0
  18. package/src/provider-models/index.ts +4 -0
  19. package/src/provider-models/openai-compat.ts +2074 -0
  20. package/src/provider-models/special.ts +106 -0
  21. package/src/providers/amazon-bedrock.ts +706 -0
  22. package/src/providers/anthropic.ts +1682 -0
  23. package/src/providers/azure-openai-responses.ts +391 -0
  24. package/src/providers/cursor/gen/agent_pb.ts +15274 -0
  25. package/src/providers/cursor/proto/agent.proto +3526 -0
  26. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  27. package/src/providers/cursor/proto/buf.yaml +17 -0
  28. package/src/providers/cursor.ts +2218 -0
  29. package/src/providers/github-copilot-headers.ts +140 -0
  30. package/src/providers/gitlab-duo.ts +381 -0
  31. package/src/providers/google-gemini-cli.ts +1133 -0
  32. package/src/providers/google-shared.ts +354 -0
  33. package/src/providers/google-vertex.ts +436 -0
  34. package/src/providers/google.ts +381 -0
  35. package/src/providers/kimi.ts +151 -0
  36. package/src/providers/openai-codex/constants.ts +43 -0
  37. package/src/providers/openai-codex/request-transformer.ts +158 -0
  38. package/src/providers/openai-codex/response-handler.ts +81 -0
  39. package/src/providers/openai-codex-responses.ts +2345 -0
  40. package/src/providers/openai-completions-compat.ts +159 -0
  41. package/src/providers/openai-completions.ts +1290 -0
  42. package/src/providers/openai-responses-shared.ts +452 -0
  43. package/src/providers/openai-responses.ts +519 -0
  44. package/src/providers/register-builtins.ts +329 -0
  45. package/src/providers/synthetic.ts +154 -0
  46. package/src/providers/transform-messages.ts +234 -0
  47. package/src/rate-limit-utils.ts +84 -0
  48. package/src/stream.ts +728 -0
  49. package/src/types.ts +546 -0
  50. package/src/usage/claude.ts +337 -0
  51. package/src/usage/gemini.ts +248 -0
  52. package/src/usage/github-copilot.ts +421 -0
  53. package/src/usage/google-antigravity.ts +200 -0
  54. package/src/usage/kimi.ts +286 -0
  55. package/src/usage/minimax-code.ts +31 -0
  56. package/src/usage/openai-codex.ts +387 -0
  57. package/src/usage/zai.ts +247 -0
  58. package/src/usage.ts +130 -0
  59. package/src/utils/abort.ts +36 -0
  60. package/src/utils/anthropic-auth.ts +293 -0
  61. package/src/utils/discovery/antigravity.ts +261 -0
  62. package/src/utils/discovery/codex.ts +371 -0
  63. package/src/utils/discovery/cursor.ts +306 -0
  64. package/src/utils/discovery/gemini.ts +248 -0
  65. package/src/utils/discovery/index.ts +5 -0
  66. package/src/utils/discovery/openai-compatible.ts +224 -0
  67. package/src/utils/event-stream.ts +209 -0
  68. package/src/utils/http-inspector.ts +165 -0
  69. package/src/utils/idle-iterator.ts +176 -0
  70. package/src/utils/json-parse.ts +28 -0
  71. package/src/utils/oauth/alibaba-coding-plan.ts +59 -0
  72. package/src/utils/oauth/anthropic.ts +134 -0
  73. package/src/utils/oauth/api-key-validation.ts +92 -0
  74. package/src/utils/oauth/callback-server.ts +276 -0
  75. package/src/utils/oauth/cerebras.ts +59 -0
  76. package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
  77. package/src/utils/oauth/cursor.ts +157 -0
  78. package/src/utils/oauth/github-copilot.ts +358 -0
  79. package/src/utils/oauth/gitlab-duo.ts +123 -0
  80. package/src/utils/oauth/google-antigravity.ts +275 -0
  81. package/src/utils/oauth/google-gemini-cli.ts +334 -0
  82. package/src/utils/oauth/huggingface.ts +62 -0
  83. package/src/utils/oauth/index.ts +512 -0
  84. package/src/utils/oauth/kagi.ts +47 -0
  85. package/src/utils/oauth/kilo.ts +87 -0
  86. package/src/utils/oauth/kimi.ts +251 -0
  87. package/src/utils/oauth/litellm.ts +81 -0
  88. package/src/utils/oauth/lm-studio.ts +40 -0
  89. package/src/utils/oauth/minimax-code.ts +78 -0
  90. package/src/utils/oauth/moonshot.ts +59 -0
  91. package/src/utils/oauth/nanogpt.ts +51 -0
  92. package/src/utils/oauth/nvidia.ts +70 -0
  93. package/src/utils/oauth/oauth.html +199 -0
  94. package/src/utils/oauth/ollama.ts +47 -0
  95. package/src/utils/oauth/openai-codex.ts +190 -0
  96. package/src/utils/oauth/opencode.ts +49 -0
  97. package/src/utils/oauth/parallel.ts +46 -0
  98. package/src/utils/oauth/perplexity.ts +200 -0
  99. package/src/utils/oauth/pkce.ts +18 -0
  100. package/src/utils/oauth/qianfan.ts +58 -0
  101. package/src/utils/oauth/qwen-portal.ts +60 -0
  102. package/src/utils/oauth/synthetic.ts +60 -0
  103. package/src/utils/oauth/tavily.ts +46 -0
  104. package/src/utils/oauth/together.ts +59 -0
  105. package/src/utils/oauth/types.ts +89 -0
  106. package/src/utils/oauth/venice.ts +59 -0
  107. package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
  108. package/src/utils/oauth/vllm.ts +40 -0
  109. package/src/utils/oauth/xiaomi.ts +88 -0
  110. package/src/utils/oauth/zai.ts +60 -0
  111. package/src/utils/oauth/zenmux.ts +51 -0
  112. package/src/utils/overflow.ts +134 -0
  113. package/src/utils/retry-after.ts +110 -0
  114. package/src/utils/retry.ts +93 -0
  115. package/src/utils/schema/CONSTRAINTS.md +160 -0
  116. package/src/utils/schema/adapt.ts +20 -0
  117. package/src/utils/schema/compatibility.ts +397 -0
  118. package/src/utils/schema/dereference.ts +93 -0
  119. package/src/utils/schema/equality.ts +93 -0
  120. package/src/utils/schema/fields.ts +147 -0
  121. package/src/utils/schema/index.ts +9 -0
  122. package/src/utils/schema/normalize-cca.ts +479 -0
  123. package/src/utils/schema/sanitize-google.ts +212 -0
  124. package/src/utils/schema/strict-mode.ts +385 -0
  125. package/src/utils/schema/types.ts +5 -0
  126. package/src/utils/tool-choice.ts +81 -0
  127. package/src/utils/validation.ts +664 -0
  128. package/src/utils.ts +147 -0
@@ -0,0 +1,159 @@
1
+ import type { Model, OpenAICompat } from "../types";
2
+
3
+ type OpenAIReasoningEffort = "minimal" | "low" | "medium" | "high" | "xhigh";
4
+ type ResolvedToolStrictMode = NonNullable<OpenAICompat["toolStrictMode"]> | "mixed";
5
+
6
+ export type ResolvedOpenAICompat = Required<
7
+ Omit<OpenAICompat, "openRouterRouting" | "vercelGatewayRouting" | "extraBody" | "toolStrictMode">
8
+ > & {
9
+ openRouterRouting?: OpenAICompat["openRouterRouting"];
10
+ vercelGatewayRouting?: OpenAICompat["vercelGatewayRouting"];
11
+ extraBody?: OpenAICompat["extraBody"];
12
+ toolStrictMode: ResolvedToolStrictMode;
13
+ };
14
+
15
+ function detectStrictModeSupport(provider: string, baseUrl: string): boolean {
16
+ if (
17
+ provider === "openai" ||
18
+ provider === "openrouter" ||
19
+ provider === "cerebras" ||
20
+ provider === "together" ||
21
+ provider === "github-copilot" ||
22
+ provider === "zenmux"
23
+ ) {
24
+ return true;
25
+ }
26
+
27
+ const normalizedBaseUrl = baseUrl.toLowerCase();
28
+ return (
29
+ normalizedBaseUrl.includes("api.openai.com") ||
30
+ normalizedBaseUrl.includes(".openai.azure.com") ||
31
+ normalizedBaseUrl.includes("models.inference.ai.azure.com") ||
32
+ normalizedBaseUrl.includes("api.cerebras.ai") ||
33
+ normalizedBaseUrl.includes("api.together.xyz") ||
34
+ normalizedBaseUrl.includes("openrouter.ai") ||
35
+ normalizedBaseUrl.includes("api.deepseek.com") ||
36
+ normalizedBaseUrl.includes("deepseek.com")
37
+ );
38
+ }
39
+
40
+ /**
41
+ * Detect compatibility settings from provider and baseUrl for known providers.
42
+ * Provider takes precedence over URL-based detection since it's explicitly configured.
43
+ * @param model - The model configuration
44
+ * @param resolvedBaseUrl - Optional resolved base URL (e.g., after GitHub Copilot proxy-ep resolution).
45
+ * If provided, this takes precedence over model.baseUrl for URL-based checks.
46
+ */
47
+ export function detectOpenAICompat(model: Model<"openai-completions">, resolvedBaseUrl?: string): ResolvedOpenAICompat {
48
+ const provider = model.provider;
49
+ // Use resolvedBaseUrl if provided (e.g., after GitHub Copilot proxy-ep resolution)
50
+ const baseUrl = resolvedBaseUrl ?? model.baseUrl;
51
+
52
+ const isCerebras = provider === "cerebras" || baseUrl.includes("cerebras.ai");
53
+ const isZai = provider === "zai" || baseUrl.includes("api.z.ai");
54
+ const isKimiModel = model.id.includes("moonshotai/kimi") || /^kimi[-.]/i.test(model.id);
55
+ const isAlibaba = provider === "alibaba-coding-plan" || baseUrl.includes("dashscope");
56
+ const isQwen = model.id.toLowerCase().includes("qwen");
57
+
58
+ const isNonStandard =
59
+ isCerebras ||
60
+ provider === "xai" ||
61
+ baseUrl.includes("api.x.ai") ||
62
+ provider === "mistral" ||
63
+ baseUrl.includes("mistral.ai") ||
64
+ baseUrl.includes("chutes.ai") ||
65
+ baseUrl.includes("deepseek.com") ||
66
+ isAlibaba ||
67
+ isZai ||
68
+ isQwen ||
69
+ provider === "opencode-zen" ||
70
+ provider === "opencode-go" ||
71
+ baseUrl.includes("opencode.ai");
72
+
73
+ const useMaxTokens = provider === "mistral" || baseUrl.includes("mistral.ai") || baseUrl.includes("chutes.ai");
74
+ const isGrok = provider === "xai" || baseUrl.includes("api.x.ai");
75
+ const isMistral = provider === "mistral" || baseUrl.includes("mistral.ai");
76
+
77
+ const reasoningEffortMap: NonNullable<OpenAICompat["reasoningEffortMap"]> =
78
+ provider === "groq" && model.id === "qwen/qwen3-32b"
79
+ ? ({
80
+ minimal: "default",
81
+ low: "default",
82
+ medium: "default",
83
+ high: "default",
84
+ xhigh: "default",
85
+ } satisfies Partial<Record<OpenAIReasoningEffort, string>>)
86
+ : {};
87
+
88
+ return {
89
+ supportsStore: !isNonStandard,
90
+ supportsDeveloperRole: !isNonStandard,
91
+ supportsReasoningEffort: !isGrok && !isZai,
92
+ reasoningEffortMap,
93
+ supportsUsageInStreaming: !isCerebras,
94
+ supportsToolChoice: true,
95
+ maxTokensField: useMaxTokens ? "max_tokens" : "max_completion_tokens",
96
+ requiresToolResultName: isMistral,
97
+ requiresAssistantAfterToolResult: false,
98
+ requiresThinkingAsText: isMistral,
99
+ requiresMistralToolIds: isMistral,
100
+ thinkingFormat: isZai
101
+ ? "zai"
102
+ : provider === "openrouter" || baseUrl.includes("openrouter.ai")
103
+ ? "openrouter"
104
+ : isAlibaba || isQwen
105
+ ? "qwen"
106
+ : "openai",
107
+ reasoningContentField: "reasoning_content",
108
+ requiresReasoningContentForToolCalls: isKimiModel,
109
+ requiresAssistantContentForToolCalls: isKimiModel,
110
+ openRouterRouting: undefined,
111
+ vercelGatewayRouting: undefined,
112
+ supportsStrictMode: detectStrictModeSupport(provider, baseUrl),
113
+ extraBody: undefined,
114
+ toolStrictMode: isCerebras ? "all_strict" : "mixed",
115
+ };
116
+ }
117
+
118
+ /**
119
+ * Resolve compatibility settings by layering explicit model.compat overrides onto
120
+ * the detected defaults. This is the canonical compat view for both metadata and transport.
121
+ * @param model - The model configuration
122
+ * @param resolvedBaseUrl - Optional resolved base URL (e.g., after GitHub Copilot proxy-ep resolution).
123
+ * If provided, this takes precedence over model.baseUrl for URL-based checks.
124
+ */
125
+ export function resolveOpenAICompat(
126
+ model: Model<"openai-completions">,
127
+ resolvedBaseUrl?: string,
128
+ ): ResolvedOpenAICompat {
129
+ const detected = detectOpenAICompat(model, resolvedBaseUrl);
130
+ if (!model.compat) {
131
+ return detected;
132
+ }
133
+
134
+ return {
135
+ supportsStore: model.compat.supportsStore ?? detected.supportsStore,
136
+ supportsDeveloperRole: model.compat.supportsDeveloperRole ?? detected.supportsDeveloperRole,
137
+ supportsReasoningEffort: model.compat.supportsReasoningEffort ?? detected.supportsReasoningEffort,
138
+ reasoningEffortMap: model.compat.reasoningEffortMap ?? detected.reasoningEffortMap,
139
+ supportsUsageInStreaming: model.compat.supportsUsageInStreaming ?? detected.supportsUsageInStreaming,
140
+ supportsToolChoice: model.compat.supportsToolChoice ?? detected.supportsToolChoice,
141
+ maxTokensField: model.compat.maxTokensField ?? detected.maxTokensField,
142
+ requiresToolResultName: model.compat.requiresToolResultName ?? detected.requiresToolResultName,
143
+ requiresAssistantAfterToolResult:
144
+ model.compat.requiresAssistantAfterToolResult ?? detected.requiresAssistantAfterToolResult,
145
+ requiresThinkingAsText: model.compat.requiresThinkingAsText ?? detected.requiresThinkingAsText,
146
+ requiresMistralToolIds: model.compat.requiresMistralToolIds ?? detected.requiresMistralToolIds,
147
+ thinkingFormat: model.compat.thinkingFormat ?? detected.thinkingFormat,
148
+ reasoningContentField: model.compat.reasoningContentField ?? detected.reasoningContentField,
149
+ requiresReasoningContentForToolCalls:
150
+ model.compat.requiresReasoningContentForToolCalls ?? detected.requiresReasoningContentForToolCalls,
151
+ requiresAssistantContentForToolCalls:
152
+ model.compat.requiresAssistantContentForToolCalls ?? detected.requiresAssistantContentForToolCalls,
153
+ openRouterRouting: model.compat.openRouterRouting ?? detected.openRouterRouting,
154
+ vercelGatewayRouting: model.compat.vercelGatewayRouting ?? detected.vercelGatewayRouting,
155
+ supportsStrictMode: model.compat.supportsStrictMode ?? detected.supportsStrictMode,
156
+ extraBody: model.compat.extraBody,
157
+ toolStrictMode: model.compat.toolStrictMode ?? detected.toolStrictMode,
158
+ };
159
+ }