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 虚拟服务器外网无法访问
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 启动到后…...
一款博客网站源码
一款博客网站源码 源码软件库 为大家内置了主题 清爽又强大真正的永久可用的一条源码,该版本为整合版本,内置了Joe主题,搭建后直接启用即可~ 安装环境要求: PHP 7.2 以上 MySQL, PostgreSQL, SQLite 任意一种数据库支持ÿ…...
Mr-Robot1靶场练习靶场推荐小白入门练习靶场渗透靶场bp爆破wordpress
下载链接: Mr-Robot: 1 ~ VulnHub 安装: 打开vxbox,菜单栏----管理----导入虚拟电脑 选择下载完的ova文件,并修改想要保存的位置(也可以保持默认位置) 导入完成后可以根据自己的情况去配置网络链接方式 完成…...
数据仓库的设计开发应用(三)
目录 五、数据仓库的实施(一)数据仓库的创建(二)数据抽取转换加载 六、数据仓库系统的开发(一)开发任务(二)开发方法(三)系统测试 七、数据仓库系统的应用&am…...
【04】WebAPI
WebAPI 和标准库不同,WebAPI 是浏览器提供的一套 API,用于操作浏览器窗口和界面 WebAPI 中包含两个部分: BOM:Browser Object Model,浏览器模型,提供和浏览器相关的操作DOM:Document Object Model,文档模型,提供和页面相关的操作BOM BOM 提供了一系列的对象和函数,…...
数据预处理在数据挖掘中的重要性
数据挖掘作为从大量数据中提取有用信息和知识的过程,其结果的准确性和可靠性直接受到数据质量的影响。因此,数据预处理在数据挖掘中扮演着至关重要的角色。让我们探讨数据质量对数据挖掘结果的影响,并介绍常见的数据预处理方法以及它们如何提…...
Java并发编程—JUC线程池架构
Java并发编程(JUC,Java Utilities Concurrency)中的线程池架构是Java提供的一种用于管理和复用线程的机制。线程池的主要目标是减少线程创建和销毁的开销,提高系统的响应速度,并通过合理的线程管理和资源分配ÿ…...
Android input输入子系统
一.Android input输入子系统简介 Input系统是Android系统中负责处理用户输入操作的核心组件,它负责从各种输入设备(如屏幕、键盘、鼠标等)获取原始的输入事件(如按键、触摸、滑动等),并将其转换为Android应…...
如何在webapp中于动发布一个应用
目录 第一步:在webapp文件夹内自定义文件夹第二步:生成一个文本,并把后缀改为 .html第三步:进入bin文件夹打开服务第四步:打开方式选择java第六步:输入你想输出的东西第七步:双击运行即可 第一步…...
部署一个本地的ChatGPT(Ollama)
一 下载Ollama Ollama下载地址:https://ollama.com/download 下载完后 二 安装运行 双击下载好的OllamaSetup.exe开发 安装Ollama: 安装完成后,多了一个Ollama的菜单如下图 : Ollama安装好默认是配置开机运行,如果没有运行可以在…...
Vue 3中的reactive:响应式状态的全面管理
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
【网络】详解HTTPS及探究加密过程
目录 一、什么是HTTPS1、加密解密是什么2、为什么要加密3、常见的加密方式1、对称加密2、非对称加密 二、探究HTTPS如何实现加密1、方案一----只使用对称加密2、方案二----只使用非对称加密3、方案三----双方都使用非对称加密4、方案四----非对称加密 对称加密5、中间人攻击6、…...
【C语言】字符与字符串---从入门到入土级详解
🦄个人主页:修修修也 🎏所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 目录 一.字符类型和字符数组(串)简介 1.ASCII 2.定义,初始化,使用 1>字符的定义及初始化 2>字符串的定义及初始化 二.…...
Github Copilot 工具,无需账号,一键激活
① 无需账号,100%认证成功!0风险,可联网可更新,,支持copilot版本升级,支持chat ② 支持windows、mac、linux系统等设备 ③一号通用,支持所有IDE(AppCode,CLion,DataGrip,GoLand,IntelliJ IDEA …...
node: -max-old-space-size=xxx is not allowed in NODE_OPTIONS
问题描述 在启动node项目时,出现了OOM参照网上的处理方案,设置了环境变量: export NODE_OPTIONS"–max-old-space-size8192"当再次通过npm run docs:dev运行node项目的时候出现了如下错误: node: -max-old-space-siz…...
k8s编排系统
Kubernetes(简称K8s)是一个开源的容器编排系统,由Google基于其内部的Borg项目开发,并于2014年正式对外发布。目前,Kubernetes已成为云原生计算基金会(Cloud Native Computing Foundation, CNCF)…...
samba服务器的配置
需求:在Linux上搭建一个文件共享服务,创建不同的账号给予不同的权限,在windows可以直接访问该共享目录 介绍 Samba 是一个强大的工具,使得不同操作系统之间可以无缝地共享文件和资源,促进了跨平台环境下的协作和通信…...
H12-821_279
279.第三类LSA的Link ID是: A.所描述的ABR的Router ID B.所在网段上DR的端口IP地址 C.所描述的目的网段 D.生成这条LSA的路由器的Router ID 答案:C 注释: OSPF的LSA可以单独描述网络信息、拓扑信息,也可以同时描述网络信息和拓扑信息。 LSA3…...
Stable Diffusion科普文章【附升级gpt4.0秘笈】
随着人工智能技术的飞速发展,我们越来越多地看到计算机生成的艺术作品出现在我们的生活中。其中,Stable Diffusion作为一种创新的图像生成技术,正在引领一场艺术创作的革命。本文将为您科普Stable Diffusion的相关知识,带您走进这…...
Lua 如何在Lua中调用C/C++函数
Lua调用C函数有两种方式 程序主体在C中运行,C函数注册到Lua中。C调用Lua,Lua调用C注册的函数,C或者Lua得到函数的执行结果。程序主体在Lua中运行,C函数作为库函数供Lua使用。 C的代码如下 如何在Lua脚本中调用这个C语言函数(ad…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
