laohuang 0.3.2 → 0.4.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 +142 -16
- package/dist/agent.d.ts +166 -0
- package/dist/agent.js +858 -0
- package/dist/agent.js.map +1 -0
- package/dist/bash-runner.d.ts +79 -0
- package/dist/bash-runner.js +464 -0
- package/dist/bash-runner.js.map +1 -0
- package/dist/cancellation.d.ts +36 -0
- package/dist/cancellation.js +123 -0
- package/dist/cancellation.js.map +1 -0
- package/dist/cli.d.ts +117 -0
- package/dist/cli.js +1307 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +21 -0
- package/dist/client.js +17 -0
- package/dist/client.js.map +1 -0
- package/dist/commands.d.ts +123 -0
- package/dist/commands.js +660 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +51 -0
- package/dist/config.js +183 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials.d.ts +12 -0
- package/dist/credentials.js +102 -0
- package/dist/credentials.js.map +1 -0
- package/dist/events.d.ts +288 -0
- package/dist/events.js +838 -0
- package/dist/events.js.map +1 -0
- package/dist/model-adapter.d.ts +138 -0
- package/dist/model-adapter.js +244 -0
- package/dist/model-adapter.js.map +1 -0
- package/dist/model-selection.d.ts +67 -0
- package/dist/model-selection.js +148 -0
- package/dist/model-selection.js.map +1 -0
- package/dist/model-stream.d.ts +128 -0
- package/dist/model-stream.js +582 -0
- package/dist/model-stream.js.map +1 -0
- package/dist/project-instructions.d.ts +99 -0
- package/dist/project-instructions.js +348 -0
- package/dist/project-instructions.js.map +1 -0
- package/dist/providers.d.ts +9 -0
- package/dist/providers.js +26 -0
- package/dist/providers.js.map +1 -0
- package/dist/routing.d.ts +170 -0
- package/dist/routing.js +669 -0
- package/dist/routing.js.map +1 -0
- package/dist/semantic-classifier.d.ts +66 -0
- package/dist/semantic-classifier.js +86 -0
- package/dist/semantic-classifier.js.map +1 -0
- package/dist/session.d.ts +162 -0
- package/dist/session.js +871 -0
- package/dist/session.js.map +1 -0
- package/dist/system-prompt.d.ts +16 -0
- package/dist/system-prompt.js +42 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/terminal/editor.d.ts +161 -0
- package/dist/terminal/editor.js +1060 -0
- package/dist/terminal/editor.js.map +1 -0
- package/dist/terminal/input.d.ts +61 -0
- package/dist/terminal/input.js +276 -0
- package/dist/terminal/input.js.map +1 -0
- package/dist/terminal/markdown.d.ts +20 -0
- package/dist/terminal/markdown.js +621 -0
- package/dist/terminal/markdown.js.map +1 -0
- package/dist/terminal/screen.d.ts +66 -0
- package/dist/terminal/screen.js +624 -0
- package/dist/terminal/screen.js.map +1 -0
- package/dist/terminal/theme.d.ts +23 -0
- package/dist/terminal/theme.js +101 -0
- package/dist/terminal/theme.js.map +1 -0
- package/dist/terminal/ui.d.ts +285 -0
- package/dist/terminal/ui.js +1815 -0
- package/dist/terminal/ui.js.map +1 -0
- package/dist/tools.d.ts +95 -0
- package/dist/tools.js +444 -0
- package/dist/tools.js.map +1 -0
- package/dist/ui-state.d.ts +51 -0
- package/dist/ui-state.js +194 -0
- package/dist/ui-state.js.map +1 -0
- package/dist/web.d.ts +56 -0
- package/dist/web.js +247 -0
- package/dist/web.js.map +1 -0
- package/package.json +24 -21
- package/bin/laohuang.js +0 -10
- package/lib/launcher.js +0 -133
- package/vendor/laohuangcode-0.3.2-py3-none-any.whl +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-neutral model adapter boundary (design doc: "Model adapter boundary").
|
|
3
|
+
*
|
|
4
|
+
* `CodingAgent` speaks only the neutral types defined here: {@link ModelRequest}
|
|
5
|
+
* in, delta events plus a {@link StreamResult} out, and {@link ModelError} /
|
|
6
|
+
* {@link classifyModelError} for failures. Each adapter translates the neutral
|
|
7
|
+
* request into the provider's OpenAI-SDK request shape and normalizes errors
|
|
8
|
+
* into the {@link ModelErrorKind} taxonomy. The agent keeps owning the tool
|
|
9
|
+
* loop, budgets, cancellation policy, and retry/compact/notify decisions.
|
|
10
|
+
*
|
|
11
|
+
* Neutral event/result surface: the existing {@link DeltaEvent} /
|
|
12
|
+
* {@link DeltaCallback} / {@link StreamResult} shapes from model-stream.ts are
|
|
13
|
+
* reused as-is because they are already provider-clean (text, reasoning, and
|
|
14
|
+
* tool-call deltas on the callback; usage and finish reason on the result).
|
|
15
|
+
*
|
|
16
|
+
* History: `ModelRequest.messages` is the agent's canonical history in Chat
|
|
17
|
+
* Completions wire shape. Its portable subset (what survives a provider
|
|
18
|
+
* switch) is defined by {@link portableMessage}; an adapter may retain opaque
|
|
19
|
+
* replay state inside history for same-provider continuation (DeepSeek's
|
|
20
|
+
* `reasoning_content`), which `switchModel()` discards via `portableMessage`.
|
|
21
|
+
*/
|
|
22
|
+
import { CancelToken } from "./cancellation.ts";
|
|
23
|
+
import { ModelStreamError, type ChatCompletionsEndpoint, type CompleteOptions, type DeltaCallback, type StreamResult } from "./model-stream.ts";
|
|
24
|
+
/** Structural view of `client.chat` from the openai SDK (or a fake). */
|
|
25
|
+
export interface ChatClientLike {
|
|
26
|
+
chat: {
|
|
27
|
+
completions: ChatCompletionsEndpoint;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Optional thinking/reasoning request settings. The agent never sends these
|
|
32
|
+
* today; they are the seam where provider-specific thinking configuration
|
|
33
|
+
* would enter. Adapters that cannot honor them reject the request.
|
|
34
|
+
*/
|
|
35
|
+
export interface ThinkingSettings {
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
}
|
|
38
|
+
/** Provider-neutral completion request consumed by a {@link ModelAdapter}. */
|
|
39
|
+
export interface ModelRequest {
|
|
40
|
+
model: string;
|
|
41
|
+
/** Normalized history in Chat Completions wire shape. */
|
|
42
|
+
messages: Array<Record<string, unknown>>;
|
|
43
|
+
tools: Array<Record<string, unknown>>;
|
|
44
|
+
toolChoice?: string | Record<string, unknown> | null;
|
|
45
|
+
requestId?: string | undefined;
|
|
46
|
+
cancelToken?: CancelToken | null;
|
|
47
|
+
isRequestActive?: ((requestId: string) => boolean) | null;
|
|
48
|
+
onDelta?: DeltaCallback | null;
|
|
49
|
+
onRequestOpened?: (() => boolean | void) | null;
|
|
50
|
+
thinking?: ThinkingSettings | null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Normalized failure taxonomy. Intentionally coarse: the agent only branches
|
|
54
|
+
* on `authentication` today; the other kinds exist so retry/compact/notify
|
|
55
|
+
* decisions can key off a stable classification instead of SDK internals.
|
|
56
|
+
* Unclassifiable failures default to `retryable` (safe: the caller may retry).
|
|
57
|
+
*/
|
|
58
|
+
export type ModelErrorKind = "authentication" | "rate_limited" | "context_overflow" | "server" | "retryable";
|
|
59
|
+
/** A model failure normalized into the {@link ModelErrorKind} taxonomy. */
|
|
60
|
+
export declare class ModelError extends ModelStreamError {
|
|
61
|
+
readonly kind: ModelErrorKind;
|
|
62
|
+
constructor(message: string, options: {
|
|
63
|
+
kind: ModelErrorKind;
|
|
64
|
+
hadDelta?: boolean;
|
|
65
|
+
cause?: unknown;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/** Request/history/streaming behavior flags, kept minimal and honest. */
|
|
69
|
+
export interface ModelCapabilities {
|
|
70
|
+
/** Streams deltas over the Chat Completions streaming protocol. */
|
|
71
|
+
readonly streaming: boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Replays `reasoning_content` from prior assistant messages back to the
|
|
74
|
+
* provider as opaque state for same-provider tool-call continuation.
|
|
75
|
+
*/
|
|
76
|
+
readonly reasoningReplay: boolean;
|
|
77
|
+
/** Accepts {@link ThinkingSettings} on the neutral request. */
|
|
78
|
+
readonly thinkingSettings: boolean;
|
|
79
|
+
}
|
|
80
|
+
/** Translates neutral requests to one provider's SDK shape and back. */
|
|
81
|
+
export interface ModelAdapter {
|
|
82
|
+
readonly name: string;
|
|
83
|
+
readonly capabilities: ModelCapabilities;
|
|
84
|
+
complete(client: ChatClientLike, request: ModelRequest): Promise<StreamResult>;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Classify an SDK/network error (or an already-wrapped one) into the
|
|
88
|
+
* taxonomy, walking the `cause` chain. Signals, in priority order:
|
|
89
|
+
* 401/403 → authentication, 429 → rate_limited, context-length messages →
|
|
90
|
+
* context_overflow, 5xx → server, network failures → retryable.
|
|
91
|
+
*/
|
|
92
|
+
export declare function classifyModelError(error: unknown): ModelErrorKind;
|
|
93
|
+
/** Kind of a normalized {@link ModelError}, or a fresh classification. */
|
|
94
|
+
export declare function modelErrorKind(error: unknown): ModelErrorKind;
|
|
95
|
+
/**
|
|
96
|
+
* Strip provider-private fields (e.g. DeepSeek `reasoning_content` replay
|
|
97
|
+
* state) so a message is portable across providers. This is the definition
|
|
98
|
+
* of the neutral history retained by `switchModel()`.
|
|
99
|
+
*/
|
|
100
|
+
export declare function portableMessage(message: Record<string, unknown>): Record<string, unknown>;
|
|
101
|
+
/**
|
|
102
|
+
* Chat Completions adapter for OpenAI and OpenAI-compatible endpoints.
|
|
103
|
+
* Owns the request/stream behavior by wrapping {@link ChatCompletionStreamer};
|
|
104
|
+
* streaming, cancellation, stale-request handling, pre-delta retry, usage,
|
|
105
|
+
* and finish validation are all preserved unchanged.
|
|
106
|
+
*/
|
|
107
|
+
export declare class OpenAIAdapter implements ModelAdapter {
|
|
108
|
+
readonly name: string;
|
|
109
|
+
readonly capabilities: ModelCapabilities;
|
|
110
|
+
complete(client: ChatClientLike, request: ModelRequest): Promise<StreamResult>;
|
|
111
|
+
/** Neutral request → streamer options (byte-identical wire behavior). */
|
|
112
|
+
protected translateRequest(request: ModelRequest): CompleteOptions;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* DeepSeek adapter. Shares the OpenAI streaming core (DeepSeek speaks the
|
|
116
|
+
* same Chat Completions protocol and error envelope, so error classification
|
|
117
|
+
* is shared); owns DeepSeek specifics: thinking-settings translation and the
|
|
118
|
+
* `reasoning_content` replay convention. The replay state round-trips through
|
|
119
|
+
* history via `StreamResult.messageDict()`, which emits `reasoning_content`
|
|
120
|
+
* and the tool-call empty-content convention (null content is stripped);
|
|
121
|
+
* this adapter guarantees that behavior by routing through the same
|
|
122
|
+
* validated {@link StreamResult}.
|
|
123
|
+
*/
|
|
124
|
+
export declare class DeepSeekAdapter extends OpenAIAdapter {
|
|
125
|
+
readonly name = "deepseek";
|
|
126
|
+
readonly capabilities: ModelCapabilities;
|
|
127
|
+
protected translateRequest(request: ModelRequest): CompleteOptions;
|
|
128
|
+
}
|
|
129
|
+
/** Maps provider names to adapters; unknown names fall back to OpenAI. */
|
|
130
|
+
export declare class AdapterRegistry {
|
|
131
|
+
private readonly adapters;
|
|
132
|
+
register(adapter: ModelAdapter): void;
|
|
133
|
+
get(name: string): ModelAdapter | undefined;
|
|
134
|
+
/** Resolve a provider name, defaulting to the OpenAI adapter. */
|
|
135
|
+
resolve(name: string | null | undefined): ModelAdapter;
|
|
136
|
+
}
|
|
137
|
+
/** Built-in registry with the two first-party adapters. */
|
|
138
|
+
export declare const defaultAdapterRegistry: AdapterRegistry;
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-neutral model adapter boundary (design doc: "Model adapter boundary").
|
|
3
|
+
*
|
|
4
|
+
* `CodingAgent` speaks only the neutral types defined here: {@link ModelRequest}
|
|
5
|
+
* in, delta events plus a {@link StreamResult} out, and {@link ModelError} /
|
|
6
|
+
* {@link classifyModelError} for failures. Each adapter translates the neutral
|
|
7
|
+
* request into the provider's OpenAI-SDK request shape and normalizes errors
|
|
8
|
+
* into the {@link ModelErrorKind} taxonomy. The agent keeps owning the tool
|
|
9
|
+
* loop, budgets, cancellation policy, and retry/compact/notify decisions.
|
|
10
|
+
*
|
|
11
|
+
* Neutral event/result surface: the existing {@link DeltaEvent} /
|
|
12
|
+
* {@link DeltaCallback} / {@link StreamResult} shapes from model-stream.ts are
|
|
13
|
+
* reused as-is because they are already provider-clean (text, reasoning, and
|
|
14
|
+
* tool-call deltas on the callback; usage and finish reason on the result).
|
|
15
|
+
*
|
|
16
|
+
* History: `ModelRequest.messages` is the agent's canonical history in Chat
|
|
17
|
+
* Completions wire shape. Its portable subset (what survives a provider
|
|
18
|
+
* switch) is defined by {@link portableMessage}; an adapter may retain opaque
|
|
19
|
+
* replay state inside history for same-provider continuation (DeepSeek's
|
|
20
|
+
* `reasoning_content`), which `switchModel()` discards via `portableMessage`.
|
|
21
|
+
*/
|
|
22
|
+
import { ChatCompletionStreamer, ModelStreamCancelled, ModelStreamError, } from "./model-stream.js";
|
|
23
|
+
/** A model failure normalized into the {@link ModelErrorKind} taxonomy. */
|
|
24
|
+
export class ModelError extends ModelStreamError {
|
|
25
|
+
kind;
|
|
26
|
+
constructor(message, options) {
|
|
27
|
+
super(message, { hadDelta: options.hadDelta ?? false, cause: options.cause });
|
|
28
|
+
this.name = "ModelError";
|
|
29
|
+
this.kind = options.kind;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const CONTEXT_OVERFLOW_PATTERN = /context length|maximum context|context window|too many tokens|reduce the length/i;
|
|
33
|
+
const NETWORK_PATTERN = /fetch failed|network|econnreset|econnrefused|etimedout|socket hang up|timed out/i;
|
|
34
|
+
/** Read an HTTP status off SDK errors or plain fakes; undefined when absent. */
|
|
35
|
+
function readStatus(record) {
|
|
36
|
+
let status = record["status_code"];
|
|
37
|
+
if (status === null || status === undefined) {
|
|
38
|
+
const response = record["response"];
|
|
39
|
+
if (response !== null && typeof response === "object") {
|
|
40
|
+
status = response["status_code"];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (status === null || status === undefined) {
|
|
44
|
+
// The openai npm SDK exposes the HTTP status as `status`.
|
|
45
|
+
status = record["status"];
|
|
46
|
+
}
|
|
47
|
+
return status;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Classify an SDK/network error (or an already-wrapped one) into the
|
|
51
|
+
* taxonomy, walking the `cause` chain. Signals, in priority order:
|
|
52
|
+
* 401/403 → authentication, 429 → rate_limited, context-length messages →
|
|
53
|
+
* context_overflow, 5xx → server, network failures → retryable.
|
|
54
|
+
*/
|
|
55
|
+
export function classifyModelError(error) {
|
|
56
|
+
let current = error;
|
|
57
|
+
const seen = new Set();
|
|
58
|
+
while (current !== null &&
|
|
59
|
+
current !== undefined &&
|
|
60
|
+
(typeof current === "object" || typeof current === "function") &&
|
|
61
|
+
!seen.has(current)) {
|
|
62
|
+
seen.add(current);
|
|
63
|
+
const record = current;
|
|
64
|
+
const status = readStatus(record);
|
|
65
|
+
if (status === 401 ||
|
|
66
|
+
status === 403 ||
|
|
67
|
+
record["name"] === "AuthenticationError") {
|
|
68
|
+
return "authentication";
|
|
69
|
+
}
|
|
70
|
+
if (status === 429 || record["name"] === "RateLimitError") {
|
|
71
|
+
return "rate_limited";
|
|
72
|
+
}
|
|
73
|
+
const message = typeof record["message"] === "string" ? record["message"] : "";
|
|
74
|
+
if (CONTEXT_OVERFLOW_PATTERN.test(message)) {
|
|
75
|
+
return "context_overflow";
|
|
76
|
+
}
|
|
77
|
+
if (typeof status === "number" && status >= 500) {
|
|
78
|
+
return "server";
|
|
79
|
+
}
|
|
80
|
+
if (record["name"] === "APIConnectionError" ||
|
|
81
|
+
NETWORK_PATTERN.test(message)) {
|
|
82
|
+
return "retryable";
|
|
83
|
+
}
|
|
84
|
+
current = record["cause"];
|
|
85
|
+
}
|
|
86
|
+
return "retryable";
|
|
87
|
+
}
|
|
88
|
+
/** Kind of a normalized {@link ModelError}, or a fresh classification. */
|
|
89
|
+
export function modelErrorKind(error) {
|
|
90
|
+
return error instanceof ModelError ? error.kind : classifyModelError(error);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Strip provider-private fields (e.g. DeepSeek `reasoning_content` replay
|
|
94
|
+
* state) so a message is portable across providers. This is the definition
|
|
95
|
+
* of the neutral history retained by `switchModel()`.
|
|
96
|
+
*/
|
|
97
|
+
export function portableMessage(message) {
|
|
98
|
+
const role = message["role"];
|
|
99
|
+
const portable = { role };
|
|
100
|
+
if ("content" in message) {
|
|
101
|
+
portable["content"] = message["content"];
|
|
102
|
+
}
|
|
103
|
+
const toolCalls = message["tool_calls"];
|
|
104
|
+
if (role === "assistant" && Array.isArray(toolCalls) && toolCalls.length > 0) {
|
|
105
|
+
portable["tool_calls"] = toolCalls.map((call) => {
|
|
106
|
+
const record = call;
|
|
107
|
+
const fn = (record["function"] ?? {});
|
|
108
|
+
return {
|
|
109
|
+
id: record["id"],
|
|
110
|
+
type: record["type"] ?? "function",
|
|
111
|
+
function: { name: fn["name"], arguments: fn["arguments"] },
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
if (role === "tool") {
|
|
116
|
+
portable["tool_call_id"] = message["tool_call_id"];
|
|
117
|
+
}
|
|
118
|
+
return portable;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Normalize an error escaping the streamer into the taxonomy. Cancellation
|
|
122
|
+
* (including stale requests) is agent policy, not a model failure, and is
|
|
123
|
+
* rethrown untouched; other errors keep their message and `hadDelta` flag.
|
|
124
|
+
*/
|
|
125
|
+
function normalizeModelError(error) {
|
|
126
|
+
if (error instanceof ModelStreamCancelled || error instanceof ModelError) {
|
|
127
|
+
return error;
|
|
128
|
+
}
|
|
129
|
+
const kind = classifyModelError(error);
|
|
130
|
+
if (error instanceof ModelStreamError) {
|
|
131
|
+
return new ModelError(error.message, {
|
|
132
|
+
kind,
|
|
133
|
+
hadDelta: error.hadDelta,
|
|
134
|
+
cause: error,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return new ModelError(errorMessage(error), { kind, cause: error });
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Chat Completions adapter for OpenAI and OpenAI-compatible endpoints.
|
|
141
|
+
* Owns the request/stream behavior by wrapping {@link ChatCompletionStreamer};
|
|
142
|
+
* streaming, cancellation, stale-request handling, pre-delta retry, usage,
|
|
143
|
+
* and finish validation are all preserved unchanged.
|
|
144
|
+
*/
|
|
145
|
+
export class OpenAIAdapter {
|
|
146
|
+
name = "openai";
|
|
147
|
+
capabilities = {
|
|
148
|
+
streaming: true,
|
|
149
|
+
reasoningReplay: false,
|
|
150
|
+
thinkingSettings: false,
|
|
151
|
+
};
|
|
152
|
+
async complete(client, request) {
|
|
153
|
+
try {
|
|
154
|
+
return await new ChatCompletionStreamer(client.chat.completions).complete(this.translateRequest(request));
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
throw normalizeModelError(error);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/** Neutral request → streamer options (byte-identical wire behavior). */
|
|
161
|
+
translateRequest(request) {
|
|
162
|
+
if (request.thinking != null) {
|
|
163
|
+
throw new ModelStreamError(`The ${this.name} adapter does not support thinking settings`);
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
model: request.model,
|
|
167
|
+
messages: request.messages,
|
|
168
|
+
tools: request.tools,
|
|
169
|
+
toolChoice: request.toolChoice ?? null,
|
|
170
|
+
requestId: request.requestId,
|
|
171
|
+
cancelToken: request.cancelToken ?? null,
|
|
172
|
+
isRequestActive: request.isRequestActive ?? null,
|
|
173
|
+
onDelta: request.onDelta ?? null,
|
|
174
|
+
onRequestOpened: request.onRequestOpened ?? null,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* DeepSeek adapter. Shares the OpenAI streaming core (DeepSeek speaks the
|
|
180
|
+
* same Chat Completions protocol and error envelope, so error classification
|
|
181
|
+
* is shared); owns DeepSeek specifics: thinking-settings translation and the
|
|
182
|
+
* `reasoning_content` replay convention. The replay state round-trips through
|
|
183
|
+
* history via `StreamResult.messageDict()`, which emits `reasoning_content`
|
|
184
|
+
* and the tool-call empty-content convention (null content is stripped);
|
|
185
|
+
* this adapter guarantees that behavior by routing through the same
|
|
186
|
+
* validated {@link StreamResult}.
|
|
187
|
+
*/
|
|
188
|
+
export class DeepSeekAdapter extends OpenAIAdapter {
|
|
189
|
+
name = "deepseek";
|
|
190
|
+
capabilities = {
|
|
191
|
+
streaming: true,
|
|
192
|
+
reasoningReplay: true,
|
|
193
|
+
thinkingSettings: true,
|
|
194
|
+
};
|
|
195
|
+
translateRequest(request) {
|
|
196
|
+
const thinking = request.thinking;
|
|
197
|
+
const options = super.translateRequest({ ...request, thinking: null });
|
|
198
|
+
if (thinking != null) {
|
|
199
|
+
options.extraBody = { thinking: translateThinkingSettings(thinking) };
|
|
200
|
+
}
|
|
201
|
+
return options;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/** Validate neutral thinking settings and translate to DeepSeek's wire shape. */
|
|
205
|
+
function translateThinkingSettings(settings) {
|
|
206
|
+
if (typeof settings !== "object" ||
|
|
207
|
+
settings === null ||
|
|
208
|
+
typeof settings.enabled !== "boolean") {
|
|
209
|
+
throw new ModelStreamError("DeepSeek thinking settings must be { enabled: boolean }");
|
|
210
|
+
}
|
|
211
|
+
return { type: settings.enabled ? "enabled" : "disabled" };
|
|
212
|
+
}
|
|
213
|
+
/** Maps provider names to adapters; unknown names fall back to OpenAI. */
|
|
214
|
+
export class AdapterRegistry {
|
|
215
|
+
adapters = new Map();
|
|
216
|
+
register(adapter) {
|
|
217
|
+
this.adapters.set(adapter.name, adapter);
|
|
218
|
+
}
|
|
219
|
+
get(name) {
|
|
220
|
+
return this.adapters.get(name);
|
|
221
|
+
}
|
|
222
|
+
/** Resolve a provider name, defaulting to the OpenAI adapter. */
|
|
223
|
+
resolve(name) {
|
|
224
|
+
if (name) {
|
|
225
|
+
const adapter = this.adapters.get(name);
|
|
226
|
+
if (adapter !== undefined) {
|
|
227
|
+
return adapter;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
const fallback = this.adapters.get("openai");
|
|
231
|
+
if (fallback === undefined) {
|
|
232
|
+
throw new Error("No model adapter registered for openai");
|
|
233
|
+
}
|
|
234
|
+
return fallback;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/** Built-in registry with the two first-party adapters. */
|
|
238
|
+
export const defaultAdapterRegistry = new AdapterRegistry();
|
|
239
|
+
defaultAdapterRegistry.register(new OpenAIAdapter());
|
|
240
|
+
defaultAdapterRegistry.register(new DeepSeekAdapter());
|
|
241
|
+
function errorMessage(error) {
|
|
242
|
+
return error instanceof Error ? error.message : String(error);
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=model-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-adapter.js","sourceRoot":"","sources":["../src/model-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/** Interactive provider, credential, and model selection. */
|
|
2
|
+
import type { ClientConnectionSettings } from "./client.ts";
|
|
3
|
+
import type { Provider } from "./providers.ts";
|
|
4
|
+
/**
|
|
5
|
+
* Minimal structural view of the runtime configuration produced here.
|
|
6
|
+
* The full `Config` type is owned by config.ts.
|
|
7
|
+
*/
|
|
8
|
+
export interface SelectionConfig {
|
|
9
|
+
readonly apiKey: string | null;
|
|
10
|
+
readonly model: string;
|
|
11
|
+
readonly baseUrl: string | null;
|
|
12
|
+
readonly provider: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Minimal structural view of the credential store owned by credentials.ts:
|
|
16
|
+
* only the two methods model selection relies on.
|
|
17
|
+
*/
|
|
18
|
+
export interface CredentialStoreLike {
|
|
19
|
+
get(provider: string): string | null;
|
|
20
|
+
set(provider: string, apiKey: string): void;
|
|
21
|
+
}
|
|
22
|
+
/** Structural view of the provider registry owned by providers.ts. */
|
|
23
|
+
export interface ProviderRegistry {
|
|
24
|
+
/** Look up a preset by name; throws on unknown providers. */
|
|
25
|
+
get(name: string): Provider;
|
|
26
|
+
/** Sorted provider names. */
|
|
27
|
+
names(): string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Question functions are asynchronous: inside an interactive session they are
|
|
31
|
+
* wired to `TerminalUI.prompt`/`TerminalUI.promptSecret`, which resolve only
|
|
32
|
+
* after the running terminal loop processes the answer.
|
|
33
|
+
*/
|
|
34
|
+
export type InputFn = (prompt: string) => Promise<string>;
|
|
35
|
+
export type OutputFn = (message: string) => void;
|
|
36
|
+
export type ClientFactory = (settings: ClientConnectionSettings) => unknown;
|
|
37
|
+
/** Structural match for `createClient` from client.ts. */
|
|
38
|
+
export type CreateClientFn = (config: {
|
|
39
|
+
apiKey?: string | undefined;
|
|
40
|
+
baseUrl?: string | undefined;
|
|
41
|
+
}, options?: {
|
|
42
|
+
clientFactory?: ClientFactory | undefined;
|
|
43
|
+
}) => unknown;
|
|
44
|
+
export interface ModelSelection {
|
|
45
|
+
readonly config: SelectionConfig;
|
|
46
|
+
readonly client: unknown;
|
|
47
|
+
}
|
|
48
|
+
export interface ModelSelectorOptions {
|
|
49
|
+
readonly credentials: CredentialStoreLike;
|
|
50
|
+
readonly registry: ProviderRegistry;
|
|
51
|
+
readonly createClient: CreateClientFn;
|
|
52
|
+
readonly input: InputFn;
|
|
53
|
+
readonly secretInput: InputFn;
|
|
54
|
+
readonly output?: OutputFn | undefined;
|
|
55
|
+
readonly clientFactory?: ClientFactory | undefined;
|
|
56
|
+
}
|
|
57
|
+
export interface SelectOptions {
|
|
58
|
+
readonly providerName?: string | undefined;
|
|
59
|
+
readonly modelName?: string | undefined;
|
|
60
|
+
readonly promptForMissingKey?: boolean | undefined;
|
|
61
|
+
}
|
|
62
|
+
/** Build a runtime model selection without exposing API keys. */
|
|
63
|
+
export declare class ModelSelector {
|
|
64
|
+
#private;
|
|
65
|
+
constructor(options: ModelSelectorOptions);
|
|
66
|
+
select(options?: SelectOptions): Promise<ModelSelection | null>;
|
|
67
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/** Interactive provider, credential, and model selection. */
|
|
2
|
+
const PROVIDER_DISPLAY_NAMES = {
|
|
3
|
+
deepseek: "DeepSeek",
|
|
4
|
+
openai: "OpenAI",
|
|
5
|
+
};
|
|
6
|
+
/** Build a runtime model selection without exposing API keys. */
|
|
7
|
+
export class ModelSelector {
|
|
8
|
+
#credentials;
|
|
9
|
+
#registry;
|
|
10
|
+
#createClient;
|
|
11
|
+
#input;
|
|
12
|
+
#secretInput;
|
|
13
|
+
#output;
|
|
14
|
+
#clientFactory;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.#credentials = options.credentials;
|
|
17
|
+
this.#registry = options.registry;
|
|
18
|
+
this.#createClient = options.createClient;
|
|
19
|
+
this.#input = options.input;
|
|
20
|
+
this.#secretInput = options.secretInput;
|
|
21
|
+
this.#output = options.output ?? ((message) => console.log(message));
|
|
22
|
+
this.#clientFactory = options.clientFactory;
|
|
23
|
+
}
|
|
24
|
+
async select(options = {}) {
|
|
25
|
+
const promptForMissingKey = options.promptForMissingKey ?? true;
|
|
26
|
+
let providerName = options.providerName;
|
|
27
|
+
if (providerName === undefined) {
|
|
28
|
+
providerName = (await this.#chooseProvider()) ?? undefined;
|
|
29
|
+
if (providerName === undefined) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const provider = this.#registry.get(providerName);
|
|
34
|
+
let apiKey = this.#credentials.get(providerName);
|
|
35
|
+
const newApiKey = apiKey === null;
|
|
36
|
+
if (apiKey === null) {
|
|
37
|
+
if (!promptForMissingKey) {
|
|
38
|
+
this.#output(`No credentials configured for ${providerName}. ` +
|
|
39
|
+
`Run /login ${providerName} first.`);
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
apiKey = await this.#readSecret(`Enter ${providerName} API key: `);
|
|
43
|
+
if (!apiKey) {
|
|
44
|
+
this.#output("Model selection cancelled: API key is empty.");
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
let modelName = options.modelName;
|
|
49
|
+
const client = this.#createClient({
|
|
50
|
+
apiKey,
|
|
51
|
+
baseUrl: provider.baseUrl ?? undefined,
|
|
52
|
+
}, { clientFactory: this.#clientFactory });
|
|
53
|
+
if (modelName === undefined) {
|
|
54
|
+
let models = provider.suggestedModels;
|
|
55
|
+
if (models.length === 0) {
|
|
56
|
+
try {
|
|
57
|
+
const listed = await client.models.list();
|
|
58
|
+
models = [...listed]
|
|
59
|
+
.map((model) => model?.id)
|
|
60
|
+
.filter((id) => typeof id === "string")
|
|
61
|
+
.sort();
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
const errorName = error instanceof Error ? error.name : "Error";
|
|
65
|
+
this.#output(`Could not load models (${errorName}); enter a model name manually.`);
|
|
66
|
+
models = [];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
modelName =
|
|
70
|
+
models.length > 0
|
|
71
|
+
? (await this.#chooseModel(models)) ?? undefined
|
|
72
|
+
: (await this.#readInput("Model name: ")) || undefined;
|
|
73
|
+
if (modelName === undefined) {
|
|
74
|
+
this.#output("Model selection cancelled: model name is empty.");
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const config = {
|
|
79
|
+
apiKey,
|
|
80
|
+
model: modelName,
|
|
81
|
+
baseUrl: provider.baseUrl,
|
|
82
|
+
provider: providerName,
|
|
83
|
+
};
|
|
84
|
+
if (newApiKey) {
|
|
85
|
+
this.#credentials.set(providerName, apiKey);
|
|
86
|
+
}
|
|
87
|
+
return { config, client };
|
|
88
|
+
}
|
|
89
|
+
async #chooseProvider() {
|
|
90
|
+
const names = this.#registry.names();
|
|
91
|
+
this.#output("Model providers:");
|
|
92
|
+
names.forEach((name, index) => {
|
|
93
|
+
this.#output(` ${index + 1}. ${PROVIDER_DISPLAY_NAMES[name] ?? name}`);
|
|
94
|
+
});
|
|
95
|
+
const answer = await this.#readInput("Select provider: ");
|
|
96
|
+
if (answer === null) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const choice = Number(answer);
|
|
100
|
+
const selected = Number.isInteger(choice) ? names[choice - 1] : undefined;
|
|
101
|
+
if (selected === undefined) {
|
|
102
|
+
this.#output("Model selection cancelled: invalid provider.");
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
return selected;
|
|
106
|
+
}
|
|
107
|
+
async #chooseModel(models) {
|
|
108
|
+
this.#output("Available models:");
|
|
109
|
+
models.forEach((model, index) => {
|
|
110
|
+
this.#output(` ${index + 1}. ${model}`);
|
|
111
|
+
});
|
|
112
|
+
this.#output(" m. Enter a model name manually");
|
|
113
|
+
const answer = await this.#readInput("Select model: ");
|
|
114
|
+
if (answer === null) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
if (answer.toLowerCase() === "m") {
|
|
118
|
+
const manual = await this.#readInput("Model name: ");
|
|
119
|
+
return manual || null;
|
|
120
|
+
}
|
|
121
|
+
const choice = Number(answer);
|
|
122
|
+
const selected = Number.isInteger(choice) ? models[choice - 1] : undefined;
|
|
123
|
+
if (selected === undefined) {
|
|
124
|
+
this.#output("Model selection cancelled: invalid choice.");
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
return selected;
|
|
128
|
+
}
|
|
129
|
+
async #readInput(prompt) {
|
|
130
|
+
try {
|
|
131
|
+
return (await this.#input(prompt)).trim();
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
this.#output("Model selection cancelled.");
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async #readSecret(prompt) {
|
|
139
|
+
try {
|
|
140
|
+
return (await this.#secretInput(prompt)).trim();
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
this.#output("Model selection cancelled.");
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=model-selection.js.map
|