noumen 0.6.0 → 0.8.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/README.md +237 -93
- package/dist/a2a/index.d.ts +5 -7
- package/dist/a2a/index.js +3 -4
- package/dist/a2a/index.js.map +1 -1
- package/dist/acp/index.d.ts +5 -7
- package/dist/acp/index.js +0 -1
- package/dist/acp/index.js.map +1 -1
- package/dist/{agent-DWE4_P5X.d.ts → agent-D0gl-qYi.d.ts} +89 -34
- package/dist/{chunk-6MMYCGJQ.js → chunk-5HY4IYNT.js} +1529 -2321
- package/dist/chunk-5HY4IYNT.js.map +1 -0
- package/dist/chunk-BC5BLWBC.js +21 -0
- package/dist/chunk-BC5BLWBC.js.map +1 -0
- package/dist/{chunk-XZN4QZLK.js → chunk-CX4BL6PC.js} +25 -15
- package/dist/chunk-CX4BL6PC.js.map +1 -0
- package/dist/{chunk-5GEX6ZSB.js → chunk-HQISH4D7.js} +60 -1
- package/dist/chunk-HQISH4D7.js.map +1 -0
- package/dist/{chunk-Y45R3PQL.js → chunk-NUCJXOUV.js} +32 -18
- package/dist/{chunk-Y45R3PQL.js.map → chunk-NUCJXOUV.js.map} +1 -1
- package/dist/chunk-OPFFLQZL.js +40 -0
- package/dist/chunk-OPFFLQZL.js.map +1 -0
- package/dist/chunk-PDEAJ272.js +660 -0
- package/dist/chunk-PDEAJ272.js.map +1 -0
- package/dist/chunk-PKHLGGEC.js +115 -0
- package/dist/chunk-PKHLGGEC.js.map +1 -0
- package/dist/chunk-XQTNXRE7.js +176 -0
- package/dist/chunk-XQTNXRE7.js.map +1 -0
- package/dist/chunk-XZPAA5TO.js +817 -0
- package/dist/chunk-XZPAA5TO.js.map +1 -0
- package/dist/cli/index.js +77 -42
- package/dist/cli/index.js.map +1 -1
- package/dist/client/index.d.ts +1 -2
- package/dist/client/index.js +0 -2
- package/dist/client/index.js.map +1 -1
- package/dist/client-JJFLE6RT.js +9 -0
- package/dist/{computer-BPdxSo6X.d.ts → computer-DzMR92tK.d.ts} +1 -1
- package/dist/docker.d.ts +2 -2
- package/dist/docker.js +0 -1
- package/dist/docker.js.map +1 -1
- package/dist/e2b.d.ts +2 -2
- package/dist/e2b.js +0 -1
- package/dist/e2b.js.map +1 -1
- package/dist/freestyle.d.ts +2 -2
- package/dist/freestyle.js +0 -1
- package/dist/freestyle.js.map +1 -1
- package/dist/{headless-FFU2DESQ.js → headless-25DU4MJQ.js} +1 -3
- package/dist/{headless-FFU2DESQ.js.map → headless-25DU4MJQ.js.map} +1 -1
- package/dist/{history-snip-64GYP4ZL.js → history-snip-HAWNAYKY.js} +1 -2
- package/dist/index.d.ts +351 -72
- package/dist/index.js +54 -55
- package/dist/jsonrpc/index.js +0 -1
- package/dist/local.d.ts +168 -0
- package/dist/local.js +40 -0
- package/dist/local.js.map +1 -0
- package/dist/lsp/index.d.ts +4 -5
- package/dist/lsp/index.js +0 -1
- package/dist/{lsp-PS3BWIHC.js → lsp-3APWNKB2.js} +1 -2
- package/dist/{manager-DLXK63XC.js → manager-Z5EQ7YYV.js} +1 -2
- package/dist/mcp/index.d.ts +16 -8
- package/dist/mcp/index.js +5 -6
- package/dist/mcp/index.js.map +1 -1
- package/dist/{mcp-auth-AEI2R4ZC.js → mcp-auth-NOIQPF7W.js} +1 -2
- package/dist/{provider-factory-TUHU3DIG.js → provider-factory-KNBSHXJ6.js} +3 -3
- package/dist/{render-GRN4ZSSW.js → render-4VEODRK7.js} +1 -2
- package/dist/{resolve-6KUZNEYW.js → resolve-AGQZFMKD.js} +3 -3
- package/dist/sandbox-DAqQo0Tj.d.ts +49 -0
- package/dist/sandbox-index-ODNREIFA.js +32 -0
- package/dist/sandbox-index-ODNREIFA.js.map +1 -0
- package/dist/server/index.d.ts +18 -7
- package/dist/server/index.js +9 -5
- package/dist/server/index.js.map +1 -1
- package/dist/{server-BzNGKTP6.d.ts → server-DFXdlqyX.d.ts} +1 -1
- package/dist/{spinner-OJNR6NFO.js → spinner-72JEISPK.js} +1 -2
- package/dist/sprites.d.ts +2 -2
- package/dist/sprites.js +0 -1
- package/dist/sprites.js.map +1 -1
- package/dist/ssh.d.ts +2 -2
- package/dist/ssh.js +0 -1
- package/dist/ssh.js.map +1 -1
- package/dist/{types-DhXwOQwD.d.ts → types-BX4ALqoN.d.ts} +76 -4
- package/dist/{types-kiGBF35b.d.ts → types-DLZNyF5t.d.ts} +125 -1
- package/dist/unsandboxed.d.ts +59 -0
- package/dist/unsandboxed.js +32 -0
- package/dist/unsandboxed.js.map +1 -0
- package/dist/{uuid-RVN2T26F.js → uuid-CVTNAPEB.js} +1 -2
- package/dist/{zod-7YXKWYMC.js → zod-VKURGPRT.js} +1 -2
- package/package.json +35 -50
- package/dist/cache-BlBwXXPS.d.ts +0 -38
- package/dist/chunk-5GEX6ZSB.js.map +0 -1
- package/dist/chunk-6MMYCGJQ.js.map +0 -1
- package/dist/chunk-7IQCQI2G.js +0 -94
- package/dist/chunk-7IQCQI2G.js.map +0 -1
- package/dist/chunk-CCM2AXZG.js +0 -16
- package/dist/chunk-CCM2AXZG.js.map +0 -1
- package/dist/chunk-DGUM43GV.js +0 -11
- package/dist/chunk-HEQQQGK5.js +0 -131
- package/dist/chunk-HEQQQGK5.js.map +0 -1
- package/dist/chunk-I3JTUFPK.js +0 -171
- package/dist/chunk-I3JTUFPK.js.map +0 -1
- package/dist/chunk-XZN4QZLK.js.map +0 -1
- package/dist/chunk-ZXSDKBYB.js +0 -474
- package/dist/chunk-ZXSDKBYB.js.map +0 -1
- package/dist/client-CRRO2376.js +0 -10
- package/dist/providers/anthropic.d.ts +0 -19
- package/dist/providers/anthropic.js +0 -36
- package/dist/providers/anthropic.js.map +0 -1
- package/dist/providers/bedrock.d.ts +0 -39
- package/dist/providers/bedrock.js +0 -56
- package/dist/providers/bedrock.js.map +0 -1
- package/dist/providers/gemini.d.ts +0 -17
- package/dist/providers/gemini.js +0 -262
- package/dist/providers/gemini.js.map +0 -1
- package/dist/providers/ollama.d.ts +0 -13
- package/dist/providers/ollama.js +0 -20
- package/dist/providers/ollama.js.map +0 -1
- package/dist/providers/openai.d.ts +0 -21
- package/dist/providers/openai.js +0 -9
- package/dist/providers/openrouter.d.ts +0 -16
- package/dist/providers/openrouter.js +0 -24
- package/dist/providers/openrouter.js.map +0 -1
- package/dist/providers/vertex.d.ts +0 -42
- package/dist/providers/vertex.js +0 -68
- package/dist/providers/vertex.js.map +0 -1
- package/dist/sandbox-9qeMTNrD.d.ts +0 -126
- package/dist/types-CD0rUKKT.d.ts +0 -109
- package/dist/uuid-RVN2T26F.js.map +0 -1
- package/dist/zod-7YXKWYMC.js.map +0 -1
- /package/dist/{chunk-DGUM43GV.js.map → client-JJFLE6RT.js.map} +0 -0
- /package/dist/{client-CRRO2376.js.map → history-snip-HAWNAYKY.js.map} +0 -0
- /package/dist/{history-snip-64GYP4ZL.js.map → lsp-3APWNKB2.js.map} +0 -0
- /package/dist/{lsp-PS3BWIHC.js.map → manager-Z5EQ7YYV.js.map} +0 -0
- /package/dist/{manager-DLXK63XC.js.map → mcp-auth-NOIQPF7W.js.map} +0 -0
- /package/dist/{mcp-auth-AEI2R4ZC.js.map → provider-factory-KNBSHXJ6.js.map} +0 -0
- /package/dist/{provider-factory-TUHU3DIG.js.map → render-4VEODRK7.js.map} +0 -0
- /package/dist/{providers/openai.js.map → resolve-AGQZFMKD.js.map} +0 -0
- /package/dist/{render-GRN4ZSSW.js.map → spinner-72JEISPK.js.map} +0 -0
- /package/dist/{resolve-6KUZNEYW.js.map → uuid-CVTNAPEB.js.map} +0 -0
- /package/dist/{spinner-OJNR6NFO.js.map → zod-VKURGPRT.js.map} +0 -0
package/dist/chunk-7IQCQI2G.js
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
// src/providers/resolve.ts
|
|
2
|
-
var ENV_KEY_MAP = {
|
|
3
|
-
openai: "OPENAI_API_KEY",
|
|
4
|
-
anthropic: "ANTHROPIC_API_KEY",
|
|
5
|
-
gemini: "GEMINI_API_KEY",
|
|
6
|
-
openrouter: "OPENROUTER_API_KEY"
|
|
7
|
-
};
|
|
8
|
-
var DEFAULT_MODELS = {
|
|
9
|
-
openai: "gpt-5.4",
|
|
10
|
-
anthropic: "claude-opus-4.6",
|
|
11
|
-
gemini: "gemini-2.5-flash",
|
|
12
|
-
openrouter: "anthropic/claude-opus-4.6",
|
|
13
|
-
bedrock: "us.anthropic.claude-opus-4.6-v1:0",
|
|
14
|
-
vertex: "claude-opus-4.6",
|
|
15
|
-
ollama: "qwen2.5-coder:32b"
|
|
16
|
-
};
|
|
17
|
-
var SUPPORTED_PROVIDERS = Object.keys(DEFAULT_MODELS);
|
|
18
|
-
function getProviderEnvKey(name) {
|
|
19
|
-
const envVar = ENV_KEY_MAP[name];
|
|
20
|
-
return envVar ? process.env[envVar] : void 0;
|
|
21
|
-
}
|
|
22
|
-
async function resolveProvider(input, opts) {
|
|
23
|
-
if (typeof input !== "string") return input;
|
|
24
|
-
const name = input;
|
|
25
|
-
if (!SUPPORTED_PROVIDERS.includes(name)) {
|
|
26
|
-
throw new Error(
|
|
27
|
-
`Unknown provider "${name}". Supported: ${SUPPORTED_PROVIDERS.join(", ")}`
|
|
28
|
-
);
|
|
29
|
-
}
|
|
30
|
-
const key = opts?.apiKey ?? getProviderEnvKey(name) ?? process.env.NOUMEN_API_KEY;
|
|
31
|
-
switch (name) {
|
|
32
|
-
case "openai": {
|
|
33
|
-
if (!key) throw new Error("OpenAI requires an API key. Set OPENAI_API_KEY or pass apiKey.");
|
|
34
|
-
const { OpenAIProvider } = await import("./providers/openai.js");
|
|
35
|
-
return new OpenAIProvider({ apiKey: key, model: opts?.model, baseURL: opts?.baseURL });
|
|
36
|
-
}
|
|
37
|
-
case "anthropic": {
|
|
38
|
-
if (!key) throw new Error("Anthropic requires an API key. Set ANTHROPIC_API_KEY or pass apiKey.");
|
|
39
|
-
const { AnthropicProvider } = await import("./providers/anthropic.js");
|
|
40
|
-
return new AnthropicProvider({ apiKey: key, model: opts?.model, baseURL: opts?.baseURL, cacheControl: { enabled: true } });
|
|
41
|
-
}
|
|
42
|
-
case "gemini": {
|
|
43
|
-
if (!key) throw new Error("Gemini requires an API key. Set GEMINI_API_KEY or pass apiKey.");
|
|
44
|
-
const { GeminiProvider } = await import("./providers/gemini.js");
|
|
45
|
-
return new GeminiProvider({ apiKey: key, model: opts?.model, baseURL: opts?.baseURL });
|
|
46
|
-
}
|
|
47
|
-
case "openrouter": {
|
|
48
|
-
if (!key) throw new Error("OpenRouter requires an API key. Set OPENROUTER_API_KEY or pass apiKey.");
|
|
49
|
-
const { OpenRouterProvider } = await import("./providers/openrouter.js");
|
|
50
|
-
return new OpenRouterProvider({ apiKey: key, model: opts?.model, appName: "noumen" });
|
|
51
|
-
}
|
|
52
|
-
case "bedrock": {
|
|
53
|
-
const { BedrockAnthropicProvider } = await import("./providers/bedrock.js");
|
|
54
|
-
return new BedrockAnthropicProvider({ model: opts?.model, baseURL: opts?.baseURL });
|
|
55
|
-
}
|
|
56
|
-
case "vertex": {
|
|
57
|
-
const { VertexAnthropicProvider } = await import("./providers/vertex.js");
|
|
58
|
-
return new VertexAnthropicProvider({ model: opts?.model, baseURL: opts?.baseURL });
|
|
59
|
-
}
|
|
60
|
-
case "ollama": {
|
|
61
|
-
const { OllamaProvider } = await import("./providers/ollama.js");
|
|
62
|
-
const base = opts?.baseURL ?? (process.env.OLLAMA_HOST ? `${process.env.OLLAMA_HOST.replace(/\/+$/, "")}/v1` : void 0);
|
|
63
|
-
return new OllamaProvider({ model: opts?.model, baseURL: base });
|
|
64
|
-
}
|
|
65
|
-
default:
|
|
66
|
-
throw new Error(`Unhandled provider: ${name}`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
async function detectProvider() {
|
|
70
|
-
if (process.env.ANTHROPIC_API_KEY) return "anthropic";
|
|
71
|
-
if (process.env.OPENAI_API_KEY) return "openai";
|
|
72
|
-
if (process.env.GEMINI_API_KEY) return "gemini";
|
|
73
|
-
if (process.env.OPENROUTER_API_KEY) return "openrouter";
|
|
74
|
-
if (process.env.AWS_ACCESS_KEY_ID || process.env.AWS_PROFILE) return "bedrock";
|
|
75
|
-
if (process.env.GOOGLE_APPLICATION_CREDENTIALS || process.env.GCLOUD_PROJECT) return "vertex";
|
|
76
|
-
if (process.env.OLLAMA_HOST) return "ollama";
|
|
77
|
-
try {
|
|
78
|
-
const host = process.env.OLLAMA_HOST ?? "http://localhost:11434";
|
|
79
|
-
const res = await fetch(`${host.replace(/\/+$/, "")}/api/tags`, {
|
|
80
|
-
signal: AbortSignal.timeout(500)
|
|
81
|
-
});
|
|
82
|
-
if (res.ok) return "ollama";
|
|
83
|
-
} catch {
|
|
84
|
-
}
|
|
85
|
-
return void 0;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export {
|
|
89
|
-
DEFAULT_MODELS,
|
|
90
|
-
SUPPORTED_PROVIDERS,
|
|
91
|
-
resolveProvider,
|
|
92
|
-
detectProvider
|
|
93
|
-
};
|
|
94
|
-
//# sourceMappingURL=chunk-7IQCQI2G.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/resolve.ts"],"sourcesContent":["import type { AIProvider } from \"./types.js\";\n\nexport type ProviderName =\n | \"openai\"\n | \"anthropic\"\n | \"gemini\"\n | \"openrouter\"\n | \"bedrock\"\n | \"vertex\"\n | \"ollama\";\n\nconst ENV_KEY_MAP: Record<string, string> = {\n openai: \"OPENAI_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n gemini: \"GEMINI_API_KEY\",\n openrouter: \"OPENROUTER_API_KEY\",\n};\n\nexport const DEFAULT_MODELS: Record<string, string> = {\n openai: \"gpt-5.4\",\n anthropic: \"claude-opus-4.6\",\n gemini: \"gemini-2.5-flash\",\n openrouter: \"anthropic/claude-opus-4.6\",\n bedrock: \"us.anthropic.claude-opus-4.6-v1:0\",\n vertex: \"claude-opus-4.6\",\n ollama: \"qwen2.5-coder:32b\",\n};\n\nexport const SUPPORTED_PROVIDERS: ProviderName[] = Object.keys(DEFAULT_MODELS) as ProviderName[];\n\nfunction getProviderEnvKey(name: string): string | undefined {\n const envVar = ENV_KEY_MAP[name];\n return envVar ? process.env[envVar] : undefined;\n}\n\nexport interface ResolveProviderOptions {\n apiKey?: string;\n model?: string;\n baseURL?: string;\n}\n\n/**\n * Resolve a provider from a name string or pass through an AIProvider instance.\n * API key resolution order:\n * 1. Explicit apiKey option\n * 2. Provider-specific env var (OPENAI_API_KEY, etc.)\n * 3. NOUMEN_API_KEY generic env var\n */\nexport async function resolveProvider(\n input: AIProvider | ProviderName,\n opts?: ResolveProviderOptions,\n): Promise<AIProvider> {\n if (typeof input !== \"string\") return input;\n\n const name = input;\n if (!SUPPORTED_PROVIDERS.includes(name)) {\n throw new Error(\n `Unknown provider \"${name}\". Supported: ${SUPPORTED_PROVIDERS.join(\", \")}`,\n );\n }\n\n const key =\n opts?.apiKey ??\n getProviderEnvKey(name) ??\n process.env.NOUMEN_API_KEY;\n\n switch (name) {\n case \"openai\": {\n if (!key) throw new Error(\"OpenAI requires an API key. Set OPENAI_API_KEY or pass apiKey.\");\n const { OpenAIProvider } = await import(\"./openai.js\");\n return new OpenAIProvider({ apiKey: key, model: opts?.model, baseURL: opts?.baseURL });\n }\n case \"anthropic\": {\n if (!key) throw new Error(\"Anthropic requires an API key. Set ANTHROPIC_API_KEY or pass apiKey.\");\n const { AnthropicProvider } = await import(\"./anthropic.js\");\n return new AnthropicProvider({ apiKey: key, model: opts?.model, baseURL: opts?.baseURL, cacheControl: { enabled: true } });\n }\n case \"gemini\": {\n if (!key) throw new Error(\"Gemini requires an API key. Set GEMINI_API_KEY or pass apiKey.\");\n const { GeminiProvider } = await import(\"./gemini.js\");\n return new GeminiProvider({ apiKey: key, model: opts?.model, baseURL: opts?.baseURL });\n }\n case \"openrouter\": {\n if (!key) throw new Error(\"OpenRouter requires an API key. Set OPENROUTER_API_KEY or pass apiKey.\");\n const { OpenRouterProvider } = await import(\"./openrouter.js\");\n return new OpenRouterProvider({ apiKey: key, model: opts?.model, appName: \"noumen\" });\n }\n case \"bedrock\": {\n const { BedrockAnthropicProvider } = await import(\"./bedrock.js\");\n return new BedrockAnthropicProvider({ model: opts?.model, baseURL: opts?.baseURL });\n }\n case \"vertex\": {\n const { VertexAnthropicProvider } = await import(\"./vertex.js\");\n return new VertexAnthropicProvider({ model: opts?.model, baseURL: opts?.baseURL });\n }\n case \"ollama\": {\n const { OllamaProvider } = await import(\"./ollama.js\");\n const base = opts?.baseURL ?? (process.env.OLLAMA_HOST\n ? `${process.env.OLLAMA_HOST.replace(/\\/+$/, \"\")}/v1`\n : undefined);\n return new OllamaProvider({ model: opts?.model, baseURL: base });\n }\n default:\n throw new Error(`Unhandled provider: ${name}`);\n }\n}\n\n/**\n * Auto-detect provider from available environment variables.\n */\nexport async function detectProvider(): Promise<ProviderName | undefined> {\n if (process.env.ANTHROPIC_API_KEY) return \"anthropic\";\n if (process.env.OPENAI_API_KEY) return \"openai\";\n if (process.env.GEMINI_API_KEY) return \"gemini\";\n if (process.env.OPENROUTER_API_KEY) return \"openrouter\";\n if (process.env.AWS_ACCESS_KEY_ID || process.env.AWS_PROFILE) return \"bedrock\";\n if (process.env.GOOGLE_APPLICATION_CREDENTIALS || process.env.GCLOUD_PROJECT) return \"vertex\";\n if (process.env.OLLAMA_HOST) return \"ollama\";\n\n try {\n const host = process.env.OLLAMA_HOST ?? \"http://localhost:11434\";\n const res = await fetch(`${host.replace(/\\/+$/, \"\")}/api/tags`, {\n signal: AbortSignal.timeout(500),\n });\n if (res.ok) return \"ollama\";\n } catch { /* not running */ }\n\n return undefined;\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-CCM2AXZG.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// src/providers/types.ts
|
|
2
|
-
var ChatStreamError = class extends Error {
|
|
3
|
-
status;
|
|
4
|
-
retryAfter;
|
|
5
|
-
constructor(message, opts) {
|
|
6
|
-
super(message, { cause: opts?.cause });
|
|
7
|
-
this.name = "ChatStreamError";
|
|
8
|
-
this.status = opts?.status;
|
|
9
|
-
this.retryAfter = opts?.retryAfter;
|
|
10
|
-
}
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export {
|
|
14
|
-
ChatStreamError
|
|
15
|
-
};
|
|
16
|
-
//# sourceMappingURL=chunk-CCM2AXZG.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/types.ts"],"sourcesContent":["import type { ChatMessage } from \"../session/types.js\";\nimport type { ThinkingConfig } from \"../thinking/types.js\";\n\nexport interface ToolParameterProperty {\n type: string;\n description?: string;\n enum?: string[];\n default?: unknown;\n minimum?: number;\n maximum?: number;\n}\n\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: Record<string, ToolParameterProperty>;\n required?: string[];\n };\n };\n}\n\n// Streaming chunk types (OpenAI-compatible)\n\nexport interface ChatStreamDelta {\n role?: \"assistant\";\n content?: string | null;\n thinking_content?: string | null;\n thinking_signature?: string | null;\n /** Opaque data payload for Anthropic redacted_thinking blocks. */\n redacted_thinking_data?: string | null;\n tool_calls?: Array<{\n index: number;\n id?: string;\n type?: \"function\";\n function?: {\n name?: string;\n arguments?: string;\n };\n }>;\n}\n\nexport interface ChatStreamChoice {\n index: number;\n delta: ChatStreamDelta;\n finish_reason: string | null;\n}\n\nexport interface ChatStreamChunk {\n id: string;\n choices: ChatStreamChoice[];\n model: string;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n cache_read_tokens?: number;\n cache_creation_tokens?: number;\n thinking_tokens?: number;\n };\n}\n\nexport interface ChatCompletionUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n cache_read_tokens?: number;\n cache_creation_tokens?: number;\n thinking_tokens?: number;\n}\n\n/**\n * Structured output format. When provided, the model is constrained to\n * produce a response matching the given JSON schema.\n *\n * - `json_schema`: the model must produce JSON conforming to the given schema.\n * - `json_object`: the model must produce valid JSON (no specific schema).\n */\nexport type OutputFormat = JsonSchemaOutputFormat | JsonObjectOutputFormat;\n\nexport interface JsonSchemaOutputFormat {\n type: \"json_schema\";\n /** JSON Schema object describing the expected output shape. */\n schema: Record<string, unknown>;\n /** Optional name for the schema (required by some providers). */\n name?: string;\n /** When true, the provider enforces strict schema adherence. */\n strict?: boolean;\n}\n\nexport interface JsonObjectOutputFormat {\n type: \"json_object\";\n}\n\nexport interface ChatParams {\n model: string;\n messages: ChatMessage[];\n tools?: ToolDefinition[];\n max_tokens?: number;\n system?: string;\n temperature?: number;\n thinking?: ThinkingConfig;\n /** Constrain the model to produce structured output matching this schema. */\n outputFormat?: OutputFormat;\n /**\n * When true, the provider should place the cache breakpoint on the\n * second-to-last message instead of the last. Used by subagent forks\n * to avoid writing fork-only tails into the shared prompt cache.\n */\n skipCacheWrite?: boolean;\n /** Abort signal — providers should forward this to cancel in-flight HTTP requests. */\n signal?: AbortSignal;\n}\n\nexport interface AIProvider {\n chat(params: ChatParams): AsyncIterable<ChatStreamChunk>;\n /**\n * Optional fallback model name, used when no `model` is provided at the\n * Thread / Agent level. Consumers should pass explicit models when they\n * can, but this lets each provider ship a sensible default without\n * forcing Thread to hardcode provider-specific strings.\n */\n readonly defaultModel?: string;\n}\n\n/**\n * Extended error type that providers can throw to convey retry-relevant metadata.\n * Consumers (like the retry engine) can inspect these fields without knowing\n * provider-specific SDK error types.\n */\nexport class ChatStreamError extends Error {\n status?: number;\n retryAfter?: string;\n\n constructor(\n message: string,\n opts?: { status?: number; retryAfter?: string; cause?: unknown },\n ) {\n super(message, { cause: opts?.cause });\n this.name = \"ChatStreamError\";\n this.status = opts?.status;\n this.retryAfter = opts?.retryAfter;\n }\n}\n"],"mappings":";AAqIO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC;AAAA,EACA;AAAA,EAEA,YACE,SACA,MACA;AACA,UAAM,SAAS,EAAE,OAAO,MAAM,MAAM,CAAC;AACrC,SAAK,OAAO;AACZ,SAAK,SAAS,MAAM;AACpB,SAAK,aAAa,MAAM;AAAA,EAC1B;AACF;","names":[]}
|
package/dist/chunk-DGUM43GV.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
-
}) : x)(function(x) {
|
|
4
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
5
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
|
-
});
|
|
7
|
-
|
|
8
|
-
export {
|
|
9
|
-
__require
|
|
10
|
-
};
|
|
11
|
-
//# sourceMappingURL=chunk-DGUM43GV.js.map
|
package/dist/chunk-HEQQQGK5.js
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
// src/utils/context.ts
|
|
2
|
-
var MODEL_CONTEXT_WINDOWS = {
|
|
3
|
-
// Anthropic (evergreen prefixes — also match dated variants via startsWith)
|
|
4
|
-
"claude-sonnet-4": 2e5,
|
|
5
|
-
"claude-opus-4": 2e5,
|
|
6
|
-
"claude-haiku-4": 2e5,
|
|
7
|
-
"claude-haiku-3-5": 2e5,
|
|
8
|
-
"claude-3-5-sonnet": 2e5,
|
|
9
|
-
"claude-3-5-haiku": 2e5,
|
|
10
|
-
// Bedrock / Vertex model ID patterns (prefix-matched)
|
|
11
|
-
"us.anthropic.claude": 2e5,
|
|
12
|
-
"eu.anthropic.claude": 2e5,
|
|
13
|
-
"ap.anthropic.claude": 2e5,
|
|
14
|
-
"anthropic.claude": 2e5,
|
|
15
|
-
// OpenAI
|
|
16
|
-
"gpt-4.1": 1047576,
|
|
17
|
-
"gpt-4.1-mini": 1047576,
|
|
18
|
-
"gpt-4.1-nano": 1047576,
|
|
19
|
-
"gpt-4o": 128e3,
|
|
20
|
-
"gpt-4o-mini": 128e3,
|
|
21
|
-
"gpt-4-turbo": 128e3,
|
|
22
|
-
"gpt-4": 8192,
|
|
23
|
-
"o1": 2e5,
|
|
24
|
-
"o1-mini": 128e3,
|
|
25
|
-
"o1-preview": 128e3,
|
|
26
|
-
"o3": 2e5,
|
|
27
|
-
"o3-mini": 2e5,
|
|
28
|
-
"o4-mini": 2e5,
|
|
29
|
-
// Google
|
|
30
|
-
"gemini-2.5-pro": 1048576,
|
|
31
|
-
"gemini-2.5-flash": 1048576,
|
|
32
|
-
"gemini-2.0-flash": 1048576,
|
|
33
|
-
"gemini-1.5-pro": 2097152,
|
|
34
|
-
"gemini-1.5-flash": 1048576
|
|
35
|
-
};
|
|
36
|
-
var MODEL_MAX_OUTPUT_TOKENS = {
|
|
37
|
-
"claude-sonnet-4-6": 128e3,
|
|
38
|
-
"claude-opus-4-6": 128e3,
|
|
39
|
-
"claude-sonnet-4": 64e3,
|
|
40
|
-
"claude-opus-4": 64e3,
|
|
41
|
-
"claude-haiku-4": 64e3,
|
|
42
|
-
"claude-haiku-3-5": 8192,
|
|
43
|
-
"claude-3-5-sonnet": 8192,
|
|
44
|
-
"claude-3-5-haiku": 8192,
|
|
45
|
-
"us.anthropic.claude": 64e3,
|
|
46
|
-
"eu.anthropic.claude": 64e3,
|
|
47
|
-
"ap.anthropic.claude": 64e3,
|
|
48
|
-
"anthropic.claude": 64e3,
|
|
49
|
-
"gpt-4.1": 32768,
|
|
50
|
-
"gpt-4.1-mini": 32768,
|
|
51
|
-
"gpt-4.1-nano": 32768,
|
|
52
|
-
"gpt-4o": 16384,
|
|
53
|
-
"gpt-4o-mini": 16384,
|
|
54
|
-
"gpt-4-turbo": 4096,
|
|
55
|
-
"o1": 1e5,
|
|
56
|
-
"o3": 1e5,
|
|
57
|
-
"o3-mini": 1e5,
|
|
58
|
-
"o4-mini": 1e5,
|
|
59
|
-
"gemini-2.5-pro": 65536,
|
|
60
|
-
"gemini-2.5-flash": 65536,
|
|
61
|
-
"gemini-2.0-flash": 8192
|
|
62
|
-
};
|
|
63
|
-
var DEFAULT_MAX_OUTPUT_TOKENS = 16384;
|
|
64
|
-
var DEFAULT_CONTEXT_WINDOW = 128e3;
|
|
65
|
-
var AUTOCOMPACT_BUFFER_TOKENS = 13e3;
|
|
66
|
-
var MAX_OUTPUT_RESERVE = 2e4;
|
|
67
|
-
var customWindows = {};
|
|
68
|
-
function registerContextWindows(windows) {
|
|
69
|
-
customWindows = { ...customWindows, ...windows };
|
|
70
|
-
}
|
|
71
|
-
function getContextWindowForModel(model) {
|
|
72
|
-
if (customWindows[model] !== void 0) return customWindows[model];
|
|
73
|
-
if (MODEL_CONTEXT_WINDOWS[model] !== void 0)
|
|
74
|
-
return MODEL_CONTEXT_WINDOWS[model];
|
|
75
|
-
for (const [prefix, size] of Object.entries(MODEL_CONTEXT_WINDOWS)) {
|
|
76
|
-
if (model.startsWith(prefix)) return size;
|
|
77
|
-
}
|
|
78
|
-
for (const [prefix, size] of Object.entries(customWindows)) {
|
|
79
|
-
if (model.startsWith(prefix)) return size;
|
|
80
|
-
}
|
|
81
|
-
return DEFAULT_CONTEXT_WINDOW;
|
|
82
|
-
}
|
|
83
|
-
function getEffectiveContextWindow(model, maxOutputTokens) {
|
|
84
|
-
const window = getContextWindowForModel(model);
|
|
85
|
-
const reserve = Math.min(maxOutputTokens ?? MAX_OUTPUT_RESERVE, MAX_OUTPUT_RESERVE);
|
|
86
|
-
return window - reserve;
|
|
87
|
-
}
|
|
88
|
-
function getAutoCompactThreshold(model, maxOutputTokens) {
|
|
89
|
-
return getEffectiveContextWindow(model, maxOutputTokens) - AUTOCOMPACT_BUFFER_TOKENS;
|
|
90
|
-
}
|
|
91
|
-
function getMaxOutputTokensForModel(model) {
|
|
92
|
-
if (MODEL_MAX_OUTPUT_TOKENS[model] !== void 0)
|
|
93
|
-
return MODEL_MAX_OUTPUT_TOKENS[model];
|
|
94
|
-
for (const [prefix, size] of Object.entries(MODEL_MAX_OUTPUT_TOKENS)) {
|
|
95
|
-
if (model.startsWith(prefix)) return size;
|
|
96
|
-
}
|
|
97
|
-
return DEFAULT_MAX_OUTPUT_TOKENS;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// src/providers/cache.ts
|
|
101
|
-
function sortToolDefinitionsForCache(tools, mcpToolNames) {
|
|
102
|
-
const byName = (a, b) => a.function.name.localeCompare(b.function.name);
|
|
103
|
-
if (!mcpToolNames || mcpToolNames.size === 0) {
|
|
104
|
-
return [...tools].sort(byName);
|
|
105
|
-
}
|
|
106
|
-
const builtIn = [];
|
|
107
|
-
const mcp = [];
|
|
108
|
-
for (const t of tools) {
|
|
109
|
-
if (mcpToolNames.has(t.function.name)) {
|
|
110
|
-
mcp.push(t);
|
|
111
|
-
} else {
|
|
112
|
-
builtIn.push(t);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return [...builtIn.sort(byName), ...mcp.sort(byName)];
|
|
116
|
-
}
|
|
117
|
-
function getMessageCacheBreakpointIndex(messages, skipCacheWrite) {
|
|
118
|
-
if (messages.length === 0) return -1;
|
|
119
|
-
return skipCacheWrite && messages.length >= 2 ? messages.length - 2 : messages.length - 1;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export {
|
|
123
|
-
registerContextWindows,
|
|
124
|
-
getContextWindowForModel,
|
|
125
|
-
getEffectiveContextWindow,
|
|
126
|
-
getAutoCompactThreshold,
|
|
127
|
-
getMaxOutputTokensForModel,
|
|
128
|
-
sortToolDefinitionsForCache,
|
|
129
|
-
getMessageCacheBreakpointIndex
|
|
130
|
-
};
|
|
131
|
-
//# sourceMappingURL=chunk-HEQQQGK5.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/context.ts","../src/providers/cache.ts"],"sourcesContent":["/**\n * Model context window sizes and effective window calculations.\n */\n\nconst MODEL_CONTEXT_WINDOWS: Record<string, number> = {\n // Anthropic (evergreen prefixes — also match dated variants via startsWith)\n \"claude-sonnet-4\": 200_000,\n \"claude-opus-4\": 200_000,\n \"claude-haiku-4\": 200_000,\n \"claude-haiku-3-5\": 200_000,\n \"claude-3-5-sonnet\": 200_000,\n \"claude-3-5-haiku\": 200_000,\n // Bedrock / Vertex model ID patterns (prefix-matched)\n \"us.anthropic.claude\": 200_000,\n \"eu.anthropic.claude\": 200_000,\n \"ap.anthropic.claude\": 200_000,\n \"anthropic.claude\": 200_000,\n // OpenAI\n \"gpt-4.1\": 1_047_576,\n \"gpt-4.1-mini\": 1_047_576,\n \"gpt-4.1-nano\": 1_047_576,\n \"gpt-4o\": 128_000,\n \"gpt-4o-mini\": 128_000,\n \"gpt-4-turbo\": 128_000,\n \"gpt-4\": 8_192,\n \"o1\": 200_000,\n \"o1-mini\": 128_000,\n \"o1-preview\": 128_000,\n \"o3\": 200_000,\n \"o3-mini\": 200_000,\n \"o4-mini\": 200_000,\n // Google\n \"gemini-2.5-pro\": 1_048_576,\n \"gemini-2.5-flash\": 1_048_576,\n \"gemini-2.0-flash\": 1_048_576,\n \"gemini-1.5-pro\": 2_097_152,\n \"gemini-1.5-flash\": 1_048_576,\n};\n\nconst MODEL_MAX_OUTPUT_TOKENS: Record<string, number> = {\n \"claude-sonnet-4-6\": 128_000,\n \"claude-opus-4-6\": 128_000,\n \"claude-sonnet-4\": 64_000,\n \"claude-opus-4\": 64_000,\n \"claude-haiku-4\": 64_000,\n \"claude-haiku-3-5\": 8_192,\n \"claude-3-5-sonnet\": 8_192,\n \"claude-3-5-haiku\": 8_192,\n \"us.anthropic.claude\": 64_000,\n \"eu.anthropic.claude\": 64_000,\n \"ap.anthropic.claude\": 64_000,\n \"anthropic.claude\": 64_000,\n \"gpt-4.1\": 32_768,\n \"gpt-4.1-mini\": 32_768,\n \"gpt-4.1-nano\": 32_768,\n \"gpt-4o\": 16_384,\n \"gpt-4o-mini\": 16_384,\n \"gpt-4-turbo\": 4_096,\n \"o1\": 100_000,\n \"o3\": 100_000,\n \"o3-mini\": 100_000,\n \"o4-mini\": 100_000,\n \"gemini-2.5-pro\": 65_536,\n \"gemini-2.5-flash\": 65_536,\n \"gemini-2.0-flash\": 8_192,\n};\n\nconst DEFAULT_MAX_OUTPUT_TOKENS = 16_384;\nconst DEFAULT_CONTEXT_WINDOW = 128_000;\nconst AUTOCOMPACT_BUFFER_TOKENS = 13_000;\nconst MAX_OUTPUT_RESERVE = 20_000;\n\nlet customWindows: Record<string, number> = {};\n\n/**\n * Register custom context window sizes for models not in the built-in table.\n */\nexport function registerContextWindows(\n windows: Record<string, number>,\n): void {\n customWindows = { ...customWindows, ...windows };\n}\n\n/**\n * Get the context window size for a model. Checks custom overrides first,\n * then built-in table, then prefix-matches, then falls back to default.\n */\nexport function getContextWindowForModel(model: string): number {\n if (customWindows[model] !== undefined) return customWindows[model];\n if (MODEL_CONTEXT_WINDOWS[model] !== undefined)\n return MODEL_CONTEXT_WINDOWS[model];\n\n for (const [prefix, size] of Object.entries(MODEL_CONTEXT_WINDOWS)) {\n if (model.startsWith(prefix)) return size;\n }\n for (const [prefix, size] of Object.entries(customWindows)) {\n if (model.startsWith(prefix)) return size;\n }\n\n return DEFAULT_CONTEXT_WINDOW;\n}\n\n/**\n * Effective context window = total window minus space reserved for the\n * model's output during a compaction/summary request.\n */\nexport function getEffectiveContextWindow(\n model: string,\n maxOutputTokens?: number,\n): number {\n const window = getContextWindowForModel(model);\n const reserve = Math.min(maxOutputTokens ?? MAX_OUTPUT_RESERVE, MAX_OUTPUT_RESERVE);\n return window - reserve;\n}\n\n/**\n * Auto-compact threshold: effective window minus a buffer to ensure we\n * compact before we're at the hard limit.\n */\nexport function getAutoCompactThreshold(\n model: string,\n maxOutputTokens?: number,\n): number {\n return getEffectiveContextWindow(model, maxOutputTokens) - AUTOCOMPACT_BUFFER_TOKENS;\n}\n\n/**\n * Get the maximum output tokens a model supports. Used to clamp\n * max_tokens when extended thinking budgets are added.\n */\nexport function getMaxOutputTokensForModel(model: string): number {\n if (MODEL_MAX_OUTPUT_TOKENS[model] !== undefined)\n return MODEL_MAX_OUTPUT_TOKENS[model];\n for (const [prefix, size] of Object.entries(MODEL_MAX_OUTPUT_TOKENS)) {\n if (model.startsWith(prefix)) return size;\n }\n return DEFAULT_MAX_OUTPUT_TOKENS;\n}\n","/**\n * Provider-agnostic prompt caching utilities.\n *\n * Stable tool ordering prevents cache invalidation when the tool set is\n * unchanged. The breakpoint index helper determines which message gets a\n * single cache_control marker per request (matching claude-code's strategy).\n */\n\nimport type { ToolDefinition } from \"./types.js\";\nimport type { ChatMessage } from \"../session/types.js\";\n\nexport type CacheScope = \"global\" | \"org\";\n\nexport interface CacheControlConfig {\n enabled: boolean;\n /** TTL for cached content. When set, produces `ttl: '1h'` in cache_control. */\n ttl?: \"1h\";\n /** Scope for shared cache across sessions/orgs. */\n scope?: CacheScope;\n}\n\n/**\n * Sort tool definitions deterministically for prompt cache stability.\n *\n * Strategy (matching claude-code's assembleToolPool): built-in tools form a\n * contiguous prefix sorted by name, followed by MCP/external tools sorted by\n * name. Tools with `mcpInfo` on the original Tool object are treated as MCP;\n * everything else is built-in. Since ToolDefinition doesn't carry mcpInfo,\n * callers can pass an optional set of MCP tool names to partition correctly.\n */\nexport function sortToolDefinitionsForCache(\n tools: ToolDefinition[],\n mcpToolNames?: ReadonlySet<string>,\n): ToolDefinition[] {\n const byName = (a: ToolDefinition, b: ToolDefinition) =>\n a.function.name.localeCompare(b.function.name);\n\n if (!mcpToolNames || mcpToolNames.size === 0) {\n return [...tools].sort(byName);\n }\n\n const builtIn: ToolDefinition[] = [];\n const mcp: ToolDefinition[] = [];\n\n for (const t of tools) {\n if (mcpToolNames.has(t.function.name)) {\n mcp.push(t);\n } else {\n builtIn.push(t);\n }\n }\n\n return [...builtIn.sort(byName), ...mcp.sort(byName)];\n}\n\n/**\n * Determine which message index should receive the cache_control breakpoint.\n *\n * Exactly one message per request is marked. Normally the last message;\n * for forked agents with skipCacheWrite the second-to-last so the fork\n * doesn't write its own tail into the cache.\n */\nexport function getMessageCacheBreakpointIndex(\n messages: ChatMessage[],\n skipCacheWrite?: boolean,\n): number {\n if (messages.length === 0) return -1;\n return skipCacheWrite && messages.length >= 2\n ? messages.length - 2\n : messages.length - 1;\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-I3JTUFPK.js
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ChatStreamError
|
|
3
|
-
} from "./chunk-CCM2AXZG.js";
|
|
4
|
-
|
|
5
|
-
// src/providers/openai.ts
|
|
6
|
-
import OpenAI from "openai";
|
|
7
|
-
var O_SERIES_PATTERN = /^o[1-9]/;
|
|
8
|
-
var OpenAIProvider = class _OpenAIProvider {
|
|
9
|
-
client;
|
|
10
|
-
defaultModel;
|
|
11
|
-
compatMode;
|
|
12
|
-
constructor(opts) {
|
|
13
|
-
this.client = new OpenAI({
|
|
14
|
-
apiKey: opts.apiKey ?? "not-needed",
|
|
15
|
-
baseURL: opts.baseURL,
|
|
16
|
-
defaultHeaders: opts.defaultHeaders,
|
|
17
|
-
maxRetries: 0
|
|
18
|
-
});
|
|
19
|
-
this.defaultModel = opts.model ?? "gpt-5.4";
|
|
20
|
-
this.compatMode = opts.compatMode ?? false;
|
|
21
|
-
}
|
|
22
|
-
async *chat(params) {
|
|
23
|
-
const messages = this.buildMessages(params.system, params.messages);
|
|
24
|
-
const model = params.model ?? this.defaultModel;
|
|
25
|
-
const isOSeries = O_SERIES_PATTERN.test(model);
|
|
26
|
-
const createParams = {
|
|
27
|
-
model,
|
|
28
|
-
messages,
|
|
29
|
-
tools: params.tools?.map((t) => ({
|
|
30
|
-
type: "function",
|
|
31
|
-
function: t.function
|
|
32
|
-
})),
|
|
33
|
-
stream: true,
|
|
34
|
-
...this.compatMode ? {} : { stream_options: { include_usage: true } }
|
|
35
|
-
};
|
|
36
|
-
if (isOSeries) {
|
|
37
|
-
createParams.max_completion_tokens = params.max_tokens ?? 16384;
|
|
38
|
-
if (params.thinking?.type === "enabled") {
|
|
39
|
-
createParams.reasoning_effort = "high";
|
|
40
|
-
}
|
|
41
|
-
} else {
|
|
42
|
-
createParams.max_tokens = params.max_tokens;
|
|
43
|
-
createParams.temperature = params.temperature;
|
|
44
|
-
}
|
|
45
|
-
if (params.outputFormat?.type === "json_schema") {
|
|
46
|
-
createParams.response_format = {
|
|
47
|
-
type: "json_schema",
|
|
48
|
-
json_schema: {
|
|
49
|
-
name: params.outputFormat.name ?? "response",
|
|
50
|
-
schema: params.outputFormat.schema,
|
|
51
|
-
strict: params.outputFormat.strict ?? false
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
} else if (params.outputFormat?.type === "json_object") {
|
|
55
|
-
createParams.response_format = {
|
|
56
|
-
type: "json_object"
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
try {
|
|
60
|
-
const stream = await this.client.chat.completions.create(createParams, {
|
|
61
|
-
...params.signal ? { signal: params.signal } : {}
|
|
62
|
-
});
|
|
63
|
-
for await (const chunk of stream) {
|
|
64
|
-
const usage = chunk.usage;
|
|
65
|
-
let mappedUsage;
|
|
66
|
-
if (usage) {
|
|
67
|
-
const u = usage;
|
|
68
|
-
const promptDetails = u.prompt_tokens_details;
|
|
69
|
-
const completionDetails = u.completion_tokens_details;
|
|
70
|
-
mappedUsage = {
|
|
71
|
-
prompt_tokens: usage.prompt_tokens,
|
|
72
|
-
completion_tokens: usage.completion_tokens,
|
|
73
|
-
total_tokens: usage.total_tokens,
|
|
74
|
-
cache_read_tokens: promptDetails?.cached_tokens,
|
|
75
|
-
cache_creation_tokens: promptDetails?.cache_creation_tokens,
|
|
76
|
-
thinking_tokens: completionDetails?.reasoning_tokens
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
const choices = chunk.choices ?? [];
|
|
80
|
-
if (choices.length === 0 && mappedUsage) {
|
|
81
|
-
yield { id: chunk.id, model: chunk.model, choices: [], usage: mappedUsage };
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
yield {
|
|
85
|
-
id: chunk.id,
|
|
86
|
-
model: chunk.model,
|
|
87
|
-
choices: choices.map((c) => ({
|
|
88
|
-
index: c.index,
|
|
89
|
-
delta: {
|
|
90
|
-
role: c.delta.role,
|
|
91
|
-
content: c.delta.content,
|
|
92
|
-
thinking_content: c.delta.reasoning_content,
|
|
93
|
-
tool_calls: c.delta.tool_calls?.map((tc) => ({
|
|
94
|
-
index: tc.index,
|
|
95
|
-
id: tc.id,
|
|
96
|
-
type: tc.type,
|
|
97
|
-
function: tc.function ? {
|
|
98
|
-
name: tc.function.name,
|
|
99
|
-
arguments: tc.function.arguments
|
|
100
|
-
} : void 0
|
|
101
|
-
}))
|
|
102
|
-
},
|
|
103
|
-
finish_reason: c.finish_reason
|
|
104
|
-
})),
|
|
105
|
-
usage: mappedUsage
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
} catch (err) {
|
|
109
|
-
if (err instanceof ChatStreamError) throw err;
|
|
110
|
-
const apiErr = err;
|
|
111
|
-
throw new ChatStreamError(
|
|
112
|
-
err instanceof Error ? err.message : String(err),
|
|
113
|
-
{
|
|
114
|
-
status: apiErr.status,
|
|
115
|
-
retryAfter: apiErr.headers?.get?.("retry-after") ?? apiErr.headers?.["retry-after"] ?? void 0,
|
|
116
|
-
cause: err
|
|
117
|
-
}
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
static contentPartsToOpenAI(parts) {
|
|
122
|
-
return parts.map((part) => {
|
|
123
|
-
if (part.type === "text") {
|
|
124
|
-
return { type: "text", text: part.text };
|
|
125
|
-
}
|
|
126
|
-
if (part.type === "image") {
|
|
127
|
-
return {
|
|
128
|
-
type: "image_url",
|
|
129
|
-
image_url: { url: `data:${part.media_type};base64,${part.data}` }
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
return { type: "image_url", image_url: { url: part.url } };
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
buildMessages(system, messages) {
|
|
136
|
-
const result = [];
|
|
137
|
-
if (system) {
|
|
138
|
-
result.push({ role: "system", content: system });
|
|
139
|
-
}
|
|
140
|
-
for (const msg of messages) {
|
|
141
|
-
if (msg.role === "tool") {
|
|
142
|
-
const content = Array.isArray(msg.content) ? _OpenAIProvider.contentPartsToOpenAI(msg.content) : msg.content;
|
|
143
|
-
result.push({
|
|
144
|
-
role: "tool",
|
|
145
|
-
tool_call_id: msg.tool_call_id,
|
|
146
|
-
content
|
|
147
|
-
});
|
|
148
|
-
} else if (msg.role === "assistant") {
|
|
149
|
-
const entry = {
|
|
150
|
-
role: "assistant",
|
|
151
|
-
content: msg.content
|
|
152
|
-
};
|
|
153
|
-
if (msg.tool_calls) {
|
|
154
|
-
entry.tool_calls = msg.tool_calls;
|
|
155
|
-
}
|
|
156
|
-
result.push(entry);
|
|
157
|
-
} else if (msg.role === "user") {
|
|
158
|
-
const content = Array.isArray(msg.content) ? _OpenAIProvider.contentPartsToOpenAI(msg.content) : msg.content;
|
|
159
|
-
result.push({ role: "user", content });
|
|
160
|
-
} else {
|
|
161
|
-
result.push({ role: msg.role, content: msg.content });
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
return result;
|
|
165
|
-
}
|
|
166
|
-
};
|
|
167
|
-
|
|
168
|
-
export {
|
|
169
|
-
OpenAIProvider
|
|
170
|
-
};
|
|
171
|
-
//# sourceMappingURL=chunk-I3JTUFPK.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/openai.ts"],"sourcesContent":["import OpenAI from \"openai\";\nimport type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport { ChatStreamError } from \"./types.js\";\nimport type { ChatMessage, ContentPart } from \"../session/types.js\";\n\nexport interface OpenAIProviderOptions {\n apiKey?: string;\n baseURL?: string;\n model?: string;\n defaultHeaders?: Record<string, string | undefined>;\n /** When true, omits `stream_options` that some OpenAI-compatible endpoints don't support. */\n compatMode?: boolean;\n}\n\nconst O_SERIES_PATTERN = /^o[1-9]/;\n\nexport class OpenAIProvider implements AIProvider {\n private client: OpenAI;\n readonly defaultModel: string;\n protected compatMode: boolean;\n\n constructor(opts: OpenAIProviderOptions) {\n this.client = new OpenAI({\n apiKey: opts.apiKey ?? \"not-needed\",\n baseURL: opts.baseURL,\n defaultHeaders: opts.defaultHeaders,\n maxRetries: 0,\n });\n this.defaultModel = opts.model ?? \"gpt-5.4\";\n this.compatMode = opts.compatMode ?? false;\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n const messages = this.buildMessages(params.system, params.messages);\n const model = params.model ?? this.defaultModel;\n const isOSeries = O_SERIES_PATTERN.test(model);\n\n const createParams: OpenAI.ChatCompletionCreateParamsStreaming = {\n model,\n messages: messages as unknown as OpenAI.ChatCompletionMessageParam[],\n tools: params.tools?.map((t) => ({\n type: \"function\" as const,\n function: t.function,\n })),\n stream: true,\n ...(this.compatMode ? {} : { stream_options: { include_usage: true } }),\n };\n\n if (isOSeries) {\n (createParams as unknown as Record<string, unknown>).max_completion_tokens = params.max_tokens ?? 16384;\n if (params.thinking?.type === \"enabled\") {\n (createParams as unknown as Record<string, unknown>).reasoning_effort = \"high\";\n }\n } else {\n createParams.max_tokens = params.max_tokens;\n createParams.temperature = params.temperature;\n }\n\n if (params.outputFormat?.type === \"json_schema\") {\n (createParams as unknown as Record<string, unknown>).response_format = {\n type: \"json_schema\",\n json_schema: {\n name: params.outputFormat.name ?? \"response\",\n schema: params.outputFormat.schema,\n strict: params.outputFormat.strict ?? false,\n },\n };\n } else if (params.outputFormat?.type === \"json_object\") {\n (createParams as unknown as Record<string, unknown>).response_format = {\n type: \"json_object\",\n };\n }\n\n try {\n const stream = await this.client.chat.completions.create(createParams, {\n ...(params.signal ? { signal: params.signal } : {}),\n });\n\n for await (const chunk of stream) {\n const usage = chunk.usage;\n let mappedUsage: ChatStreamChunk[\"usage\"] | undefined;\n if (usage) {\n const u = usage as unknown as Record<string, unknown>;\n const promptDetails = u.prompt_tokens_details as Record<string, unknown> | undefined;\n const completionDetails = u.completion_tokens_details as Record<string, unknown> | undefined;\n mappedUsage = {\n prompt_tokens: usage.prompt_tokens,\n completion_tokens: usage.completion_tokens,\n total_tokens: usage.total_tokens,\n cache_read_tokens: promptDetails?.cached_tokens as number | undefined,\n cache_creation_tokens: promptDetails?.cache_creation_tokens as number | undefined,\n thinking_tokens: completionDetails?.reasoning_tokens as number | undefined,\n };\n }\n\n const choices = chunk.choices ?? [];\n if (choices.length === 0 && mappedUsage) {\n yield { id: chunk.id, model: chunk.model, choices: [], usage: mappedUsage };\n continue;\n }\n\n yield {\n id: chunk.id,\n model: chunk.model,\n choices: choices.map((c) => ({\n index: c.index,\n delta: {\n role: c.delta.role as \"assistant\" | undefined,\n content: c.delta.content,\n thinking_content: (c.delta as Record<string, unknown>).reasoning_content as string | undefined,\n tool_calls: c.delta.tool_calls?.map((tc) => ({\n index: tc.index,\n id: tc.id,\n type: tc.type as \"function\" | undefined,\n function: tc.function\n ? {\n name: tc.function.name,\n arguments: tc.function.arguments,\n }\n : undefined,\n })),\n },\n finish_reason: c.finish_reason,\n })),\n usage: mappedUsage,\n };\n }\n } catch (err: unknown) {\n if (err instanceof ChatStreamError) throw err;\n const apiErr = err as { status?: number; headers?: Record<string, string> & { get?(k: string): string | null } };\n throw new ChatStreamError(\n err instanceof Error ? err.message : String(err),\n {\n status: apiErr.status,\n retryAfter: apiErr.headers?.get?.(\"retry-after\") ?? apiErr.headers?.[\"retry-after\"] ?? undefined,\n cause: err,\n },\n );\n }\n }\n\n private static contentPartsToOpenAI(\n parts: ContentPart[],\n ): Array<Record<string, unknown>> {\n return parts.map((part) => {\n if (part.type === \"text\") {\n return { type: \"text\", text: part.text };\n }\n if (part.type === \"image\") {\n return {\n type: \"image_url\",\n image_url: { url: `data:${part.media_type};base64,${part.data}` },\n };\n }\n // image_url\n return { type: \"image_url\", image_url: { url: part.url } };\n });\n }\n\n private buildMessages(\n system: string | undefined,\n messages: ChatMessage[],\n ): Array<Record<string, unknown>> {\n const result: Array<Record<string, unknown>> = [];\n if (system) {\n result.push({ role: \"system\", content: system });\n }\n for (const msg of messages) {\n if (msg.role === \"tool\") {\n const content = Array.isArray(msg.content)\n ? OpenAIProvider.contentPartsToOpenAI(msg.content as ContentPart[])\n : msg.content;\n result.push({\n role: \"tool\",\n tool_call_id: msg.tool_call_id,\n content,\n });\n } else if (msg.role === \"assistant\") {\n const entry: Record<string, unknown> = {\n role: \"assistant\",\n content: msg.content,\n };\n if (msg.tool_calls) {\n entry.tool_calls = msg.tool_calls;\n }\n result.push(entry);\n } else if (msg.role === \"user\") {\n const content = Array.isArray(msg.content)\n ? OpenAIProvider.contentPartsToOpenAI(msg.content as ContentPart[])\n : msg.content;\n result.push({ role: \"user\", content });\n } else {\n result.push({ role: msg.role, content: msg.content });\n }\n }\n return result;\n }\n}\n"],"mappings":";;;;;AAAA,OAAO,YAAY;AAkBnB,IAAM,mBAAmB;AAElB,IAAM,iBAAN,MAAM,gBAAqC;AAAA,EACxC;AAAA,EACC;AAAA,EACC;AAAA,EAEV,YAAY,MAA6B;AACvC,SAAK,SAAS,IAAI,OAAO;AAAA,MACvB,QAAQ,KAAK,UAAU;AAAA,MACvB,SAAS,KAAK;AAAA,MACd,gBAAgB,KAAK;AAAA,MACrB,YAAY;AAAA,IACd,CAAC;AACD,SAAK,eAAe,KAAK,SAAS;AAClC,SAAK,aAAa,KAAK,cAAc;AAAA,EACvC;AAAA,EAEA,OAAO,KAAK,QAAoD;AAC9D,UAAM,WAAW,KAAK,cAAc,OAAO,QAAQ,OAAO,QAAQ;AAClE,UAAM,QAAQ,OAAO,SAAS,KAAK;AACnC,UAAM,YAAY,iBAAiB,KAAK,KAAK;AAE7C,UAAM,eAA2D;AAAA,MAC/D;AAAA,MACA;AAAA,MACA,OAAO,OAAO,OAAO,IAAI,CAAC,OAAO;AAAA,QAC/B,MAAM;AAAA,QACN,UAAU,EAAE;AAAA,MACd,EAAE;AAAA,MACF,QAAQ;AAAA,MACR,GAAI,KAAK,aAAa,CAAC,IAAI,EAAE,gBAAgB,EAAE,eAAe,KAAK,EAAE;AAAA,IACvE;AAEA,QAAI,WAAW;AACb,MAAC,aAAoD,wBAAwB,OAAO,cAAc;AAClG,UAAI,OAAO,UAAU,SAAS,WAAW;AACvC,QAAC,aAAoD,mBAAmB;AAAA,MAC1E;AAAA,IACF,OAAO;AACL,mBAAa,aAAa,OAAO;AACjC,mBAAa,cAAc,OAAO;AAAA,IACpC;AAEA,QAAI,OAAO,cAAc,SAAS,eAAe;AAC/C,MAAC,aAAoD,kBAAkB;AAAA,QACrE,MAAM;AAAA,QACN,aAAa;AAAA,UACX,MAAM,OAAO,aAAa,QAAQ;AAAA,UAClC,QAAQ,OAAO,aAAa;AAAA,UAC5B,QAAQ,OAAO,aAAa,UAAU;AAAA,QACxC;AAAA,MACF;AAAA,IACF,WAAW,OAAO,cAAc,SAAS,eAAe;AACtD,MAAC,aAAoD,kBAAkB;AAAA,QACrE,MAAM;AAAA,MACR;AAAA,IACF;AAEA,QAAI;AACJ,YAAM,SAAS,MAAM,KAAK,OAAO,KAAK,YAAY,OAAO,cAAc;AAAA,QACrE,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,MACnD,CAAC;AAED,uBAAiB,SAAS,QAAQ;AAChC,cAAM,QAAQ,MAAM;AACpB,YAAI;AACJ,YAAI,OAAO;AACT,gBAAM,IAAI;AACV,gBAAM,gBAAgB,EAAE;AACxB,gBAAM,oBAAoB,EAAE;AAC5B,wBAAc;AAAA,YACZ,eAAe,MAAM;AAAA,YACrB,mBAAmB,MAAM;AAAA,YACzB,cAAc,MAAM;AAAA,YACpB,mBAAmB,eAAe;AAAA,YAClC,uBAAuB,eAAe;AAAA,YACtC,iBAAiB,mBAAmB;AAAA,UACtC;AAAA,QACF;AAEA,cAAM,UAAU,MAAM,WAAW,CAAC;AAClC,YAAI,QAAQ,WAAW,KAAK,aAAa;AACvC,gBAAM,EAAE,IAAI,MAAM,IAAI,OAAO,MAAM,OAAO,SAAS,CAAC,GAAG,OAAO,YAAY;AAC1E;AAAA,QACF;AAEA,cAAM;AAAA,UACJ,IAAI,MAAM;AAAA,UACV,OAAO,MAAM;AAAA,UACb,SAAS,QAAQ,IAAI,CAAC,OAAO;AAAA,YAC3B,OAAO,EAAE;AAAA,YACT,OAAO;AAAA,cACL,MAAM,EAAE,MAAM;AAAA,cACd,SAAS,EAAE,MAAM;AAAA,cACjB,kBAAmB,EAAE,MAAkC;AAAA,cACvD,YAAY,EAAE,MAAM,YAAY,IAAI,CAAC,QAAQ;AAAA,gBAC3C,OAAO,GAAG;AAAA,gBACV,IAAI,GAAG;AAAA,gBACP,MAAM,GAAG;AAAA,gBACT,UAAU,GAAG,WACT;AAAA,kBACE,MAAM,GAAG,SAAS;AAAA,kBAClB,WAAW,GAAG,SAAS;AAAA,gBACzB,IACA;AAAA,cACN,EAAE;AAAA,YACJ;AAAA,YACA,eAAe,EAAE;AAAA,UACnB,EAAE;AAAA,UACF,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACA,SAAS,KAAc;AACrB,UAAI,eAAe,gBAAiB,OAAM;AAC1C,YAAM,SAAS;AACf,YAAM,IAAI;AAAA,QACR,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QAC/C;AAAA,UACE,QAAQ,OAAO;AAAA,UACf,YAAY,OAAO,SAAS,MAAM,aAAa,KAAK,OAAO,UAAU,aAAa,KAAK;AAAA,UACvF,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAe,qBACb,OACgC;AAChC,WAAO,MAAM,IAAI,CAAC,SAAS;AACzB,UAAI,KAAK,SAAS,QAAQ;AACxB,eAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,MACzC;AACA,UAAI,KAAK,SAAS,SAAS;AACzB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,WAAW,EAAE,KAAK,QAAQ,KAAK,UAAU,WAAW,KAAK,IAAI,GAAG;AAAA,QAClE;AAAA,MACF;AAEA,aAAO,EAAE,MAAM,aAAa,WAAW,EAAE,KAAK,KAAK,IAAI,EAAE;AAAA,IAC3D,CAAC;AAAA,EACH;AAAA,EAEQ,cACN,QACA,UACgC;AAChC,UAAM,SAAyC,CAAC;AAChD,QAAI,QAAQ;AACV,aAAO,KAAK,EAAE,MAAM,UAAU,SAAS,OAAO,CAAC;AAAA,IACjD;AACA,eAAW,OAAO,UAAU;AAC1B,UAAI,IAAI,SAAS,QAAQ;AACvB,cAAM,UAAU,MAAM,QAAQ,IAAI,OAAO,IACrC,gBAAe,qBAAqB,IAAI,OAAwB,IAChE,IAAI;AACR,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,cAAc,IAAI;AAAA,UAClB;AAAA,QACF,CAAC;AAAA,MACH,WAAW,IAAI,SAAS,aAAa;AACnC,cAAM,QAAiC;AAAA,UACrC,MAAM;AAAA,UACN,SAAS,IAAI;AAAA,QACf;AACA,YAAI,IAAI,YAAY;AAClB,gBAAM,aAAa,IAAI;AAAA,QACzB;AACA,eAAO,KAAK,KAAK;AAAA,MACnB,WAAW,IAAI,SAAS,QAAQ;AAC9B,cAAM,UAAU,MAAM,QAAQ,IAAI,OAAO,IACrC,gBAAe,qBAAqB,IAAI,OAAwB,IAChE,IAAI;AACR,eAAO,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,MACvC,OAAO;AACL,eAAO,KAAK,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,CAAC;AAAA,MACtD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;","names":[]}
|