@eduwork/dsh-oidc 0.3.0-dev.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.en.md +12 -0
- package/CHANGELOG.md +12 -0
- package/README.md +9 -1
- package/README_EN.md +9 -1
- package/THIRD_PARTY_NOTICES.en.md +5 -4
- package/THIRD_PARTY_NOTICES.md +5 -5
- package/docs/account-extensions.en.md +7 -1
- package/docs/account-extensions.md +7 -1
- package/docs/compatibility.en.md +3 -1
- package/docs/compatibility.md +3 -1
- package/docs/development.en.md +1 -1
- package/docs/development.md +1 -1
- package/docs/dsh-integration.en.md +3 -3
- package/docs/dsh-integration.md +3 -3
- package/docs/enterprise-profile.en.md +49 -2
- package/docs/enterprise-profile.md +49 -2
- package/docs/gateway-auth/README.md +7 -6
- package/docs/gateway-auth/README_EN.md +7 -6
- package/docs/gateway-auth/experimental-oidc-llm.en.md +10 -8
- package/docs/gateway-auth/experimental-oidc-llm.md +9 -7
- package/docs/gateway-auth/litellm-setup.en.md +10 -4
- package/docs/gateway-auth/litellm-setup.md +10 -4
- package/docs/gateway-auth/oidc-llm-draft.en.md +89 -63
- package/docs/gateway-auth/oidc-llm-draft.md +86 -60
- package/docs/getting-started.en.md +3 -1
- package/docs/getting-started.md +3 -1
- package/docs/key-binding-protocol.en.md +1 -1
- package/docs/key-binding-protocol.md +1 -1
- package/docs/oidc-interoperability.en.md +1 -1
- package/docs/oidc-interoperability.md +1 -1
- package/docs/open-integration.en.md +3 -1
- package/docs/open-integration.md +3 -1
- package/examples/ecnu.enterprise-profile.example.json +4 -1
- package/examples/enterprise-profile.example.json +4 -1
- package/examples/identity-only.example.json +7 -2
- package/examples/litellm.enterprise-profile.example.json +9 -0
- package/examples/oidc-llm.enterprise-profile.example.json +33 -0
- package/examples/resources-discovery.example.json +9 -2
- package/lib/callback-page.js +9 -4
- package/lib/client.js +460 -360
- package/lib/desktop-oidc.js +2 -2
- package/lib/gateway-backend.js +20 -5
- package/lib/index.js +8 -6
- package/lib/litellm-protocol.js +4 -3
- package/lib/model-types.js +7 -0
- package/lib/oidc-llm-protocol.js +8 -5
- package/lib/oidc.js +22 -28
- package/lib/profile.js +36 -47
- package/lib/provider/authorization-scope.js +4 -0
- package/lib/provider/core.js +8 -19
- package/lib/provider/index.js +18 -2
- package/lib/provider/transform-adapter.js +4 -0
- package/lib/resources.js +12 -4
- package/lib/token-lifetime.js +15 -0
- package/lib/transport.js +5 -0
- package/lib/typert-schemas.js +14 -12
- package/package.json +104 -97
- package/protocol/resources.openapi.yaml +11 -3
- package/schema/enterprise-profile.v1alpha1.schema.json +40 -5
package/lib/provider/index.js
CHANGED
|
@@ -16,9 +16,22 @@ import { AuthorizationScopedAdapter } from './authorization-scope.js'
|
|
|
16
16
|
export const name = 'dsh-oidc-provider'
|
|
17
17
|
export const inject = ['llm']
|
|
18
18
|
export const SETTINGS_NAMESPACE = ENTERPRISE_SETTINGS_NAMESPACE
|
|
19
|
+
export const Config = PiAiConfig
|
|
19
20
|
|
|
20
21
|
function installEnterpriseSettings(ctx, rawConfig, hooks) {
|
|
21
22
|
ctx.inject(['settings'], (settingsCtx) => {
|
|
23
|
+
if (typeof settingsCtx.settings.installSection !== 'function') {
|
|
24
|
+
// Account-managed routes come from the organization profile and its
|
|
25
|
+
// authorization lease. Never project them into editable API-key forms.
|
|
26
|
+
if (rawConfig.settingsEnabled !== true) return
|
|
27
|
+
if (typeof rawConfig.providers?.get !== 'function' || !ctx.fiber.entry) {
|
|
28
|
+
throw new Error('Editable enterprise providers require a DSH profile entry with live Config')
|
|
29
|
+
}
|
|
30
|
+
settingsCtx.effect(() => settingsCtx.settings.configure({ auto: false }, ctx.fiber))
|
|
31
|
+
hooks.setSource(() => settingsBase(rawConfig))
|
|
32
|
+
ctx.on('loader/volatile-update', () => hooks.onChange())
|
|
33
|
+
return
|
|
34
|
+
}
|
|
22
35
|
settingsCtx.settings.installSection(
|
|
23
36
|
ctx,
|
|
24
37
|
SETTINGS_NAMESPACE,
|
|
@@ -147,14 +160,17 @@ export function apply(ctx, rawConfig = {}) {
|
|
|
147
160
|
: transforming
|
|
148
161
|
let registration
|
|
149
162
|
let directory
|
|
163
|
+
const nativeSettings = typeof ctx.get('settings')?.installSection !== 'function'
|
|
164
|
+
const editableDirectory = !nativeSettings || rawConfig.settingsEnabled === true
|
|
165
|
+
const settingsNs = nativeSettings ? ctx.fiber.entry?.options.id ?? SETTINGS_NAMESPACE : SETTINGS_NAMESPACE
|
|
150
166
|
const replaceProfiles = next => {
|
|
151
167
|
const previous = profiles
|
|
152
168
|
profiles = next
|
|
153
169
|
try {
|
|
154
170
|
if (registration) registration.replace([...next.keys()])
|
|
155
171
|
else if (next.size) registration = ctx.llm.registerAdapter([...next.keys()], adapter)
|
|
156
|
-
if (directory) directory.replace(configurableEntries(next))
|
|
157
|
-
else if (next.size) directory = ctx.llm.registerConfigurableProviders(configurableEntries(next))
|
|
172
|
+
if (directory) directory.replace(configurableEntries(next, settingsNs))
|
|
173
|
+
else if (next.size && editableDirectory) directory = ctx.llm.registerConfigurableProviders(configurableEntries(next, settingsNs))
|
|
158
174
|
} catch (error) {
|
|
159
175
|
profiles = previous
|
|
160
176
|
registration?.replace([...previous.keys()])
|
|
@@ -37,6 +37,10 @@ export class TransformingEnterpriseAdapter {
|
|
|
37
37
|
providerInfo(provider) { return this.inner.providerInfo(provider) }
|
|
38
38
|
providerRetryPolicy(provider) { return this.inner.providerRetryPolicy(provider) }
|
|
39
39
|
imageRequestPricing(provider, model) { return this.inner.imageRequestPricing(provider, model) }
|
|
40
|
+
imageRequestTarget(provider, model, image) {
|
|
41
|
+
return this.inner.imageRequestTarget?.(provider, model, image)
|
|
42
|
+
?? { width: image.width, height: image.height, maxBytes: image.bytes }
|
|
43
|
+
}
|
|
40
44
|
|
|
41
45
|
async listModels(provider) {
|
|
42
46
|
const models = await this.inner.listModels(provider)
|
package/lib/resources.js
CHANGED
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
import { normalizeModels } from './profile.js'
|
|
2
|
+
import { MODEL_TYPES } from './model-types.js'
|
|
2
3
|
|
|
3
|
-
//
|
|
4
|
-
//
|
|
4
|
+
// A gateway catalog may also contain embedding, ranking and media models.
|
|
5
|
+
// Type metadata classifies authorized rows; it never grants model access.
|
|
5
6
|
export function normalizeResourceModels(raw, profile) {
|
|
6
7
|
if (!Array.isArray(raw?.data) || raw.data.length > 128) throw new Error('invalid model catalog')
|
|
7
8
|
const reviewed = new Map(profile.provider.models.map(model => [model.id, model]))
|
|
8
9
|
const models = raw.data.map(row => {
|
|
9
10
|
const id = typeof row?.id === 'string' ? row.id.trim() : ''
|
|
11
|
+
const local = reviewed.get(id)
|
|
12
|
+
// The current server declaration wins. Local metadata fills an absent type,
|
|
13
|
+
// but cannot turn an explicit unknown/future server type into a chat model.
|
|
14
|
+
const type = row.type === undefined
|
|
15
|
+
? local?.type ?? 'unknown'
|
|
16
|
+
: MODEL_TYPES.includes(row.type) ? row.type : 'unknown'
|
|
10
17
|
// A plain /models response does not prove reasoning or vision support.
|
|
11
|
-
return
|
|
18
|
+
return { ...(local ?? { id, name: id, input: ['text'], reasoning: false }), type }
|
|
12
19
|
})
|
|
13
|
-
|
|
20
|
+
// Keep the full typed catalog; only the DSH conversation projection uses LLMs.
|
|
21
|
+
return models.length === 0 ? Object.freeze([]) : normalizeModels(models, profile.provider.id)
|
|
14
22
|
}
|
|
15
23
|
|
|
16
24
|
export function emptyResources(profile) {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const ACCESS_REFRESH_SECONDS = 30 * 60
|
|
2
|
+
|
|
3
|
+
// Refresh early without repeatedly renewing tokens whose entire lifetime is
|
|
4
|
+
// shorter than the normal margin. These timestamps stay in the Host vault.
|
|
5
|
+
export function accessTokenTiming(expiresIn, now) {
|
|
6
|
+
const expiresAt = Math.floor(now() / 1000) + expiresIn
|
|
7
|
+
return { expiresAt, refreshAt: expiresAt - Math.min(ACCESS_REFRESH_SECONDS, expiresIn / 2) }
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function accessTokenNeedsRefresh(session, now) {
|
|
11
|
+
// Existing installations have only expiresAt. Their first refresh adds the
|
|
12
|
+
// lifetime-aware timestamp; no migration or new sign-in is required.
|
|
13
|
+
const refreshAt = Number.isFinite(session.refreshAt) ? session.refreshAt : session.expiresAt - ACCESS_REFRESH_SECONDS
|
|
14
|
+
return now() / 1000 >= Math.min(session.expiresAt, refreshAt)
|
|
15
|
+
}
|
package/lib/transport.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// One transport rule for configured and discovered service URLs.
|
|
2
|
+
// Callback binding, issuer identity and protocol-specific origin checks are separate.
|
|
3
|
+
export function serviceProtocolAllowed(url, allowInsecureDevelopment = false) {
|
|
4
|
+
return url.protocol === 'https:' || (allowInsecureDevelopment === true && url.protocol === 'http:')
|
|
5
|
+
}
|
package/lib/typert-schemas.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod'
|
|
2
|
+
import { MODEL_TYPES } from './model-types.js'
|
|
2
3
|
|
|
3
4
|
const pkg = '@eduwork/dsh-oidc'
|
|
4
5
|
export const profileIdSchema = z.string().min(1).max(64)
|
|
@@ -8,11 +9,11 @@ export const baseURLSchema = z.string().min(1).max(2048)
|
|
|
8
9
|
export const modelCatalogModeSchema = z.enum(['discovery', 'manual'])
|
|
9
10
|
export const configurationTargetSchema = z.enum(['config', 'examples'])
|
|
10
11
|
export const openConfigurationResult = Object.freeze({
|
|
11
|
-
mode: 'strict', typeSymbol: `${pkg}#OpenConfigurationResult`,
|
|
12
|
+
mode: 'strict', create() { return this.schema }, typeSymbol: `${pkg}#OpenConfigurationResult`,
|
|
12
13
|
schema: z.object({ opened: z.literal(true) }).strict(),
|
|
13
14
|
})
|
|
14
15
|
export const enterpriseSelectionResult = Object.freeze({
|
|
15
|
-
mode: 'strict', typeSymbol: `${pkg}#EnterpriseSelectionResult`,
|
|
16
|
+
mode: 'strict', create() { return this.schema }, typeSymbol: `${pkg}#EnterpriseSelectionResult`,
|
|
16
17
|
schema: z.object({ changed: z.boolean(), selection: z.object({ provider: z.string(), model: z.string(), reasoningEffort: z.string().optional() }).strict().optional() }).strict(),
|
|
17
18
|
})
|
|
18
19
|
export const enterpriseSelectionOptionsSchema = z.object({ onlyIfMissing: z.boolean().optional() }).strict()
|
|
@@ -20,7 +21,7 @@ export const enterpriseSelectionOptionsSchema = z.object({ onlyIfMissing: z.bool
|
|
|
20
21
|
const brandSchema = z.object({
|
|
21
22
|
productName: z.string().optional(), organizationName: z.string().optional(), mark: z.string().optional(),
|
|
22
23
|
logoURL: z.string().optional(), primaryColor: z.string().optional(), loginTitle: z.string().optional(),
|
|
23
|
-
loginDescription: z.string().optional(), supportURL: z.string().optional(),
|
|
24
|
+
loginDescription: z.string().optional(), loginButtonLabel: z.string().min(1).max(40).optional(), supportURL: z.string().optional(), language: z.enum(['auto', 'zh-CN', 'en']).optional(),
|
|
24
25
|
}).strict()
|
|
25
26
|
|
|
26
27
|
const publicProfileSchema = z.object({
|
|
@@ -50,11 +51,12 @@ export const runtimeModelSchema = z.object({
|
|
|
50
51
|
}).strict()
|
|
51
52
|
|
|
52
53
|
export const runtimeModelsSchema = z.array(runtimeModelSchema).max(128)
|
|
54
|
+
export const resourceModelSchema = runtimeModelSchema.extend({ type: z.enum(MODEL_TYPES) })
|
|
53
55
|
|
|
54
56
|
export const resourcesResult = Object.freeze({
|
|
55
|
-
mode: 'strict', typeSymbol: `${pkg}#Resources`,
|
|
57
|
+
mode: 'strict', create() { return this.schema }, typeSymbol: `${pkg}#Resources`,
|
|
56
58
|
schema: z.object({
|
|
57
|
-
profileID: z.string(), modelSource: z.string(), models:
|
|
59
|
+
profileID: z.string(), modelSource: z.string(), models: z.array(resourceModelSchema).max(128), issues: z.array(z.string()),
|
|
58
60
|
}).strict(),
|
|
59
61
|
})
|
|
60
62
|
|
|
@@ -69,14 +71,14 @@ const managementProfileSchema = z.object({
|
|
|
69
71
|
}).strict()
|
|
70
72
|
|
|
71
73
|
export const configurationResult = Object.freeze({
|
|
72
|
-
mode: 'strict', typeSymbol: `${pkg}#Configuration`,
|
|
74
|
+
mode: 'strict', create() { return this.schema }, typeSymbol: `${pkg}#Configuration`,
|
|
73
75
|
schema: z.object({ schemaVersion: z.literal('dsh-oidc/v1alpha1'), uiMode: z.enum(['standard', 'models-only', 'external']), profiles: z.array(publicProfileSchema),
|
|
74
76
|
manageProductBrand: z.boolean().optional(), configFile: z.object({ path: z.string(), examplesPath: z.string(), canOpen: z.boolean() }).strict().optional(),
|
|
75
77
|
}).strict(),
|
|
76
78
|
})
|
|
77
79
|
|
|
78
80
|
export const managementResult = Object.freeze({
|
|
79
|
-
mode: 'strict', typeSymbol: `${pkg}#ManagementConfiguration`,
|
|
81
|
+
mode: 'strict', create() { return this.schema }, typeSymbol: `${pkg}#ManagementConfiguration`,
|
|
80
82
|
schema: z.object({
|
|
81
83
|
schemaVersion: z.literal('dsh-oidc/management/v1alpha1'), mode: z.enum(['profile', 'native']),
|
|
82
84
|
activeProfileID: z.string(), restartRequired: z.boolean(),
|
|
@@ -86,14 +88,14 @@ export const managementResult = Object.freeze({
|
|
|
86
88
|
})
|
|
87
89
|
|
|
88
90
|
export const restartResult = Object.freeze({
|
|
89
|
-
mode: 'strict', typeSymbol: `${pkg}#RestartResult`,
|
|
91
|
+
mode: 'strict', create() { return this.schema }, typeSymbol: `${pkg}#RestartResult`,
|
|
90
92
|
schema: z.object({ restarting: z.literal(true) }).strict(),
|
|
91
93
|
})
|
|
92
94
|
|
|
93
|
-
export const accountResult = Object.freeze({ mode: 'strict', typeSymbol: `${pkg}#AccountStatus`, schema: accountSchema })
|
|
95
|
+
export const accountResult = Object.freeze({ mode: 'strict', create() { return this.schema }, typeSymbol: `${pkg}#AccountStatus`, schema: accountSchema })
|
|
94
96
|
|
|
95
97
|
export const beginResult = Object.freeze({
|
|
96
|
-
mode: 'strict', typeSymbol: `${pkg}#BeginResult`,
|
|
98
|
+
mode: 'strict', create() { return this.schema }, typeSymbol: `${pkg}#BeginResult`,
|
|
97
99
|
schema: z.union([
|
|
98
100
|
z.object({ mode: z.literal('redirect'), authorizationURL: z.string().url() }).strict(),
|
|
99
101
|
z.object({ mode: z.literal('completed'), status: accountSchema }).strict(),
|
|
@@ -102,7 +104,7 @@ export const beginResult = Object.freeze({
|
|
|
102
104
|
})
|
|
103
105
|
|
|
104
106
|
export const loginResult = Object.freeze({
|
|
105
|
-
mode: 'strict', typeSymbol: `${pkg}#LoginResult`,
|
|
107
|
+
mode: 'strict', create() { return this.schema }, typeSymbol: `${pkg}#LoginResult`,
|
|
106
108
|
schema: z.object({
|
|
107
109
|
loginID: loginIdSchema, profileID: profileIdSchema, expiresAt: z.string().datetime(),
|
|
108
110
|
state: z.enum(['pending', 'completed', 'cancelled', 'expired', 'failed']),
|
|
@@ -111,5 +113,5 @@ export const loginResult = Object.freeze({
|
|
|
111
113
|
})
|
|
112
114
|
|
|
113
115
|
export function jsonParameter(name, schema, typeSymbol) {
|
|
114
|
-
return Object.freeze({ name, wire: name, source: 'json', codec: Object.freeze({ mode: 'strict', typeSymbol, schema }) })
|
|
116
|
+
return Object.freeze({ name, wire: name, source: 'json', codec: Object.freeze({ mode: 'strict', create() { return this.schema }, typeSymbol, schema }) })
|
|
115
117
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eduwork/dsh-oidc",
|
|
3
|
-
"version": "0.3.0
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Standards-based OIDC identity, token-authorized model access, declarative branding, and OpenAI-compatible model integration for DeepSeek Harness",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"deepseek-harness",
|
|
@@ -65,7 +65,8 @@
|
|
|
65
65
|
"@deepseek-ai/dsh-client-ui-settings-general",
|
|
66
66
|
"@deepseek-ai/dsh-client-ui-settings-models",
|
|
67
67
|
"@deepseek-ai/dsh-client-ui-sidebar",
|
|
68
|
-
"@deepseek-ai/dsh-client-ui-theme"
|
|
68
|
+
"@deepseek-ai/dsh-client-ui-theme",
|
|
69
|
+
"@deepseek-ai/dsh-client-locale"
|
|
69
70
|
],
|
|
70
71
|
"platform": "web",
|
|
71
72
|
"immediately": true
|
|
@@ -90,118 +91,115 @@
|
|
|
90
91
|
"check:lock": "node scripts/check-dependency-lock.mjs"
|
|
91
92
|
},
|
|
92
93
|
"engines": {
|
|
93
|
-
"node": ">=
|
|
94
|
+
"node": ">=24.18.0"
|
|
94
95
|
},
|
|
95
96
|
"publishConfig": {
|
|
96
97
|
"access": "public"
|
|
97
98
|
},
|
|
98
99
|
"repository": {
|
|
99
100
|
"type": "git",
|
|
100
|
-
"url": "git+https://github.com/
|
|
101
|
+
"url": "git+https://github.com/ECNU/EduWork.git",
|
|
101
102
|
"directory": "packages/dsh-oidc"
|
|
102
103
|
},
|
|
103
104
|
"bugs": {
|
|
104
|
-
"url": "https://github.com/
|
|
105
|
+
"url": "https://github.com/ECNU/EduWork/issues"
|
|
105
106
|
},
|
|
106
|
-
"homepage": "https://github.com/
|
|
107
|
+
"homepage": "https://github.com/ECNU/EduWork/tree/main/packages/dsh-oidc#readme",
|
|
107
108
|
"license": "MIT",
|
|
108
109
|
"dependencies": {
|
|
109
110
|
"zod": "4.4.3"
|
|
110
111
|
},
|
|
111
112
|
"peerDependencies": {
|
|
112
|
-
"@deepseek-ai/cordis": "4.0.
|
|
113
|
-
"@deepseek-ai/dsh-api-remotes": "0.
|
|
114
|
-
"@deepseek-ai/dsh-attachment": "0.
|
|
115
|
-
"@deepseek-ai/dsh-authorization": "0.
|
|
116
|
-
"@deepseek-ai/dsh-brand": "0.
|
|
117
|
-
"@deepseek-ai/dsh-client-ui-conversation": "0.
|
|
118
|
-
"@deepseek-ai/dsh-client-ui-renderer": "0.
|
|
119
|
-
"@deepseek-ai/dsh-client-ui-settings": "0.
|
|
120
|
-
"@deepseek-ai/dsh-client-ui-settings-general": "0.
|
|
121
|
-
"@deepseek-ai/dsh-client-ui-settings-models": "0.
|
|
122
|
-
"@deepseek-ai/dsh-client-ui-sidebar": "0.
|
|
123
|
-
"@deepseek-ai/dsh-client-ui-theme": "0.
|
|
124
|
-
"@deepseek-ai/dsh-credentials": "0.
|
|
125
|
-
"@deepseek-ai/dsh-fs": "0.
|
|
126
|
-
"@deepseek-ai/dsh-host-webserver": "0.
|
|
127
|
-
"@deepseek-ai/dsh-
|
|
128
|
-
"@deepseek-ai/dsh-
|
|
129
|
-
"@deepseek-ai/dsh-llm": "0.
|
|
130
|
-
"@deepseek-ai/dsh-
|
|
131
|
-
"@deepseek-ai/dsh-
|
|
132
|
-
"@deepseek-ai/dsh-
|
|
133
|
-
"@deepseek-ai/dsh-
|
|
134
|
-
"@deepseek-ai/dsh-
|
|
135
|
-
"@deepseek-ai/dsh-
|
|
136
|
-
"@
|
|
137
|
-
"@earendil-works/pi-ai": "^0.84.2 || ^0.85.1",
|
|
113
|
+
"@deepseek-ai/cordis": ">=4.0.5 <4.1.0",
|
|
114
|
+
"@deepseek-ai/dsh-api-remotes": ">=0.2.1-rc.2 <0.3.0-0",
|
|
115
|
+
"@deepseek-ai/dsh-attachment": ">=0.2.1-rc.2 <0.3.0-0",
|
|
116
|
+
"@deepseek-ai/dsh-authorization": ">=0.2.1-rc.2 <0.3.0-0",
|
|
117
|
+
"@deepseek-ai/dsh-brand": ">=0.2.1-rc.2 <0.3.0-0",
|
|
118
|
+
"@deepseek-ai/dsh-client-ui-conversation": ">=0.2.1-rc.2 <0.3.0-0",
|
|
119
|
+
"@deepseek-ai/dsh-client-ui-renderer": ">=0.2.1-rc.2 <0.3.0-0",
|
|
120
|
+
"@deepseek-ai/dsh-client-ui-settings": ">=0.2.1-rc.2 <0.3.0-0",
|
|
121
|
+
"@deepseek-ai/dsh-client-ui-settings-general": ">=0.2.1-rc.2 <0.3.0-0",
|
|
122
|
+
"@deepseek-ai/dsh-client-ui-settings-models": ">=0.2.1-rc.2 <0.3.0-0",
|
|
123
|
+
"@deepseek-ai/dsh-client-ui-sidebar": ">=0.2.1-rc.2 <0.3.0-0",
|
|
124
|
+
"@deepseek-ai/dsh-client-ui-theme": ">=0.2.1-rc.2 <0.3.0-0",
|
|
125
|
+
"@deepseek-ai/dsh-credentials": ">=0.2.1-rc.2 <0.3.0-0",
|
|
126
|
+
"@deepseek-ai/dsh-fs": ">=0.2.1-rc.2 <0.3.0-0",
|
|
127
|
+
"@deepseek-ai/dsh-host-webserver": ">=0.2.1-rc.2 <0.3.0-0",
|
|
128
|
+
"@deepseek-ai/dsh-launch-environment": ">=0.2.1-rc.2 <0.3.0-0",
|
|
129
|
+
"@deepseek-ai/dsh-llm": ">=0.2.1-rc.2 <0.3.0-0",
|
|
130
|
+
"@deepseek-ai/dsh-llm-pi-ai": ">=0.2.1-rc.2 <0.3.0-0",
|
|
131
|
+
"@deepseek-ai/dsh-sandbox": ">=0.2.1-rc.2 <0.3.0-0",
|
|
132
|
+
"@deepseek-ai/dsh-scope": ">=0.2.1-rc.2 <0.3.0-0",
|
|
133
|
+
"@deepseek-ai/dsh-session": ">=0.2.1-rc.2 <0.3.0-0",
|
|
134
|
+
"@deepseek-ai/dsh-settings": ">=0.2.1-rc.2 <0.3.0-0",
|
|
135
|
+
"@deepseek-ai/dsh-timeout": ">=0.2.1-rc.2 <0.3.0-0",
|
|
136
|
+
"@deepseek-ai/dsh-typert-protocol": ">=0.2.1-rc.2 <0.3.0-0",
|
|
137
|
+
"@earendil-works/pi-ai": "^1.1.0",
|
|
138
138
|
"react": "^18.2.0",
|
|
139
|
-
"react-dom": "^18.2.0"
|
|
139
|
+
"react-dom": "^18.2.0",
|
|
140
|
+
"@deepseek-ai/dsh-client-locale": ">=0.2.1-rc.2 <0.3.0-0"
|
|
140
141
|
},
|
|
141
142
|
"devDependencies": {
|
|
142
|
-
"@deepseek-ai/cordis": "4.0.
|
|
143
|
-
"@deepseek-ai/dsh-agent": "0.1
|
|
144
|
-
"@deepseek-ai/dsh-agent-default-model": "0.1
|
|
145
|
-
"@deepseek-ai/dsh-
|
|
146
|
-
"@deepseek-ai/dsh-api-
|
|
147
|
-
"@deepseek-ai/dsh-api-
|
|
148
|
-
"@deepseek-ai/dsh-
|
|
149
|
-
"@deepseek-ai/dsh-
|
|
150
|
-
"@deepseek-ai/dsh-
|
|
151
|
-
"@deepseek-ai/dsh-
|
|
152
|
-
"@deepseek-ai/dsh-
|
|
153
|
-
"@deepseek-ai/dsh-
|
|
154
|
-
"@deepseek-ai/dsh-client-
|
|
155
|
-
"@deepseek-ai/dsh-client-
|
|
156
|
-
"@deepseek-ai/dsh-client-ui-
|
|
157
|
-
"@deepseek-ai/dsh-client-ui-
|
|
158
|
-
"@deepseek-ai/dsh-client-ui-
|
|
159
|
-
"@deepseek-ai/dsh-client-ui-settings": "0.1
|
|
160
|
-
"@deepseek-ai/dsh-client-ui-settings-
|
|
161
|
-
"@deepseek-ai/dsh-client-ui-
|
|
162
|
-
"@deepseek-ai/dsh-client-ui-
|
|
163
|
-
"@deepseek-ai/dsh-
|
|
164
|
-
"@deepseek-ai/dsh-
|
|
165
|
-
"@deepseek-ai/dsh-
|
|
166
|
-
"@deepseek-ai/dsh-
|
|
167
|
-
"@deepseek-ai/dsh-
|
|
168
|
-
"@deepseek-ai/dsh-
|
|
169
|
-
"@deepseek-ai/dsh-
|
|
170
|
-
"@deepseek-ai/dsh-
|
|
171
|
-
"@deepseek-ai/dsh-
|
|
172
|
-
"@deepseek-ai/dsh-
|
|
173
|
-
"@deepseek-ai/dsh-
|
|
174
|
-
"@deepseek-ai/dsh-
|
|
175
|
-
"@deepseek-ai/dsh-
|
|
176
|
-
"@deepseek-ai/dsh-
|
|
177
|
-
"@deepseek-ai/dsh-
|
|
178
|
-
"@deepseek-ai/dsh-
|
|
179
|
-
"@deepseek-ai/dsh-
|
|
180
|
-
"@deepseek-ai/dsh-
|
|
181
|
-
"@deepseek-ai/dsh-session": "0.1
|
|
182
|
-
"@deepseek-ai/dsh-session-
|
|
183
|
-
"@deepseek-ai/dsh-session-
|
|
184
|
-
"@deepseek-ai/dsh-
|
|
185
|
-
"@deepseek-ai/dsh-
|
|
186
|
-
"@deepseek-ai/dsh-
|
|
187
|
-
"@deepseek-ai/dsh-
|
|
188
|
-
"@deepseek-ai/dsh-
|
|
189
|
-
"@deepseek-ai/dsh-
|
|
190
|
-
"@deepseek-ai/dsh-
|
|
191
|
-
"@deepseek-ai/dsh-
|
|
192
|
-
"@deepseek-ai/dsh-
|
|
193
|
-
"@deepseek-ai/dsh-
|
|
194
|
-
"@deepseek-ai/dsh-
|
|
195
|
-
"@deepseek-ai/dsh-
|
|
196
|
-
"@deepseek-ai/dsh-
|
|
197
|
-
"@deepseek-ai/dsh-
|
|
198
|
-
"@deepseek-ai/dsh-
|
|
199
|
-
"@deepseek-ai/dsh-util-
|
|
200
|
-
"@deepseek-ai/dsh-
|
|
201
|
-
"@
|
|
202
|
-
"@deepseek-ai/dsh-util-workspace-path": "0.1.5-rc.1",
|
|
203
|
-
"@deepseek-ai/dsh-workspace": "0.1.5-rc.1",
|
|
204
|
-
"@earendil-works/pi-ai": "0.85.1",
|
|
143
|
+
"@deepseek-ai/cordis": "4.0.5",
|
|
144
|
+
"@deepseek-ai/dsh-agent": "0.2.1-rc.2",
|
|
145
|
+
"@deepseek-ai/dsh-agent-default-model": "0.2.1-rc.2",
|
|
146
|
+
"@deepseek-ai/dsh-api-gateway": "0.2.1-rc.2",
|
|
147
|
+
"@deepseek-ai/dsh-api-remotes": "0.2.1-rc.2",
|
|
148
|
+
"@deepseek-ai/dsh-api-session-controller": "0.2.1-rc.2",
|
|
149
|
+
"@deepseek-ai/dsh-atomic-write": "0.2.1-rc.2",
|
|
150
|
+
"@deepseek-ai/dsh-attachment": "0.2.1-rc.2",
|
|
151
|
+
"@deepseek-ai/dsh-authorization": "0.2.1-rc.2",
|
|
152
|
+
"@deepseek-ai/dsh-brand": "0.2.1-rc.2",
|
|
153
|
+
"@deepseek-ai/dsh-chunked-list": "0.2.1-rc.2",
|
|
154
|
+
"@deepseek-ai/dsh-client-connection": "0.2.1-rc.2",
|
|
155
|
+
"@deepseek-ai/dsh-client-file-upload": "0.2.1-rc.2",
|
|
156
|
+
"@deepseek-ai/dsh-client-ui-conversation": "0.2.1-rc.2",
|
|
157
|
+
"@deepseek-ai/dsh-client-ui-model-selection": "0.2.1-rc.2",
|
|
158
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.2.1-rc.2",
|
|
159
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.2.1-rc.2",
|
|
160
|
+
"@deepseek-ai/dsh-client-ui-settings-general": "0.2.1-rc.2",
|
|
161
|
+
"@deepseek-ai/dsh-client-ui-settings-models": "0.2.1-rc.2",
|
|
162
|
+
"@deepseek-ai/dsh-client-ui-sidebar": "0.2.1-rc.2",
|
|
163
|
+
"@deepseek-ai/dsh-client-ui-theme": "0.2.1-rc.2",
|
|
164
|
+
"@deepseek-ai/dsh-commands": "0.2.1-rc.2",
|
|
165
|
+
"@deepseek-ai/dsh-credentials": "0.2.1-rc.2",
|
|
166
|
+
"@deepseek-ai/dsh-deque": "0.2.1-rc.2",
|
|
167
|
+
"@deepseek-ai/dsh-file-reference": "0.2.1-rc.2",
|
|
168
|
+
"@deepseek-ai/dsh-fs": "0.2.1-rc.2",
|
|
169
|
+
"@deepseek-ai/dsh-home-paths": "0.2.1-rc.2",
|
|
170
|
+
"@deepseek-ai/dsh-host-webserver": "0.2.1-rc.2",
|
|
171
|
+
"@deepseek-ai/dsh-jobs": "0.2.1-rc.2",
|
|
172
|
+
"@deepseek-ai/dsh-launch-environment": "0.2.1-rc.2",
|
|
173
|
+
"@deepseek-ai/dsh-llm": "0.2.1-rc.2",
|
|
174
|
+
"@deepseek-ai/dsh-llm-pi-ai": "0.2.1-rc.2",
|
|
175
|
+
"@deepseek-ai/dsh-native-command": "0.2.1-rc.2",
|
|
176
|
+
"@deepseek-ai/dsh-sandbox": "0.2.1-rc.2",
|
|
177
|
+
"@deepseek-ai/dsh-sandbox-policy": "0.2.1-rc.2",
|
|
178
|
+
"@deepseek-ai/dsh-scope": "0.2.1-rc.2",
|
|
179
|
+
"@deepseek-ai/dsh-session": "0.2.1-rc.2",
|
|
180
|
+
"@deepseek-ai/dsh-session-persistence": "0.2.1-rc.2",
|
|
181
|
+
"@deepseek-ai/dsh-session-projection": "0.2.1-rc.2",
|
|
182
|
+
"@deepseek-ai/dsh-session-projection-cache": "0.2.1-rc.2",
|
|
183
|
+
"@deepseek-ai/dsh-session-query": "0.2.1-rc.2",
|
|
184
|
+
"@deepseek-ai/dsh-session-title": "0.2.1-rc.2",
|
|
185
|
+
"@deepseek-ai/dsh-settings": "0.2.1-rc.2",
|
|
186
|
+
"@deepseek-ai/dsh-skill": "0.2.1-rc.2",
|
|
187
|
+
"@deepseek-ai/dsh-storage": "0.2.1-rc.2",
|
|
188
|
+
"@deepseek-ai/dsh-storage-domain": "0.2.1-rc.2",
|
|
189
|
+
"@deepseek-ai/dsh-subagent": "0.2.1-rc.2",
|
|
190
|
+
"@deepseek-ai/dsh-system-prompt": "0.2.1-rc.2",
|
|
191
|
+
"@deepseek-ai/dsh-timeout": "0.2.1-rc.2",
|
|
192
|
+
"@deepseek-ai/dsh-tool-todo": "0.2.1-rc.2",
|
|
193
|
+
"@deepseek-ai/dsh-tools": "0.2.1-rc.2",
|
|
194
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.1-rc.2",
|
|
195
|
+
"@deepseek-ai/dsh-typert-registry": "0.2.1-rc.2",
|
|
196
|
+
"@deepseek-ai/dsh-user-approval": "0.2.1-rc.2",
|
|
197
|
+
"@deepseek-ai/dsh-util-crypto": "0.2.1-rc.2",
|
|
198
|
+
"@deepseek-ai/dsh-util-time": "0.2.1-rc.2",
|
|
199
|
+
"@deepseek-ai/dsh-util-values": "0.2.1-rc.2",
|
|
200
|
+
"@deepseek-ai/dsh-util-workspace-path": "0.2.1-rc.2",
|
|
201
|
+
"@deepseek-ai/dsh-workspace": "0.2.1-rc.2",
|
|
202
|
+
"@earendil-works/pi-ai": "1.1.0",
|
|
205
203
|
"@types/react": "^18.3.28",
|
|
206
204
|
"@types/react-dom": "^18.3.7",
|
|
207
205
|
"ajv": "^8.17.1",
|
|
@@ -210,6 +208,15 @@
|
|
|
210
208
|
"react-dom": "18.3.1",
|
|
211
209
|
"tsdown": "0.22.14",
|
|
212
210
|
"typescript": "^5.9.3",
|
|
213
|
-
"yaml": "^2.8.1"
|
|
211
|
+
"yaml": "^2.8.1",
|
|
212
|
+
"@deepseek-ai/dsh-client-locale": "0.2.1-rc.2",
|
|
213
|
+
"@deepseek-ai/dsh": "0.2.1-rc.2",
|
|
214
|
+
"@deepseek-ai/schemastery": "3.18.5",
|
|
215
|
+
"semver": "7.7.4"
|
|
216
|
+
},
|
|
217
|
+
"peerDependenciesMeta": {
|
|
218
|
+
"@deepseek-ai/dsh-client-locale": {
|
|
219
|
+
"optional": true
|
|
220
|
+
}
|
|
214
221
|
}
|
|
215
222
|
}
|
|
@@ -17,7 +17,7 @@ paths:
|
|
|
17
17
|
operationId: listResourceModels
|
|
18
18
|
responses:
|
|
19
19
|
'200':
|
|
20
|
-
description:
|
|
20
|
+
description: Authorized model identifiers and optional purpose metadata; reviewed capabilities remain in the client Profile
|
|
21
21
|
content:
|
|
22
22
|
application/json:
|
|
23
23
|
schema:
|
|
@@ -26,13 +26,21 @@ paths:
|
|
|
26
26
|
properties:
|
|
27
27
|
data:
|
|
28
28
|
type: array
|
|
29
|
-
minItems:
|
|
29
|
+
minItems: 0
|
|
30
30
|
maxItems: 128
|
|
31
31
|
items:
|
|
32
32
|
type: object
|
|
33
33
|
required: [id]
|
|
34
34
|
properties:
|
|
35
35
|
id: { type: string, minLength: 1, maxLength: 256 }
|
|
36
|
+
type:
|
|
37
|
+
type: string
|
|
38
|
+
description: >-
|
|
39
|
+
Optional EduWork purpose extension, independent of input modalities and
|
|
40
|
+
the OpenAI object field. Known values are llm, embedding, rerank, image,
|
|
41
|
+
tts and unknown. Server declarations take precedence over client Profile
|
|
42
|
+
metadata; absent types use Profile metadata. Unsupported or unresolved
|
|
43
|
+
types normalize to unknown. Only llm registers for conversation.
|
|
36
44
|
'401': { description: Access Token is invalid or expired }
|
|
37
45
|
'403': { description: Model discovery is not permitted }
|
|
38
46
|
'404': { description: Discovery endpoint is unavailable }
|
|
@@ -45,6 +53,6 @@ components:
|
|
|
45
53
|
headers:
|
|
46
54
|
Retry-After: { schema: { type: string }, description: Seconds or HTTP date for a future retry; never a refresh-token grant }
|
|
47
55
|
Unavailable:
|
|
48
|
-
description: Temporary resource failure; do not clear identity or
|
|
56
|
+
description: Temporary resource failure; do not clear identity or a still-valid Access Token
|
|
49
57
|
securitySchemes:
|
|
50
58
|
accessToken: { type: http, scheme: bearer, description: Model runtime credential }
|
|
@@ -53,13 +53,12 @@
|
|
|
53
53
|
},
|
|
54
54
|
"allowInsecureDevelopment": {
|
|
55
55
|
"type": "boolean",
|
|
56
|
-
"default": false
|
|
56
|
+
"default": false,
|
|
57
|
+
"description": "false (default): HTTPS only. true: allow HTTP service URLs too. Does not change issuer or OAuth validation."
|
|
57
58
|
},
|
|
58
59
|
"insecureDevelopmentOrigin": {
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"maxLength": 2048,
|
|
62
|
-
"pattern": "^http://"
|
|
60
|
+
"deprecated": true,
|
|
61
|
+
"description": "Accepted for older configuration files; ignored. Use allowInsecureDevelopment only."
|
|
63
62
|
},
|
|
64
63
|
"brand": {
|
|
65
64
|
"$ref": "#/$defs/brand"
|
|
@@ -167,6 +166,16 @@
|
|
|
167
166
|
"oauth",
|
|
168
167
|
"oidc"
|
|
169
168
|
]
|
|
169
|
+
},
|
|
170
|
+
"additionalScopes": {
|
|
171
|
+
"type": "array",
|
|
172
|
+
"maxItems": 64,
|
|
173
|
+
"uniqueItems": true,
|
|
174
|
+
"items": {
|
|
175
|
+
"type": "string",
|
|
176
|
+
"maxLength": 128,
|
|
177
|
+
"pattern": "^[\\u0021\\u0023-\\u005b\\u005d-\\u007e]+$"
|
|
178
|
+
}
|
|
170
179
|
}
|
|
171
180
|
},
|
|
172
181
|
"allOf": [
|
|
@@ -195,6 +204,7 @@
|
|
|
195
204
|
"properties": {
|
|
196
205
|
"clientId": false,
|
|
197
206
|
"identityMode": false,
|
|
207
|
+
"additionalScopes": false,
|
|
198
208
|
"discoveryUrl": {
|
|
199
209
|
"$ref": "#/$defs/secureEndpointURL"
|
|
200
210
|
},
|
|
@@ -332,6 +342,11 @@
|
|
|
332
342
|
"minLength": 1,
|
|
333
343
|
"maxLength": 120
|
|
334
344
|
},
|
|
345
|
+
"loginButtonLabel": {
|
|
346
|
+
"type": "string",
|
|
347
|
+
"minLength": 1,
|
|
348
|
+
"maxLength": 40
|
|
349
|
+
},
|
|
335
350
|
"loginDescription": {
|
|
336
351
|
"type": "string",
|
|
337
352
|
"minLength": 1,
|
|
@@ -339,6 +354,14 @@
|
|
|
339
354
|
},
|
|
340
355
|
"supportURL": {
|
|
341
356
|
"$ref": "#/$defs/httpsURL"
|
|
357
|
+
},
|
|
358
|
+
"language": {
|
|
359
|
+
"enum": [
|
|
360
|
+
"auto",
|
|
361
|
+
"zh-CN",
|
|
362
|
+
"en"
|
|
363
|
+
],
|
|
364
|
+
"type": "string"
|
|
342
365
|
}
|
|
343
366
|
}
|
|
344
367
|
},
|
|
@@ -496,6 +519,18 @@
|
|
|
496
519
|
"minLength": 1,
|
|
497
520
|
"maxLength": 256
|
|
498
521
|
},
|
|
522
|
+
"type": {
|
|
523
|
+
"type": "string",
|
|
524
|
+
"enum": [
|
|
525
|
+
"llm",
|
|
526
|
+
"embedding",
|
|
527
|
+
"rerank",
|
|
528
|
+
"image",
|
|
529
|
+
"tts",
|
|
530
|
+
"unknown"
|
|
531
|
+
],
|
|
532
|
+
"description": "Model purpose, independent of input modalities. Server type takes precedence; local metadata fills absent server types. Missing types resolve to unknown; only llm registers for conversation."
|
|
533
|
+
},
|
|
499
534
|
"name": {
|
|
500
535
|
"type": "string",
|
|
501
536
|
"minLength": 1,
|