mirror of
https://github.com/langgenius/dify.git
synced 2026-10-04 13:47:55 +08:00
fix(web): send model delete params as query string on DELETE (#42162)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
1 parent
4cc2f632b8
commit
aa6dceeece
7 files changed
+98
-72
No files matched your search
@@ -320,7 +320,7 @@ class ModelProviderModelApi(Resource):
|
||||
|
||||
return SimpleResultResponse(result="success").model_dump(mode="json"), 200
|
||||
|
||||
@console_ns.expect(console_ns.models[ParserDeleteModels.__name__])
|
||||
@console_ns.doc(params=query_params_from_model(ParserDeleteModels))
|
||||
@console_ns.response(204, "Model deleted successfully")
|
||||
@setup_required
|
||||
@login_required
|
||||
@@ -469,7 +469,7 @@ class ModelProviderModelCredentialApi(Resource):
|
||||
|
||||
return SimpleResultResponse(result="success").model_dump(mode="json")
|
||||
|
||||
@console_ns.expect(console_ns.models[ParserDeleteCredential.__name__])
|
||||
@console_ns.doc(params=query_params_from_model(ParserDeleteCredential))
|
||||
@console_ns.response(204, "Credential deleted successfully")
|
||||
@setup_required
|
||||
@login_required
|
||||
|
||||
@@ -10438,14 +10438,10 @@ Update a plugin endpoint
|
||||
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| model | query | | Yes | string |
|
||||
| model_type | query | Enum class for model type. | Yes | string, <br>**Available values:** "llm", "moderation", "rerank", "speech2text", "text-embedding", "tts" |
|
||||
| provider | path | | Yes | string |
|
||||
|
||||
#### Request Body
|
||||
|
||||
| Required | Schema |
|
||||
| -------- | ------ |
|
||||
| Yes | **application/json**: [ParserDeleteModels](#parserdeletemodels)<br> |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Code | Description |
|
||||
@@ -10489,14 +10485,11 @@ Update a plugin endpoint
|
||||
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| credential_id | query | | Yes | string |
|
||||
| model | query | | Yes | string |
|
||||
| model_type | query | Enum class for model type. | Yes | string, <br>**Available values:** "llm", "moderation", "rerank", "speech2text", "text-embedding", "tts" |
|
||||
| provider | path | | Yes | string |
|
||||
|
||||
#### Request Body
|
||||
|
||||
| Required | Schema |
|
||||
| -------- | ------ |
|
||||
| Yes | **application/json**: [ParserDeleteCredential](#parserdeletecredential)<br> |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Code | Description |
|
||||
|
||||
@@ -154,6 +154,23 @@ class TestModelProviderModelApi:
|
||||
|
||||
assert status == 204
|
||||
|
||||
def test_delete_model_via_query_params(self, app: Flask):
|
||||
api = ModelProviderModelApi()
|
||||
method = unwrap(api.delete)
|
||||
|
||||
payload = {
|
||||
"model": "gpt-4",
|
||||
"model_type": ModelType.LLM,
|
||||
}
|
||||
|
||||
with (
|
||||
app.test_request_context("/", method="DELETE", query_string=payload),
|
||||
patch("controllers.console.workspace.models.ModelProviderService"),
|
||||
):
|
||||
result, status = method(api, ParserDeleteModels.model_validate(payload), "tenant1", "openai")
|
||||
|
||||
assert status == 204
|
||||
|
||||
def test_get_models_returns_empty(self, app: Flask):
|
||||
api = ModelProviderModelApi()
|
||||
method = unwrap(api.get)
|
||||
@@ -262,6 +279,24 @@ class TestModelProviderModelCredentialApi:
|
||||
|
||||
assert status == 204
|
||||
|
||||
def test_delete_credential_via_query_params(self, app: Flask):
|
||||
api = ModelProviderModelCredentialApi()
|
||||
method = unwrap(api.delete)
|
||||
|
||||
payload = {
|
||||
"model": "gpt",
|
||||
"model_type": ModelType.LLM,
|
||||
"credential_id": "123e4567-e89b-12d3-a456-426614174000",
|
||||
}
|
||||
|
||||
with (
|
||||
app.test_request_context("/", method="DELETE", query_string=payload),
|
||||
patch("controllers.console.workspace.models.ModelProviderService"),
|
||||
):
|
||||
result, status = method(api, ParserDeleteCredential.model_validate(payload), "t1", "openai")
|
||||
|
||||
assert status == 204
|
||||
|
||||
|
||||
class TestModelProviderModelCredentialSwitchApi:
|
||||
def test_switch_success(self, app: Flask):
|
||||
|
||||
@@ -12,11 +12,11 @@ import {
|
||||
zDeleteWorkspacesCurrentModelProvidersByProviderCredentialsBody,
|
||||
zDeleteWorkspacesCurrentModelProvidersByProviderCredentialsPath,
|
||||
zDeleteWorkspacesCurrentModelProvidersByProviderCredentialsResponse,
|
||||
zDeleteWorkspacesCurrentModelProvidersByProviderModelsBody,
|
||||
zDeleteWorkspacesCurrentModelProvidersByProviderModelsCredentialsBody,
|
||||
zDeleteWorkspacesCurrentModelProvidersByProviderModelsCredentialsPath,
|
||||
zDeleteWorkspacesCurrentModelProvidersByProviderModelsCredentialsQuery,
|
||||
zDeleteWorkspacesCurrentModelProvidersByProviderModelsCredentialsResponse,
|
||||
zDeleteWorkspacesCurrentModelProvidersByProviderModelsPath,
|
||||
zDeleteWorkspacesCurrentModelProvidersByProviderModelsQuery,
|
||||
zDeleteWorkspacesCurrentModelProvidersByProviderModelsResponse,
|
||||
zDeleteWorkspacesCurrentRbacAccessPoliciesByPolicyIdPath,
|
||||
zDeleteWorkspacesCurrentRbacAccessPoliciesByPolicyIdResponse,
|
||||
@@ -1421,8 +1421,8 @@ export const delete6 = oc
|
||||
})
|
||||
.input(
|
||||
z.object({
|
||||
body: zDeleteWorkspacesCurrentModelProvidersByProviderModelsCredentialsBody,
|
||||
params: zDeleteWorkspacesCurrentModelProvidersByProviderModelsCredentialsPath,
|
||||
query: zDeleteWorkspacesCurrentModelProvidersByProviderModelsCredentialsQuery,
|
||||
}),
|
||||
)
|
||||
.output(zDeleteWorkspacesCurrentModelProvidersByProviderModelsCredentialsResponse)
|
||||
@@ -1613,8 +1613,8 @@ export const delete7 = oc
|
||||
})
|
||||
.input(
|
||||
z.object({
|
||||
body: zDeleteWorkspacesCurrentModelProvidersByProviderModelsBody,
|
||||
params: zDeleteWorkspacesCurrentModelProvidersByProviderModelsPath,
|
||||
query: zDeleteWorkspacesCurrentModelProvidersByProviderModelsQuery,
|
||||
}),
|
||||
)
|
||||
.output(zDeleteWorkspacesCurrentModelProvidersByProviderModelsResponse)
|
||||
|
||||
@@ -283,11 +283,6 @@ export type ValidationResultResponse = {
|
||||
result: 'error' | 'success'
|
||||
}
|
||||
|
||||
export type ParserDeleteModels = {
|
||||
model: string
|
||||
model_type: ModelType
|
||||
}
|
||||
|
||||
export type ProviderModelListResponse = {
|
||||
data: Array<ModelWithProviderEntityResponse>
|
||||
}
|
||||
@@ -300,12 +295,6 @@ export type ParserPostModels = {
|
||||
model_type: ModelType
|
||||
}
|
||||
|
||||
export type ParserDeleteCredential = {
|
||||
credential_id: string
|
||||
model: string
|
||||
model_type: ModelType
|
||||
}
|
||||
|
||||
export type ModelCredentialResponse = {
|
||||
available_credentials: Array<CredentialConfiguration>
|
||||
credentials: {
|
||||
@@ -349,6 +338,11 @@ export type ParserValidate = {
|
||||
model_type: ModelType
|
||||
}
|
||||
|
||||
export type ParserDeleteModels = {
|
||||
model: string
|
||||
model_type: ModelType
|
||||
}
|
||||
|
||||
export type LoadBalancingCredentialPayload = {
|
||||
credentials: {
|
||||
[key: string]: unknown
|
||||
@@ -1446,8 +1440,6 @@ export type ModelProviderPluginSummaryResponse = {
|
||||
version: string
|
||||
}
|
||||
|
||||
export type ModelType = 'llm' | 'moderation' | 'rerank' | 'speech2text' | 'text-embedding' | 'tts'
|
||||
|
||||
export type ModelWithProviderEntityResponse = {
|
||||
deprecated?: boolean
|
||||
features?: Array<ModelFeature> | null
|
||||
@@ -1471,6 +1463,8 @@ export type LoadBalancingPayload = {
|
||||
enabled?: boolean | null
|
||||
}
|
||||
|
||||
export type ModelType = 'llm' | 'moderation' | 'rerank' | 'speech2text' | 'text-embedding' | 'tts'
|
||||
|
||||
export type CredentialConfiguration = {
|
||||
credential_id: string
|
||||
credential_name: string
|
||||
@@ -3594,11 +3588,14 @@ export type PostWorkspacesCurrentModelProvidersByProviderCredentialsValidateResp
|
||||
PostWorkspacesCurrentModelProvidersByProviderCredentialsValidateResponses[keyof PostWorkspacesCurrentModelProvidersByProviderCredentialsValidateResponses]
|
||||
|
||||
export type DeleteWorkspacesCurrentModelProvidersByProviderModelsData = {
|
||||
body: ParserDeleteModels
|
||||
body?: never
|
||||
path: {
|
||||
provider: string
|
||||
}
|
||||
query?: never
|
||||
query: {
|
||||
model: string
|
||||
model_type: 'llm' | 'moderation' | 'rerank' | 'speech2text' | 'text-embedding' | 'tts'
|
||||
}
|
||||
url: '/workspaces/current/model-providers/{provider}/models'
|
||||
}
|
||||
|
||||
@@ -3642,11 +3639,15 @@ export type PostWorkspacesCurrentModelProvidersByProviderModelsResponse =
|
||||
PostWorkspacesCurrentModelProvidersByProviderModelsResponses[keyof PostWorkspacesCurrentModelProvidersByProviderModelsResponses]
|
||||
|
||||
export type DeleteWorkspacesCurrentModelProvidersByProviderModelsCredentialsData = {
|
||||
body: ParserDeleteCredential
|
||||
body?: never
|
||||
path: {
|
||||
provider: string
|
||||
}
|
||||
query?: never
|
||||
query: {
|
||||
credential_id: string
|
||||
model: string
|
||||
model_type: 'llm' | 'moderation' | 'rerank' | 'speech2text' | 'text-embedding' | 'tts'
|
||||
}
|
||||
url: '/workspaces/current/model-providers/{provider}/models/credentials'
|
||||
}
|
||||
|
||||
|
||||
@@ -1045,6 +1045,14 @@ export const zMemberInviteResponse = z.object({
|
||||
tenant_id: z.string(),
|
||||
})
|
||||
|
||||
/**
|
||||
* LoadBalancingPayload
|
||||
*/
|
||||
export const zLoadBalancingPayload = z.object({
|
||||
configs: z.array(z.record(z.string(), z.unknown())).nullish(),
|
||||
enabled: z.boolean().nullish(),
|
||||
})
|
||||
|
||||
/**
|
||||
* ModelType
|
||||
*
|
||||
@@ -1060,18 +1068,12 @@ export const zModelType = z.enum([
|
||||
])
|
||||
|
||||
/**
|
||||
* ParserDeleteModels
|
||||
* ParserPostModels
|
||||
*/
|
||||
export const zParserDeleteModels = z.object({
|
||||
model: z.string(),
|
||||
model_type: zModelType,
|
||||
})
|
||||
|
||||
/**
|
||||
* ParserDeleteCredential
|
||||
*/
|
||||
export const zParserDeleteCredential = z.object({
|
||||
credential_id: z.string(),
|
||||
export const zParserPostModels = z.object({
|
||||
config_from: z.string().nullish(),
|
||||
credential_id: z.string().nullish(),
|
||||
load_balancing: zLoadBalancingPayload.nullish(),
|
||||
model: z.string(),
|
||||
model_type: zModelType,
|
||||
})
|
||||
@@ -1115,6 +1117,14 @@ export const zParserValidate = z.object({
|
||||
model_type: zModelType,
|
||||
})
|
||||
|
||||
/**
|
||||
* ParserDeleteModels
|
||||
*/
|
||||
export const zParserDeleteModels = z.object({
|
||||
model: z.string(),
|
||||
model_type: zModelType,
|
||||
})
|
||||
|
||||
/**
|
||||
* LoadBalancingCredentialPayload
|
||||
*/
|
||||
@@ -1140,25 +1150,6 @@ export const zParserPostDefault = z.object({
|
||||
model_settings: z.array(zInner),
|
||||
})
|
||||
|
||||
/**
|
||||
* LoadBalancingPayload
|
||||
*/
|
||||
export const zLoadBalancingPayload = z.object({
|
||||
configs: z.array(z.record(z.string(), z.unknown())).nullish(),
|
||||
enabled: z.boolean().nullish(),
|
||||
})
|
||||
|
||||
/**
|
||||
* ParserPostModels
|
||||
*/
|
||||
export const zParserPostModels = z.object({
|
||||
config_from: z.string().nullish(),
|
||||
credential_id: z.string().nullish(),
|
||||
load_balancing: zLoadBalancingPayload.nullish(),
|
||||
model: z.string(),
|
||||
model_type: zModelType,
|
||||
})
|
||||
|
||||
/**
|
||||
* CredentialConfiguration
|
||||
*
|
||||
@@ -4371,12 +4362,15 @@ export const zPostWorkspacesCurrentModelProvidersByProviderCredentialsValidatePa
|
||||
export const zPostWorkspacesCurrentModelProvidersByProviderCredentialsValidateResponse =
|
||||
zValidationResultResponse
|
||||
|
||||
export const zDeleteWorkspacesCurrentModelProvidersByProviderModelsBody = zParserDeleteModels
|
||||
|
||||
export const zDeleteWorkspacesCurrentModelProvidersByProviderModelsPath = z.object({
|
||||
provider: z.string(),
|
||||
})
|
||||
|
||||
export const zDeleteWorkspacesCurrentModelProvidersByProviderModelsQuery = z.object({
|
||||
model: z.string(),
|
||||
model_type: z.enum(['llm', 'moderation', 'rerank', 'speech2text', 'text-embedding', 'tts']),
|
||||
})
|
||||
|
||||
/**
|
||||
* Model deleted successfully
|
||||
*/
|
||||
@@ -4403,13 +4397,16 @@ export const zPostWorkspacesCurrentModelProvidersByProviderModelsPath = z.object
|
||||
*/
|
||||
export const zPostWorkspacesCurrentModelProvidersByProviderModelsResponse = zSimpleResultResponse
|
||||
|
||||
export const zDeleteWorkspacesCurrentModelProvidersByProviderModelsCredentialsBody =
|
||||
zParserDeleteCredential
|
||||
|
||||
export const zDeleteWorkspacesCurrentModelProvidersByProviderModelsCredentialsPath = z.object({
|
||||
provider: z.string(),
|
||||
})
|
||||
|
||||
export const zDeleteWorkspacesCurrentModelProvidersByProviderModelsCredentialsQuery = z.object({
|
||||
credential_id: z.string(),
|
||||
model: z.string(),
|
||||
model_type: z.enum(['llm', 'moderation', 'rerank', 'speech2text', 'text-embedding', 'tts']),
|
||||
})
|
||||
|
||||
/**
|
||||
* Credential deleted successfully
|
||||
*/
|
||||
|
||||
@@ -127,7 +127,7 @@ export const useDeleteModelCredential = (provider: string) => {
|
||||
del<{ result: string }>(
|
||||
`/workspaces/current/model-providers/${provider}/models/credentials`,
|
||||
{
|
||||
body: data,
|
||||
params: data,
|
||||
},
|
||||
),
|
||||
})
|
||||
@@ -137,7 +137,7 @@ export const useDeleteModel = (provider: string) => {
|
||||
return useMutation({
|
||||
mutationFn: (data: { model: string; model_type: ModelTypeEnum }) =>
|
||||
del<{ result: string }>(`/workspaces/current/model-providers/${provider}/models`, {
|
||||
body: data,
|
||||
params: data,
|
||||
}),
|
||||
})
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user