@steipete/summarize 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +52 -0
- package/LICENSE +21 -0
- package/README.md +185 -0
- package/dist/cli.cjs +74333 -0
- package/dist/cli.cjs.map +7 -0
- package/dist/esm/cli-main.js +80 -0
- package/dist/esm/cli-main.js.map +1 -0
- package/dist/esm/cli.js +18 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/config.js +33 -0
- package/dist/esm/config.js.map +1 -0
- package/dist/esm/content/asset.js +167 -0
- package/dist/esm/content/asset.js.map +1 -0
- package/dist/esm/content/index.js +4 -0
- package/dist/esm/content/index.js.map +1 -0
- package/dist/esm/content/link-preview/client.js +20 -0
- package/dist/esm/content/link-preview/client.js.map +1 -0
- package/dist/esm/content/link-preview/content/article.js +150 -0
- package/dist/esm/content/link-preview/content/article.js.map +1 -0
- package/dist/esm/content/link-preview/content/cleaner.js +55 -0
- package/dist/esm/content/link-preview/content/cleaner.js.map +1 -0
- package/dist/esm/content/link-preview/content/fetcher.js +120 -0
- package/dist/esm/content/link-preview/content/fetcher.js.map +1 -0
- package/dist/esm/content/link-preview/content/index.js +275 -0
- package/dist/esm/content/link-preview/content/index.js.map +1 -0
- package/dist/esm/content/link-preview/content/parsers.js +77 -0
- package/dist/esm/content/link-preview/content/parsers.js.map +1 -0
- package/dist/esm/content/link-preview/content/types.js +4 -0
- package/dist/esm/content/link-preview/content/types.js.map +1 -0
- package/dist/esm/content/link-preview/content/utils.js +127 -0
- package/dist/esm/content/link-preview/content/utils.js.map +1 -0
- package/dist/esm/content/link-preview/content/youtube.js +82 -0
- package/dist/esm/content/link-preview/content/youtube.js.map +1 -0
- package/dist/esm/content/link-preview/deps.js +2 -0
- package/dist/esm/content/link-preview/deps.js.map +1 -0
- package/dist/esm/content/link-preview/fetch-with-timeout.js +35 -0
- package/dist/esm/content/link-preview/fetch-with-timeout.js.map +1 -0
- package/dist/esm/content/link-preview/transcript/cache.js +73 -0
- package/dist/esm/content/link-preview/transcript/cache.js.map +1 -0
- package/dist/esm/content/link-preview/transcript/index.js +95 -0
- package/dist/esm/content/link-preview/transcript/index.js.map +1 -0
- package/dist/esm/content/link-preview/transcript/normalize.js +43 -0
- package/dist/esm/content/link-preview/transcript/normalize.js.map +1 -0
- package/dist/esm/content/link-preview/transcript/providers/generic.js +11 -0
- package/dist/esm/content/link-preview/transcript/providers/generic.js.map +1 -0
- package/dist/esm/content/link-preview/transcript/providers/podcast.js +12 -0
- package/dist/esm/content/link-preview/transcript/providers/podcast.js.map +1 -0
- package/dist/esm/content/link-preview/transcript/providers/twitter.js +12 -0
- package/dist/esm/content/link-preview/transcript/providers/twitter.js.map +1 -0
- package/dist/esm/content/link-preview/transcript/providers/youtube/api.js +257 -0
- package/dist/esm/content/link-preview/transcript/providers/youtube/api.js.map +1 -0
- package/dist/esm/content/link-preview/transcript/providers/youtube/apify.js +55 -0
- package/dist/esm/content/link-preview/transcript/providers/youtube/apify.js.map +1 -0
- package/dist/esm/content/link-preview/transcript/providers/youtube/captions.js +409 -0
- package/dist/esm/content/link-preview/transcript/providers/youtube/captions.js.map +1 -0
- package/dist/esm/content/link-preview/transcript/providers/youtube/ytdlp.js +114 -0
- package/dist/esm/content/link-preview/transcript/providers/youtube/ytdlp.js.map +1 -0
- package/dist/esm/content/link-preview/transcript/providers/youtube.js +74 -0
- package/dist/esm/content/link-preview/transcript/providers/youtube.js.map +1 -0
- package/dist/esm/content/link-preview/transcript/types.js +2 -0
- package/dist/esm/content/link-preview/transcript/types.js.map +1 -0
- package/dist/esm/content/link-preview/transcript/utils.js +193 -0
- package/dist/esm/content/link-preview/transcript/utils.js.map +1 -0
- package/dist/esm/content/link-preview/types.js +2 -0
- package/dist/esm/content/link-preview/types.js.map +1 -0
- package/dist/esm/costs.js +57 -0
- package/dist/esm/costs.js.map +1 -0
- package/dist/esm/firecrawl.js +54 -0
- package/dist/esm/firecrawl.js.map +1 -0
- package/dist/esm/flags.js +97 -0
- package/dist/esm/flags.js.map +1 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/llm/generate-text.js +296 -0
- package/dist/esm/llm/generate-text.js.map +1 -0
- package/dist/esm/llm/google-models.js +112 -0
- package/dist/esm/llm/google-models.js.map +1 -0
- package/dist/esm/llm/html-to-markdown.js +44 -0
- package/dist/esm/llm/html-to-markdown.js.map +1 -0
- package/dist/esm/llm/model-id.js +45 -0
- package/dist/esm/llm/model-id.js.map +1 -0
- package/dist/esm/pricing/litellm.js +25 -0
- package/dist/esm/pricing/litellm.js.map +1 -0
- package/dist/esm/prompts/file.js +14 -0
- package/dist/esm/prompts/file.js.map +1 -0
- package/dist/esm/prompts/index.js +3 -0
- package/dist/esm/prompts/index.js.map +1 -0
- package/dist/esm/prompts/link-summary.js +105 -0
- package/dist/esm/prompts/link-summary.js.map +1 -0
- package/dist/esm/run.js +1674 -0
- package/dist/esm/run.js.map +1 -0
- package/dist/esm/shared/contracts.js +2 -0
- package/dist/esm/shared/contracts.js.map +1 -0
- package/dist/esm/summarizeHome.js +20 -0
- package/dist/esm/summarizeHome.js.map +1 -0
- package/dist/esm/tty/live-markdown.js +52 -0
- package/dist/esm/tty/live-markdown.js.map +1 -0
- package/dist/esm/tty/osc-progress.js +8 -0
- package/dist/esm/tty/osc-progress.js.map +1 -0
- package/dist/esm/tty/spinner.js +33 -0
- package/dist/esm/tty/spinner.js.map +1 -0
- package/dist/esm/version.js +44 -0
- package/dist/esm/version.js.map +1 -0
- package/dist/types/cli-main.d.ts +11 -0
- package/dist/types/cli.d.ts +1 -0
- package/dist/types/config.d.ts +15 -0
- package/dist/types/content/asset.d.ts +44 -0
- package/dist/types/content/index.d.ts +4 -0
- package/dist/types/content/link-preview/client.d.ts +14 -0
- package/dist/types/content/link-preview/content/article.d.ts +4 -0
- package/dist/types/content/link-preview/content/cleaner.d.ts +12 -0
- package/dist/types/content/link-preview/content/fetcher.d.ts +16 -0
- package/dist/types/content/link-preview/content/index.d.ts +4 -0
- package/dist/types/content/link-preview/content/parsers.d.ts +7 -0
- package/dist/types/content/link-preview/content/types.d.ts +44 -0
- package/dist/types/content/link-preview/content/utils.d.ts +16 -0
- package/dist/types/content/link-preview/content/youtube.d.ts +1 -0
- package/dist/types/content/link-preview/deps.d.ts +70 -0
- package/dist/types/content/link-preview/fetch-with-timeout.d.ts +4 -0
- package/dist/types/content/link-preview/transcript/cache.d.ts +29 -0
- package/dist/types/content/link-preview/transcript/index.d.ts +9 -0
- package/dist/types/content/link-preview/transcript/normalize.d.ts +3 -0
- package/dist/types/content/link-preview/transcript/providers/generic.d.ts +3 -0
- package/dist/types/content/link-preview/transcript/providers/podcast.d.ts +3 -0
- package/dist/types/content/link-preview/transcript/providers/twitter.d.ts +3 -0
- package/dist/types/content/link-preview/transcript/providers/youtube/api.d.ts +26 -0
- package/dist/types/content/link-preview/transcript/providers/youtube/apify.d.ts +1 -0
- package/dist/types/content/link-preview/transcript/providers/youtube/captions.d.ts +7 -0
- package/dist/types/content/link-preview/transcript/providers/youtube/ytdlp.d.ts +3 -0
- package/dist/types/content/link-preview/transcript/providers/youtube.d.ts +3 -0
- package/dist/types/content/link-preview/transcript/types.d.ts +23 -0
- package/dist/types/content/link-preview/transcript/utils.d.ts +7 -0
- package/dist/types/content/link-preview/types.d.ts +36 -0
- package/dist/types/costs.d.ts +31 -0
- package/dist/types/firecrawl.d.ts +5 -0
- package/dist/types/flags.d.ts +23 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/llm/generate-text.d.ts +43 -0
- package/dist/types/llm/google-models.d.ts +10 -0
- package/dist/types/llm/html-to-markdown.d.ts +15 -0
- package/dist/types/llm/model-id.d.ts +14 -0
- package/dist/types/pricing/litellm.d.ts +13 -0
- package/dist/types/prompts/file.d.ts +6 -0
- package/dist/types/prompts/index.d.ts +3 -0
- package/dist/types/prompts/link-summary.d.ts +27 -0
- package/dist/types/run.d.ts +8 -0
- package/dist/types/shared/contracts.d.ts +2 -0
- package/dist/types/summarizeHome.d.ts +6 -0
- package/dist/types/tty/live-markdown.d.ts +10 -0
- package/dist/types/tty/osc-progress.d.ts +3 -0
- package/dist/types/tty/spinner.d.ts +10 -0
- package/dist/types/version.d.ts +2 -0
- package/docs/README.md +11 -0
- package/docs/config.md +28 -0
- package/docs/extract-only.md +13 -0
- package/docs/firecrawl.md +17 -0
- package/docs/llm.md +33 -0
- package/docs/openai.md +18 -0
- package/docs/site/.nojekyll +1 -0
- package/docs/site/404.html +37 -0
- package/docs/site/assets/site.css +577 -0
- package/docs/site/assets/site.js +69 -0
- package/docs/site/docs/config.html +73 -0
- package/docs/site/docs/extract-only.html +79 -0
- package/docs/site/docs/firecrawl.html +72 -0
- package/docs/site/docs/index.html +89 -0
- package/docs/site/docs/llm.html +70 -0
- package/docs/site/docs/openai.html +66 -0
- package/docs/site/docs/website.html +70 -0
- package/docs/site/docs/youtube.html +62 -0
- package/docs/site/index.html +125 -0
- package/docs/website.md +27 -0
- package/docs/youtube.md +32 -0
- package/package.json +76 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { parseGatewayStyleModelId } from './model-id.js';
|
|
2
|
+
function parseAnthropicErrorPayload(responseBody) {
|
|
3
|
+
try {
|
|
4
|
+
const parsed = JSON.parse(responseBody);
|
|
5
|
+
if (parsed?.type !== 'error')
|
|
6
|
+
return null;
|
|
7
|
+
const error = parsed.error;
|
|
8
|
+
if (!error || typeof error !== 'object')
|
|
9
|
+
return null;
|
|
10
|
+
const errorType = typeof error.type === 'string' ? error.type : null;
|
|
11
|
+
const errorMessage = typeof error.message === 'string' ? error.message : null;
|
|
12
|
+
if (!errorType || !errorMessage)
|
|
13
|
+
return null;
|
|
14
|
+
return { type: errorType, message: errorMessage };
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function normalizeAnthropicModelAccessError(error, modelId) {
|
|
21
|
+
if (!error || typeof error !== 'object')
|
|
22
|
+
return null;
|
|
23
|
+
const maybe = error;
|
|
24
|
+
const statusCode = typeof maybe.statusCode === 'number' ? maybe.statusCode : null;
|
|
25
|
+
const responseBody = typeof maybe.responseBody === 'string' ? maybe.responseBody : null;
|
|
26
|
+
const payload = responseBody ? parseAnthropicErrorPayload(responseBody) : null;
|
|
27
|
+
const payloadType = payload?.type ?? null;
|
|
28
|
+
const payloadMessage = payload?.message ?? null;
|
|
29
|
+
const message = typeof maybe.message === 'string' ? maybe.message : '';
|
|
30
|
+
const combinedMessage = (payloadMessage ?? message).trim();
|
|
31
|
+
const hasModelMessage = /^model:\s*\S+/i.test(combinedMessage);
|
|
32
|
+
const isAccessStatus = statusCode === 401 || statusCode === 403 || statusCode === 404;
|
|
33
|
+
const isAccessType = payloadType === 'not_found_error' ||
|
|
34
|
+
payloadType === 'permission_error' ||
|
|
35
|
+
payloadType === 'authentication_error';
|
|
36
|
+
if (!hasModelMessage && !isAccessStatus && !isAccessType)
|
|
37
|
+
return null;
|
|
38
|
+
const modelLabel = hasModelMessage ? combinedMessage.replace(/^model:\s*/i, '').trim() : modelId;
|
|
39
|
+
const hint = `Anthropic API rejected model "${modelLabel}". Your ANTHROPIC_API_KEY likely lacks access to this model or it is unavailable for your account. Try another anthropic/... model or request access.`;
|
|
40
|
+
return new Error(hint, { cause: error instanceof Error ? error : undefined });
|
|
41
|
+
}
|
|
42
|
+
function normalizeTokenUsage(raw) {
|
|
43
|
+
if (!raw || typeof raw !== 'object')
|
|
44
|
+
return null;
|
|
45
|
+
const usage = raw;
|
|
46
|
+
const promptTokens = typeof usage.promptTokens === 'number' && Number.isFinite(usage.promptTokens)
|
|
47
|
+
? usage.promptTokens
|
|
48
|
+
: typeof usage.inputTokens === 'number' && Number.isFinite(usage.inputTokens)
|
|
49
|
+
? usage.inputTokens
|
|
50
|
+
: null;
|
|
51
|
+
const completionTokens = typeof usage.completionTokens === 'number' && Number.isFinite(usage.completionTokens)
|
|
52
|
+
? usage.completionTokens
|
|
53
|
+
: typeof usage.outputTokens === 'number' && Number.isFinite(usage.outputTokens)
|
|
54
|
+
? usage.outputTokens
|
|
55
|
+
: null;
|
|
56
|
+
const totalTokens = typeof usage.totalTokens === 'number' && Number.isFinite(usage.totalTokens)
|
|
57
|
+
? usage.totalTokens
|
|
58
|
+
: null;
|
|
59
|
+
if (promptTokens === null && completionTokens === null && totalTokens === null) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return { promptTokens, completionTokens, totalTokens };
|
|
63
|
+
}
|
|
64
|
+
export async function generateTextWithModelId({ modelId, apiKeys, system, prompt, temperature, maxOutputTokens, timeoutMs, fetchImpl, }) {
|
|
65
|
+
const parsed = parseGatewayStyleModelId(modelId);
|
|
66
|
+
const controller = new AbortController();
|
|
67
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
68
|
+
try {
|
|
69
|
+
const { generateText } = await import('ai');
|
|
70
|
+
if (parsed.provider === 'xai') {
|
|
71
|
+
const apiKey = apiKeys.xaiApiKey;
|
|
72
|
+
if (!apiKey)
|
|
73
|
+
throw new Error('Missing XAI_API_KEY for xai/... model');
|
|
74
|
+
const { createXai } = await import('@ai-sdk/xai');
|
|
75
|
+
const xai = createXai({ apiKey, fetch: fetchImpl });
|
|
76
|
+
const result = await generateText({
|
|
77
|
+
model: xai(parsed.model),
|
|
78
|
+
system,
|
|
79
|
+
...(typeof prompt === 'string' ? { prompt } : { messages: prompt }),
|
|
80
|
+
...(typeof temperature === 'number' ? { temperature } : {}),
|
|
81
|
+
...(typeof maxOutputTokens === 'number' ? { maxOutputTokens } : {}),
|
|
82
|
+
abortSignal: controller.signal,
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
text: result.text,
|
|
86
|
+
canonicalModelId: parsed.canonical,
|
|
87
|
+
provider: parsed.provider,
|
|
88
|
+
usage: normalizeTokenUsage(result.usage),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (parsed.provider === 'google') {
|
|
92
|
+
const apiKey = apiKeys.googleApiKey;
|
|
93
|
+
if (!apiKey)
|
|
94
|
+
throw new Error('Missing GEMINI_API_KEY (or GOOGLE_GENERATIVE_AI_API_KEY / GOOGLE_API_KEY) for google/... model');
|
|
95
|
+
const { createGoogleGenerativeAI } = await import('@ai-sdk/google');
|
|
96
|
+
const google = createGoogleGenerativeAI({ apiKey, fetch: fetchImpl });
|
|
97
|
+
const result = await generateText({
|
|
98
|
+
model: google(parsed.model),
|
|
99
|
+
system,
|
|
100
|
+
...(typeof prompt === 'string' ? { prompt } : { messages: prompt }),
|
|
101
|
+
...(typeof temperature === 'number' ? { temperature } : {}),
|
|
102
|
+
...(typeof maxOutputTokens === 'number' ? { maxOutputTokens } : {}),
|
|
103
|
+
abortSignal: controller.signal,
|
|
104
|
+
});
|
|
105
|
+
return {
|
|
106
|
+
text: result.text,
|
|
107
|
+
canonicalModelId: parsed.canonical,
|
|
108
|
+
provider: parsed.provider,
|
|
109
|
+
usage: normalizeTokenUsage(result.usage),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (parsed.provider === 'anthropic') {
|
|
113
|
+
const apiKey = apiKeys.anthropicApiKey;
|
|
114
|
+
if (!apiKey)
|
|
115
|
+
throw new Error('Missing ANTHROPIC_API_KEY for anthropic/... model');
|
|
116
|
+
const { createAnthropic } = await import('@ai-sdk/anthropic');
|
|
117
|
+
const anthropic = createAnthropic({ apiKey, fetch: fetchImpl });
|
|
118
|
+
const result = await generateText({
|
|
119
|
+
model: anthropic(parsed.model),
|
|
120
|
+
system,
|
|
121
|
+
...(typeof prompt === 'string' ? { prompt } : { messages: prompt }),
|
|
122
|
+
...(typeof temperature === 'number' ? { temperature } : {}),
|
|
123
|
+
...(typeof maxOutputTokens === 'number' ? { maxOutputTokens } : {}),
|
|
124
|
+
abortSignal: controller.signal,
|
|
125
|
+
});
|
|
126
|
+
return {
|
|
127
|
+
text: result.text,
|
|
128
|
+
canonicalModelId: parsed.canonical,
|
|
129
|
+
provider: parsed.provider,
|
|
130
|
+
usage: normalizeTokenUsage(result.usage),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
const apiKey = apiKeys.openaiApiKey;
|
|
134
|
+
if (!apiKey)
|
|
135
|
+
throw new Error('Missing OPENAI_API_KEY for openai/... model');
|
|
136
|
+
const { createOpenAI } = await import('@ai-sdk/openai');
|
|
137
|
+
const openai = createOpenAI({ apiKey, fetch: fetchImpl });
|
|
138
|
+
const baseUrl = typeof process !== 'undefined' ? process.env.OPENAI_BASE_URL : undefined;
|
|
139
|
+
const useChatCompletions = typeof baseUrl === 'string' && /openrouter\.ai/i.test(baseUrl) && baseUrl.length > 0;
|
|
140
|
+
const responsesModelId = parsed.model;
|
|
141
|
+
const chatModelId = parsed.model;
|
|
142
|
+
const result = await generateText({
|
|
143
|
+
model: useChatCompletions ? openai.chat(chatModelId) : openai(responsesModelId),
|
|
144
|
+
system,
|
|
145
|
+
...(typeof prompt === 'string' ? { prompt } : { messages: prompt }),
|
|
146
|
+
...(typeof temperature === 'number' ? { temperature } : {}),
|
|
147
|
+
...(typeof maxOutputTokens === 'number' ? { maxOutputTokens } : {}),
|
|
148
|
+
abortSignal: controller.signal,
|
|
149
|
+
});
|
|
150
|
+
return {
|
|
151
|
+
text: result.text,
|
|
152
|
+
canonicalModelId: parsed.canonical,
|
|
153
|
+
provider: parsed.provider,
|
|
154
|
+
usage: normalizeTokenUsage(result.usage),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
if (parsed.provider === 'anthropic') {
|
|
159
|
+
const normalized = normalizeAnthropicModelAccessError(error, parsed.model);
|
|
160
|
+
if (normalized)
|
|
161
|
+
throw normalized;
|
|
162
|
+
}
|
|
163
|
+
if (error instanceof DOMException && error.name === 'AbortError') {
|
|
164
|
+
throw new Error('LLM request timed out');
|
|
165
|
+
}
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
clearTimeout(timeout);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export async function streamTextWithModelId({ modelId, apiKeys, system, prompt, temperature, maxOutputTokens, timeoutMs, fetchImpl, }) {
|
|
173
|
+
const parsed = parseGatewayStyleModelId(modelId);
|
|
174
|
+
const controller = new AbortController();
|
|
175
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
176
|
+
try {
|
|
177
|
+
const { streamText } = await import('ai');
|
|
178
|
+
let lastError = null;
|
|
179
|
+
const onError = ({ error }) => {
|
|
180
|
+
if (parsed.provider === 'anthropic') {
|
|
181
|
+
lastError = normalizeAnthropicModelAccessError(error, parsed.model) ?? error;
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
lastError = error;
|
|
185
|
+
};
|
|
186
|
+
if (parsed.provider === 'xai') {
|
|
187
|
+
const apiKey = apiKeys.xaiApiKey;
|
|
188
|
+
if (!apiKey)
|
|
189
|
+
throw new Error('Missing XAI_API_KEY for xai/... model');
|
|
190
|
+
const { createXai } = await import('@ai-sdk/xai');
|
|
191
|
+
const xai = createXai({ apiKey, fetch: fetchImpl });
|
|
192
|
+
const result = streamText({
|
|
193
|
+
model: xai(parsed.model),
|
|
194
|
+
system,
|
|
195
|
+
...(typeof prompt === 'string' ? { prompt } : { messages: prompt }),
|
|
196
|
+
...(typeof temperature === 'number' ? { temperature } : {}),
|
|
197
|
+
...(typeof maxOutputTokens === 'number' ? { maxOutputTokens } : {}),
|
|
198
|
+
abortSignal: controller.signal,
|
|
199
|
+
onError,
|
|
200
|
+
});
|
|
201
|
+
return {
|
|
202
|
+
textStream: result.textStream,
|
|
203
|
+
canonicalModelId: parsed.canonical,
|
|
204
|
+
provider: parsed.provider,
|
|
205
|
+
usage: result.totalUsage.then((raw) => normalizeTokenUsage(raw)).catch(() => null),
|
|
206
|
+
lastError: () => lastError,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
if (parsed.provider === 'google') {
|
|
210
|
+
const apiKey = apiKeys.googleApiKey;
|
|
211
|
+
if (!apiKey)
|
|
212
|
+
throw new Error('Missing GEMINI_API_KEY (or GOOGLE_GENERATIVE_AI_API_KEY / GOOGLE_API_KEY) for google/... model');
|
|
213
|
+
const { createGoogleGenerativeAI } = await import('@ai-sdk/google');
|
|
214
|
+
const google = createGoogleGenerativeAI({ apiKey, fetch: fetchImpl });
|
|
215
|
+
const result = streamText({
|
|
216
|
+
model: google(parsed.model),
|
|
217
|
+
system,
|
|
218
|
+
...(typeof prompt === 'string' ? { prompt } : { messages: prompt }),
|
|
219
|
+
...(typeof temperature === 'number' ? { temperature } : {}),
|
|
220
|
+
...(typeof maxOutputTokens === 'number' ? { maxOutputTokens } : {}),
|
|
221
|
+
abortSignal: controller.signal,
|
|
222
|
+
onError,
|
|
223
|
+
});
|
|
224
|
+
return {
|
|
225
|
+
textStream: result.textStream,
|
|
226
|
+
canonicalModelId: parsed.canonical,
|
|
227
|
+
provider: parsed.provider,
|
|
228
|
+
usage: result.totalUsage.then((raw) => normalizeTokenUsage(raw)).catch(() => null),
|
|
229
|
+
lastError: () => lastError,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
if (parsed.provider === 'anthropic') {
|
|
233
|
+
const apiKey = apiKeys.anthropicApiKey;
|
|
234
|
+
if (!apiKey)
|
|
235
|
+
throw new Error('Missing ANTHROPIC_API_KEY for anthropic/... model');
|
|
236
|
+
const { createAnthropic } = await import('@ai-sdk/anthropic');
|
|
237
|
+
const anthropic = createAnthropic({ apiKey, fetch: fetchImpl });
|
|
238
|
+
const result = streamText({
|
|
239
|
+
model: anthropic(parsed.model),
|
|
240
|
+
system,
|
|
241
|
+
...(typeof prompt === 'string' ? { prompt } : { messages: prompt }),
|
|
242
|
+
...(typeof temperature === 'number' ? { temperature } : {}),
|
|
243
|
+
...(typeof maxOutputTokens === 'number' ? { maxOutputTokens } : {}),
|
|
244
|
+
abortSignal: controller.signal,
|
|
245
|
+
onError,
|
|
246
|
+
});
|
|
247
|
+
return {
|
|
248
|
+
textStream: result.textStream,
|
|
249
|
+
canonicalModelId: parsed.canonical,
|
|
250
|
+
provider: parsed.provider,
|
|
251
|
+
usage: result.totalUsage.then((raw) => normalizeTokenUsage(raw)).catch(() => null),
|
|
252
|
+
lastError: () => lastError,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const apiKey = apiKeys.openaiApiKey;
|
|
256
|
+
if (!apiKey)
|
|
257
|
+
throw new Error('Missing OPENAI_API_KEY for openai/... model');
|
|
258
|
+
const { createOpenAI } = await import('@ai-sdk/openai');
|
|
259
|
+
const openai = createOpenAI({ apiKey, fetch: fetchImpl });
|
|
260
|
+
const baseUrl = typeof process !== 'undefined' ? process.env.OPENAI_BASE_URL : undefined;
|
|
261
|
+
const useChatCompletions = typeof baseUrl === 'string' && /openrouter\.ai/i.test(baseUrl) && baseUrl.length > 0;
|
|
262
|
+
const responsesModelId = parsed.model;
|
|
263
|
+
const chatModelId = parsed.model;
|
|
264
|
+
const result = streamText({
|
|
265
|
+
model: useChatCompletions ? openai.chat(chatModelId) : openai(responsesModelId),
|
|
266
|
+
system,
|
|
267
|
+
...(typeof prompt === 'string' ? { prompt } : { messages: prompt }),
|
|
268
|
+
...(typeof temperature === 'number' ? { temperature } : {}),
|
|
269
|
+
...(typeof maxOutputTokens === 'number' ? { maxOutputTokens } : {}),
|
|
270
|
+
abortSignal: controller.signal,
|
|
271
|
+
onError,
|
|
272
|
+
});
|
|
273
|
+
return {
|
|
274
|
+
textStream: result.textStream,
|
|
275
|
+
canonicalModelId: parsed.canonical,
|
|
276
|
+
provider: parsed.provider,
|
|
277
|
+
usage: result.totalUsage.then((raw) => normalizeTokenUsage(raw)).catch(() => null),
|
|
278
|
+
lastError: () => lastError,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
if (parsed.provider === 'anthropic') {
|
|
283
|
+
const normalized = normalizeAnthropicModelAccessError(error, parsed.model);
|
|
284
|
+
if (normalized)
|
|
285
|
+
throw normalized;
|
|
286
|
+
}
|
|
287
|
+
if (error instanceof DOMException && error.name === 'AbortError') {
|
|
288
|
+
throw new Error('LLM request timed out');
|
|
289
|
+
}
|
|
290
|
+
throw error;
|
|
291
|
+
}
|
|
292
|
+
finally {
|
|
293
|
+
clearTimeout(timeout);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=generate-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-text.js","sourceRoot":"","sources":["../../../src/llm/generate-text.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AAexD,SAAS,0BAA0B,CACjC,YAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAGrC,CAAA;QACD,IAAI,MAAM,EAAE,IAAI,KAAK,OAAO;YAAE,OAAO,IAAI,CAAA;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;QAC1B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAA;QACpD,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;QACpE,MAAM,YAAY,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;QAC7E,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAA;QAC5C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,CAAA;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,kCAAkC,CAAC,KAAc,EAAE,OAAe;IACzE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACpD,MAAM,KAAK,GAAG,KAAgC,CAAA;IAC9C,MAAM,UAAU,GAAG,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAA;IACjF,MAAM,YAAY,GAAG,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAA;IACvF,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,0BAA0B,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC9E,MAAM,WAAW,GAAG,OAAO,EAAE,IAAI,IAAI,IAAI,CAAA;IACzC,MAAM,cAAc,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAA;IAC/C,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;IACtE,MAAM,eAAe,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;IAE1D,MAAM,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC9D,MAAM,cAAc,GAAG,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,CAAA;IACrF,MAAM,YAAY,GAChB,WAAW,KAAK,iBAAiB;QACjC,WAAW,KAAK,kBAAkB;QAClC,WAAW,KAAK,sBAAsB,CAAA;IAExC,IAAI,CAAC,eAAe,IAAI,CAAC,cAAc,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAA;IAErE,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAA;IAChG,MAAM,IAAI,GAAG,iCAAiC,UAAU,uJAAuJ,CAAA;IAC/M,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAA;AAC/E,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAY;IACvC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IAChD,MAAM,KAAK,GAAG,GAA8B,CAAA;IAE5C,MAAM,YAAY,GAChB,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;QAC3E,CAAC,CAAC,KAAK,CAAC,YAAY;QACpB,CAAC,CAAC,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC;YAC3E,CAAC,CAAC,KAAK,CAAC,WAAW;YACnB,CAAC,CAAC,IAAI,CAAA;IACZ,MAAM,gBAAgB,GACpB,OAAO,KAAK,CAAC,gBAAgB,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACnF,CAAC,CAAC,KAAK,CAAC,gBAAgB;QACxB,CAAC,CAAC,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;YAC7E,CAAC,CAAC,KAAK,CAAC,YAAY;YACpB,CAAC,CAAC,IAAI,CAAA;IACZ,MAAM,WAAW,GACf,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC;QACzE,CAAC,CAAC,KAAK,CAAC,WAAW;QACnB,CAAC,CAAC,IAAI,CAAA;IAEV,IAAI,YAAY,KAAK,IAAI,IAAI,gBAAgB,KAAK,IAAI,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QAC/E,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAA;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,EAC5C,OAAO,EACP,OAAO,EACP,MAAM,EACN,MAAM,EACN,WAAW,EACX,eAAe,EACf,SAAS,EACT,SAAS,GAUV;IAMC,MAAM,MAAM,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAA;IAEhD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAA;IAE/D,IAAI,CAAC;QACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;QAE3C,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAA;YAChC,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;YACrE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;YACjD,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;YACnD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;gBAChC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;gBACxB,MAAM;gBACN,GAAG,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;gBACnE,GAAG,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,GAAG,CAAC,OAAO,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,WAAW,EAAE,UAAU,CAAC,MAAM;aAC/B,CAAC,CAAA;YACF,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,gBAAgB,EAAE,MAAM,CAAC,SAAS;gBAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,KAAK,EAAE,mBAAmB,CAAE,MAAyC,CAAC,KAAK,CAAC;aAC7E,CAAA;QACH,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAA;YACnC,IAAI,CAAC,MAAM;gBACT,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAA;YACH,MAAM,EAAE,wBAAwB,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAA;YACnE,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;YACrE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;gBAChC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC3B,MAAM;gBACN,GAAG,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;gBACnE,GAAG,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,GAAG,CAAC,OAAO,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,WAAW,EAAE,UAAU,CAAC,MAAM;aAC/B,CAAC,CAAA;YACF,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,gBAAgB,EAAE,MAAM,CAAC,SAAS;gBAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,KAAK,EAAE,mBAAmB,CAAE,MAAyC,CAAC,KAAK,CAAC;aAC7E,CAAA;QACH,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAA;YACtC,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;YACjF,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;YAC7D,MAAM,SAAS,GAAG,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;YAC/D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;gBAChC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC9B,MAAM;gBACN,GAAG,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;gBACnE,GAAG,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,GAAG,CAAC,OAAO,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,WAAW,EAAE,UAAU,CAAC,MAAM;aAC/B,CAAC,CAAA;YACF,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,gBAAgB,EAAE,MAAM,CAAC,SAAS;gBAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,KAAK,EAAE,mBAAmB,CAAE,MAAyC,CAAC,KAAK,CAAC;aAC7E,CAAA;QACH,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAA;QACnC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;QAC3E,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAA;QACvD,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;QACzD,MAAM,OAAO,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAA;QACxF,MAAM,kBAAkB,GACtB,OAAO,OAAO,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA;QACtF,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAgD,CAAA;QAChF,MAAM,WAAW,GAAG,MAAM,CAAC,KAAqD,CAAA;QAChF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC;YAC/E,MAAM;YACN,GAAG,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;YACnE,GAAG,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,OAAO,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,WAAW,EAAE,UAAU,CAAC,MAAM;SAC/B,CAAC,CAAA;QACF,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,gBAAgB,EAAE,MAAM,CAAC,SAAS;YAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,mBAAmB,CAAE,MAAyC,CAAC,KAAK,CAAC;SAC7E,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,kCAAkC,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;YAC1E,IAAI,UAAU;gBAAE,MAAM,UAAU,CAAA;QAClC,CAAC;QACD,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;QAC1C,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAA;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAC1C,OAAO,EACP,OAAO,EACP,MAAM,EACN,MAAM,EACN,WAAW,EACX,eAAe,EACf,SAAS,EACT,SAAS,GAUV;IAOC,MAAM,MAAM,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAA;IAEhD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAA;IAE/D,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI,SAAS,GAAY,IAAI,CAAA;QAC7B,MAAM,OAAO,GAAG,CAAC,EAAE,KAAK,EAAsB,EAAE,EAAE;YAChD,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;gBACpC,SAAS,GAAG,kCAAkC,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAA;gBAC5E,OAAM;YACR,CAAC;YACD,SAAS,GAAG,KAAK,CAAA;QACnB,CAAC,CAAA;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAA;YAChC,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;YACrE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;YACjD,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;YACnD,MAAM,MAAM,GAAG,UAAU,CAAC;gBACxB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;gBACxB,MAAM;gBACN,GAAG,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;gBACnE,GAAG,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,GAAG,CAAC,OAAO,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,WAAW,EAAE,UAAU,CAAC,MAAM;gBAC9B,OAAO;aACR,CAAC,CAAA;YACF,OAAO;gBACL,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,gBAAgB,EAAE,MAAM,CAAC,SAAS;gBAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;gBAClF,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS;aAC3B,CAAA;QACH,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAA;YACnC,IAAI,CAAC,MAAM;gBACT,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAA;YACH,MAAM,EAAE,wBAAwB,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAA;YACnE,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;YACrE,MAAM,MAAM,GAAG,UAAU,CAAC;gBACxB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC3B,MAAM;gBACN,GAAG,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;gBACnE,GAAG,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,GAAG,CAAC,OAAO,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,WAAW,EAAE,UAAU,CAAC,MAAM;gBAC9B,OAAO;aACR,CAAC,CAAA;YACF,OAAO;gBACL,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,gBAAgB,EAAE,MAAM,CAAC,SAAS;gBAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;gBAClF,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS;aAC3B,CAAA;QACH,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAA;YACtC,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;YACjF,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;YAC7D,MAAM,SAAS,GAAG,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;YAC/D,MAAM,MAAM,GAAG,UAAU,CAAC;gBACxB,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC9B,MAAM;gBACN,GAAG,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;gBACnE,GAAG,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,GAAG,CAAC,OAAO,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,WAAW,EAAE,UAAU,CAAC,MAAM;gBAC9B,OAAO;aACR,CAAC,CAAA;YACF,OAAO;gBACL,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,gBAAgB,EAAE,MAAM,CAAC,SAAS;gBAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;gBAClF,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS;aAC3B,CAAA;QACH,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAA;QACnC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;QAC3E,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAA;QACvD,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;QACzD,MAAM,OAAO,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAA;QACxF,MAAM,kBAAkB,GACtB,OAAO,OAAO,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA;QACtF,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAgD,CAAA;QAChF,MAAM,WAAW,GAAG,MAAM,CAAC,KAAqD,CAAA;QAChF,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC;YAC/E,MAAM;YACN,GAAG,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;YACnE,GAAG,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,OAAO,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,WAAW,EAAE,UAAU,CAAC,MAAM;YAC9B,OAAO;SACR,CAAC,CAAA;QACF,OAAO;YACL,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,gBAAgB,EAAE,MAAM,CAAC,SAAS;YAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;YAClF,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS;SAC3B,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,kCAAkC,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;YAC1E,IAAI,UAAU;gBAAE,MAAM,UAAU,CAAA;QAClC,CAAC;QACD,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;QAC1C,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAA;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
function normalizeModelId(id) {
|
|
2
|
+
const trimmed = id.trim();
|
|
3
|
+
if (trimmed.startsWith('models/'))
|
|
4
|
+
return trimmed.slice('models/'.length);
|
|
5
|
+
return trimmed;
|
|
6
|
+
}
|
|
7
|
+
function isProbablyUnstableGoogleModelId(modelId) {
|
|
8
|
+
const id = modelId.toLowerCase();
|
|
9
|
+
if (id.includes('preview'))
|
|
10
|
+
return true;
|
|
11
|
+
if (id.includes('exp'))
|
|
12
|
+
return true;
|
|
13
|
+
if (id.includes('alpha'))
|
|
14
|
+
return true;
|
|
15
|
+
if (id.includes('beta'))
|
|
16
|
+
return true;
|
|
17
|
+
if (id.startsWith('gemini-3'))
|
|
18
|
+
return true;
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
function withTimeoutSignal(timeoutMs) {
|
|
22
|
+
const controller = new AbortController();
|
|
23
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
24
|
+
return { signal: controller.signal, cleanup: () => clearTimeout(timeout) };
|
|
25
|
+
}
|
|
26
|
+
async function listGoogleModels({ apiKey, fetchImpl, timeoutMs, }) {
|
|
27
|
+
const { signal, cleanup } = withTimeoutSignal(timeoutMs);
|
|
28
|
+
try {
|
|
29
|
+
const res = await fetchImpl(`https://generativelanguage.googleapis.com/v1beta/models?key=${encodeURIComponent(apiKey)}`, { signal });
|
|
30
|
+
if (!res.ok) {
|
|
31
|
+
let bodyText = '';
|
|
32
|
+
try {
|
|
33
|
+
bodyText = await res.text();
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
bodyText = '';
|
|
37
|
+
}
|
|
38
|
+
const snippet = bodyText.trim().slice(0, 200);
|
|
39
|
+
const suffix = snippet.length > 0 ? `: ${snippet}` : '';
|
|
40
|
+
throw new Error(`Google ListModels failed (${res.status} ${res.statusText})${suffix}`);
|
|
41
|
+
}
|
|
42
|
+
const json = (await res.json());
|
|
43
|
+
return Array.isArray(json.models) ? json.models : [];
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
cleanup();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function pickSuggestions(models, limit) {
|
|
50
|
+
const prefer = (s) => s.toLowerCase();
|
|
51
|
+
const ids = models
|
|
52
|
+
.map((m) => normalizeModelId(m.name))
|
|
53
|
+
.filter(Boolean)
|
|
54
|
+
.sort((a, b) => {
|
|
55
|
+
const aa = prefer(a);
|
|
56
|
+
const bb = prefer(b);
|
|
57
|
+
const score = (id) => (id.includes('flash') ? 0 : 10) +
|
|
58
|
+
(id.includes('3.0') || id.includes('3') ? 0 : 5) +
|
|
59
|
+
(id.includes('preview') ? 2 : 0);
|
|
60
|
+
return score(aa) - score(bb);
|
|
61
|
+
});
|
|
62
|
+
return ids.slice(0, Math.max(1, limit));
|
|
63
|
+
}
|
|
64
|
+
export async function resolveGoogleModelForUsage({ requestedModelId, apiKey, fetchImpl, timeoutMs, }) {
|
|
65
|
+
const requested = normalizeModelId(requestedModelId);
|
|
66
|
+
// Avoid an extra API call for known stable IDs.
|
|
67
|
+
if (!isProbablyUnstableGoogleModelId(requested)) {
|
|
68
|
+
return { resolvedModelId: requested, supportedMethods: [], note: null };
|
|
69
|
+
}
|
|
70
|
+
let models;
|
|
71
|
+
try {
|
|
72
|
+
models = await listGoogleModels({ apiKey, fetchImpl, timeoutMs });
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
76
|
+
throw new Error(`Cannot verify Google model availability for ${requestedModelId}. ${message}\n` +
|
|
77
|
+
`Check GEMINI_API_KEY (or GOOGLE_GENERATIVE_AI_API_KEY / GOOGLE_API_KEY) and that the Gemini API is enabled for this key.`, { cause: error });
|
|
78
|
+
}
|
|
79
|
+
const byId = new Map();
|
|
80
|
+
for (const model of models) {
|
|
81
|
+
byId.set(normalizeModelId(model.name), model);
|
|
82
|
+
}
|
|
83
|
+
const exact = byId.get(requested);
|
|
84
|
+
const strippedPreview = requested.endsWith('-preview')
|
|
85
|
+
? requested.slice(0, -'-preview'.length)
|
|
86
|
+
: null;
|
|
87
|
+
const noPreview = strippedPreview ? byId.get(strippedPreview) : null;
|
|
88
|
+
const candidate = exact ?? noPreview;
|
|
89
|
+
if (candidate) {
|
|
90
|
+
const methods = Array.isArray(candidate.supportedGenerationMethods)
|
|
91
|
+
? candidate.supportedGenerationMethods
|
|
92
|
+
: [];
|
|
93
|
+
if (noPreview && !exact) {
|
|
94
|
+
return {
|
|
95
|
+
resolvedModelId: normalizeModelId(candidate.name),
|
|
96
|
+
supportedMethods: methods,
|
|
97
|
+
note: `Resolved ${requestedModelId} → ${normalizeModelId(candidate.name)} via ListModels`,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
resolvedModelId: normalizeModelId(candidate.name),
|
|
102
|
+
supportedMethods: methods,
|
|
103
|
+
note: null,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const suggestions = pickSuggestions(models, 5);
|
|
107
|
+
const hint = suggestions.length > 0
|
|
108
|
+
? `Try one of: ${suggestions.map((id) => `google/${id}`).join(', ')}`
|
|
109
|
+
: 'Run ListModels to see available models for your key.';
|
|
110
|
+
throw new Error(`Google model ${requestedModelId} is not available via the Gemini API (v1beta) for this API key. ${hint}`);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=google-models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-models.js","sourceRoot":"","sources":["../../../src/llm/google-models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { generateTextWithModelId } from './generate-text.js';
|
|
2
|
+
const MAX_HTML_INPUT_CHARACTERS = 200_000;
|
|
3
|
+
function buildHtmlToMarkdownPrompt({ url, title, siteName, html, }) {
|
|
4
|
+
const system = `You convert HTML into clean GitHub-Flavored Markdown.
|
|
5
|
+
|
|
6
|
+
Rules:
|
|
7
|
+
- Output ONLY Markdown (no JSON, no explanations, no code fences).
|
|
8
|
+
- Keep headings, lists, code blocks, blockquotes.
|
|
9
|
+
- Preserve links as Markdown links when possible.
|
|
10
|
+
- Remove navigation, cookie banners, footers, and unrelated page chrome.
|
|
11
|
+
- Do not invent content.`;
|
|
12
|
+
const prompt = `URL: ${url}
|
|
13
|
+
Site: ${siteName ?? 'unknown'}
|
|
14
|
+
Title: ${title ?? 'unknown'}
|
|
15
|
+
|
|
16
|
+
HTML:
|
|
17
|
+
"""
|
|
18
|
+
${html}
|
|
19
|
+
"""
|
|
20
|
+
`;
|
|
21
|
+
return { system, prompt };
|
|
22
|
+
}
|
|
23
|
+
export function createHtmlToMarkdownConverter({ modelId, xaiApiKey, googleApiKey, openaiApiKey, anthropicApiKey, fetchImpl, onUsage, }) {
|
|
24
|
+
return async ({ url, html, title, siteName, timeoutMs }) => {
|
|
25
|
+
const trimmedHtml = html.length > MAX_HTML_INPUT_CHARACTERS ? html.slice(0, MAX_HTML_INPUT_CHARACTERS) : html;
|
|
26
|
+
const { system, prompt } = buildHtmlToMarkdownPrompt({
|
|
27
|
+
url,
|
|
28
|
+
title,
|
|
29
|
+
siteName,
|
|
30
|
+
html: trimmedHtml,
|
|
31
|
+
});
|
|
32
|
+
const result = await generateTextWithModelId({
|
|
33
|
+
modelId,
|
|
34
|
+
apiKeys: { xaiApiKey, googleApiKey, openaiApiKey, anthropicApiKey },
|
|
35
|
+
system,
|
|
36
|
+
prompt,
|
|
37
|
+
timeoutMs,
|
|
38
|
+
fetchImpl,
|
|
39
|
+
});
|
|
40
|
+
onUsage?.({ model: result.canonicalModelId, provider: result.provider, usage: result.usage });
|
|
41
|
+
return result.text;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=html-to-markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-to-markdown.js","sourceRoot":"","sources":["../../../src/llm/html-to-markdown.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AAE5D,MAAM,yBAAyB,GAAG,OAAO,CAAA;AAEzC,SAAS,yBAAyB,CAAC,EACjC,GAAG,EACH,KAAK,EACL,QAAQ,EACR,IAAI,GAML;IACC,MAAM,MAAM,GAAG;;;;;;;yBAOQ,CAAA;IAEvB,MAAM,MAAM,GAAG,QAAQ,GAAG;QACpB,QAAQ,IAAI,SAAS;SACpB,KAAK,IAAI,SAAS;;;;EAIzB,IAAI;;CAEL,CAAA;IAEC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;AAC3B,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,EAC5C,OAAO,EACP,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,SAAS,EACT,OAAO,GAaR;IACC,OAAO,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;QACzD,MAAM,WAAW,GACf,IAAI,CAAC,MAAM,GAAG,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAC3F,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,yBAAyB,CAAC;YACnD,GAAG;YACH,KAAK;YACL,QAAQ;YACR,IAAI,EAAE,WAAW;SAClB,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC;YAC3C,OAAO;YACP,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE;YACnE,MAAM;YACN,MAAM;YACN,SAAS;YACT,SAAS;SACV,CAAC,CAAA;QACF,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,gBAAgB,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QAC7F,OAAO,MAAM,CAAC,IAAI,CAAA;IACpB,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const PROVIDERS = ['xai', 'openai', 'google', 'anthropic'];
|
|
2
|
+
export function normalizeGatewayStyleModelId(raw) {
|
|
3
|
+
const trimmed = raw.trim();
|
|
4
|
+
if (trimmed.length === 0) {
|
|
5
|
+
throw new Error('Missing model id');
|
|
6
|
+
}
|
|
7
|
+
const normalized = trimmed.toLowerCase();
|
|
8
|
+
// Common historical alias (used in prompts/docs earlier)
|
|
9
|
+
if (normalized === 'grok-4-1-fast-non-reasoning')
|
|
10
|
+
return 'xai/grok-4-fast-non-reasoning';
|
|
11
|
+
if (normalized === 'grok-4.1-fast-non-reasoning')
|
|
12
|
+
return 'xai/grok-4-fast-non-reasoning';
|
|
13
|
+
if (normalized === 'xai/grok-4-1-fast-non-reasoning')
|
|
14
|
+
return 'xai/grok-4-fast-non-reasoning';
|
|
15
|
+
if (normalized === 'xai/grok-4.1-fast-non-reasoning')
|
|
16
|
+
return 'xai/grok-4-fast-non-reasoning';
|
|
17
|
+
const slash = normalized.indexOf('/');
|
|
18
|
+
if (slash === -1) {
|
|
19
|
+
// Best-effort inference for backwards-compat CLI usage.
|
|
20
|
+
if (normalized.startsWith('grok-'))
|
|
21
|
+
return `xai/${normalized}`;
|
|
22
|
+
if (normalized.startsWith('gemini-'))
|
|
23
|
+
return `google/${normalized}`;
|
|
24
|
+
if (normalized.startsWith('claude-'))
|
|
25
|
+
return `anthropic/${normalized}`;
|
|
26
|
+
return `openai/${normalized}`;
|
|
27
|
+
}
|
|
28
|
+
const provider = normalized.slice(0, slash);
|
|
29
|
+
const model = normalized.slice(slash + 1);
|
|
30
|
+
if (!PROVIDERS.includes(provider)) {
|
|
31
|
+
throw new Error(`Unsupported model provider "${provider}". Use xai/..., openai/..., google/..., or anthropic/...`);
|
|
32
|
+
}
|
|
33
|
+
if (model.trim().length === 0) {
|
|
34
|
+
throw new Error('Missing model id after provider prefix');
|
|
35
|
+
}
|
|
36
|
+
return `${provider}/${model}`;
|
|
37
|
+
}
|
|
38
|
+
export function parseGatewayStyleModelId(raw) {
|
|
39
|
+
const canonical = normalizeGatewayStyleModelId(raw);
|
|
40
|
+
const slash = canonical.indexOf('/');
|
|
41
|
+
const provider = canonical.slice(0, slash);
|
|
42
|
+
const model = canonical.slice(slash + 1);
|
|
43
|
+
return { provider, model, canonical };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=model-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-id.js","sourceRoot":"","sources":["../../../src/llm/model-id.ts"],"names":[],"mappings":"AAcA,MAAM,SAAS,GAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;AAEzE,MAAM,UAAU,4BAA4B,CAAC,GAAW;IACtD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IAC1B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACrC,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;IAExC,yDAAyD;IACzD,IAAI,UAAU,KAAK,6BAA6B;QAAE,OAAO,+BAA+B,CAAA;IACxF,IAAI,UAAU,KAAK,6BAA6B;QAAE,OAAO,+BAA+B,CAAA;IACxF,IAAI,UAAU,KAAK,iCAAiC;QAAE,OAAO,+BAA+B,CAAA;IAC5F,IAAI,UAAU,KAAK,iCAAiC;QAAE,OAAO,+BAA+B,CAAA;IAE5F,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACrC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,wDAAwD;QACxD,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,UAAU,EAAE,CAAA;QAC9D,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,UAAU,UAAU,EAAE,CAAA;QACnE,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,aAAa,UAAU,EAAE,CAAA;QACtE,OAAO,UAAU,UAAU,EAAE,CAAA;IAC/B,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;IACzC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAuB,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CACb,+BAA+B,QAAQ,0DAA0D,CAClG,CAAA;IACH,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAC3D,CAAC;IACD,OAAO,GAAG,QAAQ,IAAI,KAAK,EAAE,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,GAAW;IAClD,MAAM,SAAS,GAAG,4BAA4B,CAAC,GAAG,CAAC,CAAA;IACnD,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACpC,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAgB,CAAA;IACzD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;IACxC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;AACvC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { loadLiteLlmCatalog as loadLiteLlmCatalogTokentally, resolveLiteLlmMaxOutputTokens as resolveLiteLlmMaxOutputTokensTokentally, resolveLiteLlmPricing as resolveLiteLlmPricingTokentally, } from 'tokentally/node';
|
|
3
|
+
function withDefaultCacheDir(env) {
|
|
4
|
+
if (typeof env.TOKENTALLY_CACHE_DIR === 'string' && env.TOKENTALLY_CACHE_DIR.trim().length > 0) {
|
|
5
|
+
return env;
|
|
6
|
+
}
|
|
7
|
+
const home = env.HOME?.trim();
|
|
8
|
+
if (!home)
|
|
9
|
+
return env;
|
|
10
|
+
return { ...env, TOKENTALLY_CACHE_DIR: path.join(home, '.summarize', 'cache') };
|
|
11
|
+
}
|
|
12
|
+
export async function loadLiteLlmCatalog({ env, fetchImpl, nowMs = Date.now(), }) {
|
|
13
|
+
return loadLiteLlmCatalogTokentally({
|
|
14
|
+
env: withDefaultCacheDir(env),
|
|
15
|
+
fetchImpl,
|
|
16
|
+
nowMs,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function resolveLiteLlmPricingForModelId(catalog, modelId) {
|
|
20
|
+
return resolveLiteLlmPricingTokentally(catalog, modelId);
|
|
21
|
+
}
|
|
22
|
+
export function resolveLiteLlmMaxOutputTokensForModelId(catalog, modelId) {
|
|
23
|
+
return resolveLiteLlmMaxOutputTokensTokentally(catalog, modelId);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=litellm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"litellm.js","sourceRoot":"","sources":["../../../src/pricing/litellm.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAGL,kBAAkB,IAAI,4BAA4B,EAClD,6BAA6B,IAAI,uCAAuC,EACxE,qBAAqB,IAAI,+BAA+B,GACzD,MAAM,iBAAiB,CAAA;AAExB,SAAS,mBAAmB,CAC1B,GAAuC;IAEvC,IAAI,OAAO,GAAG,CAAC,oBAAoB,KAAK,QAAQ,IAAI,GAAG,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/F,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAA;IAC7B,IAAI,CAAC,IAAI;QAAE,OAAO,GAAG,CAAA;IACrB,OAAO,EAAE,GAAG,GAAG,EAAE,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;AACjF,CAAC;AAID,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EACvC,GAAG,EACH,SAAS,EACT,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAKnB;IACC,OAAO,4BAA4B,CAAC;QAClC,GAAG,EAAE,mBAAmB,CAAC,GAAG,CAAC;QAC7B,SAAS;QACT,KAAK;KACN,CAAC,CAAA;AACJ,CAAC;AAID,MAAM,UAAU,+BAA+B,CAC7C,OAAuB,EACvB,OAAe;IAEf,OAAO,+BAA+B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,uCAAuC,CACrD,OAAuB,EACvB,OAAe;IAEf,OAAO,uCAAuC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AAClE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function buildFileSummaryPrompt({ filename, mediaType, summaryLength, }) {
|
|
2
|
+
const maxCharactersLine = typeof summaryLength === 'string'
|
|
3
|
+
? ''
|
|
4
|
+
: `Target length: around ${summaryLength.maxCharacters.toLocaleString()} characters total (including Markdown and whitespace). This is a soft guideline; prioritize clarity.`;
|
|
5
|
+
const headerLines = [
|
|
6
|
+
filename ? `Filename: ${filename}` : null,
|
|
7
|
+
mediaType ? `Media type: ${mediaType}` : null,
|
|
8
|
+
].filter(Boolean);
|
|
9
|
+
const prompt = `You summarize files for curious users. Summarize the attached file. Be factual and do not invent details. Format the answer in Markdown. Do not use emojis. ${maxCharactersLine}
|
|
10
|
+
|
|
11
|
+
${headerLines.length > 0 ? `${headerLines.join('\n')}\n\n` : ''}Return only the summary.`;
|
|
12
|
+
return prompt;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../../src/prompts/file.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,sBAAsB,CAAC,EACrC,QAAQ,EACR,SAAS,EACT,aAAa,GAKd;IACC,MAAM,iBAAiB,GACrB,OAAO,aAAa,KAAK,QAAQ;QAC/B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,yBAAyB,aAAa,CAAC,aAAa,CAAC,cAAc,EAAE,sGAAsG,CAAA;IAEjL,MAAM,WAAW,GAAG;QAClB,QAAQ,CAAC,CAAC,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI;QACzC,SAAS,CAAC,CAAC,CAAC,eAAe,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI;KAC9C,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAEjB,MAAM,MAAM,GAAG,+JAA+J,iBAAiB;;EAE/L,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,0BAA0B,CAAA;IAEvF,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/prompts/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EACL,sBAAsB,EACtB,wCAAwC,EACxC,8BAA8B,EAE9B,wBAAwB,GAEzB,MAAM,mBAAmB,CAAA"}
|