sortie-dogs 0.3.6 → 0.3.7
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 +17 -16
- package/dist/plugin/model-routing.d.ts +5 -10
- package/dist/plugin/model-routing.js +11 -10
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -20,7 +20,7 @@ Requirements: Node.js 22.6 or newer, npm, and OpenCode.
|
|
|
20
20
|
|
|
21
21
|
Guides: [日本語](docs/guide-ja.md) · [简体中文](docs/guide-zh-CN.md)
|
|
22
22
|
|
|
23
|
-
Release: [v0.3.
|
|
23
|
+
Release: [v0.3.7](https://github.com/zufall-upon/Sortie-dogs/releases/tag/v0.3.7)
|
|
24
24
|
|
|
25
25
|
## Quick start
|
|
26
26
|
|
|
@@ -62,8 +62,8 @@ to the `plugin` array of the OpenCode configuration the agents run under —
|
|
|
62
62
|
Restart OpenCode afterwards. A `plugin` entry must name the package, not a
|
|
63
63
|
subpath: `sortie-dogs/plugin` is an import specifier, not a plugin specifier.
|
|
64
64
|
|
|
65
|
-
`dog-coordinator`
|
|
66
|
-
|
|
65
|
+
`dog-coordinator` defaults to `openai/gpt-5.6-terra`; `dog-scout` defaults to
|
|
66
|
+
`openai/gpt-5.6-luna`. To pin either role to another model, save this
|
|
67
67
|
as `.opencode/sortie-dogs.json`:
|
|
68
68
|
|
|
69
69
|
```json
|
|
@@ -285,16 +285,16 @@ untouched.
|
|
|
285
285
|
|
|
286
286
|
## Model routing
|
|
287
287
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
not model tiers, wherever the work allows it.
|
|
288
|
+
Default routes split work by required capability and repeated-context cost.
|
|
289
|
+
Sortie-dogs keeps retrieval on Luna, coordinator state and routing on Terra,
|
|
290
|
+
and independent review on Sol unless the host declares another target.
|
|
292
291
|
|
|
293
|
-
`dog-coordinator`
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
292
|
+
`dog-coordinator` defaults to `openai/gpt-5.6-terra`. Coordinator work repeatedly
|
|
293
|
+
processes the root context but is primarily state management and routing, so
|
|
294
|
+
Terra is the cost-conscious middle tier between Luna and Sol. Project or global
|
|
295
|
+
`modelRouting` can override this default. If the host proves Terra unavailable,
|
|
296
|
+
the existing availability policy uses a configured free-tier fallback when present
|
|
297
|
+
and otherwise preserves the session model.
|
|
298
298
|
|
|
299
299
|
`dog-scout` defaults to `openai/gpt-5.6-luna` with the `high` variant, since
|
|
300
300
|
gathering bounded evidence is retrieval rather than reasoning and that tier is
|
|
@@ -329,8 +329,8 @@ actually serve.
|
|
|
329
329
|
```json
|
|
330
330
|
{
|
|
331
331
|
"modelRouting": {
|
|
332
|
-
"dog-coordinator": {
|
|
333
|
-
"preferred": { "model": "openai/gpt-5.6-
|
|
332
|
+
"dog-coordinator": {
|
|
333
|
+
"preferred": { "model": "openai/gpt-5.6-terra" }
|
|
334
334
|
},
|
|
335
335
|
"dog-scout": {
|
|
336
336
|
"preferred": { "model": "openai/gpt-5.6-luna", "variant": "high" }
|
|
@@ -344,8 +344,9 @@ actually serve.
|
|
|
344
344
|
}
|
|
345
345
|
},
|
|
346
346
|
"modelCatalog": {
|
|
347
|
-
"project": [
|
|
348
|
-
{ "model": "openai/gpt-5.6-
|
|
347
|
+
"project": [
|
|
348
|
+
{ "model": "openai/gpt-5.6-terra" },
|
|
349
|
+
{ "model": "openai/gpt-5.6-sol", "variants": ["medium", "xhigh"] },
|
|
349
350
|
{ "model": "openai/gpt-5.6-luna", "variants": ["max", "high"] },
|
|
350
351
|
{ "model": "anthropic/claude-opus-5" }
|
|
351
352
|
]
|
|
@@ -16,6 +16,8 @@ export type ModelRoutingConfig = Readonly<Record<string, RoleModelRoute>>;
|
|
|
16
16
|
*/
|
|
17
17
|
export declare const DEDICATED_WORKER_MODEL = "openai/gpt-5.6-luna";
|
|
18
18
|
export declare const DEDICATED_WORKER_VARIANT = "max";
|
|
19
|
+
/** The coordinator balances stronger instruction adherence against the cost of repeated root context. */
|
|
20
|
+
export declare const DEFAULT_COORDINATOR_MODEL = "openai/gpt-5.6-terra";
|
|
19
21
|
/**
|
|
20
22
|
* The stronger, far more expensive worker target a host may still select deliberately. It is no longer
|
|
21
23
|
* a default route: it stays declared so an explicit dedicatedWorkerModel resolves against the catalog
|
|
@@ -38,16 +40,9 @@ export declare function dedicatedWorkerRouting(target?: ModelTarget): ModelRouti
|
|
|
38
40
|
export declare const DEDICATED_WORKER_ROUTING: ModelRoutingConfig;
|
|
39
41
|
export declare const FIXED_MODEL_ROUTING: ModelRoutingConfig;
|
|
40
42
|
export declare const RECOMMENDED_LUNA_MODEL = "openai/gpt-5.6-luna";
|
|
41
|
-
/**
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
* undecided user: it silently discards a choice the user already made and cannot see being reverted.
|
|
45
|
-
* Delegated roles are the opposite, because nobody selects a model for a session the loop spawns.
|
|
46
|
-
* A host that does want a fixed coordinator model still declares one through modelRouting.
|
|
47
|
-
*
|
|
48
|
-
* Evidence gathering is retrieval rather than reasoning, so the scout sits one effort tier below the
|
|
49
|
-
* worker, where the published cost curve returns the most per unit of cost.
|
|
50
|
-
*/
|
|
43
|
+
/** Coordinator state and routing use Terra; evidence retrieval remains on the cheaper Luna tier. */
|
|
44
|
+
export declare const DEFAULT_COORDINATOR_ROUTING: ModelRoutingConfig;
|
|
45
|
+
/** Evidence gathering is retrieval rather than reasoning, so the scout stays one effort tier lower. */
|
|
51
46
|
export declare const RECOMMENDED_SCOUT_VARIANT = "high";
|
|
52
47
|
export declare const RECOMMENDED_LUNA_ROLE_VARIANTS: Readonly<{
|
|
53
48
|
readonly "dog-scout": "high";
|
|
@@ -8,6 +8,8 @@ import { CONSULTATION_ROLE_POLICY } from "../core/consultation.js";
|
|
|
8
8
|
*/
|
|
9
9
|
export const DEDICATED_WORKER_MODEL = "openai/gpt-5.6-luna";
|
|
10
10
|
export const DEDICATED_WORKER_VARIANT = "max";
|
|
11
|
+
/** The coordinator balances stronger instruction adherence against the cost of repeated root context. */
|
|
12
|
+
export const DEFAULT_COORDINATOR_MODEL = "openai/gpt-5.6-terra";
|
|
11
13
|
/**
|
|
12
14
|
* The stronger, far more expensive worker target a host may still select deliberately. It is no longer
|
|
13
15
|
* a default route: it stays declared so an explicit dedicatedWorkerModel resolves against the catalog
|
|
@@ -52,16 +54,13 @@ export const DEDICATED_WORKER_ROUTING = dedicatedWorkerRouting();
|
|
|
52
54
|
export const FIXED_MODEL_ROUTING = DEDICATED_WORKER_ROUTING;
|
|
53
55
|
const fixedModelRoleSet = new Set(Object.keys(FIXED_MODEL_ROUTING));
|
|
54
56
|
export const RECOMMENDED_LUNA_MODEL = "openai/gpt-5.6-luna";
|
|
55
|
-
/**
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
* Evidence gathering is retrieval rather than reasoning, so the scout sits one effort tier below the
|
|
63
|
-
* worker, where the published cost curve returns the most per unit of cost.
|
|
64
|
-
*/
|
|
57
|
+
/** Coordinator state and routing use Terra; evidence retrieval remains on the cheaper Luna tier. */
|
|
58
|
+
export const DEFAULT_COORDINATOR_ROUTING = Object.freeze({
|
|
59
|
+
"dog-coordinator": Object.freeze({
|
|
60
|
+
preferred: Object.freeze({ model: DEFAULT_COORDINATOR_MODEL }),
|
|
61
|
+
}),
|
|
62
|
+
});
|
|
63
|
+
/** Evidence gathering is retrieval rather than reasoning, so the scout stays one effort tier lower. */
|
|
65
64
|
export const RECOMMENDED_SCOUT_VARIANT = "high";
|
|
66
65
|
export const RECOMMENDED_LUNA_ROLE_VARIANTS = Object.freeze({
|
|
67
66
|
"dog-scout": RECOMMENDED_SCOUT_VARIANT,
|
|
@@ -115,6 +114,7 @@ export const RECOMMENDED_CONSULTATION_ROUTING = recommendedConsultationRouting()
|
|
|
115
114
|
/** Every configurable role route this build recommends before host configuration is applied. */
|
|
116
115
|
export function recommendedRoleRouting(fallbackTarget = DEFAULT_DEDICATED_WORKER_TARGET) {
|
|
117
116
|
return Object.freeze({
|
|
117
|
+
...DEFAULT_COORDINATOR_ROUTING,
|
|
118
118
|
...RECOMMENDED_LUNA_ROUTING,
|
|
119
119
|
...recommendedConsultationRouting(fallbackTarget),
|
|
120
120
|
});
|
|
@@ -129,6 +129,7 @@ export function isFixedModelRole(role) {
|
|
|
129
129
|
/** Built-in availability metadata for source-level recommendations; no provider probing required. */
|
|
130
130
|
export const BUILT_IN_MODEL_CATALOG = Object.freeze({
|
|
131
131
|
global: Object.freeze([
|
|
132
|
+
Object.freeze({ model: DEFAULT_COORDINATOR_MODEL }),
|
|
132
133
|
Object.freeze({
|
|
133
134
|
model: DEDICATED_WORKER_MODEL,
|
|
134
135
|
variants: Object.freeze([DEDICATED_WORKER_VARIANT, RECOMMENDED_SCOUT_VARIANT]
|