agentfootprint 8.0.0 → 8.2.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/AGENTS.md +14 -9
- package/README.md +11 -7
- package/ai-instructions/claude-code/SKILL.md +1 -1
- package/ai-instructions/clinerules +1 -1
- package/ai-instructions/copilot-instructions.md +1 -1
- package/ai-instructions/cursor/agentfootprint.md +1 -1
- package/ai-instructions/kiro/agentfootprint.md +1 -1
- package/ai-instructions/windsurfrules +1 -1
- package/dist/adapters/llm/OllamaProvider.js +628 -0
- package/dist/adapters/llm/OllamaProvider.js.map +1 -0
- package/dist/adapters/llm/OpenAIProvider.js +12 -21
- package/dist/adapters/llm/OpenAIProvider.js.map +1 -1
- package/dist/adapters/llm/createProvider.js +35 -6
- package/dist/adapters/llm/createProvider.js.map +1 -1
- package/dist/core/Agent.js +44 -1
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/agent/stages/seed.js +10 -0
- package/dist/core/agent/stages/seed.js.map +1 -1
- package/dist/core/agent/stages/window.js +21 -0
- package/dist/core/agent/stages/window.js.map +1 -1
- package/dist/core/agent/window/errors.js +4 -3
- package/dist/core/agent/window/errors.js.map +1 -1
- package/dist/core/agent/window/folded.js +98 -0
- package/dist/core/agent/window/folded.js.map +1 -0
- package/dist/core/agent/window/index.js +9 -1
- package/dist/core/agent/window/index.js.map +1 -1
- package/dist/core/agent/window/options.js +18 -2
- package/dist/core/agent/window/options.js.map +1 -1
- package/dist/core/agent/window/strategies/slidingWindow.js +2 -2
- package/dist/core/agent/window/strategies/summarizeOldest.js +25 -2
- package/dist/core/agent/window/strategies/summarizeOldest.js.map +1 -1
- package/dist/core/agent/window/summarize.js +27 -1
- package/dist/core/agent/window/summarize.js.map +1 -1
- package/dist/core/agent/window/types.js +6 -0
- package/dist/core/agent/window/types.js.map +1 -1
- package/dist/core/runCheckpoint.js +9 -1
- package/dist/core/runCheckpoint.js.map +1 -1
- package/dist/esm/adapters/llm/OllamaProvider.d.ts +182 -0
- package/dist/esm/adapters/llm/OllamaProvider.js +622 -0
- package/dist/esm/adapters/llm/OllamaProvider.js.map +1 -0
- package/dist/esm/adapters/llm/OpenAIProvider.d.ts +0 -12
- package/dist/esm/adapters/llm/OpenAIProvider.js +11 -19
- package/dist/esm/adapters/llm/OpenAIProvider.js.map +1 -1
- package/dist/esm/adapters/llm/createProvider.d.ts +25 -8
- package/dist/esm/adapters/llm/createProvider.js +35 -6
- package/dist/esm/adapters/llm/createProvider.js.map +1 -1
- package/dist/esm/core/Agent.d.ts +17 -0
- package/dist/esm/core/Agent.js +44 -1
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/core/agent/stages/seed.d.ts +11 -0
- package/dist/esm/core/agent/stages/seed.js +10 -0
- package/dist/esm/core/agent/stages/seed.js.map +1 -1
- package/dist/esm/core/agent/stages/window.d.ts +13 -0
- package/dist/esm/core/agent/stages/window.js +21 -0
- package/dist/esm/core/agent/stages/window.js.map +1 -1
- package/dist/esm/core/agent/types.d.ts +15 -1
- package/dist/esm/core/agent/window/errors.js +4 -3
- package/dist/esm/core/agent/window/errors.js.map +1 -1
- package/dist/esm/core/agent/window/folded.d.ts +90 -0
- package/dist/esm/core/agent/window/folded.js +92 -0
- package/dist/esm/core/agent/window/folded.js.map +1 -0
- package/dist/esm/core/agent/window/index.d.ts +7 -1
- package/dist/esm/core/agent/window/index.js +6 -0
- package/dist/esm/core/agent/window/index.js.map +1 -1
- package/dist/esm/core/agent/window/options.d.ts +7 -1
- package/dist/esm/core/agent/window/options.js +17 -1
- package/dist/esm/core/agent/window/options.js.map +1 -1
- package/dist/esm/core/agent/window/strategies/slidingWindow.d.ts +2 -2
- package/dist/esm/core/agent/window/strategies/slidingWindow.js +2 -2
- package/dist/esm/core/agent/window/strategies/summarizeOldest.d.ts +4 -2
- package/dist/esm/core/agent/window/strategies/summarizeOldest.js +25 -2
- package/dist/esm/core/agent/window/strategies/summarizeOldest.js.map +1 -1
- package/dist/esm/core/agent/window/strategy.d.ts +26 -1
- package/dist/esm/core/agent/window/summarize.d.ts +11 -0
- package/dist/esm/core/agent/window/summarize.js +27 -1
- package/dist/esm/core/agent/window/summarize.js.map +1 -1
- package/dist/esm/core/agent/window/types.d.ts +106 -1
- package/dist/esm/core/agent/window/types.js +6 -0
- package/dist/esm/core/agent/window/types.js.map +1 -1
- package/dist/esm/core/runCheckpoint.d.ts +32 -1
- package/dist/esm/core/runCheckpoint.js +9 -1
- package/dist/esm/core/runCheckpoint.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +6 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/providers.d.ts +13 -5
- package/dist/esm/providers.js +13 -5
- package/dist/esm/providers.js.map +1 -1
- package/dist/esm/thinking/OllamaThinkingHandler.d.ts +60 -0
- package/dist/esm/thinking/OllamaThinkingHandler.js +107 -0
- package/dist/esm/thinking/OllamaThinkingHandler.js.map +1 -0
- package/dist/esm/thinking/index.d.ts +1 -0
- package/dist/esm/thinking/index.js +1 -0
- package/dist/esm/thinking/index.js.map +1 -1
- package/dist/esm/thinking/registry.js +2 -0
- package/dist/esm/thinking/registry.js.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/providers.js +16 -6
- package/dist/providers.js.map +1 -1
- package/dist/thinking/OllamaThinkingHandler.js +111 -0
- package/dist/thinking/OllamaThinkingHandler.js.map +1 -0
- package/dist/thinking/index.js +4 -1
- package/dist/thinking/index.js.map +1 -1
- package/dist/thinking/registry.js +2 -0
- package/dist/thinking/registry.js.map +1 -1
- package/dist/types/adapters/llm/OllamaProvider.d.ts +183 -0
- package/dist/types/adapters/llm/OllamaProvider.d.ts.map +1 -0
- package/dist/types/adapters/llm/OpenAIProvider.d.ts +0 -12
- package/dist/types/adapters/llm/OpenAIProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/createProvider.d.ts +25 -8
- package/dist/types/adapters/llm/createProvider.d.ts.map +1 -1
- package/dist/types/core/Agent.d.ts +17 -0
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/core/agent/stages/seed.d.ts +11 -0
- package/dist/types/core/agent/stages/seed.d.ts.map +1 -1
- package/dist/types/core/agent/stages/window.d.ts +13 -0
- package/dist/types/core/agent/stages/window.d.ts.map +1 -1
- package/dist/types/core/agent/types.d.ts +15 -1
- package/dist/types/core/agent/types.d.ts.map +1 -1
- package/dist/types/core/agent/window/errors.d.ts.map +1 -1
- package/dist/types/core/agent/window/folded.d.ts +91 -0
- package/dist/types/core/agent/window/folded.d.ts.map +1 -0
- package/dist/types/core/agent/window/index.d.ts +7 -1
- package/dist/types/core/agent/window/index.d.ts.map +1 -1
- package/dist/types/core/agent/window/options.d.ts +7 -1
- package/dist/types/core/agent/window/options.d.ts.map +1 -1
- package/dist/types/core/agent/window/strategies/slidingWindow.d.ts +2 -2
- package/dist/types/core/agent/window/strategies/summarizeOldest.d.ts +4 -2
- package/dist/types/core/agent/window/strategies/summarizeOldest.d.ts.map +1 -1
- package/dist/types/core/agent/window/strategy.d.ts +26 -1
- package/dist/types/core/agent/window/strategy.d.ts.map +1 -1
- package/dist/types/core/agent/window/summarize.d.ts +11 -0
- package/dist/types/core/agent/window/summarize.d.ts.map +1 -1
- package/dist/types/core/agent/window/types.d.ts +106 -1
- package/dist/types/core/agent/window/types.d.ts.map +1 -1
- package/dist/types/core/runCheckpoint.d.ts +32 -1
- package/dist/types/core/runCheckpoint.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/providers.d.ts +13 -5
- package/dist/types/providers.d.ts.map +1 -1
- package/dist/types/thinking/OllamaThinkingHandler.d.ts +61 -0
- package/dist/types/thinking/OllamaThinkingHandler.d.ts.map +1 -0
- package/dist/types/thinking/index.d.ts +1 -0
- package/dist/types/thinking/index.d.ts.map +1 -1
- package/dist/types/thinking/registry.d.ts.map +1 -1
- package/package.json +3 -1
package/AGENTS.md
CHANGED
|
@@ -56,7 +56,7 @@ await agent.run({ message: 'How long does a refund take?' });
|
|
|
56
56
|
|
|
57
57
|
| Boundary | Mock for development | Production swap |
|
|
58
58
|
|---|---|---|
|
|
59
|
-
| LLM provider | `mock({ reply })` · `mock({ replies })` for scripted ReAct | `
|
|
59
|
+
| LLM provider | `mock({ reply })` · `mock({ replies })` for scripted ReAct | `ollama('<model>')` — a real model, still $0 and no key · then `anthropic()` · `openai()` · `bedrock()` |
|
|
60
60
|
| Embedder | `mockEmbedder()` | OpenAI / Cohere / Bedrock embedder factory |
|
|
61
61
|
| Memory store | `InMemoryStore` | `RedisStore` (`agentfootprint/memory`) · `AgentCoreStore` (`agentfootprint/memory`) · DynamoDB / Postgres / Pinecone (planned) |
|
|
62
62
|
| MCP server | `mockMcpClient({ tools })` — in-memory, no SDK | `mcpClient({ transport })` to a real server |
|
|
@@ -401,21 +401,26 @@ Browse [`examples/patterns/`](examples/patterns/) — every pattern is a runnabl
|
|
|
401
401
|
|
|
402
402
|
```typescript
|
|
403
403
|
import { mock } from 'agentfootprint';
|
|
404
|
-
// Vendor-SDK providers (lazy peer-deps) live on the dedicated subpath:
|
|
405
404
|
import { anthropic, openai, bedrock, ollama } from 'agentfootprint/providers';
|
|
406
405
|
|
|
407
|
-
//
|
|
406
|
+
// The ladder: shape the logic on the mock → check it against a REAL model for
|
|
407
|
+
// free → pay only in production. One argument changes; the agent does not.
|
|
408
408
|
const provider = process.env.NODE_ENV === 'production'
|
|
409
409
|
? anthropic({ apiKey: process.env.ANTHROPIC_API_KEY! })
|
|
410
|
-
: mock({ reply: 'test response' })
|
|
410
|
+
: ollama('llama3.2'); // or mock({ reply: 'test response' }) for determinism
|
|
411
411
|
```
|
|
412
412
|
|
|
413
413
|
Every provider implements the same `LLMProvider` interface. `mock`,
|
|
414
414
|
`browserAnthropic`, `browserOpenai`, and `createProvider` ship on the main
|
|
415
|
-
barrel;
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
415
|
+
barrel; `anthropic` · `openai` · `bedrock` · `ollama` live ONLY at
|
|
416
|
+
`agentfootprint/providers` so bundlers never walk the vendor-SDK requires.
|
|
417
|
+
Browser variants exist for client-side use.
|
|
418
|
+
|
|
419
|
+
`ollama('<model>')` is the middle rung and needs NO vendor SDK — it talks
|
|
420
|
+
Ollama's native API over `fetch`. Install Ollama, `ollama pull llama3.2`, done.
|
|
421
|
+
When it can't work it says so in words that contain the fix (`ollama serve`,
|
|
422
|
+
`ollama pull <model>`), never a raw connection error. `OLLAMA_MODEL=<model>`
|
|
423
|
+
makes `providerFromEnv()` pick it, ahead of the cloud credentials.
|
|
419
424
|
|
|
420
425
|
### Pause / Resume (Human-in-the-Loop)
|
|
421
426
|
|
|
@@ -448,7 +453,7 @@ import { anthropic, openai, ollama } from 'agentfootprint/providers';
|
|
|
448
453
|
|
|
449
454
|
const reliable = withRetry(provider, { maxAttempts: 3 });
|
|
450
455
|
const resilient = withFallback(primary, fallback);
|
|
451
|
-
const chain = fallbackProvider(anthropic({...}), openai({...}), ollama(
|
|
456
|
+
const chain = fallbackProvider(anthropic({...}), openai({...}), ollama('llama3.2'));
|
|
452
457
|
const guarded = withCircuitBreaker(provider);
|
|
453
458
|
```
|
|
454
459
|
|
package/README.md
CHANGED
|
@@ -104,19 +104,23 @@ console.log(result); // → "I checked: it is 72°F and sunny."
|
|
|
104
104
|
|
|
105
105
|
For production, import a real provider from `agentfootprint/providers` and swap it in — `anthropic(...)` / `openai(...)` / `bedrock(...)` / `ollama(...)`. Only the import line changes; the agent code stays the same. (The vendor-SDK providers live on the `agentfootprint/providers` subpath so the main `agentfootprint` barrel stays free of optional peer-dep requires; `mock`, `browserAnthropic`, and `browserOpenai` are on the main barrel.)
|
|
106
106
|
|
|
107
|
-
### Run against a local model
|
|
107
|
+
### Run against a local model — the free rung between the mock and the bill
|
|
108
108
|
|
|
109
|
-
No cloud account, no API key, $0 per token
|
|
109
|
+
No cloud account, no API key, no vendor SDK, $0 per token:
|
|
110
110
|
|
|
111
111
|
```typescript
|
|
112
112
|
import { Agent } from 'agentfootprint';
|
|
113
113
|
import { ollama } from 'agentfootprint/providers';
|
|
114
114
|
|
|
115
|
-
const agent = Agent.create({ provider: ollama(
|
|
116
|
-
// → talks to http://localhost:11434
|
|
115
|
+
const agent = Agent.create({ provider: ollama('llama3.2'), model: 'llama3.2' }).build();
|
|
116
|
+
// → talks to http://localhost:11434 (run `ollama pull llama3.2` first)
|
|
117
117
|
```
|
|
118
118
|
|
|
119
|
-
|
|
119
|
+
This is the step that makes "the test run and the production run are the same code path" more than a slogan. A mock proves your control flow; it can't tell you whether a real model calls your tool, or what it makes of a tool description you wrote in a hurry. A local model can — and because it's free, you'll actually check before you pay.
|
|
120
|
+
|
|
121
|
+
`ollama()` talks Ollama's native API directly, so there's nothing to install on this side, streamed calls report real token counts (so `.compaction()` and cost budgets work), and when it can't work it says why in words that contain the fix — `ollama serve` when nothing is listening, `ollama pull <model>` when the model isn't there, never a raw connection error and never a hang.
|
|
122
|
+
|
|
123
|
+
For llama.cpp's `llama-server`, vLLM, Together or Groq, use `openai({ baseURL: 'http://localhost:8080/v1', apiKey: 'not-needed', defaultModel: '…' })` — any server speaking the OpenAI Chat Completions API, same `Agent` code either way. Full recipes: [Ollama guide](https://footprintjs.github.io/agentfootprint/docs/build/ollama/) · [OpenAI-compatible endpoints](https://footprintjs.github.io/agentfootprint/docs/build/openai/#openai-compatible-endpoints-ollama-llamacpp-vllm-together-groq-lm-studio).
|
|
120
124
|
|
|
121
125
|
### Then add context
|
|
122
126
|
|
|
@@ -793,7 +797,7 @@ Build the entire app against in-memory mocks with **zero API cost**, then swap r
|
|
|
793
797
|
|
|
794
798
|
| Boundary | Dev | Prod |
|
|
795
799
|
|---|---|---|
|
|
796
|
-
| LLM provider | `mock(...)` | `
|
|
800
|
+
| LLM provider | `mock(...)` | `ollama('<model>')` free · `anthropic()` · `openai()` · `bedrock()` |
|
|
797
801
|
| Memory store | `InMemoryStore` | `RedisStore` · `AgentCoreStore` |
|
|
798
802
|
| MCP | `mockMcpClient(...)` | `mcpClient({ transport })` |
|
|
799
803
|
| Cache strategy | `NoOpCacheStrategy` | auto-selected per provider |
|
|
@@ -823,7 +827,7 @@ The flowchart, recorders, and tests don't change between dev and prod.
|
|
|
823
827
|
| `anthropic` | Claude (Sonnet, Opus, Haiku) via `@anthropic-ai/sdk` |
|
|
824
828
|
| `openai` | GPT-4o, GPT-4-turbo via `openai` SDK |
|
|
825
829
|
| `bedrock` | Claude / Titan / Mistral via AWS Bedrock runtime |
|
|
826
|
-
| `ollama` | Local models
|
|
830
|
+
| `ollama` | Local models, over Ollama's native API — no SDK, no key, real token counts, refusals that name `ollama serve` / `ollama pull` · `openai({ baseURL })` reaches llama.cpp, vLLM, and any other OpenAI-compatible endpoint |
|
|
827
831
|
| `browserAnthropic` | Browser-side Claude calls (no proxy server) |
|
|
828
832
|
| `browserOpenai` | Browser-side OpenAI calls (no proxy server) |
|
|
829
833
|
| `mock` | Deterministic dev/test (zero API cost) |
|
|
@@ -74,7 +74,7 @@ Build the entire agent + context engineering + tools + memory + RAG + MCP with i
|
|
|
74
74
|
|
|
75
75
|
| Mock | Production swap |
|
|
76
76
|
|---|---|
|
|
77
|
-
| `mock({ reply })` · `mock({ replies })` for scripted multi-turn | `
|
|
77
|
+
| `mock({ reply })` · `mock({ replies })` for scripted multi-turn | `ollama('<model>')` — a real model, still $0 and no key · then `anthropic()` / `openai()` / `bedrock()` |
|
|
78
78
|
| `InMemoryStore` | `RedisStore` (`agentfootprint/memory`) · `AgentCoreStore` (`agentfootprint/memory`) · Dynamo · Postgres · Pinecone (planned) |
|
|
79
79
|
| `mockEmbedder()` | OpenAI / Cohere / Bedrock embedder factory |
|
|
80
80
|
| `mockMcpClient({ tools })` — in-memory, no SDK | `mcpClient({ transport })` real server |
|
|
@@ -47,7 +47,7 @@ Build with `mock()` provider + `InMemoryStore` + `mockEmbedder()` + inline tool
|
|
|
47
47
|
|
|
48
48
|
| Mock | Production swap |
|
|
49
49
|
|---|---|
|
|
50
|
-
| `mock({ reply })` · `mock({ replies })` for scripted multi-turn | `
|
|
50
|
+
| `mock({ reply })` · `mock({ replies })` for scripted multi-turn | `ollama('<model>')` — a real model, still $0 and no key · then `anthropic()` / `openai()` / `bedrock()` |
|
|
51
51
|
| `InMemoryStore` | `RedisStore` (`agentfootprint/memory`) · `AgentCoreStore` (`agentfootprint/memory`) · Dynamo · Postgres · Pinecone (planned) |
|
|
52
52
|
| `mockEmbedder()` | OpenAI / Cohere / Bedrock embedder factory |
|
|
53
53
|
| `mockMcpClient({ tools })` — in-memory, no SDK | `mcpClient({ transport })` real server |
|
|
@@ -47,7 +47,7 @@ Build with `mock()` provider + `InMemoryStore` + `mockEmbedder()` + inline tool
|
|
|
47
47
|
|
|
48
48
|
| Mock | Production swap |
|
|
49
49
|
|---|---|
|
|
50
|
-
| `mock({ reply })` · `mock({ replies })` for scripted multi-turn | `
|
|
50
|
+
| `mock({ reply })` · `mock({ replies })` for scripted multi-turn | `ollama('<model>')` — a real model, still $0 and no key · then `anthropic()` / `openai()` / `bedrock()` |
|
|
51
51
|
| `InMemoryStore` | `RedisStore` (`agentfootprint/memory`) · `AgentCoreStore` (`agentfootprint/memory`) · Dynamo · Postgres · Pinecone (planned) |
|
|
52
52
|
| `mockEmbedder()` | OpenAI / Cohere / Bedrock embedder factory |
|
|
53
53
|
| `mockMcpClient({ tools })` — in-memory, no SDK | `mcpClient({ transport })` real server |
|
|
@@ -47,7 +47,7 @@ Build with `mock()` provider + `InMemoryStore` + `mockEmbedder()` + inline tool
|
|
|
47
47
|
|
|
48
48
|
| Mock | Production swap |
|
|
49
49
|
|---|---|
|
|
50
|
-
| `mock({ reply })` · `mock({ replies })` for scripted multi-turn | `
|
|
50
|
+
| `mock({ reply })` · `mock({ replies })` for scripted multi-turn | `ollama('<model>')` — a real model, still $0 and no key · then `anthropic()` / `openai()` / `bedrock()` |
|
|
51
51
|
| `InMemoryStore` | `RedisStore` (`agentfootprint/memory`) · `AgentCoreStore` (`agentfootprint/memory`) · Dynamo · Postgres · Pinecone (planned) |
|
|
52
52
|
| `mockEmbedder()` | OpenAI / Cohere / Bedrock embedder factory |
|
|
53
53
|
| `mockMcpClient({ tools })` — in-memory, no SDK | `mcpClient({ transport })` real server |
|
|
@@ -47,7 +47,7 @@ Build with `mock()` provider + `InMemoryStore` + `mockEmbedder()` + inline tool
|
|
|
47
47
|
|
|
48
48
|
| Mock | Production swap |
|
|
49
49
|
|---|---|
|
|
50
|
-
| `mock({ reply })` · `mock({ replies })` for scripted multi-turn | `
|
|
50
|
+
| `mock({ reply })` · `mock({ replies })` for scripted multi-turn | `ollama('<model>')` — a real model, still $0 and no key · then `anthropic()` / `openai()` / `bedrock()` |
|
|
51
51
|
| `InMemoryStore` | `RedisStore` (`agentfootprint/memory`) · `AgentCoreStore` (`agentfootprint/memory`) · Dynamo · Postgres · Pinecone (planned) |
|
|
52
52
|
| `mockEmbedder()` | OpenAI / Cohere / Bedrock embedder factory |
|
|
53
53
|
| `mockMcpClient({ tools })` — in-memory, no SDK | `mcpClient({ transport })` real server |
|
|
@@ -47,7 +47,7 @@ Build with `mock()` provider + `InMemoryStore` + `mockEmbedder()` + inline tool
|
|
|
47
47
|
|
|
48
48
|
| Mock | Production swap |
|
|
49
49
|
|---|---|
|
|
50
|
-
| `mock({ reply })` · `mock({ replies })` for scripted multi-turn | `
|
|
50
|
+
| `mock({ reply })` · `mock({ replies })` for scripted multi-turn | `ollama('<model>')` — a real model, still $0 and no key · then `anthropic()` / `openai()` / `bedrock()` |
|
|
51
51
|
| `InMemoryStore` | `RedisStore` (`agentfootprint/memory`) · `AgentCoreStore` (`agentfootprint/memory`) · Dynamo · Postgres · Pinecone (planned) |
|
|
52
52
|
| `mockEmbedder()` | OpenAI / Cohere / Bedrock embedder factory |
|
|
53
53
|
| `mockMcpClient({ tools })` — in-memory, no SDK | `mcpClient({ transport })` real server |
|