feat: incorporate more socials (#6)
Node.js CI / Lint and Test (push) Successful in 1m29s

### Explanation

We can automate the heck out of announcements everywhere. Except LinkedIn, because that API looks agonising.

### Issue

_No response_

### Attestations

- [ ] I have read and agree to the [Code of Conduct](https://docs.nhcarrigan.com/community/coc/)
- [ ] I have read and agree to the [Community Guidelines](https://docs.nhcarrigan.com/community/guide/).
- [ ] My contribution complies with the [Contributor Covenant](https://docs.nhcarrigan.com/dev/covenant/).

### Dependencies

- [ ] I have pinned the dependencies to a specific patch version.

### Style

- [ ] I have run the linter and resolved any errors.
- [ ] My pull request uses an appropriate title, matching the conventional commit standards.
- [ ] My scope of feat/fix/chore/etc. correctly matches the nature of changes in my pull request.

### Tests

- [ ] My contribution adds new code, and I have added tests to cover it.
- [ ] My contribution modifies existing code, and I have updated the tests to reflect these changes.
- [ ] All new and existing tests pass locally with my changes.
- [ ] Code coverage remains at or above the configured threshold.

### Documentation

_No response_

### Versioning

_No response_

Reviewed-on: #6
Co-authored-by: Naomi Carrigan <commits@nhcarrigan.com>
Co-committed-by: Naomi Carrigan <commits@nhcarrigan.com>
This commit was merged in pull request #6.
This commit is contained in:
2025-07-19 18:16:41 -07:00
committed by Naomi Carrigan
parent 99bd8c69cd
commit b8b17b72a3
10 changed files with 355 additions and 8 deletions
+44
View File
@@ -0,0 +1,44 @@
/**
* @copyright nhcarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
// eslint-disable-next-line @typescript-eslint/naming-convention -- 'Tis a class.
import Anthropic from "@anthropic-ai/sdk";
/**
* Summarises an announcement using AI, to condense the content for platforms like Bluesky and Twitter.
* @param title - The title of the announcement.
* @param content - The main body of the announcement.
* @returns A message indicating the success or failure of the operation.
*/
export const summarisePost = async(
title: string,
content: string,
): Promise<string | null> => {
if (process.env.ANTHROPIC_KEY === undefined) {
return null;
}
const anthropic = new Anthropic({
apiKey: process.env.ANTHROPIC_KEY,
timeout: 5 * 60 * 1000,
});
const response = await anthropic.messages.create({
// eslint-disable-next-line @typescript-eslint/naming-convention -- API requirement
max_tokens: 1000,
messages: [
{
content: `# ${title}\n\n${content}`,
role: "user",
},
],
model: "claude-4-sonnet-20250514",
// eslint-disable-next-line stylistic/max-len -- This is a long system message.
system: "Summarise the post the user provides into a concise message suitable for social media platforms like Bluesky and Twitter. The summary should be engaging and informative, capturing the essence of the announcement. You may use no more than 280 characters, and should include relevant hashtags if appropriate.",
});
const text = response.content.find((m) => {
return m.type === "text";
});
return text?.text ?? null;
};