# @backtest-kit/ollama 中文文档

规范地址：https://npmcn.com/package/%40backtest-kit/ollama/

版本：23\.7\.0
npm 元数据更新时间：2026-10-29T15:15:07.911Z
中文译文更新时间：2026-11-07T18:19:21.309Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40backtest-kit/ollama
原文对照：https://npmcn.com/package/%40backtest-kit/ollama/?lang=original
项目主页：https://backtest-kit.github.io/documents/article_07_ai_news_trading_signals.html
源码仓库：https://github.com/tripolskypetr/backtest-kit

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：707 kB，5 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- 运行依赖：11 个
- peer 依赖：ollama ^0\.6\.0，openai ^4\.97\.0，groq-sdk ^0\.37\.0，typescript ^5\.0\.0，backtest-kit ^23\.7\.0，@langchain/xai ^0\.0\.2，@langchain/core ^0\.3\.57，@langchain/openai ^0\.4\.9，@huggingface/inference ^4\.7\.1
- 首次发布：2026-01-13T19:10:44.856Z
- 最新版本发布：2026-10-29T15:15:06.311Z
- 近 30 天下载量：3172（2026-10-08 至 2026-11-06，npm 官方下载统计）
- 已发布版本数：183（近 12 个月 183 个）

## 中文简介

多供应商LLM推论库,用于AI动力交易策略. 支持10+供应商,包括OpenAI,克洛德,DeepSeek,Grok,Mistral 具有统一的API和自动符号旋转.

## 安装

```sh
npm install @backtest-kit/ollama
```

也可以使用：`pnpm add @backtest-kit/ollama`、`yarn add @backtest-kit/ollama`、`bun add @backtest-kit/ollama`

## README

![](https://github.com/tripolskypetr/backtest-kit/raw/refs/heads/master/assets/monade.svg)

# @backtest-kit/ollama (英语)

> 通用 LLM 适配器 [反测试- kit](https://www.npmjs.com/package/backtest-kit) 贸易战略。 一个更高级的API **12个供应商**,图案强制结构输出,用户空间提示模块,符号旋转——加一 **LLM 策略优化器** 生成可运行策略代码.

![screenshot](https://raw.githubusercontent.com/tripolskypetr/backtest-kit/HEAD/assets/screenshots/screenshot16.png)

[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/tripolskypetr/backtest-kit) [![npm](https://img.shields.io/npm/v/@backtest-kit/ollama.svg?style=flat-square)](https://npmjs.org/package/@backtest-kit/ollama) ![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue)

📚 **[文档](https://backtest-kit.github.io/documents/article_07_ai_news_trading_signals.html)** • 妇女 **[参考执行情况](https://github.com/tripolskypetr/backtest-kit/tree/master/example)** • 妇女 **[GitHub 图像](https://github.com/tripolskypetr/backtest-kit)**

```bash
npm install @backtest-kit/ollama backtest-kit agent-swarm-kit
```

* * *

## 为什么

AI策略通常指每个供应商SDK锅炉板和JSON,你无法信任. 此软件包将全部崩溃: 用一个提供商 HOF 来包裹任何 async 函数, 并运行在该提供商的推断上下文内—— 互换 `deepseek()` → `claude()` → `gpt5()` 没有其他改动。 结构输出是强制的(Zod或JSON通过 `agent-swarm-kit`是因为 `addOutline`),提示作为纪念的用户空间模块进行直播

-   🔌 **12个供应商** ——OpenAI,克洛德,DeepSeek,Grok,Groq,米斯特拉尔,迷惑,Cohere,Alibaba,Hugging Face,Ollama(当地),GLM-4(Z.ai).
-   ⚡ **上级职能** 以推论上下文来包裹 aync fn 通过 `di-scoped`; 相同的签名输入, 相同的退出 .
-   🎯 **用户空间计划** ——定义你自己的Zod或JSON schema;结构化输出用自动重试+自定义验证执行.
-   📝 **用户空间提示** - 从负载 `.cjs` 模块 `config/prompt/`,或内入;通过 `functools-kit`。 。 。 .
-   🔄 **按键旋转** ——通过自动旋转的API密钥数组.
-   🧬 **战略优化器** —— 说 `Optimizer` 生成 _完整的可执行策略代码_ 从整个培训范围的LLM分析.

* * *

## 提供商 HOF

整个适配器是一个形状,为12个提供者重复: `provider(fn, model, apiKey?) => fn`中返回函数 **同名签名** 作为 `fn`,在提供者的推论上下文中执行(因此 `agent-swarm-kit` 在内部完成 解决提供方.

```typescript
import { deepseek } from '@backtest-kit/ollama';
import { addStrategy } from 'backtest-kit';

addStrategy({
  strategyName: 'llm-signal', interval: '5m',
  // swap deepseek() → claude() / gpt5() / ollama() / groq() with no other change
  getSignal: deepseek(getSignal, 'deepseek-chat', process.env.DEEPSEEK_API_KEY),
});
```

所有12个提供者, 基站 URL 旋转( S)

| 提供者 | 函数 | 推论 | 基础 URL |
| --- | --- | --- | --- |
| 开放AI | `gpt5()` | `gpt5_inference` | `https://api.openai.com/v1/` |
| 克劳德 | `claude()` | `claude_inference` | `https://api.anthropic.com/v1/` |
| 深层搜索 | `deepseek()` | `deepseek_inference` | `https://api.deepseek.com/` |
| 格罗克(xAI) | `grok()` | `grok_inference` | `https://api.x.ai/v1/` |
| 格罗克 | `groq()` | `groq_inference` | `https://api.groq.com/` |
| 迷雾 | `mistral()` | `mistral_inference` | `https://api.mistral.ai/v1/` |
| 复杂 | `perplexity()` | `perplexity_inference` | `https://api.perplexity.ai/` |
| 代码 | `cohere()` | `cohere_inference` | `https://api.cohere.ai/compatibility/v1/` |
| 阿里巴巴(昆文) | `alibaba()` | `alibaba_inference` | `https://dashscope-intl.aliyuncs.com/compatible-mode/v1/` |
| 拥抱相貌 | `hf()` | `hf_inference` | `https://router.huggingface.co/v1/` |
| Ollama(当地) | `ollama()` | `ollama_inference` | `http://localhost:11434/` |
| GLM-4(扎伊岛) | `glm4()` | `glm4_inference` | `https://open.bigmodel.cn/api/paas/v4/` |

```typescript
// apiKey accepts a single key OR an array → automatic rotation across calls
const wrappedFn = ollama(myFn, 'llama3.3:70b', ['key1', 'key2', 'key3']);
```

所有12个都有一个签名—— `<T>(fn: T, model: string, apiKey?: string | string[]) => T` 运行 `fn` 内部 `ContextService.runInContext({ apiKey, inference, model })`匹配 `InferenceName` enum + 每个提供者 `client/*Provider.client.ts` + 键 `config/*.ts` 解决实际的 SDK 呼叫.

* * *

## 结构化产出

定义一个 schema( Zod 或 生 JSON),将其注册为针对此软件包的大纲 `CompletionName`,而LLM则被迫返回有效的JSON——带有拒绝不良信号的自定义验证(例如"LSL必须是LONG的下入").

Zod 大纲

```typescript
// schema/Signal.schema.ts
import { z } from 'zod';
export const SignalSchema = z.object({
  position: z.enum(['long', 'short', 'wait']).describe('long: bullish · short: bearish · wait: unclear'),
  price_open: z.number().describe('Entry price in USD'),
  price_stop_loss: z.number().describe('LONG: below entry · SHORT: above entry'),
  price_take_profit: z.number().describe('LONG: above entry · SHORT: below entry'),
  minute_estimated_time: z.number().describe('Estimated minutes to reach TP'),
  risk_note: z.string().describe('Whale manipulation, order-book imbalance, divergences — with numbers'),
});
export type TSignalSchema = z.infer<typeof SignalSchema>;
```

```typescript
// outline/signal.outline.ts
import { addOutline } from 'agent-swarm-kit';
import { zodResponseFormat } from 'openai/helpers/zod';
import { SignalSchema, TSignalSchema } from '../schema/Signal.schema';
import { CompletionName } from '@backtest-kit/ollama';

addOutline<TSignalSchema>({
  outlineName: 'SignalOutline',
  completion: CompletionName.RunnerOutlineCompletion,
  format: zodResponseFormat(SignalSchema, 'position_decision'),
  getOutlineHistory: async ({ history, param: messages = [] }) => { await history.push(messages); },
  validations: [{
    validate: ({ data }) => {
      if (data.position === 'long'  && data.price_stop_loss >= data.price_open) throw new Error('LONG: SL must be below entry');
      if (data.position === 'short' && data.price_stop_loss <= data.price_open) throw new Error('SHORT: SL must be above entry');
    },
  }],
});
```
Raw JSON- schema 大纲( 无 Zod)

```typescript
import { addOutline, IOutlineFormat } from 'agent-swarm-kit';
import { CompletionName } from '@backtest-kit/ollama';

const format: IOutlineFormat = {
  type: 'object',
  properties: {
    take_profit_price: { type: 'number', description: 'Take profit price in USD' },
    stop_loss_price:   { type: 'number', description: 'Stop-loss price in USD' },
    description:       { type: 'string', description: 'User-friendly risk explanation, min 10 sentences' },
    reasoning:         { type: 'string', description: 'Technical analysis, min 15 sentences' },
  },
  required: ['take_profit_price', 'stop_loss_price', 'description', 'reasoning'],
};

addOutline({
  outlineName: 'SignalOutline', format, completion: CompletionName.RunnerOutlineCompletion,
  prompt: 'Generate crypto trading signals from price & volume indicators in JSON.',
  getOutlineHistory: async ({ history, param }) => {
    const report = await ioc.signalReportService.getSignalReport(param);
    await commitReports(history, report);
    await history.push({ role: 'user', content: 'Generate JSON based on reports.' });
  },
  validations: [
    { docDescription: 'Stop-loss vs max loss %',  validate: ({ data }) => { if (data.action === 'buy' && percentDiff(data.current_price, data.stop_loss_price)   > CC_LADDER_STOP_LOSS)   throw new Error(`SL must not exceed -${CC_LADDER_STOP_LOSS}%`); } },
    { docDescription: 'Take-profit vs max profit %', validate: ({ data }) => { if (data.action === 'buy' && percentDiff(data.current_price, data.take_profit_price) > CC_LADDER_TAKE_PROFIT) throw new Error(`TP must not exceed +${CC_LADDER_TAKE_PROFIT}%`); } },
  ],
});
```

* * *

## 提示

快速模块自动接收交易上下文 . `system` 可能是字符串数组或函数 `(symbol, strategyName, exchangeName, frameName, backtest)`· ; `user` 同样的.

模块文件, 内置快捷键和承诺Prompt

```javascript
// config/prompt/signal.prompt.cjs
module.exports = {
  system: (symbol, strategyName, exchangeName, frameName, backtest) => [
    `You are analyzing ${symbol} on ${exchangeName}`,
    `Strategy: ${strategyName}, Timeframe: ${frameName}`,
    backtest ? 'Backtest mode' : 'Live mode',
  ],
  user: (symbol) => `Analyze ${symbol} and return a trading decision`,
};
```

```typescript
import { Module, Prompt, commitPrompt, MessageModel } from '@backtest-kit/ollama';

// from a .cjs module (default baseDir: {cwd}/config/prompt/), memoized
const signalModule = Module.fromPath('./signal.prompt.cjs');
// or inline
const inline = Prompt.fromPrompt({ system: ['You are a trading bot'], user: (symbol) => `Trend for ${symbol}?` });

const messages: MessageModel[] = [];
await commitPrompt(signalModule, messages);   // pushes rendered system + user messages with context
```

完整策略: 注册大纲, 从一个快速, 请求结构化的 JSON , 用一个提供者 HOF 包:

```typescript
import './outline/signal.outline';
import { deepseek, Module, commitPrompt, MessageModel } from '@backtest-kit/ollama';
import { addStrategy } from 'backtest-kit';
import { json } from 'agent-swarm-kit';

const signalModule = Module.fromPath('./signal.prompt.cjs');
const getSignal = async () => {
  const messages: MessageModel[] = [];
  await commitPrompt(signalModule, messages);
  const { data } = await json('SignalOutline', messages);
  return data;
};
addStrategy({ strategyName: 'llm-signal', interval: '5m',
  getSignal: deepseek(getSignal, 'deepseek-chat', process.env.DEEPSEEK_API_KEY) });
```

* * *

## 调试——放弃对话

`dumpSignalData(signalId, history, signal, outputDir?)` 将LLM对话全文存档于信号上,因此不透明的模型决定成为可读记录. 如果目录已经存在( 从未覆盖过先前的运行) 跳过 .

它写的是什么

进 `{outputDir}/{signalId}/` (默认) `./dump/strategy`: `00_system_prompt.md` (系统信息+产出摘要),编号 `XX_user_message.md` 编号 : `XX_assistant_message.md` 每转一圈,最后 `XX_llm_output.md` 信号DTO。 打电话来 `getSignal` 在返回信号之前.

* * *

## 战略优化器——生成可运行的战略代码

最有威力的作品, 和其余的软件包提供: `Optimizer` 使用LLM分析跨训练范围的符号,并发出 **完整、可执行的战略文件** ——进口,帮助者,策略,行走者,发射者——可以直接用回试-kit来运行.

优化 API + 添加 optimizerSchema + 进度事件

```typescript
import { Optimizer, addOptimizerSchema, listenOptimizerProgress } from '@backtest-kit/ollama';

// describe sources, training ranges, strategy/template generation (see IOptimizer* interfaces)
addOptimizerSchema({ optimizerName: 'my-optimizer', /* sources, ranges, strategy, template */ });

listenOptimizerProgress((p) => console.log(p)); // ProgressOptimizerContract

const strategies = await Optimizer.getData('BTCUSDT', { optimizerName: 'my-optimizer' }); // metadata + LLM context per range
const code       = await Optimizer.getCode('BTCUSDT', { optimizerName: 'my-optimizer' }); // full TS/JS source as string
await Optimizer.dump('BTCUSDT', { optimizerName: 'my-optimizer' }, './output');           // writes {optimizerName}_{symbol}.mjs
```

`getData` 从所有来源获取并构建每个培训范围的LLM对话; `getCode` 组装可执行战略; `dump` 写给 `{optimizerName}_{symbol}.mjs`配套登记功能: `getOptimizerSchema`, (中文(简体) ), `listOptimizerSchema`,以及 `listenError`它背后的发动机是 `common/ClientOptimizer.ts` 驾驶员: `IOptimizer*` 接口( e)`IOptimizerSchema`, (中文(简体) ), `IOptimizerSource`, (中文(简体) ), `IOptimizerStrategy`, (中文(简体) ), `IOptimizerTemplate`, (中文(简体) ), `IOptimizerRange`, (中文(简体) ), `IOptimizerData`, (中文(简体) ), `IOptimizerFetchArgs`, (中文(简体) ), `IOptimizerFilterArgs`, (中文(简体) ), `IOptimizerCallbacks`) (中文(简体) ).

* * *

## API 参考

| 导出 | 说明 |
| --- | --- |
| `ollama` `gpt5` `claude` `deepseek` `grok` `groq` `mistral` `perplexity` `cohere` `alibaba` `hf` `glm4` | 提供商 `(fn, model, apiKey?) => fn` |
| `CompletionName` | 补全名称 `agent-swarm-kit` 大纲(`RunnerOutlineCompletion`, (...) (中文(简体) ) |
| `Module.fromPath(path, baseDir?)` | 装入提示 `.cjs` 模块(默认基数) `{cwd}/config/prompt/`(中文(简体) ) |
| `Prompt.fromPrompt(source)` | 从内含中构建一个提示 `PromptModel` |
| `commitPrompt(source, history)` | 将模块/Prompt的系统+用户信息输入 `history` |
| `dumpSignalData(id, history, signal, dir?)` | 将 LLM 对话存档为一个信号 |
| `validate(...)` | 验证大纲结果 |
| `Optimizer` | `.getData` 编号 : `.getCode` 编号 : `.dump` ——LLM战略码生成 |
| `addOptimizerSchema` • 妇女 `getOptimizerSchema` • 妇女 `listOptimizerSchema` | 优化计程器登记册 |
| `listenOptimizerProgress` • 妇女 `listenError` | 优化进度/ 错误事件 |
| `MessageModel` `MessageRole` `PromptModel` | 信件提示模式( P) |
| `IOptimizer*` • 妇女 `ProgressOptimizerContract` | 优化接口和进度合同 |
| `lib` | 高级使用的内部发动机(IoC容器) |

完整源图

-   `function/signal.function.ts` ——12家供应商HOF. `function/{add,get,list,event,setup,validate,history,dump,signal}.ts` 登记、活动、, `setLogger`, (中文(简体) ), `commitPrompt`, (中文(简体) ), `dumpSignalData`。 。 。 .
-   `client/*Provider.client.ts` (12) – 提供方SDK适配器. `config/*.ts` ——每个提供者基础URL/段落, `ollama.rotate.ts` (按键旋转), `params.ts`, (中文(简体) ), `emitters.ts`。 。 。 .
-   `classes/` —— 说 `Module`, (中文(简体) ), `Prompt`, (中文(简体) ), `Optimizer`。 。 。 . `common/ClientOptimizer.ts` ——优化引擎.
-   `enum/` —— 说 `InferenceName` (12个), `CompletionName`。 。 。 . `interface/Optimizer.interface.ts`, (中文(简体) ), `contract/ProgressOptimizer.contract.ts`, (中文(简体) ), `model/{Message,Prompt}.model.ts`。 。 。 .
-   `helpers/{toLintMarkdown,toPlainString}.ts`, (中文(简体) ), `lib/` (IoC: `core/{di,provide,types}`服务)。 没有 `src/` 没有证件.

## \* 贡献

叉/ PR 打开 [GitHub 图像](https://github.com/tripolskypetr/backtest-kit)。 。 。 .

## 许可证

麻省理工学院 [特立奥尔斯基平板电脑](https://github.com/tripolskypetr)

## 常见问题

### @backtest-kit/ollama 是什么？

多供应商LLM推论库,用于AI动力交易策略\. 支持10\+供应商,包括OpenAI,克洛德,DeepSeek,Grok,Mistral 具有统一的API和自动符号旋转\.

### 如何安装 @backtest-kit/ollama？

在项目目录运行 npm install @backtest-kit/ollama，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：ollama（^0\.6\.0）、openai（^4\.97\.0）、groq-sdk（^0\.37\.0）、typescript（^5\.0\.0）、backtest-kit（^23\.7\.0）、@langchain/xai（^0\.0\.2）、@langchain/core（^0\.3\.57）、@langchain/openai（^0\.4\.9）、@huggingface/inference（^4\.7\.1）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @backtest-kit/ollama 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @backtest-kit/ollama 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @backtest-kit/ollama 可以商用吗？

@backtest-kit/ollama 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @backtest-kit/ollama 的下载量有多少？

根据 npm 官方下载统计，@backtest-kit/ollama 在 2026/10/08 – 2026/11/06 这 30 天内被下载 3,172 次，日均约 106 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @backtest-kit/ollama 还在维护吗？

最新版本 23\.7\.0 发布于 2026/10/29（9 天前）；至今共发布 183 个版本，其中过去 12 个月发布了 183 个；首次发布于 2026/01/14。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

