@use-lattice/litmus 0.121.3

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 (199) hide show
  1. package/LICENSE +19 -0
  2. package/dist/src/accounts-Bt1oJb1Z.cjs +219 -0
  3. package/dist/src/accounts-DjOU8Rm3.js +178 -0
  4. package/dist/src/agentic-utils-D03IiXQc.js +153 -0
  5. package/dist/src/agentic-utils-Dh7xaMQM.cjs +180 -0
  6. package/dist/src/agents-C6BIMlZa.js +231 -0
  7. package/dist/src/agents-DvIpNX1L.cjs +666 -0
  8. package/dist/src/agents-ZP0RP9vV.cjs +231 -0
  9. package/dist/src/agents-maJXdjbR.js +665 -0
  10. package/dist/src/aimlapi-BTbQjG2E.cjs +30 -0
  11. package/dist/src/aimlapi-CwMxqfXP.js +30 -0
  12. package/dist/src/audio-BBUdvsde.cjs +97 -0
  13. package/dist/src/audio-D5DPZ7I-.js +97 -0
  14. package/dist/src/base-BEysXrkq.cjs +222 -0
  15. package/dist/src/base-C451JQfq.js +193 -0
  16. package/dist/src/blobs-BY8MDmpo.js +230 -0
  17. package/dist/src/blobs-BgcNn97m.cjs +256 -0
  18. package/dist/src/cache-BBE_lsTA.cjs +4 -0
  19. package/dist/src/cache-BkrqU5Ba.js +237 -0
  20. package/dist/src/cache-DsCxFlsZ.cjs +297 -0
  21. package/dist/src/chat-CPJWDP6a.cjs +289 -0
  22. package/dist/src/chat-CXX3xzkk.cjs +811 -0
  23. package/dist/src/chat-CcDgZFJ4.js +787 -0
  24. package/dist/src/chat-Dz5ZeGO2.js +289 -0
  25. package/dist/src/chatkit-Dw0mKkML.cjs +1158 -0
  26. package/dist/src/chatkit-swAIVuea.js +1157 -0
  27. package/dist/src/chunk-DEq-mXcV.js +15 -0
  28. package/dist/src/claude-agent-sdk-BXZJtOg6.js +379 -0
  29. package/dist/src/claude-agent-sdk-CkfyjDoG.cjs +383 -0
  30. package/dist/src/cloudflare-ai-BzpJcqUH.js +161 -0
  31. package/dist/src/cloudflare-ai-Cmy_R1y2.cjs +161 -0
  32. package/dist/src/cloudflare-gateway-B9tVQKok.cjs +272 -0
  33. package/dist/src/cloudflare-gateway-DrD3ew3H.js +272 -0
  34. package/dist/src/codex-sdk-Dezj9Nwm.js +1056 -0
  35. package/dist/src/codex-sdk-Dl9D4k5B.cjs +1060 -0
  36. package/dist/src/cometapi-C-9YvCHC.js +54 -0
  37. package/dist/src/cometapi-DHgDKoO2.cjs +54 -0
  38. package/dist/src/completion-B8Ctyxpr.js +120 -0
  39. package/dist/src/completion-Cxrt08sj.cjs +131 -0
  40. package/dist/src/createHash-BwgE13yv.cjs +27 -0
  41. package/dist/src/createHash-DmPQkvBh.js +15 -0
  42. package/dist/src/docker-BiqcTwLv.js +80 -0
  43. package/dist/src/docker-C7tEJnP-.cjs +80 -0
  44. package/dist/src/esm-C62Zofr1.cjs +409 -0
  45. package/dist/src/esm-DMVc93eh.js +379 -0
  46. package/dist/src/evalResult-C3NJPQOo.cjs +301 -0
  47. package/dist/src/evalResult-C7JJAPBb.js +295 -0
  48. package/dist/src/evalResult-DoVTZZWI.cjs +2 -0
  49. package/dist/src/extractor-DnMD3fwt.cjs +391 -0
  50. package/dist/src/extractor-DtlL28vL.js +374 -0
  51. package/dist/src/fetch-BTxakTSg.cjs +1133 -0
  52. package/dist/src/fetch-DQckpUFz.js +928 -0
  53. package/dist/src/fileExtensions-DnqA1y9x.js +85 -0
  54. package/dist/src/fileExtensions-bYh77CN8.cjs +114 -0
  55. package/dist/src/genaiTracer-CyZrmaK0.cjs +268 -0
  56. package/dist/src/genaiTracer-D3fD9dNV.js +256 -0
  57. package/dist/src/graders-BNscxFrU.js +13644 -0
  58. package/dist/src/graders-D2oE9Msq.js +2 -0
  59. package/dist/src/graders-c0Ez_w-9.cjs +2 -0
  60. package/dist/src/graders-d0F2M3e9.cjs +14056 -0
  61. package/dist/src/image-0ZhE0VlR.cjs +280 -0
  62. package/dist/src/image-CWE1pdNv.js +257 -0
  63. package/dist/src/image-D9ZK6hwL.js +163 -0
  64. package/dist/src/image-DKZgZITg.cjs +163 -0
  65. package/dist/src/index.cjs +11366 -0
  66. package/dist/src/index.d.cts +19640 -0
  67. package/dist/src/index.d.ts +19641 -0
  68. package/dist/src/index.js +11306 -0
  69. package/dist/src/invariant-Ddh24eXh.js +25 -0
  70. package/dist/src/invariant-kfQ8Bu82.cjs +30 -0
  71. package/dist/src/knowledgeBase-BgPyGFUd.cjs +122 -0
  72. package/dist/src/knowledgeBase-DyHilYaP.js +122 -0
  73. package/dist/src/litellm-CyMeneHS.js +135 -0
  74. package/dist/src/litellm-DWDF73yF.cjs +135 -0
  75. package/dist/src/logger-C40ZGil9.js +717 -0
  76. package/dist/src/logger-DyfK9PBt.cjs +917 -0
  77. package/dist/src/luma-ray-BAU9X_ep.cjs +315 -0
  78. package/dist/src/luma-ray-nwVseBbv.js +313 -0
  79. package/dist/src/messages-B5ADWTTv.js +245 -0
  80. package/dist/src/messages-BCnZfqrS.cjs +257 -0
  81. package/dist/src/meteor-DLZZ3osF.cjs +134 -0
  82. package/dist/src/meteor-DUiCJRC-.js +134 -0
  83. package/dist/src/modelslab-00cveB8L.cjs +163 -0
  84. package/dist/src/modelslab-D9sCU_L7.js +163 -0
  85. package/dist/src/nova-reel-CTapvqYH.js +276 -0
  86. package/dist/src/nova-reel-DlWuuroF.cjs +278 -0
  87. package/dist/src/nova-sonic-5UPWfeMv.cjs +363 -0
  88. package/dist/src/nova-sonic-BhSwQNym.js +363 -0
  89. package/dist/src/openai-BWrJK9d8.cjs +52 -0
  90. package/dist/src/openai-DumO8WQn.js +47 -0
  91. package/dist/src/openclaw-B8brrjC_.cjs +577 -0
  92. package/dist/src/openclaw-Bkayww9q.js +571 -0
  93. package/dist/src/opencode-sdk-7xjoDNiM.cjs +562 -0
  94. package/dist/src/opencode-sdk-SGwAPxht.js +558 -0
  95. package/dist/src/otlpReceiver-CoAHfAN9.cjs +15 -0
  96. package/dist/src/otlpReceiver-oO3EQwI9.js +14 -0
  97. package/dist/src/providerRegistry-4yjhaEM8.js +45 -0
  98. package/dist/src/providerRegistry-DhV4rJIc.cjs +50 -0
  99. package/dist/src/providers-B5RJVG-7.cjs +33609 -0
  100. package/dist/src/providers-BdmZCLzV.js +33262 -0
  101. package/dist/src/providers-CxtRxn8e.js +2 -0
  102. package/dist/src/providers-DnQLNbx1.cjs +3 -0
  103. package/dist/src/pythonUtils-BD0druiM.cjs +275 -0
  104. package/dist/src/pythonUtils-IBhn5YGR.js +249 -0
  105. package/dist/src/quiverai-BDOwZBsM.cjs +213 -0
  106. package/dist/src/quiverai-D3JTF5lD.js +213 -0
  107. package/dist/src/responses-B2LCDCXZ.js +667 -0
  108. package/dist/src/responses-BvNm4Xv9.cjs +685 -0
  109. package/dist/src/rubyUtils-B0NwnfpY.cjs +245 -0
  110. package/dist/src/rubyUtils-BroxzZ7c.cjs +2 -0
  111. package/dist/src/rubyUtils-hqVw5UvJ.js +222 -0
  112. package/dist/src/sagemaker-Cno2V-Sx.js +689 -0
  113. package/dist/src/sagemaker-fV_KUgs5.cjs +691 -0
  114. package/dist/src/server-BOuAXb06.cjs +238 -0
  115. package/dist/src/server-CtI-EWzm.cjs +2 -0
  116. package/dist/src/server-Cy3DZymt.js +189 -0
  117. package/dist/src/slack-CP8xBePa.js +135 -0
  118. package/dist/src/slack-DSQ1yXVb.cjs +135 -0
  119. package/dist/src/store-BwDDaBjb.cjs +246 -0
  120. package/dist/src/store-DcbLC593.cjs +2 -0
  121. package/dist/src/store-IGpqMIkv.js +240 -0
  122. package/dist/src/tables-3Q2cL7So.cjs +373 -0
  123. package/dist/src/tables-Bi2fjr4W.js +288 -0
  124. package/dist/src/telemetry-Bg2WqF79.js +161 -0
  125. package/dist/src/telemetry-D0x6u5kX.cjs +166 -0
  126. package/dist/src/telemetry-DXNimrI0.cjs +2 -0
  127. package/dist/src/text-B_UCRPp2.js +22 -0
  128. package/dist/src/text-CW1cyrwj.cjs +33 -0
  129. package/dist/src/tokenUsageUtils-NYT-WKS6.js +138 -0
  130. package/dist/src/tokenUsageUtils-bVa1ga6f.cjs +173 -0
  131. package/dist/src/transcription-Cl_W16Pr.js +122 -0
  132. package/dist/src/transcription-yt1EecY8.cjs +124 -0
  133. package/dist/src/transform-BCtGrl_W.cjs +228 -0
  134. package/dist/src/transform-Bv6gG2MJ.cjs +1688 -0
  135. package/dist/src/transform-CY1wbpRy.js +1507 -0
  136. package/dist/src/transform-DU8rUL9P.cjs +2 -0
  137. package/dist/src/transform-yWaShiKr.js +216 -0
  138. package/dist/src/transformersAvailability-BGkzavwb.js +35 -0
  139. package/dist/src/transformersAvailability-DKoRtQLy.cjs +35 -0
  140. package/dist/src/types-5aqHpBwE.cjs +3769 -0
  141. package/dist/src/types-Bn6D9c4U.js +3300 -0
  142. package/dist/src/util-BkKlTkI2.js +293 -0
  143. package/dist/src/util-CTh0bfOm.cjs +1119 -0
  144. package/dist/src/util-D17oBwo7.cjs +328 -0
  145. package/dist/src/util-DsS_-v4p.js +613 -0
  146. package/dist/src/util-DuntT1Ga.js +951 -0
  147. package/dist/src/util-aWjdCYMI.cjs +667 -0
  148. package/dist/src/utils-CisQwpjA.js +94 -0
  149. package/dist/src/utils-yWamDvmz.cjs +123 -0
  150. package/dist/tsconfig.tsbuildinfo +1 -0
  151. package/drizzle/0000_lush_hellion.sql +36 -0
  152. package/drizzle/0001_wide_calypso.sql +3 -0
  153. package/drizzle/0002_tidy_juggernaut.sql +1 -0
  154. package/drizzle/0003_lively_naoko.sql +8 -0
  155. package/drizzle/0004_minor_peter_quill.sql +19 -0
  156. package/drizzle/0005_silky_millenium_guard.sql +2 -0
  157. package/drizzle/0006_harsh_caretaker.sql +42 -0
  158. package/drizzle/0007_cloudy_wong.sql +1 -0
  159. package/drizzle/0008_broad_boomer.sql +2 -0
  160. package/drizzle/0009_strong_marten_broadcloak.sql +19 -0
  161. package/drizzle/0010_needy_bishop.sql +11 -0
  162. package/drizzle/0011_moaning_millenium_guard.sql +1 -0
  163. package/drizzle/0012_late_marten_broadcloak.sql +2 -0
  164. package/drizzle/0013_previous_dormammu.sql +9 -0
  165. package/drizzle/0014_lazy_captain_universe.sql +2 -0
  166. package/drizzle/0015_zippy_wallop.sql +29 -0
  167. package/drizzle/0016_jazzy_zemo.sql +2 -0
  168. package/drizzle/0017_reflective_praxagora.sql +4 -0
  169. package/drizzle/0018_fat_vanisher.sql +22 -0
  170. package/drizzle/0019_new_clint_barton.sql +8 -0
  171. package/drizzle/0020_skinny_maverick.sql +1 -0
  172. package/drizzle/0021_mysterious_madelyne_pryor.sql +13 -0
  173. package/drizzle/0022_sleepy_ultimo.sql +25 -0
  174. package/drizzle/0023_wooden_mandrill.sql +2 -0
  175. package/drizzle/AGENTS.md +68 -0
  176. package/drizzle/CLAUDE.md +1 -0
  177. package/drizzle/meta/0000_snapshot.json +221 -0
  178. package/drizzle/meta/0001_snapshot.json +214 -0
  179. package/drizzle/meta/0002_snapshot.json +221 -0
  180. package/drizzle/meta/0005_snapshot.json +369 -0
  181. package/drizzle/meta/0006_snapshot.json +638 -0
  182. package/drizzle/meta/0007_snapshot.json +640 -0
  183. package/drizzle/meta/0008_snapshot.json +649 -0
  184. package/drizzle/meta/0009_snapshot.json +554 -0
  185. package/drizzle/meta/0010_snapshot.json +619 -0
  186. package/drizzle/meta/0011_snapshot.json +627 -0
  187. package/drizzle/meta/0012_snapshot.json +639 -0
  188. package/drizzle/meta/0013_snapshot.json +717 -0
  189. package/drizzle/meta/0014_snapshot.json +717 -0
  190. package/drizzle/meta/0015_snapshot.json +897 -0
  191. package/drizzle/meta/0016_snapshot.json +1031 -0
  192. package/drizzle/meta/0018_snapshot.json +1210 -0
  193. package/drizzle/meta/0019_snapshot.json +1165 -0
  194. package/drizzle/meta/0020_snapshot.json +1232 -0
  195. package/drizzle/meta/0021_snapshot.json +1311 -0
  196. package/drizzle/meta/0022_snapshot.json +1481 -0
  197. package/drizzle/meta/0023_snapshot.json +1496 -0
  198. package/drizzle/meta/_journal.json +174 -0
  199. package/package.json +240 -0
@@ -0,0 +1,665 @@
1
+ import { T as state, r as logger } from "./logger-C40ZGil9.js";
2
+ import { r as importModule } from "./esm-DMVc93eh.js";
3
+ import { t as fetchWithProxy } from "./fetch-DQckpUFz.js";
4
+ import { t as OpenAiGenericProvider } from "./openai-DumO8WQn.js";
5
+ import path from "path";
6
+ import { Agent, BatchTraceProcessor, addTraceProcessor, getOrCreateTrace, handoff, protocol, retryPolicies, run, startTraceExportLoop, tool } from "@openai/agents";
7
+ //#region src/providers/openai/agents-model-settings.ts
8
+ function resolveModelSettings(modelSettings) {
9
+ if (!modelSettings) return;
10
+ const retry = modelSettings.retry ? {
11
+ ...modelSettings.retry,
12
+ policy: resolveRetryPolicy(modelSettings.retry.policy)
13
+ } : void 0;
14
+ return {
15
+ ...modelSettings,
16
+ retry
17
+ };
18
+ }
19
+ function resolveRetryPolicy(policy) {
20
+ if (!policy) return;
21
+ if (typeof policy === "function") return policy;
22
+ if (typeof policy === "string") switch (policy) {
23
+ case "never": return retryPolicies.never();
24
+ case "providerSuggested": return retryPolicies.providerSuggested();
25
+ case "networkError": return retryPolicies.networkError();
26
+ case "retryAfter": return retryPolicies.retryAfter();
27
+ default: return;
28
+ }
29
+ if ("httpStatus" in policy) return retryPolicies.httpStatus(policy.httpStatus);
30
+ if ("any" in policy) {
31
+ const policies = policy.any.map((nestedPolicy) => resolveRetryPolicy(nestedPolicy)).filter((nestedPolicy) => !!nestedPolicy);
32
+ return policies.length ? retryPolicies.any(...policies) : void 0;
33
+ }
34
+ if ("all" in policy) {
35
+ const policies = policy.all.map((nestedPolicy) => resolveRetryPolicy(nestedPolicy)).filter((nestedPolicy) => !!nestedPolicy);
36
+ return policies.length ? retryPolicies.all(...policies) : void 0;
37
+ }
38
+ }
39
+ //#endregion
40
+ //#region src/providers/openai/agents-loader.ts
41
+ /**
42
+ * Load agent definition from file path or return inline definition
43
+ */
44
+ async function loadAgentDefinition(agentConfig) {
45
+ if (isAgentInstance(agentConfig)) {
46
+ logger.debug("[AgentsLoader] Using provided Agent instance");
47
+ return agentConfig;
48
+ }
49
+ if (typeof agentConfig === "string" && agentConfig.startsWith("file://")) {
50
+ logger.debug("[AgentsLoader] Loading agent from file", { path: agentConfig });
51
+ return await loadAgentFromFile(agentConfig);
52
+ }
53
+ if (agentConfig !== null && typeof agentConfig === "object" && !Array.isArray(agentConfig)) {
54
+ logger.debug("[AgentsLoader] Creating agent from inline definition");
55
+ return await createAgentFromDefinition(agentConfig);
56
+ }
57
+ logger.debug("[AgentsLoader] Invalid agent configuration", {
58
+ type: typeof agentConfig,
59
+ keys: typeof agentConfig === "object" && agentConfig !== null ? Object.keys(agentConfig).slice(0, 5) : void 0
60
+ });
61
+ throw new Error("Invalid agent configuration: expected Agent instance, file:// URL, or inline definition");
62
+ }
63
+ /**
64
+ * Load tools from file path or return inline definitions
65
+ */
66
+ async function loadTools(toolsConfig) {
67
+ if (!toolsConfig) return;
68
+ if (typeof toolsConfig === "string" && toolsConfig.startsWith("file://")) {
69
+ logger.debug("[AgentsLoader] Loading tools from file", { path: toolsConfig });
70
+ return await loadToolsFromFile(toolsConfig);
71
+ }
72
+ if (Array.isArray(toolsConfig)) {
73
+ logger.debug("[AgentsLoader] Using inline tool definitions");
74
+ return normalizeTools(toolsConfig);
75
+ }
76
+ logger.debug("[AgentsLoader] Invalid tools configuration", {
77
+ type: typeof toolsConfig,
78
+ isArray: Array.isArray(toolsConfig)
79
+ });
80
+ throw new Error("Invalid tools configuration: expected file:// URL or array");
81
+ }
82
+ /**
83
+ * Load handoffs from file path or return inline definitions
84
+ */
85
+ async function loadHandoffs(handoffsConfig) {
86
+ if (!handoffsConfig) return;
87
+ if (typeof handoffsConfig === "string" && handoffsConfig.startsWith("file://")) {
88
+ logger.debug("[AgentsLoader] Loading handoffs from file", { path: handoffsConfig });
89
+ return await loadHandoffsFromFile(handoffsConfig);
90
+ }
91
+ if (Array.isArray(handoffsConfig)) {
92
+ logger.debug("[AgentsLoader] Using inline handoff definitions");
93
+ return normalizeHandoffs(handoffsConfig);
94
+ }
95
+ logger.debug("[AgentsLoader] Invalid handoffs configuration", {
96
+ type: typeof handoffsConfig,
97
+ isArray: Array.isArray(handoffsConfig)
98
+ });
99
+ throw new Error("Invalid handoffs configuration: expected file:// URL or array");
100
+ }
101
+ /**
102
+ * Load input guardrails from file path or return inline definitions
103
+ */
104
+ async function loadInputGuardrails(guardrailsConfig) {
105
+ if (!guardrailsConfig) return;
106
+ if (typeof guardrailsConfig === "string" && guardrailsConfig.startsWith("file://")) {
107
+ logger.debug("[AgentsLoader] Loading input guardrails from file", { path: guardrailsConfig });
108
+ return await loadArrayFromFile(guardrailsConfig, "input guardrails");
109
+ }
110
+ if (Array.isArray(guardrailsConfig)) {
111
+ logger.debug("[AgentsLoader] Using inline input guardrails");
112
+ return guardrailsConfig;
113
+ }
114
+ logger.debug("[AgentsLoader] Invalid input guardrails configuration", {
115
+ type: typeof guardrailsConfig,
116
+ isArray: Array.isArray(guardrailsConfig)
117
+ });
118
+ throw new Error("Invalid input guardrails configuration: expected file:// URL or array");
119
+ }
120
+ /**
121
+ * Load output guardrails from file path or return inline definitions
122
+ */
123
+ async function loadOutputGuardrails(guardrailsConfig) {
124
+ if (!guardrailsConfig) return;
125
+ if (typeof guardrailsConfig === "string" && guardrailsConfig.startsWith("file://")) {
126
+ logger.debug("[AgentsLoader] Loading output guardrails from file", { path: guardrailsConfig });
127
+ return await loadArrayFromFile(guardrailsConfig, "output guardrails");
128
+ }
129
+ if (Array.isArray(guardrailsConfig)) {
130
+ logger.debug("[AgentsLoader] Using inline output guardrails");
131
+ return guardrailsConfig;
132
+ }
133
+ logger.debug("[AgentsLoader] Invalid output guardrails configuration", {
134
+ type: typeof guardrailsConfig,
135
+ isArray: Array.isArray(guardrailsConfig)
136
+ });
137
+ throw new Error("Invalid output guardrails configuration: expected file:// URL or array");
138
+ }
139
+ /**
140
+ * Load agent from file
141
+ */
142
+ async function loadAgentFromFile(filePath) {
143
+ const resolvedPath = resolveFilePath(filePath);
144
+ logger.debug("[AgentsLoader] Loading agent from resolved path", { path: resolvedPath });
145
+ try {
146
+ const module = await importModule(resolvedPath);
147
+ const agent = module.default || module;
148
+ if (!isAgentInstance(agent)) throw new Error(`File ${resolvedPath} does not export an Agent instance`);
149
+ return agent;
150
+ } catch (error) {
151
+ logger.error("[AgentsLoader] Failed to load agent from file", {
152
+ path: resolvedPath,
153
+ error
154
+ });
155
+ throw new Error(`Failed to load agent from ${resolvedPath}: ${error}`);
156
+ }
157
+ }
158
+ /**
159
+ * Load tools from file
160
+ */
161
+ async function loadToolsFromFile(filePath) {
162
+ return await normalizeTools(await loadArrayFromFile(filePath, "tools")) ?? [];
163
+ }
164
+ /**
165
+ * Load handoffs from file
166
+ */
167
+ async function loadHandoffsFromFile(filePath) {
168
+ return await normalizeHandoffs(await loadArrayFromFile(filePath, "handoffs")) ?? [];
169
+ }
170
+ /**
171
+ * Create an Agent instance from an inline definition
172
+ */
173
+ async function createAgentFromDefinition(definition) {
174
+ try {
175
+ const tools = await normalizeTools(definition.tools);
176
+ const handoffs = await normalizeHandoffs(definition.handoffs);
177
+ return new Agent({
178
+ name: definition.name,
179
+ instructions: definition.instructions,
180
+ prompt: definition.prompt,
181
+ model: definition.model,
182
+ modelSettings: resolveModelSettings(definition.modelSettings),
183
+ handoffDescription: definition.handoffDescription,
184
+ outputType: definition.outputType,
185
+ tools,
186
+ handoffs,
187
+ inputGuardrails: definition.inputGuardrails,
188
+ outputGuardrails: definition.outputGuardrails,
189
+ mcpServers: definition.mcpServers,
190
+ toolUseBehavior: definition.toolUseBehavior,
191
+ resetToolChoice: definition.resetToolChoice
192
+ });
193
+ } catch (error) {
194
+ logger.error("[AgentsLoader] Failed to create agent from definition", {
195
+ name: definition?.name,
196
+ model: definition?.model,
197
+ toolCount: definition?.tools?.length,
198
+ handoffCount: definition?.handoffs?.length,
199
+ error
200
+ });
201
+ throw new Error(`Failed to create agent from definition: ${error}`);
202
+ }
203
+ }
204
+ /**
205
+ * Check if a value is an Agent instance
206
+ */
207
+ function isAgentInstance(value) {
208
+ return value instanceof Agent;
209
+ }
210
+ function isToolInstance(value) {
211
+ return !!value && typeof value === "object" && "type" in value && typeof value.type === "string";
212
+ }
213
+ function isHandoffInstance(value) {
214
+ return !!value && typeof value === "object" && "agent" in value && "getHandoffAsFunctionTool" in value && typeof value.getHandoffAsFunctionTool === "function";
215
+ }
216
+ async function normalizeTools(definitions) {
217
+ if (!definitions?.length) return;
218
+ return definitions.map((definition) => {
219
+ if (isToolInstance(definition)) return definition;
220
+ return tool({
221
+ name: definition.name,
222
+ description: definition.description,
223
+ parameters: definition.parameters,
224
+ strict: definition.strict ?? true,
225
+ deferLoading: definition.deferLoading,
226
+ execute: typeof definition.execute === "function" ? definition.execute : async () => definition.execute
227
+ });
228
+ });
229
+ }
230
+ async function normalizeHandoffs(definitions) {
231
+ if (!definitions?.length) return;
232
+ return Promise.all(definitions.map(async (definition) => {
233
+ if (isAgentInstance(definition) || isHandoffInstance(definition)) return definition;
234
+ const agent = await loadAgentDefinition(definition.agent);
235
+ if (!definition.description) return agent;
236
+ return handoff(agent, { toolDescriptionOverride: definition.description });
237
+ }));
238
+ }
239
+ async function loadArrayFromFile(filePath, label) {
240
+ const resolvedPath = resolveFilePath(filePath);
241
+ logger.debug(`[AgentsLoader] Loading ${label} from resolved path`, { path: resolvedPath });
242
+ try {
243
+ const module = await importModule(resolvedPath);
244
+ const exported = module.default || module;
245
+ if (!Array.isArray(exported)) throw new Error(`File ${resolvedPath} does not export an array of ${label}`);
246
+ return exported;
247
+ } catch (error) {
248
+ logger.error(`[AgentsLoader] Failed to load ${label} from file`, {
249
+ path: resolvedPath,
250
+ error
251
+ });
252
+ throw new Error(`Failed to load ${label} from ${resolvedPath}: ${error}`);
253
+ }
254
+ }
255
+ /**
256
+ * Resolve file:// path to absolute file system path
257
+ */
258
+ function resolveFilePath(filePath) {
259
+ const cleanPath = filePath.replace(/^file:\/\//, "");
260
+ if (path.isAbsolute(cleanPath)) return cleanPath;
261
+ const basePath = state.basePath || process.cwd();
262
+ const resolvedPath = path.resolve(basePath, cleanPath);
263
+ logger.debug("[AgentsLoader] Resolved file path", {
264
+ original: filePath,
265
+ basePath,
266
+ resolved: resolvedPath
267
+ });
268
+ return resolvedPath;
269
+ }
270
+ //#endregion
271
+ //#region src/providers/openai/agents-tracing.ts
272
+ /**
273
+ * OTLP Tracing Exporter for OpenAI Agents
274
+ *
275
+ * Exports traces and spans from openai-agents-js to promptfoo's OTLP receiver
276
+ * in OTLP JSON format over HTTP.
277
+ */
278
+ var OTLPTracingExporter = class {
279
+ otlpEndpoint;
280
+ evaluationId;
281
+ testCaseId;
282
+ constructor(options = {}) {
283
+ this.otlpEndpoint = options.otlpEndpoint || "http://localhost:4318";
284
+ this.evaluationId = options.evaluationId;
285
+ this.testCaseId = options.testCaseId;
286
+ }
287
+ /**
288
+ * Export traces and spans to OTLP endpoint
289
+ */
290
+ async export(items, signal) {
291
+ if (items.length === 0) {
292
+ logger.debug("[AgentsTracing] No items to export");
293
+ return;
294
+ }
295
+ logger.debug(`[AgentsTracing] Exporting ${items.length} items to OTLP`);
296
+ try {
297
+ const otlpPayload = this.transformToOTLP(items);
298
+ const url = `${this.otlpEndpoint}/v1/traces`;
299
+ logger.debug("[AgentsTracing] Sending OTLP payload", {
300
+ url,
301
+ spanCount: otlpPayload.resourceSpans[0]?.scopeSpans[0]?.spans?.length || 0
302
+ });
303
+ const response = await fetchWithProxy(url, {
304
+ method: "POST",
305
+ headers: { "Content-Type": "application/json" },
306
+ body: JSON.stringify(otlpPayload),
307
+ signal
308
+ });
309
+ if (response.ok) logger.debug("[AgentsTracing] Successfully exported traces to OTLP");
310
+ else logger.error(`[AgentsTracing] OTLP export failed: ${response.status} ${response.statusText}`);
311
+ } catch (error) {
312
+ logger.error("[AgentsTracing] Failed to export traces to OTLP", { error });
313
+ }
314
+ }
315
+ /**
316
+ * Transform openai-agents-js traces/spans to OTLP JSON format
317
+ */
318
+ transformToOTLP(items) {
319
+ const spans = items.filter((item) => item.type === "trace.span").map((item) => this.spanToOTLP(item));
320
+ return { resourceSpans: [{
321
+ resource: { attributes: [
322
+ {
323
+ key: "service.name",
324
+ value: { stringValue: "promptfoo-agents" }
325
+ },
326
+ ...this.evaluationId ? [{
327
+ key: "evaluation.id",
328
+ value: { stringValue: this.evaluationId }
329
+ }] : [],
330
+ ...this.testCaseId ? [{
331
+ key: "test.case.id",
332
+ value: { stringValue: this.testCaseId }
333
+ }] : []
334
+ ] },
335
+ scopeSpans: [{
336
+ scope: {
337
+ name: "openai-agents-js",
338
+ version: "0.1.0"
339
+ },
340
+ spans
341
+ }]
342
+ }] };
343
+ }
344
+ /**
345
+ * Convert a single span to OTLP format
346
+ */
347
+ spanToOTLP(span) {
348
+ const startTime = span.startedAt ? new Date(span.startedAt).getTime() : Date.now();
349
+ const endTime = span.endedAt ? new Date(span.endedAt).getTime() : void 0;
350
+ const traceId = span.traceId || this.generateTraceId();
351
+ const spanId = span.spanId || this.generateSpanId();
352
+ return {
353
+ traceId: this.hexToBase64(traceId, "trace"),
354
+ spanId: this.hexToBase64(spanId, "span"),
355
+ parentSpanId: span.parentId ? this.hexToBase64(span.parentId, "span") : void 0,
356
+ name: this.getSpanName(span),
357
+ kind: 1,
358
+ startTimeUnixNano: String(startTime * 1e6),
359
+ endTimeUnixNano: endTime ? String(endTime * 1e6) : void 0,
360
+ attributes: this.attributesToOTLP(span.spanData),
361
+ status: this.getSpanStatus(span)
362
+ };
363
+ }
364
+ /**
365
+ * Get span name from span data
366
+ */
367
+ getSpanName(span) {
368
+ const data = span.spanData;
369
+ if ("name" in data && data.name) return data.name;
370
+ if (data.type) return `agent.${data.type}`;
371
+ return "agent.span";
372
+ }
373
+ /**
374
+ * Get span status from span data
375
+ */
376
+ getSpanStatus(span) {
377
+ const error = span.error;
378
+ if (error) return {
379
+ code: 2,
380
+ message: error.message || String(error)
381
+ };
382
+ return { code: 0 };
383
+ }
384
+ /**
385
+ * Convert span data to OTLP attributes
386
+ */
387
+ attributesToOTLP(data) {
388
+ const attributes = [];
389
+ if (!data) return attributes;
390
+ for (const [key, value] of Object.entries(data)) {
391
+ if (key === "name" || key === "type") continue;
392
+ attributes.push({
393
+ key: `agent.${key}`,
394
+ value: this.valueToOTLP(value)
395
+ });
396
+ }
397
+ return attributes;
398
+ }
399
+ /**
400
+ * Convert a value to OTLP attribute value format
401
+ */
402
+ valueToOTLP(value) {
403
+ if (value === null || value === void 0) return { stringValue: "" };
404
+ if (typeof value === "string") return { stringValue: value };
405
+ if (typeof value === "number") return Number.isInteger(value) ? { intValue: String(value) } : { doubleValue: value };
406
+ if (typeof value === "boolean") return { boolValue: value };
407
+ if (Array.isArray(value)) return { arrayValue: { values: value.map((v) => this.valueToOTLP(v)) } };
408
+ if (typeof value === "object") return { stringValue: JSON.stringify(value) };
409
+ return { stringValue: String(value) };
410
+ }
411
+ /**
412
+ * Convert hex string to base64 for OTLP format
413
+ * Handles openai-agents-js ID format (trace_XXX, span_XXX)
414
+ * @param hex - The hex string to convert
415
+ * @param kind - Whether this is a 'trace' (16 bytes) or 'span' (8 bytes) ID
416
+ */
417
+ hexToBase64(hex, kind) {
418
+ if (!hex) return "";
419
+ try {
420
+ let cleanHex = hex.replace(/^(trace_|span_|group_)/, "");
421
+ const targetLength = kind === "span" ? 16 : 32;
422
+ if (cleanHex.length > targetLength) cleanHex = cleanHex.substring(0, targetLength);
423
+ else if (cleanHex.length < targetLength) cleanHex = cleanHex.padEnd(targetLength, "0");
424
+ return Buffer.from(cleanHex, "hex").toString("base64");
425
+ } catch (error) {
426
+ logger.error(`[AgentsTracing] Failed to convert hex to base64: ${hex}`, { error });
427
+ const fallbackLen = kind === "span" ? 16 : 32;
428
+ return Buffer.from(this.generateRandomHex(fallbackLen), "hex").toString("base64");
429
+ }
430
+ }
431
+ /**
432
+ * Generate a random trace ID (32 hex chars)
433
+ */
434
+ generateTraceId() {
435
+ return this.generateRandomHex(32);
436
+ }
437
+ /**
438
+ * Generate a random span ID (16 hex chars)
439
+ */
440
+ generateSpanId() {
441
+ return this.generateRandomHex(16);
442
+ }
443
+ /**
444
+ * Generate random hex string of specified length
445
+ */
446
+ generateRandomHex(length) {
447
+ const bytes = Math.ceil(length / 2);
448
+ const buffer = Buffer.alloc(bytes);
449
+ for (let i = 0; i < bytes; i++) buffer[i] = Math.floor(Math.random() * 256);
450
+ return buffer.toString("hex").substring(0, length);
451
+ }
452
+ };
453
+ //#endregion
454
+ //#region src/providers/openai/agents.ts
455
+ /**
456
+ * OpenAI Agents Provider
457
+ *
458
+ * Integrates openai-agents-js SDK as a promptfoo provider.
459
+ * Supports multi-turn agent workflows with tools, handoffs, and tracing.
460
+ */
461
+ var OpenAiAgentsProvider = class extends OpenAiGenericProvider {
462
+ agentConfig;
463
+ agent;
464
+ tracingExporter;
465
+ constructor(modelName, options = {}) {
466
+ super(modelName, options);
467
+ this.agentConfig = options.config || {};
468
+ }
469
+ id() {
470
+ return `openai:agents:${this.modelName}`;
471
+ }
472
+ toString() {
473
+ return `[OpenAI Agents Provider ${this.modelName}]`;
474
+ }
475
+ /**
476
+ * Call the agent with the given prompt
477
+ */
478
+ async callApi(prompt, context, callApiOptions) {
479
+ logger.debug("[AgentsProvider] Starting agent call", {
480
+ prompt: prompt.substring(0, 100),
481
+ hasContext: !!context
482
+ });
483
+ try {
484
+ if (!this.agent) this.agent = await this.initializeAgent();
485
+ await this.setupTracingIfNeeded(context);
486
+ const result = await this.runAgent(prompt, context, callApiOptions);
487
+ logger.debug("[AgentsProvider] Agent run completed", {
488
+ outputLength: result.output?.length || 0,
489
+ tokenUsage: result.tokenUsage
490
+ });
491
+ return result;
492
+ } catch (error) {
493
+ logger.error("[AgentsProvider] Agent call failed", { error });
494
+ throw error;
495
+ }
496
+ }
497
+ /**
498
+ * Initialize the agent from configuration
499
+ */
500
+ async initializeAgent() {
501
+ logger.debug("[AgentsProvider] Initializing agent");
502
+ if (!this.agentConfig.agent) throw new Error("No agent configuration provided");
503
+ try {
504
+ const agent = await loadAgentDefinition(this.agentConfig.agent);
505
+ const [tools, handoffs, inputGuardrails, outputGuardrails] = await Promise.all([
506
+ loadTools(this.agentConfig.tools),
507
+ loadHandoffs(this.agentConfig.handoffs),
508
+ loadInputGuardrails(this.agentConfig.inputGuardrails),
509
+ loadOutputGuardrails(this.agentConfig.outputGuardrails)
510
+ ]);
511
+ const configuredAgent = agent.clone({
512
+ tools: mergeArrays(agent.tools, tools),
513
+ handoffs: mergeArrays(agent.handoffs, handoffs),
514
+ inputGuardrails: mergeArrays(agent.inputGuardrails, inputGuardrails),
515
+ outputGuardrails: mergeArrays(agent.outputGuardrails, outputGuardrails)
516
+ });
517
+ const mockAwareAgent = this.wrapToolsIfNeeded(configuredAgent);
518
+ logger.debug("[AgentsProvider] Agent initialized successfully", {
519
+ name: mockAwareAgent.name,
520
+ toolCount: mockAwareAgent.tools.length,
521
+ handoffCount: mockAwareAgent.handoffs.length,
522
+ inputGuardrailCount: mockAwareAgent.inputGuardrails.length,
523
+ outputGuardrailCount: mockAwareAgent.outputGuardrails.length
524
+ });
525
+ return mockAwareAgent;
526
+ } catch (error) {
527
+ logger.error("[AgentsProvider] Failed to initialize agent", { error });
528
+ throw new Error(`Failed to initialize agent: ${error}`);
529
+ }
530
+ }
531
+ /**
532
+ * Setup tracing if enabled
533
+ */
534
+ async setupTracingIfNeeded(context) {
535
+ if (!(this.agentConfig.tracing === true || context?.test?.metadata?.tracingEnabled === true || process.env.PROMPTFOO_TRACING_ENABLED === "true")) {
536
+ logger.debug("[AgentsProvider] Tracing not enabled");
537
+ return;
538
+ }
539
+ logger.debug("[AgentsProvider] Setting up tracing");
540
+ try {
541
+ this.tracingExporter = new OTLPTracingExporter({
542
+ otlpEndpoint: this.agentConfig.otlpEndpoint,
543
+ evaluationId: context?.evaluationId,
544
+ testCaseId: context?.testCaseId
545
+ });
546
+ await this.registerTracingExporter(this.tracingExporter);
547
+ startTraceExportLoop();
548
+ logger.debug("[AgentsProvider] Tracing setup complete");
549
+ } catch (error) {
550
+ logger.error("[AgentsProvider] Failed to setup tracing", { error });
551
+ }
552
+ }
553
+ /**
554
+ * Register tracing exporter with openai-agents-js tracing system
555
+ */
556
+ async registerTracingExporter(exporter) {
557
+ try {
558
+ addTraceProcessor(new BatchTraceProcessor(exporter, {
559
+ maxQueueSize: 100,
560
+ maxBatchSize: 10,
561
+ scheduleDelay: 1e3
562
+ }));
563
+ logger.debug("[AgentsProvider] Tracing processor registered");
564
+ } catch (error) {
565
+ logger.error("[AgentsProvider] Failed to register tracing processor", { error });
566
+ throw error;
567
+ }
568
+ }
569
+ /**
570
+ * Run the agent with the given prompt
571
+ */
572
+ async runAgent(prompt, context, callApiOptions) {
573
+ try {
574
+ logger.debug("[AgentsProvider] Running agent", {
575
+ agentName: this.agent?.name,
576
+ maxTurns: this.agentConfig.maxTurns ?? 10
577
+ });
578
+ const runOptions = {
579
+ context: context?.vars,
580
+ maxTurns: this.agentConfig.maxTurns ?? 10,
581
+ signal: callApiOptions?.abortSignal
582
+ };
583
+ if (this.agentConfig.model || this.modelName) runOptions.model = this.agentConfig.model || this.modelName;
584
+ if (this.agentConfig.modelSettings) runOptions.modelSettings = resolveModelSettings(this.agentConfig.modelSettings);
585
+ const result = await getOrCreateTrace(async () => {
586
+ return await run(this.agent, this.parsePromptInput(prompt), runOptions);
587
+ });
588
+ logger.debug("[AgentsProvider] Agent run result", {
589
+ hasOutput: !!result.finalOutput,
590
+ turns: result.newItems?.length || 0
591
+ });
592
+ return {
593
+ output: result.finalOutput,
594
+ tokenUsage: this.extractTokenUsage(result),
595
+ cached: false,
596
+ cost: this.calculateCost(result)
597
+ };
598
+ } catch (error) {
599
+ logger.error("[AgentsProvider] Failed to run agent", { error });
600
+ throw error;
601
+ }
602
+ }
603
+ /**
604
+ * Extract token usage from agent result
605
+ */
606
+ extractTokenUsage(result) {
607
+ if (!result.usage) return {};
608
+ const usage = result.usage;
609
+ return {
610
+ total: usage.totalTokens ?? void 0,
611
+ prompt: usage.promptTokens ?? void 0,
612
+ completion: usage.completionTokens ?? void 0
613
+ };
614
+ }
615
+ /**
616
+ * Calculate cost from agent result
617
+ */
618
+ calculateCost(_result) {}
619
+ wrapToolsIfNeeded(agent) {
620
+ if (this.agentConfig.executeTools !== false && this.agentConfig.executeTools !== "mock") return agent;
621
+ const toolMocks = this.agentConfig.toolMocks ?? {};
622
+ const tools = agent.tools.map((tool) => {
623
+ if (tool.type !== "function") return tool;
624
+ const mockValue = toolMocks[tool.name];
625
+ return {
626
+ ...tool,
627
+ invoke: async () => mockValue ?? {
628
+ mocked: true,
629
+ tool: tool.name
630
+ }
631
+ };
632
+ });
633
+ return agent.clone({ tools });
634
+ }
635
+ parsePromptInput(prompt) {
636
+ try {
637
+ const parsedInput = parseAgentInputItems(JSON.parse(prompt));
638
+ if (parsedInput) return parsedInput;
639
+ } catch {}
640
+ return prompt;
641
+ }
642
+ };
643
+ function mergeArrays(existing, additions) {
644
+ if (!existing?.length && !additions?.length) return;
645
+ return [...existing ?? [], ...additions ?? []];
646
+ }
647
+ function parseAgentInputItems(value) {
648
+ if (Array.isArray(value)) {
649
+ if (value.length === 0) return;
650
+ const parsedItems = [];
651
+ for (const item of value) {
652
+ const parsedItem = protocol.ModelItem.safeParse(item);
653
+ if (!parsedItem.success) return;
654
+ parsedItems.push(parsedItem.data);
655
+ }
656
+ return parsedItems;
657
+ }
658
+ const parsedItem = protocol.ModelItem.safeParse(value);
659
+ if (!parsedItem.success) return;
660
+ return [parsedItem.data];
661
+ }
662
+ //#endregion
663
+ export { OpenAiAgentsProvider };
664
+
665
+ //# sourceMappingURL=agents-maJXdjbR.js.map
@@ -0,0 +1,30 @@
1
+ require("./logger-DyfK9PBt.cjs");
2
+ require("./fetch-BTxakTSg.cjs");
3
+ require("./cache-DsCxFlsZ.cjs");
4
+ const require_chat = require("./chat-CXX3xzkk.cjs");
5
+ const require_completion = require("./completion-Cxrt08sj.cjs");
6
+ //#region src/providers/aimlapi.ts
7
+ /**
8
+ * Factory for creating AI/ML API providers using OpenAI-compatible endpoints.
9
+ */
10
+ function createAimlApiProvider(providerPath, options = {}) {
11
+ const splits = providerPath.split(":");
12
+ const type = splits[1];
13
+ const modelName = splits.slice(2).join(":");
14
+ const openaiOptions = {
15
+ ...options,
16
+ config: {
17
+ ...options.config || {},
18
+ apiBaseUrl: "https://api.aimlapi.com/v1",
19
+ apiKeyEnvar: "AIML_API_KEY"
20
+ }
21
+ };
22
+ if (type === "chat") return new require_chat.OpenAiChatCompletionProvider(modelName, openaiOptions);
23
+ else if (type === "completion") return new require_completion.OpenAiCompletionProvider(modelName, openaiOptions);
24
+ else if (type === "embedding" || type === "embeddings") return new require_completion.OpenAiEmbeddingProvider(modelName, openaiOptions);
25
+ return new require_chat.OpenAiChatCompletionProvider(splits.slice(1).join(":"), openaiOptions);
26
+ }
27
+ //#endregion
28
+ exports.createAimlApiProvider = createAimlApiProvider;
29
+
30
+ //# sourceMappingURL=aimlapi-BTbQjG2E.cjs.map