hoomanjs 1.45.4 → 1.46.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/acp/acp-agent.js +15 -15
- package/dist/acp/acp-agent.js.map +1 -1
- package/dist/acp/prompt-invoke.d.ts +2 -1
- package/dist/acp/prompt-invoke.js +20 -95
- package/dist/acp/prompt-invoke.js.map +1 -1
- package/dist/chat/app.js +19 -19
- package/dist/chat/app.js.map +1 -1
- package/dist/chat/components/BottomChrome.d.ts +1 -1
- package/dist/chat/components/DownloadPanel.d.ts +1 -1
- package/dist/chat/components/DownloadPanel.js +1 -1
- package/dist/chat/components/DownloadPanel.js.map +1 -1
- package/dist/chat/components/StatusBar.js +1 -1
- package/dist/chat/components/StatusBar.js.map +1 -1
- package/dist/cli.js +5 -2
- package/dist/cli.js.map +1 -1
- package/dist/configure/app.js +292 -0
- package/dist/configure/app.js.map +1 -1
- package/dist/core/agent/gitignore-guard-plugin.d.ts +2 -0
- package/dist/core/agent/gitignore-guard-plugin.js +79 -0
- package/dist/core/agent/gitignore-guard-plugin.js.map +1 -0
- package/dist/core/agent/index.js +3 -0
- package/dist/core/agent/index.js.map +1 -1
- package/dist/core/config.d.ts +39 -6
- package/dist/core/config.js +5 -2
- package/dist/core/config.js.map +1 -1
- package/dist/core/index.js +19 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/models/anthropic.js +10 -4
- package/dist/core/models/anthropic.js.map +1 -1
- package/dist/core/models/azure.js +2 -1
- package/dist/core/models/azure.js.map +1 -1
- package/dist/core/models/bedrock.js +1 -0
- package/dist/core/models/bedrock.js.map +1 -1
- package/dist/core/models/google.js +1 -0
- package/dist/core/models/google.js.map +1 -1
- package/dist/core/models/groq.js +2 -1
- package/dist/core/models/groq.js.map +1 -1
- package/dist/core/models/llama-cpp/index.js +1 -0
- package/dist/core/models/llama-cpp/index.js.map +1 -1
- package/dist/core/models/llama-cpp/resolve-model.js +1 -1
- package/dist/core/models/llama-cpp/resolve-model.js.map +1 -1
- package/dist/core/models/minimax.js +2 -1
- package/dist/core/models/minimax.js.map +1 -1
- package/dist/core/models/mlx/index.js +2 -1
- package/dist/core/models/mlx/index.js.map +1 -1
- package/dist/core/models/mlx/resolve-model.js +1 -1
- package/dist/core/models/mlx/resolve-model.js.map +1 -1
- package/dist/core/models/mlx/strands-mlx.js +1 -1
- package/dist/core/models/mlx/strands-mlx.js.map +1 -1
- package/dist/core/models/moonshot.js +2 -1
- package/dist/core/models/moonshot.js.map +1 -1
- package/dist/core/models/ollama/index.js +7 -3
- package/dist/core/models/ollama/index.js.map +1 -1
- package/dist/core/models/openai.js +2 -1
- package/dist/core/models/openai.js.map +1 -1
- package/dist/core/models/openrouter.js +2 -1
- package/dist/core/models/openrouter.js.map +1 -1
- package/dist/core/models/types.d.ts +43 -11
- package/dist/core/models/types.js +15 -4
- package/dist/core/models/types.js.map +1 -1
- package/dist/core/models/xai.js +2 -1
- package/dist/core/models/xai.js.map +1 -1
- package/dist/core/prompts/modes/agent.md +1 -1
- package/dist/core/prompts/modes/plan.md +11 -7
- package/dist/core/prompts/static/browser.md +9 -0
- package/dist/core/prompts/system.js +3 -0
- package/dist/core/prompts/system.js.map +1 -1
- package/dist/core/ripgrep/bootstrap.js +5 -19
- package/dist/core/ripgrep/bootstrap.js.map +1 -1
- package/dist/core/skills/built-in/hooman-config/SKILL.md +22 -5
- package/dist/core/skills/built-in/hooman-config/providers.md +14 -12
- package/dist/core/skills/plugin.js +5 -1
- package/dist/core/skills/plugin.js.map +1 -1
- package/dist/core/tools/filesystem.js +9 -0
- package/dist/core/tools/filesystem.js.map +1 -1
- package/dist/core/tools/shell.js +3 -14
- package/dist/core/tools/shell.js.map +1 -1
- package/dist/core/utils/attachments.d.ts +4 -2
- package/dist/core/utils/attachments.js +10 -32
- package/dist/core/utils/attachments.js.map +1 -1
- package/dist/core/utils/command-path.d.ts +1 -0
- package/dist/core/utils/command-path.js +17 -0
- package/dist/core/utils/command-path.js.map +1 -0
- package/dist/core/utils/download-progress.js.map +1 -0
- package/dist/core/utils/gitignore.d.ts +11 -0
- package/dist/core/utils/gitignore.js +141 -0
- package/dist/core/utils/gitignore.js.map +1 -0
- package/dist/core/utils/hub-download.js.map +1 -0
- package/dist/core/utils/metadata.d.ts +65 -0
- package/dist/core/utils/{billing.js → metadata.js} +56 -73
- package/dist/core/utils/metadata.js.map +1 -0
- package/dist/core/utils/model-metadata.d.ts +39 -0
- package/dist/core/utils/model-metadata.js +222 -0
- package/dist/core/utils/model-metadata.js.map +1 -0
- package/dist/core/utils/paths.d.ts +1 -0
- package/dist/core/utils/paths.js +2 -0
- package/dist/core/utils/paths.js.map +1 -1
- package/dist/core/utils/reasoning-effort.d.ts +9 -1
- package/dist/core/{models → utils}/usage.js +1 -1
- package/dist/core/utils/usage.js.map +1 -0
- package/dist/daemon/index.d.ts +2 -0
- package/dist/daemon/index.js +6 -3
- package/dist/daemon/index.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
- package/dist/core/models/download-progress.js.map +0 -1
- package/dist/core/models/hub-download.js.map +0 -1
- package/dist/core/models/usage.js.map +0 -1
- package/dist/core/utils/billing.d.ts +0 -76
- package/dist/core/utils/billing.js.map +0 -1
- /package/dist/core/{models → utils}/download-progress.d.ts +0 -0
- /package/dist/core/{models → utils}/download-progress.js +0 -0
- /package/dist/core/{models → utils}/hub-download.d.ts +0 -0
- /package/dist/core/{models → utils}/hub-download.js +0 -0
- /package/dist/core/{models → utils}/usage.d.ts +0 -0
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { basename } from "node:path";
|
|
2
1
|
import { readFile, stat } from "node:fs/promises";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { TextBlock } from "@strands-agents/sdk";
|
|
3
|
+
import { attachmentPathToPromptBlocks } from "./model-metadata.js";
|
|
5
4
|
const DEFAULT_MAX_ATTACHMENT_BYTES = 1024 * 1024;
|
|
6
5
|
export function normalizeAttachmentPaths(input) {
|
|
7
6
|
if (!Array.isArray(input)) {
|
|
@@ -56,36 +55,15 @@ export async function readAttachmentAsBlocksOrBase64(filePath, options) {
|
|
|
56
55
|
}
|
|
57
56
|
const buffer = await readFile(trimmedPath);
|
|
58
57
|
const bytes = new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);
|
|
59
|
-
const
|
|
58
|
+
const blocks = attachmentPathToPromptBlocks({
|
|
60
59
|
path: trimmedPath,
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (
|
|
67
|
-
return
|
|
68
|
-
...(includeMetadata ? [metadata("image", imageFormat)] : []),
|
|
69
|
-
new ImageBlock({ format: imageFormat, source: { bytes } }),
|
|
70
|
-
];
|
|
71
|
-
}
|
|
72
|
-
const videoFormat = detectVideoFormat(trimmedPath);
|
|
73
|
-
if (videoFormat) {
|
|
74
|
-
return [
|
|
75
|
-
...(includeMetadata ? [metadata("video", videoFormat)] : []),
|
|
76
|
-
new VideoBlock({ format: videoFormat, source: { bytes } }),
|
|
77
|
-
];
|
|
78
|
-
}
|
|
79
|
-
const documentFormat = detectDocumentFormat(trimmedPath);
|
|
80
|
-
if (documentFormat) {
|
|
81
|
-
return [
|
|
82
|
-
...(includeMetadata ? [metadata("document", documentFormat)] : []),
|
|
83
|
-
new DocumentBlock({
|
|
84
|
-
name: basename(trimmedPath),
|
|
85
|
-
format: documentFormat,
|
|
86
|
-
source: { bytes },
|
|
87
|
-
}),
|
|
88
|
-
];
|
|
60
|
+
bytes,
|
|
61
|
+
sizeBytes: info.size,
|
|
62
|
+
metadata: options?.metadata,
|
|
63
|
+
includeMetadata,
|
|
64
|
+
});
|
|
65
|
+
if (blocks.length > 0) {
|
|
66
|
+
return blocks;
|
|
89
67
|
}
|
|
90
68
|
if (unsupportedFormat === "diagnostic") {
|
|
91
69
|
return asDiagnostic("Unsupported attachment format.", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../../src/core/utils/attachments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../../src/core/utils/attachments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function lookupCommandPath(command: string): string | undefined;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
export function lookupCommandPath(command) {
|
|
3
|
+
const lookup = process.platform === "win32" ? "where" : "which";
|
|
4
|
+
const result = spawnSync(lookup, [command], {
|
|
5
|
+
encoding: "utf8",
|
|
6
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
7
|
+
});
|
|
8
|
+
if (result.status !== 0) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
const first = result.stdout
|
|
12
|
+
.split(/\r?\n/)
|
|
13
|
+
.map((line) => line.trim())
|
|
14
|
+
.find(Boolean);
|
|
15
|
+
return first || undefined;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=command-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-path.js","sourceRoot":"","sources":["../../../src/core/utils/command-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAChE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;QAC1C,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;KACpC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM;SACxB,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,IAAI,CAAC,OAAO,CAAC,CAAC;IAEjB,OAAO,KAAK,IAAI,SAAS,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download-progress.js","sourceRoot":"","sources":["../../../src/core/utils/download-progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type GitignoreProbeOptions = {
|
|
2
|
+
isDirectory?: boolean;
|
|
3
|
+
};
|
|
4
|
+
export declare function clearGitignoreMatcherCache(): void;
|
|
5
|
+
export declare function isPathGitignored(targetPath: string, options?: GitignoreProbeOptions): Promise<boolean>;
|
|
6
|
+
export declare function assertPathNotGitignored(targetPath: string, options?: GitignoreProbeOptions): Promise<void>;
|
|
7
|
+
export declare function createGitignorePredicate(rootPath: string): Promise<{
|
|
8
|
+
root: string;
|
|
9
|
+
ignoresPath(targetPath: string, options?: GitignoreProbeOptions): boolean;
|
|
10
|
+
}>;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import ignore from "ignore";
|
|
4
|
+
import { findGitRoot } from "./discover-files.js";
|
|
5
|
+
const GITIGNORE_FILENAME = ".gitignore";
|
|
6
|
+
const gitignoreMatcherCache = new Map();
|
|
7
|
+
function normalizeRelativePath(input) {
|
|
8
|
+
const normalized = input.replaceAll("\\", "/");
|
|
9
|
+
return normalized === "." ? "" : normalized;
|
|
10
|
+
}
|
|
11
|
+
async function fileSignature(filePath) {
|
|
12
|
+
try {
|
|
13
|
+
const stat = await fs.stat(filePath);
|
|
14
|
+
return `${filePath}:${stat.mtimeMs}:${stat.size}`;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function listGitignoreFiles(targetPath, options) {
|
|
21
|
+
const resolvedTarget = path.resolve(targetPath);
|
|
22
|
+
const targetDirectory = options?.isDirectory
|
|
23
|
+
? resolvedTarget
|
|
24
|
+
: path.dirname(resolvedTarget);
|
|
25
|
+
const root = findGitRoot(targetDirectory);
|
|
26
|
+
const files = [];
|
|
27
|
+
let current = root;
|
|
28
|
+
for (;;) {
|
|
29
|
+
files.push(path.join(current, GITIGNORE_FILENAME));
|
|
30
|
+
if (current === targetDirectory) {
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
const relative = path.relative(current, targetDirectory);
|
|
34
|
+
if (relative === "" ||
|
|
35
|
+
relative.startsWith("..") ||
|
|
36
|
+
path.isAbsolute(relative)) {
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
current = path.join(current, relative.split(path.sep)[0]);
|
|
40
|
+
}
|
|
41
|
+
return { root, files };
|
|
42
|
+
}
|
|
43
|
+
async function buildMatcher(targetPath, options) {
|
|
44
|
+
const { root, files } = await listGitignoreFiles(targetPath, options);
|
|
45
|
+
const matcher = ignore();
|
|
46
|
+
matcher.add(".git/");
|
|
47
|
+
const loadedFiles = [];
|
|
48
|
+
const signatureParts = [];
|
|
49
|
+
for (const filePath of files) {
|
|
50
|
+
const signature = await fileSignature(filePath);
|
|
51
|
+
if (!signature) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const contents = await fs.readFile(filePath, "utf8");
|
|
55
|
+
const parent = path.dirname(filePath);
|
|
56
|
+
const baseRelative = normalizeRelativePath(path.relative(root, parent));
|
|
57
|
+
if (baseRelative.length === 0) {
|
|
58
|
+
matcher.add(contents);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const scoped = contents
|
|
62
|
+
.split(/\r?\n/)
|
|
63
|
+
.map((line) => {
|
|
64
|
+
if (line.length === 0 || line.startsWith("#")) {
|
|
65
|
+
return line;
|
|
66
|
+
}
|
|
67
|
+
const isNegated = line.startsWith("!");
|
|
68
|
+
const raw = isNegated ? line.slice(1) : line;
|
|
69
|
+
if (raw.startsWith("/")) {
|
|
70
|
+
return `${isNegated ? "!" : ""}${baseRelative}${raw}`;
|
|
71
|
+
}
|
|
72
|
+
return `${isNegated ? "!" : ""}${baseRelative}/${raw}`;
|
|
73
|
+
})
|
|
74
|
+
.join("\n");
|
|
75
|
+
matcher.add(scoped);
|
|
76
|
+
}
|
|
77
|
+
loadedFiles.push(filePath);
|
|
78
|
+
signatureParts.push(signature);
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
root,
|
|
82
|
+
matcher,
|
|
83
|
+
loadedFiles,
|
|
84
|
+
signature: signatureParts.join("|"),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
async function getMatcher(targetPath, options) {
|
|
88
|
+
const resolvedTarget = path.resolve(targetPath);
|
|
89
|
+
const targetDirectory = options?.isDirectory
|
|
90
|
+
? resolvedTarget
|
|
91
|
+
: path.dirname(resolvedTarget);
|
|
92
|
+
const root = findGitRoot(targetDirectory);
|
|
93
|
+
const cached = gitignoreMatcherCache.get(root);
|
|
94
|
+
const next = await buildMatcher(resolvedTarget, options);
|
|
95
|
+
if (cached && cached.signature === next.signature) {
|
|
96
|
+
return cached;
|
|
97
|
+
}
|
|
98
|
+
gitignoreMatcherCache.set(root, next);
|
|
99
|
+
return next;
|
|
100
|
+
}
|
|
101
|
+
export function clearGitignoreMatcherCache() {
|
|
102
|
+
gitignoreMatcherCache.clear();
|
|
103
|
+
}
|
|
104
|
+
export async function isPathGitignored(targetPath, options) {
|
|
105
|
+
const resolvedTarget = path.resolve(targetPath);
|
|
106
|
+
const { matcher, root } = await getMatcher(resolvedTarget, options);
|
|
107
|
+
let relative = normalizeRelativePath(path.relative(root, resolvedTarget));
|
|
108
|
+
if (relative.length === 0) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
if (options?.isDirectory && !relative.endsWith("/")) {
|
|
112
|
+
relative = `${relative}/`;
|
|
113
|
+
}
|
|
114
|
+
return matcher.ignores(relative);
|
|
115
|
+
}
|
|
116
|
+
export async function assertPathNotGitignored(targetPath, options) {
|
|
117
|
+
if (await isPathGitignored(targetPath, options)) {
|
|
118
|
+
throw new Error(`Access denied: path is ignored by .gitignore: ${targetPath}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
export async function createGitignorePredicate(rootPath) {
|
|
122
|
+
const resolvedRoot = path.resolve(rootPath);
|
|
123
|
+
const { matcher, root } = await getMatcher(resolvedRoot, {
|
|
124
|
+
isDirectory: true,
|
|
125
|
+
});
|
|
126
|
+
return {
|
|
127
|
+
root,
|
|
128
|
+
ignoresPath(targetPath, options) {
|
|
129
|
+
const resolvedTarget = path.resolve(targetPath);
|
|
130
|
+
let relative = normalizeRelativePath(path.relative(root, resolvedTarget));
|
|
131
|
+
if (relative.length === 0) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
if (options?.isDirectory && !relative.endsWith("/")) {
|
|
135
|
+
relative = `${relative}/`;
|
|
136
|
+
}
|
|
137
|
+
return matcher.ignores(relative);
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=gitignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../../src/core/utils/gitignore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-download.js","sourceRoot":"","sources":["../../../src/core/utils/hub-download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,6DAA6D;AAC7D,MAAM,yBAAyB,GAAG,GAAG,CAAC;AACtC,0EAA0E;AAC1E,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,4EAA4E;AAC5E,MAAM,uBAAuB,GAAG,IAAI,GAAG,IAAI,CAAC;AAU5C;;;;;;GAMG;AACH,SAAS,sBAAsB,CAC7B,IAGC;IAED,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,KAAyB,CAAC;IAC9B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,OAAO,GAA4C,EAAE,CAAC;IAE1D,MAAM,QAAQ,GAAG,CACf,MAAuC,EAChB,EAAE;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QACpC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,eAAe,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,cAAc,GAClB,SAAS,GAAG,CAAC;YACX,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,GAAG,IAAI;YAClD,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,UAAU,GACd,MAAM,KAAK,aAAa;YACxB,KAAK,KAAK,SAAS;YACnB,cAAc,KAAK,SAAS;YAC5B,cAAc,GAAG,CAAC;YAChB,CAAC,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,cAAc;YACrC,CAAC,CAAC,SAAS,CAAC;QAChB,OAAO;YACL,GAAG,IAAI;YACP,MAAM;YACN,aAAa,EAAE,QAAQ;YACvB,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,cAAc,KAAK,SAAS,IAAI,cAAc,IAAI,CAAC;gBACrD,CAAC,CAAC,EAAE,cAAc,EAAE;gBACpB,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpD,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,aAAa,GAAiB,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACxD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,CACb,IAAI,EAAE,MAAM,IAAI,CAAC,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAClE,CAAC,WAAW,EAAE,CAAC;QAChB,MAAM,cAAc,GAAG,IAAI,OAAO,CAChC,IAAI,EAAE,OAAO,IAAI,CAAC,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CACxE,CAAC;QACF,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACrE,MAAM,cAAc,GAClB,MAAM,KAAK,KAAK;YAChB,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC;YAC5B,QAAQ,CAAC,MAAM,KAAK,GAAG;YACvB,QAAQ,CAAC,IAAI,KAAK,IAAI;YACtB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;gBAC9B,aAAa,IAAI,uBAAuB,CAAC,CAAC;QAC9C,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;QACf,QAAQ,GAAG,CAAC,CAAC;QACb,OAAO,GAAG,EAAE,CAAC;QACb,KAAK;YACH,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,CAAC;gBACjD,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,SAAS,CAAC;QAChB,yBAAyB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;QACnD,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAK,CAAC,WAAW,CACxC,IAAI,eAAe,CAAyB;YAC1C,SAAS,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;gBAC/B,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC;gBAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,IAAI,GAAG,GAAG,UAAU,IAAI,yBAAyB,EAAE,CAAC;oBAClD,UAAU,GAAG,GAAG,CAAC;oBACjB,yBAAyB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;gBACrD,CAAC;gBACD,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;SACF,CAAC,CACH,CAAC;QACF,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE;YAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;SAC1B,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,GAAG,EAAE;YACT,IAAI,OAAO,EAAE,CAAC;gBACZ,yBAAyB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;YACzB,IAAI,OAAO,EAAE,CAAC;gBACZ,yBAAyB,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAa9C;IACC,MAAM,QAAQ,GAAG,sBAAsB,CAAC;QACtC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;QAChC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,QAAQ;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,OAAO,CAAC,WAAW;YACtB,GAAG,EAAE,KAAK;SACX,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,sBAAsB,CACxC,MAAsD,CACvD,CAAC;QACF,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,QAAQ,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { LlmProvider } from "../models/types.js";
|
|
2
|
+
import type { LlmMetadata, ProviderOptions } from "../models/types.js";
|
|
3
|
+
/** Resolved per-million-token USD prices (cache tiers fall back to `inputPerM`). */
|
|
4
|
+
export type ResolvedMetadataCosts = {
|
|
5
|
+
inputPerM: number;
|
|
6
|
+
cacheReadPerM?: number;
|
|
7
|
+
cacheWritePerM?: number;
|
|
8
|
+
outputPerM: number;
|
|
9
|
+
};
|
|
10
|
+
export type ResolvedLlmModality = {
|
|
11
|
+
text: boolean;
|
|
12
|
+
image: boolean;
|
|
13
|
+
pdf: boolean;
|
|
14
|
+
audio: boolean;
|
|
15
|
+
video: boolean;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Model metadata for the active model, merged from the LLM config's
|
|
19
|
+
* `metadata` block (which wins per field) and the models.dev catalog. Fields
|
|
20
|
+
* that could not be resolved from either source stay `undefined` — consumers
|
|
21
|
+
* must not report context usage without `context` or cost without `costs`.
|
|
22
|
+
* Modality always resolves, defaulting to text-only when unset.
|
|
23
|
+
*/
|
|
24
|
+
export type ResolvedLlmMetadata = {
|
|
25
|
+
name: string;
|
|
26
|
+
context?: number;
|
|
27
|
+
costs?: ResolvedMetadataCosts;
|
|
28
|
+
modality: ResolvedLlmModality;
|
|
29
|
+
};
|
|
30
|
+
export declare function configuredLlmContext(llm: {
|
|
31
|
+
provider: LlmProvider;
|
|
32
|
+
providerOptions: ProviderOptions;
|
|
33
|
+
llmOptions: {
|
|
34
|
+
context?: number;
|
|
35
|
+
};
|
|
36
|
+
}): number | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Resolve model metadata: config-provided `metadata` fields win, anything
|
|
39
|
+
* missing is filled from the models.dev catalog, and the metadata name
|
|
40
|
+
* defaults to the raw model id when no `metadata` block is configured.
|
|
41
|
+
* Returns `null` when neither source yields a context size nor prices — in
|
|
42
|
+
* that case nothing cost/context-related should be reported or displayed.
|
|
43
|
+
*
|
|
44
|
+
* When `provider` is a local provider (llama.cpp, Ollama), catalog costs are
|
|
45
|
+
* discarded — the catalog prices the hosted API for the same model id, not
|
|
46
|
+
* the free local inference — so only the context window resolves (config
|
|
47
|
+
* `metadata.costs`, if explicitly set, is still honored).
|
|
48
|
+
*
|
|
49
|
+
* `configuredContext` (the runtime context actually configured on the LLM
|
|
50
|
+
* entry — see {@link configuredLlmContext}) sits between the two sources:
|
|
51
|
+
* an explicit `metadata.context` wins over it, and it wins over the catalog.
|
|
52
|
+
* Modality always resolves, defaulting to text-only when unset.
|
|
53
|
+
*/
|
|
54
|
+
export declare function resolveLlmMetadata(metadata: LlmMetadata | null | undefined, modelId: string, provider?: LlmProvider, configuredContext?: number): Promise<ResolvedLlmMetadata | null>;
|
|
55
|
+
export declare function computeUsageCostUsd(usage: {
|
|
56
|
+
inputTokens?: number;
|
|
57
|
+
outputTokens?: number;
|
|
58
|
+
cacheReadInputTokens?: number;
|
|
59
|
+
cacheWriteInputTokens?: number;
|
|
60
|
+
}, costs: ResolvedMetadataCosts): number;
|
|
61
|
+
export declare function contextTokensFromUsage(usage: {
|
|
62
|
+
inputTokens?: number;
|
|
63
|
+
cacheReadInputTokens?: number;
|
|
64
|
+
cacheWriteInputTokens?: number;
|
|
65
|
+
}): number;
|
|
@@ -3,7 +3,7 @@ import { join } from "node:path";
|
|
|
3
3
|
import { cachePath } from "./paths.js";
|
|
4
4
|
import { LlmProvider } from "../models/types.js";
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* Model metadata resolution backed by the models.dev catalog.
|
|
7
7
|
*
|
|
8
8
|
* The catalog (`https://models.dev/catalog.json`) is cached on disk under
|
|
9
9
|
* `~/.hooman/cache/models-dev.json` and refreshed at most once per day; a
|
|
@@ -11,11 +11,12 @@ import { LlmProvider } from "../models/types.js";
|
|
|
11
11
|
* offline once the catalog has been fetched at least once.
|
|
12
12
|
*
|
|
13
13
|
* `catalog.providers` is keyed by provider id and carries per-provider model
|
|
14
|
-
* entries with `limit.context
|
|
15
|
-
* `catalog.models` is keyed by `lab/model-id` and
|
|
16
|
-
* canonical lab. When several providers serve a
|
|
17
|
-
* whose id equals the lab (e.g. `anthropic` for
|
|
18
|
-
* otherwise the first matching provider's metrics
|
|
14
|
+
* entries with `limit.context`, `cost` (USD per million tokens), and optional
|
|
15
|
+
* `modalities.input`; `catalog.models` is keyed by `lab/model-id` and
|
|
16
|
+
* identifies each model's canonical lab. When several providers serve a
|
|
17
|
+
* matching model, the provider whose id equals the lab (e.g. `anthropic` for
|
|
18
|
+
* `anthropic/claude-*`) wins; otherwise the first matching provider's metrics
|
|
19
|
+
* are used.
|
|
19
20
|
*/
|
|
20
21
|
const CATALOG_URL = "https://models.dev/catalog.json";
|
|
21
22
|
const CACHE_FILE = "models-dev.json";
|
|
@@ -67,11 +68,6 @@ async function writeDiskCache(envelope) {
|
|
|
67
68
|
/* best effort */
|
|
68
69
|
}
|
|
69
70
|
}
|
|
70
|
-
/**
|
|
71
|
-
* Load the models.dev catalog: in-memory copy while fresh, then the disk
|
|
72
|
-
* cache (refreshed once older than a day), then the network. Returns `null`
|
|
73
|
-
* when nothing has ever been fetched and the network is unavailable.
|
|
74
|
-
*/
|
|
75
71
|
async function loadCatalog() {
|
|
76
72
|
if (memory && isFresh(memory.envelope)) {
|
|
77
73
|
return memory.envelope.catalog;
|
|
@@ -114,14 +110,12 @@ async function loadCatalog() {
|
|
|
114
110
|
inflight = null;
|
|
115
111
|
}
|
|
116
112
|
}
|
|
117
|
-
/** Collapse separators so `claude-haiku-4.5` matches models.dev's `claude-haiku-4-5`. */
|
|
118
113
|
function normalizeModelId(value) {
|
|
119
114
|
return value
|
|
120
115
|
.toLowerCase()
|
|
121
116
|
.replace(/[^a-z0-9]+/g, "-")
|
|
122
117
|
.replace(/^-+|-+$/g, "");
|
|
123
118
|
}
|
|
124
|
-
/** Candidate forms of the billing name: as-is plus the last `/` segment (OpenRouter-style ids). */
|
|
125
119
|
function targetForms(name) {
|
|
126
120
|
const forms = new Set();
|
|
127
121
|
const normalized = normalizeModelId(name);
|
|
@@ -137,12 +131,6 @@ function targetForms(name) {
|
|
|
137
131
|
}
|
|
138
132
|
return [...forms];
|
|
139
133
|
}
|
|
140
|
-
/**
|
|
141
|
-
* Match quality between the billing name and a catalog model id.
|
|
142
|
-
* Tier 1: normalized equality. Tier 2: one normalized id contains the other
|
|
143
|
-
* (e.g. a Bedrock region-prefixed id vs. the catalog's bare id); the length
|
|
144
|
-
* difference breaks ties toward the closest candidate.
|
|
145
|
-
*/
|
|
146
134
|
function matchModelId(targets, candidateId) {
|
|
147
135
|
const candidate = normalizeModelId(candidateId);
|
|
148
136
|
if (!candidate) {
|
|
@@ -155,9 +143,6 @@ function matchModelId(targets, candidateId) {
|
|
|
155
143
|
}
|
|
156
144
|
const shorter = target.length < candidate.length ? target : candidate;
|
|
157
145
|
const longer = target.length < candidate.length ? candidate : target;
|
|
158
|
-
// Containment only counts on separator boundaries, so `gpt-5` does not
|
|
159
|
-
// swallow `gpt-5-mini` but `anthropic-claude-haiku-4-5-...-v1-0` still
|
|
160
|
-
// matches a `us.`-prefixed configured id.
|
|
161
146
|
if (shorter.length >= 4 && longer.includes(shorter)) {
|
|
162
147
|
const index = longer.indexOf(shorter);
|
|
163
148
|
const before = index === 0 || longer[index - 1] === "-";
|
|
@@ -173,7 +158,26 @@ function matchModelId(targets, candidateId) {
|
|
|
173
158
|
}
|
|
174
159
|
return best;
|
|
175
160
|
}
|
|
176
|
-
function
|
|
161
|
+
function catalogModalitiesToResolved(modalities) {
|
|
162
|
+
const inputs = new Set((modalities?.input ?? []).map((value) => value.toLowerCase()));
|
|
163
|
+
return {
|
|
164
|
+
text: inputs.size === 0 || inputs.has("text"),
|
|
165
|
+
image: inputs.has("image"),
|
|
166
|
+
pdf: inputs.has("pdf"),
|
|
167
|
+
audio: inputs.has("audio"),
|
|
168
|
+
video: inputs.has("video"),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
function mergeResolvedModality(configured, resolved) {
|
|
172
|
+
return {
|
|
173
|
+
text: configured?.text ?? resolved?.text ?? true,
|
|
174
|
+
image: configured?.image ?? resolved?.image ?? false,
|
|
175
|
+
pdf: configured?.pdf ?? resolved?.pdf ?? false,
|
|
176
|
+
audio: configured?.audio ?? resolved?.audio ?? false,
|
|
177
|
+
video: configured?.video ?? resolved?.video ?? false,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
function catalogEntryToMetadata(model) {
|
|
177
181
|
const context = typeof model.limit?.context === "number" && model.limit.context > 0
|
|
178
182
|
? model.limit.context
|
|
179
183
|
: undefined;
|
|
@@ -190,16 +194,14 @@ function catalogEntryToBilling(model) {
|
|
|
190
194
|
outputPerM: cost.output,
|
|
191
195
|
}
|
|
192
196
|
: undefined;
|
|
193
|
-
return {
|
|
197
|
+
return {
|
|
198
|
+
context,
|
|
199
|
+
costs,
|
|
200
|
+
modality: catalogModalitiesToResolved(model.modalities),
|
|
201
|
+
};
|
|
194
202
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
* match tier, then by whether the provider is the model's canonical lab
|
|
198
|
-
* (`catalog.models` is keyed `lab/model-id`), then by closeness of the id
|
|
199
|
-
* match, then by catalog order.
|
|
200
|
-
*/
|
|
201
|
-
function lookupInCatalog(catalog, billingName) {
|
|
202
|
-
const targets = targetForms(billingName);
|
|
203
|
+
function lookupInCatalog(catalog, metadataName) {
|
|
204
|
+
const targets = targetForms(metadataName);
|
|
203
205
|
if (targets.length === 0) {
|
|
204
206
|
return null;
|
|
205
207
|
}
|
|
@@ -230,9 +232,9 @@ function lookupInCatalog(catalog, billingName) {
|
|
|
230
232
|
const candidates = matches.filter((match) => match.tier === bestTier);
|
|
231
233
|
const preferred = candidates.find((match) => labs.has(match.providerId)) ??
|
|
232
234
|
candidates.reduce((best, match) => match.lengthDiff < best.lengthDiff ? match : best);
|
|
233
|
-
const resolved =
|
|
235
|
+
const resolved = catalogEntryToMetadata(preferred.model);
|
|
234
236
|
return resolved.context === undefined && resolved.costs === undefined
|
|
235
|
-
?
|
|
237
|
+
? { ...resolved, modality: resolved.modality }
|
|
236
238
|
: resolved;
|
|
237
239
|
}
|
|
238
240
|
function configCostsToResolved(costs) {
|
|
@@ -242,26 +244,11 @@ function configCostsToResolved(costs) {
|
|
|
242
244
|
outputPerM: costs["output/m"],
|
|
243
245
|
};
|
|
244
246
|
}
|
|
245
|
-
/**
|
|
246
|
-
* Providers that run inference locally: their token usage costs nothing, so
|
|
247
|
-
* catalog prices (which belong to the hosted API serving the same model)
|
|
248
|
-
* must never be applied to them.
|
|
249
|
-
*/
|
|
250
247
|
const LOCAL_PROVIDERS = new Set([
|
|
251
248
|
LlmProvider.LlamaCpp,
|
|
252
249
|
LlmProvider.Mlx,
|
|
253
250
|
LlmProvider.Ollama,
|
|
254
251
|
]);
|
|
255
|
-
/**
|
|
256
|
-
* The context size configured on a resolved LLM entry, when the provider
|
|
257
|
-
* actually honors one: for the local `llama-cpp` and `mlx` providers this is
|
|
258
|
-
* the per-LLM `options.context` (falling back to the provider-level
|
|
259
|
-
* `context`). Other providers' windows are fixed server-side, so config
|
|
260
|
-
* context is ignored for them. Feed the result into
|
|
261
|
-
* {@link resolveLlmBilling}'s `configuredContext` so the context gauge
|
|
262
|
-
* reflects the actual runtime window rather than the catalog's training
|
|
263
|
-
* window.
|
|
264
|
-
*/
|
|
265
252
|
export function configuredLlmContext(llm) {
|
|
266
253
|
if (llm.provider !== LlmProvider.LlamaCpp &&
|
|
267
254
|
llm.provider !== LlmProvider.Mlx) {
|
|
@@ -271,27 +258,33 @@ export function configuredLlmContext(llm) {
|
|
|
271
258
|
return llm.llmOptions.context ?? providerContext;
|
|
272
259
|
}
|
|
273
260
|
/**
|
|
274
|
-
* Resolve
|
|
275
|
-
*
|
|
276
|
-
*
|
|
261
|
+
* Resolve model metadata: config-provided `metadata` fields win, anything
|
|
262
|
+
* missing is filled from the models.dev catalog, and the metadata name
|
|
263
|
+
* defaults to the raw model id when no `metadata` block is configured.
|
|
277
264
|
* Returns `null` when neither source yields a context size nor prices — in
|
|
278
|
-
* that case nothing
|
|
265
|
+
* that case nothing cost/context-related should be reported or displayed.
|
|
279
266
|
*
|
|
280
267
|
* When `provider` is a local provider (llama.cpp, Ollama), catalog costs are
|
|
281
268
|
* discarded — the catalog prices the hosted API for the same model id, not
|
|
282
269
|
* the free local inference — so only the context window resolves (config
|
|
283
|
-
* `
|
|
270
|
+
* `metadata.costs`, if explicitly set, is still honored).
|
|
284
271
|
*
|
|
285
272
|
* `configuredContext` (the runtime context actually configured on the LLM
|
|
286
273
|
* entry — see {@link configuredLlmContext}) sits between the two sources:
|
|
287
|
-
* an explicit `
|
|
274
|
+
* an explicit `metadata.context` wins over it, and it wins over the catalog.
|
|
275
|
+
* Modality always resolves, defaulting to text-only when unset.
|
|
288
276
|
*/
|
|
289
|
-
export async function
|
|
290
|
-
const name =
|
|
277
|
+
export async function resolveLlmMetadata(metadata, modelId, provider, configuredContext) {
|
|
278
|
+
const name = metadata?.name ?? modelId;
|
|
291
279
|
const isLocal = provider !== undefined && LOCAL_PROVIDERS.has(provider);
|
|
292
|
-
let context =
|
|
293
|
-
let costs =
|
|
294
|
-
|
|
280
|
+
let context = metadata?.context ?? configuredContext;
|
|
281
|
+
let costs = metadata?.costs
|
|
282
|
+
? configCostsToResolved(metadata.costs)
|
|
283
|
+
: undefined;
|
|
284
|
+
let modality = mergeResolvedModality(metadata?.modality);
|
|
285
|
+
if (context === undefined ||
|
|
286
|
+
(costs === undefined && !isLocal) ||
|
|
287
|
+
metadata?.modality === undefined) {
|
|
295
288
|
const catalog = await loadCatalog();
|
|
296
289
|
const fromCatalog = catalog ? lookupInCatalog(catalog, name) : null;
|
|
297
290
|
if (fromCatalog) {
|
|
@@ -299,19 +292,14 @@ export async function resolveLlmBilling(billing, modelId, provider, configuredCo
|
|
|
299
292
|
if (!isLocal) {
|
|
300
293
|
costs ??= fromCatalog.costs;
|
|
301
294
|
}
|
|
295
|
+
modality = mergeResolvedModality(metadata?.modality, fromCatalog.modality);
|
|
302
296
|
}
|
|
303
297
|
}
|
|
304
298
|
if (context === undefined && costs === undefined) {
|
|
305
299
|
return null;
|
|
306
300
|
}
|
|
307
|
-
return { name, context, costs };
|
|
301
|
+
return { name, context, costs, modality };
|
|
308
302
|
}
|
|
309
|
-
/**
|
|
310
|
-
* USD cost of one request's token usage. Expects usage already normalized to
|
|
311
|
-
* the additive shape (see `toAdditiveUsage`): cache reads/writes are separate
|
|
312
|
-
* from `inputTokens`. Cache tiers without an explicit price fall back to the
|
|
313
|
-
* plain input rate.
|
|
314
|
-
*/
|
|
315
303
|
export function computeUsageCostUsd(usage, costs) {
|
|
316
304
|
const input = usage.inputTokens ?? 0;
|
|
317
305
|
const output = usage.outputTokens ?? 0;
|
|
@@ -323,14 +311,9 @@ export function computeUsageCostUsd(usage, costs) {
|
|
|
323
311
|
output * costs.outputPerM) /
|
|
324
312
|
1_000_000);
|
|
325
313
|
}
|
|
326
|
-
/**
|
|
327
|
-
* Context tokens occupied by a request, from its additive-shape usage: the
|
|
328
|
-
* full prompt (uncached input + cache reads/writes). Used as the "tokens
|
|
329
|
-
* currently in context" figure for context-window utilization.
|
|
330
|
-
*/
|
|
331
314
|
export function contextTokensFromUsage(usage) {
|
|
332
315
|
return ((usage.inputTokens ?? 0) +
|
|
333
316
|
(usage.cacheReadInputTokens ?? 0) +
|
|
334
317
|
(usage.cacheWriteInputTokens ?? 0));
|
|
335
318
|
}
|
|
336
|
-
//# sourceMappingURL=
|
|
319
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/core/utils/metadata.ts"],"names":[],"mappings":"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"}
|