1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
| import os
import rich
from openai import (
OpenAI,
)
from opentelemetry import trace
from opentelemetry.sdk.resources import Resource, SERVICE_NAME, SERVICE_VERSION
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import (BatchSpanProcessor, ConsoleSpanExporter)
from opentelemetry.sdk.trace.sampling import DEFAULT_ON
base_resource = Resource.create(attributes={SERVICE_NAME: "my-service", SERVICE_VERSION: "0.1.0"})
tracer_provider = TracerProvider(resource=base_resource, sampler=DEFAULT_ON)
otel_exporter = ConsoleSpanExporter()
span_processor = BatchSpanProcessor(otel_exporter)
tracer_provider.add_span_processor(span_processor)
# 可以初始化GRPC等其他类型的Remote采样导出器
# from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
# otlp_exporter = OTLPSpanExporter(endpoint="your-collector:4317", insecure=True)
# span_processor = BatchSpanProcessor(otlp_exporter)
# tracer_provider.add_span_processor(span_processor)
# 全局注册
trace.set_tracer_provider(tracer_provider)
# 如果要使用 V2 需要额外的配置,新版的otel有了日志的概念所以将event作为log的一部分,区别于V1中将日志存放于的SpanEvent
# v2 2.1b0 兼容到 1.30 ~ 1.35,1.36对log有改动,LogRecord 被标记为过时的
def instrument_v2():
# 与V1版本正好相反,V2 需主动打开详细日志监控,以免泄露敏感数据
os.environ["OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT"] = "true"
from opentelemetry import _events, _logs
from opentelemetry.sdk._logs import LoggerProvider
from opentelemetry.sdk._logs.export import ConsoleLogExporter, BatchLogRecordProcessor
from opentelemetry.sdk._events import EventLoggerProvider, EventLogger
_logs.set_logger_provider(LoggerProvider(resource=base_resource))
_logs.get_logger_provider().add_log_record_processor(BatchLogRecordProcessor(ConsoleLogExporter()))
_events.set_event_logger_provider(EventLoggerProvider())
from opentelemetry.instrumentation.openai_v2 import OpenAIInstrumentor
OpenAIInstrumentor().instrument()
def instrument_v1():
from opentelemetry.instrumentation.openai import OpenAIInstrumentor
OpenAIInstrumentor().instrument()
instrument_v1()
client = OpenAI(
api_key=os.getenv("QWEN_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
model="qwen-plus"
stream = client.chat.completions.create(
model=model,
temperature=0.3,
messages=[
{"role": "system", "content": "你是一名乐于助人的AI助手,请根据用户的问题给出回答."},
{"role": "user", "content": "你好"},
],
extra_body={
"enable_thinking": False,
},
stream=True,
)
for chunk in stream:
# rich.print(chunk, end="", flush=True)
print(chunk.choices[0].delta.content, end="", flush=True)
|