diff --git a/.gitignore b/.gitignore index 1278b78670b..76d98409aba 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ litellm/proxy/api_log.json router_config.yaml litellm_server/config.yaml litellm/proxy/_secret_config.yaml +.aws-sam/ diff --git a/litellm/proxy/lambda.py b/litellm/proxy/lambda.py new file mode 100644 index 00000000000..6b278c41188 --- /dev/null +++ b/litellm/proxy/lambda.py @@ -0,0 +1,4 @@ +from mangum import Mangum +from litellm.proxy.proxy_server import app + +handler = Mangum(app, lifespan="on") diff --git a/litellm/requirements.txt b/litellm/requirements.txt new file mode 120000 index 00000000000..dc833dd4bef --- /dev/null +++ b/litellm/requirements.txt @@ -0,0 +1 @@ +../requirements.txt \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 0abf3ed2b7d..345d7ae95d8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,4 +13,5 @@ pyyaml rq prisma celery -psutil \ No newline at end of file +psutil +mangum \ No newline at end of file diff --git a/template.yaml b/template.yaml new file mode 100644 index 00000000000..d4db2c2ac1f --- /dev/null +++ b/template.yaml @@ -0,0 +1,94 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: > + llmlite-service + + SAM Template for llmlite-service + +# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst +Globals: + Function: + Timeout: 600 + MemorySize: 128 + Environment: + Variables: + WORKER_CONFIG: !Ref WorkerConfigParameter + +Parameters: + AliasParameter: + Type: String + Default: live + WorkerConfigParameter: + Type: String + Description: Sample environment variable + Default: '{"model": null, "alias": null, "api_base": null, "api_version": "2023-07-01-preview", "debug": false, "temperature": null, "max_tokens": null, "request_timeout": 600, "max_budget": null, "telemetry": true, "drop_params": false, "add_function_to_prompt": false, "headers": null, "save": false, "config": null, "use_queue": false}' + +Resources: + MyUrlFunctionPermissions: + Type: AWS::Lambda::Permission + Properties: + FunctionName: !Ref URL + Action: lambda:InvokeFunctionUrl + Principal: "*" + FunctionUrlAuthType: NONE + + Function: + Type: AWS::Serverless::Function + Properties: + FunctionName: !Sub "${AWS::StackName}-function" + CodeUri: "./litellm" + Handler: proxy/lambda.handler + Runtime: python3.11 + AutoPublishAlias: !Ref AliasParameter + Architectures: + - x86_64 + DeploymentPreference: + Type: AllAtOnce + Alarms: + - !Ref NewVersionErrorMetricGreaterThanZeroAlarm + + NewVersionErrorMetricGreaterThanZeroAlarm: + Type: "AWS::CloudWatch::Alarm" + Properties: + AlarmDescription: Lambda Function Error > 0 + ComparisonOperator: GreaterThanThreshold + Dimensions: + - Name: Resource + Value: !Sub "${Function}:live" + - Name: FunctionName + Value: !Ref Function + - Name: ExecutedVersion + Value: !GetAtt Function.Version.Version + EvaluationPeriods: 1 + Unit: Count + MetricName: Errors + Namespace: AWS/Lambda + Period: 60 + Statistic: Sum + Threshold: 0 + + URL: + Type: AWS::Lambda::Url + DependsOn: FunctionAliaslive + Properties: + AuthType: NONE + Qualifier: live + TargetFunctionArn: !GetAtt Function.Arn + +Outputs: + FunctionARN: + Description: "Lambda Function ARN" + Value: !GetAtt Function.Arn + + FunctionUrl: + Description: "Lambda Function URL Endpoint" + Value: + Fn::GetAtt: URL.FunctionUrl + + FunctionVersion: + Description: "Lambda Function Version" + Value: !GetAtt Function.Version.Version + + FunctionNewAlarmARN: + Description: "Lambda Function New Alarm ARN" + Value: !GetAtt NewVersionErrorMetricGreaterThanZeroAlarm.Arn