hoomanjs 1.28.2 → 1.29.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 (153) hide show
  1. package/README.md +32 -71
  2. package/dist/acp/acp-agent.js +1 -1
  3. package/dist/acp/acp-agent.js.map +1 -1
  4. package/dist/acp/sessions/{config-options.d.ts → options.d.ts} +0 -2
  5. package/dist/acp/sessions/{config-options.js → options.js} +3 -52
  6. package/dist/acp/sessions/options.js.map +1 -0
  7. package/dist/acp/utils/tool-kind.js +3 -9
  8. package/dist/acp/utils/tool-kind.js.map +1 -1
  9. package/dist/acp/utils/tool-locations.js +0 -2
  10. package/dist/acp/utils/tool-locations.js.map +1 -1
  11. package/dist/chat/app.js +1 -1
  12. package/dist/chat/app.js.map +1 -1
  13. package/dist/chat/index.js +1 -1
  14. package/dist/chat/index.js.map +1 -1
  15. package/dist/configure/app.js +227 -72
  16. package/dist/configure/app.js.map +1 -1
  17. package/dist/configure/types.d.ts +8 -0
  18. package/dist/core/agent/index.d.ts +1 -1
  19. package/dist/core/agent/index.js +10 -9
  20. package/dist/core/agent/index.js.map +1 -1
  21. package/dist/core/agents/registry.js +1 -1
  22. package/dist/core/agents/registry.js.map +1 -1
  23. package/dist/core/config.d.ts +5 -24
  24. package/dist/core/config.js +8 -43
  25. package/dist/core/config.js.map +1 -1
  26. package/dist/core/context/flat-file-storage.js.map +1 -0
  27. package/dist/core/{memory/stm → context}/index.js +1 -1
  28. package/dist/core/context/index.js.map +1 -0
  29. package/dist/core/{memory/stm → context}/lazy-session-manager.js +1 -1
  30. package/dist/core/context/lazy-session-manager.js.map +1 -0
  31. package/dist/core/inference/embedder.d.ts +26 -0
  32. package/dist/core/inference/embedder.js +85 -0
  33. package/dist/core/inference/embedder.js.map +1 -0
  34. package/dist/core/inference/index.d.ts +12 -0
  35. package/dist/core/inference/index.js +20 -0
  36. package/dist/core/inference/index.js.map +1 -0
  37. package/dist/core/inference/loader.d.ts +8 -0
  38. package/dist/core/inference/loader.js +85 -0
  39. package/dist/core/inference/loader.js.map +1 -0
  40. package/dist/core/memory/brain.d.ts +24 -0
  41. package/dist/core/memory/brain.js +133 -0
  42. package/dist/core/memory/brain.js.map +1 -0
  43. package/dist/core/memory/database.d.ts +4 -0
  44. package/dist/core/memory/database.js +87 -0
  45. package/dist/core/memory/database.js.map +1 -0
  46. package/dist/core/memory/index.d.ts +5 -3
  47. package/dist/core/memory/index.js +3 -2
  48. package/dist/core/memory/index.js.map +1 -1
  49. package/dist/core/memory/tools.d.ts +16 -0
  50. package/dist/core/memory/tools.js +105 -0
  51. package/dist/core/memory/tools.js.map +1 -0
  52. package/dist/core/memory/types.d.ts +11 -0
  53. package/dist/core/memory/{ltm/types.js.map → types.js.map} +1 -1
  54. package/dist/core/models/index.js +1 -3
  55. package/dist/core/models/index.js.map +1 -1
  56. package/dist/core/models/openai.js +9 -0
  57. package/dist/core/models/openai.js.map +1 -0
  58. package/dist/core/prompts/static/memory.md +125 -0
  59. package/dist/core/prompts/static/wiki.md +15 -71
  60. package/dist/core/prompts/system.d.ts +4 -0
  61. package/dist/core/prompts/system.js +40 -9
  62. package/dist/core/prompts/system.js.map +1 -1
  63. package/dist/core/skills/built-in/hooman-config/SKILL.md +14 -50
  64. package/dist/core/state/tool-approvals.js +4 -15
  65. package/dist/core/state/tool-approvals.js.map +1 -1
  66. package/dist/core/tools/index.d.ts +0 -1
  67. package/dist/core/tools/index.js +0 -1
  68. package/dist/core/tools/index.js.map +1 -1
  69. package/dist/core/utils/hashing.d.ts +1 -0
  70. package/dist/core/utils/hashing.js +5 -0
  71. package/dist/core/utils/hashing.js.map +1 -0
  72. package/dist/core/utils/paths.d.ts +3 -0
  73. package/dist/core/utils/paths.js +11 -24
  74. package/dist/core/utils/paths.js.map +1 -1
  75. package/dist/core/utils/strands-usage-accumulate.js.map +1 -0
  76. package/dist/core/wiki/converters.d.ts +12 -0
  77. package/dist/core/wiki/converters.js +73 -0
  78. package/dist/core/wiki/converters.js.map +1 -0
  79. package/dist/core/wiki/database.d.ts +38 -0
  80. package/dist/core/wiki/database.js +173 -0
  81. package/dist/core/wiki/database.js.map +1 -0
  82. package/dist/core/wiki/index.d.ts +7 -0
  83. package/dist/core/wiki/index.js +5 -0
  84. package/dist/core/wiki/index.js.map +1 -0
  85. package/dist/core/wiki/storage.d.ts +35 -0
  86. package/dist/core/wiki/storage.js +196 -0
  87. package/dist/core/wiki/storage.js.map +1 -0
  88. package/dist/core/wiki/tools.d.ts +5 -0
  89. package/dist/core/wiki/tools.js +32 -0
  90. package/dist/core/wiki/tools.js.map +1 -0
  91. package/dist/index.d.ts +11 -18
  92. package/dist/index.js +8 -13
  93. package/dist/index.js.map +1 -1
  94. package/package.json +13 -8
  95. package/dist/acp/sessions/config-options.js.map +0 -1
  96. package/dist/core/memory/ltm/embed.d.ts +0 -16
  97. package/dist/core/memory/ltm/embed.js +0 -49
  98. package/dist/core/memory/ltm/embed.js.map +0 -1
  99. package/dist/core/memory/ltm/index.d.ts +0 -3
  100. package/dist/core/memory/ltm/index.js +0 -3
  101. package/dist/core/memory/ltm/index.js.map +0 -1
  102. package/dist/core/memory/ltm/store.d.ts +0 -20
  103. package/dist/core/memory/ltm/store.js +0 -271
  104. package/dist/core/memory/ltm/store.js.map +0 -1
  105. package/dist/core/memory/ltm/tools.d.ts +0 -21
  106. package/dist/core/memory/ltm/tools.js +0 -127
  107. package/dist/core/memory/ltm/tools.js.map +0 -1
  108. package/dist/core/memory/ltm/types.d.ts +0 -79
  109. package/dist/core/memory/ltm/utils.d.ts +0 -40
  110. package/dist/core/memory/ltm/utils.js +0 -145
  111. package/dist/core/memory/ltm/utils.js.map +0 -1
  112. package/dist/core/memory/stm/flat-file-storage.js.map +0 -1
  113. package/dist/core/memory/stm/index.js.map +0 -1
  114. package/dist/core/memory/stm/lazy-session-manager.js.map +0 -1
  115. package/dist/core/models/bifrost/bifrost-base-url.d.ts +0 -6
  116. package/dist/core/models/bifrost/bifrost-base-url.js +0 -27
  117. package/dist/core/models/bifrost/bifrost-base-url.js.map +0 -1
  118. package/dist/core/models/bifrost/index.d.ts +0 -11
  119. package/dist/core/models/bifrost/index.js +0 -29
  120. package/dist/core/models/bifrost/index.js.map +0 -1
  121. package/dist/core/models/bifrost/strands-bifrost.d.ts +0 -14
  122. package/dist/core/models/bifrost/strands-bifrost.js +0 -168
  123. package/dist/core/models/bifrost/strands-bifrost.js.map +0 -1
  124. package/dist/core/models/openai/index.js +0 -13
  125. package/dist/core/models/openai/index.js.map +0 -1
  126. package/dist/core/models/openai/kimi-reasoning-wire.d.ts +0 -40
  127. package/dist/core/models/openai/kimi-reasoning-wire.js +0 -109
  128. package/dist/core/models/openai/kimi-reasoning-wire.js.map +0 -1
  129. package/dist/core/models/openai/openai-stream-shims.d.ts +0 -13
  130. package/dist/core/models/openai/openai-stream-shims.js +0 -48
  131. package/dist/core/models/openai/openai-stream-shims.js.map +0 -1
  132. package/dist/core/models/tensorzero/index.d.ts +0 -12
  133. package/dist/core/models/tensorzero/index.js +0 -17
  134. package/dist/core/models/tensorzero/index.js.map +0 -1
  135. package/dist/core/models/tensorzero/openai-chat-request-shims.d.ts +0 -25
  136. package/dist/core/models/tensorzero/openai-chat-request-shims.js +0 -45
  137. package/dist/core/models/tensorzero/openai-chat-request-shims.js.map +0 -1
  138. package/dist/core/models/tensorzero/strands-tensorzero.d.ts +0 -14
  139. package/dist/core/models/tensorzero/strands-tensorzero.js +0 -140
  140. package/dist/core/models/tensorzero/strands-tensorzero.js.map +0 -1
  141. package/dist/core/prompts/static/ltm.md +0 -50
  142. package/dist/core/tools/wiki.d.ts +0 -11
  143. package/dist/core/tools/wiki.js +0 -560
  144. package/dist/core/tools/wiki.js.map +0 -1
  145. package/dist/lib/strands-usage-accumulate.js.map +0 -1
  146. /package/dist/core/{memory/stm → context}/flat-file-storage.d.ts +0 -0
  147. /package/dist/core/{memory/stm → context}/flat-file-storage.js +0 -0
  148. /package/dist/core/{memory/stm → context}/index.d.ts +0 -0
  149. /package/dist/core/{memory/stm → context}/lazy-session-manager.d.ts +0 -0
  150. /package/dist/core/memory/{ltm/types.js → types.js} +0 -0
  151. /package/dist/core/models/{openai/index.d.ts → openai.d.ts} +0 -0
  152. /package/dist/{lib → core/utils}/strands-usage-accumulate.d.ts +0 -0
  153. /package/dist/{lib → core/utils}/strands-usage-accumulate.js +0 -0
@@ -1,168 +0,0 @@
1
- import { dirname, join } from "node:path";
2
- import { fileURLToPath, pathToFileURL } from "node:url";
3
- import { OpenAIModel } from "@strands-agents/sdk/models/openai";
4
- import { applyKimiReasoningContentToChatRequest, collectReasoningTextPerWireAssistant, stripAssistantReasoningBlocks, } from "../openai/kimi-reasoning-wire.js";
5
- import { splitUsageOntoEmptyChoicesChunk } from "../openai/openai-stream-shims.js";
6
- /** Strands 1.x chat adapter lives next to `models/openai` and is not a package export. */
7
- function openAiChatAdapterUrl() {
8
- return pathToFileURL(join(dirname(fileURLToPath(import.meta.resolve("@strands-agents/sdk/models/openai"))), "chat-adapter.js")).href;
9
- }
10
- let chatAdapterPromise = null;
11
- function loadOpenAiChatAdapter() {
12
- chatAdapterPromise ??= import(openAiChatAdapterUrl());
13
- return chatAdapterPromise;
14
- }
15
- /** Bifrost/Moonshot streams may omit `delta.role`; Strands requires it for a valid turn. */
16
- function ensureAssistantRoleOnFirstDelta(chunk, injected) {
17
- if (injected.value || !chunk.choices?.length) {
18
- return;
19
- }
20
- const delta = chunk.choices[0]?.delta;
21
- if (!delta || typeof delta !== "object") {
22
- return;
23
- }
24
- if (delta.role != null && delta.role !== "") {
25
- injected.value = true;
26
- return;
27
- }
28
- const meaningful = Object.keys(delta).some((k) => {
29
- const v = delta[k];
30
- if (v == null) {
31
- return false;
32
- }
33
- if (k === "content" || k === "reasoning") {
34
- return typeof v === "string" && v.length > 0;
35
- }
36
- if (k === "tool_calls") {
37
- return Array.isArray(v) && v.length > 0;
38
- }
39
- if (k === "reasoning_details") {
40
- return Array.isArray(v) && v.length > 0;
41
- }
42
- return true;
43
- });
44
- if (!meaningful) {
45
- return;
46
- }
47
- delta.role = "assistant";
48
- injected.value = true;
49
- }
50
- function closeOpenReasoningBeforeWireEvents(delta, streamState) {
51
- if (!delta || !streamState.reasoningContentBlockStarted) {
52
- return [];
53
- }
54
- const toolCalls = delta.tool_calls;
55
- if (Array.isArray(toolCalls) && toolCalls.length > 0) {
56
- streamState.reasoningContentBlockStarted = false;
57
- return [{ type: "modelContentBlockStopEvent" }];
58
- }
59
- const content = delta.content;
60
- if (typeof content === "string" && content.length > 0) {
61
- streamState.reasoningContentBlockStarted = false;
62
- return [{ type: "modelContentBlockStopEvent" }];
63
- }
64
- return [];
65
- }
66
- function openReasoningDeltaEvents(delta, streamState) {
67
- const out = [];
68
- if (!delta) {
69
- return out;
70
- }
71
- const reasoning = delta.reasoning;
72
- if (typeof reasoning !== "string" || reasoning.length === 0) {
73
- return out;
74
- }
75
- if (!streamState.reasoningContentBlockStarted) {
76
- out.push({ type: "modelContentBlockStartEvent" });
77
- streamState.reasoningContentBlockStarted = true;
78
- }
79
- out.push({
80
- type: "modelContentBlockDeltaEvent",
81
- delta: { type: "reasoningContentDelta", text: reasoning },
82
- });
83
- return out;
84
- }
85
- function injectReasoningStopBeforeMessageStop(events, streamState) {
86
- const out = [];
87
- for (const e of events) {
88
- if (e.type === "modelMessageStopEvent" &&
89
- streamState.reasoningContentBlockStarted) {
90
- out.push({ type: "modelContentBlockStopEvent" });
91
- streamState.reasoningContentBlockStarted = false;
92
- }
93
- out.push(e);
94
- }
95
- return out;
96
- }
97
- /**
98
- * {@link OpenAIModel} tuned for Bifrost (and similar gateways) fronting Moonshot/Kimi OpenAI
99
- * routes: `delta.reasoning`, missing initial `delta.role`, `reasoning_content` replay for tool
100
- * turns, and usage on the final streamed chunk.
101
- */
102
- export class StrandsBifrostModel extends OpenAIModel {
103
- constructor(options) {
104
- if (options.api !== "chat") {
105
- throw new Error(`Bifrost provider requires api: 'chat' (got '${String(options.api)}')`);
106
- }
107
- super(options);
108
- }
109
- async *stream(messages, options) {
110
- if (!messages || messages.length === 0) {
111
- throw new Error("At least one message is required");
112
- }
113
- const { formatChatRequest, mapChatChunkToEvents } = await loadOpenAiChatAdapter();
114
- const client = this._client;
115
- const rewrap = this._rewrapError;
116
- try {
117
- const reasoningPerWireAssistant = collectReasoningTextPerWireAssistant(messages);
118
- const messagesForRequest = stripAssistantReasoningBlocks(messages);
119
- const request = formatChatRequest(this.getConfig(), messagesForRequest, options);
120
- applyKimiReasoningContentToChatRequest(request, reasoningPerWireAssistant, { toolPlaceholderWhenMissingReasoning: true });
121
- const raw = await client.chat.completions.create(request);
122
- const stream = splitUsageOntoEmptyChoicesChunk(raw);
123
- const streamState = {
124
- messageStarted: false,
125
- textContentBlockStarted: false,
126
- reasoningContentBlockStarted: false,
127
- };
128
- const activeToolCalls = new Map();
129
- const roleInjected = { value: false };
130
- let bufferedUsage = null;
131
- for await (const chunk of stream) {
132
- if (!chunk.choices || chunk.choices.length === 0) {
133
- if (chunk.usage) {
134
- bufferedUsage = {
135
- type: "modelMetadataEvent",
136
- usage: {
137
- inputTokens: chunk.usage.prompt_tokens ?? 0,
138
- outputTokens: chunk.usage.completion_tokens ?? 0,
139
- totalTokens: chunk.usage.total_tokens ?? 0,
140
- },
141
- };
142
- }
143
- continue;
144
- }
145
- ensureAssistantRoleOnFirstDelta(chunk, roleInjected);
146
- const delta = chunk.choices[0]?.delta;
147
- const closeReasoning = closeOpenReasoningBeforeWireEvents(delta, streamState);
148
- const base = mapChatChunkToEvents(chunk, streamState, activeToolCalls);
149
- const openReasoning = openReasoningDeltaEvents(delta, streamState);
150
- const events = injectReasoningStopBeforeMessageStop([...closeReasoning, ...base, ...openReasoning], streamState);
151
- for (const event of events) {
152
- if (event.type === "modelMessageStopEvent" && bufferedUsage) {
153
- yield bufferedUsage;
154
- bufferedUsage = null;
155
- }
156
- yield event;
157
- }
158
- }
159
- if (bufferedUsage) {
160
- yield bufferedUsage;
161
- }
162
- }
163
- catch (error) {
164
- throw rewrap.call(this, error);
165
- }
166
- }
167
- }
168
- //# sourceMappingURL=strands-bifrost.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"strands-bifrost.js","sourceRoot":"","sources":["../../../../src/core/models/bifrost/strands-bifrost.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- import { OpenAIModel } from "@strands-agents/sdk/models/openai";
2
- import { patchOpenAIClientChatCompletionsForUsage } from "./openai-stream-shims.js";
3
- export function create(model, params) {
4
- const openaiModel = new OpenAIModel({
5
- api: "chat",
6
- modelId: model,
7
- ...params,
8
- });
9
- const client = openaiModel._client;
10
- patchOpenAIClientChatCompletionsForUsage(client);
11
- return openaiModel;
12
- }
13
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/models/openai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAGhE,OAAO,EAAE,wCAAwC,EAAE,MAAM,0BAA0B,CAAC;AAKpF,MAAM,UAAU,MAAM,CACpB,KAAa,EACb,MAA+B;IAE/B,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;QAClC,GAAG,EAAE,MAAM;QACX,OAAO,EAAE,KAAK;QACd,GAAI,MAA4B;KACjC,CAAC,CAAC;IACH,MAAM,MAAM,GAAI,WAA8C,CAAC,OAAO,CAAC;IACvE,wCAAwC,CAAC,MAAM,CAAC,CAAC;IACjD,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -1,40 +0,0 @@
1
- import type { Message } from "@strands-agents/sdk";
2
- import type OpenAI from "openai";
3
- /**
4
- * Kimi + tool calls with thinking on still needs a non-empty thought when we have no session
5
- * replay text; direct OpenAI wire uses `reasoning_content`, TensorZero uses thought blocks.
6
- */
7
- export declare const MOONSHOT_REASONING_PLACEHOLDER = " ";
8
- /**
9
- * Strands’ adapter merges `reasoningBlock` into `content`; strip those blocks before
10
- * `formatChatRequest`, then replay via {@link collectReasoningTextPerWireAssistant} and
11
- * {@link applyKimiReasoningContentToChatRequest} or TensorZero’s `tensorzero_extra_content`.
12
- */
13
- export declare function stripAssistantReasoningBlocks(messages: Message[]): Message[];
14
- /**
15
- * One entry per Strands assistant turn that survives Strands’ OpenAI formatter (non-empty
16
- * visible text and/or at least one tool use). Order matches `assistant` rows in
17
- * `formatChatMessages` output.
18
- *
19
- * **Carry-over:** Strands may emit a reasoning-only assistant `Message` (no text, no tools).
20
- * That row is dropped on the wire after stripping reasoning; pending text is merged into the
21
- * next wire assistant’s replay slot.
22
- */
23
- export declare function collectReasoningTextPerWireAssistant(messages: Message[]): string[];
24
- export type KimiReasoningWireApplyOptions = {
25
- /**
26
- * Moonshot/Kimi with thinking: tool-only assistant rows still need a non-empty
27
- * `reasoning_content`. Leave `false` for official OpenAI (default) so requests are unchanged.
28
- */
29
- toolPlaceholderWhenMissingReasoning?: boolean;
30
- };
31
- /**
32
- * Direct Moonshot / Kimi OpenAI API (e.g. via Bifrost): when thinking is on, assistant rows
33
- * with `tool_calls` must include non-empty `reasoning_content`. Strands stores thinking in
34
- * `reasoningBlock`; strip those before `formatChatRequest`, collect via
35
- * {@link collectReasoningTextPerWireAssistant}, then call this.
36
- *
37
- * For **api.openai.com**, omit this call or pass default options: no replay and no placeholder
38
- * means the request body is not mutated.
39
- */
40
- export declare function applyKimiReasoningContentToChatRequest(request: OpenAI.Chat.ChatCompletionCreateParamsStreaming, reasoningPerWireAssistant: readonly string[], options?: KimiReasoningWireApplyOptions): void;
@@ -1,109 +0,0 @@
1
- /**
2
- * Kimi + tool calls with thinking on still needs a non-empty thought when we have no session
3
- * replay text; direct OpenAI wire uses `reasoning_content`, TensorZero uses thought blocks.
4
- */
5
- export const MOONSHOT_REASONING_PLACEHOLDER = " ";
6
- /**
7
- * Strands’ adapter merges `reasoningBlock` into `content`; strip those blocks before
8
- * `formatChatRequest`, then replay via {@link collectReasoningTextPerWireAssistant} and
9
- * {@link applyKimiReasoningContentToChatRequest} or TensorZero’s `tensorzero_extra_content`.
10
- */
11
- export function stripAssistantReasoningBlocks(messages) {
12
- return messages.map((msg) => {
13
- if (msg.role !== "assistant") {
14
- return msg;
15
- }
16
- return {
17
- ...msg,
18
- content: msg.content.filter((b) => b.type !== "reasoningBlock"),
19
- };
20
- });
21
- }
22
- /**
23
- * One entry per Strands assistant turn that survives Strands’ OpenAI formatter (non-empty
24
- * visible text and/or at least one tool use). Order matches `assistant` rows in
25
- * `formatChatMessages` output.
26
- *
27
- * **Carry-over:** Strands may emit a reasoning-only assistant `Message` (no text, no tools).
28
- * That row is dropped on the wire after stripping reasoning; pending text is merged into the
29
- * next wire assistant’s replay slot.
30
- */
31
- export function collectReasoningTextPerWireAssistant(messages) {
32
- const out = [];
33
- const pendingReasoning = [];
34
- for (const msg of messages) {
35
- if (msg.role !== "assistant") {
36
- continue;
37
- }
38
- const reasoningParts = [];
39
- const textParts = [];
40
- let toolUseCount = 0;
41
- for (const block of msg.content) {
42
- if (block.type === "reasoningBlock") {
43
- if (block.text) {
44
- reasoningParts.push(block.text);
45
- }
46
- }
47
- else if (block.type === "textBlock") {
48
- textParts.push(block.text);
49
- }
50
- else if (block.type === "toolUseBlock") {
51
- toolUseCount += 1;
52
- }
53
- }
54
- const reasoningJoined = reasoningParts.join("\n");
55
- const textContent = textParts.join("").trim();
56
- const producesWireAssistant = textContent.length > 0 || toolUseCount > 0;
57
- if (!producesWireAssistant) {
58
- if (reasoningJoined.length > 0) {
59
- pendingReasoning.push(reasoningJoined);
60
- }
61
- continue;
62
- }
63
- const combined = [...pendingReasoning, reasoningJoined]
64
- .filter((s) => s.length > 0)
65
- .join("\n");
66
- pendingReasoning.length = 0;
67
- out.push(combined);
68
- }
69
- return out;
70
- }
71
- /**
72
- * Direct Moonshot / Kimi OpenAI API (e.g. via Bifrost): when thinking is on, assistant rows
73
- * with `tool_calls` must include non-empty `reasoning_content`. Strands stores thinking in
74
- * `reasoningBlock`; strip those before `formatChatRequest`, collect via
75
- * {@link collectReasoningTextPerWireAssistant}, then call this.
76
- *
77
- * For **api.openai.com**, omit this call or pass default options: no replay and no placeholder
78
- * means the request body is not mutated.
79
- */
80
- export function applyKimiReasoningContentToChatRequest(request, reasoningPerWireAssistant, options) {
81
- const placeholderTools = options?.toolPlaceholderWhenMissingReasoning === true;
82
- const anyReplay = reasoningPerWireAssistant.some((s) => s.trim().length > 0);
83
- if (!anyReplay && !placeholderTools) {
84
- return;
85
- }
86
- let assistantOrdinal = 0;
87
- for (const msg of request.messages) {
88
- if (msg.role !== "assistant") {
89
- continue;
90
- }
91
- const extended = msg;
92
- const existing = extended.reasoning_content;
93
- if (typeof existing === "string" && existing.length > 0) {
94
- assistantOrdinal += 1;
95
- continue;
96
- }
97
- const raw = reasoningPerWireAssistant[assistantOrdinal] ?? "";
98
- assistantOrdinal += 1;
99
- const hasReplay = raw.trim().length > 0;
100
- const hasTools = !!extended.tool_calls && extended.tool_calls.length > 0;
101
- if (hasReplay) {
102
- extended.reasoning_content = raw;
103
- }
104
- else if (hasTools && placeholderTools) {
105
- extended.reasoning_content = MOONSHOT_REASONING_PLACEHOLDER;
106
- }
107
- }
108
- }
109
- //# sourceMappingURL=kimi-reasoning-wire.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kimi-reasoning-wire.js","sourceRoot":"","sources":["../../../../src/core/models/openai/kimi-reasoning-wire.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- import OpenAI from "openai";
2
- /**
3
- * Wrap `client.chat.completions.create` so streaming responses split usage onto an empty
4
- * `choices` chunk when needed (see {@link splitUsageOntoEmptyChoicesChunk}). Idempotent per
5
- * client instance.
6
- */
7
- export declare function patchOpenAIClientChatCompletionsForUsage(client: OpenAI): void;
8
- /**
9
- * Some OpenAI-compatible gateways (e.g. TensorZero) attach `usage` to the final chunk that
10
- * still has non-empty `choices`. Strands' chat mapper only reads `usage` when `choices` is
11
- * empty. Split so usage appears on an empty-choices chunk first.
12
- */
13
- export declare function splitUsageOntoEmptyChoicesChunk(stream: AsyncIterable<OpenAI.Chat.Completions.ChatCompletionChunk>): AsyncIterable<OpenAI.Chat.Completions.ChatCompletionChunk>;
@@ -1,48 +0,0 @@
1
- const CHAT_STREAM_USAGE_PATCH_KEY = Symbol.for("hooman.openaiChatCompletionsUsageStreamPatch");
2
- /**
3
- * Wrap `client.chat.completions.create` so streaming responses split usage onto an empty
4
- * `choices` chunk when needed (see {@link splitUsageOntoEmptyChoicesChunk}). Idempotent per
5
- * client instance.
6
- */
7
- export function patchOpenAIClientChatCompletionsForUsage(client) {
8
- const marked = client;
9
- if (marked[CHAT_STREAM_USAGE_PATCH_KEY]) {
10
- return;
11
- }
12
- marked[CHAT_STREAM_USAGE_PATCH_KEY] = true;
13
- const completions = client.chat.completions;
14
- const originalCreate = completions.create.bind(completions);
15
- completions.create = (async (body, options) => {
16
- const result = await originalCreate(body, options);
17
- if (body &&
18
- typeof body === "object" &&
19
- "stream" in body &&
20
- body.stream === true) {
21
- const asStream = result;
22
- if (asStream != null &&
23
- typeof asStream[Symbol.asyncIterator] === "function") {
24
- return splitUsageOntoEmptyChoicesChunk(asStream);
25
- }
26
- }
27
- return result;
28
- });
29
- }
30
- /**
31
- * Some OpenAI-compatible gateways (e.g. TensorZero) attach `usage` to the final chunk that
32
- * still has non-empty `choices`. Strands' chat mapper only reads `usage` when `choices` is
33
- * empty. Split so usage appears on an empty-choices chunk first.
34
- */
35
- export async function* splitUsageOntoEmptyChoicesChunk(stream) {
36
- for await (const chunk of stream) {
37
- const usage = chunk.usage;
38
- const choices = chunk.choices;
39
- if (usage && choices && choices.length > 0) {
40
- yield { ...chunk, choices: [] };
41
- yield { ...chunk, usage: undefined };
42
- }
43
- else {
44
- yield chunk;
45
- }
46
- }
47
- }
48
- //# sourceMappingURL=openai-stream-shims.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-stream-shims.js","sourceRoot":"","sources":["../../../../src/core/models/openai/openai-stream-shims.ts"],"names":[],"mappings":"AAEA,MAAM,2BAA2B,GAAG,MAAM,CAAC,GAAG,CAC5C,8CAA8C,CAC/C,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,wCAAwC,CAAC,MAAc;IACrE,MAAM,MAAM,GAAG,MAEd,CAAC;IACF,IAAI,MAAM,CAAC,2BAA2B,CAAC,EAAE,CAAC;QACxC,OAAO;IACT,CAAC;IACD,MAAM,CAAC,2BAA2B,CAAC,GAAG,IAAI,CAAC;IAE3C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;IAC5C,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5D,WAAW,CAAC,MAAM,GAAG,CAAC,KAAK,EACzB,IAA0C,EAC1C,OAA8C,EAC9C,EAAE;QACF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnD,IACE,IAAI;YACJ,OAAO,IAAI,KAAK,QAAQ;YACxB,QAAQ,IAAI,IAAI;YAChB,IAAI,CAAC,MAAM,KAAK,IAAI,EACpB,CAAC;YACD,MAAM,QAAQ,GAAG,MAAiB,CAAC;YACnC,IACE,QAAQ,IAAI,IAAI;gBAChB,OACE,QACD,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,UAAU,EACtC,CAAC;gBACD,OAAO,+BAA+B,CACpC,QAAsE,CACvE,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAyC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,+BAA+B,CACpD,MAAkE;IAElE,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,IAAI,KAAK,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAChC,MAAM,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,12 +0,0 @@
1
- import type { OpenAIModelOptions } from "@strands-agents/sdk/models/openai";
2
- import { StrandsTensorZeroModel } from "./strands-tensorzero.js";
3
- export { StrandsTensorZeroModel } from "./strands-tensorzero.js";
4
- export type TensorZeroModelConfig = Omit<OpenAIModelOptions, "api" | "modelId">;
5
- /**
6
- * Strands {@link Model} for a TensorZero gateway’s OpenAI-compatible HTTP API (`/openai/v1`).
7
- * Handles gateway-specific streaming: token usage on the last chunk and `tensorzero_extra_content` thoughts.
8
- *
9
- * Set TensorZero tags (e.g. `user_id` for gateway rate limits) in config under `llm.params.params`:
10
- * `"params": { "tensorzero::tags": { "user_id": "…" } }` alongside `apiKey` / `clientConfig`.
11
- */
12
- export declare function create(model: string, params: Record<string, unknown>): StrandsTensorZeroModel;
@@ -1,17 +0,0 @@
1
- import { StrandsTensorZeroModel } from "./strands-tensorzero.js";
2
- export { StrandsTensorZeroModel } from "./strands-tensorzero.js";
3
- /**
4
- * Strands {@link Model} for a TensorZero gateway’s OpenAI-compatible HTTP API (`/openai/v1`).
5
- * Handles gateway-specific streaming: token usage on the last chunk and `tensorzero_extra_content` thoughts.
6
- *
7
- * Set TensorZero tags (e.g. `user_id` for gateway rate limits) in config under `llm.params.params`:
8
- * `"params": { "tensorzero::tags": { "user_id": "…" } }` alongside `apiKey` / `clientConfig`.
9
- */
10
- export function create(model, params) {
11
- return new StrandsTensorZeroModel({
12
- api: "chat",
13
- modelId: model,
14
- ...params,
15
- });
16
- }
17
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/models/tensorzero/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAIjE;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CACpB,KAAa,EACb,MAA+B;IAE/B,OAAO,IAAI,sBAAsB,CAAC;QAChC,GAAG,EAAE,MAAM;QACX,OAAO,EAAE,KAAK;QACd,GAAI,MAAgC;KACrC,CAAC,CAAC;AACL,CAAC"}
@@ -1,25 +0,0 @@
1
- import type OpenAI from "openai";
2
- /**
3
- * TensorZero’s OpenAI-compat assistant struct has `content`, `tool_calls`, and
4
- * `tensorzero_extra_content` — it does **not** deserialize `reasoning_content`, so that field
5
- * never reaches Moonshot. Replay chain-of-thought as `tensorzero_extra_content` entries with
6
- * `type: "thought"` (see TensorZero `openai_messages_to_input` / `ExtraContentBlock::Thought`).
7
- *
8
- * Shared Strands → wire helpers: `openai/kimi-reasoning-wire.ts`.
9
- */
10
- export { collectReasoningTextPerWireAssistant, stripAssistantReasoningBlocks, } from "../openai/kimi-reasoning-wire.js";
11
- /**
12
- * TensorZero OpenAI-compat thought block (serde `ExtraContentBlock::Thought` with flattened
13
- * `Thought` fields).
14
- */
15
- export type TensorZeroExtraThoughtBlock = {
16
- type: "thought";
17
- /** Insert before text + tool calls in the internal assistant message (`0` = first). */
18
- insert_index: number;
19
- text: string;
20
- };
21
- /**
22
- * Replay session reasoning through TensorZero so Moonshot receives `Thought` content, not
23
- * dropped `reasoning_content`. Skips rows that already set `tensorzero_extra_content`.
24
- */
25
- export declare function applyKimiReasoningReplayToChatRequest(request: OpenAI.Chat.ChatCompletionCreateParamsStreaming, reasoningPerWireAssistant: readonly string[]): void;
@@ -1,45 +0,0 @@
1
- import { MOONSHOT_REASONING_PLACEHOLDER } from "../openai/kimi-reasoning-wire.js";
2
- /**
3
- * TensorZero’s OpenAI-compat assistant struct has `content`, `tool_calls`, and
4
- * `tensorzero_extra_content` — it does **not** deserialize `reasoning_content`, so that field
5
- * never reaches Moonshot. Replay chain-of-thought as `tensorzero_extra_content` entries with
6
- * `type: "thought"` (see TensorZero `openai_messages_to_input` / `ExtraContentBlock::Thought`).
7
- *
8
- * Shared Strands → wire helpers: `openai/kimi-reasoning-wire.ts`.
9
- */
10
- export { collectReasoningTextPerWireAssistant, stripAssistantReasoningBlocks, } from "../openai/kimi-reasoning-wire.js";
11
- /**
12
- * Replay session reasoning through TensorZero so Moonshot receives `Thought` content, not
13
- * dropped `reasoning_content`. Skips rows that already set `tensorzero_extra_content`.
14
- */
15
- export function applyKimiReasoningReplayToChatRequest(request, reasoningPerWireAssistant) {
16
- let assistantOrdinal = 0;
17
- for (const msg of request.messages) {
18
- if (msg.role !== "assistant") {
19
- continue;
20
- }
21
- const extended = msg;
22
- if (extended.tensorzero_extra_content &&
23
- extended.tensorzero_extra_content.length > 0) {
24
- assistantOrdinal += 1;
25
- continue;
26
- }
27
- const raw = reasoningPerWireAssistant[assistantOrdinal] ?? "";
28
- assistantOrdinal += 1;
29
- const hasReplay = raw.trim().length > 0;
30
- const hasTools = !!extended.tool_calls && extended.tool_calls.length > 0;
31
- let thoughtText = null;
32
- if (hasReplay) {
33
- thoughtText = raw;
34
- }
35
- else if (hasTools) {
36
- thoughtText = MOONSHOT_REASONING_PLACEHOLDER;
37
- }
38
- if (thoughtText !== null) {
39
- extended.tensorzero_extra_content = [
40
- { type: "thought", insert_index: 0, text: thoughtText },
41
- ];
42
- }
43
- }
44
- }
45
- //# sourceMappingURL=openai-chat-request-shims.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-chat-request-shims.js","sourceRoot":"","sources":["../../../../src/core/models/tensorzero/openai-chat-request-shims.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAElF;;;;;;;GAOG;AAEH,OAAO,EACL,oCAAoC,EACpC,6BAA6B,GAC9B,MAAM,kCAAkC,CAAC;AAiB1C;;;GAGG;AACH,MAAM,UAAU,qCAAqC,CACnD,OAAwD,EACxD,yBAA4C;IAE5C,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,GAAoB,CAAC;QACtC,IACE,QAAQ,CAAC,wBAAwB;YACjC,QAAQ,CAAC,wBAAwB,CAAC,MAAM,GAAG,CAAC,EAC5C,CAAC;YACD,gBAAgB,IAAI,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,yBAAyB,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAC9D,gBAAgB,IAAI,CAAC,CAAC;QAEtB,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAEzE,IAAI,WAAW,GAAkB,IAAI,CAAC;QACtC,IAAI,SAAS,EAAE,CAAC;YACd,WAAW,GAAG,GAAG,CAAC;QACpB,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACpB,WAAW,GAAG,8BAA8B,CAAC;QAC/C,CAAC;QAED,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,QAAQ,CAAC,wBAAwB,GAAG;gBAClC,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE;aACxD,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,14 +0,0 @@
1
- import type { Message } from "@strands-agents/sdk";
2
- import type { StreamOptions } from "@strands-agents/sdk";
3
- import type { ModelStreamEvent } from "@strands-agents/sdk";
4
- import { OpenAIModel } from "@strands-agents/sdk/models/openai";
5
- import type { OpenAIModelOptions } from "@strands-agents/sdk/models/openai";
6
- /**
7
- * {@link OpenAIModel} with TensorZero OpenAI-gateway streaming fixes:
8
- * - usage on the final chunk with `choices` (see {@link splitUsageOntoEmptyChoicesChunk})
9
- * - `delta.tensorzero_extra_content` thoughts → Strands `reasoningContentDelta` (Hooman “thinking” UI)
10
- */
11
- export declare class StrandsTensorZeroModel extends OpenAIModel {
12
- constructor(options: OpenAIModelOptions);
13
- stream(messages: Message[], options?: StreamOptions): AsyncIterable<ModelStreamEvent>;
14
- }