@prometheus-ai/ai 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +1184 -0
- package/dist/types/api-registry.d.ts +30 -0
- package/dist/types/auth-broker/client.d.ts +66 -0
- package/dist/types/auth-broker/index.d.ts +6 -0
- package/dist/types/auth-broker/refresher.d.ts +25 -0
- package/dist/types/auth-broker/remote-store.d.ts +101 -0
- package/dist/types/auth-broker/server.d.ts +32 -0
- package/dist/types/auth-broker/snapshot-cache.d.ts +17 -0
- package/dist/types/auth-broker/types.d.ts +107 -0
- package/dist/types/auth-broker/wire-schemas.d.ts +412 -0
- package/dist/types/auth-gateway/http.d.ts +39 -0
- package/dist/types/auth-gateway/index.d.ts +3 -0
- package/dist/types/auth-gateway/server.d.ts +36 -0
- package/dist/types/auth-gateway/types.d.ts +117 -0
- package/dist/types/auth-storage.d.ts +762 -0
- package/dist/types/index.d.ts +49 -0
- package/dist/types/model-cache.d.ts +17 -0
- package/dist/types/model-manager.d.ts +64 -0
- package/dist/types/model-thinking.d.ts +100 -0
- package/dist/types/models.d.ts +12 -0
- package/dist/types/provider-details.d.ts +24 -0
- package/dist/types/provider-models/bundled-references.d.ts +4 -0
- package/dist/types/provider-models/descriptors.d.ts +50 -0
- package/dist/types/provider-models/google.d.ts +24 -0
- package/dist/types/provider-models/index.d.ts +5 -0
- package/dist/types/provider-models/ollama.d.ts +7 -0
- package/dist/types/provider-models/openai-compat.d.ts +323 -0
- package/dist/types/provider-models/special.d.ts +16 -0
- package/dist/types/providers/amazon-bedrock.d.ts +38 -0
- package/dist/types/providers/anthropic-client.d.ts +99 -0
- package/dist/types/providers/anthropic-messages-server-schema.d.ts +465 -0
- package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
- package/dist/types/providers/anthropic-wire.d.ts +262 -0
- package/dist/types/providers/anthropic.d.ts +206 -0
- package/dist/types/providers/aws-credentials.d.ts +43 -0
- package/dist/types/providers/aws-eventstream.d.ts +38 -0
- package/dist/types/providers/aws-sigv4.d.ts +55 -0
- package/dist/types/providers/azure-openai-responses.d.ts +15 -0
- package/dist/types/providers/cursor/gen/agent_pb.d.ts +13022 -0
- package/dist/types/providers/cursor.d.ts +43 -0
- package/dist/types/providers/error-message.d.ts +27 -0
- package/dist/types/providers/github-copilot-headers.d.ts +40 -0
- package/dist/types/providers/gitlab-duo.d.ts +27 -0
- package/dist/types/providers/google-auth.d.ts +24 -0
- package/dist/types/providers/google-gemini-cli.d.ts +81 -0
- package/dist/types/providers/google-gemini-headers.d.ts +18 -0
- package/dist/types/providers/google-shared.d.ts +171 -0
- package/dist/types/providers/google-types.d.ts +138 -0
- package/dist/types/providers/google-vertex.d.ts +7 -0
- package/dist/types/providers/google.d.ts +4 -0
- package/dist/types/providers/grammar.d.ts +1 -0
- package/dist/types/providers/kimi.d.ts +27 -0
- package/dist/types/providers/mock.d.ts +173 -0
- package/dist/types/providers/ollama.d.ts +6 -0
- package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
- package/dist/types/providers/openai-chat-server-schema.d.ts +817 -0
- package/dist/types/providers/openai-chat-server.d.ts +16 -0
- package/dist/types/providers/openai-codex/constants.d.ts +26 -0
- package/dist/types/providers/openai-codex/request-transformer.d.ts +49 -0
- package/dist/types/providers/openai-codex/response-handler.d.ts +17 -0
- package/dist/types/providers/openai-codex-responses.d.ts +67 -0
- package/dist/types/providers/openai-completions-compat.d.ts +27 -0
- package/dist/types/providers/openai-completions.d.ts +54 -0
- package/dist/types/providers/openai-responses-server-schema.d.ts +392 -0
- package/dist/types/providers/openai-responses-server.d.ts +17 -0
- package/dist/types/providers/openai-responses-shared.d.ts +105 -0
- package/dist/types/providers/openai-responses.d.ts +66 -0
- package/dist/types/providers/prometheus-native-client.d.ts +13 -0
- package/dist/types/providers/prometheus-native-server.d.ts +68 -0
- package/dist/types/providers/register-builtins.d.ts +31 -0
- package/dist/types/providers/synthetic.d.ts +26 -0
- package/dist/types/providers/transform-messages.d.ts +12 -0
- package/dist/types/providers/vision-guard.d.ts +20 -0
- package/dist/types/providers/xai-responses.d.ts +23 -0
- package/dist/types/rate-limit-utils.d.ts +19 -0
- package/dist/types/stream.d.ts +28 -0
- package/dist/types/types.d.ts +819 -0
- package/dist/types/usage/claude.d.ts +4 -0
- package/dist/types/usage/gemini.d.ts +2 -0
- package/dist/types/usage/github-copilot.d.ts +7 -0
- package/dist/types/usage/google-antigravity.d.ts +2 -0
- package/dist/types/usage/kimi.d.ts +2 -0
- package/dist/types/usage/minimax-code.d.ts +2 -0
- package/dist/types/usage/openai-codex.d.ts +3 -0
- package/dist/types/usage/shared.d.ts +1 -0
- package/dist/types/usage/zai.d.ts +2 -0
- package/dist/types/usage.d.ts +260 -0
- package/dist/types/utils/abort.d.ts +19 -0
- package/dist/types/utils/abortable-iterator.d.ts +4 -0
- package/dist/types/utils/anthropic-auth.d.ts +35 -0
- package/dist/types/utils/discovery/antigravity.d.ts +61 -0
- package/dist/types/utils/discovery/codex.d.ts +38 -0
- package/dist/types/utils/discovery/cursor.d.ts +23 -0
- package/dist/types/utils/discovery/gemini.d.ts +25 -0
- package/dist/types/utils/discovery/index.d.ts +4 -0
- package/dist/types/utils/discovery/openai-compatible.d.ts +72 -0
- package/dist/types/utils/event-stream.d.ts +28 -0
- package/dist/types/utils/fireworks-model-id.d.ts +10 -0
- package/dist/types/utils/foundry.d.ts +1 -0
- package/dist/types/utils/http-inspector.d.ts +31 -0
- package/dist/types/utils/idle-iterator.d.ts +78 -0
- package/dist/types/utils/json-parse.d.ts +37 -0
- package/dist/types/utils/oauth/__tests__/xai-oauth.test.d.ts +1 -0
- package/dist/types/utils/oauth/alibaba-coding-plan.d.ts +18 -0
- package/dist/types/utils/oauth/anthropic.d.ts +22 -0
- package/dist/types/utils/oauth/api-key-login.d.ts +35 -0
- package/dist/types/utils/oauth/api-key-validation.d.ts +27 -0
- package/dist/types/utils/oauth/callback-server.d.ts +57 -0
- package/dist/types/utils/oauth/cerebras.d.ts +1 -0
- package/dist/types/utils/oauth/cloudflare-ai-gateway.d.ts +18 -0
- package/dist/types/utils/oauth/cursor.d.ts +15 -0
- package/dist/types/utils/oauth/deepseek.d.ts +10 -0
- package/dist/types/utils/oauth/firepass.d.ts +1 -0
- package/dist/types/utils/oauth/fireworks.d.ts +1 -0
- package/dist/types/utils/oauth/github-copilot.d.ts +38 -0
- package/dist/types/utils/oauth/gitlab-duo.d.ts +3 -0
- package/dist/types/utils/oauth/google-antigravity.d.ts +11 -0
- package/dist/types/utils/oauth/google-gemini-cli.d.ts +10 -0
- package/dist/types/utils/oauth/google-oauth-shared.d.ts +28 -0
- package/dist/types/utils/oauth/huggingface.d.ts +19 -0
- package/dist/types/utils/oauth/index.d.ts +38 -0
- package/dist/types/utils/oauth/kagi.d.ts +17 -0
- package/dist/types/utils/oauth/kilo.d.ts +5 -0
- package/dist/types/utils/oauth/kimi.d.ts +21 -0
- package/dist/types/utils/oauth/litellm.d.ts +18 -0
- package/dist/types/utils/oauth/lm-studio.d.ts +17 -0
- package/dist/types/utils/oauth/minimax-code.d.ts +28 -0
- package/dist/types/utils/oauth/moonshot.d.ts +1 -0
- package/dist/types/utils/oauth/nanogpt.d.ts +1 -0
- package/dist/types/utils/oauth/nvidia.d.ts +18 -0
- package/dist/types/utils/oauth/ollama-cloud.d.ts +2 -0
- package/dist/types/utils/oauth/ollama.d.ts +18 -0
- package/dist/types/utils/oauth/openai-codex.d.ts +21 -0
- package/dist/types/utils/oauth/opencode.d.ts +18 -0
- package/dist/types/utils/oauth/openrouter.d.ts +1 -0
- package/dist/types/utils/oauth/parallel.d.ts +17 -0
- package/dist/types/utils/oauth/perplexity.d.ts +9 -0
- package/dist/types/utils/oauth/pkce.d.ts +8 -0
- package/dist/types/utils/oauth/qianfan.d.ts +17 -0
- package/dist/types/utils/oauth/qwen-portal.d.ts +19 -0
- package/dist/types/utils/oauth/synthetic.d.ts +1 -0
- package/dist/types/utils/oauth/tavily.d.ts +17 -0
- package/dist/types/utils/oauth/together.d.ts +1 -0
- package/dist/types/utils/oauth/types.d.ts +44 -0
- package/dist/types/utils/oauth/venice.d.ts +18 -0
- package/dist/types/utils/oauth/vercel-ai-gateway.d.ts +18 -0
- package/dist/types/utils/oauth/vllm.d.ts +16 -0
- package/dist/types/utils/oauth/wafer.d.ts +2 -0
- package/dist/types/utils/oauth/xai-oauth.d.ts +60 -0
- package/dist/types/utils/oauth/xiaomi.d.ts +25 -0
- package/dist/types/utils/oauth/zai.d.ts +18 -0
- package/dist/types/utils/oauth/zenmux.d.ts +1 -0
- package/dist/types/utils/oauth/zhipu.d.ts +18 -0
- package/dist/types/utils/overflow.d.ts +54 -0
- package/dist/types/utils/parse-bind.d.ts +23 -0
- package/dist/types/utils/provider-response.d.ts +3 -0
- package/dist/types/utils/request-debug.d.ts +29 -0
- package/dist/types/utils/retry-after.d.ts +3 -0
- package/dist/types/utils/retry.d.ts +26 -0
- package/dist/types/utils/schema/adapt.d.ts +24 -0
- package/dist/types/utils/schema/compatibility.d.ts +30 -0
- package/dist/types/utils/schema/dereference.d.ts +11 -0
- package/dist/types/utils/schema/draft.d.ts +10 -0
- package/dist/types/utils/schema/equality.d.ts +4 -0
- package/dist/types/utils/schema/fields.d.ts +49 -0
- package/dist/types/utils/schema/index.d.ts +13 -0
- package/dist/types/utils/schema/json-schema-validator.d.ts +12 -0
- package/dist/types/utils/schema/meta-validator.d.ts +2 -0
- package/dist/types/utils/schema/normalize.d.ts +93 -0
- package/dist/types/utils/schema/spill.d.ts +8 -0
- package/dist/types/utils/schema/stamps.d.ts +25 -0
- package/dist/types/utils/schema/types.d.ts +4 -0
- package/dist/types/utils/schema/wire.d.ts +53 -0
- package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
- package/dist/types/utils/sdk-stream-timeout.d.ts +33 -0
- package/dist/types/utils/sse-debug.d.ts +10 -0
- package/dist/types/utils/stream-markup-healing.d.ts +80 -0
- package/dist/types/utils/tool-choice.d.ts +50 -0
- package/dist/types/utils/validation.d.ts +17 -0
- package/dist/types/utils.d.ts +28 -0
- package/package.json +142 -0
- package/src/api-registry.ts +96 -0
- package/src/auth-broker/client.ts +358 -0
- package/src/auth-broker/index.ts +6 -0
- package/src/auth-broker/refresher.ts +117 -0
- package/src/auth-broker/remote-store.ts +637 -0
- package/src/auth-broker/server.ts +644 -0
- package/src/auth-broker/snapshot-cache.ts +174 -0
- package/src/auth-broker/types.ts +130 -0
- package/src/auth-broker/wire-schemas.ts +200 -0
- package/src/auth-gateway/http.ts +194 -0
- package/src/auth-gateway/index.ts +3 -0
- package/src/auth-gateway/server.ts +822 -0
- package/src/auth-gateway/types.ts +143 -0
- package/src/auth-storage.ts +4608 -0
- package/src/index.ts +54 -0
- package/src/model-cache.ts +129 -0
- package/src/model-manager.ts +469 -0
- package/src/model-thinking.ts +756 -0
- package/src/models.json +60287 -0
- package/src/models.json.d.ts +9 -0
- package/src/models.ts +56 -0
- package/src/prompts/turn-aborted-guidance.md +4 -0
- package/src/provider-details.ts +90 -0
- package/src/provider-models/bundled-references.ts +38 -0
- package/src/provider-models/descriptors.ts +364 -0
- package/src/provider-models/google.ts +88 -0
- package/src/provider-models/index.ts +5 -0
- package/src/provider-models/ollama.ts +153 -0
- package/src/provider-models/openai-compat.ts +2904 -0
- package/src/provider-models/special.ts +67 -0
- package/src/providers/amazon-bedrock.ts +873 -0
- package/src/providers/anthropic-client.ts +318 -0
- package/src/providers/anthropic-messages-server-schema.ts +243 -0
- package/src/providers/anthropic-messages-server.ts +681 -0
- package/src/providers/anthropic-wire.ts +268 -0
- package/src/providers/anthropic.ts +3106 -0
- package/src/providers/aws-credentials.ts +501 -0
- package/src/providers/aws-eventstream.ts +185 -0
- package/src/providers/aws-sigv4.ts +218 -0
- package/src/providers/azure-openai-responses.ts +361 -0
- package/src/providers/cursor/gen/agent_pb.ts +15274 -0
- package/src/providers/cursor/proto/agent.proto +3526 -0
- package/src/providers/cursor/proto/buf.gen.yaml +6 -0
- package/src/providers/cursor/proto/buf.yaml +17 -0
- package/src/providers/cursor.ts +2621 -0
- package/src/providers/error-message.ts +21 -0
- package/src/providers/github-copilot-headers.ts +140 -0
- package/src/providers/gitlab-duo.ts +372 -0
- package/src/providers/google-auth.ts +252 -0
- package/src/providers/google-gemini-cli.ts +809 -0
- package/src/providers/google-gemini-headers.ts +41 -0
- package/src/providers/google-shared.ts +917 -0
- package/src/providers/google-types.ts +167 -0
- package/src/providers/google-vertex.ts +91 -0
- package/src/providers/google.ts +41 -0
- package/src/providers/grammar.ts +70 -0
- package/src/providers/kimi.ts +52 -0
- package/src/providers/mock.ts +496 -0
- package/src/providers/ollama.ts +644 -0
- package/src/providers/openai-anthropic-shim.ts +138 -0
- package/src/providers/openai-chat-server-schema.ts +252 -0
- package/src/providers/openai-chat-server.ts +647 -0
- package/src/providers/openai-codex/constants.ts +43 -0
- package/src/providers/openai-codex/request-transformer.ts +161 -0
- package/src/providers/openai-codex/response-handler.ts +81 -0
- package/src/providers/openai-codex-responses.ts +3027 -0
- package/src/providers/openai-completions-compat.ts +320 -0
- package/src/providers/openai-completions.ts +2002 -0
- package/src/providers/openai-responses-server-schema.ts +290 -0
- package/src/providers/openai-responses-server.ts +1183 -0
- package/src/providers/openai-responses-shared.ts +956 -0
- package/src/providers/openai-responses.ts +679 -0
- package/src/providers/prometheus-native-client.ts +228 -0
- package/src/providers/prometheus-native-server.ts +212 -0
- package/src/providers/register-builtins.ts +457 -0
- package/src/providers/synthetic.ts +50 -0
- package/src/providers/transform-messages.ts +382 -0
- package/src/providers/vision-guard.ts +52 -0
- package/src/providers/xai-responses.ts +82 -0
- package/src/rate-limit-utils.ts +91 -0
- package/src/stream.ts +1068 -0
- package/src/types.ts +965 -0
- package/src/usage/claude.ts +482 -0
- package/src/usage/gemini.ts +250 -0
- package/src/usage/github-copilot.ts +421 -0
- package/src/usage/google-antigravity.ts +201 -0
- package/src/usage/kimi.ts +271 -0
- package/src/usage/minimax-code.ts +31 -0
- package/src/usage/openai-codex.ts +503 -0
- package/src/usage/shared.ts +10 -0
- package/src/usage/zai.ts +247 -0
- package/src/usage.ts +185 -0
- package/src/utils/abort.ts +51 -0
- package/src/utils/abortable-iterator.ts +69 -0
- package/src/utils/anthropic-auth.ts +93 -0
- package/src/utils/discovery/antigravity.ts +261 -0
- package/src/utils/discovery/codex.ts +371 -0
- package/src/utils/discovery/cursor.ts +306 -0
- package/src/utils/discovery/gemini.ts +248 -0
- package/src/utils/discovery/index.ts +4 -0
- package/src/utils/discovery/openai-compatible.ts +224 -0
- package/src/utils/event-stream.ts +142 -0
- package/src/utils/fireworks-model-id.ts +30 -0
- package/src/utils/foundry.ts +8 -0
- package/src/utils/http-inspector.ts +176 -0
- package/src/utils/idle-iterator.ts +273 -0
- package/src/utils/json-parse.ts +182 -0
- package/src/utils/oauth/__tests__/xai-oauth.test.ts +107 -0
- package/src/utils/oauth/alibaba-coding-plan.ts +59 -0
- package/src/utils/oauth/anthropic.ts +273 -0
- package/src/utils/oauth/api-key-login.ts +87 -0
- package/src/utils/oauth/api-key-validation.ts +92 -0
- package/src/utils/oauth/callback-server.ts +276 -0
- package/src/utils/oauth/cerebras.ts +16 -0
- package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
- package/src/utils/oauth/cursor.ts +157 -0
- package/src/utils/oauth/deepseek.ts +53 -0
- package/src/utils/oauth/firepass.ts +24 -0
- package/src/utils/oauth/fireworks.ts +15 -0
- package/src/utils/oauth/github-copilot.ts +362 -0
- package/src/utils/oauth/gitlab-duo.ts +123 -0
- package/src/utils/oauth/google-antigravity.ts +200 -0
- package/src/utils/oauth/google-gemini-cli.ts +256 -0
- package/src/utils/oauth/google-oauth-shared.ts +110 -0
- package/src/utils/oauth/huggingface.ts +62 -0
- package/src/utils/oauth/index.ts +502 -0
- package/src/utils/oauth/kagi.ts +47 -0
- package/src/utils/oauth/kilo.ts +87 -0
- package/src/utils/oauth/kimi.ts +254 -0
- package/src/utils/oauth/litellm.ts +47 -0
- package/src/utils/oauth/lm-studio.ts +38 -0
- package/src/utils/oauth/minimax-code.ts +80 -0
- package/src/utils/oauth/moonshot.ts +23 -0
- package/src/utils/oauth/nanogpt.ts +15 -0
- package/src/utils/oauth/nvidia.ts +70 -0
- package/src/utils/oauth/oauth.html +199 -0
- package/src/utils/oauth/ollama-cloud.ts +28 -0
- package/src/utils/oauth/ollama.ts +47 -0
- package/src/utils/oauth/openai-codex.ts +299 -0
- package/src/utils/oauth/opencode.ts +49 -0
- package/src/utils/oauth/openrouter.ts +20 -0
- package/src/utils/oauth/parallel.ts +46 -0
- package/src/utils/oauth/perplexity.ts +206 -0
- package/src/utils/oauth/pkce.ts +18 -0
- package/src/utils/oauth/qianfan.ts +58 -0
- package/src/utils/oauth/qwen-portal.ts +60 -0
- package/src/utils/oauth/synthetic.ts +15 -0
- package/src/utils/oauth/tavily.ts +46 -0
- package/src/utils/oauth/together.ts +16 -0
- package/src/utils/oauth/types.ts +102 -0
- package/src/utils/oauth/venice.ts +59 -0
- package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
- package/src/utils/oauth/vllm.ts +40 -0
- package/src/utils/oauth/wafer.ts +50 -0
- package/src/utils/oauth/xai-oauth.ts +342 -0
- package/src/utils/oauth/xiaomi.ts +194 -0
- package/src/utils/oauth/zai.ts +60 -0
- package/src/utils/oauth/zenmux.ts +15 -0
- package/src/utils/oauth/zhipu.ts +60 -0
- package/src/utils/overflow.ts +137 -0
- package/src/utils/parse-bind.ts +54 -0
- package/src/utils/provider-response.ts +30 -0
- package/src/utils/request-debug.ts +336 -0
- package/src/utils/retry-after.ts +110 -0
- package/src/utils/retry.ts +54 -0
- package/src/utils/schema/CONSTRAINTS.md +164 -0
- package/src/utils/schema/adapt.ts +36 -0
- package/src/utils/schema/compatibility.ts +435 -0
- package/src/utils/schema/dereference.ts +98 -0
- package/src/utils/schema/draft.ts +341 -0
- package/src/utils/schema/equality.ts +97 -0
- package/src/utils/schema/fields.ts +191 -0
- package/src/utils/schema/index.ts +13 -0
- package/src/utils/schema/json-schema-validator.ts +577 -0
- package/src/utils/schema/meta-validator.ts +167 -0
- package/src/utils/schema/normalize.ts +1588 -0
- package/src/utils/schema/spill.ts +43 -0
- package/src/utils/schema/stamps.ts +97 -0
- package/src/utils/schema/types.ts +10 -0
- package/src/utils/schema/wire.ts +293 -0
- package/src/utils/schema/zod-decontaminate.ts +331 -0
- package/src/utils/sdk-stream-timeout.ts +43 -0
- package/src/utils/sse-debug.ts +289 -0
- package/src/utils/stream-markup-healing.ts +612 -0
- package/src/utils/tool-choice.ts +99 -0
- package/src/utils/validation.ts +1024 -0
- package/src/utils.ts +166 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { getAntigravityUserAgent } from "../providers/google-gemini-headers";
|
|
2
|
+
import type {
|
|
3
|
+
UsageAmount,
|
|
4
|
+
UsageFetchContext,
|
|
5
|
+
UsageFetchParams,
|
|
6
|
+
UsageLimit,
|
|
7
|
+
UsageProvider,
|
|
8
|
+
UsageReport,
|
|
9
|
+
UsageStatus,
|
|
10
|
+
UsageWindow,
|
|
11
|
+
} from "../usage";
|
|
12
|
+
|
|
13
|
+
// (Refresh is the sole responsibility of AuthStorage; no provider-direct refresh here.)
|
|
14
|
+
|
|
15
|
+
interface AntigravityQuotaInfo {
|
|
16
|
+
remainingFraction?: number;
|
|
17
|
+
resetTime?: string;
|
|
18
|
+
tier?: string;
|
|
19
|
+
windowId?: string;
|
|
20
|
+
windowLabel?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface AntigravityModelInfo {
|
|
24
|
+
displayName?: string;
|
|
25
|
+
quotaInfo?: AntigravityQuotaInfo | AntigravityQuotaInfo[];
|
|
26
|
+
quotaInfos?: AntigravityQuotaInfo[];
|
|
27
|
+
quotaInfoByTier?: Record<string, AntigravityQuotaInfo | AntigravityQuotaInfo[]>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
interface AntigravityUsageResponse {
|
|
31
|
+
models: Record<string, AntigravityModelInfo>;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const DEFAULT_ENDPOINT = "https://daily-cloudcode-pa.googleapis.com";
|
|
35
|
+
const FETCH_AVAILABLE_MODELS_PATH = "/v1internal:fetchAvailableModels";
|
|
36
|
+
|
|
37
|
+
function clampFraction(value: number | undefined): number | undefined {
|
|
38
|
+
if (value === undefined || !Number.isFinite(value)) return undefined;
|
|
39
|
+
if (value < 0) return 0;
|
|
40
|
+
if (value > 1) return 1;
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function getUsageStatus(remainingFraction: number | undefined): UsageStatus | undefined {
|
|
45
|
+
if (remainingFraction === undefined) return "unknown";
|
|
46
|
+
if (remainingFraction <= 0) return "exhausted";
|
|
47
|
+
if (remainingFraction <= 0.1) return "warning";
|
|
48
|
+
return "ok";
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function parseWindow(info: AntigravityQuotaInfo): UsageWindow | undefined {
|
|
52
|
+
if (!info.resetTime) return undefined;
|
|
53
|
+
const resetAt = Date.parse(info.resetTime);
|
|
54
|
+
if (!Number.isFinite(resetAt)) return undefined;
|
|
55
|
+
return {
|
|
56
|
+
id: info.windowId ?? "default",
|
|
57
|
+
label: info.windowLabel ?? "Default",
|
|
58
|
+
resetsAt: resetAt,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function buildAmount(info: AntigravityQuotaInfo): UsageAmount {
|
|
63
|
+
const remainingFraction = clampFraction(info.remainingFraction);
|
|
64
|
+
const amount: UsageAmount = { unit: "percent" };
|
|
65
|
+
if (remainingFraction === undefined) return amount;
|
|
66
|
+
const usedFraction = clampFraction(1 - remainingFraction);
|
|
67
|
+
amount.remainingFraction = remainingFraction;
|
|
68
|
+
amount.usedFraction = usedFraction;
|
|
69
|
+
amount.remaining = remainingFraction * 100;
|
|
70
|
+
amount.used = usedFraction !== undefined ? usedFraction * 100 : undefined;
|
|
71
|
+
amount.limit = 100;
|
|
72
|
+
return amount;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function normalizeQuotaInfos(info: AntigravityModelInfo): AntigravityQuotaInfo[] {
|
|
76
|
+
const results: AntigravityQuotaInfo[] = [];
|
|
77
|
+
const addInfo = (value: AntigravityQuotaInfo, tier?: string) => {
|
|
78
|
+
results.push({ ...value, ...(tier ? { tier } : {}) });
|
|
79
|
+
};
|
|
80
|
+
const addArray = (values?: AntigravityQuotaInfo[]) => {
|
|
81
|
+
if (!values) return;
|
|
82
|
+
for (const value of values) addInfo(value);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
if (Array.isArray(info.quotaInfo)) {
|
|
86
|
+
addArray(info.quotaInfo);
|
|
87
|
+
} else if (info.quotaInfo) {
|
|
88
|
+
addInfo(info.quotaInfo);
|
|
89
|
+
}
|
|
90
|
+
addArray(info.quotaInfos);
|
|
91
|
+
|
|
92
|
+
if (info.quotaInfoByTier) {
|
|
93
|
+
for (const [tier, value] of Object.entries(info.quotaInfoByTier)) {
|
|
94
|
+
if (Array.isArray(value)) {
|
|
95
|
+
for (const entry of value) addInfo(entry, tier);
|
|
96
|
+
} else if (value) {
|
|
97
|
+
addInfo(value, tier);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return results;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Return the OAuth access token to use against `/v1internal:*`. AuthStorage is
|
|
107
|
+
* the sole refresh authority (broker-aware, single-flighted, rotation-safe);
|
|
108
|
+
* an expired token short-circuits the probe rather than POSTing the broker
|
|
109
|
+
* sentinel back to Google.
|
|
110
|
+
*/
|
|
111
|
+
function resolveAccessToken(params: UsageFetchParams): string | undefined {
|
|
112
|
+
const { credential } = params;
|
|
113
|
+
if (!credential.accessToken) return undefined;
|
|
114
|
+
if (credential.expiresAt !== undefined && credential.expiresAt <= Date.now()) {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
return credential.accessToken;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async function fetchAntigravityUsage(params: UsageFetchParams, ctx: UsageFetchContext): Promise<UsageReport | null> {
|
|
121
|
+
const credential = params.credential;
|
|
122
|
+
if (!credential.projectId) return null;
|
|
123
|
+
|
|
124
|
+
const nowMs = Date.now();
|
|
125
|
+
|
|
126
|
+
const accessToken = resolveAccessToken(params);
|
|
127
|
+
if (!accessToken) return null;
|
|
128
|
+
|
|
129
|
+
const baseUrl = params.baseUrl?.replace(/\/+$/, "") || DEFAULT_ENDPOINT;
|
|
130
|
+
const url = `${baseUrl}${FETCH_AVAILABLE_MODELS_PATH}`;
|
|
131
|
+
const response = await ctx.fetch(url, {
|
|
132
|
+
method: "POST",
|
|
133
|
+
headers: {
|
|
134
|
+
Authorization: `Bearer ${accessToken}`,
|
|
135
|
+
"Content-Type": "application/json",
|
|
136
|
+
"User-Agent": getAntigravityUserAgent(),
|
|
137
|
+
},
|
|
138
|
+
body: JSON.stringify({ project: credential.projectId }),
|
|
139
|
+
signal: params.signal,
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
if (!response.ok) {
|
|
143
|
+
ctx.logger?.warn("Antigravity usage fetch failed", {
|
|
144
|
+
status: response.status,
|
|
145
|
+
statusText: response.statusText,
|
|
146
|
+
});
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const data = (await response.json()) as AntigravityUsageResponse;
|
|
151
|
+
const limits: UsageLimit[] = [];
|
|
152
|
+
let earliestReset: number | undefined;
|
|
153
|
+
|
|
154
|
+
for (const [modelId, modelInfo] of Object.entries(data.models ?? {})) {
|
|
155
|
+
const quotaInfos = normalizeQuotaInfos(modelInfo);
|
|
156
|
+
for (const quotaInfo of quotaInfos) {
|
|
157
|
+
const amount = buildAmount(quotaInfo);
|
|
158
|
+
const window = parseWindow(quotaInfo);
|
|
159
|
+
if (window?.resetsAt) {
|
|
160
|
+
earliestReset = earliestReset ? Math.min(earliestReset, window.resetsAt) : window.resetsAt;
|
|
161
|
+
}
|
|
162
|
+
const labelBase = modelInfo.displayName || modelId;
|
|
163
|
+
const label = quotaInfo.tier ? `${labelBase} (${quotaInfo.tier})` : labelBase;
|
|
164
|
+
const windowId = window?.id ?? "default";
|
|
165
|
+
limits.push({
|
|
166
|
+
id: `${modelId}:${quotaInfo.tier ?? "default"}:${windowId}`,
|
|
167
|
+
label,
|
|
168
|
+
scope: {
|
|
169
|
+
provider: params.provider,
|
|
170
|
+
accountId: credential.accountId,
|
|
171
|
+
projectId: credential.projectId,
|
|
172
|
+
modelId,
|
|
173
|
+
tier: quotaInfo.tier,
|
|
174
|
+
windowId,
|
|
175
|
+
},
|
|
176
|
+
window,
|
|
177
|
+
amount,
|
|
178
|
+
status: getUsageStatus(amount.remainingFraction),
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const report: UsageReport = {
|
|
184
|
+
provider: params.provider,
|
|
185
|
+
fetchedAt: nowMs,
|
|
186
|
+
limits,
|
|
187
|
+
metadata: {
|
|
188
|
+
endpoint: url,
|
|
189
|
+
projectId: credential.projectId,
|
|
190
|
+
},
|
|
191
|
+
raw: data,
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
return report;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export const antigravityUsageProvider: UsageProvider = {
|
|
198
|
+
id: "google-antigravity",
|
|
199
|
+
fetchUsage: fetchAntigravityUsage,
|
|
200
|
+
supports: params => params.provider === "google-antigravity",
|
|
201
|
+
};
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { $env } from "@prometheus-ai/utils";
|
|
2
|
+
import type {
|
|
3
|
+
UsageAmount,
|
|
4
|
+
UsageFetchContext,
|
|
5
|
+
UsageFetchParams,
|
|
6
|
+
UsageLimit,
|
|
7
|
+
UsageProvider,
|
|
8
|
+
UsageReport,
|
|
9
|
+
UsageStatus,
|
|
10
|
+
UsageWindow,
|
|
11
|
+
} from "../usage";
|
|
12
|
+
import { isRecord } from "../utils";
|
|
13
|
+
import { getKimiCommonHeaders } from "../utils/oauth/kimi";
|
|
14
|
+
// (Refresh is the sole responsibility of AuthStorage; no provider-direct refresh here.)
|
|
15
|
+
import { toNumber } from "./shared";
|
|
16
|
+
|
|
17
|
+
const DEFAULT_BASE_URL = "https://api.kimi.com/coding/v1";
|
|
18
|
+
const USAGE_PATH = "usages";
|
|
19
|
+
|
|
20
|
+
interface KimiUsagePayload {
|
|
21
|
+
usage?: unknown;
|
|
22
|
+
limits?: unknown;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
type KimiUsageRow = {
|
|
26
|
+
label: string;
|
|
27
|
+
used?: number;
|
|
28
|
+
limit?: number;
|
|
29
|
+
remaining?: number;
|
|
30
|
+
resetsAt?: number;
|
|
31
|
+
window?: UsageWindow;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
function normalizeBaseUrl(baseUrl?: string): string {
|
|
35
|
+
const envBase = $env.KIMI_CODE_BASE_URL?.trim();
|
|
36
|
+
const candidate = baseUrl?.trim() || envBase || DEFAULT_BASE_URL;
|
|
37
|
+
return candidate.replace(/\/+$/, "");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function buildUsageUrl(baseUrl: string): string {
|
|
41
|
+
const normalized = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
42
|
+
return `${normalized}${USAGE_PATH}`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function parseResetTime(data: Record<string, unknown>, nowMs: number): number | undefined {
|
|
46
|
+
const timeKeys = ["reset_at", "resetAt", "reset_time", "resetTime"] as const;
|
|
47
|
+
for (const key of timeKeys) {
|
|
48
|
+
const value = data[key];
|
|
49
|
+
if (typeof value === "string" && value.trim()) {
|
|
50
|
+
const parsed = Date.parse(value);
|
|
51
|
+
if (Number.isFinite(parsed)) return parsed;
|
|
52
|
+
}
|
|
53
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
54
|
+
return value > 1_000_000_000_000 ? value : value * 1000;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const secondsKeys = ["reset_in", "resetIn", "ttl", "window"] as const;
|
|
59
|
+
for (const key of secondsKeys) {
|
|
60
|
+
const seconds = toNumber(data[key]);
|
|
61
|
+
if (seconds !== undefined) return nowMs + seconds * 1000;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function formatDurationLabel(duration: number, timeUnit: string): string | undefined {
|
|
68
|
+
const upper = timeUnit.toUpperCase();
|
|
69
|
+
if (upper.includes("MINUTE")) {
|
|
70
|
+
if (duration >= 60 && duration % 60 === 0) return `${duration / 60}h limit`;
|
|
71
|
+
return `${duration}m limit`;
|
|
72
|
+
}
|
|
73
|
+
if (upper.includes("HOUR")) return `${duration}h limit`;
|
|
74
|
+
if (upper.includes("DAY")) return `${duration}d limit`;
|
|
75
|
+
if (upper.includes("SECOND")) return `${duration}s limit`;
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function buildWindow(windowData: Record<string, unknown>, nowMs: number): UsageWindow | undefined {
|
|
80
|
+
const duration = toNumber(windowData.duration);
|
|
81
|
+
const timeUnit = typeof windowData.timeUnit === "string" ? windowData.timeUnit : "";
|
|
82
|
+
const label = duration !== undefined && timeUnit ? formatDurationLabel(duration, timeUnit) : undefined;
|
|
83
|
+
const resetsAt = parseResetTime(windowData, nowMs);
|
|
84
|
+
|
|
85
|
+
if (duration === undefined && !label && !resetsAt) return undefined;
|
|
86
|
+
let durationMs: number | undefined;
|
|
87
|
+
if (duration !== undefined) {
|
|
88
|
+
if (timeUnit.toUpperCase().includes("MINUTE")) durationMs = duration * 60_000;
|
|
89
|
+
else if (timeUnit.toUpperCase().includes("HOUR")) durationMs = duration * 3_600_000;
|
|
90
|
+
else if (timeUnit.toUpperCase().includes("DAY")) durationMs = duration * 86_400_000;
|
|
91
|
+
else if (timeUnit.toUpperCase().includes("SECOND")) durationMs = duration * 1000;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return {
|
|
95
|
+
id: duration !== undefined && timeUnit ? `${duration}${timeUnit.toLowerCase()}` : "default",
|
|
96
|
+
label: label ?? "Usage window",
|
|
97
|
+
durationMs,
|
|
98
|
+
resetsAt,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function buildUsageRow(data: Record<string, unknown>, defaultLabel: string, nowMs: number): KimiUsageRow | null {
|
|
103
|
+
const limit = toNumber(data.limit);
|
|
104
|
+
let used = toNumber(data.used);
|
|
105
|
+
const remaining = toNumber(data.remaining);
|
|
106
|
+
if (used === undefined && remaining !== undefined && limit !== undefined) {
|
|
107
|
+
used = limit - remaining;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (used === undefined && limit === undefined) return null;
|
|
111
|
+
const resetsAt = parseResetTime(data, nowMs);
|
|
112
|
+
return {
|
|
113
|
+
label:
|
|
114
|
+
typeof data.name === "string" && data.name
|
|
115
|
+
? data.name
|
|
116
|
+
: typeof data.title === "string" && data.title
|
|
117
|
+
? data.title
|
|
118
|
+
: defaultLabel,
|
|
119
|
+
used,
|
|
120
|
+
limit,
|
|
121
|
+
remaining,
|
|
122
|
+
resetsAt,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function buildUsageAmount(row: KimiUsageRow): UsageAmount {
|
|
127
|
+
const amount: UsageAmount = { unit: "unknown" };
|
|
128
|
+
if (row.limit !== undefined) amount.limit = row.limit;
|
|
129
|
+
if (row.used !== undefined) amount.used = row.used;
|
|
130
|
+
if (row.remaining !== undefined) amount.remaining = row.remaining;
|
|
131
|
+
if (row.limit !== undefined && row.used !== undefined && row.limit > 0) {
|
|
132
|
+
amount.usedFraction = Math.min(Math.max(row.used / row.limit, 0), 1);
|
|
133
|
+
amount.remainingFraction = Math.min(Math.max((row.limit - row.used) / row.limit, 0), 1);
|
|
134
|
+
amount.remaining = amount.remaining ?? row.limit - row.used;
|
|
135
|
+
}
|
|
136
|
+
return amount;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function buildUsageStatus(amount: UsageAmount): UsageStatus {
|
|
140
|
+
if (amount.usedFraction === undefined) return "unknown";
|
|
141
|
+
if (amount.usedFraction >= 1) return "exhausted";
|
|
142
|
+
if (amount.usedFraction >= 0.9) return "warning";
|
|
143
|
+
return "ok";
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function toUsageLimit(row: KimiUsageRow, provider: string, index: number, accountId?: string): UsageLimit {
|
|
147
|
+
const window: UsageWindow | undefined =
|
|
148
|
+
row.window ??
|
|
149
|
+
(row.resetsAt
|
|
150
|
+
? {
|
|
151
|
+
id: "default",
|
|
152
|
+
label: "Usage window",
|
|
153
|
+
resetsAt: row.resetsAt,
|
|
154
|
+
}
|
|
155
|
+
: undefined);
|
|
156
|
+
|
|
157
|
+
const amount = buildUsageAmount(row);
|
|
158
|
+
return {
|
|
159
|
+
id: `${provider}:${index}`,
|
|
160
|
+
label: row.label,
|
|
161
|
+
scope: {
|
|
162
|
+
provider,
|
|
163
|
+
accountId,
|
|
164
|
+
windowId: window?.id,
|
|
165
|
+
shared: true,
|
|
166
|
+
},
|
|
167
|
+
window,
|
|
168
|
+
amount,
|
|
169
|
+
status: buildUsageStatus(amount),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function parseUsagePayload(payload: unknown, nowMs: number): { rows: KimiUsageRow[]; raw: KimiUsagePayload } | null {
|
|
174
|
+
if (!isRecord(payload)) return null;
|
|
175
|
+
const data = payload as KimiUsagePayload;
|
|
176
|
+
const rows: KimiUsageRow[] = [];
|
|
177
|
+
|
|
178
|
+
if (isRecord(data.usage)) {
|
|
179
|
+
const summary = buildUsageRow(data.usage, "Total quota", nowMs);
|
|
180
|
+
if (summary) rows.push(summary);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (Array.isArray(data.limits)) {
|
|
184
|
+
data.limits.forEach((item, idx) => {
|
|
185
|
+
if (!isRecord(item)) return;
|
|
186
|
+
const detail = isRecord(item.detail) ? item.detail : item;
|
|
187
|
+
const windowData = isRecord(item.window) ? item.window : {};
|
|
188
|
+
const label =
|
|
189
|
+
(typeof item.name === "string" && item.name) ||
|
|
190
|
+
(typeof item.title === "string" && item.title) ||
|
|
191
|
+
(typeof item.scope === "string" && item.scope) ||
|
|
192
|
+
(typeof detail.name === "string" && detail.name) ||
|
|
193
|
+
(typeof detail.title === "string" && detail.title) ||
|
|
194
|
+
formatDurationLabel(toNumber(windowData.duration) ?? 0, String(windowData.timeUnit || "")) ||
|
|
195
|
+
`Limit #${idx + 1}`;
|
|
196
|
+
const row = buildUsageRow(detail, label, nowMs);
|
|
197
|
+
if (row) {
|
|
198
|
+
row.window = buildWindow(windowData, nowMs);
|
|
199
|
+
rows.push(row);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return { rows, raw: data };
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export const kimiUsageProvider: UsageProvider = {
|
|
208
|
+
id: "kimi-code",
|
|
209
|
+
supports(params: UsageFetchParams): boolean {
|
|
210
|
+
return params.provider === "kimi-code" && params.credential.type === "oauth";
|
|
211
|
+
},
|
|
212
|
+
async fetchUsage(params: UsageFetchParams, ctx: UsageFetchContext): Promise<UsageReport | null> {
|
|
213
|
+
if (params.provider !== "kimi-code") return null;
|
|
214
|
+
const { credential } = params;
|
|
215
|
+
if (credential.type !== "oauth") return null;
|
|
216
|
+
|
|
217
|
+
const accessToken = credential.accessToken;
|
|
218
|
+
if (!accessToken) return null;
|
|
219
|
+
|
|
220
|
+
const nowMs = Date.now();
|
|
221
|
+
// AuthStorage refreshes OAuth credentials pre-emptively (60s skew). If the
|
|
222
|
+
// usage probe lands with an expired token, short-circuit rather than POST
|
|
223
|
+
// the broker sentinel back to Kimi — the next cycle will carry a freshly
|
|
224
|
+
// refreshed credential.
|
|
225
|
+
if (credential.expiresAt !== undefined && credential.expiresAt <= nowMs) {
|
|
226
|
+
ctx.logger?.debug("Kimi usage token expired; skipping probe", { provider: params.provider });
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const baseUrl = normalizeBaseUrl(params.baseUrl);
|
|
231
|
+
const url = buildUsageUrl(baseUrl);
|
|
232
|
+
let payload: unknown;
|
|
233
|
+
try {
|
|
234
|
+
const response = await ctx.fetch(url, {
|
|
235
|
+
headers: {
|
|
236
|
+
...getKimiCommonHeaders(),
|
|
237
|
+
Authorization: `Bearer ${accessToken}`,
|
|
238
|
+
},
|
|
239
|
+
signal: params.signal,
|
|
240
|
+
});
|
|
241
|
+
if (!response.ok) {
|
|
242
|
+
ctx.logger?.warn("Kimi usage request failed", { status: response.status, provider: params.provider });
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
payload = await response.json();
|
|
246
|
+
} catch (error) {
|
|
247
|
+
ctx.logger?.warn("Kimi usage request error", { provider: params.provider, error: String(error) });
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const parsed = parseUsagePayload(payload, nowMs);
|
|
252
|
+
if (!parsed || parsed.rows.length === 0) {
|
|
253
|
+
ctx.logger?.warn("Kimi usage response invalid", { provider: params.provider });
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const limits = parsed.rows.map((row, index) => toUsageLimit(row, params.provider, index, credential.accountId));
|
|
258
|
+
|
|
259
|
+
const report: UsageReport = {
|
|
260
|
+
provider: params.provider,
|
|
261
|
+
fetchedAt: nowMs,
|
|
262
|
+
limits,
|
|
263
|
+
metadata: {
|
|
264
|
+
endpoint: url,
|
|
265
|
+
},
|
|
266
|
+
raw: parsed.raw,
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
return report;
|
|
270
|
+
},
|
|
271
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { UsageFetchContext, UsageFetchParams, UsageProvider, UsageReport } from "../usage";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* MiniMax Coding Plan usage provider.
|
|
5
|
+
*
|
|
6
|
+
* MiniMax Coding Plan is a subscription-based service with a 5-hour rolling window
|
|
7
|
+
* quota system. The quota resets automatically based on a rolling window.
|
|
8
|
+
*
|
|
9
|
+
* Currently, MiniMax does not expose a usage/quota API endpoint for the Coding Plan.
|
|
10
|
+
* Usage is tracked via the web dashboard at https://platform.minimax.io/user-center/payment/coding-plan
|
|
11
|
+
*
|
|
12
|
+
* This provider exists to register support for the minimax-code provider in the
|
|
13
|
+
* usage system. When MiniMax adds a usage API, this can be implemented.
|
|
14
|
+
*/
|
|
15
|
+
async function fetchMiniMaxCodeUsage(params: UsageFetchParams, _ctx: UsageFetchContext): Promise<UsageReport | null> {
|
|
16
|
+
if (params.provider !== "minimax-code" && params.provider !== "minimax-code-cn") {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// MiniMax Coding Plan does not currently expose a usage API
|
|
21
|
+
// Users can check their usage via the web dashboard
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const minimaxCodeUsageProvider: UsageProvider = {
|
|
26
|
+
id: "minimax-code",
|
|
27
|
+
fetchUsage: fetchMiniMaxCodeUsage,
|
|
28
|
+
supports: (params: UsageFetchParams) =>
|
|
29
|
+
(params.provider === "minimax-code" || params.provider === "minimax-code-cn") &&
|
|
30
|
+
params.credential.type === "api_key",
|
|
31
|
+
};
|