Skip to content

Commit b4264be

Browse files
committed
fix: complete span telemetry on shim and exhaustion terminals
The prompt-shim early return and the maxSteps-exhausted return now attach the same llm.usage.* and gen_ai.* root-span attribute pairs as the other generateText terminals; streamText's teardown block already covers its own paths. The usage-only stream sentinel reads service_tier through the typed StreamChunkExtras surface instead of inline casts. Refresh the agency example model.
1 parent 7cb6197 commit b4264be

3 files changed

Lines changed: 12 additions & 4 deletions

File tree

src/api/generateText.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1657,6 +1657,13 @@ export async function generateText(opts: GenerateTextOptions): Promise<GenerateT
16571657
totalTokens: (totalUsage.totalTokens ?? 0) + loopResult.totalTokens,
16581658
};
16591659
metricUsage = shimUsage;
1660+
// Dual-emit the same root-span attribute pairs as the native
1661+
// terminals below — the shim early-return is a first-class chat
1662+
// terminal, not a bypass (spec batch-1 residual).
1663+
span?.setAttribute('agentos.api.finish_reason', loopResult.finishReason);
1664+
span?.setAttribute('agentos.api.tool_calls', loopResult.toolCalls.length);
1665+
attachUsageAttributes(span, shimUsage);
1666+
attachGenAiAttributes(span, { providerName: resolved.providerId, operationName: 'chat', requestModel: resolved.modelId, responseModel: lastResponseModelId, usage: shimUsage, ...(opts.serviceTier !== undefined ? { requestServiceTier: opts.serviceTier } : {}), ...(lastServiceTier !== undefined ? { responseServiceTier: lastServiceTier } : {}) });
16601667
fireLlmUsageObserver({
16611668
provider: resolved.providerId,
16621669
model: resolved.modelId,
@@ -2081,6 +2088,7 @@ export async function generateText(opts: GenerateTextOptions): Promise<GenerateT
20812088
span?.setAttribute('agentos.api.finish_reason', 'tool-calls');
20822089
span?.setAttribute('agentos.api.tool_calls', allToolCalls.length);
20832090
attachUsageAttributes(span, totalUsage);
2091+
attachGenAiAttributes(span, { providerName: resolved.providerId, operationName: 'chat', requestModel: resolved.modelId, responseModel: lastResponseModelId, usage: totalUsage, ...(opts.serviceTier !== undefined ? { requestServiceTier: opts.serviceTier } : {}), ...(lastServiceTier !== undefined ? { responseServiceTier: lastServiceTier } : {}) });
20842092
fireLlmUsageObserver({
20852093
provider: resolved.providerId,
20862094
model: resolved.modelId,

src/api/hitl.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*
1414
* // Auto-approve everything (useful in tests and CI environments)
1515
* const testAgency = agency({
16-
* agents: { worker: { provider: 'openai', model: 'gpt-4o-mini' } },
16+
* agents: { worker: { provider: 'openai', model: 'gpt-5.5' } },
1717
* hitl: {
1818
* approvals: { beforeTool: ['delete-file'] },
1919
* handler: hitl.autoApprove(),

src/core/llm/providers/implementations/OpenAIProvider.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ namespace OpenAIAPITypes {
115115
finish_reason: string | null;
116116
logprobs?: unknown;
117117
}
118-
export interface ChatCompletionStreamResponse {
118+
export interface ChatCompletionStreamResponse extends StreamChunkExtras {
119119
id: string;
120120
object: string;
121121
created: number;
@@ -1252,8 +1252,8 @@ export class OpenAIProvider implements IProvider {
12521252
choices: [],
12531253
isFinal: true,
12541254
usage: usageOnlyUsage,
1255-
...(typeof (apiChunk as { service_tier?: string }).service_tier === 'string'
1256-
? { serviceTier: (apiChunk as { service_tier?: string }).service_tier }
1255+
...(typeof apiChunk.service_tier === 'string'
1256+
? { serviceTier: apiChunk.service_tier }
12571257
: {}),
12581258
};
12591259
}

0 commit comments

Comments
 (0)