venv uvicorn python 虚拟服务器外网无法访问

2024-03-17 19:28

本文主要是介绍venv uvicorn python 虚拟服务器外网无法访问,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

python -m venv .venv
source ./.venv/bin/activate
pip install -r requirements.txt
./run.sh

source ./.venv/bin/activate
uvicorn main:app --reload

虚拟web服务器外网访问控制台启动命令用以下代码启动
uvicorn main:app --host 0.0.0.0 --port 8501 --reload
启动到后台

nohup uvicorn main:app --host 0.0.0.0 --port 8501 --reload &

main.py

import xmltodict
import anthropic
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse, StreamingResponsefrom prompt_constructors import *from claude import ClaudeLlm  # claude.py から ClaudeLlm クラスをインポート
import os
import base64app = FastAPI()
api_key = "your key"
client = anthropic.Anthropic(api_key=api_key)# @app.middleware("http")
# async def log_body(request: Request, call_next):
#     body = await request.body()
#     print("HTTP REQUEST BODY: ", body)
#     return await call_next(request)# The anthropic API does not have a method to list models, so we are hard coding the models here
@app.get("/models")
async def list_models() -> JSONResponse:return JSONResponse(content={"data": [{"id": "claude-3-sonnet-20240229", "name": "Anthropic Claude 3 Sonnet"},{"id": "anthropic.claude-3-sonnet-20240229-v1:0", "name": "AWS Bedrock Anthropic Claude 3 Sonnet"},{"id": "claude-3-opus-20240229", "name": "Anthropic Claude 3 Opus"},]})def map_req(req: dict) -> dict:messages = req["messages"]mapped_req = {"messages": messages,}return mapped_req@app.post("/chat/completions")
async def completions(request: Request) -> StreamingResponse:data = await request.body()req = map_req(json.loads(data))messages=req["messages"]claude = ClaudeLlm(client, messages)resp = claude.generate_responses("claude-3-opus-20240229")return StreamingResponse(resp, media_type="application/x-ndjson")def map_resp(response) -> str:data = json.loads(response)finish_reason = Noneparsed_tool_calls = []for message in data["content"]:if 'text' in message.keys() and message["text"].startswith("<function_calls>"):xml_tool_calls = message["text"] + "</function_calls>"tool_calls = xmltodict.parse(xml_tool_calls)if tool_calls["function_calls"]["invoke"] is list:for key, value in tool_calls["function_calls"]["invoke"].items():parsed_tool_calls.append({"index": 0,"id": value['tool_name'],"type": "function","function": {"name": value["tool_name"],"arguments": str(value["parameters"]),},})else:parsed_tool_calls.append({"index": 0,"id": tool_calls["function_calls"]["invoke"]["tool_name"],"type": "function","function": {"name": tool_calls["function_calls"]["invoke"]["tool_name"],"arguments": json.dumps(tool_calls["function_calls"]["invoke"]["parameters"]),},})message.pop("text", None)message.pop("type", None)message["tool_calls"] = parsed_tool_callsmessage["content"] = Nonemessage["role"] = "assistant"if 'text' in message.keys():message["content"] = message["text"]if "stop_reason" in data.keys() and data["stop_reason"] == "stop_sequence":finish_reason = "tool_calls"if "stop_reason" in data.keys() and data["stop_reason"] == "end_turn":finish_reason = "stop"translated = {"id": data["id"],"object": "chat.completion.chunk","created": 0,"model": data["model"],"system_fingerprint": "TEMP","choices": [{"index": 0,"delta": data["content"][0],},],"finish_reason": finish_reason,}return json.dumps(translated)

claude.py

import pandas as pd
from forex_python.converter import CurrencyRates
import time
import anthropic
from anthropic.types.message_stream_event import MessageStartEvent, MessageDeltaEvent, ContentBlockDeltaEventclass ClaudeLlm:def __init__(self, client, user_input):self.client = clientself.user_input = user_inputself.cost_df = pd.DataFrame(columns=["Model", "Input Tokens", "Output Tokens", "Input Cost", "Output Cost", "Total Cost", "総計_円換算", "処理時間"])def convert_usd_to_jpy(self, usd_amount):c = CurrencyRates()try:rate = c.get_rate('USD', 'JPY')jpy_rate = (f"為替レート: {rate:.2f}円/ドル")return usd_amount * rate, jpy_rateexcept Exception as e:rate = 150  # フォールバックとして使用する為替レートjpy_rate = (f"為替レート: {rate:.2f}円/ドル想定")return usd_amount * rate, jpy_ratedef calculate_cost(self, model, input_tokens, output_tokens):token_costs = {"claude-3-opus-20240229": {"input": 0.000015, "output": 0.000075},"claude-3-sonnet-20240229": {"input": 0.000003, "output": 0.000015},}model_costs = token_costs[model]input_cost = input_tokens * model_costs["input"]output_cost = output_tokens * model_costs["output"]total_cost = input_cost + output_costreturn input_cost, output_cost, total_costdef generate_responses(self, model_name):start_time = time.time()input_tokens = 0output_tokens = 0try:with self.client.messages.stream(model=model_name,max_tokens=1024,messages=[{"role": "user", "content": self.user_input}],) as stream:for event in stream:if isinstance(event, MessageStartEvent):usage_info = event.message.usageinput_tokens = usage_info.input_tokenselif isinstance(event, MessageDeltaEvent):output_tokens = event.usage.output_tokenselif isinstance(event, ContentBlockDeltaEvent):return_text = event.delta.textyield return_textexcept anthropic.APIStatusError as e:error_response = e.response.json()if 'error' in error_response and error_response['error'].get('type') == 'overloaded_error':return "APIが過負荷状態です。しばらくしてから再試行してください。"input_cost, output_cost, total_cost = self.calculate_cost(model_name, input_tokens, output_tokens)jpy_total_cost, _ = self.convert_usd_to_jpy(total_cost)end_time = time.time()response_time = end_time - start_timenew_row = {"Model": model_name,"Input Tokens": input_tokens,"Output Tokens": output_tokens,"Input Cost": f"${input_cost:.6f}","Output Cost": f"${output_cost:.6f}","Total Cost": f"${total_cost:.6f}","総計_円換算": f"¥{jpy_total_cost:.3f}","処理時間": f"{response_time:.2f}秒"}new_row_df = pd.DataFrame([new_row])self.cost_df = pd.concat([self.cost_df, new_row_df], ignore_index=True)return self.cost_df

curl -H “Content-Type: application/json” -X POST -d ‘{“user_id”: “123”, “coin”:100, “success”:1, “msg”:“OK!” }’ “http://192.168.0.1:8001/test”

netstat -ntulp
lsof -i:8000

这篇关于venv uvicorn python 虚拟服务器外网无法访问的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/819905

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装