@framers/agentos 0.1.162 → 0.1.163
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/llm/routing/IModelRouter.d.ts +11 -0
- package/dist/core/llm/routing/IModelRouter.d.ts.map +1 -1
- package/dist/core/llm/routing/PolicyAwareRouter.d.ts +58 -0
- package/dist/core/llm/routing/PolicyAwareRouter.d.ts.map +1 -0
- package/dist/core/llm/routing/PolicyAwareRouter.js +109 -0
- package/dist/core/llm/routing/PolicyAwareRouter.js.map +1 -0
- package/dist/core/llm/routing/UncensoredModelCatalog.d.ts +70 -0
- package/dist/core/llm/routing/UncensoredModelCatalog.d.ts.map +1 -0
- package/dist/core/llm/routing/UncensoredModelCatalog.js +183 -0
- package/dist/core/llm/routing/UncensoredModelCatalog.js.map +1 -0
- package/dist/media/images/PolicyAwareImageRouter.d.ts +51 -0
- package/dist/media/images/PolicyAwareImageRouter.d.ts.map +1 -0
- package/dist/media/images/PolicyAwareImageRouter.js +79 -0
- package/dist/media/images/PolicyAwareImageRouter.js.map +1 -0
- package/package.json +1 -1
|
@@ -67,6 +67,17 @@ export interface ModelRouteParams {
|
|
|
67
67
|
userApiKeys?: Record<string, string>;
|
|
68
68
|
/** Additional custom parameters or context to aid routing decisions. */
|
|
69
69
|
customContext?: Record<string, any>;
|
|
70
|
+
/**
|
|
71
|
+
* Content policy tier governing this request. Drives model selection:
|
|
72
|
+
* safe/standard use default censored models, mature/private-adult route
|
|
73
|
+
* to uncensored models via PolicyAwareRouter.
|
|
74
|
+
*/
|
|
75
|
+
policyTier?: 'safe' | 'standard' | 'mature' | 'private-adult';
|
|
76
|
+
/**
|
|
77
|
+
* Finer-grained content intent hint. A mature session doing combat narration
|
|
78
|
+
* vs. romance has different model preferences.
|
|
79
|
+
*/
|
|
80
|
+
contentIntent?: 'general' | 'romantic' | 'erotic' | 'violent' | 'horror';
|
|
70
81
|
}
|
|
71
82
|
/**
|
|
72
83
|
* The result of a model routing decision.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IModelRouter.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/routing/IModelRouter.ts"],"names":[],"mappings":"AACA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0DAA0D,CAAC;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+GAA+G;IAC/G,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8FAA8F;IAC9F,oBAAoB,CAAC,EAAE,iBAAiB,CAAC;IACzC,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;IACnE;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B;;OAEG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;;OAEG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,kGAAkG;IAClG,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"IModelRouter.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/routing/IModelRouter.ts"],"names":[],"mappings":"AACA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0DAA0D,CAAC;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+GAA+G;IAC/G,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8FAA8F;IAC9F,oBAAoB,CAAC,EAAE,iBAAiB,CAAC;IACzC,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;IACnE;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B;;OAEG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;;OAEG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,kGAAkG;IAClG,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEpC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,eAAe,CAAC;IAE9D;;;OAGG;IACH,aAAa,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;CAC1E;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,QAAQ,EAAE,SAAS,CAAC;IACpB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,SAAS,EAAE,SAAS,CAAC;IACrB,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,4GAA4G;IAC5G,iBAAiB,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IACvD,8GAA8G;IAC9G,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B;;;;;;;;;;;OAWG;IACH,UAAU,CACR,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,eAAe,EAAE,GAAG,EAAE,mCAAmC;IACzD,YAAY,CAAC,EAAE,GAAG,GACjB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;;;;;;;OAUG;IACH,WAAW,CACT,MAAM,EAAE,gBAAgB,EACxB,eAAe,CAAC,EAAE,SAAS,EAAE,GAC5B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;CACrC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Policy-aware model router that selects uncensored LLMs for
|
|
3
|
+
* mature/private-adult content policy tiers.
|
|
4
|
+
*
|
|
5
|
+
* For safe/standard tiers (or when no policy tier is specified), the router
|
|
6
|
+
* delegates to an optional base router or returns null, letting the caller
|
|
7
|
+
* fall back to its own default model. For mature/private-adult tiers, it
|
|
8
|
+
* consults the {@link UncensoredModelCatalog} and returns an OpenRouter model
|
|
9
|
+
* wrapped in a minimal {@link ModelRouteResult}.
|
|
10
|
+
*
|
|
11
|
+
* @module core/llm/routing/PolicyAwareRouter
|
|
12
|
+
*/
|
|
13
|
+
import type { IModelRouter, ModelRouteParams, ModelRouteResult } from './IModelRouter';
|
|
14
|
+
import type { ModelInfo } from '../providers/IProvider';
|
|
15
|
+
import type { UncensoredModelCatalog, PolicyTier } from './UncensoredModelCatalog';
|
|
16
|
+
/**
|
|
17
|
+
* Manual override map: policyTier -> fixed modelId.
|
|
18
|
+
* When provided, bypasses catalog lookup for the specified tier.
|
|
19
|
+
*/
|
|
20
|
+
export type PolicyOverrides = Partial<Record<PolicyTier, string>>;
|
|
21
|
+
/**
|
|
22
|
+
* Policy-aware router that wraps an optional base router and injects
|
|
23
|
+
* uncensored model selection for mature/private-adult policy tiers.
|
|
24
|
+
*/
|
|
25
|
+
export declare class PolicyAwareRouter implements IModelRouter {
|
|
26
|
+
readonly routerId = "policy_aware_router_v1";
|
|
27
|
+
private readonly catalog;
|
|
28
|
+
private readonly baseRouter;
|
|
29
|
+
private readonly overrides;
|
|
30
|
+
private readonly defaultPolicyTier;
|
|
31
|
+
/**
|
|
32
|
+
* @param catalog - Uncensored model catalog for mature/private-adult lookup.
|
|
33
|
+
* @param baseRouter - Optional delegate for safe/standard tiers.
|
|
34
|
+
* @param overrides - Per-tier model ID overrides that bypass catalog lookup.
|
|
35
|
+
* @param defaultPolicyTier - Fallback tier when params.policyTier is absent.
|
|
36
|
+
*/
|
|
37
|
+
constructor(catalog: UncensoredModelCatalog, baseRouter?: IModelRouter | null, overrides?: PolicyOverrides, defaultPolicyTier?: PolicyTier);
|
|
38
|
+
/**
|
|
39
|
+
* No-op initialization. The PolicyAwareRouter is stateless beyond its
|
|
40
|
+
* constructor arguments; it does not require async setup.
|
|
41
|
+
*/
|
|
42
|
+
initialize(_config: Record<string, any>, _providerManager: any, _promptEngine?: any): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Select a model based on the request's policy tier.
|
|
45
|
+
*
|
|
46
|
+
* - safe / standard / absent (no default): delegate to baseRouter or return null.
|
|
47
|
+
* - mature / private-adult: check overrides, then catalog, return OpenRouter result.
|
|
48
|
+
*/
|
|
49
|
+
selectModel(params: ModelRouteParams, availableModels?: ModelInfo[]): Promise<ModelRouteResult | null>;
|
|
50
|
+
/**
|
|
51
|
+
* Build a minimal {@link ModelRouteResult} with a stub provider.
|
|
52
|
+
* The provider stub satisfies the interface contract while signalling to
|
|
53
|
+
* upstream consumers that the actual provider instance must be resolved
|
|
54
|
+
* from the provider manager using the returned providerId.
|
|
55
|
+
*/
|
|
56
|
+
private buildResult;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=PolicyAwareRouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PolicyAwareRouter.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/routing/PolicyAwareRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EACV,sBAAsB,EACtB,UAAU,EAEX,MAAM,0BAA0B,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AAElE;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IACpD,SAAgB,QAAQ,4BAA4B;IAEpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyB;IAE3D;;;;;OAKG;gBAED,OAAO,EAAE,sBAAsB,EAC/B,UAAU,CAAC,EAAE,YAAY,GAAG,IAAI,EAChC,SAAS,CAAC,EAAE,eAAe,EAC3B,iBAAiB,CAAC,EAAE,UAAU;IAQhC;;;OAGG;IACG,UAAU,CACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,gBAAgB,EAAE,GAAG,EACrB,aAAa,CAAC,EAAE,GAAG,GAClB,OAAO,CAAC,IAAI,CAAC;IAIhB;;;;;OAKG;IACG,WAAW,CACf,MAAM,EAAE,gBAAgB,EACxB,eAAe,CAAC,EAAE,SAAS,EAAE,GAC5B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IA+BnC;;;;;OAKG;IACH,OAAO,CAAC,WAAW;CAyCpB"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Policy-aware model router that selects uncensored LLMs for
|
|
3
|
+
* mature/private-adult content policy tiers.
|
|
4
|
+
*
|
|
5
|
+
* For safe/standard tiers (or when no policy tier is specified), the router
|
|
6
|
+
* delegates to an optional base router or returns null, letting the caller
|
|
7
|
+
* fall back to its own default model. For mature/private-adult tiers, it
|
|
8
|
+
* consults the {@link UncensoredModelCatalog} and returns an OpenRouter model
|
|
9
|
+
* wrapped in a minimal {@link ModelRouteResult}.
|
|
10
|
+
*
|
|
11
|
+
* @module core/llm/routing/PolicyAwareRouter
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Policy-aware router that wraps an optional base router and injects
|
|
15
|
+
* uncensored model selection for mature/private-adult policy tiers.
|
|
16
|
+
*/
|
|
17
|
+
export class PolicyAwareRouter {
|
|
18
|
+
/**
|
|
19
|
+
* @param catalog - Uncensored model catalog for mature/private-adult lookup.
|
|
20
|
+
* @param baseRouter - Optional delegate for safe/standard tiers.
|
|
21
|
+
* @param overrides - Per-tier model ID overrides that bypass catalog lookup.
|
|
22
|
+
* @param defaultPolicyTier - Fallback tier when params.policyTier is absent.
|
|
23
|
+
*/
|
|
24
|
+
constructor(catalog, baseRouter, overrides, defaultPolicyTier) {
|
|
25
|
+
this.routerId = 'policy_aware_router_v1';
|
|
26
|
+
this.catalog = catalog;
|
|
27
|
+
this.baseRouter = baseRouter ?? null;
|
|
28
|
+
this.overrides = overrides ?? {};
|
|
29
|
+
this.defaultPolicyTier = defaultPolicyTier;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* No-op initialization. The PolicyAwareRouter is stateless beyond its
|
|
33
|
+
* constructor arguments; it does not require async setup.
|
|
34
|
+
*/
|
|
35
|
+
async initialize(_config, _providerManager, _promptEngine) {
|
|
36
|
+
// Intentionally empty: catalog is injected, no async work needed.
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Select a model based on the request's policy tier.
|
|
40
|
+
*
|
|
41
|
+
* - safe / standard / absent (no default): delegate to baseRouter or return null.
|
|
42
|
+
* - mature / private-adult: check overrides, then catalog, return OpenRouter result.
|
|
43
|
+
*/
|
|
44
|
+
async selectModel(params, availableModels) {
|
|
45
|
+
const tier = params.policyTier ?? this.defaultPolicyTier;
|
|
46
|
+
// Safe / standard / absent tier: delegate or return null
|
|
47
|
+
if (!tier || tier === 'safe' || tier === 'standard') {
|
|
48
|
+
if (this.baseRouter) {
|
|
49
|
+
return this.baseRouter.selectModel(params, availableModels);
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
// Check per-tier override first
|
|
54
|
+
const overrideModelId = this.overrides[tier];
|
|
55
|
+
if (overrideModelId) {
|
|
56
|
+
return this.buildResult(overrideModelId, 'openrouter', `Override for ${tier} tier`);
|
|
57
|
+
}
|
|
58
|
+
// Consult catalog
|
|
59
|
+
const entry = this.catalog.getPreferredTextModel(tier, params.contentIntent);
|
|
60
|
+
if (entry) {
|
|
61
|
+
return this.buildResult(entry.modelId, entry.providerId, `Catalog selection for ${tier} tier (${entry.displayName})`);
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Build a minimal {@link ModelRouteResult} with a stub provider.
|
|
67
|
+
* The provider stub satisfies the interface contract while signalling to
|
|
68
|
+
* upstream consumers that the actual provider instance must be resolved
|
|
69
|
+
* from the provider manager using the returned providerId.
|
|
70
|
+
*/
|
|
71
|
+
buildResult(modelId, providerId, reasoning) {
|
|
72
|
+
return {
|
|
73
|
+
provider: {
|
|
74
|
+
providerId,
|
|
75
|
+
isInitialized: false,
|
|
76
|
+
async initialize() { },
|
|
77
|
+
async generateCompletion() {
|
|
78
|
+
throw new Error('Stub provider — resolve via AIModelProviderManager');
|
|
79
|
+
},
|
|
80
|
+
async *generateCompletionStream() {
|
|
81
|
+
throw new Error('Stub provider — resolve via AIModelProviderManager');
|
|
82
|
+
},
|
|
83
|
+
async generateEmbeddings() {
|
|
84
|
+
throw new Error('Stub provider — resolve via AIModelProviderManager');
|
|
85
|
+
},
|
|
86
|
+
async listAvailableModels() {
|
|
87
|
+
return [];
|
|
88
|
+
},
|
|
89
|
+
async getModelInfo() {
|
|
90
|
+
return undefined;
|
|
91
|
+
},
|
|
92
|
+
async checkHealth() {
|
|
93
|
+
return { isHealthy: false };
|
|
94
|
+
},
|
|
95
|
+
async shutdown() { },
|
|
96
|
+
},
|
|
97
|
+
modelId,
|
|
98
|
+
modelInfo: {
|
|
99
|
+
modelId,
|
|
100
|
+
providerId,
|
|
101
|
+
capabilities: ['chat'],
|
|
102
|
+
},
|
|
103
|
+
reasoning,
|
|
104
|
+
confidence: 0.85,
|
|
105
|
+
metadata: { source: this.routerId, policyRouted: true },
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=PolicyAwareRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PolicyAwareRouter.js","sourceRoot":"","sources":["../../../../src/core/llm/routing/PolicyAwareRouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Uncensored model catalog for policy-aware routing.
|
|
3
|
+
*
|
|
4
|
+
* Maps content policy tiers to curated lists of uncensored text and image
|
|
5
|
+
* models available through OpenRouter (text) and Replicate (image). The
|
|
6
|
+
* catalog is the single source of truth consumed by {@link PolicyAwareRouter}
|
|
7
|
+
* and {@link PolicyAwareImageRouter} to select models that honour the
|
|
8
|
+
* agent's content policy without imposing upstream safety filters.
|
|
9
|
+
*
|
|
10
|
+
* @module core/llm/routing/UncensoredModelCatalog
|
|
11
|
+
*/
|
|
12
|
+
/** Content policy tier governing model selection. */
|
|
13
|
+
export type PolicyTier = 'safe' | 'standard' | 'mature' | 'private-adult';
|
|
14
|
+
/** Finer-grained content intent hint within a policy tier. */
|
|
15
|
+
export type ContentIntent = 'general' | 'romantic' | 'erotic' | 'violent' | 'horror';
|
|
16
|
+
/** A single model entry in the uncensored catalog. */
|
|
17
|
+
export interface CatalogEntry {
|
|
18
|
+
/** OpenRouter / Replicate model identifier. */
|
|
19
|
+
modelId: string;
|
|
20
|
+
/** Human-readable display name. */
|
|
21
|
+
displayName: string;
|
|
22
|
+
/** Provider that hosts this model (e.g. 'openrouter', 'replicate'). */
|
|
23
|
+
providerId: string;
|
|
24
|
+
/** Modality: 'text' for LLMs, 'image' for diffusion/GAN. */
|
|
25
|
+
modality: 'text' | 'image';
|
|
26
|
+
/** Quality tier used for preference ordering. */
|
|
27
|
+
quality: 'high' | 'medium' | 'low';
|
|
28
|
+
/** Content permission tags describing what the model allows. */
|
|
29
|
+
contentPermissions: ContentIntent[];
|
|
30
|
+
/** Provider-specific capability tags (e.g. 'face-consistency', 'video'). */
|
|
31
|
+
capabilities: string[];
|
|
32
|
+
}
|
|
33
|
+
/** Read-only catalog of uncensored models. */
|
|
34
|
+
export interface UncensoredModelCatalog {
|
|
35
|
+
/**
|
|
36
|
+
* Return all text model entries, optionally filtered.
|
|
37
|
+
* @param filter - Optional quality or content permission filter.
|
|
38
|
+
*/
|
|
39
|
+
getTextModels(filter?: {
|
|
40
|
+
quality?: CatalogEntry['quality'];
|
|
41
|
+
contentPermissions?: ContentIntent[];
|
|
42
|
+
}): CatalogEntry[];
|
|
43
|
+
/**
|
|
44
|
+
* Return all image model entries, optionally filtered.
|
|
45
|
+
* @param filter - Optional capability filter.
|
|
46
|
+
*/
|
|
47
|
+
getImageModels(filter?: {
|
|
48
|
+
capabilities?: string[];
|
|
49
|
+
}): CatalogEntry[];
|
|
50
|
+
/**
|
|
51
|
+
* Return the preferred text model for a given policy tier.
|
|
52
|
+
* Returns null for safe/standard tiers (use default censored model).
|
|
53
|
+
* @param tier - Content policy tier.
|
|
54
|
+
* @param contentIntent - Optional content intent for finer selection.
|
|
55
|
+
*/
|
|
56
|
+
getPreferredTextModel(tier: PolicyTier, contentIntent?: ContentIntent): CatalogEntry | null;
|
|
57
|
+
/**
|
|
58
|
+
* Return the preferred image model for a given policy tier.
|
|
59
|
+
* Returns null for safe/standard tiers.
|
|
60
|
+
* @param tier - Content policy tier.
|
|
61
|
+
* @param capabilities - Optional required capabilities.
|
|
62
|
+
*/
|
|
63
|
+
getPreferredImageModel(tier: PolicyTier, capabilities?: string[]): CatalogEntry | null;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Create a default {@link UncensoredModelCatalog} populated with curated
|
|
67
|
+
* OpenRouter text models and Replicate image models.
|
|
68
|
+
*/
|
|
69
|
+
export declare function createUncensoredModelCatalog(): UncensoredModelCatalog;
|
|
70
|
+
//# sourceMappingURL=UncensoredModelCatalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UncensoredModelCatalog.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/routing/UncensoredModelCatalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,qDAAqD;AACrD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,eAAe,CAAC;AAE1E,8DAA8D;AAC9D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAMrF,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,iDAAiD;IACjD,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,gEAAgE;IAChE,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,4EAA4E;IAC5E,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAMD,8CAA8C;AAC9C,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,aAAa,CAAC,MAAM,CAAC,EAAE;QACrB,OAAO,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QAClC,kBAAkB,CAAC,EAAE,aAAa,EAAE,CAAC;KACtC,GAAG,YAAY,EAAE,CAAC;IAEnB;;;OAGG;IACH,cAAc,CAAC,MAAM,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,YAAY,EAAE,CAAC;IAErE;;;;;OAKG;IACH,qBAAqB,CACnB,IAAI,EAAE,UAAU,EAChB,aAAa,CAAC,EAAE,aAAa,GAC5B,YAAY,GAAG,IAAI,CAAC;IAEvB;;;;;OAKG;IACH,sBAAsB,CACpB,IAAI,EAAE,UAAU,EAChB,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,YAAY,GAAG,IAAI,CAAC;CACxB;AAqHD;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,sBAAsB,CAgFrE"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Uncensored model catalog for policy-aware routing.
|
|
3
|
+
*
|
|
4
|
+
* Maps content policy tiers to curated lists of uncensored text and image
|
|
5
|
+
* models available through OpenRouter (text) and Replicate (image). The
|
|
6
|
+
* catalog is the single source of truth consumed by {@link PolicyAwareRouter}
|
|
7
|
+
* and {@link PolicyAwareImageRouter} to select models that honour the
|
|
8
|
+
* agent's content policy without imposing upstream safety filters.
|
|
9
|
+
*
|
|
10
|
+
* @module core/llm/routing/UncensoredModelCatalog
|
|
11
|
+
*/
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Built-in catalog data
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/** Curated text models available via OpenRouter. */
|
|
16
|
+
const TEXT_MODELS = [
|
|
17
|
+
{
|
|
18
|
+
modelId: 'nousresearch/hermes-3-llama-3.1-405b',
|
|
19
|
+
displayName: 'Hermes 3 405B',
|
|
20
|
+
providerId: 'openrouter',
|
|
21
|
+
modality: 'text',
|
|
22
|
+
quality: 'high',
|
|
23
|
+
contentPermissions: ['general', 'romantic', 'erotic', 'violent', 'horror'],
|
|
24
|
+
capabilities: ['chat', 'tool_use', 'json_mode'],
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
modelId: 'cognitivecomputations/dolphin-mixtral-8x22b',
|
|
28
|
+
displayName: 'Dolphin Mixtral 8x22B',
|
|
29
|
+
providerId: 'openrouter',
|
|
30
|
+
modality: 'text',
|
|
31
|
+
quality: 'high',
|
|
32
|
+
contentPermissions: ['general', 'romantic', 'erotic', 'violent', 'horror'],
|
|
33
|
+
capabilities: ['chat', 'tool_use'],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
modelId: 'nousresearch/hermes-3-llama-3.1-70b',
|
|
37
|
+
displayName: 'Hermes 3 70B',
|
|
38
|
+
providerId: 'openrouter',
|
|
39
|
+
modality: 'text',
|
|
40
|
+
quality: 'medium',
|
|
41
|
+
contentPermissions: ['general', 'romantic', 'erotic', 'violent', 'horror'],
|
|
42
|
+
capabilities: ['chat', 'tool_use', 'json_mode'],
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
modelId: 'undi95/toppy-m-7b',
|
|
46
|
+
displayName: 'Toppy M 7B',
|
|
47
|
+
providerId: 'openrouter',
|
|
48
|
+
modality: 'text',
|
|
49
|
+
quality: 'low',
|
|
50
|
+
contentPermissions: ['general', 'romantic', 'erotic'],
|
|
51
|
+
capabilities: ['chat'],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
modelId: 'gryphe/mythomax-l2-13b',
|
|
55
|
+
displayName: 'MythoMax L2 13B',
|
|
56
|
+
providerId: 'openrouter',
|
|
57
|
+
modality: 'text',
|
|
58
|
+
quality: 'low',
|
|
59
|
+
contentPermissions: ['general', 'romantic', 'violent', 'horror'],
|
|
60
|
+
capabilities: ['chat'],
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
/** Curated image models available via Replicate. */
|
|
64
|
+
const IMAGE_MODELS = [
|
|
65
|
+
{
|
|
66
|
+
modelId: 'lucataco/realvisxl-v4.0',
|
|
67
|
+
displayName: 'RealVisXL v4.0',
|
|
68
|
+
providerId: 'replicate',
|
|
69
|
+
modality: 'image',
|
|
70
|
+
quality: 'high',
|
|
71
|
+
contentPermissions: ['general', 'romantic', 'erotic'],
|
|
72
|
+
capabilities: ['txt2img', 'img2img', 'photorealistic'],
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
modelId: 'stability-ai/sdxl',
|
|
76
|
+
displayName: 'SDXL',
|
|
77
|
+
providerId: 'replicate',
|
|
78
|
+
modality: 'image',
|
|
79
|
+
quality: 'high',
|
|
80
|
+
contentPermissions: ['general', 'romantic', 'erotic', 'violent', 'horror'],
|
|
81
|
+
capabilities: ['txt2img', 'img2img'],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
modelId: 'zsxkib/instant-id',
|
|
85
|
+
displayName: 'Instant ID',
|
|
86
|
+
providerId: 'replicate',
|
|
87
|
+
modality: 'image',
|
|
88
|
+
quality: 'medium',
|
|
89
|
+
contentPermissions: ['general', 'romantic'],
|
|
90
|
+
capabilities: ['txt2img', 'face-consistency'],
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
modelId: 'lucataco/ip-adapter-faceid-sdxl',
|
|
94
|
+
displayName: 'IP-Adapter FaceID SDXL',
|
|
95
|
+
providerId: 'replicate',
|
|
96
|
+
modality: 'image',
|
|
97
|
+
quality: 'medium',
|
|
98
|
+
contentPermissions: ['general', 'romantic', 'erotic'],
|
|
99
|
+
capabilities: ['txt2img', 'img2img', 'face-consistency'],
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
modelId: 'lucataco/animate-diff',
|
|
103
|
+
displayName: 'AnimateDiff',
|
|
104
|
+
providerId: 'replicate',
|
|
105
|
+
modality: 'image',
|
|
106
|
+
quality: 'medium',
|
|
107
|
+
contentPermissions: ['general', 'romantic', 'violent'],
|
|
108
|
+
capabilities: ['txt2img', 'video'],
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
modelId: 'stability-ai/stable-video-diffusion',
|
|
112
|
+
displayName: 'Stable Video Diffusion',
|
|
113
|
+
providerId: 'replicate',
|
|
114
|
+
modality: 'image',
|
|
115
|
+
quality: 'high',
|
|
116
|
+
contentPermissions: ['general', 'romantic'],
|
|
117
|
+
capabilities: ['img2video', 'video'],
|
|
118
|
+
},
|
|
119
|
+
];
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
// Factory
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
/**
|
|
124
|
+
* Create a default {@link UncensoredModelCatalog} populated with curated
|
|
125
|
+
* OpenRouter text models and Replicate image models.
|
|
126
|
+
*/
|
|
127
|
+
export function createUncensoredModelCatalog() {
|
|
128
|
+
return {
|
|
129
|
+
getTextModels(filter) {
|
|
130
|
+
let results = [...TEXT_MODELS];
|
|
131
|
+
if (filter?.quality) {
|
|
132
|
+
results = results.filter((e) => e.quality === filter.quality);
|
|
133
|
+
}
|
|
134
|
+
if (filter?.contentPermissions?.length) {
|
|
135
|
+
results = results.filter((e) => filter.contentPermissions.every((p) => e.contentPermissions.includes(p)));
|
|
136
|
+
}
|
|
137
|
+
return results;
|
|
138
|
+
},
|
|
139
|
+
getImageModels(filter) {
|
|
140
|
+
let results = [...IMAGE_MODELS];
|
|
141
|
+
if (filter?.capabilities?.length) {
|
|
142
|
+
results = results.filter((e) => filter.capabilities.every((c) => e.capabilities.includes(c)));
|
|
143
|
+
}
|
|
144
|
+
return results;
|
|
145
|
+
},
|
|
146
|
+
getPreferredTextModel(tier, contentIntent) {
|
|
147
|
+
if (tier === 'safe' || tier === 'standard') {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
let candidates = [...TEXT_MODELS];
|
|
151
|
+
// Filter by content intent when provided
|
|
152
|
+
if (contentIntent) {
|
|
153
|
+
candidates = candidates.filter((e) => e.contentPermissions.includes(contentIntent));
|
|
154
|
+
}
|
|
155
|
+
// Sort: high > medium > low
|
|
156
|
+
const qualityOrder = {
|
|
157
|
+
high: 0,
|
|
158
|
+
medium: 1,
|
|
159
|
+
low: 2,
|
|
160
|
+
};
|
|
161
|
+
candidates.sort((a, b) => qualityOrder[a.quality] - qualityOrder[b.quality]);
|
|
162
|
+
return candidates[0] ?? null;
|
|
163
|
+
},
|
|
164
|
+
getPreferredImageModel(tier, capabilities) {
|
|
165
|
+
if (tier === 'safe' || tier === 'standard') {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
let candidates = [...IMAGE_MODELS];
|
|
169
|
+
if (capabilities?.length) {
|
|
170
|
+
candidates = candidates.filter((e) => capabilities.every((c) => e.capabilities.includes(c)));
|
|
171
|
+
}
|
|
172
|
+
// Sort: high > medium > low
|
|
173
|
+
const qualityOrder = {
|
|
174
|
+
high: 0,
|
|
175
|
+
medium: 1,
|
|
176
|
+
low: 2,
|
|
177
|
+
};
|
|
178
|
+
candidates.sort((a, b) => qualityOrder[a.quality] - qualityOrder[b.quality]);
|
|
179
|
+
return candidates[0] ?? null;
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=UncensoredModelCatalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UncensoredModelCatalog.js","sourceRoot":"","sources":["../../../../src/core/llm/routing/UncensoredModelCatalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Policy-aware image provider router for selecting uncensored
|
|
3
|
+
* image generation backends based on content policy tier.
|
|
4
|
+
*
|
|
5
|
+
* Safe/standard tiers return null or the default provider chain, signalling
|
|
6
|
+
* the caller to use its normal image generation pipeline. Mature/private-adult
|
|
7
|
+
* tiers route through Replicate and other uncensored providers from the
|
|
8
|
+
* {@link UncensoredModelCatalog}.
|
|
9
|
+
*
|
|
10
|
+
* @module media/images/PolicyAwareImageRouter
|
|
11
|
+
*/
|
|
12
|
+
import type { UncensoredModelCatalog, PolicyTier } from '../../core/llm/routing/UncensoredModelCatalog';
|
|
13
|
+
/** Preference result returned by the image router. */
|
|
14
|
+
export interface ImageProviderPreference {
|
|
15
|
+
/** Recommended provider ID (e.g. 'replicate'). */
|
|
16
|
+
providerId: string;
|
|
17
|
+
/** Recommended model ID on that provider. */
|
|
18
|
+
modelId: string;
|
|
19
|
+
/** Human-readable display name of the model. */
|
|
20
|
+
displayName: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Policy-aware image provider router. Selects the preferred image generation
|
|
24
|
+
* provider and model based on the session's content policy tier.
|
|
25
|
+
*/
|
|
26
|
+
export declare class PolicyAwareImageRouter {
|
|
27
|
+
private readonly catalog;
|
|
28
|
+
/**
|
|
29
|
+
* @param catalog - Uncensored model catalog for mature/private-adult lookup.
|
|
30
|
+
*/
|
|
31
|
+
constructor(catalog: UncensoredModelCatalog);
|
|
32
|
+
/**
|
|
33
|
+
* Get the preferred image provider and model for a given policy tier.
|
|
34
|
+
*
|
|
35
|
+
* @param policyTier - Content policy tier.
|
|
36
|
+
* @param capabilities - Optional required capabilities (e.g. ['face-consistency']).
|
|
37
|
+
* @returns Provider preference, or null for safe/standard tiers.
|
|
38
|
+
*/
|
|
39
|
+
getPreferredProvider(policyTier: PolicyTier, capabilities?: string[]): ImageProviderPreference | null;
|
|
40
|
+
/**
|
|
41
|
+
* Get the ordered provider chain for a given policy tier.
|
|
42
|
+
*
|
|
43
|
+
* Safe/standard returns the default chain (OpenAI-first).
|
|
44
|
+
* Mature/private-adult returns the uncensored chain (Replicate-first).
|
|
45
|
+
*
|
|
46
|
+
* @param policyTier - Content policy tier.
|
|
47
|
+
* @returns Ordered array of provider IDs to try in sequence.
|
|
48
|
+
*/
|
|
49
|
+
getProviderChain(policyTier: PolicyTier): string[];
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=PolicyAwareImageRouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PolicyAwareImageRouter.d.ts","sourceRoot":"","sources":["../../../src/media/images/PolicyAwareImageRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,sBAAsB,EACtB,UAAU,EACX,MAAM,+CAA+C,CAAC;AAMvD,sDAAsD;AACtD,MAAM,WAAW,uBAAuB;IACtC,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;CACrB;AAyBD;;;GAGG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IAEjD;;OAEG;gBACS,OAAO,EAAE,sBAAsB;IAI3C;;;;;;OAMG;IACH,oBAAoB,CAClB,UAAU,EAAE,UAAU,EACtB,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,uBAAuB,GAAG,IAAI;IAiBjC;;;;;;;;OAQG;IACH,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,EAAE;CAMnD"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Policy-aware image provider router for selecting uncensored
|
|
3
|
+
* image generation backends based on content policy tier.
|
|
4
|
+
*
|
|
5
|
+
* Safe/standard tiers return null or the default provider chain, signalling
|
|
6
|
+
* the caller to use its normal image generation pipeline. Mature/private-adult
|
|
7
|
+
* tiers route through Replicate and other uncensored providers from the
|
|
8
|
+
* {@link UncensoredModelCatalog}.
|
|
9
|
+
*
|
|
10
|
+
* @module media/images/PolicyAwareImageRouter
|
|
11
|
+
*/
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Default provider chains
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/** Default provider ordering for safe/standard content. */
|
|
16
|
+
const DEFAULT_PROVIDER_CHAIN = [
|
|
17
|
+
'openai',
|
|
18
|
+
'stability',
|
|
19
|
+
'fal',
|
|
20
|
+
'replicate',
|
|
21
|
+
];
|
|
22
|
+
/** Provider ordering for mature/private-adult content (uncensored first). */
|
|
23
|
+
const UNCENSORED_PROVIDER_CHAIN = [
|
|
24
|
+
'replicate',
|
|
25
|
+
'fal',
|
|
26
|
+
'stable-diffusion-local',
|
|
27
|
+
];
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Router
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
/**
|
|
32
|
+
* Policy-aware image provider router. Selects the preferred image generation
|
|
33
|
+
* provider and model based on the session's content policy tier.
|
|
34
|
+
*/
|
|
35
|
+
export class PolicyAwareImageRouter {
|
|
36
|
+
/**
|
|
37
|
+
* @param catalog - Uncensored model catalog for mature/private-adult lookup.
|
|
38
|
+
*/
|
|
39
|
+
constructor(catalog) {
|
|
40
|
+
this.catalog = catalog;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get the preferred image provider and model for a given policy tier.
|
|
44
|
+
*
|
|
45
|
+
* @param policyTier - Content policy tier.
|
|
46
|
+
* @param capabilities - Optional required capabilities (e.g. ['face-consistency']).
|
|
47
|
+
* @returns Provider preference, or null for safe/standard tiers.
|
|
48
|
+
*/
|
|
49
|
+
getPreferredProvider(policyTier, capabilities) {
|
|
50
|
+
if (policyTier === 'safe' || policyTier === 'standard') {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const entry = this.catalog.getPreferredImageModel(policyTier, capabilities);
|
|
54
|
+
if (!entry) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
providerId: entry.providerId,
|
|
59
|
+
modelId: entry.modelId,
|
|
60
|
+
displayName: entry.displayName,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get the ordered provider chain for a given policy tier.
|
|
65
|
+
*
|
|
66
|
+
* Safe/standard returns the default chain (OpenAI-first).
|
|
67
|
+
* Mature/private-adult returns the uncensored chain (Replicate-first).
|
|
68
|
+
*
|
|
69
|
+
* @param policyTier - Content policy tier.
|
|
70
|
+
* @returns Ordered array of provider IDs to try in sequence.
|
|
71
|
+
*/
|
|
72
|
+
getProviderChain(policyTier) {
|
|
73
|
+
if (policyTier === 'safe' || policyTier === 'standard') {
|
|
74
|
+
return [...DEFAULT_PROVIDER_CHAIN];
|
|
75
|
+
}
|
|
76
|
+
return [...UNCENSORED_PROVIDER_CHAIN];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=PolicyAwareImageRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PolicyAwareImageRouter.js","sourceRoot":"","sources":["../../../src/media/images/PolicyAwareImageRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAqBH,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,2DAA2D;AAC3D,MAAM,sBAAsB,GAAa;IACvC,QAAQ;IACR,WAAW;IACX,KAAK;IACL,WAAW;CACZ,CAAC;AAEF,6EAA6E;AAC7E,MAAM,yBAAyB,GAAa;IAC1C,WAAW;IACX,KAAK;IACL,wBAAwB;CACzB,CAAC;AAEF,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,OAAO,sBAAsB;IAGjC;;OAEG;IACH,YAAY,OAA+B;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACH,oBAAoB,CAClB,UAAsB,EACtB,YAAuB;QAEvB,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,gBAAgB,CAAC,UAAsB;QACrC,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;YACvD,OAAO,CAAC,GAAG,sBAAsB,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,CAAC,GAAG,yBAAyB,CAAC,CAAC;IACxC,CAAC;CACF"}
|