ikc-sdk-lib 0.1.0__py3-none-any.whl

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.
Files changed (41) hide show
  1. ikc_sdk/__init__.py +13 -0
  2. ikc_sdk/_version.py +1 -0
  3. ikc_sdk/core/__init__.py +123 -0
  4. ikc_sdk/core/api/__init__.py +11 -0
  5. ikc_sdk/core/api/document/__init__.py +10 -0
  6. ikc_sdk/core/api/document/get.py +5 -0
  7. ikc_sdk/core/api/document/ingest.py +5 -0
  8. ikc_sdk/core/api/document/ingest_and_parse.py +6 -0
  9. ikc_sdk/core/api/document/parse.py +6 -0
  10. ikc_sdk/core/api/document/parse_result/__init__.py +7 -0
  11. ikc_sdk/core/api/document/parse_result/download.py +6 -0
  12. ikc_sdk/core/api/document/parse_result/issue_ticket.py +6 -0
  13. ikc_sdk/core/api/document/parse_result/query.py +6 -0
  14. ikc_sdk/core/api/document/upload.py +6 -0
  15. ikc_sdk/core/api/knowledge_base/__init__.py +8 -0
  16. ikc_sdk/core/api/knowledge_base/create.py +5 -0
  17. ikc_sdk/core/api/knowledge_base/get.py +5 -0
  18. ikc_sdk/core/api/knowledge_base/query.py +5 -0
  19. ikc_sdk/core/api/knowledge_base/update.py +5 -0
  20. ikc_sdk/core/api/parse/__init__.py +27 -0
  21. ikc_sdk/core/api/parse/direct.py +94 -0
  22. ikc_sdk/core/api/parse/download.py +24 -0
  23. ikc_sdk/core/api/parse/query.py +24 -0
  24. ikc_sdk/core/api/search/__init__.py +7 -0
  25. ikc_sdk/core/api/search/deep.py +6 -0
  26. ikc_sdk/core/api/search/query.py +6 -0
  27. ikc_sdk/core/api/search/universal.py +6 -0
  28. ikc_sdk/core/enums.py +171 -0
  29. ikc_sdk/core/models/__init__.py +45 -0
  30. ikc_sdk/core/models/chunking.py +35 -0
  31. ikc_sdk/core/models/envelope.py +36 -0
  32. ikc_sdk/core/models/model.py +48 -0
  33. ikc_sdk/core/models/output.py +20 -0
  34. ikc_sdk/core/models/parsing.py +38 -0
  35. ikc_sdk/core/models/prompt.py +17 -0
  36. ikc_sdk/core/models/source.py +124 -0
  37. ikc_sdk/core/models/task.py +60 -0
  38. ikc_sdk_lib-0.1.0.dist-info/METADATA +110 -0
  39. ikc_sdk_lib-0.1.0.dist-info/RECORD +41 -0
  40. ikc_sdk_lib-0.1.0.dist-info/WHEEL +5 -0
  41. ikc_sdk_lib-0.1.0.dist-info/top_level.txt +1 -0
ikc_sdk/__init__.py ADDED
@@ -0,0 +1,13 @@
1
+ """IKC SDK 家族命名空间
2
+
3
+ 当前包含一个核心 SDK:
4
+ - core:IKC RAG 对外接口请求/响应模型契约(docs/RAG SDK接口.xlsx 四接口)
5
+
6
+ 后续新增 SDK 以 `ikc_sdk.<sdk_name>` 兄弟子包扩展,并在本文件评估是否合并导出。
7
+ 既有的 `from ikc_sdk import <name>` 用法由 core 再导出保持兼容。
8
+ """
9
+ from . import core
10
+ from ._version import __version__
11
+ from .core import * # noqa: F401,F403 # 兼容既有顶层导入
12
+
13
+ __all__ = list(dict.fromkeys(["core", "__version__", *core.__all__]))
ikc_sdk/_version.py ADDED
@@ -0,0 +1 @@
1
+ __version__ = "0.1.0"
@@ -0,0 +1,123 @@
1
+ """IKC RAG 对外接口核心 SDK(core)
2
+
3
+ 当前范围:docs/RAG SDK接口.xlsx 定义的 4 个免知识库接口的请求/响应模型:
4
+ 1. 独立解析(免知识库)SERVICE —— ServiceParseDirectRequest / ParseResponse
5
+ 2. 独立解析(免知识库)SDK —— SdkParseDirectRequest / ParseResponse
6
+ 3. 查询解析结果(免知识库)SDK —— QueryParseResultRequest / QueryParseResultResponse
7
+ 4. 下载解析结果(免知识库)SDK —— DownloadParseResultRequest / DownloadParseResultResponse
8
+
9
+ 定位:SDK 版请求面向 API 调用方(source 自声明),SERVICE 版为 API 之后调用后端
10
+ service(source 指向已登记文档);两版以 ParseDirectRequestBase 为基类派生,
11
+ 类名严格遵循 Excel Sheet 定义。查询 / 下载接口独立定义,严格遵循 Excel。
12
+ 契约权威:AGENTS.md + 当前代码 > docs/RAG SDK接口.xlsx;字段命名(camelCase)
13
+ 与枚举值一律以 Excel 为准(含 Excel 原文拼写,如 keyswordNum / Pormpt)。
14
+ """
15
+ from ikc_sdk._version import __version__
16
+
17
+ from .api.parse import (
18
+ DownloadParseResultRequest,
19
+ DownloadParseResultResponse,
20
+ ParseDirectRequestBase,
21
+ ParseResponse,
22
+ QueryParseResultRequest,
23
+ QueryParseResultResponse,
24
+ SdkParseDirectRequest,
25
+ ServiceParseDirectRequest,
26
+ )
27
+ from .enums import (
28
+ ChunkType,
29
+ DocumentCategory,
30
+ DocumentFormat,
31
+ ExecutionMode,
32
+ FinalTaskStatus,
33
+ ImageEncoding,
34
+ ImageParsingMode,
35
+ MetadataMode,
36
+ OutputFormat,
37
+ OwnerType,
38
+ ParsingFlag,
39
+ ProcessingOperation,
40
+ ProcessingStage,
41
+ QaScope,
42
+ SourceType,
43
+ SubTaskStatus,
44
+ TaskStatus,
45
+ )
46
+ from .models import (
47
+ ChunkAugmentationOptions,
48
+ ChunkingOptions,
49
+ DeclaredSource,
50
+ DocumentAugmentation,
51
+ DocumentIngestionTask,
52
+ Envelope,
53
+ ModelConfig,
54
+ ModelReferences,
55
+ ObjectStorage,
56
+ OutputOptions,
57
+ ParsingOptions,
58
+ ProcessingTask,
59
+ PromptDetail,
60
+ QaGenerationOptions,
61
+ RegisteredMetadata,
62
+ RegisteredSource,
63
+ ResultArtifact,
64
+ SourceMetadata,
65
+ StorageTarget,
66
+ SubTask,
67
+ TaskEnvelope,
68
+ )
69
+
70
+ __all__ = [
71
+ "__version__",
72
+ # 枚举
73
+ "ChunkType",
74
+ "DocumentCategory",
75
+ "DocumentFormat",
76
+ "ExecutionMode",
77
+ "FinalTaskStatus",
78
+ "ImageEncoding",
79
+ "ImageParsingMode",
80
+ "MetadataMode",
81
+ "OutputFormat",
82
+ "OwnerType",
83
+ "ParsingFlag",
84
+ "ProcessingOperation",
85
+ "ProcessingStage",
86
+ "QaScope",
87
+ "SourceType",
88
+ "SubTaskStatus",
89
+ "TaskStatus",
90
+ # 共享模型
91
+ "ChunkAugmentationOptions",
92
+ "ChunkingOptions",
93
+ "DeclaredSource",
94
+ "DocumentAugmentation",
95
+ "DocumentIngestionTask",
96
+ "Envelope",
97
+ "ModelConfig",
98
+ "ModelReferences",
99
+ "ObjectStorage",
100
+ "OutputOptions",
101
+ "ParsingOptions",
102
+ "ProcessingTask",
103
+ "PromptDetail",
104
+ "QaGenerationOptions",
105
+ "RegisteredMetadata",
106
+ "RegisteredSource",
107
+ "ResultArtifact",
108
+ "SourceMetadata",
109
+ "StorageTarget",
110
+ "SubTask",
111
+ "TaskEnvelope",
112
+ # 独立解析(免知识库)SERVICE / SDK
113
+ "ParseDirectRequestBase",
114
+ "ParseResponse",
115
+ "SdkParseDirectRequest",
116
+ "ServiceParseDirectRequest",
117
+ # 查询解析结果(免知识库)SDK
118
+ "QueryParseResultRequest",
119
+ "QueryParseResultResponse",
120
+ # 下载解析结果(免知识库)SDK
121
+ "DownloadParseResultRequest",
122
+ "DownloadParseResultResponse",
123
+ ]
@@ -0,0 +1,11 @@
1
+ """对外接口分包
2
+
3
+ 按能力域组织(一文件一接口,`<action>.py`):
4
+ - parse/ 解析域:已定义(对应 docs/RAG SDK接口.xlsx 四张 Sheet)
5
+ - direct.py 独立解析(免知识库)SERVICE / SDK(基类 + 两版请求 + ParseResponse)
6
+ - query.py 查询解析结果(免知识库)
7
+ - download.py 下载解析结果(免知识库)
8
+ - knowledge_base/ 知识库域:占位,契约待定义(create/update/get/query)
9
+ - document/ 文档域:占位,契约待定义(ingest/parse/ingest_and_parse/upload/get/parse_result/)
10
+ - search/ 检索域:占位,契约待定义(universal/deep/query)
11
+ """
@@ -0,0 +1,10 @@
1
+ """文档域(占位)
2
+
3
+ 接口契约待 docs/RAG SDK接口.xlsx 增补后定义,当前仅目录骨架,不定义模型:
4
+ - ingest.py 接入知识源(URL/文件/目录/压缩包)
5
+ - parse.py 启动文档解析(需库流程)
6
+ - ingest_and_parse.py 一体化接入并解析
7
+ - upload.py 文档上传暂存(7 天)
8
+ - get.py 查询文档信息
9
+ - parse_result/ 解析结果子域:query / issue_ticket / download
10
+ """
@@ -0,0 +1,5 @@
1
+ """按文档 ID 查询文档基础信息与接入状态
2
+
3
+ 占位:契约待 docs/RAG SDK接口.xlsx 定义(参考 open-ikc B-07,GET /knowledge-documents/{doc_id})。
4
+ 暂不定义请求/响应模型。
5
+ """
@@ -0,0 +1,5 @@
1
+ """接入知识源(URL/文件/目录/压缩包)并登记到指定知识库
2
+
3
+ 占位:契约待 docs/RAG SDK接口.xlsx 定义(参考 open-ikc B-01,POST /knowledge-documents/ingest)。
4
+ 暂不定义请求/响应模型。
5
+ """
@@ -0,0 +1,6 @@
1
+ """一体化快捷入口:接入并解析
2
+
3
+ 占位:契约待 docs/RAG SDK接口.xlsx 定义(参考 open-ikc B-06,POST /knowledge-documents/ingest-and-parse)。
4
+ 内部仍为「接入 + 解析」两阶段,对外一次请求。
5
+ 暂不定义请求/响应模型。
6
+ """
@@ -0,0 +1,6 @@
1
+ """启动文档解析(需库流程)
2
+
3
+ 占位:契约待 docs/RAG SDK接口.xlsx 定义(参考 open-ikc B-02,POST /knowledge-documents/parse)。
4
+ 与 api/parse/direct.py(免库独立解析)区分:本接口要求文档已登记且携带 kbId。
5
+ 暂不定义请求/响应模型。
6
+ """
@@ -0,0 +1,7 @@
1
+ """解析结果子域(需库流程,占位)
2
+
3
+ 契约待 docs/RAG SDK接口.xlsx 增补后定义(参考 open-ikc B-03/B-04/B-05):
4
+ - query.py 查询解析结果
5
+ - issue_ticket.py 获取解析结果下载凭证
6
+ - download.py 下载解析结果
7
+ """
@@ -0,0 +1,6 @@
1
+ """下载解析结果(需库流程)
2
+
3
+ 占位:契约待 docs/RAG SDK接口.xlsx 定义(参考 open-ikc B-05,GET /knowledge-documents/parse-result/download)。
4
+ 与 api/parse/download.py(免库 SDK 版)区分:本接口以 kbId + docId + 下载凭证定位。
5
+ 暂不定义请求/响应模型。
6
+ """
@@ -0,0 +1,6 @@
1
+ """获取解析结果下载凭证
2
+
3
+ 占位:契约待 docs/RAG SDK接口.xlsx 定义(参考 open-ikc B-04,GET /knowledge-documents/parse-result/issue-download-ticket)。
4
+ 解析结果较大或要求文件下载时,先申请短时下载凭证再下载。
5
+ 暂不定义请求/响应模型。
6
+ """
@@ -0,0 +1,6 @@
1
+ """查询解析结果(需库流程)
2
+
3
+ 占位:契约待 docs/RAG SDK接口.xlsx 定义(参考 open-ikc B-03,GET /knowledge-documents/parse-result/query)。
4
+ 与 api/parse/query.py(免库 SDK 版)区分:本接口以 kbId + docId 定位。
5
+ 暂不定义请求/响应模型。
6
+ """
@@ -0,0 +1,6 @@
1
+ """文档上传暂存(7 天)
2
+
3
+ 占位:契约待 docs/RAG SDK接口.xlsx 定义(参考 open-ikc B-02.2)。
4
+ 上传单个文档文件,平台暂存 7 天并返回临时访问地址;不创建知识库、不登记文档。
5
+ 暂不定义请求/响应模型。
6
+ """
@@ -0,0 +1,8 @@
1
+ """知识库域(占位)
2
+
3
+ 接口契约待 docs/RAG SDK接口.xlsx 增补后定义,当前仅目录骨架,不定义模型:
4
+ - create.py 创建知识库
5
+ - update.py 修改知识库信息
6
+ - get.py 按 ID 查询知识库详情
7
+ - query.py 分页查询知识库列表
8
+ """
@@ -0,0 +1,5 @@
1
+ """创建知识库
2
+
3
+ 占位:契约待 docs/RAG SDK接口.xlsx 定义(参考 open-ikc A-01,POST /knowledge-bases/create)。
4
+ 暂不定义请求/响应模型。
5
+ """
@@ -0,0 +1,5 @@
1
+ """按 ID 查询知识库详情
2
+
3
+ 占位:契约待 docs/RAG SDK接口.xlsx 定义(参考 open-ikc A-03,GET /knowledge-bases/{kb_id})。
4
+ 暂不定义请求/响应模型。
5
+ """
@@ -0,0 +1,5 @@
1
+ """分页查询知识库列表
2
+
3
+ 占位:契约待 docs/RAG SDK接口.xlsx 定义(参考 open-ikc A-04,POST /knowledge-bases/query)。
4
+ 暂不定义请求/响应模型。
5
+ """
@@ -0,0 +1,5 @@
1
+ """修改知识库信息
2
+
3
+ 占位:契约待 docs/RAG SDK接口.xlsx 定义(参考 open-ikc A-02,POST /knowledge-bases/update)。
4
+ 暂不定义请求/响应模型。
5
+ """
@@ -0,0 +1,27 @@
1
+ """解析域接口(独立解析 / 查询解析结果 / 下载解析结果)
2
+
3
+ 对应 docs/RAG SDK接口.xlsx 四张 Sheet,当前全部为免知识库场景:
4
+ - direct.py 独立解析(免知识库)SERVICE / SDK:基类 ParseDirectRequestBase
5
+ + ServiceParseDirectRequest / SdkParseDirectRequest + ParseResponse
6
+ - query.py 查询解析结果(免知识库)SDK
7
+ - download.py 下载解析结果(免知识库)SDK
8
+ """
9
+ from .direct import (
10
+ ParseDirectRequestBase,
11
+ ParseResponse,
12
+ SdkParseDirectRequest,
13
+ ServiceParseDirectRequest,
14
+ )
15
+ from .download import DownloadParseResultRequest, DownloadParseResultResponse
16
+ from .query import QueryParseResultRequest, QueryParseResultResponse
17
+
18
+ __all__ = [
19
+ "DownloadParseResultRequest",
20
+ "DownloadParseResultResponse",
21
+ "ParseDirectRequestBase",
22
+ "ParseResponse",
23
+ "QueryParseResultRequest",
24
+ "QueryParseResultResponse",
25
+ "SdkParseDirectRequest",
26
+ "ServiceParseDirectRequest",
27
+ ]
@@ -0,0 +1,94 @@
1
+ """独立解析(免知识库):SERVICE / SDK 两版请求与共用响应
2
+
3
+ 对应 docs/RAG SDK接口.xlsx「解析--独立解析(免知识库)SERVICE / SDK」两个 Sheet。
4
+ 两版请求以 ParseDirectRequestBase 为基类派生,仅 source 不同:
5
+ - SdkParseDirectRequest 面向 API 调用方(source 自声明,DeclaredSource)
6
+ - ServiceParseDirectRequest API 之后调用后端 service(source 指向已登记文档,RegisteredSource)
7
+ """
8
+ from __future__ import annotations
9
+
10
+ from typing import Optional
11
+
12
+ from pydantic import BaseModel, Field
13
+
14
+ from ikc_sdk.core.enums import ExecutionMode, ProcessingOperation
15
+ from ikc_sdk.core.models.chunking import ChunkAugmentationOptions, ChunkingOptions
16
+ from ikc_sdk.core.models.envelope import TaskEnvelope
17
+ from ikc_sdk.core.models.model import ModelReferences, QaGenerationOptions
18
+ from ikc_sdk.core.models.output import OutputOptions
19
+ from ikc_sdk.core.models.parsing import DocumentAugmentation, ParsingOptions
20
+ from ikc_sdk.core.models.prompt import PromptDetail
21
+ from ikc_sdk.core.models.source import DeclaredSource, RegisteredSource
22
+ from ikc_sdk.core.models.task import DocumentIngestionTask
23
+
24
+
25
+ class ParseDirectRequestBase(BaseModel):
26
+ """独立解析(免知识库)请求公共字段基类
27
+
28
+ SERVICE / SDK 两版请求均以本类为基类派生,仅 source 字段不同。
29
+ """
30
+ reqId: Optional[str] = Field(
31
+ None, description="请求幂等标识,如无传入网关层自动生成"
32
+ )
33
+ traceId: Optional[str] = Field(
34
+ None, description="请求链路追踪 ID,如无传入网关层自动生成"
35
+ )
36
+ taskId: Optional[str] = Field(
37
+ None, description="当前任务 ID,如无传入网关层自动生成"
38
+ )
39
+ processingOperation: ProcessingOperation = Field(..., description="处理流程选项")
40
+ parsing: ParsingOptions = Field(..., description="解析策略")
41
+ documentAugmentation: Optional[DocumentAugmentation] = Field(
42
+ None, description="全文增强配置"
43
+ )
44
+ models: Optional[ModelReferences] = Field(
45
+ None, description="模型配置,不传入时默认读取系统配置"
46
+ )
47
+ qaGeneration: Optional[QaGenerationOptions] = Field(
48
+ None, description="问答对提取策略"
49
+ )
50
+ chunking: Optional[ChunkingOptions] = Field(
51
+ None,
52
+ description="分段策略,processingOperation 为 EXTRACT_CHUNK / "
53
+ "EXTRACT_CHUNK_EMBED / EXTRACT_CHUNK_EMBED_STORE 时必选",
54
+ )
55
+ chunkAugmentation: Optional[ChunkAugmentationOptions] = Field(
56
+ None, description="分段增强配置"
57
+ )
58
+ executeMode: Optional[ExecutionMode] = Field(
59
+ ExecutionMode.ASYNC, description="执行模式,默认 ASYNC"
60
+ )
61
+ output: OutputOptions = Field(..., description="返回格式配置")
62
+ prompts: Optional[PromptDetail] = Field(None, description="提示词清单")
63
+
64
+
65
+ class ServiceParseDirectRequest(ParseDirectRequestBase):
66
+ """SERVICE 版独立解析(免知识库)请求参数
67
+
68
+ 定位:API 网关校验编排后,调用后端 service 时使用;source 指向知识管理库已登记文档。
69
+ 与 SDK 版的强制性区别:
70
+ - source 为 RegisteredSource:无 type / objectStorage / uploadToken,metadata.docId 必填
71
+ """
72
+
73
+ source: RegisteredSource = Field(
74
+ ..., description="已登记文档来源(SERVICE 版:docId 必填)"
75
+ )
76
+
77
+
78
+ class SdkParseDirectRequest(ParseDirectRequestBase):
79
+ """SDK 版独立解析(免知识库)请求参数
80
+
81
+ 定位:面向 API 调用方;source 由调用方自声明。
82
+ 与 SERVICE 版的强制性区别:
83
+ - source 为 DeclaredSource:type 必填,url / objectStorage / uploadToken 三选一
84
+ - source.metadata 不含 docId 字段
85
+ """
86
+
87
+ source: DeclaredSource = Field(
88
+ ...,
89
+ description="来源自声明(SDK 版:type 必填,url/objectStorage/uploadToken 三选一)",
90
+ )
91
+
92
+
93
+ class ParseResponse(TaskEnvelope[DocumentIngestionTask]):
94
+ """独立解析(免知识库)响应(SERVICE / SDK 共用出参)"""
@@ -0,0 +1,24 @@
1
+ """下载解析结果(免知识库)
2
+
3
+ 对应 docs/RAG SDK接口.xlsx「下载解析结果(免知识库)SDK」Sheet。
4
+ """
5
+ from __future__ import annotations
6
+
7
+ from typing import Optional
8
+
9
+ from pydantic import BaseModel, Field
10
+
11
+ from ikc_sdk.core.models.envelope import TaskEnvelope
12
+ from ikc_sdk.core.models.task import DocumentIngestionTask
13
+
14
+
15
+ class DownloadParseResultRequest(BaseModel):
16
+ """下载解析结果(免知识库)请求参数"""
17
+ reqId: Optional[str] = Field(
18
+ None, description="请求标识,请求时返回的经过校验的 reqId"
19
+ )
20
+ taskId: str = Field(..., description="下载任务 ID")
21
+
22
+
23
+ class DownloadParseResultResponse(TaskEnvelope[DocumentIngestionTask]):
24
+ """下载解析结果(免知识库)响应"""
@@ -0,0 +1,24 @@
1
+ """查询解析结果(免知识库)
2
+
3
+ 对应 docs/RAG SDK接口.xlsx「查询解析结果(免知识库)SDK」Sheet。
4
+ """
5
+ from __future__ import annotations
6
+
7
+ from typing import Optional
8
+
9
+ from pydantic import BaseModel, Field
10
+
11
+ from ikc_sdk.core.models.envelope import Envelope
12
+ from ikc_sdk.core.models.task import ProcessingTask
13
+
14
+
15
+ class QueryParseResultRequest(BaseModel):
16
+ """查询解析结果(免知识库)请求参数"""
17
+ reqId: Optional[str] = Field(
18
+ None, description="请求标识,请求时返回的经过校验的 reqId"
19
+ )
20
+ taskId: str = Field(..., description="查询任务 ID")
21
+
22
+
23
+ class QueryParseResultResponse(Envelope[ProcessingTask]):
24
+ """查询解析结果(免知识库)响应"""
@@ -0,0 +1,7 @@
1
+ """检索域(占位)
2
+
3
+ 接口契约待 docs/RAG SDK接口.xlsx 增补后定义,当前仅目录骨架,不定义模型:
4
+ - universal.py 普通检索(证据列表)
5
+ - deep.py 深度检索(Agentic 多轮 + 带引用回答)
6
+ - query.py 兼容别名(指向普通检索)
7
+ """
@@ -0,0 +1,6 @@
1
+ """深度检索(Agentic 多轮 + 带引用回答)
2
+
3
+ 占位:契约待 docs/RAG SDK接口.xlsx 定义(参考 open-ikc D-02,POST /knowledge-search/deep-search)。
4
+ 子查询规划、并行多轮召回、反思与回答生成;权限收敛与普通检索一致。
5
+ 暂不定义请求/响应模型。
6
+ """
@@ -0,0 +1,6 @@
1
+ """兼容别名:普通检索
2
+
3
+ 占位:契约待 docs/RAG SDK接口.xlsx 定义(参考 open-ikc D-01 兼容别名,POST /knowledge-search/query)。
4
+ 指向普通检索(universal),仅为兼容历史调用方保留。
5
+ 暂不定义请求/响应模型。
6
+ """
@@ -0,0 +1,6 @@
1
+ """普通检索(证据列表)
2
+
3
+ 占位:契约待 docs/RAG SDK接口.xlsx 定义(参考 open-ikc D-01,POST /knowledge-search/universal-search)。
4
+ 支持全文/向量/混合检索、可选重排、分数阈值过滤;结果按调用方数据权限过滤。
5
+ 暂不定义请求/响应模型。
6
+ """
ikc_sdk/core/enums.py ADDED
@@ -0,0 +1,171 @@
1
+ """IKC RAG SDK 枚举类型定义
2
+
3
+ 取值以 docs/RAG SDK接口.xlsx 各 Sheet「取值说明」列为准,禁止私自增删改枚举值。
4
+ """
5
+ from enum import Enum
6
+
7
+
8
+ class ProcessingOperation(str, Enum):
9
+ """处理流程选项"""
10
+ EXTRACT = "EXTRACT" # 全文解析
11
+ EXTRACT_CHUNK = "EXTRACT_CHUNK" # 全文解析+全文分段
12
+ EXTRACT_CHUNK_EMBED_STORE = "EXTRACT_CHUNK_EMBED_STORE" # 全文解析+全文分段+全文向量化+全文向量化入库
13
+ EMBED_STORE = "EMBED_STORE" # 内容向量化+内容向量化入库
14
+ EXTRACT_CHUNK_EMBED = "EXTRACT_CHUNK_EMBED" # 全文抽取+全文分段+全文向量化
15
+ EMBED = "EMBED" # 内容向量化
16
+ EXTRACT_PAGES_TEXT = "EXTRACT_PAGES_TEXT" # 按页提取文本
17
+
18
+
19
+ class SourceType(str, Enum):
20
+ """文件来源类型"""
21
+ URL = "URL" # 链接抓取
22
+ OBJECT_STORAGE = "OBJECT_STORAGE" # 文件对象
23
+ UPLOAD_TOKEN = "UPLOAD_TOKEN" # 文件标识
24
+
25
+
26
+ class OwnerType(str, Enum):
27
+ """知识库归属类型"""
28
+ PERSONAL = "PERSONAL" # 个人
29
+ TEAM = "TEAM" # 团队
30
+ ENTERPRISE = "ENTERPRISE" # 企业
31
+
32
+
33
+ class DocumentFormat(str, Enum):
34
+ """文档类型(文件后缀)"""
35
+ DOC = "doc"
36
+ DOCX = "docx"
37
+ PPT = "ppt"
38
+ PPTX = "pptx"
39
+ XLS = "xls"
40
+ XLSX = "xlsx"
41
+ WPS = "wps"
42
+ WAV = "wav"
43
+ M4A = "m4a"
44
+ MP3 = "mp3"
45
+ FLV = "flv"
46
+ TS = "ts"
47
+ MP4 = "mp4"
48
+ GIF = "gif"
49
+ JPEG = "jpeg"
50
+ JPG = "jpg"
51
+ WEBP = "webp"
52
+ SVG = "svg"
53
+ PNG = "png"
54
+ CSV = "csv"
55
+ MD = "md"
56
+ PDF = "pdf"
57
+ TXT = "txt"
58
+ HTML = "html"
59
+ HTM = "htm"
60
+
61
+
62
+ class DocumentCategory(str, Enum):
63
+ """文档分类"""
64
+ GENERAL = "GENERAL" # 通用文档
65
+ CONTRACT = "CONTRACT" # 合同文档
66
+ BIDDOC = "BIDDOC" # 投标文件
67
+
68
+
69
+ class ParsingFlag(str, Enum):
70
+ """解析标志位(Excel 中列名为 parsingOptions)"""
71
+ PARSE_IMAGE = "PARSE_IMAGE" # 解析图片
72
+ PARSE_TABLE = "PARSE_TABLE" # 解析表格
73
+ PARSE_ATTACHMENT = "PARSE_ATTACHMENT" # 解析附件
74
+ CLEAN_HEADER_FOOTER = "CLEAN_HEADER_FOOTER" # 清理页眉页脚
75
+ CLEAN_TOC = "CLEAN_TOC" # 清理目录
76
+ REMOVE_WATERMARKS = "REMOVE_WATERMARKS" # 去除水印
77
+ REMOVE_PASSWORD = "REMOVE_PASSWORD" # 去除密码
78
+
79
+
80
+ class ImageParsingMode(str, Enum):
81
+ """图片解析模型类型"""
82
+ OCR = "OCR"
83
+ MLLM = "MLLM"
84
+ PADDLE_OCR = "PADDLE_OCR"
85
+
86
+
87
+ class ChunkType(str, Enum):
88
+ """分段类型"""
89
+ CHUNK_BY_FIXED_LENGTH = "CHUNK_BY_FIXED_LENGTH" # 按固定长度分段
90
+ CHUNK_BY_SEMANTIC = "CHUNK_BY_SEMANTIC" # 按语义边界分段
91
+ CHUNK_BY_SCENE = "CHUNK_BY_SCENE" # 按场景切换分段
92
+ CHUNK_BY_DURATION = "CHUNK_BY_DURATION" # 按时长间隔分段
93
+ CHUNK_BY_DIRECTORY_HIERARCHY = "CHUNK_BY_DIRECTORY_HIERARCHY" # 按目录结构父子层级分段
94
+ CHUNK_BY_PAGE = "CHUNK_BY_PAGE" # 按物理页分段
95
+ CHUNK_BY_LINE = "CHUNK_BY_LINE" # 按行分段
96
+ CHUNK_BY_COLUMN = "CHUNK_BY_COLUMN" # 按列分段
97
+ CHUNK_BY_MULTI_DIM = "CHUNK_BY_MULTI_DIM" # 多维度组合分段
98
+
99
+
100
+ class ExecutionMode(str, Enum):
101
+ """执行模式"""
102
+ SYNC = "SYNC" # 同步执行
103
+ ASYNC = "ASYNC" # 异步执行
104
+
105
+
106
+ class OutputFormat(str, Enum):
107
+ """输出格式"""
108
+ MARKDOWN = "MARKDOWN"
109
+ MARKDOWN_WITH_LAYOUT = "MARKDOWN_WITH_LAYOUT"
110
+ INTERMEDIATE_JSON = "INTERMEDIATE_JSON"
111
+ CHUNKS_JSON = "CHUNKS_JSON"
112
+
113
+
114
+ class ImageEncoding(str, Enum):
115
+ """图片返回格式"""
116
+ URL = "URL"
117
+ BASE64 = "BASE64"
118
+
119
+
120
+ class QaScope(str, Enum):
121
+ """问答对提取方式"""
122
+ PER_DOCUMENT = "PER_DOCUMENT" # 全文模式
123
+ PER_CHUNK = "PER_CHUNK" # 分段模式
124
+
125
+
126
+ class MetadataMode(str, Enum):
127
+ """元数据筛选方式"""
128
+ FILTER = "FILTER" # 过滤模式
129
+ INHERIT = "INHERIT" # 继承模式
130
+
131
+
132
+ class TaskStatus(str, Enum):
133
+ """任务状态"""
134
+ PENDING = "PENDING"
135
+ RUNNING = "RUNNING"
136
+ SUCCEEDED = "SUCCEEDED"
137
+ FAILED = "FAILED"
138
+ CANCELLED = "CANCELLED"
139
+ EXPIRED = "EXPIRED"
140
+
141
+
142
+ class FinalTaskStatus(str, Enum):
143
+ """最终任务状态"""
144
+ PENDING = "PENDING"
145
+ SUCCEEDED = "SUCCEEDED"
146
+ FAILED = "FAILED"
147
+ CANCELLED = "CANCELLED"
148
+
149
+
150
+ class ProcessingStage(str, Enum):
151
+ """处理阶段"""
152
+ SOURCE_INGESTION = "SOURCE_INGESTION" # 来源接收
153
+ FILE_CONVERSION = "FILE_CONVERSION" # 文档转换
154
+ CONTENT_EXTRACTION = "CONTENT_EXTRACTION" # 文档解析
155
+ DOCUMENT_AUGMENTATION = "DOCUMENT_AUGMENTATION" # 文档元数据提取
156
+ CHUNKING = "CHUNKING" # 文档分段
157
+ CHUNK_AUGMENTATION = "CHUNK_AUGMENTATION" # 分段元数据提取
158
+ QA_GENERATION = "QA_GENERATION" # 问答对生成
159
+ EMBEDDING = "EMBEDDING" # 向量化
160
+ STORAGE = "STORAGE" # 存储入库
161
+ RESULT_GENERATION = "RESULT_GENERATION" # 结果生成
162
+
163
+
164
+ class SubTaskStatus(str, Enum):
165
+ """子任务状态"""
166
+ WAITING = "WAITING"
167
+ RUNNING = "RUNNING"
168
+ SUCCEEDED = "SUCCEEDED"
169
+ FAILED = "FAILED"
170
+ CANCELLED = "CANCELLED"
171
+ SKIPPED = "SKIPPED"
@@ -0,0 +1,45 @@
1
+ """共享数据模型"""
2
+ from .chunking import ChunkAugmentationOptions, ChunkingOptions
3
+ from .envelope import Envelope, TaskEnvelope
4
+ from .model import ModelConfig, ModelReferences, QaGenerationOptions
5
+ from .output import OutputOptions
6
+ from .prompt import PromptDetail
7
+ from .parsing import DocumentAugmentation, ParsingOptions
8
+ from .source import (
9
+ DeclaredSource,
10
+ ObjectStorage,
11
+ RegisteredMetadata,
12
+ RegisteredSource,
13
+ SourceMetadata,
14
+ StorageTarget,
15
+ )
16
+ from .task import (
17
+ DocumentIngestionTask,
18
+ ProcessingTask,
19
+ ResultArtifact,
20
+ SubTask,
21
+ )
22
+
23
+ __all__ = [
24
+ "ChunkAugmentationOptions",
25
+ "ChunkingOptions",
26
+ "DeclaredSource",
27
+ "DocumentAugmentation",
28
+ "DocumentIngestionTask",
29
+ "Envelope",
30
+ "ModelConfig",
31
+ "ModelReferences",
32
+ "ObjectStorage",
33
+ "OutputOptions",
34
+ "ParsingOptions",
35
+ "ProcessingTask",
36
+ "PromptDetail",
37
+ "QaGenerationOptions",
38
+ "RegisteredMetadata",
39
+ "RegisteredSource",
40
+ "ResultArtifact",
41
+ "SourceMetadata",
42
+ "StorageTarget",
43
+ "SubTask",
44
+ "TaskEnvelope",
45
+ ]
@@ -0,0 +1,35 @@
1
+ """分段策略与分段增强模型"""
2
+ from __future__ import annotations
3
+
4
+ from typing import Optional
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+ from ikc_sdk.core.enums import ChunkType, MetadataMode
9
+
10
+
11
+ class ChunkingOptions(BaseModel):
12
+ """分段策略"""
13
+ chunkType: ChunkType = Field(..., description="分段类型")
14
+ chunkSize: Optional[int] = Field(None, description="每段文本长度")
15
+ chunkOverlap: Optional[int] = Field(None, description="分段间重叠字符数,必需小于 chunkSize")
16
+ chunkExpr: Optional[str] = Field(
17
+ None,
18
+ description="自定义切分正则表达式(Excel 中类型误写为 Integer,契约语义为字符串)",
19
+ )
20
+ durationSeconds: Optional[int] = Field(None, description="每段时长(秒)")
21
+
22
+
23
+ class ChunkAugmentationOptions(BaseModel):
24
+ """分段增强配置"""
25
+ enable: Optional[bool] = Field(False, description="分段增强开关")
26
+ summarySize: Optional[int] = Field(None, description="每个分段摘要提取最大长度")
27
+ keyswordNum: Optional[int] = Field(
28
+ None,
29
+ description="每个分段关键词提取最大个数(字段名 keyswordNum 为 Excel 契约原文,勿改)",
30
+ )
31
+ tagNum: Optional[int] = Field(None, description="每个分段标签提取最大个数")
32
+ questionNum: Optional[int] = Field(None, description="每个分段问题提取最大个数")
33
+ metadataMode: Optional[MetadataMode] = Field(
34
+ MetadataMode.FILTER, description="分段元数据筛选方式: FILTER/INHERIT"
35
+ )
@@ -0,0 +1,36 @@
1
+ """统一响应壳模型
2
+
3
+ 对齐 open-ikc 统一响应体约定(errCode / errMsg / data / traceId):
4
+ - 独立解析(SERVICE/SDK)与下载解析结果:顶层额外带 taskId
5
+ - 查询解析结果:顶层无 taskId
6
+ """
7
+ from __future__ import annotations
8
+
9
+ from typing import Generic, Optional, TypeVar
10
+
11
+ from pydantic import BaseModel, Field
12
+
13
+ T = TypeVar("T")
14
+
15
+
16
+ class Envelope(BaseModel, Generic[T]):
17
+ """统一响应壳:traceId / reqId / errCode / errMsg / data"""
18
+ traceId: str = Field(
19
+ ..., description="请求链路追踪 ID,前端有传入则直接返回,否则服务端生成"
20
+ )
21
+ reqId: str = Field(
22
+ ..., description="请求幂等标识,前端有传入则直接返回,否则服务端生成"
23
+ )
24
+ errCode: str = Field(
25
+ ...,
26
+ description="错误码,成功返回 000000;通用错误码 100001/100401/...;业务错误码 200xxx",
27
+ )
28
+ errMsg: str = Field(
29
+ ..., description='错误信息,当 errCode 为 000000 时内容为 "SUCCESS"'
30
+ )
31
+ data: Optional[T] = Field(None, description="业务数据,失败时可为空")
32
+
33
+
34
+ class TaskEnvelope(Envelope[T]):
35
+ """带任务 ID 的统一响应壳(独立解析 / 下载解析结果)"""
36
+ taskId: str = Field(..., description="当前任务 ID")
@@ -0,0 +1,48 @@
1
+ """模型配置与问答对提取模型"""
2
+ from __future__ import annotations
3
+
4
+ from typing import Optional
5
+
6
+ from pydantic import BaseModel, ConfigDict, Field
7
+
8
+ from ikc_sdk.core.enums import QaScope
9
+
10
+
11
+ class ModelConfig(BaseModel):
12
+ """模型配置对象(Excel ModelConfig)
13
+
14
+ 对应 Excel「ModelReferences」各字段取值说明中的 `ModelConfig` 对象:
15
+ ModelReferences.* 字段为 ModelConfig 的 DES 加密串(Excel 类型 String),
16
+ 本类用于构造明文对象,加密序列化由网关 / 服务端实现。
17
+ 字段依据 Excel 示例定义;extraHeaders / extraBody 为可选的附加请求头/请求体(JSON 字符串)。
18
+ """
19
+ model_config = ConfigDict(extra="allow")
20
+
21
+ apiKey: str = Field(..., description="模型 API Key")
22
+ modelAddr: str = Field(..., description="模型服务地址")
23
+ modelId: str = Field(..., description="模型 ID")
24
+ maxTokens: int = Field(..., description="最大 Token 数")
25
+ model: str = Field(..., description="模型名称")
26
+ extraHeaders: Optional[str] = Field(None, description="附加请求头(JSON 字符串)")
27
+ extraBody: Optional[str] = Field(None, description="附加请求体(JSON 字符串)")
28
+
29
+
30
+ class ModelReferences(BaseModel):
31
+ """模型配置集合,不传入时默认读取系统配置
32
+
33
+ 各字段为对应模型 `ModelConfig` 的 DES 加密串(Excel 类型 String)。
34
+ """
35
+ ocrModel: Optional[str] = Field(None, description="OCR 模型配置(ModelConfig 的 DES 加密串)")
36
+ mllmModel: Optional[str] = Field(None, description="多模态模型配置(ModelConfig 的 DES 加密串)")
37
+ paddleOcrModel: Optional[str] = Field(None, description="Paddle OCR 模型配置(ModelConfig 的 DES 加密串)")
38
+ textModel: Optional[str] = Field(None, description="文本理解模型配置(ModelConfig 的 DES 加密串)")
39
+ audioModel: Optional[str] = Field(None, description="音频识别模型配置(ModelConfig 的 DES 加密串)")
40
+ embedModel: Optional[str] = Field(None, description="嵌入式模型配置(ModelConfig 的 DES 加密串)")
41
+ rerankModel: Optional[str] = Field(None, description="重排模型配置(ModelConfig 的 DES 加密串)")
42
+
43
+
44
+ class QaGenerationOptions(BaseModel):
45
+ """问答对提取策略"""
46
+ enable: Optional[bool] = Field(False, description="问答对开关")
47
+ scope: Optional[QaScope] = Field(None, description="问答对提取方式: PER_DOCUMENT/PER_CHUNK")
48
+ maxPairs: Optional[int] = Field(None, description="问答对提取最大个数")
@@ -0,0 +1,20 @@
1
+ """输出配置模型"""
2
+ from __future__ import annotations
3
+
4
+ from typing import Optional, Set
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+ from ikc_sdk.core.enums import ImageEncoding, OutputFormat
9
+
10
+
11
+ class OutputOptions(BaseModel):
12
+ """返回格式配置"""
13
+ formats: Set[OutputFormat] = Field(
14
+ default_factory=lambda: {OutputFormat.MARKDOWN, OutputFormat.CHUNKS_JSON},
15
+ description="返回文件格式,默认 {MARKDOWN, CHUNKS_JSON}",
16
+ )
17
+ includeImages: Optional[bool] = Field(None, description="解析结果文件里是否包含图片")
18
+ imageEncoding: Optional[ImageEncoding] = Field(
19
+ None, description="图片返回格式: URL/BASE64,includeImages=True 时有效"
20
+ )
@@ -0,0 +1,38 @@
1
+ """解析策略与全文增强模型"""
2
+ from __future__ import annotations
3
+
4
+ from typing import Optional, Set
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+ from ikc_sdk.core.enums import DocumentCategory, DocumentFormat, ImageParsingMode, ParsingFlag
9
+
10
+
11
+ class ParsingOptions(BaseModel):
12
+ """解析策略"""
13
+ docFormat: DocumentFormat = Field(..., description="文档类型,填写文件后缀")
14
+ docCategory: Optional[DocumentCategory] = Field(
15
+ DocumentCategory.GENERAL, description="文档分类"
16
+ )
17
+ parsingOptions: Set[ParsingFlag] = Field(
18
+ default_factory=lambda: {ParsingFlag.PARSE_IMAGE, ParsingFlag.PARSE_TABLE},
19
+ description="解析标志位,默认 {PARSE_IMAGE, PARSE_TABLE}",
20
+ )
21
+ pageRange: Optional[list[str]] = Field(
22
+ None, description='解析页范围,如 ["1","3-5","10-20"],不传或为空表示全文解析'
23
+ )
24
+ imageParseMode: Optional[ImageParsingMode] = Field(
25
+ ImageParsingMode.MLLM, description="图片解析模型类型"
26
+ )
27
+
28
+
29
+ class DocumentAugmentation(BaseModel):
30
+ """全文增强配置"""
31
+ enabled: bool = Field(False, description="全文增强开关")
32
+ summarySize: Optional[int] = Field(None, description="全文摘要提取最大长度")
33
+ keyswordNum: Optional[int] = Field(
34
+ None,
35
+ description="全文关键词提取最大个数(字段名 keyswordNum 为 Excel 契约原文,勿改)",
36
+ )
37
+ tagNum: Optional[int] = Field(None, description="全文标签提取最大个数")
38
+ questionNum: Optional[int] = Field(None, description="全文问题提取最大个数")
@@ -0,0 +1,17 @@
1
+ """提示词模型
2
+
3
+ 字段名 docMetadataPormpt / chunkMetadataPormpt 为 Excel 契约原文拼写,勿改。
4
+ """
5
+ from __future__ import annotations
6
+
7
+ from typing import Optional
8
+
9
+ from pydantic import BaseModel, Field
10
+
11
+
12
+ class PromptDetail(BaseModel):
13
+ """提示词清单"""
14
+ docMetadataPormpt: Optional[str] = Field(None, description="全文元数据提取提示词")
15
+ chunkMetadataPormpt: Optional[str] = Field(None, description="分段元数据提取提示词")
16
+ imageMllmPrompt: Optional[str] = Field(None, description="图片理解多模态大模型提示词")
17
+ pptMllmPrompt: Optional[str] = Field(None, description="PPT 理解多模态大模型提示词")
@@ -0,0 +1,124 @@
1
+ """文档来源相关模型
2
+
3
+ SDK 与 SERVICE 两版核心差异(来源 docs/RAG SDK接口.xlsx):
4
+ - SDK(面向 API 调用方):来源由调用方自声明——`DeclaredSource`
5
+ - type 必填,url / objectStorage / uploadToken 三选一,元信息不含 docId
6
+ - SERVICE(API 之后调用后端 service):来源指向已登记文档——`RegisteredSource`
7
+ - 无 type / objectStorage / uploadToken,元信息 docId 必填(知识管理库模块生成)
8
+ - storageTarget 在两版中均为可选字段(落地知识库场景才需要传入;
9
+ Excel 未定义独立的「落地知识库」接口,故不臆造必填变体)
10
+ - 元信息采用基类 + 派生:`SourceMetadata`(SDK 版,无 docId)/
11
+ `RegisteredMetadata`(SERVICE 版,docId 必填),保证 SDK 序列化不出现 docId
12
+ """
13
+ from __future__ import annotations
14
+
15
+ from typing import Optional
16
+
17
+ from pydantic import BaseModel, ConfigDict, Field, model_validator
18
+
19
+ from ikc_sdk.core.enums import OwnerType, SourceType
20
+
21
+
22
+ class StorageTarget(BaseModel):
23
+ """源文件基础元信息(落地知识库场景必选)"""
24
+ klgId: Optional[str] = Field(None, description="知识ID")
25
+ kbId: Optional[str] = Field(None, description="知识库ID")
26
+ ownershipType: Optional[OwnerType] = Field(
27
+ None, description="归属类型: PERSONAL/TEAM/ENTERPRISE"
28
+ )
29
+ ownershipId: Optional[str] = Field(None, description="归属ID,与 ownershipType 搭配使用")
30
+
31
+
32
+ class ObjectStorage(BaseModel):
33
+ """对象存储内容"""
34
+ storageProvider: Optional[str] = Field(None, description="存储供应商")
35
+ bucket: str = Field(..., description="租户空间")
36
+ objectKey: str = Field(..., description="文件/目录/压缩包对象标识,如 OSS 对象路径")
37
+
38
+
39
+ class SourceMetadata(BaseModel):
40
+ """源文件扩展元信息(SDK 版)
41
+
42
+ 不含 docId 字段(Excel SDK 元信息表);支持额外扩展字段。
43
+ """
44
+ model_config = ConfigDict(extra="allow")
45
+
46
+ docTitle: Optional[str] = Field(None, description="文档标题")
47
+
48
+
49
+ class RegisteredMetadata(SourceMetadata):
50
+ """已登记文档扩展元信息(SERVICE 版)
51
+
52
+ 在 SDK 版元信息基础上增加必填 docId(知识管理库模块生成)。
53
+ """
54
+ docId: str = Field(..., description="文档 ID,由知识管理库模块生成(SERVICE 版必填)")
55
+
56
+
57
+ # ──────────────────────────────────────────────
58
+ # SDK 版:来源自声明(面向 API 调用方)
59
+ # ──────────────────────────────────────────────
60
+ class DeclaredSource(BaseModel):
61
+ """来源自声明(SDK 版,面向 API 调用方)
62
+
63
+ 与 SERVICE 版的强制性区别:
64
+ - type 为必填项,显式声明来源类型
65
+ - url / objectStorage / uploadToken 三选一(validator 强制)
66
+ - metadata 不含 docId 字段
67
+ - storageTarget 可选(落地知识库场景传入)
68
+ """
69
+ model_config = ConfigDict(extra="forbid")
70
+
71
+ type: SourceType = Field(
72
+ ..., description="文件来源类型: URL/OBJECT_STORAGE/UPLOAD_TOKEN"
73
+ )
74
+ url: Optional[str] = Field(None, description="远程文件下载地址")
75
+ objectStorage: Optional[ObjectStorage] = Field(None, description="对象存储内容")
76
+ uploadToken: Optional[str] = Field(
77
+ None, description="文件上传凭证或临时对象标识"
78
+ )
79
+ storageTarget: Optional[StorageTarget] = Field(
80
+ None, description="源文件基础元信息,落地知识库场景必选"
81
+ )
82
+ metadata: Optional[SourceMetadata] = Field(
83
+ None, description="源文件扩展元信息(SDK 版:无 docId)"
84
+ )
85
+
86
+ @model_validator(mode="after")
87
+ def _check_source_exclusive(self) -> "DeclaredSource":
88
+ supplied = {
89
+ SourceType.URL: self.url,
90
+ SourceType.OBJECT_STORAGE: self.objectStorage,
91
+ SourceType.UPLOAD_TOKEN: self.uploadToken,
92
+ }
93
+ present = [kind for kind, value in supplied.items() if value is not None]
94
+ if len(present) != 1:
95
+ raise ValueError("url / objectStorage / uploadToken 必须三选一")
96
+ if present[0] is not self.type:
97
+ raise ValueError(
98
+ f"source.type={self.type.value} 与来源字段 {present[0].value} 不匹配"
99
+ )
100
+ if self.metadata is not None and self.metadata.model_dump().get("docId") is not None:
101
+ raise ValueError("SDK 版 source.metadata 不含 docId 字段")
102
+ return self
103
+
104
+
105
+ # ──────────────────────────────────────────────
106
+ # SERVICE 版:已登记文档(API 之后调用后端 service)
107
+ # ──────────────────────────────────────────────
108
+ class RegisteredSource(BaseModel):
109
+ """已登记文档来源(SERVICE 版,API 之后调用后端 service)
110
+
111
+ 与 SDK 版的强制性区别:
112
+ - 不含 type / objectStorage / uploadToken 字段(以已登记 docId 定位)
113
+ - metadata.docId 为必填项(知识管理库模块生成)
114
+ - storageTarget 可选(落地知识库场景传入)
115
+ """
116
+ model_config = ConfigDict(extra="forbid")
117
+
118
+ url: Optional[str] = Field(None, description="远程文件下载地址")
119
+ storageTarget: Optional[StorageTarget] = Field(
120
+ None, description="源文件基础元信息,落地知识库场景必选"
121
+ )
122
+ metadata: RegisteredMetadata = Field(
123
+ ..., description="已登记文档扩展元信息(SERVICE 版:docId 必填)"
124
+ )
@@ -0,0 +1,60 @@
1
+ """任务与结果相关模型"""
2
+ from __future__ import annotations
3
+
4
+ from typing import Optional
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+ from ikc_sdk.core.enums import (
9
+ ExecutionMode,
10
+ FinalTaskStatus,
11
+ OutputFormat,
12
+ ProcessingStage,
13
+ SubTaskStatus,
14
+ TaskStatus,
15
+ )
16
+
17
+
18
+ class ResultArtifact(BaseModel):
19
+ """解析结果产物"""
20
+ type: OutputFormat = Field(..., description="下载文件类型")
21
+ downloadUrl: str = Field(..., description="下载文件地址")
22
+ expiresAt: str = Field(..., description="下载文件有效时间")
23
+
24
+
25
+ class DocumentIngestionTask(BaseModel):
26
+ """文档摄入任务结果"""
27
+ docId: str = Field(..., description="文档 ID")
28
+ taskStatus: FinalTaskStatus = Field(
29
+ ..., description="任务状态: PENDING/SUCCEEDED/FAILED/CANCELLED"
30
+ )
31
+ executeMode: ExecutionMode = Field(..., description="执行方式: sync/async")
32
+ startedAt: str = Field(..., description="任务开始时间")
33
+ completedAt: str = Field(..., description="任务完成时间")
34
+ durationMs: int = Field(..., description="任务执行时间(毫秒)")
35
+ expiresAt: str = Field(..., description="任务结果过期时间")
36
+ artifacts: Optional[list[ResultArtifact]] = Field(None, description="结果产物列表")
37
+
38
+
39
+ class SubTask(BaseModel):
40
+ """子任务详细信息"""
41
+ sequence: int = Field(..., description="子任务顺序")
42
+ stage: ProcessingStage = Field(..., description="子任务阶段名称")
43
+ startedAt: str = Field(..., description="子任务开始时间")
44
+ completedAt: str = Field(..., description="子任务结束时间")
45
+ durationMs: int = Field(..., description="子任务耗时(毫秒)")
46
+ subTaskId: str = Field(..., description="celery 子任务 ID")
47
+ status: SubTaskStatus = Field(..., description="子任务状态")
48
+ message: Optional[str] = Field(None, description="子任务描述")
49
+
50
+
51
+ class ProcessingTask(BaseModel):
52
+ """解析任务结果摘要"""
53
+ taskId: str = Field(..., description="主任务 ID")
54
+ taskStatus: TaskStatus = Field(..., description="任务状态")
55
+ currentStage: ProcessingStage = Field(..., description="当前处理阶段")
56
+ startedAt: str = Field(..., description="主任务开始时间")
57
+ completedAt: str = Field(..., description="主任务完成时间")
58
+ expiresAt: Optional[str] = Field(None, description="主任务过期时间,为空时表示永不过期")
59
+ durationMs: int = Field(..., description="主任务执行时间(毫秒)")
60
+ subTasks: list[SubTask] = Field(..., description="任务详细信息")
@@ -0,0 +1,110 @@
1
+ Metadata-Version: 2.4
2
+ Name: ikc-sdk-lib
3
+ Version: 0.1.0
4
+ Summary: IKC RAG 对外接口 SDK(独立解析 / 查询解析结果 / 下载解析结果)
5
+ Author-email: shark8848 <admin@sharky-ai.com>
6
+ Keywords: ikc,rag,sdk,parse,knowledge-base,retrieval
7
+ Classifier: Development Status :: 3 - Alpha
8
+ Classifier: Intended Audience :: Developers
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Programming Language :: Python :: 3.12
11
+ Classifier: Topic :: Software Development :: Libraries
12
+ Requires-Python: >=3.12
13
+ Description-Content-Type: text/markdown
14
+ Requires-Dist: pydantic>=2.7
15
+ Provides-Extra: dev
16
+ Requires-Dist: pytest>=8.0; extra == "dev"
17
+
18
+ # ikc-sdk-lib
19
+
20
+ IKC SDK 家族仓库(Python 模型层),与 `/home/open-ikc` 对外接口一脉相承、独立维护。
21
+ 当前整个 SDK 定义为 **core**:`docs/RAG SDK接口.xlsx` 中的 **4 个免知识库接口** 的请求/响应模型(Pydantic v2)。
22
+ 后续新增 SDK 以 `ikc_sdk.<sdk_name>` 兄弟子包扩展,不进入 core。
23
+
24
+ ## 当前接口范围(core)
25
+
26
+ | # | 接口(Excel Sheet) | 请求 | 响应 | 实现位置 |
27
+ | --- | --- | --- | --- | --- |
28
+ | 1 | 解析—独立解析(免知识库)SERVICE | `ServiceParseDirectRequest` | `ParseResponse` | `ikc_sdk/core/api/parse/direct.py` |
29
+ | 2 | 解析—独立解析(免知识库)SDK | `SdkParseDirectRequest` | `ParseResponse` | `ikc_sdk/core/api/parse/direct.py` |
30
+ | 3 | 查询解析结果(免知识库)SDK | `QueryParseResultRequest` | `QueryParseResultResponse` | `ikc_sdk/core/api/parse/query.py` |
31
+ | 4 | 下载解析结果(免知识库)SDK | `DownloadParseResultRequest` | `DownloadParseResultResponse` | `ikc_sdk/core/api/parse/download.py` |
32
+
33
+ ## 目录结构
34
+
35
+ ```
36
+ src/ikc_sdk/
37
+ __init__.py # 命名空间门面:re-export core 公开 API
38
+ _version.py # 版本号(分发级)
39
+ core/ # 核心 SDK(当前整个 SDK)
40
+ __init__.py # core 公开导出
41
+ enums.py # 契约枚举(取值以 Excel 为准)
42
+ models/ # 共享模型:响应壳 / 来源 / 解析 / 分段 / 输出 / 任务
43
+ api/ # 按能力域组织的接口定义
44
+ parse/ # 解析域(已定义):direct(独立解析 SERVICE/SDK)/ query / download
45
+ knowledge_base/ # 知识库域(占位):create / update / get / query
46
+ document/ # 文档域(占位):ingest / parse / ingest_and_parse / upload / get / parse_result/
47
+ search/ # 检索域(占位):universal / deep / query
48
+ <future_sdk>/ # 后续新增 SDK:兄弟子包(如 client 等),不进入 core
49
+ ```
50
+
51
+ ## 使用
52
+
53
+ 规范导入路径为 `ikc_sdk.core`;顶层 `ikc_sdk` 门面 re-export core,两种写法等价:
54
+
55
+ ```python
56
+ from ikc_sdk import SdkParseDirectRequest # 门面(兼容)
57
+ from ikc_sdk.core import SdkParseDirectRequest # 规范路径
58
+ from ikc_sdk.core import (
59
+ DeclaredSource, SourceMetadata, ParsingOptions, OutputOptions,
60
+ SourceType, DocumentFormat, OutputFormat,
61
+ )
62
+
63
+ req = SdkParseDirectRequest(
64
+ processingOperation="EXTRACT_CHUNK",
65
+ source=DeclaredSource(
66
+ type=SourceType.URL,
67
+ url="https://example.com/doc.pdf",
68
+ metadata=SourceMetadata(docTitle="示例文档"),
69
+ ),
70
+ parsing=ParsingOptions(docFormat=DocumentFormat.PDF),
71
+ output=OutputOptions(formats={OutputFormat.MARKDOWN}),
72
+ )
73
+ print(req.model_dump_json())
74
+ ```
75
+
76
+ ## 开发手册
77
+
78
+ 面向开发者的四接口完整开发手册(总体流程、公共契约、每个接口的请求/响应字段与代码示例、
79
+ 端到端链路、错误码、类索引)见 `docs/开发手册.md`。
80
+
81
+ ## 开发示例
82
+
83
+ 4 个接口的可运行示例位于 `src/examples/`(请求构建、契约校验、序列化、响应解析):
84
+
85
+ ```bash
86
+ cd /home/sharkyai/ikc-sdk-lib
87
+ PYTHONPATH=src python3 src/examples/parse_direct_sdk.py
88
+ PYTHONPATH=src python3 src/examples/parse_direct_service.py
89
+ PYTHONPATH=src python3 src/examples/query_parse_result.py
90
+ PYTHONPATH=src python3 src/examples/download_parse_result.py
91
+ ```
92
+
93
+ ## 占位目录(契约待定义)
94
+
95
+ 知识库 / 文档 / 检索三个域目前仅有目录骨架,接口契约待 `docs/RAG SDK接口.xlsx` 增补后定义
96
+ (参考 open-ikc V2 接口清单占位),在契约落定前**不定义模型**:
97
+
98
+ | 域 | 计划接口 | 参考 |
99
+ | --- | --- | --- |
100
+ | 知识库 | `create` / `update` / `get` / `query` | open-ikc A-01~A-04 |
101
+ | 文档 | `ingest` / `parse` / `ingest_and_parse` / `upload` / `get` / `parse_result/{query,issue_ticket,download}` | open-ikc B-01~B-07 |
102
+ | 检索 | `universal` / `deep` / `query` | open-ikc D-01/D-02 |
103
+
104
+ ## 契约约定
105
+
106
+ - 字段命名(camelCase)与枚举值一律以 `docs/RAG SDK接口.xlsx` 为准,含 Excel 原文拼写(如 `keyswordNum`、`docMetadataPormpt`),不得“顺手修正”。
107
+ - 统一响应壳:`errCode / errMsg / data / traceId`(独立解析与下载接口额外带 `taskId`)。
108
+ - SDK 版请求面向 API 调用方(source 自声明),SERVICE 版为 API 之后调用后端 service(source 指向已登记文档);两版以 `ParseDirectRequestBase` 为基类派生,类名严格遵循 Excel Sheet 定义。
109
+ - Excel 引用的对象类型均有对应模型类(映射见 `AGENTS.md` §3.4,如 `ModelConfig`);`ModelReferences` 各字段为 `ModelConfig` 的 DES 加密串。
110
+ - 完整的设计与实现契约见 `AGENTS.md`(能力域地图、目录/命名规范、落地工作流、硬性约束)。
@@ -0,0 +1,41 @@
1
+ ikc_sdk/__init__.py,sha256=JUKEDLvHIa3cnoh3Dm7wqcVAwLyMvOc2BO1OWy1bOL8,538
2
+ ikc_sdk/_version.py,sha256=kUR5RAFc7HCeiqdlX36dZOHkUI5wI6V_43RpEcD8b-0,22
3
+ ikc_sdk/core/__init__.py,sha256=QO7hbQS08ks1VlpbBcH9H1_AhPG944By6bO2QvWs5fg,3390
4
+ ikc_sdk/core/enums.py,sha256=2k6GSK4BQMKNvwIxvGfLfpluDubdcfBFZ1EIs8OR3yI,4991
5
+ ikc_sdk/core/api/__init__.py,sha256=JaIRoGb4FzfqSa9kPFxKxyYBYTd41ZHPIwbxNPsPVA8,675
6
+ ikc_sdk/core/api/document/__init__.py,sha256=qojc-cGRPA178WgT_pEU1IM-waWR5EKLEgR5hYEFzGM,482
7
+ ikc_sdk/core/api/document/get.py,sha256=4VCo4yVES3YgFXsFigmut5oRQgWmtGv1EFImiOwywuA,211
8
+ ikc_sdk/core/api/document/ingest.py,sha256=qmfE3bpvF9cNPZ3nOCgq8jjchrwwehlmDVuoECm0PMo,233
9
+ ikc_sdk/core/api/document/ingest_and_parse.py,sha256=76DoHQhGonBE2CuhAlmsFGLnHSTesHvAiZDVuy6G8B0,274
10
+ ikc_sdk/core/api/document/parse.py,sha256=mNqGDt7elHK_zeVF5BEXty8n1Io_FnjDpZWj8iT-Bj4,297
11
+ ikc_sdk/core/api/document/upload.py,sha256=3lq64ISdbOOxUdckm3oDbjP1EkdtwD6wAGgN1lU4drw,269
12
+ ikc_sdk/core/api/document/parse_result/__init__.py,sha256=0XkVjCYAv5gJJaNJPiMZF2aiZYf-QMEsYvycP07Ygxw,266
13
+ ikc_sdk/core/api/document/parse_result/download.py,sha256=rCZuGpMS5559P3ybXPIAI72JMvNy3ZK6ypcAu0unrIs,312
14
+ ikc_sdk/core/api/document/parse_result/issue_ticket.py,sha256=QOzN2paKEYk3zyZZWlU-QbI0yIgKKx_U11L1yTT31kU,300
15
+ ikc_sdk/core/api/document/parse_result/query.py,sha256=yKphCPaNf8dA-iEan89tAJ64ybylKex78KxATHXnmPs,292
16
+ ikc_sdk/core/api/knowledge_base/__init__.py,sha256=hcp09ru_JEmLtMS068HrXry60Y_Nd9ngPcd3kMikRm8,281
17
+ ikc_sdk/core/api/knowledge_base/create.py,sha256=lnsx44pUuad5_tjS5jwoPGCZfVQe4-RwVIIwCI_8TOU,169
18
+ ikc_sdk/core/api/knowledge_base/get.py,sha256=P6PJkD79yrCGr-cjPCyNxr4qOl-xJFiCF8ux6-mFYn4,182
19
+ ikc_sdk/core/api/knowledge_base/query.py,sha256=Kky15mAXoDtMF9a9FLcEG3VQPfTF6kCA83p_j2TbkVU,180
20
+ ikc_sdk/core/api/knowledge_base/update.py,sha256=A0x7b0vMoeFXl3S1CTz36sHWLajJ-uQskcRVExOAPW8,175
21
+ ikc_sdk/core/api/parse/__init__.py,sha256=fbBizrAy8_Ce3ritWVI7Eb37bGy9eY_wHgJ9Yye0rEM,987
22
+ ikc_sdk/core/api/parse/direct.py,sha256=nDRgtIsLnYBwkwqhq4KfTH7ZM_GoqfIaInbc2vFdvOM,4056
23
+ ikc_sdk/core/api/parse/download.py,sha256=v3w2cQK4pLgkDGIkVRfGiQDFIXwtybkDlEGTQE4IKRI,762
24
+ ikc_sdk/core/api/parse/query.py,sha256=4uY_1CyweCbzyfsZDj7FWjGqbZ6qcndnqZmSmOthl6s,734
25
+ ikc_sdk/core/api/search/__init__.py,sha256=1ABA225-MqoZ4K1Ww-my-IdIiWjv6RYpVjhj3Pv-efE,298
26
+ ikc_sdk/core/api/search/deep.py,sha256=xOgrRIVdeRCHzYNLe6lMtUUlsJ95qJo7HHm6dk1mxL8,310
27
+ ikc_sdk/core/api/search/query.py,sha256=89EGAdj9wDOG-GMY5d3yyUnsDlLxdqgEIZy7q3RXZfI,267
28
+ ikc_sdk/core/api/search/universal.py,sha256=BHhi_yR8blZebeM-9EDoiG984kW2PZA32-zy8rhXVP0,306
29
+ ikc_sdk/core/models/__init__.py,sha256=Bzwy91L7MgsDkfCyK-cG8jUUQc2sbiKfHIE5Crkf4lk,1068
30
+ ikc_sdk/core/models/chunking.py,sha256=VScXd5Uvg0mQa_4VrKp8tHkVrVlaykKT7TCBNWvqleI,1536
31
+ ikc_sdk/core/models/envelope.py,sha256=Pa7pTXZIULUBeJcxNuEaka1BF_SkE1zOmdx9If9l9P4,1290
32
+ ikc_sdk/core/models/model.py,sha256=bqjxj46hSTTwCeQ2nbB5nNHl_6UbE7PSyUEZqF-Wx3o,2557
33
+ ikc_sdk/core/models/output.py,sha256=UmV4edsX9Q98SbStmma2vFIk--QlzlHYIwENlNKVQgY,711
34
+ ikc_sdk/core/models/parsing.py,sha256=mv2C-gTmGcIZbxDnQrX4pBymCdodsnci4lSlm1qqutE,1594
35
+ ikc_sdk/core/models/prompt.py,sha256=vApujTKY7nSHkGvJJmdZQLcVCCnhdZTsPzFq8L_7a6Q,677
36
+ ikc_sdk/core/models/source.py,sha256=uE1HMjLak-Xr10diuzPJNg3mQy7EPrDdl3H7MSxNgwI,5742
37
+ ikc_sdk/core/models/task.py,sha256=P0fbsDPnHMzAPoxsHBXLen_Ta_lzTKwsisBiApXawvw,2584
38
+ ikc_sdk_lib-0.1.0.dist-info/METADATA,sha256=S6iYdE1aidQJJWC6BVIi98gj6peTGU1AmNSF9DAkPQA,5516
39
+ ikc_sdk_lib-0.1.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
40
+ ikc_sdk_lib-0.1.0.dist-info/top_level.txt,sha256=B5nUSNuuxW9QNHpRw3Cuct0f6DyPna92oPngo1mJEhs,8
41
+ ikc_sdk_lib-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ ikc_sdk