response000/apis
0
1from os import getenv2from fastapi import FastAPI, Form, HTTPException, Request3from fastapi.responses import PlainTextResponse4from starlette.responses import StreamingResponse, Response5 6import requests7 8from json import dumps9from tencentcloud.common.credential import Credential10from tencentcloud.common.profile.client_profile import ClientProfile11from tencentcloud.common.profile.http_profile import HttpProfile12from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException13from tencentcloud.tmt.v20180321.tmt_client import TmtClient14from tencentcloud.tmt.v20180321.models import TextTranslateRequest15 16app = FastAPI()17 18# 创建全局 Session 以复用连接池19session = requests.Session()20 21DN_DEFAULT = "response000-apis.hf.space"22 23# 逐段传输头 (Hop-by-hop headers),根据 RFC 2616 应当被过滤24EXCLUDED_HEADERS = {25 'content-encoding', 'content-length', 'transfer-encoding', 'connection',26 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailers'27}28 29@app.get("/")30def read_root():31 return {"message": "hello Huggingface!apis"}32 33@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"])34async def forward(request: Request, path: str):35 36 # 获取 query 参数37 params = dict(request.query_params)38 dn = params.get('dn', DN_DEFAULT)39 40 url = f'https://{dn}/{path}'41 42 # 准备转发的 Headers43 headers = {k: v for k, v in request.headers.items() 44 if k.lower() not in EXCLUDED_HEADERS and k.lower() != 'host'}45 headers['Host'] = dn46 47 # 获取请求体48 body = await request.body()49 50 try:51 # 发起流式请求52 resp = session.request(53 method=request.method,54 url=url,55 params=params,56 headers=headers,57 data=body,58 cookies=request.cookies,59 allow_redirects=False,60 stream=True,61 timeout=(5, 60)62 )63 64 # 过滤响应头65 resp_headers = [66 (name, value) for name, value in resp.raw.headers.items()67 if name.lower() not in EXCLUDED_HEADERS68 ]69 70 resp.raw.decode_content = True71 return StreamingResponse(72 resp.raw,73 status_code=resp.status_code,74 headers=dict(resp_headers),75 media_type=resp.headers.get("Content-Type")76 )77 78 # 返回流式响应79 # return StreamingResponse(80 # resp.iter_content(chunk_size=16384),81 # status_code=resp.status_code,82 # headers=dict(resp_headers)83 # )84 85 except requests.exceptions.RequestException as e:86 print(f"Proxy Error: {e}")87 return Response(f"Proxy Error: {str(e)}", status_code=502)88 89@app.post("/translate")90def translate(91 txt: str = Form(...),92 source: str = Form(...),93 target: str = Form(...),94):95 ret = ''96 try:97 if txt:98 # API Exploer API在线调试: https://console.cloud.tencent.com/api/explorer?Product=tmt&Version=2018-03-21&Action=TextTranslate99 # 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密100 # 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305101 # 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取102 cred = Credential(getenv('SECRET_ID'), getenv('SECRET_KEY'))103 # 实例化一个http选项,可选的,没有特殊需求可以跳过104 httpProfile = HttpProfile()105 httpProfile.endpoint = "tmt.tencentcloudapi.com"106 107 # 实例化一个client选项,可选的,没有特殊需求可以跳过108 clientProfile = ClientProfile()109 clientProfile.httpProfile = httpProfile110 # 实例化要请求产品的client对象,clientProfile是可选的111 # client = TmtClient(cred, "ap-beijing", clientProfile)112 client = TmtClient(cred, "na-siliconvalley", clientProfile)113 114 # 实例化一个请求对象,每个接口都会对应一个request对象115 req = TextTranslateRequest()116 params = {117 "SourceText": txt,118 "Source": source,119 "Target": target,120 "ProjectId": 1251694040121 }122 req.from_json_string(dumps(params))123 124 # 返回的resp是一个TextTranslateResponse的实例,与请求对象对应125 resp = client.TextTranslate(req)126 ret = f'{txt}\n{resp._TargetText}'127 128 except TencentCloudSDKException as err:129 print(err)130 ret = err.message131 finally:132 return PlainTextResponse(ret)133 134 