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.
Files changed (148) hide show
  1. package/AGENTS.md +14 -9
  2. package/README.md +11 -7
  3. package/ai-instructions/claude-code/SKILL.md +1 -1
  4. package/ai-instructions/clinerules +1 -1
  5. package/ai-instructions/copilot-instructions.md +1 -1
  6. package/ai-instructions/cursor/agentfootprint.md +1 -1
  7. package/ai-instructions/kiro/agentfootprint.md +1 -1
  8. package/ai-instructions/windsurfrules +1 -1
  9. package/dist/adapters/llm/OllamaProvider.js +628 -0
  10. package/dist/adapters/llm/OllamaProvider.js.map +1 -0
  11. package/dist/adapters/llm/OpenAIProvider.js +12 -21
  12. package/dist/adapters/llm/OpenAIProvider.js.map +1 -1
  13. package/dist/adapters/llm/createProvider.js +35 -6
  14. package/dist/adapters/llm/createProvider.js.map +1 -1
  15. package/dist/core/Agent.js +44 -1
  16. package/dist/core/Agent.js.map +1 -1
  17. package/dist/core/agent/stages/seed.js +10 -0
  18. package/dist/core/agent/stages/seed.js.map +1 -1
  19. package/dist/core/agent/stages/window.js +21 -0
  20. package/dist/core/agent/stages/window.js.map +1 -1
  21. package/dist/core/agent/window/errors.js +4 -3
  22. package/dist/core/agent/window/errors.js.map +1 -1
  23. package/dist/core/agent/window/folded.js +98 -0
  24. package/dist/core/agent/window/folded.js.map +1 -0
  25. package/dist/core/agent/window/index.js +9 -1
  26. package/dist/core/agent/window/index.js.map +1 -1
  27. package/dist/core/agent/window/options.js +18 -2
  28. package/dist/core/agent/window/options.js.map +1 -1
  29. package/dist/core/agent/window/strategies/slidingWindow.js +2 -2
  30. package/dist/core/agent/window/strategies/summarizeOldest.js +25 -2
  31. package/dist/core/agent/window/strategies/summarizeOldest.js.map +1 -1
  32. package/dist/core/agent/window/summarize.js +27 -1
  33. package/dist/core/agent/window/summarize.js.map +1 -1
  34. package/dist/core/agent/window/types.js +6 -0
  35. package/dist/core/agent/window/types.js.map +1 -1
  36. package/dist/core/runCheckpoint.js +9 -1
  37. package/dist/core/runCheckpoint.js.map +1 -1
  38. package/dist/esm/adapters/llm/OllamaProvider.d.ts +182 -0
  39. package/dist/esm/adapters/llm/OllamaProvider.js +622 -0
  40. package/dist/esm/adapters/llm/OllamaProvider.js.map +1 -0
  41. package/dist/esm/adapters/llm/OpenAIProvider.d.ts +0 -12
  42. package/dist/esm/adapters/llm/OpenAIProvider.js +11 -19
  43. package/dist/esm/adapters/llm/OpenAIProvider.js.map +1 -1
  44. package/dist/esm/adapters/llm/createProvider.d.ts +25 -8
  45. package/dist/esm/adapters/llm/createProvider.js +35 -6
  46. package/dist/esm/adapters/llm/createProvider.js.map +1 -1
  47. package/dist/esm/core/Agent.d.ts +17 -0
  48. package/dist/esm/core/Agent.js +44 -1
  49. package/dist/esm/core/Agent.js.map +1 -1
  50. package/dist/esm/core/agent/stages/seed.d.ts +11 -0
  51. package/dist/esm/core/agent/stages/seed.js +10 -0
  52. package/dist/esm/core/agent/stages/seed.js.map +1 -1
  53. package/dist/esm/core/agent/stages/window.d.ts +13 -0
  54. package/dist/esm/core/agent/stages/window.js +21 -0
  55. package/dist/esm/core/agent/stages/window.js.map +1 -1
  56. package/dist/esm/core/agent/types.d.ts +15 -1
  57. package/dist/esm/core/agent/window/errors.js +4 -3
  58. package/dist/esm/core/agent/window/errors.js.map +1 -1
  59. package/dist/esm/core/agent/window/folded.d.ts +90 -0
  60. package/dist/esm/core/agent/window/folded.js +92 -0
  61. package/dist/esm/core/agent/window/folded.js.map +1 -0
  62. package/dist/esm/core/agent/window/index.d.ts +7 -1
  63. package/dist/esm/core/agent/window/index.js +6 -0
  64. package/dist/esm/core/agent/window/index.js.map +1 -1
  65. package/dist/esm/core/agent/window/options.d.ts +7 -1
  66. package/dist/esm/core/agent/window/options.js +17 -1
  67. package/dist/esm/core/agent/window/options.js.map +1 -1
  68. package/dist/esm/core/agent/window/strategies/slidingWindow.d.ts +2 -2
  69. package/dist/esm/core/agent/window/strategies/slidingWindow.js +2 -2
  70. package/dist/esm/core/agent/window/strategies/summarizeOldest.d.ts +4 -2
  71. package/dist/esm/core/agent/window/strategies/summarizeOldest.js +25 -2
  72. package/dist/esm/core/agent/window/strategies/summarizeOldest.js.map +1 -1
  73. package/dist/esm/core/agent/window/strategy.d.ts +26 -1
  74. package/dist/esm/core/agent/window/summarize.d.ts +11 -0
  75. package/dist/esm/core/agent/window/summarize.js +27 -1
  76. package/dist/esm/core/agent/window/summarize.js.map +1 -1
  77. package/dist/esm/core/agent/window/types.d.ts +106 -1
  78. package/dist/esm/core/agent/window/types.js +6 -0
  79. package/dist/esm/core/agent/window/types.js.map +1 -1
  80. package/dist/esm/core/runCheckpoint.d.ts +32 -1
  81. package/dist/esm/core/runCheckpoint.js +9 -1
  82. package/dist/esm/core/runCheckpoint.js.map +1 -1
  83. package/dist/esm/index.d.ts +1 -1
  84. package/dist/esm/index.js +6 -1
  85. package/dist/esm/index.js.map +1 -1
  86. package/dist/esm/providers.d.ts +13 -5
  87. package/dist/esm/providers.js +13 -5
  88. package/dist/esm/providers.js.map +1 -1
  89. package/dist/esm/thinking/OllamaThinkingHandler.d.ts +60 -0
  90. package/dist/esm/thinking/OllamaThinkingHandler.js +107 -0
  91. package/dist/esm/thinking/OllamaThinkingHandler.js.map +1 -0
  92. package/dist/esm/thinking/index.d.ts +1 -0
  93. package/dist/esm/thinking/index.js +1 -0
  94. package/dist/esm/thinking/index.js.map +1 -1
  95. package/dist/esm/thinking/registry.js +2 -0
  96. package/dist/esm/thinking/registry.js.map +1 -1
  97. package/dist/index.js +9 -2
  98. package/dist/index.js.map +1 -1
  99. package/dist/providers.js +16 -6
  100. package/dist/providers.js.map +1 -1
  101. package/dist/thinking/OllamaThinkingHandler.js +111 -0
  102. package/dist/thinking/OllamaThinkingHandler.js.map +1 -0
  103. package/dist/thinking/index.js +4 -1
  104. package/dist/thinking/index.js.map +1 -1
  105. package/dist/thinking/registry.js +2 -0
  106. package/dist/thinking/registry.js.map +1 -1
  107. package/dist/types/adapters/llm/OllamaProvider.d.ts +183 -0
  108. package/dist/types/adapters/llm/OllamaProvider.d.ts.map +1 -0
  109. package/dist/types/adapters/llm/OpenAIProvider.d.ts +0 -12
  110. package/dist/types/adapters/llm/OpenAIProvider.d.ts.map +1 -1
  111. package/dist/types/adapters/llm/createProvider.d.ts +25 -8
  112. package/dist/types/adapters/llm/createProvider.d.ts.map +1 -1
  113. package/dist/types/core/Agent.d.ts +17 -0
  114. package/dist/types/core/Agent.d.ts.map +1 -1
  115. package/dist/types/core/agent/stages/seed.d.ts +11 -0
  116. package/dist/types/core/agent/stages/seed.d.ts.map +1 -1
  117. package/dist/types/core/agent/stages/window.d.ts +13 -0
  118. package/dist/types/core/agent/stages/window.d.ts.map +1 -1
  119. package/dist/types/core/agent/types.d.ts +15 -1
  120. package/dist/types/core/agent/types.d.ts.map +1 -1
  121. package/dist/types/core/agent/window/errors.d.ts.map +1 -1
  122. package/dist/types/core/agent/window/folded.d.ts +91 -0
  123. package/dist/types/core/agent/window/folded.d.ts.map +1 -0
  124. package/dist/types/core/agent/window/index.d.ts +7 -1
  125. package/dist/types/core/agent/window/index.d.ts.map +1 -1
  126. package/dist/types/core/agent/window/options.d.ts +7 -1
  127. package/dist/types/core/agent/window/options.d.ts.map +1 -1
  128. package/dist/types/core/agent/window/strategies/slidingWindow.d.ts +2 -2
  129. package/dist/types/core/agent/window/strategies/summarizeOldest.d.ts +4 -2
  130. package/dist/types/core/agent/window/strategies/summarizeOldest.d.ts.map +1 -1
  131. package/dist/types/core/agent/window/strategy.d.ts +26 -1
  132. package/dist/types/core/agent/window/strategy.d.ts.map +1 -1
  133. package/dist/types/core/agent/window/summarize.d.ts +11 -0
  134. package/dist/types/core/agent/window/summarize.d.ts.map +1 -1
  135. package/dist/types/core/agent/window/types.d.ts +106 -1
  136. package/dist/types/core/agent/window/types.d.ts.map +1 -1
  137. package/dist/types/core/runCheckpoint.d.ts +32 -1
  138. package/dist/types/core/runCheckpoint.d.ts.map +1 -1
  139. package/dist/types/index.d.ts +1 -1
  140. package/dist/types/index.d.ts.map +1 -1
  141. package/dist/types/providers.d.ts +13 -5
  142. package/dist/types/providers.d.ts.map +1 -1
  143. package/dist/types/thinking/OllamaThinkingHandler.d.ts +61 -0
  144. package/dist/types/thinking/OllamaThinkingHandler.d.ts.map +1 -0
  145. package/dist/types/thinking/index.d.ts +1 -0
  146. package/dist/types/thinking/index.d.ts.map +1 -1
  147. package/dist/types/thinking/registry.d.ts.map +1 -1
  148. 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 | `anthropic()` · `openai()` · `bedrock()` · `ollama()` |
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
- // Adapter-swap testing: same agent, different provider, $0 in CI
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; the vendor-SDK-backed providers (`anthropic` · `openai` · `bedrock`
416
- · `ollama`) live ONLY at `agentfootprint/providers` (legacy alias:
417
- `agentfootprint/providers`) so bundlers never walk their lazy peer-dep
418
- requires. Browser variants exist for client-side use.
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 (Ollama, llama.cpp, vLLM any OpenAI-compatible endpoint)
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. `openai({ baseURL })` targets any server that speaks the OpenAI Chat Completions API — Ollama has its own one-line shortcut:
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({ defaultModel: 'llama3.1' }), model: 'llama3.1' }).build();
116
- // → talks to http://localhost:11434/v1 (run `ollama pull llama3.1` first)
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
- For llama.cpp's `llama-server` or vLLM, swap in `openai({ baseURL: 'http://localhost:8080/v1', apiKey: 'not-needed', defaultModel: '…' })` same `Agent` code either way. Local servers usually ignore `apiKey`, and most only accept the older `max_tokens` field; both are handled automatically whenever `baseURL` is set. Full recipes: [OpenAI-compatible endpoints](https://footprintjs.github.io/agentfootprint/docs/build/openai/#openai-compatible-endpoints-ollama-llamacpp-vllm-together-groq-lm-studio) · [Ollama guide](https://footprintjs.github.io/agentfootprint/docs/build/ollama/).
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(...)` | `anthropic()` · `openai()` · `bedrock()` · `ollama()` |
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 via Ollama · `openai({ baseURL })` also reaches llama.cpp, vLLM, and any other OpenAI-compatible endpoint |
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 | `anthropic()` / `openai()` / `bedrock()` / `ollama()` |
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 | `anthropic()` / `openai()` / `bedrock()` / `ollama()` |
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 | `anthropic()` / `openai()` / `bedrock()` / `ollama()` |
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 | `anthropic()` / `openai()` / `bedrock()` / `ollama()` |
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 | `anthropic()` / `openai()` / `bedrock()` / `ollama()` |
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 | `anthropic()` / `openai()` / `bedrock()` / `ollama()` |
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 |