refactor(knowledge-fs): remove deprecated buffered service API routes

Drop the deprecated `POST /knowledge-fs/spaces/<id>/queries` route and the
deprecated buffered `POST .../documents` upload from the service API. Both
only ever failed closed; queries go through admission + the query stream,
documents through the durable source import flow. Regenerate the service
contracts and markdown docs accordingly.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015zw5G5SX3HmVfnZof6YWAc
This commit is contained in:
Jyong 2026-09-03 05:59:26 -04:00
parent 06a363509e
commit 180ac5ad4d
7 changed files with 112 additions and 276 deletions

View File

@ -45,7 +45,6 @@ from services.knowledge_fs.product_dto import (
KnowledgeFSDocumentChunkListResponse,
KnowledgeFSDocumentChunkResponse,
KnowledgeFSDocumentCompilationJobResponse,
KnowledgeFSDocumentCreatePayload,
KnowledgeFSDocumentDeletePayload,
KnowledgeFSDocumentListResponse,
KnowledgeFSDocumentMetadataPayload,
@ -59,7 +58,6 @@ from services.knowledge_fs.product_dto import (
KnowledgeFSLogicalDocumentResponse,
KnowledgeFSQueryAdmissionResponse,
KnowledgeFSQueryCreatePayload,
KnowledgeFSQueryResponse,
KnowledgeFSResearchTaskCreatePayload,
KnowledgeFSResearchTaskListResponse,
KnowledgeFSResearchTaskPartialListResponse,
@ -112,7 +110,6 @@ register_schema_models(
KnowledgeFSAdmittedQueryRequest,
KnowledgeFSCursorQuery,
KnowledgeFSDocumentChunkListQuery,
KnowledgeFSDocumentCreatePayload,
KnowledgeFSDocumentDeletePayload,
KnowledgeFSDocumentMetadataPayload,
KnowledgeFSDocumentReindexPayload,
@ -147,7 +144,6 @@ register_response_schema_models(
KnowledgeFSDurableDeletionAcceptedResponse,
KnowledgeFSLogicalDocumentResponse,
KnowledgeFSQueryAdmissionResponse,
KnowledgeFSQueryResponse,
KnowledgeFSResearchTaskListResponse,
KnowledgeFSResearchTaskPartialListResponse,
KnowledgeFSResearchTaskPlanResponse,
@ -335,20 +331,6 @@ class KnowledgeFSServiceDocumentsApi(Resource):
)
return dump_response(KnowledgeFSDocumentListResponse, raw)
@service_api_ns.expect(service_api_ns.models[KnowledgeFSDocumentCreatePayload.__name__])
@service_api_ns.doc(deprecated=True)
@service_api_ns.response(
HTTPStatus.CREATED,
"KnowledgeFS document created",
service_api_ns.models[KnowledgeFSDocumentResponse.__name__],
)
@_service_api_errors
def post(self, control_space_id: str):
_ = control_space_id
raise KnowledgeFSOperationUnavailableError(
"Buffered KnowledgeFS document creation is deprecated; use a Dify API upload BFF"
)
@service_api_ns.route("/knowledge-fs/spaces/<string:control_space_id>/documents/bulk")
class KnowledgeFSServiceBulkDocumentsApi(Resource):
@ -579,23 +561,6 @@ class KnowledgeFSServiceBulkJobApi(Resource):
return dump_response(KnowledgeFSBulkJobResponse, raw)
@service_api_ns.route("/knowledge-fs/spaces/<string:control_space_id>/queries")
class KnowledgeFSServiceQueriesApi(Resource):
@service_api_ns.expect(service_api_ns.models[KnowledgeFSQueryCreatePayload.__name__])
@service_api_ns.doc(deprecated=True)
@service_api_ns.response(
HTTPStatus.ACCEPTED,
"KnowledgeFS query accepted",
service_api_ns.models[KnowledgeFSQueryResponse.__name__],
)
@_service_api_errors
def post(self, control_space_id: str):
_ = control_space_id
raise KnowledgeFSOperationUnavailableError(
"Buffered KnowledgeFS query creation is deprecated; use the queries/admission streaming BFF flow"
)
@service_api_ns.route("/knowledge-fs/spaces/<string:control_space_id>/queries/admission")
class KnowledgeFSServiceQueryAdmissionApi(Resource):
@service_api_ns.expect(service_api_ns.models[KnowledgeFSQueryCreatePayload.__name__])
@ -1078,7 +1043,6 @@ class KnowledgeFSServiceTraceMissingApi(Resource):
__all__ = [
"KnowledgeFSServiceDocumentsApi",
"KnowledgeFSServiceQueriesApi",
"KnowledgeFSServiceResearchTasksApi",
"KnowledgeFSServiceSettingsApi",
"KnowledgeFSServiceSourcesApi",

File diff suppressed because one or more lines are too long

View File

@ -132,7 +132,6 @@ def test_console_and_service_api_routes_are_registered() -> None:
"/knowledge-fs/spaces/<string:control_space_id>/documents/reindex",
"/knowledge-fs/spaces/<string:control_space_id>/jobs/<string:job_id>",
"/knowledge-fs/spaces/<string:control_space_id>/jobs/<string:job_id>/retry",
"/knowledge-fs/spaces/<string:control_space_id>/queries",
"/knowledge-fs/spaces/<string:control_space_id>/queries/admission",
"/knowledge-fs/query-stream",
"/knowledge-fs/spaces/<string:control_space_id>/research-tasks",
@ -428,10 +427,8 @@ def test_knowledge_fs_request_and_response_schemas_are_registered() -> None:
"KnowledgeFSGoldenQuestionEvidenceMatchResponse",
}.issubset(console_ns.models)
assert {
"KnowledgeFSDocumentCreatePayload",
"KnowledgeFSQueryCreatePayload",
"KnowledgeFSDocumentListResponse",
"KnowledgeFSQueryResponse",
"KnowledgeFSResearchTaskListResponse",
"KnowledgeFSSettingsPayload",
"KnowledgeFSSettingsResponse",
@ -1504,3 +1501,4 @@ def test_service_query_admission_uses_broker(monkeypatch: pytest.MonkeyPatch) ->
control_space_id="control-1",
)
assert calls == [{"profile": profile, "operation_id": "createQuery"}]

View File

@ -1392,8 +1392,6 @@ def test_service_credential_routes_validate_profile_before_facade_delegation(
("resource_module", "class_name"),
[
(console_resources, "KnowledgeFSSpaceQueriesApi"),
(service_resources, "KnowledgeFSServiceDocumentsApi"),
(service_resources, "KnowledgeFSServiceQueriesApi"),
],
)
def test_deprecated_buffered_routes_fail_closed(resource_module: object, class_name: str) -> None:

View File

@ -276,20 +276,14 @@ import {
zPostFormHumanInputByFormTokenResponse,
zPostKnowledgeFsQueryStreamBody,
zPostKnowledgeFsQueryStreamResponse,
zPostKnowledgeFsSpacesByControlSpaceIdDocumentsBody,
zPostKnowledgeFsSpacesByControlSpaceIdDocumentsPath,
zPostKnowledgeFsSpacesByControlSpaceIdDocumentsReindexBody,
zPostKnowledgeFsSpacesByControlSpaceIdDocumentsReindexPath,
zPostKnowledgeFsSpacesByControlSpaceIdDocumentsReindexResponse,
zPostKnowledgeFsSpacesByControlSpaceIdDocumentsResponse,
zPostKnowledgeFsSpacesByControlSpaceIdJobsByJobIdRetryPath,
zPostKnowledgeFsSpacesByControlSpaceIdJobsByJobIdRetryResponse,
zPostKnowledgeFsSpacesByControlSpaceIdQueriesAdmissionBody,
zPostKnowledgeFsSpacesByControlSpaceIdQueriesAdmissionPath,
zPostKnowledgeFsSpacesByControlSpaceIdQueriesAdmissionResponse,
zPostKnowledgeFsSpacesByControlSpaceIdQueriesBody,
zPostKnowledgeFsSpacesByControlSpaceIdQueriesPath,
zPostKnowledgeFsSpacesByControlSpaceIdQueriesResponse,
zPostKnowledgeFsSpacesByControlSpaceIdResearchTasksBody,
zPostKnowledgeFsSpacesByControlSpaceIdResearchTasksPath,
zPostKnowledgeFsSpacesByControlSpaceIdResearchTasksPlanBody,
@ -2514,36 +2508,14 @@ export const get31 = oc
)
.output(zGetKnowledgeFsSpacesByControlSpaceIdDocumentsResponse)
/**
* @deprecated
*/
export const post37 = oc
.route({
deprecated: true,
inputStructure: 'detailed',
method: 'POST',
operationId: 'postKnowledgeFsSpacesByControlSpaceIdDocuments',
path: '/knowledge-fs/spaces/{control_space_id}/documents',
successStatus: 201,
tags: ['service_api'],
})
.input(
z.object({
body: zPostKnowledgeFsSpacesByControlSpaceIdDocumentsBody,
params: zPostKnowledgeFsSpacesByControlSpaceIdDocumentsPath,
}),
)
.output(zPostKnowledgeFsSpacesByControlSpaceIdDocumentsResponse)
export const documents2 = {
get: get31,
post: post37,
bulk,
reindex,
byDocumentId: byDocumentId2,
}
export const post38 = oc
export const post37 = oc
.route({
inputStructure: 'detailed',
method: 'POST',
@ -2555,7 +2527,7 @@ export const post38 = oc
.output(zPostKnowledgeFsSpacesByControlSpaceIdJobsByJobIdRetryResponse)
export const retry = {
post: post38,
post: post37,
}
export const delete11 = oc
@ -2590,7 +2562,7 @@ export const jobs = {
byJobId: byJobId3,
}
export const post39 = oc
export const post38 = oc
.route({
inputStructure: 'detailed',
method: 'POST',
@ -2607,36 +2579,14 @@ export const post39 = oc
.output(zPostKnowledgeFsSpacesByControlSpaceIdQueriesAdmissionResponse)
export const admission = {
post: post39,
post: post38,
}
/**
* @deprecated
*/
export const post40 = oc
.route({
deprecated: true,
inputStructure: 'detailed',
method: 'POST',
operationId: 'postKnowledgeFsSpacesByControlSpaceIdQueries',
path: '/knowledge-fs/spaces/{control_space_id}/queries',
successStatus: 202,
tags: ['service_api'],
})
.input(
z.object({
body: zPostKnowledgeFsSpacesByControlSpaceIdQueriesBody,
params: zPostKnowledgeFsSpacesByControlSpaceIdQueriesPath,
}),
)
.output(zPostKnowledgeFsSpacesByControlSpaceIdQueriesResponse)
export const queries = {
post: post40,
admission,
}
export const post41 = oc
export const post39 = oc
.route({
inputStructure: 'detailed',
method: 'POST',
@ -2653,7 +2603,7 @@ export const post41 = oc
.output(zPostKnowledgeFsSpacesByControlSpaceIdResearchTasksPlanResponse)
export const plan = {
post: post41,
post: post39,
}
export const get33 = oc
@ -2720,7 +2670,7 @@ export const get35 = oc
)
.output(zGetKnowledgeFsSpacesByControlSpaceIdResearchTasksResponse)
export const post42 = oc
export const post40 = oc
.route({
inputStructure: 'detailed',
method: 'POST',
@ -2739,7 +2689,7 @@ export const post42 = oc
export const researchTasks = {
get: get35,
post: post42,
post: post40,
plan,
byTaskId: byTaskId3,
}
@ -2776,7 +2726,7 @@ export const settings = {
patch: patch8,
}
export const post43 = oc
export const post41 = oc
.route({
inputStructure: 'detailed',
method: 'POST',
@ -2788,7 +2738,7 @@ export const post43 = oc
.output(zPostKnowledgeFsSpacesByControlSpaceIdSourcesBySourceIdCrawlResponse)
export const crawl = {
post: post43,
post: post41,
}
export const get37 = oc
@ -2811,7 +2761,7 @@ export const files2 = {
get: get37,
}
export const post44 = oc
export const post42 = oc
.route({
inputStructure: 'detailed',
method: 'POST',
@ -2828,10 +2778,10 @@ export const post44 = oc
.output(zPostKnowledgeFsSpacesByControlSpaceIdSourcesBySourceIdImportResponse)
export const import_ = {
post: post44,
post: post42,
}
export const post45 = oc
export const post43 = oc
.route({
inputStructure: 'detailed',
method: 'POST',
@ -2848,7 +2798,7 @@ export const post45 = oc
.output(zPostKnowledgeFsSpacesByControlSpaceIdSourcesBySourceIdImportFilesResponse)
export const importFiles = {
post: post45,
post: post43,
}
export const get38 = oc
@ -2871,7 +2821,7 @@ export const pages = {
get: get38,
}
export const post46 = oc
export const post44 = oc
.route({
inputStructure: 'detailed',
method: 'POST',
@ -2883,7 +2833,7 @@ export const post46 = oc
.output(zPostKnowledgeFsSpacesByControlSpaceIdSourcesBySourceIdTestResponse)
export const test = {
post: post46,
post: post44,
}
export const delete13 = oc
@ -2959,7 +2909,7 @@ export const get40 = oc
)
.output(zGetKnowledgeFsSpacesByControlSpaceIdSourcesResponse)
export const post47 = oc
export const post45 = oc
.route({
inputStructure: 'detailed',
method: 'POST',
@ -2978,7 +2928,7 @@ export const post47 = oc
export const sources = {
get: get40,
post: post47,
post: post45,
bySourceId,
}
@ -3106,7 +3056,7 @@ export const knowledgeFs = {
*
* Submit feedback for a message. End users can rate messages as `like` or `dislike`, and optionally provide text feedback. Pass `null` for `rating` to revoke previously submitted feedback.
*/
export const post48 = oc
export const post46 = oc
.route({
description:
'Submit feedback for a message. End users can rate messages as `like` or `dislike`, and optionally provide text feedback. Pass `null` for `rating` to revoke previously submitted feedback.',
@ -3126,7 +3076,7 @@ export const post48 = oc
.output(zPostMessagesByMessageIdFeedbacksResponse)
export const feedbacks2 = {
post: post48,
post: post46,
}
/**
@ -3256,7 +3206,7 @@ export const site = {
*
* Convert text to speech.
*/
export const post49 = oc
export const post47 = oc
.route({
description: 'Convert text to speech.',
inputStructure: 'detailed',
@ -3270,7 +3220,7 @@ export const post49 = oc
.output(zPostTextToAudioResponse)
export const textToAudio = {
post: post49,
post: post47,
}
/**
@ -3359,7 +3309,7 @@ export const byWorkflowRunId2 = {
*
* Execute a workflow. Cannot be executed without a published workflow.
*/
export const post50 = oc
export const post48 = oc
.route({
description: 'Execute a workflow. Cannot be executed without a published workflow.',
inputStructure: 'detailed',
@ -3373,7 +3323,7 @@ export const post50 = oc
.output(zPostWorkflowsRunResponse)
export const run3 = {
post: post50,
post: post48,
byWorkflowRunId: byWorkflowRunId2,
}
@ -3382,7 +3332,7 @@ export const run3 = {
*
* Stop a running workflow task. Only supported in `streaming` mode.
*/
export const post51 = oc
export const post49 = oc
.route({
description: 'Stop a running workflow task. Only supported in `streaming` mode.',
inputStructure: 'detailed',
@ -3401,7 +3351,7 @@ export const post51 = oc
.output(zPostWorkflowsTasksByTaskIdStopResponse)
export const stop3 = {
post: post51,
post: post49,
}
export const byTaskId4 = {
@ -3417,7 +3367,7 @@ export const tasks = {
*
* Execute a specific workflow version identified by its ID. Useful for running a particular published version of the workflow.
*/
export const post52 = oc
export const post50 = oc
.route({
description:
'Execute a specific workflow version identified by its ID. Useful for running a particular published version of the workflow.',
@ -3437,7 +3387,7 @@ export const post52 = oc
.output(zPostWorkflowsByWorkflowIdRunResponse)
export const run4 = {
post: post52,
post: post50,
}
export const byWorkflowId = {

View File

@ -1386,12 +1386,6 @@ export type KnowledgeFsDocumentCompilationJobResponse = {
version: number
}
export type KnowledgeFsDocumentCreatePayload = {
idempotency_key: string
name: string
text: string
}
export type KnowledgeFsDocumentDeletePayload = {
expectedRevision: number
}
@ -1772,13 +1766,6 @@ export type KnowledgeFsQueryImageResponse = {
upload_file_id: string
}
export type KnowledgeFsQueryResponse = {
answer?: string | null
id: string
status: string
trace_id?: string | null
}
export type KnowledgeFsReadinessCapabilities = {
deep: boolean
index: boolean
@ -5491,22 +5478,6 @@ export type GetKnowledgeFsSpacesByControlSpaceIdDocumentsResponses = {
export type GetKnowledgeFsSpacesByControlSpaceIdDocumentsResponse =
GetKnowledgeFsSpacesByControlSpaceIdDocumentsResponses[keyof GetKnowledgeFsSpacesByControlSpaceIdDocumentsResponses]
export type PostKnowledgeFsSpacesByControlSpaceIdDocumentsData = {
body: KnowledgeFsDocumentCreatePayload
path: {
control_space_id: string
}
query?: never
url: '/knowledge-fs/spaces/{control_space_id}/documents'
}
export type PostKnowledgeFsSpacesByControlSpaceIdDocumentsResponses = {
201: KnowledgeFsDocumentResponse
}
export type PostKnowledgeFsSpacesByControlSpaceIdDocumentsResponse =
PostKnowledgeFsSpacesByControlSpaceIdDocumentsResponses[keyof PostKnowledgeFsSpacesByControlSpaceIdDocumentsResponses]
export type DeleteKnowledgeFsSpacesByControlSpaceIdDocumentsBulkData = {
body: KnowledgeFsBulkDocumentDeletePayload
path: {
@ -5721,22 +5692,6 @@ export type PostKnowledgeFsSpacesByControlSpaceIdJobsByJobIdRetryResponses = {
export type PostKnowledgeFsSpacesByControlSpaceIdJobsByJobIdRetryResponse =
PostKnowledgeFsSpacesByControlSpaceIdJobsByJobIdRetryResponses[keyof PostKnowledgeFsSpacesByControlSpaceIdJobsByJobIdRetryResponses]
export type PostKnowledgeFsSpacesByControlSpaceIdQueriesData = {
body: KnowledgeFsQueryCreatePayload
path: {
control_space_id: string
}
query?: never
url: '/knowledge-fs/spaces/{control_space_id}/queries'
}
export type PostKnowledgeFsSpacesByControlSpaceIdQueriesResponses = {
202: KnowledgeFsQueryResponse
}
export type PostKnowledgeFsSpacesByControlSpaceIdQueriesResponse =
PostKnowledgeFsSpacesByControlSpaceIdQueriesResponses[keyof PostKnowledgeFsSpacesByControlSpaceIdQueriesResponses]
export type PostKnowledgeFsSpacesByControlSpaceIdQueriesAdmissionData = {
body: KnowledgeFsQueryCreatePayload
path: {

View File

@ -1545,15 +1545,6 @@ export const zKnowledgeFsDocumentCompilationJobResponse = z.object({
version: z.int().gte(1),
})
/**
* KnowledgeFSDocumentCreatePayload
*/
export const zKnowledgeFsDocumentCreatePayload = z.object({
idempotency_key: z.string().min(1).max(255),
name: z.string().min(1).max(255),
text: z.string().min(1).max(1000000),
})
/**
* KnowledgeFSDocumentDeletePayload
*/
@ -2070,16 +2061,6 @@ export const zKnowledgeFsAnswerTraceResponse = z.object({
steps: z.array(zKnowledgeFsAnswerTraceStepResponse),
})
/**
* KnowledgeFSQueryResponse
*/
export const zKnowledgeFsQueryResponse = z.object({
answer: z.string().nullish(),
id: z.string(),
status: z.string(),
trace_id: z.string().nullish(),
})
/**
* KnowledgeFSReadinessCapabilities
*/
@ -5552,17 +5533,6 @@ export const zGetKnowledgeFsSpacesByControlSpaceIdDocumentsQuery = z.object({
export const zGetKnowledgeFsSpacesByControlSpaceIdDocumentsResponse =
zKnowledgeFsDocumentListResponse
export const zPostKnowledgeFsSpacesByControlSpaceIdDocumentsBody = zKnowledgeFsDocumentCreatePayload
export const zPostKnowledgeFsSpacesByControlSpaceIdDocumentsPath = z.object({
control_space_id: z.string(),
})
/**
* KnowledgeFS document created
*/
export const zPostKnowledgeFsSpacesByControlSpaceIdDocumentsResponse = zKnowledgeFsDocumentResponse
export const zDeleteKnowledgeFsSpacesByControlSpaceIdDocumentsBulkBody =
zKnowledgeFsBulkDocumentDeletePayload
@ -5720,17 +5690,6 @@ export const zPostKnowledgeFsSpacesByControlSpaceIdJobsByJobIdRetryPath = z.obje
export const zPostKnowledgeFsSpacesByControlSpaceIdJobsByJobIdRetryResponse =
zKnowledgeFsDocumentCompilationJobResponse
export const zPostKnowledgeFsSpacesByControlSpaceIdQueriesBody = zKnowledgeFsQueryCreatePayload
export const zPostKnowledgeFsSpacesByControlSpaceIdQueriesPath = z.object({
control_space_id: z.string(),
})
/**
* KnowledgeFS query accepted
*/
export const zPostKnowledgeFsSpacesByControlSpaceIdQueriesResponse = zKnowledgeFsQueryResponse
export const zPostKnowledgeFsSpacesByControlSpaceIdQueriesAdmissionBody =
zKnowledgeFsQueryCreatePayload