Fix the bug causing errors in the GPT channel when using the Wu API.
Browse files- request.py +2 -1
- test/aws-boto3.py +24 -0
- test/aws.py +90 -0
request.py
CHANGED
@@ -118,9 +118,10 @@ async def get_gemini_payload(request, engine, provider):
|
|
118 |
|
119 |
async def get_gpt_payload(request, engine, provider):
|
120 |
headers = {
|
121 |
-
'Authorization': f"Bearer {provider['api']}",
|
122 |
'Content-Type': 'application/json'
|
123 |
}
|
|
|
|
|
124 |
url = provider['base_url']
|
125 |
|
126 |
messages = []
|
|
|
118 |
|
119 |
async def get_gpt_payload(request, engine, provider):
|
120 |
headers = {
|
|
|
121 |
'Content-Type': 'application/json'
|
122 |
}
|
123 |
+
if provider.get("api"):
|
124 |
+
headers['Authorization'] = f"Bearer {provider['api']}"
|
125 |
url = provider['base_url']
|
126 |
|
127 |
messages = []
|
test/aws-boto3.py
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import boto3
|
2 |
+
import json
|
3 |
+
import os
|
4 |
+
|
5 |
+
AWS_ACCESS_KEY = os.environ.get('AWS_ACCESS_KEY')
|
6 |
+
AWS_SECRET_KEY = os.environ.get('AWS_SECRET_KEY')
|
7 |
+
|
8 |
+
bedrock = boto3.client(
|
9 |
+
service_name="bedrock-runtime",
|
10 |
+
region_name="us-east-1",
|
11 |
+
aws_access_key_id=AWS_ACCESS_KEY,
|
12 |
+
aws_secret_access_key=AWS_SECRET_KEY
|
13 |
+
)
|
14 |
+
|
15 |
+
body = json.dumps({
|
16 |
+
"max_tokens": 4096,
|
17 |
+
"messages": [{"role": "user", "content": "Hello, world"}],
|
18 |
+
"anthropic_version": "bedrock-2023-05-31"
|
19 |
+
})
|
20 |
+
|
21 |
+
response = bedrock.invoke_model(body=body, modelId="anthropic.claude-3-5-sonnet-20240620-v1:0")
|
22 |
+
|
23 |
+
response_body = json.loads(response.get("body").read())
|
24 |
+
print(response_body.get("content"))
|
test/aws.py
ADDED
@@ -0,0 +1,90 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import httpx
|
2 |
+
import json
|
3 |
+
from datetime import datetime
|
4 |
+
import hashlib
|
5 |
+
import hmac
|
6 |
+
import base64
|
7 |
+
import os
|
8 |
+
|
9 |
+
# AWS凭证和配置
|
10 |
+
AWS_ACCESS_KEY = os.environ.get('AWS_ACCESS_KEY')
|
11 |
+
AWS_SECRET_KEY = os.environ.get('AWS_SECRET_KEY')
|
12 |
+
REGION = 'us-east-1'
|
13 |
+
SERVICE = 'bedrock'
|
14 |
+
ENDPOINT = f'https://bedrock-runtime.{REGION}.amazonaws.com'
|
15 |
+
|
16 |
+
# 辅助函数用于生成AWS SigV4签名
|
17 |
+
def sign(key, msg):
|
18 |
+
return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()
|
19 |
+
|
20 |
+
def getSignatureKey(key, dateStamp, regionName, serviceName):
|
21 |
+
kDate = sign(('AWS4' + key).encode('utf-8'), dateStamp)
|
22 |
+
kRegion = sign(kDate, regionName)
|
23 |
+
kService = sign(kRegion, serviceName)
|
24 |
+
kSigning = sign(kService, 'aws4_request')
|
25 |
+
return kSigning
|
26 |
+
|
27 |
+
def create_authorization_header(method, url, payload, headers):
|
28 |
+
t = datetime.utcnow()
|
29 |
+
amzdate = t.strftime('%Y%m%dT%H%M%SZ')
|
30 |
+
datestamp = t.strftime('%Y%m%d')
|
31 |
+
|
32 |
+
canonical_uri = url.split(ENDPOINT)[1]
|
33 |
+
canonical_querystring = ''
|
34 |
+
canonical_headers = '\n'.join([f"{h.lower()}:{headers[h]}" for h in sorted(headers)]) + '\n'
|
35 |
+
signed_headers = ';'.join([h.lower() for h in sorted(headers)])
|
36 |
+
payload_hash = hashlib.sha256(payload.encode('utf-8')).hexdigest()
|
37 |
+
|
38 |
+
canonical_request = f"{method}\n{canonical_uri}\n{canonical_querystring}\n{canonical_headers}\n{signed_headers}\n{payload_hash}"
|
39 |
+
|
40 |
+
algorithm = 'AWS4-HMAC-SHA256'
|
41 |
+
credential_scope = f"{datestamp}/{REGION}/{SERVICE}/aws4_request"
|
42 |
+
string_to_sign = f"{algorithm}\n{amzdate}\n{credential_scope}\n{hashlib.sha256(canonical_request.encode('utf-8')).hexdigest()}"
|
43 |
+
|
44 |
+
signing_key = getSignatureKey(AWS_SECRET_KEY, datestamp, REGION, SERVICE)
|
45 |
+
signature = hmac.new(signing_key, string_to_sign.encode('utf-8'), hashlib.sha256).hexdigest()
|
46 |
+
|
47 |
+
authorization_header = (
|
48 |
+
f"{algorithm} "
|
49 |
+
f"Credential={AWS_ACCESS_KEY}/{credential_scope}, "
|
50 |
+
f"SignedHeaders={signed_headers}, "
|
51 |
+
f"Signature={signature}"
|
52 |
+
)
|
53 |
+
|
54 |
+
return authorization_header
|
55 |
+
|
56 |
+
# 主函数
|
57 |
+
def invoke_bedrock_model():
|
58 |
+
url = f"{ENDPOINT}/model/anthropic.claude-3-sonnet-20240229-v1:0/invoke"
|
59 |
+
|
60 |
+
payload = json.dumps({
|
61 |
+
"max_tokens": 256,
|
62 |
+
"messages": [{"role": "user", "content": "Hello, world"}],
|
63 |
+
"anthropic_version": "bedrock-2023-05-31"
|
64 |
+
})
|
65 |
+
|
66 |
+
t = datetime.utcnow()
|
67 |
+
amzdate = t.strftime('%Y%m%dT%H%M%SZ')
|
68 |
+
|
69 |
+
headers = {
|
70 |
+
'Content-Type': 'application/json',
|
71 |
+
'Accept': 'application/json',
|
72 |
+
'X-Amz-Date': amzdate,
|
73 |
+
'Host': f'bedrock-runtime.{REGION}.amazonaws.com'
|
74 |
+
}
|
75 |
+
|
76 |
+
authorization_header = create_authorization_header('POST', url, payload, headers)
|
77 |
+
headers['Authorization'] = authorization_header
|
78 |
+
|
79 |
+
with httpx.Client() as client:
|
80 |
+
response = client.post(url, headers=headers, data=payload)
|
81 |
+
|
82 |
+
if response.status_code == 200:
|
83 |
+
response_body = response.json()
|
84 |
+
print(response_body.get("content"))
|
85 |
+
else:
|
86 |
+
print(f"Error: {response.status_code}")
|
87 |
+
print(response.text)
|
88 |
+
|
89 |
+
# 运行函数
|
90 |
+
invoke_bedrock_model()
|