From 486e9b2b0b8115dfb9c161f8bf23f3ed2b59beaf Mon Sep 17 00:00:00 2001 From: Maddy Adams Date: Fri, 9 May 2025 16:54:35 -0700 Subject: [PATCH 1/4] docs: openai compliant proxy discoverability in the playgound --- .../custom_openai_compliant_model.mdx | 19 +++++++++++++++++- .../static/custom_model_endpoint.png | Bin 0 -> 34608 bytes 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 docs/prompt_engineering/how_to_guides/static/custom_model_endpoint.png diff --git a/docs/prompt_engineering/how_to_guides/custom_openai_compliant_model.mdx b/docs/prompt_engineering/how_to_guides/custom_openai_compliant_model.mdx index 5cc5ed7a2..7327d1419 100644 --- a/docs/prompt_engineering/how_to_guides/custom_openai_compliant_model.mdx +++ b/docs/prompt_engineering/how_to_guides/custom_openai_compliant_model.mdx @@ -19,10 +19,27 @@ Take a look at the full [specification](https://platform.openai.com/docs/api-ref ## Use the model in the LangSmith Playground -Once you have deployed a model server, you can use it in the LangSmith Playground. Enter the playground and select the `Proxy Provider` inside the `OpenAI` modal. +Once you have deployed a model server, you can use it in the LangSmith Playground. + +### Recommended: Use the `Custom Model Endpoint` provider option + +Enter the playground and change the provider to `Custom Model Endpoint`. +Enter in your model endpoint in the `Base URL` field. + +![Custom Model Endpoint](./static/custom_model_endpoint.png) + +Behind the scenes, the playground will use the `ChatOpenAI` from `langchain-openai` and pass in your endpoint as a `base_url`. + +### Alternative: Use the `Proxy Provider` option + +Note: this is functionally equivalent to the `Custom Model Endpoint` provider option. + +Enter the playground and select the `Proxy Provider` inside the `OpenAI` modal. ![OpenAI Proxy Provider](./static/openai_proxy_provider.png) If everything is set up correctly, you should see the model's response in the playground. You can also use this functionality to invoke downstream pipelines as well. +## Save your model configuration + See how to store your model configuration for later use [here](./managing_model_configurations). diff --git a/docs/prompt_engineering/how_to_guides/static/custom_model_endpoint.png b/docs/prompt_engineering/how_to_guides/static/custom_model_endpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..9be1d95c9665feb99f313f4be85605ce3d94e38e GIT binary patch literal 34608 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 U_7qRXC*V&)MD|^=kiPH#1F3R`q5uE@ literal 0 HcmV?d00001 From bbb6efbe48223fbd28d0ff463aad5814800e9f0c Mon Sep 17 00:00:00 2001 From: Maddy Adams Date: Fri, 9 May 2025 16:55:43 -0700 Subject: [PATCH 2/4] update --- .../how_to_guides/custom_openai_compliant_model.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/prompt_engineering/how_to_guides/custom_openai_compliant_model.mdx b/docs/prompt_engineering/how_to_guides/custom_openai_compliant_model.mdx index 7327d1419..f23e31d6f 100644 --- a/docs/prompt_engineering/how_to_guides/custom_openai_compliant_model.mdx +++ b/docs/prompt_engineering/how_to_guides/custom_openai_compliant_model.mdx @@ -30,6 +30,8 @@ Enter in your model endpoint in the `Base URL` field. Behind the scenes, the playground will use the `ChatOpenAI` from `langchain-openai` and pass in your endpoint as a `base_url`. +If everything is set up correctly, upon clicking `Start` you should see the model's response in the playground. + ### Alternative: Use the `Proxy Provider` option Note: this is functionally equivalent to the `Custom Model Endpoint` provider option. From 4676052766d231705328ddf5b103f5d23fb03b66 Mon Sep 17 00:00:00 2001 From: Maddy Adams Date: Mon, 12 May 2025 10:57:37 -0700 Subject: [PATCH 3/4] rm alternate --- .../custom_openai_compliant_model.mdx | 34 +++++++------------ 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/docs/prompt_engineering/how_to_guides/custom_openai_compliant_model.mdx b/docs/prompt_engineering/how_to_guides/custom_openai_compliant_model.mdx index f23e31d6f..87298fe06 100644 --- a/docs/prompt_engineering/how_to_guides/custom_openai_compliant_model.mdx +++ b/docs/prompt_engineering/how_to_guides/custom_openai_compliant_model.mdx @@ -4,44 +4,36 @@ sidebar_position: 2 # Run the playground against an OpenAI-compliant model provider/proxy -The LangSmith playground allows you to use any model that is compliant with the OpenAI API. You can utilize your model by setting the Proxy Provider for `OpenAI` in the playground. +The LangSmith playground allows you to use any model that is compliant with the OpenAI API. -## Deploy an OpenAI compliant model +## Deploy an OpenAI-compliant model -Many providers offer OpenAI compliant models or proxy services. Some examples of this include: +Many providers offer OpenAI-compliant models or proxy services that wrap existing models with an OpenAI-compatible API. Some popular options include: - [LiteLLM Proxy](https://github.com/BerriAI/litellm?tab=readme-ov-file#quick-start-proxy---cli) - [Ollama](https://ollama.com/) -You can use these providers to deploy your model and get an API endpoint that is compliant with the OpenAI API. - -Take a look at the full [specification](https://platform.openai.com/docs/api-reference/chat) for more information. +These tools allow you to deploy models with an API endpoint that follows the OpenAI specification. For implementation details, refer to the [OpenAI API documentation](https://platform.openai.com/docs/api-reference/chat). ## Use the model in the LangSmith Playground Once you have deployed a model server, you can use it in the LangSmith Playground. -### Recommended: Use the `Custom Model Endpoint` provider option +### Configure the playground -Enter the playground and change the provider to `Custom Model Endpoint`. -Enter in your model endpoint in the `Base URL` field. +1. Open the LangSmith Playground +2. Change the provider to `Custom Model Endpoint` +3. Enter your model's endpoint URL in the `Base URL` field +4. Configure any additional parameters like API keys if required ![Custom Model Endpoint](./static/custom_model_endpoint.png) -Behind the scenes, the playground will use the `ChatOpenAI` from `langchain-openai` and pass in your endpoint as a `base_url`. - -If everything is set up correctly, upon clicking `Start` you should see the model's response in the playground. - -### Alternative: Use the `Proxy Provider` option - -Note: this is functionally equivalent to the `Custom Model Endpoint` provider option. - -Enter the playground and select the `Proxy Provider` inside the `OpenAI` modal. +The playground uses [`ChatOpenAI`](https://python.langchain.com/api_reference/openai/chat_models/langchain_openai.chat_models.base.ChatOpenAI.html) from `langchain-openai` under the hood, automatically configuring it with your custom endpoint as the `base_url`. -![OpenAI Proxy Provider](./static/openai_proxy_provider.png) +### Testing the connection -If everything is set up correctly, you should see the model's response in the playground. You can also use this functionality to invoke downstream pipelines as well. +Click `Start` to test the connection. If properly configured, you should see your model's responses appear in the playground. You can then experiment with different prompts and parameters. ## Save your model configuration -See how to store your model configuration for later use [here](./managing_model_configurations). +To reuse your custom model configuration in future sessions, learn how to save and manage your settings [here](./managing_model_configurations). From 3aa26331c4e6033915dc4a761767cf7bd59457dc Mon Sep 17 00:00:00 2001 From: Maddy Adams Date: Mon, 12 May 2025 11:08:21 -0700 Subject: [PATCH 4/4] fix --- .../how_to_guides/custom_openai_compliant_model.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/prompt_engineering/how_to_guides/custom_openai_compliant_model.mdx b/docs/prompt_engineering/how_to_guides/custom_openai_compliant_model.mdx index 87298fe06..c921fff98 100644 --- a/docs/prompt_engineering/how_to_guides/custom_openai_compliant_model.mdx +++ b/docs/prompt_engineering/how_to_guides/custom_openai_compliant_model.mdx @@ -24,7 +24,7 @@ Once you have deployed a model server, you can use it in the LangSmith Playgroun 1. Open the LangSmith Playground 2. Change the provider to `Custom Model Endpoint` 3. Enter your model's endpoint URL in the `Base URL` field -4. Configure any additional parameters like API keys if required +4. Configure any additional configuration parameters ![Custom Model Endpoint](./static/custom_model_endpoint.png)