flare-kernel 0.1.0__tar.gz → 0.2.0__tar.gz

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 (47) hide show
  1. {flare_kernel-0.1.0 → flare_kernel-0.2.0}/PKG-INFO +37 -8
  2. {flare_kernel-0.1.0 → flare_kernel-0.2.0}/README.md +30 -6
  3. {flare_kernel-0.1.0 → flare_kernel-0.2.0}/pyproject.toml +7 -2
  4. flare_kernel-0.2.0/src/flare_kernel/contracts/__init__.py +23 -0
  5. flare_kernel-0.2.0/src/flare_kernel/contracts/kernel_contract.py +96 -0
  6. flare_kernel-0.2.0/src/flare_kernel/router/kernel.py +2657 -0
  7. flare_kernel-0.2.0/src/flare_kernel/runtime/__init__.py +79 -0
  8. {flare_kernel-0.1.0 → flare_kernel-0.2.0}/src/flare_kernel/runtime/agent_runtime.py +38 -0
  9. flare_kernel-0.2.0/src/flare_kernel/runtime/decision_engine.py +410 -0
  10. flare_kernel-0.2.0/src/flare_kernel/runtime/domain_pack_loader.py +479 -0
  11. flare_kernel-0.2.0/src/flare_kernel/runtime/infrastructure.py +523 -0
  12. flare_kernel-0.2.0/src/flare_kernel/runtime/llm_provider.py +410 -0
  13. flare_kernel-0.2.0/src/flare_kernel/runtime/mode_orchestration.py +760 -0
  14. flare_kernel-0.2.0/src/flare_kernel/runtime/mode_runtime.py +446 -0
  15. flare_kernel-0.2.0/src/flare_kernel/runtime/model_router.py +443 -0
  16. {flare_kernel-0.1.0 → flare_kernel-0.2.0}/src/flare_kernel/runtime/skill_runtime.py +34 -0
  17. flare_kernel-0.2.0/src/flare_kernel/runtime/tests/test_kernel_runtime.py +319 -0
  18. {flare_kernel-0.1.0 → flare_kernel-0.2.0}/src/flare_kernel.egg-info/PKG-INFO +37 -8
  19. {flare_kernel-0.1.0 → flare_kernel-0.2.0}/src/flare_kernel.egg-info/SOURCES.txt +10 -1
  20. flare_kernel-0.2.0/src/flare_kernel.egg-info/requires.txt +9 -0
  21. flare_kernel-0.2.0/tests/test_basics.py +42 -0
  22. flare_kernel-0.2.0/tests/test_decision_engine.py +175 -0
  23. flare_kernel-0.2.0/tests/test_domain_pack_loader.py +85 -0
  24. flare_kernel-0.2.0/tests/test_infrastructure_helpers.py +23 -0
  25. flare_kernel-0.2.0/tests/test_intent_resolution.py +645 -0
  26. flare_kernel-0.2.0/tests/test_llm_provider.py +227 -0
  27. flare_kernel-0.2.0/tests/test_model_router.py +261 -0
  28. flare_kernel-0.1.0/src/flare_kernel/contracts/__init__.py +0 -5
  29. flare_kernel-0.1.0/src/flare_kernel/contracts/kernel_contract.py +0 -36
  30. flare_kernel-0.1.0/src/flare_kernel/router/kernel.py +0 -342
  31. flare_kernel-0.1.0/src/flare_kernel/runtime/__init__.py +0 -26
  32. flare_kernel-0.1.0/src/flare_kernel/runtime/domain_pack_loader.py +0 -240
  33. flare_kernel-0.1.0/src/flare_kernel/runtime/llm_provider.py +0 -204
  34. flare_kernel-0.1.0/src/flare_kernel/runtime/mode_orchestration.py +0 -330
  35. flare_kernel-0.1.0/src/flare_kernel/runtime/mode_runtime.py +0 -262
  36. flare_kernel-0.1.0/src/flare_kernel/runtime/tests/test_kernel_runtime.py +0 -114
  37. flare_kernel-0.1.0/src/flare_kernel.egg-info/requires.txt +0 -4
  38. flare_kernel-0.1.0/tests/test_basics.py +0 -25
  39. {flare_kernel-0.1.0 → flare_kernel-0.2.0}/setup.cfg +0 -0
  40. {flare_kernel-0.1.0 → flare_kernel-0.2.0}/src/flare_kernel/__init__.py +0 -0
  41. {flare_kernel-0.1.0 → flare_kernel-0.2.0}/src/flare_kernel/app.py +0 -0
  42. {flare_kernel-0.1.0 → flare_kernel-0.2.0}/src/flare_kernel/main.py +0 -0
  43. {flare_kernel-0.1.0 → flare_kernel-0.2.0}/src/flare_kernel/router/__init__.py +0 -0
  44. {flare_kernel-0.1.0 → flare_kernel-0.2.0}/src/flare_kernel/runtime/logging.py +0 -0
  45. {flare_kernel-0.1.0 → flare_kernel-0.2.0}/src/flare_kernel/runtime/trace.py +0 -0
  46. {flare_kernel-0.1.0 → flare_kernel-0.2.0}/src/flare_kernel.egg-info/dependency_links.txt +0 -0
  47. {flare_kernel-0.1.0 → flare_kernel-0.2.0}/src/flare_kernel.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flare-kernel
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: FLARE kernel runtime package
5
5
  License: Proprietary
6
6
  Classifier: Development Status :: 3 - Alpha
@@ -8,10 +8,15 @@ Classifier: Programming Language :: Python :: 3
8
8
  Classifier: Programming Language :: Python :: 3.11
9
9
  Requires-Python: >=3.11
10
10
  Description-Content-Type: text/markdown
11
- Requires-Dist: flare-engines<0.2.0,>=0.1.0
11
+ Requires-Dist: flare-engines<0.3.0,>=0.2.0
12
12
  Requires-Dist: fastapi<1.0,>=0.115
13
13
  Requires-Dist: pydantic<3,>=2
14
14
  Requires-Dist: uvicorn<1.0,>=0.30
15
+ Requires-Dist: httpx<1.0,>=0.27
16
+ Requires-Dist: sqlalchemy<3,>=2
17
+ Requires-Dist: psycopg2-binary<3,>=2.9
18
+ Requires-Dist: redis<6,>=5
19
+ Requires-Dist: qdrant-client<2,>=1.9
15
20
 
16
21
  # flare-kernel
17
22
 
@@ -37,21 +42,22 @@ Requires-Dist: uvicorn<1.0,>=0.30
37
42
  1. `POST /kernel/run`
38
43
  2. `POST /kernel/stream`
39
44
  3. `GET /kernel/health`
45
+ 4. `POST /kernel/knowledge/ingest`
46
+ 5. `POST /kernel/knowledge/search`
40
47
 
41
48
  kernel 现已输出 mode/context 运行时占位事件与字段。
42
49
 
43
- ## Instance 注入(品牌信息)
50
+ ## 品牌注入(可选)
44
51
 
45
- 1. kernel 支持从 instance 的 domain-pack 读取品牌配置:
52
+ 1. kernel 支持从 domain-pack 读取品牌配置:
46
53
  `branding/instance-branding.json`
47
- 2. 读取优先级:
48
- - 环境变量 `FLARE_DOMAIN_PACK_ROOT`
49
- - 自动探测 `apps/<instance_id>/domain-pack`
54
+ 2. 读取方式:
55
+ - 仅通过环境变量 `FLARE_DOMAIN_PACK_ROOT` 显式指定
50
56
  3. 注入位置:
51
57
  - `POST /kernel/run` 响应 `result.instance_profile`
52
58
  - `POST /kernel/stream` SSE 事件 `instance_profile`
53
59
 
54
- 说明:品牌注入仅在 instance 层配置,core 不写死产品名、logo、标签。
60
+ 说明:品牌注入通过外部 domain-pack 配置,core 不写死产品名、logo、标签。
55
61
 
56
62
  本地启动(示例):
57
63
 
@@ -59,6 +65,29 @@ kernel 现已输出 mode/context 运行时占位事件与字段。
59
65
  uvicorn flare_kernel.main:app --app-dir packages/flare-kernel/src --host 0.0.0.0 --port 8002
60
66
  ```
61
67
 
68
+ 环境变量(真实链路):
69
+
70
+ 1. `DASHSCOPE_API_KEY`(必填,真实百炼调用)
71
+ 2. `LLM_PROVIDER_BACKEND`(默认 `dashscope`)
72
+ 3. `FLARE_POSTGRES_DSN`
73
+ 4. `FLARE_REDIS_URL`
74
+ 5. `FLARE_QDRANT_URL`
75
+
76
+ 健康检查会输出依赖状态:
77
+
78
+ 1. `llm_ready`
79
+ 2. `postgres_ready`
80
+ 3. `redis_ready`
81
+ 4. `qdrant_ready`
82
+
83
+ 模式决策优先级(`/kernel/run` 与 `/kernel/stream`):
84
+
85
+ 1. `intent_override`(外部业务侧注入)
86
+ 2. 消息意图识别(内置关键词)
87
+ 3. `manual_mode`
88
+ 4. `current_mode`
89
+ 5. fallback(`intent/default`)
90
+
62
91
  ## 最小发布说明
63
92
 
64
93
  1. 当前包版本:`0.1.0`
@@ -22,21 +22,22 @@
22
22
  1. `POST /kernel/run`
23
23
  2. `POST /kernel/stream`
24
24
  3. `GET /kernel/health`
25
+ 4. `POST /kernel/knowledge/ingest`
26
+ 5. `POST /kernel/knowledge/search`
25
27
 
26
28
  kernel 现已输出 mode/context 运行时占位事件与字段。
27
29
 
28
- ## Instance 注入(品牌信息)
30
+ ## 品牌注入(可选)
29
31
 
30
- 1. kernel 支持从 instance 的 domain-pack 读取品牌配置:
32
+ 1. kernel 支持从 domain-pack 读取品牌配置:
31
33
  `branding/instance-branding.json`
32
- 2. 读取优先级:
33
- - 环境变量 `FLARE_DOMAIN_PACK_ROOT`
34
- - 自动探测 `apps/<instance_id>/domain-pack`
34
+ 2. 读取方式:
35
+ - 仅通过环境变量 `FLARE_DOMAIN_PACK_ROOT` 显式指定
35
36
  3. 注入位置:
36
37
  - `POST /kernel/run` 响应 `result.instance_profile`
37
38
  - `POST /kernel/stream` SSE 事件 `instance_profile`
38
39
 
39
- 说明:品牌注入仅在 instance 层配置,core 不写死产品名、logo、标签。
40
+ 说明:品牌注入通过外部 domain-pack 配置,core 不写死产品名、logo、标签。
40
41
 
41
42
  本地启动(示例):
42
43
 
@@ -44,6 +45,29 @@ kernel 现已输出 mode/context 运行时占位事件与字段。
44
45
  uvicorn flare_kernel.main:app --app-dir packages/flare-kernel/src --host 0.0.0.0 --port 8002
45
46
  ```
46
47
 
48
+ 环境变量(真实链路):
49
+
50
+ 1. `DASHSCOPE_API_KEY`(必填,真实百炼调用)
51
+ 2. `LLM_PROVIDER_BACKEND`(默认 `dashscope`)
52
+ 3. `FLARE_POSTGRES_DSN`
53
+ 4. `FLARE_REDIS_URL`
54
+ 5. `FLARE_QDRANT_URL`
55
+
56
+ 健康检查会输出依赖状态:
57
+
58
+ 1. `llm_ready`
59
+ 2. `postgres_ready`
60
+ 3. `redis_ready`
61
+ 4. `qdrant_ready`
62
+
63
+ 模式决策优先级(`/kernel/run` 与 `/kernel/stream`):
64
+
65
+ 1. `intent_override`(外部业务侧注入)
66
+ 2. 消息意图识别(内置关键词)
67
+ 3. `manual_mode`
68
+ 4. `current_mode`
69
+ 5. fallback(`intent/default`)
70
+
47
71
  ## 最小发布说明
48
72
 
49
73
  1. 当前包版本:`0.1.0`
@@ -4,15 +4,20 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "flare-kernel"
7
- version = "0.1.0"
7
+ version = "0.2.0"
8
8
  description = "FLARE kernel runtime package"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
11
11
  dependencies = [
12
- "flare-engines>=0.1.0,<0.2.0",
12
+ "flare-engines>=0.2.0,<0.3.0",
13
13
  "fastapi>=0.115,<1.0",
14
14
  "pydantic>=2,<3",
15
15
  "uvicorn>=0.30,<1.0",
16
+ "httpx>=0.27,<1.0",
17
+ "sqlalchemy>=2,<3",
18
+ "psycopg2-binary>=2.9,<3",
19
+ "redis>=5,<6",
20
+ "qdrant-client>=1.9,<2",
16
21
  ]
17
22
  license = { text = "Proprietary" }
18
23
  classifiers = [
@@ -0,0 +1,23 @@
1
+ """Kernel contracts."""
2
+
3
+ from flare_kernel.contracts.kernel_contract import (
4
+ HealthResponse,
5
+ IntentSuggestResponse,
6
+ KernelRequest,
7
+ KernelResponse,
8
+ KnowledgeIngestRequest,
9
+ KnowledgeIngestResponse,
10
+ KnowledgeSearchRequest,
11
+ KnowledgeSearchResponse,
12
+ )
13
+
14
+ __all__ = [
15
+ "KernelRequest",
16
+ "KernelResponse",
17
+ "HealthResponse",
18
+ "IntentSuggestResponse",
19
+ "KnowledgeIngestRequest",
20
+ "KnowledgeIngestResponse",
21
+ "KnowledgeSearchRequest",
22
+ "KnowledgeSearchResponse",
23
+ ]
@@ -0,0 +1,96 @@
1
+ """Kernel API contracts."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, Literal
6
+
7
+ from pydantic import BaseModel, Field
8
+
9
+
10
+ class KernelRequest(BaseModel):
11
+ tenant_id: str = "default"
12
+ instance_id: str = "default"
13
+ domain_pack_version: str = "v1"
14
+ session_id: str = "default"
15
+ intent: str = "default"
16
+ intent_override: str | None = None
17
+ mode: str | None = None
18
+ manual_mode: str | None = None
19
+ current_mode: str | None = None
20
+ project_id: str | None = None
21
+ user_id: str | None = None
22
+ retrieval_config: dict[str, Any] = Field(default_factory=dict)
23
+ canvas_config: dict[str, Any] = Field(default_factory=dict)
24
+ plan_config: dict[str, Any] = Field(default_factory=dict)
25
+ payload: dict[str, Any] = Field(default_factory=dict)
26
+ context_refs: list[Any] = Field(default_factory=list)
27
+ knowledge_refs: list[str] = Field(default_factory=list)
28
+ action_key: str | None = None
29
+ target_mode: str | None = None
30
+ action_status: str | None = None
31
+ action_reason: str | None = None
32
+ trace_id: str | None = None
33
+
34
+
35
+ class KernelResponse(BaseModel):
36
+ trace_id: str
37
+ state: Literal["RUNNING", "SUCCEEDED", "FAILED"]
38
+ events: list[dict[str, Any]] = Field(default_factory=list)
39
+ result: dict[str, Any] = Field(default_factory=dict)
40
+ next_actions: list[dict[str, Any]] = Field(default_factory=list)
41
+
42
+
43
+ class HealthResponse(BaseModel):
44
+ status: Literal["healthy"]
45
+ service: str
46
+ trace_id: str
47
+ llm_ready: bool
48
+ postgres_ready: bool
49
+ redis_ready: bool
50
+ qdrant_ready: bool
51
+ canvas_ready: bool
52
+ rag_ready: bool
53
+ plan_ready: bool
54
+
55
+
56
+ class KnowledgeIngestRequest(BaseModel):
57
+ project_id: str = "default"
58
+ user_id: str = "default"
59
+ session_id: str = "default"
60
+ source_id: str | None = None
61
+ title: str | None = None
62
+ content: str
63
+ metadata: dict[str, Any] = Field(default_factory=dict)
64
+
65
+
66
+ class KnowledgeIngestResponse(BaseModel):
67
+ trace_id: str
68
+ project_id: str
69
+ user_id: str
70
+ record_id: str
71
+ chunk_count: int
72
+ status: Literal["stored", "partial", "failed"]
73
+ details: dict[str, Any] = Field(default_factory=dict)
74
+
75
+
76
+ class KnowledgeSearchRequest(BaseModel):
77
+ project_id: str = "default"
78
+ user_id: str = "default"
79
+ query: str
80
+ top_k: int = 5
81
+
82
+
83
+ class KnowledgeSearchResponse(BaseModel):
84
+ trace_id: str
85
+ project_id: str
86
+ user_id: str
87
+ query: str
88
+ results: list[dict[str, Any]] = Field(default_factory=list)
89
+
90
+
91
+ class IntentSuggestResponse(BaseModel):
92
+ trace_id: str
93
+ suggested_mode: str
94
+ confidence: float = 0.0
95
+ reason: str = ""
96
+ source: Literal["intent_override", "manual", "current", "llm", "keywords", "fallback"] = "fallback"