Files
promptfoo--promptfoo/test/providers/openai/agents-tracing.test.ts
T
wehub-resource-sync 0d3cb498a3
CI / Shell Format Check (push) Has been cancelled
CI / Check Ruby (3.4) (push) Has been cancelled
CI / CI Config (push) Has been cancelled
CI / Test on Node ${{ matrix.node }} and ${{ matrix.os }}${{ matrix.shard && format(' (shard {0}/3)', matrix.shard) || '' }} (push) Has been cancelled
CI / Build on Node ${{ matrix.node }} (push) Has been cancelled
CI / Style Check (push) Has been cancelled
CI / Generate Assets (push) Has been cancelled
CI / Check Python (3.14) (push) Has been cancelled
CI / Check Python (3.9) (push) Has been cancelled
CI / Build Docs (push) Has been cancelled
CI / Code Scan Action (push) Has been cancelled
CI / Site tests (push) Has been cancelled
CI / webui tests (push) Has been cancelled
CI / Run Integration Tests (push) Has been cancelled
CI / Run Smoke Tests (push) Has been cancelled
CI / Go Tests (push) Has been cancelled
CI / Share Test (push) Has been cancelled
CI / Redteam (Production API) (push) Has been cancelled
CI / Redteam (Staging API) (push) Has been cancelled
CI / GitHub Actions Lint (push) Has been cancelled
CI / Check Ruby (3.0) (push) Has been cancelled
release-please / release-please (push) Has been cancelled
release-please / build (push) Has been cancelled
release-please / publish-npm (push) Has been cancelled
release-please / publish-npm-backfill (push) Has been cancelled
release-please / docker (push) Has been cancelled
release-please / publish-code-scan-action (push) Has been cancelled
release-please / attest-code-scan-action (push) Has been cancelled
Deploy local.promptfoo.app / Deploy to Cloudflare Pages (push) Has been cancelled
Test and Publish Multi-arch Docker Image / test (push) Has been cancelled
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-amd64 platform:linux/amd64 runner:ubuntu-latest]) (push) Has been cancelled
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-arm64 platform:linux/arm64 runner:ubuntu-24.04-arm]) (push) Has been cancelled
Test and Publish Multi-arch Docker Image / merge-docker-digests (push) Has been cancelled
Test and Publish Multi-arch Docker Image / Attest Multi-arch Image (push) Has been cancelled
Validate Renovate Config / Validate Renovate Configuration (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:24:08 +08:00

102 lines
3.2 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { OTLPTracingExporter } from '../../../src/providers/openai/agents-tracing';
function getAttributes(span: any): Record<string, unknown> {
return Object.fromEntries(
span.attributes.map((attribute: any) => {
const value = attribute.value;
if (value.stringValue !== undefined) {
return [attribute.key, value.stringValue];
}
if (value.intValue !== undefined) {
return [attribute.key, Number(value.intValue)];
}
if (value.boolValue !== undefined) {
return [attribute.key, value.boolValue];
}
if (value.doubleValue !== undefined) {
return [attribute.key, value.doubleValue];
}
return [attribute.key, value];
}),
);
}
describe('OTLPTracingExporter', () => {
it('maps function spans into Promptfoo trajectory-friendly tool attributes', () => {
const exporter = new OTLPTracingExporter() as any;
const payload = exporter.transformToOTLP([
{
type: 'trace.span',
traceId: 'trace_0123456789abcdef0123456789abcdef',
spanId: 'span_0123456789abcdef',
parentId: null,
startedAt: '2026-05-06T12:00:00.000Z',
endedAt: '2026-05-06T12:00:01.000Z',
spanData: {
type: 'function',
name: 'lookup_order',
input: '{"order_id":"123"}',
output: '{"status":"shipped"}',
},
traceMetadata: {
'evaluation.id': 'eval-1',
'test.case.id': 'case-1',
'promptfoo.parent_span_id': 'fedcba9876543210',
},
error: null,
},
]);
const span = payload.resourceSpans[0].scopeSpans[0].spans[0];
expect(span.name).toBe('tool lookup_order');
expect(getAttributes(span)).toMatchObject({
'evaluation.id': 'eval-1',
'openai.agents.span_type': 'function',
'test.case.id': 'case-1',
'tool.arguments': '{"order_id":"123"}',
'tool.name': 'lookup_order',
'tool.output': '{"status":"shipped"}',
});
expect(span.parentSpanId).toBe(Buffer.from('fedcba9876543210', 'hex').toString('base64'));
});
it('turns sandbox custom spans into command-aware spans', () => {
const exporter = new OTLPTracingExporter() as any;
const payload = exporter.transformToOTLP([
{
type: 'trace.span',
traceId: 'trace_0123456789abcdef0123456789abcdef',
spanId: 'span_0123456789abcdef',
parentId: null,
startedAt: '2026-05-06T12:00:00.000Z',
endedAt: '2026-05-06T12:00:01.000Z',
spanData: {
type: 'custom',
name: 'sandbox.exec',
data: {
cmd: ['cat', 'repo/task.md'],
workdir: 'repo',
},
},
traceMetadata: {},
error: null,
},
]);
const span = payload.resourceSpans[0].scopeSpans[0].spans[0];
expect(span.name).toBe('sandbox.exec');
expect(getAttributes(span)).toMatchObject({
command: 'cat repo/task.md',
cmd: {
arrayValue: {
values: [{ stringValue: 'cat' }, { stringValue: 'repo/task.md' }],
},
},
'openai.agents.custom_span.name': 'sandbox.exec',
'openai.agents.span_type': 'custom',
workdir: 'repo',
});
});
});