pi-cache-optimizer 2.4.5 → 2.4.6
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/README.md +10 -0
- package/README.zh-CN.md +10 -0
- package/index.ts +280 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -46,6 +46,16 @@ This release keeps the original DeepSeek behavior and adds read-only stats adapt
|
|
|
46
46
|
| NVIDIA Nemotron | Model id/name contains `nemotron` | `Nemotron cache` | Pi-normalized usage, or raw OpenAI-shaped fields when visible |
|
|
47
47
|
| Cohere / Command | Model id/name contains `cohere` or `command-r` | `Cohere cache` | Pi-normalized usage, or raw OpenAI-shaped fields when visible |
|
|
48
48
|
| Yi / 零一万物 | Model id/name contains `yi-`, `01-ai`, `zero-one`, or pattern `yi` with safe boundaries | `Yi cache` | Pi-normalized usage, or raw OpenAI-shaped fields when visible |
|
|
49
|
+
| Doubao / ByteDance / Seed | Model id/name contains `doubao`, `豆包`, `volcengine`, `bytedance`, `byte-dance`, or pattern `seed` with safe boundaries | `Doubao cache` | Pi-normalized usage, or raw OpenAI-shaped fields when visible |
|
|
50
|
+
| Baidu ERNIE / Wenxin | Model id/name contains `ernie`, `wenxin`, `文心`, `yiyan`, `一言`, or `baidu` | `ERNIE cache` | Pi-normalized usage, or raw OpenAI-shaped fields when visible |
|
|
51
|
+
| Baichuan / 百川 | Model id/name contains `baichuan` or `百川` | `Baichuan cache` | Pi-normalized usage, or raw OpenAI-shaped fields when visible |
|
|
52
|
+
| StepFun / 阶跃星辰 | Model id/name contains `stepfun` or `step-` prefix | `StepFun cache` | Pi-normalized usage, or raw OpenAI-shaped fields when visible |
|
|
53
|
+
| iFlytek Spark / 讯飞星火 | Model id/name contains `spark`, `xinghuo`, `星火`, `iflytek`, or `讯飞` | `Spark cache` | Pi-normalized usage, or raw OpenAI-shaped fields when visible |
|
|
54
|
+
| InternLM / 书生 | Model id/name contains `internlm`, `intern-lm`, or `书生` | `InternLM cache` | Pi-normalized usage, or raw OpenAI-shaped fields when visible |
|
|
55
|
+
| Google Gemma | Model id/name contains `gemma` | `Gemma cache` | Pi-normalized usage, or raw OpenAI-shaped fields when visible |
|
|
56
|
+
| Microsoft Phi | Model id/name contains `phi-` prefix, or pattern `phi` with safe boundaries | `Phi cache` | Pi-normalized usage, or raw OpenAI-shaped fields when visible |
|
|
57
|
+
| AI21 Jamba | Model id/name contains `jamba` or `ai21` | `Jamba cache` | Pi-normalized usage, or raw OpenAI-shaped fields when visible |
|
|
58
|
+
| Upstage Solar | Model id/name contains `solar` or `upstage` | `Solar cache` | Pi-normalized usage, or raw OpenAI-shaped fields when visible |
|
|
49
59
|
| Anthropic / Claude | Model id/name contains `anthropic` or `claude` | `Claude cache` | Pi-normalized usage, or raw `cache_read_input_tokens`, `cache_creation_input_tokens`, `input_tokens` |
|
|
50
60
|
| Gemini / Vertex | Model id/name contains `gemini` or `vertex` | `Gemini cache` | Pi-normalized usage, or raw Gemini/Vertex cached-content token metadata when visible |
|
|
51
61
|
|
package/README.zh-CN.md
CHANGED
|
@@ -49,6 +49,16 @@
|
|
|
49
49
|
| NVIDIA Nemotron | model id/name 包含 `nemotron` | `Nemotron cache` | Pi 归一化 usage,或可见 OpenAI 形状字段 |
|
|
50
50
|
| Cohere / Command | model id/name 包含 `cohere` 或 `command-r` | `Cohere cache` | Pi 归一化 usage,或可见 OpenAI 形状字段 |
|
|
51
51
|
| Yi / 零一万物 | model id/name 包含 `yi-`、`01-ai`、`zero-one`,或安全边界内 `yi` 模式 | `Yi cache` | Pi 归一化 usage,或可见 OpenAI 形状字段 |
|
|
52
|
+
| Doubao / ByteDance / Seed | model id/name 包含 `doubao`、`豆包`、`volcengine`、`bytedance`、`byte-dance`,或安全边界内 `seed` 模式 | `Doubao cache` | Pi 归一化 usage,或可见 OpenAI 形状字段 |
|
|
53
|
+
| Baidu ERNIE / 文心一言 | model id/name 包含 `ernie`、`wenxin`、`文心`、`yiyan`、`一言` 或 `baidu` | `ERNIE cache` | Pi 归一化 usage,或可见 OpenAI 形状字段 |
|
|
54
|
+
| Baichuan / 百川 | model id/name 包含 `baichuan` 或 `百川` | `Baichuan cache` | Pi 归一化 usage,或可见 OpenAI 形状字段 |
|
|
55
|
+
| StepFun / 阶跃星辰 | model id/name 包含 `stepfun` 或 `step-` 前缀 | `StepFun cache` | Pi 归一化 usage,或可见 OpenAI 形状字段 |
|
|
56
|
+
| iFlytek Spark / 讯飞星火 | model id/name 包含 `spark`、`xinghuo`、`星火`、`iflytek` 或 `讯飞` | `Spark cache` | Pi 归一化 usage,或可见 OpenAI 形状字段 |
|
|
57
|
+
| InternLM / 书生 | model id/name 包含 `internlm`、`intern-lm` 或 `书生` | `InternLM cache` | Pi 归一化 usage,或可见 OpenAI 形状字段 |
|
|
58
|
+
| Google Gemma | model id/name 包含 `gemma` | `Gemma cache` | Pi 归一化 usage,或可见 OpenAI 形状字段 |
|
|
59
|
+
| Microsoft Phi | model id/name 包含 `phi-` 前缀,或安全边界内 `phi` 模式 | `Phi cache` | Pi 归一化 usage,或可见 OpenAI 形状字段 |
|
|
60
|
+
| AI21 Jamba | model id/name 包含 `jamba` 或 `ai21` | `Jamba cache` | Pi 归一化 usage,或可见 OpenAI 形状字段 |
|
|
61
|
+
| Upstage Solar | model id/name 包含 `solar` 或 `upstage` | `Solar cache` | Pi 归一化 usage,或可见 OpenAI 形状字段 |
|
|
52
62
|
| Anthropic / Claude | model id/name 包含 `anthropic` 或 `claude` | `Claude cache` | Pi 归一化 usage,或可见 raw 字段 `cache_read_input_tokens`、`cache_creation_input_tokens`、`input_tokens` |
|
|
53
63
|
| Gemini / Vertex | model id/name 包含 `gemini` 或 `vertex` | `Gemini cache` | Pi 归一化 usage,或可见 Gemini/Vertex cached-content token metadata |
|
|
54
64
|
|
package/index.ts
CHANGED
|
@@ -759,6 +759,94 @@ function isYiLikeAssistantMessage(message: unknown, model: PiModel | undefined):
|
|
|
759
759
|
return hasAnyTokenContaining(allTokens, ["yi-", "01-ai", "zero-one"]) || allTokens.some((t) => YI_MODEL_PATTERN.test(t));
|
|
760
760
|
}
|
|
761
761
|
|
|
762
|
+
// ── More OpenAI-compatible model detection (batch 2) ───────────────
|
|
763
|
+
|
|
764
|
+
const DOUBAO_SEED_PATTERN = /(^|[\/\s:_-])seed($|[\-_.:\/\s])/i;
|
|
765
|
+
|
|
766
|
+
function isDoubaoLikeModel(model: PiModel | undefined): boolean {
|
|
767
|
+
const tokens = getModelIdNameTokenValues(model);
|
|
768
|
+
return hasAnyTokenContaining(tokens, ["doubao", "豆包", "volcengine", "bytedance", "byte-dance"]) ||
|
|
769
|
+
tokens.some((t) => DOUBAO_SEED_PATTERN.test(t));
|
|
770
|
+
}
|
|
771
|
+
function isDoubaoLikeAssistantMessage(message: unknown, model: PiModel | undefined): boolean {
|
|
772
|
+
const allTokens = [
|
|
773
|
+
...getModelIdNameTokenValues(model),
|
|
774
|
+
...getAssistantMessageModelTokenValues(message),
|
|
775
|
+
];
|
|
776
|
+
return hasAnyTokenContaining(allTokens, ["doubao", "豆包", "volcengine", "bytedance", "byte-dance"]) ||
|
|
777
|
+
allTokens.some((t) => DOUBAO_SEED_PATTERN.test(t));
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
function isErnieLikeModel(model: PiModel | undefined): boolean {
|
|
781
|
+
return hasAnyTokenContaining(getModelIdNameTokenValues(model), ["ernie", "wenxin", "文心", "yiyan", "一言", "baidu"]);
|
|
782
|
+
}
|
|
783
|
+
function isErnieLikeAssistantMessage(message: unknown, model: PiModel | undefined): boolean {
|
|
784
|
+
return modelOrAssistantMessageHas(message, model, ["ernie", "wenxin", "文心", "yiyan", "一言", "baidu"]);
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
function isBaichuanLikeModel(model: PiModel | undefined): boolean {
|
|
788
|
+
return hasAnyTokenContaining(getModelIdNameTokenValues(model), ["baichuan", "百川"]);
|
|
789
|
+
}
|
|
790
|
+
function isBaichuanLikeAssistantMessage(message: unknown, model: PiModel | undefined): boolean {
|
|
791
|
+
return modelOrAssistantMessageHas(message, model, ["baichuan", "百川"]);
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
function isStepFunLikeModel(model: PiModel | undefined): boolean {
|
|
795
|
+
return hasAnyTokenContaining(getModelIdNameTokenValues(model), ["stepfun", "step-"]);
|
|
796
|
+
}
|
|
797
|
+
function isStepFunLikeAssistantMessage(message: unknown, model: PiModel | undefined): boolean {
|
|
798
|
+
return modelOrAssistantMessageHas(message, model, ["stepfun", "step-"]);
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
function isSparkLikeModel(model: PiModel | undefined): boolean {
|
|
802
|
+
return hasAnyTokenContaining(getModelIdNameTokenValues(model), ["spark", "xinghuo", "星火", "iflytek", "讯飞"]);
|
|
803
|
+
}
|
|
804
|
+
function isSparkLikeAssistantMessage(message: unknown, model: PiModel | undefined): boolean {
|
|
805
|
+
return modelOrAssistantMessageHas(message, model, ["spark", "xinghuo", "星火", "iflytek", "讯飞"]);
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
function isInternLMLikeModel(model: PiModel | undefined): boolean {
|
|
809
|
+
return hasAnyTokenContaining(getModelIdNameTokenValues(model), ["internlm", "intern-lm", "书生"]);
|
|
810
|
+
}
|
|
811
|
+
function isInternLMLikeAssistantMessage(message: unknown, model: PiModel | undefined): boolean {
|
|
812
|
+
return modelOrAssistantMessageHas(message, model, ["internlm", "intern-lm", "书生"]);
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
function isGemmaLikeModel(model: PiModel | undefined): boolean {
|
|
816
|
+
return hasAnyTokenContaining(getModelIdNameTokenValues(model), ["gemma"]);
|
|
817
|
+
}
|
|
818
|
+
function isGemmaLikeAssistantMessage(message: unknown, model: PiModel | undefined): boolean {
|
|
819
|
+
return modelOrAssistantMessageHas(message, model, ["gemma"]);
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
const PHI_MODEL_PATTERN = /(^|[\/\s:_-])phi($|[\-_.:\/\s])/i;
|
|
823
|
+
|
|
824
|
+
function isPhiLikeModel(model: PiModel | undefined): boolean {
|
|
825
|
+
const tokens = getModelIdNameTokenValues(model);
|
|
826
|
+
return hasAnyTokenContaining(tokens, ["phi-"]) || tokens.some((t) => PHI_MODEL_PATTERN.test(t));
|
|
827
|
+
}
|
|
828
|
+
function isPhiLikeAssistantMessage(message: unknown, model: PiModel | undefined): boolean {
|
|
829
|
+
const allTokens = [
|
|
830
|
+
...getModelIdNameTokenValues(model),
|
|
831
|
+
...getAssistantMessageModelTokenValues(message),
|
|
832
|
+
];
|
|
833
|
+
return hasAnyTokenContaining(allTokens, ["phi-"]) || allTokens.some((t) => PHI_MODEL_PATTERN.test(t));
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
function isJambaLikeModel(model: PiModel | undefined): boolean {
|
|
837
|
+
return hasAnyTokenContaining(getModelIdNameTokenValues(model), ["jamba", "ai21"]);
|
|
838
|
+
}
|
|
839
|
+
function isJambaLikeAssistantMessage(message: unknown, model: PiModel | undefined): boolean {
|
|
840
|
+
return modelOrAssistantMessageHas(message, model, ["jamba", "ai21"]);
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
function isSolarLikeModel(model: PiModel | undefined): boolean {
|
|
844
|
+
return hasAnyTokenContaining(getModelIdNameTokenValues(model), ["solar", "upstage"]);
|
|
845
|
+
}
|
|
846
|
+
function isSolarLikeAssistantMessage(message: unknown, model: PiModel | undefined): boolean {
|
|
847
|
+
return modelOrAssistantMessageHas(message, model, ["solar", "upstage"]);
|
|
848
|
+
}
|
|
849
|
+
|
|
762
850
|
// ── Model key ──────────────────────────────────────────────────────
|
|
763
851
|
|
|
764
852
|
function modelKey(model: PiModel): string {
|
|
@@ -1335,6 +1423,177 @@ const CACHE_PROVIDER_ADAPTERS: CacheProviderAdapter[] = [
|
|
|
1335
1423
|
return buildOpenAIProxyCompatWarningText(modelKey(model), missing);
|
|
1336
1424
|
},
|
|
1337
1425
|
},
|
|
1426
|
+
// ── More OpenAI-compatible adapters (batch 2) ───────────────────
|
|
1427
|
+
{
|
|
1428
|
+
id: "openai" as CacheProviderId,
|
|
1429
|
+
label: "Doubao cache",
|
|
1430
|
+
matchesModel: isDoubaoLikeModel,
|
|
1431
|
+
matchesAssistantMessage(message, model) {
|
|
1432
|
+
if (!isAssistantMessage(message)) return false;
|
|
1433
|
+
return isDoubaoLikeAssistantMessage(message, model);
|
|
1434
|
+
},
|
|
1435
|
+
normalizeUsage(message) {
|
|
1436
|
+
return normalizeWithFallback(message, getOpenAIRawUsage);
|
|
1437
|
+
},
|
|
1438
|
+
warningText(model) {
|
|
1439
|
+
const missing = describeMissingOpenAICompatibleProxyCompat(model);
|
|
1440
|
+
if (missing.length === 0) return undefined;
|
|
1441
|
+
return buildOpenAIProxyCompatWarningText(modelKey(model), missing);
|
|
1442
|
+
},
|
|
1443
|
+
},
|
|
1444
|
+
{
|
|
1445
|
+
id: "openai" as CacheProviderId,
|
|
1446
|
+
label: "ERNIE cache",
|
|
1447
|
+
matchesModel: isErnieLikeModel,
|
|
1448
|
+
matchesAssistantMessage(message, model) {
|
|
1449
|
+
if (!isAssistantMessage(message)) return false;
|
|
1450
|
+
return isErnieLikeAssistantMessage(message, model);
|
|
1451
|
+
},
|
|
1452
|
+
normalizeUsage(message) {
|
|
1453
|
+
return normalizeWithFallback(message, getOpenAIRawUsage);
|
|
1454
|
+
},
|
|
1455
|
+
warningText(model) {
|
|
1456
|
+
const missing = describeMissingOpenAICompatibleProxyCompat(model);
|
|
1457
|
+
if (missing.length === 0) return undefined;
|
|
1458
|
+
return buildOpenAIProxyCompatWarningText(modelKey(model), missing);
|
|
1459
|
+
},
|
|
1460
|
+
},
|
|
1461
|
+
{
|
|
1462
|
+
id: "openai" as CacheProviderId,
|
|
1463
|
+
label: "Baichuan cache",
|
|
1464
|
+
matchesModel: isBaichuanLikeModel,
|
|
1465
|
+
matchesAssistantMessage(message, model) {
|
|
1466
|
+
if (!isAssistantMessage(message)) return false;
|
|
1467
|
+
return isBaichuanLikeAssistantMessage(message, model);
|
|
1468
|
+
},
|
|
1469
|
+
normalizeUsage(message) {
|
|
1470
|
+
return normalizeWithFallback(message, getOpenAIRawUsage);
|
|
1471
|
+
},
|
|
1472
|
+
warningText(model) {
|
|
1473
|
+
const missing = describeMissingOpenAICompatibleProxyCompat(model);
|
|
1474
|
+
if (missing.length === 0) return undefined;
|
|
1475
|
+
return buildOpenAIProxyCompatWarningText(modelKey(model), missing);
|
|
1476
|
+
},
|
|
1477
|
+
},
|
|
1478
|
+
{
|
|
1479
|
+
id: "openai" as CacheProviderId,
|
|
1480
|
+
label: "StepFun cache",
|
|
1481
|
+
matchesModel: isStepFunLikeModel,
|
|
1482
|
+
matchesAssistantMessage(message, model) {
|
|
1483
|
+
if (!isAssistantMessage(message)) return false;
|
|
1484
|
+
return isStepFunLikeAssistantMessage(message, model);
|
|
1485
|
+
},
|
|
1486
|
+
normalizeUsage(message) {
|
|
1487
|
+
return normalizeWithFallback(message, getOpenAIRawUsage);
|
|
1488
|
+
},
|
|
1489
|
+
warningText(model) {
|
|
1490
|
+
const missing = describeMissingOpenAICompatibleProxyCompat(model);
|
|
1491
|
+
if (missing.length === 0) return undefined;
|
|
1492
|
+
return buildOpenAIProxyCompatWarningText(modelKey(model), missing);
|
|
1493
|
+
},
|
|
1494
|
+
},
|
|
1495
|
+
{
|
|
1496
|
+
id: "openai" as CacheProviderId,
|
|
1497
|
+
label: "Spark cache",
|
|
1498
|
+
matchesModel: isSparkLikeModel,
|
|
1499
|
+
matchesAssistantMessage(message, model) {
|
|
1500
|
+
if (!isAssistantMessage(message)) return false;
|
|
1501
|
+
return isSparkLikeAssistantMessage(message, model);
|
|
1502
|
+
},
|
|
1503
|
+
normalizeUsage(message) {
|
|
1504
|
+
return normalizeWithFallback(message, getOpenAIRawUsage);
|
|
1505
|
+
},
|
|
1506
|
+
warningText(model) {
|
|
1507
|
+
const missing = describeMissingOpenAICompatibleProxyCompat(model);
|
|
1508
|
+
if (missing.length === 0) return undefined;
|
|
1509
|
+
return buildOpenAIProxyCompatWarningText(modelKey(model), missing);
|
|
1510
|
+
},
|
|
1511
|
+
},
|
|
1512
|
+
{
|
|
1513
|
+
id: "openai" as CacheProviderId,
|
|
1514
|
+
label: "InternLM cache",
|
|
1515
|
+
matchesModel: isInternLMLikeModel,
|
|
1516
|
+
matchesAssistantMessage(message, model) {
|
|
1517
|
+
if (!isAssistantMessage(message)) return false;
|
|
1518
|
+
return isInternLMLikeAssistantMessage(message, model);
|
|
1519
|
+
},
|
|
1520
|
+
normalizeUsage(message) {
|
|
1521
|
+
return normalizeWithFallback(message, getOpenAIRawUsage);
|
|
1522
|
+
},
|
|
1523
|
+
warningText(model) {
|
|
1524
|
+
const missing = describeMissingOpenAICompatibleProxyCompat(model);
|
|
1525
|
+
if (missing.length === 0) return undefined;
|
|
1526
|
+
return buildOpenAIProxyCompatWarningText(modelKey(model), missing);
|
|
1527
|
+
},
|
|
1528
|
+
},
|
|
1529
|
+
{
|
|
1530
|
+
id: "openai" as CacheProviderId,
|
|
1531
|
+
label: "Gemma cache",
|
|
1532
|
+
matchesModel: isGemmaLikeModel,
|
|
1533
|
+
matchesAssistantMessage(message, model) {
|
|
1534
|
+
if (!isAssistantMessage(message)) return false;
|
|
1535
|
+
return isGemmaLikeAssistantMessage(message, model);
|
|
1536
|
+
},
|
|
1537
|
+
normalizeUsage(message) {
|
|
1538
|
+
return normalizeWithFallback(message, getOpenAIRawUsage);
|
|
1539
|
+
},
|
|
1540
|
+
warningText(model) {
|
|
1541
|
+
const missing = describeMissingOpenAICompatibleProxyCompat(model);
|
|
1542
|
+
if (missing.length === 0) return undefined;
|
|
1543
|
+
return buildOpenAIProxyCompatWarningText(modelKey(model), missing);
|
|
1544
|
+
},
|
|
1545
|
+
},
|
|
1546
|
+
{
|
|
1547
|
+
id: "openai" as CacheProviderId,
|
|
1548
|
+
label: "Phi cache",
|
|
1549
|
+
matchesModel: isPhiLikeModel,
|
|
1550
|
+
matchesAssistantMessage(message, model) {
|
|
1551
|
+
if (!isAssistantMessage(message)) return false;
|
|
1552
|
+
return isPhiLikeAssistantMessage(message, model);
|
|
1553
|
+
},
|
|
1554
|
+
normalizeUsage(message) {
|
|
1555
|
+
return normalizeWithFallback(message, getOpenAIRawUsage);
|
|
1556
|
+
},
|
|
1557
|
+
warningText(model) {
|
|
1558
|
+
const missing = describeMissingOpenAICompatibleProxyCompat(model);
|
|
1559
|
+
if (missing.length === 0) return undefined;
|
|
1560
|
+
return buildOpenAIProxyCompatWarningText(modelKey(model), missing);
|
|
1561
|
+
},
|
|
1562
|
+
},
|
|
1563
|
+
{
|
|
1564
|
+
id: "openai" as CacheProviderId,
|
|
1565
|
+
label: "Jamba cache",
|
|
1566
|
+
matchesModel: isJambaLikeModel,
|
|
1567
|
+
matchesAssistantMessage(message, model) {
|
|
1568
|
+
if (!isAssistantMessage(message)) return false;
|
|
1569
|
+
return isJambaLikeAssistantMessage(message, model);
|
|
1570
|
+
},
|
|
1571
|
+
normalizeUsage(message) {
|
|
1572
|
+
return normalizeWithFallback(message, getOpenAIRawUsage);
|
|
1573
|
+
},
|
|
1574
|
+
warningText(model) {
|
|
1575
|
+
const missing = describeMissingOpenAICompatibleProxyCompat(model);
|
|
1576
|
+
if (missing.length === 0) return undefined;
|
|
1577
|
+
return buildOpenAIProxyCompatWarningText(modelKey(model), missing);
|
|
1578
|
+
},
|
|
1579
|
+
},
|
|
1580
|
+
{
|
|
1581
|
+
id: "openai" as CacheProviderId,
|
|
1582
|
+
label: "Solar cache",
|
|
1583
|
+
matchesModel: isSolarLikeModel,
|
|
1584
|
+
matchesAssistantMessage(message, model) {
|
|
1585
|
+
if (!isAssistantMessage(message)) return false;
|
|
1586
|
+
return isSolarLikeAssistantMessage(message, model);
|
|
1587
|
+
},
|
|
1588
|
+
normalizeUsage(message) {
|
|
1589
|
+
return normalizeWithFallback(message, getOpenAIRawUsage);
|
|
1590
|
+
},
|
|
1591
|
+
warningText(model) {
|
|
1592
|
+
const missing = describeMissingOpenAICompatibleProxyCompat(model);
|
|
1593
|
+
if (missing.length === 0) return undefined;
|
|
1594
|
+
return buildOpenAIProxyCompatWarningText(modelKey(model), missing);
|
|
1595
|
+
},
|
|
1596
|
+
},
|
|
1338
1597
|
];
|
|
1339
1598
|
|
|
1340
1599
|
function selectAdapterForModel(model: PiModel | undefined): CacheProviderAdapter | undefined {
|
|
@@ -1680,6 +1939,27 @@ export const __internals_for_tests = {
|
|
|
1680
1939
|
isCohereLikeAssistantMessage,
|
|
1681
1940
|
isYiLikeModel,
|
|
1682
1941
|
isYiLikeAssistantMessage,
|
|
1942
|
+
// More OpenAI-compatible model detection (batch 2)
|
|
1943
|
+
isDoubaoLikeModel,
|
|
1944
|
+
isDoubaoLikeAssistantMessage,
|
|
1945
|
+
isErnieLikeModel,
|
|
1946
|
+
isErnieLikeAssistantMessage,
|
|
1947
|
+
isBaichuanLikeModel,
|
|
1948
|
+
isBaichuanLikeAssistantMessage,
|
|
1949
|
+
isStepFunLikeModel,
|
|
1950
|
+
isStepFunLikeAssistantMessage,
|
|
1951
|
+
isSparkLikeModel,
|
|
1952
|
+
isSparkLikeAssistantMessage,
|
|
1953
|
+
isInternLMLikeModel,
|
|
1954
|
+
isInternLMLikeAssistantMessage,
|
|
1955
|
+
isGemmaLikeModel,
|
|
1956
|
+
isGemmaLikeAssistantMessage,
|
|
1957
|
+
isPhiLikeModel,
|
|
1958
|
+
isPhiLikeAssistantMessage,
|
|
1959
|
+
isJambaLikeModel,
|
|
1960
|
+
isJambaLikeAssistantMessage,
|
|
1961
|
+
isSolarLikeModel,
|
|
1962
|
+
isSolarLikeAssistantMessage,
|
|
1683
1963
|
buildOpenAIProxyCompatWarningText,
|
|
1684
1964
|
getModelIdNameTokenValues,
|
|
1685
1965
|
getAssistantMessageModelTokenValues,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-cache-optimizer",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.6",
|
|
4
4
|
"description": "Pi extension that improves provider-side KV/prompt cache hit rates (DeepSeek, OpenAI, Claude, Gemini) by reordering the system prompt, requesting long retention, and showing footer cache stats. Renamed from pi-deepseek-cache-optimizer.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pi-package",
|