From 55cd9fb80c5814d06948e423de461c4d416340f0 Mon Sep 17 00:00:00 2001 From: Vineeth Voruganti <13438633+VVoruganti@users.noreply.github.com> Date: Thu, 9 May 2024 11:36:51 -0700 Subject: [PATCH] Adapted SDK Post (#72) --- content/assets/sdk-gpt-4.png | Bin 0 -> 61037 bytes content/blog/SDK-Design.md | 470 +++++++++++++++++++++++++++++++++++ quartz.layout.ts | 12 - 3 files changed, 470 insertions(+), 12 deletions(-) create mode 100644 content/assets/sdk-gpt-4.png create mode 100644 content/blog/SDK-Design.md diff --git a/content/assets/sdk-gpt-4.png b/content/assets/sdk-gpt-4.png new file mode 100644 index 0000000000000000000000000000000000000000..4984ff53c1ec00969ba65382a8bc3fc7add8a835 GIT binary patch literal 61037 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

cd!uQOHa-JuzZi&Hk8vz%BA+lJKl5a)>Rfmz4 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 First I took a look at sources and posts onlines that talk in general about +> developing SDKs. This isn't an exhaustive look at every link I looked at, but +> ones I thought were relevant. The notes are messy and not necessarily fully +> formed sentences. + +[Any design patterns and tips on writing an API client library](https://www.reddit.com/r/Python/comments/vty3sx/any_design_patterns_and_tips_on_writing_an_api/) + +Things they are laying out here. + +One person +- Auth is really hard to figure out +- Retry logic and pagination is really important + +Another person +- Keep data objects as just data and use other objects for transformations + +^ basically advocating for the singleton model + +Person 3 +- Also arguing for singleton approach. Made a good case where if you really only + care about lower level stuff it's annoying + +Firstly, don't go over the top with object-oriented modelling. If you've got an API call like: + +`GET /locations/12345/customers/65432/orders/87678768` +Don't implement this as: + +```python +client.location(12345).customer(65432).order(87678768).get() +``` +Just implement: + +```python +client.get_order(12345, 65432, 87678768) +``` + +that last one is better tbh it's just managing that data isn't done within the +object, which is my main problem. + +So arguments for singleton approach are +- harder to go to lower levels from the start + +The object-oriented approach looks more readable. + +[A Design Pattern for Python API Client Libraries](https://bhomnick.net/design-pattern-python-api-client/) + +It mainly covers how to build an singleton library but has this one snippet at +the end. + +> Other types of APIs +> This pattern works well for RPC-style APIs, but tends to break down for more +> object-based or RESTful APIs as having a single interface class gets messy +> quickly. In those cases I find it makes more sense to break the interface down +> to resource-level, modeling things more like an ORM. I'll cover that in a later +> post, next time I find the need to build one. + +At the time of this research there was no follow-up post. + +[Ask HN: Best practices (and examples) for designing client libraries for +APIs?](https://news.ycombinator.com/item?id=23283551) + +The first comment actually advocates for an object-oriented model but just using +the top level client object for authentication and setup stuff. + +Most of the sentiments kind of make me think using an object-oriented model +might make more sense. + +[How to design a good API and why it matters](https://dl.acm.org/doi/abs/10.1145/1176617.1176622) + +Nothing really to note from there. It's more about the API itself and not the +SDK. + +[Building A Creative & Fun API Client In Ruby: A Builder Pattern Variation](https://medium.com/rubyinside/building-a-creative-fun-api-client-in-ruby-a-builder-pattern-variation-f50613abd4c3) + +This is basically a guy who saw an singleton approach and said I want an object +oriented approach. + +[How to design your API SDK](https://kevin.burke.dev/kevin/client-library-design/) + +A developer from twilio talking about their approach to creating helper +libraries and client libraries. + +A point he makes is that "If you've designed your API in a RESTful way, your API +endpoints should map to objects in your system" + +This point isn't explicitly asking for the object-oriented approach as the +singelton approach just moves the verbs to the singleton, but usually still has +data only objects for the different resources. + +I say this, but the examples seem to use an object-oriented model. + +[How to build an SDK from scratch: Tutorial & best practices](https://blog.liblab.com/how-to-build-an-sdk/) + +Written by one of the SDK generation platforms. + +It talks in general terms about creating data objects and mapping methods to +endpoints. One of the points is suggests as a good grouping method is to group +functions in service classes, essentially advocating for an object-oriented +model. + +[Designing Pythonic library APIs](https://benhoyt.com/writings/python-api-design/) + +The two takeaways that are the most important to me when looking at these are + +* Design your library to be used as import lib ... lib.Thing() rather than from lib import LibThing ... LibThing(). +* Avoid global state; use a class instead + +From that it seems using a singleton for are actions/verbs and then storing data +in dataclasses would support both of the requirements. The examples in the post +show a class that has functionality. + +Using tree-shaking style imports should also allow for lower scopes. For example +when only worrying about messages for a particular session in honcho a user +could import just the messages namespace i.e. + +```python +from honcho.apps.users.sessions import messages + +messages.create("sample") +``` + +so there are pythonic ways to make the code less verbose. However the benefit of +having the entire string is making it clearer what messages are being discusses. +Are these Honcho mesages? LangChain messages? It can get messy that way +especially in the LLM space where many libraries and components are +converging on similar naming schemes. + +[Build a Python SDK](https://wwt.github.io/building-a-python-sdk/) + +Looks like a guide made by Cisco. I paid special attention to the "API Wrapper +Module" section. It was a really barebones example in this guide that just +implemented a very small client and put most of the attention on how to manage +the connection logic. + +It used one singleton object that had all the methods available for the API. +There was no concept of resources or data objects here as no data was being +persistently stored. + +[How to build a user-friendly Python SDK](https://medium.com/arthur-engineering/best-practices-for-creating-a-user-friendly-python-sdk-e6574745472a) + +Noticing the trend of abstracting all connection logic for http requests to a +separate module and havign reusable methods for different http functions. + +Main focus of the post was just on good practices of documentation, testing, and +logical organization. + +[SDKs.io](https://sdks.io/docs/introduction/) + +A more comprehensive repository of thoughts and principles around SDK design. +Made by APIMATIC. which seems to be another player in the code generation space. + +I paid special attention to the **Build** section under **Best Practices**, and +specifically the endpoints to methods and the models & serialization. + +They state putting all methods in a single class (singleton) has the advantage +of reducing the need to initialize classes, but can make the class size very +large if there are many endpoints. + +Grouping methods into different namespaces could probably remove this problem +too. A nested singleton can reduce the confusion, while still not needing to +mess with classes and objects. + +It generally seems popular to at the very least create types and data objects +for handling and storing API responses. They help with readability, type hints, +data validations, etc. Regardless of the singleton or object-oriented approach +data objects are something that should probably still be included. + +[Generating SDKs for your API](https://medium.com/codex/generating-sdks-for-your-api-deb79ea630da) + +Advocates for using generators for making SDKs and talks about how different +languages have different idioms and conventions that will be hard to manage. + +Also mentions having the generator create data models. + +[Guiding Principles for Building SDKs](https://auth0.com/blog/guiding-principles-for-building-sdks/) + +Some key insights + +* Make sure documentation is very comprehensive +* Try to minimize external dependencies +* Have modular design patterns that make it easy to extend and pick and choose +features. + +[Should I implement OOP in a REST +API?](https://www.reddit.com/r/flask/comments/1755ob0/should_i_implement_oop_in_a_rest_api/) + +Most people seem to be saying a full OOP method is overkill, but there are +people advocating for having a controller class with methods that take data +objects as inputs. Essentially advocating for the singelton approach with data +only objects. + +### Analysis + +Many of the generic concerns of SDK design do not have to do with the UX of the +SDK for the end developer, rather background processes that an SDK handle. This +includes: + +* Authentication +* Retry Logic +* Pagination +* Logging + +When it comes to the actual developer experience and interfaces for interacting +with the SDK the community seems a bit split. This is very much because of the +boring fact that REST APIs are designed very differently and so it depends on +the specifics of the API. + +Some APIs have many resources with basic CRUD operations. Others have many +different endpoints, but only have a few resources. The singleton architecture +vs a strict object-oriented approach again seems to depend a lot. Some sources +advocate for a strict object-oriented approach where classes have their own +methods, while others advocate for a singleton approach stating objects are +overkill. + +However, the singleton approach doesn't completely abandon the idea of objects +and almost always advocates for data objects, or some kind of models that can be +used for type hints and validation. + +There is some tradeoff regardless with problems arising at different levels of +scale. The singleton approach could be verbose and cumbersome at smaller scales, +but the object-oriented approach may not be a readable, and it could be unclear +what methods are doing in complex codebases. Even GPT-4 couldn't decide between +the two. + +![Asking GPT-4 about Singleton vs Object-Oriented +Approaches](/assets/sdk-gpt-4.png) + +Again and again, the best way to approach SDK development is to just do whatever +is easier, and create tons of documentation that will help developers navigate +your [API Ladder](https://blog.sbensu.com/posts/apis-as-ladders/). Someone will +get confused regardless of what you do, so the key is to make sure the SDK makes +sense (even if it's not the most efficient or clean) and remove hurdles for +users to navigate errors and mistakes. + +## SDK Generation Platforms + +With a sense of the best standards for SDK design and additional features that +should be supported in the SDK I want to look at a few different options to +determine what is the best solution to go with. + +Below is a list of the different platforms I wanted to review + +- [Stainless](https://www.stainlessapi.com/) +- [Speakeasy](https://speakeasyapi.dev) +- [liblab](https://liblab.com/) +- [OpenAPI-Generator](https://openapi-generator.tech/) + +I was using the OpenAPI Spec for Honcho that was housed at +https://demo.honcho.dev/openapi.json. + +### Stainless + +Since the hacker news thread for the release of stainless is what spurred this +research I decided to try them out first. + +From their web portal they were able to take a link to the OpenAPI spec and +generate a NodeJS and Python SDK immediately. There was no tweaking or anything +necessary. + +I mainly paid attention to the Python SDK. The code was very readable and made +sense. I also liked how it used `httpx` and `pydantic` by default and made an +`async` version of the interface. They took the singleton approach to the design +of the interface. There was also built in capabilities for retries, pagination, +and auth. + +There's also capability for adding custom code such as utility functions. + +### Speakeasy + +Speakeasy required me to do everything locally through their `brew` package. It +did not immediately accept the OpenAPI Spec and required me to make some tweaks. +These were low-hanging fruit, and their cli has a handly AI tool that will +diagnose the issue and tell you what to fix. + +I just had to add a list of servers and deduplicate some routes. I'm happy it +found these errors, but there was some friction for me to get started. Stainless +just worked out of the box and made some logical assumptions. + +The generated SDK didn't feel as strong as the stainless one. There didn't seem +to support `async` methods, it did not use `pydantic` and used the built-in +Python `@dataclass`. The methods had really unwieldy names, and looked like it +would need a lot of tweaking to get it more production ready. + +### Liblab + +Also had me do the generation from the cli using their npm package. It was +pretty straightforward to login and give it an API spec. Liblab seems to require +a lot tweaking to get better results. It gave me several warnings asking me to +add tags to my API Spec. I did not add them and went ahead to look at the +generation. + +> I'm not opposed to adding the tags if necessary, but I was able to get good +> results without adding them on other platforms. + +The results were also lack luster. The SDK took the singleton approach as well, +which seems to be the industry standard for codegen tools. The method names +were also unwieldy. It also didn't make use of pydantic and instead implemented +its own `BaseModel` class. It was built on the `requests` model and doesn't seem +to support `async` methods. + +### OpenAPI Generator + +This is the only one on the list that is not expressly backed by a company +whose main goal is SDK generation. It is however a very popular project with +many sponsors. + +Again, I tried to generate a client from the cli using their npm package. I used +version `7.5.0` and once again gave it my API Spec. It gave a few warnings about +OpenAPI Spec v3.1 not being fully supported yet, but generated a package either +way. + +I again was not too impressed with the results, however I did like it more than +liblab. The method names were also unwieldy, and the project relies on `urllib3`. +I did not see an indication of support for an `async` client. + +The repo did use `pydantic` for typing and data classes, which is a plus. +Once again, the sdk use the `singleton` approach. + +I also did not see any indication of functionality for retry logic, +authentication, or pagination. + + +### Conclusion + +Overall, Stainless had the results that I liked the most. With almost no work +from me, it produced a high quality SDK that designed things in a sensible way +with many built-in features such as retries, pagination, and auth. + +All the platforms took the singleton approach with a host of data models so +there isn't much to compare in that regard. + +The other platforms did not produce anything unusable, but they seemed to use +less modern features and require a lot more massaging to get a desirable result. + +The docs for stainless also looked more clear, and it seems easier to add +customizations after the fact. + +I will give Speakeasy some kudos for having documentation for different API +frameworks. The FastAPI one made it easy to figure out what I needed to tweak +and how to do it. The AI debugging feature was also a nice help. + +What I'm looking for right now is the platform or tool that can reduce my work +the most and let me focus on other things and stainless achieved that. The +results are not perfect, but it doesn't look like it'll need more than some +slight tweaking and testing to get to a state I want. + +## Results + +After reaching the conclusion in the previous section, I took some time to fully +implement Stainless to make SDKs for Honcho and am proud to announce the release +of a new Python SDK, and the launch of a brand-new NodeJS SDK. + +Both of these SDKs will be in separate open source repositories. + +- [Honcho Python SDK](https://github.com/plastic-labs/honcho-python) +- [Honcho TypeScript SDK](https://github.com/plastic-labs/honcho-node) + +Honcho will soon be available for a wide range of ecosystems and platforms, +making it even easier and more accessible to make personalized agents. diff --git a/quartz.layout.ts b/quartz.layout.ts index d8e495831..f5c91bbcf 100644 --- a/quartz.layout.ts +++ b/quartz.layout.ts @@ -33,14 +33,6 @@ export const defaultContentPageLayout: PageLayout = { if (a.file && b.file) { const aDate = new Date(a.file.frontmatter.date) const bDate = new Date(b.file.frontmatter.date) - // console.log(a.file) - if (a.file.slug.includes("release")) { - console.log(a.file.frontmatter.title, a.file.frontmatter.date, aDate) - console.log(b.file.frontmatter.title, b.file.frontmatter.date, bDate) - console.log(aDate < bDate) - } - // console.log(a.file.frontmatter.title, aDate) - // console.log(b.file.frontmatter.title, bDate) if (aDate < bDate) { return 1 } else { @@ -52,7 +44,6 @@ export const defaultContentPageLayout: PageLayout = { numeric: true, sensitivity: "base", }) - // console.log(a.file) } if (a.file && !b.file) { return 1 @@ -83,8 +74,6 @@ export const defaultListPageLayout: PageLayout = { if (a.file && b.file) { const aDate = new Date(a.file.frontmatter.date) const bDate = new Date(b.file.frontmatter.date) - // console.log(a.file.frontmatter.title, aDate) - // console.log(b.file.frontmatter.title, bDate) if (aDate < bDate) { return 1 } else { @@ -96,7 +85,6 @@ export const defaultListPageLayout: PageLayout = { numeric: true, sensitivity: "base", }) - // console.log(a.file) } if (a.file && !b.file) { return 1