@azure-rest/ai-inference 1.0.0-beta.1 → 1.0.0-beta.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.
- package/README.md +123 -4
- package/dist/browser/clientDefinitions.d.ts +20 -2
- package/dist/browser/clientDefinitions.d.ts.map +1 -1
- package/dist/browser/clientDefinitions.js +1 -1
- package/dist/browser/clientDefinitions.js.map +1 -1
- package/dist/browser/constants.d.ts +2 -0
- package/dist/browser/constants.d.ts.map +1 -0
- package/dist/browser/constants.js +4 -0
- package/dist/browser/constants.js.map +1 -0
- package/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/isUnexpected.d.ts +3 -1
- package/dist/browser/isUnexpected.d.ts.map +1 -1
- package/dist/browser/isUnexpected.js +4 -3
- package/dist/browser/isUnexpected.js.map +1 -1
- package/dist/browser/logger.js +1 -1
- package/dist/browser/logger.js.map +1 -1
- package/dist/browser/modelClient.d.ts +6 -1
- package/dist/browser/modelClient.d.ts.map +1 -1
- package/dist/browser/modelClient.js +28 -7
- package/dist/browser/modelClient.js.map +1 -1
- package/dist/browser/models.d.ts +54 -39
- package/dist/browser/models.d.ts.map +1 -1
- package/dist/browser/models.js +1 -1
- package/dist/browser/models.js.map +1 -1
- package/dist/browser/outputModels.d.ts +48 -22
- package/dist/browser/outputModels.d.ts.map +1 -1
- package/dist/browser/outputModels.js +1 -1
- package/dist/browser/outputModels.js.map +1 -1
- package/dist/browser/parameters.d.ts +53 -4
- package/dist/browser/parameters.d.ts.map +1 -1
- package/dist/browser/parameters.js +1 -1
- package/dist/browser/parameters.js.map +1 -1
- package/dist/browser/responses.d.ts +29 -1
- package/dist/browser/responses.d.ts.map +1 -1
- package/dist/browser/responses.js +1 -1
- package/dist/browser/responses.js.map +1 -1
- package/dist/browser/tracingHelper.d.ts +9 -0
- package/dist/browser/tracingHelper.d.ts.map +1 -0
- package/dist/browser/tracingHelper.js +198 -0
- package/dist/browser/tracingHelper.js.map +1 -0
- package/dist/browser/tracingPolicy.d.ts +12 -0
- package/dist/browser/tracingPolicy.d.ts.map +1 -0
- package/dist/browser/tracingPolicy.js +68 -0
- package/dist/browser/tracingPolicy.js.map +1 -0
- package/dist/commonjs/clientDefinitions.d.ts +20 -2
- package/dist/commonjs/clientDefinitions.d.ts.map +1 -1
- package/dist/commonjs/clientDefinitions.js +1 -1
- package/dist/commonjs/clientDefinitions.js.map +1 -1
- package/dist/commonjs/constants.d.ts +2 -0
- package/dist/commonjs/constants.d.ts.map +1 -0
- package/dist/commonjs/constants.js +7 -0
- package/dist/commonjs/constants.js.map +1 -0
- package/dist/commonjs/index.js +1 -1
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/isUnexpected.d.ts +3 -1
- package/dist/commonjs/isUnexpected.d.ts.map +1 -1
- package/dist/commonjs/isUnexpected.js +5 -5
- package/dist/commonjs/isUnexpected.js.map +1 -1
- package/dist/commonjs/logger.js +1 -1
- package/dist/commonjs/logger.js.map +1 -1
- package/dist/commonjs/modelClient.d.ts +6 -1
- package/dist/commonjs/modelClient.d.ts.map +1 -1
- package/dist/commonjs/modelClient.js +28 -7
- package/dist/commonjs/modelClient.js.map +1 -1
- package/dist/commonjs/models.d.ts +54 -39
- package/dist/commonjs/models.d.ts.map +1 -1
- package/dist/commonjs/models.js +1 -1
- package/dist/commonjs/models.js.map +1 -1
- package/dist/commonjs/outputModels.d.ts +48 -22
- package/dist/commonjs/outputModels.d.ts.map +1 -1
- package/dist/commonjs/outputModels.js +1 -1
- package/dist/commonjs/outputModels.js.map +1 -1
- package/dist/commonjs/parameters.d.ts +53 -4
- package/dist/commonjs/parameters.d.ts.map +1 -1
- package/dist/commonjs/parameters.js +1 -1
- package/dist/commonjs/parameters.js.map +1 -1
- package/dist/commonjs/responses.d.ts +29 -1
- package/dist/commonjs/responses.d.ts.map +1 -1
- package/dist/commonjs/responses.js +1 -1
- package/dist/commonjs/responses.js.map +1 -1
- package/dist/commonjs/tracingHelper.d.ts +9 -0
- package/dist/commonjs/tracingHelper.d.ts.map +1 -0
- package/dist/commonjs/tracingHelper.js +205 -0
- package/dist/commonjs/tracingHelper.js.map +1 -0
- package/dist/commonjs/tracingPolicy.d.ts +12 -0
- package/dist/commonjs/tracingPolicy.d.ts.map +1 -0
- package/dist/commonjs/tracingPolicy.js +72 -0
- package/dist/commonjs/tracingPolicy.js.map +1 -0
- package/dist/commonjs/tsdoc-metadata.json +1 -1
- package/dist/esm/clientDefinitions.d.ts +20 -2
- package/dist/esm/clientDefinitions.d.ts.map +1 -1
- package/dist/esm/clientDefinitions.js +1 -1
- package/dist/esm/clientDefinitions.js.map +1 -1
- package/dist/esm/constants.d.ts +2 -0
- package/dist/esm/constants.d.ts.map +1 -0
- package/dist/esm/constants.js +4 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/isUnexpected.d.ts +3 -1
- package/dist/esm/isUnexpected.d.ts.map +1 -1
- package/dist/esm/isUnexpected.js +4 -3
- package/dist/esm/isUnexpected.js.map +1 -1
- package/dist/esm/logger.js +1 -1
- package/dist/esm/logger.js.map +1 -1
- package/dist/esm/modelClient.d.ts +6 -1
- package/dist/esm/modelClient.d.ts.map +1 -1
- package/dist/esm/modelClient.js +28 -7
- package/dist/esm/modelClient.js.map +1 -1
- package/dist/esm/models.d.ts +54 -39
- package/dist/esm/models.d.ts.map +1 -1
- package/dist/esm/models.js +1 -1
- package/dist/esm/models.js.map +1 -1
- package/dist/esm/outputModels.d.ts +48 -22
- package/dist/esm/outputModels.d.ts.map +1 -1
- package/dist/esm/outputModels.js +1 -1
- package/dist/esm/outputModels.js.map +1 -1
- package/dist/esm/parameters.d.ts +53 -4
- package/dist/esm/parameters.d.ts.map +1 -1
- package/dist/esm/parameters.js +1 -1
- package/dist/esm/parameters.js.map +1 -1
- package/dist/esm/responses.d.ts +29 -1
- package/dist/esm/responses.d.ts.map +1 -1
- package/dist/esm/responses.js +1 -1
- package/dist/esm/responses.js.map +1 -1
- package/dist/esm/tracingHelper.d.ts +9 -0
- package/dist/esm/tracingHelper.d.ts.map +1 -0
- package/dist/esm/tracingHelper.js +198 -0
- package/dist/esm/tracingHelper.js.map +1 -0
- package/dist/esm/tracingPolicy.d.ts +12 -0
- package/dist/esm/tracingPolicy.d.ts.map +1 -0
- package/dist/esm/tracingPolicy.js +68 -0
- package/dist/esm/tracingPolicy.js.map +1 -0
- package/dist/react-native/clientDefinitions.d.ts +20 -2
- package/dist/react-native/clientDefinitions.d.ts.map +1 -1
- package/dist/react-native/clientDefinitions.js +1 -1
- package/dist/react-native/clientDefinitions.js.map +1 -1
- package/dist/react-native/constants.d.ts +2 -0
- package/dist/react-native/constants.d.ts.map +1 -0
- package/dist/react-native/constants.js +4 -0
- package/dist/react-native/constants.js.map +1 -0
- package/dist/react-native/index.js +1 -1
- package/dist/react-native/index.js.map +1 -1
- package/dist/react-native/isUnexpected.d.ts +3 -1
- package/dist/react-native/isUnexpected.d.ts.map +1 -1
- package/dist/react-native/isUnexpected.js +4 -3
- package/dist/react-native/isUnexpected.js.map +1 -1
- package/dist/react-native/logger.js +1 -1
- package/dist/react-native/logger.js.map +1 -1
- package/dist/react-native/modelClient.d.ts +6 -1
- package/dist/react-native/modelClient.d.ts.map +1 -1
- package/dist/react-native/modelClient.js +28 -7
- package/dist/react-native/modelClient.js.map +1 -1
- package/dist/react-native/models.d.ts +54 -39
- package/dist/react-native/models.d.ts.map +1 -1
- package/dist/react-native/models.js +1 -1
- package/dist/react-native/models.js.map +1 -1
- package/dist/react-native/outputModels.d.ts +48 -22
- package/dist/react-native/outputModels.d.ts.map +1 -1
- package/dist/react-native/outputModels.js +1 -1
- package/dist/react-native/outputModels.js.map +1 -1
- package/dist/react-native/parameters.d.ts +53 -4
- package/dist/react-native/parameters.d.ts.map +1 -1
- package/dist/react-native/parameters.js +1 -1
- package/dist/react-native/parameters.js.map +1 -1
- package/dist/react-native/responses.d.ts +29 -1
- package/dist/react-native/responses.d.ts.map +1 -1
- package/dist/react-native/responses.js +1 -1
- package/dist/react-native/responses.js.map +1 -1
- package/dist/react-native/tracingHelper.d.ts +9 -0
- package/dist/react-native/tracingHelper.d.ts.map +1 -0
- package/dist/react-native/tracingHelper.js +198 -0
- package/dist/react-native/tracingHelper.js.map +1 -0
- package/dist/react-native/tracingPolicy.d.ts +12 -0
- package/dist/react-native/tracingPolicy.d.ts.map +1 -0
- package/dist/react-native/tracingPolicy.js +68 -0
- package/dist/react-native/tracingPolicy.js.map +1 -0
- package/package.json +26 -28
- package/CHANGELOG.md +0 -6
- package/review/ai-inference.api.md +0 -343
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/responses.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT
|
|
1
|
+
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/responses.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { RawHttpHeaders } from \"@azure/core-rest-pipeline\";\nimport { HttpResponse, ErrorResponse } from \"@azure-rest/core-client\";\nimport { ChatCompletionsOutput, ModelInfoOutput, EmbeddingsResultOutput } from \"./outputModels.js\";\n\n/** The request has succeeded. */\nexport interface GetChatCompletions200Response extends HttpResponse {\n status: \"200\";\n body: ChatCompletionsOutput;\n}\n\nexport interface GetChatCompletionsDefaultHeaders {\n /** String error code indicating what went wrong. */\n \"x-ms-error-code\"?: string;\n}\n\nexport interface GetChatCompletionsDefaultResponse extends HttpResponse {\n status: string;\n body: ErrorResponse;\n headers: RawHttpHeaders & GetChatCompletionsDefaultHeaders;\n}\n\n/** The request has succeeded. */\nexport interface GetModelInfo200Response extends HttpResponse {\n status: \"200\";\n body: ModelInfoOutput;\n}\n\nexport interface GetModelInfoDefaultHeaders {\n /** String error code indicating what went wrong. */\n \"x-ms-error-code\"?: string;\n}\n\nexport interface GetModelInfoDefaultResponse extends HttpResponse {\n status: string;\n body: ErrorResponse;\n headers: RawHttpHeaders & GetModelInfoDefaultHeaders;\n}\n\n/** The request has succeeded. */\nexport interface GetEmbeddings200Response extends HttpResponse {\n status: \"200\";\n body: EmbeddingsResultOutput;\n}\n\nexport interface GetEmbeddingsDefaultHeaders {\n /** String error code indicating what went wrong. */\n \"x-ms-error-code\"?: string;\n}\n\nexport interface GetEmbeddingsDefaultResponse extends HttpResponse {\n status: string;\n body: ErrorResponse;\n headers: RawHttpHeaders & GetEmbeddingsDefaultHeaders;\n}\n\n/** The request has succeeded. */\nexport interface GetImageEmbeddings200Response extends HttpResponse {\n status: \"200\";\n body: EmbeddingsResultOutput;\n}\n\nexport interface GetImageEmbeddingsDefaultHeaders {\n /** String error code indicating what went wrong. */\n \"x-ms-error-code\"?: string;\n}\n\nexport interface GetImageEmbeddingsDefaultResponse extends HttpResponse {\n status: string;\n body: ErrorResponse;\n headers: RawHttpHeaders & GetImageEmbeddingsDefaultHeaders;\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { TracingSpan } from "@azure/core-tracing";
|
|
2
|
+
import { GetChatCompletionsBodyParam } from "./parameters.js";
|
|
3
|
+
import { PipelineRequest, PipelineResponse } from "@azure/core-rest-pipeline";
|
|
4
|
+
export declare function getRequestBody(request: PipelineRequest): GetChatCompletionsBodyParam;
|
|
5
|
+
export declare function getSpanName(request: PipelineRequest): string;
|
|
6
|
+
export declare function onStartTracing(span: TracingSpan, request: PipelineRequest, url: string): void;
|
|
7
|
+
export declare function tryProcessResponse(span: TracingSpan, response?: PipelineResponse): void;
|
|
8
|
+
export declare function tryProcessError(span: TracingSpan, error: unknown): void;
|
|
9
|
+
//# sourceMappingURL=tracingHelper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracingHelper.d.ts","sourceRoot":"","sources":["../../src/tracingHelper.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAa9D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AA0B9E,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,2BAA2B,CAEpF;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAG5D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CA6B7F;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,CA4BvF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAKvE"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
import { isError } from "@azure/core-util";
|
|
4
|
+
const INFERENCE_GEN_AI_SYSTEM_NAME = "az.ai.inference";
|
|
5
|
+
const isContentRecordingEnabled = () => envVarToBoolean("AZURE_TRACING_GEN_AI_CONTENT_RECORDING_ENABLED");
|
|
6
|
+
var TracingAttributesEnum;
|
|
7
|
+
(function (TracingAttributesEnum) {
|
|
8
|
+
TracingAttributesEnum["Operation_Name"] = "gen_ai.operation.name";
|
|
9
|
+
TracingAttributesEnum["Request_Model"] = "gen_ai.request.model";
|
|
10
|
+
TracingAttributesEnum["System"] = "gen_ai.system";
|
|
11
|
+
TracingAttributesEnum["Error_Type"] = "error.type";
|
|
12
|
+
TracingAttributesEnum["Server_Port"] = "server.port";
|
|
13
|
+
TracingAttributesEnum["Request_Frequency_Penalty"] = "gen_ai.request.frequency_penalty";
|
|
14
|
+
TracingAttributesEnum["Request_Max_Tokens"] = "gen_ai.request.max_tokens";
|
|
15
|
+
TracingAttributesEnum["Request_Presence_Penalty"] = "gen_ai.request.presence_penalty";
|
|
16
|
+
TracingAttributesEnum["Request_Stop_Sequences"] = "gen_ai.request.stop_sequences";
|
|
17
|
+
TracingAttributesEnum["Request_Temperature"] = "gen_ai.request.temperature";
|
|
18
|
+
TracingAttributesEnum["Request_Top_P"] = "gen_ai.request.top_p";
|
|
19
|
+
TracingAttributesEnum["Response_Finish_Reasons"] = "gen_ai.response.finish_reasons";
|
|
20
|
+
TracingAttributesEnum["Response_Id"] = "gen_ai.response.id";
|
|
21
|
+
TracingAttributesEnum["Response_Model"] = "gen_ai.response.model";
|
|
22
|
+
TracingAttributesEnum["Usage_Input_Tokens"] = "gen_ai.usage.input_tokens";
|
|
23
|
+
TracingAttributesEnum["Usage_Output_Tokens"] = "gen_ai.usage.output_tokens";
|
|
24
|
+
TracingAttributesEnum["Server_Address"] = "server.address";
|
|
25
|
+
})(TracingAttributesEnum || (TracingAttributesEnum = {}));
|
|
26
|
+
export function getRequestBody(request) {
|
|
27
|
+
return { body: JSON.parse(request.body) };
|
|
28
|
+
}
|
|
29
|
+
export function getSpanName(request) {
|
|
30
|
+
var _a;
|
|
31
|
+
const { body } = getRequestBody(request);
|
|
32
|
+
return `chat ${(_a = body === null || body === void 0 ? void 0 : body.model) !== null && _a !== void 0 ? _a : ""}`.trim();
|
|
33
|
+
}
|
|
34
|
+
export function onStartTracing(span, request, url) {
|
|
35
|
+
if (!span.isRecording()) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const urlObj = new URL(url);
|
|
39
|
+
const port = Number(urlObj.port) || (urlObj.protocol === "https:" ? undefined : 80);
|
|
40
|
+
if (port) {
|
|
41
|
+
span.setAttribute(TracingAttributesEnum.Server_Port, port);
|
|
42
|
+
}
|
|
43
|
+
span.setAttribute(TracingAttributesEnum.Server_Address, urlObj.hostname);
|
|
44
|
+
span.setAttribute(TracingAttributesEnum.Operation_Name, "chat");
|
|
45
|
+
span.setAttribute(TracingAttributesEnum.System, "az.ai.inference");
|
|
46
|
+
const { body } = getRequestBody(request);
|
|
47
|
+
if (!body)
|
|
48
|
+
return;
|
|
49
|
+
span.setAttribute(TracingAttributesEnum.Request_Model, body.model);
|
|
50
|
+
span.setAttribute(TracingAttributesEnum.Request_Frequency_Penalty, body.frequency_penalty);
|
|
51
|
+
span.setAttribute(TracingAttributesEnum.Request_Max_Tokens, body.max_tokens);
|
|
52
|
+
span.setAttribute(TracingAttributesEnum.Request_Presence_Penalty, body.presence_penalty);
|
|
53
|
+
span.setAttribute(TracingAttributesEnum.Request_Stop_Sequences, body.stop);
|
|
54
|
+
span.setAttribute(TracingAttributesEnum.Request_Temperature, body.temperature);
|
|
55
|
+
span.setAttribute(TracingAttributesEnum.Request_Top_P, body.top_p);
|
|
56
|
+
if (body.messages) {
|
|
57
|
+
addRequestChatMessageEvent(span, body.messages);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function tryProcessResponse(span, response) {
|
|
61
|
+
var _a, _b, _c;
|
|
62
|
+
if (!span.isRecording()) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (response === null || response === void 0 ? void 0 : response.bodyAsText) {
|
|
66
|
+
const body = JSON.parse(response.bodyAsText);
|
|
67
|
+
if ((_a = body.error) !== null && _a !== void 0 ? _a : body.message) {
|
|
68
|
+
span.setAttribute(TracingAttributesEnum.Error_Type, `${(_b = body.status) !== null && _b !== void 0 ? _b : body.statusCode}`);
|
|
69
|
+
span.setStatus({
|
|
70
|
+
status: "error",
|
|
71
|
+
error: (_c = body.error) !== null && _c !== void 0 ? _c : body.message, // message is not in the schema of the response, but it can present if there is crediential error
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
span.setAttribute(TracingAttributesEnum.Response_Id, body.id);
|
|
75
|
+
span.setAttribute(TracingAttributesEnum.Response_Model, body.model);
|
|
76
|
+
if (body.choices) {
|
|
77
|
+
span.setAttribute(TracingAttributesEnum.Response_Finish_Reasons, body.choices.map((choice) => choice.finish_reason).join(","));
|
|
78
|
+
}
|
|
79
|
+
if (body.usage) {
|
|
80
|
+
span.setAttribute(TracingAttributesEnum.Usage_Input_Tokens, body.usage.prompt_tokens);
|
|
81
|
+
span.setAttribute(TracingAttributesEnum.Usage_Output_Tokens, body.usage.completion_tokens);
|
|
82
|
+
}
|
|
83
|
+
addResponseChatMessageEvent(span, body);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export function tryProcessError(span, error) {
|
|
87
|
+
span.setStatus({
|
|
88
|
+
status: "error",
|
|
89
|
+
error: isError(error) ? error : undefined,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/*
|
|
93
|
+
* Add event to span. Sample:
|
|
94
|
+
{
|
|
95
|
+
name: 'gen_ai.user.message',
|
|
96
|
+
attributes: {
|
|
97
|
+
'gen_ai.system': 'INFERENCE_GEN_AI_SYSTEM_NAME',
|
|
98
|
+
'gen_ai.event.content': `{"role":"user","content":"What's the weather like in Boston?"}`
|
|
99
|
+
},
|
|
100
|
+
time: [ 1725666879, 622695900 ],
|
|
101
|
+
droppedAttributesCount: 0
|
|
102
|
+
},
|
|
103
|
+
*/
|
|
104
|
+
function addRequestChatMessageEvent(span, messages) {
|
|
105
|
+
messages.forEach((message) => {
|
|
106
|
+
var _a;
|
|
107
|
+
if (message.role) {
|
|
108
|
+
const content = {};
|
|
109
|
+
const chatMsg = message;
|
|
110
|
+
if (chatMsg.content) {
|
|
111
|
+
content.content = chatMsg.content;
|
|
112
|
+
}
|
|
113
|
+
if (!isContentRecordingEnabled()) {
|
|
114
|
+
content.content = "";
|
|
115
|
+
}
|
|
116
|
+
const assistantMsg = message;
|
|
117
|
+
if (assistantMsg.tool_calls) {
|
|
118
|
+
content.tool_calls = assistantMsg.tool_calls;
|
|
119
|
+
if (!isContentRecordingEnabled()) {
|
|
120
|
+
const toolCalls = JSON.parse(JSON.stringify(content.tool_calls));
|
|
121
|
+
toolCalls.forEach((toolCall) => {
|
|
122
|
+
if (toolCall.function.arguments) {
|
|
123
|
+
toolCall.function.arguments = "";
|
|
124
|
+
}
|
|
125
|
+
toolCall.function.name = "";
|
|
126
|
+
});
|
|
127
|
+
content.tool_calls = toolCalls;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const toolMsg = message;
|
|
131
|
+
if (toolMsg.tool_call_id) {
|
|
132
|
+
content.id = toolMsg.tool_call_id;
|
|
133
|
+
}
|
|
134
|
+
(_a = span.addEvent) === null || _a === void 0 ? void 0 : _a.call(span, `gen_ai.${message.role}.message`, {
|
|
135
|
+
attributes: {
|
|
136
|
+
"gen_ai.system": INFERENCE_GEN_AI_SYSTEM_NAME,
|
|
137
|
+
"gen_ai.event.content": JSON.stringify(content),
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/*
|
|
144
|
+
* Add event to span. Sample:
|
|
145
|
+
{
|
|
146
|
+
name: 'gen_ai.choice',
|
|
147
|
+
attributes: {
|
|
148
|
+
'gen_ai.system': 'INFERENCE_GEN_AI_SYSTEM_NAME',
|
|
149
|
+
'gen_ai.event.content': '{"finish_reason":"tool_calls","index":0,"message":{"content":""}}'
|
|
150
|
+
},
|
|
151
|
+
time: [ 1725666881, 780608000 ],
|
|
152
|
+
droppedAttributesCount: 0
|
|
153
|
+
}
|
|
154
|
+
*/
|
|
155
|
+
function addResponseChatMessageEvent(span, body) {
|
|
156
|
+
var _a;
|
|
157
|
+
if (!span.addEvent) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
(_a = body === null || body === void 0 ? void 0 : body.choices) === null || _a === void 0 ? void 0 : _a.forEach((choice) => {
|
|
161
|
+
var _a;
|
|
162
|
+
let message = {};
|
|
163
|
+
if (choice.message.content) {
|
|
164
|
+
message.content = choice.message.content;
|
|
165
|
+
}
|
|
166
|
+
if (choice.message.tool_calls) {
|
|
167
|
+
message.toolCalls = choice.message.tool_calls;
|
|
168
|
+
}
|
|
169
|
+
if (!isContentRecordingEnabled()) {
|
|
170
|
+
message = JSON.parse(JSON.stringify(message));
|
|
171
|
+
message.content = "";
|
|
172
|
+
if (message.toolCalls) {
|
|
173
|
+
message.toolCalls.forEach((toolCall) => {
|
|
174
|
+
if (toolCall.function.arguments) {
|
|
175
|
+
toolCall.function.arguments = "";
|
|
176
|
+
}
|
|
177
|
+
toolCall.function.name = "";
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const response = {
|
|
182
|
+
finish_reason: choice.finish_reason,
|
|
183
|
+
index: choice.index,
|
|
184
|
+
message,
|
|
185
|
+
};
|
|
186
|
+
const attributes = {
|
|
187
|
+
"gen_ai.system": INFERENCE_GEN_AI_SYSTEM_NAME,
|
|
188
|
+
"gen_ai.event.content": JSON.stringify(response),
|
|
189
|
+
};
|
|
190
|
+
(_a = span.addEvent) === null || _a === void 0 ? void 0 : _a.call(span, "gen_ai.choice", { attributes });
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
function envVarToBoolean(key) {
|
|
194
|
+
var _a;
|
|
195
|
+
const value = (_a = process.env[key]) !== null && _a !== void 0 ? _a : process.env[key.toLowerCase()];
|
|
196
|
+
return value !== "false" && value !== "0" && Boolean(value);
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=tracingHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracingHelper.js","sourceRoot":"","sources":["../../src/tracingHelper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { TracingSpan } from \"@azure/core-tracing\";\nimport { GetChatCompletionsBodyParam } from \"./parameters.js\";\nimport {\n ChatRequestAssistantMessage,\n ChatRequestMessage,\n ChatRequestSystemMessage,\n ChatRequestToolMessage,\n} from \"./models.js\";\nimport {\n ChatChoiceOutput,\n ChatCompletionsOutput,\n ChatCompletionsToolCallOutput,\n} from \"./outputModels.js\";\nimport { isError } from \"@azure/core-util\";\nimport { PipelineRequest, PipelineResponse } from \"@azure/core-rest-pipeline\";\n\nconst INFERENCE_GEN_AI_SYSTEM_NAME = \"az.ai.inference\";\nconst isContentRecordingEnabled = () =>\n envVarToBoolean(\"AZURE_TRACING_GEN_AI_CONTENT_RECORDING_ENABLED\");\n\nenum TracingAttributesEnum {\n Operation_Name = \"gen_ai.operation.name\",\n Request_Model = \"gen_ai.request.model\",\n System = \"gen_ai.system\",\n Error_Type = \"error.type\",\n Server_Port = \"server.port\",\n Request_Frequency_Penalty = \"gen_ai.request.frequency_penalty\",\n Request_Max_Tokens = \"gen_ai.request.max_tokens\",\n Request_Presence_Penalty = \"gen_ai.request.presence_penalty\",\n Request_Stop_Sequences = \"gen_ai.request.stop_sequences\",\n Request_Temperature = \"gen_ai.request.temperature\",\n Request_Top_P = \"gen_ai.request.top_p\",\n Response_Finish_Reasons = \"gen_ai.response.finish_reasons\",\n Response_Id = \"gen_ai.response.id\",\n Response_Model = \"gen_ai.response.model\",\n Usage_Input_Tokens = \"gen_ai.usage.input_tokens\",\n Usage_Output_Tokens = \"gen_ai.usage.output_tokens\",\n Server_Address = \"server.address\",\n}\n\nexport function getRequestBody(request: PipelineRequest): GetChatCompletionsBodyParam {\n return { body: JSON.parse(request.body as string) };\n}\n\nexport function getSpanName(request: PipelineRequest): string {\n const { body } = getRequestBody(request);\n return `chat ${body?.model ?? \"\"}`.trim();\n}\n\nexport function onStartTracing(span: TracingSpan, request: PipelineRequest, url: string): void {\n if (!span.isRecording()) {\n return;\n }\n\n const urlObj = new URL(url);\n const port = Number(urlObj.port) || (urlObj.protocol === \"https:\" ? undefined : 80);\n\n if (port) {\n span.setAttribute(TracingAttributesEnum.Server_Port, port);\n }\n span.setAttribute(TracingAttributesEnum.Server_Address, urlObj.hostname);\n span.setAttribute(TracingAttributesEnum.Operation_Name, \"chat\");\n span.setAttribute(TracingAttributesEnum.System, \"az.ai.inference\");\n\n const { body } = getRequestBody(request);\n if (!body) return;\n\n span.setAttribute(TracingAttributesEnum.Request_Model, body.model);\n span.setAttribute(TracingAttributesEnum.Request_Frequency_Penalty, body.frequency_penalty);\n span.setAttribute(TracingAttributesEnum.Request_Max_Tokens, body.max_tokens);\n span.setAttribute(TracingAttributesEnum.Request_Presence_Penalty, body.presence_penalty);\n span.setAttribute(TracingAttributesEnum.Request_Stop_Sequences, body.stop);\n span.setAttribute(TracingAttributesEnum.Request_Temperature, body.temperature);\n span.setAttribute(TracingAttributesEnum.Request_Top_P, body.top_p);\n\n if (body.messages) {\n addRequestChatMessageEvent(span, body.messages);\n }\n}\n\nexport function tryProcessResponse(span: TracingSpan, response?: PipelineResponse): void {\n if (!span.isRecording()) {\n return;\n }\n\n if (response?.bodyAsText) {\n const body: any = JSON.parse(response.bodyAsText);\n if (body.error ?? body.message) {\n span.setAttribute(TracingAttributesEnum.Error_Type, `${body.status ?? body.statusCode}`);\n span.setStatus({\n status: \"error\",\n error: body.error ?? body.message, // message is not in the schema of the response, but it can present if there is crediential error\n });\n }\n span.setAttribute(TracingAttributesEnum.Response_Id, body.id);\n span.setAttribute(TracingAttributesEnum.Response_Model, body.model);\n if (body.choices) {\n span.setAttribute(\n TracingAttributesEnum.Response_Finish_Reasons,\n body.choices.map((choice: ChatChoiceOutput) => choice.finish_reason).join(\",\"),\n );\n }\n if (body.usage) {\n span.setAttribute(TracingAttributesEnum.Usage_Input_Tokens, body.usage.prompt_tokens);\n span.setAttribute(TracingAttributesEnum.Usage_Output_Tokens, body.usage.completion_tokens);\n }\n addResponseChatMessageEvent(span, body);\n }\n}\n\nexport function tryProcessError(span: TracingSpan, error: unknown): void {\n span.setStatus({\n status: \"error\",\n error: isError(error) ? error : undefined,\n });\n}\n\n/*\n* Add event to span. Sample:\n {\n name: 'gen_ai.user.message',\n attributes: {\n 'gen_ai.system': 'INFERENCE_GEN_AI_SYSTEM_NAME',\n 'gen_ai.event.content': `{\"role\":\"user\",\"content\":\"What's the weather like in Boston?\"}` \n },\n time: [ 1725666879, 622695900 ],\n droppedAttributesCount: 0\n },\n*/\nfunction addRequestChatMessageEvent(span: TracingSpan, messages: Array<ChatRequestMessage>): void {\n messages.forEach((message: any) => {\n if (message.role) {\n const content: {\n content?: string;\n tool_calls?: Array<ChatCompletionsToolCallOutput>;\n id?: string;\n } = {};\n\n const chatMsg = message as ChatRequestSystemMessage;\n if (chatMsg.content) {\n content.content = chatMsg.content;\n }\n if (!isContentRecordingEnabled()) {\n content.content = \"\";\n }\n\n const assistantMsg = message as ChatRequestAssistantMessage;\n if (assistantMsg.tool_calls) {\n content.tool_calls = assistantMsg.tool_calls;\n if (!isContentRecordingEnabled()) {\n const toolCalls: Array<ChatCompletionsToolCallOutput> = JSON.parse(\n JSON.stringify(content.tool_calls),\n );\n toolCalls.forEach((toolCall) => {\n if (toolCall.function.arguments) {\n toolCall.function.arguments = \"\";\n }\n toolCall.function.name = \"\";\n });\n content.tool_calls = toolCalls;\n }\n }\n\n const toolMsg: ChatRequestToolMessage = message;\n if (toolMsg.tool_call_id) {\n content.id = toolMsg.tool_call_id;\n }\n\n span.addEvent?.(`gen_ai.${message.role}.message`, {\n attributes: {\n \"gen_ai.system\": INFERENCE_GEN_AI_SYSTEM_NAME,\n \"gen_ai.event.content\": JSON.stringify(content),\n },\n });\n }\n });\n}\n\n/*\n* Add event to span. Sample:\n{\n name: 'gen_ai.choice',\n attributes: {\n 'gen_ai.system': 'INFERENCE_GEN_AI_SYSTEM_NAME',\n 'gen_ai.event.content': '{\"finish_reason\":\"tool_calls\",\"index\":0,\"message\":{\"content\":\"\"}}'\n },\n time: [ 1725666881, 780608000 ],\n droppedAttributesCount: 0\n} \n*/\nfunction addResponseChatMessageEvent(span: TracingSpan, body: ChatCompletionsOutput): void {\n if (!span.addEvent) {\n return;\n }\n\n body?.choices?.forEach((choice: ChatChoiceOutput) => {\n let message: { content?: string; toolCalls?: Array<ChatCompletionsToolCallOutput> } = {};\n\n if (choice.message.content) {\n message.content = choice.message.content;\n }\n if (choice.message.tool_calls) {\n message.toolCalls = choice.message.tool_calls;\n }\n\n if (!isContentRecordingEnabled()) {\n message = JSON.parse(JSON.stringify(message));\n message.content = \"\";\n if (message.toolCalls) {\n message.toolCalls.forEach((toolCall) => {\n if (toolCall.function.arguments) {\n toolCall.function.arguments = \"\";\n }\n toolCall.function.name = \"\";\n });\n }\n }\n\n const response = {\n finish_reason: choice.finish_reason,\n index: choice.index,\n message,\n };\n const attributes = {\n \"gen_ai.system\": INFERENCE_GEN_AI_SYSTEM_NAME,\n \"gen_ai.event.content\": JSON.stringify(response),\n };\n\n span.addEvent?.(\"gen_ai.choice\", { attributes });\n });\n}\n\nfunction envVarToBoolean(key: string): boolean {\n const value = process.env[key] ?? process.env[key.toLowerCase()];\n return value !== \"false\" && value !== \"0\" && Boolean(value);\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PipelinePolicy } from "@azure/core-rest-pipeline";
|
|
2
|
+
/**
|
|
3
|
+
* The programmatic identifier of the tracingPolicy.
|
|
4
|
+
*/
|
|
5
|
+
export declare const tracingPolicyName = "inferenceTracingPolicy";
|
|
6
|
+
/**
|
|
7
|
+
* A simple policy to create OpenTelemetry Spans for each request made by the pipeline
|
|
8
|
+
* that has SpanOptions with a parent.
|
|
9
|
+
* Requests made without a parent Span will not be recorded.
|
|
10
|
+
*/
|
|
11
|
+
export declare function tracingPolicy(): PipelinePolicy;
|
|
12
|
+
//# sourceMappingURL=tracingPolicy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracingPolicy.d.ts","sourceRoot":"","sources":["../../src/tracingPolicy.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,cAAc,EAIf,MAAM,2BAA2B,CAAC;AAGnC;;GAEG;AACH,eAAO,MAAM,iBAAiB,2BAA2B,CAAC;AAE1D;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,cAAc,CAyC9C"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
import { createTracingClient, } from "@azure/core-tracing";
|
|
4
|
+
import { logger } from "./logger.js";
|
|
5
|
+
import { getErrorMessage } from "@azure/core-util";
|
|
6
|
+
import { tryProcessResponse, onStartTracing, tryProcessError, getSpanName, getRequestBody, } from "./tracingHelper.js";
|
|
7
|
+
import { SDK_VERSION } from "./constants.js";
|
|
8
|
+
/**
|
|
9
|
+
* The programmatic identifier of the tracingPolicy.
|
|
10
|
+
*/
|
|
11
|
+
export const tracingPolicyName = "inferenceTracingPolicy";
|
|
12
|
+
/**
|
|
13
|
+
* A simple policy to create OpenTelemetry Spans for each request made by the pipeline
|
|
14
|
+
* that has SpanOptions with a parent.
|
|
15
|
+
* Requests made without a parent Span will not be recorded.
|
|
16
|
+
*/
|
|
17
|
+
export function tracingPolicy() {
|
|
18
|
+
const tracingClient = createTracingClient({
|
|
19
|
+
namespace: "Microsoft.CognitiveServices",
|
|
20
|
+
packageName: "@azure/ai-inference-rest",
|
|
21
|
+
packageVersion: SDK_VERSION,
|
|
22
|
+
});
|
|
23
|
+
return {
|
|
24
|
+
name: tracingPolicyName,
|
|
25
|
+
async sendRequest(request, next) {
|
|
26
|
+
var _a, _b, _c, _d;
|
|
27
|
+
const url = new URL(request.url);
|
|
28
|
+
if (!tracingClient ||
|
|
29
|
+
!url.href.endsWith("/chat/completions") ||
|
|
30
|
+
((_b = (_a = getRequestBody(request)) === null || _a === void 0 ? void 0 : _a.body) === null || _b === void 0 ? void 0 : _b.stream)) {
|
|
31
|
+
return next(request);
|
|
32
|
+
}
|
|
33
|
+
const { span, tracingContext } = (_c = tryCreateSpan(tracingClient, request)) !== null && _c !== void 0 ? _c : {};
|
|
34
|
+
if (!span || !tracingContext) {
|
|
35
|
+
return next(request);
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
(_d = request.tracingOptions) !== null && _d !== void 0 ? _d : (request.tracingOptions = {});
|
|
39
|
+
request.tracingOptions.tracingContext = tracingContext;
|
|
40
|
+
onStartTracing(span, request, request.url);
|
|
41
|
+
const response = await tracingClient.withContext(tracingContext, next, request);
|
|
42
|
+
tryProcessResponse(span, response);
|
|
43
|
+
return response;
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
tryProcessError(span, err);
|
|
47
|
+
throw err;
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
span.end();
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function tryCreateSpan(tracingClient, request) {
|
|
56
|
+
try {
|
|
57
|
+
// As per spec, we do not need to differentiate between HTTP and HTTPS in span name.
|
|
58
|
+
const { span, updatedOptions } = tracingClient.startSpan(getSpanName(request), { tracingOptions: request.tracingOptions }, {
|
|
59
|
+
spanKind: "client",
|
|
60
|
+
});
|
|
61
|
+
return { span, tracingContext: updatedOptions.tracingOptions.tracingContext };
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
logger.warning(`Skipping creating a tracing span due to an error: ${getErrorMessage(e)}`);
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=tracingPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracingPolicy.js","sourceRoot":"","sources":["../../src/tracingPolicy.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAIL,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,WAAW,EACX,cAAc,GACf,MAAM,oBAAoB,CAAC;AAO5B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,aAAa,GAAG,mBAAmB,CAAC;QACxC,SAAS,EAAE,6BAA6B;QACxC,WAAW,EAAE,0BAA0B;QACvC,cAAc,EAAE,WAAW;KAC5B,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,KAAK,CAAC,WAAW,CAAC,OAAwB,EAAE,IAAiB;;YAC3D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,IACE,CAAC,aAAa;gBACd,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC;iBACvC,MAAA,MAAA,cAAc,CAAC,OAAO,CAAC,0CAAE,IAAI,0CAAE,MAAM,CAAA,EACrC,CAAC;gBACD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,MAAA,aAAa,CAAC,aAAa,EAAE,OAAO,CAAC,mCAAI,EAAE,CAAC;YAE7E,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YAED,IAAI,CAAC;gBACH,MAAA,OAAO,CAAC,cAAc,oCAAtB,OAAO,CAAC,cAAc,GAAK,EAAE,EAAC;gBAC9B,OAAO,CAAC,cAAc,CAAC,cAAc,GAAG,cAAc,CAAC;gBAEvD,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC3C,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;gBAChF,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACnC,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC3B,MAAM,GAAG,CAAC;YACZ,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,aAA4B,EAC5B,OAAwB;IAExB,IAAI,CAAC;QACH,oFAAoF;QACpF,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,aAAa,CAAC,SAAS,CACtD,WAAW,CAAC,OAAO,CAAC,EACpB,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,EAC1C;YACE,QAAQ,EAAE,QAAQ;SACnB,CACF,CAAC;QAEF,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,cAAc,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;IAChF,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,qDAAqD,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1F,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport {\n type TracingClient,\n type TracingContext,\n type TracingSpan,\n createTracingClient,\n} from \"@azure/core-tracing\";\nimport { logger } from \"./logger.js\";\nimport { getErrorMessage } from \"@azure/core-util\";\nimport {\n tryProcessResponse,\n onStartTracing,\n tryProcessError,\n getSpanName,\n getRequestBody,\n} from \"./tracingHelper.js\";\nimport {\n PipelinePolicy,\n PipelineRequest,\n PipelineResponse,\n SendRequest,\n} from \"@azure/core-rest-pipeline\";\nimport { SDK_VERSION } from \"./constants.js\";\n\n/**\n * The programmatic identifier of the tracingPolicy.\n */\nexport const tracingPolicyName = \"inferenceTracingPolicy\";\n\n/**\n * A simple policy to create OpenTelemetry Spans for each request made by the pipeline\n * that has SpanOptions with a parent.\n * Requests made without a parent Span will not be recorded.\n */\nexport function tracingPolicy(): PipelinePolicy {\n const tracingClient = createTracingClient({\n namespace: \"Microsoft.CognitiveServices\",\n packageName: \"@azure/ai-inference-rest\",\n packageVersion: SDK_VERSION,\n });\n\n return {\n name: tracingPolicyName,\n async sendRequest(request: PipelineRequest, next: SendRequest): Promise<PipelineResponse> {\n const url = new URL(request.url);\n if (\n !tracingClient ||\n !url.href.endsWith(\"/chat/completions\") ||\n getRequestBody(request)?.body?.stream\n ) {\n return next(request);\n }\n\n const { span, tracingContext } = tryCreateSpan(tracingClient, request) ?? {};\n\n if (!span || !tracingContext) {\n return next(request);\n }\n\n try {\n request.tracingOptions ??= {};\n request.tracingOptions.tracingContext = tracingContext;\n\n onStartTracing(span, request, request.url);\n const response = await tracingClient.withContext(tracingContext, next, request);\n tryProcessResponse(span, response);\n return response;\n } catch (err: any) {\n tryProcessError(span, err);\n throw err;\n } finally {\n span.end();\n }\n },\n };\n}\n\nfunction tryCreateSpan(\n tracingClient: TracingClient,\n request: PipelineRequest,\n): { span: TracingSpan; tracingContext: TracingContext } | undefined {\n try {\n // As per spec, we do not need to differentiate between HTTP and HTTPS in span name.\n const { span, updatedOptions } = tracingClient.startSpan(\n getSpanName(request),\n { tracingOptions: request.tracingOptions },\n {\n spanKind: \"client\",\n },\n );\n\n return { span, tracingContext: updatedOptions.tracingOptions.tracingContext };\n } catch (e: any) {\n logger.warning(`Skipping creating a tracing span due to an error: ${getErrorMessage(e)}`);\n return undefined;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,27 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@azure-rest/ai-inference",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.3",
|
|
4
4
|
"description": "Inference API for Azure-supported AI models",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./package.json": "./package.json",
|
|
7
7
|
".": {
|
|
8
8
|
"browser": {
|
|
9
|
-
"source": "./src/index.ts",
|
|
10
9
|
"types": "./dist/browser/index.d.ts",
|
|
11
10
|
"default": "./dist/browser/index.js"
|
|
12
11
|
},
|
|
13
12
|
"react-native": {
|
|
14
|
-
"source": "./src/index.ts",
|
|
15
13
|
"types": "./dist/react-native/index.d.ts",
|
|
16
14
|
"default": "./dist/react-native/index.js"
|
|
17
15
|
},
|
|
18
16
|
"import": {
|
|
19
|
-
"source": "./src/index.ts",
|
|
20
17
|
"types": "./dist/esm/index.d.ts",
|
|
21
18
|
"default": "./dist/esm/index.js"
|
|
22
19
|
},
|
|
23
20
|
"require": {
|
|
24
|
-
"source": "./src/index.ts",
|
|
25
21
|
"types": "./dist/commonjs/index.d.ts",
|
|
26
22
|
"default": "./dist/commonjs/index.js"
|
|
27
23
|
}
|
|
@@ -47,12 +43,8 @@
|
|
|
47
43
|
"type": "module",
|
|
48
44
|
"files": [
|
|
49
45
|
"dist/",
|
|
50
|
-
"dist/esm/",
|
|
51
|
-
"/dist/commonjs/index.d.ts",
|
|
52
46
|
"README.md",
|
|
53
|
-
"
|
|
54
|
-
"LICENSE",
|
|
55
|
-
"review/*"
|
|
47
|
+
"LICENSE"
|
|
56
48
|
],
|
|
57
49
|
"engines": {
|
|
58
50
|
"node": ">=18.0.0"
|
|
@@ -90,59 +82,65 @@
|
|
|
90
82
|
"@azure/core-auth": "^1.7.2",
|
|
91
83
|
"@azure/core-lro": "^2.6.0",
|
|
92
84
|
"@azure/core-rest-pipeline": "^1.14.0",
|
|
85
|
+
"@azure/core-tracing": "^1.2.0",
|
|
93
86
|
"@azure/logger": "^1.0.0",
|
|
94
87
|
"tslib": "^2.6.2"
|
|
95
88
|
},
|
|
96
89
|
"devDependencies": {
|
|
97
|
-
"@azure-tools/test-credential": "^
|
|
90
|
+
"@azure-tools/test-credential": "^2.0.0",
|
|
98
91
|
"@azure-tools/test-recorder": "^4.0.0",
|
|
99
92
|
"@azure/core-sse": "^2.1.3",
|
|
100
93
|
"@azure/core-util": "^1.9.0",
|
|
101
94
|
"@azure/dev-tool": "^1.0.0",
|
|
95
|
+
"@azure/eslint-plugin-azure-sdk": "^3.0.0",
|
|
102
96
|
"@azure/identity": "^4.3.0",
|
|
103
97
|
"@microsoft/api-extractor": "^7.47.0",
|
|
98
|
+
"@opentelemetry/api": "^1.9.0",
|
|
104
99
|
"@types/node": "^18.0.0",
|
|
105
|
-
"@vitest/browser": "^
|
|
106
|
-
"@vitest/coverage-istanbul": "^
|
|
100
|
+
"@vitest/browser": "^2.0.5",
|
|
101
|
+
"@vitest/coverage-istanbul": "^2.0.5",
|
|
107
102
|
"autorest": "latest",
|
|
108
103
|
"cross-env": "7.0.3",
|
|
109
104
|
"dotenv": "^16.4.5",
|
|
105
|
+
"eslint": "^9.9.0",
|
|
110
106
|
"mkdirp": "^3.0.1",
|
|
111
107
|
"playwright": "^1.41.2",
|
|
112
108
|
"rimraf": "^5.0.5",
|
|
113
109
|
"source-map-support": "^0.5.9",
|
|
114
|
-
"
|
|
115
|
-
"
|
|
116
|
-
"vitest": "^1.3.1"
|
|
110
|
+
"typescript": "~5.6.2",
|
|
111
|
+
"vitest": "^2.0.5"
|
|
117
112
|
},
|
|
118
113
|
"scripts": {
|
|
119
114
|
"audit": "node ../../../common/scripts/rush-audit.js && rimraf node_modules package-lock.json && npm i --package-lock-only 2>&1 && npm audit",
|
|
115
|
+
"build": "npm run clean && dev-tool run build-package && mkdirp ./review && dev-tool run extract-api",
|
|
120
116
|
"build:samples": "echo Obsolete",
|
|
121
|
-
"
|
|
117
|
+
"build:test": "npm run clean && dev-tool run build-package && dev-tool run build-test",
|
|
122
118
|
"check-format": "echo skipped",
|
|
123
119
|
"clean": "rimraf --glob dist dist-* test-dist temp types *.tgz *.log",
|
|
124
120
|
"execute:samples": "dev-tool samples run samples-dev",
|
|
125
121
|
"extract-api": "rimraf review && mkdirp ./review && dev-tool run extract-api",
|
|
126
|
-
"format": "
|
|
122
|
+
"format": "dev-tool run vendored prettier --write --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"samples-dev/**/*.ts\" \"*.{js,json}\"",
|
|
123
|
+
"generate": "rimraf ./src/generated && mkdirp ./src/generated && cp tsp-location.yaml ./src/generated && tsp-client update -o ./src/generated && rimraf ./src/generated/tsp-location.yaml",
|
|
124
|
+
"integration-test": "npm run integration-test:node && npm run integration-test:browser",
|
|
127
125
|
"integration-test:browser": "npm run unit-test:browser",
|
|
128
126
|
"integration-test:node": "echo skipped",
|
|
129
|
-
"
|
|
130
|
-
"lint:fix": "
|
|
131
|
-
"lint": "echo skipped",
|
|
127
|
+
"lint": "eslint package.json api-extractor.json src test",
|
|
128
|
+
"lint:fix": "eslint package.json api-extractor.json src test --fix --fix-type [problem,suggestion]",
|
|
132
129
|
"pack": "npm pack 2>&1",
|
|
130
|
+
"test": "npm run clean && dev-tool run build-package && npm run unit-test:node && dev-tool run bundle && npm run unit-test:browser && npm run integration-test",
|
|
133
131
|
"test:browser": "npm run clean && npm run unit-test:browser && npm run integration-test:browser",
|
|
132
|
+
"test:node": "npm run clean && dev-tool run build-package && npm run unit-test:node && npm run integration-test:node",
|
|
133
|
+
"unit-test": "npm run unit-test:node && npm run unit-test:browser",
|
|
134
134
|
"unit-test:browser": "npm run clean && dev-tool run build-test && dev-tool run test:vitest --browser --hookTimeout=50000",
|
|
135
135
|
"unit-test:node": "dev-tool run test:vitest --hookTimeout=50000",
|
|
136
|
-
"
|
|
137
|
-
"build:test": "npm run clean && tshy && dev-tool run build-test",
|
|
138
|
-
"build": "npm run clean && tshy && mkdirp ./review && dev-tool run extract-api",
|
|
139
|
-
"test:node": "npm run clean && tshy && npm run unit-test:node && npm run integration-test:node",
|
|
140
|
-
"test": "npm run clean && tshy && npm run unit-test:node && dev-tool run bundle && npm run unit-test:browser && npm run integration-test"
|
|
136
|
+
"update-snippets": "echo skipped"
|
|
141
137
|
},
|
|
142
138
|
"//sampleConfiguration": {
|
|
143
139
|
"productName": "Azure AI Inference",
|
|
144
140
|
"productSlugs": [
|
|
145
141
|
"azure"
|
|
146
|
-
]
|
|
147
|
-
|
|
142
|
+
],
|
|
143
|
+
"apiRefLink": "https://learn.microsoft.com/javascript/api/@azure-rest/ai-inference"
|
|
144
|
+
},
|
|
145
|
+
"module": "./dist/esm/index.js"
|
|
148
146
|
}
|