@tachu/host-defaults 1.0.0-rc.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/CHANGELOG.md +52 -0
- package/LICENSE +201 -0
- package/README.md +200 -0
- package/README_ZH.md +201 -0
- package/dist/build-host-engine-dependencies.d.ts +51 -0
- package/dist/build-host-engine-dependencies.d.ts.map +1 -0
- package/dist/build-host-engine-dependencies.js +70 -0
- package/dist/build-host-engine-dependencies.js.map +1 -0
- package/dist/capabilities.d.ts +10 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +26 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +8 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/providers.d.ts +10 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +104 -0
- package/dist/providers.js.map +1 -0
- package/dist/resolve-embedding-runtime.d.ts +11 -0
- package/dist/resolve-embedding-runtime.d.ts.map +1 -0
- package/dist/resolve-embedding-runtime.js +26 -0
- package/dist/resolve-embedding-runtime.js.map +1 -0
- package/dist/resolve-projection-stack.d.ts +59 -0
- package/dist/resolve-projection-stack.d.ts.map +1 -0
- package/dist/resolve-projection-stack.js +146 -0
- package/dist/resolve-projection-stack.js.map +1 -0
- package/dist/resolve-semantic-judge.d.ts +3 -0
- package/dist/resolve-semantic-judge.d.ts.map +1 -0
- package/dist/resolve-semantic-judge.js +18 -0
- package/dist/resolve-semantic-judge.js.map +1 -0
- package/dist/semantic-retrieval.d.ts +9 -0
- package/dist/semantic-retrieval.d.ts.map +1 -0
- package/dist/semantic-retrieval.js +44 -0
- package/dist/semantic-retrieval.js.map +1 -0
- package/package.json +59 -0
package/README_ZH.md
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# Tachu
|
|
2
|
+
|
|
3
|
+
**正在积极开发中的 Agentic 引擎——目标是成为将任何 LLM 变为可靠、可观测 Agent 的 *Harness*。**
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@tachu/core)
|
|
6
|
+
[](#项目状态project-status)
|
|
7
|
+
[](#许可证license)
|
|
8
|
+
[](https://bun.sh)
|
|
9
|
+
[](https://www.typescriptlang.org)
|
|
10
|
+
|
|
11
|
+
> **项目状态 —— Release Candidate。** 9 阶段主干、Registry、Prompt 组装、CLI、OpenAI / Anthropic / Qwen / Gemini Adapter、MCP Adapter、向量存储与可观测性 Emitter 已完成接线并有测试覆盖。Phase 3(意图分析)是真实 LLM 调用,Phase 5 会把复杂且具备可见工具的请求路由到内置 `tool-use` loop,Phase 8 运行 deterministic 验证规则并支持可选 semantic judge。Runtime provider fallback 与 semantic judge 生产级策略属于 rc 后续加固。请使用 `@rc` dist-tag 安装。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 什么是 Tachu?
|
|
16
|
+
|
|
17
|
+
**太初有道,万物之始。以声明式描述符创造 Agent 万物。**
|
|
18
|
+
|
|
19
|
+
Tachu 的目标是成为一个**你可以基于它做真实产品的 Agentic 引擎**——不是 Demo 玩具,不是 API 薄封装。它是等式 **Agent = Model + Harness** 中的 *Harness*:提供结构骨架(协议、生命周期、安全、记忆、编排),让任何 LLM 都能成为可靠、可观测的 Agent。
|
|
20
|
+
|
|
21
|
+
引擎本身刻意**不感知业务领域**——它不知道你的业务逻辑、用户身份或领域词汇。取而代之的是,它定义了一套极简的核心抽象(Rules、Skills、Tools、Agents),业务通过这些抽象注入所有智能。Tachu 被设计来处理那些真正困难的部分:9 阶段执行主干、双平面语义匹配、上下文窗口管理、精确 Token 计数的 Prompt 组装、结构化重试/降级、取消传播,以及端到端可观测性。
|
|
22
|
+
|
|
23
|
+
Tachu 以 Bun 原生 TypeScript Monorepo 形式发布,包含三个已发布包:零依赖引擎核心(`@tachu/core`)、官方扩展库(`@tachu/extensions`),以及完整功能的 CLI 程序(`@tachu/cli`,同时也是参考实现);另外有 `@tachu/host-defaults` 供 CLI 与嵌入式 host 共享默认装配,以及一个可选的私有 sidecar 包(`@tachu/web-fetch-server`),用于远端浏览器抓取类工具。
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 项目状态(Project Status)
|
|
28
|
+
|
|
29
|
+
**当前发布版本:** `1.0.0-rc.0`(`rc` dist-tag)
|
|
30
|
+
|
|
31
|
+
**版本术语:** 当前产品线为 **Tachu v1**。Release candidate 是 `1.0.0` 的稳定化构建,不是新的框架代际;`/v1/extract` 等仅为 HTTP API 版本。详见 [详细设计 · 版本与发布术语](docs/detailed-design.md#版本与发布术语必读)。
|
|
32
|
+
|
|
33
|
+
这是一次**架构骨架**发布——核心基础设施基本就绪,但 Result Validation 与若干生产化闭环仍未完成。下表仅为**可读性索引**;运行时行为、默认值与边界情况以所引用的源码与测试为准,不在此重复展开。
|
|
34
|
+
|
|
35
|
+
| 能力 | 状态 | 说明 |
|
|
36
|
+
|-----|------|-----|
|
|
37
|
+
| 9 阶段主干骨架(类型、编排器、状态机、Hook 链路) | ✅ 已实现 | `packages/core/src/engine` |
|
|
38
|
+
| Descriptor Registry(Rules / Skills / Tools / Agents) | ✅ 已实现 | Markdown + YAML frontmatter 加载、语义索引、启动校验 |
|
|
39
|
+
| Prompt 组装器(tiktoken、KV Cache 友好顺序) | ✅ 已实现 | `packages/core/src/prompt` |
|
|
40
|
+
| 任务调度器、DAG 校验、turn/task 重试簿记 | ✅ 已实现 | `packages/core/src/engine/scheduler.ts`;**LLM 失败时的 runtime provider fallback 未接线**(见 [LLM Provider](./docs/guides/providers-and-integrations.md)) |
|
|
41
|
+
| Session / Memory / Runtime-state / Safety / Model-router / Provider / Observability / Hooks 八大模块 | ✅ 已实现 | `packages/core/src/modules` |
|
|
42
|
+
| OpenAI / Anthropic / Qwen / Mock Provider Adapter | ✅ 已实现 | CLI 经 `@tachu/host-defaults` 自动装配;流式、函数调用、工具 Schema |
|
|
43
|
+
| Gemini Provider Adapter | ✅ 已实现(需手动接线) | `@tachu/extensions` 提供 `GeminiProviderAdapter` 与单测;**不会**被 CLI 默认 `buildProviderAdapter` 注册 —— 需 `createEngine(..., { providers: [new GeminiProviderAdapter(...)] })` 显式注入(见 [LLM Provider](./docs/guides/providers-and-integrations.md)) |
|
|
44
|
+
| `apiKey` / `baseURL` / `organization` / `timeoutMs` 配置(env var / `tachu.config.ts` / CLI flags) | ✅ 已实现 | 支持 Azure OpenAI / LiteLLM / OpenRouter / 自建网关 |
|
|
45
|
+
| 22 个内置 Tools + Terminal / File / Web Backend | ✅ 已实现 | `packages/extensions/src/tools/index.ts` |
|
|
46
|
+
| MCP stdio + SSE Adapter | ✅ 已实现 | `packages/extensions/src/mcp` |
|
|
47
|
+
| `LocalFsVectorIndexAdapter`(文件持久化)+ `QdrantVectorIndexAdapter`(REST) | ✅ 已实现 | |
|
|
48
|
+
| OTel / JSONL Emitter | ✅ 已实现 | |
|
|
49
|
+
| `tachu init` / `tachu run` / `tachu chat` CLI、流式渲染、Session 持久化、Ctrl+C 语义 | ✅ 已实现 | |
|
|
50
|
+
| **CLI 终端 Markdown 渲染** | ✅ **已实现** | 基于 `marked` + `marked-terminal` + `cli-highlight` 栈。作用于 `tachu chat` / `tachu run --output text` 的最终回复:TTY 环境自动开启,`NO_COLOR` / 非 TTY / `--no-color` 下自动关闭;`tachu run` 支持通过 `--markdown` / `--no-markdown` 显式开关。专用封装 `renderMarkdownToAnsi`(`packages/cli/src/renderer/markdown.ts`),附 12 个单测(`markdown.test.ts`)。 |
|
|
51
|
+
| **Phase 3 意图分析(LLM 调用,纯分类)** | ✅ **已实现** | 仅做分类(`IntentResult`);面向用户的最终答复由 Phase 7 `direct-answer` 负责。**实现:** `packages/core/src/engine/phases/intent.ts`(`INTENT_SYSTEM_PROMPT_BASE`、快速路径、JSON 解析、启发式兜底);测试:`intent.test.ts`。宿主可 **`config.intent.systemPromptBase`** 完整替换 base;可选追加 few-shot:`config.intent.fewShotExamples`(Agent Context / explicit selections 仍由 core 追加)。 |
|
|
52
|
+
| **Phase 5 任务规划(planning router)** | ✅ **已实现** | 强制 `plans[0].tasks.length >= 1`。规则:(1) `simple` 意图 → 单步 `direct-answer` 子流程任务;(2) `complex` + 有可见工具 → 单步 `tool-use` 子流程任务;(3) `complex` + 无可见工具 → 单步 `direct-answer` 子流程任务(携带 `warn: true`);(4) 后置守护:上游回归导致 `tasks` 为空时自动兜底。多步行为由 `tool-use` 内部承担;未来可以继续演进 Plan Preview / Human Review,但主路径不存在单独的默认 LLM 预规划器。 |
|
|
53
|
+
| **`direct-answer` 内置子流程(Phase 7)** | ✅ **已实现** | `packages/core/src/engine/subflows/direct-answer.ts`。解析 `capabilityMapping.intent`(未命中时回退到 `fast-cheap`),组合 system + ≤10 条历史 + 用户 prompt,以合并后的 AbortSignal 调用 `ProviderAdapter.chat()`,单次超时 60s。System Prompt 强制**自然语言 + Markdown**、禁止 JSON 壳 / `"已识别请求:…"` 模板 / 4 空格缩进式代码块;`warn: true` 时子流程会坦诚说明"当前无匹配工具"。observability 事件统一以 `phase: "direct-answer"` 发出(`llm_call_start` / `llm_call_end`)。保留名机制:`DescriptorRegistry` 会把 `direct-answer` 列入保留名,业务侧注册 / 注销同名描述符将抛 `RegistryError.reservedName`。 |
|
|
54
|
+
| **Phase 8 结果验证 Outcome** | 🟡 **部分接线** | `ValidationOutcome` 联合类型 + `ValidationRuleRegistry`(**5 条 deterministic rules**,见 `buildDefaultValidationRuleRegistry()`,`packages/core/src/engine/phases/validation/index.ts`)。可选 `ProviderSemanticJudgeAdapter` / `BudgetedSemanticJudgeAdapter`。Engine 消费 `retry`(turn 循环,`decideTurnRetry`)、`degrade` / `handoff`(退出到 Output)。缺口:无独立 `ExecutionPolicy` 类型;runtime provider fallback 未实现,semantic judge 尚非 production-complete。 |
|
|
55
|
+
| **Phase 9 输出装配** | ✅ **已实现** | 内容选择顺序:`taskResults['task-direct-answer']` → 结构化 `{intent, taskResults}` JSON(工具链成功路径;语义层面的润色仍依赖真实 Phase 8)→ 中文诚实回退文案(validation 未通过)。内部 state JSON 不会再外泄到用户侧。专项测试见 `output.test.ts`。 |
|
|
56
|
+
| 真实环境端到端烟测(OpenAI / Anthropic / Azure 等) | 🟡 **已手工验证;可选脚本化** | CI 内 Adapter 以 Mock 单测为主;维护者已 **手工跑通** 真实 LLM 路径(含自建网关)。仓库提供 **可选** 脚本化 e2e —— 预先配置 `TACHU_REAL_E2E=1` 与 `TACHU_E2E_API_KEY` / `TACHU_E2E_API_BASE` / `TACHU_E2E_PROVIDER`(见[贡献指南](./CONTRIBUTING.md))—— 但默认 CI 不发布签署记录。 |
|
|
57
|
+
| 生产加固(SLO、错误预算、故障注入、签名 provenance) | 🔴 未开展 | `1.0.0`(Tachu v1)目标。 |
|
|
58
|
+
|
|
59
|
+
图例:✅ 已实现并有测试 · 🟡 骨架存在、真实实现进行中 · 🔴 未开工。
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 核心亮点(Key Features)
|
|
64
|
+
|
|
65
|
+
- **9 阶段执行主干** — 会话管理 → 安全准入 → 意图分析(纯分类)→ 前置校验 → planning router → DAG 校验 → 子任务执行 → 结果验证 outcome → 输出规范;每个阶段类型安全、可挂钩,且每个请求(simple 或 complex)都会完整穿过 9 个阶段,Rules / Hooks / Observability / 预算熔断统一生效
|
|
66
|
+
- **任务计划 + 工具循环(Task Planning + Tool-use Loop)** — Phase 5 不预先生成完整的排序多步计划,而是把 `simple` 请求路由到 `direct-answer`,把 `complex + 可见工具` 路由进内置 `tool-use` Agentic Loop,由循环内部完成 LLM 工具选择 → 受控工具执行 → 工具结果回灌 → 最终答复。
|
|
67
|
+
- **`direct-answer` 内置子流程** — 对 simple 请求(以及 complex 但无匹配工具的请求),最终答复由一个引擎内置的一等公民子流程在 Phase 7 产出,不再由意图分析阶段捎带。
|
|
68
|
+
- **双平面匹配(Dual-Plane Matching)** — 语义发现(向量相似度)+ 确定性执行闸门(Scopes、白名单、审批),作用于所有 Rules、Skills、Tools 和 Agents
|
|
69
|
+
- **四大核心抽象** — 以 Markdown + YAML frontmatter 描述符声明 Rules、Skills、Tools、Agents;引擎自动解析、激活并编排
|
|
70
|
+
- **OpenAI 与 Anthropic Adapter** — 流式、函数调用、`baseURL` / `organization` / `timeoutMs` 可配置;可对接 Azure OpenAI / LiteLLM / OpenRouter / 任意自建网关
|
|
71
|
+
- **MCP 集成** — 通过 `McpToolAdapter` 接入任意 MCP 服务端(stdio 或 SSE);MCP Tools 成为引擎一等公民
|
|
72
|
+
- **精确 Token 计数** — 基于 tiktoken 的精确 Token 统计;KV Cache 友好的 Prompt 布局;自动上下文压缩(Head-Middle-Tail 策略)
|
|
73
|
+
- **结构化记忆(Memory System)** — 会话上下文窗口(含可配置上限);压缩前强制归档;长期向量记忆召回
|
|
74
|
+
- **OpenTelemetry 可观测性** — 每个阶段进入/退出、LLM 调用、Tool 调用、重试和降级都产出结构化 `EngineEvent`;内置 OTel 与 JSONL Emitter
|
|
75
|
+
- **交互式 CLI** — `tachu chat` / `tachu run` / `tachu init`,完整参数体系、流式渲染、Session 持久化、Ctrl+C 取消传播
|
|
76
|
+
- **终端 Markdown 渲染** —— 最终回复由 `marked` + `marked-terminal` + `cli-highlight` 渲染;支持标题、粗体 / 斜体、列表、块引用、链接、表格、带代码高亮的 fenced code block。`NO_COLOR` / 非 TTY / `--no-color` 下自动关闭;`tachu run` 可通过 `--markdown` / `--no-markdown` 显式控制。
|
|
77
|
+
- **Fail-Closed 安全基线** — 循环防护、预算熔断、基础输入校验硬编码于引擎核心,不可关闭
|
|
78
|
+
- **Qdrant 与 LocalFs 向量存储** — 多进程部署使用 Qdrant,本地/单进程使用文件持久化
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 愿景(Vision)
|
|
83
|
+
|
|
84
|
+
> 太初有道,万物之始。以声明式描述符创造 Agent 万物。
|
|
85
|
+
|
|
86
|
+
Tachu 的长期愿景是成为**通用 Agent 框架**:**引擎提供骨架,业务填充血肉**——任何组织都能基于稳定、可观测、可审计的基础设施构建生产级 Agentic 系统,而无需每次从头解决安全、上下文管理、重试逻辑和多 Provider 编排等困难问题。
|
|
87
|
+
|
|
88
|
+
Tachu 基于三个核心信念:
|
|
89
|
+
|
|
90
|
+
1. **Harness 才是难点。** 模型智能已经商品化;可靠的编排机制尚未。Tachu 深度投资引擎基础设施,让应用开发者专注领域逻辑。
|
|
91
|
+
2. **声明优于实现(Declaration over implementation)。** Rules、Skills、Tools、Agents 均以普通 Markdown 文件声明。引擎负责解析。无框架样板代码。
|
|
92
|
+
3. **默认可观测。** 每个内部事件都是结构化且可发出的。生产系统需要完整 Trace——Tachu 无需额外埋点即可提供。
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 核心抽象(Core Abstractions)
|
|
97
|
+
|
|
98
|
+
Rule、Skill、Tool、Agent 以 Markdown + YAML 描述符声明。语义发现给出候选,确定性闸门(尤其 Tool)决定是否执行。
|
|
99
|
+
|
|
100
|
+
详见 [概要设计 · 四大核心抽象](./docs/overview-design.md#三四大核心抽象) · [双平面匹配](./docs/overview-design.md#共享特性)。
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 架构概览(摘要)
|
|
105
|
+
|
|
106
|
+
请求经 **9 阶段主干**;复杂工具任务在 Phase 7 进入内置 `tool-use` Agentic Loop。
|
|
107
|
+
|
|
108
|
+
详见 [Pipeline 阶段详解](./docs/architecture/pipeline-phases.md) · [概要设计](./docs/overview-design.md)。
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 安装(Installation)
|
|
113
|
+
|
|
114
|
+
Tachu 需要 [Bun](https://bun.sh) 作为运行时。
|
|
115
|
+
|
|
116
|
+
> **请使用 `@rc` dist-tag 安装**(或固定到具体版本),直至 Tachu 进入稳定版。
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
# 安装引擎核心
|
|
120
|
+
bun add @tachu/core@rc
|
|
121
|
+
|
|
122
|
+
# 安装扩展库(Provider、Tools、Backend、向量存储)
|
|
123
|
+
bun add @tachu/extensions@rc
|
|
124
|
+
|
|
125
|
+
# 全局安装 CLI
|
|
126
|
+
bun add -g @tachu/cli@rc
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
安装完成后验证:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
tachu --version # 预期输出 1.0.0-rc.0 或更新
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 快速开始(Quick Start)
|
|
138
|
+
|
|
139
|
+
### CLI 方式
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# 1. 初始化项目工作空间
|
|
143
|
+
tachu init --template minimal --provider openai
|
|
144
|
+
|
|
145
|
+
# 2. 设置 API Key
|
|
146
|
+
export OPENAI_API_KEY=sk-...
|
|
147
|
+
|
|
148
|
+
# 3. 单次执行 Prompt
|
|
149
|
+
tachu run "帮我总结最近 5 条 git commit 的内容"
|
|
150
|
+
|
|
151
|
+
# 4. 进入交互式对话
|
|
152
|
+
tachu chat
|
|
153
|
+
|
|
154
|
+
# 恢复最近一次 Session
|
|
155
|
+
tachu chat --resume
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
编程式接入见 [配置](./docs/guides/configuration.md) 与 `@tachu/host-defaults`。
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## 文档(Documentation)
|
|
164
|
+
|
|
165
|
+
| 文档 | 说明 |
|
|
166
|
+
|------|------|
|
|
167
|
+
| [概要设计](./docs/overview-design.md) | 愿景、分层、抽象、主干流程 |
|
|
168
|
+
| [详细设计](./docs/detailed-design.md) | 类型、模块、配置 Schema |
|
|
169
|
+
| [技术设计](./docs/technical-design.md) | 工程结构与实现指南 |
|
|
170
|
+
| [Pipeline 阶段详解](./docs/architecture/pipeline-phases.md) | 9 阶段与 tool-use 循环 |
|
|
171
|
+
| [包结构](./docs/architecture/package-layout.md) | Monorepo 包与依赖 |
|
|
172
|
+
| [设计原则](./docs/architecture/design-principles.md) | 核心工程原则 |
|
|
173
|
+
| [CLI 参考](./docs/guides/cli.md) | 命令与参数 |
|
|
174
|
+
| [配置](./docs/guides/configuration.md) | `tachu.config.ts` |
|
|
175
|
+
| [Provider 与集成](./docs/guides/providers-and-integrations.md) | LLM、MCP、向量库 |
|
|
176
|
+
| [扩展指南](./docs/guides/extension-guide.md) | Rule / Skill / Tool / Agent |
|
|
177
|
+
| [可观测性与安全](./docs/guides/observability-and-safety.md) | 事件、OTel、安全 |
|
|
178
|
+
| [CONTEXT.md](./CONTEXT.md) | 产品术语 |
|
|
179
|
+
| [CONTRIBUTING.md](./CONTRIBUTING.md) | 开发流程 |
|
|
180
|
+
| [Web Fetch Server](./packages/web-fetch-server/README.md) | 可选 sidecar |
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Web Fetch Server(可选)
|
|
185
|
+
|
|
186
|
+
浏览器渲染的 `web-fetch` / `web-search` 需可选 sidecar,见 [packages/web-fetch-server/README.md](./packages/web-fetch-server/README.md)。
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
bun run dev:server:install-browser
|
|
190
|
+
bun run dev:server
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## 许可证(License)
|
|
196
|
+
|
|
197
|
+
[Apache License 2.0](./LICENSE) © 2026 Tachu Contributors
|
|
198
|
+
|
|
199
|
+
本项目采用 Apache License 2.0 许可证发布。许可证全文见 [LICENSE](./LICENSE) 文件,也可在 <http://www.apache.org/licenses/LICENSE-2.0> 获取。
|
|
200
|
+
|
|
201
|
+
除非适用法律要求或书面同意,按照本许可证分发的软件是按"原样"分发的,不附带任何明示或暗示的担保或条件。请参阅许可证以了解特定语言的管理权限和限制。
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { EngineConfig, EngineDependencies, ObservabilityEmitter, ProviderAdapter } from "@tachu/core";
|
|
2
|
+
import { type ProjectionStack } from "./resolve-projection-stack";
|
|
3
|
+
export interface BuildHostEngineDependenciesOptions {
|
|
4
|
+
/** Override provider list (defaults to inferProviders(config)). */
|
|
5
|
+
providers?: ProviderAdapter[];
|
|
6
|
+
observability: ObservabilityEmitter;
|
|
7
|
+
/**
|
|
8
|
+
* Working directory used by adapters that persist relative paths (e.g. the
|
|
9
|
+
* default LocalFs vector index at `<cwd>/.tachu/vector-index.json`).
|
|
10
|
+
*/
|
|
11
|
+
cwd?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface BuildHostEngineDependenciesResult {
|
|
14
|
+
/** Subset of {@link EngineDependencies} ready to spread into `new Engine()`. */
|
|
15
|
+
engineDependencies: Partial<EngineDependencies>;
|
|
16
|
+
/**
|
|
17
|
+
* Resolved {@link ProjectionStack} (embed runtime + vector index + bind
|
|
18
|
+
* helper). Hosts plug it into {@link FsMemorySystem} alongside a
|
|
19
|
+
* {@link ProjectionOutbox} to wire up projection.
|
|
20
|
+
*
|
|
21
|
+
* `undefined` when either the embedding runtime or the vector index cannot
|
|
22
|
+
* be resolved — in that case projection is disabled and the
|
|
23
|
+
* `projection.disabled` warning has already been emitted.
|
|
24
|
+
*/
|
|
25
|
+
projectionStack: ProjectionStack | undefined;
|
|
26
|
+
/** Inferred / overridden provider list, in case callers need it directly. */
|
|
27
|
+
providers: ProviderAdapter[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Resolve shared host dependencies for Engine construction.
|
|
31
|
+
*
|
|
32
|
+
* CLI and non-CLI hosts call this for provider + semantic retrieval +
|
|
33
|
+
* projection wiring. The returned `projectionStack` is independent of the
|
|
34
|
+
* Engine dependency object — hosts decide whether to assemble
|
|
35
|
+
* {@link FsMemorySystem} (CLI default), an in-memory `MemorySystem`, or some
|
|
36
|
+
* custom durable store; whichever path they pick should plug
|
|
37
|
+
* `projectionStack.bindProjectionProject` into their projector callback so
|
|
38
|
+
* the {@link ProjectionWorker} can drain pending refs through the
|
|
39
|
+
* embedding-runtime + vector-index stack.
|
|
40
|
+
*
|
|
41
|
+
* @returns {@link BuildHostEngineDependenciesResult} with the partial
|
|
42
|
+
* {@link EngineDependencies} payload plus the projection stack. For
|
|
43
|
+
* backwards-compatibility, the result is also iterable as `Partial<EngineDependencies>`
|
|
44
|
+
* via the `engineDependencies` field.
|
|
45
|
+
*/
|
|
46
|
+
export declare function buildHostEngineDependencies(config: EngineConfig, options: BuildHostEngineDependenciesOptions): BuildHostEngineDependenciesResult;
|
|
47
|
+
export declare function emitMockProviderWarnings(providers: readonly ProviderAdapter[], observability: ObservabilityEmitter): void;
|
|
48
|
+
/**
|
|
49
|
+
* MockProviderAdapter 在装配进 providers 时 emit 警告事件。
|
|
50
|
+
*/
|
|
51
|
+
//# sourceMappingURL=build-host-engine-dependencies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-host-engine-dependencies.d.ts","sourceRoot":"","sources":["../src/build-host-engine-dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EAChB,MAAM,aAAa,CAAC;AAOrB,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE1F,MAAM,WAAW,kCAAkC;IAClD,mEAAmE;IAClE,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,aAAa,EAAE,oBAAoB,CAAC;IACrC;;;MAGE;IACD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iCAAiC;IACjD,gFAAgF;IAC/E,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjD;;;;;;;;MAQE;IACD,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IAC9C,6EAA6E;IAC5E,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,kCAAkC,GAC1C,iCAAiC,CA8BnC;AACD,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,SAAS,eAAe,EAAE,EACrC,aAAa,EAAE,oBAAoB,GAClC,IAAI,CAsBN;AAED;;GAEG"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { MockProviderAdapter } from "@tachu/extensions/providers";
|
|
2
|
+
import { assertCapabilityProvided } from "./capabilities";
|
|
3
|
+
import { ENGINE_INIT_CORRELATION } from "./constants";
|
|
4
|
+
import { inferProviders } from "./providers";
|
|
5
|
+
import { resolveSemanticRetrievalFacade } from "./semantic-retrieval";
|
|
6
|
+
import { resolveSemanticJudge } from "./resolve-semantic-judge";
|
|
7
|
+
import { resolveProjectionStack } from "./resolve-projection-stack";
|
|
8
|
+
/**
|
|
9
|
+
* Resolve shared host dependencies for Engine construction.
|
|
10
|
+
*
|
|
11
|
+
* CLI and non-CLI hosts call this for provider + semantic retrieval +
|
|
12
|
+
* projection wiring. The returned `projectionStack` is independent of the
|
|
13
|
+
* Engine dependency object — hosts decide whether to assemble
|
|
14
|
+
* {@link FsMemorySystem} (CLI default), an in-memory `MemorySystem`, or some
|
|
15
|
+
* custom durable store; whichever path they pick should plug
|
|
16
|
+
* `projectionStack.bindProjectionProject` into their projector callback so
|
|
17
|
+
* the {@link ProjectionWorker} can drain pending refs through the
|
|
18
|
+
* embedding-runtime + vector-index stack.
|
|
19
|
+
*
|
|
20
|
+
* @returns {@link BuildHostEngineDependenciesResult} with the partial
|
|
21
|
+
* {@link EngineDependencies} payload plus the projection stack. For
|
|
22
|
+
* backwards-compatibility, the result is also iterable as `Partial<EngineDependencies>`
|
|
23
|
+
* via the `engineDependencies` field.
|
|
24
|
+
*/
|
|
25
|
+
export function buildHostEngineDependencies(config, options) {
|
|
26
|
+
const { observability } = options;
|
|
27
|
+
const providers = options.providers ?? inferProviders(config);
|
|
28
|
+
const { facade: semanticRetrievalFacade } = resolveSemanticRetrievalFacade(config, providers, observability);
|
|
29
|
+
emitMockProviderWarnings(providers, observability);
|
|
30
|
+
assertCapabilityProvided(observability, "providers", providers.length > 0, "providers");
|
|
31
|
+
const semanticJudge = resolveSemanticJudge(config, providers);
|
|
32
|
+
const projectionStack = resolveProjectionStack(config, providers, observability, {
|
|
33
|
+
...(options.cwd !== undefined ? { cwd: options.cwd } : {}),
|
|
34
|
+
});
|
|
35
|
+
const engineDependencies = {
|
|
36
|
+
providers,
|
|
37
|
+
semanticRetrievalFacade,
|
|
38
|
+
...(semanticJudge !== undefined ? { semanticJudge } : {}),
|
|
39
|
+
};
|
|
40
|
+
return {
|
|
41
|
+
engineDependencies,
|
|
42
|
+
projectionStack,
|
|
43
|
+
providers,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function emitMockProviderWarnings(providers, observability) {
|
|
47
|
+
const suppressMockWarning = process.env.NODE_ENV !== "production" &&
|
|
48
|
+
process.env.TACHU_SUPPRESS_MOCK_WARNING === "1";
|
|
49
|
+
if (suppressMockWarning)
|
|
50
|
+
return;
|
|
51
|
+
for (const provider of providers) {
|
|
52
|
+
if (provider instanceof MockProviderAdapter) {
|
|
53
|
+
observability.emit({
|
|
54
|
+
timestamp: Date.now(),
|
|
55
|
+
correlation: ENGINE_INIT_CORRELATION,
|
|
56
|
+
phase: "init",
|
|
57
|
+
type: "warning",
|
|
58
|
+
payload: {
|
|
59
|
+
status: "provider.mock.in-use",
|
|
60
|
+
adapter: "MockProviderAdapter",
|
|
61
|
+
reason: "MockProviderAdapter returns scripted responses; not safe for production traffic",
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* MockProviderAdapter 在装配进 providers 时 emit 警告事件。
|
|
69
|
+
*/
|
|
70
|
+
//# sourceMappingURL=build-host-engine-dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-host-engine-dependencies.js","sourceRoot":"","sources":["../src/build-host-engine-dependencies.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAwB,MAAM,4BAA4B,CAAC;AA8B1F;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAAoB,EACpB,OAA2C;IAE3C,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAClC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;IAE9D,MAAM,EAAE,MAAM,EAAE,uBAAuB,EAAE,GAAG,8BAA8B,CACxE,MAAM,EACN,SAAS,EACT,aAAa,CACd,CAAC;IAEF,wBAAwB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACnD,wBAAwB,CAAC,aAAa,EAAE,WAAW,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;IAExF,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAE9D,MAAM,eAAe,GAAG,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE;QAC/E,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3D,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAgC;QACtD,SAAS;QACT,uBAAuB;QACvB,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1D,CAAC;IAEF,OAAO;QACL,kBAAkB;QAClB,eAAe;QACf,SAAS;KACV,CAAC;AACJ,CAAC;AACD,MAAM,UAAU,wBAAwB,CACtC,SAAqC,EACrC,aAAmC;IAEnC,MAAM,mBAAmB,GACvB,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QACrC,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,GAAG,CAAC;IAClD,IAAI,mBAAmB;QAAE,OAAO;IAEhC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,YAAY,mBAAmB,EAAE,CAAC;YAC5C,aAAa,CAAC,IAAI,CAAC;gBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,WAAW,EAAE,uBAAuB;gBACpC,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE;oBACP,MAAM,EAAE,sBAAsB;oBAC9B,OAAO,EAAE,qBAAqB;oBAC9B,MAAM,EACJ,iFAAiF;iBACpF;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ObservabilityEmitter } from "@tachu/core";
|
|
2
|
+
/**
|
|
3
|
+
* 通用能力契约检查。
|
|
4
|
+
*
|
|
5
|
+
* 当宿主声明依赖某个能力(例如 providers / embeddingRuntime)但传入
|
|
6
|
+
* 了 noop / 空实现时,此函数 throw 让启动 fail-closed,同时 emit `factory.fail-closed`
|
|
7
|
+
* 事件供宿主审计。`provided` 为 `true` 时静默返回。
|
|
8
|
+
*/
|
|
9
|
+
export declare function assertCapabilityProvided(observability: ObservabilityEmitter, capability: string, provided: boolean, adapterName: string): void;
|
|
10
|
+
//# sourceMappingURL=capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGxD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,oBAAoB,EACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,OAAO,EACjB,WAAW,EAAE,MAAM,GAClB,IAAI,CAiBN"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ENGINE_INIT_CORRELATION } from "./constants";
|
|
2
|
+
/**
|
|
3
|
+
* 通用能力契约检查。
|
|
4
|
+
*
|
|
5
|
+
* 当宿主声明依赖某个能力(例如 providers / embeddingRuntime)但传入
|
|
6
|
+
* 了 noop / 空实现时,此函数 throw 让启动 fail-closed,同时 emit `factory.fail-closed`
|
|
7
|
+
* 事件供宿主审计。`provided` 为 `true` 时静默返回。
|
|
8
|
+
*/
|
|
9
|
+
export function assertCapabilityProvided(observability, capability, provided, adapterName) {
|
|
10
|
+
if (provided)
|
|
11
|
+
return;
|
|
12
|
+
observability.emit({
|
|
13
|
+
timestamp: Date.now(),
|
|
14
|
+
correlation: ENGINE_INIT_CORRELATION,
|
|
15
|
+
phase: "init",
|
|
16
|
+
type: "error",
|
|
17
|
+
payload: {
|
|
18
|
+
status: "factory.fail-closed",
|
|
19
|
+
capability,
|
|
20
|
+
adapter: adapterName,
|
|
21
|
+
reason: `declared capability "${capability}" is not provided by adapter "${adapterName}"`,
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
throw new Error(`[factory] declared capability "${capability}" is not provided by adapter "${adapterName}" — refusing to start (fail-closed)`);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,aAAmC,EACnC,UAAkB,EAClB,QAAiB,EACjB,WAAmB;IAEnB,IAAI,QAAQ;QAAE,OAAO;IACrB,aAAa,CAAC,IAAI,CAAC;QACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,WAAW,EAAE,uBAAuB;QACpC,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,OAAO;QACb,OAAO,EAAE;YACP,MAAM,EAAE,qBAAqB;YAC7B,UAAU;YACV,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE,wBAAwB,UAAU,iCAAiC,WAAW,GAAG;SAC1F;KACF,CAAC,CAAC;IACH,MAAM,IAAI,KAAK,CACb,kCAAkC,UAAU,iCAAiC,WAAW,qCAAqC,CAC9H,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,kFAAkF;AAClF,eAAO,MAAM,uBAAuB,EAAE,oBAKrC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Shared correlation for engine-init observability events across host wiring. */
|
|
2
|
+
export const ENGINE_INIT_CORRELATION = {
|
|
3
|
+
traceId: "engine-init",
|
|
4
|
+
requestId: "engine-init",
|
|
5
|
+
sessionId: "engine-init",
|
|
6
|
+
turnId: "engine-init",
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,MAAM,CAAC,MAAM,uBAAuB,GAAyB;IAC3D,OAAO,EAAE,aAAa;IACtB,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,aAAa;IACxB,MAAM,EAAE,aAAa;CACtB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { assertCapabilityProvided } from "./capabilities";
|
|
2
|
+
export { buildHostEngineDependencies, emitMockProviderWarnings, type BuildHostEngineDependenciesOptions, type BuildHostEngineDependenciesResult, } from "./build-host-engine-dependencies";
|
|
3
|
+
export { ENGINE_INIT_CORRELATION } from "./constants";
|
|
4
|
+
export { resolveEmbeddingRuntime, resolveEmbeddingProvider } from "./resolve-embedding-runtime";
|
|
5
|
+
export { buildProviderAdapter, inferProviders } from "./providers";
|
|
6
|
+
export { resolveProjectionStack, resolveVectorIndexAdapter, type ProjectionStack, type ResolveProjectionStackOptions, } from "./resolve-projection-stack";
|
|
7
|
+
export { resolveSemanticJudge } from "./resolve-semantic-judge";
|
|
8
|
+
export { resolveSemanticRetrievalFacade, type ResolveSemanticRetrievalFacadeResult, } from "./semantic-retrieval";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,KAAK,kCAAkC,EACvC,KAAK,iCAAiC,GACvC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,KAAK,eAAe,EACpB,KAAK,6BAA6B,GACnC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EACL,8BAA8B,EAC9B,KAAK,oCAAoC,GAC1C,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { assertCapabilityProvided } from "./capabilities";
|
|
2
|
+
export { buildHostEngineDependencies, emitMockProviderWarnings, } from "./build-host-engine-dependencies";
|
|
3
|
+
export { ENGINE_INIT_CORRELATION } from "./constants";
|
|
4
|
+
export { resolveEmbeddingRuntime, resolveEmbeddingProvider } from "./resolve-embedding-runtime";
|
|
5
|
+
export { buildProviderAdapter, inferProviders } from "./providers";
|
|
6
|
+
export { resolveProjectionStack, resolveVectorIndexAdapter, } from "./resolve-projection-stack";
|
|
7
|
+
export { resolveSemanticJudge } from "./resolve-semantic-judge";
|
|
8
|
+
export { resolveSemanticRetrievalFacade, } from "./semantic-retrieval";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,GAGzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EACL,sBAAsB,EACtB,yBAAyB,GAG1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EACL,8BAA8B,GAE/B,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { EngineConfig, ProviderAdapter } from "@tachu/core";
|
|
2
|
+
/**
|
|
3
|
+
* 根据 provider 名称构建对应的 ProviderAdapter 实例(delegate 到 @tachu/extensions)。
|
|
4
|
+
*/
|
|
5
|
+
export declare function buildProviderAdapter(providerName: string, connections?: EngineConfig["providers"]): ProviderAdapter;
|
|
6
|
+
/**
|
|
7
|
+
* 从 EngineConfig 中推断需要的 Provider 列表。
|
|
8
|
+
*/
|
|
9
|
+
export declare function inferProviders(config: EngineConfig): ProviderAdapter[];
|
|
10
|
+
//# sourceMappingURL=providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EAEhB,MAAM,aAAa,CAAC;AAuErB;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,GACtC,eAAe,CAgBjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,eAAe,EAAE,CAoBtE"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { AnthropicProviderAdapter, MockProviderAdapter, OpenAIProviderAdapter, QwenProviderAdapter, } from "@tachu/extensions/providers";
|
|
2
|
+
function toOpenAIProviderOptions(conn) {
|
|
3
|
+
if (!conn)
|
|
4
|
+
return undefined;
|
|
5
|
+
const out = {};
|
|
6
|
+
if (conn.apiKey !== undefined)
|
|
7
|
+
out.apiKey = conn.apiKey;
|
|
8
|
+
if (conn.baseURL !== undefined)
|
|
9
|
+
out.baseURL = conn.baseURL;
|
|
10
|
+
if (conn.organization !== undefined)
|
|
11
|
+
out.organization = conn.organization;
|
|
12
|
+
if (conn.project !== undefined)
|
|
13
|
+
out.project = conn.project;
|
|
14
|
+
if (conn.timeoutMs !== undefined)
|
|
15
|
+
out.timeoutMs = conn.timeoutMs;
|
|
16
|
+
if (conn.extra !== undefined)
|
|
17
|
+
out.extra = conn.extra;
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
function toAnthropicProviderOptions(conn) {
|
|
21
|
+
if (!conn)
|
|
22
|
+
return undefined;
|
|
23
|
+
const out = {};
|
|
24
|
+
if (conn.apiKey !== undefined)
|
|
25
|
+
out.apiKey = conn.apiKey;
|
|
26
|
+
if (conn.baseURL !== undefined)
|
|
27
|
+
out.baseURL = conn.baseURL;
|
|
28
|
+
if (conn.timeoutMs !== undefined)
|
|
29
|
+
out.timeoutMs = conn.timeoutMs;
|
|
30
|
+
if (conn.extra !== undefined)
|
|
31
|
+
out.extra = conn.extra;
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
function toQwenProviderOptions(conn) {
|
|
35
|
+
if (!conn)
|
|
36
|
+
return undefined;
|
|
37
|
+
const out = {};
|
|
38
|
+
if (conn.apiKey !== undefined)
|
|
39
|
+
out.apiKey = conn.apiKey;
|
|
40
|
+
if (conn.baseURL !== undefined)
|
|
41
|
+
out.compatibleBaseUrl = conn.baseURL;
|
|
42
|
+
if (conn.timeoutMs !== undefined)
|
|
43
|
+
out.timeoutMs = conn.timeoutMs;
|
|
44
|
+
const rawExtra = conn.extra;
|
|
45
|
+
if (rawExtra && typeof rawExtra === "object" && !Array.isArray(rawExtra)) {
|
|
46
|
+
const ex = rawExtra;
|
|
47
|
+
if (typeof ex.dashScopeOrigin === "string") {
|
|
48
|
+
out.dashScopeOrigin = ex.dashScopeOrigin;
|
|
49
|
+
}
|
|
50
|
+
if (typeof ex.workspaceId === "string") {
|
|
51
|
+
out.workspaceId = ex.workspaceId;
|
|
52
|
+
}
|
|
53
|
+
if (typeof ex.imageTaskPollIntervalMs === "number") {
|
|
54
|
+
out.imageTaskPollIntervalMs = ex.imageTaskPollIntervalMs;
|
|
55
|
+
}
|
|
56
|
+
if (typeof ex.modelListCacheTtlMs === "number") {
|
|
57
|
+
out.modelListCacheTtlMs = ex.modelListCacheTtlMs;
|
|
58
|
+
}
|
|
59
|
+
const { dashScopeOrigin: _a, workspaceId: _b, imageTaskPollIntervalMs: _c, modelListCacheTtlMs: _d, ...openAiExtra } = ex;
|
|
60
|
+
if (Object.keys(openAiExtra).length > 0) {
|
|
61
|
+
out.extra = openAiExtra;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 根据 provider 名称构建对应的 ProviderAdapter 实例(delegate 到 @tachu/extensions)。
|
|
68
|
+
*/
|
|
69
|
+
export function buildProviderAdapter(providerName, connections) {
|
|
70
|
+
const conn = connections?.[providerName.toLowerCase()];
|
|
71
|
+
switch (providerName.toLowerCase()) {
|
|
72
|
+
case "openai":
|
|
73
|
+
return new OpenAIProviderAdapter(toOpenAIProviderOptions(conn));
|
|
74
|
+
case "anthropic":
|
|
75
|
+
return new AnthropicProviderAdapter(toAnthropicProviderOptions(conn));
|
|
76
|
+
case "qwen":
|
|
77
|
+
return new QwenProviderAdapter(toQwenProviderOptions(conn));
|
|
78
|
+
case "mock":
|
|
79
|
+
return new MockProviderAdapter();
|
|
80
|
+
default:
|
|
81
|
+
throw new Error(`unknown provider "${providerName}"; supported built-ins: openai, anthropic, qwen, mock. Use a custom ProviderAdapter via createEngine(..., { providers }) or choose "mock" explicitly for development.`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 从 EngineConfig 中推断需要的 Provider 列表。
|
|
86
|
+
*/
|
|
87
|
+
export function inferProviders(config) {
|
|
88
|
+
const providerNames = new Set();
|
|
89
|
+
for (const route of Object.values(config.models.capabilityMapping)) {
|
|
90
|
+
if (typeof route === "object" && route !== null && "provider" in route) {
|
|
91
|
+
providerNames.add(route.provider);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
for (const name of config.models.providerFallbackOrder) {
|
|
95
|
+
providerNames.add(name);
|
|
96
|
+
}
|
|
97
|
+
if (providerNames.size === 0) {
|
|
98
|
+
providerNames.add("mock");
|
|
99
|
+
}
|
|
100
|
+
return Array.from(providerNames)
|
|
101
|
+
.filter((name) => name !== "noop")
|
|
102
|
+
.map((name) => buildProviderAdapter(name, config.providers));
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type EmbeddingRuntime, type EngineConfig, type ProviderAdapter } from "@tachu/core";
|
|
2
|
+
/**
|
|
3
|
+
* Select embed-capable provider using `capabilityMapping.embedding.provider` when set.
|
|
4
|
+
*/
|
|
5
|
+
export declare function resolveEmbeddingProvider(config: EngineConfig, providers: readonly ProviderAdapter[]): ProviderAdapter | undefined;
|
|
6
|
+
export declare function resolveEmbeddingRuntime(config: EngineConfig, providers: readonly ProviderAdapter[]): {
|
|
7
|
+
runtime: EmbeddingRuntime;
|
|
8
|
+
provider: ProviderAdapter;
|
|
9
|
+
model: string;
|
|
10
|
+
} | undefined;
|
|
11
|
+
//# sourceMappingURL=resolve-embedding-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-embedding-runtime.d.ts","sourceRoot":"","sources":["../src/resolve-embedding-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,SAAS,eAAe,EAAE,GACpC,eAAe,GAAG,SAAS,CAY7B;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,SAAS,eAAe,EAAE,GACpC;IAAE,OAAO,EAAE,gBAAgB,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAWrF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ProviderEmbeddingRuntimeAdapter, } from "@tachu/core";
|
|
2
|
+
/**
|
|
3
|
+
* Select embed-capable provider using `capabilityMapping.embedding.provider` when set.
|
|
4
|
+
*/
|
|
5
|
+
export function resolveEmbeddingProvider(config, providers) {
|
|
6
|
+
const embeddingMapping = config.models.capabilityMapping.embedding;
|
|
7
|
+
const preferredId = embeddingMapping?.provider;
|
|
8
|
+
if (preferredId) {
|
|
9
|
+
const matched = providers.find((provider) => provider.id === preferredId);
|
|
10
|
+
if (matched && typeof matched.embed === "function") {
|
|
11
|
+
return matched;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return providers.find((provider) => typeof provider.embed === "function");
|
|
15
|
+
}
|
|
16
|
+
export function resolveEmbeddingRuntime(config, providers) {
|
|
17
|
+
const provider = resolveEmbeddingProvider(config, providers);
|
|
18
|
+
if (!provider || typeof provider.embed !== "function") {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
const embeddingMapping = config.models.capabilityMapping.embedding;
|
|
22
|
+
const model = embeddingMapping?.model ?? "embedding-default";
|
|
23
|
+
const runtime = new ProviderEmbeddingRuntimeAdapter({ provider, model });
|
|
24
|
+
return { runtime, provider, model };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=resolve-embedding-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-embedding-runtime.js","sourceRoot":"","sources":["../src/resolve-embedding-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,GAIhC,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAoB,EACpB,SAAqC;IAErC,MAAM,gBAAgB,GACpB,MAAM,CAAC,MAAM,CAAC,iBACf,CAAC,SAAS,CAAC;IACZ,MAAM,WAAW,GAAG,gBAAgB,EAAE,QAAQ,CAAC;IAC/C,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;QAC1E,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACnD,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,QAAQ,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAAoB,EACpB,SAAqC;IAErC,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC7D,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACtD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,gBAAgB,GACpB,MAAM,CAAC,MAAM,CAAC,iBACf,CAAC,SAAS,CAAC;IACZ,MAAM,KAAK,GAAG,gBAAgB,EAAE,KAAK,IAAI,mBAAmB,CAAC;IAC7D,MAAM,OAAO,GAAG,IAAI,+BAA+B,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC"}
|