@m5kdev/commons 0.26.5 → 0.27.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/dist/src/modules/ai/ai.constants.cjs +10 -322
- package/dist/src/modules/ai/ai.constants.cjs.map +1 -1
- package/dist/src/modules/ai/ai.constants.d.cts +5 -53
- package/dist/src/modules/ai/ai.constants.d.mts +5 -53
- package/dist/src/modules/ai/ai.constants.mjs +9 -279
- package/dist/src/modules/ai/ai.constants.mjs.map +1 -1
- package/dist/src/modules/ai/ai.models.contsants.cjs +758 -0
- package/dist/src/modules/ai/ai.models.contsants.cjs.map +1 -0
- package/dist/src/modules/ai/ai.models.contsants.d.cts +7 -0
- package/dist/src/modules/ai/ai.models.contsants.d.mts +7 -0
- package/dist/src/modules/ai/ai.models.contsants.mjs +757 -0
- package/dist/src/modules/ai/ai.models.contsants.mjs.map +1 -0
- package/dist/src/modules/ai/ai.types.cjs +0 -0
- package/dist/src/modules/ai/ai.types.d.cts +18 -0
- package/dist/src/modules/ai/ai.types.d.mts +18 -0
- package/dist/src/modules/ai/ai.types.mjs +1 -0
- package/dist/src/modules/ai/ai.utils.cjs +164 -0
- package/dist/src/modules/ai/ai.utils.cjs.map +1 -1
- package/dist/src/modules/ai/ai.utils.d.cts +23 -1
- package/dist/src/modules/ai/ai.utils.d.mts +23 -1
- package/dist/src/modules/ai/ai.utils.mjs +157 -1
- package/dist/src/modules/ai/ai.utils.mjs.map +1 -1
- package/dist/src/modules/recurrence/recurrence.schema.d.cts +2 -2
- package/dist/src/modules/recurrence/recurrence.schema.d.mts +2 -2
- package/dist/src/modules/schemas/query.schema.d.cts +6 -6
- package/dist/src/modules/schemas/query.schema.d.mts +6 -6
- package/dist/src/modules/tag/tag.schema.d.cts +2 -2
- package/dist/src/modules/tag/tag.schema.d.mts +2 -2
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.models.contsants.mjs","names":[],"sources":["../../../../src/modules/ai/ai.models.contsants.ts"],"sourcesContent":["import type { RankedModel } from \"./ai.types\";\r\n\r\nexport const RANKED_MODELS: RankedModel[] = [\r\n {\r\n id: \"openai/gpt-5.6-sol-pro\",\r\n inputCost: 5,\r\n outputCost: 30,\r\n speed: 3.35,\r\n quality: {\r\n structured_output: 9.72,\r\n creative: 8.85,\r\n research: 9.92,\r\n chat: 9.62,\r\n tool_use: 9.82,\r\n planning: 9.95,\r\n classification: 9.42,\r\n },\r\n },\r\n {\r\n id: \"openai/gpt-5.6-sol\",\r\n inputCost: 5,\r\n outputCost: 30,\r\n speed: 3.85,\r\n quality: {\r\n structured_output: 9.66,\r\n creative: 8.78,\r\n research: 9.88,\r\n chat: 9.58,\r\n tool_use: 9.74,\r\n planning: 9.9,\r\n classification: 9.38,\r\n },\r\n },\r\n {\r\n id: \"anthropic/claude-fable-5\",\r\n inputCost: 10,\r\n outputCost: 50,\r\n speed: 3.15,\r\n quality: {\r\n structured_output: 8.82,\r\n creative: 9.95,\r\n research: 9.98,\r\n chat: 9.95,\r\n tool_use: 9.9,\r\n planning: 9.96,\r\n classification: 9.35,\r\n },\r\n },\r\n {\r\n id: \"anthropic/claude-opus-4.8\",\r\n inputCost: 5,\r\n outputCost: 25,\r\n speed: 3.25,\r\n quality: {\r\n structured_output: 9.18,\r\n creative: 9.72,\r\n research: 9.72,\r\n chat: 9.68,\r\n tool_use: 9.42,\r\n planning: 9.58,\r\n classification: 9.28,\r\n },\r\n },\r\n {\r\n id: \"anthropic/claude-opus-4.7\",\r\n inputCost: 5,\r\n outputCost: 25,\r\n speed: 3.15,\r\n quality: {\r\n structured_output: 9.92,\r\n creative: 9.55,\r\n research: 9.32,\r\n chat: 9.55,\r\n tool_use: 9.28,\r\n planning: 9.32,\r\n classification: 9.2,\r\n },\r\n },\r\n {\r\n id: \"anthropic/claude-opus-4.6\",\r\n inputCost: 5,\r\n outputCost: 25,\r\n speed: 3.05,\r\n quality: {\r\n structured_output: 9.58,\r\n creative: 9.42,\r\n research: 9.18,\r\n chat: 9.52,\r\n tool_use: 9.16,\r\n planning: 9.22,\r\n classification: 9.08,\r\n },\r\n },\r\n {\r\n id: \"anthropic/claude-sonnet-5\",\r\n inputCost: 2,\r\n outputCost: 10,\r\n speed: 6.85,\r\n quality: {\r\n structured_output: 9.86,\r\n creative: 9.82,\r\n research: 9.48,\r\n chat: 9.86,\r\n tool_use: 9.76,\r\n planning: 9.82,\r\n classification: 9.32,\r\n },\r\n },\r\n {\r\n id: \"anthropic/claude-sonnet-4.6\",\r\n inputCost: 3,\r\n outputCost: 15,\r\n speed: 5.85,\r\n quality: {\r\n structured_output: 9.62,\r\n creative: 9.15,\r\n research: 9.08,\r\n chat: 9.2,\r\n tool_use: 9.05,\r\n planning: 9.12,\r\n classification: 8.92,\r\n },\r\n },\r\n {\r\n id: \"anthropic/claude-haiku-4.5\",\r\n inputCost: 1,\r\n outputCost: 5,\r\n speed: 9.05,\r\n quality: {\r\n structured_output: 8.35,\r\n creative: 8.15,\r\n research: 7.75,\r\n chat: 8.25,\r\n tool_use: 8.42,\r\n planning: 7.8,\r\n classification: 8.62,\r\n },\r\n },\r\n {\r\n id: \"google/gemini-3.1-pro-preview\",\r\n inputCost: 2,\r\n outputCost: 12,\r\n speed: 6.05,\r\n quality: {\r\n structured_output: 9.99,\r\n creative: 9.35,\r\n research: 9.66,\r\n chat: 9.48,\r\n tool_use: 9.45,\r\n planning: 9.34,\r\n classification: 9.76,\r\n },\r\n },\r\n {\r\n id: \"google/gemini-3.5-flash\",\r\n inputCost: 1.5,\r\n outputCost: 9,\r\n speed: 8.72,\r\n quality: {\r\n structured_output: 9.77,\r\n creative: 8.1,\r\n research: 8.42,\r\n chat: 8.18,\r\n tool_use: 8.72,\r\n planning: 8.35,\r\n classification: 9.18,\r\n },\r\n },\r\n {\r\n id: \"google/gemini-3-flash-preview\",\r\n inputCost: 0.5,\r\n outputCost: 3,\r\n speed: 8.9,\r\n quality: {\r\n structured_output: 9.32,\r\n creative: 8.2,\r\n research: 8.48,\r\n chat: 8.22,\r\n tool_use: 9.12,\r\n planning: 8.48,\r\n classification: 9.16,\r\n },\r\n },\r\n {\r\n id: \"google/gemini-3.1-flash-lite-preview\",\r\n inputCost: 0.25,\r\n outputCost: 1.5,\r\n speed: 9.72,\r\n quality: {\r\n structured_output: 8.55,\r\n creative: 7.35,\r\n research: 7.72,\r\n chat: 7.55,\r\n tool_use: 8.36,\r\n planning: 7.58,\r\n classification: 8.92,\r\n },\r\n },\r\n {\r\n id: \"google/gemini-2.5-pro\",\r\n inputCost: 1.25,\r\n outputCost: 10,\r\n speed: 5.9,\r\n quality: {\r\n structured_output: 9.72,\r\n creative: 9.18,\r\n research: 9.12,\r\n chat: 9.05,\r\n tool_use: 8.82,\r\n planning: 8.78,\r\n classification: 9.18,\r\n },\r\n },\r\n {\r\n id: \"google/gemini-2.5-flash\",\r\n inputCost: 0.3,\r\n outputCost: 2.5,\r\n speed: 9.55,\r\n quality: {\r\n structured_output: 9.84,\r\n creative: 7.92,\r\n research: 8.35,\r\n chat: 7.95,\r\n tool_use: 8.46,\r\n planning: 8.22,\r\n classification: 9.28,\r\n },\r\n },\r\n {\r\n id: \"openai/gpt-5.6-terra-pro\",\r\n inputCost: 2.5,\r\n outputCost: 15,\r\n speed: 5.25,\r\n quality: {\r\n structured_output: 9.55,\r\n creative: 8.68,\r\n research: 9.36,\r\n chat: 9.22,\r\n tool_use: 9.18,\r\n planning: 9.18,\r\n classification: 9.35,\r\n },\r\n },\r\n {\r\n id: \"openai/gpt-5.6-terra\",\r\n inputCost: 2.5,\r\n outputCost: 15,\r\n speed: 5.95,\r\n quality: {\r\n structured_output: 9.38,\r\n creative: 8.52,\r\n research: 9.18,\r\n chat: 9.08,\r\n tool_use: 8.86,\r\n planning: 9.05,\r\n classification: 9.28,\r\n },\r\n },\r\n {\r\n id: \"openai/gpt-5.6-luna-pro\",\r\n inputCost: 1,\r\n outputCost: 6,\r\n speed: 7.95,\r\n quality: {\r\n structured_output: 9.25,\r\n creative: 7.92,\r\n research: 8.78,\r\n chat: 8.55,\r\n tool_use: 8.62,\r\n planning: 8.42,\r\n classification: 9.18,\r\n },\r\n },\r\n {\r\n id: \"openai/gpt-5.6-luna\",\r\n inputCost: 1,\r\n outputCost: 6,\r\n speed: 8.7,\r\n quality: {\r\n structured_output: 9.18,\r\n creative: 7.82,\r\n research: 8.68,\r\n chat: 8.48,\r\n tool_use: 8.48,\r\n planning: 8.32,\r\n classification: 9.12,\r\n },\r\n },\r\n {\r\n id: \"openai/gpt-5.5\",\r\n inputCost: 5,\r\n outputCost: 30,\r\n speed: 4.8,\r\n quality: {\r\n structured_output: 9.82,\r\n creative: 9.42,\r\n research: 9.76,\r\n chat: 9.78,\r\n tool_use: 8.86,\r\n planning: 9.48,\r\n classification: 9.42,\r\n },\r\n },\r\n {\r\n id: \"openai/gpt-5.4\",\r\n inputCost: 2.5,\r\n outputCost: 15,\r\n speed: 5.9,\r\n quality: {\r\n structured_output: 10,\r\n creative: 9.25,\r\n research: 9.18,\r\n chat: 9.35,\r\n tool_use: 8.72,\r\n planning: 8.88,\r\n classification: 9.86,\r\n },\r\n },\r\n {\r\n id: \"openai/gpt-5.4-mini\",\r\n inputCost: 0.75,\r\n outputCost: 4.5,\r\n speed: 8.85,\r\n quality: {\r\n structured_output: 9.5,\r\n creative: 8.22,\r\n research: 7.9,\r\n chat: 8.28,\r\n tool_use: 8.35,\r\n planning: 8.12,\r\n classification: 9.18,\r\n },\r\n },\r\n {\r\n id: \"openai/gpt-5\",\r\n inputCost: 2.5,\r\n outputCost: 15,\r\n speed: 4.95,\r\n quality: {\r\n structured_output: 9.56,\r\n creative: 8.55,\r\n research: 9.05,\r\n chat: 9.02,\r\n tool_use: 8.55,\r\n planning: 8.62,\r\n classification: 9.28,\r\n },\r\n },\r\n {\r\n id: \"openai/gpt-5-mini\",\r\n inputCost: 0.75,\r\n outputCost: 4.5,\r\n speed: 8.7,\r\n quality: {\r\n structured_output: 9.12,\r\n creative: 7.65,\r\n research: 7.72,\r\n chat: 8.05,\r\n tool_use: 8.22,\r\n planning: 7.88,\r\n classification: 9.08,\r\n },\r\n },\r\n {\r\n id: \"openai/gpt-4.1\",\r\n inputCost: 2,\r\n outputCost: 8,\r\n speed: 6.85,\r\n quality: {\r\n structured_output: 9.62,\r\n creative: 8.45,\r\n research: 8.65,\r\n chat: 8.72,\r\n tool_use: 8.42,\r\n planning: 8.38,\r\n classification: 9.16,\r\n },\r\n },\r\n {\r\n id: \"z-ai/glm-5.2\",\r\n inputCost: 0.8694,\r\n outputCost: 2.7324,\r\n speed: 6.45,\r\n quality: {\r\n structured_output: 9.8,\r\n creative: 8.78,\r\n research: 9.28,\r\n chat: 8.62,\r\n tool_use: 9.22,\r\n planning: 9.25,\r\n classification: 9.38,\r\n },\r\n },\r\n {\r\n id: \"z-ai/glm-5.1\",\r\n inputCost: 0.966,\r\n outputCost: 3.036,\r\n speed: 6.85,\r\n quality: {\r\n structured_output: 9.96,\r\n creative: 8.72,\r\n research: 9.22,\r\n chat: 8.75,\r\n tool_use: 8.62,\r\n planning: 9.12,\r\n classification: 9.42,\r\n },\r\n },\r\n {\r\n id: \"z-ai/glm-5v-turbo\",\r\n inputCost: 1.2,\r\n outputCost: 4,\r\n speed: 6.05,\r\n quality: {\r\n structured_output: 8.35,\r\n creative: 7.05,\r\n research: 8.18,\r\n chat: 7.25,\r\n tool_use: 8.35,\r\n planning: 8.18,\r\n classification: 7.85,\r\n },\r\n },\r\n {\r\n id: \"z-ai/glm-4.7\",\r\n inputCost: 0.4,\r\n outputCost: 1.75,\r\n speed: 7.85,\r\n quality: {\r\n structured_output: 9.88,\r\n creative: 7.68,\r\n research: 8.25,\r\n chat: 7.82,\r\n tool_use: 7.88,\r\n planning: 8.08,\r\n classification: 9.32,\r\n },\r\n },\r\n {\r\n id: \"moonshotai/kimi-k2.6\",\r\n inputCost: 0.66,\r\n outputCost: 3.41,\r\n speed: 6.95,\r\n quality: {\r\n structured_output: 9.58,\r\n creative: 8.45,\r\n research: 8.55,\r\n chat: 8.42,\r\n tool_use: 8.55,\r\n planning: 8.58,\r\n classification: 8.62,\r\n },\r\n },\r\n {\r\n id: \"deepseek/deepseek-v4-pro\",\r\n inputCost: 0.435,\r\n outputCost: 0.87,\r\n speed: 7.05,\r\n quality: {\r\n structured_output: 9.58,\r\n creative: 7.62,\r\n research: 8.78,\r\n chat: 8.55,\r\n tool_use: 8.02,\r\n planning: 8.72,\r\n classification: 9.1,\r\n },\r\n },\r\n {\r\n id: \"deepseek/deepseek-v4-flash\",\r\n inputCost: 0.15,\r\n outputCost: 0.45,\r\n speed: 9.25,\r\n quality: {\r\n structured_output: 8.9,\r\n creative: 6.92,\r\n research: 8.25,\r\n chat: 7.45,\r\n tool_use: 7.82,\r\n planning: 8.05,\r\n classification: 8.62,\r\n },\r\n },\r\n {\r\n id: \"deepseek/deepseek-r1-distill-qwen-32b\",\r\n inputCost: 0.2,\r\n outputCost: 0.8,\r\n speed: 6.9,\r\n quality: {\r\n structured_output: 8.65,\r\n creative: 6.55,\r\n research: 7.55,\r\n chat: 7.25,\r\n tool_use: 6.85,\r\n planning: 7.42,\r\n classification: 7.92,\r\n },\r\n },\r\n {\r\n id: \"qwen/qwen3.6-plus\",\r\n inputCost: 0.325,\r\n outputCost: 1.95,\r\n speed: 7.95,\r\n quality: {\r\n structured_output: 8.72,\r\n creative: 7.42,\r\n research: 7.95,\r\n chat: 7.72,\r\n tool_use: 8.38,\r\n planning: 8.05,\r\n classification: 8.58,\r\n },\r\n },\r\n {\r\n id: \"qwen/qwen3.5-35b-a3b\",\r\n inputCost: 0.14,\r\n outputCost: 1,\r\n speed: 8.95,\r\n quality: {\r\n structured_output: 9.88,\r\n creative: 7.28,\r\n research: 7.92,\r\n chat: 7.75,\r\n tool_use: 7.78,\r\n planning: 7.88,\r\n classification: 8.78,\r\n },\r\n },\r\n {\r\n id: \"qwen/qwen3.5-27b\",\r\n inputCost: 0.195,\r\n outputCost: 1.56,\r\n speed: 8.15,\r\n quality: {\r\n structured_output: 9.54,\r\n creative: 7.18,\r\n research: 7.65,\r\n chat: 7.52,\r\n tool_use: 7.62,\r\n planning: 7.58,\r\n classification: 8.48,\r\n },\r\n },\r\n {\r\n id: \"qwen/qwen3.5-122b-a10b\",\r\n inputCost: 0.4,\r\n outputCost: 2.4,\r\n speed: 6.25,\r\n quality: {\r\n structured_output: 9.32,\r\n creative: 7.35,\r\n research: 8.42,\r\n chat: 8.25,\r\n tool_use: 8.18,\r\n planning: 8.28,\r\n classification: 8.65,\r\n },\r\n },\r\n {\r\n id: \"qwen/qwen3-235b-a22b\",\r\n inputCost: 0.455,\r\n outputCost: 1.82,\r\n speed: 5.15,\r\n quality: {\r\n structured_output: 9.74,\r\n creative: 7.42,\r\n research: 8.58,\r\n chat: 8.35,\r\n tool_use: 7.88,\r\n planning: 8.42,\r\n classification: 8.7,\r\n },\r\n },\r\n {\r\n id: \"qwen/qwen3-235b-a22b-thinking-2507\",\r\n inputCost: 0.1495,\r\n outputCost: 1.495,\r\n speed: 5.35,\r\n quality: {\r\n structured_output: 9.76,\r\n creative: 7.45,\r\n research: 8.62,\r\n chat: 8.38,\r\n tool_use: 7.92,\r\n planning: 8.48,\r\n classification: 8.72,\r\n },\r\n },\r\n {\r\n id: \"qwen/qwen3-30b-a3b-instruct-2507\",\r\n inputCost: 0.1,\r\n outputCost: 0.3,\r\n speed: 9.1,\r\n quality: {\r\n structured_output: 8.82,\r\n creative: 6.35,\r\n research: 6.88,\r\n chat: 6.72,\r\n tool_use: 6.85,\r\n planning: 6.82,\r\n classification: 8.18,\r\n },\r\n },\r\n {\r\n id: \"qwen/qwen3-coder\",\r\n inputCost: 0.08,\r\n outputCost: 0.28,\r\n speed: 8.15,\r\n quality: {\r\n structured_output: 8.55,\r\n creative: 5.65,\r\n research: 6.85,\r\n chat: 6.55,\r\n tool_use: 8.62,\r\n planning: 7.75,\r\n classification: 7.82,\r\n },\r\n },\r\n {\r\n id: \"x-ai/grok-4.3\",\r\n inputCost: 1.25,\r\n outputCost: 2.5,\r\n speed: 7.75,\r\n quality: {\r\n structured_output: 8.3,\r\n creative: 7.72,\r\n research: 8.18,\r\n chat: 8.72,\r\n tool_use: 7.72,\r\n planning: 7.9,\r\n classification: 8.15,\r\n },\r\n },\r\n {\r\n id: \"inception/mercury-2\",\r\n inputCost: 0.25,\r\n outputCost: 0.75,\r\n speed: 10,\r\n quality: {\r\n structured_output: 8.05,\r\n creative: 5.35,\r\n research: 6.75,\r\n chat: 6.45,\r\n tool_use: 8.35,\r\n planning: 6.92,\r\n classification: 8.22,\r\n },\r\n },\r\n {\r\n id: \"nvidia/nemotron-3-nano-30b-a3b\",\r\n inputCost: 0.1,\r\n outputCost: 0.3,\r\n speed: 9.05,\r\n quality: {\r\n structured_output: 8.88,\r\n creative: 6.45,\r\n research: 6.82,\r\n chat: 6.75,\r\n tool_use: 7.28,\r\n planning: 6.85,\r\n classification: 8.28,\r\n },\r\n },\r\n {\r\n id: \"google/gemma-3-27b-it\",\r\n inputCost: 0.1,\r\n outputCost: 0.3,\r\n speed: 8.2,\r\n quality: {\r\n structured_output: 9.48,\r\n creative: 7.22,\r\n research: 6.82,\r\n chat: 7.35,\r\n tool_use: 6.72,\r\n planning: 6.82,\r\n classification: 7.98,\r\n },\r\n },\r\n {\r\n id: \"google/gemma-4-26b-a4b-it\",\r\n inputCost: 0.12,\r\n outputCost: 0.35,\r\n speed: 8.25,\r\n quality: {\r\n structured_output: 9.1,\r\n creative: 7.35,\r\n research: 7.05,\r\n chat: 7.42,\r\n tool_use: 6.88,\r\n planning: 6.95,\r\n classification: 8.05,\r\n },\r\n },\r\n {\r\n id: \"ibm/granite-4.0\",\r\n inputCost: 0.1,\r\n outputCost: 0.3,\r\n speed: 8.05,\r\n quality: {\r\n structured_output: 9.08,\r\n creative: 5.82,\r\n research: 6.55,\r\n chat: 6.42,\r\n tool_use: 6.58,\r\n planning: 6.48,\r\n classification: 8.18,\r\n },\r\n },\r\n {\r\n id: \"microsoft/phi-4\",\r\n inputCost: 0.15,\r\n outputCost: 0.6,\r\n speed: 8.05,\r\n quality: {\r\n structured_output: 9.06,\r\n creative: 6.62,\r\n research: 6.75,\r\n chat: 7.12,\r\n tool_use: 5.95,\r\n planning: 6.58,\r\n classification: 8.18,\r\n },\r\n },\r\n {\r\n id: \"mistralai/ministral-3-14b\",\r\n inputCost: 0.2,\r\n outputCost: 0.8,\r\n speed: 7.95,\r\n quality: {\r\n structured_output: 7.78,\r\n creative: 6.35,\r\n research: 6.45,\r\n chat: 6.55,\r\n tool_use: 6.35,\r\n planning: 6.32,\r\n classification: 7.55,\r\n },\r\n },\r\n {\r\n id: \"openai/gpt-oss-20b\",\r\n inputCost: 0.1,\r\n outputCost: 0.4,\r\n speed: 8.1,\r\n quality: {\r\n structured_output: 7.32,\r\n creative: 6.25,\r\n research: 6.38,\r\n chat: 6.48,\r\n tool_use: 6.28,\r\n planning: 6.25,\r\n classification: 7.45,\r\n },\r\n },\r\n] as const;\r\n"],"mappings":";AAEA,MAAa,gBAA+B;CAC1C;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACD;EACE,IAAI;EACJ,WAAW;EACX,YAAY;EACZ,OAAO;EACP,SAAS;GACP,mBAAmB;GACnB,UAAU;GACV,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;GACjB;EACF;CACF"}
|
|
File without changes
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//#region src/modules/ai/ai.types.d.ts
|
|
2
|
+
interface RankedModel {
|
|
3
|
+
id: string;
|
|
4
|
+
inputCost: number;
|
|
5
|
+
outputCost: number;
|
|
6
|
+
quality: Record<Category, number>;
|
|
7
|
+
speed: number;
|
|
8
|
+
}
|
|
9
|
+
type Category = "structured_output" | "creative" | "research" | "chat" | "tool_use" | "planning" | "classification";
|
|
10
|
+
type SortType = "quality" | "price" | "speed";
|
|
11
|
+
type TokenProfile = {
|
|
12
|
+
inputTokens: number;
|
|
13
|
+
outputTokens: number;
|
|
14
|
+
};
|
|
15
|
+
type TokenSize = "xs" | "sm" | "md" | "lg" | "xl";
|
|
16
|
+
//#endregion
|
|
17
|
+
export { Category, RankedModel, SortType, TokenProfile, TokenSize };
|
|
18
|
+
//# sourceMappingURL=ai.types.d.cts.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//#region src/modules/ai/ai.types.d.ts
|
|
2
|
+
interface RankedModel {
|
|
3
|
+
id: string;
|
|
4
|
+
inputCost: number;
|
|
5
|
+
outputCost: number;
|
|
6
|
+
quality: Record<Category, number>;
|
|
7
|
+
speed: number;
|
|
8
|
+
}
|
|
9
|
+
type Category = "structured_output" | "creative" | "research" | "chat" | "tool_use" | "planning" | "classification";
|
|
10
|
+
type SortType = "quality" | "price" | "speed";
|
|
11
|
+
type TokenProfile = {
|
|
12
|
+
inputTokens: number;
|
|
13
|
+
outputTokens: number;
|
|
14
|
+
};
|
|
15
|
+
type TokenSize = "xs" | "sm" | "md" | "lg" | "xl";
|
|
16
|
+
//#endregion
|
|
17
|
+
export { Category, RankedModel, SortType, TokenProfile, TokenSize };
|
|
18
|
+
//# sourceMappingURL=ai.types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,9 +1,173 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_src_modules_ai_ai_models_contsants = require("./ai.models.contsants.cjs");
|
|
3
|
+
const require_src_modules_ai_ai_constants = require("./ai.constants.cjs");
|
|
2
4
|
//#region src/modules/ai/ai.utils.ts
|
|
5
|
+
function getDefaultTokenProfile(category) {
|
|
6
|
+
switch (category) {
|
|
7
|
+
case "structured_output": return {
|
|
8
|
+
inputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS.lg,
|
|
9
|
+
outputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS.md
|
|
10
|
+
};
|
|
11
|
+
case "creative": return {
|
|
12
|
+
inputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS.md,
|
|
13
|
+
outputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS.lg
|
|
14
|
+
};
|
|
15
|
+
case "research": return {
|
|
16
|
+
inputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS.xl,
|
|
17
|
+
outputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS.xl
|
|
18
|
+
};
|
|
19
|
+
case "chat": return {
|
|
20
|
+
inputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS.sm,
|
|
21
|
+
outputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS.md
|
|
22
|
+
};
|
|
23
|
+
case "tool_use": return {
|
|
24
|
+
inputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS.md,
|
|
25
|
+
outputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS.sm
|
|
26
|
+
};
|
|
27
|
+
case "planning": return {
|
|
28
|
+
inputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS.lg,
|
|
29
|
+
outputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS.lg
|
|
30
|
+
};
|
|
31
|
+
case "classification": return {
|
|
32
|
+
inputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS.sm,
|
|
33
|
+
outputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS.xs
|
|
34
|
+
};
|
|
35
|
+
default: return {
|
|
36
|
+
inputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS.md,
|
|
37
|
+
outputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS.md
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function getDefaultWeights(weights) {
|
|
42
|
+
if (Array.isArray(weights)) return weights.every((weight) => typeof weight === "number") ? weights : weights.reduce((acc, weight, index) => {
|
|
43
|
+
switch (weight) {
|
|
44
|
+
case "quality":
|
|
45
|
+
acc[0] = index === 0 ? 50 : index === 1 ? 30 : 20;
|
|
46
|
+
break;
|
|
47
|
+
case "price":
|
|
48
|
+
acc[1] = index === 0 ? 50 : index === 1 ? 30 : 20;
|
|
49
|
+
break;
|
|
50
|
+
case "speed":
|
|
51
|
+
acc[2] = index === 0 ? 50 : index === 1 ? 30 : 20;
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
return acc;
|
|
55
|
+
}, [
|
|
56
|
+
20,
|
|
57
|
+
50,
|
|
58
|
+
30
|
|
59
|
+
]);
|
|
60
|
+
switch (weights) {
|
|
61
|
+
case "quality": return [
|
|
62
|
+
50,
|
|
63
|
+
30,
|
|
64
|
+
20
|
|
65
|
+
];
|
|
66
|
+
case "price": return [
|
|
67
|
+
20,
|
|
68
|
+
50,
|
|
69
|
+
30
|
|
70
|
+
];
|
|
71
|
+
case "speed": return [
|
|
72
|
+
20,
|
|
73
|
+
30,
|
|
74
|
+
50
|
|
75
|
+
];
|
|
76
|
+
default: return [
|
|
77
|
+
50,
|
|
78
|
+
25,
|
|
79
|
+
25
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function weightsToPriceSensitivity(weights) {
|
|
84
|
+
const [qualityWeight, priceWeight, speedWeight] = weights;
|
|
85
|
+
const total = qualityWeight + priceWeight + speedWeight;
|
|
86
|
+
if (total <= 0) return 1;
|
|
87
|
+
const normalizedPriceWeight = priceWeight / total;
|
|
88
|
+
const min = .55;
|
|
89
|
+
const max = 1.75;
|
|
90
|
+
const sensitivity = max - normalizedPriceWeight * (max - min);
|
|
91
|
+
return Number(sensitivity.toFixed(3));
|
|
92
|
+
}
|
|
93
|
+
function addPriceScores(models, profile, priceSensitivity = 1) {
|
|
94
|
+
const costs = models.map((model) => {
|
|
95
|
+
return profile.inputTokens / 1e6 * model.inputCost + profile.outputTokens / 1e6 * model.outputCost;
|
|
96
|
+
});
|
|
97
|
+
const cheapest = Math.min(...costs);
|
|
98
|
+
const mostExpensive = Math.max(...costs);
|
|
99
|
+
return models.map((model, index) => {
|
|
100
|
+
const cost = costs[index];
|
|
101
|
+
if (mostExpensive === cheapest) return {
|
|
102
|
+
...model,
|
|
103
|
+
estimatedCost: cost,
|
|
104
|
+
price: 10
|
|
105
|
+
};
|
|
106
|
+
const safeCheapest = Math.max(cheapest, Number.EPSILON);
|
|
107
|
+
const safeCost = Math.max(cost, Number.EPSILON);
|
|
108
|
+
const safeMostExpensive = Math.max(mostExpensive, Number.EPSILON);
|
|
109
|
+
const logMin = Math.log(safeCheapest);
|
|
110
|
+
const logMax = Math.log(safeMostExpensive);
|
|
111
|
+
const normalized = ((Math.log(safeCost) - logMin) / (logMax - logMin)) ** priceSensitivity;
|
|
112
|
+
return {
|
|
113
|
+
...model,
|
|
114
|
+
estimatedCost: cost,
|
|
115
|
+
price: Math.round(10 - normalized * 9)
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
function clampScore(value) {
|
|
120
|
+
return Math.max(1, Math.min(10, value));
|
|
121
|
+
}
|
|
122
|
+
function shapeScoreByWeight(value, weight, maxWeight) {
|
|
123
|
+
const normalized = clampScore(value) / 10;
|
|
124
|
+
if (maxWeight <= 0 || weight <= 0) return 0;
|
|
125
|
+
const importance = (weight / maxWeight) ** 2;
|
|
126
|
+
const expanded = normalized ** 2 * 10;
|
|
127
|
+
const compressed = 8 + normalized * 2;
|
|
128
|
+
return compressed + (expanded - compressed) * importance;
|
|
129
|
+
}
|
|
130
|
+
function rankModels(models, profile, category, weights) {
|
|
131
|
+
const scoredModels = addPriceScores(models, profile, weightsToPriceSensitivity(weights));
|
|
132
|
+
const [qualityWeight, priceWeight, speedWeight] = weights;
|
|
133
|
+
const maxWeight = Math.max(qualityWeight, priceWeight, speedWeight);
|
|
134
|
+
return scoredModels.map((model) => {
|
|
135
|
+
const qualityScore = shapeScoreByWeight(model.quality[category], qualityWeight, maxWeight);
|
|
136
|
+
const priceScore = shapeScoreByWeight(model.price, priceWeight, maxWeight);
|
|
137
|
+
const speedScore = shapeScoreByWeight(model.speed, speedWeight, maxWeight);
|
|
138
|
+
return {
|
|
139
|
+
...model,
|
|
140
|
+
score: qualityScore * qualityWeight + priceScore * priceWeight + speedScore * speedWeight
|
|
141
|
+
};
|
|
142
|
+
}).sort((a, b) => b.score - a.score);
|
|
143
|
+
}
|
|
144
|
+
function getSortedRankedModel(models, category = "chat", weights, tokenProfile) {
|
|
145
|
+
return rankModels(models, typeof tokenProfile === "string" ? {
|
|
146
|
+
inputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS[tokenProfile],
|
|
147
|
+
outputTokens: require_src_modules_ai_ai_constants.TOKEN_PRESETS[tokenProfile]
|
|
148
|
+
} : typeof tokenProfile === "number" ? {
|
|
149
|
+
inputTokens: tokenProfile,
|
|
150
|
+
outputTokens: tokenProfile
|
|
151
|
+
} : tokenProfile ? tokenProfile : getDefaultTokenProfile(category), category, getDefaultWeights(weights));
|
|
152
|
+
}
|
|
153
|
+
function getSortedRecommendedModels(category = "chat", weights, tokenProfile) {
|
|
154
|
+
return getSortedRankedModel(require_src_modules_ai_ai_models_contsants.RANKED_MODELS, category, weights, tokenProfile);
|
|
155
|
+
}
|
|
156
|
+
function getSortedRecommendedModelIds(category = "chat", weights, tokenProfile) {
|
|
157
|
+
return getSortedRankedModel(require_src_modules_ai_ai_models_contsants.RANKED_MODELS, category, weights, tokenProfile).map((model) => model.id);
|
|
158
|
+
}
|
|
3
159
|
function arrayToPseudoXML(array, keys, name = "item") {
|
|
4
160
|
return array.map((item) => `<${name}>${keys.map((key) => `<${String(key)}>${String(item[key])}</${String(key)}>`).join("\n")}</${name}>`).join("\n");
|
|
5
161
|
}
|
|
6
162
|
//#endregion
|
|
163
|
+
exports.addPriceScores = addPriceScores;
|
|
7
164
|
exports.arrayToPseudoXML = arrayToPseudoXML;
|
|
165
|
+
exports.getDefaultTokenProfile = getDefaultTokenProfile;
|
|
166
|
+
exports.getDefaultWeights = getDefaultWeights;
|
|
167
|
+
exports.getSortedRankedModel = getSortedRankedModel;
|
|
168
|
+
exports.getSortedRecommendedModelIds = getSortedRecommendedModelIds;
|
|
169
|
+
exports.getSortedRecommendedModels = getSortedRecommendedModels;
|
|
170
|
+
exports.rankModels = rankModels;
|
|
171
|
+
exports.weightsToPriceSensitivity = weightsToPriceSensitivity;
|
|
8
172
|
|
|
9
173
|
//# sourceMappingURL=ai.utils.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.utils.cjs","names":[],"sources":["../../../../src/modules/ai/ai.utils.ts"],"sourcesContent":["export function arrayToPseudoXML<T extends Record<string, unknown>>(\r\n array: readonly T[],\r\n keys: readonly (keyof T)[],\r\n name = \"item\"\r\n): string {\r\n return array\r\n .map(\r\n (item) =>\r\n `<${name}>${keys\r\n .map((key) => `<${String(key)}>${String(item[key])}</${String(key)}>`)\r\n .join(\"\\n\")}</${name}>`\r\n )\r\n .join(\"\\n\");\r\n}\r\n"],"mappings":";;AAAA,SAAgB,iBACd,OACA,MACA,OAAO,QACC;AACR,QAAO,MACJ,KACE,SACC,IAAI,KAAK,GAAG,KACT,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,GAAG,OAAO,KAAK,KAAK,CAAC,IAAI,OAAO,IAAI,CAAC,GAAG,CACrE,KAAK,KAAK,CAAC,IAAI,KAAK,GAC1B,CACA,KAAK,KAAK"}
|
|
1
|
+
{"version":3,"file":"ai.utils.cjs","names":["TOKEN_PRESETS","RANKED_MODELS"],"sources":["../../../../src/modules/ai/ai.utils.ts"],"sourcesContent":["import { RANKED_MODELS, TOKEN_PRESETS } from \"./ai.constants\";\r\nimport type { Category, RankedModel, SortType, TokenProfile, TokenSize } from \"./ai.types\";\r\n\r\nexport function getDefaultTokenProfile(category: Category): TokenProfile {\r\n switch (category) {\r\n case \"structured_output\":\r\n return { inputTokens: TOKEN_PRESETS.lg, outputTokens: TOKEN_PRESETS.md };\r\n case \"creative\":\r\n return { inputTokens: TOKEN_PRESETS.md, outputTokens: TOKEN_PRESETS.lg };\r\n case \"research\":\r\n return { inputTokens: TOKEN_PRESETS.xl, outputTokens: TOKEN_PRESETS.xl };\r\n case \"chat\":\r\n return { inputTokens: TOKEN_PRESETS.sm, outputTokens: TOKEN_PRESETS.md };\r\n case \"tool_use\":\r\n return { inputTokens: TOKEN_PRESETS.md, outputTokens: TOKEN_PRESETS.sm };\r\n case \"planning\":\r\n return { inputTokens: TOKEN_PRESETS.lg, outputTokens: TOKEN_PRESETS.lg };\r\n case \"classification\":\r\n return { inputTokens: TOKEN_PRESETS.sm, outputTokens: TOKEN_PRESETS.xs };\r\n default:\r\n return { inputTokens: TOKEN_PRESETS.md, outputTokens: TOKEN_PRESETS.md };\r\n }\r\n}\r\n\r\nexport function getDefaultWeights(\r\n weights?: SortType | [SortType, SortType, SortType] | [number, number, number]\r\n): [number, number, number] {\r\n if (Array.isArray(weights)) {\r\n return weights.every((weight) => typeof weight === \"number\")\r\n ? weights\r\n : weights.reduce<[number, number, number]>(\r\n (acc, weight, index) => {\r\n switch (weight) {\r\n case \"quality\":\r\n acc[0] = index === 0 ? 50 : index === 1 ? 30 : 20;\r\n break;\r\n case \"price\":\r\n acc[1] = index === 0 ? 50 : index === 1 ? 30 : 20;\r\n break;\r\n case \"speed\":\r\n acc[2] = index === 0 ? 50 : index === 1 ? 30 : 20;\r\n break;\r\n }\r\n return acc;\r\n },\r\n [20, 50, 30]\r\n );\r\n }\r\n switch (weights) {\r\n case \"quality\":\r\n return [50, 30, 20];\r\n case \"price\":\r\n return [20, 50, 30];\r\n case \"speed\":\r\n return [20, 30, 50];\r\n default:\r\n return [50, 25, 25];\r\n }\r\n}\r\n\r\nexport function weightsToPriceSensitivity(weights: [number, number, number]): number {\r\n const [qualityWeight, priceWeight, speedWeight] = weights;\r\n\r\n const total = qualityWeight + priceWeight + speedWeight;\r\n\r\n if (total <= 0) {\r\n return 1;\r\n }\r\n\r\n const normalizedPriceWeight = priceWeight / total;\r\n\r\n const min = 0.55; // very price-sensitive\r\n const max = 1.75; // price is soft / secondary\r\n\r\n // Higher price weight -> lower exponent -> stronger price penalty.\r\n const sensitivity = max - normalizedPriceWeight * (max - min);\r\n\r\n return Number(sensitivity.toFixed(3));\r\n}\r\n\r\nexport function addPriceScores(\r\n models: RankedModel[],\r\n profile: TokenProfile,\r\n priceSensitivity = 1\r\n): Array<RankedModel & { price: number; estimatedCost: number }> {\r\n const costs = models.map((model) => {\r\n return (\r\n (profile.inputTokens / 1_000_000) * model.inputCost +\r\n (profile.outputTokens / 1_000_000) * model.outputCost\r\n );\r\n });\r\n\r\n const cheapest = Math.min(...costs);\r\n const mostExpensive = Math.max(...costs);\r\n\r\n return models.map((model, index) => {\r\n const cost = costs[index];\r\n\r\n if (mostExpensive === cheapest) {\r\n return {\r\n ...model,\r\n estimatedCost: cost,\r\n price: 10,\r\n };\r\n }\r\n\r\n const safeCheapest = Math.max(cheapest, Number.EPSILON);\r\n const safeCost = Math.max(cost, Number.EPSILON);\r\n const safeMostExpensive = Math.max(mostExpensive, Number.EPSILON);\r\n\r\n const logMin = Math.log(safeCheapest);\r\n const logMax = Math.log(safeMostExpensive);\r\n const logCost = Math.log(safeCost);\r\n\r\n const normalizedRaw = (logCost - logMin) / (logMax - logMin);\r\n\r\n // < 1 makes price matter less.\r\n // > 1 makes price matter more.\r\n const normalized = normalizedRaw ** priceSensitivity;\r\n\r\n return {\r\n ...model,\r\n estimatedCost: cost,\r\n price: Math.round(10 - normalized * 9),\r\n };\r\n });\r\n}\r\n\r\nfunction clampScore(value: number): number {\r\n return Math.max(1, Math.min(10, value));\r\n}\r\n\r\nfunction shapeScoreByWeight(value: number, weight: number, maxWeight: number): number {\r\n const score = clampScore(value);\r\n const normalized = score / 10;\r\n\r\n if (maxWeight <= 0 || weight <= 0) {\r\n return 0;\r\n }\r\n\r\n const importance = (weight / maxWeight) ** 2;\r\n const expanded = normalized ** 2 * 10;\r\n const compressed = 8 + normalized * 2;\r\n return compressed + (expanded - compressed) * importance;\r\n}\r\n\r\nexport function rankModels(\r\n models: RankedModel[],\r\n profile: TokenProfile,\r\n category: Category,\r\n weights: [number, number, number]\r\n) {\r\n const scoredModels = addPriceScores(models, profile, weightsToPriceSensitivity(weights));\r\n\r\n const [qualityWeight, priceWeight, speedWeight] = weights;\r\n const maxWeight = Math.max(qualityWeight, priceWeight, speedWeight);\r\n\r\n return scoredModels\r\n .map((model) => {\r\n const qualityScore = shapeScoreByWeight(model.quality[category], qualityWeight, maxWeight);\r\n\r\n const priceScore = shapeScoreByWeight(model.price, priceWeight, maxWeight);\r\n\r\n const speedScore = shapeScoreByWeight(model.speed, speedWeight, maxWeight);\r\n\r\n return {\r\n ...model,\r\n score: qualityScore * qualityWeight + priceScore * priceWeight + speedScore * speedWeight,\r\n };\r\n })\r\n .sort((a, b) => b.score - a.score);\r\n}\r\n\r\nexport function getSortedRankedModel(\r\n models: RankedModel[],\r\n category: Category = \"chat\",\r\n weights?: SortType | [SortType, SortType, SortType] | [number, number, number],\r\n tokenProfile?: TokenProfile | number | TokenSize\r\n): RankedModel[] {\r\n const profile =\r\n typeof tokenProfile === \"string\"\r\n ? {\r\n inputTokens: TOKEN_PRESETS[tokenProfile as TokenSize],\r\n outputTokens: TOKEN_PRESETS[tokenProfile as TokenSize],\r\n }\r\n : typeof tokenProfile === \"number\"\r\n ? { inputTokens: tokenProfile, outputTokens: tokenProfile }\r\n : tokenProfile\r\n ? (tokenProfile as TokenProfile)\r\n : getDefaultTokenProfile(category);\r\n return rankModels(models, profile, category, getDefaultWeights(weights));\r\n}\r\n\r\nexport function getSortedRecommendedModels(\r\n category: Category = \"chat\",\r\n weights?: SortType | [SortType, SortType, SortType] | [number, number, number],\r\n tokenProfile?: TokenProfile | number | TokenSize\r\n): RankedModel[] {\r\n return getSortedRankedModel(RANKED_MODELS, category, weights, tokenProfile);\r\n}\r\n\r\nexport function getSortedRecommendedModelIds(\r\n category: Category = \"chat\",\r\n weights?: SortType | [SortType, SortType, SortType] | [number, number, number],\r\n tokenProfile?: TokenProfile | number | TokenSize\r\n): string[] {\r\n return getSortedRankedModel(RANKED_MODELS, category, weights, tokenProfile).map(\r\n (model) => model.id\r\n );\r\n}\r\n\r\nexport function arrayToPseudoXML<T extends Record<string, unknown>>(\r\n array: readonly T[],\r\n keys: readonly (keyof T)[],\r\n name = \"item\"\r\n): string {\r\n return array\r\n .map(\r\n (item) =>\r\n `<${name}>${keys\r\n .map((key) => `<${String(key)}>${String(item[key])}</${String(key)}>`)\r\n .join(\"\\n\")}</${name}>`\r\n )\r\n .join(\"\\n\");\r\n}\r\n"],"mappings":"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"}
|
|
@@ -1,5 +1,27 @@
|
|
|
1
|
+
import { Category, RankedModel, SortType, TokenProfile, TokenSize } from "./ai.types.cjs";
|
|
2
|
+
|
|
1
3
|
//#region src/modules/ai/ai.utils.d.ts
|
|
4
|
+
declare function getDefaultTokenProfile(category: Category): TokenProfile;
|
|
5
|
+
declare function getDefaultWeights(weights?: SortType | [SortType, SortType, SortType] | [number, number, number]): [number, number, number];
|
|
6
|
+
declare function weightsToPriceSensitivity(weights: [number, number, number]): number;
|
|
7
|
+
declare function addPriceScores(models: RankedModel[], profile: TokenProfile, priceSensitivity?: number): Array<RankedModel & {
|
|
8
|
+
price: number;
|
|
9
|
+
estimatedCost: number;
|
|
10
|
+
}>;
|
|
11
|
+
declare function rankModels(models: RankedModel[], profile: TokenProfile, category: Category, weights: [number, number, number]): {
|
|
12
|
+
score: number;
|
|
13
|
+
id: string;
|
|
14
|
+
inputCost: number;
|
|
15
|
+
outputCost: number;
|
|
16
|
+
quality: Record<Category, number>;
|
|
17
|
+
speed: number;
|
|
18
|
+
price: number;
|
|
19
|
+
estimatedCost: number;
|
|
20
|
+
}[];
|
|
21
|
+
declare function getSortedRankedModel(models: RankedModel[], category?: Category, weights?: SortType | [SortType, SortType, SortType] | [number, number, number], tokenProfile?: TokenProfile | number | TokenSize): RankedModel[];
|
|
22
|
+
declare function getSortedRecommendedModels(category?: Category, weights?: SortType | [SortType, SortType, SortType] | [number, number, number], tokenProfile?: TokenProfile | number | TokenSize): RankedModel[];
|
|
23
|
+
declare function getSortedRecommendedModelIds(category?: Category, weights?: SortType | [SortType, SortType, SortType] | [number, number, number], tokenProfile?: TokenProfile | number | TokenSize): string[];
|
|
2
24
|
declare function arrayToPseudoXML<T extends Record<string, unknown>>(array: readonly T[], keys: readonly (keyof T)[], name?: string): string;
|
|
3
25
|
//#endregion
|
|
4
|
-
export { arrayToPseudoXML };
|
|
26
|
+
export { addPriceScores, arrayToPseudoXML, getDefaultTokenProfile, getDefaultWeights, getSortedRankedModel, getSortedRecommendedModelIds, getSortedRecommendedModels, rankModels, weightsToPriceSensitivity };
|
|
5
27
|
//# sourceMappingURL=ai.utils.d.cts.map
|
|
@@ -1,5 +1,27 @@
|
|
|
1
|
+
import { Category, RankedModel, SortType, TokenProfile, TokenSize } from "./ai.types.mjs";
|
|
2
|
+
|
|
1
3
|
//#region src/modules/ai/ai.utils.d.ts
|
|
4
|
+
declare function getDefaultTokenProfile(category: Category): TokenProfile;
|
|
5
|
+
declare function getDefaultWeights(weights?: SortType | [SortType, SortType, SortType] | [number, number, number]): [number, number, number];
|
|
6
|
+
declare function weightsToPriceSensitivity(weights: [number, number, number]): number;
|
|
7
|
+
declare function addPriceScores(models: RankedModel[], profile: TokenProfile, priceSensitivity?: number): Array<RankedModel & {
|
|
8
|
+
price: number;
|
|
9
|
+
estimatedCost: number;
|
|
10
|
+
}>;
|
|
11
|
+
declare function rankModels(models: RankedModel[], profile: TokenProfile, category: Category, weights: [number, number, number]): {
|
|
12
|
+
score: number;
|
|
13
|
+
id: string;
|
|
14
|
+
inputCost: number;
|
|
15
|
+
outputCost: number;
|
|
16
|
+
quality: Record<Category, number>;
|
|
17
|
+
speed: number;
|
|
18
|
+
price: number;
|
|
19
|
+
estimatedCost: number;
|
|
20
|
+
}[];
|
|
21
|
+
declare function getSortedRankedModel(models: RankedModel[], category?: Category, weights?: SortType | [SortType, SortType, SortType] | [number, number, number], tokenProfile?: TokenProfile | number | TokenSize): RankedModel[];
|
|
22
|
+
declare function getSortedRecommendedModels(category?: Category, weights?: SortType | [SortType, SortType, SortType] | [number, number, number], tokenProfile?: TokenProfile | number | TokenSize): RankedModel[];
|
|
23
|
+
declare function getSortedRecommendedModelIds(category?: Category, weights?: SortType | [SortType, SortType, SortType] | [number, number, number], tokenProfile?: TokenProfile | number | TokenSize): string[];
|
|
2
24
|
declare function arrayToPseudoXML<T extends Record<string, unknown>>(array: readonly T[], keys: readonly (keyof T)[], name?: string): string;
|
|
3
25
|
//#endregion
|
|
4
|
-
export { arrayToPseudoXML };
|
|
26
|
+
export { addPriceScores, arrayToPseudoXML, getDefaultTokenProfile, getDefaultWeights, getSortedRankedModel, getSortedRecommendedModelIds, getSortedRecommendedModels, rankModels, weightsToPriceSensitivity };
|
|
5
27
|
//# sourceMappingURL=ai.utils.d.mts.map
|
|
@@ -1,8 +1,164 @@
|
|
|
1
|
+
import { RANKED_MODELS } from "./ai.models.contsants.mjs";
|
|
2
|
+
import { TOKEN_PRESETS } from "./ai.constants.mjs";
|
|
1
3
|
//#region src/modules/ai/ai.utils.ts
|
|
4
|
+
function getDefaultTokenProfile(category) {
|
|
5
|
+
switch (category) {
|
|
6
|
+
case "structured_output": return {
|
|
7
|
+
inputTokens: TOKEN_PRESETS.lg,
|
|
8
|
+
outputTokens: TOKEN_PRESETS.md
|
|
9
|
+
};
|
|
10
|
+
case "creative": return {
|
|
11
|
+
inputTokens: TOKEN_PRESETS.md,
|
|
12
|
+
outputTokens: TOKEN_PRESETS.lg
|
|
13
|
+
};
|
|
14
|
+
case "research": return {
|
|
15
|
+
inputTokens: TOKEN_PRESETS.xl,
|
|
16
|
+
outputTokens: TOKEN_PRESETS.xl
|
|
17
|
+
};
|
|
18
|
+
case "chat": return {
|
|
19
|
+
inputTokens: TOKEN_PRESETS.sm,
|
|
20
|
+
outputTokens: TOKEN_PRESETS.md
|
|
21
|
+
};
|
|
22
|
+
case "tool_use": return {
|
|
23
|
+
inputTokens: TOKEN_PRESETS.md,
|
|
24
|
+
outputTokens: TOKEN_PRESETS.sm
|
|
25
|
+
};
|
|
26
|
+
case "planning": return {
|
|
27
|
+
inputTokens: TOKEN_PRESETS.lg,
|
|
28
|
+
outputTokens: TOKEN_PRESETS.lg
|
|
29
|
+
};
|
|
30
|
+
case "classification": return {
|
|
31
|
+
inputTokens: TOKEN_PRESETS.sm,
|
|
32
|
+
outputTokens: TOKEN_PRESETS.xs
|
|
33
|
+
};
|
|
34
|
+
default: return {
|
|
35
|
+
inputTokens: TOKEN_PRESETS.md,
|
|
36
|
+
outputTokens: TOKEN_PRESETS.md
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function getDefaultWeights(weights) {
|
|
41
|
+
if (Array.isArray(weights)) return weights.every((weight) => typeof weight === "number") ? weights : weights.reduce((acc, weight, index) => {
|
|
42
|
+
switch (weight) {
|
|
43
|
+
case "quality":
|
|
44
|
+
acc[0] = index === 0 ? 50 : index === 1 ? 30 : 20;
|
|
45
|
+
break;
|
|
46
|
+
case "price":
|
|
47
|
+
acc[1] = index === 0 ? 50 : index === 1 ? 30 : 20;
|
|
48
|
+
break;
|
|
49
|
+
case "speed":
|
|
50
|
+
acc[2] = index === 0 ? 50 : index === 1 ? 30 : 20;
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
return acc;
|
|
54
|
+
}, [
|
|
55
|
+
20,
|
|
56
|
+
50,
|
|
57
|
+
30
|
|
58
|
+
]);
|
|
59
|
+
switch (weights) {
|
|
60
|
+
case "quality": return [
|
|
61
|
+
50,
|
|
62
|
+
30,
|
|
63
|
+
20
|
|
64
|
+
];
|
|
65
|
+
case "price": return [
|
|
66
|
+
20,
|
|
67
|
+
50,
|
|
68
|
+
30
|
|
69
|
+
];
|
|
70
|
+
case "speed": return [
|
|
71
|
+
20,
|
|
72
|
+
30,
|
|
73
|
+
50
|
|
74
|
+
];
|
|
75
|
+
default: return [
|
|
76
|
+
50,
|
|
77
|
+
25,
|
|
78
|
+
25
|
|
79
|
+
];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function weightsToPriceSensitivity(weights) {
|
|
83
|
+
const [qualityWeight, priceWeight, speedWeight] = weights;
|
|
84
|
+
const total = qualityWeight + priceWeight + speedWeight;
|
|
85
|
+
if (total <= 0) return 1;
|
|
86
|
+
const normalizedPriceWeight = priceWeight / total;
|
|
87
|
+
const min = .55;
|
|
88
|
+
const max = 1.75;
|
|
89
|
+
const sensitivity = max - normalizedPriceWeight * (max - min);
|
|
90
|
+
return Number(sensitivity.toFixed(3));
|
|
91
|
+
}
|
|
92
|
+
function addPriceScores(models, profile, priceSensitivity = 1) {
|
|
93
|
+
const costs = models.map((model) => {
|
|
94
|
+
return profile.inputTokens / 1e6 * model.inputCost + profile.outputTokens / 1e6 * model.outputCost;
|
|
95
|
+
});
|
|
96
|
+
const cheapest = Math.min(...costs);
|
|
97
|
+
const mostExpensive = Math.max(...costs);
|
|
98
|
+
return models.map((model, index) => {
|
|
99
|
+
const cost = costs[index];
|
|
100
|
+
if (mostExpensive === cheapest) return {
|
|
101
|
+
...model,
|
|
102
|
+
estimatedCost: cost,
|
|
103
|
+
price: 10
|
|
104
|
+
};
|
|
105
|
+
const safeCheapest = Math.max(cheapest, Number.EPSILON);
|
|
106
|
+
const safeCost = Math.max(cost, Number.EPSILON);
|
|
107
|
+
const safeMostExpensive = Math.max(mostExpensive, Number.EPSILON);
|
|
108
|
+
const logMin = Math.log(safeCheapest);
|
|
109
|
+
const logMax = Math.log(safeMostExpensive);
|
|
110
|
+
const normalized = ((Math.log(safeCost) - logMin) / (logMax - logMin)) ** priceSensitivity;
|
|
111
|
+
return {
|
|
112
|
+
...model,
|
|
113
|
+
estimatedCost: cost,
|
|
114
|
+
price: Math.round(10 - normalized * 9)
|
|
115
|
+
};
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
function clampScore(value) {
|
|
119
|
+
return Math.max(1, Math.min(10, value));
|
|
120
|
+
}
|
|
121
|
+
function shapeScoreByWeight(value, weight, maxWeight) {
|
|
122
|
+
const normalized = clampScore(value) / 10;
|
|
123
|
+
if (maxWeight <= 0 || weight <= 0) return 0;
|
|
124
|
+
const importance = (weight / maxWeight) ** 2;
|
|
125
|
+
const expanded = normalized ** 2 * 10;
|
|
126
|
+
const compressed = 8 + normalized * 2;
|
|
127
|
+
return compressed + (expanded - compressed) * importance;
|
|
128
|
+
}
|
|
129
|
+
function rankModels(models, profile, category, weights) {
|
|
130
|
+
const scoredModels = addPriceScores(models, profile, weightsToPriceSensitivity(weights));
|
|
131
|
+
const [qualityWeight, priceWeight, speedWeight] = weights;
|
|
132
|
+
const maxWeight = Math.max(qualityWeight, priceWeight, speedWeight);
|
|
133
|
+
return scoredModels.map((model) => {
|
|
134
|
+
const qualityScore = shapeScoreByWeight(model.quality[category], qualityWeight, maxWeight);
|
|
135
|
+
const priceScore = shapeScoreByWeight(model.price, priceWeight, maxWeight);
|
|
136
|
+
const speedScore = shapeScoreByWeight(model.speed, speedWeight, maxWeight);
|
|
137
|
+
return {
|
|
138
|
+
...model,
|
|
139
|
+
score: qualityScore * qualityWeight + priceScore * priceWeight + speedScore * speedWeight
|
|
140
|
+
};
|
|
141
|
+
}).sort((a, b) => b.score - a.score);
|
|
142
|
+
}
|
|
143
|
+
function getSortedRankedModel(models, category = "chat", weights, tokenProfile) {
|
|
144
|
+
return rankModels(models, typeof tokenProfile === "string" ? {
|
|
145
|
+
inputTokens: TOKEN_PRESETS[tokenProfile],
|
|
146
|
+
outputTokens: TOKEN_PRESETS[tokenProfile]
|
|
147
|
+
} : typeof tokenProfile === "number" ? {
|
|
148
|
+
inputTokens: tokenProfile,
|
|
149
|
+
outputTokens: tokenProfile
|
|
150
|
+
} : tokenProfile ? tokenProfile : getDefaultTokenProfile(category), category, getDefaultWeights(weights));
|
|
151
|
+
}
|
|
152
|
+
function getSortedRecommendedModels(category = "chat", weights, tokenProfile) {
|
|
153
|
+
return getSortedRankedModel(RANKED_MODELS, category, weights, tokenProfile);
|
|
154
|
+
}
|
|
155
|
+
function getSortedRecommendedModelIds(category = "chat", weights, tokenProfile) {
|
|
156
|
+
return getSortedRankedModel(RANKED_MODELS, category, weights, tokenProfile).map((model) => model.id);
|
|
157
|
+
}
|
|
2
158
|
function arrayToPseudoXML(array, keys, name = "item") {
|
|
3
159
|
return array.map((item) => `<${name}>${keys.map((key) => `<${String(key)}>${String(item[key])}</${String(key)}>`).join("\n")}</${name}>`).join("\n");
|
|
4
160
|
}
|
|
5
161
|
//#endregion
|
|
6
|
-
export { arrayToPseudoXML };
|
|
162
|
+
export { addPriceScores, arrayToPseudoXML, getDefaultTokenProfile, getDefaultWeights, getSortedRankedModel, getSortedRecommendedModelIds, getSortedRecommendedModels, rankModels, weightsToPriceSensitivity };
|
|
7
163
|
|
|
8
164
|
//# sourceMappingURL=ai.utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.utils.mjs","names":[],"sources":["../../../../src/modules/ai/ai.utils.ts"],"sourcesContent":["export function arrayToPseudoXML<T extends Record<string, unknown>>(\r\n array: readonly T[],\r\n keys: readonly (keyof T)[],\r\n name = \"item\"\r\n): string {\r\n return array\r\n .map(\r\n (item) =>\r\n `<${name}>${keys\r\n .map((key) => `<${String(key)}>${String(item[key])}</${String(key)}>`)\r\n .join(\"\\n\")}</${name}>`\r\n )\r\n .join(\"\\n\");\r\n}\r\n"],"mappings":";AAAA,SAAgB,iBACd,OACA,MACA,OAAO,QACC;AACR,QAAO,MACJ,KACE,SACC,IAAI,KAAK,GAAG,KACT,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,GAAG,OAAO,KAAK,KAAK,CAAC,IAAI,OAAO,IAAI,CAAC,GAAG,CACrE,KAAK,KAAK,CAAC,IAAI,KAAK,GAC1B,CACA,KAAK,KAAK"}
|
|
1
|
+
{"version":3,"file":"ai.utils.mjs","names":[],"sources":["../../../../src/modules/ai/ai.utils.ts"],"sourcesContent":["import { RANKED_MODELS, TOKEN_PRESETS } from \"./ai.constants\";\r\nimport type { Category, RankedModel, SortType, TokenProfile, TokenSize } from \"./ai.types\";\r\n\r\nexport function getDefaultTokenProfile(category: Category): TokenProfile {\r\n switch (category) {\r\n case \"structured_output\":\r\n return { inputTokens: TOKEN_PRESETS.lg, outputTokens: TOKEN_PRESETS.md };\r\n case \"creative\":\r\n return { inputTokens: TOKEN_PRESETS.md, outputTokens: TOKEN_PRESETS.lg };\r\n case \"research\":\r\n return { inputTokens: TOKEN_PRESETS.xl, outputTokens: TOKEN_PRESETS.xl };\r\n case \"chat\":\r\n return { inputTokens: TOKEN_PRESETS.sm, outputTokens: TOKEN_PRESETS.md };\r\n case \"tool_use\":\r\n return { inputTokens: TOKEN_PRESETS.md, outputTokens: TOKEN_PRESETS.sm };\r\n case \"planning\":\r\n return { inputTokens: TOKEN_PRESETS.lg, outputTokens: TOKEN_PRESETS.lg };\r\n case \"classification\":\r\n return { inputTokens: TOKEN_PRESETS.sm, outputTokens: TOKEN_PRESETS.xs };\r\n default:\r\n return { inputTokens: TOKEN_PRESETS.md, outputTokens: TOKEN_PRESETS.md };\r\n }\r\n}\r\n\r\nexport function getDefaultWeights(\r\n weights?: SortType | [SortType, SortType, SortType] | [number, number, number]\r\n): [number, number, number] {\r\n if (Array.isArray(weights)) {\r\n return weights.every((weight) => typeof weight === \"number\")\r\n ? weights\r\n : weights.reduce<[number, number, number]>(\r\n (acc, weight, index) => {\r\n switch (weight) {\r\n case \"quality\":\r\n acc[0] = index === 0 ? 50 : index === 1 ? 30 : 20;\r\n break;\r\n case \"price\":\r\n acc[1] = index === 0 ? 50 : index === 1 ? 30 : 20;\r\n break;\r\n case \"speed\":\r\n acc[2] = index === 0 ? 50 : index === 1 ? 30 : 20;\r\n break;\r\n }\r\n return acc;\r\n },\r\n [20, 50, 30]\r\n );\r\n }\r\n switch (weights) {\r\n case \"quality\":\r\n return [50, 30, 20];\r\n case \"price\":\r\n return [20, 50, 30];\r\n case \"speed\":\r\n return [20, 30, 50];\r\n default:\r\n return [50, 25, 25];\r\n }\r\n}\r\n\r\nexport function weightsToPriceSensitivity(weights: [number, number, number]): number {\r\n const [qualityWeight, priceWeight, speedWeight] = weights;\r\n\r\n const total = qualityWeight + priceWeight + speedWeight;\r\n\r\n if (total <= 0) {\r\n return 1;\r\n }\r\n\r\n const normalizedPriceWeight = priceWeight / total;\r\n\r\n const min = 0.55; // very price-sensitive\r\n const max = 1.75; // price is soft / secondary\r\n\r\n // Higher price weight -> lower exponent -> stronger price penalty.\r\n const sensitivity = max - normalizedPriceWeight * (max - min);\r\n\r\n return Number(sensitivity.toFixed(3));\r\n}\r\n\r\nexport function addPriceScores(\r\n models: RankedModel[],\r\n profile: TokenProfile,\r\n priceSensitivity = 1\r\n): Array<RankedModel & { price: number; estimatedCost: number }> {\r\n const costs = models.map((model) => {\r\n return (\r\n (profile.inputTokens / 1_000_000) * model.inputCost +\r\n (profile.outputTokens / 1_000_000) * model.outputCost\r\n );\r\n });\r\n\r\n const cheapest = Math.min(...costs);\r\n const mostExpensive = Math.max(...costs);\r\n\r\n return models.map((model, index) => {\r\n const cost = costs[index];\r\n\r\n if (mostExpensive === cheapest) {\r\n return {\r\n ...model,\r\n estimatedCost: cost,\r\n price: 10,\r\n };\r\n }\r\n\r\n const safeCheapest = Math.max(cheapest, Number.EPSILON);\r\n const safeCost = Math.max(cost, Number.EPSILON);\r\n const safeMostExpensive = Math.max(mostExpensive, Number.EPSILON);\r\n\r\n const logMin = Math.log(safeCheapest);\r\n const logMax = Math.log(safeMostExpensive);\r\n const logCost = Math.log(safeCost);\r\n\r\n const normalizedRaw = (logCost - logMin) / (logMax - logMin);\r\n\r\n // < 1 makes price matter less.\r\n // > 1 makes price matter more.\r\n const normalized = normalizedRaw ** priceSensitivity;\r\n\r\n return {\r\n ...model,\r\n estimatedCost: cost,\r\n price: Math.round(10 - normalized * 9),\r\n };\r\n });\r\n}\r\n\r\nfunction clampScore(value: number): number {\r\n return Math.max(1, Math.min(10, value));\r\n}\r\n\r\nfunction shapeScoreByWeight(value: number, weight: number, maxWeight: number): number {\r\n const score = clampScore(value);\r\n const normalized = score / 10;\r\n\r\n if (maxWeight <= 0 || weight <= 0) {\r\n return 0;\r\n }\r\n\r\n const importance = (weight / maxWeight) ** 2;\r\n const expanded = normalized ** 2 * 10;\r\n const compressed = 8 + normalized * 2;\r\n return compressed + (expanded - compressed) * importance;\r\n}\r\n\r\nexport function rankModels(\r\n models: RankedModel[],\r\n profile: TokenProfile,\r\n category: Category,\r\n weights: [number, number, number]\r\n) {\r\n const scoredModels = addPriceScores(models, profile, weightsToPriceSensitivity(weights));\r\n\r\n const [qualityWeight, priceWeight, speedWeight] = weights;\r\n const maxWeight = Math.max(qualityWeight, priceWeight, speedWeight);\r\n\r\n return scoredModels\r\n .map((model) => {\r\n const qualityScore = shapeScoreByWeight(model.quality[category], qualityWeight, maxWeight);\r\n\r\n const priceScore = shapeScoreByWeight(model.price, priceWeight, maxWeight);\r\n\r\n const speedScore = shapeScoreByWeight(model.speed, speedWeight, maxWeight);\r\n\r\n return {\r\n ...model,\r\n score: qualityScore * qualityWeight + priceScore * priceWeight + speedScore * speedWeight,\r\n };\r\n })\r\n .sort((a, b) => b.score - a.score);\r\n}\r\n\r\nexport function getSortedRankedModel(\r\n models: RankedModel[],\r\n category: Category = \"chat\",\r\n weights?: SortType | [SortType, SortType, SortType] | [number, number, number],\r\n tokenProfile?: TokenProfile | number | TokenSize\r\n): RankedModel[] {\r\n const profile =\r\n typeof tokenProfile === \"string\"\r\n ? {\r\n inputTokens: TOKEN_PRESETS[tokenProfile as TokenSize],\r\n outputTokens: TOKEN_PRESETS[tokenProfile as TokenSize],\r\n }\r\n : typeof tokenProfile === \"number\"\r\n ? { inputTokens: tokenProfile, outputTokens: tokenProfile }\r\n : tokenProfile\r\n ? (tokenProfile as TokenProfile)\r\n : getDefaultTokenProfile(category);\r\n return rankModels(models, profile, category, getDefaultWeights(weights));\r\n}\r\n\r\nexport function getSortedRecommendedModels(\r\n category: Category = \"chat\",\r\n weights?: SortType | [SortType, SortType, SortType] | [number, number, number],\r\n tokenProfile?: TokenProfile | number | TokenSize\r\n): RankedModel[] {\r\n return getSortedRankedModel(RANKED_MODELS, category, weights, tokenProfile);\r\n}\r\n\r\nexport function getSortedRecommendedModelIds(\r\n category: Category = \"chat\",\r\n weights?: SortType | [SortType, SortType, SortType] | [number, number, number],\r\n tokenProfile?: TokenProfile | number | TokenSize\r\n): string[] {\r\n return getSortedRankedModel(RANKED_MODELS, category, weights, tokenProfile).map(\r\n (model) => model.id\r\n );\r\n}\r\n\r\nexport function arrayToPseudoXML<T extends Record<string, unknown>>(\r\n array: readonly T[],\r\n keys: readonly (keyof T)[],\r\n name = \"item\"\r\n): string {\r\n return array\r\n .map(\r\n (item) =>\r\n `<${name}>${keys\r\n .map((key) => `<${String(key)}>${String(item[key])}</${String(key)}>`)\r\n .join(\"\\n\")}</${name}>`\r\n )\r\n .join(\"\\n\");\r\n}\r\n"],"mappings":"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"}
|
|
@@ -38,7 +38,6 @@ declare const recurrenceRulesSchema: z.ZodObject<{
|
|
|
38
38
|
}, z.core.$strip>;
|
|
39
39
|
declare const updateRecurrenceRulesSchema: z.ZodObject<{
|
|
40
40
|
id: z.ZodString;
|
|
41
|
-
interval: z.ZodNumber;
|
|
42
41
|
bysetpos: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
43
42
|
bymonth: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
44
43
|
bymonthday: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
@@ -50,6 +49,7 @@ declare const updateRecurrenceRulesSchema: z.ZodObject<{
|
|
|
50
49
|
bysecond: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
51
50
|
freq: z.ZodNumber;
|
|
52
51
|
dtstart: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
|
|
52
|
+
interval: z.ZodNumber;
|
|
53
53
|
wkst: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
54
54
|
count: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
55
55
|
until: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
|
|
@@ -61,7 +61,6 @@ declare const createRecurrenceSchema: z.ZodObject<{
|
|
|
61
61
|
enabled: z.ZodBoolean;
|
|
62
62
|
metadata: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
63
63
|
recurrenceRules: z.ZodArray<z.ZodObject<{
|
|
64
|
-
interval: z.ZodNumber;
|
|
65
64
|
bysetpos: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
66
65
|
bymonth: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
67
66
|
bymonthday: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
@@ -73,6 +72,7 @@ declare const createRecurrenceSchema: z.ZodObject<{
|
|
|
73
72
|
bysecond: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
74
73
|
freq: z.ZodNumber;
|
|
75
74
|
dtstart: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
|
|
75
|
+
interval: z.ZodNumber;
|
|
76
76
|
wkst: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
77
77
|
count: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
78
78
|
until: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
|
|
@@ -38,7 +38,6 @@ declare const recurrenceRulesSchema: z.ZodObject<{
|
|
|
38
38
|
}, z.core.$strip>;
|
|
39
39
|
declare const updateRecurrenceRulesSchema: z.ZodObject<{
|
|
40
40
|
id: z.ZodString;
|
|
41
|
-
interval: z.ZodNumber;
|
|
42
41
|
bysetpos: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
43
42
|
bymonth: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
44
43
|
bymonthday: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
@@ -50,6 +49,7 @@ declare const updateRecurrenceRulesSchema: z.ZodObject<{
|
|
|
50
49
|
bysecond: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
51
50
|
freq: z.ZodNumber;
|
|
52
51
|
dtstart: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
|
|
52
|
+
interval: z.ZodNumber;
|
|
53
53
|
wkst: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
54
54
|
count: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
55
55
|
until: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
|
|
@@ -61,7 +61,6 @@ declare const createRecurrenceSchema: z.ZodObject<{
|
|
|
61
61
|
enabled: z.ZodBoolean;
|
|
62
62
|
metadata: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
63
63
|
recurrenceRules: z.ZodArray<z.ZodObject<{
|
|
64
|
-
interval: z.ZodNumber;
|
|
65
64
|
bysetpos: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
66
65
|
bymonth: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
67
66
|
bymonthday: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
@@ -73,6 +72,7 @@ declare const createRecurrenceSchema: z.ZodObject<{
|
|
|
73
72
|
bysecond: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
|
|
74
73
|
freq: z.ZodNumber;
|
|
75
74
|
dtstart: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
|
|
75
|
+
interval: z.ZodNumber;
|
|
76
76
|
wkst: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
77
77
|
count: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
78
78
|
until: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
|