@shipfox/api-agent 2.0.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/.turbo/turbo-build.log +2 -0
- package/.turbo/turbo-type$colon$emit.log +1 -0
- package/.turbo/turbo-type.log +1 -0
- package/CHANGELOG.md +105 -0
- package/LICENSE +21 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +60 -0
- package/dist/config.js.map +1 -0
- package/dist/core/credential-fingerprints.d.ts +10 -0
- package/dist/core/credential-fingerprints.d.ts.map +1 -0
- package/dist/core/credential-fingerprints.js +65 -0
- package/dist/core/credential-fingerprints.js.map +1 -0
- package/dist/core/custom-model-provider-config-service.d.ts +26 -0
- package/dist/core/custom-model-provider-config-service.d.ts.map +1 -0
- package/dist/core/custom-model-provider-config-service.js +390 -0
- package/dist/core/custom-model-provider-config-service.js.map +1 -0
- package/dist/core/custom-provider-url.d.ts +4 -0
- package/dist/core/custom-provider-url.d.ts.map +1 -0
- package/dist/core/custom-provider-url.js +23 -0
- package/dist/core/custom-provider-url.js.map +1 -0
- package/dist/core/discover-custom-model-provider-models.d.ts +3 -0
- package/dist/core/discover-custom-model-provider-models.d.ts.map +1 -0
- package/dist/core/discover-custom-model-provider-models.js +122 -0
- package/dist/core/discover-custom-model-provider-models.js.map +1 -0
- package/dist/core/entities/agent-workspace-settings.d.ts +9 -0
- package/dist/core/entities/agent-workspace-settings.d.ts.map +1 -0
- package/dist/core/entities/agent-workspace-settings.js +3 -0
- package/dist/core/entities/agent-workspace-settings.js.map +1 -0
- package/dist/core/entities/model-provider-config.d.ts +19 -0
- package/dist/core/entities/model-provider-config.d.ts.map +1 -0
- package/dist/core/entities/model-provider-config.js +3 -0
- package/dist/core/entities/model-provider-config.js.map +1 -0
- package/dist/core/errors.d.ts +62 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +80 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/harness/claude.d.ts +6 -0
- package/dist/core/harness/claude.d.ts.map +1 -0
- package/dist/core/harness/claude.js +104 -0
- package/dist/core/harness/claude.js.map +1 -0
- package/dist/core/harness/index.d.ts +4 -0
- package/dist/core/harness/index.d.ts.map +1 -0
- package/dist/core/harness/index.js +5 -0
- package/dist/core/harness/index.js.map +1 -0
- package/dist/core/harness/pi.d.ts +6 -0
- package/dist/core/harness/pi.d.ts.map +1 -0
- package/dist/core/harness/pi.js +16 -0
- package/dist/core/harness/pi.js.map +1 -0
- package/dist/core/harness/registry.d.ts +22 -0
- package/dist/core/harness/registry.d.ts.map +1 -0
- package/dist/core/harness/registry.js +46 -0
- package/dist/core/harness/registry.js.map +1 -0
- package/dist/core/index.d.ts +12 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +11 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/model-provider-catalog.d.ts +3 -0
- package/dist/core/model-provider-catalog.d.ts.map +1 -0
- package/dist/core/model-provider-catalog.js +25 -0
- package/dist/core/model-provider-catalog.js.map +1 -0
- package/dist/core/model-provider-config-service.d.ts +32 -0
- package/dist/core/model-provider-config-service.d.ts.map +1 -0
- package/dist/core/model-provider-config-service.js +133 -0
- package/dist/core/model-provider-config-service.js.map +1 -0
- package/dist/core/model-provider-validation.d.ts +31 -0
- package/dist/core/model-provider-validation.d.ts.map +1 -0
- package/dist/core/model-provider-validation.js +220 -0
- package/dist/core/model-provider-validation.js.map +1 -0
- package/dist/core/resolve-agent-config.d.ts +32 -0
- package/dist/core/resolve-agent-config.d.ts.map +1 -0
- package/dist/core/resolve-agent-config.js +143 -0
- package/dist/core/resolve-agent-config.js.map +1 -0
- package/dist/core/resolve-runtime-credentials.d.ts +21 -0
- package/dist/core/resolve-runtime-credentials.d.ts.map +1 -0
- package/dist/core/resolve-runtime-credentials.js +101 -0
- package/dist/core/resolve-runtime-credentials.js.map +1 -0
- package/dist/core/workspace-agent-defaults-resolver.d.ts +3 -0
- package/dist/core/workspace-agent-defaults-resolver.d.ts.map +1 -0
- package/dist/core/workspace-agent-defaults-resolver.js +26 -0
- package/dist/core/workspace-agent-defaults-resolver.js.map +1 -0
- package/dist/db/agent-defaults-snapshot.d.ts +9 -0
- package/dist/db/agent-defaults-snapshot.d.ts.map +1 -0
- package/dist/db/agent-defaults-snapshot.js +24 -0
- package/dist/db/agent-defaults-snapshot.js.map +1 -0
- package/dist/db/agent-workspace-settings.d.ts +12 -0
- package/dist/db/agent-workspace-settings.d.ts.map +1 -0
- package/dist/db/agent-workspace-settings.js +53 -0
- package/dist/db/agent-workspace-settings.js.map +1 -0
- package/dist/db/db.d.ts +771 -0
- package/dist/db/db.d.ts.map +1 -0
- package/dist/db/db.js +20 -0
- package/dist/db/db.js.map +1 -0
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +11 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/model-provider-configs.d.ts +38 -0
- package/dist/db/model-provider-configs.d.ts.map +1 -0
- package/dist/db/model-provider-configs.js +159 -0
- package/dist/db/model-provider-configs.js.map +1 -0
- package/dist/db/schema/agent-workspace-settings.d.ts +97 -0
- package/dist/db/schema/agent-workspace-settings.d.ts.map +1 -0
- package/dist/db/schema/agent-workspace-settings.js +26 -0
- package/dist/db/schema/agent-workspace-settings.js.map +1 -0
- package/dist/db/schema/common.d.ts +2 -0
- package/dist/db/schema/common.d.ts.map +1 -0
- package/dist/db/schema/common.js +4 -0
- package/dist/db/schema/common.js.map +1 -0
- package/dist/db/schema/model-provider-configs.d.ts +296 -0
- package/dist/db/schema/model-provider-configs.d.ts.map +1 -0
- package/dist/db/schema/model-provider-configs.js +52 -0
- package/dist/db/schema/model-provider-configs.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +3 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/instance.d.ts +10 -0
- package/dist/metrics/instance.d.ts.map +1 -0
- package/dist/metrics/instance.js +10 -0
- package/dist/metrics/instance.js.map +1 -0
- package/dist/presentation/dto/index.d.ts +2 -0
- package/dist/presentation/dto/index.d.ts.map +1 -0
- package/dist/presentation/dto/index.js +3 -0
- package/dist/presentation/dto/index.js.map +1 -0
- package/dist/presentation/dto/model-provider-config.d.ts +6 -0
- package/dist/presentation/dto/model-provider-config.d.ts.map +1 -0
- package/dist/presentation/dto/model-provider-config.js +32 -0
- package/dist/presentation/dto/model-provider-config.js.map +1 -0
- package/dist/presentation/e2eRoutes/create-model-provider.d.ts +2 -0
- package/dist/presentation/e2eRoutes/create-model-provider.d.ts.map +1 -0
- package/dist/presentation/e2eRoutes/create-model-provider.js +66 -0
- package/dist/presentation/e2eRoutes/create-model-provider.js.map +1 -0
- package/dist/presentation/e2eRoutes/index.d.ts +3 -0
- package/dist/presentation/e2eRoutes/index.d.ts.map +1 -0
- package/dist/presentation/e2eRoutes/index.js +9 -0
- package/dist/presentation/e2eRoutes/index.js.map +1 -0
- package/dist/presentation/index.d.ts +2 -0
- package/dist/presentation/index.d.ts.map +1 -0
- package/dist/presentation/index.js +3 -0
- package/dist/presentation/index.js.map +1 -0
- package/dist/presentation/routes/create-custom-model-provider.d.ts +2 -0
- package/dist/presentation/routes/create-custom-model-provider.d.ts.map +1 -0
- package/dist/presentation/routes/create-custom-model-provider.js +45 -0
- package/dist/presentation/routes/create-custom-model-provider.js.map +1 -0
- package/dist/presentation/routes/delete-model-provider-config.d.ts +2 -0
- package/dist/presentation/routes/delete-model-provider-config.d.ts.map +1 -0
- package/dist/presentation/routes/delete-model-provider-config.js +38 -0
- package/dist/presentation/routes/delete-model-provider-config.js.map +1 -0
- package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.d.ts +2 -0
- package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.d.ts.map +1 -0
- package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.js +37 -0
- package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.js.map +1 -0
- package/dist/presentation/routes/discover-custom-model-provider-models.d.ts +2 -0
- package/dist/presentation/routes/discover-custom-model-provider-models.d.ts.map +1 -0
- package/dist/presentation/routes/discover-custom-model-provider-models.js +31 -0
- package/dist/presentation/routes/discover-custom-model-provider-models.js.map +1 -0
- package/dist/presentation/routes/errors.d.ts +2 -0
- package/dist/presentation/routes/errors.d.ts.map +1 -0
- package/dist/presentation/routes/errors.js +112 -0
- package/dist/presentation/routes/errors.js.map +1 -0
- package/dist/presentation/routes/index.d.ts +3 -0
- package/dist/presentation/routes/index.d.ts.map +1 -0
- package/dist/presentation/routes/index.js +39 -0
- package/dist/presentation/routes/index.js.map +1 -0
- package/dist/presentation/routes/list-model-provider-catalog.d.ts +2 -0
- package/dist/presentation/routes/list-model-provider-catalog.d.ts.map +1 -0
- package/dist/presentation/routes/list-model-provider-catalog.js +18 -0
- package/dist/presentation/routes/list-model-provider-catalog.js.map +1 -0
- package/dist/presentation/routes/list-model-provider-configs.d.ts +2 -0
- package/dist/presentation/routes/list-model-provider-configs.d.ts.map +1 -0
- package/dist/presentation/routes/list-model-provider-configs.js +37 -0
- package/dist/presentation/routes/list-model-provider-configs.js.map +1 -0
- package/dist/presentation/routes/set-default-harness.d.ts +2 -0
- package/dist/presentation/routes/set-default-harness.d.ts.map +1 -0
- package/dist/presentation/routes/set-default-harness.js +38 -0
- package/dist/presentation/routes/set-default-harness.js.map +1 -0
- package/dist/presentation/routes/set-default-model-provider.d.ts +2 -0
- package/dist/presentation/routes/set-default-model-provider.d.ts.map +1 -0
- package/dist/presentation/routes/set-default-model-provider.js +48 -0
- package/dist/presentation/routes/set-default-model-provider.js.map +1 -0
- package/dist/presentation/routes/update-custom-model-provider.d.ts +2 -0
- package/dist/presentation/routes/update-custom-model-provider.d.ts.map +1 -0
- package/dist/presentation/routes/update-custom-model-provider.js +47 -0
- package/dist/presentation/routes/update-custom-model-provider.js.map +1 -0
- package/dist/presentation/routes/update-model-provider-default-model.d.ts +2 -0
- package/dist/presentation/routes/update-model-provider-default-model.d.ts.map +1 -0
- package/dist/presentation/routes/update-model-provider-default-model.js +38 -0
- package/dist/presentation/routes/update-model-provider-default-model.js.map +1 -0
- package/dist/presentation/routes/upsert-model-provider-config.d.ts +2 -0
- package/dist/presentation/routes/upsert-model-provider-config.d.ts.map +1 -0
- package/dist/presentation/routes/upsert-model-provider-config.js +52 -0
- package/dist/presentation/routes/upsert-model-provider-config.js.map +1 -0
- package/dist/tsconfig.test.tsbuildinfo +1 -0
- package/drizzle/0000_daffy_leopardon.sql +28 -0
- package/drizzle/0001_default_harness.sql +1 -0
- package/drizzle/meta/0000_snapshot.json +199 -0
- package/drizzle/meta/0001_snapshot.json +205 -0
- package/drizzle/meta/_journal.json +20 -0
- package/drizzle.config.ts +7 -0
- package/package.json +109 -0
- package/src/config.test.ts +118 -0
- package/src/config.ts +75 -0
- package/src/core/catalog-registry.test.ts +48 -0
- package/src/core/credential-fingerprints.test.ts +34 -0
- package/src/core/credential-fingerprints.ts +84 -0
- package/src/core/custom-model-provider-config-service.ts +537 -0
- package/src/core/custom-provider-url.ts +24 -0
- package/src/core/discover-custom-model-provider-models.ts +147 -0
- package/src/core/entities/agent-workspace-settings.ts +9 -0
- package/src/core/entities/model-provider-config.ts +25 -0
- package/src/core/errors.ts +139 -0
- package/src/core/harness/claude.ts +75 -0
- package/src/core/harness/index.ts +19 -0
- package/src/core/harness/pi.ts +18 -0
- package/src/core/harness/registry.test.ts +281 -0
- package/src/core/harness/registry.ts +108 -0
- package/src/core/index.ts +56 -0
- package/src/core/model-provider-catalog.ts +33 -0
- package/src/core/model-provider-config-service.test.ts +940 -0
- package/src/core/model-provider-config-service.ts +207 -0
- package/src/core/model-provider-validation.test.ts +354 -0
- package/src/core/model-provider-validation.ts +276 -0
- package/src/core/resolve-agent-config.test.ts +441 -0
- package/src/core/resolve-agent-config.ts +272 -0
- package/src/core/resolve-runtime-credentials.test.ts +316 -0
- package/src/core/resolve-runtime-credentials.ts +147 -0
- package/src/core/workspace-agent-defaults-resolver.ts +42 -0
- package/src/db/agent-defaults-snapshot.ts +49 -0
- package/src/db/agent-workspace-settings.test.ts +111 -0
- package/src/db/agent-workspace-settings.ts +92 -0
- package/src/db/db.ts +20 -0
- package/src/db/index.ts +29 -0
- package/src/db/model-provider-configs.test.ts +281 -0
- package/src/db/model-provider-configs.ts +230 -0
- package/src/db/schema/agent-workspace-settings.ts +27 -0
- package/src/db/schema/common.ts +3 -0
- package/src/db/schema/model-provider-configs.ts +80 -0
- package/src/index.ts +43 -0
- package/src/metrics/index.ts +1 -0
- package/src/metrics/instance.ts +18 -0
- package/src/presentation/dto/index.ts +5 -0
- package/src/presentation/dto/model-provider-config.ts +41 -0
- package/src/presentation/e2eRoutes/create-model-provider.test.ts +47 -0
- package/src/presentation/e2eRoutes/create-model-provider.ts +61 -0
- package/src/presentation/e2eRoutes/index.ts +7 -0
- package/src/presentation/index.ts +1 -0
- package/src/presentation/routes/create-custom-model-provider.ts +45 -0
- package/src/presentation/routes/delete-model-provider-config.ts +31 -0
- package/src/presentation/routes/discover-custom-model-provider-models-by-slug.ts +42 -0
- package/src/presentation/routes/discover-custom-model-provider-models.ts +29 -0
- package/src/presentation/routes/errors.ts +122 -0
- package/src/presentation/routes/index.ts +37 -0
- package/src/presentation/routes/list-model-provider-catalog.ts +15 -0
- package/src/presentation/routes/list-model-provider-configs.ts +33 -0
- package/src/presentation/routes/model-provider-catalog.test.ts +73 -0
- package/src/presentation/routes/model-provider-config.test.ts +807 -0
- package/src/presentation/routes/set-default-harness.ts +33 -0
- package/src/presentation/routes/set-default-model-provider.ts +47 -0
- package/src/presentation/routes/update-custom-model-provider.ts +50 -0
- package/src/presentation/routes/update-model-provider-default-model.ts +40 -0
- package/src/presentation/routes/upsert-model-provider-config.ts +53 -0
- package/test/env.ts +8 -0
- package/test/globalSetup.ts +25 -0
- package/test/setup.ts +17 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.json +3 -0
- package/tsconfig.test.json +8 -0
- package/vitest.config.ts +11 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {setDefaultHarnessBodySchema, setDefaultHarnessResponseSchema} from '@shipfox/api-agent-dto';
|
|
2
|
+
import {requireWorkspaceAccess} from '@shipfox/api-auth-context';
|
|
3
|
+
import {defineRoute} from '@shipfox/node-fastify';
|
|
4
|
+
import {z} from 'zod';
|
|
5
|
+
import {setDefaultHarness} from '#db/index.js';
|
|
6
|
+
|
|
7
|
+
export const setDefaultHarnessRoute = defineRoute({
|
|
8
|
+
method: 'PUT',
|
|
9
|
+
path: '/default-harness',
|
|
10
|
+
description: 'Set the default agent harness for a workspace',
|
|
11
|
+
schema: {
|
|
12
|
+
params: z.object({workspaceId: z.string().uuid()}),
|
|
13
|
+
body: setDefaultHarnessBodySchema,
|
|
14
|
+
response: {
|
|
15
|
+
200: setDefaultHarnessResponseSchema,
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
handler: async (request) => {
|
|
19
|
+
const {workspaceId} = request.params;
|
|
20
|
+
requireWorkspaceAccess({request, workspaceId});
|
|
21
|
+
|
|
22
|
+
const settings = await setDefaultHarness({
|
|
23
|
+
workspaceId,
|
|
24
|
+
harnessId: request.body.harness_id,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
if (settings.defaultHarnessId === null) {
|
|
28
|
+
throw new Error('Default harness upsert returned a null harness');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return {default_harness_id: settings.defaultHarnessId};
|
|
32
|
+
},
|
|
33
|
+
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getModelProviderEntry,
|
|
3
|
+
setDefaultModelProviderBodySchema,
|
|
4
|
+
setDefaultModelProviderResponseSchema,
|
|
5
|
+
} from '@shipfox/api-agent-dto';
|
|
6
|
+
import {requireWorkspaceAccess} from '@shipfox/api-auth-context';
|
|
7
|
+
import {defineRoute} from '@shipfox/node-fastify';
|
|
8
|
+
import {z} from 'zod';
|
|
9
|
+
import {UnsupportedModelProviderError} from '#core/index.js';
|
|
10
|
+
import {getModelProviderConfig, setDefaultModelProvider} from '#db/index.js';
|
|
11
|
+
import {translateModelProviderRouteError} from './errors.js';
|
|
12
|
+
|
|
13
|
+
export const setDefaultModelProviderRoute = defineRoute({
|
|
14
|
+
method: 'PUT',
|
|
15
|
+
path: '/default-model-provider',
|
|
16
|
+
description: 'Set the default model provider for a workspace',
|
|
17
|
+
schema: {
|
|
18
|
+
params: z.object({workspaceId: z.string().uuid()}),
|
|
19
|
+
body: setDefaultModelProviderBodySchema,
|
|
20
|
+
response: {
|
|
21
|
+
200: setDefaultModelProviderResponseSchema,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
errorHandler: translateModelProviderRouteError,
|
|
25
|
+
handler: async (request) => {
|
|
26
|
+
const {workspaceId} = request.params;
|
|
27
|
+
requireWorkspaceAccess({request, workspaceId});
|
|
28
|
+
|
|
29
|
+
const existingConfig = await getModelProviderConfig({
|
|
30
|
+
workspaceId,
|
|
31
|
+
providerId: request.body.provider_id,
|
|
32
|
+
});
|
|
33
|
+
if (existingConfig?.kind !== 'custom') {
|
|
34
|
+
const entry = getModelProviderEntry(request.body.provider_id);
|
|
35
|
+
if (entry === undefined || entry.support_status !== 'supported') {
|
|
36
|
+
throw new UnsupportedModelProviderError(request.body.provider_id);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const settings = await setDefaultModelProvider({
|
|
41
|
+
workspaceId,
|
|
42
|
+
providerId: request.body.provider_id,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
return {default_provider_id: settings.defaultProviderId};
|
|
46
|
+
},
|
|
47
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import {
|
|
2
|
+
customModelProviderConfigDtoSchema,
|
|
3
|
+
modelProviderRefSchema,
|
|
4
|
+
updateCustomModelProviderBodySchema,
|
|
5
|
+
} from '@shipfox/api-agent-dto';
|
|
6
|
+
import {requireWorkspaceAccess} from '@shipfox/api-auth-context';
|
|
7
|
+
import {defineRoute} from '@shipfox/node-fastify';
|
|
8
|
+
import {z} from 'zod';
|
|
9
|
+
import {updateCustomModelProviderConfig} from '#core/index.js';
|
|
10
|
+
import {toCustomModelProviderConfigDto} from '#presentation/dto/index.js';
|
|
11
|
+
import {translateModelProviderRouteError} from './errors.js';
|
|
12
|
+
|
|
13
|
+
export const updateCustomModelProviderRoute = defineRoute({
|
|
14
|
+
method: 'PUT',
|
|
15
|
+
path: '/custom-model-providers/:slug',
|
|
16
|
+
description: 'Update a custom model provider configuration for a workspace',
|
|
17
|
+
schema: {
|
|
18
|
+
params: z.object({
|
|
19
|
+
workspaceId: z.string().uuid(),
|
|
20
|
+
slug: modelProviderRefSchema,
|
|
21
|
+
}),
|
|
22
|
+
body: updateCustomModelProviderBodySchema,
|
|
23
|
+
response: {
|
|
24
|
+
200: customModelProviderConfigDtoSchema,
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
errorHandler: translateModelProviderRouteError,
|
|
28
|
+
handler: async (request, reply) => {
|
|
29
|
+
const {workspaceId, slug} = request.params;
|
|
30
|
+
const abortController = new AbortController();
|
|
31
|
+
let responseFinished = false;
|
|
32
|
+
reply.raw.on('finish', () => {
|
|
33
|
+
responseFinished = true;
|
|
34
|
+
});
|
|
35
|
+
reply.raw.on('close', () => {
|
|
36
|
+
if (!responseFinished) abortController.abort();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
requireWorkspaceAccess({request, workspaceId});
|
|
40
|
+
|
|
41
|
+
const config = await updateCustomModelProviderConfig({
|
|
42
|
+
workspaceId,
|
|
43
|
+
providerId: slug,
|
|
44
|
+
body: request.body,
|
|
45
|
+
signal: abortController.signal,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
return toCustomModelProviderConfigDto(config);
|
|
49
|
+
},
|
|
50
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import {
|
|
2
|
+
modelProviderConfigResponseSchema,
|
|
3
|
+
modelProviderRefSchema,
|
|
4
|
+
updateModelProviderDefaultModelBodySchema,
|
|
5
|
+
} from '@shipfox/api-agent-dto';
|
|
6
|
+
import {requireWorkspaceAccess} from '@shipfox/api-auth-context';
|
|
7
|
+
import {defineRoute} from '@shipfox/node-fastify';
|
|
8
|
+
import {z} from 'zod';
|
|
9
|
+
import {updateModelProviderConfigDefaultModel} from '#core/index.js';
|
|
10
|
+
import {toModelProviderConfigResponseDto} from '#presentation/dto/index.js';
|
|
11
|
+
import {translateModelProviderRouteError} from './errors.js';
|
|
12
|
+
|
|
13
|
+
export const updateModelProviderDefaultModelRoute = defineRoute({
|
|
14
|
+
method: 'PUT',
|
|
15
|
+
path: '/model-providers/:providerId/default-model',
|
|
16
|
+
description: 'Update the default model for an existing model provider configuration',
|
|
17
|
+
schema: {
|
|
18
|
+
params: z.object({
|
|
19
|
+
workspaceId: z.string().uuid(),
|
|
20
|
+
providerId: modelProviderRefSchema,
|
|
21
|
+
}),
|
|
22
|
+
body: updateModelProviderDefaultModelBodySchema,
|
|
23
|
+
response: {
|
|
24
|
+
200: modelProviderConfigResponseSchema,
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
errorHandler: translateModelProviderRouteError,
|
|
28
|
+
handler: async (request) => {
|
|
29
|
+
const {workspaceId, providerId} = request.params;
|
|
30
|
+
requireWorkspaceAccess({request, workspaceId});
|
|
31
|
+
|
|
32
|
+
const config = await updateModelProviderConfigDefaultModel({
|
|
33
|
+
workspaceId,
|
|
34
|
+
providerId,
|
|
35
|
+
defaultModel: request.body.default_model,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
return toModelProviderConfigResponseDto(config);
|
|
39
|
+
},
|
|
40
|
+
});
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import {
|
|
2
|
+
modelProviderConfigDtoSchema,
|
|
3
|
+
supportedModelProviderIdSchema,
|
|
4
|
+
updateModelProviderConfigBodySchema,
|
|
5
|
+
} from '@shipfox/api-agent-dto';
|
|
6
|
+
import {requireWorkspaceAccess} from '@shipfox/api-auth-context';
|
|
7
|
+
import {defineRoute} from '@shipfox/node-fastify';
|
|
8
|
+
import {z} from 'zod';
|
|
9
|
+
import {testAndSaveModelProviderConfig} from '#core/index.js';
|
|
10
|
+
import {toModelProviderConfigDto} from '#presentation/dto/index.js';
|
|
11
|
+
import {translateModelProviderRouteError} from './errors.js';
|
|
12
|
+
|
|
13
|
+
export const upsertModelProviderConfigRoute = defineRoute({
|
|
14
|
+
method: 'PUT',
|
|
15
|
+
path: '/model-providers/:providerId',
|
|
16
|
+
description: 'Test and save a model provider configuration for a workspace',
|
|
17
|
+
schema: {
|
|
18
|
+
params: z.object({
|
|
19
|
+
workspaceId: z.string().uuid(),
|
|
20
|
+
providerId: supportedModelProviderIdSchema,
|
|
21
|
+
}),
|
|
22
|
+
body: updateModelProviderConfigBodySchema,
|
|
23
|
+
response: {
|
|
24
|
+
200: modelProviderConfigDtoSchema,
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
errorHandler: translateModelProviderRouteError,
|
|
28
|
+
handler: async (request, reply) => {
|
|
29
|
+
const {workspaceId, providerId} = request.params;
|
|
30
|
+
const abortController = new AbortController();
|
|
31
|
+
let responseFinished = false;
|
|
32
|
+
reply.raw.on('finish', () => {
|
|
33
|
+
responseFinished = true;
|
|
34
|
+
});
|
|
35
|
+
reply.raw.on('close', () => {
|
|
36
|
+
if (!responseFinished) abortController.abort();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const membership = requireWorkspaceAccess({request, workspaceId});
|
|
40
|
+
|
|
41
|
+
const config = await testAndSaveModelProviderConfig({
|
|
42
|
+
workspaceId,
|
|
43
|
+
providerId,
|
|
44
|
+
...('default_model' in request.body ? {defaultModel: request.body.default_model} : {}),
|
|
45
|
+
credentials: request.body.credentials,
|
|
46
|
+
editedBy: membership.userId,
|
|
47
|
+
setAsDefault: request.body.set_as_default,
|
|
48
|
+
signal: abortController.signal,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
return toModelProviderConfigDto(config);
|
|
52
|
+
},
|
|
53
|
+
});
|
package/test/env.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
process.env.POSTGRES_HOST ??= 'localhost';
|
|
2
|
+
process.env.POSTGRES_PORT ??= '5432';
|
|
3
|
+
process.env.POSTGRES_USERNAME ??= 'shipfox';
|
|
4
|
+
process.env.POSTGRES_PASSWORD ??= 'password';
|
|
5
|
+
process.env.POSTGRES_DATABASE = 'api_test';
|
|
6
|
+
process.env.POSTGRES_MAX_CONNECTIONS ??= '5';
|
|
7
|
+
process.env.TZ = 'UTC';
|
|
8
|
+
process.env.SECRETS_ENCRYPTION_KEK = 'ZmVkY2JhOTg3NjU0MzIxMGZlZGNiYTk4NzY1NDMyMTA=';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import './env.js';
|
|
2
|
+
import {secretsModule} from '@shipfox/api-secrets';
|
|
3
|
+
import {runMigrations} from '@shipfox/node-drizzle';
|
|
4
|
+
import {closePostgresClient, createPostgresClient} from '@shipfox/node-postgres';
|
|
5
|
+
import {sql} from 'drizzle-orm';
|
|
6
|
+
import {closeDb, db, migrationsPath} from '#db/index.js';
|
|
7
|
+
|
|
8
|
+
export async function setup() {
|
|
9
|
+
createPostgresClient();
|
|
10
|
+
|
|
11
|
+
await runMigrations(db(), migrationsPath, '__drizzle_migrations_agent');
|
|
12
|
+
if (!secretsModule.database || Array.isArray(secretsModule.database)) {
|
|
13
|
+
throw new Error('Secrets module database is not configured');
|
|
14
|
+
}
|
|
15
|
+
await runMigrations(
|
|
16
|
+
secretsModule.database.db(),
|
|
17
|
+
secretsModule.database.migrationsPath,
|
|
18
|
+
'__drizzle_migrations_secrets',
|
|
19
|
+
);
|
|
20
|
+
await db().execute(sql`TRUNCATE model_provider_configs CASCADE`);
|
|
21
|
+
await db().execute(sql`TRUNCATE agent_workspace_settings CASCADE`);
|
|
22
|
+
|
|
23
|
+
closeDb();
|
|
24
|
+
await closePostgresClient();
|
|
25
|
+
}
|
package/test/setup.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import './env.js';
|
|
2
|
+
import {closePostgresClient, createPostgresClient} from '@shipfox/node-postgres';
|
|
3
|
+
import {afterAll, afterEach, beforeAll, vi} from '@shipfox/vitest/vi';
|
|
4
|
+
import {closeDb} from '#db/index.js';
|
|
5
|
+
|
|
6
|
+
beforeAll(() => {
|
|
7
|
+
createPostgresClient();
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
afterEach(() => {
|
|
11
|
+
vi.restoreAllMocks();
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
afterAll(async () => {
|
|
15
|
+
closeDb();
|
|
16
|
+
await closePostgresClient();
|
|
17
|
+
});
|