@tangle-network/agent-eval 0.118.2 → 0.119.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 (67) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +26 -0
  3. package/dist/analyst/index.d.ts +143 -21
  4. package/dist/analyst/index.js +46 -12
  5. package/dist/analyst/index.js.map +1 -1
  6. package/dist/benchmarks/index.d.ts +50 -40
  7. package/dist/benchmarks/index.js +9 -9
  8. package/dist/campaign/index.d.ts +231 -156
  9. package/dist/campaign/index.js +8 -8
  10. package/dist/{chunk-JTMFT5QZ.js → chunk-4I2E3LLO.js} +2 -2
  11. package/dist/{chunk-BUBU3YHT.js → chunk-6QIM2EAP.js} +6 -116
  12. package/dist/chunk-6QIM2EAP.js.map +1 -0
  13. package/dist/{chunk-DZBCDDIE.js → chunk-7A4LIMMY.js} +846 -253
  14. package/dist/chunk-7A4LIMMY.js.map +1 -0
  15. package/dist/{chunk-KK2O4VWA.js → chunk-D7AEXSM5.js} +2 -2
  16. package/dist/{chunk-GCT3DQWU.js → chunk-F6YUH3L4.js} +41 -30
  17. package/dist/{chunk-GCT3DQWU.js.map → chunk-F6YUH3L4.js.map} +1 -1
  18. package/dist/{chunk-63KG3ASG.js → chunk-FIUFRXP3.js} +2 -2
  19. package/dist/{chunk-J23QK2U5.js → chunk-GERDAIAL.js} +8 -8
  20. package/dist/{chunk-J23QK2U5.js.map → chunk-GERDAIAL.js.map} +1 -1
  21. package/dist/{chunk-TVXPJJ7H.js → chunk-H5UD2323.js} +2 -2
  22. package/dist/{chunk-MLHRFWQK.js → chunk-JHOJHHU7.js} +85 -16
  23. package/dist/chunk-JHOJHHU7.js.map +1 -0
  24. package/dist/chunk-K4DBDHLK.js +158 -0
  25. package/dist/chunk-K4DBDHLK.js.map +1 -0
  26. package/dist/{chunk-DRSFTBKU.js → chunk-LMJ2TGWJ.js} +3 -15
  27. package/dist/chunk-LMJ2TGWJ.js.map +1 -0
  28. package/dist/{chunk-EGNRE7VA.js → chunk-PAHNGS65.js} +2 -2
  29. package/dist/{chunk-I42AAGHL.js → chunk-RLCJQ6VZ.js} +5 -5
  30. package/dist/{chunk-7V3QDWNL.js → chunk-XJ7JVCHB.js} +2 -2
  31. package/dist/{chunk-6JQE3YVE.js → chunk-ZYHJNKI3.js} +6 -6
  32. package/dist/cli.js +2 -2
  33. package/dist/contract/index.d.ts +257 -160
  34. package/dist/contract/index.js +11 -11
  35. package/dist/fuzz.d.ts +19 -1
  36. package/dist/fuzz.js +1 -1
  37. package/dist/index.d.ts +170 -64
  38. package/dist/index.js +30 -28
  39. package/dist/index.js.map +1 -1
  40. package/dist/openapi.json +1 -1
  41. package/dist/primeintellect/index.d.ts +311 -0
  42. package/dist/primeintellect/index.js +348 -0
  43. package/dist/primeintellect/index.js.map +1 -0
  44. package/dist/rl.d.ts +4 -0
  45. package/dist/{run-campaign-DWC67KJP.js → run-campaign-OBXSN5WK.js} +3 -3
  46. package/dist/trace-attributes.d.ts +17 -1
  47. package/dist/trace-attributes.js +27 -3
  48. package/dist/traces.d.ts +16 -16
  49. package/dist/traces.js +18 -18
  50. package/dist/wire/index.d.ts +19 -1
  51. package/dist/wire/index.js +2 -2
  52. package/package.json +6 -1
  53. package/dist/chunk-BUBU3YHT.js.map +0 -1
  54. package/dist/chunk-DRSFTBKU.js.map +0 -1
  55. package/dist/chunk-DZBCDDIE.js.map +0 -1
  56. package/dist/chunk-MLHRFWQK.js.map +0 -1
  57. package/dist/chunk-NW4AQBXD.js +0 -53
  58. package/dist/chunk-NW4AQBXD.js.map +0 -1
  59. /package/dist/{chunk-JTMFT5QZ.js.map → chunk-4I2E3LLO.js.map} +0 -0
  60. /package/dist/{chunk-KK2O4VWA.js.map → chunk-D7AEXSM5.js.map} +0 -0
  61. /package/dist/{chunk-63KG3ASG.js.map → chunk-FIUFRXP3.js.map} +0 -0
  62. /package/dist/{chunk-TVXPJJ7H.js.map → chunk-H5UD2323.js.map} +0 -0
  63. /package/dist/{chunk-EGNRE7VA.js.map → chunk-PAHNGS65.js.map} +0 -0
  64. /package/dist/{chunk-I42AAGHL.js.map → chunk-RLCJQ6VZ.js.map} +0 -0
  65. /package/dist/{chunk-7V3QDWNL.js.map → chunk-XJ7JVCHB.js.map} +0 -0
  66. /package/dist/{chunk-6JQE3YVE.js.map → chunk-ZYHJNKI3.js.map} +0 -0
  67. /package/dist/{run-campaign-DWC67KJP.js.map → run-campaign-OBXSN5WK.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/primeintellect/index.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises'\nimport { dirname, join } from 'node:path'\nimport { type RunRecord, validateRunRecord } from '../run-record'\n\nexport type PrimeIntellectJson =\n | null\n | boolean\n | number\n | string\n | PrimeIntellectJson[]\n | { [key: string]: PrimeIntellectJson }\n\nexport interface PrimeIntellectMessage {\n role: 'system' | 'user' | 'assistant' | 'tool'\n content: string\n}\n\nexport interface PrimeIntellectScenario {\n id: string\n prompt: string | readonly PrimeIntellectMessage[]\n answer?: string\n requiredSubstrings?: readonly string[]\n split?: string\n info?: Record<string, PrimeIntellectJson>\n}\n\nexport interface PrimeIntellectDatasetRow {\n id: string\n prompt: PrimeIntellectMessage[]\n answer?: string\n required_substrings?: string[]\n split?: string\n info: Record<string, PrimeIntellectJson>\n}\n\nexport type PrimeIntellectScenarioMap =\n | ReadonlyMap<string, PrimeIntellectScenario>\n | Record<string, PrimeIntellectScenario>\n | readonly PrimeIntellectScenario[]\n\nexport interface PrimeIntellectRowsFromRunRecordsOptions {\n records: readonly RunRecord[]\n scenarios: PrimeIntellectScenarioMap\n requireScorable?: boolean\n includeFailed?: boolean\n}\n\nexport interface PrimeIntellectEnvironmentPackageInput {\n name: string\n version?: string\n description?: string\n tags?: readonly string[]\n moduleName?: string\n rows: readonly PrimeIntellectDatasetRow[]\n runRecords?: readonly RunRecord[]\n systemPrompt?: string\n verifiersVersion?: string\n dependencies?: readonly string[]\n readme?: string\n}\n\nexport interface PrimeIntellectPackageFile {\n path: string\n content: string\n}\n\nexport interface PrimeIntellectPackageManifest {\n schemaVersion: 1\n name: string\n moduleName: string\n version: string\n rowCount: number\n runRecordCount: number\n artifactKinds: readonly ['environment', 'dataset', 'run_records']\n}\n\nexport interface PrimeIntellectEnvironmentPackage {\n files: PrimeIntellectPackageFile[]\n manifest: PrimeIntellectPackageManifest\n}\n\nexport class PrimeIntellectBridgeError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'PrimeIntellectBridgeError'\n }\n}\n\nexport function primeIntellectRowsFromRunRecords(\n options: PrimeIntellectRowsFromRunRecordsOptions,\n): PrimeIntellectDatasetRow[] {\n const scenarioById = normalizeScenarios(options.scenarios)\n const requireScorable = options.requireScorable ?? true\n const includeFailed = options.includeFailed ?? true\n const rows: PrimeIntellectDatasetRow[] = []\n\n for (const record of options.records) {\n const validRecord = validateRunRecord(record)\n if (!includeFailed && validRecord.failureMode) continue\n\n const scenarioId = validRecord.scenarioId\n if (!scenarioId) {\n throw new PrimeIntellectBridgeError(\n `RunRecord ${validRecord.runId} is missing scenarioId; PrimeIntellect rows need stable task ids`,\n )\n }\n\n const scenario = scenarioById.get(scenarioId)\n if (!scenario) {\n throw new PrimeIntellectBridgeError(\n `RunRecord ${validRecord.runId} references unknown scenarioId ${JSON.stringify(scenarioId)}`,\n )\n }\n\n const hasAnswer = typeof scenario.answer === 'string' && scenario.answer.trim().length > 0\n const hasRequiredSubstrings = (scenario.requiredSubstrings?.length ?? 0) > 0\n if (requireScorable && !hasAnswer && !hasRequiredSubstrings) {\n throw new PrimeIntellectBridgeError(\n `Scenario ${scenario.id} has no answer or requiredSubstrings; generated environments would always score 0`,\n )\n }\n\n const score = validRecord.outcome.holdoutScore ?? validRecord.outcome.searchScore ?? null\n const split = scenario.split ?? validRecord.splitTag\n const tangleInfo = {\n run_id: validRecord.runId,\n experiment_id: validRecord.experimentId,\n candidate_id: validRecord.candidateId,\n scenario_id: scenarioId,\n split,\n score,\n cost_usd: validRecord.costUsd,\n wall_ms: validRecord.wallMs,\n failure_mode: validRecord.failureMode ?? null,\n model: validRecord.model,\n commit_sha: validRecord.commitSha,\n } satisfies Record<string, PrimeIntellectJson>\n\n rows.push({\n id: `${scenarioId}:${validRecord.runId}`,\n prompt: normalizePrompt(scenario.prompt),\n ...(hasAnswer ? { answer: scenario.answer } : {}),\n ...(hasRequiredSubstrings\n ? { required_substrings: [...(scenario.requiredSubstrings ?? [])] }\n : {}),\n split,\n info: {\n ...(scenario.info ?? {}),\n tangle: tangleInfo,\n },\n })\n }\n\n return rows\n}\n\nexport function buildPrimeIntellectEnvironmentPackage(\n input: PrimeIntellectEnvironmentPackageInput,\n): PrimeIntellectEnvironmentPackage {\n if (input.rows.length === 0) {\n throw new PrimeIntellectBridgeError('cannot build a PrimeIntellect environment with zero rows')\n }\n\n for (const record of input.runRecords ?? []) {\n validateRunRecord(record)\n }\n\n const moduleName = input.moduleName ?? toPythonModuleName(input.name)\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(moduleName)) {\n throw new PrimeIntellectBridgeError(\n `moduleName ${JSON.stringify(moduleName)} is not a valid Python module name`,\n )\n }\n\n const version = input.version ?? '0.1.0'\n const description =\n input.description ?? 'PrimeIntellect Verifiers environment exported from Tangle runs.'\n const verifiersVersion = input.verifiersVersion ?? '>=0.2.0,<0.3.0'\n const dependencies = unique([\n 'datasets',\n `verifiers${verifiersVersion}`,\n ...(input.dependencies ?? []),\n ])\n const tags = unique(['tangle', 'agent-eval', ...(input.tags ?? [])])\n const manifest: PrimeIntellectPackageManifest = {\n schemaVersion: 1,\n name: input.name,\n moduleName,\n version,\n rowCount: input.rows.length,\n runRecordCount: input.runRecords?.length ?? 0,\n artifactKinds: ['environment', 'dataset', 'run_records'],\n }\n\n const files: PrimeIntellectPackageFile[] = [\n {\n path: 'pyproject.toml',\n content: renderPyproject({\n name: input.name,\n version,\n description,\n dependencies,\n tags,\n }),\n },\n {\n path: 'README.md',\n content: input.readme ?? renderReadme({ name: input.name, description }),\n },\n {\n path: `${moduleName}.py`,\n content: renderEnvironmentModule({\n systemPrompt: input.systemPrompt,\n }),\n },\n {\n path: 'data/dataset.jsonl',\n content: toJsonl(input.rows),\n },\n {\n path: 'data/run_records.jsonl',\n content: toJsonl(input.runRecords ?? []),\n },\n {\n path: 'tangle-primeintellect-manifest.json',\n content: `${stableJson(manifest)}\\n`,\n },\n ]\n\n return { files, manifest }\n}\n\nexport async function writePrimeIntellectEnvironmentPackage(\n root: string,\n input: PrimeIntellectEnvironmentPackageInput,\n): Promise<PrimeIntellectEnvironmentPackage> {\n const pkg = buildPrimeIntellectEnvironmentPackage(input)\n await Promise.all(\n pkg.files.map(async (file) => {\n const target = join(root, file.path)\n await mkdir(dirname(target), { recursive: true })\n await writeFile(target, file.content, 'utf8')\n }),\n )\n return pkg\n}\n\nfunction normalizeScenarios(\n scenarios: PrimeIntellectScenarioMap,\n): Map<string, PrimeIntellectScenario> {\n const map = new Map<string, PrimeIntellectScenario>()\n if (scenarios instanceof Map) {\n for (const [id, scenario] of scenarios.entries()) {\n map.set(id, { ...scenario, id: scenario.id ?? id })\n }\n return map\n }\n\n const values = Array.isArray(scenarios) ? scenarios : Object.values(scenarios)\n for (const scenario of values) {\n if (!scenario.id) {\n throw new PrimeIntellectBridgeError('every PrimeIntellect scenario needs an id')\n }\n if (map.has(scenario.id)) {\n throw new PrimeIntellectBridgeError(`duplicate PrimeIntellect scenario id ${scenario.id}`)\n }\n map.set(scenario.id, scenario)\n }\n return map\n}\n\nfunction normalizePrompt(\n prompt: string | readonly PrimeIntellectMessage[],\n): PrimeIntellectMessage[] {\n if (typeof prompt === 'string') {\n return [{ role: 'user', content: prompt }]\n }\n return prompt.map((message) => ({ role: message.role, content: message.content }))\n}\n\nfunction toPythonModuleName(name: string): string {\n return name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9_]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .replace(/^[0-9]/, '_$&')\n}\n\nfunction unique(values: readonly string[]): string[] {\n return [...new Set(values)]\n}\n\nfunction toJsonl(values: readonly unknown[]): string {\n if (values.length === 0) return ''\n return `${values.map((value) => stableJson(value)).join('\\n')}\\n`\n}\n\nfunction stableJson(value: unknown): string {\n return JSON.stringify(sortJson(value))\n}\n\nfunction sortJson(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortJson)\n if (value === null || typeof value !== 'object') return value\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, nested]) => [key, sortJson(nested)]),\n )\n}\n\nfunction renderPyproject(input: {\n name: string\n version: string\n description: string\n dependencies: readonly string[]\n tags: readonly string[]\n}): string {\n return `[project]\nname = ${tomlString(input.name)}\nversion = ${tomlString(input.version)}\ndescription = ${tomlString(input.description)}\nreadme = \"README.md\"\nrequires-python = \">=3.11\"\nlicense = \"MIT\"\nkeywords = ${tomlArray(input.tags)}\ndependencies = ${tomlArray(input.dependencies)}\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.build]\ninclude = [\"*.py\", \"README.md\", \"data/*.jsonl\", \"tangle-primeintellect-manifest.json\"]\n\n[tool.uv]\nprerelease = \"allow\"\n\n[tool.verifiers.eval]\nnum_examples = 5\nrollouts_per_example = 3\n`\n}\n\nfunction renderReadme(input: { name: string; description: string }): string {\n return `# ${input.name}\n\n${input.description}\n\nGenerated by \\`@tangle-network/agent-eval/primeintellect\\` from validated Tangle \\`RunRecord\\` rows.\n\n## Files\n\n- \\`data/dataset.jsonl\\`: prompts and scoring references for PrimeIntellect Verifiers.\n- \\`data/run_records.jsonl\\`: original Tangle run rows for provenance and analysis.\n- \\`tangle-primeintellect-manifest.json\\`: export metadata.\n\n## Local check\n\n\\`\\`\\`sh\nuv pip install --prerelease=allow -e .\nuv run vf-eval ${input.name}\n\\`\\`\\`\n\n## Upload\n\n\\`\\`\\`sh\nprime login\nprime env push\n\\`\\`\\`\n`\n}\n\nfunction renderEnvironmentModule(input: { systemPrompt?: string }): string {\n const systemPrompt = input.systemPrompt === undefined ? 'None' : pyString(input.systemPrompt)\n return `import json\nimport re\nfrom pathlib import Path\n\nfrom datasets import Dataset\nimport verifiers as vf\n\n\nDATA_PATH = Path(__file__).parent / \"data\" / \"dataset.jsonl\"\nDEFAULT_SYSTEM_PROMPT = ${systemPrompt}\n\n\ndef _load_rows(dataset_path=None, dataset_split=None):\n path = Path(dataset_path) if dataset_path is not None else DATA_PATH\n rows = []\n with path.open(\"r\", encoding=\"utf-8\") as handle:\n for line in handle:\n row = json.loads(line)\n if dataset_split is None or row.get(\"split\") == dataset_split:\n rows.append(row)\n if not rows:\n raise ValueError(f\"No dataset rows found in {path} for split={dataset_split!r}\")\n return rows\n\n\ndef _message_text(message):\n if isinstance(message, dict):\n content = message.get(\"content\", \"\")\n else:\n content = getattr(message, \"content\", \"\")\n if isinstance(content, list):\n return \" \".join(\n str(part.get(\"text\", part)) if isinstance(part, dict) else str(part)\n for part in content\n )\n return str(content)\n\n\ndef _completion_text(completion):\n if isinstance(completion, str):\n return completion\n if isinstance(completion, list):\n return \"\\\\n\".join(_message_text(message) for message in completion)\n return _message_text(completion)\n\n\ndef _normalize(text):\n return re.sub(r\"\\\\s+\", \" \", str(text).strip().lower())\n\n\nasync def tangle_reward(completion, answer=None, required_substrings=None, **kwargs):\n response = _normalize(_completion_text(completion))\n scores = []\n if answer:\n expected = _normalize(answer)\n scores.append(1.0 if expected == response or expected in response else 0.0)\n if required_substrings:\n required = [_normalize(item) for item in required_substrings]\n hits = sum(1 for item in required if item and item in response)\n scores.append(hits / len(required))\n return max(scores) if scores else 0.0\n\n\ndef build_dataset(dataset_path=None, dataset_split=None):\n return Dataset.from_list(_load_rows(dataset_path=dataset_path, dataset_split=dataset_split))\n\n\ndef load_environment(dataset_path=None, dataset_split=None, system_prompt=DEFAULT_SYSTEM_PROMPT):\n rubric = vf.Rubric(funcs=[tangle_reward])\n return vf.SingleTurnEnv(\n dataset=lambda: build_dataset(dataset_path=dataset_path, dataset_split=dataset_split),\n system_prompt=system_prompt,\n rubric=rubric,\n )\n`\n}\n\nfunction tomlString(value: string): string {\n return JSON.stringify(value)\n}\n\nfunction tomlArray(values: readonly string[]): string {\n return `[${values.map(tomlString).join(', ')}]`\n}\n\nfunction pyString(value: string): string {\n return JSON.stringify(value)\n}\n"],"mappings":"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","names":[]}
package/dist/rl.d.ts CHANGED
@@ -2384,7 +2384,9 @@ interface ChannelRollup {
2384
2384
  calls: number;
2385
2385
  inputTokens: number;
2386
2386
  outputTokens: number;
2387
+ reasoningTokens?: number;
2387
2388
  cachedTokens: number;
2389
+ cacheWriteTokens?: number;
2388
2390
  costUsd: number;
2389
2391
  unpricedCalls: number;
2390
2392
  unknownUsageCalls: number;
@@ -2396,7 +2398,9 @@ interface CostLedgerSummary {
2396
2398
  reservedCostUsd: number;
2397
2399
  inputTokens: number;
2398
2400
  outputTokens: number;
2401
+ reasoningTokens?: number;
2399
2402
  cachedTokens: number;
2403
+ cacheWriteTokens?: number;
2400
2404
  totalCostUsd: number;
2401
2405
  byChannel: ChannelRollup[];
2402
2406
  unpricedModels: string[];
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  planCampaignRun,
3
3
  runCampaign
4
- } from "./chunk-EGNRE7VA.js";
4
+ } from "./chunk-PAHNGS65.js";
5
5
  import "./chunk-PJQFMIOX.js";
6
- import "./chunk-MLHRFWQK.js";
6
+ import "./chunk-JHOJHHU7.js";
7
7
  import "./chunk-VI2UW6B6.js";
8
8
  import "./chunk-ONWEPEDO.js";
9
9
  import "./chunk-PZ5AY32C.js";
@@ -11,4 +11,4 @@ export {
11
11
  planCampaignRun,
12
12
  runCampaign
13
13
  };
14
- //# sourceMappingURL=run-campaign-DWC67KJP.js.map
14
+ //# sourceMappingURL=run-campaign-OBXSN5WK.js.map
@@ -14,6 +14,22 @@ declare const TOOL_ARGS_CAPTURED = "tool.args_captured";
14
14
  declare const TOOL_LATENCY_MS = "tool.latency_ms";
15
15
  declare const INPUT_VALUE = "input.value";
16
16
  declare const OUTPUT_VALUE = "output.value";
17
+ declare const SPAN_KIND_ATTR_KEYS: readonly ["openinference.span.kind", "inference.observation_kind"];
18
+ declare const LLM_MODEL_ATTR_KEYS: readonly ["llm.model_name", "inference.llm.model_name", "llm.model", ...string[], "tangle.model"];
19
+ declare const LLM_INPUT_TOKEN_ATTR_KEYS: readonly ["llm.token_count.prompt", "inference.llm.input_tokens", "llm.input_tokens", ...string[], "tangle.tokens.in", "tokens.in"];
20
+ declare const LLM_OUTPUT_TOKEN_ATTR_KEYS: readonly ["llm.token_count.completion", "inference.llm.output_tokens", "llm.output_tokens", ...string[], "tangle.tokens.out", "tokens.out"];
21
+ /** Reasoning-token subset of output, when a producer exposes it separately. */
22
+ declare const LLM_REASONING_TOKEN_ATTR_KEYS: readonly ["llm.token_count.reasoning", "inference.llm.reasoning_tokens", "llm.reasoning_tokens", "gen_ai.usage.reasoning_tokens", "gen_ai.usage.reasoning_output_tokens", "reasoning_tokens", "reasoning_output_tokens", "tangle.tokens.reasoning", "gen_ai.usage.output_tokens_details.reasoning_tokens", "gen_ai.usage.completion_tokens_details.reasoning_tokens"];
23
+ declare const LLM_CACHED_TOKEN_ATTR_KEYS: readonly ["llm.token_count.prompt_cache_hit", "inference.llm.cached_tokens", "llm.cached_tokens", "gen_ai.usage.cached_tokens", "gen_ai.usage.prompt_tokens_details.cached_tokens", "gen_ai.usage.input_tokens_details.cached_tokens", "gen_ai.usage.cache_read_tokens", "gen_ai.usage.cache_read_input_tokens", "cache_read_tokens", "cache_read_input_tokens", "input_cache_read", "tangle.tokens.cached"];
24
+ declare const LLM_CACHE_WRITE_TOKEN_ATTR_KEYS: readonly ["llm.token_count.prompt_cache_write", "inference.llm.cache_write_tokens", "llm.cache_write_tokens", "gen_ai.usage.cache_creation_tokens", "gen_ai.usage.cache_creation_input_tokens", "cache_creation_tokens", "cache_creation_input_tokens", "input_cache_creation", "tangle.tokens.cache_write"];
25
+ declare const LLM_COST_ATTR_KEYS: readonly ["llm.cost_usd", "inference.llm.cost.total", "llm.cost.total", "gen_ai.usage.cost", "gen_ai.usage.cost_usd", "tangle.cost.usd", "cost.usd", "cost"];
26
+ /** Explicit run-total cost keys safe to preserve on an untyped span. */
27
+ declare const RUN_COST_ATTR_KEYS: readonly ["tangle.cost.usd", "cost.usd"];
28
+ declare const TOOL_NAME_ATTR_KEYS: readonly ["tool.name", "inference.tool.name"];
29
+ /** Read a numeric attribute, tolerating numeric strings; `null` if absent or invalid. */
30
+ declare function asNumber(value: unknown): number | null;
31
+ /** First finite numeric value across a list of candidate attribute keys. */
32
+ declare function firstNumberAttr(attributes: Record<string, unknown>, keys: readonly string[]): number | null;
17
33
  /** Sum producer-supplied, mutually exclusive prompt-token categories. */
18
34
  declare function contextInputTokens(usage: {
19
35
  inputTokens?: number | null;
@@ -33,4 +49,4 @@ interface LlmSpanOtlpInput {
33
49
  /** Write the canonical LLM attributes shared by trace producers. */
34
50
  declare function applyLlmSpanOtlpAttributes(attributes: Record<string, unknown>, span: LlmSpanOtlpInput): void;
35
51
 
36
- export { INPUT_VALUE, LLM_CACHED_TOKENS, LLM_CACHE_WRITE_TOKENS, LLM_CONTEXT_TOKENS, LLM_COST_USD, LLM_INPUT_TOKENS, LLM_MODEL_NAME, LLM_OUTPUT_TOKENS, LLM_REASONING_TOKENS, type LlmSpanOtlpInput, OPENINFERENCE_SPAN_KIND, OUTPUT_VALUE, TOOL_ARGS_CAPTURED, TOOL_LATENCY_MS, TOOL_NAME, applyLlmSpanOtlpAttributes, contextInputTokens };
52
+ export { INPUT_VALUE, LLM_CACHED_TOKENS, LLM_CACHED_TOKEN_ATTR_KEYS, LLM_CACHE_WRITE_TOKENS, LLM_CACHE_WRITE_TOKEN_ATTR_KEYS, LLM_CONTEXT_TOKENS, LLM_COST_ATTR_KEYS, LLM_COST_USD, LLM_INPUT_TOKENS, LLM_INPUT_TOKEN_ATTR_KEYS, LLM_MODEL_ATTR_KEYS, LLM_MODEL_NAME, LLM_OUTPUT_TOKENS, LLM_OUTPUT_TOKEN_ATTR_KEYS, LLM_REASONING_TOKENS, LLM_REASONING_TOKEN_ATTR_KEYS, type LlmSpanOtlpInput, OPENINFERENCE_SPAN_KIND, OUTPUT_VALUE, RUN_COST_ATTR_KEYS, SPAN_KIND_ATTR_KEYS, TOOL_ARGS_CAPTURED, TOOL_LATENCY_MS, TOOL_NAME, TOOL_NAME_ATTR_KEYS, applyLlmSpanOtlpAttributes, asNumber, contextInputTokens, firstNumberAttr };
@@ -1,38 +1,62 @@
1
1
  import {
2
2
  INPUT_VALUE,
3
3
  LLM_CACHED_TOKENS,
4
+ LLM_CACHED_TOKEN_ATTR_KEYS,
4
5
  LLM_CACHE_WRITE_TOKENS,
6
+ LLM_CACHE_WRITE_TOKEN_ATTR_KEYS,
5
7
  LLM_CONTEXT_TOKENS,
8
+ LLM_COST_ATTR_KEYS,
6
9
  LLM_COST_USD,
7
10
  LLM_INPUT_TOKENS,
11
+ LLM_INPUT_TOKEN_ATTR_KEYS,
12
+ LLM_MODEL_ATTR_KEYS,
8
13
  LLM_MODEL_NAME,
9
14
  LLM_OUTPUT_TOKENS,
15
+ LLM_OUTPUT_TOKEN_ATTR_KEYS,
10
16
  LLM_REASONING_TOKENS,
17
+ LLM_REASONING_TOKEN_ATTR_KEYS,
11
18
  OPENINFERENCE_SPAN_KIND,
12
19
  OUTPUT_VALUE,
20
+ RUN_COST_ATTR_KEYS,
21
+ SPAN_KIND_ATTR_KEYS,
13
22
  TOOL_ARGS_CAPTURED,
14
23
  TOOL_LATENCY_MS,
15
24
  TOOL_NAME,
25
+ TOOL_NAME_ATTR_KEYS,
16
26
  applyLlmSpanOtlpAttributes,
17
- contextInputTokens
18
- } from "./chunk-NW4AQBXD.js";
27
+ asNumber,
28
+ contextInputTokens,
29
+ firstNumberAttr
30
+ } from "./chunk-K4DBDHLK.js";
19
31
  import "./chunk-PZ5AY32C.js";
20
32
  export {
21
33
  INPUT_VALUE,
22
34
  LLM_CACHED_TOKENS,
35
+ LLM_CACHED_TOKEN_ATTR_KEYS,
23
36
  LLM_CACHE_WRITE_TOKENS,
37
+ LLM_CACHE_WRITE_TOKEN_ATTR_KEYS,
24
38
  LLM_CONTEXT_TOKENS,
39
+ LLM_COST_ATTR_KEYS,
25
40
  LLM_COST_USD,
26
41
  LLM_INPUT_TOKENS,
42
+ LLM_INPUT_TOKEN_ATTR_KEYS,
43
+ LLM_MODEL_ATTR_KEYS,
27
44
  LLM_MODEL_NAME,
28
45
  LLM_OUTPUT_TOKENS,
46
+ LLM_OUTPUT_TOKEN_ATTR_KEYS,
29
47
  LLM_REASONING_TOKENS,
48
+ LLM_REASONING_TOKEN_ATTR_KEYS,
30
49
  OPENINFERENCE_SPAN_KIND,
31
50
  OUTPUT_VALUE,
51
+ RUN_COST_ATTR_KEYS,
52
+ SPAN_KIND_ATTR_KEYS,
32
53
  TOOL_ARGS_CAPTURED,
33
54
  TOOL_LATENCY_MS,
34
55
  TOOL_NAME,
56
+ TOOL_NAME_ATTR_KEYS,
35
57
  applyLlmSpanOtlpAttributes,
36
- contextInputTokens
58
+ asNumber,
59
+ contextInputTokens,
60
+ firstNumberAttr
37
61
  };
38
62
  //# sourceMappingURL=trace-attributes.js.map
package/dist/traces.d.ts CHANGED
@@ -1200,6 +1200,22 @@ declare const TOOL_ARGS_CAPTURED = "tool.args_captured";
1200
1200
  declare const TOOL_LATENCY_MS = "tool.latency_ms";
1201
1201
  declare const INPUT_VALUE = "input.value";
1202
1202
  declare const OUTPUT_VALUE = "output.value";
1203
+ declare const SPAN_KIND_ATTR_KEYS: readonly ["openinference.span.kind", "inference.observation_kind"];
1204
+ declare const LLM_MODEL_ATTR_KEYS: readonly ["llm.model_name", "inference.llm.model_name", "llm.model", ...string[], "tangle.model"];
1205
+ declare const LLM_INPUT_TOKEN_ATTR_KEYS: readonly ["llm.token_count.prompt", "inference.llm.input_tokens", "llm.input_tokens", ...string[], "tangle.tokens.in", "tokens.in"];
1206
+ declare const LLM_OUTPUT_TOKEN_ATTR_KEYS: readonly ["llm.token_count.completion", "inference.llm.output_tokens", "llm.output_tokens", ...string[], "tangle.tokens.out", "tokens.out"];
1207
+ /** Reasoning-token subset of output, when a producer exposes it separately. */
1208
+ declare const LLM_REASONING_TOKEN_ATTR_KEYS: readonly ["llm.token_count.reasoning", "inference.llm.reasoning_tokens", "llm.reasoning_tokens", "gen_ai.usage.reasoning_tokens", "gen_ai.usage.reasoning_output_tokens", "reasoning_tokens", "reasoning_output_tokens", "tangle.tokens.reasoning", "gen_ai.usage.output_tokens_details.reasoning_tokens", "gen_ai.usage.completion_tokens_details.reasoning_tokens"];
1209
+ declare const LLM_CACHED_TOKEN_ATTR_KEYS: readonly ["llm.token_count.prompt_cache_hit", "inference.llm.cached_tokens", "llm.cached_tokens", "gen_ai.usage.cached_tokens", "gen_ai.usage.prompt_tokens_details.cached_tokens", "gen_ai.usage.input_tokens_details.cached_tokens", "gen_ai.usage.cache_read_tokens", "gen_ai.usage.cache_read_input_tokens", "cache_read_tokens", "cache_read_input_tokens", "input_cache_read", "tangle.tokens.cached"];
1210
+ declare const LLM_CACHE_WRITE_TOKEN_ATTR_KEYS: readonly ["llm.token_count.prompt_cache_write", "inference.llm.cache_write_tokens", "llm.cache_write_tokens", "gen_ai.usage.cache_creation_tokens", "gen_ai.usage.cache_creation_input_tokens", "cache_creation_tokens", "cache_creation_input_tokens", "input_cache_creation", "tangle.tokens.cache_write"];
1211
+ declare const LLM_COST_ATTR_KEYS: readonly ["llm.cost_usd", "inference.llm.cost.total", "llm.cost.total", "gen_ai.usage.cost", "gen_ai.usage.cost_usd", "tangle.cost.usd", "cost.usd", "cost"];
1212
+ /** Explicit run-total cost keys safe to preserve on an untyped span. */
1213
+ declare const RUN_COST_ATTR_KEYS: readonly ["tangle.cost.usd", "cost.usd"];
1214
+ declare const TOOL_NAME_ATTR_KEYS: readonly ["tool.name", "inference.tool.name"];
1215
+ /** Read a numeric attribute, tolerating numeric strings; `null` if absent or invalid. */
1216
+ declare function asNumber(value: unknown): number | null;
1217
+ /** First finite numeric value across a list of candidate attribute keys. */
1218
+ declare function firstNumberAttr(attributes: Record<string, unknown>, keys: readonly string[]): number | null;
1203
1219
  /** Sum producer-supplied, mutually exclusive prompt-token categories. */
1204
1220
  declare function contextInputTokens(usage: {
1205
1221
  inputTokens?: number | null;
@@ -1221,18 +1237,6 @@ declare function applyLlmSpanOtlpAttributes(attributes: Record<string, unknown>,
1221
1237
 
1222
1238
  /** Canonical OpenInference-over-OTLP attribute vocabulary used at the trace boundary. */
1223
1239
 
1224
- declare const SPAN_KIND_ATTR_KEYS: readonly ["openinference.span.kind", "inference.observation_kind"];
1225
- declare const LLM_MODEL_ATTR_KEYS: readonly ["llm.model_name", "inference.llm.model_name", "llm.model", ...string[], "tangle.model"];
1226
- declare const LLM_INPUT_TOKEN_ATTR_KEYS: readonly ["llm.token_count.prompt", "inference.llm.input_tokens", "llm.input_tokens", ...string[], "tangle.tokens.in", "tokens.in"];
1227
- declare const LLM_OUTPUT_TOKEN_ATTR_KEYS: readonly ["llm.token_count.completion", "inference.llm.output_tokens", "llm.output_tokens", ...string[], "tangle.tokens.out", "tokens.out"];
1228
- /** Reasoning-token subset of output, when a producer exposes it separately. */
1229
- declare const LLM_REASONING_TOKEN_ATTR_KEYS: readonly ["llm.token_count.reasoning", "inference.llm.reasoning_tokens", "llm.reasoning_tokens", "gen_ai.usage.reasoning_tokens", "gen_ai.usage.reasoning_output_tokens", "reasoning_tokens", "reasoning_output_tokens", "tangle.tokens.reasoning", "gen_ai.usage.output_tokens_details.reasoning_tokens", "gen_ai.usage.completion_tokens_details.reasoning_tokens"];
1230
- declare const LLM_CACHED_TOKEN_ATTR_KEYS: readonly ["llm.token_count.prompt_cache_hit", "inference.llm.cached_tokens", "llm.cached_tokens", "gen_ai.usage.cached_tokens", "gen_ai.usage.prompt_tokens_details.cached_tokens", "gen_ai.usage.input_tokens_details.cached_tokens", "gen_ai.usage.cache_read_tokens", "gen_ai.usage.cache_read_input_tokens", "cache_read_tokens", "cache_read_input_tokens", "input_cache_read", "tangle.tokens.cached"];
1231
- declare const LLM_CACHE_WRITE_TOKEN_ATTR_KEYS: readonly ["llm.token_count.prompt_cache_write", "inference.llm.cache_write_tokens", "llm.cache_write_tokens", "gen_ai.usage.cache_creation_tokens", "gen_ai.usage.cache_creation_input_tokens", "cache_creation_tokens", "cache_creation_input_tokens", "input_cache_creation", "tangle.tokens.cache_write"];
1232
- declare const LLM_COST_ATTR_KEYS: readonly ["llm.cost_usd", "inference.llm.cost.total", "llm.cost.total", "gen_ai.usage.cost", "gen_ai.usage.cost_usd", "tangle.cost.usd", "cost.usd", "cost"];
1233
- /** Explicit run-total cost keys safe to preserve on an untyped span. */
1234
- declare const RUN_COST_ATTR_KEYS: readonly ["tangle.cost.usd", "cost.usd"];
1235
- declare const TOOL_NAME_ATTR_KEYS: readonly ["tool.name", "inference.tool.name"];
1236
1240
  type ToolSpanOtlpInput = Pick<ToolSpan, 'toolName' | 'args' | 'argsCaptured' | 'result' | 'latencyMs'>;
1237
1241
  declare function applyToolSpanOtlpAttributes(attributes: Record<string, unknown>, span: ToolSpanOtlpInput): void;
1238
1242
  declare function traceSpanKindToOpenInferenceKind(kind: string): string;
@@ -2032,10 +2036,6 @@ declare function inferOtlpKind(attrs: Record<string, unknown>): TraceAnalystSpan
2032
2036
  declare function extractOtlpAttributes(raw: Record<string, unknown>): Record<string, unknown>;
2033
2037
  declare function stringField(raw: Record<string, unknown>, key: string): string | undefined;
2034
2038
  declare function asString(v: unknown): string | null;
2035
- /** Read a numeric attribute, tolerating numeric strings; `null` if absent/NaN. */
2036
- declare function asNumber(v: unknown): number | null;
2037
- /** First finite numeric value across a list of candidate attribute keys. */
2038
- declare function firstNumberAttr(attrs: Record<string, unknown>, keys: readonly string[]): number | null;
2039
2039
  /** First non-empty string value across a list of candidate attribute keys. */
2040
2040
  declare function firstStringAttr(attrs: Record<string, unknown>, keys: readonly string[]): string | null;
2041
2041
 
package/dist/traces.js CHANGED
@@ -27,8 +27,8 @@ import {
27
27
  scoreTraceInsightReadiness,
28
28
  tokenizeDomainWords,
29
29
  traceAnalystOnRunComplete
30
- } from "./chunk-6JQE3YVE.js";
31
- import "./chunk-TVXPJJ7H.js";
30
+ } from "./chunk-ZYHJNKI3.js";
31
+ import "./chunk-H5UD2323.js";
32
32
  import {
33
33
  extractUsage,
34
34
  extractUsageFromResponse,
@@ -50,7 +50,7 @@ import {
50
50
  TRACE_ANALYST_ACTOR_DESCRIPTION_VERSION,
51
51
  TRACE_ANALYST_SUBAGENT_DESCRIPTION,
52
52
  analyzeTraces
53
- } from "./chunk-63KG3ASG.js";
53
+ } from "./chunk-FIUFRXP3.js";
54
54
  import {
55
55
  DEFAULT_REDACTION_RULES,
56
56
  REDACTION_VERSION,
@@ -59,27 +59,15 @@ import {
59
59
  } from "./chunk-GGE4NNQT.js";
60
60
  import {
61
61
  DEFAULT_TRACE_ANALYST_BUDGETS,
62
- LLM_CACHED_TOKEN_ATTR_KEYS,
63
- LLM_CACHE_WRITE_TOKEN_ATTR_KEYS,
64
- LLM_COST_ATTR_KEYS,
65
- LLM_INPUT_TOKEN_ATTR_KEYS,
66
- LLM_MODEL_ATTR_KEYS,
67
- LLM_OUTPUT_TOKEN_ATTR_KEYS,
68
- LLM_REASONING_TOKEN_ATTR_KEYS,
69
62
  OtlpFileTraceStore,
70
- RUN_COST_ATTR_KEYS,
71
- SPAN_KIND_ATTR_KEYS,
72
63
  SpanNotFoundError,
73
- TOOL_NAME_ATTR_KEYS,
74
64
  TRACE_ANALYST_TRUNCATION_MARKER_PREFIX,
75
65
  TraceFileMissingError,
76
66
  TraceNotFoundError,
77
67
  applyToolSpanOtlpAttributes,
78
- asNumber,
79
68
  asString,
80
69
  buildTraceAnalystTools,
81
70
  extractOtlpAttributes,
82
- firstNumberAttr,
83
71
  firstStringAttr,
84
72
  inferOtlpKind,
85
73
  projectOtlpFlatLine,
@@ -87,7 +75,7 @@ import {
87
75
  stringField,
88
76
  traceAnalystFunctionGroup,
89
77
  traceSpanKindToOpenInferenceKind
90
- } from "./chunk-BUBU3YHT.js";
78
+ } from "./chunk-6QIM2EAP.js";
91
79
  import {
92
80
  RunIntegrityError,
93
81
  assertRunCaptured,
@@ -120,21 +108,33 @@ import "./chunk-ONWEPEDO.js";
120
108
  import {
121
109
  INPUT_VALUE,
122
110
  LLM_CACHED_TOKENS,
111
+ LLM_CACHED_TOKEN_ATTR_KEYS,
123
112
  LLM_CACHE_WRITE_TOKENS,
113
+ LLM_CACHE_WRITE_TOKEN_ATTR_KEYS,
124
114
  LLM_CONTEXT_TOKENS,
115
+ LLM_COST_ATTR_KEYS,
125
116
  LLM_COST_USD,
126
117
  LLM_INPUT_TOKENS,
118
+ LLM_INPUT_TOKEN_ATTR_KEYS,
119
+ LLM_MODEL_ATTR_KEYS,
127
120
  LLM_MODEL_NAME,
128
121
  LLM_OUTPUT_TOKENS,
122
+ LLM_OUTPUT_TOKEN_ATTR_KEYS,
129
123
  LLM_REASONING_TOKENS,
124
+ LLM_REASONING_TOKEN_ATTR_KEYS,
130
125
  OPENINFERENCE_SPAN_KIND,
131
126
  OUTPUT_VALUE,
127
+ RUN_COST_ATTR_KEYS,
128
+ SPAN_KIND_ATTR_KEYS,
132
129
  TOOL_ARGS_CAPTURED,
133
130
  TOOL_LATENCY_MS,
134
131
  TOOL_NAME,
132
+ TOOL_NAME_ATTR_KEYS,
135
133
  applyLlmSpanOtlpAttributes,
136
- contextInputTokens
137
- } from "./chunk-NW4AQBXD.js";
134
+ asNumber,
135
+ contextInputTokens,
136
+ firstNumberAttr
137
+ } from "./chunk-K4DBDHLK.js";
138
138
  import "./chunk-PZ5AY32C.js";
139
139
  export {
140
140
  DEFAULT_REDACTION_RULES,
@@ -7,8 +7,14 @@ import { Hono } from 'hono';
7
7
  type CostChannel = 'agent' | 'judge' | 'verifier' | 'analyst' | 'driver' | (string & {});
8
8
  interface CostUsage {
9
9
  inputTokens: number;
10
+ /** Includes reasoning tokens when the provider bills them as output. */
10
11
  outputTokens: number;
12
+ /** Reasoning-token subset of outputTokens, when reported. */
13
+ reasoningTokens?: number;
14
+ /** Prompt tokens served from a provider cache. */
11
15
  cachedTokens?: number;
16
+ /** Prompt tokens written into a provider cache. */
17
+ cacheWriteTokens?: number;
12
18
  }
13
19
  interface CostCallBase {
14
20
  callId: string;
@@ -75,7 +81,9 @@ interface ChannelRollup {
75
81
  calls: number;
76
82
  inputTokens: number;
77
83
  outputTokens: number;
84
+ reasoningTokens?: number;
78
85
  cachedTokens: number;
86
+ cacheWriteTokens?: number;
79
87
  costUsd: number;
80
88
  unpricedCalls: number;
81
89
  unknownUsageCalls: number;
@@ -87,7 +95,9 @@ interface CostLedgerSummary {
87
95
  reservedCostUsd: number;
88
96
  inputTokens: number;
89
97
  outputTokens: number;
98
+ reasoningTokens?: number;
90
99
  cachedTokens: number;
100
+ cacheWriteTokens?: number;
91
101
  totalCostUsd: number;
92
102
  byChannel: ChannelRollup[];
93
103
  unpricedModels: string[];
@@ -101,6 +111,10 @@ interface CostLedgerFilter {
101
111
  phase?: string;
102
112
  tags?: Record<string, string>;
103
113
  }
114
+ interface CostLedgerWaitOptions {
115
+ /** Maximum time to wait for active provider calls. Default 5 seconds. */
116
+ timeoutMs?: number;
117
+ }
104
118
  /** Append-only storage. `append` must atomically reject stale revisions. */
105
119
  interface CostLedgerPersistence {
106
120
  read(): {
@@ -120,6 +134,7 @@ declare class CostLedger {
120
134
  private readonly records;
121
135
  private readonly activeCallIds;
122
136
  private readonly lateCallIds;
137
+ private readonly idleWaiters;
123
138
  private completedTasks;
124
139
  private revision;
125
140
  private costLimitPersisted;
@@ -127,6 +142,8 @@ declare class CostLedger {
127
142
  private readonly persistence?;
128
143
  constructor(input?: number | CostLedgerOptions);
129
144
  runPaidCall<T>(input: RunPaidCallInput<T>): Promise<PaidCallResult<T>>;
145
+ /** Wait until every call started by this ledger has produced a durable outcome. */
146
+ waitForIdle(options?: CostLedgerWaitOptions): Promise<boolean>;
130
147
  /** Settle a call left pending by a crashed process after reconciling with the provider. */
131
148
  reconcile(callId: string, observed: CostReceiptInput, options?: {
132
149
  error?: string;
@@ -137,6 +154,7 @@ declare class CostLedger {
137
154
  costPerCompletedTask(): number | null;
138
155
  private execute;
139
156
  private captureLateOutcome;
157
+ private releaseActiveCall;
140
158
  private commitOutcome;
141
159
  private captureFailure;
142
160
  private commitReceipt;
@@ -152,7 +170,7 @@ declare class CostLedger {
152
170
  * Keeping callback contracts structural lets those subpaths compose while the
153
171
  * concrete {@link CostLedger} retains its private durable state.
154
172
  */
155
- type CostLedgerHandle = Pick<CostLedger, keyof CostLedger>;
173
+ type CostLedgerHandle = Pick<CostLedger, Exclude<keyof CostLedger, 'waitForIdle'>> & Partial<Pick<CostLedger, 'waitForIdle'>>;
156
174
 
157
175
  type RunStatus = 'running' | 'completed' | 'failed' | 'aborted';
158
176
  interface BudgetSpec {
@@ -34,9 +34,9 @@ import {
34
34
  runRpcOnce,
35
35
  startServer,
36
36
  startServerAsync
37
- } from "../chunk-JTMFT5QZ.js";
37
+ } from "../chunk-4I2E3LLO.js";
38
38
  import "../chunk-NJC7U437.js";
39
- import "../chunk-MLHRFWQK.js";
39
+ import "../chunk-JHOJHHU7.js";
40
40
  import "../chunk-VI2UW6B6.js";
41
41
  import "../chunk-PC4UYEBM.js";
42
42
  import "../chunk-ONWEPEDO.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/agent-eval",
3
- "version": "0.118.2",
3
+ "version": "0.119.0",
4
4
  "description": "Evaluate and improve AI agents from runs, traces, judges, and feedback. Compare candidates, cluster failures, measure lift, and gate releases.",
5
5
  "homepage": "https://github.com/tangle-network/agent-eval#readme",
6
6
  "repository": {
@@ -119,6 +119,11 @@
119
119
  "import": "./dist/hosted/index.js",
120
120
  "default": "./dist/hosted/index.js"
121
121
  },
122
+ "./primeintellect": {
123
+ "types": "./dist/primeintellect/index.d.ts",
124
+ "import": "./dist/primeintellect/index.js",
125
+ "default": "./dist/primeintellect/index.js"
126
+ },
122
127
  "./openapi.json": {
123
128
  "default": "./dist/openapi.json"
124
129
  }