@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,666 @@
1
+ const require_logger = require("./logger-DyfK9PBt.cjs");
2
+ const require_esm = require("./esm-C62Zofr1.cjs");
3
+ const require_fetch = require("./fetch-BTxakTSg.cjs");
4
+ const require_openai = require("./openai-BWrJK9d8.cjs");
5
+ let path = require("path");
6
+ path = require_logger.__toESM(path);
7
+ let _openai_agents = require("@openai/agents");
8
+ //#region src/providers/openai/agents-model-settings.ts
9
+ function resolveModelSettings(modelSettings) {
10
+ if (!modelSettings) return;
11
+ const retry = modelSettings.retry ? {
12
+ ...modelSettings.retry,
13
+ policy: resolveRetryPolicy(modelSettings.retry.policy)
14
+ } : void 0;
15
+ return {
16
+ ...modelSettings,
17
+ retry
18
+ };
19
+ }
20
+ function resolveRetryPolicy(policy) {
21
+ if (!policy) return;
22
+ if (typeof policy === "function") return policy;
23
+ if (typeof policy === "string") switch (policy) {
24
+ case "never": return _openai_agents.retryPolicies.never();
25
+ case "providerSuggested": return _openai_agents.retryPolicies.providerSuggested();
26
+ case "networkError": return _openai_agents.retryPolicies.networkError();
27
+ case "retryAfter": return _openai_agents.retryPolicies.retryAfter();
28
+ default: return;
29
+ }
30
+ if ("httpStatus" in policy) return _openai_agents.retryPolicies.httpStatus(policy.httpStatus);
31
+ if ("any" in policy) {
32
+ const policies = policy.any.map((nestedPolicy) => resolveRetryPolicy(nestedPolicy)).filter((nestedPolicy) => !!nestedPolicy);
33
+ return policies.length ? _openai_agents.retryPolicies.any(...policies) : void 0;
34
+ }
35
+ if ("all" in policy) {
36
+ const policies = policy.all.map((nestedPolicy) => resolveRetryPolicy(nestedPolicy)).filter((nestedPolicy) => !!nestedPolicy);
37
+ return policies.length ? _openai_agents.retryPolicies.all(...policies) : void 0;
38
+ }
39
+ }
40
+ //#endregion
41
+ //#region src/providers/openai/agents-loader.ts
42
+ /**
43
+ * Load agent definition from file path or return inline definition
44
+ */
45
+ async function loadAgentDefinition(agentConfig) {
46
+ if (isAgentInstance(agentConfig)) {
47
+ require_logger.logger.debug("[AgentsLoader] Using provided Agent instance");
48
+ return agentConfig;
49
+ }
50
+ if (typeof agentConfig === "string" && agentConfig.startsWith("file://")) {
51
+ require_logger.logger.debug("[AgentsLoader] Loading agent from file", { path: agentConfig });
52
+ return await loadAgentFromFile(agentConfig);
53
+ }
54
+ if (agentConfig !== null && typeof agentConfig === "object" && !Array.isArray(agentConfig)) {
55
+ require_logger.logger.debug("[AgentsLoader] Creating agent from inline definition");
56
+ return await createAgentFromDefinition(agentConfig);
57
+ }
58
+ require_logger.logger.debug("[AgentsLoader] Invalid agent configuration", {
59
+ type: typeof agentConfig,
60
+ keys: typeof agentConfig === "object" && agentConfig !== null ? Object.keys(agentConfig).slice(0, 5) : void 0
61
+ });
62
+ throw new Error("Invalid agent configuration: expected Agent instance, file:// URL, or inline definition");
63
+ }
64
+ /**
65
+ * Load tools from file path or return inline definitions
66
+ */
67
+ async function loadTools(toolsConfig) {
68
+ if (!toolsConfig) return;
69
+ if (typeof toolsConfig === "string" && toolsConfig.startsWith("file://")) {
70
+ require_logger.logger.debug("[AgentsLoader] Loading tools from file", { path: toolsConfig });
71
+ return await loadToolsFromFile(toolsConfig);
72
+ }
73
+ if (Array.isArray(toolsConfig)) {
74
+ require_logger.logger.debug("[AgentsLoader] Using inline tool definitions");
75
+ return normalizeTools(toolsConfig);
76
+ }
77
+ require_logger.logger.debug("[AgentsLoader] Invalid tools configuration", {
78
+ type: typeof toolsConfig,
79
+ isArray: Array.isArray(toolsConfig)
80
+ });
81
+ throw new Error("Invalid tools configuration: expected file:// URL or array");
82
+ }
83
+ /**
84
+ * Load handoffs from file path or return inline definitions
85
+ */
86
+ async function loadHandoffs(handoffsConfig) {
87
+ if (!handoffsConfig) return;
88
+ if (typeof handoffsConfig === "string" && handoffsConfig.startsWith("file://")) {
89
+ require_logger.logger.debug("[AgentsLoader] Loading handoffs from file", { path: handoffsConfig });
90
+ return await loadHandoffsFromFile(handoffsConfig);
91
+ }
92
+ if (Array.isArray(handoffsConfig)) {
93
+ require_logger.logger.debug("[AgentsLoader] Using inline handoff definitions");
94
+ return normalizeHandoffs(handoffsConfig);
95
+ }
96
+ require_logger.logger.debug("[AgentsLoader] Invalid handoffs configuration", {
97
+ type: typeof handoffsConfig,
98
+ isArray: Array.isArray(handoffsConfig)
99
+ });
100
+ throw new Error("Invalid handoffs configuration: expected file:// URL or array");
101
+ }
102
+ /**
103
+ * Load input guardrails from file path or return inline definitions
104
+ */
105
+ async function loadInputGuardrails(guardrailsConfig) {
106
+ if (!guardrailsConfig) return;
107
+ if (typeof guardrailsConfig === "string" && guardrailsConfig.startsWith("file://")) {
108
+ require_logger.logger.debug("[AgentsLoader] Loading input guardrails from file", { path: guardrailsConfig });
109
+ return await loadArrayFromFile(guardrailsConfig, "input guardrails");
110
+ }
111
+ if (Array.isArray(guardrailsConfig)) {
112
+ require_logger.logger.debug("[AgentsLoader] Using inline input guardrails");
113
+ return guardrailsConfig;
114
+ }
115
+ require_logger.logger.debug("[AgentsLoader] Invalid input guardrails configuration", {
116
+ type: typeof guardrailsConfig,
117
+ isArray: Array.isArray(guardrailsConfig)
118
+ });
119
+ throw new Error("Invalid input guardrails configuration: expected file:// URL or array");
120
+ }
121
+ /**
122
+ * Load output guardrails from file path or return inline definitions
123
+ */
124
+ async function loadOutputGuardrails(guardrailsConfig) {
125
+ if (!guardrailsConfig) return;
126
+ if (typeof guardrailsConfig === "string" && guardrailsConfig.startsWith("file://")) {
127
+ require_logger.logger.debug("[AgentsLoader] Loading output guardrails from file", { path: guardrailsConfig });
128
+ return await loadArrayFromFile(guardrailsConfig, "output guardrails");
129
+ }
130
+ if (Array.isArray(guardrailsConfig)) {
131
+ require_logger.logger.debug("[AgentsLoader] Using inline output guardrails");
132
+ return guardrailsConfig;
133
+ }
134
+ require_logger.logger.debug("[AgentsLoader] Invalid output guardrails configuration", {
135
+ type: typeof guardrailsConfig,
136
+ isArray: Array.isArray(guardrailsConfig)
137
+ });
138
+ throw new Error("Invalid output guardrails configuration: expected file:// URL or array");
139
+ }
140
+ /**
141
+ * Load agent from file
142
+ */
143
+ async function loadAgentFromFile(filePath) {
144
+ const resolvedPath = resolveFilePath(filePath);
145
+ require_logger.logger.debug("[AgentsLoader] Loading agent from resolved path", { path: resolvedPath });
146
+ try {
147
+ const module = await require_esm.importModule(resolvedPath);
148
+ const agent = module.default || module;
149
+ if (!isAgentInstance(agent)) throw new Error(`File ${resolvedPath} does not export an Agent instance`);
150
+ return agent;
151
+ } catch (error) {
152
+ require_logger.logger.error("[AgentsLoader] Failed to load agent from file", {
153
+ path: resolvedPath,
154
+ error
155
+ });
156
+ throw new Error(`Failed to load agent from ${resolvedPath}: ${error}`);
157
+ }
158
+ }
159
+ /**
160
+ * Load tools from file
161
+ */
162
+ async function loadToolsFromFile(filePath) {
163
+ return await normalizeTools(await loadArrayFromFile(filePath, "tools")) ?? [];
164
+ }
165
+ /**
166
+ * Load handoffs from file
167
+ */
168
+ async function loadHandoffsFromFile(filePath) {
169
+ return await normalizeHandoffs(await loadArrayFromFile(filePath, "handoffs")) ?? [];
170
+ }
171
+ /**
172
+ * Create an Agent instance from an inline definition
173
+ */
174
+ async function createAgentFromDefinition(definition) {
175
+ try {
176
+ const tools = await normalizeTools(definition.tools);
177
+ const handoffs = await normalizeHandoffs(definition.handoffs);
178
+ return new _openai_agents.Agent({
179
+ name: definition.name,
180
+ instructions: definition.instructions,
181
+ prompt: definition.prompt,
182
+ model: definition.model,
183
+ modelSettings: resolveModelSettings(definition.modelSettings),
184
+ handoffDescription: definition.handoffDescription,
185
+ outputType: definition.outputType,
186
+ tools,
187
+ handoffs,
188
+ inputGuardrails: definition.inputGuardrails,
189
+ outputGuardrails: definition.outputGuardrails,
190
+ mcpServers: definition.mcpServers,
191
+ toolUseBehavior: definition.toolUseBehavior,
192
+ resetToolChoice: definition.resetToolChoice
193
+ });
194
+ } catch (error) {
195
+ require_logger.logger.error("[AgentsLoader] Failed to create agent from definition", {
196
+ name: definition?.name,
197
+ model: definition?.model,
198
+ toolCount: definition?.tools?.length,
199
+ handoffCount: definition?.handoffs?.length,
200
+ error
201
+ });
202
+ throw new Error(`Failed to create agent from definition: ${error}`);
203
+ }
204
+ }
205
+ /**
206
+ * Check if a value is an Agent instance
207
+ */
208
+ function isAgentInstance(value) {
209
+ return value instanceof _openai_agents.Agent;
210
+ }
211
+ function isToolInstance(value) {
212
+ return !!value && typeof value === "object" && "type" in value && typeof value.type === "string";
213
+ }
214
+ function isHandoffInstance(value) {
215
+ return !!value && typeof value === "object" && "agent" in value && "getHandoffAsFunctionTool" in value && typeof value.getHandoffAsFunctionTool === "function";
216
+ }
217
+ async function normalizeTools(definitions) {
218
+ if (!definitions?.length) return;
219
+ return definitions.map((definition) => {
220
+ if (isToolInstance(definition)) return definition;
221
+ return (0, _openai_agents.tool)({
222
+ name: definition.name,
223
+ description: definition.description,
224
+ parameters: definition.parameters,
225
+ strict: definition.strict ?? true,
226
+ deferLoading: definition.deferLoading,
227
+ execute: typeof definition.execute === "function" ? definition.execute : async () => definition.execute
228
+ });
229
+ });
230
+ }
231
+ async function normalizeHandoffs(definitions) {
232
+ if (!definitions?.length) return;
233
+ return Promise.all(definitions.map(async (definition) => {
234
+ if (isAgentInstance(definition) || isHandoffInstance(definition)) return definition;
235
+ const agent = await loadAgentDefinition(definition.agent);
236
+ if (!definition.description) return agent;
237
+ return (0, _openai_agents.handoff)(agent, { toolDescriptionOverride: definition.description });
238
+ }));
239
+ }
240
+ async function loadArrayFromFile(filePath, label) {
241
+ const resolvedPath = resolveFilePath(filePath);
242
+ require_logger.logger.debug(`[AgentsLoader] Loading ${label} from resolved path`, { path: resolvedPath });
243
+ try {
244
+ const module = await require_esm.importModule(resolvedPath);
245
+ const exported = module.default || module;
246
+ if (!Array.isArray(exported)) throw new Error(`File ${resolvedPath} does not export an array of ${label}`);
247
+ return exported;
248
+ } catch (error) {
249
+ require_logger.logger.error(`[AgentsLoader] Failed to load ${label} from file`, {
250
+ path: resolvedPath,
251
+ error
252
+ });
253
+ throw new Error(`Failed to load ${label} from ${resolvedPath}: ${error}`);
254
+ }
255
+ }
256
+ /**
257
+ * Resolve file:// path to absolute file system path
258
+ */
259
+ function resolveFilePath(filePath) {
260
+ const cleanPath = filePath.replace(/^file:\/\//, "");
261
+ if (path.default.isAbsolute(cleanPath)) return cleanPath;
262
+ const basePath = require_logger.state.basePath || process.cwd();
263
+ const resolvedPath = path.default.resolve(basePath, cleanPath);
264
+ require_logger.logger.debug("[AgentsLoader] Resolved file path", {
265
+ original: filePath,
266
+ basePath,
267
+ resolved: resolvedPath
268
+ });
269
+ return resolvedPath;
270
+ }
271
+ //#endregion
272
+ //#region src/providers/openai/agents-tracing.ts
273
+ /**
274
+ * OTLP Tracing Exporter for OpenAI Agents
275
+ *
276
+ * Exports traces and spans from openai-agents-js to promptfoo's OTLP receiver
277
+ * in OTLP JSON format over HTTP.
278
+ */
279
+ var OTLPTracingExporter = class {
280
+ otlpEndpoint;
281
+ evaluationId;
282
+ testCaseId;
283
+ constructor(options = {}) {
284
+ this.otlpEndpoint = options.otlpEndpoint || "http://localhost:4318";
285
+ this.evaluationId = options.evaluationId;
286
+ this.testCaseId = options.testCaseId;
287
+ }
288
+ /**
289
+ * Export traces and spans to OTLP endpoint
290
+ */
291
+ async export(items, signal) {
292
+ if (items.length === 0) {
293
+ require_logger.logger.debug("[AgentsTracing] No items to export");
294
+ return;
295
+ }
296
+ require_logger.logger.debug(`[AgentsTracing] Exporting ${items.length} items to OTLP`);
297
+ try {
298
+ const otlpPayload = this.transformToOTLP(items);
299
+ const url = `${this.otlpEndpoint}/v1/traces`;
300
+ require_logger.logger.debug("[AgentsTracing] Sending OTLP payload", {
301
+ url,
302
+ spanCount: otlpPayload.resourceSpans[0]?.scopeSpans[0]?.spans?.length || 0
303
+ });
304
+ const response = await require_fetch.fetchWithProxy(url, {
305
+ method: "POST",
306
+ headers: { "Content-Type": "application/json" },
307
+ body: JSON.stringify(otlpPayload),
308
+ signal
309
+ });
310
+ if (response.ok) require_logger.logger.debug("[AgentsTracing] Successfully exported traces to OTLP");
311
+ else require_logger.logger.error(`[AgentsTracing] OTLP export failed: ${response.status} ${response.statusText}`);
312
+ } catch (error) {
313
+ require_logger.logger.error("[AgentsTracing] Failed to export traces to OTLP", { error });
314
+ }
315
+ }
316
+ /**
317
+ * Transform openai-agents-js traces/spans to OTLP JSON format
318
+ */
319
+ transformToOTLP(items) {
320
+ const spans = items.filter((item) => item.type === "trace.span").map((item) => this.spanToOTLP(item));
321
+ return { resourceSpans: [{
322
+ resource: { attributes: [
323
+ {
324
+ key: "service.name",
325
+ value: { stringValue: "promptfoo-agents" }
326
+ },
327
+ ...this.evaluationId ? [{
328
+ key: "evaluation.id",
329
+ value: { stringValue: this.evaluationId }
330
+ }] : [],
331
+ ...this.testCaseId ? [{
332
+ key: "test.case.id",
333
+ value: { stringValue: this.testCaseId }
334
+ }] : []
335
+ ] },
336
+ scopeSpans: [{
337
+ scope: {
338
+ name: "openai-agents-js",
339
+ version: "0.1.0"
340
+ },
341
+ spans
342
+ }]
343
+ }] };
344
+ }
345
+ /**
346
+ * Convert a single span to OTLP format
347
+ */
348
+ spanToOTLP(span) {
349
+ const startTime = span.startedAt ? new Date(span.startedAt).getTime() : Date.now();
350
+ const endTime = span.endedAt ? new Date(span.endedAt).getTime() : void 0;
351
+ const traceId = span.traceId || this.generateTraceId();
352
+ const spanId = span.spanId || this.generateSpanId();
353
+ return {
354
+ traceId: this.hexToBase64(traceId, "trace"),
355
+ spanId: this.hexToBase64(spanId, "span"),
356
+ parentSpanId: span.parentId ? this.hexToBase64(span.parentId, "span") : void 0,
357
+ name: this.getSpanName(span),
358
+ kind: 1,
359
+ startTimeUnixNano: String(startTime * 1e6),
360
+ endTimeUnixNano: endTime ? String(endTime * 1e6) : void 0,
361
+ attributes: this.attributesToOTLP(span.spanData),
362
+ status: this.getSpanStatus(span)
363
+ };
364
+ }
365
+ /**
366
+ * Get span name from span data
367
+ */
368
+ getSpanName(span) {
369
+ const data = span.spanData;
370
+ if ("name" in data && data.name) return data.name;
371
+ if (data.type) return `agent.${data.type}`;
372
+ return "agent.span";
373
+ }
374
+ /**
375
+ * Get span status from span data
376
+ */
377
+ getSpanStatus(span) {
378
+ const error = span.error;
379
+ if (error) return {
380
+ code: 2,
381
+ message: error.message || String(error)
382
+ };
383
+ return { code: 0 };
384
+ }
385
+ /**
386
+ * Convert span data to OTLP attributes
387
+ */
388
+ attributesToOTLP(data) {
389
+ const attributes = [];
390
+ if (!data) return attributes;
391
+ for (const [key, value] of Object.entries(data)) {
392
+ if (key === "name" || key === "type") continue;
393
+ attributes.push({
394
+ key: `agent.${key}`,
395
+ value: this.valueToOTLP(value)
396
+ });
397
+ }
398
+ return attributes;
399
+ }
400
+ /**
401
+ * Convert a value to OTLP attribute value format
402
+ */
403
+ valueToOTLP(value) {
404
+ if (value === null || value === void 0) return { stringValue: "" };
405
+ if (typeof value === "string") return { stringValue: value };
406
+ if (typeof value === "number") return Number.isInteger(value) ? { intValue: String(value) } : { doubleValue: value };
407
+ if (typeof value === "boolean") return { boolValue: value };
408
+ if (Array.isArray(value)) return { arrayValue: { values: value.map((v) => this.valueToOTLP(v)) } };
409
+ if (typeof value === "object") return { stringValue: JSON.stringify(value) };
410
+ return { stringValue: String(value) };
411
+ }
412
+ /**
413
+ * Convert hex string to base64 for OTLP format
414
+ * Handles openai-agents-js ID format (trace_XXX, span_XXX)
415
+ * @param hex - The hex string to convert
416
+ * @param kind - Whether this is a 'trace' (16 bytes) or 'span' (8 bytes) ID
417
+ */
418
+ hexToBase64(hex, kind) {
419
+ if (!hex) return "";
420
+ try {
421
+ let cleanHex = hex.replace(/^(trace_|span_|group_)/, "");
422
+ const targetLength = kind === "span" ? 16 : 32;
423
+ if (cleanHex.length > targetLength) cleanHex = cleanHex.substring(0, targetLength);
424
+ else if (cleanHex.length < targetLength) cleanHex = cleanHex.padEnd(targetLength, "0");
425
+ return Buffer.from(cleanHex, "hex").toString("base64");
426
+ } catch (error) {
427
+ require_logger.logger.error(`[AgentsTracing] Failed to convert hex to base64: ${hex}`, { error });
428
+ const fallbackLen = kind === "span" ? 16 : 32;
429
+ return Buffer.from(this.generateRandomHex(fallbackLen), "hex").toString("base64");
430
+ }
431
+ }
432
+ /**
433
+ * Generate a random trace ID (32 hex chars)
434
+ */
435
+ generateTraceId() {
436
+ return this.generateRandomHex(32);
437
+ }
438
+ /**
439
+ * Generate a random span ID (16 hex chars)
440
+ */
441
+ generateSpanId() {
442
+ return this.generateRandomHex(16);
443
+ }
444
+ /**
445
+ * Generate random hex string of specified length
446
+ */
447
+ generateRandomHex(length) {
448
+ const bytes = Math.ceil(length / 2);
449
+ const buffer = Buffer.alloc(bytes);
450
+ for (let i = 0; i < bytes; i++) buffer[i] = Math.floor(Math.random() * 256);
451
+ return buffer.toString("hex").substring(0, length);
452
+ }
453
+ };
454
+ //#endregion
455
+ //#region src/providers/openai/agents.ts
456
+ /**
457
+ * OpenAI Agents Provider
458
+ *
459
+ * Integrates openai-agents-js SDK as a promptfoo provider.
460
+ * Supports multi-turn agent workflows with tools, handoffs, and tracing.
461
+ */
462
+ var OpenAiAgentsProvider = class extends require_openai.OpenAiGenericProvider {
463
+ agentConfig;
464
+ agent;
465
+ tracingExporter;
466
+ constructor(modelName, options = {}) {
467
+ super(modelName, options);
468
+ this.agentConfig = options.config || {};
469
+ }
470
+ id() {
471
+ return `openai:agents:${this.modelName}`;
472
+ }
473
+ toString() {
474
+ return `[OpenAI Agents Provider ${this.modelName}]`;
475
+ }
476
+ /**
477
+ * Call the agent with the given prompt
478
+ */
479
+ async callApi(prompt, context, callApiOptions) {
480
+ require_logger.logger.debug("[AgentsProvider] Starting agent call", {
481
+ prompt: prompt.substring(0, 100),
482
+ hasContext: !!context
483
+ });
484
+ try {
485
+ if (!this.agent) this.agent = await this.initializeAgent();
486
+ await this.setupTracingIfNeeded(context);
487
+ const result = await this.runAgent(prompt, context, callApiOptions);
488
+ require_logger.logger.debug("[AgentsProvider] Agent run completed", {
489
+ outputLength: result.output?.length || 0,
490
+ tokenUsage: result.tokenUsage
491
+ });
492
+ return result;
493
+ } catch (error) {
494
+ require_logger.logger.error("[AgentsProvider] Agent call failed", { error });
495
+ throw error;
496
+ }
497
+ }
498
+ /**
499
+ * Initialize the agent from configuration
500
+ */
501
+ async initializeAgent() {
502
+ require_logger.logger.debug("[AgentsProvider] Initializing agent");
503
+ if (!this.agentConfig.agent) throw new Error("No agent configuration provided");
504
+ try {
505
+ const agent = await loadAgentDefinition(this.agentConfig.agent);
506
+ const [tools, handoffs, inputGuardrails, outputGuardrails] = await Promise.all([
507
+ loadTools(this.agentConfig.tools),
508
+ loadHandoffs(this.agentConfig.handoffs),
509
+ loadInputGuardrails(this.agentConfig.inputGuardrails),
510
+ loadOutputGuardrails(this.agentConfig.outputGuardrails)
511
+ ]);
512
+ const configuredAgent = agent.clone({
513
+ tools: mergeArrays(agent.tools, tools),
514
+ handoffs: mergeArrays(agent.handoffs, handoffs),
515
+ inputGuardrails: mergeArrays(agent.inputGuardrails, inputGuardrails),
516
+ outputGuardrails: mergeArrays(agent.outputGuardrails, outputGuardrails)
517
+ });
518
+ const mockAwareAgent = this.wrapToolsIfNeeded(configuredAgent);
519
+ require_logger.logger.debug("[AgentsProvider] Agent initialized successfully", {
520
+ name: mockAwareAgent.name,
521
+ toolCount: mockAwareAgent.tools.length,
522
+ handoffCount: mockAwareAgent.handoffs.length,
523
+ inputGuardrailCount: mockAwareAgent.inputGuardrails.length,
524
+ outputGuardrailCount: mockAwareAgent.outputGuardrails.length
525
+ });
526
+ return mockAwareAgent;
527
+ } catch (error) {
528
+ require_logger.logger.error("[AgentsProvider] Failed to initialize agent", { error });
529
+ throw new Error(`Failed to initialize agent: ${error}`);
530
+ }
531
+ }
532
+ /**
533
+ * Setup tracing if enabled
534
+ */
535
+ async setupTracingIfNeeded(context) {
536
+ if (!(this.agentConfig.tracing === true || context?.test?.metadata?.tracingEnabled === true || process.env.PROMPTFOO_TRACING_ENABLED === "true")) {
537
+ require_logger.logger.debug("[AgentsProvider] Tracing not enabled");
538
+ return;
539
+ }
540
+ require_logger.logger.debug("[AgentsProvider] Setting up tracing");
541
+ try {
542
+ this.tracingExporter = new OTLPTracingExporter({
543
+ otlpEndpoint: this.agentConfig.otlpEndpoint,
544
+ evaluationId: context?.evaluationId,
545
+ testCaseId: context?.testCaseId
546
+ });
547
+ await this.registerTracingExporter(this.tracingExporter);
548
+ (0, _openai_agents.startTraceExportLoop)();
549
+ require_logger.logger.debug("[AgentsProvider] Tracing setup complete");
550
+ } catch (error) {
551
+ require_logger.logger.error("[AgentsProvider] Failed to setup tracing", { error });
552
+ }
553
+ }
554
+ /**
555
+ * Register tracing exporter with openai-agents-js tracing system
556
+ */
557
+ async registerTracingExporter(exporter) {
558
+ try {
559
+ (0, _openai_agents.addTraceProcessor)(new _openai_agents.BatchTraceProcessor(exporter, {
560
+ maxQueueSize: 100,
561
+ maxBatchSize: 10,
562
+ scheduleDelay: 1e3
563
+ }));
564
+ require_logger.logger.debug("[AgentsProvider] Tracing processor registered");
565
+ } catch (error) {
566
+ require_logger.logger.error("[AgentsProvider] Failed to register tracing processor", { error });
567
+ throw error;
568
+ }
569
+ }
570
+ /**
571
+ * Run the agent with the given prompt
572
+ */
573
+ async runAgent(prompt, context, callApiOptions) {
574
+ try {
575
+ require_logger.logger.debug("[AgentsProvider] Running agent", {
576
+ agentName: this.agent?.name,
577
+ maxTurns: this.agentConfig.maxTurns ?? 10
578
+ });
579
+ const runOptions = {
580
+ context: context?.vars,
581
+ maxTurns: this.agentConfig.maxTurns ?? 10,
582
+ signal: callApiOptions?.abortSignal
583
+ };
584
+ if (this.agentConfig.model || this.modelName) runOptions.model = this.agentConfig.model || this.modelName;
585
+ if (this.agentConfig.modelSettings) runOptions.modelSettings = resolveModelSettings(this.agentConfig.modelSettings);
586
+ const result = await (0, _openai_agents.getOrCreateTrace)(async () => {
587
+ return await (0, _openai_agents.run)(this.agent, this.parsePromptInput(prompt), runOptions);
588
+ });
589
+ require_logger.logger.debug("[AgentsProvider] Agent run result", {
590
+ hasOutput: !!result.finalOutput,
591
+ turns: result.newItems?.length || 0
592
+ });
593
+ return {
594
+ output: result.finalOutput,
595
+ tokenUsage: this.extractTokenUsage(result),
596
+ cached: false,
597
+ cost: this.calculateCost(result)
598
+ };
599
+ } catch (error) {
600
+ require_logger.logger.error("[AgentsProvider] Failed to run agent", { error });
601
+ throw error;
602
+ }
603
+ }
604
+ /**
605
+ * Extract token usage from agent result
606
+ */
607
+ extractTokenUsage(result) {
608
+ if (!result.usage) return {};
609
+ const usage = result.usage;
610
+ return {
611
+ total: usage.totalTokens ?? void 0,
612
+ prompt: usage.promptTokens ?? void 0,
613
+ completion: usage.completionTokens ?? void 0
614
+ };
615
+ }
616
+ /**
617
+ * Calculate cost from agent result
618
+ */
619
+ calculateCost(_result) {}
620
+ wrapToolsIfNeeded(agent) {
621
+ if (this.agentConfig.executeTools !== false && this.agentConfig.executeTools !== "mock") return agent;
622
+ const toolMocks = this.agentConfig.toolMocks ?? {};
623
+ const tools = agent.tools.map((tool) => {
624
+ if (tool.type !== "function") return tool;
625
+ const mockValue = toolMocks[tool.name];
626
+ return {
627
+ ...tool,
628
+ invoke: async () => mockValue ?? {
629
+ mocked: true,
630
+ tool: tool.name
631
+ }
632
+ };
633
+ });
634
+ return agent.clone({ tools });
635
+ }
636
+ parsePromptInput(prompt) {
637
+ try {
638
+ const parsedInput = parseAgentInputItems(JSON.parse(prompt));
639
+ if (parsedInput) return parsedInput;
640
+ } catch {}
641
+ return prompt;
642
+ }
643
+ };
644
+ function mergeArrays(existing, additions) {
645
+ if (!existing?.length && !additions?.length) return;
646
+ return [...existing ?? [], ...additions ?? []];
647
+ }
648
+ function parseAgentInputItems(value) {
649
+ if (Array.isArray(value)) {
650
+ if (value.length === 0) return;
651
+ const parsedItems = [];
652
+ for (const item of value) {
653
+ const parsedItem = _openai_agents.protocol.ModelItem.safeParse(item);
654
+ if (!parsedItem.success) return;
655
+ parsedItems.push(parsedItem.data);
656
+ }
657
+ return parsedItems;
658
+ }
659
+ const parsedItem = _openai_agents.protocol.ModelItem.safeParse(value);
660
+ if (!parsedItem.success) return;
661
+ return [parsedItem.data];
662
+ }
663
+ //#endregion
664
+ exports.OpenAiAgentsProvider = OpenAiAgentsProvider;
665
+
666
+ //# sourceMappingURL=agents-DvIpNX1L.cjs.map